Small UI fixes

This commit is contained in:
IRBorisov 2024-05-17 11:43:42 +03:00
parent 7664d9bda7
commit aecb0f70ed
4 changed files with 37 additions and 21 deletions

View File

@ -21,9 +21,7 @@ function ControlsOverlay({ constituenta, disabled, modified, processing, onRenam
<Overlay position='top-1 left-[4.3rem]' className='flex select-none'> <Overlay position='top-1 left-[4.3rem]' className='flex select-none'>
{!disabled || processing ? ( {!disabled || processing ? (
<MiniButton <MiniButton
title={ title={modified ? messages.unsaved : `Редактировать словоформы термина`}
modified ? messages.unsaved : `Редактировать словоформы термина: ${constituenta?.term_forms.length ?? 0}`
}
noHover noHover
onClick={onEditTerm} onClick={onEditTerm}
icon={<IconEdit size='1rem' className='icon-primary' />} icon={<IconEdit size='1rem' className='icon-primary' />}

View File

@ -118,10 +118,10 @@ function FormConstituenta({
const data: ICstUpdateData = { const data: ICstUpdateData = {
id: state.id, id: state.id,
alias: alias, alias: alias,
convention: convention, term_raw: term,
definition_formal: expression, definition_formal: expression,
definition_raw: textDefinition, definition_raw: textDefinition,
term_raw: term convention: convention
}; };
cstUpdate(data, () => toast.success('Изменения сохранены')); cstUpdate(data, () => toast.success('Изменения сохранены'));
} }

View File

@ -46,6 +46,7 @@ import {
} from '@/models/rsform'; } from '@/models/rsform';
import { generateAlias } from '@/models/rsformAPI'; import { generateAlias } from '@/models/rsformAPI';
import { EXTEOR_TRS_FILE } from '@/utils/constants'; import { EXTEOR_TRS_FILE } from '@/utils/constants';
import { promptUnsaved } from '@/utils/utils';
interface IRSEditContext { interface IRSEditContext {
schema?: IRSForm; schema?: IRSForm;
@ -379,18 +380,26 @@ export const RSEditState = ({
}, [activeCst]); }, [activeCst]);
const substitute = useCallback(() => { const substitute = useCallback(() => {
if (isModified && !promptUnsaved()) {
return;
}
setShowSubstitute(true); setShowSubstitute(true);
}, []); }, [isModified]);
const inlineSynthesis = useCallback(() => {
if (isModified && !promptUnsaved()) {
return;
}
setShowInlineSynthesis(true);
}, [isModified]);
const editTermForms = useCallback(() => { const editTermForms = useCallback(() => {
if (!activeCst) { if (!activeCst) {
return; return;
} }
if (isModified) { if (isModified && !promptUnsaved()) {
if (!window.confirm('Присутствуют несохраненные изменения. Продолжить без их учета?')) {
return; return;
} }
}
setShowEditTerm(true); setShowEditTerm(true);
}, [isModified, activeCst]); }, [isModified, activeCst]);
@ -410,6 +419,9 @@ export const RSEditState = ({
if (!activeCst) { if (!activeCst) {
return; return;
} }
if (isModified && !promptUnsaved()) {
return;
}
const data: ICstTarget = { const data: ICstTarget = {
target: activeCst.id target: activeCst.id
}; };
@ -419,28 +431,27 @@ export const RSEditState = ({
setSelected(cstList); setSelected(cstList);
} }
}); });
}, [activeCst, setSelected, model]); }, [activeCst, setSelected, model, isModified]);
const promptTemplate = useCallback(() => { const promptTemplate = useCallback(() => {
setInsertCstID(activeCst?.id); if (isModified && !promptUnsaved()) {
setShowTemplates(true);
}, [activeCst]);
const promptClone = useCallback(() => {
if (isModified) {
if (!window.confirm('Присутствуют несохраненные изменения. Продолжить без их учета?')) {
return; return;
} }
setInsertCstID(activeCst?.id);
setShowTemplates(true);
}, [activeCst, isModified]);
const promptClone = useCallback(() => {
if (isModified && !promptUnsaved()) {
return;
} }
setShowClone(true); setShowClone(true);
}, [isModified]); }, [isModified]);
const download = useCallback(() => { const download = useCallback(() => {
if (isModified) { if (isModified && !promptUnsaved()) {
if (!window.confirm('Присутствуют несохраненные изменения. Продолжить без их учета?')) {
return; return;
} }
}
const fileName = (model.schema?.alias ?? 'Schema') + EXTEOR_TRS_FILE; const fileName = (model.schema?.alias ?? 'Schema') + EXTEOR_TRS_FILE;
model.download((data: Blob) => { model.download((data: Blob) => {
try { try {
@ -515,7 +526,7 @@ export const RSEditState = ({
reindex, reindex,
reorder, reorder,
inlineSynthesis: () => setShowInlineSynthesis(true), inlineSynthesis,
produceStructure, produceStructure,
substitute substitute
}} }}

View File

@ -95,3 +95,10 @@ export function convertBase64ToBlob(base64String: string): Uint8Array {
} }
return uint8Array; return uint8Array;
} }
/**
* Prompt user of confirming discarding changes before continue.
*/
export function promptUnsaved(): boolean {
return window.confirm('Присутствуют несохраненные изменения. Продолжить без их учета?');
}