grafana/public/app/features/manage-dashboards/services/ValidationSrv.ts

71 lines
1.9 KiB
TypeScript
Raw Normal View History

2017-12-20 05:33:33 -06:00
import coreModule from 'app/core/core_module';
import { BackendSrv } from 'app/core/services/backend_srv';
const hitTypes = {
FOLDER: 'dash-folder',
DASHBOARD: 'dash-db',
};
export class ValidationSrv {
rootName = 'general';
/** @ngInject */
constructor(private backendSrv: BackendSrv) {}
validateNewDashboardName(folderId: any, name: string) {
return this.validate(folderId, name, 'A dashboard in this folder with the same name already exists');
}
validateNewFolderName(name: string) {
return this.validate(0, name, 'A folder or dashboard in the general folder with the same name already exists');
}
private validate(folderId: any, name: string, existingErrorMessage: string) {
2017-12-20 05:33:33 -06:00
name = (name || '').trim();
const nameLowerCased = name.toLowerCase();
if (name.length === 0) {
return Promise.reject({
2017-12-20 05:33:33 -06:00
type: 'REQUIRED',
message: 'Name is required',
});
}
if (folderId === 0 && nameLowerCased === this.rootName) {
return Promise.reject({
2017-12-20 05:33:33 -06:00
type: 'EXISTING',
message: 'This is a reserved name and cannot be used for a folder.',
});
}
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 }));
return Promise.all(promises).then(res => {
let hits: any[] = [];
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()) {
throw {
2017-12-20 05:33:33 -06:00
type: 'EXISTING',
message: existingErrorMessage,
};
}
}
return;
});
}
}
2017-12-20 05:33:33 -06:00
coreModule.service('validationSrv', ValidationSrv);