grafana/public/app/features/folders/FolderSettingsPage.tsx
Sofia Papagiannaki b96dd1877c
Folder API: optionally force deleting Grafana 8 alerts when deleting a folder (or error) (#36427)
* Folder API: Add an optional query parameter for allowing deleting a  folder containing rules

* Update frontend

- Set forceDeleteRules=true when frontend deletes a folder
- Improve modal text

* Update docs

* Apply suggestions from code review

Co-authored-by: gotjosh <josue@grafana.com>
Co-authored-by: Nathan Rodman <nathanrodman@gmail.com>
Co-authored-by: achatterjee-grafana <70489351+achatterjee-grafana@users.noreply.github.com>
2021-07-22 12:27:13 +03:00

119 lines
3.5 KiB
TypeScript

import React, { PureComponent } from 'react';
import { connect, ConnectedProps } from 'react-redux';
import { Button, LegacyForms } from '@grafana/ui';
const { Input } = LegacyForms;
import Page from 'app/core/components/Page/Page';
import appEvents from 'app/core/app_events';
import { getNavModel } from 'app/core/selectors/navModel';
import { StoreState } from 'app/types';
import { deleteFolder, getFolderByUid, saveFolder } from './state/actions';
import { getLoadingNav } from './state/navModel';
import { setFolderTitle } from './state/reducers';
import { ShowConfirmModalEvent } from '../../types/events';
import { GrafanaRouteComponentProps } from 'app/core/navigation/types';
export interface OwnProps extends GrafanaRouteComponentProps<{ uid: string }> {}
const mapStateToProps = (state: StoreState, props: OwnProps) => {
const uid = props.match.params.uid;
return {
navModel: getNavModel(state.navIndex, `folder-settings-${uid}`, getLoadingNav(2)),
folderUid: uid,
folder: state.folder,
};
};
const mapDispatchToProps = {
getFolderByUid,
saveFolder,
setFolderTitle,
deleteFolder,
};
const connector = connect(mapStateToProps, mapDispatchToProps);
export type Props = OwnProps & ConnectedProps<typeof connector>;
export interface State {
isLoading: boolean;
}
export class FolderSettingsPage extends PureComponent<Props, State> {
constructor(props: Props) {
super(props);
this.state = {
isLoading: false,
};
}
componentDidMount() {
this.props.getFolderByUid(this.props.folderUid);
}
onTitleChange = (evt: React.ChangeEvent<HTMLInputElement>) => {
this.props.setFolderTitle(evt.target.value);
};
onSave = async (evt: React.FormEvent<HTMLFormElement>) => {
evt.preventDefault();
evt.stopPropagation();
this.setState({ isLoading: true });
await this.props.saveFolder(this.props.folder);
this.setState({ isLoading: false });
};
onDelete = (evt: React.MouseEvent<HTMLButtonElement>) => {
evt.stopPropagation();
evt.preventDefault();
const confirmationText = `Do you want to delete this folder and all its dashboards and alerts?`;
appEvents.publish(
new ShowConfirmModalEvent({
title: 'Delete',
text: confirmationText,
icon: 'trash-alt',
yesText: 'Delete',
onConfirm: () => {
this.props.deleteFolder(this.props.folder.uid);
},
})
);
};
render() {
const { navModel, folder } = this.props;
return (
<Page navModel={navModel}>
<Page.Contents isLoading={this.state.isLoading}>
<h3 className="page-sub-heading">Folder settings</h3>
<div className="section gf-form-group">
<form name="folderSettingsForm" onSubmit={this.onSave}>
<div className="gf-form">
<label className="gf-form-label width-7">Name</label>
<Input
type="text"
className="gf-form-input width-30"
value={folder.title}
onChange={this.onTitleChange}
/>
</div>
<div className="gf-form-button-row">
<Button type="submit" disabled={!folder.canSave || !folder.hasChanged}>
Save
</Button>
<Button variant="destructive" onClick={this.onDelete} disabled={!folder.canSave}>
Delete
</Button>
</div>
</form>
</div>
</Page.Contents>
</Page>
);
}
}
export default connector(FolderSettingsPage);