FolderSettingsPage.tsx 3.1 KB

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