ConceptPortal-public/rsconcept/frontend/src/dialogs/DlgInlineSynthesis/DlgInlineSynthesis.tsx

128 lines
3.9 KiB
TypeScript
Raw Normal View History

'use client';
import clsx from 'clsx';
import { useEffect, useMemo, useState } from 'react';
import { TabList, TabPanel, Tabs } from 'react-tabs';
import Modal, { ModalProps } from '@/components/ui/Modal';
import TabLabel from '@/components/ui/TabLabel';
import useRSFormDetails from '@/hooks/useRSFormDetails';
import { LibraryItemID } from '@/models/library';
2024-07-29 16:56:24 +03:00
import { IBinarySubstitution, IInlineSynthesisData, IRSForm } from '@/models/rsform';
import TabConstituents from './TabConstituents';
import TabSchema from './TabSchema';
import TabSubstitutions from './TabSubstitutions';
interface DlgInlineSynthesisProps extends Pick<ModalProps, 'hideWindow'> {
receiver: IRSForm;
onInlineSynthesis: (data: IInlineSynthesisData) => void;
}
export enum TabID {
SCHEMA = 0,
SELECTIONS = 1,
SUBSTITUTIONS = 2
}
function DlgInlineSynthesis({ hideWindow, receiver, onInlineSynthesis }: DlgInlineSynthesisProps) {
const [activeTab, setActiveTab] = useState(TabID.SCHEMA);
const [donorID, setDonorID] = useState<LibraryItemID | undefined>(undefined);
const [selected, setSelected] = useState<LibraryItemID[]>([]);
2024-07-29 16:56:24 +03:00
const [substitutions, setSubstitutions] = useState<IBinarySubstitution[]>([]);
const source = useRSFormDetails({ target: donorID ? String(donorID) : undefined });
const validated = useMemo(() => !!source.schema && selected.length > 0, [source.schema, selected]);
function handleSubmit() {
if (!source.schema) {
return;
}
const data: IInlineSynthesisData = {
source: source.schema?.id,
receiver: receiver.id,
items: selected,
substitutions: substitutions.map(item => ({
original: item.deleteRight ? item.rightCst.id : item.leftCst.id,
substitution: item.deleteRight ? item.leftCst.id : item.rightCst.id,
transfer_term: !item.deleteRight && item.takeLeftTerm
}))
};
onInlineSynthesis(data);
}
2024-03-24 19:25:42 +03:00
useEffect(() => {
setSelected(source.schema ? source.schema?.items.map(cst => cst.id) : []);
setSubstitutions([]);
}, [source.schema]);
2024-04-30 17:16:45 +03:00
const schemaPanel = useMemo(
() => (
<TabPanel>
<TabSchema selected={donorID} setSelected={setDonorID} />
2024-04-30 17:16:45 +03:00
</TabPanel>
),
[donorID]
);
const itemsPanel = useMemo(
() => (
2024-04-30 17:16:45 +03:00
<TabPanel>
<TabConstituents
2024-04-30 17:16:45 +03:00
schema={source.schema}
loading={source.loading}
selected={selected}
setSelected={setSelected}
/>
</TabPanel>
),
[source.schema, source.loading, selected]
);
const substitutesPanel = useMemo(
() => (
2024-04-30 17:16:45 +03:00
<TabPanel>
<TabSubstitutions
2024-04-30 17:16:45 +03:00
receiver={receiver}
source={source.schema}
selected={selected}
loading={source.loading}
substitutions={substitutions}
setSubstitutions={setSubstitutions}
/>
</TabPanel>
),
[source.schema, source.loading, receiver, selected, substitutions]
);
return (
<Modal
header='Импорт концептуальной схем'
submitText='Добавить конституенты'
className='w-[40rem] h-[36rem] px-6'
hideWindow={hideWindow}
canSubmit={validated}
onSubmit={handleSubmit}
>
<Tabs
selectedTabClassName='clr-selected'
className='flex flex-col'
selectedIndex={activeTab}
onSelect={setActiveTab}
>
<TabList className={clsx('mb-3 self-center', 'flex', 'border divide-x rounded-none')}>
<TabLabel label='Схема' title='Источник конституент' className='w-[8rem]' />
<TabLabel label='Содержание' title='Перечень конституент' className='w-[8rem]' />
<TabLabel label='Отождествления' title='Таблица отождествлений' className='w-[8rem]' />
</TabList>
2024-04-30 17:16:45 +03:00
{schemaPanel}
{itemsPanel}
{substitutesPanel}
</Tabs>
</Modal>
);
}
export default DlgInlineSynthesis;