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,32 +171,33 @@ function FormConstituenta({
colors='clr-app clr-text-default'
/>
) : null}
{state ? (
<AnimatePresence>
<AnimateFade key='cst_expression_fade' hideContent={!state || (!state?.definition_formal && isElementary)}>
<AnimateFade key='cst_expression_fade' hideContent={!state.definition_formal && isElementary}>
<EditorRSExpression
id='cst_expression'
label={
state?.cst_type === CstType.STRUCTURED
state.cst_type === CstType.STRUCTURED
? 'Область определения'
: !!state && isFunctional(state.cst_type)
: isFunctional(state.cst_type)
? 'Определение функции'
: 'Формальное определение'
}
placeholder={
state?.cst_type !== CstType.STRUCTURED
state.cst_type !== CstType.STRUCTURED
? 'Родоструктурное выражение'
: 'Определение множества, которому принадлежат элементы родовой структуры'
}
value={expression}
activeCst={state}
disabled={disabled || state?.is_inherited}
disabled={disabled || state.is_inherited}
toggleReset={toggleReset}
onChange={newValue => setExpression(newValue)}
setTypification={setTypification}
onOpenEdit={onOpenEdit}
/>
</AnimateFade>
<AnimateFade key='cst_definition_fade' hideContent={!state || (!state?.definition_raw && isElementary)}>
<AnimateFade key='cst_definition_fade' hideContent={!state.definition_raw && isElementary}>
<RefsInput
id='cst_definition'
label='Текстовое определение'
@ -206,13 +207,13 @@ function FormConstituenta({
schema={schema}
onOpenEdit={onOpenEdit}
value={textDefinition}
initialValue={state?.definition_raw ?? ''}
resolved={state?.definition_resolved ?? ''}
initialValue={state.definition_raw}
resolved={state.definition_resolved}
disabled={disabled}
onChange={newValue => setTextDefinition(newValue)}
/>
</AnimateFade>
<AnimateFade key='cst_convention_fade' hideContent={!showConvention || !state}>
<AnimateFade key='cst_convention_fade' hideContent={!showConvention}>
<TextArea
id='cst_convention'
fitContent
@ -221,7 +222,7 @@ function FormConstituenta({
label={isBasic ? 'Конвенция' : 'Комментарий'}
placeholder={isBasic ? 'Договоренность об интерпретации' : 'Пояснение разработчика'}
value={convention}
disabled={disabled || (isBasic && state?.is_inherited)}
disabled={disabled || (isBasic && state.is_inherited)}
onChange={event => setConvention(event.target.value)}
/>
</AnimateFade>
@ -248,14 +249,14 @@ function FormConstituenta({
icon={<IconSave size='1.25rem' />}
/>
<Overlay position='top-[0.1rem] left-[0.4rem]' className='cc-icons'>
{state?.is_inherited_parent ? (
{state.is_inherited_parent ? (
<MiniButton
icon={<IconPredecessor size='1.25rem' className='clr-text-red' />}
disabled
titleHtml='Внимание!</br> Конституента имеет потомков<br/> в операционной схеме синтеза'
/>
) : null}
{state?.is_inherited ? (
{state.is_inherited ? (
<MiniButton
icon={<IconChild size='1.25rem' className='clr-text-red' />}
disabled
@ -266,6 +267,7 @@ function FormConstituenta({
</div>
) : null}
</AnimatePresence>
) : null}
</form>
</AnimateFade>
);

View File

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

View File

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