ydb-embedded-ui 22.4.0 → 22.6.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 (337) hide show
  1. package/dist/components/AutoRefreshControl/StickyAutoRefreshControl.d.ts +2 -0
  2. package/dist/components/AutoRefreshControl/StickyAutoRefreshControl.js +9 -0
  3. package/dist/components/AutoRefreshControl/StickyAutoRefreshControl.js.map +1 -0
  4. package/dist/components/AutoRefreshControl/StickyAutoRefreshControl.scss +18 -0
  5. package/dist/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.d.ts +3 -2
  6. package/dist/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.js +19 -4
  7. package/dist/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.js.map +1 -1
  8. package/dist/components/CopyableValue/CopyableValue.d.ts +10 -0
  9. package/dist/components/CopyableValue/CopyableValue.js +10 -0
  10. package/dist/components/CopyableValue/CopyableValue.js.map +1 -0
  11. package/dist/components/CopyableValue/CopyableValue.scss +16 -0
  12. package/dist/components/CopyableValue/i18n/en.json +3 -0
  13. package/dist/components/CopyableValue/i18n/index.d.ts +2 -0
  14. package/dist/components/CopyableValue/i18n/index.js +6 -0
  15. package/dist/components/CopyableValue/i18n/index.js.map +1 -0
  16. package/dist/components/CriticalActionDialog/CriticalActionDialog.d.ts +2 -1
  17. package/dist/components/CriticalActionDialog/CriticalActionDialog.js +2 -1
  18. package/dist/components/CriticalActionDialog/CriticalActionDialog.js.map +1 -1
  19. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.d.ts +1 -21
  20. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.js +40 -126
  21. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.js.map +1 -1
  22. package/dist/components/DiskCapacityInfo/i18n/en.json +0 -1
  23. package/dist/components/DiskCapacityInfo/i18n/index.d.ts +1 -1
  24. package/dist/components/EntityStatus/EntityStatus.d.ts +18 -6
  25. package/dist/components/EntityStatus/EntityStatus.js +5 -1
  26. package/dist/components/EntityStatus/EntityStatus.js.map +1 -1
  27. package/dist/components/EntityStatus/EntityStatus.scss +5 -0
  28. package/dist/components/EvictVDiskButton/EvictVDiskButton.d.ts +5 -2
  29. package/dist/components/EvictVDiskButton/EvictVDiskButton.js +3 -2
  30. package/dist/components/EvictVDiskButton/EvictVDiskButton.js.map +1 -1
  31. package/dist/components/EvictVDiskButton/i18n/en.json +2 -2
  32. package/dist/components/FullNodeViewer/FullNodeViewer.js +4 -7
  33. package/dist/components/FullNodeViewer/FullNodeViewer.js.map +1 -1
  34. package/dist/components/FullNodeViewer/i18n/index.d.ts +1 -1
  35. package/dist/components/HideUnavailableNodesSwitch/HideUnavailableNodesSwitch.d.ts +3 -0
  36. package/dist/components/HideUnavailableNodesSwitch/HideUnavailableNodesSwitch.js +12 -0
  37. package/dist/components/HideUnavailableNodesSwitch/HideUnavailableNodesSwitch.js.map +1 -0
  38. package/dist/components/HideUnavailableNodesSwitch/i18n/en.json +3 -0
  39. package/dist/components/HideUnavailableNodesSwitch/i18n/index.d.ts +2 -0
  40. package/dist/components/HideUnavailableNodesSwitch/i18n/index.js +6 -0
  41. package/dist/components/HideUnavailableNodesSwitch/i18n/index.js.map +1 -0
  42. package/dist/components/HideUnavailableNodesSwitch/i18n/ru.json +3 -0
  43. package/dist/components/HoverPopup/HoverPopup.d.ts +1 -0
  44. package/dist/components/HoverPopup/HoverPopup.js +87 -16
  45. package/dist/components/HoverPopup/HoverPopup.js.map +1 -1
  46. package/dist/components/MemoryViewer/MemoryViewer.d.ts +3 -1
  47. package/dist/components/MemoryViewer/MemoryViewer.js +25 -16
  48. package/dist/components/MemoryViewer/MemoryViewer.js.map +1 -1
  49. package/dist/components/MemoryViewer/i18n/en.json +4 -3
  50. package/dist/components/MemoryViewer/i18n/index.d.ts +1 -1
  51. package/dist/components/MemoryViewer/utils.d.ts +4 -2
  52. package/dist/components/MemoryViewer/utils.js +11 -11
  53. package/dist/components/MemoryViewer/utils.js.map +1 -1
  54. package/dist/components/PDiskInfo/PDiskInfo.d.ts +4 -9
  55. package/dist/components/PDiskInfo/PDiskInfo.js +32 -144
  56. package/dist/components/PDiskInfo/PDiskInfo.js.map +1 -1
  57. package/dist/components/PDiskInfo/PDiskInfo.scss +15 -0
  58. package/dist/components/PDiskInfo/PDiskLogSize.js +1 -1
  59. package/dist/components/PDiskInfo/PDiskLogSize.js.map +1 -1
  60. package/dist/components/PDiskInfo/i18n/en.json +6 -3
  61. package/dist/components/PDiskInfo/i18n/index.d.ts +1 -1
  62. package/dist/components/PDiskInfo/statuses.js +12 -3
  63. package/dist/components/PDiskInfo/statuses.js.map +1 -1
  64. package/dist/components/PageMeta/PageMeta.d.ts +0 -2
  65. package/dist/components/PageMeta/PageMeta.js +1 -6
  66. package/dist/components/PageMeta/PageMeta.js.map +1 -1
  67. package/dist/components/Search/Search.js +3 -1
  68. package/dist/components/Search/Search.js.map +1 -1
  69. package/dist/components/StorageGroupInfo/StorageGroupInfo.js +4 -9
  70. package/dist/components/StorageGroupInfo/StorageGroupInfo.js.map +1 -1
  71. package/dist/components/StorageGroupInfo/i18n/index.d.ts +1 -1
  72. package/dist/components/TenantNameWrapper/i18n/index.d.ts +1 -1
  73. package/dist/components/VDisk/VDisk.js +2 -2
  74. package/dist/components/VDisk/VDisk.js.map +1 -1
  75. package/dist/components/VDiskInfo/VDiskInfo.d.ts +3 -7
  76. package/dist/components/VDiskInfo/VDiskInfo.js +57 -235
  77. package/dist/components/VDiskInfo/VDiskInfo.js.map +1 -1
  78. package/dist/components/VDiskInfo/VDiskInfo.scss +19 -3
  79. package/dist/components/VDiskInfo/getVDiskDetails.d.ts +7 -1
  80. package/dist/components/VDiskInfo/getVDiskDetails.js +14 -1
  81. package/dist/components/VDiskInfo/getVDiskDetails.js.map +1 -1
  82. package/dist/components/VDiskInfo/i18n/en.json +4 -13
  83. package/dist/components/VDiskInfo/i18n/index.d.ts +1 -1
  84. package/dist/components/VDiskPopup/VDiskPopup.d.ts +2 -1
  85. package/dist/components/VDiskPopup/VDiskPopup.js +10 -26
  86. package/dist/components/VDiskPopup/VDiskPopup.js.map +1 -1
  87. package/dist/components/VDiskPopup/i18n/en.json +0 -2
  88. package/dist/components/VDiskPopup/i18n/index.d.ts +1 -1
  89. package/dist/components/VDiskStatus/VDiskReplicationStatus.js +1 -1
  90. package/dist/components/VDiskStatus/VDiskReplicationStatus.js.map +1 -1
  91. package/dist/components/VDiskStatus/VDiskStatus.js +2 -2
  92. package/dist/components/VDiskStatus/VDiskStatus.js.map +1 -1
  93. package/dist/components/VDiskStatus/VDiskStatus.scss +4 -0
  94. package/dist/components/VDiskStatus/statuses.js +2 -2
  95. package/dist/components/VDiskStatus/statuses.js.map +1 -1
  96. package/dist/components/nodesColumns/columns.d.ts +1 -0
  97. package/dist/components/nodesColumns/columns.js +13 -6
  98. package/dist/components/nodesColumns/columns.js.map +1 -1
  99. package/dist/containers/Clusters/Clusters.js +35 -6
  100. package/dist/containers/Clusters/Clusters.js.map +1 -1
  101. package/dist/containers/Clusters/Clusters.scss +24 -6
  102. package/dist/containers/Clusters/columns.js +9 -4
  103. package/dist/containers/Clusters/columns.js.map +1 -1
  104. package/dist/containers/Clusters/i18n/en.json +6 -0
  105. package/dist/containers/Clusters/i18n/index.d.ts +1 -1
  106. package/dist/containers/Header/Header.js +8 -0
  107. package/dist/containers/Header/Header.js.map +1 -1
  108. package/dist/containers/Header/HeaderLeftControls.js +3 -1
  109. package/dist/containers/Header/HeaderLeftControls.js.map +1 -1
  110. package/dist/containers/Header/PDiskLeftControls.d.ts +1 -0
  111. package/dist/containers/Header/PDiskLeftControls.js +24 -0
  112. package/dist/containers/Header/PDiskLeftControls.js.map +1 -0
  113. package/dist/containers/Header/VDiskLeftControls.d.ts +1 -0
  114. package/dist/containers/Header/VDiskLeftControls.js +23 -0
  115. package/dist/containers/Header/VDiskLeftControls.js.map +1 -0
  116. package/dist/containers/Header/breadcrumbs.js +5 -2
  117. package/dist/containers/Header/breadcrumbs.js.map +1 -1
  118. package/dist/containers/Header/i18n/en.json +4 -1
  119. package/dist/containers/Header/i18n/index.d.ts +1 -1
  120. package/dist/containers/Node/Node.js +4 -3
  121. package/dist/containers/Node/Node.js.map +1 -1
  122. package/dist/containers/Node/Node.scss +14 -2
  123. package/dist/containers/Nodes/NodesControls/NodesControls.js +2 -1
  124. package/dist/containers/Nodes/NodesControls/NodesControls.js.map +1 -1
  125. package/dist/containers/Nodes/NodesTable.js +4 -0
  126. package/dist/containers/Nodes/NodesTable.js.map +1 -1
  127. package/dist/containers/Nodes/PaginatedNodes/GroupedNodesComponent.js +8 -3
  128. package/dist/containers/Nodes/PaginatedNodes/GroupedNodesComponent.js.map +1 -1
  129. package/dist/containers/Nodes/PaginatedNodes/NodesComponent.js +12 -2
  130. package/dist/containers/Nodes/PaginatedNodes/NodesComponent.js.map +1 -1
  131. package/dist/containers/Nodes/getNodes.js +2 -1
  132. package/dist/containers/Nodes/getNodes.js.map +1 -1
  133. package/dist/containers/Nodes/useDebouncedSearch.d.ts +2 -0
  134. package/dist/containers/Nodes/useDebouncedSearch.js +11 -0
  135. package/dist/containers/Nodes/useDebouncedSearch.js.map +1 -0
  136. package/dist/containers/PDiskPage/PDiskPage.js +24 -34
  137. package/dist/containers/PDiskPage/PDiskPage.js.map +1 -1
  138. package/dist/containers/PDiskPage/PDiskPage.scss +29 -11
  139. package/dist/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.js +3 -3
  140. package/dist/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.js.map +1 -1
  141. package/dist/containers/PDiskPage/PDiskStorageDetails.d.ts +6 -0
  142. package/dist/containers/PDiskPage/PDiskStorageDetails.js +28 -0
  143. package/dist/containers/PDiskPage/PDiskStorageDetails.js.map +1 -0
  144. package/dist/containers/PDiskPage/PDiskStorageDetails.scss +51 -0
  145. package/dist/containers/PDiskPage/i18n/en.json +1 -0
  146. package/dist/containers/PDiskPage/i18n/index.d.ts +1 -1
  147. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/i18n/index.d.ts +1 -1
  148. package/dist/containers/Storage/PaginatedStorageNodes/GroupedStorageNodesComponent.js +3 -0
  149. package/dist/containers/Storage/PaginatedStorageNodes/GroupedStorageNodesComponent.js.map +1 -1
  150. package/dist/containers/Storage/PaginatedStorageNodes/StorageNodesComponent.js +8 -1
  151. package/dist/containers/Storage/PaginatedStorageNodes/StorageNodesComponent.js.map +1 -1
  152. package/dist/containers/Storage/PaginatedStorageNodes/StorageNodesControls.js +2 -1
  153. package/dist/containers/Storage/PaginatedStorageNodes/StorageNodesControls.js.map +1 -1
  154. package/dist/containers/Storage/PaginatedStorageNodesTable/PaginatedStorageNodesTable.js +4 -0
  155. package/dist/containers/Storage/PaginatedStorageNodesTable/PaginatedStorageNodesTable.js.map +1 -1
  156. package/dist/containers/Storage/PaginatedStorageNodesTable/getNodes.js +2 -1
  157. package/dist/containers/Storage/PaginatedStorageNodesTable/getNodes.js.map +1 -1
  158. package/dist/containers/Storage/Storage.scss +4 -0
  159. package/dist/containers/Storage/StorageExpertModePanel/constants.d.ts +1 -1
  160. package/dist/containers/Storage/StorageExpertModePanel/i18n/index.d.ts +1 -1
  161. package/dist/containers/Storage/useStorageQueryParams.d.ts +4 -4
  162. package/dist/containers/StorageGroupPage/StorageGroupPage.js +5 -14
  163. package/dist/containers/StorageGroupPage/StorageGroupPage.js.map +1 -1
  164. package/dist/containers/StorageGroupPage/StorageGroupPage.scss +19 -4
  165. package/dist/containers/StorageGroupPage/i18n/en.json +0 -2
  166. package/dist/containers/StorageGroupPage/i18n/index.d.ts +1 -1
  167. package/dist/containers/Tablet/Tablet.js +3 -2
  168. package/dist/containers/Tablet/Tablet.js.map +1 -1
  169. package/dist/containers/Tablet/Tablet.scss +15 -1
  170. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/ManagePartitioningDialog/i18n/index.d.ts +1 -1
  171. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.js +5 -12
  172. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.js.map +1 -1
  173. package/dist/containers/Tenant/Diagnostics/TopQueries/columns/i18n/index.d.ts +1 -1
  174. package/dist/containers/Tenant/Healthcheck/Healthcheck.scss +6 -1
  175. package/dist/containers/Tenant/Healthcheck/components/HealthcheckIssue.js +2 -2
  176. package/dist/containers/Tenant/Healthcheck/components/HealthcheckIssue.js.map +1 -1
  177. package/dist/containers/Tenant/TenantDrawerHealthcheck.js +10 -2
  178. package/dist/containers/Tenant/TenantDrawerHealthcheck.js.map +1 -1
  179. package/dist/containers/VDiskPage/VDiskPage.js +27 -36
  180. package/dist/containers/VDiskPage/VDiskPage.js.map +1 -1
  181. package/dist/containers/VDiskPage/VDiskPage.scss +39 -7
  182. package/dist/containers/VDiskPage/VDiskStorageDetails.js +27 -29
  183. package/dist/containers/VDiskPage/VDiskStorageDetails.js.map +1 -1
  184. package/dist/containers/VDiskPage/VDiskStorageDetails.scss +24 -93
  185. package/dist/containers/VDiskPage/i18n/en.json +2 -12
  186. package/dist/containers/VDiskPage/i18n/index.d.ts +1 -1
  187. package/dist/store/reducers/capabilities/hooks.d.ts +1 -0
  188. package/dist/store/reducers/capabilities/hooks.js +3 -0
  189. package/dist/store/reducers/capabilities/hooks.js.map +1 -1
  190. package/dist/store/reducers/cluster/parseFields.js +1 -0
  191. package/dist/store/reducers/cluster/parseFields.js.map +1 -1
  192. package/dist/store/reducers/clusters/clusters.js +1 -0
  193. package/dist/store/reducers/clusters/clusters.js.map +1 -1
  194. package/dist/store/reducers/clusters/selectors.d.ts +1 -0
  195. package/dist/store/reducers/clusters/selectors.js +4 -1
  196. package/dist/store/reducers/clusters/selectors.js.map +1 -1
  197. package/dist/store/reducers/clusters/types.d.ts +2 -0
  198. package/dist/store/reducers/nodes/types.d.ts +1 -0
  199. package/dist/store/reducers/storage/prepareGroupsDisks.d.ts +1 -1
  200. package/dist/store/reducers/storage/prepareGroupsDisks.js +2 -1
  201. package/dist/store/reducers/storage/prepareGroupsDisks.js.map +1 -1
  202. package/dist/store/reducers/storage/types.d.ts +1 -0
  203. package/dist/store/reducers/storage/utils.js +10 -3
  204. package/dist/store/reducers/storage/utils.js.map +1 -1
  205. package/dist/store/reducers/vdisk/types.d.ts +1 -1
  206. package/dist/store/reducers/vdisk/utils.js +5 -5
  207. package/dist/store/reducers/vdisk/utils.js.map +1 -1
  208. package/dist/types/api/capabilities.d.ts +1 -1
  209. package/dist/types/api/meta.d.ts +1 -0
  210. package/dist/types/api/nodes.d.ts +2 -0
  211. package/dist/types/api/nodesList.d.ts +2 -0
  212. package/dist/utils/hooks/useDatabaseHealthcheckAvailable.d.ts +2 -0
  213. package/dist/utils/hooks/useDatabaseHealthcheckAvailable.js +6 -0
  214. package/dist/utils/hooks/useDatabaseHealthcheckAvailable.js.map +1 -0
  215. package/dist/utils/hooks/useHideUnavailableNodes.d.ts +5 -0
  216. package/dist/utils/hooks/useHideUnavailableNodes.js +21 -0
  217. package/dist/utils/hooks/useHideUnavailableNodes.js.map +1 -0
  218. package/dist/utils/memory.d.ts +5 -0
  219. package/dist/utils/memory.js +9 -0
  220. package/dist/utils/memory.js.map +1 -0
  221. package/dist/utils/nodes.js +3 -3
  222. package/dist/utils/nodes.js.map +1 -1
  223. package/dist/utils/storageMetrics.d.ts +1 -0
  224. package/dist/utils/storageMetrics.js +8 -0
  225. package/dist/utils/storageMetrics.js.map +1 -1
  226. package/package.json +1 -1
  227. package/src/components/AutoRefreshControl/StickyAutoRefreshControl.scss +18 -0
  228. package/src/components/AutoRefreshControl/StickyAutoRefreshControl.tsx +15 -0
  229. package/src/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.tsx +22 -3
  230. package/src/components/CopyableValue/CopyableValue.scss +16 -0
  231. package/src/components/CopyableValue/CopyableValue.tsx +40 -0
  232. package/src/components/CopyableValue/i18n/en.json +3 -0
  233. package/src/components/CopyableValue/i18n/index.ts +8 -0
  234. package/src/components/CriticalActionDialog/CriticalActionDialog.tsx +3 -0
  235. package/src/components/DiskCapacityInfo/DiskCapacityInfo.tsx +40 -185
  236. package/src/components/DiskCapacityInfo/i18n/en.json +0 -1
  237. package/src/components/EntityStatus/EntityStatus.scss +5 -0
  238. package/src/components/EntityStatus/EntityStatus.tsx +38 -5
  239. package/src/components/EvictVDiskButton/EvictVDiskButton.tsx +10 -2
  240. package/src/components/EvictVDiskButton/i18n/en.json +2 -2
  241. package/src/components/FullNodeViewer/FullNodeViewer.tsx +4 -9
  242. package/src/components/HideUnavailableNodesSwitch/HideUnavailableNodesSwitch.tsx +24 -0
  243. package/src/components/HideUnavailableNodesSwitch/i18n/en.json +3 -0
  244. package/src/components/HideUnavailableNodesSwitch/i18n/index.ts +7 -0
  245. package/src/components/HideUnavailableNodesSwitch/i18n/ru.json +3 -0
  246. package/src/components/HoverPopup/HoverPopup.tsx +95 -19
  247. package/src/components/MemoryViewer/MemoryViewer.tsx +30 -17
  248. package/src/components/MemoryViewer/i18n/en.json +4 -3
  249. package/src/components/MemoryViewer/utils.ts +19 -12
  250. package/src/components/PDiskInfo/PDiskInfo.scss +15 -0
  251. package/src/components/PDiskInfo/PDiskInfo.tsx +51 -243
  252. package/src/components/PDiskInfo/PDiskLogSize.tsx +12 -8
  253. package/src/components/PDiskInfo/i18n/en.json +6 -3
  254. package/src/components/PDiskInfo/statuses.ts +16 -3
  255. package/src/components/PageMeta/PageMeta.tsx +0 -18
  256. package/src/components/Search/Search.tsx +5 -2
  257. package/src/components/StorageGroupInfo/StorageGroupInfo.tsx +8 -13
  258. package/src/components/VDisk/VDisk.tsx +3 -2
  259. package/src/components/VDiskInfo/VDiskInfo.scss +19 -3
  260. package/src/components/VDiskInfo/VDiskInfo.tsx +119 -341
  261. package/src/components/VDiskInfo/getVDiskDetails.tsx +24 -2
  262. package/src/components/VDiskInfo/i18n/en.json +4 -13
  263. package/src/components/VDiskPopup/VDiskPopup.tsx +16 -24
  264. package/src/components/VDiskPopup/i18n/en.json +0 -2
  265. package/src/components/VDiskStatus/VDiskReplicationStatus.tsx +1 -1
  266. package/src/components/VDiskStatus/VDiskStatus.scss +4 -0
  267. package/src/components/VDiskStatus/VDiskStatus.tsx +13 -2
  268. package/src/components/VDiskStatus/statuses.ts +2 -2
  269. package/src/components/nodesColumns/columns.tsx +26 -12
  270. package/src/containers/Clusters/Clusters.scss +24 -6
  271. package/src/containers/Clusters/Clusters.tsx +74 -5
  272. package/src/containers/Clusters/columns.tsx +36 -6
  273. package/src/containers/Clusters/i18n/en.json +6 -0
  274. package/src/containers/Header/Header.tsx +8 -0
  275. package/src/containers/Header/HeaderLeftControls.tsx +3 -1
  276. package/src/containers/Header/PDiskLeftControls.tsx +41 -0
  277. package/src/containers/Header/VDiskLeftControls.tsx +40 -0
  278. package/src/containers/Header/breadcrumbs.tsx +4 -2
  279. package/src/containers/Header/i18n/en.json +4 -1
  280. package/src/containers/Node/Node.scss +14 -2
  281. package/src/containers/Node/Node.tsx +6 -6
  282. package/src/containers/Nodes/NodesControls/NodesControls.tsx +3 -0
  283. package/src/containers/Nodes/NodesTable.tsx +4 -0
  284. package/src/containers/Nodes/PaginatedNodes/GroupedNodesComponent.tsx +8 -3
  285. package/src/containers/Nodes/PaginatedNodes/NodesComponent.tsx +12 -2
  286. package/src/containers/Nodes/getNodes.ts +2 -0
  287. package/src/containers/Nodes/useDebouncedSearch.ts +13 -0
  288. package/src/containers/PDiskPage/PDiskPage.scss +29 -11
  289. package/src/containers/PDiskPage/PDiskPage.tsx +69 -63
  290. package/src/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.tsx +3 -9
  291. package/src/containers/PDiskPage/PDiskStorageDetails.scss +51 -0
  292. package/src/containers/PDiskPage/PDiskStorageDetails.tsx +64 -0
  293. package/src/containers/PDiskPage/i18n/en.json +1 -0
  294. package/src/containers/Storage/PaginatedStorageNodes/GroupedStorageNodesComponent.tsx +3 -0
  295. package/src/containers/Storage/PaginatedStorageNodes/StorageNodesComponent.tsx +8 -1
  296. package/src/containers/Storage/PaginatedStorageNodes/StorageNodesControls.tsx +2 -0
  297. package/src/containers/Storage/PaginatedStorageNodesTable/PaginatedStorageNodesTable.tsx +4 -0
  298. package/src/containers/Storage/PaginatedStorageNodesTable/getNodes.ts +2 -0
  299. package/src/containers/Storage/Storage.scss +4 -0
  300. package/src/containers/StorageGroupPage/StorageGroupPage.scss +19 -4
  301. package/src/containers/StorageGroupPage/StorageGroupPage.tsx +25 -45
  302. package/src/containers/StorageGroupPage/i18n/en.json +0 -2
  303. package/src/containers/Tablet/Tablet.scss +15 -1
  304. package/src/containers/Tablet/Tablet.tsx +21 -15
  305. package/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.tsx +5 -32
  306. package/src/containers/Tenant/Healthcheck/Healthcheck.scss +6 -1
  307. package/src/containers/Tenant/Healthcheck/components/HealthcheckIssue.tsx +18 -8
  308. package/src/containers/Tenant/TenantDrawerHealthcheck.tsx +14 -1
  309. package/src/containers/VDiskPage/VDiskPage.scss +39 -7
  310. package/src/containers/VDiskPage/VDiskPage.tsx +84 -72
  311. package/src/containers/VDiskPage/VDiskStorageDetails.scss +24 -93
  312. package/src/containers/VDiskPage/VDiskStorageDetails.tsx +50 -158
  313. package/src/containers/VDiskPage/i18n/en.json +2 -14
  314. package/src/store/reducers/capabilities/hooks.ts +4 -0
  315. package/src/store/reducers/cluster/parseFields.ts +1 -0
  316. package/src/store/reducers/clusters/clusters.ts +1 -0
  317. package/src/store/reducers/clusters/selectors.ts +4 -0
  318. package/src/store/reducers/clusters/types.ts +3 -0
  319. package/src/store/reducers/nodes/types.ts +1 -0
  320. package/src/store/reducers/storage/prepareGroupsDisks.ts +2 -0
  321. package/src/store/reducers/storage/types.ts +1 -0
  322. package/src/store/reducers/storage/utils.ts +13 -3
  323. package/src/store/reducers/vdisk/types.ts +2 -1
  324. package/src/store/reducers/vdisk/utils.ts +4 -5
  325. package/src/types/api/capabilities.ts +1 -0
  326. package/src/types/api/meta.ts +1 -0
  327. package/src/types/api/nodes.ts +2 -0
  328. package/src/types/api/nodesList.ts +3 -0
  329. package/src/utils/hooks/useDatabaseHealthcheckAvailable.ts +9 -0
  330. package/src/utils/hooks/useHideUnavailableNodes.ts +33 -0
  331. package/src/utils/memory.ts +16 -0
  332. package/src/utils/nodes.ts +3 -2
  333. package/src/utils/storageMetrics.ts +11 -0
  334. package/dist/components/VDiskInfo/getVDiskCapacityColumns.d.ts +0 -11
  335. package/dist/components/VDiskInfo/getVDiskCapacityColumns.js +0 -52
  336. package/dist/components/VDiskInfo/getVDiskCapacityColumns.js.map +0 -1
  337. package/src/components/VDiskInfo/getVDiskCapacityColumns.tsx +0 -83
@@ -0,0 +1,51 @@
1
+ .ydb-pdisk-storage-details {
2
+ display: flex;
3
+ flex-wrap: wrap;
4
+ align-items: flex-start;
5
+ gap: var(--g-spacing-5);
6
+
7
+ width: fit-content;
8
+ max-width: 100%;
9
+ padding: var(--g-spacing-3) var(--g-spacing-5);
10
+
11
+ border-radius: var(--g-border-radius-m);
12
+ background-color: var(--g-color-base-generic);
13
+
14
+ &__detail {
15
+ --g-definition-list-item-gap: 0px;
16
+
17
+ min-width: 0;
18
+ max-width: 200px;
19
+
20
+ &_location {
21
+ min-width: 100px;
22
+ }
23
+
24
+ .g-definition-list__definition {
25
+ min-width: 0;
26
+ max-width: 100%;
27
+ }
28
+ }
29
+
30
+ &__value-popover {
31
+ flex: 0 1 auto;
32
+
33
+ min-width: 0;
34
+ max-width: 100%;
35
+ }
36
+
37
+ &__value-popover-content {
38
+ width: auto;
39
+ min-width: 0;
40
+ max-width: 100%;
41
+
42
+ &_with-left-trim {
43
+ text-align: end;
44
+ direction: rtl;
45
+
46
+ > span {
47
+ unicode-bidi: plaintext;
48
+ }
49
+ }
50
+ }
51
+ }
@@ -0,0 +1,64 @@
1
+ import {DefinitionList} from '@gravity-ui/uikit';
2
+
3
+ import {CellWithPopover} from '../../components/CellWithPopover/CellWithPopover';
4
+ import {CopyableValue} from '../../components/CopyableValue/CopyableValue';
5
+ import type {PDiskData} from '../../store/reducers/pdisk/types';
6
+ import {cn} from '../../utils/cn';
7
+ import {getDiskLocationItems} from '../../utils/disks/diskInfo/getDiskLocationItems';
8
+
9
+ import './PDiskStorageDetails.scss';
10
+
11
+ const b = cn('ydb-pdisk-storage-details');
12
+ const LOCATION_IDS = ['datacenter', 'rack', 'fqdn', 'pdisk-path'];
13
+ const FIELD_ORDER = [...LOCATION_IDS, 'node-id', 'pdisk-id'];
14
+
15
+ export function PDiskStorageDetails({
16
+ data = {},
17
+ className,
18
+ }: {
19
+ data?: PDiskData;
20
+ className?: string;
21
+ }) {
22
+ const items = getDiskLocationItems(data, {
23
+ Host: data.NodeHost,
24
+ Rack: data.NodeRack,
25
+ DC: data.NodeDC,
26
+ });
27
+
28
+ return (
29
+ <div className={b(null, className)} data-qa="pdisk-location">
30
+ {FIELD_ORDER.map((id) => {
31
+ const item = items.find((entry) => entry.id === id);
32
+ if (!item) {
33
+ return null;
34
+ }
35
+ const copyText = item.copyText === undefined ? undefined : String(item.copyText);
36
+ return (
37
+ <DefinitionList
38
+ key={id}
39
+ direction="vertical"
40
+ className={b('detail', {location: LOCATION_IDS.includes(id)})}
41
+ qa={`pdisk-location-${id}`}
42
+ >
43
+ <DefinitionList.Item name={item.name}>
44
+ <CopyableValue copyText={copyText} fieldName={item.name}>
45
+ <CellWithPopover
46
+ content={copyText}
47
+ disabled={!copyText}
48
+ placement={['top', 'bottom']}
49
+ fullWidth
50
+ wrapperClassName={b('value-popover')}
51
+ className={b('value-popover-content', {
52
+ 'with-left-trim': id === 'pdisk-path',
53
+ })}
54
+ >
55
+ <span tabIndex={copyText ? 0 : undefined}>{item.content}</span>
56
+ </CellWithPopover>
57
+ </CopyableValue>
58
+ </DefinitionList.Item>
59
+ </DefinitionList>
60
+ );
61
+ })}
62
+ </div>
63
+ );
64
+ }
@@ -2,6 +2,7 @@
2
2
  "fqdn": "FQDN",
3
3
  "pdisk": "PDisk",
4
4
  "node": "Node",
5
+ "action_open-in-developer-ui": "Open in Developer UI",
5
6
 
6
7
  "storage": "Storage",
7
8
  "space-distribution": "Space distribution",
@@ -7,6 +7,7 @@ import {NODES_COLUMNS_TO_DATA_FIELDS} from '../../../components/nodesColumns/con
7
7
  import {storageApi} from '../../../store/reducers/storage/storage';
8
8
  import type {NodesGroupByField, NodesRequiredField} from '../../../types/api/nodes';
9
9
  import {useAutoRefreshInterval} from '../../../utils/hooks';
10
+ import {useHideUnavailableNodes} from '../../../utils/hooks/useHideUnavailableNodes';
10
11
  import {NodesUptimeFilterValues} from '../../../utils/nodes';
11
12
  import {renderPaginatedTableErrorMessage} from '../../../utils/renderPaginatedTableErrorMessage';
12
13
  import {getRequiredDataFields} from '../../../utils/tableUtils/getRequiredDataFields';
@@ -105,6 +106,7 @@ export function GroupedStorageNodesComponent({
105
106
  scrollContainerRef,
106
107
  }: PaginatedStorageProps) {
107
108
  const [autoRefreshInterval] = useAutoRefreshInterval();
109
+ const {hideUnavailable} = useHideUnavailableNodes();
108
110
 
109
111
  const {nodesSearchValue, storageNodesGroupByParam, handleShowAllNodes} =
110
112
  useStorageQueryParams();
@@ -131,6 +133,7 @@ export function GroupedStorageNodesComponent({
131
133
  const {currentData, isFetching, error} = storageApi.useGetStorageNodesInfoQuery(
132
134
  {
133
135
  database,
136
+ alive: hideUnavailable || undefined,
134
137
  with: 'all',
135
138
  filter: nodesSearchValue.trim(),
136
139
  node_id: nodeId,
@@ -1,6 +1,7 @@
1
1
  import {PaginatedTableWithLayout} from '../../../components/PaginatedTable/PaginatedTableWithLayout';
2
2
  import {TableColumnSetup} from '../../../components/TableColumnSetup/TableColumnSetup';
3
3
  import {useViewerNodesHandlerHasGrouping} from '../../../store/reducers/capabilities/hooks';
4
+ import {useHideUnavailableNodes} from '../../../utils/hooks/useHideUnavailableNodes';
4
5
  import {renderPaginatedTableErrorMessage} from '../../../utils/renderPaginatedTableErrorMessage';
5
6
  import type {PaginatedStorageProps} from '../PaginatedStorage';
6
7
  import {PaginatedStorageNodesTable} from '../PaginatedStorageNodesTable/PaginatedStorageNodesTable';
@@ -22,6 +23,7 @@ export function StorageNodesComponent({
22
23
  useStorageQueryParams();
23
24
 
24
25
  const viewerNodesHandlerHasGrouping = useViewerNodesHandlerHasGrouping();
26
+ const {hideUnavailable} = useHideUnavailableNodes();
25
27
 
26
28
  const expertMode = useIsStorageExpertMode();
27
29
  const {handleDataFetched, columnsSettings, rowHeight} = useStorageColumnsSettings({
@@ -69,7 +71,12 @@ export function StorageNodesComponent({
69
71
  }
70
72
  tableWrapperProps={{
71
73
  scrollContainerRef,
72
- scrollDependencies: [nodesSearchValue, visibleEntities, nodesUptimeFilter],
74
+ scrollDependencies: [
75
+ nodesSearchValue,
76
+ visibleEntities,
77
+ nodesUptimeFilter,
78
+ hideUnavailable,
79
+ ],
73
80
  }}
74
81
  />
75
82
  );
@@ -4,6 +4,7 @@ import {ChartTreemap} from '@gravity-ui/icons';
4
4
  import {Button, Flex, Icon, Select, Text} from '@gravity-ui/uikit';
5
5
 
6
6
  import {EntitiesCount} from '../../../components/EntitiesCount/EntitiesCount';
7
+ import {HideUnavailableNodesSwitch} from '../../../components/HideUnavailableNodesSwitch/HideUnavailableNodesSwitch';
7
8
  import {usePaginatedTableState} from '../../../components/PaginatedTable/PaginatedTableContext';
8
9
  import {Search} from '../../../components/Search/Search';
9
10
  import {UptimeFilter} from '../../../components/UptimeFIlter';
@@ -127,6 +128,7 @@ export function StorageNodesControls({
127
128
  {i18n('controls_expert-mode')}
128
129
  </Button>
129
130
  ) : null}
131
+ <HideUnavailableNodesSwitch className={b('hide-unavailable')} />
130
132
  </Flex>
131
133
  {canUseStorageExpertMode && isStorageExpertMode ? (
132
134
  <StorageNodesExpertModePanel />
@@ -14,6 +14,7 @@ import {VISIBLE_ENTITIES} from '../../../store/reducers/storage/constants';
14
14
  import type {PreparedStorageNode, VisibleEntities} from '../../../store/reducers/storage/types';
15
15
  import type {NodesGroupByField} from '../../../types/api/nodes';
16
16
  import {cn} from '../../../utils/cn';
17
+ import {useHideUnavailableNodes} from '../../../utils/hooks/useHideUnavailableNodes';
17
18
  import {NodesUptimeFilterValues, isUnavailableNode} from '../../../utils/nodes';
18
19
  import {STORAGE_NODES_DEFAULT_ROW_HEIGHT} from '../PaginatedStorageNodes/nodeExpertModeLayout';
19
20
 
@@ -69,9 +70,11 @@ export const PaginatedStorageNodesTable = ({
69
70
  onDataFetched,
70
71
  }: PaginatedStorageNodesTableProps) => {
71
72
  const history = useHistory();
73
+ const {hideUnavailable} = useHideUnavailableNodes();
72
74
  const tableFilters = React.useMemo(() => {
73
75
  return {
74
76
  searchValue,
77
+ hideUnavailable,
75
78
  visibleEntities,
76
79
  nodesUptimeFilter,
77
80
  database,
@@ -81,6 +84,7 @@ export const PaginatedStorageNodesTable = ({
81
84
  filterGroupBy,
82
85
  };
83
86
  }, [
87
+ hideUnavailable,
84
88
  searchValue,
85
89
  visibleEntities,
86
90
  nodesUptimeFilter,
@@ -29,6 +29,7 @@ export const getStorageNodes: FetchData<
29
29
  } = params;
30
30
  const {
31
31
  searchValue,
32
+ hideUnavailable,
32
33
  nodesUptimeFilter,
33
34
  visibleEntities,
34
35
  database,
@@ -51,6 +52,7 @@ export const getStorageNodes: FetchData<
51
52
  offset,
52
53
  sort,
53
54
  filter: searchValue?.trim(),
55
+ alive: hideUnavailable || undefined,
54
56
  uptime: getUptimeParamValue(nodesUptimeFilter),
55
57
  with: visibleEntities,
56
58
  database,
@@ -1,6 +1,10 @@
1
1
  @use '../../styles/mixins.scss';
2
2
 
3
3
  .global-storage {
4
+ &__hide-unavailable {
5
+ margin-inline-start: var(--g-spacing-1);
6
+ }
7
+
4
8
  &__search {
5
9
  @include mixins.search();
6
10
  }
@@ -1,4 +1,8 @@
1
+ @use '../../styles/mixins.scss';
2
+
1
3
  .ydb-storage-group-page {
4
+ --sticky-tabs-height: 40px;
5
+ --data-table-start: var(--sticky-tabs-height);
2
6
  position: relative;
3
7
 
4
8
  overflow: auto;
@@ -15,19 +19,30 @@
15
19
  }
16
20
 
17
21
  &__summary {
18
- margin-top: var(--g-spacing-4);
19
22
  margin-bottom: var(--g-spacing-6);
20
23
  }
21
24
 
22
- &__meta {
25
+ &__title {
23
26
  margin-bottom: var(--g-spacing-4);
27
+ padding-right: 125px;
24
28
  }
25
29
 
26
- &__title {
27
- margin-bottom: var(--g-spacing-4);
30
+ &__title-content {
31
+ flex: 1;
32
+
33
+ min-width: 0;
28
34
  }
29
35
 
30
36
  &__storage-title {
37
+ z-index: 3;
38
+
39
+ display: flex;
40
+ align-items: center;
41
+
42
+ height: var(--sticky-tabs-height);
31
43
  margin: 0;
44
+ padding-right: 125px;
45
+
46
+ @include mixins.sticky-top();
32
47
  }
33
48
  }
@@ -1,13 +1,12 @@
1
1
  import React from 'react';
2
2
 
3
- import {ArrowLeft} from '@gravity-ui/icons';
4
- import {Button, ClipboardButton, Flex, Icon, Text} from '@gravity-ui/uikit';
3
+ import {Flex, Text} from '@gravity-ui/uikit';
5
4
  import {skipToken} from '@reduxjs/toolkit/query';
6
5
  import {Helmet} from 'react-helmet-async';
7
- import {useHistory} from 'react-router-dom';
8
6
  import {StringParam, useQueryParams} from 'use-query-params';
9
7
 
10
- import {AutoRefreshControl} from '../../components/AutoRefreshControl/AutoRefreshControl';
8
+ import {StickyAutoRefreshControl} from '../../components/AutoRefreshControl/StickyAutoRefreshControl';
9
+ import {CopyableValue} from '../../components/CopyableValue/CopyableValue';
11
10
  import {ResponseError} from '../../components/Errors/ResponseError';
12
11
  import {InfoViewerSkeleton} from '../../components/InfoViewerSkeleton/InfoViewerSkeleton';
13
12
  import {StorageGroupInfo} from '../../components/StorageGroupInfo/StorageGroupInfo';
@@ -31,7 +30,6 @@ const storageGroupPageCn = cn('ydb-storage-group-page');
31
30
 
32
31
  export function StorageGroupPage() {
33
32
  const dispatch = useTypedDispatch();
34
- const history = useHistory();
35
33
  const database = useDatabaseFromQuery();
36
34
  const containerRef = React.useRef<HTMLDivElement>(null);
37
35
 
@@ -72,50 +70,32 @@ export function StorageGroupPage() {
72
70
  );
73
71
  };
74
72
 
75
- const renderPageMeta = () => {
76
- if (!groupId) {
77
- return null;
78
- }
79
-
80
- const hasPreviousPage = history.length > 1;
81
-
73
+ const renderPageTitle = () => {
82
74
  return (
83
75
  <Flex
84
- className={storageGroupPageCn('meta')}
85
- alignItems="center"
86
- justifyContent={hasPreviousPage ? 'space-between' : 'flex-end'}
76
+ className={storageGroupPageCn('title')}
77
+ alignItems="flex-start"
87
78
  gap={2}
79
+ wrap="nowrap"
88
80
  >
89
- {hasPreviousPage && (
90
- <Button view="outlined" onClick={() => history.goBack()}>
91
- <Icon data={ArrowLeft} />
92
- {storageGroupPageKeyset('action_back')}
93
- </Button>
94
- )}
95
- <AutoRefreshControl />
96
- </Flex>
97
- );
98
- };
99
-
100
- const renderPageTitle = () => {
101
- return (
102
- <Flex className={storageGroupPageCn('title')} alignItems="center" gap={2} wrap="wrap">
103
- <Text variant="header-1">{storageGroupPageKeyset('storage-group')}</Text>
104
- <Flex alignItems="center" gap={1}>
105
- <Text variant="header-1" color="hint">
106
- {groupId || EMPTY_DATA_PLACEHOLDER}
107
- </Text>
108
- {groupId && (
109
- <ClipboardButton
110
- text={groupId}
111
- view="flat-secondary"
112
- size="s"
113
- aria-label={storageGroupPageKeyset('action_copy-group-id-from-title')}
114
- tooltipInitialText={storageGroupPageKeyset('action_copy-group-id')}
115
- />
116
- )}
81
+ <Flex
82
+ className={storageGroupPageCn('title-content')}
83
+ alignItems="center"
84
+ gap={2}
85
+ wrap="wrap"
86
+ >
87
+ <Text variant="header-1">{storageGroupPageKeyset('storage-group')}</Text>
88
+ <CopyableValue
89
+ copyText={groupId}
90
+ fieldName={storageGroupPageKeyset('storage-group')}
91
+ copyButtonLabel={storageGroupPageKeyset('action_copy-group-id-from-title')}
92
+ >
93
+ <Text variant="header-1" color="hint">
94
+ {groupId || EMPTY_DATA_PLACEHOLDER}
95
+ </Text>
96
+ </CopyableValue>
97
+ <StorageGroupStateLabel state={state} />
117
98
  </Flex>
118
- <StorageGroupStateLabel state={state} />
119
99
  </Flex>
120
100
  );
121
101
  };
@@ -158,8 +138,8 @@ export function StorageGroupPage() {
158
138
  return (
159
139
  <div className={storageGroupPageCn(null)} ref={containerRef}>
160
140
  {renderHelmet()}
141
+ {groupId ? <StickyAutoRefreshControl /> : null}
161
142
  <div className={storageGroupPageCn('summary')}>
162
- {renderPageMeta()}
163
143
  {renderPageTitle()}
164
144
  {renderError()}
165
145
  {renderInfo()}
@@ -1,7 +1,5 @@
1
1
  {
2
2
  "storage-group": "Storage Group",
3
3
  "storage": "Storage",
4
- "action_back": "Back",
5
- "action_copy-group-id": "Copy Storage Group ID",
6
4
  "action_copy-group-id-from-title": "Copy Storage Group ID from page title"
7
5
  }
@@ -2,10 +2,24 @@
2
2
 
3
3
  .ydb-tablet-page {
4
4
  $_: &;
5
+ position: relative;
6
+
7
+ overflow: auto;
8
+
5
9
  height: 100%;
6
- padding: 20px;
10
+ padding: 0 20px 20px;
7
11
  @include mixins.body-2-typography();
8
12
 
13
+ &__content {
14
+ // The sticky refresh wrapper already supplies the initial 20px page inset.
15
+ min-height: calc(100% - 20px);
16
+ }
17
+
18
+ &__meta {
19
+ min-height: 28px;
20
+ padding-right: 121px;
21
+ }
22
+
9
23
  &__placeholder {
10
24
  display: flex;
11
25
  flex: 1 1 auto;
@@ -7,12 +7,13 @@ import {useParams} from 'react-router-dom';
7
7
  import {useQueryParams} from 'use-query-params';
8
8
  import {z} from 'zod';
9
9
 
10
+ import {StickyAutoRefreshControl} from '../../components/AutoRefreshControl/StickyAutoRefreshControl';
10
11
  import {EmptyStateWrapper} from '../../components/EmptyState';
11
12
  import {EntityPageTitle} from '../../components/EntityPageTitle/EntityPageTitle';
12
13
  import {ResponseError} from '../../components/Errors/ResponseError';
13
14
  import {InternalLink} from '../../components/InternalLink';
14
15
  import {LoaderWrapper} from '../../components/LoaderWrapper/LoaderWrapper';
15
- import {PageMetaWithAutorefresh} from '../../components/PageMeta/PageMeta';
16
+ import {PageMeta} from '../../components/PageMeta/PageMeta';
16
17
  import {tabletPageQueryParams, useTabletPagePath} from '../../routes';
17
18
  import {useTabletDevUiSecurePath} from '../../store/reducers/capabilities/hooks';
18
19
  import {setHeaderBreadcrumbs} from '../../store/reducers/header/header';
@@ -106,25 +107,30 @@ export function Tablet() {
106
107
  }
107
108
 
108
109
  return (
109
- <Flex gap={5} direction="column" className={b()}>
110
+ <div className={b()}>
110
111
  <Helmet>
111
112
  <title>{`${id} — ${i18n('tablet.header')} — ${
112
113
  databaseFullPath || queryClusterName || CLUSTER_DEFAULT_TITLE
113
114
  }`}</title>
114
115
  </Helmet>
115
- <PageMetaWithAutorefresh items={metaItems} />
116
- <LoaderWrapper loading={loading} size="l">
117
- {error ? <ResponseError error={error} /> : null}
118
- {currentData ? (
119
- <TabletContent
120
- id={id}
121
- tablet={tablet}
122
- history={history}
123
- database={database || databaseFullPath}
124
- />
125
- ) : null}
126
- </LoaderWrapper>
127
- </Flex>
116
+ <StickyAutoRefreshControl />
117
+ <Flex gap={5} direction="column" className={b('content')}>
118
+ <Flex alignItems="center" className={b('meta')}>
119
+ <PageMeta items={metaItems} />
120
+ </Flex>
121
+ <LoaderWrapper loading={loading} size="l">
122
+ {error ? <ResponseError error={error} /> : null}
123
+ {currentData ? (
124
+ <TabletContent
125
+ id={id}
126
+ tablet={tablet}
127
+ history={history}
128
+ database={database || databaseFullPath}
129
+ />
130
+ ) : null}
131
+ </LoaderWrapper>
132
+ </Flex>
133
+ </div>
128
134
  );
129
135
  }
130
136
 
@@ -31,6 +31,7 @@ import {getInfoTabLinks} from '../../../../utils/additionalProps';
31
31
  import {TENANT_DEFAULT_TITLE} from '../../../../utils/constants';
32
32
  import {useAutoRefreshInterval, useTypedDispatch, useTypedSelector} from '../../../../utils/hooks';
33
33
  import {useClusterNameFromQuery} from '../../../../utils/hooks/useDatabaseFromQuery';
34
+ import {useDatabaseHealthcheckAvailable} from '../../../../utils/hooks/useDatabaseHealthcheckAvailable';
34
35
  import {useDatabasesV2} from '../../../../utils/hooks/useDatabasesV2';
35
36
  import {canShowTenantMonitoringTab} from '../../../../utils/monitoringVisibility';
36
37
  import {useTenantPage} from '../../TenantNavigation/useTenantNavigation';
@@ -64,18 +65,6 @@ function isTenantLoading(isFetching: boolean, tenant: TTenant | undefined, error
64
65
  return isFetching && tenant === undefined && !error;
65
66
  }
66
67
 
67
- function shouldSkipHealthcheck({
68
- isServerless,
69
- isV2NavigationEnabled,
70
- tenant,
71
- }: {
72
- isServerless: boolean;
73
- isV2NavigationEnabled: boolean;
74
- tenant?: TTenant;
75
- }) {
76
- return isServerless || isV2NavigationEnabled || tenant === undefined;
77
- }
78
-
79
68
  function getDatabaseStatus(overall?: EFlag, selfCheckResult?: SelfCheckResult) {
80
69
  const healthcheckStatus =
81
70
  selfCheckResult === undefined ? undefined : selfCheckResultToHcStatus[selfCheckResult];
@@ -128,20 +117,6 @@ function renderTenantError(error: unknown, defaultMessage: string) {
128
117
  return error ? <ResponseError error={error} defaultMessage={defaultMessage} /> : null;
129
118
  }
130
119
 
131
- function renderHealthcheckPreview({
132
- database,
133
- isServerless,
134
- isV2NavigationEnabled,
135
- }: {
136
- database: string;
137
- isServerless: boolean;
138
- isV2NavigationEnabled: boolean;
139
- }) {
140
- return !isServerless && !isV2NavigationEnabled ? (
141
- <HealthcheckPreview database={database} />
142
- ) : null;
143
- }
144
-
145
120
  function renderOverviewHead({
146
121
  databaseStatus,
147
122
  handleOpenMonitoring,
@@ -308,6 +283,8 @@ export function TenantOverview({
308
283
  const tenantLoading = isTenantLoading(isFetching, tenant, error);
309
284
  const {Name, Type, Overall, CoresTotal} = tenant || {};
310
285
  const isServerless = Type === 'Serverless';
286
+ const healthcheckAvailable = useDatabaseHealthcheckAvailable(Type);
287
+ const showHealthcheck = healthcheckAvailable && !isV2NavigationEnabled;
311
288
 
312
289
  // Use healthcheck self_check_result as the database status color when available;
313
290
  // fall back to tenantinfo.Overall (e.g. for Serverless databases where healthcheck is skipped).
@@ -317,7 +294,7 @@ export function TenantOverview({
317
294
  const {currentData: healthcheckData} = healthcheckApi.useGetHealthcheckInfoQuery(
318
295
  {database, clusterName},
319
296
  {
320
- skip: shouldSkipHealthcheck({isServerless, isV2NavigationEnabled, tenant}),
297
+ skip: !showHealthcheck || tenant === undefined,
321
298
  },
322
299
  );
323
300
  const databaseStatus = getDatabaseStatus(Overall, healthcheckData?.self_check_result);
@@ -404,11 +381,7 @@ export function TenantOverview({
404
381
  tenantType,
405
382
  })}
406
383
  <Flex direction="column" gap={4}>
407
- {renderHealthcheckPreview({
408
- database,
409
- isServerless,
410
- isV2NavigationEnabled,
411
- })}
384
+ {showHealthcheck && <HealthcheckPreview database={database} />}
412
385
  <QueriesActivityBar database={database} />
413
386
  <MetricsTabs
414
387
  metrics={metricOverview}
@@ -93,7 +93,12 @@
93
93
  }
94
94
  }
95
95
  &__issue-status {
96
- text-align: start;
96
+ display: flex;
97
+ flex-shrink: 0;
98
+ }
99
+ &__issue-title {
100
+ min-width: 0;
101
+ overflow-wrap: anywhere;
97
102
  }
98
103
  &__issue-content {
99
104
  --g-definition-list-item-gap: var(--g-spacing-3);
@@ -80,17 +80,26 @@ export function HealthcheckIssue({
80
80
  justifyContent="space-between"
81
81
  className={b('issue-summary')}
82
82
  >
83
- <Flex direction="column" gap={1} alignSelf="center">
84
- <Text variant="subheader-2">{issue.message}</Text>
85
-
83
+ <Flex
84
+ gap={2}
85
+ alignItems="center"
86
+ className={b('issue-message')}
87
+ >
86
88
  {issue.status && (
87
89
  <div className={b('issue-status')}>
88
90
  <EntityStatus.Label
91
+ view="compact"
89
92
  size="s"
90
93
  status={hcStatusToColorFlag[issue.status]}
91
94
  />
92
95
  </div>
93
96
  )}
97
+ <Text
98
+ variant="subheader-2"
99
+ className={b('issue-title')}
100
+ >
101
+ {issue.message}
102
+ </Text>
94
103
  </Flex>
95
104
  <Flex
96
105
  wrap="nowrap"
@@ -124,21 +133,22 @@ export function HealthcheckIssue({
124
133
  >
125
134
  <Flex
126
135
  id={id}
127
- direction="column"
128
- gap={1}
129
- alignSelf="center"
136
+ gap={2}
137
+ alignItems="center"
130
138
  className={b('issue-message')}
131
139
  >
132
- <Text variant="subheader-2">{issue.message}</Text>
133
-
134
140
  {issue.status && (
135
141
  <div className={b('issue-status')}>
136
142
  <EntityStatus.Label
143
+ view="compact"
137
144
  size="s"
138
145
  status={hcStatusToColorFlag[issue.status]}
139
146
  />
140
147
  </div>
141
148
  )}
149
+ <Text variant="subheader-2" className={b('issue-title')}>
150
+ {issue.message}
151
+ </Text>
142
152
  </Flex>
143
153
  <div
144
154
  className={b('issue-action')}