ConceptPortal-public/rsconcept/frontend/src/pages/RSFormPage/ViewConstituents/ViewConstituents.tsx

62 lines
1.8 KiB
TypeScript
Raw Normal View History

'use client';
import { motion } from 'framer-motion';
2023-12-08 19:24:08 +03:00
import { useMemo, useState } from 'react';
import { useConceptTheme } from '@/context/ThemeContext';
import { IConstituenta, IRSForm } from '@/models/rsform';
import { animateSideView } from '@/utils/animations';
2023-12-08 19:24:08 +03:00
import ConstituentsSearch from './ConstituentsSearch';
import ConstituentsTable from './ConstituentsTable';
// Height that should be left to accomodate navigation panel + bottom margin
const LOCAL_NAVIGATION_H = '2.1rem';
// Window width cutoff for expression show
const COLUMN_EXPRESSION_HIDE_THRESHOLD = 1500;
interface ViewConstituentsProps {
expression: string
baseHeight: string
activeID?: number
schema?: IRSForm
onOpenEdit: (cstID: number) => void
}
function ViewConstituents({ expression, baseHeight, schema, activeID, onOpenEdit }: ViewConstituentsProps) {
const { noNavigation } = useConceptTheme();
const [filteredData, setFilteredData] = useState<IConstituenta[]>(schema?.items ?? []);
const maxHeight = useMemo(
() => {
const siblingHeight = `${baseHeight} - ${LOCAL_NAVIGATION_H}`
return (noNavigation ?
`calc(min(100vh - 8.2rem, ${siblingHeight}))`
: `calc(min(100vh - 11.7rem, ${siblingHeight}))`);
}, [noNavigation, baseHeight]);
2023-12-17 20:19:28 +03:00
return (
<motion.div
className='mt-[2.25rem] border'
initial={{...animateSideView.initial}}
animate={{...animateSideView.animate}}
exit={{...animateSideView.exit}}
>
2023-12-08 19:24:08 +03:00
<ConstituentsSearch
schema={schema}
activeID={activeID}
activeExpression={expression}
setFiltered={setFilteredData}
/>
2023-12-17 20:19:28 +03:00
<ConstituentsTable maxHeight={maxHeight}
2023-12-08 19:24:08 +03:00
items={filteredData}
activeID={activeID}
onOpenEdit={onOpenEdit}
denseThreshold={COLUMN_EXPRESSION_HIDE_THRESHOLD}
/>
</motion.div>);
2023-12-08 19:24:08 +03:00
}
export default ViewConstituents;