FolderSettings.tsx 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import React from 'react';
  2. import { inject, observer } from 'mobx-react';
  3. import { toJS } from 'mobx';
  4. import PageHeader from 'app/core/components/PageHeader/PageHeader';
  5. import IContainerProps from 'app/containers/IContainerProps';
  6. import { getSnapshot } from 'mobx-state-tree';
  7. import appEvents from 'app/core/app_events';
  8. @inject('nav', 'folder', 'view')
  9. @observer
  10. export class FolderSettings extends React.Component<IContainerProps, any> {
  11. formSnapshot: any;
  12. constructor(props) {
  13. super(props);
  14. this.loadStore();
  15. }
  16. loadStore() {
  17. const { nav, folder, view } = this.props;
  18. return folder.load(view.routeParams.get('uid') as string).then(res => {
  19. this.formSnapshot = getSnapshot(folder);
  20. view.updatePathAndQuery(`${res.url}/settings`, {}, {});
  21. return nav.initFolderNav(toJS(folder.folder), 'manage-folder-settings');
  22. });
  23. }
  24. onTitleChange(evt) {
  25. this.props.folder.setTitle(this.getFormSnapshot().folder.title, evt.target.value);
  26. }
  27. getFormSnapshot() {
  28. if (!this.formSnapshot) {
  29. this.formSnapshot = getSnapshot(this.props.folder);
  30. }
  31. return this.formSnapshot;
  32. }
  33. save(evt) {
  34. if (evt) {
  35. evt.stopPropagation();
  36. evt.preventDefault();
  37. }
  38. const { nav, folder, view } = this.props;
  39. folder
  40. .saveFolder({ overwrite: false })
  41. .then(newUrl => {
  42. view.updatePathAndQuery(newUrl, {}, {});
  43. appEvents.emit('dashboard-saved');
  44. appEvents.emit('alert-success', ['Folder saved']);
  45. })
  46. .then(() => {
  47. return nav.initFolderNav(toJS(folder.folder), 'manage-folder-settings');
  48. })
  49. .catch(this.handleSaveFolderError.bind(this));
  50. }
  51. delete(evt) {
  52. if (evt) {
  53. evt.stopPropagation();
  54. evt.preventDefault();
  55. }
  56. const { folder, view } = this.props;
  57. const title = folder.folder.title;
  58. appEvents.emit('confirm-modal', {
  59. title: 'Delete',
  60. text: `Do you want to delete this folder and all its dashboards?`,
  61. icon: 'fa-trash',
  62. yesText: 'Delete',
  63. onConfirm: () => {
  64. return folder.deleteFolder().then(() => {
  65. appEvents.emit('alert-success', ['Folder Deleted', `${title} has been deleted`]);
  66. view.updatePathAndQuery('dashboards', '', '');
  67. });
  68. },
  69. });
  70. }
  71. handleSaveFolderError(err) {
  72. if (err.data && err.data.status === 'version-mismatch') {
  73. err.isHandled = true;
  74. const { nav, folder, view } = this.props;
  75. appEvents.emit('confirm-modal', {
  76. title: 'Conflict',
  77. text: 'Someone else has updated this folder.',
  78. text2: 'Would you still like to save this folder?',
  79. yesText: 'Save & Overwrite',
  80. icon: 'fa-warning',
  81. onConfirm: () => {
  82. folder
  83. .saveFolder({ overwrite: true })
  84. .then(newUrl => {
  85. view.updatePathAndQuery(newUrl, {}, {});
  86. appEvents.emit('dashboard-saved');
  87. appEvents.emit('alert-success', ['Folder saved']);
  88. })
  89. .then(() => {
  90. return nav.initFolderNav(toJS(folder.folder), 'manage-folder-settings');
  91. });
  92. },
  93. });
  94. }
  95. }
  96. render() {
  97. const { nav, folder } = this.props;
  98. if (!folder.folder || !nav.main) {
  99. return <h2>Loading</h2>;
  100. }
  101. return (
  102. <div>
  103. <PageHeader model={nav as any} />
  104. <div className="page-container page-body">
  105. <h2 className="page-sub-heading">Folder Settings</h2>
  106. <div className="section gf-form-group">
  107. <form name="folderSettingsForm" onSubmit={this.save.bind(this)}>
  108. <div className="gf-form">
  109. <label className="gf-form-label width-7">Name</label>
  110. <input
  111. type="text"
  112. className="gf-form-input width-30"
  113. value={folder.folder.title}
  114. onChange={this.onTitleChange.bind(this)}
  115. />
  116. </div>
  117. <div className="gf-form-button-row">
  118. <button
  119. type="submit"
  120. className="btn btn-success"
  121. disabled={!folder.folder.canSave || !folder.folder.hasChanged}
  122. >
  123. <i className="fa fa-save" /> Save
  124. </button>
  125. <button className="btn btn-danger" onClick={this.delete.bind(this)} disabled={!folder.folder.canSave}>
  126. <i className="fa fa-trash" /> Delete
  127. </button>
  128. </div>
  129. </form>
  130. </div>
  131. </div>
  132. </div>
  133. );
  134. }
  135. }