diff --git a/public/app/features/alerting/unified/components/create-folder/CreateNewFolder.tsx b/public/app/features/alerting/unified/components/create-folder/CreateNewFolder.tsx index a8e3d4d3fba..ab29218ebb0 100644 --- a/public/app/features/alerting/unified/components/create-folder/CreateNewFolder.tsx +++ b/public/app/features/alerting/unified/components/create-folder/CreateNewFolder.tsx @@ -48,9 +48,11 @@ function FolderCreationModal({ const styles = useStyles2(getStyles); const notifyApp = useAppNotification(); const [title, setTitle] = useState(''); + const [isCreatingFolder, setIsCreatingFolder] = useState(false); const [createFolder] = useNewFolderMutation(); const onSubmit = async () => { + setIsCreatingFolder(true); const { data, error } = await createFolder({ title }); if (error) { @@ -59,6 +61,7 @@ function FolderCreationModal({ onCreate({ title: data.title, uid: data.uid }); notifyApp.success('Folder created'); } + setIsCreatingFolder(false); }; return ( @@ -93,7 +96,7 @@ function FolderCreationModal({ - @@ -64,9 +66,9 @@ export function NewFolderForm({ onCancel, onConfirm }: Props) { ); } -export async function validateFolderName(folderName: string) { +export async function validateFolderName(folderName: string, parentFolderUid?: string) { try { - await validationSrv.validateNewFolderName(folderName); + await validationSrv.validateNewFolderName(folderName, parentFolderUid); return true; } catch (e) { if (e instanceof Error) { diff --git a/public/app/features/manage-dashboards/services/ValidationSrv.ts b/public/app/features/manage-dashboards/services/ValidationSrv.ts index 48ca75c417b..dcd6aecdf46 100644 --- a/public/app/features/manage-dashboards/services/ValidationSrv.ts +++ b/public/app/features/manage-dashboards/services/ValidationSrv.ts @@ -24,18 +24,28 @@ export class ValidationSrv { ); } - validateNewFolderName(name?: string) { - return this.validate( - this.rootName, - name, - t( - 'manage-dashboards.validation-srv.message-same-name-general', - 'A folder or dashboard in the general folder with the same name already exists' - ) - ); + validateNewFolderName(name?: string, parentFolderUid?: string) { + const validationMessage = parentFolderUid + ? t( + 'manage-dashboards.validation-srv.message-same-name-current-folder', + 'A dashboard or a folder with the same name already exists in the current folder' + ) + : t( + 'manage-dashboards.validation-srv.message-same-name-general', + 'A folder or dashboard with the same name already exists in the root folder' + ); + + return this.validate(parentFolderUid || this.rootName, name, validationMessage); } - private async validate(folderUID: string, name: string | undefined, existingErrorMessage: string) { + private async validate( + /** Folder in which to validate newly created resource */ + folderUID: string, + /** Name of the resource being created */ + name: string | undefined, + /** Error message to throw if the resource already exists */ + existingErrorMessage: string + ) { name = (name || '').trim(); const nameLowerCased = name.toLowerCase(); @@ -59,7 +69,7 @@ export class ValidationSrv { const searcher = getGrafanaSearcher(); const dashboardResults = await searcher.search({ - kind: ['dashboard'], + kind: ['dashboard', 'folder'], query: name, location: folderUID || 'general', }); diff --git a/public/locales/en-US/grafana.json b/public/locales/en-US/grafana.json index b705495578d..504b8a4505a 100644 --- a/public/locales/en-US/grafana.json +++ b/public/locales/en-US/grafana.json @@ -9755,7 +9755,8 @@ "message-name-required": "Name is required", "message-reserved-name": "This is a reserved name and cannot be used for a folder.", "message-same-name": "A dashboard or a folder with the same name already exists", - "message-same-name-general": "A folder or dashboard in the general folder with the same name already exists" + "message-same-name-current-folder": "A dashboard or a folder with the same name already exists in the current folder", + "message-same-name-general": "A folder or dashboard with the same name already exists in the root folder" } }, "metric-select": {