[]>(
() => [
{
accessorKey: 'name',
header: ({ column }) => ,
cell: ({ row }) => ,
meta: { headerTitle: 'Модуль' },
size: 280,
},
{
accessorKey: 'type',
header: ({ column }) => ,
cell: ({ row }) => {moduleTypeRu(row.original.type)},
meta: { headerTitle: 'Тип' },
size: 150,
},
{
id: 'schedule',
accessorFn: (row) => row.cron_expr ?? String(row.refresh_interval_sec ?? ''),
header: ({ column }) => ,
cell: ({ row }) => (
{row.original.cron_expr ??
(row.original.refresh_interval_sec ? `${row.original.refresh_interval_sec} с` : '—')}
),
meta: { headerTitle: 'Расписание' },
size: 130,
},
{
id: 'last_refreshed_at',
accessorFn: (row) => row.last_refreshed_at ?? '',
header: ({ column }) => ,
cell: ({ row }) => (
{row.original.last_refreshed_at
? new Date(row.original.last_refreshed_at).toLocaleString('ru-RU')
: '—'}
),
meta: { headerTitle: 'Обновлено' },
size: 190,
},
{
id: 'enabled',
accessorFn: (row) => (row.enabled ? 'on' : 'off'),
header: ({ column }) => ,
cell: ({ row }) => (
),
meta: { headerTitle: 'Статус' },
size: 110,
},
{
id: 'actions',
enableSorting: false,
size: 104,
header: () => null,
cell: ({ row }) => (
onRefresh(row.original.id)}
>
Обновить
),
},
],
[onRefresh, refreshing],
)
return (
setFilterQuery(createTextFilterQuery('search'))}
getFilterFieldValue={(item, field) => {
if (field !== 'search') return undefined
return `${item.name} ${item.type} ${item.enabled ? 'вкл' : 'выкл'}`
}}
columns={columns}
data={items}
getRowId={(row) => row.id}
isLoading={isLoading}
isError={isError}
error={error}
onRetry={onRetry}
pinLastColumn
emptyState={{ title: 'Нет модулей' }}
/>
)
}