diff --git a/src/containers/Storage/StorageGroups/columns/columns.tsx b/src/containers/Storage/StorageGroups/columns/columns.tsx index ed5710089d..68b3a57e22 100644 --- a/src/containers/Storage/StorageGroups/columns/columns.tsx +++ b/src/containers/Storage/StorageGroups/columns/columns.tsx @@ -265,21 +265,7 @@ const getDisksColumn = (data?: GetStorageColumnsData): StorageGroupsColumn => ({ }); export const getStorageTopGroupsColumns: StorageColumnsGetter = () => { - const columns = [ - groupIdColumn, - typeColumn, - erasureColumn, - usageColumn, - usedColumn, - limitColumn, - ]; - - return columns.map((column) => { - return { - ...column, - sortable: false, - }; - }); + return [groupIdColumn, typeColumn, erasureColumn, usageColumn, usedColumn, limitColumn]; }; export const getStorageGroupsColumns: StorageColumnsGetter = (data) => { diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopNodesByCpu.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopNodesByCpu.tsx index 051ea2f35b..8f592c2791 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopNodesByCpu.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopNodesByCpu.tsx @@ -1,5 +1,6 @@ import type {Column} from '@gravity-ui/react-data-table'; +import {ResizeableDataTable} from '../../../../../components/ResizeableDataTable/ResizeableDataTable'; import { getHostColumn, getNodeIdColumn, @@ -15,7 +16,10 @@ import type {NodesPreparedEntity} from '../../../../../store/reducers/nodes/type import {TENANT_DIAGNOSTICS_TABS_IDS} from '../../../../../store/reducers/tenant/constants'; import type {AdditionalNodesProps} from '../../../../../types/additionalProps'; import type {NodesRequiredField} from '../../../../../types/api/nodes'; -import {TENANT_OVERVIEW_TABLES_LIMIT} from '../../../../../utils/constants'; +import { + TENANT_OVERVIEW_TABLES_LIMIT, + TENANT_OVERVIEW_TABLES_SETTINGS, +} from '../../../../../utils/constants'; import {useAutoRefreshInterval, useSearchQuery} from '../../../../../utils/hooks'; import {getRequiredDataFields} from '../../../../../utils/tableUtils/getRequiredDataFields'; import {TenantTabsGroups, getTenantPath} from '../../../TenantPages'; @@ -34,15 +38,10 @@ function getTopNodesByCpuColumns( hostColumn, ]; - const preparedColumns = columns.map((column) => ({ - ...column, - sortable: false, - })); - - const columnsIds = preparedColumns.map((column) => column.name); + const columnsIds = columns.map((column) => column.name); const dataFieldsRequired = getRequiredDataFields(columnsIds, NODES_COLUMNS_TO_DATA_FIELDS); - return [preparedColumns, dataFieldsRequired]; + return [columns, dataFieldsRequired]; } interface TopNodesByCpuProps { @@ -86,13 +85,18 @@ export function TopNodesByCpu({tenantName, additionalNodesProps}: TopNodesByCpuP return ( + withData={Boolean(currentData)} + > + + ); } diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopNodesByLoad.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopNodesByLoad.tsx index 5d87f32f33..e14e8dfb8d 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopNodesByLoad.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopNodesByLoad.tsx @@ -1,5 +1,6 @@ import type {Column} from '@gravity-ui/react-data-table'; +import {ResizeableDataTable} from '../../../../../components/ResizeableDataTable/ResizeableDataTable'; import { getHostColumn, getLoadColumn, @@ -16,7 +17,10 @@ import type {NodesPreparedEntity} from '../../../../../store/reducers/nodes/type import {TENANT_DIAGNOSTICS_TABS_IDS} from '../../../../../store/reducers/tenant/constants'; import type {AdditionalNodesProps} from '../../../../../types/additionalProps'; import type {NodesRequiredField} from '../../../../../types/api/nodes'; -import {TENANT_OVERVIEW_TABLES_LIMIT} from '../../../../../utils/constants'; +import { + TENANT_OVERVIEW_TABLES_LIMIT, + TENANT_OVERVIEW_TABLES_SETTINGS, +} from '../../../../../utils/constants'; import {useAutoRefreshInterval, useSearchQuery} from '../../../../../utils/hooks'; import {getRequiredDataFields} from '../../../../../utils/tableUtils/getRequiredDataFields'; import {TenantTabsGroups, getTenantPath} from '../../../TenantPages'; @@ -39,15 +43,10 @@ function getTopNodesByLoadColumns( getVersionColumn(), ]; - const preparedColumns = columns.map((column) => ({ - ...column, - sortable: false, - })); - - const columnsIds = preparedColumns.map((column) => column.name); + const columnsIds = columns.map((column) => column.name); const dataFieldsRequired = getRequiredDataFields(columnsIds, NODES_COLUMNS_TO_DATA_FIELDS); - return [preparedColumns, dataFieldsRequired]; + return [columns, dataFieldsRequired]; } interface TopNodesByLoadProps { @@ -91,13 +90,18 @@ export function TopNodesByLoad({tenantName, additionalNodesProps}: TopNodesByLoa return ( + withData={Boolean(currentData)} + > + + ); } diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopQueries.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopQueries.tsx index a3bc578b62..7fe06e3f10 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopQueries.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopQueries.tsx @@ -2,6 +2,7 @@ import React from 'react'; import {useHistory, useLocation} from 'react-router-dom'; +import {ResizeableDataTable} from '../../../../../components/ResizeableDataTable/ResizeableDataTable'; import {parseQuery} from '../../../../../routes'; import { setTopQueriesFilters, @@ -14,6 +15,7 @@ import { TENANT_PAGES_IDS, TENANT_QUERY_TABS_ID, } from '../../../../../store/reducers/tenant/constants'; +import {TENANT_OVERVIEW_TABLES_SETTINGS} from '../../../../../utils/constants'; import {useAutoRefreshInterval, useTypedDispatch} from '../../../../../utils/hooks'; import {useChangeInputWithConfirmation} from '../../../../../utils/hooks/withConfirmation/useChangeInputWithConfirmation'; import {parseQueryErrorToString} from '../../../../../utils/query'; @@ -85,14 +87,19 @@ export function TopQueries({tenantName}: TopQueriesProps) { return ( b('top-queries-row')} - /> + withData={Boolean(currentData)} + > + b('top-queries-row')} + settings={TENANT_OVERVIEW_TABLES_SETTINGS} + /> + ); } diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopShards.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopShards.tsx index af8ac4f267..f8c524213e 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopShards.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopShards.tsx @@ -1,8 +1,10 @@ import {useLocation} from 'react-router-dom'; +import {ResizeableDataTable} from '../../../../../components/ResizeableDataTable/ResizeableDataTable'; import {parseQuery} from '../../../../../routes'; import {TENANT_DIAGNOSTICS_TABS_IDS} from '../../../../../store/reducers/tenant/constants'; import {topShardsApi} from '../../../../../store/reducers/tenantOverview/topShards/tenantOverviewTopShards'; +import {TENANT_OVERVIEW_TABLES_SETTINGS} from '../../../../../utils/constants'; import {useAutoRefreshInterval} from '../../../../../utils/hooks'; import {parseQueryErrorToString} from '../../../../../utils/query'; import {TenantTabsGroups, getTenantPath} from '../../../TenantPages'; @@ -45,12 +47,17 @@ export const TopShards = ({tenantName, path}: TopShardsProps) => { return ( + withData={Boolean(currentData)} + > + + ); }; diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/TenantMemory/TopNodesByMemory.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/TenantMemory/TopNodesByMemory.tsx index b543ab423c..659df30a52 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/TenantMemory/TopNodesByMemory.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/TenantMemory/TopNodesByMemory.tsx @@ -1,5 +1,6 @@ import type {Column} from '@gravity-ui/react-data-table'; +import {ResizeableDataTable} from '../../../../../components/ResizeableDataTable/ResizeableDataTable'; import { getHostColumn, getLoadColumn, @@ -19,7 +20,10 @@ import type {NodesPreparedEntity} from '../../../../../store/reducers/nodes/type import {TENANT_DIAGNOSTICS_TABS_IDS} from '../../../../../store/reducers/tenant/constants'; import type {AdditionalNodesProps} from '../../../../../types/additionalProps'; import type {NodesRequiredField} from '../../../../../types/api/nodes'; -import {TENANT_OVERVIEW_TABLES_LIMIT} from '../../../../../utils/constants'; +import { + TENANT_OVERVIEW_TABLES_LIMIT, + TENANT_OVERVIEW_TABLES_SETTINGS, +} from '../../../../../utils/constants'; import {useAutoRefreshInterval, useSearchQuery} from '../../../../../utils/hooks'; import {getRequiredDataFields} from '../../../../../utils/tableUtils/getRequiredDataFields'; import {TenantTabsGroups, getTenantPath} from '../../../TenantPages'; @@ -40,15 +44,10 @@ function getTopNodesByMemoryColumns( getTabletsColumn(params), ]; - const preparedColumns = columns.map((column) => ({ - ...column, - sortable: false, - })); - - const columnsIds = preparedColumns.map((column) => column.name); + const columnsIds = columns.map((column) => column.name); const dataFieldsRequired = getRequiredDataFields(columnsIds, NODES_COLUMNS_TO_DATA_FIELDS); - return [preparedColumns, dataFieldsRequired]; + return [columns, dataFieldsRequired]; } interface TopNodesByMemoryProps { @@ -92,13 +91,18 @@ export function TopNodesByMemory({tenantName, additionalNodesProps}: TopNodesByM return ( + withData={Boolean(currentData)} + > + + ); } diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverviewTableLayout.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverviewTableLayout.tsx index 144933d693..a70bf3607e 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverviewTableLayout.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverviewTableLayout.tsx @@ -1,34 +1,32 @@ import React from 'react'; +import type {NoStrictEntityMods} from '@bem-react/classname'; + import {ResponseError} from '../../../../components/Errors/ResponseError'; -import {ResizeableDataTable} from '../../../../components/ResizeableDataTable/ResizeableDataTable'; -import type {ResizeableDataTableProps} from '../../../../components/ResizeableDataTable/ResizeableDataTable'; import {TableSkeleton} from '../../../../components/TableSkeleton/TableSkeleton'; -import { - TENANT_OVERVIEW_TABLES_LIMIT, - TENANT_OVERVIEW_TABLES_SETTINGS, -} from '../../../../utils/constants'; +import {TENANT_OVERVIEW_TABLES_LIMIT} from '../../../../utils/constants'; import {b} from './utils'; -interface TenantOverviewTableLayoutProps extends ResizeableDataTableProps { +interface TenantOverviewTableLayoutProps { title: React.ReactNode; loading?: boolean; error?: unknown; - tableClassNameModifiers?: { - [name: string]: string | boolean | undefined; - }; + tableClassNameModifiers?: NoStrictEntityMods; + withData?: boolean; + children?: React.ReactNode; } -export function TenantOverviewTableLayout({ +export function TenantOverviewTableLayout({ title, error, loading, tableClassNameModifiers = {}, - ...props -}: TenantOverviewTableLayoutProps) { + withData, + children, +}: TenantOverviewTableLayoutProps) { const renderContent = () => { - if (error && props.data.length === 0) { + if (error && !withData) { return null; } @@ -36,7 +34,7 @@ export function TenantOverviewTableLayout({ return ; } - return ; + return children; }; return ( diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopGroups.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopGroups.tsx index db2ae13b93..55d8f5fddb 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopGroups.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopGroups.tsx @@ -1,3 +1,4 @@ +import {ResizeableDataTable} from '../../../../../components/ResizeableDataTable/ResizeableDataTable'; import { useCapabilitiesLoaded, useStorageGroupsHandlerAvailable, @@ -5,7 +6,10 @@ import { import {storageApi} from '../../../../../store/reducers/storage/storage'; import {TENANT_DIAGNOSTICS_TABS_IDS} from '../../../../../store/reducers/tenant/constants'; import type {GroupsRequiredField} from '../../../../../types/api/storage'; -import {TENANT_OVERVIEW_TABLES_LIMIT} from '../../../../../utils/constants'; +import { + TENANT_OVERVIEW_TABLES_LIMIT, + TENANT_OVERVIEW_TABLES_SETTINGS, +} from '../../../../../utils/constants'; import {useAutoRefreshInterval, useSearchQuery} from '../../../../../utils/hooks'; import {getRequiredDataFields} from '../../../../../utils/tableUtils/getRequiredDataFields'; import {getStorageTopGroupsColumns} from '../../../../Storage/StorageGroups/columns/columns'; @@ -71,12 +75,17 @@ export function TopGroups({tenant}: TopGroupsProps) { return ( + withData={Boolean(currentData)} + > + + ); } diff --git a/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopTables.tsx b/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopTables.tsx index 52fe25942c..f46dbd88b1 100644 --- a/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopTables.tsx +++ b/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopTables.tsx @@ -4,9 +4,11 @@ import {useLocation} from 'react-router-dom'; import {CellWithPopover} from '../../../../../components/CellWithPopover/CellWithPopover'; import {LinkToSchemaObject} from '../../../../../components/LinkToSchemaObject/LinkToSchemaObject'; +import {ResizeableDataTable} from '../../../../../components/ResizeableDataTable/ResizeableDataTable'; import {topTablesApi} from '../../../../../store/reducers/tenantOverview/executeTopTables/executeTopTables'; import type {KeyValueRow} from '../../../../../types/api/query'; import {formatBytes, getBytesSizeUnit} from '../../../../../utils/bytesParsers'; +import {TENANT_OVERVIEW_TABLES_SETTINGS} from '../../../../../utils/constants'; import {useAutoRefreshInterval} from '../../../../../utils/hooks'; import {parseQueryErrorToString} from '../../../../../utils/query'; import {TenantOverviewTableLayout} from '../TenantOverviewTableLayout'; @@ -44,14 +46,12 @@ export function TopTables({path}: TopTablesProps) { { name: 'Size', width: 100, - sortable: false, render: ({row}) => formatSize(Number(row.Size)), align: DataTable.RIGHT, }, { name: 'Path', width: 700, - sortable: false, render: ({row}) => row.Path ? ( @@ -69,12 +69,17 @@ export function TopTables({path}: TopTablesProps) { return ( + withData={Boolean(currentData)} + > + + ); } diff --git a/src/containers/Tenant/Diagnostics/TopQueries/columns/columns.tsx b/src/containers/Tenant/Diagnostics/TopQueries/columns/columns.tsx index 657cde5fe3..f845437579 100644 --- a/src/containers/Tenant/Diagnostics/TopQueries/columns/columns.tsx +++ b/src/containers/Tenant/Diagnostics/TopQueries/columns/columns.tsx @@ -137,12 +137,7 @@ export function getTopQueriesColumns() { } export function getTenantOverviewTopQueriesColumns() { - const columns = [queryHashColumn, oneLineQueryTextColumn, cpuTimeUsColumn]; - - return columns.map((column) => ({ - ...column, - sortable: false, - })); + return [queryHashColumn, oneLineQueryTextColumn, cpuTimeUsColumn]; } export function getRunningQueriesColumns() { diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 98957ef76c..24d4a8859a 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -89,10 +89,11 @@ export const DEFAULT_TABLE_SETTINGS: Settings = { highlightRows: true, } as const; -export const TENANT_OVERVIEW_TABLES_SETTINGS = { +export const TENANT_OVERVIEW_TABLES_SETTINGS: Settings = { ...DEFAULT_TABLE_SETTINGS, stickyHead: 'fixed', dynamicRender: false, + sortable: false, } as const; export const QUERY_EXECUTION_SETTINGS_KEY = 'queryExecutionSettings';