'use client'; import { useLayoutEffect, useMemo, useState } from 'react'; import { IconChild } from '@/components/Icons'; import SelectGraphFilter from '@/components/select/SelectGraphFilter'; import SelectMatchMode from '@/components/select/SelectMatchMode'; import MiniButton from '@/components/ui/MiniButton'; import SearchBar from '@/components/ui/SearchBar'; import useLocalStorage from '@/hooks/useLocalStorage'; import { CstMatchMode, DependencyMode } from '@/models/miscellaneous'; import { applyGraphFilter } from '@/models/miscellaneousAPI'; import { ConstituentaID, IConstituenta, IRSForm } from '@/models/rsform'; import { createMockConstituenta, matchConstituenta } from '@/models/rsformAPI'; import { extractGlobals } from '@/models/rslangAPI'; import { storage } from '@/utils/constants'; interface ConstituentsSearchProps { schema?: IRSForm; dense?: boolean; activeID?: ConstituentaID; activeExpression: string; setFiltered: React.Dispatch>; } function ConstituentsSearch({ schema, activeID, activeExpression, dense, setFiltered }: ConstituentsSearchProps) { const [filterMatch, setFilterMatch] = useLocalStorage(storage.cstFilterMatch, CstMatchMode.ALL); const [filterSource, setFilterSource] = useLocalStorage(storage.cstFilterGraph, DependencyMode.ALL); const [filterText, setFilterText] = useState(''); const [showInherited, setShowInherited] = useLocalStorage(storage.cstFilterShowInherited, true); useLayoutEffect(() => { if (!schema || schema.items.length === 0) { setFiltered([]); return; } let result: IConstituenta[] = []; if (filterSource === DependencyMode.EXPRESSION) { const aliases = extractGlobals(activeExpression); result = schema.items.filter(cst => aliases.has(cst.alias)); const names = result.map(cst => cst.alias); const diff = Array.from(aliases).filter(name => !names.includes(name)); if (diff.length > 0) { diff.forEach((alias, index) => result.push(createMockConstituenta(-index, alias, 'Конституента отсутствует'))); } } else if (!activeID) { result = schema.items; } else { result = applyGraphFilter(schema, activeID, filterSource); } if (filterText) { result = result.filter(cst => matchConstituenta(cst, filterText, filterMatch)); } if (!showInherited) { result = result.filter(cst => !cst.is_inherited); } setFiltered(result); }, [ filterText, setFiltered, filterSource, activeExpression, schema?.items, schema, filterMatch, activeID, showInherited ]); const selectGraph = useMemo( () => setFilterSource(newValue)} dense={dense} />, [filterSource, setFilterSource, dense] ); const selectMatchMode = useMemo( () => setFilterMatch(newValue)} dense={dense} />, [filterMatch, setFilterMatch, dense] ); return (
{selectMatchMode} {selectGraph} {schema && schema?.stats.count_inherited > 0 ? ( ${showInherited ? 'отображать' : 'скрывать'}`} icon={} className='h-fit self-center' onClick={() => setShowInherited(prev => !prev)} /> ) : null}
); } export default ConstituentsSearch;