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

141 lines
3.9 KiB
TypeScript
Raw Normal View History

'use client';
import clsx from 'clsx';
2023-12-08 19:24:08 +03:00
import { useCallback, useLayoutEffect, useMemo, useState } from 'react';
2024-03-20 15:27:32 +03:00
import ConstituentaBadge from '@/components/info/ConstituentaBadge';
import DataTable, { createColumnHelper, IConditionalStyle, VisibilityState } from '@/components/ui/DataTable';
import { useConceptTheme } from '@/context/ThemeContext';
import useWindowSize from '@/hooks/useWindowSize';
2024-03-17 19:24:12 +03:00
import { ConstituentaID, IConstituenta } from '@/models/rsform';
import { isMockCst } from '@/models/rsformAPI';
import { prefixes } from '@/utils/constants';
import { describeConstituenta } from '@/utils/labels';
2023-12-08 19:24:08 +03:00
interface ConstituentsTableProps {
2023-12-28 14:04:44 +03:00
items: IConstituenta[];
2024-03-17 19:24:12 +03:00
activeID?: ConstituentaID;
onOpenEdit: (cstID: ConstituentaID) => void;
2023-12-28 14:04:44 +03:00
denseThreshold?: number;
maxHeight: string;
2023-12-08 19:24:08 +03:00
}
const columnHelper = createColumnHelper<IConstituenta>();
2023-12-28 14:04:44 +03:00
function ConstituentsTable({ items, activeID, onOpenEdit, maxHeight, denseThreshold = 9999 }: ConstituentsTableProps) {
2023-12-08 19:24:08 +03:00
const { colors } = useConceptTheme();
const windowSize = useWindowSize();
2023-12-28 14:04:44 +03:00
const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({ expression: true });
2023-12-08 19:24:08 +03:00
2023-12-28 14:04:44 +03:00
useLayoutEffect(() => {
2023-12-08 19:24:08 +03:00
setColumnVisibility(prev => {
const newValue = (windowSize.width ?? 0) >= denseThreshold;
if (newValue === prev['expression']) {
return prev;
} else {
2023-12-28 14:04:44 +03:00
return { expression: newValue };
2023-12-08 19:24:08 +03:00
}
});
}, [windowSize, denseThreshold]);
const handleRowClicked = useCallback(
2023-12-28 14:04:44 +03:00
(cst: IConstituenta) => {
if (!isMockCst(cst)) {
onOpenEdit(cst.id);
}
},
[onOpenEdit]
);
2023-12-08 19:24:08 +03:00
const columns = useMemo(
2023-12-28 14:04:44 +03:00
() => [
columnHelper.accessor('alias', {
id: 'alias',
header: 'Имя',
size: 65,
minSize: 65,
footer: undefined,
cell: props => (
<ConstituentaBadge theme={colors} value={props.row.original} prefixID={prefixes.cst_side_table} />
)
}),
columnHelper.accessor(cst => describeConstituenta(cst), {
id: 'description',
header: 'Описание',
size: 1000,
minSize: 250,
maxSize: 1000,
cell: props => (
<div
style={{
2024-03-25 19:17:18 +03:00
textWrap: 'pretty',
2023-12-28 14:04:44 +03:00
fontSize: 12,
color: isMockCst(props.row.original) ? colors.fgWarning : undefined
}}
>
{props.getValue()}
</div>
)
}),
columnHelper.accessor('definition_formal', {
id: 'expression',
header: 'Выражение',
size: 2000,
minSize: 0,
maxSize: 2000,
enableHiding: true,
cell: props => (
<div
style={{
2024-03-25 19:17:18 +03:00
textWrap: 'pretty',
2023-12-28 14:04:44 +03:00
fontSize: 12,
color: isMockCst(props.row.original) ? colors.fgWarning : undefined
}}
>
{props.getValue()}
</div>
)
})
],
[colors]
);
const conditionalRowStyles = useMemo(
2023-12-08 19:24:08 +03:00
(): IConditionalStyle<IConstituenta>[] => [
{
when: (cst: IConstituenta) => cst.id === activeID,
style: {
backgroundColor: colors.bgSelected
2023-12-28 14:04:44 +03:00
}
2023-12-08 19:24:08 +03:00
}
2023-12-28 14:04:44 +03:00
],
[activeID, colors]
);
2023-12-08 19:24:08 +03:00
2023-12-28 14:04:44 +03:00
return (
<DataTable
dense
noFooter
className='overflow-y-auto text-sm select-none overscroll-none'
style={{ maxHeight: maxHeight }}
data={items}
columns={columns}
conditionalRowStyles={conditionalRowStyles}
headPosition='0'
enableHiding
columnVisibility={columnVisibility}
onColumnVisibilityChange={setColumnVisibility}
noDataComponent={
<div className={clsx('min-h-[5rem]', 'p-3', 'text-center', 'select-none')}>
2023-12-28 14:04:44 +03:00
<p>Список конституент пуст</p>
<p>Измените параметры фильтра</p>
</div>
}
onRowClicked={handleRowClicked}
/>
);
2023-12-08 19:24:08 +03:00
}
2023-12-28 14:04:44 +03:00
export default ConstituentsTable;