B: Fix tooltip clipping after cst==null

This commit is contained in:
Ivan 2024-08-28 23:02:31 +03:00
parent 51ad937b99
commit 7790cc4ef2
3 changed files with 106 additions and 107 deletions

View File

@ -171,101 +171,103 @@ function FormConstituenta({
colors='clr-app clr-text-default' colors='clr-app clr-text-default'
/> />
) : null} ) : null}
<AnimatePresence> {state ? (
<AnimateFade key='cst_expression_fade' hideContent={!state || (!state?.definition_formal && isElementary)}> <AnimatePresence>
<EditorRSExpression <AnimateFade key='cst_expression_fade' hideContent={!state.definition_formal && isElementary}>
id='cst_expression' <EditorRSExpression
label={ id='cst_expression'
state?.cst_type === CstType.STRUCTURED label={
? 'Область определения' state.cst_type === CstType.STRUCTURED
: !!state && isFunctional(state.cst_type) ? 'Область определения'
? 'Определение функции' : isFunctional(state.cst_type)
: 'Формальное определение' ? 'Определение функции'
} : 'Формальное определение'
placeholder={ }
state?.cst_type !== CstType.STRUCTURED placeholder={
? 'Родоструктурное выражение' state.cst_type !== CstType.STRUCTURED
: 'Определение множества, которому принадлежат элементы родовой структуры' ? 'Родоструктурное выражение'
} : 'Определение множества, которому принадлежат элементы родовой структуры'
value={expression} }
activeCst={state} value={expression}
disabled={disabled || state?.is_inherited} activeCst={state}
toggleReset={toggleReset} disabled={disabled || state.is_inherited}
onChange={newValue => setExpression(newValue)} toggleReset={toggleReset}
setTypification={setTypification} onChange={newValue => setExpression(newValue)}
onOpenEdit={onOpenEdit} setTypification={setTypification}
/> onOpenEdit={onOpenEdit}
</AnimateFade>
<AnimateFade key='cst_definition_fade' hideContent={!state || (!state?.definition_raw && isElementary)}>
<RefsInput
id='cst_definition'
label='Текстовое определение'
placeholder='Текстовая интерпретация формального выражения'
minHeight='3.75rem'
maxHeight='8rem'
schema={schema}
onOpenEdit={onOpenEdit}
value={textDefinition}
initialValue={state?.definition_raw ?? ''}
resolved={state?.definition_resolved ?? ''}
disabled={disabled}
onChange={newValue => setTextDefinition(newValue)}
/>
</AnimateFade>
<AnimateFade key='cst_convention_fade' hideContent={!showConvention || !state}>
<TextArea
id='cst_convention'
fitContent
className='max-h-[8rem]'
spellCheck
label={isBasic ? 'Конвенция' : 'Комментарий'}
placeholder={isBasic ? 'Договоренность об интерпретации' : 'Пояснение разработчика'}
value={convention}
disabled={disabled || (isBasic && state?.is_inherited)}
onChange={event => setConvention(event.target.value)}
/>
</AnimateFade>
<AnimateFade key='cst_convention_button' hideContent={showConvention || (disabled && !processing)}>
<button
key='cst_disable_comment'
id='cst_disable_comment'
type='button'
tabIndex={-1}
className='self-start cc-label clr-text-url hover:underline'
onClick={() => setForceComment(true)}
>
Добавить комментарий
</button>
</AnimateFade>
{!disabled || processing ? (
<div className='self-center flex'>
<SubmitButton
key='cst_form_submit'
id='cst_form_submit'
text='Сохранить изменения'
disabled={disabled || !isModified}
icon={<IconSave size='1.25rem' />}
/> />
<Overlay position='top-[0.1rem] left-[0.4rem]' className='cc-icons'> </AnimateFade>
{state?.is_inherited_parent ? ( <AnimateFade key='cst_definition_fade' hideContent={!state.definition_raw && isElementary}>
<MiniButton <RefsInput
icon={<IconPredecessor size='1.25rem' className='clr-text-red' />} id='cst_definition'
disabled label='Текстовое определение'
titleHtml='Внимание!</br> Конституента имеет потомков<br/> в операционной схеме синтеза' placeholder='Текстовая интерпретация формального выражения'
/> minHeight='3.75rem'
) : null} maxHeight='8rem'
{state?.is_inherited ? ( schema={schema}
<MiniButton onOpenEdit={onOpenEdit}
icon={<IconChild size='1.25rem' className='clr-text-red' />} value={textDefinition}
disabled initialValue={state.definition_raw}
titleHtml='Внимание!</br> Конституента является наследником<br/>' resolved={state.definition_resolved}
/> disabled={disabled}
) : null} onChange={newValue => setTextDefinition(newValue)}
</Overlay> />
</div> </AnimateFade>
) : null} <AnimateFade key='cst_convention_fade' hideContent={!showConvention}>
</AnimatePresence> <TextArea
id='cst_convention'
fitContent
className='max-h-[8rem]'
spellCheck
label={isBasic ? 'Конвенция' : 'Комментарий'}
placeholder={isBasic ? 'Договоренность об интерпретации' : 'Пояснение разработчика'}
value={convention}
disabled={disabled || (isBasic && state.is_inherited)}
onChange={event => setConvention(event.target.value)}
/>
</AnimateFade>
<AnimateFade key='cst_convention_button' hideContent={showConvention || (disabled && !processing)}>
<button
key='cst_disable_comment'
id='cst_disable_comment'
type='button'
tabIndex={-1}
className='self-start cc-label clr-text-url hover:underline'
onClick={() => setForceComment(true)}
>
Добавить комментарий
</button>
</AnimateFade>
{!disabled || processing ? (
<div className='self-center flex'>
<SubmitButton
key='cst_form_submit'
id='cst_form_submit'
text='Сохранить изменения'
disabled={disabled || !isModified}
icon={<IconSave size='1.25rem' />}
/>
<Overlay position='top-[0.1rem] left-[0.4rem]' className='cc-icons'>
{state.is_inherited_parent ? (
<MiniButton
icon={<IconPredecessor size='1.25rem' className='clr-text-red' />}
disabled
titleHtml='Внимание!</br> Конституента имеет потомков<br/> в операционной схеме синтеза'
/>
) : null}
{state.is_inherited ? (
<MiniButton
icon={<IconChild size='1.25rem' className='clr-text-red' />}
disabled
titleHtml='Внимание!</br> Конституента является наследником<br/>'
/>
) : null}
</Overlay>
</div>
) : null}
</AnimatePresence>
) : null}
</form> </form>
</AnimateFade> </AnimateFade>
); );

View File

@ -28,7 +28,7 @@ import ToolbarRSExpression from './ToolbarRSExpression';
interface EditorRSExpressionProps { interface EditorRSExpressionProps {
id?: string; id?: string;
activeCst?: IConstituenta; activeCst: IConstituenta;
value: string; value: string;
label: string; label: string;
placeholder?: string; placeholder?: string;
@ -70,13 +70,10 @@ function EditorRSExpression({
function handleChange(newValue: string) { function handleChange(newValue: string) {
onChange(newValue); onChange(newValue);
setIsModified(newValue !== activeCst?.definition_formal); setIsModified(newValue !== activeCst.definition_formal);
} }
function handleCheckExpression(callback?: (parse: IExpressionParse) => void) { function handleCheckExpression(callback?: (parse: IExpressionParse) => void) {
if (!activeCst) {
return;
}
const prefix = getDefinitionPrefix(activeCst); const prefix = getDefinitionPrefix(activeCst);
const expression = prefix + value; const expression = prefix + value;
parser.checkExpression(expression, activeCst, parse => { parser.checkExpression(expression, activeCst, parse => {
@ -99,7 +96,7 @@ function EditorRSExpression({
const onShowError = useCallback( const onShowError = useCallback(
(error: IRSErrorDescription) => { (error: IRSErrorDescription) => {
if (!activeCst || !rsInput.current) { if (!rsInput.current) {
return; return;
} }
const prefix = getDefinitionPrefix(activeCst); const prefix = getDefinitionPrefix(activeCst);
@ -136,7 +133,7 @@ function EditorRSExpression({
toast.error(errors.astFailed); toast.error(errors.astFailed);
} else { } else {
setSyntaxTree(parse.ast); setSyntaxTree(parse.ast);
setExpression(getDefinitionPrefix(activeCst!) + value); setExpression(getDefinitionPrefix(activeCst) + value);
setShowAST(true); setShowAST(true);
} }
}); });
@ -145,7 +142,7 @@ function EditorRSExpression({
const controls = useMemo( const controls = useMemo(
() => ( () => (
<RSEditorControls <RSEditorControls
isOpen={showControls && (!disabled || (model.processing && !activeCst?.is_inherited))} isOpen={showControls && (!disabled || (model.processing && !activeCst.is_inherited))}
disabled={disabled} disabled={disabled}
onEdit={handleEdit} onEdit={handleEdit}
/> />
@ -172,7 +169,7 @@ function EditorRSExpression({
<StatusBar <StatusBar
processing={parser.processing} processing={parser.processing}
isModified={isModified} isModified={isModified}
constituenta={activeCst} activeCst={activeCst}
parseData={parser.parseData} parseData={parser.parseData}
onAnalyze={() => handleCheckExpression()} onAnalyze={() => handleCheckExpression()}
/> />

View File

@ -19,11 +19,11 @@ interface StatusBarProps {
processing?: boolean; processing?: boolean;
isModified?: boolean; isModified?: boolean;
parseData?: IExpressionParse; parseData?: IExpressionParse;
constituenta?: IConstituenta; activeCst: IConstituenta;
onAnalyze: () => void; onAnalyze: () => void;
} }
function StatusBar({ isModified, processing, constituenta, parseData, onAnalyze }: StatusBarProps) { function StatusBar({ isModified, processing, activeCst, parseData, onAnalyze }: StatusBarProps) {
const { colors } = useConceptOptions(); const { colors } = useConceptOptions();
const status = useMemo(() => { const status = useMemo(() => {
if (isModified) { if (isModified) {
@ -33,8 +33,8 @@ function StatusBar({ isModified, processing, constituenta, parseData, onAnalyze
const parse = parseData.parseResult ? ParsingStatus.VERIFIED : ParsingStatus.INCORRECT; const parse = parseData.parseResult ? ParsingStatus.VERIFIED : ParsingStatus.INCORRECT;
return inferStatus(parse, parseData.valueClass); return inferStatus(parse, parseData.valueClass);
} }
return inferStatus(constituenta?.parse?.status, constituenta?.parse?.valueClass); return inferStatus(activeCst.parse.status, activeCst.parse.valueClass);
}, [isModified, constituenta, parseData]); }, [isModified, activeCst, parseData]);
return ( return (
<div <div