ydb-embedded-ui 22.4.0 → 22.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (337) hide show
  1. package/dist/components/AutoRefreshControl/StickyAutoRefreshControl.d.ts +2 -0
  2. package/dist/components/AutoRefreshControl/StickyAutoRefreshControl.js +9 -0
  3. package/dist/components/AutoRefreshControl/StickyAutoRefreshControl.js.map +1 -0
  4. package/dist/components/AutoRefreshControl/StickyAutoRefreshControl.scss +18 -0
  5. package/dist/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.d.ts +3 -2
  6. package/dist/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.js +19 -4
  7. package/dist/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.js.map +1 -1
  8. package/dist/components/CopyableValue/CopyableValue.d.ts +10 -0
  9. package/dist/components/CopyableValue/CopyableValue.js +10 -0
  10. package/dist/components/CopyableValue/CopyableValue.js.map +1 -0
  11. package/dist/components/CopyableValue/CopyableValue.scss +16 -0
  12. package/dist/components/CopyableValue/i18n/en.json +3 -0
  13. package/dist/components/CopyableValue/i18n/index.d.ts +2 -0
  14. package/dist/components/CopyableValue/i18n/index.js +6 -0
  15. package/dist/components/CopyableValue/i18n/index.js.map +1 -0
  16. package/dist/components/CriticalActionDialog/CriticalActionDialog.d.ts +2 -1
  17. package/dist/components/CriticalActionDialog/CriticalActionDialog.js +2 -1
  18. package/dist/components/CriticalActionDialog/CriticalActionDialog.js.map +1 -1
  19. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.d.ts +1 -21
  20. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.js +40 -126
  21. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.js.map +1 -1
  22. package/dist/components/DiskCapacityInfo/i18n/en.json +0 -1
  23. package/dist/components/DiskCapacityInfo/i18n/index.d.ts +1 -1
  24. package/dist/components/EntityStatus/EntityStatus.d.ts +18 -6
  25. package/dist/components/EntityStatus/EntityStatus.js +5 -1
  26. package/dist/components/EntityStatus/EntityStatus.js.map +1 -1
  27. package/dist/components/EntityStatus/EntityStatus.scss +5 -0
  28. package/dist/components/EvictVDiskButton/EvictVDiskButton.d.ts +5 -2
  29. package/dist/components/EvictVDiskButton/EvictVDiskButton.js +3 -2
  30. package/dist/components/EvictVDiskButton/EvictVDiskButton.js.map +1 -1
  31. package/dist/components/EvictVDiskButton/i18n/en.json +2 -2
  32. package/dist/components/FullNodeViewer/FullNodeViewer.js +4 -7
  33. package/dist/components/FullNodeViewer/FullNodeViewer.js.map +1 -1
  34. package/dist/components/FullNodeViewer/i18n/index.d.ts +1 -1
  35. package/dist/components/HideUnavailableNodesSwitch/HideUnavailableNodesSwitch.d.ts +3 -0
  36. package/dist/components/HideUnavailableNodesSwitch/HideUnavailableNodesSwitch.js +12 -0
  37. package/dist/components/HideUnavailableNodesSwitch/HideUnavailableNodesSwitch.js.map +1 -0
  38. package/dist/components/HideUnavailableNodesSwitch/i18n/en.json +3 -0
  39. package/dist/components/HideUnavailableNodesSwitch/i18n/index.d.ts +2 -0
  40. package/dist/components/HideUnavailableNodesSwitch/i18n/index.js +6 -0
  41. package/dist/components/HideUnavailableNodesSwitch/i18n/index.js.map +1 -0
  42. package/dist/components/HideUnavailableNodesSwitch/i18n/ru.json +3 -0
  43. package/dist/components/HoverPopup/HoverPopup.d.ts +1 -0
  44. package/dist/components/HoverPopup/HoverPopup.js +87 -16
  45. package/dist/components/HoverPopup/HoverPopup.js.map +1 -1
  46. package/dist/components/MemoryViewer/MemoryViewer.d.ts +3 -1
  47. package/dist/components/MemoryViewer/MemoryViewer.js +25 -16
  48. package/dist/components/MemoryViewer/MemoryViewer.js.map +1 -1
  49. package/dist/components/MemoryViewer/i18n/en.json +4 -3
  50. package/dist/components/MemoryViewer/i18n/index.d.ts +1 -1
  51. package/dist/components/MemoryViewer/utils.d.ts +4 -2
  52. package/dist/components/MemoryViewer/utils.js +11 -11
  53. package/dist/components/MemoryViewer/utils.js.map +1 -1
  54. package/dist/components/PDiskInfo/PDiskInfo.d.ts +4 -9
  55. package/dist/components/PDiskInfo/PDiskInfo.js +32 -144
  56. package/dist/components/PDiskInfo/PDiskInfo.js.map +1 -1
  57. package/dist/components/PDiskInfo/PDiskInfo.scss +15 -0
  58. package/dist/components/PDiskInfo/PDiskLogSize.js +1 -1
  59. package/dist/components/PDiskInfo/PDiskLogSize.js.map +1 -1
  60. package/dist/components/PDiskInfo/i18n/en.json +6 -3
  61. package/dist/components/PDiskInfo/i18n/index.d.ts +1 -1
  62. package/dist/components/PDiskInfo/statuses.js +12 -3
  63. package/dist/components/PDiskInfo/statuses.js.map +1 -1
  64. package/dist/components/PageMeta/PageMeta.d.ts +0 -2
  65. package/dist/components/PageMeta/PageMeta.js +1 -6
  66. package/dist/components/PageMeta/PageMeta.js.map +1 -1
  67. package/dist/components/Search/Search.js +3 -1
  68. package/dist/components/Search/Search.js.map +1 -1
  69. package/dist/components/StorageGroupInfo/StorageGroupInfo.js +4 -9
  70. package/dist/components/StorageGroupInfo/StorageGroupInfo.js.map +1 -1
  71. package/dist/components/StorageGroupInfo/i18n/index.d.ts +1 -1
  72. package/dist/components/TenantNameWrapper/i18n/index.d.ts +1 -1
  73. package/dist/components/VDisk/VDisk.js +2 -2
  74. package/dist/components/VDisk/VDisk.js.map +1 -1
  75. package/dist/components/VDiskInfo/VDiskInfo.d.ts +3 -7
  76. package/dist/components/VDiskInfo/VDiskInfo.js +57 -235
  77. package/dist/components/VDiskInfo/VDiskInfo.js.map +1 -1
  78. package/dist/components/VDiskInfo/VDiskInfo.scss +19 -3
  79. package/dist/components/VDiskInfo/getVDiskDetails.d.ts +7 -1
  80. package/dist/components/VDiskInfo/getVDiskDetails.js +14 -1
  81. package/dist/components/VDiskInfo/getVDiskDetails.js.map +1 -1
  82. package/dist/components/VDiskInfo/i18n/en.json +4 -13
  83. package/dist/components/VDiskInfo/i18n/index.d.ts +1 -1
  84. package/dist/components/VDiskPopup/VDiskPopup.d.ts +2 -1
  85. package/dist/components/VDiskPopup/VDiskPopup.js +10 -26
  86. package/dist/components/VDiskPopup/VDiskPopup.js.map +1 -1
  87. package/dist/components/VDiskPopup/i18n/en.json +0 -2
  88. package/dist/components/VDiskPopup/i18n/index.d.ts +1 -1
  89. package/dist/components/VDiskStatus/VDiskReplicationStatus.js +1 -1
  90. package/dist/components/VDiskStatus/VDiskReplicationStatus.js.map +1 -1
  91. package/dist/components/VDiskStatus/VDiskStatus.js +2 -2
  92. package/dist/components/VDiskStatus/VDiskStatus.js.map +1 -1
  93. package/dist/components/VDiskStatus/VDiskStatus.scss +4 -0
  94. package/dist/components/VDiskStatus/statuses.js +2 -2
  95. package/dist/components/VDiskStatus/statuses.js.map +1 -1
  96. package/dist/components/nodesColumns/columns.d.ts +1 -0
  97. package/dist/components/nodesColumns/columns.js +13 -6
  98. package/dist/components/nodesColumns/columns.js.map +1 -1
  99. package/dist/containers/Clusters/Clusters.js +35 -6
  100. package/dist/containers/Clusters/Clusters.js.map +1 -1
  101. package/dist/containers/Clusters/Clusters.scss +24 -6
  102. package/dist/containers/Clusters/columns.js +9 -4
  103. package/dist/containers/Clusters/columns.js.map +1 -1
  104. package/dist/containers/Clusters/i18n/en.json +6 -0
  105. package/dist/containers/Clusters/i18n/index.d.ts +1 -1
  106. package/dist/containers/Header/Header.js +8 -0
  107. package/dist/containers/Header/Header.js.map +1 -1
  108. package/dist/containers/Header/HeaderLeftControls.js +3 -1
  109. package/dist/containers/Header/HeaderLeftControls.js.map +1 -1
  110. package/dist/containers/Header/PDiskLeftControls.d.ts +1 -0
  111. package/dist/containers/Header/PDiskLeftControls.js +24 -0
  112. package/dist/containers/Header/PDiskLeftControls.js.map +1 -0
  113. package/dist/containers/Header/VDiskLeftControls.d.ts +1 -0
  114. package/dist/containers/Header/VDiskLeftControls.js +23 -0
  115. package/dist/containers/Header/VDiskLeftControls.js.map +1 -0
  116. package/dist/containers/Header/breadcrumbs.js +5 -2
  117. package/dist/containers/Header/breadcrumbs.js.map +1 -1
  118. package/dist/containers/Header/i18n/en.json +4 -1
  119. package/dist/containers/Header/i18n/index.d.ts +1 -1
  120. package/dist/containers/Node/Node.js +4 -3
  121. package/dist/containers/Node/Node.js.map +1 -1
  122. package/dist/containers/Node/Node.scss +14 -2
  123. package/dist/containers/Nodes/NodesControls/NodesControls.js +2 -1
  124. package/dist/containers/Nodes/NodesControls/NodesControls.js.map +1 -1
  125. package/dist/containers/Nodes/NodesTable.js +4 -0
  126. package/dist/containers/Nodes/NodesTable.js.map +1 -1
  127. package/dist/containers/Nodes/PaginatedNodes/GroupedNodesComponent.js +8 -3
  128. package/dist/containers/Nodes/PaginatedNodes/GroupedNodesComponent.js.map +1 -1
  129. package/dist/containers/Nodes/PaginatedNodes/NodesComponent.js +12 -2
  130. package/dist/containers/Nodes/PaginatedNodes/NodesComponent.js.map +1 -1
  131. package/dist/containers/Nodes/getNodes.js +2 -1
  132. package/dist/containers/Nodes/getNodes.js.map +1 -1
  133. package/dist/containers/Nodes/useDebouncedSearch.d.ts +2 -0
  134. package/dist/containers/Nodes/useDebouncedSearch.js +11 -0
  135. package/dist/containers/Nodes/useDebouncedSearch.js.map +1 -0
  136. package/dist/containers/PDiskPage/PDiskPage.js +24 -34
  137. package/dist/containers/PDiskPage/PDiskPage.js.map +1 -1
  138. package/dist/containers/PDiskPage/PDiskPage.scss +29 -11
  139. package/dist/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.js +3 -3
  140. package/dist/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.js.map +1 -1
  141. package/dist/containers/PDiskPage/PDiskStorageDetails.d.ts +6 -0
  142. package/dist/containers/PDiskPage/PDiskStorageDetails.js +28 -0
  143. package/dist/containers/PDiskPage/PDiskStorageDetails.js.map +1 -0
  144. package/dist/containers/PDiskPage/PDiskStorageDetails.scss +51 -0
  145. package/dist/containers/PDiskPage/i18n/en.json +1 -0
  146. package/dist/containers/PDiskPage/i18n/index.d.ts +1 -1
  147. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/i18n/index.d.ts +1 -1
  148. package/dist/containers/Storage/PaginatedStorageNodes/GroupedStorageNodesComponent.js +3 -0
  149. package/dist/containers/Storage/PaginatedStorageNodes/GroupedStorageNodesComponent.js.map +1 -1
  150. package/dist/containers/Storage/PaginatedStorageNodes/StorageNodesComponent.js +8 -1
  151. package/dist/containers/Storage/PaginatedStorageNodes/StorageNodesComponent.js.map +1 -1
  152. package/dist/containers/Storage/PaginatedStorageNodes/StorageNodesControls.js +2 -1
  153. package/dist/containers/Storage/PaginatedStorageNodes/StorageNodesControls.js.map +1 -1
  154. package/dist/containers/Storage/PaginatedStorageNodesTable/PaginatedStorageNodesTable.js +4 -0
  155. package/dist/containers/Storage/PaginatedStorageNodesTable/PaginatedStorageNodesTable.js.map +1 -1
  156. package/dist/containers/Storage/PaginatedStorageNodesTable/getNodes.js +2 -1
  157. package/dist/containers/Storage/PaginatedStorageNodesTable/getNodes.js.map +1 -1
  158. package/dist/containers/Storage/Storage.scss +4 -0
  159. package/dist/containers/Storage/StorageExpertModePanel/constants.d.ts +1 -1
  160. package/dist/containers/Storage/StorageExpertModePanel/i18n/index.d.ts +1 -1
  161. package/dist/containers/Storage/useStorageQueryParams.d.ts +4 -4
  162. package/dist/containers/StorageGroupPage/StorageGroupPage.js +5 -14
  163. package/dist/containers/StorageGroupPage/StorageGroupPage.js.map +1 -1
  164. package/dist/containers/StorageGroupPage/StorageGroupPage.scss +19 -4
  165. package/dist/containers/StorageGroupPage/i18n/en.json +0 -2
  166. package/dist/containers/StorageGroupPage/i18n/index.d.ts +1 -1
  167. package/dist/containers/Tablet/Tablet.js +3 -2
  168. package/dist/containers/Tablet/Tablet.js.map +1 -1
  169. package/dist/containers/Tablet/Tablet.scss +15 -1
  170. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/ManagePartitioningDialog/i18n/index.d.ts +1 -1
  171. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.js +5 -12
  172. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.js.map +1 -1
  173. package/dist/containers/Tenant/Diagnostics/TopQueries/columns/i18n/index.d.ts +1 -1
  174. package/dist/containers/Tenant/Healthcheck/Healthcheck.scss +6 -1
  175. package/dist/containers/Tenant/Healthcheck/components/HealthcheckIssue.js +2 -2
  176. package/dist/containers/Tenant/Healthcheck/components/HealthcheckIssue.js.map +1 -1
  177. package/dist/containers/Tenant/TenantDrawerHealthcheck.js +10 -2
  178. package/dist/containers/Tenant/TenantDrawerHealthcheck.js.map +1 -1
  179. package/dist/containers/VDiskPage/VDiskPage.js +27 -36
  180. package/dist/containers/VDiskPage/VDiskPage.js.map +1 -1
  181. package/dist/containers/VDiskPage/VDiskPage.scss +39 -7
  182. package/dist/containers/VDiskPage/VDiskStorageDetails.js +27 -29
  183. package/dist/containers/VDiskPage/VDiskStorageDetails.js.map +1 -1
  184. package/dist/containers/VDiskPage/VDiskStorageDetails.scss +24 -93
  185. package/dist/containers/VDiskPage/i18n/en.json +2 -12
  186. package/dist/containers/VDiskPage/i18n/index.d.ts +1 -1
  187. package/dist/store/reducers/capabilities/hooks.d.ts +1 -0
  188. package/dist/store/reducers/capabilities/hooks.js +3 -0
  189. package/dist/store/reducers/capabilities/hooks.js.map +1 -1
  190. package/dist/store/reducers/cluster/parseFields.js +1 -0
  191. package/dist/store/reducers/cluster/parseFields.js.map +1 -1
  192. package/dist/store/reducers/clusters/clusters.js +1 -0
  193. package/dist/store/reducers/clusters/clusters.js.map +1 -1
  194. package/dist/store/reducers/clusters/selectors.d.ts +1 -0
  195. package/dist/store/reducers/clusters/selectors.js +4 -1
  196. package/dist/store/reducers/clusters/selectors.js.map +1 -1
  197. package/dist/store/reducers/clusters/types.d.ts +2 -0
  198. package/dist/store/reducers/nodes/types.d.ts +1 -0
  199. package/dist/store/reducers/storage/prepareGroupsDisks.d.ts +1 -1
  200. package/dist/store/reducers/storage/prepareGroupsDisks.js +2 -1
  201. package/dist/store/reducers/storage/prepareGroupsDisks.js.map +1 -1
  202. package/dist/store/reducers/storage/types.d.ts +1 -0
  203. package/dist/store/reducers/storage/utils.js +10 -3
  204. package/dist/store/reducers/storage/utils.js.map +1 -1
  205. package/dist/store/reducers/vdisk/types.d.ts +1 -1
  206. package/dist/store/reducers/vdisk/utils.js +5 -5
  207. package/dist/store/reducers/vdisk/utils.js.map +1 -1
  208. package/dist/types/api/capabilities.d.ts +1 -1
  209. package/dist/types/api/meta.d.ts +1 -0
  210. package/dist/types/api/nodes.d.ts +2 -0
  211. package/dist/types/api/nodesList.d.ts +2 -0
  212. package/dist/utils/hooks/useDatabaseHealthcheckAvailable.d.ts +2 -0
  213. package/dist/utils/hooks/useDatabaseHealthcheckAvailable.js +6 -0
  214. package/dist/utils/hooks/useDatabaseHealthcheckAvailable.js.map +1 -0
  215. package/dist/utils/hooks/useHideUnavailableNodes.d.ts +5 -0
  216. package/dist/utils/hooks/useHideUnavailableNodes.js +21 -0
  217. package/dist/utils/hooks/useHideUnavailableNodes.js.map +1 -0
  218. package/dist/utils/memory.d.ts +5 -0
  219. package/dist/utils/memory.js +9 -0
  220. package/dist/utils/memory.js.map +1 -0
  221. package/dist/utils/nodes.js +3 -3
  222. package/dist/utils/nodes.js.map +1 -1
  223. package/dist/utils/storageMetrics.d.ts +1 -0
  224. package/dist/utils/storageMetrics.js +8 -0
  225. package/dist/utils/storageMetrics.js.map +1 -1
  226. package/package.json +1 -1
  227. package/src/components/AutoRefreshControl/StickyAutoRefreshControl.scss +18 -0
  228. package/src/components/AutoRefreshControl/StickyAutoRefreshControl.tsx +15 -0
  229. package/src/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.tsx +22 -3
  230. package/src/components/CopyableValue/CopyableValue.scss +16 -0
  231. package/src/components/CopyableValue/CopyableValue.tsx +40 -0
  232. package/src/components/CopyableValue/i18n/en.json +3 -0
  233. package/src/components/CopyableValue/i18n/index.ts +8 -0
  234. package/src/components/CriticalActionDialog/CriticalActionDialog.tsx +3 -0
  235. package/src/components/DiskCapacityInfo/DiskCapacityInfo.tsx +40 -185
  236. package/src/components/DiskCapacityInfo/i18n/en.json +0 -1
  237. package/src/components/EntityStatus/EntityStatus.scss +5 -0
  238. package/src/components/EntityStatus/EntityStatus.tsx +38 -5
  239. package/src/components/EvictVDiskButton/EvictVDiskButton.tsx +10 -2
  240. package/src/components/EvictVDiskButton/i18n/en.json +2 -2
  241. package/src/components/FullNodeViewer/FullNodeViewer.tsx +4 -9
  242. package/src/components/HideUnavailableNodesSwitch/HideUnavailableNodesSwitch.tsx +24 -0
  243. package/src/components/HideUnavailableNodesSwitch/i18n/en.json +3 -0
  244. package/src/components/HideUnavailableNodesSwitch/i18n/index.ts +7 -0
  245. package/src/components/HideUnavailableNodesSwitch/i18n/ru.json +3 -0
  246. package/src/components/HoverPopup/HoverPopup.tsx +95 -19
  247. package/src/components/MemoryViewer/MemoryViewer.tsx +30 -17
  248. package/src/components/MemoryViewer/i18n/en.json +4 -3
  249. package/src/components/MemoryViewer/utils.ts +19 -12
  250. package/src/components/PDiskInfo/PDiskInfo.scss +15 -0
  251. package/src/components/PDiskInfo/PDiskInfo.tsx +51 -243
  252. package/src/components/PDiskInfo/PDiskLogSize.tsx +12 -8
  253. package/src/components/PDiskInfo/i18n/en.json +6 -3
  254. package/src/components/PDiskInfo/statuses.ts +16 -3
  255. package/src/components/PageMeta/PageMeta.tsx +0 -18
  256. package/src/components/Search/Search.tsx +5 -2
  257. package/src/components/StorageGroupInfo/StorageGroupInfo.tsx +8 -13
  258. package/src/components/VDisk/VDisk.tsx +3 -2
  259. package/src/components/VDiskInfo/VDiskInfo.scss +19 -3
  260. package/src/components/VDiskInfo/VDiskInfo.tsx +119 -341
  261. package/src/components/VDiskInfo/getVDiskDetails.tsx +24 -2
  262. package/src/components/VDiskInfo/i18n/en.json +4 -13
  263. package/src/components/VDiskPopup/VDiskPopup.tsx +16 -24
  264. package/src/components/VDiskPopup/i18n/en.json +0 -2
  265. package/src/components/VDiskStatus/VDiskReplicationStatus.tsx +1 -1
  266. package/src/components/VDiskStatus/VDiskStatus.scss +4 -0
  267. package/src/components/VDiskStatus/VDiskStatus.tsx +13 -2
  268. package/src/components/VDiskStatus/statuses.ts +2 -2
  269. package/src/components/nodesColumns/columns.tsx +26 -12
  270. package/src/containers/Clusters/Clusters.scss +24 -6
  271. package/src/containers/Clusters/Clusters.tsx +74 -5
  272. package/src/containers/Clusters/columns.tsx +36 -6
  273. package/src/containers/Clusters/i18n/en.json +6 -0
  274. package/src/containers/Header/Header.tsx +8 -0
  275. package/src/containers/Header/HeaderLeftControls.tsx +3 -1
  276. package/src/containers/Header/PDiskLeftControls.tsx +41 -0
  277. package/src/containers/Header/VDiskLeftControls.tsx +40 -0
  278. package/src/containers/Header/breadcrumbs.tsx +4 -2
  279. package/src/containers/Header/i18n/en.json +4 -1
  280. package/src/containers/Node/Node.scss +14 -2
  281. package/src/containers/Node/Node.tsx +6 -6
  282. package/src/containers/Nodes/NodesControls/NodesControls.tsx +3 -0
  283. package/src/containers/Nodes/NodesTable.tsx +4 -0
  284. package/src/containers/Nodes/PaginatedNodes/GroupedNodesComponent.tsx +8 -3
  285. package/src/containers/Nodes/PaginatedNodes/NodesComponent.tsx +12 -2
  286. package/src/containers/Nodes/getNodes.ts +2 -0
  287. package/src/containers/Nodes/useDebouncedSearch.ts +13 -0
  288. package/src/containers/PDiskPage/PDiskPage.scss +29 -11
  289. package/src/containers/PDiskPage/PDiskPage.tsx +69 -63
  290. package/src/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.tsx +3 -9
  291. package/src/containers/PDiskPage/PDiskStorageDetails.scss +51 -0
  292. package/src/containers/PDiskPage/PDiskStorageDetails.tsx +64 -0
  293. package/src/containers/PDiskPage/i18n/en.json +1 -0
  294. package/src/containers/Storage/PaginatedStorageNodes/GroupedStorageNodesComponent.tsx +3 -0
  295. package/src/containers/Storage/PaginatedStorageNodes/StorageNodesComponent.tsx +8 -1
  296. package/src/containers/Storage/PaginatedStorageNodes/StorageNodesControls.tsx +2 -0
  297. package/src/containers/Storage/PaginatedStorageNodesTable/PaginatedStorageNodesTable.tsx +4 -0
  298. package/src/containers/Storage/PaginatedStorageNodesTable/getNodes.ts +2 -0
  299. package/src/containers/Storage/Storage.scss +4 -0
  300. package/src/containers/StorageGroupPage/StorageGroupPage.scss +19 -4
  301. package/src/containers/StorageGroupPage/StorageGroupPage.tsx +25 -45
  302. package/src/containers/StorageGroupPage/i18n/en.json +0 -2
  303. package/src/containers/Tablet/Tablet.scss +15 -1
  304. package/src/containers/Tablet/Tablet.tsx +21 -15
  305. package/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.tsx +5 -32
  306. package/src/containers/Tenant/Healthcheck/Healthcheck.scss +6 -1
  307. package/src/containers/Tenant/Healthcheck/components/HealthcheckIssue.tsx +18 -8
  308. package/src/containers/Tenant/TenantDrawerHealthcheck.tsx +14 -1
  309. package/src/containers/VDiskPage/VDiskPage.scss +39 -7
  310. package/src/containers/VDiskPage/VDiskPage.tsx +84 -72
  311. package/src/containers/VDiskPage/VDiskStorageDetails.scss +24 -93
  312. package/src/containers/VDiskPage/VDiskStorageDetails.tsx +50 -158
  313. package/src/containers/VDiskPage/i18n/en.json +2 -14
  314. package/src/store/reducers/capabilities/hooks.ts +4 -0
  315. package/src/store/reducers/cluster/parseFields.ts +1 -0
  316. package/src/store/reducers/clusters/clusters.ts +1 -0
  317. package/src/store/reducers/clusters/selectors.ts +4 -0
  318. package/src/store/reducers/clusters/types.ts +3 -0
  319. package/src/store/reducers/nodes/types.ts +1 -0
  320. package/src/store/reducers/storage/prepareGroupsDisks.ts +2 -0
  321. package/src/store/reducers/storage/types.ts +1 -0
  322. package/src/store/reducers/storage/utils.ts +13 -3
  323. package/src/store/reducers/vdisk/types.ts +2 -1
  324. package/src/store/reducers/vdisk/utils.ts +4 -5
  325. package/src/types/api/capabilities.ts +1 -0
  326. package/src/types/api/meta.ts +1 -0
  327. package/src/types/api/nodes.ts +2 -0
  328. package/src/types/api/nodesList.ts +3 -0
  329. package/src/utils/hooks/useDatabaseHealthcheckAvailable.ts +9 -0
  330. package/src/utils/hooks/useHideUnavailableNodes.ts +33 -0
  331. package/src/utils/memory.ts +16 -0
  332. package/src/utils/nodes.ts +3 -2
  333. package/src/utils/storageMetrics.ts +11 -0
  334. package/dist/components/VDiskInfo/getVDiskCapacityColumns.d.ts +0 -11
  335. package/dist/components/VDiskInfo/getVDiskCapacityColumns.js +0 -52
  336. package/dist/components/VDiskInfo/getVDiskCapacityColumns.js.map +0 -1
  337. package/src/components/VDiskInfo/getVDiskCapacityColumns.tsx +0 -83
@@ -0,0 +1,40 @@
1
+ import {ClipboardButton, Flex} from '@gravity-ui/uikit';
2
+ import {skipToken} from '@reduxjs/toolkit/query';
3
+ import {StringParam, useQueryParams} from 'use-query-params';
4
+
5
+ import {VDiskStateLabel} from '../../components/VDiskStatus';
6
+ import {vDiskApi} from '../../store/reducers/vdisk/vdisk';
7
+
8
+ import {b} from './constants';
9
+ import {headerKeyset} from './i18n';
10
+
11
+ export function VDiskLeftControls() {
12
+ const [{vDiskId, nodeId, database}] = useQueryParams({
13
+ vDiskId: StringParam,
14
+ nodeId: StringParam,
15
+ database: StringParam,
16
+ });
17
+ const {currentData} = vDiskApi.endpoints.getVDiskData.useQueryState(
18
+ vDiskId
19
+ ? {vDiskId, nodeId: nodeId ?? undefined, database: database ?? undefined}
20
+ : skipToken,
21
+ );
22
+
23
+ if (!vDiskId) {
24
+ return null;
25
+ }
26
+
27
+ return (
28
+ <Flex alignItems="center" gap={2} className={b('left-controls')}>
29
+ <ClipboardButton
30
+ text={vDiskId}
31
+ size="s"
32
+ view="flat-secondary"
33
+ color="secondary"
34
+ aria-label={headerKeyset('action_copy-vdisk-id')}
35
+ tooltipInitialText={headerKeyset('action_copy-vdisk-id')}
36
+ />
37
+ <VDiskStateLabel state={currentData?.VDiskState} size="xs" />
38
+ </Flex>
39
+ );
40
+ }
@@ -35,6 +35,7 @@ import {
35
35
  TENANT_PAGES_IDS,
36
36
  } from '../../store/reducers/tenant/constants';
37
37
  import {CLUSTER_DEFAULT_TITLE, UNBREAKABLE_GAP, getTabletLabel} from '../../utils/constants';
38
+ import {getPDiskId} from '../../utils/disks/helpers';
38
39
  import {TenantTabsGroups} from '../Tenant/TenantPages';
39
40
 
40
41
  import {headerKeyset} from './i18n';
@@ -205,8 +206,9 @@ const getPDiskBreadcrumbs: GetBreadcrumbs<PDiskBreadcrumbsOptions> = (options, q
205
206
  });
206
207
 
207
208
  let text = headerKeyset('breadcrumbs.pDisk');
208
- if (pDiskId) {
209
- text += ` ${pDiskId}`;
209
+ const diskId = getPDiskId({nodeId, pDiskId}) ?? pDiskId;
210
+ if (diskId) {
211
+ text += ` ${diskId}`;
210
212
  }
211
213
 
212
214
  const hasLink = pDiskId && nodeId;
@@ -26,5 +26,8 @@
26
26
  "title_monitoring": "Open in {{system}}",
27
27
  "action_copy-path": "Copy path",
28
28
  "action_copy-group-id": "Copy Storage Group ID",
29
- "action_copy-group-id-from-breadcrumb": "Copy Storage Group ID from breadcrumb"
29
+ "action_copy-group-id-from-breadcrumb": "Copy Storage Group ID from breadcrumb",
30
+ "action_copy-vdisk-id": "Copy VDisk ID",
31
+ "action_copy-pdisk-id": "Copy PDisk ID",
32
+ "action_copy-pdisk-id-from-breadcrumb": "Copy PDisk ID from breadcrumb"
30
33
  }
@@ -1,8 +1,10 @@
1
1
  @use '../../styles/mixins';
2
2
 
3
3
  .node {
4
+ --sticky-tabs-height: 40px;
5
+ --data-table-start: var(--sticky-tabs-height);
4
6
  --ydb-configs-controls-height: 62px;
5
- --ydb-configs-container-height: calc(100vh - var(--header-height));
7
+ --ydb-configs-container-height: calc(100vh - var(--header-height) - var(--sticky-tabs-height));
6
8
  position: relative;
7
9
 
8
10
  overflow: auto;
@@ -22,7 +24,11 @@
22
24
  }
23
25
 
24
26
  &__meta {
25
- margin-top: 20px;
27
+ display: flex;
28
+ align-items: center;
29
+
30
+ min-height: 28px;
31
+ padding-right: 121px;
26
32
  }
27
33
 
28
34
  &__tabs,
@@ -31,6 +37,12 @@
31
37
  }
32
38
 
33
39
  &__tabs {
40
+ z-index: 3;
41
+
42
+ height: var(--sticky-tabs-height);
43
+ padding-right: 125px;
44
+
45
+ @include mixins.sticky-top();
34
46
  @include mixins.tabs-wrapper-styles();
35
47
  }
36
48
  &__treads {
@@ -6,12 +6,13 @@ import {Helmet} from 'react-helmet-async';
6
6
  import {useHistory, useRouteMatch} from 'react-router-dom';
7
7
  import {useQueryParams} from 'use-query-params';
8
8
 
9
+ import {StickyAutoRefreshControl} from '../../components/AutoRefreshControl/StickyAutoRefreshControl';
9
10
  import {EntityPageTitle} from '../../components/EntityPageTitle/EntityPageTitle';
10
11
  import {ResponseError} from '../../components/Errors/ResponseError';
11
12
  import {FullNodeViewer} from '../../components/FullNodeViewer/FullNodeViewer';
12
13
  import {InfoViewerSkeleton} from '../../components/InfoViewerSkeleton/InfoViewerSkeleton';
13
14
  import {InternalLink} from '../../components/InternalLink';
14
- import {PageMetaWithAutorefresh} from '../../components/PageMeta/PageMeta';
15
+ import {PageMeta} from '../../components/PageMeta/PageMeta';
15
16
  import routes, {getDefaultNodePath} from '../../routes';
16
17
  import {
17
18
  useCapabilitiesLoaded,
@@ -161,6 +162,7 @@ export function Node() {
161
162
  return (
162
163
  <div className={b(null)} ref={container}>
163
164
  {<NodePageHelmet node={node} activeTabTitle={activeTab.title} />}
165
+ <StickyAutoRefreshControl />
164
166
  {<NodePageMeta node={node} loading={pageLoading} />}
165
167
  {<NodePageTitle node={node} />}
166
168
  {error ? <ResponseError error={error} className={b('error')} /> : null}
@@ -206,11 +208,9 @@ function NodePageMeta({node, loading}: NodePageMetaProps) {
206
208
  const dcItem = node?.DC ? `${i18n('dc')}: ${node.DC}` : undefined;
207
209
 
208
210
  return (
209
- <PageMetaWithAutorefresh
210
- loading={loading}
211
- items={[hostItem, dcItem]}
212
- className={b('meta')}
213
- />
211
+ <div className={b('meta')}>
212
+ <PageMeta loading={loading} items={[hostItem, dcItem]} />
213
+ </div>
214
214
  );
215
215
  }
216
216
 
@@ -3,6 +3,7 @@ import React from 'react';
3
3
  import {Select, Text} from '@gravity-ui/uikit';
4
4
 
5
5
  import {EntitiesCount} from '../../../components/EntitiesCount';
6
+ import {HideUnavailableNodesSwitch} from '../../../components/HideUnavailableNodesSwitch/HideUnavailableNodesSwitch';
6
7
  import {ProblemFilter} from '../../../components/ProblemFilter/ProblemFilter';
7
8
  import {Search} from '../../../components/Search';
8
9
  import {UptimeFilter} from '../../../components/UptimeFIlter';
@@ -68,6 +69,7 @@ export function NodesControls({
68
69
  <React.Fragment>
69
70
  <Search
70
71
  tableFilter
72
+ debounce={0}
71
73
  onChange={handleSearchQueryChange}
72
74
  placeholder={i18n('controls_search-placeholder')}
73
75
  width={238}
@@ -101,6 +103,7 @@ export function NodesControls({
101
103
  />
102
104
  </React.Fragment>
103
105
  ) : null}
106
+ <HideUnavailableNodesSwitch />
104
107
  <EntitiesCount
105
108
  current={entitiesCountCurrent}
106
109
  total={entitiesCountTotal}
@@ -14,6 +14,7 @@ import {useClusterWithProxy} from '../../store/reducers/cluster/cluster';
14
14
  import type {NodesFilters} from '../../store/reducers/nodes/types';
15
15
  import type {PreparedStorageNode} from '../../store/reducers/storage/types';
16
16
  import type {NodesGroupByField, NodesPeerRole} from '../../types/api/nodes';
17
+ import {useHideUnavailableNodes} from '../../utils/hooks/useHideUnavailableNodes';
17
18
  import {getIllustration} from '../../utils/illustrations';
18
19
  import {NodesUptimeFilterValues} from '../../utils/nodes';
19
20
  import {renderPaginatedTableErrorMessage} from '../../utils/renderPaginatedTableErrorMessage';
@@ -61,6 +62,7 @@ export function NodesTable({
61
62
  onDataFetched,
62
63
  }: NodesTableProps) {
63
64
  const history = useHistory();
65
+ const {hideUnavailable} = useHideUnavailableNodes();
64
66
  const SuccessImage = getIllustration('SuccessOperation');
65
67
 
66
68
  const useMetaProxy = useClusterWithProxy();
@@ -71,6 +73,7 @@ export function NodesTable({
71
73
  useMetaProxy,
72
74
  database,
73
75
  searchValue,
76
+ hideUnavailable,
74
77
  withProblems,
75
78
  uptimeFilter,
76
79
  peerRoleFilter,
@@ -78,6 +81,7 @@ export function NodesTable({
78
81
  filterGroupBy,
79
82
  };
80
83
  }, [
84
+ hideUnavailable,
81
85
  path,
82
86
  databaseFullPath,
83
87
  useMetaProxy,
@@ -14,6 +14,7 @@ import {nodesApi} from '../../../store/reducers/nodes/nodes';
14
14
  import type {PreparedStorageNode} from '../../../store/reducers/storage/types';
15
15
  import type {NodesGroupByField, NodesPeerRole} from '../../../types/api/nodes';
16
16
  import {useAutoRefreshInterval} from '../../../utils/hooks';
17
+ import {useHideUnavailableNodes} from '../../../utils/hooks/useHideUnavailableNodes';
17
18
  import {useSelectedColumns} from '../../../utils/hooks/useSelectedColumns';
18
19
  import {NodesUptimeFilterValues} from '../../../utils/nodes';
19
20
  import {TableGroup} from '../../Storage/TableGroup/TableGroup';
@@ -22,6 +23,7 @@ import {NodesControls} from '../NodesControls/NodesControls';
22
23
  import {NodesTable} from '../NodesTable';
23
24
  import i18n from '../i18n';
24
25
  import {b} from '../shared';
26
+ import {useDebouncedSearch} from '../useDebouncedSearch';
25
27
  import {useNodesPageQueryParams} from '../useNodesPageQueryParams';
26
28
 
27
29
  interface NodeGroupProps {
@@ -123,8 +125,10 @@ export function GroupedNodesComponent({
123
125
  groupByParams,
124
126
  withPeerRoleFilter,
125
127
  );
128
+ const searchFilter = useDebouncedSearch(searchValue);
126
129
  const useMetaProxy = useClusterWithProxy();
127
130
  const [autoRefreshInterval] = useAutoRefreshInterval();
131
+ const {hideUnavailable} = useHideUnavailableNodes();
128
132
 
129
133
  const {columnsToShow, columnsToSelect, setColumns} = useSelectedColumns(
130
134
  columns,
@@ -145,7 +149,8 @@ export function GroupedNodesComponent({
145
149
  {
146
150
  path: schemaPathParam,
147
151
  database,
148
- filter: searchValue.trim(),
152
+ alive: hideUnavailable || undefined,
153
+ filter: searchFilter.trim(),
149
154
  filter_peer_role: peerRoleFilter,
150
155
  group: groupByParam,
151
156
  limit: 0,
@@ -185,7 +190,7 @@ export function GroupedNodesComponent({
185
190
  path={path}
186
191
  databaseFullPath={databaseFullPath}
187
192
  database={database}
188
- searchValue={searchValue}
193
+ searchValue={searchFilter}
189
194
  peerRoleFilter={peerRoleFilter}
190
195
  groupByParam={groupByParam}
191
196
  columns={columnsToShow}
@@ -225,7 +230,7 @@ export function GroupedNodesComponent({
225
230
  table={renderGroups()}
226
231
  tableWrapperProps={{
227
232
  scrollContainerRef,
228
- scrollDependencies: [searchValue, groupByParam, tableGroups, peerRoleFilter],
233
+ scrollDependencies: [searchFilter, groupByParam, tableGroups, peerRoleFilter],
229
234
  loading: isLoading,
230
235
  className: b('groups-wrapper'),
231
236
  }}
@@ -9,8 +9,10 @@ import type {NodesColumn} from '../../../components/nodesColumns/types';
9
9
  import {useViewerNodesHandlerHasGrouping} from '../../../store/reducers/capabilities/hooks';
10
10
  import type {PreparedStorageNode} from '../../../store/reducers/storage/types';
11
11
  import type {NodesGroupByField} from '../../../types/api/nodes';
12
+ import {useHideUnavailableNodes} from '../../../utils/hooks/useHideUnavailableNodes';
12
13
  import {useSelectedColumns} from '../../../utils/hooks/useSelectedColumns';
13
14
  import {NodesTable} from '../NodesTable';
15
+ import {useDebouncedSearch} from '../useDebouncedSearch';
14
16
  import {useNodesPageQueryParams} from '../useNodesPageQueryParams';
15
17
 
16
18
  import {NodesControlsWithTableState} from './NodesControlsWithTableState';
@@ -46,7 +48,9 @@ export function NodesComponent({
46
48
  groupByParams,
47
49
  withPeerRoleFilter,
48
50
  );
51
+ const searchFilter = useDebouncedSearch(searchValue);
49
52
  const viewerNodesHandlerHasGrouping = useViewerNodesHandlerHasGrouping();
53
+ const {hideUnavailable} = useHideUnavailableNodes();
50
54
 
51
55
  const {columnsToShow, columnsToSelect, setColumns} = useSelectedColumns(
52
56
  columns,
@@ -78,7 +82,7 @@ export function NodesComponent({
78
82
  path={path}
79
83
  database={database}
80
84
  databaseFullPath={databaseFullPath}
81
- searchValue={searchValue}
85
+ searchValue={searchFilter}
82
86
  withProblems={withProblems}
83
87
  uptimeFilter={uptimeFilter}
84
88
  peerRoleFilter={peerRoleFilter}
@@ -89,7 +93,13 @@ export function NodesComponent({
89
93
  }
90
94
  tableWrapperProps={{
91
95
  scrollContainerRef,
92
- scrollDependencies: [searchValue, withProblems, uptimeFilter, peerRoleFilter],
96
+ scrollDependencies: [
97
+ searchFilter,
98
+ withProblems,
99
+ uptimeFilter,
100
+ peerRoleFilter,
101
+ hideUnavailable,
102
+ ],
93
103
  }}
94
104
  />
95
105
  );
@@ -27,6 +27,7 @@ export const getNodes: FetchData<
27
27
  useMetaProxy,
28
28
  database,
29
29
  searchValue,
30
+ hideUnavailable,
30
31
  withProblems,
31
32
  uptimeFilter,
32
33
  peerRoleFilter,
@@ -53,6 +54,7 @@ export const getNodes: FetchData<
53
54
  path: schemePathParam,
54
55
  database,
55
56
  filter: searchValue?.trim(),
57
+ alive: hideUnavailable || undefined,
56
58
  problems_only: withProblems,
57
59
  uptime: getUptimeParamValue(uptimeFilter),
58
60
  filter_peer_role: peerRoleFilter,
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+
3
+ /** Debounce the table filter, never the input or its URL value. */
4
+ export function useDebouncedSearch(searchValue: string) {
5
+ const [debouncedSearch, setDebouncedSearch] = React.useState(searchValue);
6
+
7
+ React.useEffect(() => {
8
+ const timer = window.setTimeout(() => setDebouncedSearch(searchValue), 200);
9
+ return () => window.clearTimeout(timer);
10
+ }, [searchValue]);
11
+
12
+ return debouncedSearch;
13
+ }
@@ -1,15 +1,18 @@
1
1
  @use '../../styles//mixins.scss';
2
2
 
3
3
  .ydb-pdisk-page {
4
+ --sticky-tabs-height: 40px;
5
+ --data-table-start: var(--sticky-tabs-height);
4
6
  position: relative;
5
7
 
6
8
  overflow: auto;
9
+ overflow-anchor: none;
7
10
 
8
11
  height: 100%;
9
12
  padding: 0 20px;
10
13
 
11
- &__meta,
12
14
  &__title,
15
+ &__storage-details,
13
16
  &__info,
14
17
  &__controls,
15
18
  &__tabs {
@@ -19,8 +22,23 @@
19
22
  margin-bottom: 20px;
20
23
  }
21
24
 
22
- &__meta {
23
- margin-top: 20px;
25
+ &__heading {
26
+ margin: 0;
27
+ overflow-wrap: anywhere;
28
+ }
29
+
30
+ &__title-content {
31
+ flex: 1;
32
+
33
+ min-width: 0;
34
+ }
35
+
36
+ &__title {
37
+ padding-right: 125px;
38
+ }
39
+
40
+ &__storage-details {
41
+ margin-bottom: var(--g-spacing-4);
24
42
  }
25
43
 
26
44
  &__tabs {
@@ -31,20 +49,20 @@
31
49
  padding: 20px 0;
32
50
  }
33
51
 
34
- &__title {
35
- display: flex;
36
- flex-direction: row;
37
- align-items: center;
38
- gap: var(--g-spacing-2);
39
- }
40
-
41
52
  &__controls {
42
53
  display: flex;
54
+ flex-wrap: wrap;
43
55
  align-items: center;
44
- gap: var(--g-spacing-2);
56
+ gap: var(--g-spacing-3);
45
57
  }
46
58
 
47
59
  &__tabs {
60
+ z-index: 3;
61
+
62
+ height: var(--sticky-tabs-height);
63
+ padding-right: 125px;
64
+
65
+ @include mixins.sticky-top();
48
66
  @include mixins.tabs-wrapper-styles();
49
67
  }
50
68
  }
@@ -1,36 +1,44 @@
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 {ArrowRotateLeft, Wrench} from '@gravity-ui/icons';
4
+ import {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
7
  import {StringParam, useQueryParams} from 'use-query-params';
8
8
  import {z} from 'zod';
9
9
 
10
+ import {StickyAutoRefreshControl} from '../../components/AutoRefreshControl/StickyAutoRefreshControl';
10
11
  import {ButtonWithConfirmDialog} from '../../components/ButtonWithConfirmDialog/ButtonWithConfirmDialog';
11
- import {EntityPageTitle} from '../../components/EntityPageTitle/EntityPageTitle';
12
+ import {CopyableValue} from '../../components/CopyableValue/CopyableValue';
13
+ import {DiskStatusLabel, DiskTypeLabel} from '../../components/DiskStatus/DiskStatus';
12
14
  import {ResponseError} from '../../components/Errors/ResponseError';
13
15
  import {InfoViewerSkeleton} from '../../components/InfoViewerSkeleton/InfoViewerSkeleton';
14
16
  import {InternalLink} from '../../components/InternalLink/InternalLink';
17
+ import {LinkWithIcon} from '../../components/LinkWithIcon/LinkWithIcon';
15
18
  import {PDiskInfo} from '../../components/PDiskInfo/PDiskInfo';
16
- import {PageMetaWithAutorefresh} from '../../components/PageMeta/PageMeta';
19
+ import {
20
+ getPDiskDecommitLabel,
21
+ getPDiskDriveLabel,
22
+ getPDiskMaintenanceLabel,
23
+ getPDiskStateLabel,
24
+ } from '../../components/PDiskInfo/statuses';
17
25
  import {getPDiskPagePath} from '../../routes';
18
26
  import {api} from '../../store/reducers/api';
19
27
  import {useDiskPagesAvailable} from '../../store/reducers/capabilities/hooks';
20
28
  import {setHeaderBreadcrumbs} from '../../store/reducers/header/header';
21
29
  import {pDiskApi} from '../../store/reducers/pdisk/pdisk';
22
- import type {EDecommitStatus} from '../../types/api/pdisk';
23
30
  import {valueIsDefined} from '../../utils';
24
31
  import {cn} from '../../utils/cn';
25
- import {getDataSeverityColor, getPDiskId} from '../../utils/disks/helpers';
32
+ import {EMPTY_DATA_PLACEHOLDER} from '../../utils/constants';
33
+ import {createPDiskDeveloperUILink, useHasDeveloperUi} from '../../utils/developerUI/developerUI';
34
+ import {getPDiskId} from '../../utils/disks/helpers';
26
35
  import {useAutoRefreshInterval, useTypedDispatch} from '../../utils/hooks';
27
36
  import {useIsUserAllowedToMakeChanges} from '../../utils/hooks/useIsUserAllowedToMakeChanges';
28
37
  import {useAppTitle} from '../App/AppTitleContext';
29
38
  import {PaginatedStorage} from '../Storage/PaginatedStorage';
30
39
 
31
- import {DecommissionButton} from './DecommissionButton/DecommissionButton';
32
- import {DecommissionLabel} from './DecommissionLabel/DecommissionLabel';
33
40
  import {PDiskSpaceDistribution} from './PDiskSpaceDistribution/PDiskSpaceDistribution';
41
+ import {PDiskStorageDetails} from './PDiskStorageDetails';
34
42
  import {pDiskPageKeyset} from './i18n';
35
43
 
36
44
  import './PDiskPage.scss';
@@ -61,6 +69,7 @@ const pDiskTabSchema = z.nativeEnum(PDISK_TABS_IDS).catch(PDISK_TABS_IDS.spaceDi
61
69
 
62
70
  export function PDiskPage() {
63
71
  const dispatch = useTypedDispatch();
72
+ const hasDeveloperUi = useHasDeveloperUi();
64
73
 
65
74
  const isUserAllowedToMakeChanges = useIsUserAllowedToMakeChanges();
66
75
  const newDiskApiAvailable = useDiskPagesAvailable();
@@ -87,7 +96,8 @@ export function PDiskPage() {
87
96
  });
88
97
  const pDiskLoading = pdiskDataQuery.isFetching && pdiskDataQuery.currentData === undefined;
89
98
  const pDiskData = pdiskDataQuery.currentData;
90
- const {NodeHost, NodeId, NodeType, NodeDC, Severity, DecommitStatus} = pDiskData || {};
99
+ const {NodeHost, DecommitStatus} = pDiskData || {};
100
+ const diskId = getPDiskId({nodeId, pDiskId});
91
101
 
92
102
  const handleRestart = async (isRetry?: boolean) => {
93
103
  if (pDiskParamsDefined) {
@@ -105,27 +115,6 @@ export function PDiskPage() {
105
115
  }
106
116
  };
107
117
 
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
118
  const handleAfterAction = () => {
130
119
  if (pDiskParamsDefined) {
131
120
  dispatch(
@@ -152,40 +141,53 @@ export function PDiskPage() {
152
141
  );
153
142
  };
154
143
 
155
- const renderPageMeta = () => {
156
- const hostItem = NodeHost ? `${pDiskPageKeyset('fqdn')}: ${NodeHost}` : undefined;
157
- const nodeIdItem = NodeId ? `${pDiskPageKeyset('node')}: ${NodeId}` : undefined;
158
-
159
- return (
160
- <PageMetaWithAutorefresh
161
- loading={pDiskLoading}
162
- items={[hostItem, nodeIdItem, NodeType, NodeDC]}
163
- className={pdiskPageCn('meta')}
164
- />
165
- );
166
- };
167
-
168
144
  const renderPageTitle = () => {
145
+ const statusLabels = [
146
+ {id: 'state', label: getPDiskStateLabel(pDiskData?.State)},
147
+ {id: 'drive', label: getPDiskDriveLabel(pDiskData?.DriveStatus)},
148
+ {id: 'decommit', label: getPDiskDecommitLabel(DecommitStatus)},
149
+ {id: 'maintenance', label: getPDiskMaintenanceLabel(pDiskData?.MaintenanceStatus)},
150
+ ];
169
151
  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>
152
+ <Flex
153
+ className={pdiskPageCn('title')}
154
+ gap={2}
155
+ alignItems="flex-start"
156
+ qa="pdisk-header"
157
+ >
158
+ <Flex
159
+ className={pdiskPageCn('title-content')}
160
+ gap={3}
161
+ alignItems="center"
162
+ wrap="wrap"
163
+ >
164
+ <CopyableValue copyText={diskId} fieldName={pDiskPageKeyset('pdisk')}>
165
+ <Text as="h1" variant="header-1" className={pdiskPageCn('heading')}>
166
+ {pDiskPageKeyset('pdisk')}{' '}
167
+ <Text color="hint" variant="header-1">
168
+ {diskId || EMPTY_DATA_PLACEHOLDER}
169
+ </Text>
170
+ </Text>
171
+ </CopyableValue>
172
+ <Flex gap={2} alignItems="center" wrap="wrap">
173
+ {statusLabels.map(({id, label}) =>
174
+ label ? <DiskStatusLabel key={id} {...label} iconSize={14} /> : null,
175
+ )}
176
+ <DiskTypeLabel type={pDiskData?.Type} size="s" />
177
+ </Flex>
178
+ </Flex>
179
+ </Flex>
178
180
  );
179
181
  };
180
182
 
181
183
  const renderControls = () => {
182
184
  return (
183
- <div className={pdiskPageCn('controls')}>
185
+ <div className={pdiskPageCn('controls')} data-qa="pdisk-controls">
184
186
  <ButtonWithConfirmDialog
185
187
  onConfirmAction={handleRestart}
186
188
  onConfirmActionSuccess={handleAfterAction}
187
189
  buttonDisabled={!pDiskParamsDefined || !isUserAllowedToMakeChanges}
188
- buttonView="normal"
190
+ buttonView="action"
189
191
  dialogHeader={pDiskPageKeyset('restart-pdisk-dialog-header')}
190
192
  dialogText={pDiskPageKeyset('restart-pdisk-dialog-text')}
191
193
  applyButtonText={pDiskPageKeyset('restart-pdisk-button')}
@@ -198,15 +200,14 @@ export function PDiskPage() {
198
200
  <Icon data={ArrowRotateLeft} />
199
201
  {pDiskPageKeyset('restart-pdisk-button')}
200
202
  </ButtonWithConfirmDialog>
201
- {newDiskApiAvailable ? (
202
- <DecommissionButton
203
- decommission={DecommitStatus}
204
- onConfirmAction={handleDecommissionChange}
205
- onConfirmActionSuccess={handleAfterAction}
206
- buttonDisabled={!pDiskParamsDefined || !isUserAllowedToMakeChanges}
207
- popoverDisabled={isUserAllowedToMakeChanges}
203
+ {hasDeveloperUi && pDiskParamsDefined && (
204
+ <LinkWithIcon
205
+ title={pDiskPageKeyset('action_open-in-developer-ui')}
206
+ url={createPDiskDeveloperUILink({nodeId, pDiskId})}
207
+ icon={Wrench}
208
+ hideEndIcon
208
209
  />
209
- ) : null}
210
+ )}
210
211
  </div>
211
212
  );
212
213
  };
@@ -215,7 +216,12 @@ export function PDiskPage() {
215
216
  if (pDiskLoading) {
216
217
  return <InfoViewerSkeleton className={pdiskPageCn('info')} rows={10} />;
217
218
  }
218
- return <PDiskInfo pDisk={pDiskData} nodeId={nodeId} className={pdiskPageCn('info')} />;
219
+ return (
220
+ <React.Fragment>
221
+ <PDiskStorageDetails data={pDiskData} className={pdiskPageCn('storage-details')} />
222
+ <PDiskInfo pDisk={pDiskData} className={pdiskPageCn('info')} />
223
+ </React.Fragment>
224
+ );
219
225
  };
220
226
 
221
227
  const renderTabs = () => {
@@ -278,7 +284,7 @@ export function PDiskPage() {
278
284
  return (
279
285
  <div className={pdiskPageCn(null)} ref={containerRef}>
280
286
  {renderHelmet()}
281
- {renderPageMeta()}
287
+ <StickyAutoRefreshControl />
282
288
  {renderPageTitle()}
283
289
  {renderControls()}
284
290
  {renderError()}
@@ -3,7 +3,7 @@ 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';
6
+ import {PDiskLogSize} from '../../../components/PDiskInfo/PDiskLogSize';
7
7
  import {VDiskPopup} from '../../../components/VDiskPopup/VDiskPopup';
8
8
  import type {YDBDefinitionListItem} from '../../../components/YDBDefinitionList/YDBDefinitionList';
9
9
  import {YDBDefinitionList} from '../../../components/YDBDefinitionList/YDBDefinitionList';
@@ -286,20 +286,14 @@ function LogInfo({data}: LogInfoProps) {
286
286
  const items: YDBDefinitionListItem[] = [
287
287
  {
288
288
  name: pDiskPageKeyset('label.log-size'),
289
- content: (
290
- <ProgressViewer
291
- value={LogUsedSize}
292
- capacity={LogTotalSize}
293
- formatValues={formatStorageValuesToGb}
294
- />
295
- ),
289
+ content: <PDiskLogSize used={LogUsedSize} total={LogTotalSize} />,
296
290
  },
297
291
  ];
298
292
 
299
293
  if (valueIsDefined(SystemSize)) {
300
294
  items.push({
301
295
  name: pDiskPageKeyset('label.system-size'),
302
- content: formatBytes({value: SystemSize}),
296
+ content: formatBytes({value: SystemSize, fixedDecimalPlaces: 2}),
303
297
  });
304
298
  }
305
299