diff --git a/public/app/core/components/manage_dashboards/manage_dashboards.ts b/public/app/core/components/manage_dashboards/manage_dashboards.ts index 5b74a0e50fc..1aa8a3f014a 100644 --- a/public/app/core/components/manage_dashboards/manage_dashboards.ts +++ b/public/app/core/components/manage_dashboards/manage_dashboards.ts @@ -134,12 +134,12 @@ export class ManageDashboardsCtrl { const selectedDashboards = this.getDashboardsToMove(); const template = '' + + 'dashboards="model.dashboards" from-folder-id="model.fromFolderId" after-save="model.afterSave()">' + '`'; appEvents.emit('show-modal', { templateHtml: template, modalClass: 'modal--narrow', - model: { dashboards: selectedDashboards, afterSave: this.getDashboards.bind(this) } + model: { dashboards: selectedDashboards, fromFolderId: this.folderId ? Number(this.folderId) : 0, afterSave: this.getDashboards.bind(this) } }); } diff --git a/public/app/features/dashboard/folder_picker/picker.ts b/public/app/features/dashboard/folder_picker/picker.ts index 97666365696..ffde1dacc88 100644 --- a/public/app/features/dashboard/folder_picker/picker.ts +++ b/public/app/features/dashboard/folder_picker/picker.ts @@ -5,9 +5,10 @@ import _ from 'lodash'; export class FolderPickerCtrl { initialTitle: string; - initialFolderId: number; + initialFolderId?: number; labelClass: string; onChange: any; + onLoad: any; rootName = 'Root'; folder: any; @@ -17,12 +18,19 @@ export class FolderPickerCtrl { this.labelClass = "width-7"; } - if (this.initialFolderId > 0) { + if (this.initialFolderId && this.initialFolderId > 0) { this.getOptions('').then(result => { this.folder = _.find(result, {value: this.initialFolderId}); + this.onFolderLoad(); }); } else { - this.folder = {text: this.initialTitle, value: null}; + if (this.initialTitle) { + this.folder = {text: this.initialTitle, value: null}; + } else { + this.folder = {text: this.rootName, value: 0}; + } + + this.onFolderLoad(); } } @@ -33,8 +41,12 @@ export class FolderPickerCtrl { }; return this.backendSrv.search(params).then(result => { - if (query === "") { - result.unshift({title: this.rootName, value: 0}); + if (query === '' || + query.toLowerCase() === "r" || + query.toLowerCase() === "ro" || + query.toLowerCase() === "roo" || + query.toLowerCase() === "root") { + result.unshift({title: this.rootName, id: 0}); } return _.map(result, item => { @@ -43,6 +55,12 @@ export class FolderPickerCtrl { }); } + onFolderLoad() { + if (this.onLoad) { + this.onLoad({$folder: {id: this.folder.value, title: this.folder.text}}); + } + } + onFolderChange(option) { this.onChange({$folder: {id: option.value, title: option.text}}); } @@ -69,11 +87,12 @@ export function folderPicker() { bindToController: true, controllerAs: 'ctrl', scope: { - initialTitle: "<", + initialTitle: '<', initialFolderId: '<', labelClass: '@', rootName: '@', - onChange: '&' + onChange: '&', + onLoad: '&' } }; } diff --git a/public/app/features/dashboard/move_to_folder_modal/move_to_folder.html b/public/app/features/dashboard/move_to_folder_modal/move_to_folder.html index 429d6439e57..8f04d393a5d 100644 --- a/public/app/features/dashboard/move_to_folder_modal/move_to_folder.html +++ b/public/app/features/dashboard/move_to_folder_modal/move_to_folder.html @@ -15,7 +15,8 @@
- diff --git a/public/app/features/dashboard/move_to_folder_modal/move_to_folder.ts b/public/app/features/dashboard/move_to_folder_modal/move_to_folder.ts index ce110b3e2a2..4761969662e 100644 --- a/public/app/features/dashboard/move_to_folder_modal/move_to_folder.ts +++ b/public/app/features/dashboard/move_to_folder_modal/move_to_folder.ts @@ -7,6 +7,7 @@ export class MoveToFolderCtrl { folder: any; dismiss: any; afterSave: any; + fromFolderId: number; /** @ngInject */ constructor(private backendSrv, private $q) {} @@ -16,10 +17,16 @@ export class MoveToFolderCtrl { } save() { + if (this.folder.id === this.fromFolderId) { + appEvents.emit('alert-error', ['Dashboard(s) already belong to this folder']); + return; + } + const promises = []; for (let dash of this.dashboards) { const promise = this.backendSrv.get('/api/dashboards/' + dash).then(fullDash => { const model = new DashboardModel(fullDash.dashboard, fullDash.meta); + model.folderId = this.folder.id; model.meta.folderId = this.folder.id; model.meta.folderTitle = this.folder.title; @@ -53,6 +60,7 @@ export function moveToFolderModal() { scope: { dismiss: "&", dashboards: "=", + fromFolderId: '<', afterSave: "&" } }; diff --git a/public/app/features/dashboard/partials/settings.html b/public/app/features/dashboard/partials/settings.html index 6a8f4792f72..77d6691f8f9 100644 --- a/public/app/features/dashboard/partials/settings.html +++ b/public/app/features/dashboard/partials/settings.html @@ -37,9 +37,8 @@
- diff --git a/public/app/features/dashboard/save_as_modal.ts b/public/app/features/dashboard/save_as_modal.ts index bbb2899f665..643d6a36f67 100644 --- a/public/app/features/dashboard/save_as_modal.ts +++ b/public/app/features/dashboard/save_as_modal.ts @@ -22,7 +22,7 @@ const template = `
- @@ -39,7 +39,7 @@ const template = ` export class SaveDashboardAsModalCtrl { clone: any; - folderTitle: any; + folderId: any; dismiss: () => void; /** @ngInject */ @@ -50,7 +50,7 @@ export class SaveDashboardAsModalCtrl { this.clone.title += ' Copy'; this.clone.editable = true; this.clone.hideControls = false; - this.folderTitle = dashboard.meta.folderTitle || 'Root'; + this.folderId = dashboard.folderId; // remove alerts if source dashboard is already persisted // do not want to create alert dupes diff --git a/public/app/plugins/panel/permissionlist/editor.html b/public/app/plugins/panel/permissionlist/editor.html index fc29351f4d2..3f0708642dc 100644 --- a/public/app/plugins/panel/permissionlist/editor.html +++ b/public/app/plugins/panel/permissionlist/editor.html @@ -2,8 +2,7 @@
Options
-