ydb-embedded-ui 22.2.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 (405) 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/Graph/GravityGraph.js +9 -2
  27. package/dist/components/Graph/GravityGraph.js.map +1 -1
  28. package/dist/components/Graph/utils.d.ts +2 -1
  29. package/dist/components/Graph/utils.js +7 -0
  30. package/dist/components/Graph/utils.js.map +1 -1
  31. package/dist/components/HoverPopup/HoverPopup.d.ts +2 -1
  32. package/dist/components/HoverPopup/HoverPopup.js +49 -17
  33. package/dist/components/HoverPopup/HoverPopup.js.map +1 -1
  34. package/dist/components/HoverPopup/usePopupPriority.d.ts +4 -0
  35. package/dist/components/HoverPopup/usePopupPriority.js +30 -0
  36. package/dist/components/HoverPopup/usePopupPriority.js.map +1 -0
  37. package/dist/components/PDiskInfo/PDiskLogSize.d.ts +5 -0
  38. package/dist/components/PDiskInfo/PDiskLogSize.js +20 -0
  39. package/dist/components/PDiskInfo/PDiskLogSize.js.map +1 -0
  40. package/dist/components/PDiskInfo/PDiskLogSize.scss +12 -0
  41. package/dist/components/PDiskInfo/getPDiskDetails.d.ts +4 -0
  42. package/dist/components/PDiskInfo/getPDiskDetails.js +33 -0
  43. package/dist/components/PDiskInfo/getPDiskDetails.js.map +1 -0
  44. package/dist/components/PDiskInfo/i18n/en.json +64 -2
  45. package/dist/components/PDiskInfo/i18n/index.d.ts +1 -1
  46. package/dist/components/PDiskInfo/statuses.d.ts +7 -0
  47. package/dist/components/PDiskInfo/statuses.js +185 -0
  48. package/dist/components/PDiskInfo/statuses.js.map +1 -0
  49. package/dist/components/PDiskPopup/PDiskPopup.d.ts +4 -7
  50. package/dist/components/PDiskPopup/PDiskPopup.js +28 -99
  51. package/dist/components/PDiskPopup/PDiskPopup.js.map +1 -1
  52. package/dist/components/PDiskPopup/i18n/en.json +2 -12
  53. package/dist/components/PDiskPopup/i18n/index.d.ts +1 -1
  54. package/dist/components/PaginatedTable/rowLookup.js +30 -9
  55. package/dist/components/PaginatedTable/rowLookup.js.map +1 -1
  56. package/dist/components/StorageGroupInfo/StorageGroupInfo.d.ts +3 -3
  57. package/dist/components/StorageGroupInfo/StorageGroupInfo.js +78 -218
  58. package/dist/components/StorageGroupInfo/StorageGroupInfo.js.map +1 -1
  59. package/dist/components/StorageGroupInfo/StorageGroupInfo.scss +21 -0
  60. package/dist/components/StorageGroupInfo/i18n/en.json +1 -9
  61. package/dist/components/StorageGroupInfo/i18n/index.d.ts +1 -1
  62. package/dist/components/TableKeyboardNavigation/TableKeyboardNavigation.js +5 -1
  63. package/dist/components/TableKeyboardNavigation/TableKeyboardNavigation.js.map +1 -1
  64. package/dist/components/VDisk/VDisk.d.ts +2 -1
  65. package/dist/components/VDisk/VDisk.js +23 -32
  66. package/dist/components/VDisk/VDisk.js.map +1 -1
  67. package/dist/components/VDisk/VDiskWithDonorsStack.d.ts +1 -1
  68. package/dist/components/VDisk/VDiskWithDonorsStack.js +2 -1
  69. package/dist/components/VDisk/VDiskWithDonorsStack.js.map +1 -1
  70. package/dist/components/VDisk/getFlagStatusText.d.ts +2 -0
  71. package/dist/components/VDisk/getFlagStatusText.js +18 -0
  72. package/dist/components/VDisk/getFlagStatusText.js.map +1 -0
  73. package/dist/components/VDisk/i18n/en.json +1 -1
  74. package/dist/components/VDisk/i18n/index.d.ts +1 -1
  75. package/dist/components/VDiskInfo/getVDiskDetails.d.ts +5 -0
  76. package/dist/components/VDiskInfo/getVDiskDetails.js +29 -0
  77. package/dist/components/VDiskInfo/getVDiskDetails.js.map +1 -0
  78. package/dist/components/VDiskInfo/i18n/en.json +3 -1
  79. package/dist/components/VDiskInfo/i18n/index.d.ts +1 -1
  80. package/dist/components/VDiskPopup/VDiskPopup.d.ts +6 -8
  81. package/dist/components/VDiskPopup/VDiskPopup.js +106 -240
  82. package/dist/components/VDiskPopup/VDiskPopup.js.map +1 -1
  83. package/dist/components/VDiskPopup/VDiskPopup.scss +3 -10
  84. package/dist/components/VDiskPopup/i18n/en.json +6 -22
  85. package/dist/components/VDiskPopup/i18n/index.d.ts +1 -1
  86. package/dist/components/VDiskStatus/VDiskReplicationStatus.d.ts +8 -0
  87. package/dist/components/VDiskStatus/VDiskReplicationStatus.js +32 -0
  88. package/dist/components/VDiskStatus/VDiskReplicationStatus.js.map +1 -0
  89. package/dist/components/VDiskStatus/VDiskStatus.d.ts +16 -0
  90. package/dist/components/VDiskStatus/VDiskStatus.js +20 -0
  91. package/dist/components/VDiskStatus/VDiskStatus.js.map +1 -0
  92. package/dist/components/VDiskStatus/VDiskStatus.scss +32 -0
  93. package/dist/components/VDiskStatus/i18n/en.json +33 -0
  94. package/dist/components/VDiskStatus/i18n/index.d.ts +1 -0
  95. package/dist/components/VDiskStatus/i18n/index.js +5 -0
  96. package/dist/components/VDiskStatus/i18n/index.js.map +1 -0
  97. package/dist/components/VDiskStatus/index.d.ts +2 -0
  98. package/dist/components/VDiskStatus/index.js +3 -0
  99. package/dist/components/VDiskStatus/index.js.map +1 -0
  100. package/dist/components/VDiskStatus/statuses.d.ts +4 -0
  101. package/dist/components/VDiskStatus/statuses.js +120 -0
  102. package/dist/components/VDiskStatus/statuses.js.map +1 -0
  103. package/dist/components/capacityMetricsColumns/i18n/en.json +4 -4
  104. package/dist/containers/Authentication/Authentication.js +29 -30
  105. package/dist/containers/Authentication/Authentication.js.map +1 -1
  106. package/dist/containers/Authentication/utils.d.ts +2 -2
  107. package/dist/containers/Authentication/utils.js +1 -1
  108. package/dist/containers/Authentication/utils.js.map +1 -1
  109. package/dist/containers/Cluster/ClusterDrawerHealthcheck.js +6 -1
  110. package/dist/containers/Cluster/ClusterDrawerHealthcheck.js.map +1 -1
  111. package/dist/containers/Clusters/ClusterDrawerHealthcheck.js +1 -1
  112. package/dist/containers/Clusters/ClusterDrawerHealthcheck.js.map +1 -1
  113. package/dist/containers/Header/Header.js +8 -2
  114. package/dist/containers/Header/Header.js.map +1 -1
  115. package/dist/containers/Header/StorageGroupLeftControls.d.ts +1 -0
  116. package/dist/containers/Header/StorageGroupLeftControls.js +23 -0
  117. package/dist/containers/Header/StorageGroupLeftControls.js.map +1 -0
  118. package/dist/containers/Header/i18n/en.json +3 -1
  119. package/dist/containers/Header/i18n/index.d.ts +1 -1
  120. package/dist/containers/Operations/constants.d.ts +1 -1
  121. package/dist/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.js +4 -4
  122. package/dist/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.js.map +1 -1
  123. package/dist/containers/PDiskPage/i18n/index.d.ts +1 -1
  124. package/dist/containers/Storage/Disks/Disks.js +36 -9
  125. package/dist/containers/Storage/Disks/Disks.js.map +1 -1
  126. package/dist/containers/Storage/PDisk/PDisk.d.ts +2 -1
  127. package/dist/containers/Storage/PDisk/PDisk.js +2 -2
  128. package/dist/containers/Storage/PDisk/PDisk.js.map +1 -1
  129. package/dist/containers/Storage/PDisk/i18n/index.d.ts +1 -1
  130. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/columns.js +7 -2
  131. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/columns.js.map +1 -1
  132. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/i18n/index.d.ts +1 -1
  133. package/dist/containers/Storage/StorageExpertModePanel/components/SpaceLegend.scss +14 -82
  134. package/dist/containers/Storage/StorageExpertModePanel/i18n/index.d.ts +1 -1
  135. package/dist/containers/Storage/StorageGroupStateLabel.d.ts +4 -0
  136. package/dist/containers/Storage/StorageGroupStateLabel.js +9 -0
  137. package/dist/containers/Storage/StorageGroupStateLabel.js.map +1 -0
  138. package/dist/containers/Storage/utils/getStorageGroupStateLabel.d.ts +2 -0
  139. package/dist/containers/Storage/utils/getStorageGroupStateLabel.js +35 -0
  140. package/dist/containers/Storage/utils/getStorageGroupStateLabel.js.map +1 -0
  141. package/dist/containers/StorageGroupPage/StorageGroupPage.js +17 -12
  142. package/dist/containers/StorageGroupPage/StorageGroupPage.js.map +1 -1
  143. package/dist/containers/StorageGroupPage/StorageGroupPage.scss +9 -13
  144. package/dist/containers/StorageGroupPage/i18n/en.json +3 -1
  145. package/dist/containers/StorageGroupPage/i18n/index.d.ts +1 -1
  146. package/dist/containers/Tenant/Diagnostics/DiagnosticsPages.js +5 -1
  147. package/dist/containers/Tenant/Diagnostics/DiagnosticsPages.js.map +1 -1
  148. package/dist/containers/Tenant/Diagnostics/Overview/Overview.d.ts +2 -1
  149. package/dist/containers/Tenant/Diagnostics/Overview/Overview.js +11 -2
  150. package/dist/containers/Tenant/Diagnostics/Overview/Overview.js.map +1 -1
  151. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/ResourcePoolInfo.scss +24 -0
  152. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/ResourcePoolUsage.d.ts +8 -0
  153. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/ResourcePoolUsage.js +34 -0
  154. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/ResourcePoolUsage.js.map +1 -0
  155. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/i18n/en.json +4 -1
  156. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/i18n/index.d.ts +1 -1
  157. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/index.d.ts +1 -0
  158. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/index.js +1 -0
  159. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/index.js.map +1 -1
  160. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.d.ts +2 -1
  161. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.js +12 -3
  162. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.js.map +1 -1
  163. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.d.ts +2 -1
  164. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.js +9 -8
  165. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.js.map +1 -1
  166. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.d.ts +16 -1
  167. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.js +55 -33
  168. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.js.map +1 -1
  169. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/en.json +5 -1
  170. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/index.d.ts +1 -1
  171. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/i18n/en.json +4 -0
  172. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/i18n/index.d.ts +1 -1
  173. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo/prepareColumnTableInfo.js +4 -1
  174. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo/prepareColumnTableInfo.js.map +1 -1
  175. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo/prepareRowTableInfo.js +4 -1
  176. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo/prepareRowTableInfo.js.map +1 -1
  177. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo/prepareTTL.js +41 -3
  178. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo/prepareTTL.js.map +1 -1
  179. package/dist/containers/Tenant/Diagnostics/StreamingQueryGraph/StreamingQueryGraph.d.ts +7 -0
  180. package/dist/containers/Tenant/Diagnostics/StreamingQueryGraph/StreamingQueryGraph.js +38 -0
  181. package/dist/containers/Tenant/Diagnostics/StreamingQueryGraph/StreamingQueryGraph.js.map +1 -0
  182. package/dist/containers/Tenant/Diagnostics/StreamingQueryGraph/StreamingQueryGraph.scss +18 -0
  183. package/dist/containers/Tenant/Diagnostics/StreamingQueryGraph/i18n/en.json +5 -0
  184. package/dist/containers/Tenant/Diagnostics/StreamingQueryGraph/i18n/index.d.ts +2 -0
  185. package/dist/containers/Tenant/Diagnostics/StreamingQueryGraph/i18n/index.js +5 -0
  186. package/dist/containers/Tenant/Diagnostics/StreamingQueryGraph/i18n/index.js.map +1 -0
  187. package/dist/containers/Tenant/Diagnostics/StreamingQueryGraph/index.d.ts +1 -0
  188. package/dist/containers/Tenant/Diagnostics/StreamingQueryGraph/index.js +2 -0
  189. package/dist/containers/Tenant/Diagnostics/StreamingQueryGraph/index.js.map +1 -0
  190. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/i18n/index.d.ts +1 -1
  191. package/dist/containers/Tenant/Diagnostics/i18n/en.json +1 -0
  192. package/dist/containers/Tenant/Diagnostics/i18n/index.d.ts +1 -1
  193. package/dist/containers/Tenant/Diagnostics/tabsContent.js +2 -0
  194. package/dist/containers/Tenant/Diagnostics/tabsContent.js.map +1 -1
  195. package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.d.ts +3 -1
  196. package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.js +3 -3
  197. package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.js.map +1 -1
  198. package/dist/containers/Tenant/Query/QueryEditor/YqlEditor/YqlEditor.js +8 -1
  199. package/dist/containers/Tenant/Query/QueryEditor/YqlEditor/YqlEditor.js.map +1 -1
  200. package/dist/containers/Tenant/TenantDrawerHealthcheck.js +8 -1
  201. package/dist/containers/Tenant/TenantDrawerHealthcheck.js.map +1 -1
  202. package/dist/containers/Tenants/DatabaseDrawerHealthcheck.js +8 -1
  203. package/dist/containers/Tenants/DatabaseDrawerHealthcheck.js.map +1 -1
  204. package/dist/containers/VDiskPage/i18n/index.d.ts +1 -1
  205. package/dist/lib.d.ts +1 -1
  206. package/dist/lib.js.map +1 -1
  207. package/dist/store/configureStore.d.ts +2 -2
  208. package/dist/store/defaultStore.d.ts +1 -1
  209. package/dist/store/reducers/executeTopQueries/executeTopQueries.d.ts +7 -0
  210. package/dist/store/reducers/executeTopQueries/executeTopQueries.js +38 -0
  211. package/dist/store/reducers/executeTopQueries/executeTopQueries.js.map +1 -1
  212. package/dist/store/reducers/header/types.d.ts +1 -1
  213. package/dist/store/reducers/index.d.ts +2 -2
  214. package/dist/store/reducers/pdisk/types.d.ts +1 -0
  215. package/dist/store/reducers/pdisk/utils.js +6 -1
  216. package/dist/store/reducers/pdisk/utils.js.map +1 -1
  217. package/dist/store/reducers/query/parsers/prepareStreamingQueryPlan.d.ts +8 -0
  218. package/dist/store/reducers/query/parsers/prepareStreamingQueryPlan.js +53 -0
  219. package/dist/store/reducers/query/parsers/prepareStreamingQueryPlan.js.map +1 -0
  220. package/dist/store/reducers/storage/prepareGroupsDisks.d.ts +1 -0
  221. package/dist/store/reducers/storage/prepareGroupsDisks.js +7 -18
  222. package/dist/store/reducers/storage/prepareGroupsDisks.js.map +1 -1
  223. package/dist/store/reducers/storage/utils.js +4 -0
  224. package/dist/store/reducers/storage/utils.js.map +1 -1
  225. package/dist/store/reducers/streamingQuery/streamingQuery.d.ts +5 -1
  226. package/dist/store/reducers/streamingQuery/streamingQuery.js +36 -13
  227. package/dist/store/reducers/streamingQuery/streamingQuery.js.map +1 -1
  228. package/dist/store/reducers/tenant/constants.d.ts +1 -0
  229. package/dist/store/reducers/tenant/constants.js +1 -0
  230. package/dist/store/reducers/tenant/constants.js.map +1 -1
  231. package/dist/styles/mixins.scss +22 -0
  232. package/dist/types/api/pdisk.d.ts +4 -0
  233. package/dist/types/api/pdisk.js.map +1 -1
  234. package/dist/types/api/schema/columnEntity.d.ts +2 -1
  235. package/dist/types/api/schema/sysView.d.ts +59 -2
  236. package/dist/types/api/schema/sysView.js +53 -1
  237. package/dist/types/api/schema/sysView.js.map +1 -1
  238. package/dist/types/api/schema/table.d.ts +8 -0
  239. package/dist/types/api/schema/table.js.map +1 -1
  240. package/dist/types/api/vdisk.d.ts +8 -0
  241. package/dist/types/api/vdisk.js +7 -0
  242. package/dist/types/api/vdisk.js.map +1 -1
  243. package/dist/types/store/nodesList.d.ts +4 -2
  244. package/dist/uiFactory/types.d.ts +5 -2
  245. package/dist/utils/bytesParsers/formatBytes.d.ts +3 -1
  246. package/dist/utils/bytesParsers/formatBytes.js +12 -3
  247. package/dist/utils/bytesParsers/formatBytes.js.map +1 -1
  248. package/dist/utils/disks/constants.d.ts +1 -0
  249. package/dist/utils/disks/constants.js +4 -0
  250. package/dist/utils/disks/constants.js.map +1 -1
  251. package/dist/utils/disks/diskInfo/getDiskLocationItems.d.ts +16 -0
  252. package/dist/utils/disks/diskInfo/getDiskLocationItems.js +30 -0
  253. package/dist/utils/disks/diskInfo/getDiskLocationItems.js.map +1 -0
  254. package/dist/utils/disks/diskInfo/i18n/en.json +9 -0
  255. package/dist/utils/disks/diskInfo/i18n/index.d.ts +2 -0
  256. package/dist/utils/disks/diskInfo/i18n/index.js +4 -0
  257. package/dist/utils/disks/diskInfo/i18n/index.js.map +1 -0
  258. package/dist/utils/disks/iconCalculators.d.ts +5 -0
  259. package/dist/utils/disks/iconCalculators.js +1 -1
  260. package/dist/utils/disks/iconCalculators.js.map +1 -1
  261. package/dist/utils/disks/prepareDisks.d.ts +6 -2
  262. package/dist/utils/disks/prepareDisks.js +22 -35
  263. package/dist/utils/disks/prepareDisks.js.map +1 -1
  264. package/dist/utils/disks/types.d.ts +9 -2
  265. package/dist/utils/hooks/useNodeMetadata.d.ts +2 -0
  266. package/dist/utils/hooks/useNodeMetadata.js +15 -0
  267. package/dist/utils/hooks/useNodeMetadata.js.map +1 -0
  268. package/dist/utils/nodes.js +6 -2
  269. package/dist/utils/nodes.js.map +1 -1
  270. package/dist/utils/query.d.ts +1 -0
  271. package/dist/utils/query.js +40 -0
  272. package/dist/utils/query.js.map +1 -1
  273. package/dist/utils/schema.d.ts +6 -2
  274. package/dist/utils/schema.js +14 -4
  275. package/dist/utils/schema.js.map +1 -1
  276. package/dist/utils/storageMetrics.d.ts +2 -2
  277. package/dist/utils/storageMetrics.js +22 -10
  278. package/dist/utils/storageMetrics.js.map +1 -1
  279. package/dist/utils/timeParsers/formatDuration.d.ts +4 -1
  280. package/dist/utils/timeParsers/formatDuration.js +16 -1
  281. package/dist/utils/timeParsers/formatDuration.js.map +1 -1
  282. package/dist/utils/timeParsers/i18n/en.json +5 -1
  283. package/dist/utils/timeParsers/i18n/index.d.ts +1 -1
  284. package/dist/utils/timeParsers/i18n/ru.json +5 -1
  285. package/package.json +2 -2
  286. package/src/components/DiskCapacityInfo/DiskCapacityInfo.tsx +106 -15
  287. package/src/components/DiskPopup/DiskPopup.scss +203 -0
  288. package/src/components/DiskPopup/DiskPopup.tsx +123 -0
  289. package/src/components/DiskPopup/i18n/en.json +3 -0
  290. package/src/components/DiskPopup/i18n/index.ts +5 -0
  291. package/src/components/DiskStatus/DiskStatus.scss +59 -0
  292. package/src/components/DiskStatus/DiskStatus.tsx +149 -0
  293. package/src/components/DiskStatus/i18n/en.json +6 -0
  294. package/src/components/DiskStatus/i18n/index.ts +5 -0
  295. package/src/components/EntityStatus/EntityStatus.tsx +1 -1
  296. package/src/components/EvictVDiskButton/i18n/en.json +1 -1
  297. package/src/components/Graph/GravityGraph.tsx +9 -2
  298. package/src/components/Graph/utils.ts +9 -1
  299. package/src/components/HoverPopup/HoverPopup.tsx +67 -20
  300. package/src/components/HoverPopup/usePopupPriority.ts +39 -0
  301. package/src/components/PDiskInfo/PDiskLogSize.scss +12 -0
  302. package/src/components/PDiskInfo/PDiskLogSize.tsx +37 -0
  303. package/src/components/PDiskInfo/getPDiskDetails.tsx +37 -0
  304. package/src/components/PDiskInfo/i18n/en.json +64 -8
  305. package/src/components/PDiskInfo/statuses.ts +209 -0
  306. package/src/components/PDiskPopup/PDiskPopup.tsx +62 -147
  307. package/src/components/PDiskPopup/i18n/en.json +2 -12
  308. package/src/components/PaginatedTable/rowLookup.ts +35 -10
  309. package/src/components/StorageGroupInfo/StorageGroupInfo.scss +21 -0
  310. package/src/components/StorageGroupInfo/StorageGroupInfo.tsx +121 -260
  311. package/src/components/StorageGroupInfo/i18n/en.json +1 -9
  312. package/src/components/TableKeyboardNavigation/TableKeyboardNavigation.tsx +5 -1
  313. package/src/components/VDisk/VDisk.tsx +31 -34
  314. package/src/components/VDisk/VDiskWithDonorsStack.tsx +2 -0
  315. package/src/components/VDisk/getFlagStatusText.ts +19 -0
  316. package/src/components/VDisk/i18n/en.json +1 -1
  317. package/src/components/VDiskInfo/getVDiskDetails.tsx +41 -0
  318. package/src/components/VDiskInfo/i18n/en.json +3 -10
  319. package/src/components/VDiskPopup/VDiskPopup.scss +3 -10
  320. package/src/components/VDiskPopup/VDiskPopup.tsx +197 -421
  321. package/src/components/VDiskPopup/i18n/en.json +6 -22
  322. package/src/components/VDiskStatus/VDiskReplicationStatus.tsx +77 -0
  323. package/src/components/VDiskStatus/VDiskStatus.scss +32 -0
  324. package/src/components/VDiskStatus/VDiskStatus.tsx +38 -0
  325. package/src/components/VDiskStatus/i18n/en.json +33 -0
  326. package/src/components/VDiskStatus/i18n/index.ts +7 -0
  327. package/src/components/VDiskStatus/index.ts +7 -0
  328. package/src/components/VDiskStatus/statuses.ts +139 -0
  329. package/src/components/capacityMetricsColumns/i18n/en.json +4 -4
  330. package/src/containers/Authentication/Authentication.tsx +29 -34
  331. package/src/containers/Authentication/utils.ts +3 -3
  332. package/src/containers/Cluster/ClusterDrawerHealthcheck.tsx +6 -0
  333. package/src/containers/Clusters/ClusterDrawerHealthcheck.tsx +1 -0
  334. package/src/containers/Header/Header.tsx +11 -3
  335. package/src/containers/Header/StorageGroupLeftControls.tsx +38 -0
  336. package/src/containers/Header/i18n/en.json +3 -1
  337. package/src/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.tsx +13 -2
  338. package/src/containers/Storage/Disks/Disks.tsx +66 -12
  339. package/src/containers/Storage/PDisk/PDisk.tsx +3 -0
  340. package/src/containers/Storage/PaginatedStorageGroupsTable/columns/columns.tsx +24 -3
  341. package/src/containers/Storage/StorageExpertModePanel/components/SpaceLegend.scss +14 -82
  342. package/src/containers/Storage/StorageGroupStateLabel.tsx +22 -0
  343. package/src/containers/Storage/utils/getStorageGroupStateLabel.ts +49 -0
  344. package/src/containers/StorageGroupPage/StorageGroupPage.scss +9 -13
  345. package/src/containers/StorageGroupPage/StorageGroupPage.tsx +53 -25
  346. package/src/containers/StorageGroupPage/i18n/en.json +3 -1
  347. package/src/containers/Tenant/Diagnostics/DiagnosticsPages.ts +6 -1
  348. package/src/containers/Tenant/Diagnostics/Overview/Overview.tsx +22 -2
  349. package/src/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/ResourcePoolInfo.scss +24 -0
  350. package/src/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/ResourcePoolUsage.tsx +53 -0
  351. package/src/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/i18n/en.json +4 -1
  352. package/src/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/index.ts +1 -0
  353. package/src/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.tsx +19 -2
  354. package/src/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.tsx +11 -10
  355. package/src/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.tsx +79 -34
  356. package/src/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/en.json +5 -1
  357. package/src/containers/Tenant/Diagnostics/Overview/TableInfo/i18n/en.json +4 -0
  358. package/src/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo/prepareColumnTableInfo.tsx +11 -1
  359. package/src/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo/prepareRowTableInfo.tsx +11 -1
  360. package/src/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo/prepareTTL.ts +45 -3
  361. package/src/containers/Tenant/Diagnostics/StreamingQueryGraph/StreamingQueryGraph.scss +18 -0
  362. package/src/containers/Tenant/Diagnostics/StreamingQueryGraph/StreamingQueryGraph.tsx +79 -0
  363. package/src/containers/Tenant/Diagnostics/StreamingQueryGraph/i18n/en.json +5 -0
  364. package/src/containers/Tenant/Diagnostics/StreamingQueryGraph/i18n/index.ts +7 -0
  365. package/src/containers/Tenant/Diagnostics/StreamingQueryGraph/index.ts +1 -0
  366. package/src/containers/Tenant/Diagnostics/i18n/en.json +1 -0
  367. package/src/containers/Tenant/Diagnostics/tabsContent.tsx +4 -0
  368. package/src/containers/Tenant/Healthcheck/components/HealthcheckDrawer.tsx +5 -2
  369. package/src/containers/Tenant/Query/QueryEditor/YqlEditor/YqlEditor.tsx +8 -1
  370. package/src/containers/Tenant/TenantDrawerHealthcheck.tsx +10 -0
  371. package/src/containers/Tenants/DatabaseDrawerHealthcheck.tsx +10 -0
  372. package/src/lib.ts +1 -0
  373. package/src/store/reducers/executeTopQueries/executeTopQueries.ts +46 -0
  374. package/src/store/reducers/header/types.ts +3 -1
  375. package/src/store/reducers/pdisk/types.ts +1 -0
  376. package/src/store/reducers/pdisk/utils.ts +6 -3
  377. package/src/store/reducers/query/parsers/prepareStreamingQueryPlan.ts +74 -0
  378. package/src/store/reducers/storage/prepareGroupsDisks.ts +7 -22
  379. package/src/store/reducers/storage/utils.ts +4 -0
  380. package/src/store/reducers/streamingQuery/streamingQuery.ts +44 -19
  381. package/src/store/reducers/tenant/constants.ts +1 -0
  382. package/src/styles/mixins.scss +22 -0
  383. package/src/types/api/pdisk.ts +4 -0
  384. package/src/types/api/schema/columnEntity.ts +2 -1
  385. package/src/types/api/schema/sysView.ts +60 -37
  386. package/src/types/api/schema/table.ts +7 -0
  387. package/src/types/api/vdisk.ts +9 -0
  388. package/src/types/store/nodesList.ts +7 -7
  389. package/src/uiFactory/types.ts +9 -2
  390. package/src/utils/bytesParsers/formatBytes.ts +23 -4
  391. package/src/utils/disks/constants.ts +5 -0
  392. package/src/utils/disks/diskInfo/getDiskLocationItems.ts +50 -0
  393. package/src/utils/disks/diskInfo/i18n/en.json +9 -0
  394. package/src/utils/disks/diskInfo/i18n/index.ts +5 -0
  395. package/src/utils/disks/iconCalculators.ts +1 -1
  396. package/src/utils/disks/prepareDisks.ts +21 -47
  397. package/src/utils/disks/types.ts +10 -2
  398. package/src/utils/hooks/useNodeMetadata.ts +21 -0
  399. package/src/utils/nodes.ts +6 -1
  400. package/src/utils/query.ts +55 -0
  401. package/src/utils/schema.ts +22 -5
  402. package/src/utils/storageMetrics.ts +27 -14
  403. package/src/utils/timeParsers/formatDuration.ts +22 -1
  404. package/src/utils/timeParsers/i18n/en.json +5 -1
  405. package/src/utils/timeParsers/i18n/ru.json +5 -1
@@ -7,314 +7,179 @@ import {isNil} from 'lodash';
7
7
  import {useVDiskPagePath} from '../../routes';
8
8
  import {api} from '../../store/reducers/api';
9
9
  import {useBlobStorageCapacityMetricsEnabled} from '../../store/reducers/capabilities/hooks';
10
- import {selectNodesMap} from '../../store/reducers/nodesList';
11
- import {EFlag} from '../../types/api/enums';
12
10
  import type {TVDiskID} from '../../types/api/vdisk';
13
- import {EVDiskState} from '../../types/api/vdisk';
11
+ import type {NodeMetadata} from '../../types/store/nodesList';
12
+ import {formatBytes} from '../../utils/bytesParsers';
14
13
  import {cn} from '../../utils/cn';
15
14
  import {BRAND_BUTTON_CLASS, EMPTY_DATA_PLACEHOLDER} from '../../utils/constants';
16
- import {formatDurationSeconds, parseVdiskId} from '../../utils/dataFormatters/dataFormatters';
15
+ import {parseVdiskId} from '../../utils/dataFormatters/dataFormatters';
17
16
  import {createVDiskDeveloperUILink, useHasDeveloperUi} from '../../utils/developerUI/developerUI';
18
- import {getStateSeverity} from '../../utils/disks/calculateVDiskSeverity';
19
- import {
20
- DISK_COLOR_STATE_TO_NUMERIC_SEVERITY,
21
- NUMERIC_SEVERITY_TO_LABEL_VIEW,
22
- VDISK_LABEL_CONFIG,
23
- } from '../../utils/disks/constants';
24
17
  import {isFullVDiskData} from '../../utils/disks/helpers';
25
18
  import type {PreparedVDisk, UnavailableDonor} from '../../utils/disks/types';
26
- import {useTypedDispatch, useTypedSelector} from '../../utils/hooks';
27
- import {useDatabaseFromQuery} from '../../utils/hooks/useDatabaseFromQuery';
19
+ import {useTypedDispatch} from '../../utils/hooks';
28
20
  import {useIsViewerUser} from '../../utils/hooks/useIsUserAllowedToMakeChanges';
29
- import {bytesToGB, bytesToSpeed} from '../../utils/utils';
21
+ import {useNodeMetadata} from '../../utils/hooks/useNodeMetadata';
22
+ import {parseOptionalNonNegativeNumber} from '../../utils/utils';
23
+ import {getVDiskCapacityItems} from '../DiskCapacityInfo/DiskCapacityInfo';
30
24
  import {
31
- getVDiskCapacityInfoItems,
32
- toDefinitionListItems,
33
- } from '../DiskCapacityInfo/DiskCapacityInfo';
25
+ DiskPopup,
26
+ DiskPopupHeader,
27
+ DiskPopupLocation,
28
+ DiskPopupPanel,
29
+ DiskPopupText,
30
+ } from '../DiskPopup/DiskPopup';
34
31
  import {EvictVDiskButton, isAllVdiskParamsDefined} from '../EvictVDiskButton/EvictVDiskButton';
35
- import {InternalLink} from '../InternalLink';
36
32
  import {InternalLinkButton} from '../InternalLinkButton';
37
33
  import {LinkWithIcon} from '../LinkWithIcon/LinkWithIcon';
34
+ import {PDiskPopupContent} from '../PDiskPopup/PDiskPopup';
35
+ import {getVDiskIdentityItems, getVDiskLocationItems} from '../VDiskInfo/getVDiskDetails';
36
+ import {vDiskInfoKeyset} from '../VDiskInfo/i18n';
38
37
  import {
39
- buildPDiskFooter,
40
- preparePDiskData,
41
- preparePDiskHeaderLabels,
42
- } from '../PDiskPopup/PDiskPopup';
43
- import {StatusIcon} from '../StatusIcon/StatusIcon';
44
- import type {
45
- YDBDefinitionListHeaderLabel,
46
- YDBDefinitionListItem,
47
- } from '../YDBDefinitionList/YDBDefinitionList';
38
+ VDiskCompactionRankLabel,
39
+ VDiskDonorLabel,
40
+ VDiskFrontQueuesLabel,
41
+ VDiskReplicationStatus,
42
+ VDiskStateLabel,
43
+ } from '../VDiskStatus';
44
+ import type {YDBDefinitionListItem} from '../YDBDefinitionList/YDBDefinitionList';
48
45
  import {YDBDefinitionList} from '../YDBDefinitionList/YDBDefinitionList';
49
46
 
50
47
  import {vDiskPopupKeyset} from './i18n';
51
48
 
52
49
  import './VDiskPopup.scss';
53
50
 
54
- const b = cn('vdisk-storage-popup');
55
-
56
- const prepareUnavailableVDiskData = (data: UnavailableDonor) => {
57
- const {NodeId, PDiskId, VSlotId, StoragePoolName} = data;
58
-
59
- const vdiskData: YDBDefinitionListItem[] = [];
60
-
61
- if (StoragePoolName) {
62
- vdiskData.push({
63
- name: vDiskPopupKeyset('label_storage-pool'),
64
- content: StoragePoolName,
65
- copyText: StoragePoolName,
66
- });
67
- }
68
-
69
- vdiskData.push(
70
- {
71
- name: vDiskPopupKeyset('label_node-id'),
72
- content: NodeId ?? EMPTY_DATA_PLACEHOLDER,
73
- copyText: NodeId,
74
- },
75
- {
76
- name: vDiskPopupKeyset('label_pdisk-id'),
77
- content: PDiskId ?? EMPTY_DATA_PLACEHOLDER,
78
- copyText: PDiskId,
79
- },
80
- {
81
- name: vDiskPopupKeyset('label_vslot-id'),
82
- content: VSlotId ?? EMPTY_DATA_PLACEHOLDER,
83
- copyText: VSlotId,
84
- },
85
- );
86
-
87
- return vdiskData;
88
- };
51
+ const b = cn('ydb-vdisk-popup');
89
52
 
90
- const buildUnavailableVDiskFooter = (
53
+ function buildUnavailableVDiskFooter(
91
54
  data: UnavailableDonor,
92
- withDeveloperUILink?: boolean,
93
- ): React.ReactNode | null => {
94
- const {NodeId, PDiskId, VSlotId} = data;
95
-
96
- if (!withDeveloperUILink || isNil(NodeId) || isNil(PDiskId) || isNil(VSlotId)) {
55
+ withDeveloperUILink: boolean,
56
+ ): React.ReactNode | null {
57
+ const {NodeId, PDiskId, VDiskSlotId} = data;
58
+ if (!withDeveloperUILink || isNil(NodeId) || isNil(PDiskId) || isNil(VDiskSlotId)) {
97
59
  return null;
98
60
  }
99
-
100
61
  const vDiskInternalViewerPath = createVDiskDeveloperUILink({
101
62
  nodeId: NodeId,
102
63
  pDiskId: PDiskId,
103
- vDiskSlotId: VSlotId,
64
+ vDiskSlotId: VDiskSlotId,
104
65
  });
105
-
106
66
  return (
107
- <div className={b('links')}>
108
- <LinkWithIcon
109
- title={vDiskPopupKeyset('action_open-in-developer-ui')}
110
- url={vDiskInternalViewerPath}
111
- icon={Wrench}
112
- hideEndIcon
113
- />
114
- </div>
67
+ <LinkWithIcon
68
+ title={vDiskPopupKeyset('action_open-in-developer-ui')}
69
+ url={vDiskInternalViewerPath}
70
+ icon={Wrench}
71
+ hideEndIcon
72
+ />
115
73
  );
116
- };
117
-
118
- interface VDiskLinkProps {
119
- nodeId?: string | number;
120
- stringifiedId?: string;
121
- getVDiskLinkFn?: (data: {
122
- nodeId: string | number | undefined;
123
- vDiskId: string | undefined;
124
- }) => string | undefined;
125
74
  }
126
75
 
127
- const VDiskLink = ({nodeId, stringifiedId, getVDiskLinkFn}: VDiskLinkProps) => {
128
- if (isNil(stringifiedId)) {
129
- return <span>{EMPTY_DATA_PLACEHOLDER}</span>;
130
- }
131
-
132
- const path = getVDiskLinkFn?.({nodeId, vDiskId: stringifiedId});
133
-
134
- return path ? (
135
- <InternalLink to={path}>
136
- {vDiskPopupKeyset('label_vdisk')} {stringifiedId}
137
- </InternalLink>
138
- ) : (
139
- <span>{stringifiedId}</span>
140
- );
141
- };
142
-
143
- // eslint-disable-next-line complexity
144
- export const prepareVDiskData = (
76
+ function getRuntimeItems(
145
77
  data: PreparedVDisk,
146
- getVDiskLinkFn:
147
- | ((data: {
148
- nodeId: string | number | undefined;
149
- vDiskId: string | undefined;
150
- }) => string | undefined)
151
- | undefined,
152
- capacityMetricsEnabled = false,
153
- ) => {
154
- const {
155
- VDiskState,
156
- SatisfactionRank,
157
- DiskSpace,
158
- FrontQueues,
159
- Replicated,
160
- ReplicationProgress,
161
- ReplicationSecondsRemaining,
162
- UnsyncedVDisks,
163
- AllocatedSize,
164
- AvailableSize,
165
- ReadThroughput,
166
- WriteThroughput,
167
- StoragePoolName,
168
- Donors,
169
- DonorMode,
170
- Recipient,
171
- } = data;
172
-
173
- const vdiskData: YDBDefinitionListItem[] = [];
174
-
175
- if (StoragePoolName) {
176
- vdiskData.push({
177
- name: vDiskPopupKeyset('label_storage-pool'),
178
- content: StoragePoolName,
179
- copyText: StoragePoolName,
180
- });
181
- }
182
-
183
- // Show donors if they exist
184
- if (Donors?.length) {
185
- vdiskData.push({
186
- name: vDiskPopupKeyset('label_donor'),
78
+ withUnreadableBlobs: boolean,
79
+ ): YDBDefinitionListItem[] {
80
+ const items: YDBDefinitionListItem[] = [
81
+ {
82
+ name: vDiskPopupKeyset('label_front-queues'),
83
+ content: <VDiskFrontQueuesLabel flag={data.FrontQueues} />,
84
+ },
85
+ {
86
+ name: vDiskPopupKeyset('label_compaction'),
187
87
  content: (
188
- <Flex direction="column" gap={1}>
189
- {Donors.map((donor) => (
190
- <VDiskLink
191
- key={donor.StringifiedId}
192
- nodeId={donor.NodeId}
193
- stringifiedId={donor.StringifiedId}
194
- getVDiskLinkFn={getVDiskLinkFn}
195
- />
196
- ))}
88
+ <Flex
89
+ direction="column"
90
+ gap={1}
91
+ alignItems="flex-start"
92
+ className={b('compaction')}
93
+ >
94
+ <VDiskCompactionRankLabel
95
+ flag={data.SatisfactionRank?.FreshRank?.Flag}
96
+ rank="fresh"
97
+ />
98
+ <VDiskCompactionRankLabel
99
+ flag={data.SatisfactionRank?.LevelRank?.Flag}
100
+ rank="level"
101
+ />
197
102
  </Flex>
198
103
  ),
104
+ },
105
+ ];
106
+ for (const [name, value] of [
107
+ [vDiskPopupKeyset('label_read'), data.ReadThroughput],
108
+ [vDiskPopupKeyset('label_write'), data.WriteThroughput],
109
+ ] as const) {
110
+ const throughput = parseOptionalNonNegativeNumber(value);
111
+ items.push({
112
+ name,
113
+ content:
114
+ throughput === undefined
115
+ ? EMPTY_DATA_PLACEHOLDER
116
+ : formatBytes({
117
+ value: throughput,
118
+ size: 'mb',
119
+ fixedDecimalPlaces: 2,
120
+ withSpeedLabel: true,
121
+ }),
199
122
  });
200
123
  }
201
-
202
- if (DonorMode && Recipient) {
203
- vdiskData.push({
204
- name: vDiskPopupKeyset('label_recipient'),
205
- content: (
206
- <VDiskLink
207
- nodeId={Recipient.NodeId}
208
- stringifiedId={Recipient.StringifiedId}
209
- getVDiskLinkFn={getVDiskLinkFn}
210
- />
211
- ),
212
- });
213
- }
214
-
215
- if (SatisfactionRank && SatisfactionRank.FreshRank?.Flag !== EFlag.Green) {
216
- vdiskData.push({
217
- name: vDiskPopupKeyset('label_fresh'),
218
- content: SatisfactionRank.FreshRank?.Flag,
219
- });
220
- }
221
-
222
- if (SatisfactionRank && SatisfactionRank.LevelRank?.Flag !== EFlag.Green) {
223
- vdiskData.push({
224
- name: vDiskPopupKeyset('label_level'),
225
- content: SatisfactionRank.LevelRank?.Flag,
226
- });
227
- }
228
-
229
- if (SatisfactionRank && SatisfactionRank.FreshRank?.RankPercent) {
230
- vdiskData.push({
231
- name: vDiskPopupKeyset('label_fresh'),
232
- content: SatisfactionRank.FreshRank.RankPercent,
233
- });
234
- }
235
-
236
- if (SatisfactionRank && SatisfactionRank.LevelRank?.RankPercent) {
237
- vdiskData.push({
238
- name: vDiskPopupKeyset('label_level'),
239
- content: SatisfactionRank.LevelRank.RankPercent,
124
+ if (withUnreadableBlobs) {
125
+ items.push({
126
+ name: vDiskInfoKeyset('has-unreadable-blobs'),
127
+ content: isNil(data.HasUnreadableBlobs)
128
+ ? EMPTY_DATA_PLACEHOLDER
129
+ : vDiskInfoKeyset(data.HasUnreadableBlobs ? 'yes' : 'no'),
240
130
  });
241
131
  }
132
+ return items;
133
+ }
242
134
 
243
- if (capacityMetricsEnabled) {
244
- vdiskData.push(
245
- ...toDefinitionListItems(getVDiskCapacityInfoItems(data, {withRawUsage: false})),
246
- );
247
- } else if (DiskSpace) {
248
- vdiskData.push({
249
- name: vDiskPopupKeyset('label_space'),
250
- content: <StatusIcon mode="icons" status={DiskSpace} />,
251
- });
252
- }
135
+ function getStorageItems(
136
+ data: PreparedVDisk,
137
+ capacityMetricsEnabled: boolean,
138
+ ): YDBDefinitionListItem[] {
139
+ const items: YDBDefinitionListItem[] = [
140
+ {
141
+ name: vDiskPopupKeyset('label_storage-pool'),
142
+ content: <DiskPopupText value={data.StoragePoolName} />,
143
+ copyText: data.StoragePoolName,
144
+ },
145
+ ];
146
+ return isFullVDiskData(data)
147
+ ? [...items, ...getVDiskCapacityItems(data, {capacityMetricsEnabled})]
148
+ : items;
149
+ }
253
150
 
254
- if (FrontQueues) {
255
- vdiskData.push({
256
- name: vDiskPopupKeyset('label_front-queues'),
257
- content: <StatusIcon mode="icons" status={FrontQueues} />,
258
- });
151
+ function getLocationItems(data: PreparedVDisk, nodeData: NodeMetadata, withPDiskPanel: boolean) {
152
+ const items = getVDiskLocationItems(data, nodeData);
153
+ if (!withPDiskPanel) {
154
+ return items;
259
155
  }
156
+ return items.filter(({id}) => id !== 'pdisk-id' && id !== 'pdisk-path');
157
+ }
260
158
 
261
- if (Replicated === false && VDiskState === EVDiskState.OK && !DonorMode) {
262
- vdiskData.push({name: vDiskPopupKeyset('label_replicated'), content: 'NO'});
263
-
264
- // Only show replication progress and time remaining when disk is not replicated and state is OK
265
- if (!isNil(ReplicationProgress) && !isNaN(Number(ReplicationProgress))) {
266
- const progressPercent = Math.round(ReplicationProgress * 100);
267
- vdiskData.push({
268
- name: vDiskPopupKeyset('label_progress'),
269
- content: `${progressPercent}%`,
270
- });
271
- }
272
-
273
- if (!isNil(ReplicationSecondsRemaining)) {
274
- const timeRemaining = formatDurationSeconds(ReplicationSecondsRemaining);
275
- if (timeRemaining) {
276
- vdiskData.push({
277
- name: vDiskPopupKeyset('label_remaining'),
278
- content: timeRemaining,
279
- });
159
+ function DiskHeader({
160
+ data = {},
161
+ donorMode,
162
+ withPDiskType = true,
163
+ }: {
164
+ data?: PreparedVDisk;
165
+ donorMode?: boolean;
166
+ withPDiskType?: boolean;
167
+ }) {
168
+ return (
169
+ <DiskPopupHeader
170
+ title={vDiskPopupKeyset('label_vdisk')}
171
+ id={data.StringifiedId}
172
+ type={withPDiskType ? (data.PDiskType ?? data.PDisk?.Type) : undefined}
173
+ statuses={
174
+ <React.Fragment>
175
+ <VDiskStateLabel state={data.VDiskState} size="xs" />
176
+ <VDiskReplicationStatus data={data} size="xs" />
177
+ <VDiskDonorLabel donorMode={donorMode} size="xs" />
178
+ </React.Fragment>
280
179
  }
281
- }
282
- }
283
-
284
- if (UnsyncedVDisks) {
285
- vdiskData.push({name: vDiskPopupKeyset('label_unsync-vdisks'), content: UnsyncedVDisks});
286
- }
287
-
288
- if (!capacityMetricsEnabled && Number(AllocatedSize)) {
289
- vdiskData.push({
290
- name: vDiskPopupKeyset('label_allocated'),
291
- content: bytesToGB(AllocatedSize),
292
- });
293
- }
294
-
295
- if (!capacityMetricsEnabled && Number(AvailableSize)) {
296
- vdiskData.push({
297
- name: vDiskPopupKeyset('label_available'),
298
- content: bytesToGB(AvailableSize),
299
- });
300
- }
301
-
302
- if (Number(ReadThroughput)) {
303
- vdiskData.push({
304
- name: vDiskPopupKeyset('label_read'),
305
- content: bytesToSpeed(ReadThroughput),
306
- });
307
- }
308
-
309
- if (Number(WriteThroughput)) {
310
- vdiskData.push({
311
- name: vDiskPopupKeyset('label_write'),
312
- content: bytesToSpeed(WriteThroughput),
313
- });
314
- }
315
-
316
- return vdiskData;
317
- };
180
+ />
181
+ );
182
+ }
318
183
 
319
184
  /**
320
185
  * Resolve VDiskId from PreparedVDisk data.
@@ -329,44 +194,32 @@ const resolveVDiskId = (data: PreparedVDisk): Required<TVDiskID> | undefined =>
329
194
  return isAllVdiskParamsDefined(parsed) ? parsed : undefined;
330
195
  };
331
196
 
332
- const buildVDiskFooter = (
197
+ function buildVDiskFooter(
333
198
  data: PreparedVDisk,
334
- withDeveloperUILink?: boolean,
335
- getVDiskLinkFn?: (data: {
336
- nodeId: string | number;
337
- vDiskId: string | undefined;
338
- }) => string | undefined,
339
- onSuccess?: () => void,
340
- ): React.ReactNode | null => {
199
+ withDeveloperUILink: boolean,
200
+ getVDiskLinkFn: ReturnType<typeof useVDiskPagePath>,
201
+ onSuccess: VoidFunction,
202
+ withActions: boolean,
203
+ ): React.ReactNode | null {
341
204
  const {NodeId, PDiskId, VDiskSlotId, StringifiedId, DonorMode} = data;
342
-
343
205
  const vDiskInternalViewerPath =
344
- withDeveloperUILink && !isNil(VDiskSlotId) && !isNil(NodeId) && !isNil(PDiskId)
206
+ withDeveloperUILink && !isNil(NodeId) && !isNil(PDiskId) && !isNil(VDiskSlotId)
345
207
  ? createVDiskDeveloperUILink({
346
208
  nodeId: NodeId,
347
209
  pDiskId: PDiskId,
348
210
  vDiskSlotId: VDiskSlotId,
349
211
  })
350
212
  : undefined;
351
-
352
213
  const vDiskPagePath =
353
- withDeveloperUILink && !isNil(NodeId) && !isNil(StringifiedId)
354
- ? getVDiskLinkFn?.({
355
- nodeId: NodeId,
356
- vDiskId: StringifiedId,
357
- })
214
+ withActions && withDeveloperUILink && !isNil(NodeId) && StringifiedId
215
+ ? getVDiskLinkFn({nodeId: NodeId, vDiskId: StringifiedId})
358
216
  : undefined;
359
-
360
- const hasLinks = vDiskPagePath || vDiskInternalViewerPath;
361
-
362
- const resolvedVDiskId = resolveVDiskId(data);
363
-
364
- if (!hasLinks && !resolvedVDiskId) {
217
+ const resolvedVDiskId = withActions ? resolveVDiskId(data) : undefined;
218
+ if (!vDiskInternalViewerPath && !vDiskPagePath && !resolvedVDiskId) {
365
219
  return null;
366
220
  }
367
-
368
221
  return (
369
- <Flex direction="column" gap={5}>
222
+ <React.Fragment>
370
223
  {vDiskInternalViewerPath && (
371
224
  <LinkWithIcon
372
225
  title={vDiskPopupKeyset('action_open-in-developer-ui')}
@@ -376,7 +229,7 @@ const buildVDiskFooter = (
376
229
  />
377
230
  )}
378
231
  {(vDiskPagePath || resolvedVDiskId) && (
379
- <Flex wrap="wrap" gap={2}>
232
+ <Flex gap={2} wrap="wrap" className={b('actions')}>
380
233
  {vDiskPagePath && (
381
234
  <InternalLinkButton
382
235
  href={vDiskPagePath}
@@ -396,154 +249,77 @@ const buildVDiskFooter = (
396
249
  )}
397
250
  </Flex>
398
251
  )}
399
- </Flex>
252
+ </React.Fragment>
400
253
  );
401
- };
402
-
403
- const prepareHeaderLabels = (data: PreparedVDisk): YDBDefinitionListHeaderLabel[] => {
404
- const labels: YDBDefinitionListHeaderLabel[] = [];
405
-
406
- const {VDiskState, DonorMode, Severity} = data;
407
-
408
- const isReplicatingColor = Severity === DISK_COLOR_STATE_TO_NUMERIC_SEVERITY.Blue;
409
-
410
- if (DonorMode) {
411
- const donorConfig = VDISK_LABEL_CONFIG.donor;
412
-
413
- labels.push({
414
- id: 'donor',
415
- value: vDiskPopupKeyset('label_donor'),
416
- theme: donorConfig.theme,
417
- icon: donorConfig.icon,
418
- });
419
- } else if (isReplicatingColor) {
420
- const replicaConfig = VDISK_LABEL_CONFIG.replica;
421
-
422
- labels.push({
423
- id: 'replication',
424
- value: vDiskPopupKeyset('label_replication'),
425
- theme: replicaConfig.theme,
426
- icon: replicaConfig.icon,
427
- });
428
- }
429
-
430
- const severity = getStateSeverity(VDiskState);
431
-
432
- const {theme: stateTheme, icon: stateIcon} = NUMERIC_SEVERITY_TO_LABEL_VIEW[severity];
433
-
434
- const value = VDiskState ?? vDiskPopupKeyset('context_not-available');
435
-
436
- labels.push({
437
- id: 'state',
438
- value,
439
- theme: stateTheme,
440
- icon: stateIcon,
441
- });
442
-
443
- return labels;
444
- };
254
+ }
445
255
 
446
256
  interface VDiskPopupProps {
447
- data: PreparedVDisk | UnavailableDonor;
257
+ data: PreparedVDisk;
258
+ nodeData?: NodeMetadata;
448
259
  onClose?: VoidFunction;
260
+ view?: 'default' | 'space-distribution';
449
261
  }
450
262
 
451
- export const VDiskPopup = ({data, onClose}: VDiskPopupProps) => {
263
+ export function VDiskPopup({
264
+ data,
265
+ nodeData: parentNodeData,
266
+ onClose,
267
+ view = 'default',
268
+ }: VDiskPopupProps) {
452
269
  const dispatch = useTypedDispatch();
453
- const isFullData = isFullVDiskData(data);
270
+ const nodeData = useNodeMetadata(data.NodeId, parentNodeData);
454
271
  const isViewerUser = useIsViewerUser();
455
272
  const capacityMetricsEnabled = useBlobStorageCapacityMetricsEnabled();
456
-
457
273
  const hasDeveloperUi = useHasDeveloperUi();
458
274
  const getVDiskLink = useVDiskPagePath();
459
-
460
- const database = useDatabaseFromQuery();
461
-
462
- const vdiskInfo = React.useMemo(
463
- () =>
464
- isFullData
465
- ? prepareVDiskData(data, getVDiskLink, capacityMetricsEnabled)
466
- : prepareUnavailableVDiskData(data),
467
- [data, isFullData, getVDiskLink, capacityMetricsEnabled],
468
- );
469
-
470
- const handleAfterEvictVDisk = React.useCallback(() => {
471
- // Use StringifiedId directly — it matches the cache key used by getVDiskData
472
- const vDiskId = isFullData ? data.StringifiedId : undefined;
275
+ const fullData = isFullVDiskData(data) ? data : undefined;
276
+ const vdiskId = fullData?.StringifiedId;
277
+ const handleAfterEvictVDisk = () => {
473
278
  dispatch(
474
279
  api.util.invalidateTags([
475
280
  'TableData',
476
281
  'StorageData',
477
- {
478
- type: 'VDiskData',
479
- id: vDiskId,
480
- },
282
+ 'PDiskData',
283
+ {type: 'VDiskData', id: vdiskId},
481
284
  ]),
482
285
  );
483
286
  onClose?.();
484
- }, [dispatch, data, isFullData, onClose]);
485
-
486
- const vdiskHeaderLabels: YDBDefinitionListHeaderLabel[] = React.useMemo(
487
- () => (isFullData ? prepareHeaderLabels(data) : []),
488
- [data, isFullData],
489
- );
490
-
491
- const vdiskFooter = React.useMemo(
492
- () =>
493
- isFullData
494
- ? buildVDiskFooter(data, hasDeveloperUi, getVDiskLink, handleAfterEvictVDisk)
495
- : buildUnavailableVDiskFooter(data, hasDeveloperUi),
496
- [data, isFullData, hasDeveloperUi, getVDiskLink, handleAfterEvictVDisk],
497
- );
498
-
499
- const nodesMap = useTypedSelector((state) => selectNodesMap(state, database));
500
- const nodeData = isNil(data.NodeId) ? undefined : nodesMap?.get(data.NodeId);
501
- const pdiskInfo = React.useMemo(
502
- () =>
503
- isFullData &&
504
- data.PDisk &&
505
- preparePDiskData(data.PDisk, nodeData, capacityMetricsEnabled),
506
- [data, nodeData, isFullData, capacityMetricsEnabled],
507
- );
508
- const pdiskHeaderLabels = React.useMemo(
509
- () => (isFullData && data.PDisk ? preparePDiskHeaderLabels(data.PDisk) : []),
510
- [data, isFullData],
511
- );
512
-
513
- const pdiskFooter = React.useMemo(
514
- () => (isFullData && data.PDisk ? buildPDiskFooter(data.PDisk, hasDeveloperUi) : null),
515
- [data, isFullData, hasDeveloperUi],
516
- );
517
-
518
- const vdiskId = isFullData ? data.StringifiedId : undefined;
519
- const pdiskId = isFullData ? data.PDisk?.StringifiedId : undefined;
520
- const nameMaxWidth = isFullData && capacityMetricsEnabled ? 220 : 100;
521
-
287
+ };
288
+ const isSpaceDistribution = view === 'space-distribution';
289
+ const runtimeItems = fullData ? getRuntimeItems(fullData, isSpaceDistribution) : [];
290
+ const identityItems = isSpaceDistribution ? getVDiskIdentityItems(fullData) : [];
291
+ const storageItems = getStorageItems(data, capacityMetricsEnabled);
292
+ const pdisk = !isSpaceDistribution && isViewerUser ? fullData?.PDisk : undefined;
293
+ const vdiskFooter = isFullVDiskData(data)
294
+ ? buildVDiskFooter(
295
+ data,
296
+ hasDeveloperUi,
297
+ getVDiskLink,
298
+ handleAfterEvictVDisk,
299
+ !isSpaceDistribution,
300
+ )
301
+ : buildUnavailableVDiskFooter(data, hasDeveloperUi);
302
+ const locationItems = getLocationItems(data, nodeData, Boolean(pdisk));
522
303
  return (
523
- <div className={b()}>
524
- <YDBDefinitionList
525
- compact
526
- title="VDisk"
527
- titleSuffix={{title: vdiskId ?? EMPTY_DATA_PLACEHOLDER, copyText: vdiskId}}
528
- items={vdiskInfo}
529
- headerLabels={vdiskHeaderLabels}
530
- nameMaxWidth={nameMaxWidth}
531
- footer={vdiskFooter}
532
- />
533
- {pdiskInfo && isViewerUser && (
534
- <React.Fragment>
535
- <Divider className={b('custom-divider')} />
536
- <YDBDefinitionList
537
- compact
538
- title="PDisk"
539
- titleSuffix={{title: pdiskId ?? EMPTY_DATA_PLACEHOLDER, copyText: pdiskId}}
540
- items={pdiskInfo}
541
- headerLabels={pdiskHeaderLabels}
542
- footer={pdiskFooter}
543
- nameMaxWidth={nameMaxWidth}
544
- />
545
- </React.Fragment>
546
- )}
547
- </div>
304
+ <DiskPopup combined={Boolean(pdisk)} className={b(null, 'vdisk-storage-popup')}>
305
+ {pdisk && <PDiskPopupContent data={pdisk} nodeData={nodeData} />}
306
+ <DiskPopupPanel footer={vdiskFooter}>
307
+ <DiskHeader data={fullData} donorMode={data.DonorMode} withPDiskType={!pdisk} />
308
+ <DiskPopupLocation items={locationItems} />
309
+ {runtimeItems.length > 0 && (
310
+ <YDBDefinitionList items={runtimeItems} nameMaxWidth={150} />
311
+ )}
312
+ {runtimeItems.length > 0 && storageItems.length > 0 && <Divider />}
313
+ {storageItems.length > 0 && (
314
+ <YDBDefinitionList items={storageItems} nameMaxWidth={150} />
315
+ )}
316
+ {identityItems.length > 0 && (
317
+ <React.Fragment>
318
+ <Divider />
319
+ <YDBDefinitionList items={identityItems} nameMaxWidth={150} />
320
+ </React.Fragment>
321
+ )}
322
+ </DiskPopupPanel>
323
+ </DiskPopup>
548
324
  );
549
- };
325
+ }