Skip to content

Commit c9ec3b7

Browse files
feat(Nodes): add columns setup (#1320)
1 parent a987c76 commit c9ec3b7

File tree

5 files changed

+78
-25
lines changed

5 files changed

+78
-25
lines changed

src/containers/Nodes/Nodes.tsx

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

33
import {ASCENDING} from '@gravity-ui/react-data-table/build/esm/lib/constants';
4+
import {TableColumnSetup} from '@gravity-ui/uikit';
45
import {StringParam, useQueryParams} from 'use-query-params';
56

67
import {EntitiesCount} from '../../components/EntitiesCount';
@@ -33,13 +34,12 @@ import {
3334
} from '../../utils/hooks';
3435
import {
3536
NodesUptimeFilterValues,
36-
isSortableNodesProperty,
3737
isUnavailableNode,
3838
nodesUptimeFilterValuesSchema,
3939
} from '../../utils/nodes';
4040

41-
import {getNodesColumns} from './columns/columns';
4241
import {NODES_COLUMNS_WIDTH_LS_KEY} from './columns/constants';
42+
import {useNodesSelectedColumns} from './columns/hooks';
4343
import i18n from './i18n';
4444

4545
import './Nodes.scss';
@@ -65,6 +65,11 @@ export const Nodes = ({path, database, additionalNodesProps = {}}: NodesProps) =
6565
const problemFilter = useTypedSelector(selectProblemFilter);
6666
const [autoRefreshInterval] = useAutoRefreshInterval();
6767

68+
const {columnsToShow, columnsToSelect, setColumns} = useNodesSelectedColumns({
69+
getNodeRef: additionalNodesProps.getNodeRef,
70+
database,
71+
});
72+
6873
const {
6974
currentData: data,
7075
isLoading,
@@ -114,20 +119,18 @@ export const Nodes = ({path, database, additionalNodesProps = {}}: NodesProps) =
114119
label={'Nodes'}
115120
loading={isLoading}
116121
/>
122+
<TableColumnSetup
123+
popupWidth={200}
124+
items={columnsToSelect}
125+
showStatus
126+
onUpdate={setColumns}
127+
sortable={false}
128+
/>
117129
</React.Fragment>
118130
);
119131
};
120132

121133
const renderTable = () => {
122-
const rawColumns = getNodesColumns({
123-
getNodeRef: additionalNodesProps.getNodeRef,
124-
database,
125-
});
126-
127-
const columns = rawColumns.map((column) => {
128-
return {...column, sortable: isSortableNodesProperty(column.name)};
129-
});
130-
131134
if (nodes.length === 0) {
132135
if (
133136
problemFilter !== ProblemFilterValues.ALL ||
@@ -141,7 +144,7 @@ export const Nodes = ({path, database, additionalNodesProps = {}}: NodesProps) =
141144
<ResizeableDataTable
142145
columnsWidthLSKey={NODES_COLUMNS_WIDTH_LS_KEY}
143146
data={nodes || []}
144-
columns={columns}
147+
columns={columnsToShow}
145148
settings={DEFAULT_TABLE_SETTINGS}
146149
sortOrder={sort}
147150
onSort={handleSort}

src/containers/Nodes/PaginatedNodes.tsx

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

3+
import {TableColumnSetup} from '@gravity-ui/uikit';
34
import {StringParam, useQueryParams} from 'use-query-params';
45

56
import {EntitiesCount} from '../../components/EntitiesCount';
@@ -27,13 +28,12 @@ import {cn} from '../../utils/cn';
2728
import {useTypedDispatch, useTypedSelector} from '../../utils/hooks';
2829
import {
2930
NodesUptimeFilterValues,
30-
isSortableNodesProperty,
3131
isUnavailableNode,
3232
nodesUptimeFilterValuesSchema,
3333
} from '../../utils/nodes';
3434

35-
import {getNodesColumns} from './columns/columns';
3635
import {NODES_COLUMNS_WIDTH_LS_KEY} from './columns/constants';
36+
import {useNodesSelectedColumns} from './columns/hooks';
3737
import {getNodes} from './getNodes';
3838
import i18n from './i18n';
3939

@@ -69,6 +69,11 @@ export const PaginatedNodes = ({
6969
return {path, database, searchValue, problemFilter, uptimeFilter};
7070
}, [path, database, searchValue, problemFilter, uptimeFilter]);
7171

72+
const {columnsToShow, columnsToSelect, setColumns} = useNodesSelectedColumns({
73+
getNodeRef: additionalNodesProps?.getNodeRef,
74+
database,
75+
});
76+
7277
const getRowClassName: GetRowClassName<NodesPreparedEntity> = (row) => {
7378
return b('node', {unavailable: isUnavailableNode(row)});
7479
};
@@ -102,6 +107,13 @@ export const PaginatedNodes = ({
102107
label={'Nodes'}
103108
loading={!inited}
104109
/>
110+
<TableColumnSetup
111+
popupWidth={200}
112+
items={columnsToSelect}
113+
showStatus
114+
onUpdate={setColumns}
115+
sortable={false}
116+
/>
105117
</React.Fragment>
106118
);
107119
};
@@ -125,20 +137,11 @@ export const PaginatedNodes = ({
125137
return <ResponseError error={error} />;
126138
};
127139

128-
const rawColumns = getNodesColumns({
129-
getNodeRef: additionalNodesProps?.getNodeRef,
130-
database,
131-
});
132-
133-
const columns = rawColumns.map((column) => {
134-
return {...column, sortable: isSortableNodesProperty(column.name)};
135-
});
136-
137140
return (
138141
<ResizeablePaginatedTable
139142
columnsWidthLSKey={NODES_COLUMNS_WIDTH_LS_KEY}
140143
parentContainer={parentContainer}
141-
columns={columns}
144+
columns={columnsToShow}
142145
fetchData={getNodes}
143146
limit={50}
144147
renderControls={renderControls}

src/containers/Nodes/columns/columns.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {getLoadSeverityForNode} from '../../../store/reducers/nodes/utils';
1212
import type {GetNodeRefFunc} from '../../../types/additionalProps';
1313
import {EMPTY_DATA_PLACEHOLDER} from '../../../utils/constants';
1414
import {formatStorageValuesToGb} from '../../../utils/dataFormatters/dataFormatters';
15+
import {isSortableNodesProperty} from '../../../utils/nodes';
1516

1617
import {NODES_COLUMNS_IDS, NODES_COLUMNS_TITLES} from './constants';
1718
import type {GetNodesColumnsProps, NodesColumn} from './types';
@@ -213,7 +214,7 @@ const sessionsColumn: NodesColumn = {
213214
};
214215

215216
export function getNodesColumns({database, getNodeRef}: GetNodesColumnsProps): NodesColumn[] {
216-
return [
217+
const columns = [
217218
nodeIdColumn,
218219
getHostColumn(getNodeRef, database),
219220
dataCenterColumn,
@@ -225,6 +226,10 @@ export function getNodesColumns({database, getNodeRef}: GetNodesColumnsProps): N
225226
loadAverageColumn,
226227
getTabletsColumn(database),
227228
];
229+
230+
return columns.map((column) => {
231+
return {...column, sortable: isSortableNodesProperty(column.name)};
232+
});
228233
}
229234

230235
export function getTopNodesByLoadColumns(

src/containers/Nodes/columns/constants.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type {ValueOf} from '../../../types/common';
33
import i18n from './i18n';
44

55
export const NODES_COLUMNS_WIDTH_LS_KEY = 'nodesTableColumnsWidth';
6+
export const NODES_TABLE_SELECTED_COLUMNS_LS_KEY = 'nodesTableSelectedColumns';
67

78
export const NODES_COLUMNS_IDS = {
89
NodeId: 'NodeId',
@@ -23,6 +24,21 @@ export const NODES_COLUMNS_IDS = {
2324

2425
type NodesColumnId = ValueOf<typeof NODES_COLUMNS_IDS>;
2526

27+
export const DEFAULT_NODES_COLUMNS: NodesColumnId[] = [
28+
'NodeId',
29+
'Host',
30+
'DC',
31+
'Rack',
32+
'Version',
33+
'Uptime',
34+
'Memory',
35+
'CPU',
36+
'LoadAverage',
37+
'Tablets',
38+
];
39+
40+
export const REQUIRED_NODES_COLUMNS: NodesColumnId[] = ['NodeId'];
41+
2642
// This code is running when module is initialized and correct language may not be set yet
2743
// get functions guarantee that i18n fields will be inited on render with current render language
2844
export const NODES_COLUMNS_TITLES = {
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import React from 'react';
2+
3+
import {useSelectedColumns} from '../../../utils/hooks/useSelectedColumns';
4+
5+
import {getNodesColumns} from './columns';
6+
import {
7+
DEFAULT_NODES_COLUMNS,
8+
NODES_COLUMNS_TITLES,
9+
NODES_TABLE_SELECTED_COLUMNS_LS_KEY,
10+
REQUIRED_NODES_COLUMNS,
11+
} from './constants';
12+
import type {GetNodesColumnsProps} from './types';
13+
14+
export function useNodesSelectedColumns(params: GetNodesColumnsProps) {
15+
const columns = React.useMemo(() => {
16+
return getNodesColumns(params);
17+
}, [params]);
18+
19+
return useSelectedColumns(
20+
columns,
21+
NODES_TABLE_SELECTED_COLUMNS_LS_KEY,
22+
NODES_COLUMNS_TITLES,
23+
DEFAULT_NODES_COLUMNS,
24+
REQUIRED_NODES_COLUMNS,
25+
);
26+
}

0 commit comments

Comments
 (0)