diff --git a/ordinis-admin-ui/src/components/schema/DictionaryEditorDialog.tsx b/ordinis-admin-ui/src/components/schema/DictionaryEditorDialog.tsx index d8466a9..4f231de 100644 --- a/ordinis-admin-ui/src/components/schema/DictionaryEditorDialog.tsx +++ b/ordinis-admin-ui/src/components/schema/DictionaryEditorDialog.tsx @@ -1,5 +1,6 @@ import { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' +import { useQueryClient } from '@tanstack/react-query' import axios from 'axios' import { Alert, @@ -15,6 +16,7 @@ import { type TabItem, } from '@nstart/ui' import { useCreateDictionary, useUpdateDictionary } from '@/api/mutations' +import { dictionaryDetailQuery, useDictionaries } from '@/api/queries' import type { CreateDictionaryRequest, DataScope, DictionaryDetail } from '@/api/client' import { SchemaBuilder } from './SchemaBuilder' import { @@ -73,6 +75,44 @@ export const DictionaryEditorDialog = ({ open, mode, onClose, onSuccess }: Props const [idSource, setIdSource] = useState(parsed.idSource ?? '') const [nameError, setNameError] = useState(null) + // Template (только в create-mode): admin выбирает существующий dict, + // его schema + locale + scope копируются. Имя остаётся пустым (admin + // вводит уникальное), version reset на 1.0.0. + const queryClient = useQueryClient() + const dictsQuery = useDictionaries() + const [loadingTemplate, setLoadingTemplate] = useState(false) + const templateOptions: SelectOption[] = useMemo(() => { + if (isEdit) return [] + const list = dictsQuery.data ?? [] + return list + .map((d) => ({ + id: d.name, + label: d.displayName ? `${d.name} — ${d.displayName}` : d.name, + })) + .sort((a, b) => a.label.localeCompare(b.label, 'ru')) + }, [dictsQuery.data, isEdit]) + + const handleApplyTemplate = async (templateName: string) => { + if (!templateName) return + setLoadingTemplate(true) + try { + const detail = await queryClient.fetchQuery(dictionaryDetailQuery(templateName)) + const tplParsed = parseSchemaJson(detail.schemaJson) + // Не трогаем name — admin должен ввести уникальное. + setDisplayName('') + setDescription(detail.description ?? '') + setScope(detail.scope) + setBundle(detail.bundle ?? 'cuod') + setSchemaVersion('1.0.0') + setSupportedLocales(detail.supportedLocales ?? ['ru-RU']) + setDefaultLocale(detail.defaultLocale ?? 'ru-RU') + setProperties(tplParsed.properties) + setIdSource(tplParsed.idSource ?? '') + } finally { + setLoadingTemplate(false) + } + } + const schemaJson = useMemo( () => buildSchemaJson(properties, idSource || undefined), [properties, idSource], @@ -147,6 +187,26 @@ export const DictionaryEditorDialog = ({ open, mode, onClose, onSuccess }: Props setActiveTab(id as EditorTab)} />
+ {!isEdit && ( +
+ { + void handleApplyTemplate(id) + }} + placeholder={ + dictsQuery.isLoading || loadingTemplate + ? '…' + : t('schema.template.placeholder') + } + disabled={dictsQuery.isLoading || loadingTemplate} + /> +
+ )} +