ydb-embedded-ui 1.8.8 → 1.10.1
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.md +51 -0
- package/dist/components/BasicNodeViewer/BasicNodeViewer.scss +43 -0
- package/dist/components/BasicNodeViewer/BasicNodeViewer.tsx +53 -0
- package/dist/components/BasicNodeViewer/index.ts +1 -0
- package/dist/components/EntityStatus/EntityStatus.js +15 -3
- package/dist/components/FullNodeViewer/FullNodeViewer.js +29 -48
- package/dist/components/FullNodeViewer/FullNodeViewer.scss +0 -45
- package/dist/components/IndexInfoViewer/IndexInfoViewer.tsx +52 -0
- package/dist/components/InfoViewer/index.ts +4 -0
- package/dist/components/InfoViewer/utils.ts +32 -0
- package/dist/components/ProgressViewer/ProgressViewer.js +1 -1
- package/dist/containers/Node/Node.scss +5 -1
- package/dist/containers/Node/Node.tsx +7 -1
- package/dist/containers/Node/NodeOverview/NodeOverview.tsx +1 -3
- package/dist/containers/Node/NodeStructure/NodeStructure.scss +30 -1
- package/dist/containers/Node/NodeStructure/PDiskTitleBadge.tsx +25 -0
- package/dist/containers/Node/NodeStructure/Pdisk.tsx +24 -2
- package/dist/containers/Nodes/Nodes.js +1 -0
- package/dist/containers/Storage/Pdisk/Pdisk.tsx +25 -33
- package/dist/containers/Storage/Vdisk/Vdisk.js +2 -0
- package/dist/containers/Tablet/Tablet.js +2 -2
- package/dist/containers/Tenant/Diagnostics/DiagnosticsPages.ts +24 -14
- package/dist/containers/Tenant/Diagnostics/HotKeys/HotKeys.js +3 -3
- package/dist/containers/Tenant/Diagnostics/Overview/Overview.tsx +24 -3
- package/dist/containers/Tenant/Diagnostics/TopShards/TopShards.js +80 -10
- package/dist/containers/Tenant/Schema/SchemaInfoViewer/SchemaInfoViewer.js +20 -16
- package/dist/containers/Tenant/Schema/SchemaTree/SchemaTree.tsx +1 -0
- package/dist/containers/Tenant/utils/schema.ts +73 -28
- package/dist/containers/Tenant/utils/schemaActions.ts +45 -32
- package/dist/services/api.js +13 -8
- package/dist/store/reducers/executeQuery.js +1 -1
- package/dist/store/reducers/executeTopQueries.js +1 -1
- package/dist/store/reducers/olapStats.js +5 -1
- package/dist/store/reducers/preview.js +1 -1
- package/dist/store/reducers/shardsWorkload.js +32 -4
- package/dist/types/api/schema.ts +43 -1
- package/dist/types/api/storage.ts +54 -0
- package/dist/utils/getNodesColumns.js +2 -0
- package/dist/utils/pdisk.ts +74 -0
- package/dist/utils/tooltip.js +27 -0
- package/package.json +2 -2
@@ -1,5 +1,5 @@
|
|
1
1
|
import {Dispatch} from 'react';
|
2
|
-
import type {NavigationTreeNodeType} from 'ydb-ui-components';
|
2
|
+
import type {NavigationTreeNodeType, NavigationTreeProps} from 'ydb-ui-components';
|
3
3
|
|
4
4
|
import {changeUserInput} from '../../../store/reducers/executeQuery';
|
5
5
|
import {setShowPreview} from '../../../store/reducers/schema';
|
@@ -73,6 +73,8 @@ const bindActions = (
|
|
73
73
|
};
|
74
74
|
};
|
75
75
|
|
76
|
+
type ActionsSet = ReturnType<Required<NavigationTreeProps>['getActions']>;
|
77
|
+
|
76
78
|
export const getActions = (
|
77
79
|
dispatch: Dispatch<any>,
|
78
80
|
setActivePath: (path: string) => void,
|
@@ -81,35 +83,46 @@ export const getActions = (
|
|
81
83
|
const actions = bindActions(path, dispatch, setActivePath);
|
82
84
|
const copyItem = {text: 'Copy path', action: actions.copyPath};
|
83
85
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
86
|
+
const DIR_SET: ActionsSet = [
|
87
|
+
[
|
88
|
+
copyItem,
|
89
|
+
],
|
90
|
+
[
|
91
|
+
{text: 'Create table...', action: actions.createTable},
|
92
|
+
],
|
93
|
+
];
|
94
|
+
const TABLE_SET: ActionsSet = [
|
95
|
+
[
|
96
|
+
{text: 'Open preview', action: actions.openPreview},
|
97
|
+
copyItem,
|
98
|
+
],
|
99
|
+
[
|
100
|
+
{text: 'Alter table...', action: actions.alterTable},
|
101
|
+
{text: 'Select query...', action: actions.selectQuery},
|
102
|
+
{text: 'Upsert query...', action: actions.upsertQuery},
|
103
|
+
],
|
104
|
+
];
|
105
|
+
|
106
|
+
const JUST_COPY: ActionsSet = [
|
107
|
+
copyItem,
|
108
|
+
];
|
109
|
+
|
110
|
+
const EMPTY_SET: ActionsSet = [];
|
111
|
+
|
112
|
+
// verbose mapping to guarantee a correct actions set for new node types
|
113
|
+
// TS will error when a new type is added in the lib but is not mapped here
|
114
|
+
const nodeTypeToActions: Record<NavigationTreeNodeType, ActionsSet> = {
|
115
|
+
database: DIR_SET,
|
116
|
+
directory: DIR_SET,
|
117
|
+
|
118
|
+
table: TABLE_SET,
|
119
|
+
column_table: TABLE_SET,
|
120
|
+
|
121
|
+
index_table: JUST_COPY,
|
122
|
+
topic: JUST_COPY,
|
123
|
+
|
124
|
+
index: EMPTY_SET,
|
125
|
+
};
|
126
|
+
|
127
|
+
return nodeTypeToActions[type];
|
115
128
|
};
|
package/dist/services/api.js
CHANGED
@@ -147,14 +147,19 @@ export class YdbEmbeddedAPI extends AxiosWrapper {
|
|
147
147
|
state: 0,
|
148
148
|
});
|
149
149
|
}
|
150
|
-
sendQuery(query, database, action, stats) {
|
151
|
-
return this.post(
|
152
|
-
query,
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
150
|
+
sendQuery({query, database, action, stats}, {concurrentId} = {}) {
|
151
|
+
return this.post(
|
152
|
+
this.getPath('/viewer/json/query'),
|
153
|
+
{
|
154
|
+
query,
|
155
|
+
database,
|
156
|
+
action,
|
157
|
+
stats,
|
158
|
+
timeout: 600000,
|
159
|
+
},
|
160
|
+
null,
|
161
|
+
{concurrentId},
|
162
|
+
);
|
158
163
|
}
|
159
164
|
getExplainQuery(query, database) {
|
160
165
|
return this.post(this.getPath('/viewer/json/query'), {
|
@@ -141,7 +141,7 @@ const executeQuery = (state = initialState, action) => {
|
|
141
141
|
|
142
142
|
export const sendQuery = ({query, database, action}) => {
|
143
143
|
return createApiRequest({
|
144
|
-
request: window.api.sendQuery(query, database, action, 'profile'),
|
144
|
+
request: window.api.sendQuery({query, database, action, stats: 'profile'}),
|
145
145
|
actions: SEND_QUERY,
|
146
146
|
dataHandler: (result) => {
|
147
147
|
const resultData = result.result ?? result;
|
@@ -47,7 +47,7 @@ const executeTopQueries = (state = initialState, action) => {
|
|
47
47
|
|
48
48
|
export const sendQuery = ({query, database, action}) => {
|
49
49
|
return createApiRequest({
|
50
|
-
request: window.api.sendQuery(query, database, action),
|
50
|
+
request: window.api.sendQuery({query, database, action}),
|
51
51
|
actions: SEND_QUERY,
|
52
52
|
dataHandler: (result) => {
|
53
53
|
if (result && typeof result === 'string') {
|
@@ -52,7 +52,11 @@ const olapStats = (state = initialState, action) => {
|
|
52
52
|
|
53
53
|
export const getOlapStats = ({path = ''}) => {
|
54
54
|
return createApiRequest({
|
55
|
-
request: window.api.sendQuery(
|
55
|
+
request: window.api.sendQuery({
|
56
|
+
query: createOlatStatsQuery(path),
|
57
|
+
database: path,
|
58
|
+
action: queryAction,
|
59
|
+
}),
|
56
60
|
actions: FETCH_OLAP_STATS,
|
57
61
|
dataHandler: (result) => {
|
58
62
|
if (result && typeof result === 'string') {
|
@@ -47,7 +47,7 @@ const preview = (state = initialState, action) => {
|
|
47
47
|
|
48
48
|
export const sendQuery = ({query, database, action}) => {
|
49
49
|
return createApiRequest({
|
50
|
-
request: window.api.sendQuery(query, database, action),
|
50
|
+
request: window.api.sendQuery({query, database, action}),
|
51
51
|
actions: SEND_QUERY,
|
52
52
|
dataHandler: (data) => {
|
53
53
|
if (!Array.isArray(data)) {
|
@@ -9,8 +9,30 @@ const initialState = {
|
|
9
9
|
wasLoaded: false,
|
10
10
|
};
|
11
11
|
|
12
|
-
function
|
13
|
-
return
|
12
|
+
function formatSortOrder({columnId, order}) {
|
13
|
+
return `${columnId} ${order}`;
|
14
|
+
}
|
15
|
+
|
16
|
+
function createShardQuery(path, sortOrder, tenantName) {
|
17
|
+
const orderBy = Array.isArray(sortOrder) ?
|
18
|
+
`ORDER BY ${sortOrder.map(formatSortOrder).join(', ')}` :
|
19
|
+
'';
|
20
|
+
|
21
|
+
const pathSelect = tenantName ?
|
22
|
+
`CAST(SUBSTRING(CAST(Path AS String), ${tenantName.length}) AS Utf8) AS Path` :
|
23
|
+
'Path';
|
24
|
+
|
25
|
+
return `SELECT
|
26
|
+
${pathSelect},
|
27
|
+
TabletId,
|
28
|
+
CPUCores,
|
29
|
+
DataSize
|
30
|
+
FROM \`.sys/partition_stats\`
|
31
|
+
WHERE
|
32
|
+
Path='${path}'
|
33
|
+
OR Path LIKE '${path}/%'
|
34
|
+
${orderBy}
|
35
|
+
LIMIT 20`;
|
14
36
|
}
|
15
37
|
|
16
38
|
const queryAction = 'execute-scan';
|
@@ -51,9 +73,15 @@ const shardsWorkload = (state = initialState, action) => {
|
|
51
73
|
}
|
52
74
|
};
|
53
75
|
|
54
|
-
export const sendShardQuery = ({database, path = ''}) => {
|
76
|
+
export const sendShardQuery = ({database, path = '', sortOrder}) => {
|
55
77
|
return createApiRequest({
|
56
|
-
request: window.api.sendQuery(
|
78
|
+
request: window.api.sendQuery({
|
79
|
+
query: createShardQuery(path, sortOrder, database),
|
80
|
+
database,
|
81
|
+
action: queryAction,
|
82
|
+
}, {
|
83
|
+
concurrentId: 'topShards',
|
84
|
+
}),
|
57
85
|
actions: SEND_SHARD_QUERY,
|
58
86
|
dataHandler: (result) => {
|
59
87
|
if (result && typeof result === 'string') {
|
package/dist/types/api/schema.ts
CHANGED
@@ -54,6 +54,8 @@ interface TPathDescription {
|
|
54
54
|
|
55
55
|
ColumnStoreDescription?: unknown;
|
56
56
|
ColumnTableDescription?: unknown;
|
57
|
+
|
58
|
+
TableIndex?: TIndexDescription;
|
57
59
|
}
|
58
60
|
|
59
61
|
interface TDirEntry {
|
@@ -80,15 +82,42 @@ interface TDirEntry {
|
|
80
82
|
Version?: TPathVersion;
|
81
83
|
}
|
82
84
|
|
85
|
+
export interface TIndexDescription {
|
86
|
+
Name?: string;
|
87
|
+
/** uint64 */
|
88
|
+
LocalPathId?: string;
|
89
|
+
|
90
|
+
Type?: EIndexType;
|
91
|
+
State?: EIndexState;
|
92
|
+
|
93
|
+
KeyColumnNames?: string[];
|
94
|
+
|
95
|
+
/** uint64 */
|
96
|
+
SchemaVersion?: string;
|
97
|
+
|
98
|
+
/** uint64 */
|
99
|
+
PathOwnerId?: string;
|
100
|
+
|
101
|
+
DataColumnNames?: string[];
|
102
|
+
/** uint64 */
|
103
|
+
DataSize?: string;
|
104
|
+
}
|
105
|
+
|
83
106
|
// incomplete
|
84
107
|
export enum EPathType {
|
85
108
|
EPathTypeInvalid = 'EPathTypeInvalid',
|
86
109
|
EPathTypeDir = 'EPathTypeDir',
|
87
110
|
EPathTypeTable = 'EPathTypeTable',
|
111
|
+
|
88
112
|
EPathTypeSubDomain = 'EPathTypeSubDomain',
|
113
|
+
|
114
|
+
EPathTypeTableIndex = 'EPathTypeTableIndex',
|
115
|
+
EPathTypeExtSubDomain = 'EPathTypeExtSubDomain',
|
116
|
+
|
89
117
|
EPathTypeColumnStore = 'EPathTypeColumnStore',
|
90
118
|
EPathTypeColumnTable = 'EPathTypeColumnTable',
|
91
|
-
|
119
|
+
EPathTypeCdcStream = 'EPathTypeCdcStream',
|
120
|
+
|
92
121
|
}
|
93
122
|
|
94
123
|
export enum EPathSubType {
|
@@ -112,6 +141,19 @@ enum EPathState {
|
|
112
141
|
EPathStateMoving = 'EPathStateMoving',
|
113
142
|
}
|
114
143
|
|
144
|
+
enum EIndexType {
|
145
|
+
EIndexTypeInvalid = 'EIndexTypeInvalid',
|
146
|
+
EIndexTypeGlobal = 'EIndexTypeGlobal',
|
147
|
+
EIndexTypeGlobalAsync = 'EIndexTypeGlobalAsync',
|
148
|
+
}
|
149
|
+
|
150
|
+
enum EIndexState {
|
151
|
+
EIndexStateInvalid = 'EIndexStateInvalid',
|
152
|
+
EIndexStateReady = 'EIndexStateReady',
|
153
|
+
EIndexStateNotReady = 'EIndexStateNotReady',
|
154
|
+
EIndexStateWriteOnly = 'EIndexStateWriteOnly',
|
155
|
+
}
|
156
|
+
|
115
157
|
// incomplete
|
116
158
|
interface TPathVersion {
|
117
159
|
/** uint64 */
|
@@ -0,0 +1,54 @@
|
|
1
|
+
enum EFlag {
|
2
|
+
Grey = 'Grey',
|
3
|
+
Green = 'Green',
|
4
|
+
Yellow = 'Yellow',
|
5
|
+
Orange = 'Orange',
|
6
|
+
Red = 'Red',
|
7
|
+
}
|
8
|
+
|
9
|
+
export enum TPDiskState {
|
10
|
+
Initial = 'Initial',
|
11
|
+
InitialFormatRead = 'InitialFormatRead',
|
12
|
+
InitialFormatReadError = 'InitialFormatReadError',
|
13
|
+
InitialSysLogRead = 'InitialSysLogRead',
|
14
|
+
InitialSysLogReadError = 'InitialSysLogReadError',
|
15
|
+
InitialSysLogParseError = 'InitialSysLogParseError',
|
16
|
+
InitialCommonLogRead = 'InitialCommonLogRead',
|
17
|
+
InitialCommonLogReadError = 'InitialCommonLogReadError',
|
18
|
+
InitialCommonLogParseError = 'InitialCommonLogParseError',
|
19
|
+
CommonLoggerInitError = 'CommonLoggerInitError',
|
20
|
+
Normal = 'Normal',
|
21
|
+
OpenFileError = 'OpenFileError',
|
22
|
+
ChunkQuotaError = 'ChunkQuotaError',
|
23
|
+
DeviceIoError = 'DeviceIoError',
|
24
|
+
|
25
|
+
Missing = 'Missing',
|
26
|
+
Timeout = 'Timeout',
|
27
|
+
NodeDisconnected = 'NodeDisconnected',
|
28
|
+
Unknown = 'Unknown',
|
29
|
+
}
|
30
|
+
|
31
|
+
export interface TPDiskStateInfo {
|
32
|
+
PDiskId?: number;
|
33
|
+
/** uint64 */
|
34
|
+
CreateTime?: string;
|
35
|
+
/** uint64 */
|
36
|
+
ChangeTime?: string;
|
37
|
+
Path?: string;
|
38
|
+
/** uint64 */
|
39
|
+
Guid?: string;
|
40
|
+
/** uint64 */
|
41
|
+
Category?: string;
|
42
|
+
/** uint64 */
|
43
|
+
AvailableSize?: string;
|
44
|
+
/** uint64 */
|
45
|
+
TotalSize?: string;
|
46
|
+
State?: TPDiskState;
|
47
|
+
NodeId?: number;
|
48
|
+
Count?: number;
|
49
|
+
Device?: EFlag;
|
50
|
+
Realtime?: EFlag;
|
51
|
+
StateFlag?: EFlag;
|
52
|
+
Overall?: EFlag;
|
53
|
+
SerialNumber?: string;
|
54
|
+
}
|
@@ -33,6 +33,8 @@ export function getNodesColumns({showTooltip, hideTooltip, tabletsPath, getNodeR
|
|
33
33
|
<div className={b('host-name-wrapper')}>
|
34
34
|
<EntityStatus
|
35
35
|
name={row.Host}
|
36
|
+
onNameMouseEnter={(e) => showTooltip(e.target, row, 'nodeEndpoints')}
|
37
|
+
onNameMouseLeave={hideTooltip}
|
36
38
|
status={row.Overall}
|
37
39
|
path={getDefaultNodePath(row.NodeId)}
|
38
40
|
hasClipboardButton
|
@@ -0,0 +1,74 @@
|
|
1
|
+
import type {TPDiskStateInfo} from "../types/api/storage";
|
2
|
+
|
3
|
+
// TODO: move to utils or index after converting them to TS
|
4
|
+
/**
|
5
|
+
* Parses a binary string containing a bit field into an object with binary values.
|
6
|
+
* This is an implementation based on string manipulation, since JS can only perform
|
7
|
+
* bitwise operations with 32-bits integers, and YDB sends uint64.
|
8
|
+
* @see https://en.cppreference.com/w/c/language/bit_field
|
9
|
+
* @param binaryString - binary string representing a bit field
|
10
|
+
* @param bitFieldStruct - bit field description, <field => size in bits>, in order starting from the rightmost bit
|
11
|
+
* @returns object with binary values
|
12
|
+
*/
|
13
|
+
export const parseBitField = <T extends Record<string, number>>(
|
14
|
+
binaryString: string,
|
15
|
+
bitFieldStruct: T,
|
16
|
+
): Record<keyof T, string> => {
|
17
|
+
const fields: Partial<Record<keyof T, string>> = {};
|
18
|
+
|
19
|
+
Object.entries(bitFieldStruct).reduce((prefixSize, [field, size]: [keyof T, number]) => {
|
20
|
+
const end = binaryString.length - prefixSize;
|
21
|
+
const start = end - size;
|
22
|
+
fields[field] = binaryString.substring(start, end) || '0';
|
23
|
+
|
24
|
+
return prefixSize + size;
|
25
|
+
}, 0);
|
26
|
+
|
27
|
+
return fields as Record<keyof T, string>;
|
28
|
+
};
|
29
|
+
|
30
|
+
export enum IPDiskType {
|
31
|
+
ROT = 'ROT',
|
32
|
+
SSD = 'SSD',
|
33
|
+
MVME = 'NVME',
|
34
|
+
}
|
35
|
+
|
36
|
+
// Bear with me.
|
37
|
+
// Disk type is determined by the field Category.
|
38
|
+
// Category is a bit field defined as follows:
|
39
|
+
// struct {
|
40
|
+
// ui64 IsSolidState : 1;
|
41
|
+
// ui64 Kind : 55;
|
42
|
+
// ui64 TypeExt : 8;
|
43
|
+
// }
|
44
|
+
// For compatibility TypeExt is not used for old types (ROT, SSD), so the following scheme is used:
|
45
|
+
// ROT -> IsSolidState# 0, TypeExt# 0
|
46
|
+
// SSD -> IsSolidState# 1, TypeExt# 0
|
47
|
+
// NVME -> IsSolidState# 1, TypeExt# 2
|
48
|
+
// Reference on bit fields: https://en.cppreference.com/w/c/language/bit_field
|
49
|
+
export const getPDiskType = (data: TPDiskStateInfo): IPDiskType | undefined => {
|
50
|
+
if (!data.Category) {
|
51
|
+
return undefined;
|
52
|
+
}
|
53
|
+
|
54
|
+
// Category is uint64, too big for Number or bitwise operators, thus BigInt and a custom parser
|
55
|
+
const categotyBin = BigInt(data.Category).toString(2);
|
56
|
+
const categoryBitField = parseBitField(categotyBin, {
|
57
|
+
isSolidState: 1,
|
58
|
+
kind: 55,
|
59
|
+
typeExt: 8,
|
60
|
+
});
|
61
|
+
|
62
|
+
if (categoryBitField.isSolidState === '1') {
|
63
|
+
switch (parseInt(categoryBitField.typeExt, 2)) {
|
64
|
+
case 0:
|
65
|
+
return IPDiskType.SSD;
|
66
|
+
case 2:
|
67
|
+
return IPDiskType.MVME;
|
68
|
+
}
|
69
|
+
} else if (categoryBitField.typeExt === '0') {
|
70
|
+
return IPDiskType.ROT;
|
71
|
+
}
|
72
|
+
|
73
|
+
return undefined;
|
74
|
+
};
|
package/dist/utils/tooltip.js
CHANGED
@@ -109,6 +109,32 @@ const NodeTooltip = (props) => {
|
|
109
109
|
);
|
110
110
|
};
|
111
111
|
|
112
|
+
const NodeEndpointsTooltip = (props) => {
|
113
|
+
const {data} = props;
|
114
|
+
return (
|
115
|
+
data && (
|
116
|
+
<div className={nodeB()}>
|
117
|
+
<table>
|
118
|
+
<tbody>
|
119
|
+
{data.Rack && (
|
120
|
+
<tr>
|
121
|
+
<td className={nodeB('label')}>Rack</td>
|
122
|
+
<td className={nodeB('value')}>{data.Rack}</td>
|
123
|
+
</tr>
|
124
|
+
)}
|
125
|
+
{data.Endpoints && data.Endpoints.length && data.Endpoints.map(({Name, Address}) => (
|
126
|
+
<tr key={Name}>
|
127
|
+
<td className={nodeB('label')}>{Name}</td>
|
128
|
+
<td className={nodeB('value')}>{Address}</td>
|
129
|
+
</tr>
|
130
|
+
))}
|
131
|
+
</tbody>
|
132
|
+
</table>
|
133
|
+
</div>
|
134
|
+
)
|
135
|
+
);
|
136
|
+
};
|
137
|
+
|
112
138
|
const tabletsOverallB = cn('tabletsOverall-tooltip');
|
113
139
|
|
114
140
|
const TabletsOverallTooltip = (props) => {
|
@@ -175,6 +201,7 @@ export const tooltipTemplates = {
|
|
175
201
|
tablet: (data, additionalData) => <TabletTooltip data={data} additionalData={additionalData} />,
|
176
202
|
// eslint-disable-next-line react/display-name
|
177
203
|
node: (data) => <NodeTooltip data={data} />,
|
204
|
+
nodeEndpoints: (data) => <NodeEndpointsTooltip data={data} />,
|
178
205
|
// eslint-disable-next-line react/display-name
|
179
206
|
tabletsOverall: (data) => <TabletsOverallTooltip data={data} />,
|
180
207
|
// eslint-disable-next-line react/display-name
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "ydb-embedded-ui",
|
3
|
-
"version": "1.
|
3
|
+
"version": "1.10.1",
|
4
4
|
"files": [
|
5
5
|
"dist"
|
6
6
|
],
|
@@ -40,7 +40,7 @@
|
|
40
40
|
"reselect": "4.0.0",
|
41
41
|
"sass": "1.32.8",
|
42
42
|
"web-vitals": "1.1.2",
|
43
|
-
"ydb-ui-components": "2.
|
43
|
+
"ydb-ui-components": "2.4.1"
|
44
44
|
},
|
45
45
|
"scripts": {
|
46
46
|
"start": "react-app-rewired start",
|