ydb-embedded-ui 22.0.0 → 22.2.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 (520) hide show
  1. package/dist/components/DiskStateProgressBar/AllModeCapacityAlertIndicator.d.ts +2 -1
  2. package/dist/components/DiskStateProgressBar/AllModeCapacityAlertIndicator.js +5 -2
  3. package/dist/components/DiskStateProgressBar/AllModeCapacityAlertIndicator.js.map +1 -1
  4. package/dist/components/DiskStateProgressBar/AllModeIndicators.d.ts +2 -1
  5. package/dist/components/DiskStateProgressBar/AllModeIndicators.js +7 -2
  6. package/dist/components/DiskStateProgressBar/AllModeIndicators.js.map +1 -1
  7. package/dist/components/DiskStateProgressBar/DiskIndicator.d.ts +7 -2
  8. package/dist/components/DiskStateProgressBar/DiskIndicator.js +10 -6
  9. package/dist/components/DiskStateProgressBar/DiskIndicator.js.map +1 -1
  10. package/dist/components/DiskStateProgressBar/DiskStateProgressBar.js +1 -1
  11. package/dist/components/DiskStateProgressBar/DiskStateProgressBar.js.map +1 -1
  12. package/dist/components/DiskStateProgressBar/DiskStateProgressBar.scss +96 -46
  13. package/dist/components/DiskStateProgressBar/PDiskAllModeIndicators.js +9 -1
  14. package/dist/components/DiskStateProgressBar/PDiskAllModeIndicators.js.map +1 -1
  15. package/dist/components/EvictVDiskButton/EvictVDiskButton.js +7 -3
  16. package/dist/components/EvictVDiskButton/EvictVDiskButton.js.map +1 -1
  17. package/dist/components/FullNodeViewer/FullNodeViewer.js +40 -17
  18. package/dist/components/FullNodeViewer/FullNodeViewer.js.map +1 -1
  19. package/dist/components/FullNodeViewer/FullNodeViewer.scss +3 -3
  20. package/dist/components/FullNodeViewer/i18n/en.json +2 -1
  21. package/dist/components/FullNodeViewer/i18n/index.d.ts +1 -1
  22. package/dist/components/HoverPopup/HoverPopup.js +9 -2
  23. package/dist/components/HoverPopup/HoverPopup.js.map +1 -1
  24. package/dist/components/InfoViewer/InfoViewer.js +1 -1
  25. package/dist/components/InfoViewer/InfoViewer.js.map +1 -1
  26. package/dist/components/InfoViewer/formatters/pqGroup.js +6 -1
  27. package/dist/components/InfoViewer/formatters/pqGroup.js.map +1 -1
  28. package/dist/components/InfoViewer/schemaInfo/i18n/en.json +1 -0
  29. package/dist/components/InfoViewer/schemaInfo/i18n/index.d.ts +1 -1
  30. package/dist/components/InfoViewer/schemaInfo/utils.js +6 -1
  31. package/dist/components/InfoViewer/schemaInfo/utils.js.map +1 -1
  32. package/dist/components/NodeHostWrapper/NodeHostWrapper.d.ts +4 -1
  33. package/dist/components/NodeHostWrapper/NodeHostWrapper.js +13 -9
  34. package/dist/components/NodeHostWrapper/NodeHostWrapper.js.map +1 -1
  35. package/dist/components/PDiskInfo/PDiskInfo.js +2 -1
  36. package/dist/components/PDiskInfo/PDiskInfo.js.map +1 -1
  37. package/dist/components/PDiskInfo/i18n/index.d.ts +1 -1
  38. package/dist/components/PDiskPopup/PDiskPopup.js +5 -1
  39. package/dist/components/PDiskPopup/PDiskPopup.js.map +1 -1
  40. package/dist/components/PaginatedTable/KeyboardNavigation.d.ts +9 -0
  41. package/dist/components/PaginatedTable/KeyboardNavigation.js +14 -0
  42. package/dist/components/PaginatedTable/KeyboardNavigation.js.map +1 -0
  43. package/dist/components/PaginatedTable/PaginatedTable.d.ts +4 -1
  44. package/dist/components/PaginatedTable/PaginatedTable.js +103 -18
  45. package/dist/components/PaginatedTable/PaginatedTable.js.map +1 -1
  46. package/dist/components/PaginatedTable/PaginatedTable.scss +10 -0
  47. package/dist/components/PaginatedTable/PaginatedTableContext.d.ts +2 -3
  48. package/dist/components/PaginatedTable/PaginatedTableContext.js +10 -11
  49. package/dist/components/PaginatedTable/PaginatedTableContext.js.map +1 -1
  50. package/dist/components/PaginatedTable/PaginatedTableWithLayout.d.ts +2 -1
  51. package/dist/components/PaginatedTable/PaginatedTableWithLayout.js +2 -2
  52. package/dist/components/PaginatedTable/PaginatedTableWithLayout.js.map +1 -1
  53. package/dist/components/PaginatedTable/ResizeablePaginatedTable.js +2 -1
  54. package/dist/components/PaginatedTable/ResizeablePaginatedTable.js.map +1 -1
  55. package/dist/components/PaginatedTable/TableChunk.d.ts +1 -1
  56. package/dist/components/PaginatedTable/TableChunk.js +8 -11
  57. package/dist/components/PaginatedTable/TableChunk.js.map +1 -1
  58. package/dist/components/PaginatedTable/TableChunksRenderer.d.ts +3 -2
  59. package/dist/components/PaginatedTable/TableChunksRenderer.js +6 -1
  60. package/dist/components/PaginatedTable/TableChunksRenderer.js.map +1 -1
  61. package/dist/components/PaginatedTable/TableRow.d.ts +3 -1
  62. package/dist/components/PaginatedTable/TableRow.js +24 -8
  63. package/dist/components/PaginatedTable/TableRow.js.map +1 -1
  64. package/dist/components/PaginatedTable/getTableChunkQueryParams.d.ts +23 -0
  65. package/dist/components/PaginatedTable/getTableChunkQueryParams.js +12 -0
  66. package/dist/components/PaginatedTable/getTableChunkQueryParams.js.map +1 -0
  67. package/dist/components/PaginatedTable/rowLookup.d.ts +8 -0
  68. package/dist/components/PaginatedTable/rowLookup.js +35 -0
  69. package/dist/components/PaginatedTable/rowLookup.js.map +1 -0
  70. package/dist/components/PaginatedTable/tableCounts.d.ts +19 -0
  71. package/dist/components/PaginatedTable/tableCounts.js +30 -0
  72. package/dist/components/PaginatedTable/tableCounts.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/ShardsTable/columns.js +6 -3
  90. package/dist/components/ShardsTable/columns.js.map +1 -1
  91. package/dist/components/ShardsTable/i18n/en.json +1 -0
  92. package/dist/components/ShardsTable/i18n/index.d.ts +1 -1
  93. package/dist/components/TableKeyboardNavigation/TableKeyboardNavigation.d.ts +54 -0
  94. package/dist/components/TableKeyboardNavigation/TableKeyboardNavigation.js +389 -0
  95. package/dist/components/TableKeyboardNavigation/TableKeyboardNavigation.js.map +1 -0
  96. package/dist/components/TableKeyboardNavigation/TableKeyboardNavigation.scss +16 -0
  97. package/dist/components/TableKeyboardNavigation/i18n/en.json +4 -0
  98. package/dist/components/TableKeyboardNavigation/i18n/index.d.ts +2 -0
  99. package/dist/components/TableKeyboardNavigation/i18n/index.js +4 -0
  100. package/dist/components/TableKeyboardNavigation/i18n/index.js.map +1 -0
  101. package/dist/components/TableKeyboardNavigation/utils.d.ts +3 -0
  102. package/dist/components/TableKeyboardNavigation/utils.js +24 -0
  103. package/dist/components/TableKeyboardNavigation/utils.js.map +1 -0
  104. package/dist/components/TableWithControlsLayout/TableWithControlsLayout.d.ts +4 -1
  105. package/dist/components/TableWithControlsLayout/TableWithControlsLayout.js +4 -2
  106. package/dist/components/TableWithControlsLayout/TableWithControlsLayout.js.map +1 -1
  107. package/dist/components/TenantNameWrapper/TenantNameWrapper.d.ts +3 -1
  108. package/dist/components/TenantNameWrapper/TenantNameWrapper.js +8 -12
  109. package/dist/components/TenantNameWrapper/TenantNameWrapper.js.map +1 -1
  110. package/dist/components/TenantNameWrapper/utils.d.ts +10 -0
  111. package/dist/components/TenantNameWrapper/utils.js +11 -0
  112. package/dist/components/TenantNameWrapper/utils.js.map +1 -1
  113. package/dist/components/UptimeViewer/UptimeViewer.d.ts +2 -2
  114. package/dist/components/VDisk/VDisk.d.ts +6 -1
  115. package/dist/components/VDisk/VDisk.js +97 -32
  116. package/dist/components/VDisk/VDisk.js.map +1 -1
  117. package/dist/components/VDisk/VDiskWithDonorsStack.d.ts +6 -2
  118. package/dist/components/VDisk/VDiskWithDonorsStack.js +9 -4
  119. package/dist/components/VDisk/VDiskWithDonorsStack.js.map +1 -1
  120. package/dist/components/VDisk/i18n/en.json +14 -1
  121. package/dist/components/VDisk/i18n/index.d.ts +1 -1
  122. package/dist/components/VDiskInfo/i18n/index.d.ts +1 -1
  123. package/dist/components/nodesColumns/columns.d.ts +4 -1
  124. package/dist/components/nodesColumns/columns.js +13 -0
  125. package/dist/components/nodesColumns/columns.js.map +1 -1
  126. package/dist/components/nodesColumns/constants.d.ts +2 -0
  127. package/dist/components/nodesColumns/constants.js +6 -0
  128. package/dist/components/nodesColumns/constants.js.map +1 -1
  129. package/dist/components/nodesColumns/i18n/en.json +2 -1
  130. package/dist/components/nodesColumns/i18n/index.d.ts +1 -1
  131. package/dist/containers/Clusters/Clusters.js +11 -7
  132. package/dist/containers/Clusters/Clusters.js.map +1 -1
  133. package/dist/containers/Node/NodeNetwork/NodeNetworkControls/NodeNetworkControls.js +1 -1
  134. package/dist/containers/Node/NodeNetwork/NodeNetworkControls/NodeNetworkControls.js.map +1 -1
  135. package/dist/containers/Node/NodeNetwork/NodeNetworkTable.js +11 -1
  136. package/dist/containers/Node/NodeNetwork/NodeNetworkTable.js.map +1 -1
  137. package/dist/containers/Node/Threads/ThreadStatesBar/ThreadStatesBar.d.ts +1 -1
  138. package/dist/containers/Nodes/NodesControls/NodesControls.js +1 -1
  139. package/dist/containers/Nodes/NodesControls/NodesControls.js.map +1 -1
  140. package/dist/containers/Nodes/NodesTable.js +12 -1
  141. package/dist/containers/Nodes/NodesTable.js.map +1 -1
  142. package/dist/containers/Nodes/PaginatedNodes/GroupedNodesComponent.js +1 -1
  143. package/dist/containers/Nodes/PaginatedNodes/GroupedNodesComponent.js.map +1 -1
  144. package/dist/containers/Nodes/columns/columns.js +2 -1
  145. package/dist/containers/Nodes/columns/columns.js.map +1 -1
  146. package/dist/containers/Storage/Disks/Disks.d.ts +2 -1
  147. package/dist/containers/Storage/Disks/Disks.js +32 -23
  148. package/dist/containers/Storage/Disks/Disks.js.map +1 -1
  149. package/dist/containers/Storage/Disks/Disks.scss +5 -0
  150. package/dist/containers/Storage/PDisk/PDisk.d.ts +6 -9
  151. package/dist/containers/Storage/PDisk/PDisk.js +99 -37
  152. package/dist/containers/Storage/PDisk/PDisk.js.map +1 -1
  153. package/dist/containers/Storage/PDisk/PDisk.scss +79 -1
  154. package/dist/containers/Storage/PDisk/PDiskWithVDisks.d.ts +17 -0
  155. package/dist/containers/Storage/PDisk/PDiskWithVDisks.js +48 -0
  156. package/dist/containers/Storage/PDisk/PDiskWithVDisks.js.map +1 -0
  157. package/dist/containers/Storage/PDisk/i18n/en.json +9 -0
  158. package/dist/containers/Storage/PDisk/i18n/index.d.ts +1 -1
  159. package/dist/containers/Storage/PDisk/index.d.ts +1 -0
  160. package/dist/containers/Storage/PDisk/index.js +1 -0
  161. package/dist/containers/Storage/PDisk/index.js.map +1 -1
  162. package/dist/containers/Storage/PDisks/PDisks.d.ts +4 -1
  163. package/dist/containers/Storage/PDisks/PDisks.js +52 -6
  164. package/dist/containers/Storage/PDisks/PDisks.js.map +1 -1
  165. package/dist/containers/Storage/PaginatedStorage.js +3 -1
  166. package/dist/containers/Storage/PaginatedStorage.js.map +1 -1
  167. package/dist/containers/Storage/PaginatedStorageGroups/GroupedStorageGroupsComponent.js +1 -1
  168. package/dist/containers/Storage/PaginatedStorageGroups/GroupedStorageGroupsComponent.js.map +1 -1
  169. package/dist/containers/Storage/PaginatedStorageGroups/StorageGroupsControls.js +2 -2
  170. package/dist/containers/Storage/PaginatedStorageGroups/StorageGroupsControls.js.map +1 -1
  171. package/dist/containers/Storage/PaginatedStorageGroupsTable/PaginatedStorageGroupsTable.js +10 -1
  172. package/dist/containers/Storage/PaginatedStorageGroupsTable/PaginatedStorageGroupsTable.js.map +1 -1
  173. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/i18n/index.d.ts +1 -1
  174. package/dist/containers/Storage/PaginatedStorageNodes/GroupedStorageNodesComponent.d.ts +1 -0
  175. package/dist/containers/Storage/PaginatedStorageNodes/GroupedStorageNodesComponent.js +8 -5
  176. package/dist/containers/Storage/PaginatedStorageNodes/GroupedStorageNodesComponent.js.map +1 -1
  177. package/dist/containers/Storage/PaginatedStorageNodes/StorageNodesComponent.js +6 -3
  178. package/dist/containers/Storage/PaginatedStorageNodes/StorageNodesComponent.js.map +1 -1
  179. package/dist/containers/Storage/PaginatedStorageNodes/StorageNodesControls.js +17 -5
  180. package/dist/containers/Storage/PaginatedStorageNodes/StorageNodesControls.js.map +1 -1
  181. package/dist/containers/Storage/PaginatedStorageNodes/nodeExpertModeLayout.d.ts +16 -0
  182. package/dist/containers/Storage/PaginatedStorageNodes/nodeExpertModeLayout.js +68 -0
  183. package/dist/containers/Storage/PaginatedStorageNodes/nodeExpertModeLayout.js.map +1 -0
  184. package/dist/containers/Storage/PaginatedStorageNodesTable/PaginatedStorageNodesTable.d.ts +2 -1
  185. package/dist/containers/Storage/PaginatedStorageNodesTable/PaginatedStorageNodesTable.js +14 -2
  186. package/dist/containers/Storage/PaginatedStorageNodesTable/PaginatedStorageNodesTable.js.map +1 -1
  187. package/dist/containers/Storage/PaginatedStorageNodesTable/columns/columns.js +2 -2
  188. package/dist/containers/Storage/PaginatedStorageNodesTable/columns/columns.js.map +1 -1
  189. package/dist/containers/Storage/PaginatedStorageNodesTable/columns/hooks.js +7 -2
  190. package/dist/containers/Storage/PaginatedStorageNodesTable/columns/hooks.js.map +1 -1
  191. package/dist/containers/Storage/PaginatedStorageNodesTable/columns/types.d.ts +2 -0
  192. package/dist/containers/Storage/StorageExpertModePanel/StorageGroupsExpertModePanel.d.ts +5 -0
  193. package/dist/containers/Storage/StorageExpertModePanel/StorageGroupsExpertModePanel.js +33 -0
  194. package/dist/containers/Storage/StorageExpertModePanel/StorageGroupsExpertModePanel.js.map +1 -0
  195. package/dist/containers/Storage/StorageExpertModePanel/StorageNodesExpertModePanel.d.ts +5 -0
  196. package/dist/containers/Storage/StorageExpertModePanel/StorageNodesExpertModePanel.js +31 -0
  197. package/dist/containers/Storage/StorageExpertModePanel/StorageNodesExpertModePanel.js.map +1 -0
  198. package/dist/containers/Storage/StorageExpertModePanel/components/DriveTypeLegend.d.ts +1 -0
  199. package/dist/containers/Storage/StorageExpertModePanel/components/DriveTypeLegend.js +7 -0
  200. package/dist/containers/Storage/StorageExpertModePanel/components/DriveTypeLegend.js.map +1 -0
  201. package/dist/containers/Storage/StorageExpertModePanel/components/ExpertModePanelLayout.d.ts +21 -0
  202. package/dist/containers/Storage/StorageExpertModePanel/components/ExpertModePanelLayout.js +13 -0
  203. package/dist/containers/Storage/StorageExpertModePanel/components/ExpertModePanelLayout.js.map +1 -0
  204. package/dist/containers/Storage/StorageExpertModePanel/components/FrontQueuesLegend.js +1 -0
  205. package/dist/containers/Storage/StorageExpertModePanel/components/FrontQueuesLegend.js.map +1 -1
  206. package/dist/containers/Storage/StorageExpertModePanel/components/PDiskDecommitLegend.js +1 -0
  207. package/dist/containers/Storage/StorageExpertModePanel/components/PDiskDecommitLegend.js.map +1 -1
  208. package/dist/containers/Storage/StorageExpertModePanel/components/PDiskDriveLegend.js +3 -2
  209. package/dist/containers/Storage/StorageExpertModePanel/components/PDiskDriveLegend.js.map +1 -1
  210. package/dist/containers/Storage/StorageExpertModePanel/components/PDiskMaintenanceLegend.js +1 -0
  211. package/dist/containers/Storage/StorageExpertModePanel/components/PDiskMaintenanceLegend.js.map +1 -1
  212. package/dist/containers/Storage/StorageExpertModePanel/components/SpaceLegend.js +4 -4
  213. package/dist/containers/Storage/StorageExpertModePanel/components/SpaceLegend.js.map +1 -1
  214. package/dist/containers/Storage/StorageExpertModePanel/components/StatusPairLegend.js +3 -3
  215. package/dist/containers/Storage/StorageExpertModePanel/components/StatusPairLegend.js.map +1 -1
  216. package/dist/containers/Storage/StorageExpertModePanel/components/getSpaceLegendSelection.d.ts +1 -1
  217. package/dist/containers/Storage/StorageExpertModePanel/components/renderExpertModeLegend.d.ts +4 -0
  218. package/dist/containers/Storage/StorageExpertModePanel/components/renderExpertModeLegend.js +54 -0
  219. package/dist/containers/Storage/StorageExpertModePanel/components/renderExpertModeLegend.js.map +1 -0
  220. package/dist/containers/Storage/StorageExpertModePanel/constants.d.ts +23 -0
  221. package/dist/containers/Storage/StorageExpertModePanel/constants.js +23 -0
  222. package/dist/containers/Storage/StorageExpertModePanel/constants.js.map +1 -1
  223. package/dist/containers/Storage/StorageExpertModePanel/i18n/en.json +6 -2
  224. package/dist/containers/Storage/StorageExpertModePanel/i18n/index.d.ts +1 -1
  225. package/dist/containers/Storage/TableGroup/TableGroup.js +2 -1
  226. package/dist/containers/Storage/TableGroup/TableGroup.js.map +1 -1
  227. package/dist/containers/Storage/VDisks/VDisks.d.ts +2 -1
  228. package/dist/containers/Storage/VDisks/VDisks.js +11 -4
  229. package/dist/containers/Storage/VDisks/VDisks.js.map +1 -1
  230. package/dist/containers/Storage/VDisks/VDisks.scss +3 -0
  231. package/dist/containers/Storage/useStoragePDiskDisplayStateGetter.d.ts +1 -0
  232. package/dist/containers/Storage/useStoragePDiskDisplayStateGetter.js +80 -102
  233. package/dist/containers/Storage/useStoragePDiskDisplayStateGetter.js.map +1 -1
  234. package/dist/containers/Storage/useStorageQueryParams.d.ts +13 -5
  235. package/dist/containers/Storage/useStorageQueryParams.js +50 -2
  236. package/dist/containers/Storage/useStorageQueryParams.js.map +1 -1
  237. package/dist/containers/Storage/useStorageVDiskDisplayStateGetter.d.ts +1 -0
  238. package/dist/containers/Storage/useStorageVDiskDisplayStateGetter.js +59 -13
  239. package/dist/containers/Storage/useStorageVDiskDisplayStateGetter.js.map +1 -1
  240. package/dist/containers/Storage/utils/useStorageColumnsSettings.d.ts +4 -1
  241. package/dist/containers/Storage/utils/useStorageColumnsSettings.js +49 -39
  242. package/dist/containers/Storage/utils/useStorageColumnsSettings.js.map +1 -1
  243. package/dist/containers/Storage/utils/useVirtualizedDiskList.d.ts +10 -0
  244. package/dist/containers/Storage/utils/useVirtualizedDiskList.js +131 -0
  245. package/dist/containers/Storage/utils/useVirtualizedDiskList.js.map +1 -0
  246. package/dist/containers/Tablet/Tablet.js +4 -2
  247. package/dist/containers/Tablet/Tablet.js.map +1 -1
  248. package/dist/containers/Tablet/components/TabletControls/TabletControls.js +3 -1
  249. package/dist/containers/Tablet/components/TabletControls/TabletControls.js.map +1 -1
  250. package/dist/containers/Tablet/components/TabletInfo/TabletInfo.js +9 -3
  251. package/dist/containers/Tablet/components/TabletInfo/TabletInfo.js.map +1 -1
  252. package/dist/containers/Tablets/TabletsTable.js +25 -1
  253. package/dist/containers/Tablets/TabletsTable.js.map +1 -1
  254. package/dist/containers/Tablets/i18n/en.json +2 -1
  255. package/dist/containers/Tablets/i18n/index.d.ts +1 -1
  256. package/dist/containers/Tenant/Diagnostics/Overview/AsyncReplicationPaths/i18n/index.d.ts +1 -1
  257. package/dist/containers/Tenant/Diagnostics/Overview/Overview.js +2 -1
  258. package/dist/containers/Tenant/Diagnostics/Overview/Overview.js.map +1 -1
  259. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/ResourcePoolInfo.d.ts +7 -0
  260. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/ResourcePoolInfo.js +69 -0
  261. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/ResourcePoolInfo.js.map +1 -0
  262. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/i18n/en.json +9 -0
  263. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/i18n/index.d.ts +2 -0
  264. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/i18n/index.js +5 -0
  265. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/i18n/index.js.map +1 -0
  266. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/index.d.ts +1 -0
  267. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/index.js +2 -0
  268. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/index.js.map +1 -0
  269. package/dist/containers/Tenant/Diagnostics/Overview/utils/prepareTopicSchemaInfo.js +3 -3
  270. package/dist/containers/Tenant/Diagnostics/Overview/utils/prepareTopicSchemaInfo.js.map +1 -1
  271. package/dist/containers/Tenant/Diagnostics/TopQueries/QueriesTableWithDrawer.d.ts +2 -1
  272. package/dist/containers/Tenant/Diagnostics/TopQueries/QueriesTableWithDrawer.js +3 -2
  273. package/dist/containers/Tenant/Diagnostics/TopQueries/QueriesTableWithDrawer.js.map +1 -1
  274. package/dist/containers/Tenant/Diagnostics/TopQueries/RunningQueriesData.js +1 -1
  275. package/dist/containers/Tenant/Diagnostics/TopQueries/RunningQueriesData.js.map +1 -1
  276. package/dist/containers/Tenant/Diagnostics/TopQueries/TopQueriesData.js +1 -1
  277. package/dist/containers/Tenant/Diagnostics/TopQueries/TopQueriesData.js.map +1 -1
  278. package/dist/containers/Tenant/Diagnostics/TopShards/TopShards.js +1 -1
  279. package/dist/containers/Tenant/Diagnostics/TopShards/TopShards.js.map +1 -1
  280. package/dist/containers/Tenant/Diagnostics/TopicData/columns/columns.d.ts +3 -3
  281. package/dist/containers/Tenant/Query/QueriesHistory/QueriesHistory.js +2 -1
  282. package/dist/containers/Tenant/Query/QueriesHistory/QueriesHistory.js.map +1 -1
  283. package/dist/containers/Tenant/Query/SavedQueries/SavedQueries.js +1 -1
  284. package/dist/containers/Tenant/Query/SavedQueries/SavedQueries.js.map +1 -1
  285. package/dist/containers/Tenants/TenantsTable.js +37 -6
  286. package/dist/containers/Tenants/TenantsTable.js.map +1 -1
  287. package/dist/containers/VDiskPage/VDiskPage.js +10 -2
  288. package/dist/containers/VDiskPage/VDiskPage.js.map +1 -1
  289. package/dist/services/api/tablets.d.ts +6 -4
  290. package/dist/services/api/tablets.js +9 -8
  291. package/dist/services/api/tablets.js.map +1 -1
  292. package/dist/store/reducers/capabilities/capabilities.d.ts +4 -4
  293. package/dist/store/reducers/capabilities/hooks.d.ts +1 -0
  294. package/dist/store/reducers/capabilities/hooks.js +8 -0
  295. package/dist/store/reducers/capabilities/hooks.js.map +1 -1
  296. package/dist/store/reducers/nodesList.d.ts +3 -261
  297. package/dist/store/reducers/nodesList.js +1 -1
  298. package/dist/store/reducers/nodesList.js.map +1 -1
  299. package/dist/store/reducers/settings/constants.d.ts +4 -0
  300. package/dist/store/reducers/settings/constants.js +4 -0
  301. package/dist/store/reducers/settings/constants.js.map +1 -1
  302. package/dist/store/reducers/storage/prepareGroupsDisks.d.ts +1 -0
  303. package/dist/store/reducers/storage/prepareGroupsDisks.js +17 -13
  304. package/dist/store/reducers/storage/prepareGroupsDisks.js.map +1 -1
  305. package/dist/store/reducers/storage/utils.js +11 -5
  306. package/dist/store/reducers/storage/utils.js.map +1 -1
  307. package/dist/store/reducers/table/table.js +6 -0
  308. package/dist/store/reducers/table/table.js.map +1 -1
  309. package/dist/store/reducers/tableData.d.ts +1 -1
  310. package/dist/store/reducers/tableData.js.map +1 -1
  311. package/dist/store/reducers/tablet.d.ts +3 -0
  312. package/dist/store/reducers/tablet.js +6 -6
  313. package/dist/store/reducers/tablet.js.map +1 -1
  314. package/dist/store/reducers/tenantOverview/topShards/tenantOverviewTopShards.js +1 -1
  315. package/dist/store/reducers/tenantOverview/topShards/tenantOverviewTopShards.js.map +1 -1
  316. package/dist/store/reducers/topic/topic.js +7 -1
  317. package/dist/store/reducers/topic/topic.js.map +1 -1
  318. package/dist/types/api/capabilities.d.ts +2 -2
  319. package/dist/types/api/pdisk.d.ts +2 -0
  320. package/dist/types/api/pdisk.js.map +1 -1
  321. package/dist/types/api/schema/persQueueGroup.d.ts +2 -2
  322. package/dist/types/api/schema/schema.d.ts +15 -0
  323. package/dist/types/api/schema/schema.js.map +1 -1
  324. package/dist/types/api/schema/tableIndex.d.ts +1 -0
  325. package/dist/types/api/storage.d.ts +4 -0
  326. package/dist/types/api/storage.js.map +1 -1
  327. package/dist/types/api/vdisk.d.ts +2 -0
  328. package/dist/types/api/vdisk.js.map +1 -1
  329. package/dist/uiFactory/types.d.ts +6 -0
  330. package/dist/utils/developerUI/tabletDevUi.d.ts +1 -0
  331. package/dist/utils/developerUI/tabletDevUi.js +4 -0
  332. package/dist/utils/developerUI/tabletDevUi.js.map +1 -0
  333. package/dist/utils/disks/displayState.d.ts +5 -2
  334. package/dist/utils/disks/displayState.js.map +1 -1
  335. package/dist/utils/disks/driveType.d.ts +3 -0
  336. package/dist/utils/disks/driveType.js +27 -0
  337. package/dist/utils/disks/driveType.js.map +1 -0
  338. package/dist/utils/disks/getDiskBarTone.d.ts +4 -2
  339. package/dist/utils/disks/getDiskBarTone.js +8 -1
  340. package/dist/utils/disks/getDiskBarTone.js.map +1 -1
  341. package/dist/utils/disks/getPDiskType.d.ts +1 -0
  342. package/dist/utils/disks/getPDiskType.js +3 -0
  343. package/dist/utils/disks/getPDiskType.js.map +1 -1
  344. package/dist/utils/disks/groupBy.d.ts +1 -0
  345. package/dist/utils/disks/groupBy.js +1 -0
  346. package/dist/utils/disks/groupBy.js.map +1 -1
  347. package/dist/utils/disks/iconCalculators.d.ts +1 -1
  348. package/dist/utils/disks/iconCalculators.js +2 -2
  349. package/dist/utils/disks/iconCalculators.js.map +1 -1
  350. package/dist/utils/disks/pdiskState.js +2 -2
  351. package/dist/utils/disks/pdiskState.js.map +1 -1
  352. package/dist/utils/disks/prepareDisks.js +19 -9
  353. package/dist/utils/disks/prepareDisks.js.map +1 -1
  354. package/dist/utils/disks/types.d.ts +3 -2
  355. package/dist/utils/objectCreationMetrics.d.ts +5 -0
  356. package/dist/utils/objectCreationMetrics.js +38 -0
  357. package/dist/utils/objectCreationMetrics.js.map +1 -0
  358. package/dist/utils/query.d.ts +1 -0
  359. package/dist/utils/query.js +6 -0
  360. package/dist/utils/query.js.map +1 -1
  361. package/package.json +1 -1
  362. package/src/components/DiskStateProgressBar/AllModeCapacityAlertIndicator.tsx +15 -2
  363. package/src/components/DiskStateProgressBar/AllModeIndicators.tsx +30 -6
  364. package/src/components/DiskStateProgressBar/DiskIndicator.tsx +27 -8
  365. package/src/components/DiskStateProgressBar/DiskStateProgressBar.scss +96 -46
  366. package/src/components/DiskStateProgressBar/DiskStateProgressBar.tsx +1 -1
  367. package/src/components/DiskStateProgressBar/PDiskAllModeIndicators.tsx +16 -3
  368. package/src/components/EvictVDiskButton/EvictVDiskButton.tsx +10 -3
  369. package/src/components/FullNodeViewer/FullNodeViewer.scss +3 -3
  370. package/src/components/FullNodeViewer/FullNodeViewer.tsx +81 -34
  371. package/src/components/FullNodeViewer/i18n/en.json +2 -1
  372. package/src/components/HoverPopup/HoverPopup.tsx +21 -16
  373. package/src/components/InfoViewer/InfoViewer.tsx +4 -2
  374. package/src/components/InfoViewer/formatters/pqGroup.ts +6 -2
  375. package/src/components/InfoViewer/schemaInfo/i18n/en.json +1 -0
  376. package/src/components/InfoViewer/schemaInfo/utils.tsx +9 -0
  377. package/src/components/NodeHostWrapper/NodeHostWrapper.tsx +23 -13
  378. package/src/components/PDiskInfo/PDiskInfo.tsx +2 -1
  379. package/src/components/PDiskPopup/PDiskPopup.tsx +5 -1
  380. package/src/components/PaginatedTable/KeyboardNavigation.tsx +30 -0
  381. package/src/components/PaginatedTable/PaginatedTable.scss +10 -0
  382. package/src/components/PaginatedTable/PaginatedTable.tsx +154 -20
  383. package/src/components/PaginatedTable/PaginatedTableContext.tsx +14 -19
  384. package/src/components/PaginatedTable/PaginatedTableWithLayout.tsx +6 -1
  385. package/src/components/PaginatedTable/ResizeablePaginatedTable.tsx +6 -1
  386. package/src/components/PaginatedTable/TableChunk.tsx +9 -16
  387. package/src/components/PaginatedTable/TableChunksRenderer.tsx +13 -1
  388. package/src/components/PaginatedTable/TableRow.tsx +54 -20
  389. package/src/components/PaginatedTable/getTableChunkQueryParams.ts +25 -0
  390. package/src/components/PaginatedTable/rowLookup.ts +63 -0
  391. package/src/components/PaginatedTable/tableCounts.ts +50 -0
  392. package/src/components/PaginatedTable/useKeyboardNavigation.ts +115 -0
  393. package/src/components/ResizeableDataTable/DataTableKeyboardNavigation.tsx +194 -0
  394. package/src/components/ResizeableDataTable/ResizeableDataTable.scss +10 -0
  395. package/src/components/ResizeableDataTable/ResizeableDataTable.tsx +100 -5
  396. package/src/components/ResizeableDataTable/getDataTableOrder.ts +18 -0
  397. package/src/components/Search/Search.tsx +8 -1
  398. package/src/components/ShardsTable/columns.tsx +14 -5
  399. package/src/components/ShardsTable/i18n/en.json +1 -0
  400. package/src/components/TableKeyboardNavigation/TableKeyboardNavigation.scss +16 -0
  401. package/src/components/TableKeyboardNavigation/TableKeyboardNavigation.tsx +519 -0
  402. package/src/components/TableKeyboardNavigation/i18n/en.json +4 -0
  403. package/src/components/TableKeyboardNavigation/i18n/index.ts +5 -0
  404. package/src/components/TableKeyboardNavigation/utils.ts +36 -0
  405. package/src/components/TableWithControlsLayout/TableWithControlsLayout.tsx +26 -1
  406. package/src/components/TenantNameWrapper/TenantNameWrapper.tsx +14 -15
  407. package/src/components/TenantNameWrapper/utils.ts +26 -0
  408. package/src/components/VDisk/VDisk.tsx +141 -44
  409. package/src/components/VDisk/VDiskWithDonorsStack.tsx +23 -4
  410. package/src/components/VDisk/i18n/en.json +14 -1
  411. package/src/components/nodesColumns/columns.tsx +13 -1
  412. package/src/components/nodesColumns/constants.ts +6 -0
  413. package/src/components/nodesColumns/i18n/en.json +2 -1
  414. package/src/containers/Clusters/Clusters.tsx +47 -29
  415. package/src/containers/Node/NodeNetwork/NodeNetworkControls/NodeNetworkControls.tsx +1 -0
  416. package/src/containers/Node/NodeNetwork/NodeNetworkTable.tsx +17 -0
  417. package/src/containers/Nodes/NodesControls/NodesControls.tsx +1 -0
  418. package/src/containers/Nodes/NodesTable.tsx +17 -1
  419. package/src/containers/Nodes/PaginatedNodes/GroupedNodesComponent.tsx +1 -0
  420. package/src/containers/Nodes/columns/columns.tsx +2 -0
  421. package/src/containers/Storage/Disks/Disks.scss +5 -0
  422. package/src/containers/Storage/Disks/Disks.tsx +157 -95
  423. package/src/containers/Storage/PDisk/PDisk.scss +79 -1
  424. package/src/containers/Storage/PDisk/PDisk.tsx +166 -81
  425. package/src/containers/Storage/PDisk/PDiskWithVDisks.tsx +181 -0
  426. package/src/containers/Storage/PDisk/i18n/en.json +9 -0
  427. package/src/containers/Storage/PDisk/index.ts +1 -0
  428. package/src/containers/Storage/PDisks/PDisks.tsx +157 -22
  429. package/src/containers/Storage/PaginatedStorage.tsx +4 -0
  430. package/src/containers/Storage/PaginatedStorageGroups/GroupedStorageGroupsComponent.tsx +1 -0
  431. package/src/containers/Storage/PaginatedStorageGroups/StorageGroupsControls.tsx +3 -2
  432. package/src/containers/Storage/PaginatedStorageGroupsTable/PaginatedStorageGroupsTable.tsx +13 -0
  433. package/src/containers/Storage/PaginatedStorageNodes/GroupedStorageNodesComponent.tsx +10 -2
  434. package/src/containers/Storage/PaginatedStorageNodes/StorageNodesComponent.tsx +6 -2
  435. package/src/containers/Storage/PaginatedStorageNodes/StorageNodesControls.tsx +76 -41
  436. package/src/containers/Storage/PaginatedStorageNodes/nodeExpertModeLayout.ts +103 -0
  437. package/src/containers/Storage/PaginatedStorageNodesTable/PaginatedStorageNodesTable.tsx +24 -1
  438. package/src/containers/Storage/PaginatedStorageNodesTable/columns/columns.tsx +3 -1
  439. package/src/containers/Storage/PaginatedStorageNodesTable/columns/hooks.ts +8 -1
  440. package/src/containers/Storage/PaginatedStorageNodesTable/columns/types.ts +2 -0
  441. package/src/containers/Storage/StorageExpertModePanel/StorageGroupsExpertModePanel.tsx +65 -0
  442. package/src/containers/Storage/StorageExpertModePanel/StorageNodesExpertModePanel.tsx +67 -0
  443. package/src/containers/Storage/StorageExpertModePanel/components/DriveTypeLegend.tsx +22 -0
  444. package/src/containers/Storage/StorageExpertModePanel/components/ExpertModePanelLayout.tsx +63 -0
  445. package/src/containers/Storage/StorageExpertModePanel/components/FrontQueuesLegend.tsx +1 -0
  446. package/src/containers/Storage/StorageExpertModePanel/components/PDiskDecommitLegend.tsx +1 -0
  447. package/src/containers/Storage/StorageExpertModePanel/components/PDiskDriveLegend.tsx +3 -2
  448. package/src/containers/Storage/StorageExpertModePanel/components/PDiskMaintenanceLegend.tsx +1 -0
  449. package/src/containers/Storage/StorageExpertModePanel/components/SpaceLegend.tsx +3 -0
  450. package/src/containers/Storage/StorageExpertModePanel/components/StatusPairLegend.tsx +7 -9
  451. package/src/containers/Storage/StorageExpertModePanel/components/getSpaceLegendSelection.ts +1 -1
  452. package/src/containers/Storage/StorageExpertModePanel/components/renderExpertModeLegend.tsx +63 -0
  453. package/src/containers/Storage/StorageExpertModePanel/constants.ts +27 -0
  454. package/src/containers/Storage/StorageExpertModePanel/i18n/en.json +6 -2
  455. package/src/containers/Storage/TableGroup/TableGroup.tsx +6 -1
  456. package/src/containers/Storage/VDisks/VDisks.scss +3 -0
  457. package/src/containers/Storage/VDisks/VDisks.tsx +29 -7
  458. package/src/containers/Storage/useStoragePDiskDisplayStateGetter.ts +102 -135
  459. package/src/containers/Storage/useStorageQueryParams.ts +120 -1
  460. package/src/containers/Storage/useStorageVDiskDisplayStateGetter.ts +75 -10
  461. package/src/containers/Storage/utils/useStorageColumnsSettings.ts +77 -49
  462. package/src/containers/Storage/utils/useVirtualizedDiskList.ts +156 -0
  463. package/src/containers/Tablet/Tablet.tsx +4 -2
  464. package/src/containers/Tablet/components/TabletControls/TabletControls.tsx +7 -3
  465. package/src/containers/Tablet/components/TabletInfo/TabletInfo.tsx +13 -3
  466. package/src/containers/Tablets/TabletsTable.tsx +50 -10
  467. package/src/containers/Tablets/i18n/en.json +2 -1
  468. package/src/containers/Tenant/Diagnostics/Overview/Overview.tsx +2 -1
  469. package/src/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/ResourcePoolInfo.tsx +106 -0
  470. package/src/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/i18n/en.json +9 -0
  471. package/src/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/i18n/index.ts +7 -0
  472. package/src/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/index.ts +1 -0
  473. package/src/containers/Tenant/Diagnostics/Overview/utils/prepareTopicSchemaInfo.ts +3 -3
  474. package/src/containers/Tenant/Diagnostics/TopQueries/QueriesTableWithDrawer.tsx +6 -0
  475. package/src/containers/Tenant/Diagnostics/TopQueries/RunningQueriesData.tsx +4 -0
  476. package/src/containers/Tenant/Diagnostics/TopQueries/TopQueriesData.tsx +7 -1
  477. package/src/containers/Tenant/Diagnostics/TopShards/TopShards.tsx +1 -1
  478. package/src/containers/Tenant/Query/QueriesHistory/QueriesHistory.tsx +5 -0
  479. package/src/containers/Tenant/Query/SavedQueries/SavedQueries.tsx +6 -0
  480. package/src/containers/Tenants/TenantsTable.tsx +70 -12
  481. package/src/containers/VDiskPage/VDiskPage.tsx +10 -2
  482. package/src/services/api/tablets.ts +16 -7
  483. package/src/store/reducers/capabilities/hooks.ts +9 -0
  484. package/src/store/reducers/nodesList.ts +2 -3
  485. package/src/store/reducers/settings/constants.ts +4 -0
  486. package/src/store/reducers/storage/prepareGroupsDisks.ts +16 -11
  487. package/src/store/reducers/storage/utils.ts +12 -5
  488. package/src/store/reducers/table/table.ts +6 -0
  489. package/src/store/reducers/tableData.ts +1 -1
  490. package/src/store/reducers/tablet.ts +25 -6
  491. package/src/store/reducers/tenantOverview/topShards/tenantOverviewTopShards.ts +1 -1
  492. package/src/store/reducers/topic/topic.ts +7 -1
  493. package/src/types/api/capabilities.ts +2 -2
  494. package/src/types/api/pdisk.ts +2 -0
  495. package/src/types/api/schema/persQueueGroup.ts +2 -2
  496. package/src/types/api/schema/schema.ts +18 -0
  497. package/src/types/api/schema/tableIndex.ts +1 -0
  498. package/src/types/api/storage.ts +4 -0
  499. package/src/types/api/vdisk.ts +2 -0
  500. package/src/uiFactory/types.ts +6 -0
  501. package/src/utils/developerUI/tabletDevUi.ts +3 -0
  502. package/src/utils/disks/displayState.ts +5 -1
  503. package/src/utils/disks/driveType.ts +30 -0
  504. package/src/utils/disks/getDiskBarTone.ts +15 -1
  505. package/src/utils/disks/getPDiskType.ts +4 -0
  506. package/src/utils/disks/groupBy.ts +1 -0
  507. package/src/utils/disks/iconCalculators.ts +2 -2
  508. package/src/utils/disks/pdiskState.ts +2 -2
  509. package/src/utils/disks/prepareDisks.ts +25 -9
  510. package/src/utils/disks/types.ts +3 -2
  511. package/src/utils/objectCreationMetrics.ts +47 -0
  512. package/src/utils/query.ts +7 -0
  513. package/dist/containers/Storage/PDisk/PDiskVDisks.d.ts +0 -13
  514. package/dist/containers/Storage/PDisk/PDiskVDisks.js +0 -20
  515. package/dist/containers/Storage/PDisk/PDiskVDisks.js.map +0 -1
  516. package/dist/containers/Storage/StorageExpertModePanel/StorageExpertModePanel.d.ts +0 -6
  517. package/dist/containers/Storage/StorageExpertModePanel/StorageExpertModePanel.js +0 -66
  518. package/dist/containers/Storage/StorageExpertModePanel/StorageExpertModePanel.js.map +0 -1
  519. package/src/containers/Storage/PDisk/PDiskVDisks.tsx +0 -65
  520. package/src/containers/Storage/StorageExpertModePanel/StorageExpertModePanel.tsx +0 -151
@@ -7,10 +7,13 @@ import type {PreparedVDisk} from '../../../utils/disks/types';
7
7
  import {DISKS_POPUP_DEBOUNCE_TIMEOUT} from '../shared';
8
8
  import type {StorageViewContext} from '../types';
9
9
  import {isVdiskActive, useVDisksWithDCMargins} from '../utils';
10
+ import {useVirtualizedDiskList} from '../utils/useVirtualizedDiskList';
10
11
 
11
12
  import './VDisks.scss';
12
13
 
13
14
  const b = cn('ydb-storage-vdisks');
15
+ const EMPTY_VDISKS: PreparedVDisk[] = [];
16
+ const VDiskItem = React.memo(VDiskWithDonorsStack);
14
17
 
15
18
  interface VDisksProps {
16
19
  vDisks?: PreparedVDisk[];
@@ -19,17 +22,34 @@ interface VDisksProps {
19
22
  withIcon?: boolean;
20
23
  }
21
24
 
22
- export function VDisks({vDisks, viewContext, erasure, withIcon}: VDisksProps) {
25
+ export const VDisks = React.memo(function VDisks({
26
+ vDisks = EMPTY_VDISKS,
27
+ viewContext,
28
+ erasure,
29
+ withIcon,
30
+ }: VDisksProps) {
23
31
  const vDisksWithDCMargins = useVDisksWithDCMargins(vDisks, erasure);
24
32
 
25
33
  const [highlightedVDisk, setHighlightedVDisk] = React.useState<string | undefined>();
34
+ const {containerRef, shouldRenderDisk, getPlaceholderProps} = useVirtualizedDiskList(
35
+ vDisks,
36
+ vDisks.every((disk) => Boolean(disk.StringifiedId)),
37
+ );
38
+
39
+ React.useEffect(() => {
40
+ setHighlightedVDisk((id) =>
41
+ vDisks.some((disk) => disk.StringifiedId === id) ? id : undefined,
42
+ );
43
+ }, [vDisks]);
26
44
 
27
45
  return (
28
- <div className={b('wrapper')}>
29
- {vDisks?.map((vDisk, index) => (
30
- <VDiskWithDonorsStack
46
+ <div className={b('wrapper')} ref={containerRef}>
47
+ {vDisks.map((vDisk, index) => (
48
+ <VDiskItem
31
49
  withIcon={withIcon}
32
- key={vDisk.StringifiedId}
50
+ renderContent={shouldRenderDisk(index)}
51
+ placeholderProps={getPlaceholderProps(index)}
52
+ key={vDisk.StringifiedId || index}
33
53
  data={vDisk}
34
54
  inactive={!isVdiskActive(vDisk, viewContext)}
35
55
  delayOpen={DISKS_POPUP_DEBOUNCE_TIMEOUT}
@@ -37,11 +57,13 @@ export function VDisks({vDisks, viewContext, erasure, withIcon}: VDisksProps) {
37
57
  className={b('item', {
38
58
  'with-dc-margin': vDisksWithDCMargins.includes(index),
39
59
  })}
40
- highlightedVDisk={highlightedVDisk}
60
+ highlightedVDisk={
61
+ highlightedVDisk === vDisk.StringifiedId ? highlightedVDisk : undefined
62
+ }
41
63
  setHighlightedVDisk={setHighlightedVDisk}
42
64
  progressBarClassName={b('vdisks-progress-bar')}
43
65
  />
44
66
  ))}
45
67
  </div>
46
68
  );
47
- }
69
+ });
@@ -12,6 +12,7 @@ import type {
12
12
  PDiskDisplayStateGetter,
13
13
  } from '../../utils/disks/displayState';
14
14
  import {getDefaultPDiskDisplayState} from '../../utils/disks/displayState';
15
+ import {getDriveTypeDisplayState} from '../../utils/disks/driveType';
15
16
  import {calculateFlagPairIcon, calculateSpaceIcon} from '../../utils/disks/iconCalculators';
16
17
  import {
17
18
  getPDiskDecommitDisplayState,
@@ -25,10 +26,15 @@ import {
25
26
  } from '../../utils/disks/severityCalculators';
26
27
 
27
28
  import {EXPERT_MODE_ALL_PDISK_WIDTH, EXPERT_MODE_PDISK_WIDTH} from './Disks/constants';
29
+ import type {SpaceLegendSelectionScope} from './StorageExpertModePanel/components/getSpaceLegendSelection';
28
30
  import {useSpaceLegendSelection} from './StorageExpertModePanel/components/useSpaceLegendSelection';
29
31
  import {PDisksGroupBy} from './StorageExpertModePanel/constants';
30
32
  import type {PDisksGroupByValue} from './StorageExpertModePanel/constants';
31
- import {useIsStorageExpertMode, usePDisksGroupByParam} from './useStorageQueryParams';
33
+ import {
34
+ useIsStorageExpertMode,
35
+ useNodesPDisksGroupByParam,
36
+ usePDisksGroupByParam,
37
+ } from './useStorageQueryParams';
32
38
 
33
39
  function getMode(groupBy: PDisksGroupByValue): DiskDisplayMode | undefined {
34
40
  switch (groupBy) {
@@ -51,18 +57,6 @@ function getMode(groupBy: PDisksGroupByValue): DiskDisplayMode | undefined {
51
57
  }
52
58
  }
53
59
 
54
- function requiresWhiteboardData(groupBy: PDisksGroupByValue) {
55
- return groupBy === PDisksGroupBy.State || groupBy === PDisksGroupBy.Device;
56
- }
57
-
58
- function hasBSCStatusData(pDisk: Parameters<PDiskDisplayStateGetter>[0]) {
59
- return (
60
- pDisk.DriveStatus !== undefined ||
61
- pDisk.DecommitStatus !== undefined ||
62
- pDisk.MaintenanceStatus !== undefined
63
- );
64
- }
65
-
66
60
  function getAllocatedPercent(pDisk: Parameters<PDiskDisplayStateGetter>[0]) {
67
61
  const whiteboardAllocatedPercent = pDisk.WhiteboardSize?.AllocatedPercent;
68
62
 
@@ -87,43 +81,54 @@ function isAllModeHealthy(pDisk: Parameters<PDiskDisplayStateGetter>[0]) {
87
81
  function getAllModeIndicators(
88
82
  pDisk: Parameters<PDiskDisplayStateGetter>[0],
89
83
  isCapacityAlertInactive: boolean,
84
+ hasWhiteboardData = true,
90
85
  ): PDiskAllModeIndicatorsState {
91
86
  const capacityAlertIcon = isCapacityAlertInactive
92
87
  ? undefined
93
88
  : calculateSpaceIcon({CapacityAlert: pDisk.PDiskCapacityAlert});
94
- const driveDisplayState = getPDiskDriveDisplayState(pDisk.DriveStatus);
95
- const decommitDisplayState = getPDiskDecommitDisplayState(pDisk.DecommitStatus);
96
- const maintenanceDisplayState = getPDiskMaintenanceDisplayState(pDisk.MaintenanceStatus);
89
+ const driveIcon = getBSCStatusDisplayState(pDisk, 'drive', hasWhiteboardData)?.icon;
90
+ const decommitIcon = getBSCStatusDisplayState(pDisk, 'decommit', hasWhiteboardData)?.icon;
91
+ const maintenanceIcon = getBSCStatusDisplayState(pDisk, 'maintenance', hasWhiteboardData)?.icon;
97
92
  const deviceIcon = calculateFlagPairIcon(pDisk.Device, pDisk.Realtime);
98
- const driveIcon = pDisk.DriveStatus === undefined ? CircleQuestionFill : driveDisplayState.icon;
99
- const decommitIcon =
100
- pDisk.DecommitStatus === undefined ? CircleQuestionFill : decommitDisplayState.icon;
101
- const maintenanceIcon =
102
- pDisk.MaintenanceStatus === undefined ? CircleQuestionFill : maintenanceDisplayState.icon;
103
93
 
104
94
  return {
105
- ...(capacityAlertIcon ? {capacityAlert: capacityAlertIcon} : {}),
95
+ ...(capacityAlertIcon && (hasWhiteboardData || isCapacityAlert(pDisk.PDiskCapacityAlert))
96
+ ? {capacityAlert: capacityAlertIcon}
97
+ : {}),
106
98
  ...(driveIcon ? {drive: driveIcon} : {}),
107
99
  ...(decommitIcon ? {decommit: decommitIcon} : {}),
108
100
  ...(maintenanceIcon ? {maintenance: maintenanceIcon} : {}),
109
- ...(deviceIcon ? {device: deviceIcon} : {}),
101
+ ...(deviceIcon && hasWhiteboardData ? {device: deviceIcon} : {}),
110
102
  };
111
103
  }
112
104
 
113
- function getMissingAllModeDisplayState(
105
+ function getMissingPDiskDisplayState(
114
106
  pDisk: Parameters<PDiskDisplayStateGetter>[0],
107
+ mode: DiskDisplayMode | undefined,
108
+ inactiveAlerts: Set<ECapacityAlert>,
115
109
  ): PDiskDisplayState {
110
+ const isCapacityAlertInactive =
111
+ isCapacityAlert(pDisk.PDiskCapacityAlert) && inactiveAlerts.has(pDisk.PDiskCapacityAlert);
112
+ let icon: PDiskDisplayState['icon'] = getBSCStatusDisplayState(pDisk, mode, false)?.icon;
113
+ if (mode === 'space' && isCapacityAlert(pDisk.PDiskCapacityAlert) && !isCapacityAlertInactive) {
114
+ icon = calculateSpaceIcon({CapacityAlert: pDisk.PDiskCapacityAlert});
115
+ }
116
+
116
117
  return {
117
118
  severity: NOT_AVAILABLE_SEVERITY,
118
- icon: undefined,
119
- mode: 'all',
119
+ icon,
120
+ mode,
121
+ isNoData: true,
120
122
  isLegendInactive: false,
121
123
  showNoDataPlaceholder: true,
122
- allocatedPercent: getAllocatedPercent(pDisk),
123
- showAllocatedPercentLabel: false,
124
+ allocatedPercent:
125
+ mode === 'all' || mode === 'space' ? getAllocatedPercent(pDisk) : undefined,
126
+ showAllocatedPercentLabel: mode !== 'all',
124
127
  iconPlacement: 'inline',
125
- width: EXPERT_MODE_ALL_PDISK_WIDTH,
126
- allMode: {indicators: {}},
128
+ width: mode === 'all' ? EXPERT_MODE_ALL_PDISK_WIDTH : EXPERT_MODE_PDISK_WIDTH,
129
+ ...(mode === 'all'
130
+ ? {allMode: {indicators: getAllModeIndicators(pDisk, isCapacityAlertInactive, false)}}
131
+ : {}),
127
132
  };
128
133
  }
129
134
 
@@ -157,96 +162,43 @@ function getAllModeDisplayState(
157
162
  };
158
163
  }
159
164
 
160
- function getMissingStatusDisplayState(mode: DiskDisplayMode | undefined): PDiskDisplayState {
161
- return {
162
- severity: NOT_AVAILABLE_SEVERITY,
163
- icon: undefined,
164
- mode,
165
- isLegendInactive: false,
166
- showNoDataPlaceholder: true,
167
- allocatedPercent: undefined,
168
- width: mode ? EXPERT_MODE_PDISK_WIDTH : undefined,
169
- };
170
- }
171
-
172
- interface GetStatusModeDisplayStateParams {
173
- hasWhiteboardData: boolean;
174
- mode: DiskDisplayMode | undefined;
175
- pDisk: Parameters<PDiskDisplayStateGetter>[0];
176
- pdisksGroupBy: PDisksGroupByValue;
177
- }
178
-
179
- function getStatusModeDisplayState({
180
- hasWhiteboardData,
181
- mode,
182
- pDisk,
183
- pdisksGroupBy,
184
- }: GetStatusModeDisplayStateParams): PDiskDisplayState | undefined {
185
- if (pdisksGroupBy === PDisksGroupBy.Drive) {
186
- if (!hasWhiteboardData && pDisk.DriveStatus === undefined) {
187
- return getMissingStatusDisplayState(mode);
188
- }
189
-
190
- const driveDisplayState = getPDiskDriveDisplayState(pDisk.DriveStatus);
191
-
192
- return {
193
- ...driveDisplayState,
194
- icon: pDisk.DriveStatus === undefined ? CircleQuestionFill : driveDisplayState.icon,
195
- mode,
196
- isLegendInactive: false,
197
- showNoDataPlaceholder: false,
198
- allocatedPercent: undefined,
199
- width: EXPERT_MODE_PDISK_WIDTH,
200
- };
201
- }
202
-
203
- if (pdisksGroupBy === PDisksGroupBy.Decommit) {
204
- if (!hasWhiteboardData && pDisk.DecommitStatus === undefined) {
205
- return getMissingStatusDisplayState(mode);
206
- }
207
-
208
- const decommitDisplayState = getPDiskDecommitDisplayState(pDisk.DecommitStatus);
209
-
210
- return {
211
- ...decommitDisplayState,
212
- icon:
213
- pDisk.DecommitStatus === undefined ? CircleQuestionFill : decommitDisplayState.icon,
214
- mode,
215
- isLegendInactive: false,
216
- showNoDataPlaceholder: false,
217
- allocatedPercent: undefined,
218
- width: EXPERT_MODE_PDISK_WIDTH,
219
- };
220
- }
221
-
222
- if (pdisksGroupBy === PDisksGroupBy.Maintenance) {
223
- if (!hasWhiteboardData && pDisk.MaintenanceStatus === undefined) {
224
- return getMissingStatusDisplayState(mode);
225
- }
226
-
227
- const maintenanceDisplayState = getPDiskMaintenanceDisplayState(pDisk.MaintenanceStatus);
228
-
229
- return {
230
- ...maintenanceDisplayState,
231
- icon:
232
- pDisk.MaintenanceStatus === undefined
233
- ? CircleQuestionFill
234
- : maintenanceDisplayState.icon,
235
- mode,
236
- isLegendInactive: false,
237
- showNoDataPlaceholder: false,
238
- allocatedPercent: undefined,
239
- width: EXPERT_MODE_PDISK_WIDTH,
240
- };
165
+ function getBSCStatusDisplayState(
166
+ pDisk: Parameters<PDiskDisplayStateGetter>[0],
167
+ mode: DiskDisplayMode | undefined,
168
+ hasWhiteboardData: boolean,
169
+ ) {
170
+ let status: string | undefined;
171
+ let displayState: ReturnType<typeof getPDiskDriveDisplayState>;
172
+
173
+ switch (mode) {
174
+ case 'drive':
175
+ status = pDisk.DriveStatus;
176
+ displayState = getPDiskDriveDisplayState(pDisk.DriveStatus);
177
+ break;
178
+ case 'decommit':
179
+ status = pDisk.DecommitStatus;
180
+ displayState = getPDiskDecommitDisplayState(pDisk.DecommitStatus);
181
+ break;
182
+ case 'maintenance':
183
+ status = pDisk.MaintenanceStatus;
184
+ displayState = getPDiskMaintenanceDisplayState(pDisk.MaintenanceStatus);
185
+ break;
186
+ default:
187
+ return undefined;
241
188
  }
242
189
 
243
- return undefined;
190
+ return {
191
+ ...displayState,
192
+ icon: status === undefined && hasWhiteboardData ? CircleQuestionFill : displayState.icon,
193
+ };
244
194
  }
245
195
 
246
- export function useStoragePDiskDisplayStateGetter(): PDiskDisplayStateGetter {
196
+ function usePDiskDisplayStateGetter(
197
+ pdisksGroupBy: PDisksGroupByValue,
198
+ selectionScope: SpaceLegendSelectionScope,
199
+ ): PDiskDisplayStateGetter {
247
200
  const isExpertMode = useIsStorageExpertMode();
248
- const pdisksGroupBy = usePDisksGroupByParam();
249
- const inactiveAlerts = useSpaceLegendSelection('pdisks');
201
+ const inactiveAlerts = useSpaceLegendSelection(selectionScope);
250
202
 
251
203
  return React.useCallback(
252
204
  (pDisk) => {
@@ -254,32 +206,33 @@ export function useStoragePDiskDisplayStateGetter(): PDiskDisplayStateGetter {
254
206
  return getDefaultPDiskDisplayState(pDisk);
255
207
  }
256
208
 
257
- const mode = getMode(pdisksGroupBy);
258
- const hasWhiteboardData = pDisk.WhiteboardSize !== undefined;
259
-
260
- if (
261
- pdisksGroupBy === PDisksGroupBy.All &&
262
- !hasWhiteboardData &&
263
- !hasBSCStatusData(pDisk)
264
- ) {
265
- return getMissingAllModeDisplayState(pDisk);
209
+ if (pdisksGroupBy === PDisksGroupBy.DriveType) {
210
+ return {
211
+ ...getDriveTypeDisplayState(pDisk),
212
+ width: EXPERT_MODE_PDISK_WIDTH,
213
+ };
266
214
  }
267
215
 
268
- if (!hasWhiteboardData && requiresWhiteboardData(pdisksGroupBy)) {
269
- return getMissingStatusDisplayState(mode);
216
+ const mode = getMode(pdisksGroupBy);
217
+ const hasWhiteboardData = pDisk.HasWhiteboardData ?? pDisk.WhiteboardSize !== undefined;
218
+
219
+ if (!hasWhiteboardData) {
220
+ return getMissingPDiskDisplayState(pDisk, mode, inactiveAlerts);
270
221
  }
271
222
 
272
223
  const allocatedPercent = getAllocatedPercent(pDisk);
273
224
 
274
225
  if (pdisksGroupBy === PDisksGroupBy.Space) {
275
226
  const capacityAlert = pDisk.PDiskCapacityAlert;
227
+ const isCapacityAlertInactive =
228
+ isCapacityAlert(capacityAlert) && inactiveAlerts.has(capacityAlert);
276
229
 
277
230
  return {
278
231
  severity: calculateSpaceSeverity({CapacityAlert: capacityAlert}),
279
232
  icon: calculateSpaceIcon({CapacityAlert: capacityAlert}),
280
233
  mode,
281
- isLegendInactive:
282
- isCapacityAlert(capacityAlert) && inactiveAlerts.has(capacityAlert),
234
+ isLegendInactive: isCapacityAlertInactive,
235
+ borderless: isCapacityAlertInactive,
283
236
  showNoDataPlaceholder: false,
284
237
  allocatedPercent,
285
238
  width: EXPERT_MODE_PDISK_WIDTH,
@@ -290,15 +243,17 @@ export function useStoragePDiskDisplayStateGetter(): PDiskDisplayStateGetter {
290
243
  return getAllModeDisplayState(pDisk, inactiveAlerts);
291
244
  }
292
245
 
293
- const statusDisplayState = getStatusModeDisplayState({
294
- hasWhiteboardData,
295
- mode,
296
- pDisk,
297
- pdisksGroupBy,
298
- });
246
+ const statusDisplayState = getBSCStatusDisplayState(pDisk, mode, hasWhiteboardData);
299
247
 
300
248
  if (statusDisplayState) {
301
- return statusDisplayState;
249
+ return {
250
+ ...statusDisplayState,
251
+ mode,
252
+ isLegendInactive: false,
253
+ showNoDataPlaceholder: false,
254
+ allocatedPercent: undefined,
255
+ width: EXPERT_MODE_PDISK_WIDTH,
256
+ };
302
257
  }
303
258
 
304
259
  if (pdisksGroupBy === PDisksGroupBy.Device) {
@@ -335,3 +290,15 @@ export function useStoragePDiskDisplayStateGetter(): PDiskDisplayStateGetter {
335
290
  [inactiveAlerts, isExpertMode, pdisksGroupBy],
336
291
  );
337
292
  }
293
+
294
+ export function useStoragePDiskDisplayStateGetter(): PDiskDisplayStateGetter {
295
+ const pdisksGroupBy = usePDisksGroupByParam();
296
+
297
+ return usePDiskDisplayStateGetter(pdisksGroupBy, 'pdisks');
298
+ }
299
+
300
+ export function useStorageNodesPDiskDisplayStateGetter(): PDiskDisplayStateGetter {
301
+ const pdisksGroupBy = useNodesPDisksGroupByParam();
302
+
303
+ return usePDiskDisplayStateGetter(pdisksGroupBy, 'nodes-pdisks');
304
+ }
@@ -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',