ydb-embedded-ui 22.3.0 → 22.4.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 (302) hide show
  1. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.d.ts +10 -1
  2. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.js +75 -13
  3. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.js.map +1 -1
  4. package/dist/components/DiskCapacityInfo/i18n/index.d.ts +1 -1
  5. package/dist/components/DiskPopup/DiskPopup.d.ts +25 -0
  6. package/dist/components/DiskPopup/DiskPopup.js +44 -0
  7. package/dist/components/DiskPopup/DiskPopup.js.map +1 -0
  8. package/dist/components/DiskPopup/DiskPopup.scss +203 -0
  9. package/dist/components/DiskPopup/i18n/en.json +3 -0
  10. package/dist/components/DiskPopup/i18n/index.d.ts +2 -0
  11. package/dist/components/DiskPopup/i18n/index.js +4 -0
  12. package/dist/components/DiskPopup/i18n/index.js.map +1 -0
  13. package/dist/components/DiskStatus/DiskStatus.d.ts +31 -0
  14. package/dist/components/DiskStatus/DiskStatus.js +61 -0
  15. package/dist/components/DiskStatus/DiskStatus.js.map +1 -0
  16. package/dist/components/DiskStatus/DiskStatus.scss +59 -0
  17. package/dist/components/DiskStatus/i18n/en.json +6 -0
  18. package/dist/components/DiskStatus/i18n/index.d.ts +2 -0
  19. package/dist/components/DiskStatus/i18n/index.js +4 -0
  20. package/dist/components/DiskStatus/i18n/index.js.map +1 -0
  21. package/dist/components/EntityStatus/EntityStatus.d.ts +1 -0
  22. package/dist/components/EntityStatus/EntityStatus.js +1 -1
  23. package/dist/components/EntityStatus/EntityStatus.js.map +1 -1
  24. package/dist/components/EvictVDiskButton/i18n/en.json +1 -1
  25. package/dist/components/FullNodeViewer/i18n/index.d.ts +1 -1
  26. package/dist/components/HoverPopup/HoverPopup.d.ts +2 -1
  27. package/dist/components/HoverPopup/HoverPopup.js +49 -17
  28. package/dist/components/HoverPopup/HoverPopup.js.map +1 -1
  29. package/dist/components/HoverPopup/usePopupPriority.d.ts +4 -0
  30. package/dist/components/HoverPopup/usePopupPriority.js +30 -0
  31. package/dist/components/HoverPopup/usePopupPriority.js.map +1 -0
  32. package/dist/components/PDiskInfo/PDiskLogSize.d.ts +5 -0
  33. package/dist/components/PDiskInfo/PDiskLogSize.js +20 -0
  34. package/dist/components/PDiskInfo/PDiskLogSize.js.map +1 -0
  35. package/dist/components/PDiskInfo/PDiskLogSize.scss +12 -0
  36. package/dist/components/PDiskInfo/getPDiskDetails.d.ts +4 -0
  37. package/dist/components/PDiskInfo/getPDiskDetails.js +33 -0
  38. package/dist/components/PDiskInfo/getPDiskDetails.js.map +1 -0
  39. package/dist/components/PDiskInfo/i18n/en.json +64 -2
  40. package/dist/components/PDiskInfo/i18n/index.d.ts +1 -1
  41. package/dist/components/PDiskInfo/statuses.d.ts +7 -0
  42. package/dist/components/PDiskInfo/statuses.js +185 -0
  43. package/dist/components/PDiskInfo/statuses.js.map +1 -0
  44. package/dist/components/PDiskPopup/PDiskPopup.d.ts +4 -7
  45. package/dist/components/PDiskPopup/PDiskPopup.js +28 -99
  46. package/dist/components/PDiskPopup/PDiskPopup.js.map +1 -1
  47. package/dist/components/PDiskPopup/i18n/en.json +2 -12
  48. package/dist/components/PDiskPopup/i18n/index.d.ts +1 -1
  49. package/dist/components/StorageGroupInfo/StorageGroupInfo.d.ts +3 -3
  50. package/dist/components/StorageGroupInfo/StorageGroupInfo.js +78 -218
  51. package/dist/components/StorageGroupInfo/StorageGroupInfo.js.map +1 -1
  52. package/dist/components/StorageGroupInfo/StorageGroupInfo.scss +21 -0
  53. package/dist/components/StorageGroupInfo/i18n/en.json +1 -9
  54. package/dist/components/StorageGroupInfo/i18n/index.d.ts +1 -1
  55. package/dist/components/VDisk/VDisk.d.ts +2 -1
  56. package/dist/components/VDisk/VDisk.js +23 -32
  57. package/dist/components/VDisk/VDisk.js.map +1 -1
  58. package/dist/components/VDisk/VDiskWithDonorsStack.d.ts +1 -1
  59. package/dist/components/VDisk/VDiskWithDonorsStack.js +2 -1
  60. package/dist/components/VDisk/VDiskWithDonorsStack.js.map +1 -1
  61. package/dist/components/VDisk/getFlagStatusText.d.ts +2 -0
  62. package/dist/components/VDisk/getFlagStatusText.js +18 -0
  63. package/dist/components/VDisk/getFlagStatusText.js.map +1 -0
  64. package/dist/components/VDisk/i18n/en.json +1 -1
  65. package/dist/components/VDisk/i18n/index.d.ts +1 -1
  66. package/dist/components/VDiskInfo/getVDiskDetails.d.ts +5 -0
  67. package/dist/components/VDiskInfo/getVDiskDetails.js +29 -0
  68. package/dist/components/VDiskInfo/getVDiskDetails.js.map +1 -0
  69. package/dist/components/VDiskInfo/i18n/en.json +3 -1
  70. package/dist/components/VDiskInfo/i18n/index.d.ts +1 -1
  71. package/dist/components/VDiskPopup/VDiskPopup.d.ts +6 -8
  72. package/dist/components/VDiskPopup/VDiskPopup.js +106 -240
  73. package/dist/components/VDiskPopup/VDiskPopup.js.map +1 -1
  74. package/dist/components/VDiskPopup/VDiskPopup.scss +3 -10
  75. package/dist/components/VDiskPopup/i18n/en.json +6 -22
  76. package/dist/components/VDiskPopup/i18n/index.d.ts +1 -1
  77. package/dist/components/VDiskStatus/VDiskReplicationStatus.d.ts +8 -0
  78. package/dist/components/VDiskStatus/VDiskReplicationStatus.js +32 -0
  79. package/dist/components/VDiskStatus/VDiskReplicationStatus.js.map +1 -0
  80. package/dist/components/VDiskStatus/VDiskStatus.d.ts +16 -0
  81. package/dist/components/VDiskStatus/VDiskStatus.js +20 -0
  82. package/dist/components/VDiskStatus/VDiskStatus.js.map +1 -0
  83. package/dist/components/VDiskStatus/VDiskStatus.scss +32 -0
  84. package/dist/components/VDiskStatus/i18n/en.json +33 -0
  85. package/dist/components/VDiskStatus/i18n/index.d.ts +1 -0
  86. package/dist/components/VDiskStatus/i18n/index.js +5 -0
  87. package/dist/components/VDiskStatus/i18n/index.js.map +1 -0
  88. package/dist/components/VDiskStatus/index.d.ts +2 -0
  89. package/dist/components/VDiskStatus/index.js +3 -0
  90. package/dist/components/VDiskStatus/index.js.map +1 -0
  91. package/dist/components/VDiskStatus/statuses.d.ts +4 -0
  92. package/dist/components/VDiskStatus/statuses.js +120 -0
  93. package/dist/components/VDiskStatus/statuses.js.map +1 -0
  94. package/dist/components/capacityMetricsColumns/i18n/en.json +4 -4
  95. package/dist/containers/Cluster/ClusterDrawerHealthcheck.js +6 -1
  96. package/dist/containers/Cluster/ClusterDrawerHealthcheck.js.map +1 -1
  97. package/dist/containers/Clusters/ClusterDrawerHealthcheck.js +1 -1
  98. package/dist/containers/Clusters/ClusterDrawerHealthcheck.js.map +1 -1
  99. package/dist/containers/Header/Header.js +8 -2
  100. package/dist/containers/Header/Header.js.map +1 -1
  101. package/dist/containers/Header/StorageGroupLeftControls.d.ts +1 -0
  102. package/dist/containers/Header/StorageGroupLeftControls.js +23 -0
  103. package/dist/containers/Header/StorageGroupLeftControls.js.map +1 -0
  104. package/dist/containers/Header/i18n/en.json +3 -1
  105. package/dist/containers/Header/i18n/index.d.ts +1 -1
  106. package/dist/containers/Operations/constants.d.ts +1 -1
  107. package/dist/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.js +4 -4
  108. package/dist/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.js.map +1 -1
  109. package/dist/containers/PDiskPage/i18n/index.d.ts +1 -1
  110. package/dist/containers/Storage/Disks/Disks.js +36 -9
  111. package/dist/containers/Storage/Disks/Disks.js.map +1 -1
  112. package/dist/containers/Storage/PDisk/PDisk.d.ts +2 -1
  113. package/dist/containers/Storage/PDisk/PDisk.js +2 -2
  114. package/dist/containers/Storage/PDisk/PDisk.js.map +1 -1
  115. package/dist/containers/Storage/PDisk/i18n/index.d.ts +1 -1
  116. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/columns.js +7 -2
  117. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/columns.js.map +1 -1
  118. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/i18n/index.d.ts +1 -1
  119. package/dist/containers/Storage/StorageExpertModePanel/components/SpaceLegend.scss +14 -82
  120. package/dist/containers/Storage/StorageExpertModePanel/i18n/index.d.ts +1 -1
  121. package/dist/containers/Storage/StorageGroupStateLabel.d.ts +4 -0
  122. package/dist/containers/Storage/StorageGroupStateLabel.js +9 -0
  123. package/dist/containers/Storage/StorageGroupStateLabel.js.map +1 -0
  124. package/dist/containers/Storage/utils/getStorageGroupStateLabel.d.ts +2 -0
  125. package/dist/containers/Storage/utils/getStorageGroupStateLabel.js +35 -0
  126. package/dist/containers/Storage/utils/getStorageGroupStateLabel.js.map +1 -0
  127. package/dist/containers/StorageGroupPage/StorageGroupPage.js +17 -12
  128. package/dist/containers/StorageGroupPage/StorageGroupPage.js.map +1 -1
  129. package/dist/containers/StorageGroupPage/StorageGroupPage.scss +9 -13
  130. package/dist/containers/StorageGroupPage/i18n/en.json +3 -1
  131. package/dist/containers/StorageGroupPage/i18n/index.d.ts +1 -1
  132. package/dist/containers/Tenant/Diagnostics/Overview/Overview.d.ts +2 -1
  133. package/dist/containers/Tenant/Diagnostics/Overview/Overview.js +4 -1
  134. package/dist/containers/Tenant/Diagnostics/Overview/Overview.js.map +1 -1
  135. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.d.ts +2 -1
  136. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.js +11 -2
  137. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.js.map +1 -1
  138. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.d.ts +2 -1
  139. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.js +9 -8
  140. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.js.map +1 -1
  141. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.d.ts +16 -1
  142. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.js +56 -19
  143. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.js.map +1 -1
  144. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/en.json +5 -1
  145. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/index.d.ts +1 -1
  146. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/i18n/index.d.ts +1 -1
  147. package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.d.ts +3 -1
  148. package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.js +3 -3
  149. package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.js.map +1 -1
  150. package/dist/containers/Tenant/TenantDrawerHealthcheck.js +8 -1
  151. package/dist/containers/Tenant/TenantDrawerHealthcheck.js.map +1 -1
  152. package/dist/containers/Tenants/DatabaseDrawerHealthcheck.js +8 -1
  153. package/dist/containers/Tenants/DatabaseDrawerHealthcheck.js.map +1 -1
  154. package/dist/containers/VDiskPage/i18n/index.d.ts +1 -1
  155. package/dist/lib.d.ts +1 -1
  156. package/dist/lib.js.map +1 -1
  157. package/dist/store/configureStore.d.ts +2 -2
  158. package/dist/store/defaultStore.d.ts +1 -1
  159. package/dist/store/reducers/header/types.d.ts +1 -1
  160. package/dist/store/reducers/index.d.ts +2 -2
  161. package/dist/store/reducers/pdisk/types.d.ts +1 -0
  162. package/dist/store/reducers/pdisk/utils.js +6 -1
  163. package/dist/store/reducers/pdisk/utils.js.map +1 -1
  164. package/dist/store/reducers/storage/prepareGroupsDisks.d.ts +1 -0
  165. package/dist/store/reducers/storage/prepareGroupsDisks.js +7 -18
  166. package/dist/store/reducers/storage/prepareGroupsDisks.js.map +1 -1
  167. package/dist/store/reducers/storage/utils.js +4 -0
  168. package/dist/store/reducers/storage/utils.js.map +1 -1
  169. package/dist/store/reducers/streamingQuery/streamingQuery.js +2 -4
  170. package/dist/store/reducers/streamingQuery/streamingQuery.js.map +1 -1
  171. package/dist/styles/mixins.scss +22 -0
  172. package/dist/types/api/pdisk.d.ts +4 -0
  173. package/dist/types/api/pdisk.js.map +1 -1
  174. package/dist/types/api/vdisk.d.ts +8 -0
  175. package/dist/types/api/vdisk.js +7 -0
  176. package/dist/types/api/vdisk.js.map +1 -1
  177. package/dist/types/store/nodesList.d.ts +4 -2
  178. package/dist/uiFactory/types.d.ts +5 -2
  179. package/dist/utils/bytesParsers/formatBytes.d.ts +3 -1
  180. package/dist/utils/bytesParsers/formatBytes.js +12 -3
  181. package/dist/utils/bytesParsers/formatBytes.js.map +1 -1
  182. package/dist/utils/disks/constants.d.ts +1 -0
  183. package/dist/utils/disks/constants.js +4 -0
  184. package/dist/utils/disks/constants.js.map +1 -1
  185. package/dist/utils/disks/diskInfo/getDiskLocationItems.d.ts +16 -0
  186. package/dist/utils/disks/diskInfo/getDiskLocationItems.js +30 -0
  187. package/dist/utils/disks/diskInfo/getDiskLocationItems.js.map +1 -0
  188. package/dist/utils/disks/diskInfo/i18n/en.json +9 -0
  189. package/dist/utils/disks/diskInfo/i18n/index.d.ts +2 -0
  190. package/dist/utils/disks/diskInfo/i18n/index.js +4 -0
  191. package/dist/utils/disks/diskInfo/i18n/index.js.map +1 -0
  192. package/dist/utils/disks/iconCalculators.d.ts +5 -0
  193. package/dist/utils/disks/iconCalculators.js +1 -1
  194. package/dist/utils/disks/iconCalculators.js.map +1 -1
  195. package/dist/utils/disks/prepareDisks.d.ts +6 -2
  196. package/dist/utils/disks/prepareDisks.js +22 -35
  197. package/dist/utils/disks/prepareDisks.js.map +1 -1
  198. package/dist/utils/disks/types.d.ts +9 -2
  199. package/dist/utils/hooks/useNodeMetadata.d.ts +2 -0
  200. package/dist/utils/hooks/useNodeMetadata.js +15 -0
  201. package/dist/utils/hooks/useNodeMetadata.js.map +1 -0
  202. package/dist/utils/nodes.js +6 -2
  203. package/dist/utils/nodes.js.map +1 -1
  204. package/dist/utils/storageMetrics.d.ts +2 -2
  205. package/dist/utils/storageMetrics.js +22 -10
  206. package/dist/utils/storageMetrics.js.map +1 -1
  207. package/dist/utils/timeParsers/formatDuration.d.ts +4 -1
  208. package/dist/utils/timeParsers/formatDuration.js +16 -1
  209. package/dist/utils/timeParsers/formatDuration.js.map +1 -1
  210. package/dist/utils/timeParsers/i18n/en.json +5 -1
  211. package/dist/utils/timeParsers/i18n/index.d.ts +1 -1
  212. package/dist/utils/timeParsers/i18n/ru.json +5 -1
  213. package/package.json +2 -2
  214. package/src/components/DiskCapacityInfo/DiskCapacityInfo.tsx +106 -15
  215. package/src/components/DiskPopup/DiskPopup.scss +203 -0
  216. package/src/components/DiskPopup/DiskPopup.tsx +123 -0
  217. package/src/components/DiskPopup/i18n/en.json +3 -0
  218. package/src/components/DiskPopup/i18n/index.ts +5 -0
  219. package/src/components/DiskStatus/DiskStatus.scss +59 -0
  220. package/src/components/DiskStatus/DiskStatus.tsx +149 -0
  221. package/src/components/DiskStatus/i18n/en.json +6 -0
  222. package/src/components/DiskStatus/i18n/index.ts +5 -0
  223. package/src/components/EntityStatus/EntityStatus.tsx +1 -1
  224. package/src/components/EvictVDiskButton/i18n/en.json +1 -1
  225. package/src/components/HoverPopup/HoverPopup.tsx +67 -20
  226. package/src/components/HoverPopup/usePopupPriority.ts +39 -0
  227. package/src/components/PDiskInfo/PDiskLogSize.scss +12 -0
  228. package/src/components/PDiskInfo/PDiskLogSize.tsx +37 -0
  229. package/src/components/PDiskInfo/getPDiskDetails.tsx +37 -0
  230. package/src/components/PDiskInfo/i18n/en.json +64 -8
  231. package/src/components/PDiskInfo/statuses.ts +209 -0
  232. package/src/components/PDiskPopup/PDiskPopup.tsx +62 -147
  233. package/src/components/PDiskPopup/i18n/en.json +2 -12
  234. package/src/components/StorageGroupInfo/StorageGroupInfo.scss +21 -0
  235. package/src/components/StorageGroupInfo/StorageGroupInfo.tsx +121 -260
  236. package/src/components/StorageGroupInfo/i18n/en.json +1 -9
  237. package/src/components/VDisk/VDisk.tsx +31 -34
  238. package/src/components/VDisk/VDiskWithDonorsStack.tsx +2 -0
  239. package/src/components/VDisk/getFlagStatusText.ts +19 -0
  240. package/src/components/VDisk/i18n/en.json +1 -1
  241. package/src/components/VDiskInfo/getVDiskDetails.tsx +41 -0
  242. package/src/components/VDiskInfo/i18n/en.json +3 -10
  243. package/src/components/VDiskPopup/VDiskPopup.scss +3 -10
  244. package/src/components/VDiskPopup/VDiskPopup.tsx +197 -421
  245. package/src/components/VDiskPopup/i18n/en.json +6 -22
  246. package/src/components/VDiskStatus/VDiskReplicationStatus.tsx +77 -0
  247. package/src/components/VDiskStatus/VDiskStatus.scss +32 -0
  248. package/src/components/VDiskStatus/VDiskStatus.tsx +38 -0
  249. package/src/components/VDiskStatus/i18n/en.json +33 -0
  250. package/src/components/VDiskStatus/i18n/index.ts +7 -0
  251. package/src/components/VDiskStatus/index.ts +7 -0
  252. package/src/components/VDiskStatus/statuses.ts +139 -0
  253. package/src/components/capacityMetricsColumns/i18n/en.json +4 -4
  254. package/src/containers/Cluster/ClusterDrawerHealthcheck.tsx +6 -0
  255. package/src/containers/Clusters/ClusterDrawerHealthcheck.tsx +1 -0
  256. package/src/containers/Header/Header.tsx +11 -3
  257. package/src/containers/Header/StorageGroupLeftControls.tsx +38 -0
  258. package/src/containers/Header/i18n/en.json +3 -1
  259. package/src/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.tsx +13 -2
  260. package/src/containers/Storage/Disks/Disks.tsx +66 -12
  261. package/src/containers/Storage/PDisk/PDisk.tsx +3 -0
  262. package/src/containers/Storage/PaginatedStorageGroupsTable/columns/columns.tsx +24 -3
  263. package/src/containers/Storage/StorageExpertModePanel/components/SpaceLegend.scss +14 -82
  264. package/src/containers/Storage/StorageGroupStateLabel.tsx +22 -0
  265. package/src/containers/Storage/utils/getStorageGroupStateLabel.ts +49 -0
  266. package/src/containers/StorageGroupPage/StorageGroupPage.scss +9 -13
  267. package/src/containers/StorageGroupPage/StorageGroupPage.tsx +53 -25
  268. package/src/containers/StorageGroupPage/i18n/en.json +3 -1
  269. package/src/containers/Tenant/Diagnostics/Overview/Overview.tsx +5 -1
  270. package/src/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.tsx +12 -1
  271. package/src/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.tsx +11 -10
  272. package/src/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.tsx +83 -20
  273. package/src/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/en.json +5 -1
  274. package/src/containers/Tenant/Healthcheck/components/HealthcheckDrawer.tsx +5 -2
  275. package/src/containers/Tenant/TenantDrawerHealthcheck.tsx +10 -0
  276. package/src/containers/Tenants/DatabaseDrawerHealthcheck.tsx +10 -0
  277. package/src/lib.ts +1 -0
  278. package/src/store/reducers/header/types.ts +3 -1
  279. package/src/store/reducers/pdisk/types.ts +1 -0
  280. package/src/store/reducers/pdisk/utils.ts +6 -3
  281. package/src/store/reducers/storage/prepareGroupsDisks.ts +7 -22
  282. package/src/store/reducers/storage/utils.ts +4 -0
  283. package/src/store/reducers/streamingQuery/streamingQuery.ts +2 -4
  284. package/src/styles/mixins.scss +22 -0
  285. package/src/types/api/pdisk.ts +4 -0
  286. package/src/types/api/vdisk.ts +9 -0
  287. package/src/types/store/nodesList.ts +7 -7
  288. package/src/uiFactory/types.ts +9 -2
  289. package/src/utils/bytesParsers/formatBytes.ts +23 -4
  290. package/src/utils/disks/constants.ts +5 -0
  291. package/src/utils/disks/diskInfo/getDiskLocationItems.ts +50 -0
  292. package/src/utils/disks/diskInfo/i18n/en.json +9 -0
  293. package/src/utils/disks/diskInfo/i18n/index.ts +5 -0
  294. package/src/utils/disks/iconCalculators.ts +1 -1
  295. package/src/utils/disks/prepareDisks.ts +21 -47
  296. package/src/utils/disks/types.ts +10 -2
  297. package/src/utils/hooks/useNodeMetadata.ts +21 -0
  298. package/src/utils/nodes.ts +6 -1
  299. package/src/utils/storageMetrics.ts +27 -14
  300. package/src/utils/timeParsers/formatDuration.ts +22 -1
  301. package/src/utils/timeParsers/i18n/en.json +5 -1
  302. package/src/utils/timeParsers/i18n/ru.json +5 -1
@@ -1,26 +1,10 @@
1
1
  {
2
- "context_not-available": "Not available",
3
- "label_storage-pool": "StoragePool",
4
- "label_donor": "Donor",
5
- "label_node-id": "NodeId",
6
- "label_pdisk-id": "PDiskId",
7
- "label_vslot-id": "VSlotId",
8
- "label_links": "Links",
2
+ "label_storage-pool": "Storage Pool Name",
9
3
  "label_vdisk": "VDisk",
10
- "label_fresh": "Fresh",
11
- "label_level": "Level",
12
- "label_space": "Space",
13
- "label_front-queues": "FrontQueues",
14
- "label_replicated": "Replicated",
15
- "label_progress": "Progress",
16
- "label_remaining": "Remaining",
17
- "label_unsync-vdisks": "UnsyncVDisks",
18
- "label_allocated": "Allocated",
19
- "label_available": "Available",
20
- "label_read": "Read",
21
- "label_write": "Write",
22
- "label_replication": "Replication",
23
- "label_recipient": "Recipient",
4
+ "label_front-queues": "Front Queues",
5
+ "label_read": "Read Throughput",
6
+ "label_write": "Write Throughput",
24
7
  "action_open-in-developer-ui": "Open in Developer UI",
25
- "action_go-to-vdisk": "Go to VDisk"
8
+ "action_go-to-vdisk": "Go to VDisk",
9
+ "label_compaction": "Compaction"
26
10
  }
@@ -0,0 +1,77 @@
1
+ import React from 'react';
2
+
3
+ import type {LabelProps} from '@gravity-ui/uikit';
4
+ import {Flex, Progress} from '@gravity-ui/uikit';
5
+
6
+ import {EVDiskDetailedReplicationStatus} from '../../types/api/vdisk';
7
+ import {cn} from '../../utils/cn';
8
+ import {formatPercent} from '../../utils/dataFormatters/dataFormatters';
9
+ import type {PreparedVDisk} from '../../utils/disks/types';
10
+ import {formatDurationToShortTimeFormat} from '../../utils/timeParsers';
11
+ import {parseOptionalNonNegativeNumber} from '../../utils/utils';
12
+ import {DiskStatusLabel} from '../DiskStatus/DiskStatus';
13
+
14
+ import {vDiskStatusKeyset as i18n} from './i18n';
15
+ import {getVDiskReplicationLabel} from './statuses';
16
+
17
+ import './VDiskStatus.scss';
18
+
19
+ const b = cn('ydb-vdisk-status');
20
+
21
+ interface VDiskReplicationStatusProps extends Pick<LabelProps, 'size'> {
22
+ data: Pick<
23
+ PreparedVDisk,
24
+ | 'DetailedReplicationStatus'
25
+ | 'Replicated'
26
+ | 'ReplicationProgress'
27
+ | 'ReplicationSecondsRemaining'
28
+ >;
29
+ }
30
+
31
+ export function VDiskReplicationStatus({data, size}: VDiskReplicationStatusProps) {
32
+ const label = getVDiskReplicationLabel(data);
33
+ const showProgress =
34
+ data.DetailedReplicationStatus === EVDiskDetailedReplicationStatus.InProgress ||
35
+ (!data.DetailedReplicationStatus && data.Replicated === false);
36
+
37
+ return (
38
+ <React.Fragment>
39
+ {label && <DiskStatusLabel {...label} size={size} />}
40
+ {showProgress && <ReplicationProgress data={data} size={size} />}
41
+ </React.Fragment>
42
+ );
43
+ }
44
+
45
+ function ReplicationProgress({data, size}: VDiskReplicationStatusProps) {
46
+ const progress = parseOptionalNonNegativeNumber(data.ReplicationProgress);
47
+ const percentage =
48
+ progress !== undefined && progress <= 1 ? Math.round(progress * 100) : undefined;
49
+ const seconds = parseOptionalNonNegativeNumber(data.ReplicationSecondsRemaining);
50
+ const remaining =
51
+ seconds === undefined
52
+ ? undefined
53
+ : formatDurationToShortTimeFormat(Math.ceil(seconds) * 1000, 2, {compact: true});
54
+ if (percentage === undefined && !remaining) {
55
+ return null;
56
+ }
57
+ return (
58
+ <Flex alignItems="center" gap={2} className={b('replication-progress', {size})}>
59
+ {percentage !== undefined && (
60
+ <React.Fragment>
61
+ <span>{formatPercent(percentage / 100, 0)}</span>
62
+ <div
63
+ role="progressbar"
64
+ aria-label={i18n('label_replication-progress')}
65
+ aria-valuemin={0}
66
+ aria-valuemax={100}
67
+ aria-valuenow={percentage}
68
+ className={b('progress-bar')}
69
+ >
70
+ <Progress value={percentage} theme="info" size="xs" />
71
+ </div>
72
+ </React.Fragment>
73
+ )}
74
+ {remaining && <span>{i18n('context_remaining', {duration: remaining})}</span>}
75
+ </Flex>
76
+ );
77
+ }
@@ -0,0 +1,32 @@
1
+ @use '../../styles/mixins';
2
+
3
+ .ydb-vdisk-status {
4
+ &__replication-progress {
5
+ box-sizing: border-box;
6
+ min-height: 24px;
7
+ padding: 0 10px;
8
+
9
+ color: var(--g-color-text-info-heavy);
10
+ border-radius: var(--g-border-radius-xs);
11
+ background-color: var(--g-color-base-selection);
12
+ @include mixins.text-body-short();
13
+
14
+ &_size_xs {
15
+ min-height: 20px;
16
+ padding: 2px 6px;
17
+ }
18
+
19
+ > span {
20
+ white-space: nowrap;
21
+ }
22
+ }
23
+
24
+ &__progress-bar {
25
+ --g-progress-empty-background-color: var(--g-color-base-info-light);
26
+ --g-progress-filled-background-color: var(--g-color-base-info-heavy);
27
+
28
+ flex-shrink: 0;
29
+
30
+ width: 103px;
31
+ }
32
+ }
@@ -0,0 +1,38 @@
1
+ import type {LabelProps} from '@gravity-ui/uikit';
2
+
3
+ import {EFlag} from '../../types/api/enums';
4
+ import type {EVDiskState} from '../../types/api/vdisk';
5
+ import {VDISK_LABEL_CONFIG} from '../../utils/disks/constants';
6
+ import {calculateFrontQueuesIcon} from '../../utils/disks/iconCalculators';
7
+ import {DiskFlagLabel, DiskStatusLabel} from '../DiskStatus/DiskStatus';
8
+
9
+ import {vDiskStatusKeyset as i18n} from './i18n';
10
+ import {getVDiskStateLabel} from './statuses';
11
+
12
+ export function VDiskStateLabel({state, size}: {state?: EVDiskState} & Pick<LabelProps, 'size'>) {
13
+ return <DiskStatusLabel {...getVDiskStateLabel({VDiskState: state})} size={size} />;
14
+ }
15
+
16
+ export function VDiskDonorLabel({
17
+ donorMode,
18
+ size,
19
+ }: {donorMode?: boolean} & Pick<LabelProps, 'size'>) {
20
+ return donorMode ? (
21
+ <DiskStatusLabel value={i18n('label_donor')} {...VDISK_LABEL_CONFIG.donor} size={size} />
22
+ ) : null;
23
+ }
24
+
25
+ export function VDiskFrontQueuesLabel({flag}: {flag?: EFlag}) {
26
+ return (
27
+ <DiskFlagLabel
28
+ flag={flag}
29
+ icon={calculateFrontQueuesIcon({FrontQueues: flag || EFlag.Grey})}
30
+ />
31
+ );
32
+ }
33
+
34
+ export function VDiskCompactionRankLabel({flag, rank}: {flag?: EFlag; rank: 'fresh' | 'level'}) {
35
+ return (
36
+ <DiskFlagLabel flag={flag} title={i18n(rank === 'fresh' ? 'label_fresh' : 'label_level')} />
37
+ );
38
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "label_donor": "Donor",
3
+ "label_fresh": "Fresh Rank",
4
+ "label_level": "Level Rank",
5
+ "label_replicated": "Replicated",
6
+ "label_replication": "Replication",
7
+ "label_replication-progress": "Replication progress",
8
+ "value_ok": "Ok",
9
+ "value_in-progress": "In progress",
10
+ "value_initial": "Initial",
11
+ "value_sync-guid-recovery": "Sync Guid Recovery",
12
+ "value_pdisk-error": "PDisk Error",
13
+ "value_local-recovery-error": "Local Recovery Error",
14
+ "value_sync-guid-recovery-error": "Sync Guid Recovery Error",
15
+ "value_no-data": "No data",
16
+ "value_waiting-for-token": "Waiting for token",
17
+ "value_phantoms-only": "Phantoms only",
18
+ "label_not-replicated": "Not replicated",
19
+ "value_no-detailed-status": "No detailed status",
20
+ "context_state-ok": "The VDisk is operating normally",
21
+ "context_state-initial": "The VDisk is starting",
22
+ "context_state-sync-guid-recovery": "The VDisk is synchronizing with other VDisks of the group",
23
+ "context_state-pdisk-error": "The VDisk cannot operate because its underlying PDisk reported an error",
24
+ "context_state-local-recovery-error": "The VDisk failed to restore its state from the PDisk",
25
+ "context_state-sync-guid-recovery-error": "The VDisk failed to complete synchronization identity with other VDisks in the group",
26
+ "context_state-no-data": "The VDisk state is unknown",
27
+ "context_replicated": "The VDisk is fully replicated",
28
+ "context_not-replicated": "The VDisk isn't replicated",
29
+ "context_replication-in-progress": "Replication is in progress, data is being transferred to VDisk",
30
+ "context_replication-waiting-for-token": "Replication is waiting for a token from the broker",
31
+ "context_replication-phantoms-only": "Replication cannot finish due to phantom blobs",
32
+ "context_remaining": "{{duration}} left"
33
+ }
@@ -0,0 +1,7 @@
1
+ import {registerKeysets} from '../../../utils/i18n';
2
+
3
+ import en from './en.json';
4
+
5
+ const COMPONENT = 'ydb-vdisk-status';
6
+
7
+ export const vDiskStatusKeyset = registerKeysets(COMPONENT, {en});
@@ -0,0 +1,7 @@
1
+ export {
2
+ VDiskCompactionRankLabel,
3
+ VDiskDonorLabel,
4
+ VDiskFrontQueuesLabel,
5
+ VDiskStateLabel,
6
+ } from './VDiskStatus';
7
+ export {VDiskReplicationStatus} from './VDiskReplicationStatus';
@@ -0,0 +1,139 @@
1
+ import {
2
+ ArrowsRotateLeft,
3
+ ArrowsRotateLeftSlash,
4
+ Check,
5
+ CirclePause,
6
+ CircleQuestion,
7
+ CircleStop,
8
+ } from '@gravity-ui/icons';
9
+
10
+ import {EVDiskDetailedReplicationStatus, EVDiskState} from '../../types/api/vdisk';
11
+ import {
12
+ NOT_AVAILABLE_SEVERITY,
13
+ NUMERIC_SEVERITY_TO_LABEL_VIEW,
14
+ VDISK_STATE_SEVERITY_FOR_STATE_MODE,
15
+ } from '../../utils/disks/constants';
16
+ import {calculateStateIcon} from '../../utils/disks/iconCalculators';
17
+ import type {PreparedVDisk} from '../../utils/disks/types';
18
+ import {parseOptionalNonNegativeNumber} from '../../utils/utils';
19
+ import type {DiskStatusLabelData} from '../DiskStatus/DiskStatus';
20
+
21
+ import {vDiskStatusKeyset as i18n} from './i18n';
22
+
23
+ export function getVDiskStateLabel(data: PreparedVDisk): DiskStatusLabelData {
24
+ const state = data.VDiskState;
25
+ const severity = state
26
+ ? (VDISK_STATE_SEVERITY_FOR_STATE_MODE[state] ?? NOT_AVAILABLE_SEVERITY)
27
+ : NOT_AVAILABLE_SEVERITY;
28
+ if (!state || severity === NOT_AVAILABLE_SEVERITY) {
29
+ return {
30
+ value: i18n('value_no-data'),
31
+ theme: 'unknown',
32
+ icon: CircleQuestion,
33
+ tooltip: i18n('context_state-no-data'),
34
+ };
35
+ }
36
+
37
+ const labels: Record<EVDiskState, Pick<DiskStatusLabelData, 'value' | 'tooltip'>> = {
38
+ [EVDiskState.OK]: {
39
+ value: i18n('value_ok'),
40
+ tooltip: i18n('context_state-ok'),
41
+ },
42
+ [EVDiskState.Initial]: {
43
+ value: i18n('value_initial'),
44
+ tooltip: i18n('context_state-initial'),
45
+ },
46
+ [EVDiskState.SyncGuidRecovery]: {
47
+ value: i18n('value_sync-guid-recovery'),
48
+ tooltip: i18n('context_state-sync-guid-recovery'),
49
+ },
50
+ [EVDiskState.PDiskError]: {
51
+ value: i18n('value_pdisk-error'),
52
+ tooltip: i18n('context_state-pdisk-error'),
53
+ },
54
+ [EVDiskState.LocalRecoveryError]: {
55
+ value: i18n('value_local-recovery-error'),
56
+ tooltip: i18n('context_state-local-recovery-error'),
57
+ },
58
+ [EVDiskState.SyncGuidRecoveryError]: {
59
+ value: i18n('value_sync-guid-recovery-error'),
60
+ tooltip: i18n('context_state-sync-guid-recovery-error'),
61
+ },
62
+ };
63
+
64
+ const labelView = NUMERIC_SEVERITY_TO_LABEL_VIEW[severity];
65
+
66
+ return {
67
+ ...labels[state],
68
+ theme: labelView.theme,
69
+ icon: state === EVDiskState.OK ? Check : calculateStateIcon(data),
70
+ dangerHeavy: Boolean(labelView.dangerHeavy),
71
+ };
72
+ }
73
+
74
+ export function getVDiskReplicationLabel(data: PreparedVDisk): DiskStatusLabelData | undefined {
75
+ switch (data.DetailedReplicationStatus) {
76
+ case EVDiskDetailedReplicationStatus.Replicated:
77
+ return replicatedLabel();
78
+ case EVDiskDetailedReplicationStatus.InProgress:
79
+ return {
80
+ title: i18n('label_replication'),
81
+ value: i18n('value_in-progress'),
82
+ theme: 'info',
83
+ icon: ArrowsRotateLeft,
84
+ tooltip: i18n('context_replication-in-progress'),
85
+ };
86
+ case EVDiskDetailedReplicationStatus.WaitingForToken:
87
+ return {
88
+ title: i18n('label_replication'),
89
+ value: i18n('value_waiting-for-token'),
90
+ theme: 'info',
91
+ icon: CirclePause,
92
+ tooltip: i18n('context_replication-waiting-for-token'),
93
+ };
94
+ case EVDiskDetailedReplicationStatus.PhantomsOnly:
95
+ return {
96
+ title: i18n('label_replication'),
97
+ value: i18n('value_phantoms-only'),
98
+ theme: 'info',
99
+ icon: CircleStop,
100
+ tooltip: i18n('context_replication-phantoms-only'),
101
+ };
102
+ default:
103
+ if (data.DetailedReplicationStatus) {
104
+ return undefined;
105
+ }
106
+ if (data.Replicated === true) {
107
+ return replicatedLabel();
108
+ }
109
+ if (data.Replicated === false) {
110
+ const progress = parseOptionalNonNegativeNumber(data.ReplicationProgress);
111
+ const seconds = parseOptionalNonNegativeNumber(data.ReplicationSecondsRemaining);
112
+ if ((progress !== undefined && progress <= 1) || seconds !== undefined) {
113
+ return {
114
+ title: i18n('label_replication'),
115
+ value: i18n('value_no-detailed-status'),
116
+ theme: 'info',
117
+ icon: ArrowsRotateLeft,
118
+ tooltip: i18n('context_not-replicated'),
119
+ };
120
+ }
121
+ return {
122
+ value: i18n('label_not-replicated'),
123
+ theme: 'normal',
124
+ icon: ArrowsRotateLeftSlash,
125
+ tooltip: i18n('context_not-replicated'),
126
+ };
127
+ }
128
+ return undefined;
129
+ }
130
+ }
131
+
132
+ function replicatedLabel(): DiskStatusLabelData {
133
+ return {
134
+ value: i18n('label_replicated'),
135
+ theme: 'success',
136
+ icon: Check,
137
+ tooltip: i18n('context_replicated'),
138
+ };
139
+ }
@@ -5,11 +5,11 @@
5
5
  "field_normalized-occupancy": "Normalized Occupancy",
6
6
  "field_capacity-alert": "Capacity Alert",
7
7
  "value_implicit-unit-count": "1 (implicit)",
8
- "context_pdisk-usage": "Share of PDisk space used by VDisks. System and log reserves are not included.",
9
- "context_vdisk-slot-usage": "Percentage of VDisk space used relative to the first low-space warning. Can exceed 100%.",
10
- "context_vdisk-raw-usage": "Percentage of VDisk space used relative to its fair share on the PDisk. Can exceed 100%.",
8
+ "context_pdisk-usage": "The share of PDisk chunk space used by the residing VDisks. Doesn't include SysLog and CommonLog usage",
9
+ "context_vdisk-slot-usage": "Percentage of used VDisk space relative to the first low-space warning. Can exceed 100%.",
10
+ "context_vdisk-raw-usage": "Percentage of used VDisk space relative to its fair share on the PDisk. Can exceed 100%.",
11
11
  "context_normalized-occupancy": "Internal score used for gently handling low-space cases.",
12
- "context_capacity-alert": "Named status used for gently handling low-space cases.",
12
+ "context_capacity-alert": "The named status used for the graceful low space handling.",
13
13
  "context_group-size-in-units": "Relative capacity of this group (1 = single, 2 = double, …). Affects VDisk space quota on the PDisk.",
14
14
  "context_slot-size-in-units": "Relative size of this PDisk in the cluster (1 = single, 2 = double, …). Same units as Group Size In Units."
15
15
  }
@@ -9,6 +9,7 @@ import {
9
9
  import {useTypedSelector} from '../../utils/hooks';
10
10
  import {Healthcheck} from '../Tenant/Healthcheck/Healthcheck';
11
11
  import {HealthcheckDrawer} from '../Tenant/Healthcheck/components/HealthcheckDrawer';
12
+ import {getDatabaseHealthcheckAssistantTarget} from '../Tenant/Healthcheck/utils';
12
13
 
13
14
  import i18n from './i18n';
14
15
 
@@ -184,6 +185,11 @@ export function ClusterDrawerHealthcheck({
184
185
 
185
186
  return (
186
187
  <HealthcheckDrawer
188
+ target={getDatabaseHealthcheckAssistantTarget({
189
+ database,
190
+ clusterName,
191
+ scope: 'cluster',
192
+ })}
187
193
  isDrawerVisible={Boolean(showHealthcheck) && Boolean(database)}
188
194
  onCloseDrawer={handleCloseDrawer}
189
195
  onTransitionInComplete={
@@ -48,6 +48,7 @@ export function ClusterDrawerHealthcheck({
48
48
 
49
49
  return (
50
50
  <HealthcheckDrawer
51
+ target={clusterName ? {scope: 'cluster', request: {clusterName}} : undefined}
51
52
  isDrawerVisible={isVisible && Boolean(clusterName)}
52
53
  onCloseDrawer={handleCloseDrawer}
53
54
  renderDrawerContent={renderDrawerContent}
@@ -1,6 +1,7 @@
1
1
  import {HeaderBreadcrumbs} from './HeaderBreadcrumbs';
2
2
  import {HeaderLeftControls} from './HeaderLeftControls';
3
3
  import {HeaderRightControls} from './HeaderRightControls';
4
+ import {StorageGroupLeftControls} from './StorageGroupLeftControls';
4
5
  import {b} from './constants';
5
6
  import {useHeaderBreadcrumbs} from './hooks/useHeaderBreadcrumbs';
6
7
  import {useHeaderData} from './hooks/useHeaderData';
@@ -66,18 +67,25 @@ export function Header() {
66
67
  return null;
67
68
  }
68
69
 
69
- const leftControls =
70
- database && isDatabasePage && isV2NavigationEnabled ? (
70
+ const renderLeftControls = () => {
71
+ if (page === 'storageGroup') {
72
+ return <StorageGroupLeftControls />;
73
+ }
74
+ return database && isDatabasePage && isV2NavigationEnabled ? (
71
75
  <HeaderLeftControls
72
76
  database={database}
73
77
  databaseData={databaseData}
74
78
  isDatabaseDataLoading={isDatabaseDataLoading}
75
79
  />
76
80
  ) : null;
81
+ };
77
82
 
78
83
  return (
79
84
  <header className={b()}>
80
- <HeaderBreadcrumbs breadcrumbItems={breadcrumbItems} endContent={leftControls} />
85
+ <HeaderBreadcrumbs
86
+ breadcrumbItems={breadcrumbItems}
87
+ endContent={renderLeftControls()}
88
+ />
81
89
 
82
90
  <HeaderRightControls
83
91
  clusterName={clusterName}
@@ -0,0 +1,38 @@
1
+ import {ClipboardButton, Flex} from '@gravity-ui/uikit';
2
+ import {skipToken} from '@reduxjs/toolkit/query';
3
+ import {StringParam, useQueryParams} from 'use-query-params';
4
+
5
+ import {storageApi} from '../../store/reducers/storage/storage';
6
+ import {valueIsDefined} from '../../utils';
7
+ import {useDatabaseFromQuery} from '../../utils/hooks/useDatabaseFromQuery';
8
+ import {StorageGroupStateLabel} from '../Storage/StorageGroupStateLabel';
9
+
10
+ import {b} from './constants';
11
+ import {headerKeyset} from './i18n';
12
+
13
+ export function StorageGroupLeftControls() {
14
+ const [{groupId}] = useQueryParams({groupId: StringParam});
15
+ const database = useDatabaseFromQuery();
16
+ const {currentData} = storageApi.endpoints.getStorageGroupsInfo.useQueryState(
17
+ valueIsDefined(groupId)
18
+ ? {groupId, with: 'all', fieldsRequired: 'all', database}
19
+ : skipToken,
20
+ );
21
+
22
+ if (!groupId) {
23
+ return null;
24
+ }
25
+
26
+ return (
27
+ <Flex alignItems="center" gap={2} className={b('left-controls')}>
28
+ <ClipboardButton
29
+ text={groupId}
30
+ view="flat-secondary"
31
+ size="s"
32
+ aria-label={headerKeyset('action_copy-group-id-from-breadcrumb')}
33
+ tooltipInitialText={headerKeyset('action_copy-group-id')}
34
+ />
35
+ <StorageGroupStateLabel state={currentData?.groups?.[0]?.State} size="xs" />
36
+ </Flex>
37
+ );
38
+ }
@@ -24,5 +24,7 @@
24
24
  "description_connect-to-db": "Connect to database",
25
25
 
26
26
  "title_monitoring": "Open in {{system}}",
27
- "action_copy-path": "Copy path"
27
+ "action_copy-path": "Copy path",
28
+ "action_copy-group-id": "Copy Storage Group ID",
29
+ "action_copy-group-id-from-breadcrumb": "Copy Storage Group ID from breadcrumb"
28
30
  }
@@ -4,7 +4,7 @@ import {DiskStateProgressBar} from '../../../components/DiskStateProgressBar/Dis
4
4
  import {HoverPopup} from '../../../components/HoverPopup/HoverPopup';
5
5
  import {InternalLink} from '../../../components/InternalLink';
6
6
  import {ProgressViewer} from '../../../components/ProgressViewer/ProgressViewer';
7
- import {VDiskInfo} from '../../../components/VDiskInfo/VDiskInfo';
7
+ import {VDiskPopup} from '../../../components/VDiskPopup/VDiskPopup';
8
8
  import type {YDBDefinitionListItem} from '../../../components/YDBDefinitionList/YDBDefinitionList';
9
9
  import {YDBDefinitionList} from '../../../components/YDBDefinitionList/YDBDefinitionList';
10
10
  import {useVDiskPagePath} from '../../../routes';
@@ -15,6 +15,7 @@ import type {
15
15
  SlotItem,
16
16
  SlotItemType,
17
17
  } from '../../../store/reducers/pdisk/types';
18
+ import type {NodeMetadata} from '../../../types/store/nodesList';
18
19
  import {valueIsDefined} from '../../../utils';
19
20
  import {formatBytes} from '../../../utils/bytesParsers';
20
21
  import {cn} from '../../../utils/cn';
@@ -80,6 +81,7 @@ export function PDiskSpaceDistribution({data}: PDiskSpaceDistributionProps) {
80
81
  minNonLogTotal={minNonLogTotal}
81
82
  pDiskId={PDiskId}
82
83
  nodeId={NodeId}
84
+ nodeData={{Host: data.NodeHost, DC: data.NodeDC, Rack: data.NodeRack}}
83
85
  getVDiskPagePath={getVDiskPagePath}
84
86
  key={index}
85
87
  />
@@ -110,6 +112,7 @@ interface SlotProps<T extends SlotItemType> {
110
112
 
111
113
  pDiskId?: string | number;
112
114
  nodeId?: string | number;
115
+ nodeData?: NodeMetadata;
113
116
  getVDiskPagePath?: (
114
117
  params: {nodeId: string | number | undefined; vDiskId: string | undefined},
115
118
  query?: {activeTab?: string},
@@ -138,6 +141,7 @@ function Slot<T extends SlotItemType>({
138
141
  item,
139
142
  minNonLogTotal,
140
143
  nodeId,
144
+ nodeData,
141
145
  getVDiskPagePath,
142
146
  }: SlotProps<T>) {
143
147
  const renderContent = () => {
@@ -152,7 +156,14 @@ function Slot<T extends SlotItemType>({
152
156
 
153
157
  return (
154
158
  <HoverPopup
155
- renderPopupContent={() => <VDiskInfo data={item.SlotData} withTitle />}
159
+ renderPopupContent={({onClose}) => (
160
+ <VDiskPopup
161
+ data={item.SlotData}
162
+ nodeData={nodeData}
163
+ onClose={onClose}
164
+ view="space-distribution"
165
+ />
166
+ )}
156
167
  contentClassName={b('vdisk-popup')}
157
168
  placement={['right', 'top']}
158
169
  >