diff --git a/apps/web/src/components/errors/errors-columns.tsx b/apps/web/src/components/errors/errors-columns.tsx index ecbc295..6f86c61 100644 --- a/apps/web/src/components/errors/errors-columns.tsx +++ b/apps/web/src/components/errors/errors-columns.tsx @@ -238,7 +238,12 @@ export function createErrorsColumns(opts: { enableSorting: false, enableHiding: false, enableResizing: false, - meta: { skeleton: }, + enablePinning: false, + meta: { + skeleton: , + cellClassName: 'bg-transparent!', + headerClassName: 'bg-transparent!', + }, }, ] } diff --git a/apps/web/src/components/errors/errors-grid-view.tsx b/apps/web/src/components/errors/errors-grid-view.tsx index 53b894d..f298b2f 100644 --- a/apps/web/src/components/errors/errors-grid-view.tsx +++ b/apps/web/src/components/errors/errors-grid-view.tsx @@ -157,7 +157,6 @@ export function ErrorsGridView() { } getFilterFieldValue={getFilterFieldValue} onRowClick={handleOpen} - pinLastColumn pageSize={10} initialSorting={[{ id: 'total', desc: true }]} enableColumnVisibility @@ -177,8 +176,10 @@ export function ErrorsGridView() { columnsResizable: true, columnsMovable: true, columnsVisibility: true, + columnsPinnable: false, rowsPinnable: false, }} + pinLastColumn={false} /> ({ ? (columns[columns.length - 1]?.id ?? '') : '' + const [columnPinning, setColumnPinning] = useState(() => + pinLastColumn && lastColId + ? { left: [], right: [lastColId] } + : { left: [], right: [] }, + ) + + const handleSortingChange = useCallback>( + (updater) => { + setSorting(updater) + resetPagination() + }, + [resetPagination], + ) + const table = useReactTable({ data: filteredData, columns, @@ -414,6 +429,7 @@ function ResourcePageFiltered({ pagination, columnVisibility, columnOrder, + columnPinning, ...(enableRowPinning ? { rowPinning: resolvedRowPinning } : {}), }, enableRowSelection, @@ -421,20 +437,18 @@ function ResourcePageFiltered({ keepPinnedRows: enableRowPinning, enableColumnPinning: Boolean(pinLastColumn || layout.columnsPinnable), enableHiding: enableColumnVisibility, - onSortingChange: setSorting, + enableSorting: true, + manualSorting: false, + onSortingChange: handleSortingChange, onRowSelectionChange: setRowSelection, onPaginationChange: setPagination, onColumnVisibilityChange: setColumnVisibility, onColumnOrderChange: setColumnOrder, + onColumnPinningChange: setColumnPinning, onRowPinningChange: enableRowPinning ? setRowPinning : undefined, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), getPaginationRowModel: getPaginationRowModel(), - initialState: { - ...(pinLastColumn && lastColId - ? { columnPinning: { right: [lastColId] } } - : {}), - }, }) const handleTabChange = useCallback( diff --git a/apps/web/src/components/reui/data-grid/data-grid-column-header.tsx b/apps/web/src/components/reui/data-grid/data-grid-column-header.tsx index a53e18e..f92c24f 100644 --- a/apps/web/src/components/reui/data-grid/data-grid-column-header.tsx +++ b/apps/web/src/components/reui/data-grid/data-grid-column-header.tsx @@ -289,18 +289,36 @@ function DataGridColumnHeaderInner({ if (hasControls) { return ( -
+
+ {canSort ? ( + + ) : ( + + {icon && icon} + {resolvedTitle} + + )} - {icon && icon} - {resolvedTitle} - {sortIcon} + - {props.tableLayout?.columnsPinnable && canPin && isPinned && ( + {props.tableLayout?.columnsPinnable && canPin && isPinned ? ( - )} + ) : null}
) } diff --git a/apps/web/src/components/users/users-columns.tsx b/apps/web/src/components/users/users-columns.tsx index 5637854..b748c4d 100644 --- a/apps/web/src/components/users/users-columns.tsx +++ b/apps/web/src/components/users/users-columns.tsx @@ -349,7 +349,7 @@ export function createUsersColumns(opts: { }, { id: 'current_connections', - accessorKey: 'current_connections', + accessorFn: (row) => Number(row.current_connections ?? 0), header: ({ column }) => ( @@ -442,7 +443,12 @@ export function createUsersColumns(opts: { }, { id: 'data_quota_bytes', - accessorKey: 'data_quota_bytes', + accessorFn: (row) => { + const quota = row.data_quota_bytes + if (typeof quota === 'number' && quota > 0) return quota + // «Без квоты» в UI показывает usage — сортируем по тому же смыслу + return Number(row.total_octets ?? 0) + }, header: ({ column }) => ( ), @@ -451,6 +457,7 @@ export function createUsersColumns(opts: { enableSorting: true, enableHiding: true, enableResizing: true, + sortingFn: 'basic', meta: { skeleton: (
@@ -534,9 +541,12 @@ export function createUsersColumns(opts: { enableSorting: false, enableHiding: false, enableResizing: false, + enablePinning: false, size: 52, meta: { skeleton: , + cellClassName: 'bg-transparent!', + headerClassName: 'bg-transparent!', }, }, ] diff --git a/apps/web/src/components/users/users-grid-view.tsx b/apps/web/src/components/users/users-grid-view.tsx index 2bbd5dc..a5656fc 100644 --- a/apps/web/src/components/users/users-grid-view.tsx +++ b/apps/web/src/components/users/users-grid-view.tsx @@ -276,9 +276,17 @@ export function UsersGridView() { enableColumnVisibility columnVisibility={columnVisibility} onColumnVisibilityChange={setColumnVisibility} - pinLastColumn pageSize={5} initialSorting={[{ id: 'username', desc: false }]} + tableLayout={{ + dense: true, + columnsResizable: true, + columnsMovable: true, + columnsVisibility: true, + columnsPinnable: false, + rowsPinnable: true, + }} + pinLastColumn={false} emptyState={{ title: 'Нет пользователей', description: 'Создайте первый аккаунт Telemt.',