ydb-embedded-ui 4.0.0 → 4.2.0
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.md +28 -0
- package/dist/components/ClusterInfo/ClusterInfo.tsx +3 -3
- package/dist/components/LabelWithPopover/LabelWithPopover.tsx +10 -4
- package/dist/{containers/Nodes/NodesTable.scss → components/NodeHostWrapper/NodeHostWrapper.scss} +4 -6
- package/dist/components/NodeHostWrapper/NodeHostWrapper.tsx +60 -0
- package/dist/components/TabletsStatistic/TabletsStatistic.scss +1 -1
- package/dist/containers/App/App.scss +7 -4
- package/dist/containers/AsideNavigation/AsideNavigation.tsx +1 -11
- package/dist/containers/Header/Header.tsx +1 -1
- package/dist/containers/Nodes/getNodesColumns.tsx +7 -46
- package/dist/containers/Storage/StorageGroups/StorageGroups.tsx +3 -12
- package/dist/containers/Storage/StorageNodes/StorageNodes.scss +0 -24
- package/dist/containers/Storage/StorageNodes/StorageNodes.tsx +2 -39
- package/dist/containers/Storage/VDisk/VDisk.tsx +4 -11
- package/dist/containers/Storage/VDiskPopup/VDiskPopup.tsx +13 -16
- package/dist/containers/Storage/utils/types.ts +2 -1
- package/dist/containers/Tablet/Tablet.scss +4 -0
- package/dist/containers/Tablet/TabletTable/TabletTable.tsx +28 -6
- package/dist/containers/Tenant/Diagnostics/Healthcheck/Healthcheck.scss +1 -1
- package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo.ts +4 -3
- package/dist/containers/Tenant/QueryEditor/Issues/Issues.scss +1 -1
- package/dist/containers/Tenant/QueryEditor/QueryEditorControls/OldQueryEditorControls.tsx +1 -1
- package/dist/containers/Tenant/QueryEditor/QueryEditorControls/QueryEditorControls.tsx +1 -1
- package/dist/containers/Tenant/Schema/SchemaViewer/SchemaViewer.js +12 -0
- package/dist/containers/Tenants/Tenants.js +1 -1
- package/dist/containers/UserSettings/UserSettings.tsx +19 -17
- package/dist/services/api.ts +383 -0
- package/dist/store/reducers/{cluster.js → cluster/cluster.ts} +9 -14
- package/dist/store/reducers/cluster/types.ts +13 -0
- package/dist/store/reducers/executeTopQueries.ts +2 -2
- package/dist/store/reducers/index.ts +5 -4
- package/dist/store/reducers/node.js +5 -1
- package/dist/store/reducers/nodesList.ts +2 -7
- package/dist/store/reducers/settings.js +1 -14
- package/dist/store/reducers/storage.js +12 -0
- package/dist/store/reducers/tablet.ts +16 -2
- package/dist/store/reducers/{tenants.js → tenants/tenants.ts} +14 -9
- package/dist/store/reducers/tenants/types.ts +17 -0
- package/dist/store/utils.ts +3 -2
- package/dist/types/api/acl.ts +25 -0
- package/dist/types/api/cluster.ts +3 -0
- package/dist/types/api/compute.ts +5 -3
- package/dist/types/api/netInfo.ts +48 -0
- package/dist/types/api/nodes.ts +5 -3
- package/dist/types/api/pdisk.ts +11 -2
- package/dist/types/api/storage.ts +5 -3
- package/dist/types/api/tenant.ts +18 -3
- package/dist/types/api/vdisk.ts +10 -2
- package/dist/types/api/whoami.ts +19 -0
- package/dist/types/store/tablet.ts +1 -0
- package/dist/types/window.d.ts +5 -0
- package/dist/utils/createToast.tsx +2 -2
- package/dist/utils/hooks/useTypedSelector.ts +2 -2
- package/dist/utils/nodes.ts +14 -1
- package/package.json +4 -4
- package/dist/services/api.d.ts +0 -87
- package/dist/services/api.js +0 -278
@@ -26,16 +26,6 @@ export function readSavedSettingsValue(key, defaultValue) {
|
|
26
26
|
return savedValue ?? defaultValue;
|
27
27
|
}
|
28
28
|
|
29
|
-
// navigation managed its compact state internally before, and its approach is not compatible with settings
|
30
|
-
// try reading the old localStorage entry to use it as a default value, for backward compatibility
|
31
|
-
// assume it is safe to remove this code block if it is at least a few months old
|
32
|
-
// there a two of these, search for a similar comment
|
33
|
-
let legacyAsideNavCompactState = '';
|
34
|
-
try {
|
35
|
-
legacyAsideNavCompactState = String(JSON.parse(getValueFromLS('nvAsideHeader')).isCompact);
|
36
|
-
localStorage.removeItem('nvAsideHeader');
|
37
|
-
} catch {}
|
38
|
-
|
39
29
|
export const initialState = {
|
40
30
|
problemFilter: ALL,
|
41
31
|
userSettings: {
|
@@ -53,10 +43,7 @@ export const initialState = {
|
|
53
43
|
[SAVED_QUERIES_KEY]: readSavedSettingsValue(SAVED_QUERIES_KEY, '[]'),
|
54
44
|
[TENANT_INITIAL_TAB_KEY]: readSavedSettingsValue(TENANT_INITIAL_TAB_KEY),
|
55
45
|
[QUERY_INITIAL_MODE_KEY]: readSavedSettingsValue(QUERY_INITIAL_MODE_KEY, QueryModes.script),
|
56
|
-
[ASIDE_HEADER_COMPACT_KEY]: readSavedSettingsValue(
|
57
|
-
ASIDE_HEADER_COMPACT_KEY,
|
58
|
-
legacyAsideNavCompactState || 'true',
|
59
|
-
),
|
46
|
+
[ASIDE_HEADER_COMPACT_KEY]: readSavedSettingsValue(ASIDE_HEADER_COMPACT_KEY, 'true'),
|
60
47
|
[PARTITIONS_SELECTED_COLUMNS_KEY]: readSavedSettingsValue(PARTITIONS_SELECTED_COLUMNS_KEY),
|
61
48
|
},
|
62
49
|
systemSettings,
|
@@ -271,10 +271,22 @@ export const getFlatListStorageGroups = createSelector([getStoragePools], (stora
|
|
271
271
|
? currentType
|
272
272
|
: 'Mixed';
|
273
273
|
}, '');
|
274
|
+
|
275
|
+
// VDisk doesn't have its own StoragePoolName when located inside StoragePool data
|
276
|
+
const vDisks = group.VDisks?.map((vdisk) => ({
|
277
|
+
...vdisk,
|
278
|
+
StoragePoolName: pool.Name,
|
279
|
+
Donors: vdisk.Donors?.map((donor) => ({
|
280
|
+
...donor,
|
281
|
+
StoragePoolName: pool.Name,
|
282
|
+
})),
|
283
|
+
}));
|
284
|
+
|
274
285
|
return [
|
275
286
|
...acc,
|
276
287
|
{
|
277
288
|
...group,
|
289
|
+
VDisks: vDisks,
|
278
290
|
Read: readSpeedBytesPerSec,
|
279
291
|
Write: writeSpeedBytesPerSec,
|
280
292
|
PoolName: pool.Name,
|
@@ -11,6 +11,7 @@ import type {
|
|
11
11
|
import '../../services/api';
|
12
12
|
|
13
13
|
import {createRequestActionTypes, createApiRequest} from '../utils';
|
14
|
+
import {prepareNodesMap} from '../../utils/nodes';
|
14
15
|
|
15
16
|
export const FETCH_TABLET = createRequestActionTypes('TABLET', 'FETCH_TABLET');
|
16
17
|
export const FETCH_TABLET_DESCRIBE = createRequestActionTypes('TABLET', 'FETCH_TABLET_DESCRIBE');
|
@@ -63,9 +64,19 @@ const tablet: Reducer<ITabletState, ITabletAction> = (state = initialState, acti
|
|
63
64
|
|
64
65
|
export const getTablet = (id: string) => {
|
65
66
|
return createApiRequest({
|
66
|
-
request: Promise.all([
|
67
|
+
request: Promise.all([
|
68
|
+
window.api.getTablet({id}),
|
69
|
+
window.api.getTabletHistory({id}),
|
70
|
+
window.api.getNodesList(),
|
71
|
+
]),
|
67
72
|
actions: FETCH_TABLET,
|
68
|
-
dataHandler: ([
|
73
|
+
dataHandler: ([
|
74
|
+
tabletResponseData,
|
75
|
+
historyResponseData,
|
76
|
+
nodesList,
|
77
|
+
]): ITabletHandledResponse => {
|
78
|
+
const nodesMap = prepareNodesMap(nodesList);
|
79
|
+
|
69
80
|
const historyData = Object.keys(historyResponseData).reduce<
|
70
81
|
ITabletPreparedHistoryItem[]
|
71
82
|
>((list, nodeId) => {
|
@@ -75,6 +86,8 @@ export const getTablet = (id: string) => {
|
|
75
86
|
|
76
87
|
const {ChangeTime, Generation, State, Leader, FollowerId} = leaderTablet;
|
77
88
|
|
89
|
+
const fqdn = nodesMap && nodeId ? nodesMap.get(Number(nodeId)) : undefined;
|
90
|
+
|
78
91
|
list.push({
|
79
92
|
nodeId,
|
80
93
|
generation: Generation,
|
@@ -82,6 +95,7 @@ export const getTablet = (id: string) => {
|
|
82
95
|
state: State,
|
83
96
|
leader: Leader,
|
84
97
|
followerId: FollowerId,
|
98
|
+
fqdn,
|
85
99
|
});
|
86
100
|
}
|
87
101
|
return list;
|
@@ -1,12 +1,15 @@
|
|
1
|
-
import
|
2
|
-
import {createRequestActionTypes, createApiRequest} from '../utils';
|
3
|
-
import '../../services/api';
|
1
|
+
import type {Reducer} from 'redux';
|
4
2
|
|
5
|
-
|
3
|
+
import '../../../services/api';
|
4
|
+
import {createRequestActionTypes, createApiRequest} from '../../utils';
|
6
5
|
|
7
|
-
|
6
|
+
import type {TenantsAction, TenantsState} from './types';
|
8
7
|
|
9
|
-
const
|
8
|
+
export const FETCH_TENANTS = createRequestActionTypes('tenants', 'FETCH_TENANTS');
|
9
|
+
|
10
|
+
const initialState = {loading: true, wasLoaded: false};
|
11
|
+
|
12
|
+
const tenants: Reducer<TenantsState, TenantsAction> = (state = initialState, action) => {
|
10
13
|
switch (action.type) {
|
11
14
|
case FETCH_TENANTS.REQUEST: {
|
12
15
|
return {
|
@@ -35,20 +38,22 @@ const tenants = function (state = initialState, action) {
|
|
35
38
|
}
|
36
39
|
};
|
37
40
|
|
38
|
-
export function getTenantsInfo(clusterName) {
|
41
|
+
export function getTenantsInfo(clusterName?: string) {
|
39
42
|
return createApiRequest({
|
40
43
|
request: window.api.getTenants(clusterName),
|
41
44
|
actions: FETCH_TENANTS,
|
42
45
|
dataHandler: (response, getState) => {
|
43
46
|
const {singleClusterMode} = getState();
|
47
|
+
|
44
48
|
if (singleClusterMode) {
|
45
49
|
return response.TenantInfo;
|
46
50
|
} else {
|
47
|
-
return response.
|
51
|
+
return response.TenantInfo?.map((tenant) => {
|
48
52
|
const node = tenant.Nodes ? tenant.Nodes[0] : {};
|
49
53
|
const address =
|
50
54
|
node.Host && node.Endpoints
|
51
|
-
?
|
55
|
+
? node.Endpoints.find((endpoint) => endpoint.Name === 'http-mon')
|
56
|
+
?.Address
|
52
57
|
: undefined;
|
53
58
|
const backend = node.Host ? `${node.Host}${address ? address : ''}` : undefined;
|
54
59
|
return {...tenant, backend};
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import {FETCH_TENANTS} from './tenants';
|
2
|
+
|
3
|
+
import type {TTenant} from '../../../types/api/tenant';
|
4
|
+
import type {ApiRequestAction} from '../../utils';
|
5
|
+
|
6
|
+
export interface PreparedTenant extends TTenant {
|
7
|
+
backend?: string;
|
8
|
+
}
|
9
|
+
|
10
|
+
export interface TenantsState {
|
11
|
+
loading: boolean;
|
12
|
+
wasLoaded: boolean;
|
13
|
+
tenants?: PreparedTenant[];
|
14
|
+
error?: unknown;
|
15
|
+
}
|
16
|
+
|
17
|
+
export type TenantsAction = ApiRequestAction<typeof FETCH_TENANTS, PreparedTenant[], unknown>;
|
package/dist/store/utils.ts
CHANGED
@@ -4,6 +4,7 @@ import {AxiosResponse} from 'axios';
|
|
4
4
|
import createToast from '../utils/createToast';
|
5
5
|
|
6
6
|
import {SET_UNAUTHENTICATED} from './reducers/authentication';
|
7
|
+
import type {GetState} from './reducers';
|
7
8
|
|
8
9
|
export const nop = (result: any) => result;
|
9
10
|
|
@@ -24,7 +25,7 @@ const isAxiosResponse = (response: any): response is AxiosResponse =>
|
|
24
25
|
type CreateApiRequestParams<Actions, Response, HandledResponse> = {
|
25
26
|
actions: Actions;
|
26
27
|
request: Promise<Response>;
|
27
|
-
dataHandler?: (data: Response, getState
|
28
|
+
dataHandler?: (data: Response, getState: GetState) => HandledResponse;
|
28
29
|
};
|
29
30
|
|
30
31
|
export function createApiRequest<
|
@@ -36,7 +37,7 @@ export function createApiRequest<
|
|
36
37
|
request,
|
37
38
|
dataHandler = nop,
|
38
39
|
}: CreateApiRequestParams<Actions, Response, HandledResponse>) {
|
39
|
-
const doRequest = async function (dispatch: Dispatch, getState:
|
40
|
+
const doRequest = async function (dispatch: Dispatch, getState: GetState) {
|
40
41
|
dispatch({
|
41
42
|
type: actions.REQUEST,
|
42
43
|
});
|
@@ -0,0 +1,25 @@
|
|
1
|
+
/**
|
2
|
+
* endpoint: /viewer/json/acl
|
3
|
+
*
|
4
|
+
* source: https://github.com/ydb-platform/ydb/blob/main/ydb/core/viewer/protos/viewer.proto
|
5
|
+
*
|
6
|
+
* incomplete, only fields that present for ACL requests
|
7
|
+
*/
|
8
|
+
export interface TMetaInfo {
|
9
|
+
Common: TMetaCommonInfo;
|
10
|
+
}
|
11
|
+
|
12
|
+
/** incomplete */
|
13
|
+
export interface TMetaCommonInfo {
|
14
|
+
Path: string;
|
15
|
+
Owner?: string;
|
16
|
+
ACL?: TACE[];
|
17
|
+
}
|
18
|
+
|
19
|
+
interface TACE {
|
20
|
+
AccessType: string;
|
21
|
+
AccessRights?: string[];
|
22
|
+
Subject: string;
|
23
|
+
InheritanceType?: string[];
|
24
|
+
AccessRule: string;
|
25
|
+
}
|
@@ -2,9 +2,11 @@ import {EFlag} from './enums';
|
|
2
2
|
import {TEndpoint, TLegacyNodeLocation, TPoolStats} from './nodes';
|
3
3
|
import {TMetrics} from './tenant';
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
/**
|
6
|
+
* endpoint: viewer/json/compute
|
7
|
+
*
|
8
|
+
* source: https://github.com/ydb-platform/ydb/blob/main/ydb/core/viewer/protos/viewer.proto
|
9
|
+
*/
|
8
10
|
export interface TComputeInfo {
|
9
11
|
Overall: EFlag;
|
10
12
|
Tenants?: TComputeTenantInfo[];
|
@@ -0,0 +1,48 @@
|
|
1
|
+
import type {EFlag} from './enums';
|
2
|
+
|
3
|
+
/**
|
4
|
+
* endpoint: /viewer/json/netinfo
|
5
|
+
*
|
6
|
+
* source: https://github.com/ydb-platform/ydb/blob/main/ydb/core/viewer/protos/viewer.proto
|
7
|
+
*/
|
8
|
+
export interface TNetInfo {
|
9
|
+
Overall: EFlag;
|
10
|
+
Tenants?: TNetTenantInfo[];
|
11
|
+
}
|
12
|
+
|
13
|
+
interface TNetTenantInfo {
|
14
|
+
Overall: EFlag;
|
15
|
+
Name: string;
|
16
|
+
Nodes?: TNetNodeInfo[];
|
17
|
+
}
|
18
|
+
|
19
|
+
interface TNetNodeInfo {
|
20
|
+
NodeId: number;
|
21
|
+
Overall: EFlag;
|
22
|
+
Peers?: TNetNodePeerInfo[];
|
23
|
+
NodeType: ENodeType;
|
24
|
+
DataCenter: string;
|
25
|
+
Rack: string;
|
26
|
+
Host: string;
|
27
|
+
Port: number;
|
28
|
+
}
|
29
|
+
|
30
|
+
interface TNetNodePeerInfo {
|
31
|
+
NodeId: number;
|
32
|
+
PeerName: string;
|
33
|
+
Connected: boolean;
|
34
|
+
ConnectStatus: EFlag;
|
35
|
+
/** uint64 */
|
36
|
+
ChangeTime: string;
|
37
|
+
NodeType: ENodeType;
|
38
|
+
DataCenter: string;
|
39
|
+
Rack: string;
|
40
|
+
Host: string;
|
41
|
+
Port: number;
|
42
|
+
}
|
43
|
+
|
44
|
+
enum ENodeType {
|
45
|
+
UnknownNodeType,
|
46
|
+
Static,
|
47
|
+
Dynamic,
|
48
|
+
}
|
package/dist/types/api/nodes.ts
CHANGED
@@ -3,9 +3,11 @@ import {TPDiskStateInfo} from './pdisk';
|
|
3
3
|
import {TTabletStateInfo} from './tablet';
|
4
4
|
import {TVDiskStateInfo} from './vdisk';
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
/**
|
7
|
+
* endpoint: /viewer/json/nodes
|
8
|
+
*
|
9
|
+
* source: https://github.com/ydb-platform/ydb/blob/main/ydb/core/viewer/protos/viewer.proto
|
10
|
+
*/
|
9
11
|
export interface TNodesInfo {
|
10
12
|
Overall?: EFlag;
|
11
13
|
Nodes?: TNodeInfo[];
|
package/dist/types/api/pdisk.ts
CHANGED
@@ -1,7 +1,16 @@
|
|
1
1
|
import {EFlag} from './enums';
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
/**
|
4
|
+
* endpoint: /viewer/json/pdiskinfo
|
5
|
+
*
|
6
|
+
* source: https://github.com/ydb-platform/ydb/blob/main/ydb/core/protos/node_whiteboard.proto
|
7
|
+
*/
|
8
|
+
export interface TEvPDiskStateResponse {
|
9
|
+
PDiskStateInfo?: TPDiskStateInfo[];
|
10
|
+
/** uint64 */
|
11
|
+
ResponseTime?: string;
|
12
|
+
ResponseDuration?: number;
|
13
|
+
}
|
5
14
|
|
6
15
|
export interface TPDiskStateInfo {
|
7
16
|
PDiskId?: number;
|
@@ -1,9 +1,11 @@
|
|
1
1
|
import {EFlag} from './enums';
|
2
2
|
import {TVDiskStateInfo} from './vdisk';
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
/**
|
5
|
+
* endpoint: /viewer/json/storage
|
6
|
+
*
|
7
|
+
* source: https://github.com/ydb-platform/ydb/blob/main/ydb/core/viewer/protos/viewer.proto
|
8
|
+
*/
|
7
9
|
export interface TStorageInfo {
|
8
10
|
Overall?: EFlag;
|
9
11
|
StoragePools?: TStoragePoolInfo[];
|
package/dist/types/api/tenant.ts
CHANGED
@@ -2,13 +2,20 @@ import {EFlag} from './enums';
|
|
2
2
|
import {TPoolStats, TSystemStateInfo} from './nodes';
|
3
3
|
import {TTabletStateInfo} from './tablet';
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
/**
|
6
|
+
* endpoint: /viewer/json/tenants
|
7
|
+
*
|
8
|
+
* source: https://github.com/ydb-platform/ydb/blob/main/ydb/core/viewer/protos/viewer.proto
|
9
|
+
*/
|
8
10
|
export interface TTenants {
|
9
11
|
Tenants?: TTenant[];
|
10
12
|
}
|
11
13
|
|
14
|
+
/**
|
15
|
+
* endpoint: /viewer/json/tenantinfo
|
16
|
+
*
|
17
|
+
* source: https://github.com/ydb-platform/ydb/blob/main/ydb/core/viewer/protos/viewer.proto
|
18
|
+
*/
|
12
19
|
export interface TTenantInfo {
|
13
20
|
TenantInfo?: TTenant[];
|
14
21
|
Errors?: string[];
|
@@ -47,6 +54,9 @@ export interface TTenant {
|
|
47
54
|
CoresUsed: number;
|
48
55
|
/** uint64 */
|
49
56
|
StorageGroups: string;
|
57
|
+
|
58
|
+
MonitoringEndpoint?: string; // additional
|
59
|
+
ControlPlane?: ControlPlane; // additional
|
50
60
|
}
|
51
61
|
|
52
62
|
interface THiveDomainStatsStateCount {
|
@@ -107,6 +117,11 @@ interface TTenantResource {
|
|
107
117
|
Count: number;
|
108
118
|
}
|
109
119
|
|
120
|
+
/** incomplete */
|
121
|
+
interface ControlPlane {
|
122
|
+
name?: string;
|
123
|
+
}
|
124
|
+
|
110
125
|
export enum ETenantType {
|
111
126
|
'UnknownTenantType' = 'UnknownTenantType',
|
112
127
|
'Domain' = 'Domain',
|
package/dist/types/api/vdisk.ts
CHANGED
@@ -1,8 +1,16 @@
|
|
1
1
|
import {EFlag} from './enums';
|
2
2
|
import {TPDiskStateInfo} from './pdisk';
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
/**
|
5
|
+
* endpoint: /viewer/json/vdiskinfo
|
6
|
+
*
|
7
|
+
* source: https://github.com/ydb-platform/ydb/blob/main/ydb/core/protos/node_whiteboard.proto
|
8
|
+
*/
|
9
|
+
export interface TEvVDiskStateResponse {
|
10
|
+
VDiskStateInfo?: TVDiskStateInfo[];
|
11
|
+
ResponseTime?: string;
|
12
|
+
ResponseDuration?: number;
|
13
|
+
}
|
6
14
|
|
7
15
|
export interface TVDiskStateInfo {
|
8
16
|
VDiskId?: TVDiskID;
|
@@ -0,0 +1,19 @@
|
|
1
|
+
/**
|
2
|
+
* endpoint: /viewer/json/whoami
|
3
|
+
*
|
4
|
+
* source: https://github.com/ydb-platform/ydb/blob/main/ydb/library/aclib/protos/aclib.proto
|
5
|
+
*/
|
6
|
+
export interface TUserToken {
|
7
|
+
UserSID?: string;
|
8
|
+
GroupSIDs?: TProtoHashTable;
|
9
|
+
OriginalUserToken?: string;
|
10
|
+
AuthType?: string;
|
11
|
+
}
|
12
|
+
|
13
|
+
interface TProtoHashTable {
|
14
|
+
Buckets?: TProtoHashBucket[];
|
15
|
+
}
|
16
|
+
|
17
|
+
interface TProtoHashBucket {
|
18
|
+
Values?: string[];
|
19
|
+
}
|
package/dist/types/window.d.ts
CHANGED
@@ -37,4 +37,9 @@ interface Window {
|
|
37
37
|
custom_backend?: string;
|
38
38
|
|
39
39
|
__REDUX_DEVTOOLS_EXTENSION_COMPOSE__?: typeof import('redux').compose;
|
40
|
+
|
41
|
+
userSettings?: Record<string, string | undefined>;
|
42
|
+
systemSettings?: Record<string, string | undefined>;
|
43
|
+
|
44
|
+
api: import('../services/api').YdbEmbeddedAPI;
|
40
45
|
}
|
@@ -10,13 +10,13 @@ interface CreateToastProps {
|
|
10
10
|
}
|
11
11
|
|
12
12
|
function createToast({name, title, type, content}: CreateToastProps) {
|
13
|
-
return toaster.
|
13
|
+
return toaster.add({
|
14
14
|
name: name ?? 'Request succeeded',
|
15
15
|
title: title ?? 'Request succeeded',
|
16
16
|
type: type ?? 'success',
|
17
17
|
content: content,
|
18
18
|
isClosable: true,
|
19
|
-
|
19
|
+
autoHiding: type === 'success' ? 5000 : false,
|
20
20
|
});
|
21
21
|
}
|
22
22
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import {TypedUseSelectorHook, useSelector} from 'react-redux';
|
2
2
|
|
3
|
-
import {
|
3
|
+
import {RootState} from '../../store';
|
4
4
|
|
5
|
-
export const useTypedSelector: TypedUseSelectorHook<
|
5
|
+
export const useTypedSelector: TypedUseSelectorHook<RootState> = useSelector;
|
package/dist/utils/nodes.ts
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
import type {TSystemStateInfo} from '../types/api/nodes';
|
2
|
+
import type {TNodeInfo} from '../types/api/nodesList';
|
2
3
|
import type {INodesPreparedEntity} from '../types/store/nodes';
|
4
|
+
import type {NodesMap} from '../types/store/nodesList';
|
3
5
|
import {EFlag} from '../types/api/enums';
|
4
6
|
|
5
7
|
export enum NodesUptimeFilterValues {
|
@@ -15,6 +17,17 @@ export const NodesUptimeFilterTitles = {
|
|
15
17
|
export const isUnavailableNode = (node: INodesPreparedEntity | TSystemStateInfo) =>
|
16
18
|
!node.SystemState || node.SystemState === EFlag.Grey;
|
17
19
|
|
20
|
+
export type NodeAddress = Pick<TSystemStateInfo, 'Host' | 'Endpoints'>;
|
21
|
+
|
18
22
|
export interface AdditionalNodesInfo extends Record<string, unknown> {
|
19
|
-
getNodeRef?:
|
23
|
+
getNodeRef?: (node?: NodeAddress) => string;
|
20
24
|
}
|
25
|
+
|
26
|
+
export const prepareNodesMap = (nodesList?: TNodeInfo[]) => {
|
27
|
+
return nodesList?.reduce<NodesMap>((nodesMap, node) => {
|
28
|
+
if (node.Id && node.Host) {
|
29
|
+
nodesMap.set(Number(node.Id), node.Host);
|
30
|
+
}
|
31
|
+
return nodesMap;
|
32
|
+
}, new Map());
|
33
|
+
};
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "ydb-embedded-ui",
|
3
|
-
"version": "4.
|
3
|
+
"version": "4.2.0",
|
4
4
|
"files": [
|
5
5
|
"dist"
|
6
6
|
],
|
@@ -12,7 +12,7 @@
|
|
12
12
|
"@gravity-ui/axios-wrapper": "^1.3.0",
|
13
13
|
"@gravity-ui/date-utils": "^1.1.1",
|
14
14
|
"@gravity-ui/i18n": "^1.0.0",
|
15
|
-
"@gravity-ui/navigation": "^0.
|
15
|
+
"@gravity-ui/navigation": "^0.4.0",
|
16
16
|
"@gravity-ui/paranoid": "^1.4.0",
|
17
17
|
"@gravity-ui/react-data-table": "^1.0.3",
|
18
18
|
"axios": "0.19.2",
|
@@ -39,7 +39,7 @@
|
|
39
39
|
"reselect": "4.1.6",
|
40
40
|
"sass": "1.32.8",
|
41
41
|
"web-vitals": "1.1.2",
|
42
|
-
"ydb-ui-components": "^3.0
|
42
|
+
"ydb-ui-components": "^3.1.0"
|
43
43
|
},
|
44
44
|
"scripts": {
|
45
45
|
"start": "react-app-rewired start",
|
@@ -105,7 +105,7 @@
|
|
105
105
|
"@gravity-ui/prettier-config": "^1.0.1",
|
106
106
|
"@gravity-ui/stylelint-config": "^1.0.1",
|
107
107
|
"@gravity-ui/tsconfig": "^1.0.0",
|
108
|
-
"@gravity-ui/uikit": "^
|
108
|
+
"@gravity-ui/uikit": "^4.11.1",
|
109
109
|
"@playwright/test": "^1.31.1",
|
110
110
|
"@testing-library/jest-dom": "^5.15.0",
|
111
111
|
"@testing-library/react": "^11.2.7",
|
package/dist/services/api.d.ts
DELETED
@@ -1,87 +0,0 @@
|
|
1
|
-
type AxiosOptions = {
|
2
|
-
concurrentId?: string;
|
3
|
-
};
|
4
|
-
|
5
|
-
interface Window {
|
6
|
-
api: {
|
7
|
-
getSchema: (
|
8
|
-
params: {path: string},
|
9
|
-
axiosOptions?: AxiosOptions,
|
10
|
-
) => Promise<import('../types/api/schema').TEvDescribeSchemeResult>;
|
11
|
-
getDescribe: (
|
12
|
-
params: {path: string},
|
13
|
-
axiosOptions?: AxiosOptions,
|
14
|
-
) => Promise<import('../types/api/schema').TEvDescribeSchemeResult>;
|
15
|
-
getStorageInfo: (
|
16
|
-
params: {
|
17
|
-
tenant: string;
|
18
|
-
filter: string;
|
19
|
-
nodeId: string;
|
20
|
-
},
|
21
|
-
axiosOptions?: AxiosOptions,
|
22
|
-
) => Promise<import('../types/api/storage').TStorageInfo>;
|
23
|
-
getNodes: (
|
24
|
-
params: import('../types/store/nodes').INodesApiRequestParams,
|
25
|
-
axiosOptions?: AxiosOptions,
|
26
|
-
) => Promise<import('../types/api/nodes').TNodesInfo>;
|
27
|
-
getCompute: (path: string) => Promise<import('../types/api/compute').TComputeInfo>;
|
28
|
-
sendQuery: <
|
29
|
-
Action extends import('../types/api/query').Actions,
|
30
|
-
Schema extends import('../types/api/query').Schemas = undefined,
|
31
|
-
>(
|
32
|
-
params: {
|
33
|
-
query?: string;
|
34
|
-
database?: string;
|
35
|
-
action?: Action;
|
36
|
-
stats?: string;
|
37
|
-
schema?: Schema;
|
38
|
-
},
|
39
|
-
axiosOptions?: AxiosOptions,
|
40
|
-
) => Promise<import('../types/api/query').QueryAPIResponse<Action, Schema>>;
|
41
|
-
getExplainQuery: <Action extends import('../types/api/query').ExplainActions = 'explain'>(
|
42
|
-
query: string,
|
43
|
-
database: string,
|
44
|
-
action?: Action,
|
45
|
-
) => Promise<import('../types/api/query').ExplainResponse<Action>>;
|
46
|
-
getExplainQueryAst: (
|
47
|
-
query: string,
|
48
|
-
database: string,
|
49
|
-
) => Promise<import('../types/api/query').ExplainResponse<'explain-ast'>>;
|
50
|
-
getHealthcheckInfo: (
|
51
|
-
database: string,
|
52
|
-
) => Promise<import('../types/api/healthcheck').HealthCheckAPIResponse>;
|
53
|
-
getTenantInfo: (params: {
|
54
|
-
path: string;
|
55
|
-
}) => Promise<import('../types/api/tenant').TTenantInfo>;
|
56
|
-
getClusterInfo: () => Promise<import('../types/api/cluster').TClusterInfo>;
|
57
|
-
getTabletsInfo: (params: {
|
58
|
-
nodes?: string[];
|
59
|
-
path?: string;
|
60
|
-
}) => Promise<import('../types/api/tablet').TEvTabletStateResponse>;
|
61
|
-
getTabletDescribe: (
|
62
|
-
tenantId?: import('../types/api/tablet').TDomainKey,
|
63
|
-
) => Promise<import('../types/api/schema').TEvDescribeSchemeResult>;
|
64
|
-
getTablet: (params: {
|
65
|
-
id?: string;
|
66
|
-
}) => Promise<import('../types/api/tablet').TEvTabletStateResponse>;
|
67
|
-
getTabletHistory: (params: {
|
68
|
-
id?: string;
|
69
|
-
}) => Promise<import('../types/api/tablet').UnmergedTEvTabletStateResponse>;
|
70
|
-
getHeatmapData: (params: {
|
71
|
-
path: string;
|
72
|
-
}) => Promise<import('../types/api/schema').TEvDescribeSchemeResult>;
|
73
|
-
getTopic: (params: {
|
74
|
-
path?: string;
|
75
|
-
}) => Promise<import('../types/api/topic').DescribeTopicResult>;
|
76
|
-
getConsumer: (params: {
|
77
|
-
path?: string;
|
78
|
-
consumer?: string;
|
79
|
-
}) => Promise<import('../types/api/consumer').DescribeConsumerResult>;
|
80
|
-
getHostInfo: () => Promise<import('../types/api/systemState').TEvSystemStateResponse>;
|
81
|
-
getNodeInfo: (
|
82
|
-
id?: string,
|
83
|
-
) => Promise<import('../types/api/systemState').TEvSystemStateResponse>;
|
84
|
-
getNodesList: () => Promise<import('../types/api/nodesList').TEvNodesInfo>;
|
85
|
-
[method: string]: Function;
|
86
|
-
};
|
87
|
-
}
|