mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
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:
@@ -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');
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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('/');
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user