ydb-embedded-ui 21.0.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 (272) 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/CriticalActionDialog/CriticalActionDialog.js +10 -6
  9. package/dist/components/CriticalActionDialog/CriticalActionDialog.js.map +1 -1
  10. package/dist/components/CriticalActionDialog/i18n/en.json +1 -2
  11. package/dist/components/CriticalActionDialog/i18n/index.d.ts +1 -1
  12. package/dist/components/DropdownMenu/DropdownMenu.d.ts +2 -1
  13. package/dist/components/DropdownMenu/DropdownMenu.js +1 -1
  14. package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -1
  15. package/dist/components/FullNodeViewer/i18n/index.d.ts +1 -1
  16. package/dist/components/HoverPopup/HoverPopup.js +27 -4
  17. package/dist/components/HoverPopup/HoverPopup.js.map +1 -1
  18. package/dist/components/HoverPopup/getPopupScrollContainer.d.ts +1 -0
  19. package/dist/components/HoverPopup/getPopupScrollContainer.js +20 -0
  20. package/dist/components/HoverPopup/getPopupScrollContainer.js.map +1 -0
  21. package/dist/components/MetricChart/reducer.d.ts +2 -2
  22. package/dist/components/SegmentedProgress/SegmentedProgress.d.ts +22 -1
  23. package/dist/components/SegmentedProgress/SegmentedProgress.js +44 -3
  24. package/dist/components/SegmentedProgress/SegmentedProgress.js.map +1 -1
  25. package/dist/components/SegmentedProgress/SegmentedProgress.scss +5 -0
  26. package/dist/components/StorageGroupInfo/StorageGroupInfo.js +1 -13
  27. package/dist/components/StorageGroupInfo/StorageGroupInfo.js.map +1 -1
  28. package/dist/components/StorageGroupInfo/i18n/en.json +0 -1
  29. package/dist/components/StorageGroupInfo/i18n/index.d.ts +1 -1
  30. package/dist/components/nodesColumns/i18n/index.d.ts +1 -1
  31. package/dist/containers/App/App.js +3 -3
  32. package/dist/containers/App/App.js.map +1 -1
  33. package/dist/containers/Cluster/ClusterInfo/ClusterInfo.js +8 -5
  34. package/dist/containers/Cluster/ClusterInfo/ClusterInfo.js.map +1 -1
  35. package/dist/containers/Cluster/ClusterInfo/ClusterInfo.scss +8 -0
  36. package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.d.ts +4 -3
  37. package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.js +62 -25
  38. package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.js.map +1 -1
  39. package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.scss +18 -0
  40. package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/utils.d.ts +22 -0
  41. package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/utils.js +49 -0
  42. package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/utils.js.map +1 -0
  43. package/dist/containers/Cluster/i18n/en.json +13 -4
  44. package/dist/containers/Cluster/i18n/index.d.ts +1 -1
  45. package/dist/containers/Header/HeaderActionsMenu.js +19 -3
  46. package/dist/containers/Header/HeaderActionsMenu.js.map +1 -1
  47. package/dist/containers/Header/hooks/useSharedDatabasePath.d.ts +4 -1
  48. package/dist/containers/Header/hooks/useSharedDatabasePath.js +14 -10
  49. package/dist/containers/Header/hooks/useSharedDatabasePath.js.map +1 -1
  50. package/dist/containers/Header/i18n/en.json +1 -0
  51. package/dist/containers/Header/i18n/index.d.ts +1 -1
  52. package/dist/containers/Node/Node.js +20 -17
  53. package/dist/containers/Node/Node.js.map +1 -1
  54. package/dist/containers/Node/NodePages.d.ts +3 -9
  55. package/dist/containers/Node/NodePages.js +2 -10
  56. package/dist/containers/Node/NodePages.js.map +1 -1
  57. package/dist/containers/Node/i18n/en.json +0 -3
  58. package/dist/containers/Node/i18n/index.d.ts +1 -1
  59. package/dist/containers/Nodes/NodesTable.js +2 -2
  60. package/dist/containers/Nodes/NodesTable.js.map +1 -1
  61. package/dist/containers/Operations/columns.js +2 -2
  62. package/dist/containers/Operations/columns.js.map +1 -1
  63. package/dist/containers/Operations/i18n/en.json +2 -2
  64. package/dist/containers/PDiskPage/DecommissionButton/DecommissionButton.js +1 -1
  65. package/dist/containers/PDiskPage/DecommissionButton/DecommissionButton.js.map +1 -1
  66. package/dist/containers/PDiskPage/PDiskPage.js +1 -1
  67. package/dist/containers/PDiskPage/PDiskPage.js.map +1 -1
  68. package/dist/containers/PDiskPage/i18n/en.json +3 -3
  69. package/dist/containers/Storage/PDisks/PDisks.js +1 -1
  70. package/dist/containers/Storage/PDisks/PDisks.js.map +1 -1
  71. package/dist/containers/Storage/PaginatedStorageGroups/GroupedStorageGroupsComponent.js +0 -1
  72. package/dist/containers/Storage/PaginatedStorageGroups/GroupedStorageGroupsComponent.js.map +1 -1
  73. package/dist/containers/Storage/PaginatedStorageGroupsTable/PaginatedStorageGroupsTable.js +2 -3
  74. package/dist/containers/Storage/PaginatedStorageGroupsTable/PaginatedStorageGroupsTable.js.map +1 -1
  75. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/constants.d.ts +2 -2
  76. package/dist/containers/Storage/PaginatedStorageGroupsTable/getGroups.d.ts +1 -1
  77. package/dist/containers/Storage/PaginatedStorageGroupsTable/getGroups.js +2 -3
  78. package/dist/containers/Storage/PaginatedStorageGroupsTable/getGroups.js.map +1 -1
  79. package/dist/containers/StorageGroupPage/StorageGroupPage.js +2 -3
  80. package/dist/containers/StorageGroupPage/StorageGroupPage.js.map +1 -1
  81. package/dist/containers/Tablet/components/TabletControls/TabletControls.js +1 -1
  82. package/dist/containers/Tablet/components/TabletControls/TabletControls.js.map +1 -1
  83. package/dist/containers/Tablet/i18n/en.json +3 -3
  84. package/dist/containers/Tablets/TabletsTable.js +1 -1
  85. package/dist/containers/Tablets/TabletsTable.js.map +1 -1
  86. package/dist/containers/Tablets/i18n/en.json +1 -1
  87. package/dist/containers/Tenant/Diagnostics/Partitions/utils/constants.d.ts +2 -2
  88. package/dist/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/HealthcheckPreview.js +3 -1
  89. package/dist/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/HealthcheckPreview.js.map +1 -1
  90. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.js +2 -2
  91. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.js.map +1 -1
  92. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopGroups.js +1 -3
  93. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopGroups.js.map +1 -1
  94. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/useTenantStorageNewData.d.ts +5 -5
  95. package/dist/containers/Tenant/Diagnostics/useDiagnosticsPages.js +2 -4
  96. package/dist/containers/Tenant/Diagnostics/useDiagnosticsPages.js.map +1 -1
  97. package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.js +10 -2
  98. package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.js.map +1 -1
  99. package/dist/routes.d.ts +1 -0
  100. package/dist/routes.js.map +1 -1
  101. package/dist/services/api/viewer.d.ts +1 -2
  102. package/dist/services/api/viewer.js +0 -11
  103. package/dist/services/api/viewer.js.map +1 -1
  104. package/dist/store/configureStore.d.ts +12 -12
  105. package/dist/store/defaultStore.d.ts +6 -6
  106. package/dist/store/reducers/api.d.ts +1 -1
  107. package/dist/store/reducers/api.js +3 -0
  108. package/dist/store/reducers/api.js.map +1 -1
  109. package/dist/store/reducers/authentication/authentication.d.ts +4 -4
  110. package/dist/store/reducers/cancelQuery.d.ts +2 -2
  111. package/dist/store/reducers/capabilities/capabilities.d.ts +43 -43
  112. package/dist/store/reducers/capabilities/hooks.d.ts +5 -6
  113. package/dist/store/reducers/capabilities/hooks.js +0 -3
  114. package/dist/store/reducers/capabilities/hooks.js.map +1 -1
  115. package/dist/store/reducers/cluster/cluster.d.ts +5 -5
  116. package/dist/store/reducers/cluster/cluster.js +3 -2
  117. package/dist/store/reducers/cluster/cluster.js.map +1 -1
  118. package/dist/store/reducers/clusters/clusters.d.ts +2 -2
  119. package/dist/store/reducers/clusters/clusters.js +2 -1
  120. package/dist/store/reducers/clusters/clusters.js.map +1 -1
  121. package/dist/store/reducers/codeAssist/codeAssist.d.ts +6 -6
  122. package/dist/store/reducers/configs.d.ts +3 -3
  123. package/dist/store/reducers/entityDataTags.d.ts +21 -0
  124. package/dist/store/reducers/entityDataTags.js +24 -0
  125. package/dist/store/reducers/entityDataTags.js.map +1 -0
  126. package/dist/store/reducers/environments/environments.d.ts +2 -2
  127. package/dist/store/reducers/executeTopQueries/executeTopQueries.d.ts +4 -4
  128. package/dist/store/reducers/healthcheckInfo/healthcheckInfo.d.ts +111 -111
  129. package/dist/store/reducers/heatmap.d.ts +2 -2
  130. package/dist/store/reducers/hotKeys/hotKeys.d.ts +2 -2
  131. package/dist/store/reducers/index.d.ts +8 -8
  132. package/dist/store/reducers/network/network.d.ts +2 -2
  133. package/dist/store/reducers/node/node.d.ts +2 -5
  134. package/dist/store/reducers/node/node.js +0 -12
  135. package/dist/store/reducers/node/node.js.map +1 -1
  136. package/dist/store/reducers/node/types.d.ts +0 -14
  137. package/dist/store/reducers/nodes/nodes.d.ts +2 -2
  138. package/dist/store/reducers/nodesList.d.ts +12 -12
  139. package/dist/store/reducers/operations.d.ts +5 -5
  140. package/dist/store/reducers/overview/overview.d.ts +2 -2
  141. package/dist/store/reducers/partitions/partitions.d.ts +3 -3
  142. package/dist/store/reducers/pdisk/pdisk.d.ts +2 -2
  143. package/dist/store/reducers/planToSvg.d.ts +2 -2
  144. package/dist/store/reducers/preview.d.ts +2 -2
  145. package/dist/store/reducers/query/api.d.ts +4 -4
  146. package/dist/store/reducers/replication.d.ts +2 -2
  147. package/dist/store/reducers/schema/schema.d.ts +16 -16
  148. package/dist/store/reducers/schemaAcl/schemaAcl.d.ts +40 -40
  149. package/dist/store/reducers/settings/api.d.ts +4 -4
  150. package/dist/store/reducers/settings/settings.d.ts +1 -1
  151. package/dist/store/reducers/shardsWorkload/shardsWorkload.d.ts +2 -2
  152. package/dist/store/reducers/showCreateTable/showCreateTable.d.ts +2 -2
  153. package/dist/store/reducers/storage/requestStorageData.d.ts +2 -4
  154. package/dist/store/reducers/storage/requestStorageData.js +4 -10
  155. package/dist/store/reducers/storage/requestStorageData.js.map +1 -1
  156. package/dist/store/reducers/storage/storage.d.ts +4 -6
  157. package/dist/store/reducers/storage/storage.js.map +1 -1
  158. package/dist/store/reducers/storage/types.d.ts +0 -9
  159. package/dist/store/reducers/storage/utils.d.ts +1 -2
  160. package/dist/store/reducers/storage/utils.js +3 -114
  161. package/dist/store/reducers/storage/utils.js.map +1 -1
  162. package/dist/store/reducers/storageUsage/StorageUsage.d.ts +2 -2
  163. package/dist/store/reducers/streamingQuery/streamingQuery.d.ts +2 -2
  164. package/dist/store/reducers/table/table.d.ts +4 -4
  165. package/dist/store/reducers/tableData.d.ts +1 -1
  166. package/dist/store/reducers/tablePartitioning/tablePartitioning.d.ts +2 -2
  167. package/dist/store/reducers/tableSchemaData.d.ts +2 -2
  168. package/dist/store/reducers/tablet.d.ts +8 -8
  169. package/dist/store/reducers/tablets.d.ts +3 -3
  170. package/dist/store/reducers/tenant/tenant.d.ts +2 -2
  171. package/dist/store/reducers/tenant/tenant.js +14 -1
  172. package/dist/store/reducers/tenant/tenant.js.map +1 -1
  173. package/dist/store/reducers/tenantOverview/executeTopTables/executeTopTables.d.ts +2 -2
  174. package/dist/store/reducers/tenantOverview/storage/tenantOverviewStorage.d.ts +2 -2
  175. package/dist/store/reducers/tenantOverview/topShards/tenantOverviewTopShards.d.ts +2 -2
  176. package/dist/store/reducers/tenants/tenants.d.ts +3 -3
  177. package/dist/store/reducers/tenants/tenants.js +2 -1
  178. package/dist/store/reducers/tenants/tenants.js.map +1 -1
  179. package/dist/store/reducers/topic/topic.d.ts +84 -84
  180. package/dist/store/reducers/vdisk/vdisk.d.ts +3 -3
  181. package/dist/store/reducers/viewSchema/viewSchema.d.ts +2 -2
  182. package/dist/store/state-url-mapping.js +5 -1
  183. package/dist/store/state-url-mapping.js.map +1 -1
  184. package/dist/types/api/storage.d.ts +2 -111
  185. package/dist/types/api/storage.js.map +1 -1
  186. package/dist/uiFactory/types.d.ts +8 -0
  187. package/dist/uiFactory/uiFactory.js +5 -2
  188. package/dist/uiFactory/uiFactory.js.map +1 -1
  189. package/dist/utils/hooks/useWhoami.d.ts +5 -5
  190. package/package.json +2 -2
  191. package/src/components/ComponentsProvider/componentsRegistry.ts +1 -4
  192. package/src/components/ContentWithPopup/ContentWithPopup.tsx +7 -0
  193. package/src/components/CriticalActionDialog/CriticalActionDialog.tsx +12 -25
  194. package/src/components/CriticalActionDialog/i18n/en.json +1 -2
  195. package/src/components/DropdownMenu/DropdownMenu.tsx +3 -2
  196. package/src/components/HoverPopup/HoverPopup.tsx +32 -3
  197. package/src/components/HoverPopup/getPopupScrollContainer.ts +20 -0
  198. package/src/components/SegmentedProgress/SegmentedProgress.scss +5 -0
  199. package/src/components/SegmentedProgress/SegmentedProgress.tsx +99 -10
  200. package/src/components/StorageGroupInfo/StorageGroupInfo.tsx +0 -13
  201. package/src/components/StorageGroupInfo/i18n/en.json +0 -1
  202. package/src/containers/App/App.tsx +3 -3
  203. package/src/containers/Cluster/ClusterInfo/ClusterInfo.scss +8 -0
  204. package/src/containers/Cluster/ClusterInfo/ClusterInfo.tsx +12 -11
  205. package/src/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.scss +18 -0
  206. package/src/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.tsx +143 -58
  207. package/src/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/utils.ts +89 -0
  208. package/src/containers/Cluster/i18n/en.json +13 -4
  209. package/src/containers/Header/HeaderActionsMenu.tsx +22 -2
  210. package/src/containers/Header/hooks/useSharedDatabasePath.ts +33 -26
  211. package/src/containers/Header/i18n/en.json +1 -0
  212. package/src/containers/Node/Node.tsx +32 -18
  213. package/src/containers/Node/NodePages.ts +5 -10
  214. package/src/containers/Node/i18n/en.json +0 -4
  215. package/src/containers/Nodes/NodesTable.tsx +7 -1
  216. package/src/containers/Operations/columns.tsx +4 -0
  217. package/src/containers/Operations/i18n/en.json +2 -2
  218. package/src/containers/PDiskPage/DecommissionButton/DecommissionButton.tsx +2 -0
  219. package/src/containers/PDiskPage/PDiskPage.tsx +3 -1
  220. package/src/containers/PDiskPage/i18n/en.json +3 -3
  221. package/src/containers/Storage/PDisks/PDisks.tsx +1 -1
  222. package/src/containers/Storage/PaginatedStorageGroups/GroupedStorageGroupsComponent.tsx +0 -1
  223. package/src/containers/Storage/PaginatedStorageGroupsTable/PaginatedStorageGroupsTable.tsx +2 -6
  224. package/src/containers/Storage/PaginatedStorageGroupsTable/columns/constants.ts +2 -2
  225. package/src/containers/Storage/PaginatedStorageGroupsTable/getGroups.ts +40 -47
  226. package/src/containers/StorageGroupPage/StorageGroupPage.tsx +2 -6
  227. package/src/containers/Tablet/components/TabletControls/TabletControls.tsx +7 -1
  228. package/src/containers/Tablet/i18n/en.json +3 -3
  229. package/src/containers/Tablets/TabletsTable.tsx +3 -1
  230. package/src/containers/Tablets/i18n/en.json +1 -1
  231. package/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/HealthcheckPreview.tsx +3 -1
  232. package/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.tsx +2 -2
  233. package/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopGroups.tsx +1 -6
  234. package/src/containers/Tenant/Diagnostics/useDiagnosticsPages.ts +1 -4
  235. package/src/containers/Tenant/Healthcheck/components/HealthcheckDrawer.tsx +16 -1
  236. package/src/routes.ts +1 -1
  237. package/src/services/api/viewer.ts +1 -25
  238. package/src/store/reducers/api.ts +4 -0
  239. package/src/store/reducers/capabilities/hooks.ts +0 -4
  240. package/src/store/reducers/cluster/cluster.ts +3 -2
  241. package/src/store/reducers/clusters/clusters.ts +2 -1
  242. package/src/store/reducers/entityDataTags.ts +34 -0
  243. package/src/store/reducers/node/node.ts +0 -11
  244. package/src/store/reducers/node/types.ts +0 -18
  245. package/src/store/reducers/storage/requestStorageData.ts +5 -17
  246. package/src/store/reducers/storage/storage.ts +2 -6
  247. package/src/store/reducers/storage/types.ts +0 -9
  248. package/src/store/reducers/storage/utils.ts +5 -178
  249. package/src/store/reducers/tenant/tenant.ts +17 -1
  250. package/src/store/reducers/tenants/tenants.ts +2 -1
  251. package/src/store/state-url-mapping.ts +5 -1
  252. package/src/types/api/storage.ts +7 -131
  253. package/src/uiFactory/types.ts +9 -0
  254. package/src/uiFactory/uiFactory.ts +12 -2
  255. package/dist/containers/Node/NodeStructure/NodeStructure.d.ts +0 -7
  256. package/dist/containers/Node/NodeStructure/NodeStructure.js +0 -76
  257. package/dist/containers/Node/NodeStructure/NodeStructure.js.map +0 -1
  258. package/dist/containers/Node/NodeStructure/NodeStructure.scss +0 -155
  259. package/dist/containers/Node/NodeStructure/PDiskTitleBadge.d.ts +0 -7
  260. package/dist/containers/Node/NodeStructure/PDiskTitleBadge.js +0 -7
  261. package/dist/containers/Node/NodeStructure/PDiskTitleBadge.js.map +0 -1
  262. package/dist/containers/Node/NodeStructure/Pdisk.d.ts +0 -10
  263. package/dist/containers/Node/NodeStructure/Pdisk.js +0 -125
  264. package/dist/containers/Node/NodeStructure/Pdisk.js.map +0 -1
  265. package/dist/store/reducers/node/selectors.d.ts +0 -47
  266. package/dist/store/reducers/node/selectors.js +0 -43
  267. package/dist/store/reducers/node/selectors.js.map +0 -1
  268. package/src/containers/Node/NodeStructure/NodeStructure.scss +0 -155
  269. package/src/containers/Node/NodeStructure/NodeStructure.tsx +0 -121
  270. package/src/containers/Node/NodeStructure/PDiskTitleBadge.tsx +0 -18
  271. package/src/containers/Node/NodeStructure/Pdisk.tsx +0 -274
  272. package/src/store/reducers/node/selectors.ts +0 -68
@@ -190,7 +190,9 @@ function TabletActions(tablet: TTabletStateInfo) {
190
190
  <ButtonWithConfirmDialog
191
191
  buttonView="outlined"
192
192
  dialogHeader={i18n('dialog.kill-header')}
193
- dialogWarning={i18n('dialog.kill-text')}
193
+ dialogText={i18n('dialog.kill-text')}
194
+ applyButtonText={i18n('dialog.kill-header')}
195
+ applyButtonView="action"
194
196
  onConfirmAction={() => {
195
197
  return killTablet({id}).unwrap();
196
198
  }}
@@ -10,7 +10,7 @@
10
10
  "Generation": "Generation",
11
11
  "Uptime": "Uptime",
12
12
  "dialog.kill-header": "Restart tablet",
13
- "dialog.kill-text": "The tablet will be restarted. Do you want to proceed?",
13
+ "dialog.kill-text": "The tablet will restart. A portion of table data will be temporarily unavailable. Active transactions and scans will be interrupted with a retriable error and can be retried.",
14
14
  "controls.kill-not-allowed": "You don't have enough rights to restart tablet",
15
15
  "controls.kill-impossible-follower": "It's impossible to restart a follower",
16
16
  "controls.search-placeholder": "Tablet ID",
@@ -7,6 +7,7 @@ import {healthcheckApi} from '../../../../../store/reducers/healthcheckInfo/heal
7
7
  import {SelfCheckResult} from '../../../../../types/api/healthcheck';
8
8
  import {cn} from '../../../../../utils/cn';
9
9
  import {useAutoRefreshInterval} from '../../../../../utils/hooks';
10
+ import {useClusterNameFromQuery} from '../../../../../utils/hooks/useDatabaseFromQuery';
10
11
  import {isEnumMember} from '../../../../../utils/typecheckers';
11
12
  import {HEALTHCHECK_RESULT_TO_TEXT} from '../../../constants';
12
13
  import {useTenantQueryParams} from '../../../useTenantQueryParams';
@@ -24,6 +25,7 @@ interface HealthcheckPreviewProps {
24
25
 
25
26
  export function HealthcheckPreview(props: HealthcheckPreviewProps) {
26
27
  const {database} = props;
28
+ const clusterName = useClusterNameFromQuery();
27
29
  const [autoRefreshInterval] = useAutoRefreshInterval();
28
30
 
29
31
  const {handleShowHealthcheckChange} = useTenantQueryParams();
@@ -33,7 +35,7 @@ export function HealthcheckPreview(props: HealthcheckPreviewProps) {
33
35
  isFetching,
34
36
  error,
35
37
  } = healthcheckApi.useGetHealthcheckInfoQuery(
36
- {database},
38
+ {database, clusterName},
37
39
  {
38
40
  pollingInterval: autoRefreshInterval,
39
41
  },
@@ -311,11 +311,11 @@ export function TenantOverview({
311
311
 
312
312
  // Use healthcheck self_check_result as the database status color when available;
313
313
  // fall back to tenantinfo.Overall (e.g. for Serverless databases where healthcheck is skipped).
314
- // Polling is managed by HealthcheckPreview (deduped via the same cache key); the database
314
+ // Polling is managed by HealthcheckPreview via the same {database, clusterName} cache key. The database
315
315
  // status badge is only rendered when !isV2NavigationEnabled, so skip the query in V2 mode
316
316
  // and until tenant info is loaded to avoid spurious requests.
317
317
  const {currentData: healthcheckData} = healthcheckApi.useGetHealthcheckInfoQuery(
318
- {database},
318
+ {database, clusterName},
319
319
  {
320
320
  skip: shouldSkipHealthcheck({isServerless, isV2NavigationEnabled, tenant}),
321
321
  },
@@ -1,10 +1,7 @@
1
1
  import React from 'react';
2
2
 
3
3
  import {ResizeableDataTable} from '../../../../../components/ResizeableDataTable/ResizeableDataTable';
4
- import {
5
- useCapabilitiesLoaded,
6
- useStorageGroupsHandlerAvailable,
7
- } from '../../../../../store/reducers/capabilities/hooks';
4
+ import {useCapabilitiesLoaded} from '../../../../../store/reducers/capabilities/hooks';
8
5
  import {storageApi} from '../../../../../store/reducers/storage/storage';
9
6
  import type {GroupsRequiredField} from '../../../../../types/api/storage';
10
7
  import {
@@ -45,7 +42,6 @@ interface TopGroupsProps {
45
42
 
46
43
  export function TopGroups({tenant, capacityMetricsEnabled}: TopGroupsProps) {
47
44
  const capabilitiesLoaded = useCapabilitiesLoaded();
48
- const groupsHandlerAvailable = useStorageGroupsHandlerAvailable();
49
45
  const [autoRefreshInterval] = useAutoRefreshInterval();
50
46
 
51
47
  const {columns, fieldsRequired, sort} = React.useMemo(
@@ -59,7 +55,6 @@ export function TopGroups({tenant, capacityMetricsEnabled}: TopGroupsProps) {
59
55
  sort,
60
56
  with: 'all',
61
57
  limit: TENANT_OVERVIEW_TABLES_LIMIT,
62
- shouldUseGroupsHandler: groupsHandlerAvailable,
63
58
  fieldsRequired,
64
59
  },
65
60
  {
@@ -3,7 +3,6 @@ import React from 'react';
3
3
  import {
4
4
  useConfigAvailable,
5
5
  useNewStorageViewEnabled,
6
- useStorageGroupsHandlerAvailable,
7
6
  useStorageStatsAvailable,
8
7
  useTopicDataAvailable,
9
8
  } from '../../../store/reducers/capabilities/hooks';
@@ -42,10 +41,8 @@ export function useDiagnosticsPages({
42
41
 
43
42
  const hasConfigs = useConfigAvailable();
44
43
  const newStorageViewEnabled = useNewStorageViewEnabled();
45
- const storageGroupsAvailable = useStorageGroupsHandlerAvailable();
46
44
  const storageStatsAvailable = useStorageStatsAvailable();
47
- const hasStorageUsageCapabilities = storageGroupsAvailable && storageStatsAvailable;
48
- const hasStorageUsage = newStorageViewEnabled && hasStorageUsageCapabilities;
45
+ const hasStorageUsage = newStorageViewEnabled && storageStatsAvailable;
49
46
  const hasTopicData = useTopicDataAvailable();
50
47
  const isViewerUser = useIsViewerUser();
51
48
  const userPermissions = useUserPermissions();
@@ -7,6 +7,7 @@ import {DrawerWrapper} from '../../../../components/Drawer';
7
7
  import type {DrawerControl} from '../../../../components/Drawer';
8
8
  import {EnableFullscreenButton} from '../../../../components/EnableFullscreenButton/EnableFullscreenButton';
9
9
  import type {SelfCheckResult} from '../../../../types/api/healthcheck';
10
+ import {uiFactory} from '../../../../uiFactory/uiFactory';
10
11
  import {createAndDownloadJsonFile} from '../../../../utils/downloadFile';
11
12
 
12
13
  import {HealthcheckDrawerTitle} from './HealthcheckDrawerTitle';
@@ -42,6 +43,20 @@ export function HealthcheckDrawer({
42
43
  downloadTooltip,
43
44
  isDownloadDisabled,
44
45
  }: HealthcheckDrawerProps) {
46
+ const renderDrawerExtension = uiFactory.healthcheck.renderDrawerExtension;
47
+ const renderContentWithExtension = React.useCallback(() => {
48
+ if (!renderDrawerExtension) {
49
+ return renderDrawerContent();
50
+ }
51
+
52
+ return (
53
+ <React.Fragment>
54
+ {renderDrawerExtension()}
55
+ {renderDrawerContent()}
56
+ </React.Fragment>
57
+ );
58
+ }, [renderDrawerContent, renderDrawerExtension]);
59
+
45
60
  const handleDownload = React.useCallback(
46
61
  (event: React.MouseEvent<HTMLButtonElement>) => {
47
62
  event.stopPropagation();
@@ -86,7 +101,7 @@ export function HealthcheckDrawer({
86
101
  isDrawerVisible={isDrawerVisible}
87
102
  onCloseDrawer={onCloseDrawer}
88
103
  onTransitionInComplete={onTransitionInComplete}
89
- renderDrawerContent={renderDrawerContent}
104
+ renderDrawerContent={renderContentWithExtension}
90
105
  drawerId={drawerId}
91
106
  storageKey={storageKey}
92
107
  detectClickOutside
package/src/routes.ts CHANGED
@@ -169,7 +169,7 @@ export function getStorageGroupPath(groupId: string | number, query: Query = {})
169
169
  }
170
170
 
171
171
  export function getDefaultNodePath(
172
- params: {id: string | number; activeTab?: NodeTab},
172
+ params: {id: string | number; activeTab?: NodeTab; environment?: string},
173
173
  query: NodePageQuery = {},
174
174
  options?: CreateHrefOptions,
175
175
  ) {
@@ -28,12 +28,7 @@ import type {
28
28
  import type {JsonRenderRequestParams, JsonRenderResponse} from '../../types/api/render';
29
29
  import type {DescribeReplicationResult} from '../../types/api/replication';
30
30
  import type {TEvDescribeSchemeResult} from '../../types/api/schema';
31
- import type {
32
- StorageRequestParams,
33
- StorageStatsRequestParams,
34
- StorageStatsResponse,
35
- TStorageInfo,
36
- } from '../../types/api/storage';
31
+ import type {StorageStatsRequestParams, StorageStatsResponse} from '../../types/api/storage';
37
32
  import type {TEvSystemStateResponse} from '../../types/api/systemState';
38
33
  import type {
39
34
  TDomainKey,
@@ -524,25 +519,6 @@ export class ViewerAPI extends BaseYdbAPI {
524
519
  );
525
520
  }
526
521
 
527
- getStorageInfo(
528
- {database, nodeId, groupId, pDiskId, filter, ...params}: StorageRequestParams,
529
- {concurrentId, signal}: AxiosOptions = {},
530
- ) {
531
- return this.get<TStorageInfo>(
532
- this.getPath(`/viewer/json/storage?enums=true`),
533
- {
534
- database,
535
- node_id: nodeId,
536
- group_id: groupId,
537
- pdisk_id: pDiskId,
538
- // Do not send empty string
539
- filter: filter || undefined,
540
- ...params,
541
- },
542
- {concurrentId, requestConfig: {signal}},
543
- );
544
- }
545
-
546
522
  getStorageStats(
547
523
  {
548
524
  database,
@@ -1,6 +1,8 @@
1
1
  import type {BaseQueryFn} from '@reduxjs/toolkit/query';
2
2
  import {createApi} from '@reduxjs/toolkit/query/react';
3
3
 
4
+ import {CLUSTER_DATA_TAG, DATABASE_DATA_TAG} from './entityDataTags';
5
+
4
6
  export const api = createApi({
5
7
  baseQuery: fakeBaseQuery(),
6
8
  /**
@@ -27,6 +29,8 @@ export const api = createApi({
27
29
  'Backups',
28
30
  'BackupsSchedule',
29
31
  'OperationList',
32
+ DATABASE_DATA_TAG,
33
+ CLUSTER_DATA_TAG,
30
34
  ],
31
35
  });
32
36
 
@@ -81,10 +81,6 @@ export const useTracingLevelOptionAvailable = () => {
81
81
  return useGetFeatureVersion('/viewer/query') > 2;
82
82
  };
83
83
 
84
- export const useStorageGroupsHandlerAvailable = () => {
85
- return useGetFeatureVersion('/storage/groups') > 2;
86
- };
87
-
88
84
  export const useStorageStatsAvailable = () => {
89
85
  return useGetFeatureVersion('/viewer/storage_stats') > 0;
90
86
  };
@@ -13,6 +13,7 @@ import {useIsViewerUser} from '../../../utils/hooks/useIsUserAllowedToMakeChange
13
13
  import {isQueryErrorResponse} from '../../../utils/query';
14
14
  import type {RootState} from '../../defaultStore';
15
15
  import {api} from '../api';
16
+ import {getClusterDataTag} from '../entityDataTags';
16
17
  import {selectNodesMap} from '../nodesList';
17
18
 
18
19
  import {
@@ -117,7 +118,7 @@ export const clusterApi = api.injectEndpoints({
117
118
  return {error};
118
119
  }
119
120
  },
120
- providesTags: ['All'],
121
+ providesTags: (_result, _error, clusterName) => ['All', getClusterDataTag(clusterName)],
121
122
  }),
122
123
  getClusterBaseInfo: builder.query({
123
124
  queryFn: async (clusterName: string, {signal}) => {
@@ -131,7 +132,7 @@ export const clusterApi = api.injectEndpoints({
131
132
  return {error};
132
133
  }
133
134
  },
134
- providesTags: ['All'],
135
+ providesTags: (_result, _error, clusterName) => ['All', getClusterDataTag(clusterName)],
135
136
  }),
136
137
  }),
137
138
  overrideExisting: 'throw',
@@ -2,6 +2,7 @@ import {createSlice} from '@reduxjs/toolkit';
2
2
  import type {PayloadAction} from '@reduxjs/toolkit';
3
3
 
4
4
  import {api} from '../api';
5
+ import {CLUSTER_DATA_LIST_TAG} from '../entityDataTags';
5
6
 
6
7
  import type {ClustersFilters} from './types';
7
8
  import {prepareClustersData} from './utils';
@@ -43,7 +44,7 @@ export const clustersApi = api.injectEndpoints({
43
44
  return {error};
44
45
  }
45
46
  },
46
- providesTags: ['All'],
47
+ providesTags: ['All', CLUSTER_DATA_LIST_TAG],
47
48
  }),
48
49
  }),
49
50
  overrideExisting: 'throw',
@@ -0,0 +1,34 @@
1
+ export const DATABASE_DATA_TAG = 'DatabaseData';
2
+ export const CLUSTER_DATA_TAG = 'ClusterData';
3
+
4
+ const ENTITY_DATA_LIST_TAG_ID = 'LIST';
5
+
6
+ export const DATABASE_DATA_LIST_TAG = {
7
+ type: DATABASE_DATA_TAG,
8
+ id: ENTITY_DATA_LIST_TAG_ID,
9
+ } as const;
10
+
11
+ export const CLUSTER_DATA_LIST_TAG = {
12
+ type: CLUSTER_DATA_TAG,
13
+ id: ENTITY_DATA_LIST_TAG_ID,
14
+ } as const;
15
+
16
+ export function getDatabaseDataTag({
17
+ clusterName,
18
+ database,
19
+ }: {
20
+ clusterName?: string;
21
+ database: string;
22
+ }) {
23
+ return {
24
+ type: DATABASE_DATA_TAG,
25
+ id: JSON.stringify([clusterName ?? null, database]),
26
+ } as const;
27
+ }
28
+
29
+ export function getClusterDataTag(clusterName?: string) {
30
+ return {
31
+ type: CLUSTER_DATA_TAG,
32
+ id: JSON.stringify(clusterName ?? null),
33
+ } as const;
34
+ }
@@ -15,17 +15,6 @@ export const nodeApi = api.injectEndpoints({
15
15
  },
16
16
  providesTags: ['All'],
17
17
  }),
18
- getNodeStructure: build.query({
19
- queryFn: async ({nodeId}: {nodeId: string}, {signal}) => {
20
- try {
21
- const data = await window.api.viewer.getStorageInfo({nodeId}, {signal});
22
- return {data};
23
- } catch (error) {
24
- return {error};
25
- }
26
- },
27
- providesTags: ['All'],
28
- }),
29
18
  }),
30
19
  overrideExisting: 'throw',
31
20
  });
@@ -1,21 +1,3 @@
1
- import type {PreparedPDisk, PreparedVDisk} from '../../../utils/disks/types';
2
1
  import type {PreparedNodeSystemState} from '../../../utils/nodes';
3
2
 
4
- interface RawStructurePDisk extends PreparedPDisk {
5
- vDisks: Record<string, PreparedVDisk>;
6
- }
7
-
8
- export type RawNodeStructure = Record<string, RawStructurePDisk>;
9
-
10
- export interface PreparedStructureVDisk extends PreparedVDisk {
11
- id: string;
12
- order: number;
13
- }
14
-
15
- export interface PreparedStructurePDisk extends PreparedPDisk {
16
- vDisks: PreparedStructureVDisk[];
17
- }
18
-
19
- export type PreparedNodeStructure = Record<string, PreparedStructurePDisk>;
20
-
21
3
  export interface PreparedNode extends Partial<PreparedNodeSystemState> {}
@@ -1,21 +1,9 @@
1
1
  import type {AxiosOptions} from '../../../services/api/base';
2
- import type {GroupsRequestParams, StorageRequestParams} from '../../../types/api/storage';
2
+ import type {GroupsRequestParams} from '../../../types/api/storage';
3
3
 
4
- import {prepareGroupsResponse, prepareStorageResponse} from './utils';
4
+ import {prepareGroupsResponse} from './utils';
5
5
 
6
- export async function requestStorageData(
7
- {
8
- version = 'v2',
9
- shouldUseGroupsHandler,
10
- ...params
11
- }: StorageRequestParams & GroupsRequestParams & {shouldUseGroupsHandler?: boolean},
12
- options?: AxiosOptions,
13
- ) {
14
- if (shouldUseGroupsHandler && version !== 'v1') {
15
- const result = await window.api.storage.getStorageGroups({...params}, options);
16
- return prepareGroupsResponse(result);
17
- } else {
18
- const result = await window.api.viewer.getStorageInfo({version, ...params}, options);
19
- return prepareStorageResponse(result);
20
- }
6
+ export async function requestStorageData(params: GroupsRequestParams, options?: AxiosOptions) {
7
+ const result = await window.api.storage.getStorageGroups(params, options);
8
+ return prepareGroupsResponse(result);
21
9
  }
@@ -1,5 +1,5 @@
1
1
  import type {NodesRequestParams} from '../../../types/api/nodes';
2
- import type {GroupsRequestParams, StorageRequestParams} from '../../../types/api/storage';
2
+ import type {GroupsRequestParams} from '../../../types/api/storage';
3
3
  import {api} from '../api';
4
4
 
5
5
  import {requestStorageData} from './requestStorageData';
@@ -22,11 +22,7 @@ export const storageApi = api.injectEndpoints({
22
22
  providesTags: ['All', 'StorageData'],
23
23
  }),
24
24
  getStorageGroupsInfo: builder.query({
25
- queryFn: async (
26
- params: StorageRequestParams &
27
- GroupsRequestParams & {shouldUseGroupsHandler?: boolean},
28
- {signal},
29
- ) => {
25
+ queryFn: async (params: GroupsRequestParams, {signal}) => {
30
26
  try {
31
27
  const result = await requestStorageData(params, {signal});
32
28
  return {data: result};
@@ -83,16 +83,7 @@ export interface PreparedStorageGroup {
83
83
  VDisks?: PreparedVDisk[];
84
84
 
85
85
  Kind?: string;
86
- ChangeTime?: number | string;
87
86
  GroupGeneration?: string;
88
- Latency?: EFlag;
89
- AcquiredUnits?: string;
90
- AcquiredIOPS?: number;
91
- AcquiredThroughput?: string;
92
- AcquiredSize?: string;
93
- MaximumIOPS?: number;
94
- MaximumThroughput?: string;
95
- MaximumSize?: string;
96
87
 
97
88
  AllocationUnits?: string | number;
98
89
  GroupSizeInUnits?: number;
@@ -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 = (
@@ -237,10 +76,10 @@ const prepareStorageNodeData = (
237
76
  }).length || 0;
238
77
 
239
78
  const pDisks = PDisks?.map((pDisk) => {
240
- return {
241
- ...prepareWhiteboardPDiskData(pDisk),
79
+ return prepareWhiteboardPDiskData({
80
+ ...pDisk,
242
81
  NodeId,
243
- };
82
+ });
244
83
  });
245
84
  const vDisks = VDisks?.map((vDisk) => {
246
85
  return {
@@ -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};