2023-07-15 17:46:19 +03:00
|
|
|
|
import { Tabs, TabList, TabPanel } from 'react-tabs';
|
|
|
|
|
import ConstituentsTable from './ConstituentsTable';
|
|
|
|
|
import { IConstituenta } from '../../models';
|
|
|
|
|
import { useRSForm } from '../../context/RSFormContext';
|
2023-07-16 20:25:55 +03:00
|
|
|
|
import { useEffect } from 'react';
|
2023-07-15 17:46:19 +03:00
|
|
|
|
import ConceptTab from '../../components/Common/ConceptTab';
|
|
|
|
|
import RSFormCard from './RSFormCard';
|
|
|
|
|
import { Loader } from '../../components/Common/Loader';
|
|
|
|
|
import BackendError from '../../components/BackendError';
|
|
|
|
|
import ConstituentEditor from './ConstituentEditor';
|
|
|
|
|
import RSFormStats from './RSFormStats';
|
2023-07-16 20:25:55 +03:00
|
|
|
|
import useLocalStorage from '../../hooks/useLocalStorage';
|
2023-07-15 17:46:19 +03:00
|
|
|
|
|
2023-07-16 20:25:55 +03:00
|
|
|
|
enum TabsList {
|
2023-07-15 17:46:19 +03:00
|
|
|
|
CARD = 0,
|
|
|
|
|
CST_LIST = 1,
|
|
|
|
|
CST_EDIT = 2
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-16 20:25:55 +03:00
|
|
|
|
function RSFormTabs() {
|
|
|
|
|
const { setActive, active, error, schema, loading } = useRSForm();
|
|
|
|
|
const [tabIndex, setTabIndex] = useLocalStorage('rsform_edit_tab', TabsList.CARD);
|
2023-07-15 17:46:19 +03:00
|
|
|
|
|
|
|
|
|
const onEditCst = (cst: IConstituenta) => {
|
|
|
|
|
console.log(`Set active cst: ${cst.alias}`);
|
|
|
|
|
setActive(cst);
|
2023-07-16 20:25:55 +03:00
|
|
|
|
setTabIndex(TabsList.CST_EDIT)
|
2023-07-15 17:46:19 +03:00
|
|
|
|
};
|
|
|
|
|
|
2023-07-16 20:25:55 +03:00
|
|
|
|
const onSelectTab = (index: number) => {
|
|
|
|
|
setTabIndex(index);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
2023-07-18 14:55:40 +03:00
|
|
|
|
const url = new URL(window.location.href);
|
|
|
|
|
const activeQuery = url.searchParams.get('active');
|
2023-07-16 20:25:55 +03:00
|
|
|
|
const activeCst = schema?.items?.find((cst) => cst.entityUID === Number(activeQuery)) || undefined;
|
|
|
|
|
setActive(activeCst);
|
2023-07-18 14:55:40 +03:00
|
|
|
|
}, [setActive, schema?.items]);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
const url = new URL(window.location.href);
|
|
|
|
|
const tabQuery = url.searchParams.get('tab');
|
|
|
|
|
setTabIndex(Number(tabQuery) || TabsList.CARD);
|
|
|
|
|
}, [setTabIndex]);
|
2023-07-16 20:25:55 +03:00
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
2023-07-18 14:55:40 +03:00
|
|
|
|
let url = new URL(window.location.href);
|
|
|
|
|
url.searchParams.set('tab', String(tabIndex));
|
|
|
|
|
if (active) {
|
|
|
|
|
url.searchParams.set('active', String(active.entityUID));
|
|
|
|
|
} else {
|
|
|
|
|
url.searchParams.delete('active');
|
2023-07-16 20:25:55 +03:00
|
|
|
|
}
|
2023-07-18 14:55:40 +03:00
|
|
|
|
window.history.replaceState(null, '', url.toString());
|
|
|
|
|
}, [tabIndex, active]);
|
2023-07-16 20:25:55 +03:00
|
|
|
|
|
2023-07-15 17:46:19 +03:00
|
|
|
|
return (
|
|
|
|
|
<div className='container w-full'>
|
|
|
|
|
{ loading && <Loader /> }
|
|
|
|
|
{ error && <BackendError error={error} />}
|
|
|
|
|
{ schema && !loading &&
|
|
|
|
|
<Tabs
|
|
|
|
|
selectedIndex={tabIndex}
|
2023-07-16 20:25:55 +03:00
|
|
|
|
onSelect={onSelectTab}
|
2023-07-15 17:46:19 +03:00
|
|
|
|
defaultFocus={true}
|
|
|
|
|
selectedTabClassName='font-bold'
|
|
|
|
|
>
|
|
|
|
|
<TabList className='flex items-start w-fit'>
|
|
|
|
|
<ConceptTab>Паспорт схемы</ConceptTab>
|
|
|
|
|
<ConceptTab className='border-gray-300 border-x-2 dark:border-gray-400'>Конституенты</ConceptTab>
|
|
|
|
|
<ConceptTab>Редактор</ConceptTab>
|
|
|
|
|
</TabList>
|
|
|
|
|
|
2023-07-16 20:25:55 +03:00
|
|
|
|
<TabPanel className='flex items-start w-full gap-2'>
|
2023-07-15 17:46:19 +03:00
|
|
|
|
<RSFormCard />
|
2023-07-18 14:55:40 +03:00
|
|
|
|
{schema.stats && <RSFormStats stats={schema.stats}/>}
|
2023-07-15 17:46:19 +03:00
|
|
|
|
</TabPanel>
|
|
|
|
|
|
|
|
|
|
<TabPanel className='w-fit'>
|
|
|
|
|
<ConstituentsTable onOpenEdit={onEditCst} />
|
|
|
|
|
</TabPanel>
|
|
|
|
|
|
|
|
|
|
<TabPanel>
|
|
|
|
|
<ConstituentEditor />
|
|
|
|
|
</TabPanel>
|
|
|
|
|
</Tabs>
|
|
|
|
|
}
|
|
|
|
|
</div>);
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-16 20:25:55 +03:00
|
|
|
|
export default RSFormTabs;
|