import { useCallback, useEffect, useMemo, useState } from 'react'; import Checkbox from '../../../components/Common/Checkbox'; import ConceptDataTable from '../../../components/Common/ConceptDataTable'; import { useRSForm } from '../../../context/RSFormContext'; import useLocalStorage from '../../../hooks/useLocalStorage'; import { CstType, extractGlobals,type IConstituenta, matchConstituenta } from '../../../utils/models'; import { getMockConstituenta } from '../../../utils/staticUI'; interface ViewSideConstituentsProps { expression: string } function ViewSideConstituents({ expression }: ViewSideConstituentsProps) { const { schema, setActiveID } = useRSForm(); const [filteredData, setFilteredData] = useState(schema?.items ?? []); const [filterText, setFilterText] = useLocalStorage('side-filter-text', '') const [onlyExpression, setOnlyExpression] = useLocalStorage('side-filter-flag', false); useEffect(() => { if (!schema?.items) { setFilteredData([]); return; } if (onlyExpression) { const aliases = extractGlobals(expression); const filtered = schema?.items.filter((cst) => aliases.has(cst.alias)); const names = filtered.map(cst => cst.alias) const diff = Array.from(aliases).filter(name => !names.includes(name)); if (diff.length > 0) { diff.forEach( (alias, index) => filtered.push(getMockConstituenta(-index, alias, CstType.BASE, 'Конституента отсутствует'))); } setFilteredData(filtered); } else if (!filterText) { setFilteredData(schema?.items); } else { setFilteredData(schema?.items.filter((cst) => matchConstituenta(filterText, cst))); } }, [filterText, setFilteredData, onlyExpression, expression, schema]); const handleRowClicked = useCallback( (cst: IConstituenta, event: React.MouseEvent) => { if (event.altKey && cst.id > 0) { setActiveID(cst.id); } }, [setActiveID]); const handleDoubleClick = useCallback( (cst: IConstituenta) => { if (cst.id > 0) setActiveID(cst.id); }, [setActiveID]); const columns = useMemo(() => [ { id: 'id', selector: (cst: IConstituenta) => cst.id, omit: true }, { name: 'ID', id: 'alias', selector: (cst: IConstituenta) => cst.alias, width: '62px', maxWidth: '62px', conditionalCellStyles: [ { when: (cst: IConstituenta) => cst.id <= 0, classNames: ['bg-[#ffc9c9]', 'dark:bg-[#592b2b]'] } ] }, { name: 'Описание', id: 'description', selector: (cst: IConstituenta) => cst.term.resolved || cst.definition.text.resolved || cst.definition.formal || cst.convention, minWidth: '350px', wrap: true, conditionalCellStyles: [ { when: (cst: IConstituenta) => cst.id <= 0, classNames: ['bg-[#ffc9c9]', 'dark:bg-[#592b2b]'] } ] }, { name: 'Выражение', id: 'expression', selector: (cst: IConstituenta) => cst.definition?.formal ?? '', minWidth: '200px', hide: 1600, grow: 2, wrap: true, conditionalCellStyles: [ { when: (cst: IConstituenta) => cst.id <= 0, classNames: ['bg-[#ffc9c9]', 'dark:bg-[#592b2b]'] } ] } ], [] ); return (
{ setFilterText(event.target.value); }} disabled={onlyExpression} />
{ setOnlyExpression(event.target.checked); }} />

Список конституент пуст

Измените параметры фильтра

} striped highlightOnHover pointerOnHover onRowDoubleClicked={handleDoubleClick} onRowClicked={handleRowClicked} dense />
); } export default ViewSideConstituents;