Further UI fixes for tab panels

This commit is contained in:
IRBorisov 2024-04-30 17:16:45 +03:00
parent 66be97d0a6
commit 930841e1be
10 changed files with 127 additions and 75 deletions

View File

@ -9,6 +9,7 @@ import RSInput from '@/components/RSInput';
import ConstituentaPicker from '@/components/select/ConstituentaPicker'; import ConstituentaPicker from '@/components/select/ConstituentaPicker';
import DataTable, { IConditionalStyle } from '@/components/ui/DataTable'; import DataTable, { IConditionalStyle } from '@/components/ui/DataTable';
import MiniButton from '@/components/ui/MiniButton'; import MiniButton from '@/components/ui/MiniButton';
import AnimateFade from '@/components/wrap/AnimateFade';
import { useConceptOptions } from '@/context/OptionsContext'; import { useConceptOptions } from '@/context/OptionsContext';
import { IConstituenta, IRSForm } from '@/models/rsform'; import { IConstituenta, IRSForm } from '@/models/rsform';
import { IArgumentValue } from '@/models/rslang'; import { IArgumentValue } from '@/models/rslang';
@ -144,7 +145,7 @@ function ArgumentsTab({ state, schema, partialUpdate }: ArgumentsTabProps) {
); );
return ( return (
<> <AnimateFade>
<DataTable <DataTable
dense dense
noFooter noFooter
@ -220,7 +221,7 @@ function ArgumentsTab({ state, schema, partialUpdate }: ArgumentsTabProps) {
height='5.1rem' height='5.1rem'
value={state.definition} value={state.definition}
/> />
</> </AnimateFade>
); );
} }

View File

@ -8,6 +8,7 @@ import BadgeHelp from '@/components/man/BadgeHelp';
import Modal, { ModalProps } from '@/components/ui/Modal'; import Modal, { ModalProps } from '@/components/ui/Modal';
import Overlay from '@/components/ui/Overlay'; import Overlay from '@/components/ui/Overlay';
import TabLabel from '@/components/ui/TabLabel'; import TabLabel from '@/components/ui/TabLabel';
import AnimateFade from '@/components/wrap/AnimateFade';
import usePartialUpdate from '@/hooks/usePartialUpdate'; import usePartialUpdate from '@/hooks/usePartialUpdate';
import { HelpTopic } from '@/models/miscellaneous'; import { HelpTopic } from '@/models/miscellaneous';
import { CstType, ICstCreateData, IRSForm } from '@/models/rsform'; import { CstType, ICstCreateData, IRSForm } from '@/models/rsform';
@ -101,23 +102,35 @@ function DlgConstituentaTemplate({ hideWindow, schema, onCreate, insertAfter }:
}, [substitutes.arguments, template.prototype, updateConstituenta, updateSubstitutes]); }, [substitutes.arguments, template.prototype, updateConstituenta, updateSubstitutes]);
const templatePanel = useMemo( const templatePanel = useMemo(
() => <TemplateTab state={template} partialUpdate={updateTemplate} />, () => (
<TabPanel>
<TemplateTab state={template} partialUpdate={updateTemplate} />
</TabPanel>
),
[template, updateTemplate] [template, updateTemplate]
); );
const argumentsPanel = useMemo( const argumentsPanel = useMemo(
() => <ArgumentsTab schema={schema} state={substitutes} partialUpdate={updateSubstitutes} />, () => (
<TabPanel>
<ArgumentsTab schema={schema} state={substitutes} partialUpdate={updateSubstitutes} />
</TabPanel>
),
[schema, substitutes, updateSubstitutes] [schema, substitutes, updateSubstitutes]
); );
const editorPanel = useMemo( const editorPanel = useMemo(
() => ( () => (
<FormCreateCst <TabPanel>
state={constituenta} <AnimateFade className='cc-column'>
partialUpdate={updateConstituenta} <FormCreateCst
schema={schema} state={constituenta}
setValidated={setValidated} partialUpdate={updateConstituenta}
/> schema={schema}
setValidated={setValidated}
/>
</AnimateFade>
</TabPanel>
), ),
[constituenta, updateConstituenta, schema] [constituenta, updateConstituenta, schema]
); );
@ -135,7 +148,6 @@ function DlgConstituentaTemplate({ hideWindow, schema, onCreate, insertAfter }:
<BadgeHelp topic={HelpTopic.RSTEMPLATES} className='max-w-[40rem]' offset={12} /> <BadgeHelp topic={HelpTopic.RSTEMPLATES} className='max-w-[40rem]' offset={12} />
</Overlay> </Overlay>
<Tabs <Tabs
forceRenderTabPanel
selectedTabClassName='clr-selected' selectedTabClassName='clr-selected'
className='flex flex-col' className='flex flex-col'
selectedIndex={activeTab} selectedIndex={activeTab}
@ -147,13 +159,9 @@ function DlgConstituentaTemplate({ hideWindow, schema, onCreate, insertAfter }:
<TabLabel label='Конституента' title='Редактирование атрибутов конституенты' className='w-[8rem]' /> <TabLabel label='Конституента' title='Редактирование атрибутов конституенты' className='w-[8rem]' />
</TabList> </TabList>
<TabPanel style={{ display: activeTab === TabID.TEMPLATE ? '' : 'none' }}>{templatePanel}</TabPanel> {templatePanel}
{argumentsPanel}
<TabPanel style={{ display: activeTab === TabID.ARGUMENTS ? '' : 'none' }}>{argumentsPanel}</TabPanel> {editorPanel}
<TabPanel className='cc-column' style={{ display: activeTab === TabID.CONSTITUENTA ? '' : 'none' }}>
{editorPanel}
</TabPanel>
</Tabs> </Tabs>
</Modal> </Modal>
); );

View File

@ -6,6 +6,7 @@ import RSInput from '@/components/RSInput';
import ConstituentaPicker from '@/components/select/ConstituentaPicker'; import ConstituentaPicker from '@/components/select/ConstituentaPicker';
import SelectSingle from '@/components/ui/SelectSingle'; import SelectSingle from '@/components/ui/SelectSingle';
import TextArea from '@/components/ui/TextArea'; import TextArea from '@/components/ui/TextArea';
import AnimateFade from '@/components/wrap/AnimateFade';
import { useLibrary } from '@/context/LibraryContext'; import { useLibrary } from '@/context/LibraryContext';
import { CATEGORY_CST_TYPE, IConstituenta, IRSForm } from '@/models/rsform'; import { CATEGORY_CST_TYPE, IConstituenta, IRSForm } from '@/models/rsform';
import { applyFilterCategory } from '@/models/rsformAPI'; import { applyFilterCategory } from '@/models/rsformAPI';
@ -84,8 +85,8 @@ function TemplateTab({ state, partialUpdate }: TemplateTabProps) {
}, [state.filterCategory, category]); }, [state.filterCategory, category]);
return ( return (
<> <AnimateFade>
<div className='flex divide-x border-x border-t rounded-t-md'> <div className='flex border-t divide-x border-x rounded-t-md'>
<SelectSingle <SelectSingle
noBorder noBorder
placeholder='Выберите категорию' placeholder='Выберите категорию'
@ -139,7 +140,7 @@ function TemplateTab({ state, partialUpdate }: TemplateTabProps) {
height='5.1rem' height='5.1rem'
value={state.prototype?.definition_formal} value={state.prototype?.definition_formal}
/> />
</> </AnimateFade>
); );
} }

View File

@ -1,7 +1,7 @@
'use client'; 'use client';
import clsx from 'clsx'; import clsx from 'clsx';
import { useState } from 'react'; import { useMemo, useState } from 'react';
import { TabList, TabPanel, Tabs } from 'react-tabs'; import { TabList, TabPanel, Tabs } from 'react-tabs';
import BadgeHelp from '@/components/man/BadgeHelp'; import BadgeHelp from '@/components/man/BadgeHelp';
@ -44,6 +44,24 @@ function DlgEditReference({ hideWindow, schema, initial, onSave }: DlgEditRefere
const handleSubmit = () => onSave(reference); const handleSubmit = () => onSave(reference);
const entityPanel = useMemo(
() => (
<TabPanel>
<EntityTab initial={initial} schema={schema} setReference={setReference} setIsValid={setIsValid} />
</TabPanel>
),
[initial, schema]
);
const syntacticPanel = useMemo(
() => (
<TabPanel>
<SyntacticTab initial={initial} setReference={setReference} setIsValid={setIsValid} />
</TabPanel>
),
[initial]
);
return ( return (
<Modal <Modal
header='Редактирование ссылки' header='Редактирование ссылки'
@ -76,13 +94,8 @@ function DlgEditReference({ hideWindow, schema, initial, onSave }: DlgEditRefere
/> />
</TabList> </TabList>
<TabPanel> {entityPanel}
<EntityTab initial={initial} schema={schema} setReference={setReference} setIsValid={setIsValid} /> {syntacticPanel}
</TabPanel>
<TabPanel>
<SyntacticTab initial={initial} setReference={setReference} setIsValid={setIsValid} />
</TabPanel>
</Tabs> </Tabs>
</Modal> </Modal>
); );

View File

@ -4,9 +4,9 @@ import { useEffect, useLayoutEffect, useState } from 'react';
import ConstituentaPicker from '@/components/select/ConstituentaPicker'; import ConstituentaPicker from '@/components/select/ConstituentaPicker';
import SelectGrammeme from '@/components/select/SelectGrammeme'; import SelectGrammeme from '@/components/select/SelectGrammeme';
import FlexColumn from '@/components/ui/FlexColumn';
import Label from '@/components/ui/Label'; import Label from '@/components/ui/Label';
import TextInput from '@/components/ui/TextInput'; import TextInput from '@/components/ui/TextInput';
import AnimateFade from '@/components/wrap/AnimateFade';
import { ReferenceType } from '@/models/language'; import { ReferenceType } from '@/models/language';
import { parseEntityReference, parseGrammemes } from '@/models/languageAPI'; import { parseEntityReference, parseGrammemes } from '@/models/languageAPI';
import { CstMatchMode } from '@/models/miscellaneous'; import { CstMatchMode } from '@/models/miscellaneous';
@ -59,7 +59,7 @@ function EntityTab({ initial, schema, setIsValid, setReference }: EntityTabProps
} }
return ( return (
<FlexColumn> <AnimateFade className='cc-column'>
<ConstituentaPicker <ConstituentaPicker
id='dlg_reference_entity_picker' id='dlg_reference_entity_picker'
initialFilter={initial.text} initialFilter={initial.text}
@ -108,7 +108,7 @@ function EntityTab({ initial, schema, setIsValid, setReference }: EntityTabProps
setValue={setSelectedGrams} setValue={setSelectedGrams}
/> />
</div> </div>
</FlexColumn> </AnimateFade>
); );
} }

View File

@ -3,6 +3,7 @@
import { useEffect, useLayoutEffect, useMemo, useState } from 'react'; import { useEffect, useLayoutEffect, useMemo, useState } from 'react';
import TextInput from '@/components/ui/TextInput'; import TextInput from '@/components/ui/TextInput';
import AnimateFade from '@/components/wrap/AnimateFade';
import { ReferenceType } from '@/models/language'; import { ReferenceType } from '@/models/language';
import { parseSyntacticReference } from '@/models/languageAPI'; import { parseSyntacticReference } from '@/models/languageAPI';
@ -43,7 +44,7 @@ function SyntacticTab({ initial, setIsValid, setReference }: SyntacticTabProps)
}, [nominal, offset, setIsValid, setReference]); }, [nominal, offset, setIsValid, setReference]);
return ( return (
<div className='flex flex-col gap-2'> <AnimateFade className='flex flex-col gap-2'>
<TextInput <TextInput
id='dlg_reference_offset' id='dlg_reference_offset'
type='number' type='number'
@ -69,7 +70,7 @@ function SyntacticTab({ initial, setIsValid, setReference }: SyntacticTabProps)
value={nominal} value={nominal}
onChange={event => setNominal(event.target.value)} onChange={event => setNominal(event.target.value)}
/> />
</div> </AnimateFade>
); );
} }

View File

@ -58,23 +58,39 @@ function DlgInlineSynthesis({ hideWindow, receiver, onInlineSynthesis }: DlgInli
setSubstitutions([]); setSubstitutions([]);
}, [source.schema]); }, [source.schema]);
const schemaPanel = useMemo(() => <SchemaTab selected={donorID} setSelected={setDonorID} />, [donorID]); const schemaPanel = useMemo(
() => (
<TabPanel>
<SchemaTab selected={donorID} setSelected={setDonorID} />
</TabPanel>
),
[donorID]
);
const itemsPanel = useMemo( const itemsPanel = useMemo(
() => ( () => (
<ConstituentsTab schema={source.schema} loading={source.loading} selected={selected} setSelected={setSelected} /> <TabPanel>
<ConstituentsTab
schema={source.schema}
loading={source.loading}
selected={selected}
setSelected={setSelected}
/>
</TabPanel>
), ),
[source.schema, source.loading, selected] [source.schema, source.loading, selected]
); );
const substitutesPanel = useMemo( const substitutesPanel = useMemo(
() => ( () => (
<SubstitutionsTab <TabPanel>
receiver={receiver} <SubstitutionsTab
source={source.schema} receiver={receiver}
selected={selected} source={source.schema}
loading={source.loading} selected={selected}
substitutions={substitutions} loading={source.loading}
setSubstitutions={setSubstitutions} substitutions={substitutions}
/> setSubstitutions={setSubstitutions}
/>
</TabPanel>
), ),
[source.schema, source.loading, receiver, selected, substitutions] [source.schema, source.loading, receiver, selected, substitutions]
); );
@ -89,7 +105,6 @@ function DlgInlineSynthesis({ hideWindow, receiver, onInlineSynthesis }: DlgInli
onSubmit={handleSubmit} onSubmit={handleSubmit}
> >
<Tabs <Tabs
forceRenderTabPanel
selectedTabClassName='clr-selected' selectedTabClassName='clr-selected'
className='flex flex-col' className='flex flex-col'
selectedIndex={activeTab} selectedIndex={activeTab}
@ -101,9 +116,9 @@ function DlgInlineSynthesis({ hideWindow, receiver, onInlineSynthesis }: DlgInli
<TabLabel label='Отождествления' title='Таблица отождествлений' className='w-[8rem]' /> <TabLabel label='Отождествления' title='Таблица отождествлений' className='w-[8rem]' />
</TabList> </TabList>
<TabPanel style={{ display: activeTab === TabID.SCHEMA ? '' : 'none' }}>{schemaPanel}</TabPanel> {schemaPanel}
<TabPanel style={{ display: activeTab === TabID.SELECTIONS ? '' : 'none' }}>{itemsPanel}</TabPanel> {itemsPanel}
<TabPanel style={{ display: activeTab === TabID.SUBSTITUTIONS ? '' : 'none' }}>{substitutesPanel}</TabPanel> {substitutesPanel}
</Tabs> </Tabs>
</Modal> </Modal>
); );

View File

@ -4,6 +4,7 @@ import { useMemo } from 'react';
import SchemaPicker from '@/components/select/SchemaPicker'; import SchemaPicker from '@/components/select/SchemaPicker';
import TextInput from '@/components/ui/TextInput'; import TextInput from '@/components/ui/TextInput';
import AnimateFade from '@/components/wrap/AnimateFade';
import { useLibrary } from '@/context/LibraryContext'; import { useLibrary } from '@/context/LibraryContext';
import { LibraryItemID } from '@/models/library'; import { LibraryItemID } from '@/models/library';
@ -17,7 +18,7 @@ function SchemaTab({ selected, setSelected }: SchemaTabProps) {
const selectedInfo = useMemo(() => library.items.find(item => item.id === selected), [selected, library.items]); const selectedInfo = useMemo(() => library.items.find(item => item.id === selected), [selected, library.items]);
return ( return (
<div className='flex flex-col'> <AnimateFade className='flex flex-col'>
<div className='flex items-center gap-6'> <div className='flex items-center gap-6'>
<span className='select-none'>Выбрана</span> <span className='select-none'>Выбрана</span>
<TextInput <TextInput
@ -36,7 +37,7 @@ function SchemaTab({ selected, setSelected }: SchemaTabProps) {
value={selected} value={selected}
onSelectValue={setSelected} onSelectValue={setSelected}
/> />
</div> </AnimateFade>
); );
} }

View File

@ -166,28 +166,49 @@ function RSTabs() {
const cardPanel = useMemo( const cardPanel = useMemo(
() => ( () => (
<EditorRSForm <TabPanel>
isModified={isModified} // prettier: split lines <EditorRSForm
setIsModified={setIsModified} isModified={isModified} // prettier: split lines
onDestroy={onDestroySchema} setIsModified={setIsModified}
/> onDestroy={onDestroySchema}
/>
</TabPanel>
), ),
[isModified, onDestroySchema] [isModified, onDestroySchema]
); );
const listPanel = useMemo(() => <EditorRSList onOpenEdit={onOpenCst} />, [onOpenCst]); const listPanel = useMemo(
() => (
<TabPanel>
<EditorRSList onOpenEdit={onOpenCst} />
</TabPanel>
),
[onOpenCst]
);
const editorPanel = useMemo( const editorPanel = useMemo(
() => ( () => (
<EditorConstituenta <TabPanel>
isModified={isModified} <EditorConstituenta
setIsModified={setIsModified} isModified={isModified}
activeCst={activeCst} setIsModified={setIsModified}
onOpenEdit={onOpenCst} activeCst={activeCst}
/> onOpenEdit={onOpenCst}
/>
</TabPanel>
), ),
[isModified, setIsModified, activeCst, onOpenCst] [isModified, setIsModified, activeCst, onOpenCst]
); );
const graphPanel = useMemo(
() => (
<TabPanel>
<EditorTermGraph onOpenEdit={onOpenCst} />
</TabPanel>
),
[onOpenCst]
);
return ( return (
<RSEditState <RSEditState
selected={selected} selected={selected}
@ -221,15 +242,10 @@ function RSTabs() {
</TabList> </TabList>
<AnimateFade className='overflow-y-auto' style={{ maxHeight: panelHeight }}> <AnimateFade className='overflow-y-auto' style={{ maxHeight: panelHeight }}>
<TabPanel>{cardPanel}</TabPanel> {cardPanel}
{listPanel}
<TabPanel>{listPanel}</TabPanel> {editorPanel}
{graphPanel}
<TabPanel>{editorPanel}</TabPanel>
<TabPanel>
<EditorTermGraph onOpenEdit={onOpenCst} />
</TabPanel>
</AnimateFade> </AnimateFade>
</Tabs> </Tabs>
) : null} ) : null}

View File

@ -32,7 +32,3 @@
color: var(--cd-fg-60); color: var(--cd-fg-60);
} }
} }
.rdt_TableCell {
font-size: 0.875rem;
}