ydb-embedded-ui 4.27.1 → 4.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/dist/components/EmptyState/EmptyState.scss +5 -2
- package/dist/components/EmptyState/EmptyState.tsx +11 -3
- package/dist/components/Errors/403/AccessDenied.tsx +4 -3
- package/dist/components/ProblemFilter/ProblemFilter.tsx +1 -1
- package/dist/components/UptimeFIlter/UptimeFilter.tsx +1 -1
- package/dist/components/VirtualTable/VirtualTable.scss +1 -1
- package/dist/containers/Cluster/Cluster.tsx +11 -12
- package/dist/containers/Nodes/Nodes.tsx +4 -4
- package/dist/containers/Nodes/NodesWrapper.tsx +21 -0
- package/dist/containers/Nodes/VirtualNodes.tsx +4 -14
- package/dist/containers/Storage/DiskStateProgressBar/DiskStateProgressBar.scss +1 -0
- package/dist/containers/Storage/EmptyFilter/EmptyFilter.tsx +1 -0
- package/dist/containers/Storage/PDisk/PDisk.tsx +5 -7
- package/dist/containers/Storage/Storage.tsx +30 -67
- package/dist/containers/Storage/StorageControls/StorageControls.tsx +104 -0
- package/dist/containers/Storage/StorageGroups/StorageGroups.tsx +18 -62
- package/dist/containers/Storage/StorageGroups/StorageGroupsEmptyDataMessage.tsx +30 -0
- package/dist/containers/Storage/StorageGroups/VirtualStorageGroups.tsx +94 -0
- package/dist/containers/Storage/StorageGroups/getGroups.ts +21 -0
- package/dist/containers/Storage/StorageGroups/getStorageGroupsColumns.tsx +73 -50
- package/dist/containers/Storage/StorageNodes/StorageNodes.tsx +23 -138
- package/dist/containers/Storage/StorageNodes/StorageNodesEmptyDataMessage.tsx +44 -0
- package/dist/containers/Storage/StorageNodes/VirtualStorageNodes.tsx +105 -0
- package/dist/containers/Storage/StorageNodes/getNodes.ts +26 -0
- package/dist/containers/Storage/StorageNodes/getStorageNodesColumns.tsx +125 -0
- package/dist/containers/Storage/StorageNodes/shared.ts +9 -0
- package/dist/containers/Storage/StorageTypeFilter/StorageTypeFilter.tsx +1 -1
- package/dist/containers/Storage/StorageVisibleEntitiesFilter/StorageVisibleEntitiesFilter.tsx +1 -1
- package/dist/containers/Storage/StorageWrapper.tsx +23 -0
- package/dist/containers/Storage/UsageFilter/UsageFilter.tsx +3 -4
- package/dist/containers/Storage/VirtualStorage.tsx +112 -0
- package/dist/containers/Storage/i18n/en.json +7 -0
- package/dist/containers/Storage/i18n/index.ts +11 -0
- package/dist/containers/Storage/i18n/ru.json +7 -0
- package/dist/containers/Storage/shared.ts +3 -0
- package/dist/containers/Tenants/Tenants.tsx +2 -2
- package/dist/containers/UserSettings/i18n/en.json +2 -2
- package/dist/containers/UserSettings/i18n/ru.json +2 -2
- package/dist/containers/UserSettings/settings.ts +4 -4
- package/dist/store/reducers/storage/selectors.ts +0 -20
- package/package.json +6 -6
@@ -0,0 +1,112 @@
|
|
1
|
+
import {useEffect, useState} from 'react';
|
2
|
+
import {useDispatch} from 'react-redux';
|
3
|
+
|
4
|
+
import type {AdditionalNodesProps} from '../../types/additionalProps';
|
5
|
+
import type {RenderControls, RenderErrorMessage} from '../../components/VirtualTable';
|
6
|
+
import type {StorageType, VisibleEntities} from '../../store/reducers/storage/types';
|
7
|
+
import {STORAGE_TYPES, VISIBLE_ENTITIES} from '../../store/reducers/storage/constants';
|
8
|
+
import {NodesUptimeFilterValues} from '../../utils/nodes';
|
9
|
+
import {AccessDenied} from '../../components/Errors/403/AccessDenied';
|
10
|
+
import {ResponseError} from '../../components/Errors/ResponseError/ResponseError';
|
11
|
+
import {getNodesList, selectNodesMap} from '../../store/reducers/nodesList';
|
12
|
+
import {useTypedSelector} from '../../utils/hooks';
|
13
|
+
|
14
|
+
import {StorageControls} from './StorageControls/StorageControls';
|
15
|
+
import {VirtualStorageGroups} from './StorageGroups/VirtualStorageGroups';
|
16
|
+
import {VirtualStorageNodes} from './StorageNodes/VirtualStorageNodes';
|
17
|
+
|
18
|
+
interface VirtualStorageProps {
|
19
|
+
tenant?: string;
|
20
|
+
nodeId?: string;
|
21
|
+
parentContainer?: Element | null;
|
22
|
+
additionalNodesProps?: AdditionalNodesProps;
|
23
|
+
}
|
24
|
+
|
25
|
+
export const VirtualStorage = ({
|
26
|
+
tenant,
|
27
|
+
nodeId,
|
28
|
+
parentContainer,
|
29
|
+
additionalNodesProps,
|
30
|
+
}: VirtualStorageProps) => {
|
31
|
+
const dispatch = useDispatch();
|
32
|
+
|
33
|
+
const [searchValue, setSearchValue] = useState('');
|
34
|
+
const [storageType, setStorageType] = useState<StorageType>(STORAGE_TYPES.groups);
|
35
|
+
const [visibleEntities, setVisibleEntities] = useState<VisibleEntities>(VISIBLE_ENTITIES.all);
|
36
|
+
const [nodesUptimeFilter, setNodesUptimeFilter] = useState<NodesUptimeFilterValues>(
|
37
|
+
NodesUptimeFilterValues.All,
|
38
|
+
);
|
39
|
+
|
40
|
+
const nodesMap = useTypedSelector(selectNodesMap);
|
41
|
+
|
42
|
+
useEffect(() => {
|
43
|
+
dispatch(getNodesList());
|
44
|
+
}, [dispatch]);
|
45
|
+
|
46
|
+
const handleShowAllGroups = () => {
|
47
|
+
setVisibleEntities(VISIBLE_ENTITIES.all);
|
48
|
+
};
|
49
|
+
|
50
|
+
const handleShowAllNodes = () => {
|
51
|
+
setVisibleEntities(VISIBLE_ENTITIES.all);
|
52
|
+
setNodesUptimeFilter(NodesUptimeFilterValues.All);
|
53
|
+
};
|
54
|
+
|
55
|
+
const renderControls: RenderControls = ({totalEntities, foundEntities, inited}) => {
|
56
|
+
return (
|
57
|
+
<StorageControls
|
58
|
+
searchValue={searchValue}
|
59
|
+
handleSearchValueChange={setSearchValue}
|
60
|
+
withTypeSelector={!nodeId}
|
61
|
+
storageType={storageType}
|
62
|
+
handleStorageTypeChange={setStorageType}
|
63
|
+
visibleEntities={visibleEntities}
|
64
|
+
handleVisibleEntitiesChange={setVisibleEntities}
|
65
|
+
nodesUptimeFilter={nodesUptimeFilter}
|
66
|
+
handleNodesUptimeFilterChange={setNodesUptimeFilter}
|
67
|
+
withGroupsUsageFilter={false}
|
68
|
+
entitiesCountCurrent={foundEntities}
|
69
|
+
entitiesCountTotal={totalEntities}
|
70
|
+
entitiesLoading={!inited}
|
71
|
+
/>
|
72
|
+
);
|
73
|
+
};
|
74
|
+
|
75
|
+
const renderErrorMessage: RenderErrorMessage = (error) => {
|
76
|
+
if (error.status === 403) {
|
77
|
+
return <AccessDenied position="left" />;
|
78
|
+
}
|
79
|
+
|
80
|
+
return <ResponseError error={error} />;
|
81
|
+
};
|
82
|
+
|
83
|
+
if (storageType === STORAGE_TYPES.nodes) {
|
84
|
+
return (
|
85
|
+
<VirtualStorageNodes
|
86
|
+
searchValue={searchValue}
|
87
|
+
visibleEntities={visibleEntities}
|
88
|
+
nodesUptimeFilter={nodesUptimeFilter}
|
89
|
+
tenant={tenant}
|
90
|
+
additionalNodesProps={additionalNodesProps}
|
91
|
+
onShowAll={handleShowAllNodes}
|
92
|
+
parentContainer={parentContainer}
|
93
|
+
renderControls={renderControls}
|
94
|
+
renderErrorMessage={renderErrorMessage}
|
95
|
+
/>
|
96
|
+
);
|
97
|
+
}
|
98
|
+
|
99
|
+
return (
|
100
|
+
<VirtualStorageGroups
|
101
|
+
searchValue={searchValue}
|
102
|
+
visibleEntities={visibleEntities}
|
103
|
+
tenant={tenant}
|
104
|
+
nodeId={nodeId}
|
105
|
+
nodesMap={nodesMap}
|
106
|
+
onShowAll={handleShowAllGroups}
|
107
|
+
parentContainer={parentContainer}
|
108
|
+
renderControls={renderControls}
|
109
|
+
renderErrorMessage={renderErrorMessage}
|
110
|
+
/>
|
111
|
+
);
|
112
|
+
};
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import {i18n, Lang} from '../../../utils/i18n';
|
2
|
+
|
3
|
+
import en from './en.json';
|
4
|
+
import ru from './ru.json';
|
5
|
+
|
6
|
+
const COMPONENT = 'ydb-storage';
|
7
|
+
|
8
|
+
i18n.registerKeyset(Lang.En, COMPONENT, en);
|
9
|
+
i18n.registerKeyset(Lang.Ru, COMPONENT, ru);
|
10
|
+
|
11
|
+
export default i18n.keyset(COMPONENT);
|
@@ -61,8 +61,8 @@ export const Tenants = ({additionalTenantsProps}: TenantsProps) => {
|
|
61
61
|
true,
|
62
62
|
);
|
63
63
|
|
64
|
-
const handleProblemFilterChange = (value:
|
65
|
-
dispatch(changeFilter(value
|
64
|
+
const handleProblemFilterChange = (value: ProblemFilterValue) => {
|
65
|
+
dispatch(changeFilter(value));
|
66
66
|
};
|
67
67
|
|
68
68
|
const handleSearchChange = (value: string) => {
|
@@ -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 could return incorrect data on some versions",
|
21
21
|
|
22
|
-
"settings.
|
23
|
-
"settings.
|
22
|
+
"settings.useVirtualTables.title": "Use table with data load on scroll for Nodes and Storage cluster tabs",
|
23
|
+
"settings.useVirtualTables.popover": "It will increase performance, but could work unstable",
|
24
24
|
|
25
25
|
"settings.queryUseMultiSchema.title": "Allow queries with multiple result sets",
|
26
26
|
"settings.queryUseMultiSchema.popover": "Use 'multi' schema for queries that enables queries with multiple result sets. Returns nothing on versions 23-3 and older"
|
@@ -19,8 +19,8 @@
|
|
19
19
|
"settings.useNodesEndpoint.title": "Сломать вкладку Nodes в диагностике",
|
20
20
|
"settings.useNodesEndpoint.popover": "Использовать эндпоинт /viewer/json/nodes для вкладки Nodes в диагностике. Может возвращать некорректные данные на некоторых версиях",
|
21
21
|
|
22
|
-
"settings.
|
23
|
-
"settings.
|
22
|
+
"settings.useVirtualTables.title": "Использовать таблицу с загрузкой данных по скроллу для вкладок Nodes и Storage кластера",
|
23
|
+
"settings.useVirtualTables.popover": "Это улучшит производительность, но может работать нестабильно",
|
24
24
|
|
25
25
|
"settings.queryUseMultiSchema.title": "Разрешить запросы с несколькими результатами",
|
26
26
|
"settings.queryUseMultiSchema.popover": "Использовать для запросов схему 'multi', которая позволяет выполнять запросы с несколькими результатами. На версиях 23-3 и старше результат не возвращается вообще"
|
@@ -84,10 +84,10 @@ export const useNodesEndpointSetting: SettingProps = {
|
|
84
84
|
title: i18n('settings.useNodesEndpoint.title'),
|
85
85
|
helpPopoverContent: i18n('settings.useNodesEndpoint.popover'),
|
86
86
|
};
|
87
|
-
export const
|
87
|
+
export const useVirtualTables: SettingProps = {
|
88
88
|
settingKey: USE_BACKEND_PARAMS_FOR_TABLES_KEY,
|
89
|
-
title: i18n('settings.
|
90
|
-
helpPopoverContent: i18n('settings.
|
89
|
+
title: i18n('settings.useVirtualTables.title'),
|
90
|
+
helpPopoverContent: i18n('settings.useVirtualTables.popover'),
|
91
91
|
};
|
92
92
|
export const queryUseMultiSchemaSetting: SettingProps = {
|
93
93
|
settingKey: QUERY_USE_MULTI_SCHEMA_KEY,
|
@@ -103,7 +103,7 @@ export const appearanceSection: SettingsSection = {
|
|
103
103
|
export const experimentsSection: SettingsSection = {
|
104
104
|
id: 'experimentsSection',
|
105
105
|
title: i18n('section.experiments'),
|
106
|
-
settings: [useNodesEndpointSetting,
|
106
|
+
settings: [useNodesEndpointSetting, useVirtualTables, queryUseMultiSchemaSetting],
|
107
107
|
};
|
108
108
|
|
109
109
|
export const generalPage: SettingsPage = {
|
@@ -3,7 +3,6 @@ import {Selector, createSelector} from 'reselect';
|
|
3
3
|
import type {OrderType} from '@gravity-ui/react-data-table';
|
4
4
|
import {ASCENDING, DESCENDING} from '@gravity-ui/react-data-table/build/esm/lib/constants';
|
5
5
|
|
6
|
-
import type {TVDiskStateInfo} from '../../../types/api/vdisk';
|
7
6
|
import {NODES_SORT_VALUES, type NodesSortValue} from '../../../utils/nodes';
|
8
7
|
import {STORAGE_SORT_VALUES, type StorageSortValue, getUsage} from '../../../utils/storage';
|
9
8
|
|
@@ -111,25 +110,6 @@ export const selectGroupsSortParams = (state: StorageStateSlice) => {
|
|
111
110
|
};
|
112
111
|
// ==== Complex selectors ====
|
113
112
|
|
114
|
-
export const selectVDisksForPDisk: Selector<
|
115
|
-
StorageStateSlice,
|
116
|
-
TVDiskStateInfo[] | undefined,
|
117
|
-
[number | undefined, number | undefined]
|
118
|
-
> = createSelector(
|
119
|
-
[
|
120
|
-
selectStorageNodes,
|
121
|
-
(_state, nodeId: number | undefined) => nodeId,
|
122
|
-
(_state, _nodeId, pdiskId: number | undefined) => pdiskId,
|
123
|
-
],
|
124
|
-
(storageNodes, nodeId, pdiskId) => {
|
125
|
-
const targetNode = storageNodes?.find((node) => node.NodeId === nodeId);
|
126
|
-
return targetNode?.VDisks?.filter((vdisk) => vdisk.PDiskId === pdiskId).map((data) => ({
|
127
|
-
...data,
|
128
|
-
NodeId: nodeId,
|
129
|
-
}));
|
130
|
-
},
|
131
|
-
);
|
132
|
-
|
133
113
|
export const selectUsageFilterOptions: Selector<StorageStateSlice, UsageFilter[]> = createSelector(
|
134
114
|
selectStorageGroups,
|
135
115
|
(groups) => {
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "ydb-embedded-ui",
|
3
|
-
"version": "4.
|
3
|
+
"version": "4.28.0",
|
4
4
|
"files": [
|
5
5
|
"dist"
|
6
6
|
],
|
@@ -16,6 +16,8 @@
|
|
16
16
|
"@gravity-ui/navigation": "^1.8.0",
|
17
17
|
"@gravity-ui/paranoid": "^1.4.0",
|
18
18
|
"@gravity-ui/react-data-table": "^1.0.3",
|
19
|
+
"@types/numeral": "^2.0.2",
|
20
|
+
"@types/qs": "^6.9.7",
|
19
21
|
"@types/react": "^17.0.58",
|
20
22
|
"axios": "0.19.2",
|
21
23
|
"bem-cn-lite": "4.0.0",
|
@@ -27,6 +29,7 @@
|
|
27
29
|
"monaco-editor": "0.24.0",
|
28
30
|
"numeral": "2.0.6",
|
29
31
|
"path-to-regexp": "3.0.0",
|
32
|
+
"qs": "^6.11.0",
|
30
33
|
"react-json-inspector": "7.1.1",
|
31
34
|
"react-list": "0.8.11",
|
32
35
|
"react-monaco-editor": "0.30.1",
|
@@ -40,6 +43,7 @@
|
|
40
43
|
"redux-thunk": "2.3.0",
|
41
44
|
"reselect": "4.1.6",
|
42
45
|
"sass": "1.32.8",
|
46
|
+
"url": "^0.11.0",
|
43
47
|
"web-vitals": "1.1.2",
|
44
48
|
"ydb-ui-components": "^3.5.0"
|
45
49
|
},
|
@@ -118,8 +122,6 @@
|
|
118
122
|
"@testing-library/react": "^11.2.7",
|
119
123
|
"@testing-library/user-event": "^12.8.3",
|
120
124
|
"@types/lodash": "^4.14.178",
|
121
|
-
"@types/numeral": "^2.0.2",
|
122
|
-
"@types/qs": "^6.9.7",
|
123
125
|
"@types/react-dom": "^17.0.11",
|
124
126
|
"@types/react-router": "^5.1.17",
|
125
127
|
"@types/react-router-dom": "^5.3.2",
|
@@ -130,14 +132,12 @@
|
|
130
132
|
"lint-staged": "^12.3.7",
|
131
133
|
"postcss": "^8.4.6",
|
132
134
|
"prettier": "^2.5.1",
|
133
|
-
"qs": "^6.11.0",
|
134
135
|
"react": "^17.0.2",
|
135
136
|
"react-app-rewired": "^2.1.11",
|
136
137
|
"react-dom": "^17.0.2",
|
137
138
|
"stylelint": "^14.3.0",
|
138
139
|
"ts-jest": "^28.0.7",
|
139
|
-
"typescript": "^4.5.5"
|
140
|
-
"url": "^0.11.0"
|
140
|
+
"typescript": "^4.5.5"
|
141
141
|
},
|
142
142
|
"peerDependencies": {
|
143
143
|
"@gravity-ui/uikit": "^5.24.0"
|