import { CstType, IConstituenta, ParsingStatus, ValueClass, inferStatus } from '../../utils/models' import { useCallback, useMemo, useState } from 'react'; import DataTableThemed, { SelectionInfo } from '../../components/Common/DataTableThemed'; import { useRSForm } from '../../context/RSFormContext'; import Button from '../../components/Common/Button'; import { ArrowDownIcon, ArrowUpIcon, ArrowsRotateIcon, DumpBinIcon, SmallPlusIcon } from '../../components/Icons'; import { toast } from 'react-toastify'; import Divider from '../../components/Common/Divider'; import { getCstTypeLabel, getCstTypePrefix, getStatusInfo, getTypeLabel } from '../../utils/staticUI'; interface ConstituentsTableProps { onOpenEdit: (cst: IConstituenta) => void } function ConstituentsTable({onOpenEdit}: ConstituentsTableProps) { const { schema, isEditable, } = useRSForm(); const [selectedRows, setSelectedRows] = useState([]); const nothingSelected = useMemo(() => selectedRows.length === 0, [selectedRows]); const handleRowSelected = useCallback( ({selectedRows} : SelectionInfo) => { setSelectedRows(selectedRows); }, []); const handleRowClicked = useCallback( (cst: IConstituenta, event: React.MouseEvent) => { if (event.altKey) { onOpenEdit(cst); } }, [onOpenEdit]); const handleDelete = useCallback(() => { toast.info('Удаление конституент'); }, []); const handleMoveUp = useCallback(() => { toast.info('Перемещение вверх'); }, []); const handleMoveDown = useCallback(() => { toast.info('Перемещение вниз'); }, []); const handleReindex = useCallback(() => { toast.info('Переиндексация'); }, []); const handleAddNew = useCallback((cstType?: CstType) => { toast.info(`Новая конституента ${cstType || 'NEW'}`); }, []); const columns = useMemo(() => [ { name: 'ID', id: 'id', selector: (cst: IConstituenta) => cst.entityUID, omit: true, }, { name: 'Статус', id: 'status', cell: (cst: IConstituenta) =>
{getStatusInfo(inferStatus(cst.parse?.status, cst.parse?.valueClass)).text}
, width: '80px', maxWidth: '80px', reorder: true, hide: 1280, conditionalCellStyles: [ { when: (cst: IConstituenta) => cst.parse?.status !== ParsingStatus.VERIFIED, classNames: ['bg-[#ffc9c9]', 'dark:bg-[#592b2b]'] }, { when: (cst: IConstituenta) => cst.parse?.status === ParsingStatus.VERIFIED && cst.parse?.valueClass === ValueClass.INVALID, classNames: ['bg-[#beeefa]', 'dark:bg-[#286675]'] }, { when: (cst: IConstituenta) => cst.parse?.status === ParsingStatus.VERIFIED && cst.parse?.valueClass === ValueClass.PROPERTY, classNames: ['bg-[#a5e9fa]', 'dark:bg-[#36899e]'] }, ], }, { name: 'Имя', id: 'alias', selector: (cst: IConstituenta) => cst.alias, width: '65px', maxWidth: '65px', reorder: true, conditionalCellStyles: [ { when: (cst: IConstituenta) => cst.parse?.status !== ParsingStatus.VERIFIED, classNames: ['bg-[#ff8080]', 'dark:bg-[#800000]'] }, { when: (cst: IConstituenta) => cst.parse?.status === ParsingStatus.VERIFIED && cst.parse?.valueClass === ValueClass.INVALID, classNames: ['bg-[#ffbb80]', 'dark:bg-[#964600]'] }, { when: (cst: IConstituenta) => cst.parse?.status === ParsingStatus.VERIFIED && cst.parse?.valueClass === ValueClass.PROPERTY, classNames: ['bg-[#a5e9fa]', 'dark:bg-[#36899e]'] }, ], }, { name: 'Тип', id: 'type', cell: (cst: IConstituenta) =>
{getTypeLabel(cst)}
, width: '140px', minWidth: '100px', maxWidth: '140px', wrap: true, reorder: true, hide: 1600, }, { name: 'Термин', id: 'term', selector: (cst: IConstituenta) => cst.term?.resolved || cst.term?.raw || '', width: '350px', minWidth: '150px', maxWidth: '350px', wrap: true, reorder: true, }, { name: 'Формальное определение', id: 'expression', selector: (cst: IConstituenta) => cst.definition?.formal || '', minWidth: '300px', maxWidth: '500px', grow: 2, wrap: true, reorder: true, }, { name: 'Текстовое определение', id: 'definition', cell: (cst: IConstituenta) => (
{cst.definition?.text.resolved || cst.definition?.text.raw || ''}
), minWidth: '200px', grow: 2, wrap: true, reorder: true, }, { name: 'Конвенция / Комментарий', id: 'convention', cell: (cst: IConstituenta) =>
{cst.convention || ''}
, minWidth: '100px', wrap: true, reorder: true, hide: 1800, }, ], [] ); return (
Выбраны {selectedRows.length} из {schema?.stats?.count_all || 0}
{isEditable &&
}
selectedRows.indexOf(cst) < -1} selectableRowsHighlight onSelectedRowsChange={handleRowSelected} onRowDoubleClicked={onOpenEdit} onRowClicked={handleRowClicked} dense />
); } export default ConstituentsTable;