ydb-embedded-ui 21.1.0 → 22.1.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 (658) hide show
  1. package/dist/components/ComponentsProvider/ComponentsProvider.d.ts +0 -4
  2. package/dist/components/ComponentsProvider/componentsRegistry.d.ts +0 -2
  3. package/dist/components/ComponentsProvider/componentsRegistry.js +1 -3
  4. package/dist/components/ComponentsProvider/componentsRegistry.js.map +1 -1
  5. package/dist/components/ContentWithPopup/ContentWithPopup.d.ts +1 -1
  6. package/dist/components/ContentWithPopup/ContentWithPopup.js +4 -2
  7. package/dist/components/ContentWithPopup/ContentWithPopup.js.map +1 -1
  8. package/dist/components/DiskStateProgressBar/AllModeCapacityAlertIndicator.d.ts +2 -1
  9. package/dist/components/DiskStateProgressBar/AllModeCapacityAlertIndicator.js +5 -2
  10. package/dist/components/DiskStateProgressBar/AllModeCapacityAlertIndicator.js.map +1 -1
  11. package/dist/components/DiskStateProgressBar/AllModeIndicators.d.ts +2 -1
  12. package/dist/components/DiskStateProgressBar/AllModeIndicators.js +4 -2
  13. package/dist/components/DiskStateProgressBar/AllModeIndicators.js.map +1 -1
  14. package/dist/components/DiskStateProgressBar/DiskIndicator.d.ts +7 -2
  15. package/dist/components/DiskStateProgressBar/DiskIndicator.js +6 -6
  16. package/dist/components/DiskStateProgressBar/DiskIndicator.js.map +1 -1
  17. package/dist/components/DiskStateProgressBar/DiskStateProgressBar.js +1 -1
  18. package/dist/components/DiskStateProgressBar/DiskStateProgressBar.js.map +1 -1
  19. package/dist/components/DiskStateProgressBar/DiskStateProgressBar.scss +53 -45
  20. package/dist/components/DiskStateProgressBar/PDiskAllModeIndicators.js +9 -1
  21. package/dist/components/DiskStateProgressBar/PDiskAllModeIndicators.js.map +1 -1
  22. package/dist/components/EvictVDiskButton/EvictVDiskButton.js +7 -3
  23. package/dist/components/EvictVDiskButton/EvictVDiskButton.js.map +1 -1
  24. package/dist/components/FullNodeViewer/FullNodeViewer.js +40 -17
  25. package/dist/components/FullNodeViewer/FullNodeViewer.js.map +1 -1
  26. package/dist/components/FullNodeViewer/FullNodeViewer.scss +3 -3
  27. package/dist/components/FullNodeViewer/i18n/en.json +2 -1
  28. package/dist/components/FullNodeViewer/i18n/index.d.ts +1 -1
  29. package/dist/components/HoverPopup/HoverPopup.js +36 -6
  30. package/dist/components/HoverPopup/HoverPopup.js.map +1 -1
  31. package/dist/components/HoverPopup/getPopupScrollContainer.d.ts +1 -0
  32. package/dist/components/HoverPopup/getPopupScrollContainer.js +20 -0
  33. package/dist/components/HoverPopup/getPopupScrollContainer.js.map +1 -0
  34. package/dist/components/InfoViewer/InfoViewer.js +1 -1
  35. package/dist/components/InfoViewer/InfoViewer.js.map +1 -1
  36. package/dist/components/InfoViewer/formatters/pqGroup.js +6 -1
  37. package/dist/components/InfoViewer/formatters/pqGroup.js.map +1 -1
  38. package/dist/components/InfoViewer/schemaInfo/i18n/en.json +1 -0
  39. package/dist/components/InfoViewer/schemaInfo/i18n/index.d.ts +1 -1
  40. package/dist/components/InfoViewer/schemaInfo/utils.js +6 -1
  41. package/dist/components/InfoViewer/schemaInfo/utils.js.map +1 -1
  42. package/dist/components/MetricChart/reducer.d.ts +2 -2
  43. package/dist/components/NodeHostWrapper/NodeHostWrapper.d.ts +4 -1
  44. package/dist/components/NodeHostWrapper/NodeHostWrapper.js +13 -9
  45. package/dist/components/NodeHostWrapper/NodeHostWrapper.js.map +1 -1
  46. package/dist/components/PDiskInfo/i18n/index.d.ts +1 -1
  47. package/dist/components/PaginatedTable/KeyboardNavigation.d.ts +9 -0
  48. package/dist/components/PaginatedTable/KeyboardNavigation.js +14 -0
  49. package/dist/components/PaginatedTable/KeyboardNavigation.js.map +1 -0
  50. package/dist/components/PaginatedTable/PaginatedTable.d.ts +4 -1
  51. package/dist/components/PaginatedTable/PaginatedTable.js +77 -4
  52. package/dist/components/PaginatedTable/PaginatedTable.js.map +1 -1
  53. package/dist/components/PaginatedTable/PaginatedTable.scss +10 -0
  54. package/dist/components/PaginatedTable/PaginatedTableWithLayout.d.ts +2 -1
  55. package/dist/components/PaginatedTable/PaginatedTableWithLayout.js +2 -2
  56. package/dist/components/PaginatedTable/PaginatedTableWithLayout.js.map +1 -1
  57. package/dist/components/PaginatedTable/ResizeablePaginatedTable.js +2 -1
  58. package/dist/components/PaginatedTable/ResizeablePaginatedTable.js.map +1 -1
  59. package/dist/components/PaginatedTable/TableChunk.js +6 -10
  60. package/dist/components/PaginatedTable/TableChunk.js.map +1 -1
  61. package/dist/components/PaginatedTable/TableChunksRenderer.d.ts +2 -1
  62. package/dist/components/PaginatedTable/TableChunksRenderer.js +6 -1
  63. package/dist/components/PaginatedTable/TableChunksRenderer.js.map +1 -1
  64. package/dist/components/PaginatedTable/TableRow.d.ts +3 -1
  65. package/dist/components/PaginatedTable/TableRow.js +24 -8
  66. package/dist/components/PaginatedTable/TableRow.js.map +1 -1
  67. package/dist/components/PaginatedTable/getTableChunkQueryParams.d.ts +23 -0
  68. package/dist/components/PaginatedTable/getTableChunkQueryParams.js +12 -0
  69. package/dist/components/PaginatedTable/getTableChunkQueryParams.js.map +1 -0
  70. package/dist/components/PaginatedTable/rowLookup.d.ts +8 -0
  71. package/dist/components/PaginatedTable/rowLookup.js +35 -0
  72. package/dist/components/PaginatedTable/rowLookup.js.map +1 -0
  73. package/dist/components/PaginatedTable/useKeyboardNavigation.d.ts +27 -0
  74. package/dist/components/PaginatedTable/useKeyboardNavigation.js +70 -0
  75. package/dist/components/PaginatedTable/useKeyboardNavigation.js.map +1 -0
  76. package/dist/components/ResizeableDataTable/DataTableKeyboardNavigation.d.ts +24 -0
  77. package/dist/components/ResizeableDataTable/DataTableKeyboardNavigation.js +144 -0
  78. package/dist/components/ResizeableDataTable/DataTableKeyboardNavigation.js.map +1 -0
  79. package/dist/components/ResizeableDataTable/ResizeableDataTable.d.ts +4 -1
  80. package/dist/components/ResizeableDataTable/ResizeableDataTable.js +28 -4
  81. package/dist/components/ResizeableDataTable/ResizeableDataTable.js.map +1 -1
  82. package/dist/components/ResizeableDataTable/ResizeableDataTable.scss +10 -0
  83. package/dist/components/ResizeableDataTable/getDataTableOrder.d.ts +2 -0
  84. package/dist/components/ResizeableDataTable/getDataTableOrder.js +12 -0
  85. package/dist/components/ResizeableDataTable/getDataTableOrder.js.map +1 -0
  86. package/dist/components/Search/Search.d.ts +2 -1
  87. package/dist/components/Search/Search.js +6 -2
  88. package/dist/components/Search/Search.js.map +1 -1
  89. package/dist/components/SegmentedProgress/SegmentedProgress.d.ts +22 -1
  90. package/dist/components/SegmentedProgress/SegmentedProgress.js +44 -3
  91. package/dist/components/SegmentedProgress/SegmentedProgress.js.map +1 -1
  92. package/dist/components/SegmentedProgress/SegmentedProgress.scss +5 -0
  93. package/dist/components/ShardsTable/columns.js +6 -3
  94. package/dist/components/ShardsTable/columns.js.map +1 -1
  95. package/dist/components/ShardsTable/i18n/en.json +1 -0
  96. package/dist/components/ShardsTable/i18n/index.d.ts +1 -1
  97. package/dist/components/StorageGroupInfo/StorageGroupInfo.js +1 -13
  98. package/dist/components/StorageGroupInfo/StorageGroupInfo.js.map +1 -1
  99. package/dist/components/StorageGroupInfo/i18n/en.json +0 -1
  100. package/dist/components/StorageGroupInfo/i18n/index.d.ts +1 -1
  101. package/dist/components/TableKeyboardNavigation/TableKeyboardNavigation.d.ts +54 -0
  102. package/dist/components/TableKeyboardNavigation/TableKeyboardNavigation.js +389 -0
  103. package/dist/components/TableKeyboardNavigation/TableKeyboardNavigation.js.map +1 -0
  104. package/dist/components/TableKeyboardNavigation/TableKeyboardNavigation.scss +16 -0
  105. package/dist/components/TableKeyboardNavigation/i18n/en.json +4 -0
  106. package/dist/components/TableKeyboardNavigation/i18n/index.d.ts +2 -0
  107. package/dist/components/TableKeyboardNavigation/i18n/index.js +4 -0
  108. package/dist/components/TableKeyboardNavigation/i18n/index.js.map +1 -0
  109. package/dist/components/TableKeyboardNavigation/utils.d.ts +3 -0
  110. package/dist/components/TableKeyboardNavigation/utils.js +24 -0
  111. package/dist/components/TableKeyboardNavigation/utils.js.map +1 -0
  112. package/dist/components/TableWithControlsLayout/TableWithControlsLayout.d.ts +4 -1
  113. package/dist/components/TableWithControlsLayout/TableWithControlsLayout.js +4 -2
  114. package/dist/components/TableWithControlsLayout/TableWithControlsLayout.js.map +1 -1
  115. package/dist/components/TenantNameWrapper/TenantNameWrapper.d.ts +3 -1
  116. package/dist/components/TenantNameWrapper/TenantNameWrapper.js +8 -12
  117. package/dist/components/TenantNameWrapper/TenantNameWrapper.js.map +1 -1
  118. package/dist/components/TenantNameWrapper/utils.d.ts +10 -0
  119. package/dist/components/TenantNameWrapper/utils.js +11 -0
  120. package/dist/components/TenantNameWrapper/utils.js.map +1 -1
  121. package/dist/components/UptimeViewer/UptimeViewer.d.ts +2 -2
  122. package/dist/components/VDisk/VDisk.d.ts +5 -1
  123. package/dist/components/VDisk/VDisk.js +84 -29
  124. package/dist/components/VDisk/VDisk.js.map +1 -1
  125. package/dist/components/VDisk/VDiskWithDonorsStack.d.ts +4 -1
  126. package/dist/components/VDisk/VDiskWithDonorsStack.js +8 -4
  127. package/dist/components/VDisk/VDiskWithDonorsStack.js.map +1 -1
  128. package/dist/components/VDisk/i18n/en.json +11 -0
  129. package/dist/components/VDisk/i18n/index.d.ts +1 -1
  130. package/dist/components/VDiskInfo/i18n/index.d.ts +1 -1
  131. package/dist/components/nodesColumns/columns.d.ts +4 -1
  132. package/dist/components/nodesColumns/columns.js +13 -0
  133. package/dist/components/nodesColumns/columns.js.map +1 -1
  134. package/dist/components/nodesColumns/constants.d.ts +2 -0
  135. package/dist/components/nodesColumns/constants.js +6 -0
  136. package/dist/components/nodesColumns/constants.js.map +1 -1
  137. package/dist/components/nodesColumns/i18n/en.json +2 -1
  138. package/dist/components/nodesColumns/i18n/index.d.ts +1 -1
  139. package/dist/containers/App/App.js +3 -3
  140. package/dist/containers/App/App.js.map +1 -1
  141. package/dist/containers/Cluster/ClusterInfo/ClusterInfo.js +8 -5
  142. package/dist/containers/Cluster/ClusterInfo/ClusterInfo.js.map +1 -1
  143. package/dist/containers/Cluster/ClusterInfo/ClusterInfo.scss +8 -0
  144. package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.d.ts +4 -3
  145. package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.js +62 -25
  146. package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.js.map +1 -1
  147. package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.scss +18 -0
  148. package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/utils.d.ts +22 -0
  149. package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/utils.js +49 -0
  150. package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/utils.js.map +1 -0
  151. package/dist/containers/Cluster/i18n/en.json +13 -4
  152. package/dist/containers/Cluster/i18n/index.d.ts +1 -1
  153. package/dist/containers/Clusters/Clusters.js +11 -7
  154. package/dist/containers/Clusters/Clusters.js.map +1 -1
  155. package/dist/containers/Node/Node.js +20 -17
  156. package/dist/containers/Node/Node.js.map +1 -1
  157. package/dist/containers/Node/NodeNetwork/NodeNetworkControls/NodeNetworkControls.js +1 -1
  158. package/dist/containers/Node/NodeNetwork/NodeNetworkControls/NodeNetworkControls.js.map +1 -1
  159. package/dist/containers/Node/NodeNetwork/NodeNetworkTable.js +11 -1
  160. package/dist/containers/Node/NodeNetwork/NodeNetworkTable.js.map +1 -1
  161. package/dist/containers/Node/NodePages.d.ts +3 -9
  162. package/dist/containers/Node/NodePages.js +2 -10
  163. package/dist/containers/Node/NodePages.js.map +1 -1
  164. package/dist/containers/Node/Threads/ThreadStatesBar/ThreadStatesBar.d.ts +1 -1
  165. package/dist/containers/Node/i18n/en.json +0 -3
  166. package/dist/containers/Node/i18n/index.d.ts +1 -1
  167. package/dist/containers/Nodes/NodesControls/NodesControls.js +1 -1
  168. package/dist/containers/Nodes/NodesControls/NodesControls.js.map +1 -1
  169. package/dist/containers/Nodes/NodesTable.js +13 -2
  170. package/dist/containers/Nodes/NodesTable.js.map +1 -1
  171. package/dist/containers/Nodes/PaginatedNodes/GroupedNodesComponent.js +1 -1
  172. package/dist/containers/Nodes/PaginatedNodes/GroupedNodesComponent.js.map +1 -1
  173. package/dist/containers/Nodes/columns/columns.js +2 -1
  174. package/dist/containers/Nodes/columns/columns.js.map +1 -1
  175. package/dist/containers/Storage/Disks/Disks.d.ts +2 -1
  176. package/dist/containers/Storage/Disks/Disks.js +34 -23
  177. package/dist/containers/Storage/Disks/Disks.js.map +1 -1
  178. package/dist/containers/Storage/Disks/Disks.scss +5 -0
  179. package/dist/containers/Storage/PDisk/PDisk.d.ts +6 -9
  180. package/dist/containers/Storage/PDisk/PDisk.js +92 -37
  181. package/dist/containers/Storage/PDisk/PDisk.js.map +1 -1
  182. package/dist/containers/Storage/PDisk/PDisk.scss +79 -1
  183. package/dist/containers/Storage/PDisk/PDiskWithVDisks.d.ts +17 -0
  184. package/dist/containers/Storage/PDisk/PDiskWithVDisks.js +48 -0
  185. package/dist/containers/Storage/PDisk/PDiskWithVDisks.js.map +1 -0
  186. package/dist/containers/Storage/PDisk/i18n/en.json +8 -0
  187. package/dist/containers/Storage/PDisk/i18n/index.d.ts +1 -1
  188. package/dist/containers/Storage/PDisk/index.d.ts +1 -0
  189. package/dist/containers/Storage/PDisk/index.js +1 -0
  190. package/dist/containers/Storage/PDisk/index.js.map +1 -1
  191. package/dist/containers/Storage/PDisks/PDisks.d.ts +4 -1
  192. package/dist/containers/Storage/PDisks/PDisks.js +52 -6
  193. package/dist/containers/Storage/PDisks/PDisks.js.map +1 -1
  194. package/dist/containers/Storage/PaginatedStorage.js +3 -1
  195. package/dist/containers/Storage/PaginatedStorage.js.map +1 -1
  196. package/dist/containers/Storage/PaginatedStorageGroups/GroupedStorageGroupsComponent.js +1 -2
  197. package/dist/containers/Storage/PaginatedStorageGroups/GroupedStorageGroupsComponent.js.map +1 -1
  198. package/dist/containers/Storage/PaginatedStorageGroups/StorageGroupsControls.js +2 -2
  199. package/dist/containers/Storage/PaginatedStorageGroups/StorageGroupsControls.js.map +1 -1
  200. package/dist/containers/Storage/PaginatedStorageGroupsTable/PaginatedStorageGroupsTable.js +12 -4
  201. package/dist/containers/Storage/PaginatedStorageGroupsTable/PaginatedStorageGroupsTable.js.map +1 -1
  202. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/constants.d.ts +2 -2
  203. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/i18n/index.d.ts +1 -1
  204. package/dist/containers/Storage/PaginatedStorageGroupsTable/getGroups.d.ts +1 -1
  205. package/dist/containers/Storage/PaginatedStorageGroupsTable/getGroups.js +2 -3
  206. package/dist/containers/Storage/PaginatedStorageGroupsTable/getGroups.js.map +1 -1
  207. package/dist/containers/Storage/PaginatedStorageNodes/GroupedStorageNodesComponent.d.ts +1 -0
  208. package/dist/containers/Storage/PaginatedStorageNodes/GroupedStorageNodesComponent.js +8 -5
  209. package/dist/containers/Storage/PaginatedStorageNodes/GroupedStorageNodesComponent.js.map +1 -1
  210. package/dist/containers/Storage/PaginatedStorageNodes/StorageNodesComponent.js +6 -3
  211. package/dist/containers/Storage/PaginatedStorageNodes/StorageNodesComponent.js.map +1 -1
  212. package/dist/containers/Storage/PaginatedStorageNodes/StorageNodesControls.js +17 -5
  213. package/dist/containers/Storage/PaginatedStorageNodes/StorageNodesControls.js.map +1 -1
  214. package/dist/containers/Storage/PaginatedStorageNodes/nodeExpertModeLayout.d.ts +16 -0
  215. package/dist/containers/Storage/PaginatedStorageNodes/nodeExpertModeLayout.js +68 -0
  216. package/dist/containers/Storage/PaginatedStorageNodes/nodeExpertModeLayout.js.map +1 -0
  217. package/dist/containers/Storage/PaginatedStorageNodesTable/PaginatedStorageNodesTable.d.ts +2 -1
  218. package/dist/containers/Storage/PaginatedStorageNodesTable/PaginatedStorageNodesTable.js +14 -2
  219. package/dist/containers/Storage/PaginatedStorageNodesTable/PaginatedStorageNodesTable.js.map +1 -1
  220. package/dist/containers/Storage/PaginatedStorageNodesTable/columns/columns.js +2 -2
  221. package/dist/containers/Storage/PaginatedStorageNodesTable/columns/columns.js.map +1 -1
  222. package/dist/containers/Storage/PaginatedStorageNodesTable/columns/hooks.js +7 -2
  223. package/dist/containers/Storage/PaginatedStorageNodesTable/columns/hooks.js.map +1 -1
  224. package/dist/containers/Storage/PaginatedStorageNodesTable/columns/types.d.ts +2 -0
  225. package/dist/containers/Storage/StorageExpertModePanel/StorageGroupsExpertModePanel.d.ts +5 -0
  226. package/dist/containers/Storage/StorageExpertModePanel/StorageGroupsExpertModePanel.js +31 -0
  227. package/dist/containers/Storage/StorageExpertModePanel/StorageGroupsExpertModePanel.js.map +1 -0
  228. package/dist/containers/Storage/StorageExpertModePanel/StorageNodesExpertModePanel.d.ts +5 -0
  229. package/dist/containers/Storage/StorageExpertModePanel/StorageNodesExpertModePanel.js +31 -0
  230. package/dist/containers/Storage/StorageExpertModePanel/StorageNodesExpertModePanel.js.map +1 -0
  231. package/dist/containers/Storage/StorageExpertModePanel/components/ExpertModePanelLayout.d.ts +21 -0
  232. package/dist/containers/Storage/StorageExpertModePanel/components/ExpertModePanelLayout.js +13 -0
  233. package/dist/containers/Storage/StorageExpertModePanel/components/ExpertModePanelLayout.js.map +1 -0
  234. package/dist/containers/Storage/StorageExpertModePanel/components/FrontQueuesLegend.js +1 -0
  235. package/dist/containers/Storage/StorageExpertModePanel/components/FrontQueuesLegend.js.map +1 -1
  236. package/dist/containers/Storage/StorageExpertModePanel/components/PDiskDecommitLegend.js +1 -0
  237. package/dist/containers/Storage/StorageExpertModePanel/components/PDiskDecommitLegend.js.map +1 -1
  238. package/dist/containers/Storage/StorageExpertModePanel/components/PDiskDriveLegend.js +3 -2
  239. package/dist/containers/Storage/StorageExpertModePanel/components/PDiskDriveLegend.js.map +1 -1
  240. package/dist/containers/Storage/StorageExpertModePanel/components/PDiskMaintenanceLegend.js +1 -0
  241. package/dist/containers/Storage/StorageExpertModePanel/components/PDiskMaintenanceLegend.js.map +1 -1
  242. package/dist/containers/Storage/StorageExpertModePanel/components/SpaceLegend.js +4 -4
  243. package/dist/containers/Storage/StorageExpertModePanel/components/SpaceLegend.js.map +1 -1
  244. package/dist/containers/Storage/StorageExpertModePanel/components/StatusPairLegend.js +3 -3
  245. package/dist/containers/Storage/StorageExpertModePanel/components/StatusPairLegend.js.map +1 -1
  246. package/dist/containers/Storage/StorageExpertModePanel/components/getSpaceLegendSelection.d.ts +1 -1
  247. package/dist/containers/Storage/StorageExpertModePanel/components/renderExpertModeLegend.d.ts +4 -0
  248. package/dist/containers/Storage/StorageExpertModePanel/components/renderExpertModeLegend.js +49 -0
  249. package/dist/containers/Storage/StorageExpertModePanel/components/renderExpertModeLegend.js.map +1 -0
  250. package/dist/containers/Storage/StorageExpertModePanel/constants.d.ts +20 -0
  251. package/dist/containers/Storage/StorageExpertModePanel/constants.js +22 -0
  252. package/dist/containers/Storage/StorageExpertModePanel/constants.js.map +1 -1
  253. package/dist/containers/Storage/StorageExpertModePanel/i18n/en.json +2 -2
  254. package/dist/containers/Storage/StorageExpertModePanel/i18n/index.d.ts +1 -1
  255. package/dist/containers/Storage/TableGroup/TableGroup.js +2 -1
  256. package/dist/containers/Storage/TableGroup/TableGroup.js.map +1 -1
  257. package/dist/containers/Storage/VDisks/VDisks.d.ts +2 -1
  258. package/dist/containers/Storage/VDisks/VDisks.js +11 -4
  259. package/dist/containers/Storage/VDisks/VDisks.js.map +1 -1
  260. package/dist/containers/Storage/VDisks/VDisks.scss +3 -0
  261. package/dist/containers/Storage/useStoragePDiskDisplayStateGetter.d.ts +1 -0
  262. package/dist/containers/Storage/useStoragePDiskDisplayStateGetter.js +73 -102
  263. package/dist/containers/Storage/useStoragePDiskDisplayStateGetter.js.map +1 -1
  264. package/dist/containers/Storage/useStorageQueryParams.d.ts +9 -1
  265. package/dist/containers/Storage/useStorageQueryParams.js +50 -2
  266. package/dist/containers/Storage/useStorageQueryParams.js.map +1 -1
  267. package/dist/containers/Storage/useStorageVDiskDisplayStateGetter.d.ts +1 -0
  268. package/dist/containers/Storage/useStorageVDiskDisplayStateGetter.js +50 -13
  269. package/dist/containers/Storage/useStorageVDiskDisplayStateGetter.js.map +1 -1
  270. package/dist/containers/Storage/utils/useStorageColumnsSettings.d.ts +4 -1
  271. package/dist/containers/Storage/utils/useStorageColumnsSettings.js +49 -39
  272. package/dist/containers/Storage/utils/useStorageColumnsSettings.js.map +1 -1
  273. package/dist/containers/Storage/utils/useVirtualizedDiskList.d.ts +10 -0
  274. package/dist/containers/Storage/utils/useVirtualizedDiskList.js +131 -0
  275. package/dist/containers/Storage/utils/useVirtualizedDiskList.js.map +1 -0
  276. package/dist/containers/StorageGroupPage/StorageGroupPage.js +2 -3
  277. package/dist/containers/StorageGroupPage/StorageGroupPage.js.map +1 -1
  278. package/dist/containers/Tablet/Tablet.js +4 -2
  279. package/dist/containers/Tablet/Tablet.js.map +1 -1
  280. package/dist/containers/Tablet/components/TabletControls/TabletControls.js +3 -1
  281. package/dist/containers/Tablet/components/TabletControls/TabletControls.js.map +1 -1
  282. package/dist/containers/Tablet/components/TabletInfo/TabletInfo.js +9 -3
  283. package/dist/containers/Tablet/components/TabletInfo/TabletInfo.js.map +1 -1
  284. package/dist/containers/Tablets/TabletsTable.js +25 -1
  285. package/dist/containers/Tablets/TabletsTable.js.map +1 -1
  286. package/dist/containers/Tablets/i18n/en.json +2 -1
  287. package/dist/containers/Tablets/i18n/index.d.ts +1 -1
  288. package/dist/containers/Tenant/Diagnostics/Overview/AsyncReplicationPaths/i18n/index.d.ts +1 -1
  289. package/dist/containers/Tenant/Diagnostics/Overview/Overview.js +2 -1
  290. package/dist/containers/Tenant/Diagnostics/Overview/Overview.js.map +1 -1
  291. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/ResourcePoolInfo.d.ts +7 -0
  292. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/ResourcePoolInfo.js +69 -0
  293. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/ResourcePoolInfo.js.map +1 -0
  294. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/i18n/en.json +9 -0
  295. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/i18n/index.d.ts +2 -0
  296. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/i18n/index.js +5 -0
  297. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/i18n/index.js.map +1 -0
  298. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/index.d.ts +1 -0
  299. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/index.js +2 -0
  300. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/index.js.map +1 -0
  301. package/dist/containers/Tenant/Diagnostics/Overview/utils/prepareTopicSchemaInfo.js +3 -3
  302. package/dist/containers/Tenant/Diagnostics/Overview/utils/prepareTopicSchemaInfo.js.map +1 -1
  303. package/dist/containers/Tenant/Diagnostics/Partitions/utils/constants.d.ts +2 -2
  304. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopGroups.js +1 -3
  305. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopGroups.js.map +1 -1
  306. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/useTenantStorageNewData.d.ts +5 -5
  307. package/dist/containers/Tenant/Diagnostics/TopQueries/QueriesTableWithDrawer.d.ts +2 -1
  308. package/dist/containers/Tenant/Diagnostics/TopQueries/QueriesTableWithDrawer.js +3 -2
  309. package/dist/containers/Tenant/Diagnostics/TopQueries/QueriesTableWithDrawer.js.map +1 -1
  310. package/dist/containers/Tenant/Diagnostics/TopQueries/RunningQueriesData.js +1 -1
  311. package/dist/containers/Tenant/Diagnostics/TopQueries/RunningQueriesData.js.map +1 -1
  312. package/dist/containers/Tenant/Diagnostics/TopQueries/TopQueriesData.js +1 -1
  313. package/dist/containers/Tenant/Diagnostics/TopQueries/TopQueriesData.js.map +1 -1
  314. package/dist/containers/Tenant/Diagnostics/TopShards/TopShards.js +1 -1
  315. package/dist/containers/Tenant/Diagnostics/TopShards/TopShards.js.map +1 -1
  316. package/dist/containers/Tenant/Diagnostics/TopicData/columns/columns.d.ts +3 -3
  317. package/dist/containers/Tenant/Diagnostics/useDiagnosticsPages.js +2 -4
  318. package/dist/containers/Tenant/Diagnostics/useDiagnosticsPages.js.map +1 -1
  319. package/dist/containers/Tenant/Query/QueriesHistory/QueriesHistory.js +2 -1
  320. package/dist/containers/Tenant/Query/QueriesHistory/QueriesHistory.js.map +1 -1
  321. package/dist/containers/Tenant/Query/SavedQueries/SavedQueries.js +1 -1
  322. package/dist/containers/Tenant/Query/SavedQueries/SavedQueries.js.map +1 -1
  323. package/dist/containers/Tenants/TenantsTable.js +37 -6
  324. package/dist/containers/Tenants/TenantsTable.js.map +1 -1
  325. package/dist/containers/VDiskPage/VDiskPage.js +1 -1
  326. package/dist/containers/VDiskPage/VDiskPage.js.map +1 -1
  327. package/dist/routes.d.ts +1 -0
  328. package/dist/routes.js.map +1 -1
  329. package/dist/services/api/tablets.d.ts +6 -4
  330. package/dist/services/api/tablets.js +9 -8
  331. package/dist/services/api/tablets.js.map +1 -1
  332. package/dist/services/api/viewer.d.ts +1 -2
  333. package/dist/services/api/viewer.js +0 -11
  334. package/dist/services/api/viewer.js.map +1 -1
  335. package/dist/store/configureStore.d.ts +12 -12
  336. package/dist/store/defaultStore.d.ts +6 -6
  337. package/dist/store/reducers/api.d.ts +1 -1
  338. package/dist/store/reducers/api.js +3 -0
  339. package/dist/store/reducers/api.js.map +1 -1
  340. package/dist/store/reducers/authentication/authentication.d.ts +4 -4
  341. package/dist/store/reducers/cancelQuery.d.ts +2 -2
  342. package/dist/store/reducers/capabilities/capabilities.d.ts +47 -47
  343. package/dist/store/reducers/capabilities/hooks.d.ts +6 -6
  344. package/dist/store/reducers/capabilities/hooks.js +8 -3
  345. package/dist/store/reducers/capabilities/hooks.js.map +1 -1
  346. package/dist/store/reducers/cluster/cluster.d.ts +5 -5
  347. package/dist/store/reducers/cluster/cluster.js +3 -2
  348. package/dist/store/reducers/cluster/cluster.js.map +1 -1
  349. package/dist/store/reducers/clusters/clusters.d.ts +2 -2
  350. package/dist/store/reducers/clusters/clusters.js +2 -1
  351. package/dist/store/reducers/clusters/clusters.js.map +1 -1
  352. package/dist/store/reducers/codeAssist/codeAssist.d.ts +6 -6
  353. package/dist/store/reducers/configs.d.ts +3 -3
  354. package/dist/store/reducers/entityDataTags.d.ts +21 -0
  355. package/dist/store/reducers/entityDataTags.js +24 -0
  356. package/dist/store/reducers/entityDataTags.js.map +1 -0
  357. package/dist/store/reducers/environments/environments.d.ts +2 -2
  358. package/dist/store/reducers/executeTopQueries/executeTopQueries.d.ts +4 -4
  359. package/dist/store/reducers/healthcheckInfo/healthcheckInfo.d.ts +111 -111
  360. package/dist/store/reducers/heatmap.d.ts +2 -2
  361. package/dist/store/reducers/hotKeys/hotKeys.d.ts +2 -2
  362. package/dist/store/reducers/index.d.ts +8 -8
  363. package/dist/store/reducers/network/network.d.ts +2 -2
  364. package/dist/store/reducers/node/node.d.ts +2 -5
  365. package/dist/store/reducers/node/node.js +0 -12
  366. package/dist/store/reducers/node/node.js.map +1 -1
  367. package/dist/store/reducers/node/types.d.ts +0 -14
  368. package/dist/store/reducers/nodes/nodes.d.ts +2 -2
  369. package/dist/store/reducers/nodesList.d.ts +6 -264
  370. package/dist/store/reducers/nodesList.js +1 -1
  371. package/dist/store/reducers/nodesList.js.map +1 -1
  372. package/dist/store/reducers/operations.d.ts +5 -5
  373. package/dist/store/reducers/overview/overview.d.ts +2 -2
  374. package/dist/store/reducers/partitions/partitions.d.ts +3 -3
  375. package/dist/store/reducers/pdisk/pdisk.d.ts +2 -2
  376. package/dist/store/reducers/planToSvg.d.ts +2 -2
  377. package/dist/store/reducers/preview.d.ts +2 -2
  378. package/dist/store/reducers/query/api.d.ts +4 -4
  379. package/dist/store/reducers/replication.d.ts +2 -2
  380. package/dist/store/reducers/schema/schema.d.ts +16 -16
  381. package/dist/store/reducers/schemaAcl/schemaAcl.d.ts +40 -40
  382. package/dist/store/reducers/settings/api.d.ts +4 -4
  383. package/dist/store/reducers/settings/constants.d.ts +4 -0
  384. package/dist/store/reducers/settings/constants.js +4 -0
  385. package/dist/store/reducers/settings/constants.js.map +1 -1
  386. package/dist/store/reducers/settings/settings.d.ts +1 -1
  387. package/dist/store/reducers/shardsWorkload/shardsWorkload.d.ts +2 -2
  388. package/dist/store/reducers/showCreateTable/showCreateTable.d.ts +2 -2
  389. package/dist/store/reducers/storage/prepareGroupsDisks.d.ts +1 -0
  390. package/dist/store/reducers/storage/prepareGroupsDisks.js +17 -13
  391. package/dist/store/reducers/storage/prepareGroupsDisks.js.map +1 -1
  392. package/dist/store/reducers/storage/requestStorageData.d.ts +2 -4
  393. package/dist/store/reducers/storage/requestStorageData.js +4 -10
  394. package/dist/store/reducers/storage/requestStorageData.js.map +1 -1
  395. package/dist/store/reducers/storage/storage.d.ts +4 -6
  396. package/dist/store/reducers/storage/storage.js.map +1 -1
  397. package/dist/store/reducers/storage/types.d.ts +0 -9
  398. package/dist/store/reducers/storage/utils.d.ts +1 -2
  399. package/dist/store/reducers/storage/utils.js +11 -116
  400. package/dist/store/reducers/storage/utils.js.map +1 -1
  401. package/dist/store/reducers/storageUsage/StorageUsage.d.ts +2 -2
  402. package/dist/store/reducers/streamingQuery/streamingQuery.d.ts +2 -2
  403. package/dist/store/reducers/table/table.d.ts +4 -4
  404. package/dist/store/reducers/tableData.d.ts +2 -2
  405. package/dist/store/reducers/tableData.js.map +1 -1
  406. package/dist/store/reducers/tablePartitioning/tablePartitioning.d.ts +2 -2
  407. package/dist/store/reducers/tableSchemaData.d.ts +2 -2
  408. package/dist/store/reducers/tablet.d.ts +11 -8
  409. package/dist/store/reducers/tablet.js +6 -6
  410. package/dist/store/reducers/tablet.js.map +1 -1
  411. package/dist/store/reducers/tablets.d.ts +3 -3
  412. package/dist/store/reducers/tenant/tenant.d.ts +2 -2
  413. package/dist/store/reducers/tenant/tenant.js +14 -1
  414. package/dist/store/reducers/tenant/tenant.js.map +1 -1
  415. package/dist/store/reducers/tenantOverview/executeTopTables/executeTopTables.d.ts +2 -2
  416. package/dist/store/reducers/tenantOverview/storage/tenantOverviewStorage.d.ts +2 -2
  417. package/dist/store/reducers/tenantOverview/topShards/tenantOverviewTopShards.d.ts +2 -2
  418. package/dist/store/reducers/tenantOverview/topShards/tenantOverviewTopShards.js +1 -1
  419. package/dist/store/reducers/tenantOverview/topShards/tenantOverviewTopShards.js.map +1 -1
  420. package/dist/store/reducers/tenants/tenants.d.ts +3 -3
  421. package/dist/store/reducers/tenants/tenants.js +2 -1
  422. package/dist/store/reducers/tenants/tenants.js.map +1 -1
  423. package/dist/store/reducers/topic/topic.d.ts +84 -84
  424. package/dist/store/reducers/vdisk/vdisk.d.ts +3 -3
  425. package/dist/store/reducers/viewSchema/viewSchema.d.ts +2 -2
  426. package/dist/store/state-url-mapping.js +5 -1
  427. package/dist/store/state-url-mapping.js.map +1 -1
  428. package/dist/types/api/capabilities.d.ts +2 -2
  429. package/dist/types/api/pdisk.d.ts +2 -0
  430. package/dist/types/api/pdisk.js.map +1 -1
  431. package/dist/types/api/schema/persQueueGroup.d.ts +2 -2
  432. package/dist/types/api/schema/schema.d.ts +15 -0
  433. package/dist/types/api/schema/schema.js.map +1 -1
  434. package/dist/types/api/schema/tableIndex.d.ts +1 -0
  435. package/dist/types/api/storage.d.ts +6 -111
  436. package/dist/types/api/storage.js.map +1 -1
  437. package/dist/types/api/vdisk.d.ts +2 -0
  438. package/dist/types/api/vdisk.js.map +1 -1
  439. package/dist/uiFactory/types.d.ts +2 -0
  440. package/dist/utils/developerUI/tabletDevUi.d.ts +1 -0
  441. package/dist/utils/developerUI/tabletDevUi.js +4 -0
  442. package/dist/utils/developerUI/tabletDevUi.js.map +1 -0
  443. package/dist/utils/disks/displayState.d.ts +2 -0
  444. package/dist/utils/disks/displayState.js.map +1 -1
  445. package/dist/utils/disks/getDiskBarTone.d.ts +2 -1
  446. package/dist/utils/disks/getDiskBarTone.js +5 -1
  447. package/dist/utils/disks/getDiskBarTone.js.map +1 -1
  448. package/dist/utils/disks/pdiskState.js +2 -2
  449. package/dist/utils/disks/pdiskState.js.map +1 -1
  450. package/dist/utils/disks/prepareDisks.js +19 -9
  451. package/dist/utils/disks/prepareDisks.js.map +1 -1
  452. package/dist/utils/disks/types.d.ts +2 -1
  453. package/dist/utils/hooks/useWhoami.d.ts +5 -5
  454. package/dist/utils/query.d.ts +1 -0
  455. package/dist/utils/query.js +6 -0
  456. package/dist/utils/query.js.map +1 -1
  457. package/package.json +1 -1
  458. package/src/components/ComponentsProvider/componentsRegistry.ts +1 -4
  459. package/src/components/ContentWithPopup/ContentWithPopup.tsx +7 -0
  460. package/src/components/DiskStateProgressBar/AllModeCapacityAlertIndicator.tsx +15 -2
  461. package/src/components/DiskStateProgressBar/AllModeIndicators.tsx +19 -6
  462. package/src/components/DiskStateProgressBar/DiskIndicator.tsx +19 -8
  463. package/src/components/DiskStateProgressBar/DiskStateProgressBar.scss +53 -45
  464. package/src/components/DiskStateProgressBar/DiskStateProgressBar.tsx +1 -1
  465. package/src/components/DiskStateProgressBar/PDiskAllModeIndicators.tsx +16 -3
  466. package/src/components/EvictVDiskButton/EvictVDiskButton.tsx +10 -3
  467. package/src/components/FullNodeViewer/FullNodeViewer.scss +3 -3
  468. package/src/components/FullNodeViewer/FullNodeViewer.tsx +81 -34
  469. package/src/components/FullNodeViewer/i18n/en.json +2 -1
  470. package/src/components/HoverPopup/HoverPopup.tsx +53 -19
  471. package/src/components/HoverPopup/getPopupScrollContainer.ts +20 -0
  472. package/src/components/InfoViewer/InfoViewer.tsx +4 -2
  473. package/src/components/InfoViewer/formatters/pqGroup.ts +6 -2
  474. package/src/components/InfoViewer/schemaInfo/i18n/en.json +1 -0
  475. package/src/components/InfoViewer/schemaInfo/utils.tsx +9 -0
  476. package/src/components/NodeHostWrapper/NodeHostWrapper.tsx +23 -13
  477. package/src/components/PaginatedTable/KeyboardNavigation.tsx +30 -0
  478. package/src/components/PaginatedTable/PaginatedTable.scss +10 -0
  479. package/src/components/PaginatedTable/PaginatedTable.tsx +128 -4
  480. package/src/components/PaginatedTable/PaginatedTableWithLayout.tsx +6 -1
  481. package/src/components/PaginatedTable/ResizeablePaginatedTable.tsx +6 -1
  482. package/src/components/PaginatedTable/TableChunk.tsx +6 -14
  483. package/src/components/PaginatedTable/TableChunksRenderer.tsx +12 -0
  484. package/src/components/PaginatedTable/TableRow.tsx +54 -20
  485. package/src/components/PaginatedTable/getTableChunkQueryParams.ts +25 -0
  486. package/src/components/PaginatedTable/rowLookup.ts +63 -0
  487. package/src/components/PaginatedTable/useKeyboardNavigation.ts +115 -0
  488. package/src/components/ResizeableDataTable/DataTableKeyboardNavigation.tsx +194 -0
  489. package/src/components/ResizeableDataTable/ResizeableDataTable.scss +10 -0
  490. package/src/components/ResizeableDataTable/ResizeableDataTable.tsx +100 -5
  491. package/src/components/ResizeableDataTable/getDataTableOrder.ts +18 -0
  492. package/src/components/Search/Search.tsx +8 -1
  493. package/src/components/SegmentedProgress/SegmentedProgress.scss +5 -0
  494. package/src/components/SegmentedProgress/SegmentedProgress.tsx +99 -10
  495. package/src/components/ShardsTable/columns.tsx +14 -5
  496. package/src/components/ShardsTable/i18n/en.json +1 -0
  497. package/src/components/StorageGroupInfo/StorageGroupInfo.tsx +0 -13
  498. package/src/components/StorageGroupInfo/i18n/en.json +0 -1
  499. package/src/components/TableKeyboardNavigation/TableKeyboardNavigation.scss +16 -0
  500. package/src/components/TableKeyboardNavigation/TableKeyboardNavigation.tsx +519 -0
  501. package/src/components/TableKeyboardNavigation/i18n/en.json +4 -0
  502. package/src/components/TableKeyboardNavigation/i18n/index.ts +5 -0
  503. package/src/components/TableKeyboardNavigation/utils.ts +36 -0
  504. package/src/components/TableWithControlsLayout/TableWithControlsLayout.tsx +26 -1
  505. package/src/components/TenantNameWrapper/TenantNameWrapper.tsx +14 -15
  506. package/src/components/TenantNameWrapper/utils.ts +26 -0
  507. package/src/components/VDisk/VDisk.tsx +115 -41
  508. package/src/components/VDisk/VDiskWithDonorsStack.tsx +18 -3
  509. package/src/components/VDisk/i18n/en.json +11 -0
  510. package/src/components/nodesColumns/columns.tsx +13 -1
  511. package/src/components/nodesColumns/constants.ts +6 -0
  512. package/src/components/nodesColumns/i18n/en.json +2 -1
  513. package/src/containers/App/App.tsx +3 -3
  514. package/src/containers/Cluster/ClusterInfo/ClusterInfo.scss +8 -0
  515. package/src/containers/Cluster/ClusterInfo/ClusterInfo.tsx +12 -11
  516. package/src/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.scss +18 -0
  517. package/src/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.tsx +143 -58
  518. package/src/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/utils.ts +89 -0
  519. package/src/containers/Cluster/i18n/en.json +13 -4
  520. package/src/containers/Clusters/Clusters.tsx +47 -29
  521. package/src/containers/Node/Node.tsx +32 -18
  522. package/src/containers/Node/NodeNetwork/NodeNetworkControls/NodeNetworkControls.tsx +1 -0
  523. package/src/containers/Node/NodeNetwork/NodeNetworkTable.tsx +17 -0
  524. package/src/containers/Node/NodePages.ts +5 -10
  525. package/src/containers/Node/i18n/en.json +0 -4
  526. package/src/containers/Nodes/NodesControls/NodesControls.tsx +1 -0
  527. package/src/containers/Nodes/NodesTable.tsx +23 -1
  528. package/src/containers/Nodes/PaginatedNodes/GroupedNodesComponent.tsx +1 -0
  529. package/src/containers/Nodes/columns/columns.tsx +2 -0
  530. package/src/containers/Storage/Disks/Disks.scss +5 -0
  531. package/src/containers/Storage/Disks/Disks.tsx +156 -92
  532. package/src/containers/Storage/PDisk/PDisk.scss +79 -1
  533. package/src/containers/Storage/PDisk/PDisk.tsx +157 -81
  534. package/src/containers/Storage/PDisk/PDiskWithVDisks.tsx +181 -0
  535. package/src/containers/Storage/PDisk/i18n/en.json +8 -0
  536. package/src/containers/Storage/PDisk/index.ts +1 -0
  537. package/src/containers/Storage/PDisks/PDisks.tsx +157 -22
  538. package/src/containers/Storage/PaginatedStorage.tsx +4 -0
  539. package/src/containers/Storage/PaginatedStorageGroups/GroupedStorageGroupsComponent.tsx +1 -1
  540. package/src/containers/Storage/PaginatedStorageGroups/StorageGroupsControls.tsx +3 -2
  541. package/src/containers/Storage/PaginatedStorageGroupsTable/PaginatedStorageGroupsTable.tsx +15 -6
  542. package/src/containers/Storage/PaginatedStorageGroupsTable/columns/constants.ts +2 -2
  543. package/src/containers/Storage/PaginatedStorageGroupsTable/getGroups.ts +40 -47
  544. package/src/containers/Storage/PaginatedStorageNodes/GroupedStorageNodesComponent.tsx +10 -2
  545. package/src/containers/Storage/PaginatedStorageNodes/StorageNodesComponent.tsx +6 -2
  546. package/src/containers/Storage/PaginatedStorageNodes/StorageNodesControls.tsx +76 -41
  547. package/src/containers/Storage/PaginatedStorageNodes/nodeExpertModeLayout.ts +103 -0
  548. package/src/containers/Storage/PaginatedStorageNodesTable/PaginatedStorageNodesTable.tsx +24 -1
  549. package/src/containers/Storage/PaginatedStorageNodesTable/columns/columns.tsx +3 -1
  550. package/src/containers/Storage/PaginatedStorageNodesTable/columns/hooks.ts +8 -1
  551. package/src/containers/Storage/PaginatedStorageNodesTable/columns/types.ts +2 -0
  552. package/src/containers/Storage/StorageExpertModePanel/StorageGroupsExpertModePanel.tsx +63 -0
  553. package/src/containers/Storage/StorageExpertModePanel/StorageNodesExpertModePanel.tsx +67 -0
  554. package/src/containers/Storage/StorageExpertModePanel/components/ExpertModePanelLayout.tsx +63 -0
  555. package/src/containers/Storage/StorageExpertModePanel/components/FrontQueuesLegend.tsx +1 -0
  556. package/src/containers/Storage/StorageExpertModePanel/components/PDiskDecommitLegend.tsx +1 -0
  557. package/src/containers/Storage/StorageExpertModePanel/components/PDiskDriveLegend.tsx +3 -2
  558. package/src/containers/Storage/StorageExpertModePanel/components/PDiskMaintenanceLegend.tsx +1 -0
  559. package/src/containers/Storage/StorageExpertModePanel/components/SpaceLegend.tsx +3 -0
  560. package/src/containers/Storage/StorageExpertModePanel/components/StatusPairLegend.tsx +7 -9
  561. package/src/containers/Storage/StorageExpertModePanel/components/getSpaceLegendSelection.ts +1 -1
  562. package/src/containers/Storage/StorageExpertModePanel/components/renderExpertModeLegend.tsx +58 -0
  563. package/src/containers/Storage/StorageExpertModePanel/constants.ts +26 -0
  564. package/src/containers/Storage/StorageExpertModePanel/i18n/en.json +2 -2
  565. package/src/containers/Storage/TableGroup/TableGroup.tsx +6 -1
  566. package/src/containers/Storage/VDisks/VDisks.scss +3 -0
  567. package/src/containers/Storage/VDisks/VDisks.tsx +29 -7
  568. package/src/containers/Storage/useStoragePDiskDisplayStateGetter.ts +94 -135
  569. package/src/containers/Storage/useStorageQueryParams.ts +120 -1
  570. package/src/containers/Storage/useStorageVDiskDisplayStateGetter.ts +65 -10
  571. package/src/containers/Storage/utils/useStorageColumnsSettings.ts +77 -49
  572. package/src/containers/Storage/utils/useVirtualizedDiskList.ts +156 -0
  573. package/src/containers/StorageGroupPage/StorageGroupPage.tsx +2 -6
  574. package/src/containers/Tablet/Tablet.tsx +4 -2
  575. package/src/containers/Tablet/components/TabletControls/TabletControls.tsx +7 -3
  576. package/src/containers/Tablet/components/TabletInfo/TabletInfo.tsx +13 -3
  577. package/src/containers/Tablets/TabletsTable.tsx +50 -10
  578. package/src/containers/Tablets/i18n/en.json +2 -1
  579. package/src/containers/Tenant/Diagnostics/Overview/Overview.tsx +2 -1
  580. package/src/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/ResourcePoolInfo.tsx +106 -0
  581. package/src/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/i18n/en.json +9 -0
  582. package/src/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/i18n/index.ts +7 -0
  583. package/src/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/index.ts +1 -0
  584. package/src/containers/Tenant/Diagnostics/Overview/utils/prepareTopicSchemaInfo.ts +3 -3
  585. package/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopGroups.tsx +1 -6
  586. package/src/containers/Tenant/Diagnostics/TopQueries/QueriesTableWithDrawer.tsx +6 -0
  587. package/src/containers/Tenant/Diagnostics/TopQueries/RunningQueriesData.tsx +4 -0
  588. package/src/containers/Tenant/Diagnostics/TopQueries/TopQueriesData.tsx +7 -1
  589. package/src/containers/Tenant/Diagnostics/TopShards/TopShards.tsx +1 -1
  590. package/src/containers/Tenant/Diagnostics/useDiagnosticsPages.ts +1 -4
  591. package/src/containers/Tenant/Query/QueriesHistory/QueriesHistory.tsx +5 -0
  592. package/src/containers/Tenant/Query/SavedQueries/SavedQueries.tsx +6 -0
  593. package/src/containers/Tenants/TenantsTable.tsx +70 -12
  594. package/src/containers/VDiskPage/VDiskPage.tsx +1 -1
  595. package/src/routes.ts +1 -1
  596. package/src/services/api/tablets.ts +16 -7
  597. package/src/services/api/viewer.ts +1 -25
  598. package/src/store/reducers/api.ts +4 -0
  599. package/src/store/reducers/capabilities/hooks.ts +9 -4
  600. package/src/store/reducers/cluster/cluster.ts +3 -2
  601. package/src/store/reducers/clusters/clusters.ts +2 -1
  602. package/src/store/reducers/entityDataTags.ts +34 -0
  603. package/src/store/reducers/node/node.ts +0 -11
  604. package/src/store/reducers/node/types.ts +0 -18
  605. package/src/store/reducers/nodesList.ts +2 -3
  606. package/src/store/reducers/settings/constants.ts +4 -0
  607. package/src/store/reducers/storage/prepareGroupsDisks.ts +16 -11
  608. package/src/store/reducers/storage/requestStorageData.ts +5 -17
  609. package/src/store/reducers/storage/storage.ts +2 -6
  610. package/src/store/reducers/storage/types.ts +0 -9
  611. package/src/store/reducers/storage/utils.ts +14 -180
  612. package/src/store/reducers/tableData.ts +1 -1
  613. package/src/store/reducers/tablet.ts +25 -6
  614. package/src/store/reducers/tenant/tenant.ts +17 -1
  615. package/src/store/reducers/tenantOverview/topShards/tenantOverviewTopShards.ts +1 -1
  616. package/src/store/reducers/tenants/tenants.ts +2 -1
  617. package/src/store/state-url-mapping.ts +5 -1
  618. package/src/types/api/capabilities.ts +2 -2
  619. package/src/types/api/pdisk.ts +2 -0
  620. package/src/types/api/schema/persQueueGroup.ts +2 -2
  621. package/src/types/api/schema/schema.ts +18 -0
  622. package/src/types/api/schema/tableIndex.ts +1 -0
  623. package/src/types/api/storage.ts +11 -131
  624. package/src/types/api/vdisk.ts +2 -0
  625. package/src/uiFactory/types.ts +3 -0
  626. package/src/utils/developerUI/tabletDevUi.ts +3 -0
  627. package/src/utils/disks/displayState.ts +2 -0
  628. package/src/utils/disks/getDiskBarTone.ts +8 -0
  629. package/src/utils/disks/pdiskState.ts +2 -2
  630. package/src/utils/disks/prepareDisks.ts +25 -9
  631. package/src/utils/disks/types.ts +2 -1
  632. package/src/utils/query.ts +7 -0
  633. package/dist/containers/Node/NodeStructure/NodeStructure.d.ts +0 -7
  634. package/dist/containers/Node/NodeStructure/NodeStructure.js +0 -76
  635. package/dist/containers/Node/NodeStructure/NodeStructure.js.map +0 -1
  636. package/dist/containers/Node/NodeStructure/NodeStructure.scss +0 -155
  637. package/dist/containers/Node/NodeStructure/PDiskTitleBadge.d.ts +0 -7
  638. package/dist/containers/Node/NodeStructure/PDiskTitleBadge.js +0 -7
  639. package/dist/containers/Node/NodeStructure/PDiskTitleBadge.js.map +0 -1
  640. package/dist/containers/Node/NodeStructure/Pdisk.d.ts +0 -10
  641. package/dist/containers/Node/NodeStructure/Pdisk.js +0 -125
  642. package/dist/containers/Node/NodeStructure/Pdisk.js.map +0 -1
  643. package/dist/containers/Storage/PDisk/PDiskVDisks.d.ts +0 -13
  644. package/dist/containers/Storage/PDisk/PDiskVDisks.js +0 -20
  645. package/dist/containers/Storage/PDisk/PDiskVDisks.js.map +0 -1
  646. package/dist/containers/Storage/StorageExpertModePanel/StorageExpertModePanel.d.ts +0 -6
  647. package/dist/containers/Storage/StorageExpertModePanel/StorageExpertModePanel.js +0 -66
  648. package/dist/containers/Storage/StorageExpertModePanel/StorageExpertModePanel.js.map +0 -1
  649. package/dist/store/reducers/node/selectors.d.ts +0 -47
  650. package/dist/store/reducers/node/selectors.js +0 -43
  651. package/dist/store/reducers/node/selectors.js.map +0 -1
  652. package/src/containers/Node/NodeStructure/NodeStructure.scss +0 -155
  653. package/src/containers/Node/NodeStructure/NodeStructure.tsx +0 -121
  654. package/src/containers/Node/NodeStructure/PDiskTitleBadge.tsx +0 -18
  655. package/src/containers/Node/NodeStructure/Pdisk.tsx +0 -274
  656. package/src/containers/Storage/PDisk/PDiskVDisks.tsx +0 -65
  657. package/src/containers/Storage/StorageExpertModePanel/StorageExpertModePanel.tsx +0 -151
  658. package/src/store/reducers/node/selectors.ts +0 -68
@@ -22,10 +22,17 @@ import {storageNodesGroupByParamSchema} from './PaginatedStorageNodesTable/colum
22
22
  import {
23
23
  PDisksGroupBy,
24
24
  VDisksGroupBy,
25
+ nodesPdisksGroupBySchema,
26
+ nodesVdisksGroupBySchema,
25
27
  pdisksGroupBySchema,
26
28
  vdisksGroupBySchema,
27
29
  } from './StorageExpertModePanel/constants';
28
- import type {PDisksGroupByValue, VDisksGroupByValue} from './StorageExpertModePanel/constants';
30
+ import type {
31
+ NodesPDisksGroupByValue,
32
+ NodesVDisksGroupByValue,
33
+ PDisksGroupByValue,
34
+ VDisksGroupByValue,
35
+ } from './StorageExpertModePanel/constants';
29
36
  import {STORAGE_SEARCH_PARAM_BY_TYPE} from './constants';
30
37
 
31
38
  interface StorageGroupByCleanupParams {
@@ -81,6 +88,8 @@ export function useStorageQueryParams() {
81
88
  storageExpertMode: BooleanParam,
82
89
  vdisksGroupBy: StringParam,
83
90
  pdisksGroupBy: StringParam,
91
+ nodesVdisksGroupBy: StringParam,
92
+ nodesPdisksGroupBy: StringParam,
84
93
  });
85
94
 
86
95
  const [savedStorageType, setSavedStorageType] = useSetting<StorageType>(
@@ -128,6 +137,26 @@ export function useStorageQueryParams() {
128
137
  queryParams.pdisksGroupBy ?? savedPDisksGroupBy,
129
138
  );
130
139
 
140
+ const [savedNodesVDisksGroupBy, setSavedNodesVDisksGroupBy] =
141
+ useSetting<NodesVDisksGroupByValue>(
142
+ SETTING_KEYS.STORAGE_NODES_VDISKS_GROUP_BY,
143
+ VDisksGroupBy.State,
144
+ );
145
+
146
+ const nodesVdisksGroupBy = nodesVdisksGroupBySchema.parse(
147
+ queryParams.nodesVdisksGroupBy ?? savedNodesVDisksGroupBy,
148
+ );
149
+
150
+ const [savedNodesPDisksGroupBy, setSavedNodesPDisksGroupBy] =
151
+ useSetting<NodesPDisksGroupByValue>(
152
+ SETTING_KEYS.STORAGE_NODES_PDISKS_GROUP_BY,
153
+ PDisksGroupBy.State,
154
+ );
155
+
156
+ const nodesPdisksGroupBy = nodesPdisksGroupBySchema.parse(
157
+ queryParams.nodesPdisksGroupBy ?? savedNodesPDisksGroupBy,
158
+ );
159
+
131
160
  React.useEffect(() => {
132
161
  if (queryParams.search) {
133
162
  const patch: Record<string, string | undefined> = {search: undefined};
@@ -198,6 +227,22 @@ export function useStorageQueryParams() {
198
227
  [setQueryParams, setSavedPDisksGroupBy],
199
228
  );
200
229
 
230
+ const handleNodesVDisksGroupByChange = React.useCallback(
231
+ (value: NodesVDisksGroupByValue) => {
232
+ setQueryParams({nodesVdisksGroupBy: value}, 'replaceIn');
233
+ setSavedNodesVDisksGroupBy(value);
234
+ },
235
+ [setQueryParams, setSavedNodesVDisksGroupBy],
236
+ );
237
+
238
+ const handleNodesPDisksGroupByChange = React.useCallback(
239
+ (value: NodesPDisksGroupByValue) => {
240
+ setQueryParams({nodesPdisksGroupBy: value}, 'replaceIn');
241
+ setSavedNodesPDisksGroupBy(value);
242
+ },
243
+ [setQueryParams, setSavedNodesPDisksGroupBy],
244
+ );
245
+
201
246
  const handleShowAllGroups = () => {
202
247
  handleVisibleEntitiesChange('all');
203
248
  };
@@ -235,6 +280,8 @@ export function useStorageQueryParams() {
235
280
  storageExpertMode,
236
281
  vdisksGroupBy,
237
282
  pdisksGroupBy,
283
+ nodesVdisksGroupBy,
284
+ nodesPdisksGroupBy,
238
285
 
239
286
  handleTextFilterGroupsChange,
240
287
  handleTextFilterNodesChange,
@@ -247,6 +294,8 @@ export function useStorageQueryParams() {
247
294
  handleStorageExpertModeChange,
248
295
  handleVDisksGroupByChange,
249
296
  handlePDisksGroupByChange,
297
+ handleNodesVDisksGroupByChange,
298
+ handleNodesPDisksGroupByChange,
250
299
 
251
300
  handleShowAllGroups,
252
301
  handleShowAllNodes,
@@ -296,6 +345,32 @@ export function usePDisksGroupByParam() {
296
345
  );
297
346
  }
298
347
 
348
+ export function useNodesVDisksGroupByParam() {
349
+ const [queryNodesVDisksGroupBy] = useQueryParam('nodesVdisksGroupBy', StringParam);
350
+ const [savedNodesVDisksGroupBy] = useSetting<NodesVDisksGroupByValue>(
351
+ SETTING_KEYS.STORAGE_NODES_VDISKS_GROUP_BY,
352
+ VDisksGroupBy.State,
353
+ );
354
+
355
+ return React.useMemo(
356
+ () => nodesVdisksGroupBySchema.parse(queryNodesVDisksGroupBy ?? savedNodesVDisksGroupBy),
357
+ [queryNodesVDisksGroupBy, savedNodesVDisksGroupBy],
358
+ );
359
+ }
360
+
361
+ export function useNodesPDisksGroupByParam() {
362
+ const [queryNodesPDisksGroupBy] = useQueryParam('nodesPdisksGroupBy', StringParam);
363
+ const [savedNodesPDisksGroupBy] = useSetting<NodesPDisksGroupByValue>(
364
+ SETTING_KEYS.STORAGE_NODES_PDISKS_GROUP_BY,
365
+ PDisksGroupBy.State,
366
+ );
367
+
368
+ return React.useMemo(
369
+ () => nodesPdisksGroupBySchema.parse(queryNodesPDisksGroupBy ?? savedNodesPDisksGroupBy),
370
+ [queryNodesPDisksGroupBy, savedNodesPDisksGroupBy],
371
+ );
372
+ }
373
+
299
374
  export function useSaveVDisksGroupBy() {
300
375
  const [queryVDisksGroupBy, setQueryVDisksGroupBy] = useQueryParam('vdisksGroupBy', StringParam);
301
376
  const [savedVDisksGroupBy] = useSetting<VDisksGroupByValue>(
@@ -334,6 +409,50 @@ export function useSavePDisksGroupBy() {
334
409
  }, [normalizedPDisksGroupBy, queryPDisksGroupBy, setQueryPDisksGroupBy]);
335
410
  }
336
411
 
412
+ export function useSaveNodesVDisksGroupBy() {
413
+ const [queryNodesVDisksGroupBy, setQueryNodesVDisksGroupBy] = useQueryParam(
414
+ 'nodesVdisksGroupBy',
415
+ StringParam,
416
+ );
417
+ const [savedNodesVDisksGroupBy] = useSetting<NodesVDisksGroupByValue>(
418
+ SETTING_KEYS.STORAGE_NODES_VDISKS_GROUP_BY,
419
+ VDisksGroupBy.State,
420
+ );
421
+
422
+ const normalizedNodesVDisksGroupBy = React.useMemo(
423
+ () => nodesVdisksGroupBySchema.parse(queryNodesVDisksGroupBy ?? savedNodesVDisksGroupBy),
424
+ [queryNodesVDisksGroupBy, savedNodesVDisksGroupBy],
425
+ );
426
+
427
+ React.useEffect(() => {
428
+ if (normalizedNodesVDisksGroupBy !== queryNodesVDisksGroupBy) {
429
+ setQueryNodesVDisksGroupBy(normalizedNodesVDisksGroupBy, 'replaceIn');
430
+ }
431
+ }, [normalizedNodesVDisksGroupBy, queryNodesVDisksGroupBy, setQueryNodesVDisksGroupBy]);
432
+ }
433
+
434
+ export function useSaveNodesPDisksGroupBy() {
435
+ const [queryNodesPDisksGroupBy, setQueryNodesPDisksGroupBy] = useQueryParam(
436
+ 'nodesPdisksGroupBy',
437
+ StringParam,
438
+ );
439
+ const [savedNodesPDisksGroupBy] = useSetting<NodesPDisksGroupByValue>(
440
+ SETTING_KEYS.STORAGE_NODES_PDISKS_GROUP_BY,
441
+ PDisksGroupBy.State,
442
+ );
443
+
444
+ const normalizedNodesPDisksGroupBy = React.useMemo(
445
+ () => nodesPdisksGroupBySchema.parse(queryNodesPDisksGroupBy ?? savedNodesPDisksGroupBy),
446
+ [queryNodesPDisksGroupBy, savedNodesPDisksGroupBy],
447
+ );
448
+
449
+ React.useEffect(() => {
450
+ if (normalizedNodesPDisksGroupBy !== queryNodesPDisksGroupBy) {
451
+ setQueryNodesPDisksGroupBy(normalizedNodesPDisksGroupBy, 'replaceIn');
452
+ }
453
+ }, [normalizedNodesPDisksGroupBy, queryNodesPDisksGroupBy, setQueryNodesPDisksGroupBy]);
454
+ }
455
+
337
456
  export function useSaveStorageExpertMode() {
338
457
  const [queryStorageExpertMode, setQueryStorageExpertMode] = useQueryParam(
339
458
  'storageExpertMode',
@@ -1,5 +1,7 @@
1
1
  import React from 'react';
2
2
 
3
+ import {CircleXmarkFill, ClockFill} from '@gravity-ui/icons';
4
+
3
5
  import {ECapacityAlert, EFlag, isCapacityAlert} from '../../types/api/enums';
4
6
  import {EVDiskState} from '../../types/api/vdisk';
5
7
  import {
@@ -22,11 +24,17 @@ import {
22
24
  calculateCompactionIcon,
23
25
  calculateFrontQueuesIcon,
24
26
  calculateSpaceIcon,
27
+ calculateStateIcon,
25
28
  } from '../../utils/disks/iconCalculators';
26
29
  import type {PreparedVDisk} from '../../utils/disks/types';
27
30
 
31
+ import type {SpaceLegendSelectionScope} from './StorageExpertModePanel/components/getSpaceLegendSelection';
28
32
  import {useSpaceLegendSelection} from './StorageExpertModePanel/components/useSpaceLegendSelection';
29
- import {useIsStorageExpertMode, useVDisksGroupByParam} from './useStorageQueryParams';
33
+ import {
34
+ useIsStorageExpertMode,
35
+ useNodesVDisksGroupByParam,
36
+ useVDisksGroupByParam,
37
+ } from './useStorageQueryParams';
30
38
 
31
39
  function getMode(groupBy: VDisksGroupByValue): DiskDisplayMode {
32
40
  switch (groupBy) {
@@ -71,7 +79,7 @@ function getAllModeIndicators(
71
79
  return {
72
80
  ...(capacityAlert ? {capacityAlert} : {}),
73
81
  ...(frontQueues ? {frontQueues} : {}),
74
- ...(compaction ? {compaction} : {}),
82
+ ...(compaction?.length ? {compaction} : {}),
75
83
  };
76
84
  }
77
85
 
@@ -103,14 +111,22 @@ function getMissingVDiskDisplayState(
103
111
  vDisk: PreparedVDisk,
104
112
  isDonor: boolean | undefined,
105
113
  mode: DiskDisplayMode,
114
+ showNoDataPlaceholder: boolean,
106
115
  ): VDiskDisplayState {
107
116
  const isAllMode = mode === 'all';
117
+ let icon: VDiskDisplayState['icon'];
118
+ if (isDonor) {
119
+ icon = calculateStateIcon(vDisk, isDonor);
120
+ } else if (mode === 'state' || isAllMode) {
121
+ icon = getKnownVDiskStateIcon(vDisk);
122
+ }
108
123
  const displayState: VDiskDisplayState = {
109
124
  severity: NOT_AVAILABLE_SEVERITY,
110
- icon: undefined,
125
+ icon,
111
126
  mode,
127
+ isNoData: true,
112
128
  isLegendInactive: false,
113
- showNoDataPlaceholder: true,
129
+ showNoDataPlaceholder,
114
130
  allocatedPercent: isAllMode ? vDisk.AllocatedPercent : undefined,
115
131
  showAllocatedPercentLabel: !isAllMode,
116
132
  striped: Boolean(isDonor),
@@ -124,9 +140,25 @@ function getMissingVDiskDisplayState(
124
140
  return displayState;
125
141
  }
126
142
 
143
+ function getKnownVDiskStateIcon(vDisk: PreparedVDisk) {
144
+ if (vDisk.VDiskState !== undefined) {
145
+ return calculateStateIcon(vDisk);
146
+ }
147
+
148
+ switch (vDisk.Status) {
149
+ case 'ERROR':
150
+ return CircleXmarkFill;
151
+ case 'INIT_PENDING':
152
+ return ClockFill;
153
+ default:
154
+ return undefined;
155
+ }
156
+ }
157
+
127
158
  interface GetExpertVDiskDisplayStateParams {
128
159
  inactiveLegendItems: Set<ECapacityAlert>;
129
160
  isDonor?: boolean;
161
+ selectionScope: SpaceLegendSelectionScope;
130
162
  vDisk: PreparedVDisk;
131
163
  vdisksGroupBy: VDisksGroupByValue;
132
164
  }
@@ -134,12 +166,13 @@ interface GetExpertVDiskDisplayStateParams {
134
166
  function getExpertVDiskDisplayState({
135
167
  inactiveLegendItems,
136
168
  isDonor,
169
+ selectionScope,
137
170
  vDisk,
138
171
  vdisksGroupBy,
139
172
  }: GetExpertVDiskDisplayStateParams): VDiskDisplayState {
140
173
  const mode = getMode(vdisksGroupBy);
141
- if (!vDisk.VDiskId) {
142
- return getMissingVDiskDisplayState(vDisk, isDonor, mode);
174
+ if (!(vDisk.HasWhiteboardData ?? Boolean(vDisk.VDiskId))) {
175
+ return getMissingVDiskDisplayState(vDisk, isDonor, mode, selectionScope !== 'nodes-vdisks');
143
176
  }
144
177
 
145
178
  const severity = getSeverityCalculator(vdisksGroupBy)(vDisk);
@@ -147,11 +180,18 @@ function getExpertVDiskDisplayState({
147
180
  const isCapacityAlertInactive =
148
181
  isCapacityAlert(vDisk.CapacityAlert) && inactiveLegendItems.has(vDisk.CapacityAlert);
149
182
  const allMode = getAllModeDisplayState(mode, vDisk, isDonor, isCapacityAlertInactive);
183
+ const spaceBorderless = mode === 'space' && isCapacityAlertInactive;
184
+ const stateBorderless =
185
+ mode === 'state' &&
186
+ !isDonor &&
187
+ (severity === DISK_COLOR_STATE_TO_NUMERIC_SEVERITY.Green ||
188
+ severity === DISK_COLOR_STATE_TO_NUMERIC_SEVERITY.Yellow);
150
189
  const displayState: VDiskDisplayState = {
151
190
  severity,
152
191
  icon,
153
192
  mode,
154
193
  isLegendInactive: mode === 'space' && isCapacityAlertInactive,
194
+ borderless: spaceBorderless || stateBorderless,
155
195
  showNoDataPlaceholder: false,
156
196
  allocatedPercent: mode === 'all' ? vDisk.AllocatedPercent : undefined,
157
197
  showAllocatedPercentLabel: mode !== 'all',
@@ -166,10 +206,12 @@ function getExpertVDiskDisplayState({
166
206
  return displayState;
167
207
  }
168
208
 
169
- export function useStorageVDiskDisplayStateGetter(): VDiskDisplayStateGetter {
209
+ function useVDiskDisplayStateGetter(
210
+ vdisksGroupBy: VDisksGroupByValue,
211
+ selectionScope: SpaceLegendSelectionScope,
212
+ ): VDiskDisplayStateGetter {
170
213
  const isExpertMode = useIsStorageExpertMode();
171
- const vdisksGroupBy = useVDisksGroupByParam();
172
- const inactiveLegendItems = useSpaceLegendSelection();
214
+ const inactiveLegendItems = useSpaceLegendSelection(selectionScope);
173
215
 
174
216
  return React.useCallback(
175
217
  (vDisk, isDonor) => {
@@ -180,10 +222,23 @@ export function useStorageVDiskDisplayStateGetter(): VDiskDisplayStateGetter {
180
222
  return getExpertVDiskDisplayState({
181
223
  inactiveLegendItems,
182
224
  isDonor,
225
+ selectionScope,
183
226
  vDisk,
184
227
  vdisksGroupBy,
185
228
  });
186
229
  },
187
- [inactiveLegendItems, isExpertMode, vdisksGroupBy],
230
+ [inactiveLegendItems, isExpertMode, selectionScope, vdisksGroupBy],
188
231
  );
189
232
  }
233
+
234
+ export function useStorageVDiskDisplayStateGetter(): VDiskDisplayStateGetter {
235
+ const vdisksGroupBy = useVDisksGroupByParam();
236
+
237
+ return useVDiskDisplayStateGetter(vdisksGroupBy, 'vdisks');
238
+ }
239
+
240
+ export function useStorageNodesVDiskDisplayStateGetter(): VDiskDisplayStateGetter {
241
+ const vdisksGroupBy = useNodesVDisksGroupByParam();
242
+
243
+ return useVDiskDisplayStateGetter(vdisksGroupBy, 'nodes-vdisks');
244
+ }
@@ -1,78 +1,106 @@
1
1
  import React from 'react';
2
2
 
3
+ import {VDisksGroupBy} from '../../../utils/disks/groupBy';
4
+ import {
5
+ NODE_EXPERT_ALL_PDISK_WIDTH,
6
+ NODE_EXPERT_PDISK_WIDTH,
7
+ STORAGE_NODES_DEFAULT_PDISK_HEIGHT,
8
+ STORAGE_NODES_DEFAULT_ROW_HEIGHT,
9
+ getNodeExpertPDiskHeight,
10
+ getStorageNodesExpertRowHeight,
11
+ } from '../PaginatedStorageNodes/nodeExpertModeLayout';
3
12
  import type {StorageNodesColumnsSettings} from '../PaginatedStorageNodesTable/columns/types';
4
13
  import type {StorageNodesPaginatedTableData} from '../types';
14
+ import {useNodesVDisksGroupByParam} from '../useStorageQueryParams';
5
15
 
6
16
  /**
7
17
  * Storage → Nodes → column "PDisks": size coupling notes (keep in sync)
8
18
  *
9
19
  * Data flow:
10
20
  * - `window.api.viewer.getNodes()` returns `MaximumSlotsPerDisk` / `MaximumDisksPerNode`
11
- * → `prepareStorageNodesResponse()` maps them into `columnsSettings.{maxSlotsPerDisk,maxDisksPerNode}`
12
- * (`src/store/reducers/storage/utils.ts`)
13
- * → `handleDataFetched()` calculates `pDiskWidth` and `pDiskContainerWidth` (this file)
14
- * → `PaginatedStorageNodesTable` column width uses `pDiskContainerWidth`
15
- * and each `PDisk` instance gets `width={pDiskWidth}`.
21
+ * → `prepareStorageNodesResponse()` maps them into `columnsSettings`
22
+ * → `handleDataFetched()` retains the largest dimensions observed while the table is mounted
23
+ * → this hook derives the PDisk column width, PDisk content height, and virtualized row height.
16
24
  *
17
- * Visual model:
18
- * - One PDisk cell renders a horizontal row of compact VDisks above the PDisk progress bar
19
- * (`src/containers/Storage/PDisk/PDisk.tsx`).
20
- * - Each VDisk "slot" has a hard minimum width and a gap between slots:
21
- * - slot min-width is effectively 8px:
22
- * - `--pdisk-vdisk-width: 8px` (`src/containers/Storage/PDisk/PDisk.scss`)
23
- * - `DiskStateProgressBar` compact min-width is 8px
24
- * (`src/components/DiskStateProgressBar/DiskStateProgressBar.scss`)
25
- * - gap is 2px: `--pdisk-gap-width: 2px` (`src/containers/Storage/PDisk/PDisk.scss`)
26
- *
27
- * Therefore, the `pDiskWidth` formula below MUST use the same slot/gap values,
28
- * otherwise with large `maxSlotsPerDisk` the VDisks row will overflow the PDisk width.
25
+ * Default mode keeps VDisks in one row and grows PDisk width when necessary. Expert mode uses
26
+ * rows of 8; VDisk All uses rows of 4 fixed-width disks with size indicators above them.
27
+ * nodeExpertModeLayout owns the dimensions used for both the content and virtualized rows.
29
28
  */
30
29
  const PDISK_VDISK_WIDTH = 8;
31
30
  const PDISK_GAP_WIDTH = 2;
32
- const PDISK_MIN_WIDTH = 165;
33
31
  const PDISK_MARGIN = 10;
34
32
  const MAX_SLOTS_DEFAULT = 1;
35
- const PAGNATED_TABLE_CELL_HORIZONTAL_PADDING = 10;
33
+ const PAGINATED_TABLE_CELL_HORIZONTAL_PADDING = 10;
36
34
 
37
- export function useStorageColumnsSettings() {
38
- const [pDiskWidth, setPDiskWidth] = React.useState<number | undefined>(undefined);
39
- const [pDiskContainerWidth, setPDiskContainerWidth] = React.useState<number | undefined>(
40
- undefined,
41
- );
35
+ interface StorageDisksLayoutData {
36
+ maxSlotsPerDisk: number;
37
+ maxDisksPerNode: number;
38
+ }
42
39
 
43
- const handleDataFetched = React.useCallback(
44
- (data: StorageNodesPaginatedTableData) => {
45
- if (data?.columnsSettings && !pDiskWidth) {
46
- const {maxSlotsPerDisk, maxDisksPerNode} = data.columnsSettings;
47
- const maxSlots = maxSlotsPerDisk || MAX_SLOTS_DEFAULT;
48
- const maxDisks = maxDisksPerNode || MAX_SLOTS_DEFAULT;
40
+ export function useStorageColumnsSettings({expertMode = false} = {}) {
41
+ const vDisksGroupBy = useNodesVDisksGroupByParam();
42
+ const isAllVDisksLayout = expertMode && vDisksGroupBy === VDisksGroupBy.All;
43
+ const [layoutData, setLayoutData] = React.useState<StorageDisksLayoutData>();
49
44
 
50
- const calculatedPDiskWidth = Math.max(
51
- maxSlots * PDISK_VDISK_WIDTH + (maxSlots - 1) * PDISK_GAP_WIDTH,
52
- PDISK_MIN_WIDTH,
53
- );
45
+ const handleDataFetched = React.useCallback((data: StorageNodesPaginatedTableData) => {
46
+ if (!data.columnsSettings) {
47
+ return;
48
+ }
54
49
 
55
- const calculatedPDiskContainerWidth =
56
- maxDisks * calculatedPDiskWidth +
57
- (maxDisks - 1) * PDISK_MARGIN +
58
- 2 * PAGNATED_TABLE_CELL_HORIZONTAL_PADDING;
50
+ const nextLayoutData = data.columnsSettings;
51
+ setLayoutData((currentLayoutData) => {
52
+ const maxSlotsPerDisk = Math.max(
53
+ currentLayoutData?.maxSlotsPerDisk ?? 0,
54
+ nextLayoutData.maxSlotsPerDisk,
55
+ );
56
+ const maxDisksPerNode = Math.max(
57
+ currentLayoutData?.maxDisksPerNode ?? 0,
58
+ nextLayoutData.maxDisksPerNode,
59
+ );
59
60
 
60
- setPDiskWidth(calculatedPDiskWidth);
61
- setPDiskContainerWidth(calculatedPDiskContainerWidth);
61
+ if (
62
+ currentLayoutData?.maxSlotsPerDisk === maxSlotsPerDisk &&
63
+ currentLayoutData.maxDisksPerNode === maxDisksPerNode
64
+ ) {
65
+ return currentLayoutData;
62
66
  }
63
- },
64
- [pDiskWidth],
65
- );
66
67
 
67
- const columnsSettings: StorageNodesColumnsSettings = React.useMemo(() => {
68
- return {
69
- pDiskWidth: pDiskWidth || PDISK_MIN_WIDTH,
70
- pDiskContainerWidth: pDiskContainerWidth,
71
- };
72
- }, [pDiskContainerWidth, pDiskWidth]);
68
+ return {maxSlotsPerDisk, maxDisksPerNode};
69
+ });
70
+ }, []);
71
+
72
+ const maxSlotsPerDisk = layoutData?.maxSlotsPerDisk || MAX_SLOTS_DEFAULT;
73
+ const maxDisksPerNode = layoutData?.maxDisksPerNode || MAX_SLOTS_DEFAULT;
74
+
75
+ const expertPDiskWidth = isAllVDisksLayout
76
+ ? NODE_EXPERT_ALL_PDISK_WIDTH
77
+ : NODE_EXPERT_PDISK_WIDTH;
78
+ const pDiskWidth = expertMode
79
+ ? expertPDiskWidth
80
+ : Math.max(
81
+ maxSlotsPerDisk * PDISK_VDISK_WIDTH + (maxSlotsPerDisk - 1) * PDISK_GAP_WIDTH,
82
+ NODE_EXPERT_PDISK_WIDTH,
83
+ );
84
+ const pDiskHeight = expertMode
85
+ ? getNodeExpertPDiskHeight(maxSlotsPerDisk, isAllVDisksLayout)
86
+ : STORAGE_NODES_DEFAULT_PDISK_HEIGHT;
87
+ const rowHeight = expertMode
88
+ ? getStorageNodesExpertRowHeight(maxSlotsPerDisk, isAllVDisksLayout)
89
+ : STORAGE_NODES_DEFAULT_ROW_HEIGHT;
90
+ const pDiskContainerWidth = layoutData
91
+ ? maxDisksPerNode * pDiskWidth +
92
+ (maxDisksPerNode - 1) * PDISK_MARGIN +
93
+ 2 * PAGINATED_TABLE_CELL_HORIZONTAL_PADDING
94
+ : undefined;
95
+
96
+ const columnsSettings: StorageNodesColumnsSettings = React.useMemo(
97
+ () => ({pDiskWidth, pDiskContainerWidth, pDiskHeight, expertMode}),
98
+ [pDiskContainerWidth, pDiskHeight, pDiskWidth, expertMode],
99
+ );
73
100
 
74
101
  return {
75
102
  handleDataFetched,
76
103
  columnsSettings,
104
+ rowHeight,
77
105
  };
78
106
  }
@@ -0,0 +1,156 @@
1
+ import React from 'react';
2
+
3
+ interface DiskItem {
4
+ StringifiedId?: string;
5
+ }
6
+
7
+ const MIN_VIRTUALIZED_DISKS_COUNT = 10;
8
+
9
+ function getDiskKey(disks: readonly DiskItem[], index: number) {
10
+ return disks[index]?.StringifiedId || index;
11
+ }
12
+
13
+ function getElementDiskKey(element: Element, index: number) {
14
+ return element.getAttribute('data-disk-id') || index;
15
+ }
16
+
17
+ export function useVirtualizedDiskList(disks: readonly DiskItem[], enabled = true) {
18
+ const shouldVirtualize = enabled && disks.length >= MIN_VIRTUALIZED_DISKS_COUNT;
19
+ const containerRef = React.useRef<HTMLDivElement | null>(null);
20
+ const pendingFocusRef = React.useRef<{element: HTMLDivElement; fromEnd: boolean}>();
21
+ const [visibleKeys, setVisibleKeys] = React.useState<Set<string | number>>(() => new Set());
22
+ const [lastFocusedKey, setLastFocusedKey] = React.useState<string | number>();
23
+ const lastFocusedIndex = disks.findIndex(
24
+ (_, index) => getDiskKey(disks, index) === lastFocusedKey,
25
+ );
26
+
27
+ React.useEffect(() => {
28
+ if (lastFocusedKey !== undefined && lastFocusedIndex === -1) {
29
+ setLastFocusedKey(undefined);
30
+ }
31
+ }, [lastFocusedIndex, lastFocusedKey]);
32
+
33
+ const placeholderProps = React.useMemo<React.HTMLAttributes<HTMLDivElement>>(
34
+ () => ({
35
+ // Wrappers fall back to -1 when content mounts: removing tabIndex would
36
+ // blur the placeholder before the layout effect can focus its link.
37
+ tabIndex: 0,
38
+ // Record the handoff before native focusin tracking can mount the disk
39
+ // and remove the placeholder's React event handler.
40
+ onFocusCapture: (event) => {
41
+ if (event.target !== event.currentTarget) {
42
+ return;
43
+ }
44
+ const elements = Array.from(containerRef.current?.children ?? []);
45
+ const index = elements.findIndex((element) =>
46
+ element.contains(event.currentTarget),
47
+ );
48
+ if (index !== -1) {
49
+ pendingFocusRef.current = {
50
+ element: event.currentTarget,
51
+ fromEnd: index === elements.length - 1,
52
+ };
53
+ setLastFocusedKey(getElementDiskKey(elements[index], index));
54
+ }
55
+ },
56
+ }),
57
+ [],
58
+ );
59
+
60
+ React.useLayoutEffect(() => {
61
+ const pendingFocus = pendingFocusRef.current;
62
+ pendingFocusRef.current = undefined;
63
+ if (!pendingFocus || document.activeElement !== pendingFocus.element) {
64
+ return;
65
+ }
66
+ // Mount the boundary disk before handing focus to its first/last link.
67
+ const links = pendingFocus.element.querySelectorAll<HTMLAnchorElement>('a[href]');
68
+ const link = pendingFocus.fromEnd ? links[links.length - 1] : links[0];
69
+ link?.focus();
70
+ });
71
+
72
+ React.useEffect(() => {
73
+ const container = containerRef.current;
74
+ if (!container) {
75
+ return undefined;
76
+ }
77
+
78
+ const onFocus = (event: FocusEvent) => {
79
+ const target = event.target;
80
+ if (!(target instanceof Node)) {
81
+ return;
82
+ }
83
+ const elements = Array.from(container.children);
84
+ const index = elements.findIndex((element) => element.contains(target));
85
+ if (index !== -1) {
86
+ // React restores focus before effects update after a reorder. Read
87
+ // the committed DOM identity, not an index into the previous data.
88
+ setLastFocusedKey(getElementDiskKey(elements[index], index));
89
+ }
90
+ };
91
+ container.addEventListener('focusin', onFocus);
92
+
93
+ if (!shouldVirtualize) {
94
+ return () => container.removeEventListener('focusin', onFocus);
95
+ }
96
+
97
+ // Each disk keeps one direct child as its sized placeholder.
98
+ const keysByElement = new Map(
99
+ Array.from(container.children, (element, index) => [
100
+ element,
101
+ getElementDiskKey(element, index),
102
+ ]),
103
+ );
104
+ const intersectingKeys = new Set<string | number>();
105
+ let active = true;
106
+ const observer = new IntersectionObserver((entries) => {
107
+ if (!active) {
108
+ return;
109
+ }
110
+ for (const entry of entries) {
111
+ const key = keysByElement.get(entry.target);
112
+ if (key === undefined) {
113
+ continue;
114
+ }
115
+ if (entry.isIntersecting) {
116
+ intersectingKeys.add(key);
117
+ } else {
118
+ intersectingKeys.delete(key);
119
+ }
120
+ }
121
+ const next = new Set(intersectingKeys);
122
+ setVisibleKeys((previous) => {
123
+ return next.size === previous.size && [...next].every((key) => previous.has(key))
124
+ ? previous
125
+ : next;
126
+ });
127
+ });
128
+ keysByElement.forEach((_, element) => observer.observe(element));
129
+
130
+ return () => {
131
+ active = false;
132
+ observer.disconnect();
133
+ container.removeEventListener('focusin', onFocus);
134
+ };
135
+ }, [disks, shouldVirtualize]);
136
+
137
+ const shouldRenderDisk = (index: number) =>
138
+ !shouldVirtualize ||
139
+ visibleKeys.has(getDiskKey(disks, index)) ||
140
+ // Keep neighbors for scrolling and Tab/Shift+Tab navigation.
141
+ visibleKeys.has(getDiskKey(disks, index - 1)) ||
142
+ visibleKeys.has(getDiskKey(disks, index + 1)) ||
143
+ // Keep the last keyboard target reachable when returning from the next row.
144
+ (lastFocusedIndex !== -1 && Math.abs(index - lastFocusedIndex) <= 1);
145
+
146
+ return {
147
+ containerRef,
148
+ shouldRenderDisk,
149
+ getPlaceholderProps: (index: number) =>
150
+ shouldVirtualize &&
151
+ !shouldRenderDisk(index) &&
152
+ (index === 0 || index === disks.length - 1)
153
+ ? placeholderProps
154
+ : undefined,
155
+ };
156
+ }
@@ -9,10 +9,7 @@ import {ResponseError} from '../../components/Errors/ResponseError';
9
9
  import {InfoViewerSkeleton} from '../../components/InfoViewerSkeleton/InfoViewerSkeleton';
10
10
  import {PageMetaWithAutorefresh} from '../../components/PageMeta/PageMeta';
11
11
  import {StorageGroupInfo} from '../../components/StorageGroupInfo/StorageGroupInfo';
12
- import {
13
- useCapabilitiesLoaded,
14
- useStorageGroupsHandlerAvailable,
15
- } from '../../store/reducers/capabilities/hooks';
12
+ import {useCapabilitiesLoaded} from '../../store/reducers/capabilities/hooks';
16
13
  import {setHeaderBreadcrumbs} from '../../store/reducers/header/header';
17
14
  import {storageApi} from '../../store/reducers/storage/storage';
18
15
  import {EFlag} from '../../types/api/enums';
@@ -41,11 +38,10 @@ export function StorageGroupPage() {
41
38
  }, [dispatch, groupId, database]);
42
39
 
43
40
  const [autoRefreshInterval] = useAutoRefreshInterval();
44
- const shouldUseGroupsHandler = useStorageGroupsHandlerAvailable();
45
41
  const capabilitiesLoaded = useCapabilitiesLoaded();
46
42
  const groupQuery = storageApi.useGetStorageGroupsInfoQuery(
47
43
  valueIsDefined(groupId)
48
- ? {groupId, shouldUseGroupsHandler, with: 'all', fieldsRequired: 'all', database}
44
+ ? {groupId, with: 'all', fieldsRequired: 'all', database}
49
45
  : skipToken,
50
46
  {
51
47
  pollingInterval: autoRefreshInterval,