dashfolders: bulk move/delete improvements

bulk delete dashboards synchronously
moved bulk delete and move dashboards to backend_srv
better error handling/messages when moving and deleting folders/dashboards
fixes #10181
This commit is contained in:
Marcus Efraimsson
2017-12-14 15:07:31 +01:00
parent 4f56d4ac07
commit 854d22fa8e
6 changed files with 178 additions and 86 deletions

View File

@@ -50,8 +50,8 @@ export class FolderSettingsCtrl {
icon: 'fa-trash',
yesText: 'Delete',
onConfirm: () => {
return this.backendSrv.delete(`/api/dashboards/${this.meta.type}/${this.meta.slug}`).then(() => {
appEvents.emit('alert-success', ['Folder deleted']);
return this.backendSrv.deleteDashboard(this.meta.slug).then(() => {
appEvents.emit('alert-success', ['Folder Deleted', `${this.dashboard.title} has been deleted`]);
this.$location.url('/dashboards');
});
}

View File

@@ -1,7 +1,5 @@
import _ from 'lodash';
import coreModule from 'app/core/core_module';
import appEvents from 'app/core/app_events';
import { DashboardModel } from '../dashboard_model';
export class MoveToFolderCtrl {
dashboards: any;
@@ -10,75 +8,23 @@ export class MoveToFolderCtrl {
afterSave: any;
/** @ngInject */
constructor(private backendSrv, private $q) { }
constructor(private backendSrv) { }
onFolderChange(folder) {
this.folder = folder;
}
private doNext(fn, ...args: any[]) {
return function (result) {
return fn.apply(null, args)
.then(res => {
return Array.prototype.concat(result, [res]);
});
};
}
private doInOrder(tasks, init) {
return tasks.reduce(this.$q.when, init);
}
private moveDashboard(dash) {
let deferred = this.$q.defer();
this.backendSrv.get('/api/dashboards/db/' + dash)
.then(fullDash => {
const model = new DashboardModel(fullDash.dashboard, fullDash.meta);
if ((!model.folderId && this.folder.id === 0) ||
model.folderId === this.folder.id) {
deferred.resolve({alreadyInFolder: true});
return;
}
model.folderId = this.folder.id;
model.meta.folderId = this.folder.id;
model.meta.folderTitle = this.folder.title;
const clone = model.getSaveModelClone();
this.backendSrv.saveDashboard(clone)
.then(() => {
deferred.resolve({succeeded: true});
})
.catch(err => {
deferred.resolve({succeeded: false});
});
});
return deferred.promise;
}
save() {
const tasks = [];
for (let dash of this.dashboards) {
tasks.push(this.doNext(this.moveDashboard.bind(this), dash));
}
return this.doInOrder(tasks, [])
return this.backendSrv.moveDashboards(this.dashboards, this.folder)
.then(result => {
const totalCount = result.length;
const successCount = _.filter(result, { succeeded: true }).length;
const alreadyInFolderCount = _.filter(result, { alreadyInFolder: true }).length;
if (successCount > 0) {
const msg = successCount + ' dashboard' + (successCount === 1 ? '' : 's') + ' moved to ' + this.folder.title;
appEvents.emit('alert-success', [ 'Dashboard' + (successCount === 1 ? '' : 's') + ' Moved', msg]);
if (result.successCount > 0) {
const header = `Dashboard${result.successCount === 1 ? '' : 's'} Moved`;
const msg = `${result.successCount} dashboard${result.successCount === 1 ? '' : 's'} moved to ${this.folder.title}`;
appEvents.emit('alert-success', [header, msg]);
}
if (totalCount === alreadyInFolderCount) {
appEvents.emit('alert-error', ['Error', 'Dashboards already belongs to folder ' + this.folder.title]);
if (result.totalCount === result.alreadyInFolderCount) {
appEvents.emit('alert-error', ['Error', `Dashboards already belongs to folder ${this.folder.title}`]);
}
this.dismiss();

View File

@@ -128,7 +128,7 @@ export class SettingsCtrl {
}
deleteDashboardConfirmed() {
this.backendSrv.delete('/api/dashboards/db/' + this.dashboard.meta.slug).then(() => {
this.backendSrv.deleteDashboard(this.dashboard.meta.slug).then(() => {
appEvents.emit('alert-success', ['Dashboard Deleted', this.dashboard.title + ' has been deleted']);
this.$location.url('/');
});