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';