Skip to content

Commit ca96ba7

Browse files
refactor: rework columns group by and sorting
1 parent 9e4dd7e commit ca96ba7

File tree

15 files changed

+225
-127
lines changed

15 files changed

+225
-127
lines changed

src/components/nodesColumns/constants.ts

Lines changed: 84 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type {NodesRequiredField} from '../../types/api/nodes';
1+
import type {NodesGroupByField, NodesRequiredField, NodesSortValue} from '../../types/api/nodes';
22
import type {ValueOf} from '../../types/common';
33

44
import i18n from './i18n';
@@ -7,7 +7,6 @@ export const NODES_COLUMNS_WIDTH_LS_KEY = 'nodesTableColumnsWidth';
77

88
export const NODES_COLUMNS_IDS = {
99
NodeId: 'NodeId',
10-
SystemState: 'SystemState',
1110
Host: 'Host',
1211
Database: 'Database',
1312
NodeName: 'NodeName',
@@ -37,9 +36,6 @@ export const NODES_COLUMNS_TITLES = {
3736
get NodeId() {
3837
return i18n('node-id');
3938
},
40-
get SystemState() {
41-
return i18n('system-state');
42-
},
4339
get Host() {
4440
return i18n('host');
4541
},
@@ -99,11 +95,62 @@ export const NODES_COLUMNS_TITLES = {
9995
},
10096
} as const satisfies Record<NodesColumnId, string>;
10197

98+
const NODES_COLUMNS_GROUP_BY_TITLES = {
99+
get NodeId() {
100+
return i18n('node-id');
101+
},
102+
get Host() {
103+
return i18n('host');
104+
},
105+
get NodeName() {
106+
return i18n('node-name');
107+
},
108+
get Database() {
109+
return i18n('database');
110+
},
111+
get DiskSpaceUsage() {
112+
return i18n('disk-usage');
113+
},
114+
get DC() {
115+
return i18n('dc');
116+
},
117+
get Rack() {
118+
return i18n('rack');
119+
},
120+
get Missing() {
121+
return i18n('missing');
122+
},
123+
get Uptime() {
124+
return i18n('uptime');
125+
},
126+
get Version() {
127+
return i18n('version');
128+
},
129+
get SystemState() {
130+
return i18n('system-state');
131+
},
132+
get ConnectStatus() {
133+
return i18n('connect-status');
134+
},
135+
get NetworkUtilization() {
136+
return i18n('network-utilization');
137+
},
138+
get ClockSkew() {
139+
return i18n('clock-skew');
140+
},
141+
get PingTime() {
142+
return i18n('ping-time');
143+
},
144+
} as const satisfies Record<NodesGroupByField, string>;
145+
146+
export function getNodesGroupByFieldTitle(groupByField: NodesGroupByField) {
147+
return NODES_COLUMNS_GROUP_BY_TITLES[groupByField];
148+
}
149+
102150
// Although columns ids mostly similar to backend fields, there might be some difference
103151
// Also for some columns we may use more than one field
104152
export const NODES_COLUMNS_TO_DATA_FIELDS: Record<NodesColumnId, NodesRequiredField[]> = {
105153
NodeId: ['NodeId'],
106-
SystemState: ['SystemState'],
107154
Host: ['Host', 'Rack', 'Database', 'SystemState'],
108155
Database: ['Database'],
109156
NodeName: ['NodeName'],
@@ -124,3 +171,34 @@ export const NODES_COLUMNS_TO_DATA_FIELDS: Record<NodesColumnId, NodesRequiredFi
124171
Tablets: ['Tablets', 'Database'],
125172
PDisks: ['PDisks'],
126173
};
174+
175+
const NODES_COLUMNS_TO_SORT_FIELDS: Record<NodesColumnId, NodesSortValue | undefined> = {
176+
NodeId: 'NodeId',
177+
Host: 'Host',
178+
Database: 'Database',
179+
NodeName: 'NodeName',
180+
DC: 'DC',
181+
Rack: 'Rack',
182+
Version: 'Version',
183+
Uptime: 'Uptime',
184+
Memory: 'Memory',
185+
RAM: 'Memory',
186+
CPU: 'CPU',
187+
Pools: 'CPU',
188+
LoadAverage: 'LoadAverage',
189+
Load: 'LoadAverage',
190+
DiskSpaceUsage: 'DiskSpaceUsage',
191+
SharedCacheUsage: undefined,
192+
TotalSessions: undefined,
193+
Missing: 'Missing',
194+
Tablets: undefined,
195+
PDisks: undefined,
196+
};
197+
198+
export function getNodesColumnSortField(columnId?: string) {
199+
return NODES_COLUMNS_TO_SORT_FIELDS[columnId as NodesColumnId];
200+
}
201+
202+
export function isSortableNodesColumn(columnId: string) {
203+
return Boolean(getNodesColumnSortField(columnId));
204+
}

src/components/nodesColumns/i18n/en.json

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
{
22
"node-id": "Node ID",
3-
"system-state": "System State",
43
"host": "Host",
54
"database": "Database",
65
"node-name": "Node Name",
@@ -12,14 +11,21 @@
1211
"ram": "RAM",
1312
"cpu": "CPU",
1413
"pools": "Pools",
15-
"disk-usage": "Disk usage",
14+
"disk-usage": "Disk Usage",
1615
"tablets": "Tablets",
1716
"load-average": "Load Average",
1817
"load": "Load",
1918
"caches": "Caches",
2019
"sessions": "Sessions",
2120
"missing": "Missing",
2221
"pdisks": "PDisks",
22+
2323
"field_memory-used": "Memory used",
24-
"field_memory-limit": "Memory limit"
24+
"field_memory-limit": "Memory limit",
25+
26+
"system-state": "System State",
27+
"connect-status": "Connect Status",
28+
"network-utilization": "Network Utilization",
29+
"clock-skew": "Clock Skew",
30+
"ping-time": "Ping Time"
2531
}

src/containers/Nodes/columns/columns.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ import {
1313
getUptimeColumn,
1414
getVersionColumn,
1515
} from '../../../components/nodesColumns/columns';
16+
import {isSortableNodesColumn} from '../../../components/nodesColumns/constants';
1617
import type {GetNodesColumnsParams} from '../../../components/nodesColumns/types';
1718
import type {NodesPreparedEntity} from '../../../store/reducers/nodes/types';
18-
import {isSortableNodesProperty} from '../../../utils/nodes';
1919
import type {Column} from '../../../utils/tableUtils/types';
2020

2121
export function getNodesColumns(params: GetNodesColumnsParams): Column<NodesPreparedEntity>[] {
@@ -36,6 +36,6 @@ export function getNodesColumns(params: GetNodesColumnsParams): Column<NodesPrep
3636
];
3737

3838
return columns.map((column) => {
39-
return {...column, sortable: isSortableNodesProperty(column.name)};
39+
return {...column, sortable: isSortableNodesColumn(column.name)};
4040
});
4141
}

src/containers/Nodes/columns/constants.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type {SelectOption} from '@gravity-ui/uikit';
22

3-
import {NODES_COLUMNS_TITLES} from '../../../components/nodesColumns/constants';
3+
import {getNodesGroupByFieldTitle} from '../../../components/nodesColumns/constants';
44
import type {NodesColumnId} from '../../../components/nodesColumns/constants';
55
import type {NodesGroupByField} from '../../../types/api/nodes';
66

@@ -43,7 +43,7 @@ export function getNodesGroupByOptions(withSystemStateGroupBy?: boolean): Select
4343
return getAvailableNodesGroupByParams(withSystemStateGroupBy).map((param) => {
4444
return {
4545
value: param,
46-
content: NODES_COLUMNS_TITLES[param],
46+
content: getNodesGroupByFieldTitle(param),
4747
};
4848
});
4949
}

src/containers/Nodes/getNodes.ts

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
import type {FetchData} from '../../components/PaginatedTable';
2-
import {NODES_COLUMNS_TO_DATA_FIELDS} from '../../components/nodesColumns/constants';
2+
import {
3+
NODES_COLUMNS_TO_DATA_FIELDS,
4+
getNodesColumnSortField,
5+
} from '../../components/nodesColumns/constants';
36
import type {NodesFilters, NodesPreparedEntity} from '../../store/reducers/nodes/types';
47
import {prepareNodesData} from '../../store/reducers/nodes/utils';
58
import type {NodesRequestParams} from '../../types/api/nodes';
69
import {prepareSortValue} from '../../utils/filters';
7-
import {
8-
NODES_SORT_VALUE_TO_FIELD,
9-
getProblemParamValue,
10-
getUptimeParamValue,
11-
isSortableNodesProperty,
12-
} from '../../utils/nodes';
10+
import {getProblemParamValue, getUptimeParamValue} from '../../utils/nodes';
1311
import {getRequiredDataFields} from '../../utils/tableUtils/getRequiredDataFields';
1412

1513
export const getNodes: FetchData<
@@ -32,9 +30,8 @@ export const getNodes: FetchData<
3230
const {path, database, searchValue, problemFilter, uptimeFilter, filterGroup, filterGroupBy} =
3331
filters ?? {};
3432

35-
const sort = isSortableNodesProperty(columnId)
36-
? prepareSortValue(NODES_SORT_VALUE_TO_FIELD[columnId], sortOrder)
37-
: undefined;
33+
const sortField = getNodesColumnSortField(columnId);
34+
const sort = sortField ? prepareSortValue(sortField, sortOrder) : undefined;
3835

3936
const dataFieldsRequired = getRequiredDataFields(columnsIds, NODES_COLUMNS_TO_DATA_FIELDS);
4037

src/containers/Storage/StorageGroups/columns/columns.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,18 @@ import {valueIsDefined} from '../../../../utils';
1414
import {cn} from '../../../../utils/cn';
1515
import {EMPTY_DATA_PLACEHOLDER} from '../../../../utils/constants';
1616
import {formatNumber} from '../../../../utils/dataFormatters/dataFormatters';
17-
import {getSpaceUsageSeverity, isSortableStorageProperty} from '../../../../utils/storage';
17+
import {getSpaceUsageSeverity} from '../../../../utils/storage';
1818
import {formatToMs} from '../../../../utils/timeParsers';
1919
import {bytesToGB, bytesToSpeed} from '../../../../utils/utils';
2020
import {Disks} from '../../Disks/Disks';
2121
import {getDegradedSeverity, isVdiskActive} from '../../utils';
2222
import i18n from '../i18n';
2323

24-
import {STORAGE_GROUPS_COLUMNS_IDS, STORAGE_GROUPS_COLUMNS_TITLES} from './constants';
24+
import {
25+
STORAGE_GROUPS_COLUMNS_IDS,
26+
STORAGE_GROUPS_COLUMNS_TITLES,
27+
isSortableStorageGroupsColumn,
28+
} from './constants';
2529
import type {GetStorageColumnsData, StorageColumnsGetter, StorageGroupsColumn} from './types';
2630

2731
import './StorageGroupsColumns.scss';
@@ -297,6 +301,6 @@ export const getStorageGroupsColumns: StorageColumnsGetter = (data) => {
297301

298302
return columns.map((column) => ({
299303
...column,
300-
sortable: isSortableStorageProperty(column.name),
304+
sortable: isSortableStorageGroupsColumn(column.name),
301305
}));
302306
};

src/containers/Storage/StorageGroups/columns/constants.ts

Lines changed: 67 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
import type {SelectOption} from '@gravity-ui/uikit';
22
import {z} from 'zod';
33

4-
import type {GroupsGroupByField, GroupsRequiredField} from '../../../../types/api/storage';
4+
import type {
5+
GroupsGroupByField,
6+
GroupsRequiredField,
7+
StorageV2SortValue,
8+
} from '../../../../types/api/storage';
59
import type {ValueOf} from '../../../../types/common';
610

711
import i18n from './i18n';
@@ -13,7 +17,6 @@ export const STORAGE_GROUPS_COLUMNS_IDS = {
1317
GroupId: 'GroupId',
1418
PoolName: 'PoolName',
1519
MediaType: 'MediaType',
16-
Encryption: 'Encryption',
1720
Erasure: 'Erasure',
1821
Used: 'Used',
1922
Limit: 'Limit',
@@ -26,9 +29,7 @@ export const STORAGE_GROUPS_COLUMNS_IDS = {
2629
AllocationUnits: 'AllocationUnits',
2730
VDisks: 'VDisks',
2831
VDisksPDisks: 'VDisksPDisks',
29-
MissingDisks: 'MissingDisks',
3032
Degraded: 'Degraded',
31-
State: 'State',
3233
} as const;
3334

3435
export type StorageGroupsColumnId = ValueOf<typeof STORAGE_GROUPS_COLUMNS_IDS>;
@@ -57,9 +58,6 @@ export const STORAGE_GROUPS_COLUMNS_TITLES = {
5758
get MediaType() {
5859
return i18n('type');
5960
},
60-
get Encryption() {
61-
return i18n('encryption');
62-
},
6361
get Erasure() {
6462
return i18n('erasure');
6563
},
@@ -102,13 +100,43 @@ export const STORAGE_GROUPS_COLUMNS_TITLES = {
102100
get Degraded() {
103101
return i18n('missing-disks');
104102
},
103+
} as const satisfies Record<StorageGroupsColumnId, string>;
104+
105+
const STORAGE_GROUPS_COLUMNS_GROUP_BY_TITLES = {
106+
get GroupId() {
107+
return i18n('group-id');
108+
},
109+
get Erasure() {
110+
return i18n('erasure');
111+
},
112+
get Usage() {
113+
return i18n('usage');
114+
},
115+
get DiskSpaceUsage() {
116+
return i18n('disk-usage');
117+
},
118+
get PoolName() {
119+
return i18n('pool-name');
120+
},
121+
get Kind() {
122+
return i18n('type');
123+
},
124+
get Encryption() {
125+
return i18n('encryption');
126+
},
127+
get MediaType() {
128+
return i18n('type');
129+
},
105130
get MissingDisks() {
106131
return i18n('missing-disks');
107132
},
108133
get State() {
109134
return i18n('state');
110135
},
111-
} as const satisfies Record<StorageGroupsColumnId, string>;
136+
get Latency() {
137+
return i18n('latency');
138+
},
139+
} as const satisfies Record<GroupsGroupByField, string>;
112140

113141
const STORAGE_GROUPS_GROUP_BY_PARAMS = [
114142
'PoolName',
@@ -126,7 +154,7 @@ export const STORAGE_GROUPS_GROUP_BY_OPTIONS: SelectOption[] = STORAGE_GROUPS_GR
126154
(param) => {
127155
return {
128156
value: param,
129-
content: STORAGE_GROUPS_COLUMNS_TITLES[param],
157+
content: STORAGE_GROUPS_COLUMNS_GROUP_BY_TITLES[param],
130158
};
131159
},
132160
);
@@ -144,7 +172,6 @@ export const GROUPS_COLUMNS_TO_DATA_FIELDS: Record<StorageGroupsColumnId, Groups
144172
PoolName: ['PoolName'],
145173
// We display MediaType and Encryption in one Type column
146174
MediaType: ['MediaType', 'Encryption'],
147-
Encryption: ['Encryption'],
148175
Erasure: ['Erasure'],
149176
Used: ['Used'],
150177
Limit: ['Limit'],
@@ -158,7 +185,35 @@ export const GROUPS_COLUMNS_TO_DATA_FIELDS: Record<StorageGroupsColumnId, Groups
158185
// Read and Write fields make backend to return Whiteboard data
159186
VDisks: ['VDisk', 'PDisk', 'Read', 'Write'],
160187
VDisksPDisks: ['VDisk', 'PDisk', 'Read', 'Write'],
161-
MissingDisks: ['MissingDisks'],
162188
Degraded: ['MissingDisks'],
163-
State: ['State'],
164189
};
190+
191+
const STORAGE_GROUPS_COLUMNS_TO_SORT_FIELDS: Record<
192+
StorageGroupsColumnId,
193+
StorageV2SortValue | undefined
194+
> = {
195+
GroupId: 'GroupId',
196+
PoolName: 'PoolName',
197+
MediaType: 'MediaType',
198+
Erasure: 'Erasure',
199+
Used: 'Used',
200+
Limit: 'Limit',
201+
Usage: 'Usage',
202+
DiskSpaceUsage: 'DiskSpaceUsage',
203+
DiskSpace: undefined,
204+
Read: 'Read',
205+
Write: 'Write',
206+
Latency: 'Latency',
207+
AllocationUnits: 'AllocationUnits',
208+
VDisks: undefined,
209+
VDisksPDisks: undefined,
210+
Degraded: 'Degraded',
211+
};
212+
213+
export function getStorageGroupsColumnSortField(columnId?: string) {
214+
return STORAGE_GROUPS_COLUMNS_TO_SORT_FIELDS[columnId as StorageGroupsColumnId];
215+
}
216+
217+
export function isSortableStorageGroupsColumn(columnId: string) {
218+
return Boolean(getStorageGroupsColumnSortField(columnId));
219+
}

0 commit comments

Comments
 (0)