ydb-embedded-ui 22.3.0 → 22.5.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 (472) hide show
  1. package/dist/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.d.ts +3 -2
  2. package/dist/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.js +19 -4
  3. package/dist/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.js.map +1 -1
  4. package/dist/components/CopyableValue/CopyableValue.d.ts +10 -0
  5. package/dist/components/CopyableValue/CopyableValue.js +10 -0
  6. package/dist/components/CopyableValue/CopyableValue.js.map +1 -0
  7. package/dist/components/CopyableValue/CopyableValue.scss +16 -0
  8. package/dist/components/CopyableValue/i18n/en.json +3 -0
  9. package/dist/components/CopyableValue/i18n/index.d.ts +2 -0
  10. package/dist/components/CopyableValue/i18n/index.js +6 -0
  11. package/dist/components/CopyableValue/i18n/index.js.map +1 -0
  12. package/dist/components/CriticalActionDialog/CriticalActionDialog.d.ts +2 -1
  13. package/dist/components/CriticalActionDialog/CriticalActionDialog.js +2 -1
  14. package/dist/components/CriticalActionDialog/CriticalActionDialog.js.map +1 -1
  15. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.d.ts +8 -19
  16. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.js +68 -92
  17. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.js.map +1 -1
  18. package/dist/components/DiskCapacityInfo/i18n/en.json +0 -1
  19. package/dist/components/DiskCapacityInfo/i18n/index.d.ts +1 -1
  20. package/dist/components/DiskPopup/DiskPopup.d.ts +25 -0
  21. package/dist/components/DiskPopup/DiskPopup.js +44 -0
  22. package/dist/components/DiskPopup/DiskPopup.js.map +1 -0
  23. package/dist/components/DiskPopup/DiskPopup.scss +203 -0
  24. package/dist/components/DiskPopup/i18n/en.json +3 -0
  25. package/dist/components/DiskPopup/i18n/index.d.ts +2 -0
  26. package/dist/components/DiskPopup/i18n/index.js +4 -0
  27. package/dist/components/DiskPopup/i18n/index.js.map +1 -0
  28. package/dist/components/DiskStatus/DiskStatus.d.ts +31 -0
  29. package/dist/components/DiskStatus/DiskStatus.js +61 -0
  30. package/dist/components/DiskStatus/DiskStatus.js.map +1 -0
  31. package/dist/components/DiskStatus/DiskStatus.scss +59 -0
  32. package/dist/components/DiskStatus/i18n/en.json +6 -0
  33. package/dist/components/DiskStatus/i18n/index.d.ts +2 -0
  34. package/dist/components/DiskStatus/i18n/index.js +4 -0
  35. package/dist/components/DiskStatus/i18n/index.js.map +1 -0
  36. package/dist/components/EntityStatus/EntityStatus.d.ts +19 -6
  37. package/dist/components/EntityStatus/EntityStatus.js +6 -2
  38. package/dist/components/EntityStatus/EntityStatus.js.map +1 -1
  39. package/dist/components/EntityStatus/EntityStatus.scss +5 -0
  40. package/dist/components/EvictVDiskButton/EvictVDiskButton.d.ts +5 -2
  41. package/dist/components/EvictVDiskButton/EvictVDiskButton.js +3 -2
  42. package/dist/components/EvictVDiskButton/EvictVDiskButton.js.map +1 -1
  43. package/dist/components/EvictVDiskButton/i18n/en.json +2 -2
  44. package/dist/components/FullNodeViewer/FullNodeViewer.js +4 -7
  45. package/dist/components/FullNodeViewer/FullNodeViewer.js.map +1 -1
  46. package/dist/components/FullNodeViewer/i18n/index.d.ts +1 -1
  47. package/dist/components/HoverPopup/HoverPopup.d.ts +3 -1
  48. package/dist/components/HoverPopup/HoverPopup.js +131 -28
  49. package/dist/components/HoverPopup/HoverPopup.js.map +1 -1
  50. package/dist/components/HoverPopup/usePopupPriority.d.ts +4 -0
  51. package/dist/components/HoverPopup/usePopupPriority.js +30 -0
  52. package/dist/components/HoverPopup/usePopupPriority.js.map +1 -0
  53. package/dist/components/MemoryViewer/MemoryViewer.d.ts +3 -1
  54. package/dist/components/MemoryViewer/MemoryViewer.js +25 -16
  55. package/dist/components/MemoryViewer/MemoryViewer.js.map +1 -1
  56. package/dist/components/MemoryViewer/i18n/en.json +4 -3
  57. package/dist/components/MemoryViewer/i18n/index.d.ts +1 -1
  58. package/dist/components/MemoryViewer/utils.d.ts +4 -2
  59. package/dist/components/MemoryViewer/utils.js +11 -11
  60. package/dist/components/MemoryViewer/utils.js.map +1 -1
  61. package/dist/components/PDiskInfo/PDiskInfo.d.ts +4 -9
  62. package/dist/components/PDiskInfo/PDiskInfo.js +32 -144
  63. package/dist/components/PDiskInfo/PDiskInfo.js.map +1 -1
  64. package/dist/components/PDiskInfo/PDiskInfo.scss +15 -0
  65. package/dist/components/PDiskInfo/PDiskLogSize.d.ts +5 -0
  66. package/dist/components/PDiskInfo/PDiskLogSize.js +20 -0
  67. package/dist/components/PDiskInfo/PDiskLogSize.js.map +1 -0
  68. package/dist/components/PDiskInfo/PDiskLogSize.scss +12 -0
  69. package/dist/components/PDiskInfo/getPDiskDetails.d.ts +4 -0
  70. package/dist/components/PDiskInfo/getPDiskDetails.js +33 -0
  71. package/dist/components/PDiskInfo/getPDiskDetails.js.map +1 -0
  72. package/dist/components/PDiskInfo/i18n/en.json +69 -4
  73. package/dist/components/PDiskInfo/i18n/index.d.ts +1 -1
  74. package/dist/components/PDiskInfo/statuses.d.ts +7 -0
  75. package/dist/components/PDiskInfo/statuses.js +194 -0
  76. package/dist/components/PDiskInfo/statuses.js.map +1 -0
  77. package/dist/components/PDiskPopup/PDiskPopup.d.ts +4 -7
  78. package/dist/components/PDiskPopup/PDiskPopup.js +28 -99
  79. package/dist/components/PDiskPopup/PDiskPopup.js.map +1 -1
  80. package/dist/components/PDiskPopup/i18n/en.json +2 -12
  81. package/dist/components/PDiskPopup/i18n/index.d.ts +1 -1
  82. package/dist/components/Search/Search.js +3 -1
  83. package/dist/components/Search/Search.js.map +1 -1
  84. package/dist/components/StorageGroupInfo/StorageGroupInfo.d.ts +3 -3
  85. package/dist/components/StorageGroupInfo/StorageGroupInfo.js +73 -218
  86. package/dist/components/StorageGroupInfo/StorageGroupInfo.js.map +1 -1
  87. package/dist/components/StorageGroupInfo/StorageGroupInfo.scss +21 -0
  88. package/dist/components/StorageGroupInfo/i18n/en.json +1 -9
  89. package/dist/components/StorageGroupInfo/i18n/index.d.ts +1 -1
  90. package/dist/components/TenantNameWrapper/i18n/index.d.ts +1 -1
  91. package/dist/components/VDisk/VDisk.d.ts +2 -1
  92. package/dist/components/VDisk/VDisk.js +24 -33
  93. package/dist/components/VDisk/VDisk.js.map +1 -1
  94. package/dist/components/VDisk/VDiskWithDonorsStack.d.ts +1 -1
  95. package/dist/components/VDisk/VDiskWithDonorsStack.js +2 -1
  96. package/dist/components/VDisk/VDiskWithDonorsStack.js.map +1 -1
  97. package/dist/components/VDisk/getFlagStatusText.d.ts +2 -0
  98. package/dist/components/VDisk/getFlagStatusText.js +18 -0
  99. package/dist/components/VDisk/getFlagStatusText.js.map +1 -0
  100. package/dist/components/VDisk/i18n/en.json +1 -1
  101. package/dist/components/VDisk/i18n/index.d.ts +1 -1
  102. package/dist/components/VDiskInfo/VDiskInfo.d.ts +3 -7
  103. package/dist/components/VDiskInfo/VDiskInfo.js +57 -235
  104. package/dist/components/VDiskInfo/VDiskInfo.js.map +1 -1
  105. package/dist/components/VDiskInfo/VDiskInfo.scss +19 -3
  106. package/dist/components/VDiskInfo/getVDiskDetails.d.ts +11 -0
  107. package/dist/components/VDiskInfo/getVDiskDetails.js +42 -0
  108. package/dist/components/VDiskInfo/getVDiskDetails.js.map +1 -0
  109. package/dist/components/VDiskInfo/i18n/en.json +5 -12
  110. package/dist/components/VDiskInfo/i18n/index.d.ts +1 -1
  111. package/dist/components/VDiskPopup/VDiskPopup.d.ts +7 -8
  112. package/dist/components/VDiskPopup/VDiskPopup.js +91 -241
  113. package/dist/components/VDiskPopup/VDiskPopup.js.map +1 -1
  114. package/dist/components/VDiskPopup/VDiskPopup.scss +3 -10
  115. package/dist/components/VDiskPopup/i18n/en.json +4 -22
  116. package/dist/components/VDiskPopup/i18n/index.d.ts +1 -1
  117. package/dist/components/VDiskStatus/VDiskReplicationStatus.d.ts +8 -0
  118. package/dist/components/VDiskStatus/VDiskReplicationStatus.js +32 -0
  119. package/dist/components/VDiskStatus/VDiskReplicationStatus.js.map +1 -0
  120. package/dist/components/VDiskStatus/VDiskStatus.d.ts +16 -0
  121. package/dist/components/VDiskStatus/VDiskStatus.js +20 -0
  122. package/dist/components/VDiskStatus/VDiskStatus.js.map +1 -0
  123. package/dist/components/VDiskStatus/VDiskStatus.scss +36 -0
  124. package/dist/components/VDiskStatus/i18n/en.json +33 -0
  125. package/dist/components/VDiskStatus/i18n/index.d.ts +1 -0
  126. package/dist/components/VDiskStatus/i18n/index.js +5 -0
  127. package/dist/components/VDiskStatus/i18n/index.js.map +1 -0
  128. package/dist/components/VDiskStatus/index.d.ts +2 -0
  129. package/dist/components/VDiskStatus/index.js +3 -0
  130. package/dist/components/VDiskStatus/index.js.map +1 -0
  131. package/dist/components/VDiskStatus/statuses.d.ts +4 -0
  132. package/dist/components/VDiskStatus/statuses.js +120 -0
  133. package/dist/components/VDiskStatus/statuses.js.map +1 -0
  134. package/dist/components/capacityMetricsColumns/i18n/en.json +4 -4
  135. package/dist/components/nodesColumns/columns.d.ts +1 -0
  136. package/dist/components/nodesColumns/columns.js +13 -6
  137. package/dist/components/nodesColumns/columns.js.map +1 -1
  138. package/dist/containers/Cluster/ClusterDrawerHealthcheck.js +6 -1
  139. package/dist/containers/Cluster/ClusterDrawerHealthcheck.js.map +1 -1
  140. package/dist/containers/Clusters/ClusterDrawerHealthcheck.js +1 -1
  141. package/dist/containers/Clusters/ClusterDrawerHealthcheck.js.map +1 -1
  142. package/dist/containers/Clusters/Clusters.js +35 -6
  143. package/dist/containers/Clusters/Clusters.js.map +1 -1
  144. package/dist/containers/Clusters/Clusters.scss +24 -6
  145. package/dist/containers/Clusters/columns.js +9 -4
  146. package/dist/containers/Clusters/columns.js.map +1 -1
  147. package/dist/containers/Clusters/i18n/en.json +6 -0
  148. package/dist/containers/Clusters/i18n/index.d.ts +1 -1
  149. package/dist/containers/Header/Header.js +16 -2
  150. package/dist/containers/Header/Header.js.map +1 -1
  151. package/dist/containers/Header/HeaderLeftControls.js +3 -1
  152. package/dist/containers/Header/HeaderLeftControls.js.map +1 -1
  153. package/dist/containers/Header/PDiskLeftControls.d.ts +1 -0
  154. package/dist/containers/Header/PDiskLeftControls.js +24 -0
  155. package/dist/containers/Header/PDiskLeftControls.js.map +1 -0
  156. package/dist/containers/Header/StorageGroupLeftControls.d.ts +1 -0
  157. package/dist/containers/Header/StorageGroupLeftControls.js +23 -0
  158. package/dist/containers/Header/StorageGroupLeftControls.js.map +1 -0
  159. package/dist/containers/Header/VDiskLeftControls.d.ts +1 -0
  160. package/dist/containers/Header/VDiskLeftControls.js +23 -0
  161. package/dist/containers/Header/VDiskLeftControls.js.map +1 -0
  162. package/dist/containers/Header/breadcrumbs.js +5 -2
  163. package/dist/containers/Header/breadcrumbs.js.map +1 -1
  164. package/dist/containers/Header/i18n/en.json +6 -1
  165. package/dist/containers/Header/i18n/index.d.ts +1 -1
  166. package/dist/containers/Nodes/NodesControls/NodesControls.js +1 -1
  167. package/dist/containers/Nodes/NodesControls/NodesControls.js.map +1 -1
  168. package/dist/containers/Nodes/PaginatedNodes/GroupedNodesComponent.js +5 -3
  169. package/dist/containers/Nodes/PaginatedNodes/GroupedNodesComponent.js.map +1 -1
  170. package/dist/containers/Nodes/PaginatedNodes/NodesComponent.js +4 -2
  171. package/dist/containers/Nodes/PaginatedNodes/NodesComponent.js.map +1 -1
  172. package/dist/containers/Nodes/useDebouncedSearch.d.ts +2 -0
  173. package/dist/containers/Nodes/useDebouncedSearch.js +11 -0
  174. package/dist/containers/Nodes/useDebouncedSearch.js.map +1 -0
  175. package/dist/containers/Operations/constants.d.ts +1 -1
  176. package/dist/containers/PDiskPage/PDiskPage.js +30 -31
  177. package/dist/containers/PDiskPage/PDiskPage.js.map +1 -1
  178. package/dist/containers/PDiskPage/PDiskPage.scss +22 -11
  179. package/dist/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.js +7 -7
  180. package/dist/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.js.map +1 -1
  181. package/dist/containers/PDiskPage/PDiskStorageDetails.d.ts +6 -0
  182. package/dist/containers/PDiskPage/PDiskStorageDetails.js +28 -0
  183. package/dist/containers/PDiskPage/PDiskStorageDetails.js.map +1 -0
  184. package/dist/containers/PDiskPage/PDiskStorageDetails.scss +51 -0
  185. package/dist/containers/PDiskPage/i18n/en.json +2 -0
  186. package/dist/containers/PDiskPage/i18n/index.d.ts +1 -1
  187. package/dist/containers/Storage/Disks/Disks.js +36 -9
  188. package/dist/containers/Storage/Disks/Disks.js.map +1 -1
  189. package/dist/containers/Storage/PDisk/PDisk.d.ts +2 -1
  190. package/dist/containers/Storage/PDisk/PDisk.js +2 -2
  191. package/dist/containers/Storage/PDisk/PDisk.js.map +1 -1
  192. package/dist/containers/Storage/PDisk/i18n/index.d.ts +1 -1
  193. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/columns.js +7 -2
  194. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/columns.js.map +1 -1
  195. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/i18n/index.d.ts +1 -1
  196. package/dist/containers/Storage/StorageExpertModePanel/components/SpaceLegend.scss +14 -82
  197. package/dist/containers/Storage/StorageExpertModePanel/constants.d.ts +1 -1
  198. package/dist/containers/Storage/StorageExpertModePanel/i18n/index.d.ts +1 -1
  199. package/dist/containers/Storage/StorageGroupStateLabel.d.ts +4 -0
  200. package/dist/containers/Storage/StorageGroupStateLabel.js +9 -0
  201. package/dist/containers/Storage/StorageGroupStateLabel.js.map +1 -0
  202. package/dist/containers/Storage/useStorageQueryParams.d.ts +4 -4
  203. package/dist/containers/Storage/utils/getStorageGroupStateLabel.d.ts +2 -0
  204. package/dist/containers/Storage/utils/getStorageGroupStateLabel.js +35 -0
  205. package/dist/containers/Storage/utils/getStorageGroupStateLabel.js.map +1 -0
  206. package/dist/containers/StorageGroupPage/StorageGroupPage.js +20 -13
  207. package/dist/containers/StorageGroupPage/StorageGroupPage.js.map +1 -1
  208. package/dist/containers/StorageGroupPage/StorageGroupPage.scss +18 -12
  209. package/dist/containers/StorageGroupPage/i18n/en.json +2 -1
  210. package/dist/containers/StorageGroupPage/i18n/index.d.ts +1 -1
  211. package/dist/containers/Tenant/Diagnostics/Overview/Overview.d.ts +2 -1
  212. package/dist/containers/Tenant/Diagnostics/Overview/Overview.js +4 -1
  213. package/dist/containers/Tenant/Diagnostics/Overview/Overview.js.map +1 -1
  214. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.d.ts +2 -1
  215. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.js +11 -2
  216. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.js.map +1 -1
  217. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.d.ts +2 -1
  218. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.js +9 -8
  219. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.js.map +1 -1
  220. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.d.ts +16 -1
  221. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.js +56 -19
  222. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.js.map +1 -1
  223. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/en.json +5 -1
  224. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/index.d.ts +1 -1
  225. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/ManagePartitioningDialog/i18n/index.d.ts +1 -1
  226. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.js +5 -12
  227. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.js.map +1 -1
  228. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/i18n/index.d.ts +1 -1
  229. package/dist/containers/Tenant/Diagnostics/TopQueries/columns/i18n/index.d.ts +1 -1
  230. package/dist/containers/Tenant/Healthcheck/Healthcheck.scss +6 -1
  231. package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.d.ts +3 -1
  232. package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.js +3 -3
  233. package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.js.map +1 -1
  234. package/dist/containers/Tenant/Healthcheck/components/HealthcheckIssue.js +2 -2
  235. package/dist/containers/Tenant/Healthcheck/components/HealthcheckIssue.js.map +1 -1
  236. package/dist/containers/Tenant/TenantDrawerHealthcheck.js +17 -2
  237. package/dist/containers/Tenant/TenantDrawerHealthcheck.js.map +1 -1
  238. package/dist/containers/Tenants/DatabaseDrawerHealthcheck.js +8 -1
  239. package/dist/containers/Tenants/DatabaseDrawerHealthcheck.js.map +1 -1
  240. package/dist/containers/VDiskPage/VDiskPage.js +33 -33
  241. package/dist/containers/VDiskPage/VDiskPage.js.map +1 -1
  242. package/dist/containers/VDiskPage/VDiskPage.scss +21 -8
  243. package/dist/containers/VDiskPage/VDiskStorageDetails.js +27 -29
  244. package/dist/containers/VDiskPage/VDiskStorageDetails.js.map +1 -1
  245. package/dist/containers/VDiskPage/VDiskStorageDetails.scss +24 -93
  246. package/dist/containers/VDiskPage/i18n/en.json +3 -12
  247. package/dist/containers/VDiskPage/i18n/index.d.ts +1 -1
  248. package/dist/lib.d.ts +1 -1
  249. package/dist/lib.js.map +1 -1
  250. package/dist/store/configureStore.d.ts +2 -2
  251. package/dist/store/defaultStore.d.ts +1 -1
  252. package/dist/store/reducers/cluster/parseFields.js +1 -0
  253. package/dist/store/reducers/cluster/parseFields.js.map +1 -1
  254. package/dist/store/reducers/clusters/clusters.js +1 -0
  255. package/dist/store/reducers/clusters/clusters.js.map +1 -1
  256. package/dist/store/reducers/clusters/selectors.d.ts +1 -0
  257. package/dist/store/reducers/clusters/selectors.js +4 -1
  258. package/dist/store/reducers/clusters/selectors.js.map +1 -1
  259. package/dist/store/reducers/clusters/types.d.ts +2 -0
  260. package/dist/store/reducers/header/types.d.ts +1 -1
  261. package/dist/store/reducers/index.d.ts +2 -2
  262. package/dist/store/reducers/pdisk/types.d.ts +1 -0
  263. package/dist/store/reducers/pdisk/utils.js +6 -1
  264. package/dist/store/reducers/pdisk/utils.js.map +1 -1
  265. package/dist/store/reducers/storage/prepareGroupsDisks.d.ts +2 -1
  266. package/dist/store/reducers/storage/prepareGroupsDisks.js +9 -19
  267. package/dist/store/reducers/storage/prepareGroupsDisks.js.map +1 -1
  268. package/dist/store/reducers/storage/utils.js +14 -3
  269. package/dist/store/reducers/storage/utils.js.map +1 -1
  270. package/dist/store/reducers/streamingQuery/streamingQuery.js +2 -4
  271. package/dist/store/reducers/streamingQuery/streamingQuery.js.map +1 -1
  272. package/dist/store/reducers/vdisk/types.d.ts +1 -1
  273. package/dist/store/reducers/vdisk/utils.js +5 -5
  274. package/dist/store/reducers/vdisk/utils.js.map +1 -1
  275. package/dist/styles/mixins.scss +22 -0
  276. package/dist/types/api/meta.d.ts +1 -0
  277. package/dist/types/api/nodesList.d.ts +2 -0
  278. package/dist/types/api/pdisk.d.ts +4 -0
  279. package/dist/types/api/pdisk.js.map +1 -1
  280. package/dist/types/api/vdisk.d.ts +8 -0
  281. package/dist/types/api/vdisk.js +7 -0
  282. package/dist/types/api/vdisk.js.map +1 -1
  283. package/dist/types/store/nodesList.d.ts +4 -2
  284. package/dist/uiFactory/types.d.ts +5 -2
  285. package/dist/utils/bytesParsers/formatBytes.d.ts +3 -1
  286. package/dist/utils/bytesParsers/formatBytes.js +12 -3
  287. package/dist/utils/bytesParsers/formatBytes.js.map +1 -1
  288. package/dist/utils/disks/constants.d.ts +1 -0
  289. package/dist/utils/disks/constants.js +4 -0
  290. package/dist/utils/disks/constants.js.map +1 -1
  291. package/dist/utils/disks/diskInfo/getDiskLocationItems.d.ts +16 -0
  292. package/dist/utils/disks/diskInfo/getDiskLocationItems.js +30 -0
  293. package/dist/utils/disks/diskInfo/getDiskLocationItems.js.map +1 -0
  294. package/dist/utils/disks/diskInfo/i18n/en.json +9 -0
  295. package/dist/utils/disks/diskInfo/i18n/index.d.ts +2 -0
  296. package/dist/utils/disks/diskInfo/i18n/index.js +4 -0
  297. package/dist/utils/disks/diskInfo/i18n/index.js.map +1 -0
  298. package/dist/utils/disks/iconCalculators.d.ts +5 -0
  299. package/dist/utils/disks/iconCalculators.js +1 -1
  300. package/dist/utils/disks/iconCalculators.js.map +1 -1
  301. package/dist/utils/disks/prepareDisks.d.ts +6 -2
  302. package/dist/utils/disks/prepareDisks.js +22 -35
  303. package/dist/utils/disks/prepareDisks.js.map +1 -1
  304. package/dist/utils/disks/types.d.ts +9 -2
  305. package/dist/utils/hooks/useDatabaseHealthcheckAvailable.d.ts +2 -0
  306. package/dist/utils/hooks/useDatabaseHealthcheckAvailable.js +6 -0
  307. package/dist/utils/hooks/useDatabaseHealthcheckAvailable.js.map +1 -0
  308. package/dist/utils/hooks/useNodeMetadata.d.ts +2 -0
  309. package/dist/utils/hooks/useNodeMetadata.js +15 -0
  310. package/dist/utils/hooks/useNodeMetadata.js.map +1 -0
  311. package/dist/utils/memory.d.ts +5 -0
  312. package/dist/utils/memory.js +9 -0
  313. package/dist/utils/memory.js.map +1 -0
  314. package/dist/utils/nodes.js +6 -2
  315. package/dist/utils/nodes.js.map +1 -1
  316. package/dist/utils/storageMetrics.d.ts +3 -2
  317. package/dist/utils/storageMetrics.js +30 -10
  318. package/dist/utils/storageMetrics.js.map +1 -1
  319. package/dist/utils/timeParsers/formatDuration.d.ts +4 -1
  320. package/dist/utils/timeParsers/formatDuration.js +16 -1
  321. package/dist/utils/timeParsers/formatDuration.js.map +1 -1
  322. package/dist/utils/timeParsers/i18n/en.json +5 -1
  323. package/dist/utils/timeParsers/i18n/index.d.ts +1 -1
  324. package/dist/utils/timeParsers/i18n/ru.json +5 -1
  325. package/package.json +2 -2
  326. package/src/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.tsx +22 -3
  327. package/src/components/CopyableValue/CopyableValue.scss +16 -0
  328. package/src/components/CopyableValue/CopyableValue.tsx +40 -0
  329. package/src/components/CopyableValue/i18n/en.json +3 -0
  330. package/src/components/CopyableValue/i18n/index.ts +8 -0
  331. package/src/components/CriticalActionDialog/CriticalActionDialog.tsx +3 -0
  332. package/src/components/DiskCapacityInfo/DiskCapacityInfo.tsx +75 -129
  333. package/src/components/DiskCapacityInfo/i18n/en.json +0 -1
  334. package/src/components/DiskPopup/DiskPopup.scss +203 -0
  335. package/src/components/DiskPopup/DiskPopup.tsx +123 -0
  336. package/src/components/DiskPopup/i18n/en.json +3 -0
  337. package/src/components/DiskPopup/i18n/index.ts +5 -0
  338. package/src/components/DiskStatus/DiskStatus.scss +59 -0
  339. package/src/components/DiskStatus/DiskStatus.tsx +149 -0
  340. package/src/components/DiskStatus/i18n/en.json +6 -0
  341. package/src/components/DiskStatus/i18n/index.ts +5 -0
  342. package/src/components/EntityStatus/EntityStatus.scss +5 -0
  343. package/src/components/EntityStatus/EntityStatus.tsx +39 -6
  344. package/src/components/EvictVDiskButton/EvictVDiskButton.tsx +10 -2
  345. package/src/components/EvictVDiskButton/i18n/en.json +2 -2
  346. package/src/components/FullNodeViewer/FullNodeViewer.tsx +4 -9
  347. package/src/components/HoverPopup/HoverPopup.tsx +157 -34
  348. package/src/components/HoverPopup/usePopupPriority.ts +39 -0
  349. package/src/components/MemoryViewer/MemoryViewer.tsx +30 -17
  350. package/src/components/MemoryViewer/i18n/en.json +4 -3
  351. package/src/components/MemoryViewer/utils.ts +19 -12
  352. package/src/components/PDiskInfo/PDiskInfo.scss +15 -0
  353. package/src/components/PDiskInfo/PDiskInfo.tsx +51 -243
  354. package/src/components/PDiskInfo/PDiskLogSize.scss +12 -0
  355. package/src/components/PDiskInfo/PDiskLogSize.tsx +41 -0
  356. package/src/components/PDiskInfo/getPDiskDetails.tsx +37 -0
  357. package/src/components/PDiskInfo/i18n/en.json +69 -10
  358. package/src/components/PDiskInfo/statuses.ts +222 -0
  359. package/src/components/PDiskPopup/PDiskPopup.tsx +62 -147
  360. package/src/components/PDiskPopup/i18n/en.json +2 -12
  361. package/src/components/Search/Search.tsx +5 -2
  362. package/src/components/StorageGroupInfo/StorageGroupInfo.scss +21 -0
  363. package/src/components/StorageGroupInfo/StorageGroupInfo.tsx +119 -263
  364. package/src/components/StorageGroupInfo/i18n/en.json +1 -9
  365. package/src/components/VDisk/VDisk.tsx +34 -36
  366. package/src/components/VDisk/VDiskWithDonorsStack.tsx +2 -0
  367. package/src/components/VDisk/getFlagStatusText.ts +19 -0
  368. package/src/components/VDisk/i18n/en.json +1 -1
  369. package/src/components/VDiskInfo/VDiskInfo.scss +19 -3
  370. package/src/components/VDiskInfo/VDiskInfo.tsx +119 -341
  371. package/src/components/VDiskInfo/getVDiskDetails.tsx +63 -0
  372. package/src/components/VDiskInfo/i18n/en.json +5 -21
  373. package/src/components/VDiskPopup/VDiskPopup.scss +3 -10
  374. package/src/components/VDiskPopup/VDiskPopup.tsx +192 -424
  375. package/src/components/VDiskPopup/i18n/en.json +4 -22
  376. package/src/components/VDiskStatus/VDiskReplicationStatus.tsx +77 -0
  377. package/src/components/VDiskStatus/VDiskStatus.scss +36 -0
  378. package/src/components/VDiskStatus/VDiskStatus.tsx +49 -0
  379. package/src/components/VDiskStatus/i18n/en.json +33 -0
  380. package/src/components/VDiskStatus/i18n/index.ts +7 -0
  381. package/src/components/VDiskStatus/index.ts +7 -0
  382. package/src/components/VDiskStatus/statuses.ts +139 -0
  383. package/src/components/capacityMetricsColumns/i18n/en.json +4 -4
  384. package/src/components/nodesColumns/columns.tsx +26 -12
  385. package/src/containers/Cluster/ClusterDrawerHealthcheck.tsx +6 -0
  386. package/src/containers/Clusters/ClusterDrawerHealthcheck.tsx +1 -0
  387. package/src/containers/Clusters/Clusters.scss +24 -6
  388. package/src/containers/Clusters/Clusters.tsx +74 -5
  389. package/src/containers/Clusters/columns.tsx +36 -6
  390. package/src/containers/Clusters/i18n/en.json +6 -0
  391. package/src/containers/Header/Header.tsx +19 -3
  392. package/src/containers/Header/HeaderLeftControls.tsx +3 -1
  393. package/src/containers/Header/PDiskLeftControls.tsx +41 -0
  394. package/src/containers/Header/StorageGroupLeftControls.tsx +38 -0
  395. package/src/containers/Header/VDiskLeftControls.tsx +40 -0
  396. package/src/containers/Header/breadcrumbs.tsx +4 -2
  397. package/src/containers/Header/i18n/en.json +6 -1
  398. package/src/containers/Nodes/NodesControls/NodesControls.tsx +1 -0
  399. package/src/containers/Nodes/PaginatedNodes/GroupedNodesComponent.tsx +5 -3
  400. package/src/containers/Nodes/PaginatedNodes/NodesComponent.tsx +4 -2
  401. package/src/containers/Nodes/useDebouncedSearch.ts +13 -0
  402. package/src/containers/PDiskPage/PDiskPage.scss +22 -11
  403. package/src/containers/PDiskPage/PDiskPage.tsx +88 -56
  404. package/src/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.tsx +16 -11
  405. package/src/containers/PDiskPage/PDiskStorageDetails.scss +51 -0
  406. package/src/containers/PDiskPage/PDiskStorageDetails.tsx +64 -0
  407. package/src/containers/PDiskPage/i18n/en.json +2 -0
  408. package/src/containers/Storage/Disks/Disks.tsx +66 -12
  409. package/src/containers/Storage/PDisk/PDisk.tsx +3 -0
  410. package/src/containers/Storage/PaginatedStorageGroupsTable/columns/columns.tsx +24 -3
  411. package/src/containers/Storage/StorageExpertModePanel/components/SpaceLegend.scss +14 -82
  412. package/src/containers/Storage/StorageGroupStateLabel.tsx +22 -0
  413. package/src/containers/Storage/utils/getStorageGroupStateLabel.ts +49 -0
  414. package/src/containers/StorageGroupPage/StorageGroupPage.scss +18 -12
  415. package/src/containers/StorageGroupPage/StorageGroupPage.tsx +63 -26
  416. package/src/containers/StorageGroupPage/i18n/en.json +2 -1
  417. package/src/containers/Tenant/Diagnostics/Overview/Overview.tsx +5 -1
  418. package/src/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.tsx +12 -1
  419. package/src/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.tsx +11 -10
  420. package/src/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.tsx +83 -20
  421. package/src/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/en.json +5 -1
  422. package/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.tsx +5 -32
  423. package/src/containers/Tenant/Healthcheck/Healthcheck.scss +6 -1
  424. package/src/containers/Tenant/Healthcheck/components/HealthcheckDrawer.tsx +5 -2
  425. package/src/containers/Tenant/Healthcheck/components/HealthcheckIssue.tsx +18 -8
  426. package/src/containers/Tenant/TenantDrawerHealthcheck.tsx +24 -1
  427. package/src/containers/Tenants/DatabaseDrawerHealthcheck.tsx +10 -0
  428. package/src/containers/VDiskPage/VDiskPage.scss +21 -8
  429. package/src/containers/VDiskPage/VDiskPage.tsx +103 -64
  430. package/src/containers/VDiskPage/VDiskStorageDetails.scss +24 -93
  431. package/src/containers/VDiskPage/VDiskStorageDetails.tsx +50 -158
  432. package/src/containers/VDiskPage/i18n/en.json +3 -14
  433. package/src/lib.ts +1 -0
  434. package/src/store/reducers/cluster/parseFields.ts +1 -0
  435. package/src/store/reducers/clusters/clusters.ts +1 -0
  436. package/src/store/reducers/clusters/selectors.ts +4 -0
  437. package/src/store/reducers/clusters/types.ts +3 -0
  438. package/src/store/reducers/header/types.ts +3 -1
  439. package/src/store/reducers/pdisk/types.ts +1 -0
  440. package/src/store/reducers/pdisk/utils.ts +6 -3
  441. package/src/store/reducers/storage/prepareGroupsDisks.ts +9 -22
  442. package/src/store/reducers/storage/utils.ts +17 -3
  443. package/src/store/reducers/streamingQuery/streamingQuery.ts +2 -4
  444. package/src/store/reducers/vdisk/types.ts +2 -1
  445. package/src/store/reducers/vdisk/utils.ts +4 -5
  446. package/src/styles/mixins.scss +22 -0
  447. package/src/types/api/meta.ts +1 -0
  448. package/src/types/api/nodesList.ts +3 -0
  449. package/src/types/api/pdisk.ts +4 -0
  450. package/src/types/api/vdisk.ts +9 -0
  451. package/src/types/store/nodesList.ts +7 -7
  452. package/src/uiFactory/types.ts +9 -2
  453. package/src/utils/bytesParsers/formatBytes.ts +23 -4
  454. package/src/utils/disks/constants.ts +5 -0
  455. package/src/utils/disks/diskInfo/getDiskLocationItems.ts +50 -0
  456. package/src/utils/disks/diskInfo/i18n/en.json +9 -0
  457. package/src/utils/disks/diskInfo/i18n/index.ts +5 -0
  458. package/src/utils/disks/iconCalculators.ts +1 -1
  459. package/src/utils/disks/prepareDisks.ts +21 -47
  460. package/src/utils/disks/types.ts +10 -2
  461. package/src/utils/hooks/useDatabaseHealthcheckAvailable.ts +9 -0
  462. package/src/utils/hooks/useNodeMetadata.ts +21 -0
  463. package/src/utils/memory.ts +16 -0
  464. package/src/utils/nodes.ts +7 -1
  465. package/src/utils/storageMetrics.ts +38 -14
  466. package/src/utils/timeParsers/formatDuration.ts +22 -1
  467. package/src/utils/timeParsers/i18n/en.json +5 -1
  468. package/src/utils/timeParsers/i18n/ru.json +5 -1
  469. package/dist/components/VDiskInfo/getVDiskCapacityColumns.d.ts +0 -11
  470. package/dist/components/VDiskInfo/getVDiskCapacityColumns.js +0 -52
  471. package/dist/components/VDiskInfo/getVDiskCapacityColumns.js.map +0 -1
  472. package/src/components/VDiskInfo/getVDiskCapacityColumns.tsx +0 -83
@@ -1,6 +1,5 @@
1
1
  import type {StorageGroupsResponse} from '../../../types/api/storage';
2
2
  import type {TEvSystemStateResponse} from '../../../types/api/systemState';
3
- import type {PreparedVDisk} from '../../../utils/disks/types';
4
3
  import {prepareNodeSystemState} from '../../../utils/nodes';
5
4
  import {prepareGroupsVDisk} from '../storage/prepareGroupsDisks';
6
5
 
@@ -20,14 +19,16 @@ export function prepareVDiskDataResponse(
20
19
 
21
20
  const preparedVDisk = prepareGroupsVDisk(rawVDisk);
22
21
 
23
- let currentVDisk: PreparedVDisk = {};
22
+ let currentVDisk: VDiskData = {};
24
23
 
25
24
  if (preparedVDisk.StringifiedId === vDiskId) {
26
25
  currentVDisk = preparedVDisk;
27
26
  } else {
28
27
  for (const donor of preparedVDisk.Donors ?? []) {
29
28
  if (donor.StringifiedId === vDiskId) {
30
- currentVDisk = donor;
29
+ // Keep the recipient's metrics without a back-reference to this donor.
30
+ const {Donors: _donors, ...recipient} = preparedVDisk;
31
+ currentVDisk = {...donor, Recipient: recipient};
31
32
  break;
32
33
  }
33
34
  }
@@ -40,7 +41,6 @@ export function prepareVDiskDataResponse(
40
41
 
41
42
  const NodeId = currentVDisk.NodeId ?? preparedPDisk?.NodeId ?? preparedNode.NodeId;
42
43
  const NodeHost = preparedNode.Host;
43
- const NodeType = preparedNode.Roles?.[0];
44
44
  const NodeDC = preparedNode.DC;
45
45
  const NodeRack = preparedNode.Rack;
46
46
 
@@ -52,7 +52,6 @@ export function prepareVDiskDataResponse(
52
52
 
53
53
  NodeId,
54
54
  NodeHost,
55
- NodeType,
56
55
  NodeDC,
57
56
  NodeRack,
58
57
 
@@ -9,6 +9,28 @@
9
9
  }
10
10
  }
11
11
 
12
+ @mixin capacity-alert-label-colors($color) {
13
+ background-color: var(--ydb-capacity-alert-label-background);
14
+
15
+ @if $color == 'green' {
16
+ --ydb-capacity-alert-label-background: var(--g-color-base-positive-light);
17
+
18
+ color: var(--g-color-text-positive-heavy);
19
+ } @else if $color == 'yellow' {
20
+ --ydb-capacity-alert-label-background: var(--g-color-base-warning-light);
21
+
22
+ color: var(--g-color-text-warning-heavy);
23
+ } @else if $color == 'red' {
24
+ --ydb-capacity-alert-label-background: var(--g-color-base-danger-light);
25
+
26
+ color: var(--g-color-base-danger-heavy);
27
+ } @else {
28
+ --ydb-capacity-alert-label-background: var(--ydb-space-#{$color}-bg);
29
+
30
+ color: var(--ydb-space-#{$color}-text);
31
+ }
32
+ }
33
+
12
34
  @mixin container() {
13
35
  max-width: 1170px;
14
36
  margin: 0 auto;
@@ -105,6 +105,7 @@ export interface MetaClusterTraceCheck {
105
105
  }
106
106
 
107
107
  export interface MetaClusterSettings {
108
+ unavailable?: boolean;
108
109
  use_meta_proxy?: boolean;
109
110
  auth_service?: string;
110
111
  cluster_domain?: string;
@@ -1,3 +1,5 @@
1
+ import type {TSystemStateInfo} from './nodes';
2
+
1
3
  /**
2
4
  * endpoint: /viewer/json/nodesList
3
5
  *
@@ -11,6 +13,7 @@ export interface TNodeInfo {
11
13
  ResolveHost?: string;
12
14
  Address?: string;
13
15
  Port?: number;
16
+ Location?: TSystemStateInfo['Location'];
14
17
  PhysicalLocation?: TNodeLocation;
15
18
  }
16
19
 
@@ -56,6 +56,10 @@ export interface TPDiskStateInfo {
56
56
  /** float; percent in the 0..100 scale. */
57
57
  PDiskUsage?: number;
58
58
  PDiskCapacityAlert?: ECapacityAlert | string;
59
+ /** Added by viewer from the BlobStorage controller system view. */
60
+ Status?: EDriveStatus;
61
+ DecommitStatus?: EDecommitStatus;
62
+ MaintenanceStatus?: EMaintenanceStatus;
59
63
  }
60
64
 
61
65
  export enum TPDiskState {
@@ -41,6 +41,8 @@ export interface TVDiskStateInfo {
41
41
  SatisfactionRank?: TVDiskSatisfactionRank;
42
42
  /** Is VDisk replicated? (i.e. contains all blobs it must have) */
43
43
  Replicated?: boolean;
44
+ /** Detailed Whiteboard replication status. May be absent on older nodes. */
45
+ DetailedReplicationStatus?: EVDiskDetailedReplicationStatus;
44
46
  /** Does this VDisk has any yet unreplicated phantom-like blobs? */
45
47
  UnreplicatedPhantoms?: boolean;
46
48
  /** The same for the non-phantom-like blobs. */
@@ -138,6 +140,13 @@ export enum EVDiskState {
138
140
  PDiskError = 'PDiskError',
139
141
  }
140
142
 
143
+ export enum EVDiskDetailedReplicationStatus {
144
+ Replicated = 'Replicated',
145
+ WaitingForToken = 'WaitingForToken',
146
+ InProgress = 'InProgress',
147
+ PhantomsOnly = 'PhantomsOnly',
148
+ }
149
+
141
150
  /**
142
151
  * BSC VDisk data
143
152
  *
@@ -1,7 +1,7 @@
1
- export type NodesMap = Map<
2
- number,
3
- {
4
- Host?: string;
5
- DC?: string;
6
- }
7
- >;
1
+ export interface NodeMetadata {
2
+ Host?: string;
3
+ DC?: string;
4
+ Rack?: string;
5
+ }
6
+
7
+ export type NodesMap = Map<number, NodeMetadata>;
@@ -7,7 +7,10 @@ import type {
7
7
  GetHealthcheckViewTitles,
8
8
  GetHealthcheckViewsOrder,
9
9
  } from '../containers/Tenant/Healthcheck/shared';
10
- import type {HealthcheckAssistantActionProps} from '../containers/Tenant/Healthcheck/types';
10
+ import type {
11
+ HealthcheckAssistantActionProps,
12
+ HealthcheckAssistantTarget,
13
+ } from '../containers/Tenant/Healthcheck/types';
11
14
  import type {ClusterInfo} from '../store/reducers/cluster/cluster';
12
15
  import type {PreparedStorageNode} from '../store/reducers/storage/types';
13
16
  import type {PreparedTenant} from '../store/reducers/tenants/types';
@@ -70,7 +73,7 @@ export interface UIFactory<H extends string = CommonIssueCategory, T extends str
70
73
  * Renders after the drawer header and before Healthcheck content.
71
74
  * Stays mounted while the drawer is open, independent of loading, error or issue state.
72
75
  */
73
- renderDrawerExtension?: () => React.ReactNode;
76
+ renderDrawerExtension?: (props: HealthcheckDrawerExtensionProps) => React.ReactNode;
74
77
  };
75
78
  hasAccess: HasAccess;
76
79
  hideGrantAccess?: boolean;
@@ -211,6 +214,10 @@ export type RenderNodeTooltipActions = (props: {data?: PreparedStorageNode}) =>
211
214
 
212
215
  export type RenderChatPanel = () => React.ReactNode;
213
216
 
217
+ export interface HealthcheckDrawerExtensionProps {
218
+ target?: HealthcheckAssistantTarget;
219
+ }
220
+
214
221
  export type RenderHealthcheckAssistantAction = (
215
222
  props: HealthcheckAssistantActionProps,
216
223
  ) => React.ReactNode;
@@ -1,6 +1,11 @@
1
1
  import {GIGABYTE, KILOBYTE, MEGABYTE, PETABYTE, TERABYTE, UNBREAKABLE_GAP} from '../constants';
2
2
  import type {FormatToSizeArgs, FormatValuesArgs} from '../dataFormatters/common';
3
- import {formatNumber, roundToPrecision} from '../dataFormatters/dataFormatters';
3
+ import {
4
+ formatNumber,
5
+ roundToDecimalPlaces,
6
+ roundToPrecision,
7
+ } from '../dataFormatters/dataFormatters';
8
+ import {configuredNumeral} from '../numeral';
4
9
  import {isNumeric} from '../utils';
5
10
 
6
11
  import i18n from './i18n';
@@ -57,8 +62,22 @@ export const getBytesSizeUnit = (value: number) => {
57
62
  return size;
58
63
  };
59
64
 
60
- const formatToSize = ({value, size = 'mb', precision = 0}: FormatToSizeArgs<BytesSizes>) => {
61
- const result = roundToPrecision(Number(value) / sizes[size].value, precision);
65
+ const formatToSize = ({
66
+ value,
67
+ size = 'mb',
68
+ precision = 0,
69
+ fixedDecimalPlaces,
70
+ }: FormatToSizeArgs<BytesSizes> & {fixedDecimalPlaces?: number}) => {
71
+ const convertedValue = Number(value) / sizes[size].value;
72
+ if (fixedDecimalPlaces !== undefined) {
73
+ const roundedValue = roundToDecimalPlaces(convertedValue, fixedDecimalPlaces);
74
+ const pattern =
75
+ roundedValue !== 0 && fixedDecimalPlaces > 0
76
+ ? `0,0.${'0'.repeat(fixedDecimalPlaces)}`
77
+ : '0,0';
78
+ return configuredNumeral(roundedValue).format(pattern);
79
+ }
80
+ const result = roundToPrecision(convertedValue, precision);
62
81
 
63
82
  return formatNumber(result);
64
83
  };
@@ -78,7 +97,7 @@ export const formatBytes = ({
78
97
  withSizeLabel = true,
79
98
  delimiter,
80
99
  ...params
81
- }: FormatValuesArgs<BytesSizes>) => {
100
+ }: FormatValuesArgs<BytesSizes> & {fixedDecimalPlaces?: number}) => {
82
101
  if (!isNumeric(value)) {
83
102
  return '';
84
103
  }
@@ -142,6 +142,7 @@ export const PDISK_STATE_SEVERITY = {
142
142
  export interface LabelVisualConfig {
143
143
  theme: LabelProps['theme'];
144
144
  icon?: IconData;
145
+ dangerHeavy?: boolean;
145
146
  }
146
147
 
147
148
  export const NUMERIC_SEVERITY_TO_LABEL_VIEW: Record<number, LabelVisualConfig> = {
@@ -157,6 +158,10 @@ export const NUMERIC_SEVERITY_TO_LABEL_VIEW: Record<number, LabelVisualConfig> =
157
158
  theme: 'danger',
158
159
  icon: CircleExclamation,
159
160
  },
161
+ [SOLID_RED_SEVERITY]: {
162
+ theme: 'danger',
163
+ dangerHeavy: true,
164
+ },
160
165
  [DISK_COLOR_STATE_TO_NUMERIC_SEVERITY.Blue]: {
161
166
  theme: 'info',
162
167
  icon: ArrowsRotateLeft,
@@ -0,0 +1,50 @@
1
+ import {isNil} from 'lodash';
2
+
3
+ import type {YDBDefinitionListItem} from '../../../components/YDBDefinitionList/YDBDefinitionList';
4
+ import type {NodeMetadata} from '../../../types/store/nodesList';
5
+ import {EMPTY_DATA_PLACEHOLDER} from '../../constants';
6
+
7
+ import i18n from './i18n';
8
+
9
+ export interface DiskDetailItem extends YDBDefinitionListItem {
10
+ /** Stable field identifier for ordering and grouping independently of translated names. */
11
+ id: string;
12
+ }
13
+
14
+ interface DiskLocationData {
15
+ NodeId?: number;
16
+ PDiskId?: number;
17
+ Path?: string;
18
+ VDiskSlotId?: number;
19
+ }
20
+
21
+ export function getDiskLocationItems(
22
+ data: DiskLocationData,
23
+ nodeData: NodeMetadata,
24
+ {withVDiskSlotId = false}: {withVDiskSlotId?: boolean} = {},
25
+ ): DiskDetailItem[] {
26
+ const entries = [
27
+ {id: 'fqdn', name: i18n('field_fqdn'), value: nodeData.Host},
28
+ {id: 'rack', name: i18n('field_rack'), value: nodeData.Rack},
29
+ {id: 'datacenter', name: i18n('field_datacenter'), value: nodeData.DC},
30
+ {id: 'pdisk-path', name: i18n('field_pdisk-path'), value: data.Path},
31
+ {id: 'node-id', name: i18n('field_node-id'), value: data.NodeId || undefined},
32
+ {id: 'pdisk-id', name: i18n('field_pdisk-id'), value: data.PDiskId},
33
+ ];
34
+ if (withVDiskSlotId) {
35
+ entries.push({
36
+ id: 'vdisk-slot-id',
37
+ name: i18n('field_vdisk-slot-id'),
38
+ value: data.VDiskSlotId,
39
+ });
40
+ }
41
+ return entries.map(({id, name, value}) => {
42
+ const missing = isNil(value) || value === '';
43
+ return {
44
+ id,
45
+ name,
46
+ content: missing ? EMPTY_DATA_PLACEHOLDER : value,
47
+ copyText: missing ? undefined : value,
48
+ };
49
+ });
50
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "field_fqdn": "FQDN",
3
+ "field_rack": "Rack",
4
+ "field_datacenter": "Datacenter",
5
+ "field_pdisk-path": "PDisk Path",
6
+ "field_node-id": "Node ID",
7
+ "field_pdisk-id": "PDisk ID",
8
+ "field_vdisk-slot-id": "VDisk Slot ID"
9
+ }
@@ -0,0 +1,5 @@
1
+ import {registerKeysets} from '../../../i18n';
2
+
3
+ import en from './en.json';
4
+
5
+ export default registerKeysets('ydb-disk-info', {en});
@@ -161,7 +161,7 @@ export function calculateFrontQueuesIcon(
161
161
  * Get icon and color for a single status flag.
162
162
  * Maps EFlag to the corresponding pair-legend icon and color.
163
163
  */
164
- function getFlagIconWithColor(flag: EFlag | undefined): IconWithColor | undefined {
164
+ export function getFlagIconWithColor(flag: EFlag | undefined): IconWithColor | undefined {
165
165
  if (!flag || flag === EFlag.Grey) {
166
166
  return {
167
167
  icon: CircleQuestionFill,
@@ -1,6 +1,6 @@
1
1
  import {isNil} from 'lodash';
2
2
 
3
- import type {TPDiskStateInfo} from '../../types/api/pdisk';
3
+ import type {TPDiskInfo, TPDiskStateInfo} from '../../types/api/pdisk';
4
4
  import type {TVDiskStateInfo, TVSlotId} from '../../types/api/vdisk';
5
5
  import {stringifyVdiskId} from '../dataFormatters/dataFormatters';
6
6
  import {isNumeric, parseOptionalNonNegativeNumber} from '../utils';
@@ -8,7 +8,7 @@ import {isNumeric, parseOptionalNonNegativeNumber} from '../utils';
8
8
  import {calculatePDiskSeverity} from './calculatePDiskSeverity';
9
9
  import {calculateVDiskSeverity} from './calculateVDiskSeverity';
10
10
  import {getPDiskType} from './getPDiskType';
11
- import {getPDiskId, isFullVDiskData} from './helpers';
11
+ import {getPDiskId, isFullVDiskData, makeVDiskLocationKey} from './helpers';
12
12
  import type {PreparedPDisk, PreparedVDisk} from './types';
13
13
 
14
14
  export function prepareWhiteboardVDiskData(
@@ -21,16 +21,7 @@ export function prepareWhiteboardVDiskData(
21
21
  if (!isFullVDiskData(vDiskState)) {
22
22
  const {NodeId, PDiskId, VSlotId, ...restVDiskFields} = vDiskState;
23
23
 
24
- const vDiskId =
25
- !isNil(VSlotId) && !isNil(PDiskId) && !isNil(NodeId)
26
- ? {
27
- NodeId,
28
- PDiskId,
29
- VSlotId,
30
- }
31
- : undefined;
32
-
33
- const StringifiedId = stringifyVdiskId(vDiskId);
24
+ const StringifiedId = makeVDiskLocationKey(NodeId, PDiskId, VSlotId) ?? '';
34
25
 
35
26
  return {
36
27
  ...restVDiskFields,
@@ -66,13 +57,7 @@ export function prepareWhiteboardVDiskData(
66
57
  AllocatedSize: AllocatedSize,
67
58
  SlotSize: PDisk?.EnforcedDynamicSlotSize,
68
59
  });
69
- const WhiteboardSize = hasWhiteboardData
70
- ? prepareWhiteboardVDiskSizeFields({
71
- AvailableSize,
72
- AllocatedSize,
73
- SlotSize: PDisk?.EnforcedDynamicSlotSize,
74
- })
75
- : undefined;
60
+ const WhiteboardSize = hasWhiteboardData ? vDiskSizeFields.DisplaySize : undefined;
76
61
 
77
62
  const Severity = calculateVDiskSeverity(vDiskState);
78
63
 
@@ -124,7 +109,7 @@ export function prepareWhiteboardVDiskData(
124
109
  }
125
110
 
126
111
  export function prepareWhiteboardPDiskData(
127
- pdiskState: TPDiskStateInfo = {},
112
+ pdiskState: TPDiskStateInfo & Pick<TPDiskInfo, 'StatusV2'> = {},
128
113
  whiteboardSizeSource: Pick<TPDiskStateInfo, 'AvailableSize' | 'TotalSize'> | null = pdiskState,
129
114
  ): PreparedPDisk {
130
115
  const hasWhiteboardData = pdiskState.HasWhiteboardData ?? Boolean(whiteboardSizeSource);
@@ -170,33 +155,7 @@ export function prepareWhiteboardPDiskData(
170
155
  State,
171
156
  Severity,
172
157
  SlotSize: EnforcedDynamicSlotSize,
173
- };
174
- }
175
-
176
- function prepareWhiteboardVDiskSizeFields({
177
- AvailableSize,
178
- AllocatedSize,
179
- SlotSize,
180
- }: {
181
- AvailableSize: unknown;
182
- AllocatedSize: unknown;
183
- SlotSize: unknown;
184
- }) {
185
- const allocatedSize = parseOptionalNonNegativeNumber(AllocatedSize);
186
- const availableSize = parseOptionalNonNegativeNumber(AvailableSize);
187
- const slotSize = parseOptionalNonNegativeNumber(SlotSize);
188
- const preparedSizeFields = prepareVDiskSizeFields({
189
- AvailableSize: availableSize,
190
- AllocatedSize: allocatedSize,
191
- SlotSize: slotSize,
192
- });
193
-
194
- return {
195
- AllocatedSize: allocatedSize === undefined ? undefined : preparedSizeFields.AllocatedSize,
196
- SizeLimit:
197
- availableSize === undefined && slotSize === undefined
198
- ? undefined
199
- : preparedSizeFields.SizeLimit,
158
+ DriveStatus: pdiskState.Status ?? pdiskState.StatusV2,
200
159
  };
201
160
  }
202
161
 
@@ -253,12 +212,27 @@ export function prepareVDiskSizeFields({
253
212
  });
254
213
  const allocatedPercent = sizeLimit > 0 ? Math.floor((allocated * 100) / sizeLimit) : NaN;
255
214
 
215
+ // Preserve missing values for display without changing the legacy calculations above.
216
+ const displayAllocatedSize = parseOptionalNonNegativeNumber(AllocatedSize);
217
+ const displayAvailableSize = parseOptionalNonNegativeNumber(AvailableSize);
218
+ const displaySlotSize = parseOptionalNonNegativeNumber(SlotSize);
219
+ let displaySizeLimit: number | undefined;
220
+ if (!displayAvailableSize && displaySlotSize) {
221
+ displaySizeLimit = displaySlotSize;
222
+ } else if (displayAllocatedSize !== undefined && displayAvailableSize !== undefined) {
223
+ displaySizeLimit = displayAllocatedSize + displayAvailableSize;
224
+ }
225
+
256
226
  return {
257
227
  AvailableSize: available,
258
228
  AllocatedSize: allocated,
259
229
  SizeLimit: sizeLimit,
260
230
  FreeSize: freeSize,
261
231
  AllocatedPercent: allocatedPercent,
232
+ DisplaySize: {
233
+ AllocatedSize: displayAllocatedSize,
234
+ SizeLimit: displaySizeLimit,
235
+ },
262
236
  };
263
237
  }
264
238
 
@@ -1,6 +1,6 @@
1
1
  import type {EFlag} from '../../types/api/enums';
2
2
  import type {EDriveStatus, TPDiskInfo, TPDiskStateInfo} from '../../types/api/pdisk';
3
- import type {EVDiskStatus, TVDiskStateInfo, TVSlotId} from '../../types/api/vdisk';
3
+ import type {EVDiskStatus, TVDiskStateInfo} from '../../types/api/vdisk';
4
4
  import type {ValueOf} from '../../types/common';
5
5
 
6
6
  import type {PDISK_TYPES} from './getPDiskType';
@@ -98,6 +98,8 @@ export interface PreparedVDisk
98
98
  extends Omit<TVDiskStateInfo, 'PDisk' | 'AvailableSize' | 'AllocatedSize' | 'Donors'> {
99
99
  Status?: EVDiskStatus;
100
100
  PDisk?: PreparedPDisk;
101
+ PDiskType?: string;
102
+ PDiskPath?: string;
101
103
  Severity?: number;
102
104
  StringifiedId?: string;
103
105
 
@@ -106,6 +108,11 @@ export interface PreparedVDisk
106
108
  AllocatedPercent?: number;
107
109
  SizeLimit?: number;
108
110
  FreeSize?: number;
111
+ /** Size values for display, preserving missing source values independently. */
112
+ DisplaySize?: {
113
+ AllocatedSize?: number;
114
+ SizeLimit?: number;
115
+ };
109
116
  WhiteboardSize?: {
110
117
  AllocatedSize?: number;
111
118
  SizeLimit?: number;
@@ -118,7 +125,8 @@ export interface PreparedVDisk
118
125
 
119
126
  export type PDiskType = ValueOf<typeof PDISK_TYPES>;
120
127
 
121
- export interface UnavailableDonor extends TVSlotId {
128
+ export interface UnavailableDonor
129
+ extends Pick<PreparedVDisk, 'NodeId' | 'PDiskId' | 'VDiskSlotId'> {
122
130
  DonorMode?: boolean;
123
131
  StoragePoolName?: string;
124
132
  }
@@ -0,0 +1,9 @@
1
+ import type {ETenantType} from '../../types/api/tenant';
2
+
3
+ import {useIsUserAllowedToMakeChanges} from './useIsUserAllowedToMakeChanges';
4
+
5
+ export function useDatabaseHealthcheckAvailable(databaseType?: ETenantType) {
6
+ const isUserAllowedToMakeChanges = useIsUserAllowedToMakeChanges();
7
+
8
+ return isUserAllowedToMakeChanges && databaseType !== 'Serverless';
9
+ }
@@ -0,0 +1,21 @@
1
+ import {isNil} from 'lodash';
2
+
3
+ import {selectNodesMap} from '../../store/reducers/nodesList';
4
+ import type {NodeMetadata} from '../../types/store/nodesList';
5
+ import {useTypedSelector} from '../hooks';
6
+
7
+ import {useDatabaseFromQuery} from './useDatabaseFromQuery';
8
+
9
+ export function useNodeMetadata(
10
+ nodeId: number | undefined,
11
+ parentNodeData?: NodeMetadata,
12
+ ): NodeMetadata {
13
+ const database = useDatabaseFromQuery();
14
+ const nodesMap = useTypedSelector((state) => selectNodesMap(state, database));
15
+ const storedNodeData = isNil(nodeId) ? undefined : nodesMap?.get(nodeId);
16
+ return {
17
+ Host: parentNodeData?.Host || storedNodeData?.Host,
18
+ DC: parentNodeData?.DC || storedNodeData?.DC,
19
+ Rack: parentNodeData?.Rack || storedNodeData?.Rack,
20
+ };
21
+ }
@@ -0,0 +1,16 @@
1
+ import type {TSystemStateInfo} from '../types/api/nodes';
2
+
3
+ import {parseOptionalNonNegativeNumber} from './utils';
4
+
5
+ export function getNodeMemory(
6
+ node: Pick<TSystemStateInfo, 'MemoryStats' | 'MemoryUsed' | 'MemoryLimit'>,
7
+ ) {
8
+ // Match the backend's process usage and sorting, including its allocator fallback.
9
+ const memoryUsed =
10
+ parseOptionalNonNegativeNumber(node.MemoryUsed) ??
11
+ parseOptionalNonNegativeNumber(node.MemoryStats?.AnonRss) ??
12
+ parseOptionalNonNegativeNumber(node.MemoryStats?.AllocatedMemory);
13
+ const memoryLimit = parseOptionalNonNegativeNumber(node.MemoryLimit) || undefined;
14
+
15
+ return {memoryUsed, memoryLimit};
16
+ }
@@ -32,9 +32,15 @@ export const isUnavailableNode = <
32
32
  export const prepareNodesMap = (nodesList?: TNodeInfo[]) => {
33
33
  return nodesList?.reduce<NodesMap>((nodeHosts, node) => {
34
34
  if (valueIsDefined(node.Id)) {
35
+ const physicalLocation = node.PhysicalLocation;
36
+ // The legacy numeric Rack can be a hash of the actual rack name.
37
+ const Rack =
38
+ node.Location?.Rack || physicalLocation?.Location?.match(/(?:^|\/)R=([^/]+)/)?.[1];
39
+
35
40
  nodeHosts.set(node.Id, {
36
41
  Host: node.Host,
37
- DC: node.PhysicalLocation?.DataCenterId,
42
+ DC: node.Location?.DataCenter || physicalLocation?.DataCenterId,
43
+ Rack,
38
44
  });
39
45
  }
40
46
  return nodeHosts;
@@ -1,11 +1,7 @@
1
1
  import type {BytesSizes} from './bytesParsers';
2
- import {bytesSizes, getBytesSizeUnit, sizes} from './bytesParsers';
2
+ import {bytesSizes, formatBytes, getBytesSizeUnit, sizes} from './bytesParsers';
3
3
  import {EMPTY_DATA_PLACEHOLDER, UNBREAKABLE_GAP} from './constants';
4
- import {
5
- formatNumber,
6
- formatPercent,
7
- formatStorageValuesToGb,
8
- } from './dataFormatters/dataFormatters';
4
+ import {formatNumber, formatPercent, roundToDecimalPlaces} from './dataFormatters/dataFormatters';
9
5
  import {parseOptionalNonNegativeNumber} from './utils';
10
6
 
11
7
  export interface FormatMetricBytesOptions {
@@ -165,27 +161,55 @@ export function formatMetricBytes(
165
161
  : EMPTY_DATA_PLACEHOLDER;
166
162
  }
167
163
 
168
- export function formatMetricPercent(value?: unknown) {
164
+ export function formatMetricPercent(value?: unknown, fixedDecimalPlaces?: number) {
169
165
  const numericValue = parseOptionalNonNegativeNumber(value);
170
166
 
171
167
  if (numericValue === undefined) {
172
168
  return EMPTY_DATA_PLACEHOLDER;
173
169
  }
174
170
 
175
- const precision = Number.isInteger(numericValue) ? 0 : 1;
171
+ const precision = fixedDecimalPlaces ?? (Number.isInteger(numericValue) ? 0 : 1);
172
+ const fixed =
173
+ fixedDecimalPlaces !== undefined && roundToDecimalPlaces(numericValue, precision) !== 0;
176
174
 
177
- return formatPercent(numericValue / 100, precision) || EMPTY_DATA_PLACEHOLDER;
175
+ return formatPercent(numericValue / 100, precision, {fixed}) || EMPTY_DATA_PLACEHOLDER;
178
176
  }
179
177
 
180
- export function formatStorageMetricPair(value?: string | number, capacity?: string | number) {
178
+ export function formatStorageMetricPair(
179
+ value?: string | number,
180
+ capacity?: string | number,
181
+ fixedDecimalPlaces?: number,
182
+ ) {
181
183
  const parsedValue = parseOptionalNonNegativeNumber(value);
182
184
  const parsedCapacity = parseOptionalNonNegativeNumber(capacity);
183
185
 
184
- if (parsedValue === undefined || parsedCapacity === undefined) {
186
+ if (parsedValue === undefined && parsedCapacity === undefined) {
185
187
  return EMPTY_DATA_PLACEHOLDER;
186
188
  }
187
189
 
188
- return formatStorageValuesToGb(parsedValue, parsedCapacity).join(' / ');
190
+ return [
191
+ formatBytes({
192
+ value: parsedValue,
193
+ size: 'gb',
194
+ precision: 1,
195
+ withSizeLabel: parsedCapacity === undefined,
196
+ fixedDecimalPlaces,
197
+ }),
198
+ formatBytes({value: parsedCapacity, size: 'gb', fixedDecimalPlaces}),
199
+ ]
200
+ .map((formattedValue) => formattedValue || EMPTY_DATA_PLACEHOLDER)
201
+ .join(' / ');
202
+ }
203
+
204
+ export function formatStorageThroughput(value?: string | number) {
205
+ return (
206
+ formatBytes({
207
+ value: parseOptionalNonNegativeNumber(value),
208
+ size: 'mb',
209
+ fixedDecimalPlaces: 2,
210
+ withSpeedLabel: true,
211
+ }) || EMPTY_DATA_PLACEHOLDER
212
+ );
189
213
  }
190
214
 
191
215
  export function formatNormalizedMetricPercent(value?: number) {
@@ -195,7 +219,7 @@ export function formatNormalizedMetricPercent(value?: number) {
195
219
  return EMPTY_DATA_PLACEHOLDER;
196
220
  }
197
221
 
198
- return formatPercent(parsedValue, 2, {fixed: true}) || EMPTY_DATA_PLACEHOLDER;
222
+ return formatMetricPercent(parsedValue * 100, 2);
199
223
  }
200
224
 
201
225
  export function formatMetricCount(value?: unknown) {
@@ -212,7 +236,7 @@ export function formatMetricCountPair(value?: unknown, capacity?: unknown) {
212
236
  const formattedValue = formatMetricCount(value);
213
237
  const formattedCapacity = formatMetricCount(capacity);
214
238
 
215
- if (formattedValue === EMPTY_DATA_PLACEHOLDER || formattedCapacity === EMPTY_DATA_PLACEHOLDER) {
239
+ if (formattedValue === EMPTY_DATA_PLACEHOLDER && formattedCapacity === EMPTY_DATA_PLACEHOLDER) {
216
240
  return EMPTY_DATA_PLACEHOLDER;
217
241
  }
218
242