diff --git a/rsconcept/frontend/src/features/ai/dialogs/dlg-create-prompt-template.tsx b/rsconcept/frontend/src/features/ai/dialogs/dlg-create-prompt-template.tsx index 65fa4dd0..99ddf642 100644 --- a/rsconcept/frontend/src/features/ai/dialogs/dlg-create-prompt-template.tsx +++ b/rsconcept/frontend/src/features/ai/dialogs/dlg-create-prompt-template.tsx @@ -41,7 +41,7 @@ export function DlgCreatePromptTemplate() { mode: 'onChange' }); const label = useWatch({ control, name: 'label' }); - const isValid = !!label && !templates.find(template => template.label === label); + const canSubmit = !!label && !templates.find(template => template.label === label); function onSubmit(data: ICreatePromptTemplateDTO) { void createPromptTemplate(data).then(onCreate); @@ -51,7 +51,7 @@ export function DlgCreatePromptTemplate() { void handleSubmit(onSubmit)(event)} submitInvalidTooltip='Введите уникальное название шаблона' className='cc-column w-140 max-h-120 py-2 px-6' diff --git a/rsconcept/frontend/src/features/library/dialogs/dlg-edit-editors/dlg-edit-editors.tsx b/rsconcept/frontend/src/features/library/dialogs/dlg-edit-editors/dlg-edit-editors.tsx index 3fe46911..78f8f105 100644 --- a/rsconcept/frontend/src/features/library/dialogs/dlg-edit-editors/dlg-edit-editors.tsx +++ b/rsconcept/frontend/src/features/library/dialogs/dlg-edit-editors/dlg-edit-editors.tsx @@ -26,7 +26,8 @@ export function DlgEditEditors() { const [selected, setSelected] = useState(initial); const { users } = useUsers(); - function handleSubmit() { + function handleSubmit(event: React.FormEvent) { + event.preventDefault(); void setEditors({ itemID: itemID, editors: selected }); } diff --git a/rsconcept/frontend/src/features/oss/backend/api.ts b/rsconcept/frontend/src/features/oss/backend/api.ts index 861edc09..0918cc28 100644 --- a/rsconcept/frontend/src/features/oss/backend/api.ts +++ b/rsconcept/frontend/src/features/oss/backend/api.ts @@ -42,13 +42,12 @@ export const ossApi = { queryKey: KEYS.composite.ossItem({ itemID }), staleTime: DELAYS.staleShort, queryFn: meta => - !itemID - ? undefined - : axiosGet({ - schema: schemaOperationSchema, - endpoint: `/api/oss/${itemID}/details`, - options: { signal: meta.signal } - }) + axiosGet({ + schema: schemaOperationSchema, + endpoint: `/api/oss/${itemID}/details`, + options: { signal: meta.signal } + }), + enabled: !!itemID }); }, diff --git a/rsconcept/frontend/src/features/oss/backend/use-oss.ts b/rsconcept/frontend/src/features/oss/backend/use-oss.ts index 2b1fe649..bb0c1925 100644 --- a/rsconcept/frontend/src/features/oss/backend/use-oss.ts +++ b/rsconcept/frontend/src/features/oss/backend/use-oss.ts @@ -18,7 +18,7 @@ export function useOssSuspense({ itemID }: { itemID: number }) { const { data } = useSuspenseQuery({ ...ossApi.getOssQueryOptions({ itemID }) }); - const schema = new OssLoader(data!).produceOSS(); + const schema = new OssLoader(data).produceOSS(); return { schema }; } diff --git a/rsconcept/frontend/src/features/oss/dialogs/dlg-create-block/dlg-create-block.tsx b/rsconcept/frontend/src/features/oss/dialogs/dlg-create-block/dlg-create-block.tsx index 7a81ae0c..4ba581ed 100644 --- a/rsconcept/frontend/src/features/oss/dialogs/dlg-create-block/dlg-create-block.tsx +++ b/rsconcept/frontend/src/features/oss/dialogs/dlg-create-block/dlg-create-block.tsx @@ -77,7 +77,7 @@ export function DlgCreateBlock() { const children_blocks = useWatch({ control: methods.control, name: 'children_blocks' }); const children_operations = useWatch({ control: methods.control, name: 'children_operations' }); const [activeTab, setActiveTab] = useState(TabID.CARD); - const isValid = !!title && !manager.oss.blocks.some(block => block.title === title); + const canSubmit = methods.formState.isValid && !!title && !manager.oss.blocks.some(block => block.title === title); function onSubmit(data: ICreateBlockDTO) { data.position = manager.newBlockPosition(data); @@ -89,7 +89,7 @@ export function DlgCreateBlock() { void methods.handleSubmit(onSubmit)(event)} className='w-160 px-6 h-110' helpTopic={HelpTopic.CC_STRUCTURING} diff --git a/rsconcept/frontend/src/features/oss/dialogs/dlg-create-schema.tsx b/rsconcept/frontend/src/features/oss/dialogs/dlg-create-schema.tsx index 39700399..582ec16c 100644 --- a/rsconcept/frontend/src/features/oss/dialogs/dlg-create-schema.tsx +++ b/rsconcept/frontend/src/features/oss/dialogs/dlg-create-schema.tsx @@ -43,7 +43,7 @@ export function DlgCreateSchema() { control, register, handleSubmit, - formState: { errors } + formState: { errors, isValid } } = useForm({ resolver: zodResolver(schemaCreateSchema), defaultValues: { @@ -64,7 +64,7 @@ export function DlgCreateSchema() { mode: 'onChange' }); const alias = useWatch({ control: control, name: 'item_data.alias' }); - const isValid = !!alias && !manager.oss.operations.some(operation => operation.alias === alias); + const canSubmit = isValid && !!alias && !manager.oss.operations.some(operation => operation.alias === alias); function onSubmit(data: ICreateSchemaDTO) { data.position = manager.newOperationPosition(data); @@ -76,7 +76,7 @@ export function DlgCreateSchema() { void handleSubmit(onSubmit)(event)} className='w-180 px-6 pb-3 cc-column' helpTopic={HelpTopic.CC_OSS} diff --git a/rsconcept/frontend/src/features/oss/dialogs/dlg-create-synthesis/dlg-create-synthesis.tsx b/rsconcept/frontend/src/features/oss/dialogs/dlg-create-synthesis/dlg-create-synthesis.tsx index c596df73..34f0664f 100644 --- a/rsconcept/frontend/src/features/oss/dialogs/dlg-create-synthesis/dlg-create-synthesis.tsx +++ b/rsconcept/frontend/src/features/oss/dialogs/dlg-create-synthesis/dlg-create-synthesis.tsx @@ -73,7 +73,8 @@ export function DlgCreateSynthesis() { }); const alias = useWatch({ control: methods.control, name: 'item_data.alias' }); const [activeTab, setActiveTab] = useState(TabID.ARGUMENTS); - const isValid = !!alias && !manager.oss.operations.some(operation => operation.alias === alias); + const canSubmit = + methods.formState.isValid && !!alias && !manager.oss.operations.some(operation => operation.alias === alias); function onSubmit(data: ICreateSynthesisDTO) { data.position = manager.newOperationPosition(data); @@ -85,7 +86,7 @@ export function DlgCreateSynthesis() { void methods.handleSubmit(onSubmit)(event)} className='w-180 px-6 h-128' helpTopic={HelpTopic.CC_OSS} diff --git a/rsconcept/frontend/src/features/oss/dialogs/dlg-edit-operation/dlg-edit-operation.tsx b/rsconcept/frontend/src/features/oss/dialogs/dlg-edit-operation/dlg-edit-operation.tsx index e72ad07f..5bf84777 100644 --- a/rsconcept/frontend/src/features/oss/dialogs/dlg-edit-operation/dlg-edit-operation.tsx +++ b/rsconcept/frontend/src/features/oss/dialogs/dlg-edit-operation/dlg-edit-operation.tsx @@ -64,6 +64,7 @@ export function DlgEditOperation() { mode: 'onChange' }); const [activeTab, setActiveTab] = useState(TabID.CARD); + const canSubmit = methods.formState.isValid; function onSubmit(data: IUpdateOperationDTO) { if (data.item_data.parent !== target.parent) { @@ -77,7 +78,7 @@ export function DlgEditOperation() { void methods.handleSubmit(onSubmit)(event)} className='w-160 px-6 h-128' helpTopic={HelpTopic.UI_SUBSTITUTIONS} diff --git a/rsconcept/frontend/src/features/oss/dialogs/dlg-import-schema.tsx b/rsconcept/frontend/src/features/oss/dialogs/dlg-import-schema.tsx index 4b48c237..984c1afb 100644 --- a/rsconcept/frontend/src/features/oss/dialogs/dlg-import-schema.tsx +++ b/rsconcept/frontend/src/features/oss/dialogs/dlg-import-schema.tsx @@ -49,7 +49,7 @@ export function DlgImportSchema() { register, handleSubmit, setValue, - formState: { errors } + formState: { errors, isValid } } = useForm({ resolver: zodResolver(schemaImportSchema), defaultValues: { @@ -73,7 +73,7 @@ export function DlgImportSchema() { }); const alias = useWatch({ control: control, name: 'item_data.alias' }); const clone_source = useWatch({ control: control, name: 'clone_source' }); - const isValid = !!alias && !manager.oss.operations.some(operation => operation.alias === alias); + const canSubmit = isValid && !!alias && !manager.oss.operations.some(operation => operation.alias === alias); function onSubmit(data: IImportSchemaDTO) { data.position = manager.newOperationPosition(data); @@ -100,7 +100,7 @@ export function DlgImportSchema() { void handleSubmit(onSubmit)(event)} className='w-180 px-6 pb-3 cc-column' helpTopic={HelpTopic.CC_OSS} diff --git a/rsconcept/frontend/src/features/oss/dialogs/dlg-relocate-constituents.tsx b/rsconcept/frontend/src/features/oss/dialogs/dlg-relocate-constituents.tsx index 9af74fe9..b61645c7 100644 --- a/rsconcept/frontend/src/features/oss/dialogs/dlg-relocate-constituents.tsx +++ b/rsconcept/frontend/src/features/oss/dialogs/dlg-relocate-constituents.tsx @@ -80,6 +80,7 @@ export function DlgRelocateConstituents() { .filter(item => !item.is_inherited && selected.includes(item.id)) .map(item => item.id); const isValid = moveTarget.length > 0; + const canSubmit = isValid && destinationItem !== undefined; function toggleDirection() { setDirectionUp(prev => !prev); @@ -118,7 +119,7 @@ export function DlgRelocateConstituents() { void handleSubmit(onSubmit)(event)} className='w-160 h-132 py-3 px-6' diff --git a/rsconcept/frontend/src/features/rsform/backend/api.ts b/rsconcept/frontend/src/features/rsform/backend/api.ts index 8bc91a44..918cb08f 100644 --- a/rsconcept/frontend/src/features/rsform/backend/api.ts +++ b/rsconcept/frontend/src/features/rsform/backend/api.ts @@ -34,13 +34,12 @@ export const rsformsApi = { queryKey: KEYS.composite.rsItem({ itemID, version }), staleTime: DELAYS.staleShort, queryFn: meta => - !itemID - ? undefined - : axiosGet({ - schema: schemaRSForm, - endpoint: version ? `/api/library/${itemID}/versions/${version}` : `/api/rsforms/${itemID}/details`, - options: { signal: meta.signal } - }) + axiosGet({ + schema: schemaRSForm, + endpoint: version ? `/api/library/${itemID}/versions/${version}` : `/api/rsforms/${itemID}/details`, + options: { signal: meta.signal } + }), + enabled: !!itemID }); }, diff --git a/rsconcept/frontend/src/features/rsform/backend/use-rsform.ts b/rsconcept/frontend/src/features/rsform/backend/use-rsform.ts index c7ff9d40..352a0198 100644 --- a/rsconcept/frontend/src/features/rsform/backend/use-rsform.ts +++ b/rsconcept/frontend/src/features/rsform/backend/use-rsform.ts @@ -18,7 +18,7 @@ export function useRSFormSuspense({ itemID, version }: { itemID: number; version const { data } = useSuspenseQuery({ ...rsformsApi.getRSFormQueryOptions({ itemID, version }) }); - const schema = new RSFormLoader(data!).produceRSForm(); + const schema = new RSFormLoader(data).produceRSForm(); return { schema }; } diff --git a/rsconcept/frontend/src/features/rsform/dialogs/dlg-create-cst/dlg-create-cst.tsx b/rsconcept/frontend/src/features/rsform/dialogs/dlg-create-cst/dlg-create-cst.tsx index d6d79615..c79bea81 100644 --- a/rsconcept/frontend/src/features/rsform/dialogs/dlg-create-cst/dlg-create-cst.tsx +++ b/rsconcept/frontend/src/features/rsform/dialogs/dlg-create-cst/dlg-create-cst.tsx @@ -31,12 +31,13 @@ export function DlgCreateCst() { const { schema } = useRSFormSuspense({ itemID: schemaID }); const methods = useForm({ + mode: 'onChange', resolver: zodResolver(schemaCreateConstituenta), defaultValues: { ...initial } }); const alias = useWatch({ control: methods.control, name: 'alias' }); const cst_type = useWatch({ control: methods.control, name: 'cst_type' }); - const isValid = validateNewAlias(alias, cst_type, schema); + const canSubmit = methods.formState.isValid && validateNewAlias(alias, cst_type, schema); function onSubmit(data: ICreateConstituentaDTO) { return cstCreate({ itemID: schema.id, data }).then(onCreate); @@ -45,7 +46,7 @@ export function DlgCreateCst() { return ( void methods.handleSubmit(onSubmit)(event)} submitInvalidTooltip={errorMsg.aliasInvalid} submitText='Создать' diff --git a/rsconcept/frontend/src/features/rsform/dialogs/dlg-cst-template/dlg-cst-template.tsx b/rsconcept/frontend/src/features/rsform/dialogs/dlg-cst-template/dlg-cst-template.tsx index 9b400521..b14d4186 100644 --- a/rsconcept/frontend/src/features/rsform/dialogs/dlg-cst-template/dlg-cst-template.tsx +++ b/rsconcept/frontend/src/features/rsform/dialogs/dlg-cst-template/dlg-cst-template.tsx @@ -13,14 +13,13 @@ import { useDialogsStore } from '@/stores/dialogs'; import { type RO } from '@/utils/meta'; import { - CstType, type IConstituentaBasicsDTO, type ICreateConstituentaDTO, schemaCreateConstituenta } from '../../backend/types'; import { useCreateConstituenta } from '../../backend/use-create-constituenta'; import { useRSFormSuspense } from '../../backend/use-rsform'; -import { generateAlias, validateNewAlias } from '../../models/rsform-api'; +import { validateNewAlias } from '../../models/rsform-api'; import { FormCreateCst } from '../dlg-create-cst/form-create-cst'; import { TabArguments } from './tab-arguments'; @@ -46,11 +45,13 @@ export function DlgCstTemplate() { const { schema } = useRSFormSuspense({ itemID: schemaID }); const methods = useForm({ + mode: 'onChange', resolver: zodResolver(schemaCreateConstituenta), defaultValues: { - cst_type: CstType.TERM, insert_after: insertAfter ?? null, - alias: generateAlias(CstType.TERM, schema), + crucial: false, + cst_type: undefined, + alias: '', convention: '', definition_formal: '', definition_raw: '', @@ -60,7 +61,7 @@ export function DlgCstTemplate() { }); const alias = useWatch({ control: methods.control, name: 'alias' }); const cst_type = useWatch({ control: methods.control, name: 'cst_type' }); - const isValid = validateNewAlias(alias, cst_type, schema); + const canSubmit = methods.formState.isValid && validateNewAlias(alias, cst_type, schema); const [activeTab, setActiveTab] = useState(TabID.TEMPLATE); @@ -73,7 +74,7 @@ export function DlgCstTemplate() { header='Создание конституенты из шаблона' submitText='Создать' className='w-172 h-140 px-6' - canSubmit={isValid} + canSubmit={canSubmit} onSubmit={event => void methods.handleSubmit(onSubmit)(event)} helpTopic={HelpTopic.RSL_TEMPLATES} > diff --git a/rsconcept/frontend/src/features/rsform/dialogs/dlg-cst-template/tab-template.tsx b/rsconcept/frontend/src/features/rsform/dialogs/dlg-cst-template/tab-template.tsx index ac82cbd1..2a2ac247 100644 --- a/rsconcept/frontend/src/features/rsform/dialogs/dlg-cst-template/tab-template.tsx +++ b/rsconcept/frontend/src/features/rsform/dialogs/dlg-cst-template/tab-template.tsx @@ -27,11 +27,6 @@ export function TabTemplate() { const { schema: templateSchema } = useRSForm({ itemID: templateID ?? undefined }); const selectedTemplate = templates.find(item => item.id === templateID); - if (!templateID) { - onChangeTemplateID(templates[0].id); - return null; - } - const filteredData = !templateSchema ? [] : !filterCategory diff --git a/rsconcept/frontend/src/features/rsform/dialogs/dlg-cst-template/template-state.tsx b/rsconcept/frontend/src/features/rsform/dialogs/dlg-cst-template/template-state.tsx index 3fe04949..aa8a7165 100644 --- a/rsconcept/frontend/src/features/rsform/dialogs/dlg-cst-template/template-state.tsx +++ b/rsconcept/frontend/src/features/rsform/dialogs/dlg-cst-template/template-state.tsx @@ -3,6 +3,8 @@ import { useState } from 'react'; import { useFormContext } from 'react-hook-form'; +import { useTemplatesSuspense } from '@/features/library/backend/use-templates'; + import { useDialogsStore } from '@/stores/dialogs'; import { type ICreateConstituentaDTO } from '../../backend/types'; @@ -18,8 +20,10 @@ import { TemplateContext } from './template-context'; export const TemplateState = ({ children }: React.PropsWithChildren) => { const { schemaID } = useDialogsStore(state => state.props as DlgCstTemplateProps); const { schema } = useRSFormSuspense({ itemID: schemaID }); + const { templates } = useTemplatesSuspense(); const { setValue } = useFormContext(); - const [templateID, setTemplateID] = useState(null); + + const [templateID, setTemplateID] = useState(templates.length > 0 ? templates[0].id : null); const [args, setArguments] = useState([]); const [prototype, setPrototype] = useState(null); const [filterCategory, setFilterCategory] = useState(null); @@ -32,8 +36,8 @@ export const TemplateState = ({ children }: React.PropsWithChildren) => { const newType = inferTemplatedType(prototype.cst_type, newArgs); setValue('definition_formal', substituteTemplateArgs(prototype.definition_formal, newArgs)); - setValue('cst_type', newType); - setValue('alias', generateAlias(newType, schema)); + setValue('cst_type', newType, { shouldValidate: true }); + setValue('alias', generateAlias(newType, schema), { shouldValidate: true }); } function onChangePrototype(newPrototype: IConstituenta) { @@ -45,8 +49,8 @@ export const TemplateState = ({ children }: React.PropsWithChildren) => { value: '' })) ); - setValue('cst_type', newPrototype.cst_type); - setValue('alias', generateAlias(newPrototype.cst_type, schema)); + setValue('cst_type', newPrototype.cst_type, { shouldValidate: true }); + setValue('alias', generateAlias(newPrototype.cst_type, schema), { shouldValidate: true }); setValue('definition_formal', newPrototype.definition_formal); setValue('term_raw', newPrototype.term_raw); setValue('definition_raw', newPrototype.definition_raw); diff --git a/rsconcept/frontend/src/features/rsform/dialogs/dlg-delete-cst/dlg-delete-cst.tsx b/rsconcept/frontend/src/features/rsform/dialogs/dlg-delete-cst/dlg-delete-cst.tsx index 00796e5b..032ec28d 100644 --- a/rsconcept/frontend/src/features/rsform/dialogs/dlg-delete-cst/dlg-delete-cst.tsx +++ b/rsconcept/frontend/src/features/rsform/dialogs/dlg-delete-cst/dlg-delete-cst.tsx @@ -31,7 +31,8 @@ export function DlgDeleteCst() { [selected, schema.inheritance] ); - function handleSubmit() { + function handleSubmit(event: React.FormEvent) { + event.preventDefault(); const deleted = expandOut ? selected.concat(expansion) : selected; void cstDelete({ itemID: schemaID, data: { items: deleted } }).then(() => afterDelete?.(schema, deleted)); } diff --git a/rsconcept/frontend/src/features/rsform/dialogs/dlg-edit-cst/dlg-edit-cst.tsx b/rsconcept/frontend/src/features/rsform/dialogs/dlg-edit-cst/dlg-edit-cst.tsx index 234a9e6e..ca8c17f1 100644 --- a/rsconcept/frontend/src/features/rsform/dialogs/dlg-edit-cst/dlg-edit-cst.tsx +++ b/rsconcept/frontend/src/features/rsform/dialogs/dlg-edit-cst/dlg-edit-cst.tsx @@ -35,6 +35,7 @@ export function DlgEditCst() { const { findPredecessor } = useFindPredecessor(); const methods = useForm({ + mode: 'onChange', resolver: zodResolver(schemaUpdateConstituenta), defaultValues: { target: target.id, @@ -53,7 +54,9 @@ export function DlgEditCst() { const alias = useWatch({ control: methods.control, name: 'item_data.alias' })!; const cst_type = useWatch({ control: methods.control, name: 'item_data.cst_type' })!; - const isValid = (alias === target.alias && cst_type == target.cst_type) || validateNewAlias(alias, cst_type, schema); + const canSubmit = + (methods.formState.isValid && alias === target.alias && cst_type == target.cst_type) || + validateNewAlias(alias, cst_type, schema); function onSubmit(data: IUpdateConstituentaDTO) { return updateConstituenta({ itemID: schema.id, data }); @@ -86,7 +89,7 @@ export function DlgEditCst() { return ( void methods.handleSubmit(onSubmit)(event)} submitInvalidTooltip={errorMsg.aliasInvalid} submitText='Сохранить' diff --git a/rsconcept/frontend/src/features/rsform/dialogs/dlg-edit-reference/dlg-edit-reference.tsx b/rsconcept/frontend/src/features/rsform/dialogs/dlg-edit-reference/dlg-edit-reference.tsx index 212fa31a..4994c3a3 100644 --- a/rsconcept/frontend/src/features/rsform/dialogs/dlg-edit-reference/dlg-edit-reference.tsx +++ b/rsconcept/frontend/src/features/rsform/dialogs/dlg-edit-reference/dlg-edit-reference.tsx @@ -76,6 +76,8 @@ export function DlgEditReference() { mode: 'onChange' }); + const canSubmit = methods.formState.isValid; + function onSubmit(data: IEditReferenceState) { if (data.type === ReferenceType.ENTITY) { onSave({ @@ -113,7 +115,7 @@ export function DlgEditReference() { void methods.handleSubmit(onSubmit)(event)} className='w-160 px-6 h-128' diff --git a/rsconcept/frontend/src/features/rsform/dialogs/dlg-edit-word-forms/dlg-edit-word-forms.tsx b/rsconcept/frontend/src/features/rsform/dialogs/dlg-edit-word-forms/dlg-edit-word-forms.tsx index e0e1fac0..e8d6b518 100644 --- a/rsconcept/frontend/src/features/rsform/dialogs/dlg-edit-word-forms/dlg-edit-word-forms.tsx +++ b/rsconcept/frontend/src/features/rsform/dialogs/dlg-edit-word-forms/dlg-edit-word-forms.tsx @@ -49,7 +49,8 @@ export function DlgEditWordForms() { })) ); - function handleSubmit() { + function handleSubmit(event: React.FormEvent) { + event.preventDefault(); void cstUpdate({ itemID: itemID, data: { diff --git a/rsconcept/frontend/src/features/rsform/dialogs/dlg-inline-synthesis/dlg-inline-synthesis.tsx b/rsconcept/frontend/src/features/rsform/dialogs/dlg-inline-synthesis/dlg-inline-synthesis.tsx index 482ead82..9bf4b5c7 100644 --- a/rsconcept/frontend/src/features/rsform/dialogs/dlg-inline-synthesis/dlg-inline-synthesis.tsx +++ b/rsconcept/frontend/src/features/rsform/dialogs/dlg-inline-synthesis/dlg-inline-synthesis.tsx @@ -46,6 +46,7 @@ export function DlgInlineSynthesis() { mode: 'onChange' }); const sourceID = useWatch({ control: methods.control, name: 'source' }); + const canSubmit = methods.formState.isValid && sourceID !== null; function onSubmit(data: IInlineSynthesisDTO) { return inlineSynthesis(data).then(onSynthesis); @@ -56,7 +57,7 @@ export function DlgInlineSynthesis() { header='Импорт концептуальной схем' submitText='Добавить конституенты' className='w-160 h-132 px-6' - canSubmit={methods.formState.isValid && sourceID !== null} + canSubmit={canSubmit} onSubmit={event => void methods.handleSubmit(onSubmit)(event)} > setActiveTab(index as TabID)}> diff --git a/rsconcept/frontend/src/features/rsform/dialogs/dlg-rename-cst.tsx b/rsconcept/frontend/src/features/rsform/dialogs/dlg-rename-cst.tsx index 913000f9..be65b5d1 100644 --- a/rsconcept/frontend/src/features/rsform/dialogs/dlg-rename-cst.tsx +++ b/rsconcept/frontend/src/features/rsform/dialogs/dlg-rename-cst.tsx @@ -26,7 +26,14 @@ export function DlgRenameCst() { const { schema } = useRSFormSuspense({ itemID: schemaID }); const target = schema.cstByID.get(targetID)!; - const { register, setValue, handleSubmit, control } = useForm({ + const { + register, + setValue, + handleSubmit, + control, + formState: { isValid } + } = useForm({ + mode: 'onChange', resolver: zodResolver(schemaUpdateConstituenta), defaultValues: { target: targetID, @@ -38,7 +45,7 @@ export function DlgRenameCst() { }); const alias = useWatch({ control, name: 'item_data.alias' })!; const cst_type = useWatch({ control, name: 'item_data.cst_type' })!; - const isValid = alias !== target.alias && validateNewAlias(alias, cst_type, schema); + const canSubmit = isValid && alias !== target.alias && validateNewAlias(alias, cst_type, schema); function onSubmit(data: IUpdateConstituentaDTO) { return cstUpdate({ itemID: schemaID, data: data }); @@ -54,7 +61,7 @@ export function DlgRenameCst() { header='Переименование конституенты' submitText='Переименовать' submitInvalidTooltip='Введите незанятое имя, соответствующее типу' - canSubmit={isValid} + canSubmit={canSubmit} onSubmit={event => void handleSubmit(onSubmit)(event)} className='w-120 py-6 pr-3 pl-6 flex gap-3 justify-center items-center' helpTopic={HelpTopic.CC_CONSTITUENTA}