'use client'; import { useLayoutEffect, useState } from 'react'; import { useIntl } from 'react-intl'; import clsx from 'clsx'; import { urls, useConceptNavigation } from '@/app'; import { useLabelUser } from '@/features/users'; import { FlexColumn } from '@/components/Container'; import { MiniButton, TextURL } from '@/components/Control'; import { createColumnHelper, DataTable, type IConditionalStyle, type VisibilityState } from '@/components/DataTable'; import { IconFolderTree } from '@/components/Icons'; import { useWindowSize } from '@/hooks/useWindowSize'; import { useFitHeight } from '@/stores/appLayout'; import { usePreferencesStore } from '@/stores/preferences'; import { APP_COLORS } from '@/styling/colors'; import { type ILibraryItem, LibraryItemType } from '../../backend/types'; import { BadgeLocation } from '../../components/BadgeLocation'; import { useLibrarySearchStore } from '../../stores/librarySearch'; interface TableLibraryItemsProps { items: ILibraryItem[]; } const columnHelper = createColumnHelper(); export function TableLibraryItems({ items }: TableLibraryItemsProps) { const router = useConceptNavigation(); const intl = useIntl(); const getUserLabel = useLabelUser(); const folderMode = useLibrarySearchStore(state => state.folderMode); const toggleFolderMode = useLibrarySearchStore(state => state.toggleFolderMode); const resetFilter = useLibrarySearchStore(state => state.resetFilter); const itemsPerPage = usePreferencesStore(state => state.libraryPagination); const setItemsPerPage = usePreferencesStore(state => state.setLibraryPagination); function handleOpenItem(item: ILibraryItem, event: React.MouseEvent) { const selection = window.getSelection(); if (!!selection && selection.toString().length > 0) { return; } if (item.item_type === LibraryItemType.RSFORM) { router.push({ path: urls.schema(item.id), newTab: event.ctrlKey || event.metaKey }); } else if (item.item_type === LibraryItemType.OSS) { router.push({ path: urls.oss(item.id), newTab: event.ctrlKey || event.metaKey }); } } const windowSize = useWindowSize(); const [columnVisibility, setColumnVisibility] = useState({}); useLayoutEffect(() => { setColumnVisibility({ owner: !windowSize.isSmall }); }, [windowSize]); function handleToggleFolder(event: React.MouseEvent) { event.preventDefault(); event.stopPropagation(); toggleFolderMode(); } const columns = [ ...(folderMode ? [] : [ columnHelper.accessor('location', { id: 'location', header: () => ( } /> ), size: 50, minSize: 50, maxSize: 50, enableSorting: true, cell: props => , sortingFn: 'text' }) ]), columnHelper.accessor('alias', { id: 'alias', header: 'Шифр', size: 150, minSize: 80, maxSize: 150, enableSorting: true, cell: props =>
{props.getValue()}
, sortingFn: 'text' }), columnHelper.accessor('title', { id: 'title', header: 'Название', size: 1200, minSize: 200, maxSize: 1200, enableSorting: true, sortingFn: 'text' }), columnHelper.accessor(item => item.owner ?? 0, { id: 'owner', header: 'Владелец', size: 400, minSize: 100, maxSize: 400, cell: props => getUserLabel(props.getValue()), enableSorting: true, sortingFn: 'text' }), columnHelper.accessor('time_update', { id: 'time_update', header: windowSize.isSmall ? 'Дата' : 'Обновлена', cell: props => (
{new Date(props.getValue()).toLocaleString(intl.locale, { year: '2-digit', month: '2-digit', day: '2-digit', ...(!windowSize.isSmall && { hour: '2-digit', minute: '2-digit' }) })}
), enableSorting: true, sortingFn: 'datetime', sortDescFirst: true }) ]; const tableHeight = useFitHeight('2.2rem'); const conditionalRowStyles: IConditionalStyle[] = [ { when: (item: ILibraryItem) => item.item_type === LibraryItemType.OSS, style: { color: APP_COLORS.fgGreen } } ]; return (

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

} columnVisibility={columnVisibility} onRowClicked={handleOpenItem} enableSorting initialSorting={{ id: 'time_update', desc: true }} enablePagination paginationPerPage={itemsPerPage} onChangePaginationOption={setItemsPerPage} paginationOptions={[10, 20, 30, 50, 100]} conditionalRowStyles={conditionalRowStyles} /> ); }