|
|
@@ -1,13 +1,27 @@
|
|
|
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) {}
|
|
|
|
|
|
- validateNewDashboardOrFolderName(name) {
|
|
|
+ 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({
|
|
|
@@ -16,7 +30,7 @@ export class ValidationSrv {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- if (name.toLowerCase() === this.rootName) {
|
|
|
+ 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.',
|
|
|
@@ -25,12 +39,26 @@ export class ValidationSrv {
|
|
|
|
|
|
let deferred = this.$q.defer();
|
|
|
|
|
|
- this.backendSrv.search({ query: name }).then(res => {
|
|
|
- for (let hit of res) {
|
|
|
- if (name.toLowerCase() === hit.title.toLowerCase()) {
|
|
|
+ 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 (let hit of hits) {
|
|
|
+ if (nameLowerCased === hit.title.toLowerCase()) {
|
|
|
deferred.reject({
|
|
|
type: 'EXISTING',
|
|
|
- message: 'A folder or dashboard with the same name already exists',
|
|
|
+ message: existingErrorMessage,
|
|
|
});
|
|
|
break;
|
|
|
}
|