grafana/public/app/features/dashboard/validation_srv.ts
2018-08-26 17:14:40 +02:00

75 lines
1.9 KiB
TypeScript

import coreModule from 'app/core/core_module';
const hitTypes = {
FOLDER: 'dash-folder',
DASHBOARD: 'dash-db',
};
export class ValidationSrv {
rootName = 'general';
/** @ngInject */
constructor(private $q, private backendSrv) {}
validateNewDashboardName(folderId, name) {
return this.validate(folderId, name, 'A dashboard in this folder with the same name already exists');
}
validateNewFolderName(name) {
return this.validate(0, name, 'A folder or dashboard in the general folder with the same name already exists');
}
private validate(folderId, name, existingErrorMessage) {
name = (name || '').trim();
const nameLowerCased = name.toLowerCase();
if (name.length === 0) {
return this.$q.reject({
type: 'REQUIRED',
message: 'Name is required',
});
}
if (folderId === 0 && nameLowerCased === this.rootName) {
return this.$q.reject({
type: 'EXISTING',
message: 'This is a reserved name and cannot be used for a folder.',
});
}
const deferred = this.$q.defer();
const promises = [];
promises.push(this.backendSrv.search({ type: hitTypes.FOLDER, folderIds: [folderId], query: name }));
promises.push(this.backendSrv.search({ type: hitTypes.DASHBOARD, folderIds: [folderId], query: name }));
this.$q.all(promises).then(res => {
let hits = [];
if (res.length > 0 && res[0].length > 0) {
hits = res[0];
}
if (res.length > 1 && res[1].length > 0) {
hits = hits.concat(res[1]);
}
for (const hit of hits) {
if (nameLowerCased === hit.title.toLowerCase()) {
deferred.reject({
type: 'EXISTING',
message: existingErrorMessage,
});
break;
}
}
deferred.resolve();
});
return deferred.promise;
}
}
coreModule.service('validationSrv', ValidationSrv);