folder_settings_ctrl.ts 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import { FolderPageLoader } from './folder_page_loader';
  2. import appEvents from 'app/core/app_events';
  3. export class FolderSettingsCtrl {
  4. folderPageLoader: FolderPageLoader;
  5. navModel: any;
  6. folderId: number;
  7. canSave = false;
  8. dashboard: any;
  9. meta: any;
  10. title: string;
  11. hasChanged: boolean;
  12. /** @ngInject */
  13. constructor(private backendSrv, navModelSrv, private $routeParams, private $location) {
  14. if (this.$routeParams.folderId && this.$routeParams.slug) {
  15. this.folderId = $routeParams.folderId;
  16. this.folderPageLoader = new FolderPageLoader(this.backendSrv, this.$routeParams);
  17. this.folderPageLoader.load(this, this.folderId, 'manage-folder-settings').then(result => {
  18. this.dashboard = result.dashboard;
  19. this.meta = result.meta;
  20. this.canSave = result.meta.canSave;
  21. this.title = this.dashboard.title;
  22. });
  23. }
  24. }
  25. save() {
  26. this.titleChanged();
  27. if (!this.hasChanged) {
  28. return;
  29. }
  30. this.dashboard.title = this.title.trim();
  31. return this.backendSrv
  32. .saveDashboard(this.dashboard, { overwrite: false })
  33. .then(result => {
  34. var folderUrl = this.folderPageLoader.createFolderUrl(this.folderId, this.meta.type, result.slug);
  35. if (folderUrl !== this.$location.path()) {
  36. this.$location.url(folderUrl + '/settings');
  37. }
  38. appEvents.emit('dashboard-saved');
  39. appEvents.emit('alert-success', ['Folder saved']);
  40. })
  41. .catch(this.handleSaveFolderError);
  42. }
  43. titleChanged() {
  44. this.hasChanged = this.dashboard.title.toLowerCase() !== this.title.trim().toLowerCase();
  45. }
  46. delete(evt) {
  47. if (evt) {
  48. evt.stopPropagation();
  49. evt.preventDefault();
  50. }
  51. appEvents.emit('confirm-modal', {
  52. title: 'Delete',
  53. text: `Do you want to delete this folder and all its dashboards?`,
  54. icon: 'fa-trash',
  55. yesText: 'Delete',
  56. onConfirm: () => {
  57. return this.backendSrv.deleteDashboard(this.meta.slug).then(() => {
  58. appEvents.emit('alert-success', ['Folder Deleted', `${this.dashboard.title} has been deleted`]);
  59. this.$location.url('/dashboards');
  60. });
  61. },
  62. });
  63. }
  64. handleSaveFolderError(err) {
  65. if (err.data && err.data.status === 'version-mismatch') {
  66. err.isHandled = true;
  67. appEvents.emit('confirm-modal', {
  68. title: 'Conflict',
  69. text: 'Someone else has updated this folder.',
  70. text2: 'Would you still like to save this folder?',
  71. yesText: 'Save & Overwrite',
  72. icon: 'fa-warning',
  73. onConfirm: () => {
  74. this.backendSrv.saveDashboard(this.dashboard, { overwrite: true });
  75. },
  76. });
  77. }
  78. if (err.data && err.data.status === 'name-exists') {
  79. err.isHandled = true;
  80. appEvents.emit('alert-error', ['A folder or dashboard with this name exists already.']);
  81. }
  82. }
  83. }