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
@@ -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 {
@@ -14,6 +16,7 @@ import type {
14
16
  VDiskDisplayStateGetter,
15
17
  } from '../../utils/disks/displayState';
16
18
  import {getDefaultDiskDisplayState} from '../../utils/disks/displayState';
19
+ import {getDriveTypeDisplayState} from '../../utils/disks/driveType';
17
20
  import {getIconCalculator} from '../../utils/disks/getIconStrategy';
18
21
  import {getSeverityCalculator} from '../../utils/disks/getSeverityStrategy';
19
22
  import type {VDisksGroupByValue} from '../../utils/disks/groupBy';
@@ -22,11 +25,17 @@ import {
22
25
  calculateCompactionIcon,
23
26
  calculateFrontQueuesIcon,
24
27
  calculateSpaceIcon,
28
+ calculateStateIcon,
25
29
  } from '../../utils/disks/iconCalculators';
26
30
  import type {PreparedVDisk} from '../../utils/disks/types';
27
31
 
32
+ import type {SpaceLegendSelectionScope} from './StorageExpertModePanel/components/getSpaceLegendSelection';
28
33
  import {useSpaceLegendSelection} from './StorageExpertModePanel/components/useSpaceLegendSelection';
29
- import {useIsStorageExpertMode, useVDisksGroupByParam} from './useStorageQueryParams';
34
+ import {
35
+ useIsStorageExpertMode,
36
+ useNodesVDisksGroupByParam,
37
+ useVDisksGroupByParam,
38
+ } from './useStorageQueryParams';
30
39
 
31
40
  function getMode(groupBy: VDisksGroupByValue): DiskDisplayMode {
32
41
  switch (groupBy) {
@@ -71,7 +80,7 @@ function getAllModeIndicators(
71
80
  return {
72
81
  ...(capacityAlert ? {capacityAlert} : {}),
73
82
  ...(frontQueues ? {frontQueues} : {}),
74
- ...(compaction ? {compaction} : {}),
83
+ ...(compaction?.length ? {compaction} : {}),
75
84
  };
76
85
  }
77
86
 
@@ -103,14 +112,22 @@ function getMissingVDiskDisplayState(
103
112
  vDisk: PreparedVDisk,
104
113
  isDonor: boolean | undefined,
105
114
  mode: DiskDisplayMode,
115
+ showNoDataPlaceholder: boolean,
106
116
  ): VDiskDisplayState {
107
117
  const isAllMode = mode === 'all';
118
+ let icon: VDiskDisplayState['icon'];
119
+ if (isDonor) {
120
+ icon = calculateStateIcon(vDisk, isDonor);
121
+ } else if (mode === 'state' || isAllMode) {
122
+ icon = getKnownVDiskStateIcon(vDisk);
123
+ }
108
124
  const displayState: VDiskDisplayState = {
109
125
  severity: NOT_AVAILABLE_SEVERITY,
110
- icon: undefined,
126
+ icon,
111
127
  mode,
128
+ isNoData: true,
112
129
  isLegendInactive: false,
113
- showNoDataPlaceholder: true,
130
+ showNoDataPlaceholder,
114
131
  allocatedPercent: isAllMode ? vDisk.AllocatedPercent : undefined,
115
132
  showAllocatedPercentLabel: !isAllMode,
116
133
  striped: Boolean(isDonor),
@@ -124,9 +141,25 @@ function getMissingVDiskDisplayState(
124
141
  return displayState;
125
142
  }
126
143
 
144
+ function getKnownVDiskStateIcon(vDisk: PreparedVDisk) {
145
+ if (vDisk.VDiskState !== undefined) {
146
+ return calculateStateIcon(vDisk);
147
+ }
148
+
149
+ switch (vDisk.Status) {
150
+ case 'ERROR':
151
+ return CircleXmarkFill;
152
+ case 'INIT_PENDING':
153
+ return ClockFill;
154
+ default:
155
+ return undefined;
156
+ }
157
+ }
158
+
127
159
  interface GetExpertVDiskDisplayStateParams {
128
160
  inactiveLegendItems: Set<ECapacityAlert>;
129
161
  isDonor?: boolean;
162
+ selectionScope: SpaceLegendSelectionScope;
130
163
  vDisk: PreparedVDisk;
131
164
  vdisksGroupBy: VDisksGroupByValue;
132
165
  }
@@ -134,12 +167,22 @@ interface GetExpertVDiskDisplayStateParams {
134
167
  function getExpertVDiskDisplayState({
135
168
  inactiveLegendItems,
136
169
  isDonor,
170
+ selectionScope,
137
171
  vDisk,
138
172
  vdisksGroupBy,
139
173
  }: GetExpertVDiskDisplayStateParams): VDiskDisplayState {
174
+ const hasWhiteboardData = vDisk.HasWhiteboardData ?? Boolean(vDisk.VDiskId);
175
+ if (vdisksGroupBy === VDisksGroupBy.DriveType) {
176
+ return {
177
+ ...getDriveTypeDisplayState(hasWhiteboardData ? vDisk.PDisk : undefined),
178
+ striped: false,
179
+ iconPlacement: 'inline',
180
+ };
181
+ }
182
+
140
183
  const mode = getMode(vdisksGroupBy);
141
- if (!vDisk.VDiskId) {
142
- return getMissingVDiskDisplayState(vDisk, isDonor, mode);
184
+ if (!hasWhiteboardData) {
185
+ return getMissingVDiskDisplayState(vDisk, isDonor, mode, selectionScope !== 'nodes-vdisks');
143
186
  }
144
187
 
145
188
  const severity = getSeverityCalculator(vdisksGroupBy)(vDisk);
@@ -147,11 +190,18 @@ function getExpertVDiskDisplayState({
147
190
  const isCapacityAlertInactive =
148
191
  isCapacityAlert(vDisk.CapacityAlert) && inactiveLegendItems.has(vDisk.CapacityAlert);
149
192
  const allMode = getAllModeDisplayState(mode, vDisk, isDonor, isCapacityAlertInactive);
193
+ const spaceBorderless = mode === 'space' && isCapacityAlertInactive;
194
+ const stateBorderless =
195
+ mode === 'state' &&
196
+ !isDonor &&
197
+ (severity === DISK_COLOR_STATE_TO_NUMERIC_SEVERITY.Green ||
198
+ severity === DISK_COLOR_STATE_TO_NUMERIC_SEVERITY.Yellow);
150
199
  const displayState: VDiskDisplayState = {
151
200
  severity,
152
201
  icon,
153
202
  mode,
154
203
  isLegendInactive: mode === 'space' && isCapacityAlertInactive,
204
+ borderless: spaceBorderless || stateBorderless,
155
205
  showNoDataPlaceholder: false,
156
206
  allocatedPercent: mode === 'all' ? vDisk.AllocatedPercent : undefined,
157
207
  showAllocatedPercentLabel: mode !== 'all',
@@ -166,10 +216,12 @@ function getExpertVDiskDisplayState({
166
216
  return displayState;
167
217
  }
168
218
 
169
- export function useStorageVDiskDisplayStateGetter(): VDiskDisplayStateGetter {
219
+ function useVDiskDisplayStateGetter(
220
+ vdisksGroupBy: VDisksGroupByValue,
221
+ selectionScope: SpaceLegendSelectionScope,
222
+ ): VDiskDisplayStateGetter {
170
223
  const isExpertMode = useIsStorageExpertMode();
171
- const vdisksGroupBy = useVDisksGroupByParam();
172
- const inactiveLegendItems = useSpaceLegendSelection();
224
+ const inactiveLegendItems = useSpaceLegendSelection(selectionScope);
173
225
 
174
226
  return React.useCallback(
175
227
  (vDisk, isDonor) => {
@@ -180,10 +232,23 @@ export function useStorageVDiskDisplayStateGetter(): VDiskDisplayStateGetter {
180
232
  return getExpertVDiskDisplayState({
181
233
  inactiveLegendItems,
182
234
  isDonor,
235
+ selectionScope,
183
236
  vDisk,
184
237
  vdisksGroupBy,
185
238
  });
186
239
  },
187
- [inactiveLegendItems, isExpertMode, vdisksGroupBy],
240
+ [inactiveLegendItems, isExpertMode, selectionScope, vdisksGroupBy],
188
241
  );
189
242
  }
243
+
244
+ export function useStorageVDiskDisplayStateGetter(): VDiskDisplayStateGetter {
245
+ const vdisksGroupBy = useVDisksGroupByParam();
246
+
247
+ return useVDiskDisplayStateGetter(vdisksGroupBy, 'vdisks');
248
+ }
249
+
250
+ export function useStorageNodesVDiskDisplayStateGetter(): VDiskDisplayStateGetter {
251
+ const vdisksGroupBy = useNodesVDisksGroupByParam();
252
+
253
+ return useVDiskDisplayStateGetter(vdisksGroupBy, 'nodes-vdisks');
254
+ }
@@ -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
+ }
@@ -14,6 +14,7 @@ import {InternalLink} from '../../components/InternalLink';
14
14
  import {LoaderWrapper} from '../../components/LoaderWrapper/LoaderWrapper';
15
15
  import {PageMetaWithAutorefresh} from '../../components/PageMeta/PageMeta';
16
16
  import {tabletPageQueryParams, useTabletPagePath} from '../../routes';
17
+ import {useTabletDevUiSecurePath} from '../../store/reducers/capabilities/hooks';
17
18
  import {setHeaderBreadcrumbs} from '../../store/reducers/header/header';
18
19
  import {tabletApi} from '../../store/reducers/tablet';
19
20
  import {EFlag} from '../../types/api/enums';
@@ -202,7 +203,7 @@ function TabletTabs({
202
203
  }, [activeTab, tabletTab, setParams]);
203
204
 
204
205
  return (
205
- <Flex gap={5} direction="column">
206
+ <Flex gap={5} direction="column" qa="tablet-tabs">
206
207
  {/* block wrapper fror tabs to preserve height */}
207
208
  <div>
208
209
  <TabProvider value={tabletTab}>
@@ -232,8 +233,9 @@ function TabletTabs({
232
233
 
233
234
  function Channels({id, hiveId}: {id: string; hiveId: string}) {
234
235
  const [autoRefreshInterval] = useAutoRefreshInterval();
236
+ const useSecurePath = useTabletDevUiSecurePath();
235
237
  const {currentData, error, isFetching} = tabletApi.useGetAdvancedTableInfoQuery(
236
- {id, hiveId},
238
+ {id, hiveId, useSecurePath},
237
239
  {
238
240
  pollingInterval: autoRefreshInterval,
239
241
  },
@@ -4,6 +4,7 @@ import {ArrowRotateLeft, StopFill, TriangleRightFill} from '@gravity-ui/icons';
4
4
  import {Flex, Icon} from '@gravity-ui/uikit';
5
5
 
6
6
  import {ButtonWithConfirmDialog} from '../../../../components/ButtonWithConfirmDialog/ButtonWithConfirmDialog';
7
+ import {useTabletDevUiSecurePath} from '../../../../store/reducers/capabilities/hooks';
7
8
  import {tabletApi} from '../../../../store/reducers/tablet';
8
9
  import {ETabletState} from '../../../../types/api/tablet';
9
10
  import type {TTabletStateInfo} from '../../../../types/api/tablet';
@@ -19,6 +20,7 @@ export const TabletControls = ({tablet}: TabletControlsProps) => {
19
20
  const {TabletId, HiveId} = tablet;
20
21
 
21
22
  const isUserAllowedToMakeChanges = useIsUserAllowedToMakeChanges();
23
+ const useSecurePath = useTabletDevUiSecurePath();
22
24
 
23
25
  const [killTablet] = tabletApi.useKillTabletMutation();
24
26
  const [stopTablet] = tabletApi.useStopTabletMutation();
@@ -39,7 +41,7 @@ export const TabletControls = ({tablet}: TabletControlsProps) => {
39
41
  tablet.State === ETabletState.Stopped || tablet.State === ETabletState.Deleted;
40
42
 
41
43
  return (
42
- <Flex gap={2} wrap="nowrap">
44
+ <Flex gap={2} wrap="nowrap" qa="tablet-controls">
43
45
  <ButtonWithConfirmDialog
44
46
  dialogHeader={i18n('dialog.kill-header')}
45
47
  dialogText={i18n('dialog.kill-text')}
@@ -63,7 +65,9 @@ export const TabletControls = ({tablet}: TabletControlsProps) => {
63
65
  dialogText={i18n('dialog.stop-text')}
64
66
  applyButtonText={i18n('dialog.stop-header')}
65
67
  applyButtonView="outlined-danger"
66
- onConfirmAction={() => stopTablet({id: TabletId, hiveId: HiveId}).unwrap()}
68
+ onConfirmAction={() =>
69
+ stopTablet({id: TabletId, hiveId: HiveId, useSecurePath}).unwrap()
70
+ }
67
71
  buttonDisabled={isDisabledStop || !isUserAllowedToMakeChanges}
68
72
  withPopover
69
73
  buttonView="normal"
@@ -80,7 +84,7 @@ export const TabletControls = ({tablet}: TabletControlsProps) => {
80
84
  applyButtonText={i18n('dialog.resume-header')}
81
85
  applyButtonView="action"
82
86
  onConfirmAction={() =>
83
- resumeTablet({id: TabletId, hiveId: HiveId}).unwrap()
87
+ resumeTablet({id: TabletId, hiveId: HiveId, useSecurePath}).unwrap()
84
88
  }
85
89
  buttonDisabled={isDisabledResume || !isUserAllowedToMakeChanges}
86
90
  withPopover
@@ -8,13 +8,15 @@ import {TabletUptime} from '../../../../components/UptimeViewer/UptimeViewer';
8
8
  import type {YDBDefinitionListItem} from '../../../../components/YDBDefinitionList/YDBDefinitionList';
9
9
  import {YDBDefinitionList} from '../../../../components/YDBDefinitionList/YDBDefinitionList';
10
10
  import {getDefaultNodePath, useTabletPagePath} from '../../../../routes';
11
- import {ETabletState} from '../../../../types/api/tablet';
11
+ import {useTabletDevUiSecurePath} from '../../../../store/reducers/capabilities/hooks';
12
+ import {ETabletState, EType} from '../../../../types/api/tablet';
12
13
  import type {TTabletStateInfo} from '../../../../types/api/tablet';
13
14
  import {cn} from '../../../../utils/cn';
14
15
  import {
15
16
  createTabletDeveloperUIHref,
16
17
  useHasDeveloperUi,
17
18
  } from '../../../../utils/developerUI/developerUI';
19
+ import {getTabletDevUiAppPage} from '../../../../utils/developerUI/tabletDevUi';
18
20
  import {useDatabaseFromQuery} from '../../../../utils/hooks/useDatabaseFromQuery';
19
21
  import {transformPath} from '../../../Tenant/ObjectSummary/transformPath';
20
22
  import {getTabletObjectKind, hasHive} from '../../utils';
@@ -34,6 +36,7 @@ interface TabletInfoProps {
34
36
  export const TabletInfo = ({tablet, objectPath, objectDatabase}: TabletInfoProps) => {
35
37
  const getTabletPagePath = useTabletPagePath();
36
38
  const hasDeveloperUi = useHasDeveloperUi();
39
+ const useSecurePath = useTabletDevUiSecurePath();
37
40
  const database = useDatabaseFromQuery();
38
41
 
39
42
  const {
@@ -51,6 +54,10 @@ export const TabletInfo = ({tablet, objectPath, objectDatabase}: TabletInfoProps
51
54
  const hasHiveId = hasHive(HiveId);
52
55
  const hasUptime = State === ETabletState.Active;
53
56
  const objectKind = getTabletObjectKind(Type);
57
+ // These tablet types move the whole App page to the secure subtree.
58
+ const secureApp =
59
+ useSecurePath &&
60
+ (Type === EType.DataShard || Type === EType.Hive || Type === EType.BSController);
54
61
 
55
62
  const tabletInfo: YDBDefinitionListItem[] = [];
56
63
 
@@ -136,7 +143,10 @@ export const TabletInfo = ({tablet, objectPath, objectDatabase}: TabletInfoProps
136
143
  <Flex direction="column" gap={3}>
137
144
  <LinkWithIcon
138
145
  title={tabletInfoKeyset('field_developer-ui-app')}
139
- url={createTabletDeveloperUIHref(TabletId, 'app')}
146
+ url={createTabletDeveloperUIHref(
147
+ TabletId,
148
+ getTabletDevUiAppPage(secureApp),
149
+ )}
140
150
  />
141
151
  <LinkWithIcon
142
152
  title={tabletInfoKeyset('field_developer-ui-counters')}
@@ -156,7 +166,7 @@ export const TabletInfo = ({tablet, objectPath, objectDatabase}: TabletInfoProps
156
166
  };
157
167
 
158
168
  return (
159
- <Flex gap={10} wrap="nowrap">
169
+ <Flex gap={10} wrap="nowrap" qa="tablet-info">
160
170
  <YDBDefinitionList
161
171
  title={tabletInfoKeyset('title_info')}
162
172
  items={tabletInfo}