ydb-embedded-ui 22.3.0 → 22.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. package/dist/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.d.ts +3 -2
  2. package/dist/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.js +19 -4
  3. package/dist/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.js.map +1 -1
  4. package/dist/components/CopyableValue/CopyableValue.d.ts +10 -0
  5. package/dist/components/CopyableValue/CopyableValue.js +10 -0
  6. package/dist/components/CopyableValue/CopyableValue.js.map +1 -0
  7. package/dist/components/CopyableValue/CopyableValue.scss +16 -0
  8. package/dist/components/CopyableValue/i18n/en.json +3 -0
  9. package/dist/components/CopyableValue/i18n/index.d.ts +2 -0
  10. package/dist/components/CopyableValue/i18n/index.js +6 -0
  11. package/dist/components/CopyableValue/i18n/index.js.map +1 -0
  12. package/dist/components/CriticalActionDialog/CriticalActionDialog.d.ts +2 -1
  13. package/dist/components/CriticalActionDialog/CriticalActionDialog.js +2 -1
  14. package/dist/components/CriticalActionDialog/CriticalActionDialog.js.map +1 -1
  15. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.d.ts +8 -19
  16. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.js +68 -92
  17. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.js.map +1 -1
  18. package/dist/components/DiskCapacityInfo/i18n/en.json +0 -1
  19. package/dist/components/DiskCapacityInfo/i18n/index.d.ts +1 -1
  20. package/dist/components/DiskPopup/DiskPopup.d.ts +25 -0
  21. package/dist/components/DiskPopup/DiskPopup.js +44 -0
  22. package/dist/components/DiskPopup/DiskPopup.js.map +1 -0
  23. package/dist/components/DiskPopup/DiskPopup.scss +203 -0
  24. package/dist/components/DiskPopup/i18n/en.json +3 -0
  25. package/dist/components/DiskPopup/i18n/index.d.ts +2 -0
  26. package/dist/components/DiskPopup/i18n/index.js +4 -0
  27. package/dist/components/DiskPopup/i18n/index.js.map +1 -0
  28. package/dist/components/DiskStatus/DiskStatus.d.ts +31 -0
  29. package/dist/components/DiskStatus/DiskStatus.js +61 -0
  30. package/dist/components/DiskStatus/DiskStatus.js.map +1 -0
  31. package/dist/components/DiskStatus/DiskStatus.scss +59 -0
  32. package/dist/components/DiskStatus/i18n/en.json +6 -0
  33. package/dist/components/DiskStatus/i18n/index.d.ts +2 -0
  34. package/dist/components/DiskStatus/i18n/index.js +4 -0
  35. package/dist/components/DiskStatus/i18n/index.js.map +1 -0
  36. package/dist/components/EntityStatus/EntityStatus.d.ts +19 -6
  37. package/dist/components/EntityStatus/EntityStatus.js +6 -2
  38. package/dist/components/EntityStatus/EntityStatus.js.map +1 -1
  39. package/dist/components/EntityStatus/EntityStatus.scss +5 -0
  40. package/dist/components/EvictVDiskButton/EvictVDiskButton.d.ts +5 -2
  41. package/dist/components/EvictVDiskButton/EvictVDiskButton.js +3 -2
  42. package/dist/components/EvictVDiskButton/EvictVDiskButton.js.map +1 -1
  43. package/dist/components/EvictVDiskButton/i18n/en.json +2 -2
  44. package/dist/components/FullNodeViewer/FullNodeViewer.js +4 -7
  45. package/dist/components/FullNodeViewer/FullNodeViewer.js.map +1 -1
  46. package/dist/components/FullNodeViewer/i18n/index.d.ts +1 -1
  47. package/dist/components/HoverPopup/HoverPopup.d.ts +3 -1
  48. package/dist/components/HoverPopup/HoverPopup.js +131 -28
  49. package/dist/components/HoverPopup/HoverPopup.js.map +1 -1
  50. package/dist/components/HoverPopup/usePopupPriority.d.ts +4 -0
  51. package/dist/components/HoverPopup/usePopupPriority.js +30 -0
  52. package/dist/components/HoverPopup/usePopupPriority.js.map +1 -0
  53. package/dist/components/MemoryViewer/MemoryViewer.d.ts +3 -1
  54. package/dist/components/MemoryViewer/MemoryViewer.js +25 -16
  55. package/dist/components/MemoryViewer/MemoryViewer.js.map +1 -1
  56. package/dist/components/MemoryViewer/i18n/en.json +4 -3
  57. package/dist/components/MemoryViewer/i18n/index.d.ts +1 -1
  58. package/dist/components/MemoryViewer/utils.d.ts +4 -2
  59. package/dist/components/MemoryViewer/utils.js +11 -11
  60. package/dist/components/MemoryViewer/utils.js.map +1 -1
  61. package/dist/components/PDiskInfo/PDiskInfo.d.ts +4 -9
  62. package/dist/components/PDiskInfo/PDiskInfo.js +32 -144
  63. package/dist/components/PDiskInfo/PDiskInfo.js.map +1 -1
  64. package/dist/components/PDiskInfo/PDiskInfo.scss +15 -0
  65. package/dist/components/PDiskInfo/PDiskLogSize.d.ts +5 -0
  66. package/dist/components/PDiskInfo/PDiskLogSize.js +20 -0
  67. package/dist/components/PDiskInfo/PDiskLogSize.js.map +1 -0
  68. package/dist/components/PDiskInfo/PDiskLogSize.scss +12 -0
  69. package/dist/components/PDiskInfo/getPDiskDetails.d.ts +4 -0
  70. package/dist/components/PDiskInfo/getPDiskDetails.js +33 -0
  71. package/dist/components/PDiskInfo/getPDiskDetails.js.map +1 -0
  72. package/dist/components/PDiskInfo/i18n/en.json +69 -4
  73. package/dist/components/PDiskInfo/i18n/index.d.ts +1 -1
  74. package/dist/components/PDiskInfo/statuses.d.ts +7 -0
  75. package/dist/components/PDiskInfo/statuses.js +194 -0
  76. package/dist/components/PDiskInfo/statuses.js.map +1 -0
  77. package/dist/components/PDiskPopup/PDiskPopup.d.ts +4 -7
  78. package/dist/components/PDiskPopup/PDiskPopup.js +28 -99
  79. package/dist/components/PDiskPopup/PDiskPopup.js.map +1 -1
  80. package/dist/components/PDiskPopup/i18n/en.json +2 -12
  81. package/dist/components/PDiskPopup/i18n/index.d.ts +1 -1
  82. package/dist/components/Search/Search.js +3 -1
  83. package/dist/components/Search/Search.js.map +1 -1
  84. package/dist/components/StorageGroupInfo/StorageGroupInfo.d.ts +3 -3
  85. package/dist/components/StorageGroupInfo/StorageGroupInfo.js +73 -218
  86. package/dist/components/StorageGroupInfo/StorageGroupInfo.js.map +1 -1
  87. package/dist/components/StorageGroupInfo/StorageGroupInfo.scss +21 -0
  88. package/dist/components/StorageGroupInfo/i18n/en.json +1 -9
  89. package/dist/components/StorageGroupInfo/i18n/index.d.ts +1 -1
  90. package/dist/components/TenantNameWrapper/i18n/index.d.ts +1 -1
  91. package/dist/components/VDisk/VDisk.d.ts +2 -1
  92. package/dist/components/VDisk/VDisk.js +24 -33
  93. package/dist/components/VDisk/VDisk.js.map +1 -1
  94. package/dist/components/VDisk/VDiskWithDonorsStack.d.ts +1 -1
  95. package/dist/components/VDisk/VDiskWithDonorsStack.js +2 -1
  96. package/dist/components/VDisk/VDiskWithDonorsStack.js.map +1 -1
  97. package/dist/components/VDisk/getFlagStatusText.d.ts +2 -0
  98. package/dist/components/VDisk/getFlagStatusText.js +18 -0
  99. package/dist/components/VDisk/getFlagStatusText.js.map +1 -0
  100. package/dist/components/VDisk/i18n/en.json +1 -1
  101. package/dist/components/VDisk/i18n/index.d.ts +1 -1
  102. package/dist/components/VDiskInfo/VDiskInfo.d.ts +3 -7
  103. package/dist/components/VDiskInfo/VDiskInfo.js +57 -235
  104. package/dist/components/VDiskInfo/VDiskInfo.js.map +1 -1
  105. package/dist/components/VDiskInfo/VDiskInfo.scss +19 -3
  106. package/dist/components/VDiskInfo/getVDiskDetails.d.ts +11 -0
  107. package/dist/components/VDiskInfo/getVDiskDetails.js +42 -0
  108. package/dist/components/VDiskInfo/getVDiskDetails.js.map +1 -0
  109. package/dist/components/VDiskInfo/i18n/en.json +5 -12
  110. package/dist/components/VDiskInfo/i18n/index.d.ts +1 -1
  111. package/dist/components/VDiskPopup/VDiskPopup.d.ts +7 -8
  112. package/dist/components/VDiskPopup/VDiskPopup.js +91 -241
  113. package/dist/components/VDiskPopup/VDiskPopup.js.map +1 -1
  114. package/dist/components/VDiskPopup/VDiskPopup.scss +3 -10
  115. package/dist/components/VDiskPopup/i18n/en.json +4 -22
  116. package/dist/components/VDiskPopup/i18n/index.d.ts +1 -1
  117. package/dist/components/VDiskStatus/VDiskReplicationStatus.d.ts +8 -0
  118. package/dist/components/VDiskStatus/VDiskReplicationStatus.js +32 -0
  119. package/dist/components/VDiskStatus/VDiskReplicationStatus.js.map +1 -0
  120. package/dist/components/VDiskStatus/VDiskStatus.d.ts +16 -0
  121. package/dist/components/VDiskStatus/VDiskStatus.js +20 -0
  122. package/dist/components/VDiskStatus/VDiskStatus.js.map +1 -0
  123. package/dist/components/VDiskStatus/VDiskStatus.scss +36 -0
  124. package/dist/components/VDiskStatus/i18n/en.json +33 -0
  125. package/dist/components/VDiskStatus/i18n/index.d.ts +1 -0
  126. package/dist/components/VDiskStatus/i18n/index.js +5 -0
  127. package/dist/components/VDiskStatus/i18n/index.js.map +1 -0
  128. package/dist/components/VDiskStatus/index.d.ts +2 -0
  129. package/dist/components/VDiskStatus/index.js +3 -0
  130. package/dist/components/VDiskStatus/index.js.map +1 -0
  131. package/dist/components/VDiskStatus/statuses.d.ts +4 -0
  132. package/dist/components/VDiskStatus/statuses.js +120 -0
  133. package/dist/components/VDiskStatus/statuses.js.map +1 -0
  134. package/dist/components/capacityMetricsColumns/i18n/en.json +4 -4
  135. package/dist/components/nodesColumns/columns.d.ts +1 -0
  136. package/dist/components/nodesColumns/columns.js +13 -6
  137. package/dist/components/nodesColumns/columns.js.map +1 -1
  138. package/dist/containers/Cluster/ClusterDrawerHealthcheck.js +6 -1
  139. package/dist/containers/Cluster/ClusterDrawerHealthcheck.js.map +1 -1
  140. package/dist/containers/Clusters/ClusterDrawerHealthcheck.js +1 -1
  141. package/dist/containers/Clusters/ClusterDrawerHealthcheck.js.map +1 -1
  142. package/dist/containers/Clusters/Clusters.js +35 -6
  143. package/dist/containers/Clusters/Clusters.js.map +1 -1
  144. package/dist/containers/Clusters/Clusters.scss +24 -6
  145. package/dist/containers/Clusters/columns.js +9 -4
  146. package/dist/containers/Clusters/columns.js.map +1 -1
  147. package/dist/containers/Clusters/i18n/en.json +6 -0
  148. package/dist/containers/Clusters/i18n/index.d.ts +1 -1
  149. package/dist/containers/Header/Header.js +16 -2
  150. package/dist/containers/Header/Header.js.map +1 -1
  151. package/dist/containers/Header/HeaderLeftControls.js +3 -1
  152. package/dist/containers/Header/HeaderLeftControls.js.map +1 -1
  153. package/dist/containers/Header/PDiskLeftControls.d.ts +1 -0
  154. package/dist/containers/Header/PDiskLeftControls.js +24 -0
  155. package/dist/containers/Header/PDiskLeftControls.js.map +1 -0
  156. package/dist/containers/Header/StorageGroupLeftControls.d.ts +1 -0
  157. package/dist/containers/Header/StorageGroupLeftControls.js +23 -0
  158. package/dist/containers/Header/StorageGroupLeftControls.js.map +1 -0
  159. package/dist/containers/Header/VDiskLeftControls.d.ts +1 -0
  160. package/dist/containers/Header/VDiskLeftControls.js +23 -0
  161. package/dist/containers/Header/VDiskLeftControls.js.map +1 -0
  162. package/dist/containers/Header/breadcrumbs.js +5 -2
  163. package/dist/containers/Header/breadcrumbs.js.map +1 -1
  164. package/dist/containers/Header/i18n/en.json +6 -1
  165. package/dist/containers/Header/i18n/index.d.ts +1 -1
  166. package/dist/containers/Nodes/NodesControls/NodesControls.js +1 -1
  167. package/dist/containers/Nodes/NodesControls/NodesControls.js.map +1 -1
  168. package/dist/containers/Nodes/PaginatedNodes/GroupedNodesComponent.js +5 -3
  169. package/dist/containers/Nodes/PaginatedNodes/GroupedNodesComponent.js.map +1 -1
  170. package/dist/containers/Nodes/PaginatedNodes/NodesComponent.js +4 -2
  171. package/dist/containers/Nodes/PaginatedNodes/NodesComponent.js.map +1 -1
  172. package/dist/containers/Nodes/useDebouncedSearch.d.ts +2 -0
  173. package/dist/containers/Nodes/useDebouncedSearch.js +11 -0
  174. package/dist/containers/Nodes/useDebouncedSearch.js.map +1 -0
  175. package/dist/containers/Operations/constants.d.ts +1 -1
  176. package/dist/containers/PDiskPage/PDiskPage.js +30 -31
  177. package/dist/containers/PDiskPage/PDiskPage.js.map +1 -1
  178. package/dist/containers/PDiskPage/PDiskPage.scss +22 -11
  179. package/dist/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.js +7 -7
  180. package/dist/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.js.map +1 -1
  181. package/dist/containers/PDiskPage/PDiskStorageDetails.d.ts +6 -0
  182. package/dist/containers/PDiskPage/PDiskStorageDetails.js +28 -0
  183. package/dist/containers/PDiskPage/PDiskStorageDetails.js.map +1 -0
  184. package/dist/containers/PDiskPage/PDiskStorageDetails.scss +51 -0
  185. package/dist/containers/PDiskPage/i18n/en.json +2 -0
  186. package/dist/containers/PDiskPage/i18n/index.d.ts +1 -1
  187. package/dist/containers/Storage/Disks/Disks.js +36 -9
  188. package/dist/containers/Storage/Disks/Disks.js.map +1 -1
  189. package/dist/containers/Storage/PDisk/PDisk.d.ts +2 -1
  190. package/dist/containers/Storage/PDisk/PDisk.js +2 -2
  191. package/dist/containers/Storage/PDisk/PDisk.js.map +1 -1
  192. package/dist/containers/Storage/PDisk/i18n/index.d.ts +1 -1
  193. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/columns.js +7 -2
  194. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/columns.js.map +1 -1
  195. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/i18n/index.d.ts +1 -1
  196. package/dist/containers/Storage/StorageExpertModePanel/components/SpaceLegend.scss +14 -82
  197. package/dist/containers/Storage/StorageExpertModePanel/constants.d.ts +1 -1
  198. package/dist/containers/Storage/StorageExpertModePanel/i18n/index.d.ts +1 -1
  199. package/dist/containers/Storage/StorageGroupStateLabel.d.ts +4 -0
  200. package/dist/containers/Storage/StorageGroupStateLabel.js +9 -0
  201. package/dist/containers/Storage/StorageGroupStateLabel.js.map +1 -0
  202. package/dist/containers/Storage/useStorageQueryParams.d.ts +4 -4
  203. package/dist/containers/Storage/utils/getStorageGroupStateLabel.d.ts +2 -0
  204. package/dist/containers/Storage/utils/getStorageGroupStateLabel.js +35 -0
  205. package/dist/containers/Storage/utils/getStorageGroupStateLabel.js.map +1 -0
  206. package/dist/containers/StorageGroupPage/StorageGroupPage.js +20 -13
  207. package/dist/containers/StorageGroupPage/StorageGroupPage.js.map +1 -1
  208. package/dist/containers/StorageGroupPage/StorageGroupPage.scss +18 -12
  209. package/dist/containers/StorageGroupPage/i18n/en.json +2 -1
  210. package/dist/containers/StorageGroupPage/i18n/index.d.ts +1 -1
  211. package/dist/containers/Tenant/Diagnostics/Overview/Overview.d.ts +2 -1
  212. package/dist/containers/Tenant/Diagnostics/Overview/Overview.js +4 -1
  213. package/dist/containers/Tenant/Diagnostics/Overview/Overview.js.map +1 -1
  214. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.d.ts +2 -1
  215. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.js +11 -2
  216. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.js.map +1 -1
  217. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.d.ts +2 -1
  218. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.js +9 -8
  219. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.js.map +1 -1
  220. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.d.ts +16 -1
  221. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.js +56 -19
  222. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.js.map +1 -1
  223. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/en.json +5 -1
  224. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/index.d.ts +1 -1
  225. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/ManagePartitioningDialog/i18n/index.d.ts +1 -1
  226. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.js +5 -12
  227. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.js.map +1 -1
  228. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/i18n/index.d.ts +1 -1
  229. package/dist/containers/Tenant/Diagnostics/TopQueries/columns/i18n/index.d.ts +1 -1
  230. package/dist/containers/Tenant/Healthcheck/Healthcheck.scss +6 -1
  231. package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.d.ts +3 -1
  232. package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.js +3 -3
  233. package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.js.map +1 -1
  234. package/dist/containers/Tenant/Healthcheck/components/HealthcheckIssue.js +2 -2
  235. package/dist/containers/Tenant/Healthcheck/components/HealthcheckIssue.js.map +1 -1
  236. package/dist/containers/Tenant/TenantDrawerHealthcheck.js +17 -2
  237. package/dist/containers/Tenant/TenantDrawerHealthcheck.js.map +1 -1
  238. package/dist/containers/Tenants/DatabaseDrawerHealthcheck.js +8 -1
  239. package/dist/containers/Tenants/DatabaseDrawerHealthcheck.js.map +1 -1
  240. package/dist/containers/VDiskPage/VDiskPage.js +33 -33
  241. package/dist/containers/VDiskPage/VDiskPage.js.map +1 -1
  242. package/dist/containers/VDiskPage/VDiskPage.scss +21 -8
  243. package/dist/containers/VDiskPage/VDiskStorageDetails.js +27 -29
  244. package/dist/containers/VDiskPage/VDiskStorageDetails.js.map +1 -1
  245. package/dist/containers/VDiskPage/VDiskStorageDetails.scss +24 -93
  246. package/dist/containers/VDiskPage/i18n/en.json +3 -12
  247. package/dist/containers/VDiskPage/i18n/index.d.ts +1 -1
  248. package/dist/lib.d.ts +1 -1
  249. package/dist/lib.js.map +1 -1
  250. package/dist/store/configureStore.d.ts +2 -2
  251. package/dist/store/defaultStore.d.ts +1 -1
  252. package/dist/store/reducers/cluster/parseFields.js +1 -0
  253. package/dist/store/reducers/cluster/parseFields.js.map +1 -1
  254. package/dist/store/reducers/clusters/clusters.js +1 -0
  255. package/dist/store/reducers/clusters/clusters.js.map +1 -1
  256. package/dist/store/reducers/clusters/selectors.d.ts +1 -0
  257. package/dist/store/reducers/clusters/selectors.js +4 -1
  258. package/dist/store/reducers/clusters/selectors.js.map +1 -1
  259. package/dist/store/reducers/clusters/types.d.ts +2 -0
  260. package/dist/store/reducers/header/types.d.ts +1 -1
  261. package/dist/store/reducers/index.d.ts +2 -2
  262. package/dist/store/reducers/pdisk/types.d.ts +1 -0
  263. package/dist/store/reducers/pdisk/utils.js +6 -1
  264. package/dist/store/reducers/pdisk/utils.js.map +1 -1
  265. package/dist/store/reducers/storage/prepareGroupsDisks.d.ts +2 -1
  266. package/dist/store/reducers/storage/prepareGroupsDisks.js +9 -19
  267. package/dist/store/reducers/storage/prepareGroupsDisks.js.map +1 -1
  268. package/dist/store/reducers/storage/utils.js +14 -3
  269. package/dist/store/reducers/storage/utils.js.map +1 -1
  270. package/dist/store/reducers/streamingQuery/streamingQuery.js +2 -4
  271. package/dist/store/reducers/streamingQuery/streamingQuery.js.map +1 -1
  272. package/dist/store/reducers/vdisk/types.d.ts +1 -1
  273. package/dist/store/reducers/vdisk/utils.js +5 -5
  274. package/dist/store/reducers/vdisk/utils.js.map +1 -1
  275. package/dist/styles/mixins.scss +22 -0
  276. package/dist/types/api/meta.d.ts +1 -0
  277. package/dist/types/api/nodesList.d.ts +2 -0
  278. package/dist/types/api/pdisk.d.ts +4 -0
  279. package/dist/types/api/pdisk.js.map +1 -1
  280. package/dist/types/api/vdisk.d.ts +8 -0
  281. package/dist/types/api/vdisk.js +7 -0
  282. package/dist/types/api/vdisk.js.map +1 -1
  283. package/dist/types/store/nodesList.d.ts +4 -2
  284. package/dist/uiFactory/types.d.ts +5 -2
  285. package/dist/utils/bytesParsers/formatBytes.d.ts +3 -1
  286. package/dist/utils/bytesParsers/formatBytes.js +12 -3
  287. package/dist/utils/bytesParsers/formatBytes.js.map +1 -1
  288. package/dist/utils/disks/constants.d.ts +1 -0
  289. package/dist/utils/disks/constants.js +4 -0
  290. package/dist/utils/disks/constants.js.map +1 -1
  291. package/dist/utils/disks/diskInfo/getDiskLocationItems.d.ts +16 -0
  292. package/dist/utils/disks/diskInfo/getDiskLocationItems.js +30 -0
  293. package/dist/utils/disks/diskInfo/getDiskLocationItems.js.map +1 -0
  294. package/dist/utils/disks/diskInfo/i18n/en.json +9 -0
  295. package/dist/utils/disks/diskInfo/i18n/index.d.ts +2 -0
  296. package/dist/utils/disks/diskInfo/i18n/index.js +4 -0
  297. package/dist/utils/disks/diskInfo/i18n/index.js.map +1 -0
  298. package/dist/utils/disks/iconCalculators.d.ts +5 -0
  299. package/dist/utils/disks/iconCalculators.js +1 -1
  300. package/dist/utils/disks/iconCalculators.js.map +1 -1
  301. package/dist/utils/disks/prepareDisks.d.ts +6 -2
  302. package/dist/utils/disks/prepareDisks.js +22 -35
  303. package/dist/utils/disks/prepareDisks.js.map +1 -1
  304. package/dist/utils/disks/types.d.ts +9 -2
  305. package/dist/utils/hooks/useDatabaseHealthcheckAvailable.d.ts +2 -0
  306. package/dist/utils/hooks/useDatabaseHealthcheckAvailable.js +6 -0
  307. package/dist/utils/hooks/useDatabaseHealthcheckAvailable.js.map +1 -0
  308. package/dist/utils/hooks/useNodeMetadata.d.ts +2 -0
  309. package/dist/utils/hooks/useNodeMetadata.js +15 -0
  310. package/dist/utils/hooks/useNodeMetadata.js.map +1 -0
  311. package/dist/utils/memory.d.ts +5 -0
  312. package/dist/utils/memory.js +9 -0
  313. package/dist/utils/memory.js.map +1 -0
  314. package/dist/utils/nodes.js +6 -2
  315. package/dist/utils/nodes.js.map +1 -1
  316. package/dist/utils/storageMetrics.d.ts +3 -2
  317. package/dist/utils/storageMetrics.js +30 -10
  318. package/dist/utils/storageMetrics.js.map +1 -1
  319. package/dist/utils/timeParsers/formatDuration.d.ts +4 -1
  320. package/dist/utils/timeParsers/formatDuration.js +16 -1
  321. package/dist/utils/timeParsers/formatDuration.js.map +1 -1
  322. package/dist/utils/timeParsers/i18n/en.json +5 -1
  323. package/dist/utils/timeParsers/i18n/index.d.ts +1 -1
  324. package/dist/utils/timeParsers/i18n/ru.json +5 -1
  325. package/package.json +2 -2
  326. package/src/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.tsx +22 -3
  327. package/src/components/CopyableValue/CopyableValue.scss +16 -0
  328. package/src/components/CopyableValue/CopyableValue.tsx +40 -0
  329. package/src/components/CopyableValue/i18n/en.json +3 -0
  330. package/src/components/CopyableValue/i18n/index.ts +8 -0
  331. package/src/components/CriticalActionDialog/CriticalActionDialog.tsx +3 -0
  332. package/src/components/DiskCapacityInfo/DiskCapacityInfo.tsx +75 -129
  333. package/src/components/DiskCapacityInfo/i18n/en.json +0 -1
  334. package/src/components/DiskPopup/DiskPopup.scss +203 -0
  335. package/src/components/DiskPopup/DiskPopup.tsx +123 -0
  336. package/src/components/DiskPopup/i18n/en.json +3 -0
  337. package/src/components/DiskPopup/i18n/index.ts +5 -0
  338. package/src/components/DiskStatus/DiskStatus.scss +59 -0
  339. package/src/components/DiskStatus/DiskStatus.tsx +149 -0
  340. package/src/components/DiskStatus/i18n/en.json +6 -0
  341. package/src/components/DiskStatus/i18n/index.ts +5 -0
  342. package/src/components/EntityStatus/EntityStatus.scss +5 -0
  343. package/src/components/EntityStatus/EntityStatus.tsx +39 -6
  344. package/src/components/EvictVDiskButton/EvictVDiskButton.tsx +10 -2
  345. package/src/components/EvictVDiskButton/i18n/en.json +2 -2
  346. package/src/components/FullNodeViewer/FullNodeViewer.tsx +4 -9
  347. package/src/components/HoverPopup/HoverPopup.tsx +157 -34
  348. package/src/components/HoverPopup/usePopupPriority.ts +39 -0
  349. package/src/components/MemoryViewer/MemoryViewer.tsx +30 -17
  350. package/src/components/MemoryViewer/i18n/en.json +4 -3
  351. package/src/components/MemoryViewer/utils.ts +19 -12
  352. package/src/components/PDiskInfo/PDiskInfo.scss +15 -0
  353. package/src/components/PDiskInfo/PDiskInfo.tsx +51 -243
  354. package/src/components/PDiskInfo/PDiskLogSize.scss +12 -0
  355. package/src/components/PDiskInfo/PDiskLogSize.tsx +41 -0
  356. package/src/components/PDiskInfo/getPDiskDetails.tsx +37 -0
  357. package/src/components/PDiskInfo/i18n/en.json +69 -10
  358. package/src/components/PDiskInfo/statuses.ts +222 -0
  359. package/src/components/PDiskPopup/PDiskPopup.tsx +62 -147
  360. package/src/components/PDiskPopup/i18n/en.json +2 -12
  361. package/src/components/Search/Search.tsx +5 -2
  362. package/src/components/StorageGroupInfo/StorageGroupInfo.scss +21 -0
  363. package/src/components/StorageGroupInfo/StorageGroupInfo.tsx +119 -263
  364. package/src/components/StorageGroupInfo/i18n/en.json +1 -9
  365. package/src/components/VDisk/VDisk.tsx +34 -36
  366. package/src/components/VDisk/VDiskWithDonorsStack.tsx +2 -0
  367. package/src/components/VDisk/getFlagStatusText.ts +19 -0
  368. package/src/components/VDisk/i18n/en.json +1 -1
  369. package/src/components/VDiskInfo/VDiskInfo.scss +19 -3
  370. package/src/components/VDiskInfo/VDiskInfo.tsx +119 -341
  371. package/src/components/VDiskInfo/getVDiskDetails.tsx +63 -0
  372. package/src/components/VDiskInfo/i18n/en.json +5 -21
  373. package/src/components/VDiskPopup/VDiskPopup.scss +3 -10
  374. package/src/components/VDiskPopup/VDiskPopup.tsx +192 -424
  375. package/src/components/VDiskPopup/i18n/en.json +4 -22
  376. package/src/components/VDiskStatus/VDiskReplicationStatus.tsx +77 -0
  377. package/src/components/VDiskStatus/VDiskStatus.scss +36 -0
  378. package/src/components/VDiskStatus/VDiskStatus.tsx +49 -0
  379. package/src/components/VDiskStatus/i18n/en.json +33 -0
  380. package/src/components/VDiskStatus/i18n/index.ts +7 -0
  381. package/src/components/VDiskStatus/index.ts +7 -0
  382. package/src/components/VDiskStatus/statuses.ts +139 -0
  383. package/src/components/capacityMetricsColumns/i18n/en.json +4 -4
  384. package/src/components/nodesColumns/columns.tsx +26 -12
  385. package/src/containers/Cluster/ClusterDrawerHealthcheck.tsx +6 -0
  386. package/src/containers/Clusters/ClusterDrawerHealthcheck.tsx +1 -0
  387. package/src/containers/Clusters/Clusters.scss +24 -6
  388. package/src/containers/Clusters/Clusters.tsx +74 -5
  389. package/src/containers/Clusters/columns.tsx +36 -6
  390. package/src/containers/Clusters/i18n/en.json +6 -0
  391. package/src/containers/Header/Header.tsx +19 -3
  392. package/src/containers/Header/HeaderLeftControls.tsx +3 -1
  393. package/src/containers/Header/PDiskLeftControls.tsx +41 -0
  394. package/src/containers/Header/StorageGroupLeftControls.tsx +38 -0
  395. package/src/containers/Header/VDiskLeftControls.tsx +40 -0
  396. package/src/containers/Header/breadcrumbs.tsx +4 -2
  397. package/src/containers/Header/i18n/en.json +6 -1
  398. package/src/containers/Nodes/NodesControls/NodesControls.tsx +1 -0
  399. package/src/containers/Nodes/PaginatedNodes/GroupedNodesComponent.tsx +5 -3
  400. package/src/containers/Nodes/PaginatedNodes/NodesComponent.tsx +4 -2
  401. package/src/containers/Nodes/useDebouncedSearch.ts +13 -0
  402. package/src/containers/PDiskPage/PDiskPage.scss +22 -11
  403. package/src/containers/PDiskPage/PDiskPage.tsx +88 -56
  404. package/src/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.tsx +16 -11
  405. package/src/containers/PDiskPage/PDiskStorageDetails.scss +51 -0
  406. package/src/containers/PDiskPage/PDiskStorageDetails.tsx +64 -0
  407. package/src/containers/PDiskPage/i18n/en.json +2 -0
  408. package/src/containers/Storage/Disks/Disks.tsx +66 -12
  409. package/src/containers/Storage/PDisk/PDisk.tsx +3 -0
  410. package/src/containers/Storage/PaginatedStorageGroupsTable/columns/columns.tsx +24 -3
  411. package/src/containers/Storage/StorageExpertModePanel/components/SpaceLegend.scss +14 -82
  412. package/src/containers/Storage/StorageGroupStateLabel.tsx +22 -0
  413. package/src/containers/Storage/utils/getStorageGroupStateLabel.ts +49 -0
  414. package/src/containers/StorageGroupPage/StorageGroupPage.scss +18 -12
  415. package/src/containers/StorageGroupPage/StorageGroupPage.tsx +63 -26
  416. package/src/containers/StorageGroupPage/i18n/en.json +2 -1
  417. package/src/containers/Tenant/Diagnostics/Overview/Overview.tsx +5 -1
  418. package/src/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.tsx +12 -1
  419. package/src/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.tsx +11 -10
  420. package/src/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.tsx +83 -20
  421. package/src/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/en.json +5 -1
  422. package/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.tsx +5 -32
  423. package/src/containers/Tenant/Healthcheck/Healthcheck.scss +6 -1
  424. package/src/containers/Tenant/Healthcheck/components/HealthcheckDrawer.tsx +5 -2
  425. package/src/containers/Tenant/Healthcheck/components/HealthcheckIssue.tsx +18 -8
  426. package/src/containers/Tenant/TenantDrawerHealthcheck.tsx +24 -1
  427. package/src/containers/Tenants/DatabaseDrawerHealthcheck.tsx +10 -0
  428. package/src/containers/VDiskPage/VDiskPage.scss +21 -8
  429. package/src/containers/VDiskPage/VDiskPage.tsx +103 -64
  430. package/src/containers/VDiskPage/VDiskStorageDetails.scss +24 -93
  431. package/src/containers/VDiskPage/VDiskStorageDetails.tsx +50 -158
  432. package/src/containers/VDiskPage/i18n/en.json +3 -14
  433. package/src/lib.ts +1 -0
  434. package/src/store/reducers/cluster/parseFields.ts +1 -0
  435. package/src/store/reducers/clusters/clusters.ts +1 -0
  436. package/src/store/reducers/clusters/selectors.ts +4 -0
  437. package/src/store/reducers/clusters/types.ts +3 -0
  438. package/src/store/reducers/header/types.ts +3 -1
  439. package/src/store/reducers/pdisk/types.ts +1 -0
  440. package/src/store/reducers/pdisk/utils.ts +6 -3
  441. package/src/store/reducers/storage/prepareGroupsDisks.ts +9 -22
  442. package/src/store/reducers/storage/utils.ts +17 -3
  443. package/src/store/reducers/streamingQuery/streamingQuery.ts +2 -4
  444. package/src/store/reducers/vdisk/types.ts +2 -1
  445. package/src/store/reducers/vdisk/utils.ts +4 -5
  446. package/src/styles/mixins.scss +22 -0
  447. package/src/types/api/meta.ts +1 -0
  448. package/src/types/api/nodesList.ts +3 -0
  449. package/src/types/api/pdisk.ts +4 -0
  450. package/src/types/api/vdisk.ts +9 -0
  451. package/src/types/store/nodesList.ts +7 -7
  452. package/src/uiFactory/types.ts +9 -2
  453. package/src/utils/bytesParsers/formatBytes.ts +23 -4
  454. package/src/utils/disks/constants.ts +5 -0
  455. package/src/utils/disks/diskInfo/getDiskLocationItems.ts +50 -0
  456. package/src/utils/disks/diskInfo/i18n/en.json +9 -0
  457. package/src/utils/disks/diskInfo/i18n/index.ts +5 -0
  458. package/src/utils/disks/iconCalculators.ts +1 -1
  459. package/src/utils/disks/prepareDisks.ts +21 -47
  460. package/src/utils/disks/types.ts +10 -2
  461. package/src/utils/hooks/useDatabaseHealthcheckAvailable.ts +9 -0
  462. package/src/utils/hooks/useNodeMetadata.ts +21 -0
  463. package/src/utils/memory.ts +16 -0
  464. package/src/utils/nodes.ts +7 -1
  465. package/src/utils/storageMetrics.ts +38 -14
  466. package/src/utils/timeParsers/formatDuration.ts +22 -1
  467. package/src/utils/timeParsers/i18n/en.json +5 -1
  468. package/src/utils/timeParsers/i18n/ru.json +5 -1
  469. package/dist/components/VDiskInfo/getVDiskCapacityColumns.d.ts +0 -11
  470. package/dist/components/VDiskInfo/getVDiskCapacityColumns.js +0 -52
  471. package/dist/components/VDiskInfo/getVDiskCapacityColumns.js.map +0 -1
  472. package/src/components/VDiskInfo/getVDiskCapacityColumns.tsx +0 -83
@@ -1,36 +1,45 @@
1
1
  import React from 'react';
2
2
 
3
- import {ArrowRotateLeft} from '@gravity-ui/icons';
4
- import {Icon, Tab, TabList, TabProvider} from '@gravity-ui/uikit';
3
+ import {ArrowLeft, ArrowRotateLeft, Wrench} from '@gravity-ui/icons';
4
+ import {Button, Flex, Icon, Tab, TabList, TabProvider, Text} from '@gravity-ui/uikit';
5
5
  import {skipToken} from '@reduxjs/toolkit/query';
6
6
  import {Helmet} from 'react-helmet-async';
7
+ import {useHistory} from 'react-router-dom';
7
8
  import {StringParam, useQueryParams} from 'use-query-params';
8
9
  import {z} from 'zod';
9
10
 
11
+ import {AutoRefreshControl} from '../../components/AutoRefreshControl/AutoRefreshControl';
10
12
  import {ButtonWithConfirmDialog} from '../../components/ButtonWithConfirmDialog/ButtonWithConfirmDialog';
11
- import {EntityPageTitle} from '../../components/EntityPageTitle/EntityPageTitle';
13
+ import {CopyableValue} from '../../components/CopyableValue/CopyableValue';
14
+ import {DiskStatusLabel, DiskTypeLabel} from '../../components/DiskStatus/DiskStatus';
12
15
  import {ResponseError} from '../../components/Errors/ResponseError';
13
16
  import {InfoViewerSkeleton} from '../../components/InfoViewerSkeleton/InfoViewerSkeleton';
14
17
  import {InternalLink} from '../../components/InternalLink/InternalLink';
18
+ import {LinkWithIcon} from '../../components/LinkWithIcon/LinkWithIcon';
15
19
  import {PDiskInfo} from '../../components/PDiskInfo/PDiskInfo';
16
- import {PageMetaWithAutorefresh} from '../../components/PageMeta/PageMeta';
20
+ import {
21
+ getPDiskDecommitLabel,
22
+ getPDiskDriveLabel,
23
+ getPDiskMaintenanceLabel,
24
+ getPDiskStateLabel,
25
+ } from '../../components/PDiskInfo/statuses';
17
26
  import {getPDiskPagePath} from '../../routes';
18
27
  import {api} from '../../store/reducers/api';
19
28
  import {useDiskPagesAvailable} from '../../store/reducers/capabilities/hooks';
20
29
  import {setHeaderBreadcrumbs} from '../../store/reducers/header/header';
21
30
  import {pDiskApi} from '../../store/reducers/pdisk/pdisk';
22
- import type {EDecommitStatus} from '../../types/api/pdisk';
23
31
  import {valueIsDefined} from '../../utils';
24
32
  import {cn} from '../../utils/cn';
25
- import {getDataSeverityColor, getPDiskId} from '../../utils/disks/helpers';
33
+ import {EMPTY_DATA_PLACEHOLDER} from '../../utils/constants';
34
+ import {createPDiskDeveloperUILink, useHasDeveloperUi} from '../../utils/developerUI/developerUI';
35
+ import {getPDiskId} from '../../utils/disks/helpers';
26
36
  import {useAutoRefreshInterval, useTypedDispatch} from '../../utils/hooks';
27
37
  import {useIsUserAllowedToMakeChanges} from '../../utils/hooks/useIsUserAllowedToMakeChanges';
28
38
  import {useAppTitle} from '../App/AppTitleContext';
29
39
  import {PaginatedStorage} from '../Storage/PaginatedStorage';
30
40
 
31
- import {DecommissionButton} from './DecommissionButton/DecommissionButton';
32
- import {DecommissionLabel} from './DecommissionLabel/DecommissionLabel';
33
41
  import {PDiskSpaceDistribution} from './PDiskSpaceDistribution/PDiskSpaceDistribution';
42
+ import {PDiskStorageDetails} from './PDiskStorageDetails';
34
43
  import {pDiskPageKeyset} from './i18n';
35
44
 
36
45
  import './PDiskPage.scss';
@@ -61,6 +70,9 @@ const pDiskTabSchema = z.nativeEnum(PDISK_TABS_IDS).catch(PDISK_TABS_IDS.spaceDi
61
70
 
62
71
  export function PDiskPage() {
63
72
  const dispatch = useTypedDispatch();
73
+ const history = useHistory();
74
+ const showBackButton = history.length > 1;
75
+ const hasDeveloperUi = useHasDeveloperUi();
64
76
 
65
77
  const isUserAllowedToMakeChanges = useIsUserAllowedToMakeChanges();
66
78
  const newDiskApiAvailable = useDiskPagesAvailable();
@@ -87,7 +99,8 @@ export function PDiskPage() {
87
99
  });
88
100
  const pDiskLoading = pdiskDataQuery.isFetching && pdiskDataQuery.currentData === undefined;
89
101
  const pDiskData = pdiskDataQuery.currentData;
90
- const {NodeHost, NodeId, NodeType, NodeDC, Severity, DecommitStatus} = pDiskData || {};
102
+ const {NodeHost, DecommitStatus} = pDiskData || {};
103
+ const diskId = getPDiskId({nodeId, pDiskId});
91
104
 
92
105
  const handleRestart = async (isRetry?: boolean) => {
93
106
  if (pDiskParamsDefined) {
@@ -105,27 +118,6 @@ export function PDiskPage() {
105
118
  }
106
119
  };
107
120
 
108
- const handleDecommissionChange = async (
109
- newDecommissionStatus?: EDecommitStatus,
110
- isRetry?: boolean,
111
- ) => {
112
- if (pDiskParamsDefined) {
113
- const response = await window.api.pdisk.changePDiskStatus({
114
- nodeId,
115
- pDiskId,
116
- force: isRetry,
117
- decommissionStatus: newDecommissionStatus,
118
- });
119
- if (response?.result === false) {
120
- const err = {
121
- statusText: response.error,
122
- retryPossible: response.forceRetryPossible,
123
- };
124
- throw err;
125
- }
126
- }
127
- };
128
-
129
121
  const handleAfterAction = () => {
130
122
  if (pDiskParamsDefined) {
131
123
  dispatch(
@@ -153,39 +145,75 @@ export function PDiskPage() {
153
145
  };
154
146
 
155
147
  const renderPageMeta = () => {
156
- const hostItem = NodeHost ? `${pDiskPageKeyset('fqdn')}: ${NodeHost}` : undefined;
157
- const nodeIdItem = NodeId ? `${pDiskPageKeyset('node')}: ${NodeId}` : undefined;
158
-
148
+ if (!showBackButton) {
149
+ return null;
150
+ }
159
151
  return (
160
- <PageMetaWithAutorefresh
161
- loading={pDiskLoading}
162
- items={[hostItem, nodeIdItem, NodeType, NodeDC]}
152
+ <Flex
163
153
  className={pdiskPageCn('meta')}
164
- />
154
+ alignItems="center"
155
+ justifyContent="space-between"
156
+ gap={1}
157
+ >
158
+ <Button size="m" view="outlined" onClick={() => history.goBack()}>
159
+ <Icon data={ArrowLeft} size={16} />
160
+ {pDiskPageKeyset('action_back')}
161
+ </Button>
162
+ <AutoRefreshControl className={pdiskPageCn('refresh-control')} />
163
+ </Flex>
165
164
  );
166
165
  };
167
166
 
168
167
  const renderPageTitle = () => {
168
+ const statusLabels = [
169
+ {id: 'state', label: getPDiskStateLabel(pDiskData?.State)},
170
+ {id: 'drive', label: getPDiskDriveLabel(pDiskData?.DriveStatus)},
171
+ {id: 'decommit', label: getPDiskDecommitLabel(DecommitStatus)},
172
+ {id: 'maintenance', label: getPDiskMaintenanceLabel(pDiskData?.MaintenanceStatus)},
173
+ ];
169
174
  return (
170
- <div className={pdiskPageCn('title')}>
171
- <EntityPageTitle
172
- entityName={pDiskPageKeyset('pdisk')}
173
- status={getDataSeverityColor(Severity)}
174
- id={getPDiskId({nodeId, pDiskId})}
175
- />
176
- <DecommissionLabel decommission={DecommitStatus} />
177
- </div>
175
+ <Flex
176
+ className={pdiskPageCn('title')}
177
+ gap={2}
178
+ alignItems="flex-start"
179
+ qa="pdisk-header"
180
+ >
181
+ <Flex
182
+ className={pdiskPageCn('title-content')}
183
+ gap={3}
184
+ alignItems="center"
185
+ wrap="wrap"
186
+ >
187
+ <CopyableValue copyText={diskId} fieldName={pDiskPageKeyset('pdisk')}>
188
+ <Text as="h1" variant="header-1" className={pdiskPageCn('heading')}>
189
+ {pDiskPageKeyset('pdisk')}{' '}
190
+ <Text color="hint" variant="header-1">
191
+ {diskId || EMPTY_DATA_PLACEHOLDER}
192
+ </Text>
193
+ </Text>
194
+ </CopyableValue>
195
+ <Flex gap={2} alignItems="center" wrap="wrap">
196
+ {statusLabels.map(({id, label}) =>
197
+ label ? <DiskStatusLabel key={id} {...label} iconSize={14} /> : null,
198
+ )}
199
+ <DiskTypeLabel type={pDiskData?.Type} size="s" />
200
+ </Flex>
201
+ </Flex>
202
+ {!showBackButton && (
203
+ <AutoRefreshControl className={pdiskPageCn('refresh-control')} />
204
+ )}
205
+ </Flex>
178
206
  );
179
207
  };
180
208
 
181
209
  const renderControls = () => {
182
210
  return (
183
- <div className={pdiskPageCn('controls')}>
211
+ <div className={pdiskPageCn('controls')} data-qa="pdisk-controls">
184
212
  <ButtonWithConfirmDialog
185
213
  onConfirmAction={handleRestart}
186
214
  onConfirmActionSuccess={handleAfterAction}
187
215
  buttonDisabled={!pDiskParamsDefined || !isUserAllowedToMakeChanges}
188
- buttonView="normal"
216
+ buttonView="action"
189
217
  dialogHeader={pDiskPageKeyset('restart-pdisk-dialog-header')}
190
218
  dialogText={pDiskPageKeyset('restart-pdisk-dialog-text')}
191
219
  applyButtonText={pDiskPageKeyset('restart-pdisk-button')}
@@ -198,15 +226,14 @@ export function PDiskPage() {
198
226
  <Icon data={ArrowRotateLeft} />
199
227
  {pDiskPageKeyset('restart-pdisk-button')}
200
228
  </ButtonWithConfirmDialog>
201
- {newDiskApiAvailable ? (
202
- <DecommissionButton
203
- decommission={DecommitStatus}
204
- onConfirmAction={handleDecommissionChange}
205
- onConfirmActionSuccess={handleAfterAction}
206
- buttonDisabled={!pDiskParamsDefined || !isUserAllowedToMakeChanges}
207
- popoverDisabled={isUserAllowedToMakeChanges}
229
+ {hasDeveloperUi && pDiskParamsDefined && (
230
+ <LinkWithIcon
231
+ title={pDiskPageKeyset('action_open-in-developer-ui')}
232
+ url={createPDiskDeveloperUILink({nodeId, pDiskId})}
233
+ icon={Wrench}
234
+ hideEndIcon
208
235
  />
209
- ) : null}
236
+ )}
210
237
  </div>
211
238
  );
212
239
  };
@@ -215,7 +242,12 @@ export function PDiskPage() {
215
242
  if (pDiskLoading) {
216
243
  return <InfoViewerSkeleton className={pdiskPageCn('info')} rows={10} />;
217
244
  }
218
- return <PDiskInfo pDisk={pDiskData} nodeId={nodeId} className={pdiskPageCn('info')} />;
245
+ return (
246
+ <React.Fragment>
247
+ <PDiskStorageDetails data={pDiskData} className={pdiskPageCn('storage-details')} />
248
+ <PDiskInfo pDisk={pDiskData} className={pdiskPageCn('info')} />
249
+ </React.Fragment>
250
+ );
219
251
  };
220
252
 
221
253
  const renderTabs = () => {
@@ -3,8 +3,8 @@ import React from 'react';
3
3
  import {DiskStateProgressBar} from '../../../components/DiskStateProgressBar/DiskStateProgressBar';
4
4
  import {HoverPopup} from '../../../components/HoverPopup/HoverPopup';
5
5
  import {InternalLink} from '../../../components/InternalLink';
6
- import {ProgressViewer} from '../../../components/ProgressViewer/ProgressViewer';
7
- import {VDiskInfo} from '../../../components/VDiskInfo/VDiskInfo';
6
+ import {PDiskLogSize} from '../../../components/PDiskInfo/PDiskLogSize';
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
  >
@@ -275,20 +286,14 @@ function LogInfo({data}: LogInfoProps) {
275
286
  const items: YDBDefinitionListItem[] = [
276
287
  {
277
288
  name: pDiskPageKeyset('label.log-size'),
278
- content: (
279
- <ProgressViewer
280
- value={LogUsedSize}
281
- capacity={LogTotalSize}
282
- formatValues={formatStorageValuesToGb}
283
- />
284
- ),
289
+ content: <PDiskLogSize used={LogUsedSize} total={LogTotalSize} />,
285
290
  },
286
291
  ];
287
292
 
288
293
  if (valueIsDefined(SystemSize)) {
289
294
  items.push({
290
295
  name: pDiskPageKeyset('label.system-size'),
291
- content: formatBytes({value: SystemSize}),
296
+ content: formatBytes({value: SystemSize, fixedDecimalPlaces: 2}),
292
297
  });
293
298
  }
294
299
 
@@ -0,0 +1,51 @@
1
+ .ydb-pdisk-storage-details {
2
+ display: flex;
3
+ flex-wrap: wrap;
4
+ align-items: flex-start;
5
+ gap: var(--g-spacing-5);
6
+
7
+ width: fit-content;
8
+ max-width: 100%;
9
+ padding: var(--g-spacing-3) var(--g-spacing-5);
10
+
11
+ border-radius: var(--g-border-radius-m);
12
+ background-color: var(--g-color-base-generic);
13
+
14
+ &__detail {
15
+ --g-definition-list-item-gap: 0px;
16
+
17
+ min-width: 0;
18
+ max-width: 200px;
19
+
20
+ &_location {
21
+ min-width: 100px;
22
+ }
23
+
24
+ .g-definition-list__definition {
25
+ min-width: 0;
26
+ max-width: 100%;
27
+ }
28
+ }
29
+
30
+ &__value-popover {
31
+ flex: 0 1 auto;
32
+
33
+ min-width: 0;
34
+ max-width: 100%;
35
+ }
36
+
37
+ &__value-popover-content {
38
+ width: auto;
39
+ min-width: 0;
40
+ max-width: 100%;
41
+
42
+ &_with-left-trim {
43
+ text-align: end;
44
+ direction: rtl;
45
+
46
+ > span {
47
+ unicode-bidi: plaintext;
48
+ }
49
+ }
50
+ }
51
+ }
@@ -0,0 +1,64 @@
1
+ import {DefinitionList} from '@gravity-ui/uikit';
2
+
3
+ import {CellWithPopover} from '../../components/CellWithPopover/CellWithPopover';
4
+ import {CopyableValue} from '../../components/CopyableValue/CopyableValue';
5
+ import type {PDiskData} from '../../store/reducers/pdisk/types';
6
+ import {cn} from '../../utils/cn';
7
+ import {getDiskLocationItems} from '../../utils/disks/diskInfo/getDiskLocationItems';
8
+
9
+ import './PDiskStorageDetails.scss';
10
+
11
+ const b = cn('ydb-pdisk-storage-details');
12
+ const LOCATION_IDS = ['datacenter', 'rack', 'fqdn', 'pdisk-path'];
13
+ const FIELD_ORDER = [...LOCATION_IDS, 'node-id', 'pdisk-id'];
14
+
15
+ export function PDiskStorageDetails({
16
+ data = {},
17
+ className,
18
+ }: {
19
+ data?: PDiskData;
20
+ className?: string;
21
+ }) {
22
+ const items = getDiskLocationItems(data, {
23
+ Host: data.NodeHost,
24
+ Rack: data.NodeRack,
25
+ DC: data.NodeDC,
26
+ });
27
+
28
+ return (
29
+ <div className={b(null, className)} data-qa="pdisk-location">
30
+ {FIELD_ORDER.map((id) => {
31
+ const item = items.find((entry) => entry.id === id);
32
+ if (!item) {
33
+ return null;
34
+ }
35
+ const copyText = item.copyText === undefined ? undefined : String(item.copyText);
36
+ return (
37
+ <DefinitionList
38
+ key={id}
39
+ direction="vertical"
40
+ className={b('detail', {location: LOCATION_IDS.includes(id)})}
41
+ qa={`pdisk-location-${id}`}
42
+ >
43
+ <DefinitionList.Item name={item.name}>
44
+ <CopyableValue copyText={copyText} fieldName={item.name}>
45
+ <CellWithPopover
46
+ content={copyText}
47
+ disabled={!copyText}
48
+ placement={['top', 'bottom']}
49
+ fullWidth
50
+ wrapperClassName={b('value-popover')}
51
+ className={b('value-popover-content', {
52
+ 'with-left-trim': id === 'pdisk-path',
53
+ })}
54
+ >
55
+ <span tabIndex={copyText ? 0 : undefined}>{item.content}</span>
56
+ </CellWithPopover>
57
+ </CopyableValue>
58
+ </DefinitionList.Item>
59
+ </DefinitionList>
60
+ );
61
+ })}
62
+ </div>
63
+ );
64
+ }
@@ -2,6 +2,8 @@
2
2
  "fqdn": "FQDN",
3
3
  "pdisk": "PDisk",
4
4
  "node": "Node",
5
+ "action_back": "Back",
6
+ "action_open-in-developer-ui": "Open in Developer UI",
5
7
 
6
8
  "storage": "Storage",
7
9
  "space-distribution": "Space distribution",
@@ -31,6 +31,19 @@ import './Disks.scss';
31
31
 
32
32
  const b = cn('ydb-storage-disks');
33
33
 
34
+ interface DiskPopupState {
35
+ id: string;
36
+ vdisk: boolean;
37
+ pdisk: boolean;
38
+ }
39
+
40
+ type DiskPopupChangeHandler = (
41
+ id: string | undefined,
42
+ source: 'vdisk' | 'pdisk',
43
+ open: boolean,
44
+ closePair?: boolean,
45
+ ) => void;
46
+
34
47
  interface DisksProps {
35
48
  vDisks?: PreparedVDisk[];
36
49
  viewContext?: StorageViewContext;
@@ -44,7 +57,7 @@ interface DisksItemProps {
44
57
  viewContext?: StorageViewContext;
45
58
  inactive?: boolean;
46
59
  highlighted: boolean;
47
- setHighlightedVDisk?: (id?: string) => void;
60
+ onPopupChange: DiskPopupChangeHandler;
48
61
  compactVDiskWidth?: number;
49
62
  withDCMargin?: boolean;
50
63
  withIcon?: boolean;
@@ -58,7 +71,7 @@ const VDiskItem = React.memo(function VDiskItem({
58
71
  vDisk,
59
72
  highlighted,
60
73
  inactive,
61
- setHighlightedVDisk,
74
+ onPopupChange,
62
75
  compactVDiskWidth,
63
76
  withIcon,
64
77
  getDisplayState,
@@ -66,6 +79,15 @@ const VDiskItem = React.memo(function VDiskItem({
66
79
  renderContent,
67
80
  placeholderProps,
68
81
  }: DisksItemProps) {
82
+ const vDiskId = vDisk.StringifiedId;
83
+ const setHighlightedVDisk = React.useCallback(
84
+ (id?: string) => onPopupChange(vDiskId, 'vdisk', Boolean(id)),
85
+ [onPopupChange, vDiskId],
86
+ );
87
+ const onClosePopup = React.useCallback(
88
+ () => onPopupChange(vDiskId, 'vdisk', false, true),
89
+ [onPopupChange, vDiskId],
90
+ );
69
91
  const style: React.CSSProperties = isAllVDisksLayout
70
92
  ? {width: ALL_VDISK_WIDTH, flexBasis: ALL_VDISK_WIDTH}
71
93
  : {width: compactVDiskWidth, flexBasis: compactVDiskWidth};
@@ -98,6 +120,7 @@ const VDiskItem = React.memo(function VDiskItem({
98
120
  delayClose={DISKS_POPUP_DEBOUNCE_TIMEOUT}
99
121
  highlightedVDisk={highlighted ? vDisk.StringifiedId : undefined}
100
122
  setHighlightedVDisk={setHighlightedVDisk}
123
+ onClosePopup={onClosePopup}
101
124
  progressBarClassName={b('vdisk-progress-bar')}
102
125
  getDisplayState={getDisplayState}
103
126
  />
@@ -109,7 +132,7 @@ const PDiskItem = React.memo(function PDiskItem({
109
132
  vDisk,
110
133
  viewContext,
111
134
  highlighted,
112
- setHighlightedVDisk,
135
+ onPopupChange,
113
136
  withDCMargin,
114
137
  withIcon,
115
138
  getDisplayState,
@@ -119,12 +142,16 @@ const PDiskItem = React.memo(function PDiskItem({
119
142
  const vDiskId = vDisk.StringifiedId;
120
143
 
121
144
  const onShowPopup = React.useCallback(
122
- () => setHighlightedVDisk?.(vDiskId),
123
- [setHighlightedVDisk, vDiskId],
145
+ () => onPopupChange(vDiskId, 'pdisk', true),
146
+ [onPopupChange, vDiskId],
124
147
  );
125
148
  const onHidePopup = React.useCallback(
126
- () => setHighlightedVDisk?.(undefined),
127
- [setHighlightedVDisk],
149
+ () => onPopupChange(vDiskId, 'pdisk', false),
150
+ [onPopupChange, vDiskId],
151
+ );
152
+ const onClosePopup = React.useCallback(
153
+ () => onPopupChange(vDiskId, 'pdisk', false, true),
154
+ [onPopupChange, vDiskId],
128
155
  );
129
156
 
130
157
  if (!vDisk.PDisk) {
@@ -150,6 +177,7 @@ const PDiskItem = React.memo(function PDiskItem({
150
177
  delayClose={DISKS_POPUP_DEBOUNCE_TIMEOUT}
151
178
  onShowPopup={onShowPopup}
152
179
  onHidePopup={onHidePopup}
180
+ onClosePopup={onClosePopup}
153
181
  withIcon={withIcon}
154
182
  highlighted={highlighted}
155
183
  getDisplayState={getDisplayState}
@@ -170,7 +198,33 @@ export const Disks = React.memo(function Disks({
170
198
  const getVDiskDisplayState = useStorageVDiskDisplayStateGetter();
171
199
  const getPDiskDisplayState = useStoragePDiskDisplayStateGetter();
172
200
 
173
- const [highlightedVDisk, setHighlightedVDisk] = React.useState<string | undefined>();
201
+ const [popupState, setPopupState] = React.useState<DiskPopupState>();
202
+ const highlightedVDisk = popupState?.id;
203
+ const onPopupChange = React.useCallback<DiskPopupChangeHandler>(
204
+ (id, source, open, closePair) => {
205
+ if (!id) {
206
+ return;
207
+ }
208
+ setPopupState((current) => {
209
+ // A delayed close from another pair must not clear the current pair.
210
+ if (!open && current?.id !== id) {
211
+ return current;
212
+ }
213
+ if (closePair) {
214
+ return undefined;
215
+ }
216
+ const next = {
217
+ id,
218
+ vdisk: false,
219
+ pdisk: false,
220
+ ...(current?.id === id ? current : {}),
221
+ [source]: open,
222
+ };
223
+ return next.vdisk || next.pdisk ? next : undefined;
224
+ });
225
+ },
226
+ [],
227
+ );
174
228
  const vDiskList = useVirtualizedDiskList(
175
229
  vDisks,
176
230
  vDisks.every((disk) => Boolean(disk.StringifiedId)),
@@ -182,8 +236,8 @@ export const Disks = React.memo(function Disks({
182
236
  );
183
237
 
184
238
  React.useEffect(() => {
185
- setHighlightedVDisk((id) =>
186
- vDisks.some((disk) => disk.StringifiedId === id) ? id : undefined,
239
+ setPopupState((current) =>
240
+ vDisks.some((disk) => disk.StringifiedId === current?.id) ? current : undefined,
187
241
  );
188
242
  }, [vDisks]);
189
243
 
@@ -218,7 +272,7 @@ export const Disks = React.memo(function Disks({
218
272
  vDisk={vDisk}
219
273
  inactive={!isVdiskActive(vDisk, viewContext)}
220
274
  highlighted={highlightedVDisk === vDisk.StringifiedId}
221
- setHighlightedVDisk={setHighlightedVDisk}
275
+ onPopupChange={onPopupChange}
222
276
  compactVDiskWidth={compactVDiskWidths[index]}
223
277
  withIcon={withIcon}
224
278
  getDisplayState={getVDiskDisplayState}
@@ -236,7 +290,7 @@ export const Disks = React.memo(function Disks({
236
290
  vDisk={vDisk}
237
291
  viewContext={viewContext}
238
292
  highlighted={highlightedVDisk === vDisk.StringifiedId}
239
- setHighlightedVDisk={setHighlightedVDisk}
293
+ onPopupChange={onPopupChange}
240
294
  withDCMargin={vDisksWithDCMargins.includes(index)}
241
295
  withIcon={withIcon}
242
296
  getDisplayState={getPDiskDisplayState}
@@ -257,6 +257,7 @@ export interface PDiskProps {
257
257
  showPopup?: boolean;
258
258
  onShowPopup?: VoidFunction;
259
259
  onHidePopup?: VoidFunction;
260
+ onClosePopup?: VoidFunction;
260
261
  className?: string;
261
262
  progressBarClassName?: string;
262
263
  // Nodes derive this width from their VDisk rows, overriding the Groups mode defaults.
@@ -276,6 +277,7 @@ export const PDisk = ({
276
277
  showPopup,
277
278
  onShowPopup,
278
279
  onHidePopup,
280
+ onClosePopup,
279
281
  className,
280
282
  progressBarClassName,
281
283
  width,
@@ -359,6 +361,7 @@ export const PDisk = ({
359
361
  anchorRef={anchorRef}
360
362
  onShowPopup={onShowPopup}
361
363
  onHidePopup={onHidePopup}
364
+ onClosePopup={onClosePopup}
362
365
  renderPopupContent={() => <PDiskPopup data={data} />}
363
366
  delayOpen={delayOpen}
364
367
  delayClose={delayClose}
@@ -6,6 +6,7 @@ import {Flex, Icon, Label, Popover} from '@gravity-ui/uikit';
6
6
  import {isNil} from 'lodash';
7
7
 
8
8
  import {CellWithPopover} from '../../../../components/CellWithPopover/CellWithPopover';
9
+ import {DiskStatusLabel} from '../../../../components/DiskStatus/DiskStatus';
9
10
  import {EntityName} from '../../../../components/EntityName/EntityName';
10
11
  import {StatusIcon} from '../../../../components/StatusIcon/StatusIcon';
11
12
  import {TitleWithHelpMark} from '../../../../components/TitleWithHelpmark/TitleWithHelpmark';
@@ -35,6 +36,7 @@ import {
35
36
  } from '../../Disks/constants';
36
37
  import {VDisks} from '../../VDisks/VDisks';
37
38
  import {getDegradedSeverity} from '../../utils';
39
+ import {getStorageGroupStateLabel} from '../../utils/getStorageGroupStateLabel';
38
40
  import i18n from '../i18n';
39
41
 
40
42
  import {
@@ -122,9 +124,14 @@ const degradedColumn: StorageGroupsColumn = {
122
124
  resizeMinWidth: 110,
123
125
  render: ({row}) =>
124
126
  row.Degraded ? (
125
- <Label theme={getDegradedSeverity(row)}>Degraded: {row.Degraded}</Label>
127
+ <DiskStatusLabel
128
+ size="xs"
129
+ title="Degraded"
130
+ value={String(row.Degraded)}
131
+ theme={getDegradedSeverity(row)}
132
+ />
126
133
  ) : (
127
- '-'
134
+ EMPTY_DATA_PLACEHOLDER
128
135
  ),
129
136
  align: DataTable.LEFT,
130
137
  defaultOrder: DataTable.DESCENDING,
@@ -133,7 +140,21 @@ const stateColumn: StorageGroupsColumn = {
133
140
  name: STORAGE_GROUPS_COLUMNS_IDS.State,
134
141
  header: STORAGE_GROUPS_COLUMNS_TITLES.State,
135
142
  width: 150,
136
- render: ({row}) => row.State ?? EMPTY_DATA_PLACEHOLDER,
143
+ render: ({row}) => {
144
+ const state = getStorageGroupStateLabel(row.State);
145
+
146
+ return state ? (
147
+ <DiskStatusLabel
148
+ size="xs"
149
+ title={state.title}
150
+ value={state.value}
151
+ theme={state.theme}
152
+ dangerHeavy={state.dangerHeavy}
153
+ />
154
+ ) : (
155
+ EMPTY_DATA_PLACEHOLDER
156
+ );
157
+ },
137
158
  align: DataTable.LEFT,
138
159
  defaultOrder: DataTable.DESCENDING,
139
160
  };