FolderSettingsPage.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import React, { PureComponent } from 'react';
  2. import { hot } from 'react-hot-loader';
  3. import { connect } from 'react-redux';
  4. import { NavModel } from '@grafana/data';
  5. import { Input } from '@grafana/ui';
  6. import Page from 'app/core/components/Page/Page';
  7. import appEvents from 'app/core/app_events';
  8. import { getNavModel } from 'app/core/selectors/navModel';
  9. import { StoreState, FolderState } from 'app/types';
  10. import { getFolderByUid, setFolderTitle, saveFolder, deleteFolder } from './state/actions';
  11. import { getLoadingNav } from './state/navModel';
  12. export interface Props {
  13. navModel: NavModel;
  14. folderUid: string;
  15. folder: FolderState;
  16. getFolderByUid: typeof getFolderByUid;
  17. setFolderTitle: typeof setFolderTitle;
  18. saveFolder: typeof saveFolder;
  19. deleteFolder: typeof deleteFolder;
  20. }
  21. export interface State {
  22. isLoading: boolean;
  23. }
  24. export class FolderSettingsPage extends PureComponent<Props, State> {
  25. constructor(props: Props) {
  26. super(props);
  27. this.state = {
  28. isLoading: false,
  29. };
  30. }
  31. componentDidMount() {
  32. this.props.getFolderByUid(this.props.folderUid);
  33. }
  34. onTitleChange = (evt: React.ChangeEvent<HTMLInputElement>) => {
  35. this.props.setFolderTitle(evt.target.value);
  36. };
  37. onSave = async (evt: React.FormEvent<HTMLFormElement>) => {
  38. evt.preventDefault();
  39. evt.stopPropagation();
  40. this.setState({ isLoading: true });
  41. await this.props.saveFolder(this.props.folder);
  42. this.setState({ isLoading: false });
  43. };
  44. onDelete = (evt: React.MouseEvent<HTMLButtonElement>) => {
  45. evt.stopPropagation();
  46. evt.preventDefault();
  47. appEvents.emit('confirm-modal', {
  48. title: 'Delete',
  49. text: `Do you want to delete this folder and all its dashboards?`,
  50. icon: 'fa-trash',
  51. yesText: 'Delete',
  52. onConfirm: () => {
  53. this.props.deleteFolder(this.props.folder.uid);
  54. },
  55. });
  56. };
  57. render() {
  58. const { navModel, folder } = this.props;
  59. return (
  60. <Page navModel={navModel}>
  61. <Page.Contents isLoading={this.state.isLoading}>
  62. <h3 className="page-sub-heading">Folder Settings</h3>
  63. <div className="section gf-form-group">
  64. <form name="folderSettingsForm" onSubmit={this.onSave}>
  65. <div className="gf-form">
  66. <label className="gf-form-label width-7">Name</label>
  67. <Input
  68. type="text"
  69. className="gf-form-input width-30"
  70. value={folder.title}
  71. onChange={this.onTitleChange}
  72. />
  73. </div>
  74. <div className="gf-form-button-row">
  75. <button type="submit" className="btn btn-primary" disabled={!folder.canSave || !folder.hasChanged}>
  76. Save
  77. </button>
  78. <button className="btn btn-danger" onClick={this.onDelete} disabled={!folder.canSave}>
  79. Delete
  80. </button>
  81. </div>
  82. </form>
  83. </div>
  84. </Page.Contents>
  85. </Page>
  86. );
  87. }
  88. }
  89. const mapStateToProps = (state: StoreState) => {
  90. const uid = state.location.routeParams.uid;
  91. return {
  92. navModel: getNavModel(state.navIndex, `folder-settings-${uid}`, getLoadingNav(2)),
  93. folderUid: uid,
  94. folder: state.folder,
  95. };
  96. };
  97. const mapDispatchToProps = {
  98. getFolderByUid,
  99. saveFolder,
  100. setFolderTitle,
  101. deleteFolder,
  102. };
  103. export default hot(module)(
  104. connect(
  105. mapStateToProps,
  106. mapDispatchToProps
  107. )(FolderSettingsPage)
  108. );