Skip to content

Commit c3cf2a7

Browse files
feat(Nodes,Storage): enable both tablets and pdisks columns (#2729)
Co-authored-by: mufazalov <mufazalov@yandex-team.ru>
1 parent 2a06084 commit c3cf2a7

File tree

34 files changed

+272
-279
lines changed

34 files changed

+272
-279
lines changed

src/components/NetworkTable/columns.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import type {NodesPreparedEntity} from '../../store/reducers/nodes/types';
2-
import type {Column} from '../../utils/tableUtils/types';
31
import {
42
getClockSkewColumn,
53
getConnectionsColumn,
@@ -16,10 +14,10 @@ import {
1614
getUptimeColumn,
1715
} from '../nodesColumns/columns';
1816
import {isSortableNodesColumn} from '../nodesColumns/constants';
19-
import type {GetNodesColumnsParams} from '../nodesColumns/types';
17+
import type {GetNodesColumnsParams, NodesColumn} from '../nodesColumns/types';
2018

2119
export function getNetworkTableNodesColumns(params: GetNodesColumnsParams) {
22-
const columns: Column<NodesPreparedEntity>[] = [
20+
const columns: NodesColumn[] = [
2321
getNodeIdColumn(),
2422
getNetworkHostColumn(params),
2523
getDataCenterColumn(),
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
1+
import type {StorageNodesColumnsSettings} from '../../containers/Storage/PaginatedStorageNodesTable/columns/types';
2+
import type {StorageViewContext} from '../../containers/Storage/types';
3+
import type {PreparedStorageNode} from '../../store/reducers/storage/types';
14
import type {GetNodeRefFunc} from '../../types/additionalProps';
5+
import type {Column} from '../../utils/tableUtils/types';
26

37
export interface GetNodesColumnsParams {
48
getNodeRef?: GetNodeRefFunc;
59
database?: string;
10+
11+
viewContext?: StorageViewContext;
12+
columnsSettings?: StorageNodesColumnsSettings;
613
}
14+
15+
export type NodesColumn = Column<PreparedStorageNode>;

src/containers/Nodes/Nodes.tsx

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,29 @@
11
import React from 'react';
22

3-
import type {Column} from '../../components/PaginatedTable';
43
import {
54
NODES_COLUMNS_IDS,
65
isMonitoringUserNodesColumn,
76
isViewerUserNodesColumn,
87
} from '../../components/nodesColumns/constants';
98
import type {NodesColumnId} from '../../components/nodesColumns/constants';
9+
import type {NodesColumn} from '../../components/nodesColumns/types';
1010
import {useBridgeModeEnabled} from '../../store/reducers/capabilities/hooks';
11-
import type {NodesPreparedEntity} from '../../store/reducers/nodes/types';
1211
import type {AdditionalNodesProps} from '../../types/additionalProps';
1312
import type {NodesGroupByField} from '../../types/api/nodes';
1413
import {
1514
useIsUserAllowedToMakeChanges,
1615
useIsViewerUser,
1716
} from '../../utils/hooks/useIsUserAllowedToMakeChanges';
17+
import {useStorageColumnsSettings} from '../Storage/utils';
1818

1919
import {PaginatedNodes} from './PaginatedNodes';
20-
import {getNodesColumns} from './columns/columns';
2120
import {
2221
ALL_NODES_GROUP_BY_PARAMS,
2322
DEFAULT_NODES_COLUMNS,
2423
NODES_TABLE_SELECTED_COLUMNS_LS_KEY,
2524
REQUIRED_NODES_COLUMNS,
2625
} from './columns/constants';
26+
import {useGetNodesColumns} from './columns/hooks';
2727

2828
import './Nodes.scss';
2929

@@ -34,7 +34,7 @@ export interface NodesProps {
3434
scrollContainerRef: React.RefObject<HTMLElement>;
3535
additionalNodesProps?: AdditionalNodesProps;
3636
withPeerRoleFilter?: boolean;
37-
columns?: Column<NodesPreparedEntity>[];
37+
columns?: NodesColumn[];
3838
defaultColumnsIds?: NodesColumnId[];
3939
requiredColumnsIds?: NodesColumnId[];
4040
selectedColumnsKey?: string;
@@ -48,12 +48,21 @@ export function Nodes({
4848
scrollContainerRef,
4949
additionalNodesProps,
5050
withPeerRoleFilter,
51-
columns = getNodesColumns({database, getNodeRef: additionalNodesProps?.getNodeRef}),
51+
columns: externalColumns,
5252
defaultColumnsIds = DEFAULT_NODES_COLUMNS,
5353
requiredColumnsIds = REQUIRED_NODES_COLUMNS,
5454
selectedColumnsKey = NODES_TABLE_SELECTED_COLUMNS_LS_KEY,
5555
groupByParams = ALL_NODES_GROUP_BY_PARAMS,
5656
}: NodesProps) {
57+
const {handleDataFetched, columnsSettings} = useStorageColumnsSettings();
58+
59+
const columns = useGetNodesColumns({
60+
columns: externalColumns,
61+
database,
62+
getNodeRef: additionalNodesProps?.getNodeRef,
63+
columnsSettings,
64+
});
65+
5766
const bridgeModeEnabled = useBridgeModeEnabled();
5867

5968
const columnsWithPile = React.useMemo(() => {
@@ -107,6 +116,7 @@ export function Nodes({
107116
requiredColumnsIds={requiredColumnsIds}
108117
selectedColumnsKey={selectedColumnsKey}
109118
groupByParams={effectiveGroupByParams}
119+
onDataFetched={handleDataFetched}
110120
/>
111121
);
112122
}

src/containers/Nodes/NodesTable.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
import React from 'react';
22

33
import {Illustration} from '../../components/Illustration';
4+
import type {PaginatedTableData} from '../../components/PaginatedTable';
45
import {ResizeablePaginatedTable} from '../../components/PaginatedTable';
56
import {NODES_COLUMNS_WIDTH_LS_KEY} from '../../components/nodesColumns/constants';
6-
import type {NodesFilters, NodesPreparedEntity} from '../../store/reducers/nodes/types';
7+
import type {NodesColumn} from '../../components/nodesColumns/types';
8+
import type {NodesFilters} from '../../store/reducers/nodes/types';
79
import type {ProblemFilterValue} from '../../store/reducers/settings/types';
10+
import type {PreparedStorageNode} from '../../store/reducers/storage/types';
811
import type {NodesGroupByField, NodesPeerRole} from '../../types/api/nodes';
912
import {NodesUptimeFilterValues} from '../../utils/nodes';
1013
import {renderPaginatedTableErrorMessage} from '../../utils/renderPaginatedTableErrorMessage';
11-
import type {Column} from '../../utils/tableUtils/types';
1214

1315
import {getNodes} from './getNodes';
1416
import i18n from './i18n';
@@ -27,10 +29,12 @@ interface NodesTableProps {
2729
filterGroup?: string;
2830
filterGroupBy?: NodesGroupByField;
2931

30-
columns: Column<NodesPreparedEntity>[];
32+
columns: NodesColumn[];
3133
scrollContainerRef: React.RefObject<HTMLElement>;
3234

3335
initialEntitiesCount?: number;
36+
37+
onDataFetched?: (data: PaginatedTableData<PreparedStorageNode>) => void;
3438
}
3539

3640
export function NodesTable({
@@ -46,6 +50,7 @@ export function NodesTable({
4650
columns,
4751
scrollContainerRef,
4852
initialEntitiesCount,
53+
onDataFetched,
4954
}: NodesTableProps) {
5055
const tableFilters: NodesFilters = React.useMemo(() => {
5156
return {
@@ -91,6 +96,7 @@ export function NodesTable({
9196
getRowClassName={getRowClassName}
9297
filters={tableFilters}
9398
tableName="nodes"
99+
onDataFetched={onDataFetched}
94100
/>
95101
);
96102
}

src/containers/Nodes/PaginatedNodes/GroupedNodesComponent.tsx

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ import React from 'react';
33
import {isNil} from 'lodash';
44

55
import {ResponseError} from '../../../components/Errors/ResponseError';
6-
import type {Column} from '../../../components/PaginatedTable';
6+
import type {PaginatedTableData} from '../../../components/PaginatedTable';
77
import {PaginatedTableWithLayout} from '../../../components/PaginatedTable/PaginatedTableWithLayout';
88
import {TableColumnSetup} from '../../../components/TableColumnSetup/TableColumnSetup';
99
import {NODES_COLUMNS_TITLES} from '../../../components/nodesColumns/constants';
1010
import type {NodesColumnId} from '../../../components/nodesColumns/constants';
11+
import type {NodesColumn} from '../../../components/nodesColumns/types';
1112
import {nodesApi} from '../../../store/reducers/nodes/nodes';
12-
import type {NodesPreparedEntity} from '../../../store/reducers/nodes/types';
13+
import type {PreparedStorageNode} from '../../../store/reducers/storage/types';
1314
import type {NodesGroupByField, NodesPeerRole} from '../../../types/api/nodes';
1415
import {useAutoRefreshInterval} from '../../../utils/hooks';
1516
import {useSelectedColumns} from '../../../utils/hooks/useSelectedColumns';
@@ -32,9 +33,10 @@ interface NodeGroupProps {
3233
searchValue: string;
3334
peerRoleFilter?: NodesPeerRole;
3435
groupByParam?: NodesGroupByField;
35-
columns: Column<NodesPreparedEntity>[];
36+
columns: NodesColumn[];
3637
scrollContainerRef: React.RefObject<HTMLElement>;
3738
onIsExpandedChange: (name: string, isExpanded: boolean) => void;
39+
onDataFetched?: (data: PaginatedTableData<PreparedStorageNode>) => void;
3840
}
3941

4042
const NodeGroup = React.memo(function NodeGroup({
@@ -50,6 +52,7 @@ const NodeGroup = React.memo(function NodeGroup({
5052
columns,
5153
scrollContainerRef,
5254
onIsExpandedChange,
55+
onDataFetched,
5356
}: NodeGroupProps) {
5457
return (
5558
<TableGroup
@@ -76,6 +79,7 @@ const NodeGroup = React.memo(function NodeGroup({
7679
initialEntitiesCount={count}
7780
columns={columns}
7881
scrollContainerRef={scrollContainerRef}
82+
onDataFetched={onDataFetched}
7983
/>
8084
}
8185
tableWrapperProps={{
@@ -92,11 +96,12 @@ interface GroupedNodesComponentProps {
9296
databaseFullPath?: string;
9397
scrollContainerRef: React.RefObject<HTMLElement>;
9498
withPeerRoleFilter?: boolean;
95-
columns: Column<NodesPreparedEntity>[];
99+
columns: NodesColumn[];
96100
defaultColumnsIds: NodesColumnId[];
97101
requiredColumnsIds: NodesColumnId[];
98102
selectedColumnsKey: string;
99103
groupByParams: NodesGroupByField[];
104+
onDataFetched?: (data: PaginatedTableData<PreparedStorageNode>) => void;
100105
}
101106

102107
export function GroupedNodesComponent({
@@ -110,6 +115,7 @@ export function GroupedNodesComponent({
110115
requiredColumnsIds,
111116
selectedColumnsKey,
112117
groupByParams,
118+
onDataFetched,
113119
}: GroupedNodesComponentProps) {
114120
const {searchValue, peerRoleFilter, groupByParam} = useNodesPageQueryParams(
115121
groupByParams,
@@ -147,11 +153,7 @@ export function GroupedNodesComponent({
147153
);
148154

149155
const isLoading = currentData === undefined && isFetching;
150-
const {
151-
NodeGroups: tableGroups,
152-
FoundNodes: found = 0,
153-
TotalNodes: total = 0,
154-
} = currentData || {};
156+
const {tableGroups, found = 0, total = 0} = currentData || {};
155157

156158
const {expandedGroups, setIsGroupExpanded} = useExpandedGroups(tableGroups);
157159

@@ -186,6 +188,7 @@ export function GroupedNodesComponent({
186188
columns={columnsToShow}
187189
scrollContainerRef={scrollContainerRef}
188190
onIsExpandedChange={setIsGroupExpanded}
191+
onDataFetched={onDataFetched}
189192
/>
190193
);
191194
});

src/containers/Nodes/PaginatedNodes/NodesComponent.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import React from 'react';
22

3-
import type {Column} from '../../../components/PaginatedTable';
3+
import type {PaginatedTableData} from '../../../components/PaginatedTable';
44
import {PaginatedTableWithLayout} from '../../../components/PaginatedTable/PaginatedTableWithLayout';
55
import {TableColumnSetup} from '../../../components/TableColumnSetup/TableColumnSetup';
66
import {NODES_COLUMNS_TITLES} from '../../../components/nodesColumns/constants';
77
import type {NodesColumnId} from '../../../components/nodesColumns/constants';
8+
import type {NodesColumn} from '../../../components/nodesColumns/types';
89
import {useViewerNodesHandlerHasGrouping} from '../../../store/reducers/capabilities/hooks';
9-
import type {NodesPreparedEntity} from '../../../store/reducers/nodes/types';
1010
import {useProblemFilter} from '../../../store/reducers/settings/hooks';
11+
import type {PreparedStorageNode} from '../../../store/reducers/storage/types';
1112
import type {NodesGroupByField} from '../../../types/api/nodes';
1213
import {useSelectedColumns} from '../../../utils/hooks/useSelectedColumns';
1314
import {NodesTable} from '../NodesTable';
@@ -21,11 +22,12 @@ interface NodesComponentProps {
2122
databaseFullPath?: string;
2223
scrollContainerRef: React.RefObject<HTMLElement>;
2324
withPeerRoleFilter?: boolean;
24-
columns: Column<NodesPreparedEntity>[];
25+
columns: NodesColumn[];
2526
defaultColumnsIds: NodesColumnId[];
2627
requiredColumnsIds: NodesColumnId[];
2728
selectedColumnsKey: string;
2829
groupByParams: NodesGroupByField[];
30+
onDataFetched?: (data: PaginatedTableData<PreparedStorageNode>) => void;
2931
}
3032

3133
export function NodesComponent({
@@ -39,6 +41,7 @@ export function NodesComponent({
3941
requiredColumnsIds,
4042
selectedColumnsKey,
4143
groupByParams,
44+
onDataFetched,
4245
}: NodesComponentProps) {
4346
const {searchValue, uptimeFilter, peerRoleFilter} = useNodesPageQueryParams(
4447
groupByParams,
@@ -83,6 +86,7 @@ export function NodesComponent({
8386
peerRoleFilter={peerRoleFilter}
8487
columns={columnsToShow}
8588
scrollContainerRef={scrollContainerRef}
89+
onDataFetched={onDataFetched}
8690
/>
8791
}
8892
tableWrapperProps={{

src/containers/Nodes/PaginatedNodes/PaginatedNodes.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import React from 'react';
22

33
import {LoaderWrapper} from '../../../components/LoaderWrapper/LoaderWrapper';
4-
import type {Column} from '../../../components/PaginatedTable';
4+
import type {PaginatedTableData} from '../../../components/PaginatedTable';
55
import type {NodesColumnId} from '../../../components/nodesColumns/constants';
6+
import type {NodesColumn} from '../../../components/nodesColumns/types';
67
import {
78
useCapabilitiesLoaded,
89
useViewerNodesHandlerHasGrouping,
910
} from '../../../store/reducers/capabilities/hooks';
10-
import type {NodesPreparedEntity} from '../../../store/reducers/nodes/types';
1111
import {useProblemFilter} from '../../../store/reducers/settings/hooks';
12+
import type {PreparedStorageNode} from '../../../store/reducers/storage/types';
1213
import type {NodesGroupByField} from '../../../types/api/nodes';
1314
import {NodesUptimeFilterValues} from '../../../utils/nodes';
1415
import {useNodesPageQueryParams} from '../useNodesPageQueryParams';
@@ -24,11 +25,12 @@ export interface PaginatedNodesProps {
2425
database?: string;
2526
scrollContainerRef: React.RefObject<HTMLElement>;
2627
withPeerRoleFilter?: boolean;
27-
columns: Column<NodesPreparedEntity>[];
28+
columns: NodesColumn[];
2829
defaultColumnsIds: NodesColumnId[];
2930
requiredColumnsIds: NodesColumnId[];
3031
selectedColumnsKey: string;
3132
groupByParams: NodesGroupByField[];
33+
onDataFetched?: (data: PaginatedTableData<PreparedStorageNode>) => void;
3234
}
3335

3436
export function PaginatedNodes(props: PaginatedNodesProps) {

src/containers/Nodes/columns/columns.tsx

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,26 +15,26 @@ import {
1515
getVersionColumn,
1616
} from '../../../components/nodesColumns/columns';
1717
import {isSortableNodesColumn} from '../../../components/nodesColumns/constants';
18-
import type {GetNodesColumnsParams} from '../../../components/nodesColumns/types';
19-
import type {NodesPreparedEntity} from '../../../store/reducers/nodes/types';
20-
import type {Column} from '../../../utils/tableUtils/types';
18+
import type {GetNodesColumnsParams, NodesColumn} from '../../../components/nodesColumns/types';
19+
import {getPDisksColumn} from '../../Storage/PaginatedStorageNodesTable/columns/columns';
2120

22-
export function getNodesColumns(params: GetNodesColumnsParams): Column<NodesPreparedEntity>[] {
23-
const columns = [
24-
getNodeIdColumn<NodesPreparedEntity>(),
25-
getHostColumn<NodesPreparedEntity>(params),
26-
getNodeNameColumn<NodesPreparedEntity>(),
27-
getDataCenterColumn<NodesPreparedEntity>(),
28-
getPileNameColumn<NodesPreparedEntity>(),
29-
getRackColumn<NodesPreparedEntity>(),
30-
getUptimeColumn<NodesPreparedEntity>(),
31-
getCpuColumn<NodesPreparedEntity>(),
32-
getPoolsColumn<NodesPreparedEntity>(),
33-
getRAMColumn<NodesPreparedEntity>(),
34-
getMemoryColumn<NodesPreparedEntity>(),
35-
getLoadAverageColumn<NodesPreparedEntity>(),
36-
getVersionColumn<NodesPreparedEntity>(),
37-
getTabletsColumn<NodesPreparedEntity>(params),
21+
export function getNodesColumns(params: GetNodesColumnsParams): NodesColumn[] {
22+
const columns: NodesColumn[] = [
23+
getNodeIdColumn(),
24+
getHostColumn(params),
25+
getNodeNameColumn(),
26+
getDataCenterColumn(),
27+
getPileNameColumn(),
28+
getRackColumn(),
29+
getUptimeColumn(),
30+
getCpuColumn(),
31+
getPoolsColumn(),
32+
getRAMColumn(),
33+
getMemoryColumn(),
34+
getLoadAverageColumn(),
35+
getVersionColumn(),
36+
getPDisksColumn(params),
37+
getTabletsColumn(params),
3838
];
3939

4040
return columns.map((column) => {

0 commit comments

Comments
 (0)