ydb-embedded-ui 2.4.3 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/components/InfoViewer/formatters/schema.ts +2 -1
  3. package/dist/components/InfoViewer/schemaInfo/CDCStreamInfo.tsx +3 -16
  4. package/dist/components/InfoViewer/schemaInfo/PersQueueGroupInfo.tsx +8 -13
  5. package/dist/components/InfoViewer/schemaInfo/TableIndexInfo.tsx +2 -12
  6. package/dist/components/InfoViewer/schemaOverview/CDCStreamOverview.tsx +3 -16
  7. package/dist/components/InfoViewer/schemaOverview/PersQueueGroupOverview.tsx +8 -13
  8. package/dist/components/InfoViewer/utils.ts +6 -6
  9. package/dist/components/Loader/Loader.scss +6 -3
  10. package/dist/components/Loader/Loader.tsx +7 -5
  11. package/dist/components/Loader/index.ts +1 -0
  12. package/dist/components/UptimeFIlter/UptimeFilter.tsx +21 -0
  13. package/dist/components/UptimeFIlter/index.ts +1 -0
  14. package/dist/containers/Node/Node.scss +1 -0
  15. package/dist/containers/Node/Node.tsx +3 -8
  16. package/dist/containers/Node/NodeStructure/NodeStructure.scss +0 -6
  17. package/dist/containers/Node/NodeStructure/NodeStructure.tsx +1 -1
  18. package/dist/containers/Nodes/Nodes.js +22 -10
  19. package/dist/{components → containers}/NodesViewer/NodesViewer.js +49 -62
  20. package/dist/{components → containers}/NodesViewer/NodesViewer.scss +0 -0
  21. package/dist/containers/Storage/Pdisk/Pdisk.scss +1 -1
  22. package/dist/containers/Storage/Storage.js +35 -10
  23. package/dist/containers/Storage/StorageNodes/StorageNodes.scss +2 -2
  24. package/dist/containers/Storage/StorageNodes/StorageNodes.tsx +35 -17
  25. package/dist/containers/Storage/StorageNodes/i18n/en.json +6 -4
  26. package/dist/containers/Storage/StorageNodes/i18n/ru.json +6 -4
  27. package/dist/containers/Storage/UsageFilter/UsageFilter.scss +10 -5
  28. package/dist/containers/Tenant/Acl/Acl.js +1 -7
  29. package/dist/containers/Tenant/Diagnostics/Compute/Compute.js +1 -1
  30. package/dist/containers/Tenant/Diagnostics/Consumers/Consumers.tsx +34 -8
  31. package/dist/containers/Tenant/Diagnostics/Describe/Describe.scss +0 -8
  32. package/dist/containers/Tenant/Diagnostics/Describe/Describe.tsx +87 -0
  33. package/dist/containers/Tenant/Diagnostics/Diagnostics.scss +0 -7
  34. package/dist/containers/Tenant/Diagnostics/Diagnostics.tsx +5 -7
  35. package/dist/containers/Tenant/Diagnostics/TopShards/TopShards.js +21 -13
  36. package/dist/containers/Tenant/ObjectGeneral/ObjectGeneral.tsx +1 -5
  37. package/dist/containers/Tenant/QueryEditor/QueryExplain/QueryExplain.js +16 -30
  38. package/dist/containers/Tenant/QueryEditor/SaveQuery/SaveQuery.js +1 -4
  39. package/dist/containers/Tenant/Schema/SchemaInfoViewer/SchemaInfoViewer.js +23 -28
  40. package/dist/containers/Tenant/Schema/SchemaTree/SchemaTree.tsx +2 -7
  41. package/dist/containers/Tenant/Tenant.tsx +8 -5
  42. package/dist/containers/Tenant/TenantPages.tsx +1 -1
  43. package/dist/containers/Tenant/utils/schemaActions.ts +9 -20
  44. package/dist/services/api.js +14 -5
  45. package/dist/store/reducers/clusterNodes.js +29 -10
  46. package/dist/store/reducers/describe.ts +60 -30
  47. package/dist/store/reducers/nodes.js +24 -3
  48. package/dist/store/reducers/{schema.js → schema.ts} +22 -14
  49. package/dist/store/reducers/storage.js +46 -5
  50. package/dist/types/api/error.ts +4 -2
  51. package/dist/types/store/describe.ts +21 -1
  52. package/dist/types/store/schema.ts +46 -0
  53. package/dist/utils/index.js +6 -2
  54. package/dist/utils/nodes.ts +9 -0
  55. package/package.json +1 -1
  56. package/dist/containers/Tenant/Diagnostics/Describe/Describe.js +0 -130
@@ -2,24 +2,23 @@ import {createSelector, Selector} from 'reselect';
2
2
  import {Reducer} from 'redux';
3
3
 
4
4
  import '../../services/api';
5
- import {TEvDescribeSchemeResult} from '../../types/api/schema';
6
5
  import {IConsumer} from '../../types/api/consumers';
7
- import {IDescribeRootStateSlice, IDescribeState} from '../../types/store/describe';
8
- import {IResponseError} from '../../types/api/error';
9
- import {createRequestActionTypes, createApiRequest, ApiRequestAction} from '../utils';
6
+ import {IDescribeRootStateSlice, IDescribeState, IDescribeAction} from '../../types/store/describe';
7
+ import {createRequestActionTypes, createApiRequest} from '../utils';
10
8
 
11
- const FETCH_DESCRIBE = createRequestActionTypes('describe', 'FETCH_DESCRIBE');
9
+ export const FETCH_DESCRIBE = createRequestActionTypes('describe', 'FETCH_DESCRIBE');
10
+ const SET_CURRENT_DESCRIBE_PATH = 'describe/SET_CURRENT_DESCRIBE_PATH';
11
+ const SET_DATA_WAS_NOT_LOADED = 'describe/SET_DATA_WAS_NOT_LOADED';
12
12
 
13
13
  const initialState = {
14
14
  loading: false,
15
15
  wasLoaded: false,
16
16
  data: {},
17
+ currentDescribe: undefined,
18
+ currentDescribePath: undefined,
17
19
  };
18
20
 
19
- const describe: Reducer<
20
- IDescribeState,
21
- ApiRequestAction<typeof FETCH_DESCRIBE, TEvDescribeSchemeResult, IResponseError>
22
- > = (state = initialState, action) => {
21
+ const describe: Reducer<IDescribeState, IDescribeAction> = (state = initialState, action) => {
23
22
  switch (action.type) {
24
23
  case FETCH_DESCRIBE.REQUEST: {
25
24
  return {
@@ -28,52 +27,83 @@ const describe: Reducer<
28
27
  };
29
28
  }
30
29
  case FETCH_DESCRIBE.SUCCESS: {
31
- let newData;
30
+ const data = action.data;
32
31
 
33
- if (action.data.Path) {
32
+ const isCurrentDescribePath = data.Path === state.currentDescribePath;
33
+
34
+ let newData = state.data;
35
+
36
+ if (data.Path) {
34
37
  newData = JSON.parse(JSON.stringify(state.data));
35
- newData[action.data.Path] = action.data;
36
- } else {
37
- newData = state.data;
38
+ newData[data.Path] = data;
39
+ }
40
+
41
+ if (!isCurrentDescribePath) {
42
+ return {
43
+ ...state,
44
+ data: newData,
45
+ };
38
46
  }
39
47
 
40
48
  return {
41
49
  ...state,
42
50
  data: newData,
43
- currentDescribe: action.data,
51
+ currentDescribe: data,
44
52
  loading: false,
45
53
  wasLoaded: true,
46
54
  error: undefined,
47
55
  };
48
56
  }
57
+
49
58
  case FETCH_DESCRIBE.FAILURE: {
59
+ if (action.error?.isCancelled) {
60
+ return state;
61
+ }
62
+
50
63
  return {
51
64
  ...state,
52
65
  error: action.error,
53
66
  loading: false,
54
67
  };
55
68
  }
69
+ case SET_CURRENT_DESCRIBE_PATH: {
70
+ return {
71
+ ...state,
72
+ currentDescribePath: action.data,
73
+ };
74
+ }
75
+ case SET_DATA_WAS_NOT_LOADED: {
76
+ return {
77
+ ...state,
78
+ wasLoaded: false,
79
+ };
80
+ }
56
81
  default:
57
82
  return state;
58
83
  }
59
84
  };
60
85
 
86
+ export const setCurrentDescribePath = (path: string) => {
87
+ return {
88
+ type: SET_CURRENT_DESCRIBE_PATH,
89
+ data: path,
90
+ } as const;
91
+ };
92
+
93
+ export const setDataWasNotLoaded = () => {
94
+ return {
95
+ type: SET_DATA_WAS_NOT_LOADED,
96
+ } as const;
97
+ };
98
+
61
99
  // Consumers selectors
62
- const selectConsumersNames: Selector<IDescribeRootStateSlice, string[] | undefined, [string]> = (
63
- state,
64
- path,
65
- ) => state.describe.data[path]?.PathDescription?.PersQueueGroup?.PQTabletConfig?.ReadRules;
66
-
67
- export const selectConsumers: Selector<IDescribeRootStateSlice, IConsumer[]> = createSelector(
68
- selectConsumersNames,
69
- (names = []) => {
70
- const consumers = names.map((name) => {
71
- return {name};
72
- });
73
-
74
- return consumers;
75
- },
76
- );
100
+ const selectConsumersNames = (state: IDescribeRootStateSlice, path: string | undefined) =>
101
+ path
102
+ ? state.describe.data[path]?.PathDescription?.PersQueueGroup?.PQTabletConfig?.ReadRules
103
+ : undefined;
104
+
105
+ export const selectConsumers: Selector<IDescribeRootStateSlice, IConsumer[], [string | undefined]> =
106
+ createSelector(selectConsumersNames, (names = []) => names.map((name) => ({name})));
77
107
 
78
108
  export function getDescribe({path}: {path: string}) {
79
109
  return createApiRequest({
@@ -1,9 +1,19 @@
1
1
  import {createRequestActionTypes, createApiRequest} from '../utils';
2
2
  import '../../services/api';
3
+ import {NodesUptimeFilterValues} from '../../utils/nodes';
3
4
 
4
5
  const FETCH_NODES = createRequestActionTypes('nodes', 'FETCH_NODES');
5
6
 
6
- const nodes = function z(state = {loading: true, wasLoaded: false}, action) {
7
+ const CLEAR_NODES = 'nodes/CLEAR_NODES';
8
+ const SET_NODES_UPTIME_FILTER = 'nodes/SET_NODES_UPTIME_FILTER';
9
+
10
+ const initialState = {
11
+ loading: true,
12
+ wasLoaded: false,
13
+ nodesUptimeFilter: NodesUptimeFilterValues.All,
14
+ };
15
+
16
+ const nodes = (state = initialState, action) => {
7
17
  switch (action.type) {
8
18
  case FETCH_NODES.REQUEST: {
9
19
  return {
@@ -28,7 +38,7 @@ const nodes = function z(state = {loading: true, wasLoaded: false}, action) {
28
38
  loading: false,
29
39
  };
30
40
  }
31
- case 'CLEAR_NODES': {
41
+ case CLEAR_NODES: {
32
42
  return {
33
43
  ...state,
34
44
  loading: true,
@@ -38,6 +48,10 @@ const nodes = function z(state = {loading: true, wasLoaded: false}, action) {
38
48
  error: undefined,
39
49
  };
40
50
  }
51
+
52
+ case SET_NODES_UPTIME_FILTER: {
53
+ return {...state, nodesUptimeFilter: action.data};
54
+ }
41
55
  default:
42
56
  return state;
43
57
  }
@@ -50,6 +64,13 @@ export function getNodes(path) {
50
64
  });
51
65
  }
52
66
 
53
- export const clearNodes = () => ({type: 'CLEAR_NODES'});
67
+ export const clearNodes = () => ({type: CLEAR_NODES});
68
+
69
+ export const setNodesUptimeFilter = (value) => ({
70
+ type: SET_NODES_UPTIME_FILTER,
71
+ data: value,
72
+ });
73
+
74
+ export const getNodesUptimeFilter = (state) => state.nodes.nodesUptimeFilter;
54
75
 
55
76
  export default nodes;
@@ -1,7 +1,11 @@
1
- import {createRequestActionTypes, createApiRequest} from '../utils';
1
+ import {Reducer} from 'redux';
2
+
3
+ import {ISchemaAction, ISchemaData, ISchemaState} from '../../types/store/schema';
2
4
  import '../../services/api';
3
5
 
4
- const FETCH_SCHEMA = createRequestActionTypes('schema', 'FETCH_SCHEMA');
6
+ import {createRequestActionTypes, createApiRequest} from '../utils';
7
+
8
+ export const FETCH_SCHEMA = createRequestActionTypes('schema', 'FETCH_SCHEMA');
5
9
  const PRELOAD_SCHEMAS = 'schema/PRELOAD_SCHEMAS';
6
10
  const SET_SCHEMA = 'schema/SET_SCHEMA';
7
11
  const SET_SHOW_PREVIEW = 'schema/SET_SHOW_PREVIEW';
@@ -18,7 +22,7 @@ export const initialState = {
18
22
  showPreview: false,
19
23
  };
20
24
 
21
- const schema = (state = initialState, action) => {
25
+ const schema: Reducer<ISchemaState, ISchemaAction> = (state = initialState, action) => {
22
26
  switch (action.type) {
23
27
  case FETCH_SCHEMA.REQUEST: {
24
28
  return {
@@ -28,7 +32,11 @@ const schema = (state = initialState, action) => {
28
32
  }
29
33
  case FETCH_SCHEMA.SUCCESS: {
30
34
  const newData = JSON.parse(JSON.stringify(state.data));
31
- newData[action.data.Path] = action.data;
35
+
36
+ if (action.data.Path) {
37
+ newData[action.data.Path] = action.data;
38
+ }
39
+
32
40
  const currentSchema = state.currentSchemaPath
33
41
  ? newData[state.currentSchemaPath]
34
42
  : action.data;
@@ -100,49 +108,49 @@ const schema = (state = initialState, action) => {
100
108
  }
101
109
  };
102
110
 
103
- export function getSchema({path}) {
111
+ export function getSchema({path}: {path: string}) {
104
112
  return createApiRequest({
105
113
  request: window.api.getSchema({path}),
106
114
  actions: FETCH_SCHEMA,
107
115
  });
108
116
  }
109
117
 
110
- export function setCurrentSchemaPath(currentSchemaPath) {
118
+ export function setCurrentSchemaPath(currentSchemaPath: string) {
111
119
  return {
112
120
  type: SET_SCHEMA,
113
121
  data: currentSchemaPath,
114
- };
122
+ } as const;
115
123
  }
116
124
  export function enableAutorefresh() {
117
125
  return {
118
126
  type: ENABLE_AUTOREFRESH,
119
- };
127
+ } as const;
120
128
  }
121
129
  export function disableAutorefresh() {
122
130
  return {
123
131
  type: DISABLE_AUTOREFRESH,
124
- };
132
+ } as const;
125
133
  }
126
- export function setShowPreview(value) {
134
+ export function setShowPreview(value: boolean) {
127
135
  return {
128
136
  type: SET_SHOW_PREVIEW,
129
137
  data: value,
130
- };
138
+ } as const;
131
139
  }
132
140
 
133
141
  // only stores data for paths that are not in the store yet
134
142
  // existing paths are ignored
135
- export function preloadSchemas(data) {
143
+ export function preloadSchemas(data: ISchemaData) {
136
144
  return {
137
145
  type: PRELOAD_SCHEMAS,
138
146
  data,
139
- };
147
+ } as const;
140
148
  }
141
149
 
142
150
  export function resetLoadingState() {
143
151
  return {
144
152
  type: RESET_LOADING_STATE,
145
- };
153
+ } as const;
146
154
  }
147
155
 
148
156
  export default schema;
@@ -1,10 +1,14 @@
1
- import {createRequestActionTypes, createApiRequest} from '../utils';
2
- import '../../services/api';
3
1
  import _ from 'lodash';
4
2
  import {createSelector} from 'reselect';
5
- import {calcUptime} from '../../utils';
3
+
4
+ import {calcUptime, calcUptimeInSeconds} from '../../utils';
6
5
  import {getUsage} from '../../utils/storage';
6
+ import {NodesUptimeFilterValues} from '../../utils/nodes';
7
7
  import {getPDiskType} from '../../utils/pdisk';
8
+ import {HOUR_IN_SECONDS} from '../../utils/constants';
9
+ import '../../services/api';
10
+
11
+ import {createRequestActionTypes, createApiRequest} from '../utils';
8
12
 
9
13
  export const VisibleEntities = {
10
14
  All: 'All',
@@ -29,6 +33,7 @@ const SET_FILTER = 'storage/SET_FILTER';
29
33
  const SET_USAGE_FILTER = 'storage/SET_USAGE_FILTER';
30
34
  const SET_VISIBLE_GROUPS = 'storage/SET_VISIBLE_GROUPS';
31
35
  const SET_STORAGE_TYPE = 'storage/SET_STORAGE_TYPE';
36
+ const SET_NODES_UPTIME_FILTER = 'storage/SET_NODES_UPTIME_FILTER';
32
37
 
33
38
  const initialState = {
34
39
  loading: true,
@@ -36,6 +41,7 @@ const initialState = {
36
41
  filter: '',
37
42
  usageFilter: [],
38
43
  visible: VisibleEntities.Missing,
44
+ nodesUptimeFilter: NodesUptimeFilterValues.All,
39
45
  type: StorageTypes.groups,
40
46
  };
41
47
 
@@ -93,6 +99,13 @@ const storage = (state = initialState, action) => {
93
99
  error: undefined,
94
100
  };
95
101
  }
102
+
103
+ case SET_NODES_UPTIME_FILTER: {
104
+ return {
105
+ ...state,
106
+ nodesUptimeFilter: action.data,
107
+ };
108
+ }
96
109
  case SET_STORAGE_TYPE: {
97
110
  return {
98
111
  ...state,
@@ -149,6 +162,13 @@ export function setVisibleEntities(value) {
149
162
  };
150
163
  }
151
164
 
165
+ export function setNodesUptimeFilter(value) {
166
+ return {
167
+ type: SET_NODES_UPTIME_FILTER,
168
+ data: value,
169
+ };
170
+ }
171
+
152
172
  export const getStoragePools = (state) => state.storage.data?.StoragePools;
153
173
  export const getStoragePoolsGroupsCount = (state) => ({
154
174
  total: state.storage.data?.TotalGroups || 0,
@@ -162,6 +182,7 @@ export const getStorageNodesCount = (state) => ({
162
182
  export const getStorageFilter = (state) => state.storage.filter;
163
183
  export const getUsageFilter = (state) => state.storage.usageFilter;
164
184
  export const getVisibleEntities = (state) => state.storage.visible;
185
+ export const getNodesUptimeFilter = (state) => state.storage.nodesUptimeFilter;
165
186
  export const getStorageType = (state) => state.storage.type;
166
187
  export const getNodesObject = (state) =>
167
188
  _.reduce(
@@ -337,12 +358,32 @@ const filterByUsage = (entities, usage) => {
337
358
  });
338
359
  };
339
360
 
361
+ export const filterByUptime = (nodes = [], nodesUptimeFilter) => {
362
+ if (nodesUptimeFilter === NodesUptimeFilterValues.All) {
363
+ return nodes;
364
+ }
365
+ return nodes.filter(({StartTime}) => {
366
+ return !StartTime || calcUptimeInSeconds(StartTime) < HOUR_IN_SECONDS;
367
+ });
368
+ };
369
+
340
370
  export const getFilteredEntities = createSelector(
341
- [getStorageFilter, getUsageFilter, getStorageType, getVisibleEntitiesList],
342
- (textFilter, usageFilter, type, entities) => {
371
+ [
372
+ getStorageFilter,
373
+ getUsageFilter,
374
+ getStorageType,
375
+ getNodesUptimeFilter,
376
+ getVisibleEntitiesList,
377
+ ],
378
+ (textFilter, usageFilter, type, nodesUptimeFilter, entities) => {
343
379
  let result = entities;
344
380
  result = filterByText(result, type, textFilter);
345
381
  result = filterByUsage(result, usageFilter);
382
+
383
+ if (type === StorageTypes.nodes) {
384
+ result = filterByUptime(result, nodesUptimeFilter);
385
+ }
386
+
346
387
  return result;
347
388
  },
348
389
  );
@@ -1,4 +1,6 @@
1
1
  export interface IResponseError {
2
- status: number;
3
- statusText: string;
2
+ data?: unknown;
3
+ status?: number;
4
+ statusText?: string;
5
+ isCancelled?: boolean;
4
6
  }
@@ -1,14 +1,34 @@
1
+ import {
2
+ FETCH_DESCRIBE,
3
+ setCurrentDescribePath,
4
+ setDataWasNotLoaded,
5
+ } from '../../store/reducers/describe';
6
+ import {ApiRequestAction} from '../../store/utils';
1
7
  import {IResponseError} from '../api/error';
2
8
  import {TEvDescribeSchemeResult} from '../api/schema';
3
9
 
10
+ export type IDescribeData = Record<string, TEvDescribeSchemeResult>;
11
+
4
12
  export interface IDescribeState {
5
13
  loading: boolean;
6
14
  wasLoaded: boolean;
7
- data: Record<string, TEvDescribeSchemeResult>;
15
+ data: IDescribeData;
8
16
  currentDescribe?: TEvDescribeSchemeResult;
17
+ currentDescribePath?: string;
9
18
  error?: IResponseError;
10
19
  }
11
20
 
21
+ type IDescribeApiRequestAction = ApiRequestAction<
22
+ typeof FETCH_DESCRIBE,
23
+ TEvDescribeSchemeResult,
24
+ IResponseError
25
+ >;
26
+
27
+ export type IDescribeAction =
28
+ | IDescribeApiRequestAction
29
+ | ReturnType<typeof setCurrentDescribePath>
30
+ | ReturnType<typeof setDataWasNotLoaded>;
31
+
12
32
  export interface IDescribeRootStateSlice {
13
33
  describe: IDescribeState;
14
34
  }
@@ -0,0 +1,46 @@
1
+ import {
2
+ disableAutorefresh,
3
+ enableAutorefresh,
4
+ FETCH_SCHEMA,
5
+ preloadSchemas,
6
+ resetLoadingState,
7
+ setCurrentSchemaPath,
8
+ setShowPreview,
9
+ } from '../../store/reducers/schema';
10
+ import {ApiRequestAction} from '../../store/utils';
11
+ import {IResponseError} from '../api/error';
12
+ import {TEvDescribeSchemeResult} from '../api/schema';
13
+
14
+ export type ISchemaData = Record<string, TEvDescribeSchemeResult>;
15
+
16
+ export interface ISchemaState {
17
+ loading: boolean;
18
+ wasLoaded: boolean;
19
+ data: ISchemaData;
20
+ currentSchema?: TEvDescribeSchemeResult;
21
+ currentSchemaPath?: string;
22
+ autorefresh: boolean;
23
+ showPreview: boolean;
24
+ error?: IResponseError;
25
+ }
26
+
27
+ type ISchemaApiRequestAction = ApiRequestAction<
28
+ typeof FETCH_SCHEMA,
29
+ TEvDescribeSchemeResult,
30
+ IResponseError
31
+ >;
32
+
33
+ export type ISchemaAction =
34
+ | ISchemaApiRequestAction
35
+ | (
36
+ | ReturnType<typeof setCurrentSchemaPath>
37
+ | ReturnType<typeof enableAutorefresh>
38
+ | ReturnType<typeof disableAutorefresh>
39
+ | ReturnType<typeof setShowPreview>
40
+ | ReturnType<typeof preloadSchemas>
41
+ | ReturnType<typeof resetLoadingState>
42
+ );
43
+
44
+ export interface ISchemaRootStateSlice {
45
+ schema: ISchemaState;
46
+ }
@@ -79,9 +79,13 @@ export const formatDateTime = (value) => {
79
79
  return value > 0 ? new Date(Number(value)).toUTCString() : 'N/A';
80
80
  };
81
81
 
82
- export const calcUptime = (milliseconds) => {
82
+ export const calcUptimeInSeconds = (milliseconds) => {
83
83
  const currentDate = new Date();
84
- return formatUptime((currentDate - Number(milliseconds)) / 1000);
84
+ return (currentDate - Number(milliseconds)) / 1000;
85
+ };
86
+
87
+ export const calcUptime = (milliseconds) => {
88
+ return formatUptime(calcUptimeInSeconds(milliseconds));
85
89
  };
86
90
 
87
91
  // determine how many nodes have status Connected "true"
@@ -0,0 +1,9 @@
1
+ export const NodesUptimeFilterValues = {
2
+ All: 'All',
3
+ SmallUptime: 'SmallUptime',
4
+ };
5
+
6
+ export const NodesUptimeFilterTitles = {
7
+ [NodesUptimeFilterValues.All]: 'All',
8
+ [NodesUptimeFilterValues.SmallUptime]: 'Uptime < 1h',
9
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ydb-embedded-ui",
3
- "version": "2.4.3",
3
+ "version": "2.5.0",
4
4
  "files": [
5
5
  "dist"
6
6
  ],
@@ -1,130 +0,0 @@
1
- import React from 'react';
2
- import PropTypes from 'prop-types';
3
- import cn from 'bem-cn-lite';
4
- import {connect} from 'react-redux';
5
- import {Loader} from '@gravity-ui/uikit';
6
- import JSONTree from 'react-json-inspector';
7
-
8
- import {getDescribe} from '../../../../store/reducers/describe';
9
-
10
- import './Describe.scss';
11
- import 'react-json-inspector/json-inspector.css';
12
- import {AutoFetcher} from '../../../../utils/autofetcher';
13
-
14
- const b = cn('kv-describe');
15
-
16
- const expandMap = new Map();
17
-
18
- class Describe extends React.Component {
19
- static propTypes = {
20
- error: PropTypes.string,
21
- data: PropTypes.array,
22
- loading: PropTypes.bool,
23
- wasLoaded: PropTypes.bool,
24
- autorefresh: PropTypes.bool,
25
- tenant: PropTypes.string,
26
- };
27
-
28
- autofetcher;
29
-
30
- componentDidMount() {
31
- const {autorefresh} = this.props;
32
- this.autofetcher = new AutoFetcher();
33
- this.fetchData();
34
- if (autorefresh) {
35
- this.autofetcher.start();
36
- this.autofetcher.fetch(() => this.fetchData);
37
- }
38
- }
39
-
40
- componentDidUpdate(prevProps) {
41
- const {autorefresh} = this.props;
42
-
43
- if (autorefresh && !prevProps.autorefresh) {
44
- this.fetchData();
45
- this.autofetcher.stop();
46
- this.autofetcher.start();
47
- this.autofetcher.fetch(() => this.fetchData());
48
- }
49
- if (!autorefresh && prevProps.autorefresh) {
50
- this.autofetcher.stop();
51
- }
52
- }
53
-
54
- componentWillUnmount() {
55
- this.autofetcher.stop();
56
- }
57
-
58
- fetchData() {
59
- const {getDescribe, tenant, currentSchemaPath} = this.props;
60
- const path = currentSchemaPath || tenant;
61
- getDescribe({path});
62
- }
63
-
64
- renderDescribeJson = () => {
65
- const {data} = this.props;
66
-
67
- return (
68
- <JSONTree
69
- data={data}
70
- className={b('tree')}
71
- onClick={({path}) => {
72
- const newValue = !(expandMap.get(path) || false);
73
- expandMap.set(path, newValue);
74
- }}
75
- searchOptions={{
76
- debounceTime: 300,
77
- }}
78
- isExpanded={(keypath) => {
79
- return expandMap.get(keypath) || false;
80
- }}
81
- />
82
- );
83
- };
84
-
85
- render() {
86
- const {error, loading, data, wasLoaded} = this.props;
87
-
88
- if (loading && !wasLoaded) {
89
- return (
90
- <div className={b('loader-container')}>
91
- <Loader size="m" />
92
- </div>
93
- );
94
- }
95
-
96
- if (error) {
97
- return <div className={b('message-container')}>{error.data || error}</div>;
98
- }
99
-
100
- if (!loading && !data) {
101
- return <div className={b('message-container')}>Empty</div>;
102
- }
103
-
104
- return (
105
- <div className={b()}>
106
- <div className={b('result')}>{this.renderDescribeJson()}</div>
107
- </div>
108
- );
109
- }
110
- }
111
-
112
- const mapStateToProps = (state) => {
113
- const {loading, error, currentDescribe, wasLoaded} = state.describe;
114
- const {autorefresh, currentSchemaPath} = state.schema;
115
-
116
- return {
117
- data: currentDescribe,
118
- loading,
119
- error,
120
- wasLoaded,
121
- autorefresh,
122
- currentSchemaPath,
123
- };
124
- };
125
-
126
- const mapDispatchToProps = {
127
- getDescribe,
128
- };
129
-
130
- export default connect(mapStateToProps, mapDispatchToProps)(Describe);