ydb-embedded-ui 21.1.0 → 22.0.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.
Files changed (214) hide show
  1. package/dist/components/ComponentsProvider/ComponentsProvider.d.ts +0 -4
  2. package/dist/components/ComponentsProvider/componentsRegistry.d.ts +0 -2
  3. package/dist/components/ComponentsProvider/componentsRegistry.js +1 -3
  4. package/dist/components/ComponentsProvider/componentsRegistry.js.map +1 -1
  5. package/dist/components/ContentWithPopup/ContentWithPopup.d.ts +1 -1
  6. package/dist/components/ContentWithPopup/ContentWithPopup.js +4 -2
  7. package/dist/components/ContentWithPopup/ContentWithPopup.js.map +1 -1
  8. package/dist/components/FullNodeViewer/i18n/index.d.ts +1 -1
  9. package/dist/components/HoverPopup/HoverPopup.js +27 -4
  10. package/dist/components/HoverPopup/HoverPopup.js.map +1 -1
  11. package/dist/components/HoverPopup/getPopupScrollContainer.d.ts +1 -0
  12. package/dist/components/HoverPopup/getPopupScrollContainer.js +20 -0
  13. package/dist/components/HoverPopup/getPopupScrollContainer.js.map +1 -0
  14. package/dist/components/MetricChart/reducer.d.ts +2 -2
  15. package/dist/components/SegmentedProgress/SegmentedProgress.d.ts +22 -1
  16. package/dist/components/SegmentedProgress/SegmentedProgress.js +44 -3
  17. package/dist/components/SegmentedProgress/SegmentedProgress.js.map +1 -1
  18. package/dist/components/SegmentedProgress/SegmentedProgress.scss +5 -0
  19. package/dist/components/StorageGroupInfo/StorageGroupInfo.js +1 -13
  20. package/dist/components/StorageGroupInfo/StorageGroupInfo.js.map +1 -1
  21. package/dist/components/StorageGroupInfo/i18n/en.json +0 -1
  22. package/dist/components/StorageGroupInfo/i18n/index.d.ts +1 -1
  23. package/dist/components/nodesColumns/i18n/index.d.ts +1 -1
  24. package/dist/containers/App/App.js +3 -3
  25. package/dist/containers/App/App.js.map +1 -1
  26. package/dist/containers/Cluster/ClusterInfo/ClusterInfo.js +8 -5
  27. package/dist/containers/Cluster/ClusterInfo/ClusterInfo.js.map +1 -1
  28. package/dist/containers/Cluster/ClusterInfo/ClusterInfo.scss +8 -0
  29. package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.d.ts +4 -3
  30. package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.js +62 -25
  31. package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.js.map +1 -1
  32. package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.scss +18 -0
  33. package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/utils.d.ts +22 -0
  34. package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/utils.js +49 -0
  35. package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/utils.js.map +1 -0
  36. package/dist/containers/Cluster/i18n/en.json +13 -4
  37. package/dist/containers/Cluster/i18n/index.d.ts +1 -1
  38. package/dist/containers/Node/Node.js +20 -17
  39. package/dist/containers/Node/Node.js.map +1 -1
  40. package/dist/containers/Node/NodePages.d.ts +3 -9
  41. package/dist/containers/Node/NodePages.js +2 -10
  42. package/dist/containers/Node/NodePages.js.map +1 -1
  43. package/dist/containers/Node/i18n/en.json +0 -3
  44. package/dist/containers/Node/i18n/index.d.ts +1 -1
  45. package/dist/containers/Nodes/NodesTable.js +2 -2
  46. package/dist/containers/Nodes/NodesTable.js.map +1 -1
  47. package/dist/containers/Storage/PaginatedStorageGroups/GroupedStorageGroupsComponent.js +0 -1
  48. package/dist/containers/Storage/PaginatedStorageGroups/GroupedStorageGroupsComponent.js.map +1 -1
  49. package/dist/containers/Storage/PaginatedStorageGroupsTable/PaginatedStorageGroupsTable.js +2 -3
  50. package/dist/containers/Storage/PaginatedStorageGroupsTable/PaginatedStorageGroupsTable.js.map +1 -1
  51. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/constants.d.ts +2 -2
  52. package/dist/containers/Storage/PaginatedStorageGroupsTable/getGroups.d.ts +1 -1
  53. package/dist/containers/Storage/PaginatedStorageGroupsTable/getGroups.js +2 -3
  54. package/dist/containers/Storage/PaginatedStorageGroupsTable/getGroups.js.map +1 -1
  55. package/dist/containers/StorageGroupPage/StorageGroupPage.js +2 -3
  56. package/dist/containers/StorageGroupPage/StorageGroupPage.js.map +1 -1
  57. package/dist/containers/Tenant/Diagnostics/Partitions/utils/constants.d.ts +2 -2
  58. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopGroups.js +1 -3
  59. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopGroups.js.map +1 -1
  60. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/useTenantStorageNewData.d.ts +5 -5
  61. package/dist/containers/Tenant/Diagnostics/useDiagnosticsPages.js +2 -4
  62. package/dist/containers/Tenant/Diagnostics/useDiagnosticsPages.js.map +1 -1
  63. package/dist/routes.d.ts +1 -0
  64. package/dist/routes.js.map +1 -1
  65. package/dist/services/api/viewer.d.ts +1 -2
  66. package/dist/services/api/viewer.js +0 -11
  67. package/dist/services/api/viewer.js.map +1 -1
  68. package/dist/store/configureStore.d.ts +12 -12
  69. package/dist/store/defaultStore.d.ts +6 -6
  70. package/dist/store/reducers/api.d.ts +1 -1
  71. package/dist/store/reducers/api.js +3 -0
  72. package/dist/store/reducers/api.js.map +1 -1
  73. package/dist/store/reducers/authentication/authentication.d.ts +4 -4
  74. package/dist/store/reducers/cancelQuery.d.ts +2 -2
  75. package/dist/store/reducers/capabilities/capabilities.d.ts +43 -43
  76. package/dist/store/reducers/capabilities/hooks.d.ts +5 -6
  77. package/dist/store/reducers/capabilities/hooks.js +0 -3
  78. package/dist/store/reducers/capabilities/hooks.js.map +1 -1
  79. package/dist/store/reducers/cluster/cluster.d.ts +5 -5
  80. package/dist/store/reducers/cluster/cluster.js +3 -2
  81. package/dist/store/reducers/cluster/cluster.js.map +1 -1
  82. package/dist/store/reducers/clusters/clusters.d.ts +2 -2
  83. package/dist/store/reducers/clusters/clusters.js +2 -1
  84. package/dist/store/reducers/clusters/clusters.js.map +1 -1
  85. package/dist/store/reducers/codeAssist/codeAssist.d.ts +6 -6
  86. package/dist/store/reducers/configs.d.ts +3 -3
  87. package/dist/store/reducers/entityDataTags.d.ts +21 -0
  88. package/dist/store/reducers/entityDataTags.js +24 -0
  89. package/dist/store/reducers/entityDataTags.js.map +1 -0
  90. package/dist/store/reducers/environments/environments.d.ts +2 -2
  91. package/dist/store/reducers/executeTopQueries/executeTopQueries.d.ts +4 -4
  92. package/dist/store/reducers/healthcheckInfo/healthcheckInfo.d.ts +111 -111
  93. package/dist/store/reducers/heatmap.d.ts +2 -2
  94. package/dist/store/reducers/hotKeys/hotKeys.d.ts +2 -2
  95. package/dist/store/reducers/index.d.ts +8 -8
  96. package/dist/store/reducers/network/network.d.ts +2 -2
  97. package/dist/store/reducers/node/node.d.ts +2 -5
  98. package/dist/store/reducers/node/node.js +0 -12
  99. package/dist/store/reducers/node/node.js.map +1 -1
  100. package/dist/store/reducers/node/types.d.ts +0 -14
  101. package/dist/store/reducers/nodes/nodes.d.ts +2 -2
  102. package/dist/store/reducers/nodesList.d.ts +12 -12
  103. package/dist/store/reducers/operations.d.ts +5 -5
  104. package/dist/store/reducers/overview/overview.d.ts +2 -2
  105. package/dist/store/reducers/partitions/partitions.d.ts +3 -3
  106. package/dist/store/reducers/pdisk/pdisk.d.ts +2 -2
  107. package/dist/store/reducers/planToSvg.d.ts +2 -2
  108. package/dist/store/reducers/preview.d.ts +2 -2
  109. package/dist/store/reducers/query/api.d.ts +4 -4
  110. package/dist/store/reducers/replication.d.ts +2 -2
  111. package/dist/store/reducers/schema/schema.d.ts +16 -16
  112. package/dist/store/reducers/schemaAcl/schemaAcl.d.ts +40 -40
  113. package/dist/store/reducers/settings/api.d.ts +4 -4
  114. package/dist/store/reducers/settings/settings.d.ts +1 -1
  115. package/dist/store/reducers/shardsWorkload/shardsWorkload.d.ts +2 -2
  116. package/dist/store/reducers/showCreateTable/showCreateTable.d.ts +2 -2
  117. package/dist/store/reducers/storage/requestStorageData.d.ts +2 -4
  118. package/dist/store/reducers/storage/requestStorageData.js +4 -10
  119. package/dist/store/reducers/storage/requestStorageData.js.map +1 -1
  120. package/dist/store/reducers/storage/storage.d.ts +4 -6
  121. package/dist/store/reducers/storage/storage.js.map +1 -1
  122. package/dist/store/reducers/storage/types.d.ts +0 -9
  123. package/dist/store/reducers/storage/utils.d.ts +1 -2
  124. package/dist/store/reducers/storage/utils.js +0 -111
  125. package/dist/store/reducers/storage/utils.js.map +1 -1
  126. package/dist/store/reducers/storageUsage/StorageUsage.d.ts +2 -2
  127. package/dist/store/reducers/streamingQuery/streamingQuery.d.ts +2 -2
  128. package/dist/store/reducers/table/table.d.ts +4 -4
  129. package/dist/store/reducers/tableData.d.ts +1 -1
  130. package/dist/store/reducers/tablePartitioning/tablePartitioning.d.ts +2 -2
  131. package/dist/store/reducers/tableSchemaData.d.ts +2 -2
  132. package/dist/store/reducers/tablet.d.ts +8 -8
  133. package/dist/store/reducers/tablets.d.ts +3 -3
  134. package/dist/store/reducers/tenant/tenant.d.ts +2 -2
  135. package/dist/store/reducers/tenant/tenant.js +14 -1
  136. package/dist/store/reducers/tenant/tenant.js.map +1 -1
  137. package/dist/store/reducers/tenantOverview/executeTopTables/executeTopTables.d.ts +2 -2
  138. package/dist/store/reducers/tenantOverview/storage/tenantOverviewStorage.d.ts +2 -2
  139. package/dist/store/reducers/tenantOverview/topShards/tenantOverviewTopShards.d.ts +2 -2
  140. package/dist/store/reducers/tenants/tenants.d.ts +3 -3
  141. package/dist/store/reducers/tenants/tenants.js +2 -1
  142. package/dist/store/reducers/tenants/tenants.js.map +1 -1
  143. package/dist/store/reducers/topic/topic.d.ts +84 -84
  144. package/dist/store/reducers/vdisk/vdisk.d.ts +3 -3
  145. package/dist/store/reducers/viewSchema/viewSchema.d.ts +2 -2
  146. package/dist/store/state-url-mapping.js +5 -1
  147. package/dist/store/state-url-mapping.js.map +1 -1
  148. package/dist/types/api/storage.d.ts +2 -111
  149. package/dist/types/api/storage.js.map +1 -1
  150. package/dist/uiFactory/types.d.ts +2 -0
  151. package/dist/utils/hooks/useWhoami.d.ts +5 -5
  152. package/package.json +1 -1
  153. package/src/components/ComponentsProvider/componentsRegistry.ts +1 -4
  154. package/src/components/ContentWithPopup/ContentWithPopup.tsx +7 -0
  155. package/src/components/HoverPopup/HoverPopup.tsx +32 -3
  156. package/src/components/HoverPopup/getPopupScrollContainer.ts +20 -0
  157. package/src/components/SegmentedProgress/SegmentedProgress.scss +5 -0
  158. package/src/components/SegmentedProgress/SegmentedProgress.tsx +99 -10
  159. package/src/components/StorageGroupInfo/StorageGroupInfo.tsx +0 -13
  160. package/src/components/StorageGroupInfo/i18n/en.json +0 -1
  161. package/src/containers/App/App.tsx +3 -3
  162. package/src/containers/Cluster/ClusterInfo/ClusterInfo.scss +8 -0
  163. package/src/containers/Cluster/ClusterInfo/ClusterInfo.tsx +12 -11
  164. package/src/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.scss +18 -0
  165. package/src/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.tsx +143 -58
  166. package/src/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/utils.ts +89 -0
  167. package/src/containers/Cluster/i18n/en.json +13 -4
  168. package/src/containers/Node/Node.tsx +32 -18
  169. package/src/containers/Node/NodePages.ts +5 -10
  170. package/src/containers/Node/i18n/en.json +0 -4
  171. package/src/containers/Nodes/NodesTable.tsx +7 -1
  172. package/src/containers/Storage/PaginatedStorageGroups/GroupedStorageGroupsComponent.tsx +0 -1
  173. package/src/containers/Storage/PaginatedStorageGroupsTable/PaginatedStorageGroupsTable.tsx +2 -6
  174. package/src/containers/Storage/PaginatedStorageGroupsTable/columns/constants.ts +2 -2
  175. package/src/containers/Storage/PaginatedStorageGroupsTable/getGroups.ts +40 -47
  176. package/src/containers/StorageGroupPage/StorageGroupPage.tsx +2 -6
  177. package/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopGroups.tsx +1 -6
  178. package/src/containers/Tenant/Diagnostics/useDiagnosticsPages.ts +1 -4
  179. package/src/routes.ts +1 -1
  180. package/src/services/api/viewer.ts +1 -25
  181. package/src/store/reducers/api.ts +4 -0
  182. package/src/store/reducers/capabilities/hooks.ts +0 -4
  183. package/src/store/reducers/cluster/cluster.ts +3 -2
  184. package/src/store/reducers/clusters/clusters.ts +2 -1
  185. package/src/store/reducers/entityDataTags.ts +34 -0
  186. package/src/store/reducers/node/node.ts +0 -11
  187. package/src/store/reducers/node/types.ts +0 -18
  188. package/src/store/reducers/storage/requestStorageData.ts +5 -17
  189. package/src/store/reducers/storage/storage.ts +2 -6
  190. package/src/store/reducers/storage/types.ts +0 -9
  191. package/src/store/reducers/storage/utils.ts +2 -175
  192. package/src/store/reducers/tenant/tenant.ts +17 -1
  193. package/src/store/reducers/tenants/tenants.ts +2 -1
  194. package/src/store/state-url-mapping.ts +5 -1
  195. package/src/types/api/storage.ts +7 -131
  196. package/src/uiFactory/types.ts +3 -0
  197. package/dist/containers/Node/NodeStructure/NodeStructure.d.ts +0 -7
  198. package/dist/containers/Node/NodeStructure/NodeStructure.js +0 -76
  199. package/dist/containers/Node/NodeStructure/NodeStructure.js.map +0 -1
  200. package/dist/containers/Node/NodeStructure/NodeStructure.scss +0 -155
  201. package/dist/containers/Node/NodeStructure/PDiskTitleBadge.d.ts +0 -7
  202. package/dist/containers/Node/NodeStructure/PDiskTitleBadge.js +0 -7
  203. package/dist/containers/Node/NodeStructure/PDiskTitleBadge.js.map +0 -1
  204. package/dist/containers/Node/NodeStructure/Pdisk.d.ts +0 -10
  205. package/dist/containers/Node/NodeStructure/Pdisk.js +0 -125
  206. package/dist/containers/Node/NodeStructure/Pdisk.js.map +0 -1
  207. package/dist/store/reducers/node/selectors.d.ts +0 -47
  208. package/dist/store/reducers/node/selectors.js +0 -43
  209. package/dist/store/reducers/node/selectors.js.map +0 -1
  210. package/src/containers/Node/NodeStructure/NodeStructure.scss +0 -155
  211. package/src/containers/Node/NodeStructure/NodeStructure.tsx +0 -121
  212. package/src/containers/Node/NodeStructure/PDiskTitleBadge.tsx +0 -18
  213. package/src/containers/Node/NodeStructure/Pdisk.tsx +0 -274
  214. package/src/store/reducers/node/selectors.ts +0 -68
@@ -1,16 +1,7 @@
1
1
  import type {EFlag} from '../../../types/api/enums';
2
2
  import type {TNodeInfo, TNodesInfo} from '../../../types/api/nodes';
3
3
  import {TPDiskState} from '../../../types/api/pdisk';
4
- import type {
5
- StorageGroupsResponse,
6
- TGroupsStorageGroupInfo,
7
- TStorageGroupInfo,
8
- TStorageGroupInfoV2,
9
- TStorageInfo,
10
- TStoragePoolInfo,
11
- } from '../../../types/api/storage';
12
- import {EVDiskState} from '../../../types/api/vdisk';
13
- import type {TVDiskStateInfo} from '../../../types/api/vdisk';
4
+ import type {StorageGroupsResponse, TGroupsStorageGroupInfo} from '../../../types/api/storage';
14
5
  import {
15
6
  getColorSeverity,
16
7
  getDataSeverityColor,
@@ -21,7 +12,6 @@ import {
21
12
  prepareWhiteboardVDiskData,
22
13
  } from '../../../utils/disks/prepareDisks';
23
14
  import {prepareNodeSystemState} from '../../../utils/nodes';
24
- import {getUsage} from '../../../utils/storage';
25
15
  import {parseUsToMs} from '../../../utils/timeParsers';
26
16
  import {parseOptionalNonNegativeNumber} from '../../../utils/utils';
27
17
 
@@ -47,7 +37,7 @@ const normalizeMaxPercent = (value: number | string | null | undefined): number
47
37
 
48
38
  // ==== Prepare groups ====
49
39
 
50
- function getGroupDiskSpaceStatus(group: TStorageGroupInfo | TGroupsStorageGroupInfo): EFlag {
40
+ function getGroupDiskSpaceStatus(group: TGroupsStorageGroupInfo): EFlag {
51
41
  const {DiskSpace, VDisks = []} = group;
52
42
 
53
43
  if (DiskSpace) {
@@ -61,157 +51,6 @@ function getGroupDiskSpaceStatus(group: TStorageGroupInfo | TGroupsStorageGroupI
61
51
  return getDataSeverityColor(maxSeverity);
62
52
  }
63
53
 
64
- const prepareVDisk = (vDisk: TVDiskStateInfo, poolName: string | undefined) => {
65
- const preparedVDisk = prepareWhiteboardVDiskData(vDisk);
66
-
67
- // VDisk doesn't have its own StoragePoolName when located inside StoragePool data
68
- return {
69
- ...preparedVDisk,
70
- StoragePoolName: poolName,
71
- Donors: preparedVDisk?.Donors?.map((donor) => ({
72
- ...donor,
73
- StoragePoolName: poolName,
74
- })),
75
- };
76
- };
77
-
78
- const prepareStorageGroupData = (
79
- group: TStorageGroupInfo,
80
- pool: TStoragePoolInfo,
81
- ): PreparedStorageGroup => {
82
- let missing = 0;
83
- let usedSpaceBytes = 0;
84
- let limitSizeBytes = 0;
85
- let readSpeedBytesPerSec = 0;
86
- let writeSpeedBytesPerSec = 0;
87
- let mediaType: string | undefined;
88
-
89
- const {Name: poolName, MediaType: poolMediaType} = pool;
90
-
91
- if (group.VDisks) {
92
- for (const vDisk of group.VDisks) {
93
- const {
94
- Replicated,
95
- VDiskState,
96
- AvailableSize,
97
- AllocatedSize,
98
- PDisk,
99
- ReadThroughput,
100
- WriteThroughput,
101
- } = vDisk;
102
-
103
- const {
104
- Type: PDiskType,
105
- State: PDiskState,
106
- AvailableSize: PDiskAvailableSize,
107
- } = prepareWhiteboardPDiskData(PDisk);
108
-
109
- if (
110
- Replicated === false ||
111
- PDiskState !== TPDiskState.Normal ||
112
- VDiskState !== EVDiskState.OK
113
- ) {
114
- missing += 1;
115
- }
116
-
117
- const available = Number(AvailableSize ?? PDiskAvailableSize) || 0;
118
- const allocated = Number(AllocatedSize) || 0;
119
-
120
- usedSpaceBytes += allocated;
121
- limitSizeBytes += available + allocated;
122
-
123
- readSpeedBytesPerSec += Number(ReadThroughput) || 0;
124
- writeSpeedBytesPerSec += Number(WriteThroughput) || 0;
125
-
126
- mediaType = PDiskType && (PDiskType === mediaType || !mediaType) ? PDiskType : 'Mixed';
127
- }
128
- }
129
-
130
- const vDisks = group.VDisks?.map((vdisk) => prepareVDisk(vdisk, poolName));
131
-
132
- // Do not calculate usage if there is no limit
133
- const usage = limitSizeBytes
134
- ? getUsage({Used: usedSpaceBytes, Limit: limitSizeBytes}, 5)
135
- : undefined;
136
-
137
- const diskSpaceStatus = getGroupDiskSpaceStatus(group);
138
-
139
- return {
140
- ...group,
141
- GroupGeneration: group.GroupGeneration ? String(group.GroupGeneration) : undefined,
142
- GroupId: group.GroupID,
143
- Overall: group.Overall,
144
- VDisks: vDisks,
145
- Usage: usage,
146
- Read: readSpeedBytesPerSec,
147
- Write: writeSpeedBytesPerSec,
148
- PoolName: poolName,
149
- Used: usedSpaceBytes,
150
- Limit: limitSizeBytes,
151
- Degraded: missing,
152
- MediaType: poolMediaType || mediaType || undefined,
153
- DiskSpace: diskSpaceStatus,
154
- };
155
- };
156
-
157
- const prepareStorageGroupDataV2 = (group: TStorageGroupInfoV2): PreparedStorageGroup => {
158
- const {
159
- VDisks = [],
160
- PoolName,
161
- Usage = 0,
162
- Read = 0,
163
- Write = 0,
164
- Used = 0,
165
- Limit = 0,
166
- Degraded = 0,
167
- Kind,
168
- MediaType,
169
- GroupID,
170
- Overall,
171
- GroupGeneration,
172
- } = group;
173
-
174
- const vDisks = VDisks.map((vdisk) => prepareVDisk(vdisk, PoolName));
175
- const usage = Number(Usage) * 100;
176
-
177
- const diskSpaceStatus = getGroupDiskSpaceStatus(group);
178
-
179
- return {
180
- ...group,
181
- PoolName,
182
- GroupId: GroupID,
183
- MediaType: MediaType || Kind,
184
- VDisks: vDisks,
185
- Usage: usage,
186
- Overall,
187
- GroupGeneration: GroupGeneration ? String(GroupGeneration) : undefined,
188
- Read: Number(Read),
189
- Write: Number(Write),
190
- Used: Number(Used),
191
- Limit: Number(Limit),
192
- Degraded: Number(Degraded),
193
- DiskSpace: diskSpaceStatus,
194
- };
195
- };
196
-
197
- const prepareStorageGroups = (
198
- StorageGroups?: TStorageGroupInfoV2[],
199
- StoragePools?: TStoragePoolInfo[],
200
- ) => {
201
- let preparedGroups: PreparedStorageGroup[] = [];
202
- if (StorageGroups) {
203
- preparedGroups = StorageGroups.map(prepareStorageGroupDataV2);
204
- } else {
205
- StoragePools?.forEach((pool) => {
206
- pool.Groups?.forEach((group) => {
207
- preparedGroups.push(prepareStorageGroupData(group, pool));
208
- });
209
- });
210
- }
211
-
212
- return preparedGroups;
213
- };
214
-
215
54
  // ==== Prepare nodes ====
216
55
 
217
56
  const prepareStorageNodeData = (
@@ -361,18 +200,6 @@ export const prepareStorageNodesResponse = (data: TNodesInfo): PreparedStorageRe
361
200
  };
362
201
  };
363
202
 
364
- export const prepareStorageResponse = (data: TStorageInfo): PreparedStorageResponse => {
365
- const {StoragePools, StorageGroups, TotalGroups, FoundGroups} = data;
366
-
367
- const preparedGroups = prepareStorageGroups(StorageGroups, StoragePools);
368
-
369
- return {
370
- groups: preparedGroups,
371
- total: Number(TotalGroups) || preparedGroups.length,
372
- found: Number(FoundGroups),
373
- };
374
- };
375
-
376
203
  export function prepareGroupsResponse(data: StorageGroupsResponse): PreparedStorageResponse {
377
204
  const {FoundGroups, TotalGroups, StorageGroups = [], StorageGroupGroups} = data;
378
205
  const preparedGroups: PreparedStorageGroup[] = StorageGroups.map((group) => {
@@ -5,6 +5,7 @@ import type {TTenantInfo} from '../../../types/api/tenant';
5
5
  import {useClusterNameFromQuery} from '../../../utils/hooks/useDatabaseFromQuery';
6
6
  import {useDatabasesV2} from '../../../utils/hooks/useDatabasesV2';
7
7
  import {api} from '../api';
8
+ import {getDatabaseDataTag} from '../entityDataTags';
8
9
  import {prepareTenants} from '../tenants/utils';
9
10
 
10
11
  import {TENANT_DIAGNOSTICS_TABS_IDS, TENANT_METRICS_TABS_IDS} from './constants';
@@ -90,7 +91,22 @@ export const tenantApi = api.injectEndpoints({
90
91
  return {error};
91
92
  }
92
93
  },
93
- providesTags: ['All'],
94
+ providesTags: (result, _error, {clusterName, database}) => {
95
+ const databaseAliases = new Set([database]);
96
+ if (result?.Id) {
97
+ databaseAliases.add(result.Id);
98
+ }
99
+ if (result?.Name) {
100
+ databaseAliases.add(result.Name);
101
+ }
102
+
103
+ return [
104
+ 'All' as const,
105
+ ...Array.from(databaseAliases, (databaseAlias) =>
106
+ getDatabaseDataTag({clusterName, database: databaseAlias}),
107
+ ),
108
+ ];
109
+ },
94
110
  serializeQueryArgs: ({queryArgs}) => {
95
111
  const {clusterName, database} = queryArgs;
96
112
  return {clusterName, database};
@@ -1,5 +1,6 @@
1
1
  import type {TTenantInfo} from '../../../types/api/tenant';
2
2
  import {api} from '../api';
3
+ import {DATABASE_DATA_LIST_TAG} from '../entityDataTags';
3
4
 
4
5
  import type {PreparedTenant, SharedDatabaseTarget} from './types';
5
6
  import {prepareTenants} from './utils';
@@ -47,7 +48,7 @@ export const tenantsApi = api.injectEndpoints({
47
48
  const {clusterName, environmentName} = queryArgs;
48
49
  return {clusterName, environmentName};
49
50
  },
50
- providesTags: ['All'],
51
+ providesTags: ['All', DATABASE_DATA_LIST_TAG],
51
52
  }),
52
53
  getSharedDatabase: build.query<
53
54
  SharedDatabaseTarget | null,
@@ -1,4 +1,5 @@
1
1
  import type {Action, Reducer, UnknownAction} from '@reduxjs/toolkit';
2
+ import {createNextState} from '@reduxjs/toolkit';
2
3
  import type {History, Location} from 'history';
3
4
  import each from 'lodash/each';
4
5
  import keys from 'lodash/keys';
@@ -75,7 +76,10 @@ export const paramSetup = {
75
76
  } as const;
76
77
 
77
78
  function mergeLocationToState<S>(state: S, location: Pick<LocationWithQuery, 'query'>): S {
78
- return merge({}, state, location.query);
79
+ // Preserve cached API data when updating only URL-backed state.
80
+ return createNextState(state, (draft) => {
81
+ merge(draft, location.query);
82
+ });
79
83
  }
80
84
 
81
85
  function restoreUnknownParams(location: Location, prevLocation: Location) {
@@ -3,110 +3,6 @@ import type {ECapacityAlert, EFlag} from './enums';
3
3
  import type {EDecommitStatus, EDriveStatus, EMaintenanceStatus, TPDiskStateInfo} from './pdisk';
4
4
  import type {EVDiskStatus, TVDiskStateInfo} from './vdisk';
5
5
 
6
- /**
7
- * endpoint: /viewer/storage
8
- *
9
- * source: https://github.com/ydb-platform/ydb/blob/main/ydb/core/viewer/protos/viewer.proto
10
- */
11
- export interface TStorageInfo {
12
- Overall?: EFlag;
13
- StoragePools?: TStoragePoolInfo[]; // v1
14
- StorageGroups?: TStorageGroupInfoV2[]; // v2
15
- /** uint64 */
16
- TotalGroups?: string;
17
- /** uint64 */
18
- FoundGroups?: string;
19
- }
20
-
21
- export interface TStoragePoolInfo {
22
- Overall?: EFlag;
23
- Name?: string;
24
- Kind?: string;
25
- Groups?: TStorageGroupInfo[];
26
- /** uint64 */
27
- AcquiredUnits?: string;
28
- AcquiredIOPS?: number;
29
- /** uint64 */
30
- AcquiredThroughput?: string;
31
- /** uint64 */
32
- AcquiredSize?: string;
33
- MaximumIOPS?: number;
34
- /** uint64 */
35
- MaximumThroughput?: string;
36
- /** uint64 */
37
- MaximumSize?: string;
38
- MediaType?: string;
39
- }
40
-
41
- export interface TStorageGroupInfoV2 extends TStorageGroupInfo {
42
- PoolName?: string;
43
- Kind?: string;
44
- MediaType?: string;
45
-
46
- /** uint64 */
47
- Degraded?: string;
48
-
49
- /** uint64 */
50
- Used: string;
51
- /** uint64 */
52
- Limit: string;
53
- /** uint64 */
54
- Read: string;
55
- /** uint64 */
56
- Write: string;
57
-
58
- /** uint64 */
59
- Usage?: string;
60
- }
61
-
62
- export type TStorageGroupInfo = TBSGroupStateInfo &
63
- THiveStorageGroupStats & {
64
- DiskSpace?: EFlag;
65
- };
66
-
67
- interface TBSGroupStateInfo {
68
- GroupID?: number;
69
- ErasureSpecies?: Erasure;
70
- VDisks?: TVDiskStateInfo[];
71
- /** uint64 */
72
- ChangeTime?: string;
73
- NodeId?: number;
74
- GroupGeneration?: number;
75
- Overall?: EFlag;
76
- Latency?: EFlag;
77
- Count?: number;
78
- StoragePoolName?: string;
79
- /** uint64 */
80
- AllocatedSize?: string;
81
- /** uint64 */
82
- AvailableSize?: string;
83
- /** uint64 */
84
- ReadThroughput?: string;
85
- /** uint64 */
86
- WriteThroughput?: string;
87
- Encryption?: boolean;
88
- }
89
-
90
- interface THiveStorageGroupStats {
91
- GroupID?: number;
92
- /** uint64 */
93
- AcquiredUnits?: string;
94
- AcquiredIOPS?: number;
95
- /** uint64 */
96
- AcquiredThroughput?: string;
97
- /** uint64 */
98
- AcquiredSize?: string;
99
- MaximumIOPS?: number;
100
- /** uint64 */
101
- MaximumThroughput?: string;
102
- /** uint64 */
103
- MaximumSize?: string;
104
- /** uint64 */
105
- AllocatedSize?: string;
106
- /** uint64 */
107
- AvailableSize?: string;
108
- }
109
-
110
6
  /**
111
7
  * endpoint: /storage/groups
112
8
  *
@@ -255,12 +151,10 @@ export type Erasure = 'none' | 'block-4-2' | 'mirror-3-dc' | 'mirror-3of4';
255
151
 
256
152
  // ==== Request types ====
257
153
 
258
- export type EVersion = 'v1' | 'v2'; // only v2 versions works with sorting
259
-
260
154
  /**
261
- * Values to sort /viewer/storage v2 response
155
+ * Values to sort /storage/groups response
262
156
  */
263
- export type StorageV2SortValue =
157
+ export type GroupsSortField =
264
158
  | 'PoolName'
265
159
  | 'Kind'
266
160
  | 'MediaType'
@@ -272,10 +166,6 @@ export type StorageV2SortValue =
272
166
  | 'Limit'
273
167
  | 'Read'
274
168
  | 'Write'
275
-
276
- // These fields are not present in storage v2
277
- // So this sort does nothing
278
- // Added them here for types compatibility
279
169
  | 'AllocationUnits'
280
170
  | 'Latency'
281
171
  | 'DiskSpaceUsage'
@@ -284,14 +174,11 @@ export type StorageV2SortValue =
284
174
  | 'MaxVDiskSlotUsage'
285
175
  | 'MaxVDiskRawUsage'
286
176
  | 'MaxNormalizedOccupancy'
287
- | 'CapacityAlert';
288
-
289
- /**
290
- * Values to sort /storage/groups response
291
- */
292
- export type GroupsSortField = StorageV2SortValue | 'MissingDisks' | 'Available' | 'Encryption';
177
+ | 'CapacityAlert'
178
+ | 'MissingDisks'
179
+ | 'Available'
180
+ | 'Encryption';
293
181
 
294
- export type StorageV2Sort = BackendSortParam<StorageV2SortValue>;
295
182
  export type GroupsSort = BackendSortParam<GroupsSortField>;
296
183
 
297
184
  export type StorageWithFilter = 'space' | 'missing' | 'all';
@@ -341,7 +228,7 @@ export type GroupsRequiredField =
341
228
  | 'MaxNormalizedOccupancy'
342
229
  | 'CapacityAlert';
343
230
 
344
- interface BaseStorageRequestParams {
231
+ export interface GroupsRequestParams {
345
232
  database?: string;
346
233
  pool?: string;
347
234
  with?: StorageWithFilter;
@@ -349,18 +236,7 @@ interface BaseStorageRequestParams {
349
236
  filter?: string;
350
237
  offset?: number;
351
238
  limit?: number;
352
- }
353
-
354
- export interface StorageRequestParams extends BaseStorageRequestParams {
355
- nodeId?: string | number;
356
- pDiskId?: string | number;
357
- groupId?: string | number;
358
-
359
- sort?: StorageV2Sort;
360
- version?: EVersion;
361
- }
362
239
 
363
- export interface GroupsRequestParams extends BaseStorageRequestParams {
364
240
  nodeId?: string | number | (string | number)[];
365
241
  pDiskId?: string | number | (string | number)[];
366
242
  groupId?: string | number | (string | number)[];
@@ -51,6 +51,7 @@ export interface UIFactory<H extends string = CommonIssueCategory, T extends str
51
51
  renderEvents?: RenderEvents;
52
52
  renderMonitoring?: RenderMonitoring;
53
53
  renderNodeTooltipActions?: RenderNodeTooltipActions;
54
+ renderChatPanel?: RenderChatPanel;
54
55
  clusterOrDatabaseAccessError?: Partial<EmptyStateProps>;
55
56
 
56
57
  /** Defaults to true. Undefined preserves the current value when configuring the UI. */
@@ -208,6 +209,8 @@ export type RenderMonitoring = (props: {
208
209
 
209
210
  export type RenderNodeTooltipActions = (props: {data?: PreparedStorageNode}) => React.ReactNode;
210
211
 
212
+ export type RenderChatPanel = () => React.ReactNode;
213
+
211
214
  export type RenderHealthcheckAssistantAction = (
212
215
  props: HealthcheckAssistantActionProps,
213
216
  ) => React.ReactNode;
@@ -1,7 +0,0 @@
1
- import './NodeStructure.scss';
2
- interface NodeStructureProps {
3
- nodeId: string;
4
- className?: string;
5
- }
6
- declare function NodeStructure({ nodeId, className }: NodeStructureProps): import("react/jsx-runtime").JSX.Element;
7
- export default NodeStructure;
@@ -1,76 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import React from 'react';
3
- import isEmpty from 'lodash/isEmpty';
4
- import { StringParam, useQueryParams } from 'use-query-params';
5
- import { Loader } from '../.././../components/Loader';
6
- import { ResponseError } from '../../../components/Errors/ResponseError';
7
- import { nodeApi } from '../../../store/reducers/node/node';
8
- import { selectNodeStructure } from '../../../store/reducers/node/selectors';
9
- import { cn } from '../../../utils/cn';
10
- import { useAutoRefreshInterval, useTypedSelector } from '../../../utils/hooks';
11
- import { PDisk } from './Pdisk';
12
- import './NodeStructure.scss';
13
- const b = cn('kv-node-structure');
14
- function generateId({ type, id }) {
15
- return `${type}-${id}`;
16
- }
17
- function NodeStructure({ nodeId, className }) {
18
- const nodeStructure = useTypedSelector((state) => selectNodeStructure(state, nodeId));
19
- const [autoRefreshInterval] = useAutoRefreshInterval();
20
- const { currentData, isFetching, error } = nodeApi.useGetNodeStructureQuery({ nodeId }, { pollingInterval: autoRefreshInterval });
21
- const loadingStructure = isFetching && currentData === undefined;
22
- const [{ pdiskId: pdiskIdFromUrl, vdiskId: vdiskIdFromUrl }] = useQueryParams({
23
- pdiskId: StringParam,
24
- vdiskId: StringParam,
25
- });
26
- const scrollContainerRef = React.useRef(null);
27
- const scrolled = React.useRef(false);
28
- React.useEffect(() => {
29
- var _a;
30
- if (!isEmpty(nodeStructure) &&
31
- !scrolled.current &&
32
- scrollContainerRef.current &&
33
- pdiskIdFromUrl) {
34
- const element = document.getElementById(generateId({ type: 'pdisk', id: pdiskIdFromUrl }));
35
- let scrollToVdisk = 0;
36
- if (vdiskIdFromUrl) {
37
- const vDisks = (_a = nodeStructure[pdiskIdFromUrl]) === null || _a === void 0 ? void 0 : _a.vDisks;
38
- const vDisk = vDisks === null || vDisks === void 0 ? void 0 : vDisks.find((el) => el.id === vdiskIdFromUrl);
39
- const dataTable = vDisk ? document.querySelector('.data-table') : undefined;
40
- const order = (vDisk === null || vDisk === void 0 ? void 0 : vDisk.order) || 0;
41
- if (dataTable) {
42
- scrollToVdisk += dataTable.offsetTop + 40 * order;
43
- }
44
- }
45
- if (element) {
46
- scrollContainerRef.current.scrollTo({
47
- behavior: 'smooth',
48
- // should subtract 20 to avoid sticking the element to tabs
49
- top: scrollToVdisk ? scrollToVdisk : element.offsetTop,
50
- });
51
- scrolled.current = true;
52
- }
53
- }
54
- }, [nodeStructure, pdiskIdFromUrl, vdiskIdFromUrl]);
55
- const renderStub = () => {
56
- return 'There is no information about node structure.';
57
- };
58
- const renderStructure = () => {
59
- const pDisksIds = Object.keys(nodeStructure);
60
- return pDisksIds.length > 0
61
- ? pDisksIds.map((pDiskId) => (_jsx(PDisk, { data: nodeStructure[pDiskId], id: generateId({ type: 'pdisk', id: pDiskId }), unfolded: pdiskIdFromUrl === pDiskId, selectedVdiskId: vdiskIdFromUrl, nodeId: nodeId }, pDiskId)))
62
- : renderStub();
63
- };
64
- const renderContent = () => {
65
- if (loadingStructure) {
66
- return _jsx(Loader, { size: "m" });
67
- }
68
- if (error && !currentData) {
69
- return null;
70
- }
71
- return renderStructure();
72
- };
73
- return (_jsxs("div", { className: b(), ref: scrollContainerRef, children: [error ? _jsx(ResponseError, { error: error, className: b('error') }) : null, _jsx("div", { className: className, children: renderContent() })] }));
74
- }
75
- export default NodeStructure;
76
- //# sourceMappingURL=NodeStructure.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NodeStructure.js","sourceRoot":"","sources":["../../../../src/containers/Node/NodeStructure/NodeStructure.tsx"],"names":[],"mappings":"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"}