ydb-embedded-ui 4.20.3 → 4.21.0
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.md +14 -0
- package/dist/components/EmptyState/EmptyState.scss +0 -1
- package/dist/components/ProgressViewer/ProgressViewer.scss +1 -0
- package/dist/components/TableWithControlsLayout/TableWithControlsLayout.scss +4 -0
- package/dist/components/VirtualTable/TableChunk.tsx +84 -0
- package/dist/components/VirtualTable/TableHead.tsx +139 -0
- package/dist/components/VirtualTable/TableRow.tsx +91 -0
- package/dist/components/VirtualTable/VirtualTable.scss +146 -0
- package/dist/components/VirtualTable/VirtualTable.tsx +277 -0
- package/dist/components/VirtualTable/constants.ts +17 -0
- package/dist/components/VirtualTable/i18n/en.json +3 -0
- package/dist/components/VirtualTable/i18n/index.ts +11 -0
- package/dist/components/VirtualTable/i18n/ru.json +3 -0
- package/dist/components/VirtualTable/index.ts +3 -0
- package/dist/components/VirtualTable/reducer.ts +143 -0
- package/dist/components/VirtualTable/shared.ts +3 -0
- package/dist/components/VirtualTable/types.ts +60 -0
- package/dist/components/VirtualTable/useIntersectionObserver.ts +42 -0
- package/dist/components/VirtualTable/utils.ts +3 -0
- package/dist/containers/App/App.scss +2 -1
- package/dist/containers/Cluster/Cluster.tsx +17 -4
- package/dist/containers/Nodes/Nodes.tsx +4 -20
- package/dist/containers/Nodes/VirtualNodes.tsx +146 -0
- package/dist/containers/Nodes/getNodes.ts +26 -0
- package/dist/containers/Nodes/getNodesColumns.tsx +49 -39
- package/dist/containers/UserSettings/i18n/en.json +2 -2
- package/dist/containers/UserSettings/i18n/ru.json +2 -2
- package/dist/store/reducers/storage/storage.ts +1 -1
- package/dist/utils/hooks/useNodesRequestParams.ts +4 -8
- package/dist/utils/nodes.ts +12 -0
- package/package.json +1 -1
@@ -19,13 +19,7 @@ import {TableWithControlsLayout} from '../../components/TableWithControlsLayout/
|
|
19
19
|
import {ResponseError} from '../../components/Errors/ResponseError';
|
20
20
|
|
21
21
|
import {DEFAULT_TABLE_SETTINGS, USE_NODES_ENDPOINT_IN_DIAGNOSTICS_KEY} from '../../utils/constants';
|
22
|
-
import {
|
23
|
-
useAutofetcher,
|
24
|
-
useSetting,
|
25
|
-
useTypedSelector,
|
26
|
-
useNodesRequestParams,
|
27
|
-
useTableSort,
|
28
|
-
} from '../../utils/hooks';
|
22
|
+
import {useAutofetcher, useSetting, useTypedSelector, useTableSort} from '../../utils/hooks';
|
29
23
|
import {
|
30
24
|
isSortableNodesProperty,
|
31
25
|
isUnavailableNode,
|
@@ -90,31 +84,21 @@ export const Nodes = ({path, type, additionalNodesProps = {}}: NodesProps) => {
|
|
90
84
|
|
91
85
|
const [useNodesEndpoint] = useSetting(USE_NODES_ENDPOINT_IN_DIAGNOSTICS_KEY);
|
92
86
|
|
93
|
-
const requestParams = useNodesRequestParams({
|
94
|
-
filter: searchValue,
|
95
|
-
problemFilter,
|
96
|
-
nodesUptimeFilter,
|
97
|
-
sortOrder,
|
98
|
-
sortValue,
|
99
|
-
});
|
100
|
-
|
101
87
|
const fetchNodes = useCallback(
|
102
88
|
(isBackground) => {
|
103
89
|
if (!isBackground) {
|
104
90
|
dispatch(setDataWasNotLoaded());
|
105
91
|
}
|
106
92
|
|
107
|
-
const params = requestParams || {};
|
108
|
-
|
109
93
|
// For not DB entities we always use /compute endpoint instead of /nodes
|
110
94
|
// since /nodes can return data only for tenants
|
111
95
|
if (path && (!useNodesEndpoint || !isDatabaseEntityType(type))) {
|
112
|
-
dispatch(getComputeNodes({path
|
96
|
+
dispatch(getComputeNodes({path}));
|
113
97
|
} else {
|
114
|
-
dispatch(getNodes({tenant: path
|
98
|
+
dispatch(getNodes({tenant: path}));
|
115
99
|
}
|
116
100
|
},
|
117
|
-
[dispatch, path, type, useNodesEndpoint
|
101
|
+
[dispatch, path, type, useNodesEndpoint],
|
118
102
|
);
|
119
103
|
|
120
104
|
useAutofetcher(fetchNodes, [fetchNodes], isClusterNodes ? true : autorefresh);
|
@@ -0,0 +1,146 @@
|
|
1
|
+
import {useCallback, useMemo, useState} from 'react';
|
2
|
+
import cn from 'bem-cn-lite';
|
3
|
+
|
4
|
+
import type {AdditionalNodesProps} from '../../types/additionalProps';
|
5
|
+
import type {ProblemFilterValue} from '../../store/reducers/settings/types';
|
6
|
+
import type {NodesPreparedEntity} from '../../store/reducers/nodes/types';
|
7
|
+
import {ProblemFilterValues} from '../../store/reducers/settings/settings';
|
8
|
+
import {
|
9
|
+
NodesSortValue,
|
10
|
+
NodesUptimeFilterValues,
|
11
|
+
getProblemParamValue,
|
12
|
+
getUptimeParamValue,
|
13
|
+
isSortableNodesProperty,
|
14
|
+
isUnavailableNode,
|
15
|
+
} from '../../utils/nodes';
|
16
|
+
|
17
|
+
import {Search} from '../../components/Search';
|
18
|
+
import {ProblemFilter} from '../../components/ProblemFilter';
|
19
|
+
import {UptimeFilter} from '../../components/UptimeFIlter';
|
20
|
+
import {EntitiesCount} from '../../components/EntitiesCount';
|
21
|
+
import {AccessDenied} from '../../components/Errors/403';
|
22
|
+
import {ResponseError} from '../../components/Errors/ResponseError';
|
23
|
+
import {Illustration} from '../../components/Illustration';
|
24
|
+
import {
|
25
|
+
type FetchData,
|
26
|
+
type RenderControls,
|
27
|
+
type RenderErrorMessage,
|
28
|
+
VirtualTable,
|
29
|
+
GetRowClassName,
|
30
|
+
} from '../../components/VirtualTable';
|
31
|
+
|
32
|
+
import {getNodesColumns} from './getNodesColumns';
|
33
|
+
import {getNodes} from './getNodes';
|
34
|
+
import i18n from './i18n';
|
35
|
+
|
36
|
+
import './Nodes.scss';
|
37
|
+
|
38
|
+
const b = cn('ydb-nodes');
|
39
|
+
|
40
|
+
interface NodesProps {
|
41
|
+
parentContainer?: Element | null;
|
42
|
+
additionalNodesProps?: AdditionalNodesProps;
|
43
|
+
}
|
44
|
+
|
45
|
+
export const VirtualNodes = ({parentContainer, additionalNodesProps}: NodesProps) => {
|
46
|
+
const [searchValue, setSearchValue] = useState('');
|
47
|
+
const [problemFilter, setProblemFilter] = useState<ProblemFilterValue>(ProblemFilterValues.ALL);
|
48
|
+
const [uptimeFilter, setUptimeFilter] = useState<NodesUptimeFilterValues>(
|
49
|
+
NodesUptimeFilterValues.All,
|
50
|
+
);
|
51
|
+
|
52
|
+
const filters = useMemo(() => {
|
53
|
+
return [searchValue, problemFilter, uptimeFilter];
|
54
|
+
}, [searchValue, problemFilter, uptimeFilter]);
|
55
|
+
|
56
|
+
const fetchData = useCallback<FetchData<NodesPreparedEntity>>(
|
57
|
+
async (limit, offset, {sortOrder, columnId} = {}) => {
|
58
|
+
return await getNodes({
|
59
|
+
limit,
|
60
|
+
offset,
|
61
|
+
filter: searchValue,
|
62
|
+
problems_only: getProblemParamValue(problemFilter),
|
63
|
+
uptime: getUptimeParamValue(uptimeFilter),
|
64
|
+
sortOrder,
|
65
|
+
sortValue: columnId as NodesSortValue,
|
66
|
+
});
|
67
|
+
},
|
68
|
+
[problemFilter, searchValue, uptimeFilter],
|
69
|
+
);
|
70
|
+
|
71
|
+
const getRowClassName: GetRowClassName<NodesPreparedEntity> = (row) => {
|
72
|
+
return b('node', {unavailable: isUnavailableNode(row)});
|
73
|
+
};
|
74
|
+
|
75
|
+
const handleSearchQueryChange = (value: string) => {
|
76
|
+
setSearchValue(value);
|
77
|
+
};
|
78
|
+
const handleProblemFilterChange = (value: string) => {
|
79
|
+
setProblemFilter(value as ProblemFilterValue);
|
80
|
+
};
|
81
|
+
const handleUptimeFilterChange = (value: string) => {
|
82
|
+
setUptimeFilter(value as NodesUptimeFilterValues);
|
83
|
+
};
|
84
|
+
|
85
|
+
const renderControls: RenderControls = ({totalEntities, foundEntities, inited}) => {
|
86
|
+
return (
|
87
|
+
<>
|
88
|
+
<Search
|
89
|
+
onChange={handleSearchQueryChange}
|
90
|
+
placeholder="Host name"
|
91
|
+
className={b('search')}
|
92
|
+
value={searchValue}
|
93
|
+
/>
|
94
|
+
<ProblemFilter value={problemFilter} onChange={handleProblemFilterChange} />
|
95
|
+
<UptimeFilter value={uptimeFilter} onChange={handleUptimeFilterChange} />
|
96
|
+
<EntitiesCount
|
97
|
+
total={totalEntities}
|
98
|
+
current={foundEntities}
|
99
|
+
label={'Nodes'}
|
100
|
+
loading={!inited}
|
101
|
+
/>
|
102
|
+
</>
|
103
|
+
);
|
104
|
+
};
|
105
|
+
|
106
|
+
const renderEmptyDataMessage = () => {
|
107
|
+
if (
|
108
|
+
problemFilter !== ProblemFilterValues.ALL ||
|
109
|
+
uptimeFilter !== NodesUptimeFilterValues.All
|
110
|
+
) {
|
111
|
+
return <Illustration name="thumbsUp" width="200" />;
|
112
|
+
}
|
113
|
+
|
114
|
+
return i18n('empty.default');
|
115
|
+
};
|
116
|
+
|
117
|
+
const renderErrorMessage: RenderErrorMessage = (error) => {
|
118
|
+
if (error && error.status === 403) {
|
119
|
+
return <AccessDenied />;
|
120
|
+
}
|
121
|
+
|
122
|
+
return <ResponseError error={error} />;
|
123
|
+
};
|
124
|
+
|
125
|
+
const rawColumns = getNodesColumns({
|
126
|
+
getNodeRef: additionalNodesProps?.getNodeRef,
|
127
|
+
});
|
128
|
+
|
129
|
+
const columns = rawColumns.map((column) => {
|
130
|
+
return {...column, sortable: isSortableNodesProperty(column.name)};
|
131
|
+
});
|
132
|
+
|
133
|
+
return (
|
134
|
+
<VirtualTable
|
135
|
+
parentContainer={parentContainer}
|
136
|
+
columns={columns}
|
137
|
+
fetchData={fetchData}
|
138
|
+
limit={50}
|
139
|
+
renderControls={renderControls}
|
140
|
+
renderErrorMessage={renderErrorMessage}
|
141
|
+
renderEmptyDataMessage={renderEmptyDataMessage}
|
142
|
+
dependencyArray={filters}
|
143
|
+
getRowClassName={getRowClassName}
|
144
|
+
/>
|
145
|
+
);
|
146
|
+
};
|
@@ -0,0 +1,26 @@
|
|
1
|
+
import type {NodesApiRequestParams} from '../../store/reducers/nodes/types';
|
2
|
+
import {prepareNodesData} from '../../store/reducers/nodes/utils';
|
3
|
+
|
4
|
+
const getConcurrentId = (limit?: number, offset?: number) => {
|
5
|
+
return `getNodes|offset${offset}|limit${limit}`;
|
6
|
+
};
|
7
|
+
|
8
|
+
export const getNodes = async ({
|
9
|
+
type = 'any',
|
10
|
+
storage = false,
|
11
|
+
limit,
|
12
|
+
offset,
|
13
|
+
...params
|
14
|
+
}: NodesApiRequestParams) => {
|
15
|
+
const response = await window.api.getNodes(
|
16
|
+
{type, storage, limit, offset, ...params},
|
17
|
+
{concurrentId: getConcurrentId(limit, offset)},
|
18
|
+
);
|
19
|
+
const preparedResponse = prepareNodesData(response);
|
20
|
+
|
21
|
+
return {
|
22
|
+
data: preparedResponse.Nodes || [],
|
23
|
+
found: preparedResponse.FoundNodes || 0,
|
24
|
+
total: preparedResponse.TotalNodes || 0,
|
25
|
+
};
|
26
|
+
};
|
@@ -1,5 +1,6 @@
|
|
1
|
-
import DataTable, {type Column} from '@gravity-ui/react-data-table';
|
1
|
+
import DataTable, {type Column as DataTableColumn} from '@gravity-ui/react-data-table';
|
2
2
|
|
3
|
+
import type {Column as VirtualTableColumn} from '../../components/VirtualTable';
|
3
4
|
import {PoolsGraph} from '../../components/PoolsGraph/PoolsGraph';
|
4
5
|
import {ProgressViewer} from '../../components/ProgressViewer/ProgressViewer';
|
5
6
|
import {TabletsStatistic} from '../../components/TabletsStatistic';
|
@@ -34,46 +35,52 @@ interface GetNodesColumnsProps {
|
|
34
35
|
getNodeRef?: GetNodeRefFunc;
|
35
36
|
}
|
36
37
|
|
37
|
-
|
38
|
+
type NodesColumn = VirtualTableColumn<NodesPreparedEntity> & DataTableColumn<NodesPreparedEntity>;
|
39
|
+
|
40
|
+
const nodeIdColumn: NodesColumn = {
|
38
41
|
name: NODES_COLUMNS_IDS.NodeId,
|
39
42
|
header: '#',
|
40
|
-
width:
|
43
|
+
width: 80,
|
44
|
+
render: ({row}) => row.NodeId,
|
41
45
|
align: DataTable.RIGHT,
|
42
46
|
sortable: false,
|
43
47
|
};
|
44
48
|
|
45
|
-
const getHostColumn = (
|
46
|
-
getNodeRef?: GetNodeRefFunc,
|
47
|
-
fixedWidth = false,
|
48
|
-
): Column<NodesPreparedEntity> => ({
|
49
|
+
const getHostColumn = (getNodeRef?: GetNodeRefFunc): NodesColumn => ({
|
49
50
|
name: NODES_COLUMNS_IDS.Host,
|
50
51
|
render: ({row}) => {
|
51
52
|
return <NodeHostWrapper node={row} getNodeRef={getNodeRef} />;
|
52
53
|
},
|
53
|
-
width:
|
54
|
+
width: 350,
|
54
55
|
align: DataTable.LEFT,
|
55
56
|
sortable: false,
|
56
57
|
});
|
57
58
|
|
58
|
-
const
|
59
|
+
const getHostColumnWithUndefinedWidth = (
|
60
|
+
getNodeRef?: GetNodeRefFunc,
|
61
|
+
): DataTableColumn<NodesPreparedEntity> => {
|
62
|
+
return {...getHostColumn(getNodeRef), width: undefined};
|
63
|
+
};
|
64
|
+
|
65
|
+
const dataCenterColumn: NodesColumn = {
|
59
66
|
name: NODES_COLUMNS_IDS.DC,
|
60
67
|
header: 'DC',
|
61
68
|
align: DataTable.LEFT,
|
62
69
|
render: ({row}) => (row.DataCenter ? row.DataCenter : '—'),
|
63
|
-
width:
|
70
|
+
width: 60,
|
64
71
|
};
|
65
72
|
|
66
|
-
const rackColumn:
|
73
|
+
const rackColumn: NodesColumn = {
|
67
74
|
name: NODES_COLUMNS_IDS.Rack,
|
68
75
|
header: 'Rack',
|
69
76
|
align: DataTable.LEFT,
|
70
77
|
render: ({row}) => (row.Rack ? row.Rack : '—'),
|
71
|
-
width:
|
78
|
+
width: 80,
|
72
79
|
};
|
73
80
|
|
74
|
-
const versionColumn:
|
81
|
+
const versionColumn: NodesColumn = {
|
75
82
|
name: NODES_COLUMNS_IDS.Version,
|
76
|
-
width:
|
83
|
+
width: 200,
|
77
84
|
align: DataTable.LEFT,
|
78
85
|
render: ({row}) => {
|
79
86
|
return <CellWithPopover content={row.Version}>{row.Version}</CellWithPopover>;
|
@@ -81,16 +88,17 @@ const versionColumn: Column<NodesPreparedEntity> = {
|
|
81
88
|
sortable: false,
|
82
89
|
};
|
83
90
|
|
84
|
-
const uptimeColumn:
|
91
|
+
const uptimeColumn: NodesColumn = {
|
85
92
|
name: NODES_COLUMNS_IDS.Uptime,
|
86
93
|
header: 'Uptime',
|
87
94
|
sortAccessor: ({StartTime}) => StartTime && -StartTime,
|
95
|
+
render: ({row}) => row.Uptime,
|
88
96
|
align: DataTable.RIGHT,
|
89
|
-
width:
|
97
|
+
width: 110,
|
90
98
|
sortable: false,
|
91
99
|
};
|
92
100
|
|
93
|
-
const memoryColumn:
|
101
|
+
const memoryColumn: NodesColumn = {
|
94
102
|
name: NODES_COLUMNS_IDS.Memory,
|
95
103
|
header: 'Memory',
|
96
104
|
sortAccessor: ({MemoryUsed = 0}) => Number(MemoryUsed),
|
@@ -103,21 +111,21 @@ const memoryColumn: Column<NodesPreparedEntity> = {
|
|
103
111
|
}
|
104
112
|
},
|
105
113
|
align: DataTable.RIGHT,
|
106
|
-
width:
|
114
|
+
width: 120,
|
107
115
|
};
|
108
116
|
|
109
|
-
const cpuColumn:
|
117
|
+
const cpuColumn: NodesColumn = {
|
110
118
|
name: NODES_COLUMNS_IDS.CPU,
|
111
119
|
header: 'CPU',
|
112
120
|
sortAccessor: ({PoolStats = []}) => Math.max(...PoolStats.map(({Usage}) => Number(Usage))),
|
113
121
|
defaultOrder: DataTable.DESCENDING,
|
114
122
|
render: ({row}) => (row.PoolStats ? <PoolsGraph pools={row.PoolStats} /> : '—'),
|
115
123
|
align: DataTable.LEFT,
|
116
|
-
width:
|
124
|
+
width: 80,
|
117
125
|
sortable: false,
|
118
126
|
};
|
119
127
|
|
120
|
-
const loadAverageColumn:
|
128
|
+
const loadAverageColumn: NodesColumn = {
|
121
129
|
name: NODES_COLUMNS_IDS.LoadAverage,
|
122
130
|
header: 'Load average',
|
123
131
|
sortAccessor: ({LoadAverage = []}) =>
|
@@ -135,13 +143,13 @@ const loadAverageColumn: Column<NodesPreparedEntity> = {
|
|
135
143
|
'—'
|
136
144
|
),
|
137
145
|
align: DataTable.LEFT,
|
138
|
-
width:
|
146
|
+
width: 140,
|
139
147
|
sortable: false,
|
140
148
|
};
|
141
149
|
|
142
|
-
const getTabletsColumn = (tabletsPath?: string):
|
150
|
+
const getTabletsColumn = (tabletsPath?: string): NodesColumn => ({
|
143
151
|
name: NODES_COLUMNS_IDS.Tablets,
|
144
|
-
width:
|
152
|
+
width: 430,
|
145
153
|
render: ({row}) => {
|
146
154
|
return row.Tablets ? (
|
147
155
|
<TabletsStatistic
|
@@ -157,7 +165,7 @@ const getTabletsColumn = (tabletsPath?: string): Column<NodesPreparedEntity> =>
|
|
157
165
|
sortable: false,
|
158
166
|
});
|
159
167
|
|
160
|
-
const topNodesLoadAverageColumn:
|
168
|
+
const topNodesLoadAverageColumn: NodesColumn = {
|
161
169
|
name: NODES_COLUMNS_IDS.TopNodesLoadAverage,
|
162
170
|
header: 'Load',
|
163
171
|
render: ({row}) =>
|
@@ -170,11 +178,11 @@ const topNodesLoadAverageColumn: Column<NodesPreparedEntity> = {
|
|
170
178
|
'—'
|
171
179
|
),
|
172
180
|
align: DataTable.LEFT,
|
173
|
-
width:
|
181
|
+
width: 80,
|
174
182
|
sortable: false,
|
175
183
|
};
|
176
184
|
|
177
|
-
const topNodesMemoryColumn:
|
185
|
+
const topNodesMemoryColumn: NodesColumn = {
|
178
186
|
name: NODES_COLUMNS_IDS.TopNodesMemory,
|
179
187
|
header: 'Memory',
|
180
188
|
render: ({row}) =>
|
@@ -189,17 +197,14 @@ const topNodesMemoryColumn: Column<NodesPreparedEntity> = {
|
|
189
197
|
'—'
|
190
198
|
),
|
191
199
|
align: DataTable.LEFT,
|
192
|
-
width:
|
200
|
+
width: 140,
|
193
201
|
sortable: false,
|
194
202
|
};
|
195
203
|
|
196
|
-
export function getNodesColumns({
|
197
|
-
tabletsPath,
|
198
|
-
getNodeRef,
|
199
|
-
}: GetNodesColumnsProps): Column<NodesPreparedEntity>[] {
|
204
|
+
export function getNodesColumns({tabletsPath, getNodeRef}: GetNodesColumnsProps): NodesColumn[] {
|
200
205
|
return [
|
201
206
|
nodeIdColumn,
|
202
|
-
getHostColumn(getNodeRef
|
207
|
+
getHostColumn(getNodeRef),
|
203
208
|
dataCenterColumn,
|
204
209
|
rackColumn,
|
205
210
|
versionColumn,
|
@@ -213,23 +218,28 @@ export function getNodesColumns({
|
|
213
218
|
|
214
219
|
export function getTopNodesByLoadColumns(
|
215
220
|
getNodeRef?: GetNodeRefFunc,
|
216
|
-
):
|
217
|
-
return [
|
221
|
+
): DataTableColumn<NodesPreparedEntity>[] {
|
222
|
+
return [
|
223
|
+
topNodesLoadAverageColumn,
|
224
|
+
nodeIdColumn,
|
225
|
+
getHostColumnWithUndefinedWidth(getNodeRef),
|
226
|
+
versionColumn,
|
227
|
+
];
|
218
228
|
}
|
219
229
|
|
220
230
|
export function getTopNodesByCpuColumns(
|
221
231
|
getNodeRef?: GetNodeRefFunc,
|
222
|
-
):
|
223
|
-
return [cpuColumn, nodeIdColumn,
|
232
|
+
): DataTableColumn<NodesPreparedEntity>[] {
|
233
|
+
return [cpuColumn, nodeIdColumn, getHostColumnWithUndefinedWidth(getNodeRef)];
|
224
234
|
}
|
225
235
|
|
226
236
|
export function getTopNodesByMemoryColumns({
|
227
237
|
tabletsPath,
|
228
238
|
getNodeRef,
|
229
|
-
}: GetNodesColumnsProps):
|
239
|
+
}: GetNodesColumnsProps): NodesColumn[] {
|
230
240
|
return [
|
231
241
|
nodeIdColumn,
|
232
|
-
getHostColumn(getNodeRef
|
242
|
+
getHostColumn(getNodeRef),
|
233
243
|
uptimeColumn,
|
234
244
|
topNodesMemoryColumn,
|
235
245
|
topNodesLoadAverageColumn,
|
@@ -19,8 +19,8 @@
|
|
19
19
|
"settings.useNodesEndpoint.title": "Break the Nodes tab in Diagnostics",
|
20
20
|
"settings.useNodesEndpoint.popover": "Use /viewer/json/nodes endpoint for Nodes Tab in diagnostics. It returns incorrect data on versions before 23-1",
|
21
21
|
|
22
|
-
"settings.useBackendParamsForTables.title": "
|
23
|
-
"settings.useBackendParamsForTables.popover": "
|
22
|
+
"settings.useBackendParamsForTables.title": "Use virtual table for cluster Nodes tab",
|
23
|
+
"settings.useBackendParamsForTables.popover": "Use table with data load on scroll. It will increase performance, but could work unstable",
|
24
24
|
|
25
25
|
"settings.enableAdditionalQueryModes.title": "Enable additional query modes",
|
26
26
|
"settings.enableAdditionalQueryModes.popover": "Adds 'Data', 'YQL - QueryService' and 'PostgreSQL' modes. May not work on some versions",
|
@@ -19,8 +19,8 @@
|
|
19
19
|
"settings.useNodesEndpoint.title": "Сломать вкладку Nodes в диагностике",
|
20
20
|
"settings.useNodesEndpoint.popover": "Использовать эндпоинт /viewer/json/nodes для вкладки Nodes в диагностике. Может возвращать некорректные данные на версиях до 23-1",
|
21
21
|
|
22
|
-
"settings.useBackendParamsForTables.title": "
|
23
|
-
"settings.useBackendParamsForTables.popover": "
|
22
|
+
"settings.useBackendParamsForTables.title": "Использовать виртуализированную таблицу для вкладки Nodes кластера",
|
23
|
+
"settings.useBackendParamsForTables.popover": "Использовать таблицу с загрузкой данных по скроллу. Это улучшит производительность, но может работать нестабильно",
|
24
24
|
|
25
25
|
"settings.enableAdditionalQueryModes.title": "Включить дополнительные режимы выполнения запросов",
|
26
26
|
"settings.enableAdditionalQueryModes.popover": "Добавляет режимы 'Data', 'YQL - QueryService' и 'PostgreSQL'. Может работать некорректно на некоторых версиях",
|
@@ -150,7 +150,7 @@ export const getStorageNodesInfo = ({
|
|
150
150
|
}: Omit<NodesApiRequestParams, 'type'>) => {
|
151
151
|
return createApiRequest({
|
152
152
|
request: window.api.getNodes(
|
153
|
-
{tenant, visibleEntities, type: 'static', ...params},
|
153
|
+
{tenant, visibleEntities, storage: true, type: 'static', ...params},
|
154
154
|
{concurrentId},
|
155
155
|
),
|
156
156
|
actions: FETCH_STORAGE,
|
@@ -2,10 +2,9 @@ import {useMemo} from 'react';
|
|
2
2
|
|
3
3
|
import type {NodesGeneralRequestParams} from '../../store/reducers/nodes/types';
|
4
4
|
import type {ProblemFilterValue} from '../../store/reducers/settings/types';
|
5
|
-
import {ProblemFilterValues} from '../../store/reducers/settings/settings';
|
6
5
|
|
7
|
-
import {
|
8
|
-
import {NodesUptimeFilterValues} from '../nodes';
|
6
|
+
import {USE_BACKEND_PARAMS_FOR_TABLES_KEY} from '../constants';
|
7
|
+
import {NodesUptimeFilterValues, getProblemParamValue, getUptimeParamValue} from '../nodes';
|
9
8
|
import {useSetting} from './useSetting';
|
10
9
|
|
11
10
|
interface NodesRawRequestParams
|
@@ -27,11 +26,8 @@ export const useNodesRequestParams = ({
|
|
27
26
|
// Otherwise no params will be updated, no hooks that depend on requestParams will be triggered
|
28
27
|
return useMemo(() => {
|
29
28
|
if (useBackendParamsForTables) {
|
30
|
-
const problemsOnly = problemFilter
|
31
|
-
const uptime =
|
32
|
-
nodesUptimeFilter === NodesUptimeFilterValues.SmallUptime
|
33
|
-
? HOUR_IN_SECONDS
|
34
|
-
: undefined;
|
29
|
+
const problemsOnly = getProblemParamValue(problemFilter);
|
30
|
+
const uptime = getUptimeParamValue(nodesUptimeFilter);
|
35
31
|
|
36
32
|
return {
|
37
33
|
filter,
|
package/dist/utils/nodes.ts
CHANGED
@@ -3,8 +3,12 @@ import type {TNodeInfo} from '../types/api/nodesList';
|
|
3
3
|
import type {NodesPreparedEntity} from '../store/reducers/nodes/types';
|
4
4
|
import type {NodesMap} from '../types/store/nodesList';
|
5
5
|
import type {ValueOf} from '../types/common';
|
6
|
+
import type {ProblemFilterValue} from '../store/reducers/settings/types';
|
7
|
+
import {ProblemFilterValues} from '../store/reducers/settings/settings';
|
6
8
|
import {EFlag} from '../types/api/enums';
|
7
9
|
|
10
|
+
import {HOUR_IN_SECONDS} from './constants';
|
11
|
+
|
8
12
|
export enum NodesUptimeFilterValues {
|
9
13
|
'All' = 'All',
|
10
14
|
'SmallUptime' = 'SmallUptime',
|
@@ -27,6 +31,14 @@ export const prepareNodesMap = (nodesList?: TNodeInfo[]) => {
|
|
27
31
|
}, new Map());
|
28
32
|
};
|
29
33
|
|
34
|
+
export const getProblemParamValue = (problemFilter: ProblemFilterValue | undefined) => {
|
35
|
+
return problemFilter === ProblemFilterValues.PROBLEMS;
|
36
|
+
};
|
37
|
+
|
38
|
+
export const getUptimeParamValue = (nodesUptimeFilter: NodesUptimeFilterValues | undefined) => {
|
39
|
+
return nodesUptimeFilter === NodesUptimeFilterValues.SmallUptime ? HOUR_IN_SECONDS : undefined;
|
40
|
+
};
|
41
|
+
|
30
42
|
/**
|
31
43
|
* Values to sort /compute v2 and /nodes responses
|
32
44
|
*
|