import clsx from 'clsx'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { useIntl } from 'react-intl'; import DataTable, { createColumnHelper, IConditionalStyle } from '@/components/ui/DataTable'; import SearchBar from '@/components/ui/SearchBar'; import { useConceptOptions } from '@/context/ConceptOptionsContext'; import { useLibrary } from '@/context/LibraryContext'; import useDropdown from '@/hooks/useDropdown'; import { ILibraryItem, LibraryItemID, LibraryItemType } from '@/models/library'; import { matchLibraryItem } from '@/models/libraryAPI'; import { prefixes } from '@/utils/constants'; import { IconClose, IconFolderTree } from '../Icons'; import { CProps } from '../props'; import Dropdown from '../ui/Dropdown'; import FlexColumn from '../ui/FlexColumn'; import MiniButton from '../ui/MiniButton'; import SelectLocation from './SelectLocation'; interface PickSchemaProps extends CProps.Styling { id?: string; initialFilter?: string; rows?: number; items: ILibraryItem[]; itemType: LibraryItemType; value?: LibraryItemID; baseFilter?: (target: ILibraryItem) => boolean; onSelectValue: (newValue: LibraryItemID) => void; } const columnHelper = createColumnHelper(); function PickSchema({ id, initialFilter = '', rows = 4, items, itemType, value, onSelectValue, baseFilter, className, ...restProps }: PickSchemaProps) { const intl = useIntl(); const { colors } = useConceptOptions(); const { folders } = useLibrary(); const [filterText, setFilterText] = useState(initialFilter); const [filterLocation, setFilterLocation] = useState(''); const [filtered, setFiltered] = useState([]); const baseFiltered = useMemo( () => items.filter(item => item.item_type === itemType && (!baseFilter || baseFilter(item))), [items, itemType, baseFilter] ); const locationMenu = useDropdown(); useEffect(() => { let newFiltered = baseFiltered.filter(item => matchLibraryItem(item, filterText)); if (filterLocation.length > 0) { newFiltered = newFiltered.filter( item => item.location === filterLocation || item.location.startsWith(`${filterLocation}/`) ); } setFiltered(newFiltered); }, [filterText, filterLocation, baseFiltered]); const columns = useMemo( () => [ columnHelper.accessor('alias', { id: 'alias', header: 'Шифр', size: 150, minSize: 80, maxSize: 150 }), columnHelper.accessor('title', { id: 'title', header: 'Название', size: 1200, minSize: 200, maxSize: 1200, cell: props =>
{props.getValue()}
}), columnHelper.accessor('time_update', { id: 'time_update', header: 'Дата', cell: props => (
{new Date(props.getValue()).toLocaleString(intl.locale, { year: '2-digit', month: '2-digit', day: '2-digit' })}
) }) ], [intl] ); const conditionalRowStyles = useMemo( (): IConditionalStyle[] => [ { when: (item: ILibraryItem) => item.id === value, style: { backgroundColor: colors.bgSelected } } ], [value, colors] ); const handleLocationClick = useCallback( (event: CProps.EventMouse, newValue: string) => { event.preventDefault(); event.stopPropagation(); locationMenu.hide(); setFilterLocation(newValue); }, [locationMenu] ); return (
setFilterText(newValue)} />
} title='Фильтр по расположению' className='mt-1' onClick={() => locationMenu.toggle()} /> handleLocationClick(event, target.getPath())} />
{filterLocation.length > 0 ? ( } title='Сбросить фильтр' onClick={() => setFilterLocation('')} /> ) : null}

Список схем пуст

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

} onRowClicked={rowData => onSelectValue(rowData.id)} />
); } export default PickSchema;