folder_settings_ctrl.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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(
  14. private backendSrv,
  15. navModelSrv,
  16. private $routeParams,
  17. private $location
  18. ) {
  19. if (this.$routeParams.folderId && this.$routeParams.slug) {
  20. this.folderId = $routeParams.folderId;
  21. this.folderPageLoader = new FolderPageLoader(
  22. this.backendSrv,
  23. this.$routeParams
  24. );
  25. this.folderPageLoader
  26. .load(this, this.folderId, 'manage-folder-settings')
  27. .then(result => {
  28. this.dashboard = result.dashboard;
  29. this.meta = result.meta;
  30. this.canSave = result.meta.canSave;
  31. this.title = this.dashboard.title;
  32. });
  33. }
  34. }
  35. save() {
  36. this.titleChanged();
  37. if (!this.hasChanged) {
  38. return;
  39. }
  40. this.dashboard.title = this.title.trim();
  41. return this.backendSrv
  42. .saveDashboard(this.dashboard, { overwrite: false })
  43. .then(result => {
  44. var folderUrl = this.folderPageLoader.createFolderUrl(
  45. this.folderId,
  46. this.meta.type,
  47. result.slug
  48. );
  49. if (folderUrl !== this.$location.path()) {
  50. this.$location.url(folderUrl + '/settings');
  51. }
  52. appEvents.emit('dashboard-saved');
  53. appEvents.emit('alert-success', ['Folder saved']);
  54. })
  55. .catch(this.handleSaveFolderError);
  56. }
  57. titleChanged() {
  58. this.hasChanged =
  59. this.dashboard.title.toLowerCase() !== this.title.trim().toLowerCase();
  60. }
  61. delete(evt) {
  62. if (evt) {
  63. evt.stopPropagation();
  64. evt.preventDefault();
  65. }
  66. appEvents.emit('confirm-modal', {
  67. title: 'Delete',
  68. text: `Do you want to delete this folder and all its dashboards?`,
  69. icon: 'fa-trash',
  70. yesText: 'Delete',
  71. onConfirm: () => {
  72. return this.backendSrv.deleteDashboard(this.meta.slug).then(() => {
  73. appEvents.emit('alert-success', [
  74. 'Folder Deleted',
  75. `${this.dashboard.title} has been deleted`,
  76. ]);
  77. this.$location.url('/dashboards');
  78. });
  79. },
  80. });
  81. }
  82. handleSaveFolderError(err) {
  83. if (err.data && err.data.status === 'version-mismatch') {
  84. err.isHandled = true;
  85. appEvents.emit('confirm-modal', {
  86. title: 'Conflict',
  87. text: 'Someone else has updated this folder.',
  88. text2: 'Would you still like to save this folder?',
  89. yesText: 'Save & Overwrite',
  90. icon: 'fa-warning',
  91. onConfirm: () => {
  92. this.backendSrv.saveDashboard(this.dashboard, { overwrite: true });
  93. },
  94. });
  95. }
  96. if (err.data && err.data.status === 'name-exists') {
  97. err.isHandled = true;
  98. appEvents.emit('alert-error', [
  99. 'A folder or dashboard with this name exists already.',
  100. ]);
  101. }
  102. }
  103. }