2023-12-13 14:32:57 +03:00
|
|
|
|
'use client';
|
|
|
|
|
|
2023-12-15 17:34:50 +03:00
|
|
|
|
import clsx from 'clsx';
|
2023-07-15 17:46:19 +03:00
|
|
|
|
import { useMemo } from 'react';
|
|
|
|
|
import { useIntl } from 'react-intl';
|
2023-07-25 23:08:10 +03:00
|
|
|
|
|
2023-12-13 14:32:57 +03:00
|
|
|
|
import TextURL from '@/components/Common/TextURL';
|
|
|
|
|
import DataTable, { createColumnHelper } from '@/components/DataTable';
|
|
|
|
|
import HelpButton from '@/components/Help/HelpButton';
|
|
|
|
|
import { useAuth } from '@/context/AuthContext';
|
|
|
|
|
import { useConceptNavigation } from '@/context/NagivationContext';
|
|
|
|
|
import { useUsers } from '@/context/UsersContext';
|
|
|
|
|
import useLocalStorage from '@/hooks/useLocalStorage';
|
|
|
|
|
import { ILibraryItem } from '@/models/library';
|
|
|
|
|
import { HelpTopic } from '@/models/miscelanious';
|
|
|
|
|
|
2023-12-05 01:22:44 +03:00
|
|
|
|
import ItemIcons from './ItemIcons';
|
2023-07-15 17:46:19 +03:00
|
|
|
|
|
2023-07-28 00:03:37 +03:00
|
|
|
|
interface ViewLibraryProps {
|
2023-08-25 22:51:20 +03:00
|
|
|
|
items: ILibraryItem[]
|
2023-09-11 21:06:51 +03:00
|
|
|
|
resetQuery: () => void
|
2023-07-15 17:46:19 +03:00
|
|
|
|
}
|
|
|
|
|
|
2023-09-09 20:36:55 +03:00
|
|
|
|
const columnHelper = createColumnHelper<ILibraryItem>();
|
|
|
|
|
|
2023-09-11 21:06:51 +03:00
|
|
|
|
function ViewLibrary({ items, resetQuery: cleanQuery }: ViewLibraryProps) {
|
2023-12-13 14:32:57 +03:00
|
|
|
|
const router = useConceptNavigation();
|
2023-07-15 17:46:19 +03:00
|
|
|
|
const intl = useIntl();
|
2023-09-05 00:23:53 +03:00
|
|
|
|
const { user } = useAuth();
|
2023-07-15 17:46:19 +03:00
|
|
|
|
const { getUserLabel } = useUsers();
|
2023-12-05 01:22:44 +03:00
|
|
|
|
const [itemsPerPage, setItemsPerPage] = useLocalStorage<number>('library_per_page', 50);
|
2023-07-15 17:46:19 +03:00
|
|
|
|
|
2023-12-13 14:32:57 +03:00
|
|
|
|
const handleOpenItem = (item: ILibraryItem) => router.push(`/rsforms/${item.id}`);
|
2023-07-15 17:46:19 +03:00
|
|
|
|
|
2023-08-26 17:26:49 +03:00
|
|
|
|
const columns = useMemo(
|
|
|
|
|
() => [
|
2023-09-09 20:36:55 +03:00
|
|
|
|
columnHelper.display({
|
2023-08-26 17:26:49 +03:00
|
|
|
|
id: 'status',
|
2023-09-09 20:36:55 +03:00
|
|
|
|
header: '',
|
|
|
|
|
size: 60,
|
2023-09-10 20:17:18 +03:00
|
|
|
|
minSize: 60,
|
2023-09-09 20:36:55 +03:00
|
|
|
|
maxSize: 60,
|
2023-12-05 01:22:44 +03:00
|
|
|
|
cell: props =>
|
|
|
|
|
<ItemIcons
|
|
|
|
|
item={props.row.original}
|
|
|
|
|
user={user}
|
|
|
|
|
/>,
|
2023-09-09 20:36:55 +03:00
|
|
|
|
}),
|
|
|
|
|
columnHelper.accessor('alias', {
|
2023-08-26 17:26:49 +03:00
|
|
|
|
id: 'alias',
|
2023-09-09 20:36:55 +03:00
|
|
|
|
header: 'Шифр',
|
|
|
|
|
size: 200,
|
|
|
|
|
minSize: 200,
|
|
|
|
|
maxSize: 200,
|
2023-09-10 20:17:18 +03:00
|
|
|
|
enableSorting: true,
|
|
|
|
|
sortingFn: 'text'
|
2023-09-09 20:36:55 +03:00
|
|
|
|
}),
|
|
|
|
|
columnHelper.accessor('title', {
|
2023-08-16 18:32:37 +03:00
|
|
|
|
id: 'title',
|
2023-09-09 20:36:55 +03:00
|
|
|
|
header: 'Название',
|
2023-10-08 18:45:15 +03:00
|
|
|
|
size: 2000,
|
2023-09-10 20:17:18 +03:00
|
|
|
|
minSize: 400,
|
2023-10-08 18:45:15 +03:00
|
|
|
|
maxSize: 2000,
|
2023-09-10 20:17:18 +03:00
|
|
|
|
enableSorting: true,
|
|
|
|
|
sortingFn: 'text'
|
2023-09-09 20:36:55 +03:00
|
|
|
|
}),
|
|
|
|
|
columnHelper.accessor(item => item.owner ?? 0, {
|
2023-08-16 18:32:37 +03:00
|
|
|
|
id: 'owner',
|
2023-09-09 20:36:55 +03:00
|
|
|
|
header: 'Владелец',
|
2023-10-08 18:45:15 +03:00
|
|
|
|
size: 600,
|
2023-09-10 20:17:18 +03:00
|
|
|
|
minSize: 200,
|
2023-10-08 18:45:15 +03:00
|
|
|
|
maxSize: 600,
|
2023-09-09 20:36:55 +03:00
|
|
|
|
cell: props => getUserLabel(props.cell.getValue()),
|
|
|
|
|
enableSorting: true,
|
2023-09-10 20:17:18 +03:00
|
|
|
|
sortingFn: 'text'
|
2023-09-09 20:36:55 +03:00
|
|
|
|
}),
|
|
|
|
|
columnHelper.accessor('time_update', {
|
2023-08-16 18:32:37 +03:00
|
|
|
|
id: 'time_update',
|
2023-09-09 20:36:55 +03:00
|
|
|
|
header: 'Обновлена',
|
2023-09-11 21:06:51 +03:00
|
|
|
|
size: 150,
|
|
|
|
|
minSize: 150,
|
|
|
|
|
maxSize: 150,
|
2023-12-05 01:22:44 +03:00
|
|
|
|
cell: props =>
|
|
|
|
|
<div className='text-sm min-w-[8.25rem]'>
|
|
|
|
|
{new Date(props.cell.getValue()).toLocaleString(intl.locale)}
|
|
|
|
|
</div>,
|
2023-09-10 20:17:18 +03:00
|
|
|
|
enableSorting: true,
|
|
|
|
|
sortingFn: 'datetime',
|
|
|
|
|
sortDescFirst: true
|
2023-09-09 20:36:55 +03:00
|
|
|
|
})
|
2023-08-26 17:26:49 +03:00
|
|
|
|
], [intl, getUserLabel, user]);
|
2023-08-16 18:32:37 +03:00
|
|
|
|
|
2023-07-15 17:46:19 +03:00
|
|
|
|
return (
|
2023-11-27 11:33:34 +03:00
|
|
|
|
<>
|
|
|
|
|
<div className='sticky top-[2.3rem] w-full'>
|
2023-12-15 17:34:50 +03:00
|
|
|
|
<div className={clsx(
|
|
|
|
|
'z-pop',
|
|
|
|
|
'absolute top-[0.125rem] left-[0.25rem]',
|
|
|
|
|
'ml-3',
|
|
|
|
|
'flex gap-1'
|
|
|
|
|
)}>
|
2023-12-05 01:22:44 +03:00
|
|
|
|
<HelpButton
|
|
|
|
|
topic={HelpTopic.LIBRARY}
|
|
|
|
|
dimensions='max-w-[35rem]'
|
|
|
|
|
offset={0}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
2023-11-27 11:33:34 +03:00
|
|
|
|
</div>
|
|
|
|
|
<DataTable
|
|
|
|
|
columns={columns}
|
|
|
|
|
data={items}
|
2023-09-11 21:06:51 +03:00
|
|
|
|
|
2023-11-27 11:33:34 +03:00
|
|
|
|
headPosition='2.3rem'
|
|
|
|
|
noDataComponent={
|
2023-12-05 01:22:44 +03:00
|
|
|
|
<div className='p-3 text-center min-h-[6rem]'>
|
2023-11-27 11:33:34 +03:00
|
|
|
|
<p>Список схем пуст</p>
|
2023-12-05 01:22:44 +03:00
|
|
|
|
<p className='flex justify-center gap-6 mt-3'>
|
2023-12-13 14:32:57 +03:00
|
|
|
|
<TextURL text='Создать схему' href='/library/create'/>
|
2023-12-05 01:22:44 +03:00
|
|
|
|
<TextURL text='Очистить фильтр' onClick={cleanQuery} />
|
2023-11-27 11:33:34 +03:00
|
|
|
|
</p>
|
|
|
|
|
</div>}
|
|
|
|
|
|
2023-12-05 01:22:44 +03:00
|
|
|
|
onRowClicked={handleOpenItem}
|
2023-09-10 20:17:18 +03:00
|
|
|
|
|
2023-11-27 11:33:34 +03:00
|
|
|
|
enableSorting
|
|
|
|
|
initialSorting={{
|
|
|
|
|
id: 'time_update',
|
|
|
|
|
desc: true
|
|
|
|
|
}}
|
2023-09-10 20:17:18 +03:00
|
|
|
|
|
2023-11-27 11:33:34 +03:00
|
|
|
|
enablePagination
|
|
|
|
|
paginationPerPage={itemsPerPage}
|
|
|
|
|
onChangePaginationOption={setItemsPerPage}
|
|
|
|
|
paginationOptions={[10, 20, 30, 50, 100]}
|
|
|
|
|
/>
|
|
|
|
|
</>);
|
2023-07-15 17:46:19 +03:00
|
|
|
|
}
|
|
|
|
|
|
2023-12-13 14:32:57 +03:00
|
|
|
|
export default ViewLibrary;
|