ydb-embedded-ui 22.3.0 → 22.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. package/dist/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.d.ts +3 -2
  2. package/dist/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.js +19 -4
  3. package/dist/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.js.map +1 -1
  4. package/dist/components/CopyableValue/CopyableValue.d.ts +10 -0
  5. package/dist/components/CopyableValue/CopyableValue.js +10 -0
  6. package/dist/components/CopyableValue/CopyableValue.js.map +1 -0
  7. package/dist/components/CopyableValue/CopyableValue.scss +16 -0
  8. package/dist/components/CopyableValue/i18n/en.json +3 -0
  9. package/dist/components/CopyableValue/i18n/index.d.ts +2 -0
  10. package/dist/components/CopyableValue/i18n/index.js +6 -0
  11. package/dist/components/CopyableValue/i18n/index.js.map +1 -0
  12. package/dist/components/CriticalActionDialog/CriticalActionDialog.d.ts +2 -1
  13. package/dist/components/CriticalActionDialog/CriticalActionDialog.js +2 -1
  14. package/dist/components/CriticalActionDialog/CriticalActionDialog.js.map +1 -1
  15. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.d.ts +8 -19
  16. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.js +68 -92
  17. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.js.map +1 -1
  18. package/dist/components/DiskCapacityInfo/i18n/en.json +0 -1
  19. package/dist/components/DiskCapacityInfo/i18n/index.d.ts +1 -1
  20. package/dist/components/DiskPopup/DiskPopup.d.ts +25 -0
  21. package/dist/components/DiskPopup/DiskPopup.js +44 -0
  22. package/dist/components/DiskPopup/DiskPopup.js.map +1 -0
  23. package/dist/components/DiskPopup/DiskPopup.scss +203 -0
  24. package/dist/components/DiskPopup/i18n/en.json +3 -0
  25. package/dist/components/DiskPopup/i18n/index.d.ts +2 -0
  26. package/dist/components/DiskPopup/i18n/index.js +4 -0
  27. package/dist/components/DiskPopup/i18n/index.js.map +1 -0
  28. package/dist/components/DiskStatus/DiskStatus.d.ts +31 -0
  29. package/dist/components/DiskStatus/DiskStatus.js +61 -0
  30. package/dist/components/DiskStatus/DiskStatus.js.map +1 -0
  31. package/dist/components/DiskStatus/DiskStatus.scss +59 -0
  32. package/dist/components/DiskStatus/i18n/en.json +6 -0
  33. package/dist/components/DiskStatus/i18n/index.d.ts +2 -0
  34. package/dist/components/DiskStatus/i18n/index.js +4 -0
  35. package/dist/components/DiskStatus/i18n/index.js.map +1 -0
  36. package/dist/components/EntityStatus/EntityStatus.d.ts +19 -6
  37. package/dist/components/EntityStatus/EntityStatus.js +6 -2
  38. package/dist/components/EntityStatus/EntityStatus.js.map +1 -1
  39. package/dist/components/EntityStatus/EntityStatus.scss +5 -0
  40. package/dist/components/EvictVDiskButton/EvictVDiskButton.d.ts +5 -2
  41. package/dist/components/EvictVDiskButton/EvictVDiskButton.js +3 -2
  42. package/dist/components/EvictVDiskButton/EvictVDiskButton.js.map +1 -1
  43. package/dist/components/EvictVDiskButton/i18n/en.json +2 -2
  44. package/dist/components/FullNodeViewer/FullNodeViewer.js +4 -7
  45. package/dist/components/FullNodeViewer/FullNodeViewer.js.map +1 -1
  46. package/dist/components/FullNodeViewer/i18n/index.d.ts +1 -1
  47. package/dist/components/HoverPopup/HoverPopup.d.ts +3 -1
  48. package/dist/components/HoverPopup/HoverPopup.js +131 -28
  49. package/dist/components/HoverPopup/HoverPopup.js.map +1 -1
  50. package/dist/components/HoverPopup/usePopupPriority.d.ts +4 -0
  51. package/dist/components/HoverPopup/usePopupPriority.js +30 -0
  52. package/dist/components/HoverPopup/usePopupPriority.js.map +1 -0
  53. package/dist/components/MemoryViewer/MemoryViewer.d.ts +3 -1
  54. package/dist/components/MemoryViewer/MemoryViewer.js +25 -16
  55. package/dist/components/MemoryViewer/MemoryViewer.js.map +1 -1
  56. package/dist/components/MemoryViewer/i18n/en.json +4 -3
  57. package/dist/components/MemoryViewer/i18n/index.d.ts +1 -1
  58. package/dist/components/MemoryViewer/utils.d.ts +4 -2
  59. package/dist/components/MemoryViewer/utils.js +11 -11
  60. package/dist/components/MemoryViewer/utils.js.map +1 -1
  61. package/dist/components/PDiskInfo/PDiskInfo.d.ts +4 -9
  62. package/dist/components/PDiskInfo/PDiskInfo.js +32 -144
  63. package/dist/components/PDiskInfo/PDiskInfo.js.map +1 -1
  64. package/dist/components/PDiskInfo/PDiskInfo.scss +15 -0
  65. package/dist/components/PDiskInfo/PDiskLogSize.d.ts +5 -0
  66. package/dist/components/PDiskInfo/PDiskLogSize.js +20 -0
  67. package/dist/components/PDiskInfo/PDiskLogSize.js.map +1 -0
  68. package/dist/components/PDiskInfo/PDiskLogSize.scss +12 -0
  69. package/dist/components/PDiskInfo/getPDiskDetails.d.ts +4 -0
  70. package/dist/components/PDiskInfo/getPDiskDetails.js +33 -0
  71. package/dist/components/PDiskInfo/getPDiskDetails.js.map +1 -0
  72. package/dist/components/PDiskInfo/i18n/en.json +69 -4
  73. package/dist/components/PDiskInfo/i18n/index.d.ts +1 -1
  74. package/dist/components/PDiskInfo/statuses.d.ts +7 -0
  75. package/dist/components/PDiskInfo/statuses.js +194 -0
  76. package/dist/components/PDiskInfo/statuses.js.map +1 -0
  77. package/dist/components/PDiskPopup/PDiskPopup.d.ts +4 -7
  78. package/dist/components/PDiskPopup/PDiskPopup.js +28 -99
  79. package/dist/components/PDiskPopup/PDiskPopup.js.map +1 -1
  80. package/dist/components/PDiskPopup/i18n/en.json +2 -12
  81. package/dist/components/PDiskPopup/i18n/index.d.ts +1 -1
  82. package/dist/components/Search/Search.js +3 -1
  83. package/dist/components/Search/Search.js.map +1 -1
  84. package/dist/components/StorageGroupInfo/StorageGroupInfo.d.ts +3 -3
  85. package/dist/components/StorageGroupInfo/StorageGroupInfo.js +73 -218
  86. package/dist/components/StorageGroupInfo/StorageGroupInfo.js.map +1 -1
  87. package/dist/components/StorageGroupInfo/StorageGroupInfo.scss +21 -0
  88. package/dist/components/StorageGroupInfo/i18n/en.json +1 -9
  89. package/dist/components/StorageGroupInfo/i18n/index.d.ts +1 -1
  90. package/dist/components/TenantNameWrapper/i18n/index.d.ts +1 -1
  91. package/dist/components/VDisk/VDisk.d.ts +2 -1
  92. package/dist/components/VDisk/VDisk.js +24 -33
  93. package/dist/components/VDisk/VDisk.js.map +1 -1
  94. package/dist/components/VDisk/VDiskWithDonorsStack.d.ts +1 -1
  95. package/dist/components/VDisk/VDiskWithDonorsStack.js +2 -1
  96. package/dist/components/VDisk/VDiskWithDonorsStack.js.map +1 -1
  97. package/dist/components/VDisk/getFlagStatusText.d.ts +2 -0
  98. package/dist/components/VDisk/getFlagStatusText.js +18 -0
  99. package/dist/components/VDisk/getFlagStatusText.js.map +1 -0
  100. package/dist/components/VDisk/i18n/en.json +1 -1
  101. package/dist/components/VDisk/i18n/index.d.ts +1 -1
  102. package/dist/components/VDiskInfo/VDiskInfo.d.ts +3 -7
  103. package/dist/components/VDiskInfo/VDiskInfo.js +57 -235
  104. package/dist/components/VDiskInfo/VDiskInfo.js.map +1 -1
  105. package/dist/components/VDiskInfo/VDiskInfo.scss +19 -3
  106. package/dist/components/VDiskInfo/getVDiskDetails.d.ts +11 -0
  107. package/dist/components/VDiskInfo/getVDiskDetails.js +42 -0
  108. package/dist/components/VDiskInfo/getVDiskDetails.js.map +1 -0
  109. package/dist/components/VDiskInfo/i18n/en.json +5 -12
  110. package/dist/components/VDiskInfo/i18n/index.d.ts +1 -1
  111. package/dist/components/VDiskPopup/VDiskPopup.d.ts +7 -8
  112. package/dist/components/VDiskPopup/VDiskPopup.js +91 -241
  113. package/dist/components/VDiskPopup/VDiskPopup.js.map +1 -1
  114. package/dist/components/VDiskPopup/VDiskPopup.scss +3 -10
  115. package/dist/components/VDiskPopup/i18n/en.json +4 -22
  116. package/dist/components/VDiskPopup/i18n/index.d.ts +1 -1
  117. package/dist/components/VDiskStatus/VDiskReplicationStatus.d.ts +8 -0
  118. package/dist/components/VDiskStatus/VDiskReplicationStatus.js +32 -0
  119. package/dist/components/VDiskStatus/VDiskReplicationStatus.js.map +1 -0
  120. package/dist/components/VDiskStatus/VDiskStatus.d.ts +16 -0
  121. package/dist/components/VDiskStatus/VDiskStatus.js +20 -0
  122. package/dist/components/VDiskStatus/VDiskStatus.js.map +1 -0
  123. package/dist/components/VDiskStatus/VDiskStatus.scss +36 -0
  124. package/dist/components/VDiskStatus/i18n/en.json +33 -0
  125. package/dist/components/VDiskStatus/i18n/index.d.ts +1 -0
  126. package/dist/components/VDiskStatus/i18n/index.js +5 -0
  127. package/dist/components/VDiskStatus/i18n/index.js.map +1 -0
  128. package/dist/components/VDiskStatus/index.d.ts +2 -0
  129. package/dist/components/VDiskStatus/index.js +3 -0
  130. package/dist/components/VDiskStatus/index.js.map +1 -0
  131. package/dist/components/VDiskStatus/statuses.d.ts +4 -0
  132. package/dist/components/VDiskStatus/statuses.js +120 -0
  133. package/dist/components/VDiskStatus/statuses.js.map +1 -0
  134. package/dist/components/capacityMetricsColumns/i18n/en.json +4 -4
  135. package/dist/components/nodesColumns/columns.d.ts +1 -0
  136. package/dist/components/nodesColumns/columns.js +13 -6
  137. package/dist/components/nodesColumns/columns.js.map +1 -1
  138. package/dist/containers/Cluster/ClusterDrawerHealthcheck.js +6 -1
  139. package/dist/containers/Cluster/ClusterDrawerHealthcheck.js.map +1 -1
  140. package/dist/containers/Clusters/ClusterDrawerHealthcheck.js +1 -1
  141. package/dist/containers/Clusters/ClusterDrawerHealthcheck.js.map +1 -1
  142. package/dist/containers/Clusters/Clusters.js +35 -6
  143. package/dist/containers/Clusters/Clusters.js.map +1 -1
  144. package/dist/containers/Clusters/Clusters.scss +24 -6
  145. package/dist/containers/Clusters/columns.js +9 -4
  146. package/dist/containers/Clusters/columns.js.map +1 -1
  147. package/dist/containers/Clusters/i18n/en.json +6 -0
  148. package/dist/containers/Clusters/i18n/index.d.ts +1 -1
  149. package/dist/containers/Header/Header.js +16 -2
  150. package/dist/containers/Header/Header.js.map +1 -1
  151. package/dist/containers/Header/HeaderLeftControls.js +3 -1
  152. package/dist/containers/Header/HeaderLeftControls.js.map +1 -1
  153. package/dist/containers/Header/PDiskLeftControls.d.ts +1 -0
  154. package/dist/containers/Header/PDiskLeftControls.js +24 -0
  155. package/dist/containers/Header/PDiskLeftControls.js.map +1 -0
  156. package/dist/containers/Header/StorageGroupLeftControls.d.ts +1 -0
  157. package/dist/containers/Header/StorageGroupLeftControls.js +23 -0
  158. package/dist/containers/Header/StorageGroupLeftControls.js.map +1 -0
  159. package/dist/containers/Header/VDiskLeftControls.d.ts +1 -0
  160. package/dist/containers/Header/VDiskLeftControls.js +23 -0
  161. package/dist/containers/Header/VDiskLeftControls.js.map +1 -0
  162. package/dist/containers/Header/breadcrumbs.js +5 -2
  163. package/dist/containers/Header/breadcrumbs.js.map +1 -1
  164. package/dist/containers/Header/i18n/en.json +6 -1
  165. package/dist/containers/Header/i18n/index.d.ts +1 -1
  166. package/dist/containers/Nodes/NodesControls/NodesControls.js +1 -1
  167. package/dist/containers/Nodes/NodesControls/NodesControls.js.map +1 -1
  168. package/dist/containers/Nodes/PaginatedNodes/GroupedNodesComponent.js +5 -3
  169. package/dist/containers/Nodes/PaginatedNodes/GroupedNodesComponent.js.map +1 -1
  170. package/dist/containers/Nodes/PaginatedNodes/NodesComponent.js +4 -2
  171. package/dist/containers/Nodes/PaginatedNodes/NodesComponent.js.map +1 -1
  172. package/dist/containers/Nodes/useDebouncedSearch.d.ts +2 -0
  173. package/dist/containers/Nodes/useDebouncedSearch.js +11 -0
  174. package/dist/containers/Nodes/useDebouncedSearch.js.map +1 -0
  175. package/dist/containers/Operations/constants.d.ts +1 -1
  176. package/dist/containers/PDiskPage/PDiskPage.js +30 -31
  177. package/dist/containers/PDiskPage/PDiskPage.js.map +1 -1
  178. package/dist/containers/PDiskPage/PDiskPage.scss +22 -11
  179. package/dist/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.js +7 -7
  180. package/dist/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.js.map +1 -1
  181. package/dist/containers/PDiskPage/PDiskStorageDetails.d.ts +6 -0
  182. package/dist/containers/PDiskPage/PDiskStorageDetails.js +28 -0
  183. package/dist/containers/PDiskPage/PDiskStorageDetails.js.map +1 -0
  184. package/dist/containers/PDiskPage/PDiskStorageDetails.scss +51 -0
  185. package/dist/containers/PDiskPage/i18n/en.json +2 -0
  186. package/dist/containers/PDiskPage/i18n/index.d.ts +1 -1
  187. package/dist/containers/Storage/Disks/Disks.js +36 -9
  188. package/dist/containers/Storage/Disks/Disks.js.map +1 -1
  189. package/dist/containers/Storage/PDisk/PDisk.d.ts +2 -1
  190. package/dist/containers/Storage/PDisk/PDisk.js +2 -2
  191. package/dist/containers/Storage/PDisk/PDisk.js.map +1 -1
  192. package/dist/containers/Storage/PDisk/i18n/index.d.ts +1 -1
  193. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/columns.js +7 -2
  194. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/columns.js.map +1 -1
  195. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/i18n/index.d.ts +1 -1
  196. package/dist/containers/Storage/StorageExpertModePanel/components/SpaceLegend.scss +14 -82
  197. package/dist/containers/Storage/StorageExpertModePanel/constants.d.ts +1 -1
  198. package/dist/containers/Storage/StorageExpertModePanel/i18n/index.d.ts +1 -1
  199. package/dist/containers/Storage/StorageGroupStateLabel.d.ts +4 -0
  200. package/dist/containers/Storage/StorageGroupStateLabel.js +9 -0
  201. package/dist/containers/Storage/StorageGroupStateLabel.js.map +1 -0
  202. package/dist/containers/Storage/useStorageQueryParams.d.ts +4 -4
  203. package/dist/containers/Storage/utils/getStorageGroupStateLabel.d.ts +2 -0
  204. package/dist/containers/Storage/utils/getStorageGroupStateLabel.js +35 -0
  205. package/dist/containers/Storage/utils/getStorageGroupStateLabel.js.map +1 -0
  206. package/dist/containers/StorageGroupPage/StorageGroupPage.js +20 -13
  207. package/dist/containers/StorageGroupPage/StorageGroupPage.js.map +1 -1
  208. package/dist/containers/StorageGroupPage/StorageGroupPage.scss +18 -12
  209. package/dist/containers/StorageGroupPage/i18n/en.json +2 -1
  210. package/dist/containers/StorageGroupPage/i18n/index.d.ts +1 -1
  211. package/dist/containers/Tenant/Diagnostics/Overview/Overview.d.ts +2 -1
  212. package/dist/containers/Tenant/Diagnostics/Overview/Overview.js +4 -1
  213. package/dist/containers/Tenant/Diagnostics/Overview/Overview.js.map +1 -1
  214. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.d.ts +2 -1
  215. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.js +11 -2
  216. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.js.map +1 -1
  217. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.d.ts +2 -1
  218. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.js +9 -8
  219. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.js.map +1 -1
  220. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.d.ts +16 -1
  221. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.js +56 -19
  222. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.js.map +1 -1
  223. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/en.json +5 -1
  224. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/index.d.ts +1 -1
  225. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/ManagePartitioningDialog/i18n/index.d.ts +1 -1
  226. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.js +5 -12
  227. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.js.map +1 -1
  228. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/i18n/index.d.ts +1 -1
  229. package/dist/containers/Tenant/Diagnostics/TopQueries/columns/i18n/index.d.ts +1 -1
  230. package/dist/containers/Tenant/Healthcheck/Healthcheck.scss +6 -1
  231. package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.d.ts +3 -1
  232. package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.js +3 -3
  233. package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.js.map +1 -1
  234. package/dist/containers/Tenant/Healthcheck/components/HealthcheckIssue.js +2 -2
  235. package/dist/containers/Tenant/Healthcheck/components/HealthcheckIssue.js.map +1 -1
  236. package/dist/containers/Tenant/TenantDrawerHealthcheck.js +17 -2
  237. package/dist/containers/Tenant/TenantDrawerHealthcheck.js.map +1 -1
  238. package/dist/containers/Tenants/DatabaseDrawerHealthcheck.js +8 -1
  239. package/dist/containers/Tenants/DatabaseDrawerHealthcheck.js.map +1 -1
  240. package/dist/containers/VDiskPage/VDiskPage.js +33 -33
  241. package/dist/containers/VDiskPage/VDiskPage.js.map +1 -1
  242. package/dist/containers/VDiskPage/VDiskPage.scss +21 -8
  243. package/dist/containers/VDiskPage/VDiskStorageDetails.js +27 -29
  244. package/dist/containers/VDiskPage/VDiskStorageDetails.js.map +1 -1
  245. package/dist/containers/VDiskPage/VDiskStorageDetails.scss +24 -93
  246. package/dist/containers/VDiskPage/i18n/en.json +3 -12
  247. package/dist/containers/VDiskPage/i18n/index.d.ts +1 -1
  248. package/dist/lib.d.ts +1 -1
  249. package/dist/lib.js.map +1 -1
  250. package/dist/store/configureStore.d.ts +2 -2
  251. package/dist/store/defaultStore.d.ts +1 -1
  252. package/dist/store/reducers/cluster/parseFields.js +1 -0
  253. package/dist/store/reducers/cluster/parseFields.js.map +1 -1
  254. package/dist/store/reducers/clusters/clusters.js +1 -0
  255. package/dist/store/reducers/clusters/clusters.js.map +1 -1
  256. package/dist/store/reducers/clusters/selectors.d.ts +1 -0
  257. package/dist/store/reducers/clusters/selectors.js +4 -1
  258. package/dist/store/reducers/clusters/selectors.js.map +1 -1
  259. package/dist/store/reducers/clusters/types.d.ts +2 -0
  260. package/dist/store/reducers/header/types.d.ts +1 -1
  261. package/dist/store/reducers/index.d.ts +2 -2
  262. package/dist/store/reducers/pdisk/types.d.ts +1 -0
  263. package/dist/store/reducers/pdisk/utils.js +6 -1
  264. package/dist/store/reducers/pdisk/utils.js.map +1 -1
  265. package/dist/store/reducers/storage/prepareGroupsDisks.d.ts +2 -1
  266. package/dist/store/reducers/storage/prepareGroupsDisks.js +9 -19
  267. package/dist/store/reducers/storage/prepareGroupsDisks.js.map +1 -1
  268. package/dist/store/reducers/storage/utils.js +14 -3
  269. package/dist/store/reducers/storage/utils.js.map +1 -1
  270. package/dist/store/reducers/streamingQuery/streamingQuery.js +2 -4
  271. package/dist/store/reducers/streamingQuery/streamingQuery.js.map +1 -1
  272. package/dist/store/reducers/vdisk/types.d.ts +1 -1
  273. package/dist/store/reducers/vdisk/utils.js +5 -5
  274. package/dist/store/reducers/vdisk/utils.js.map +1 -1
  275. package/dist/styles/mixins.scss +22 -0
  276. package/dist/types/api/meta.d.ts +1 -0
  277. package/dist/types/api/nodesList.d.ts +2 -0
  278. package/dist/types/api/pdisk.d.ts +4 -0
  279. package/dist/types/api/pdisk.js.map +1 -1
  280. package/dist/types/api/vdisk.d.ts +8 -0
  281. package/dist/types/api/vdisk.js +7 -0
  282. package/dist/types/api/vdisk.js.map +1 -1
  283. package/dist/types/store/nodesList.d.ts +4 -2
  284. package/dist/uiFactory/types.d.ts +5 -2
  285. package/dist/utils/bytesParsers/formatBytes.d.ts +3 -1
  286. package/dist/utils/bytesParsers/formatBytes.js +12 -3
  287. package/dist/utils/bytesParsers/formatBytes.js.map +1 -1
  288. package/dist/utils/disks/constants.d.ts +1 -0
  289. package/dist/utils/disks/constants.js +4 -0
  290. package/dist/utils/disks/constants.js.map +1 -1
  291. package/dist/utils/disks/diskInfo/getDiskLocationItems.d.ts +16 -0
  292. package/dist/utils/disks/diskInfo/getDiskLocationItems.js +30 -0
  293. package/dist/utils/disks/diskInfo/getDiskLocationItems.js.map +1 -0
  294. package/dist/utils/disks/diskInfo/i18n/en.json +9 -0
  295. package/dist/utils/disks/diskInfo/i18n/index.d.ts +2 -0
  296. package/dist/utils/disks/diskInfo/i18n/index.js +4 -0
  297. package/dist/utils/disks/diskInfo/i18n/index.js.map +1 -0
  298. package/dist/utils/disks/iconCalculators.d.ts +5 -0
  299. package/dist/utils/disks/iconCalculators.js +1 -1
  300. package/dist/utils/disks/iconCalculators.js.map +1 -1
  301. package/dist/utils/disks/prepareDisks.d.ts +6 -2
  302. package/dist/utils/disks/prepareDisks.js +22 -35
  303. package/dist/utils/disks/prepareDisks.js.map +1 -1
  304. package/dist/utils/disks/types.d.ts +9 -2
  305. package/dist/utils/hooks/useDatabaseHealthcheckAvailable.d.ts +2 -0
  306. package/dist/utils/hooks/useDatabaseHealthcheckAvailable.js +6 -0
  307. package/dist/utils/hooks/useDatabaseHealthcheckAvailable.js.map +1 -0
  308. package/dist/utils/hooks/useNodeMetadata.d.ts +2 -0
  309. package/dist/utils/hooks/useNodeMetadata.js +15 -0
  310. package/dist/utils/hooks/useNodeMetadata.js.map +1 -0
  311. package/dist/utils/memory.d.ts +5 -0
  312. package/dist/utils/memory.js +9 -0
  313. package/dist/utils/memory.js.map +1 -0
  314. package/dist/utils/nodes.js +6 -2
  315. package/dist/utils/nodes.js.map +1 -1
  316. package/dist/utils/storageMetrics.d.ts +3 -2
  317. package/dist/utils/storageMetrics.js +30 -10
  318. package/dist/utils/storageMetrics.js.map +1 -1
  319. package/dist/utils/timeParsers/formatDuration.d.ts +4 -1
  320. package/dist/utils/timeParsers/formatDuration.js +16 -1
  321. package/dist/utils/timeParsers/formatDuration.js.map +1 -1
  322. package/dist/utils/timeParsers/i18n/en.json +5 -1
  323. package/dist/utils/timeParsers/i18n/index.d.ts +1 -1
  324. package/dist/utils/timeParsers/i18n/ru.json +5 -1
  325. package/package.json +2 -2
  326. package/src/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.tsx +22 -3
  327. package/src/components/CopyableValue/CopyableValue.scss +16 -0
  328. package/src/components/CopyableValue/CopyableValue.tsx +40 -0
  329. package/src/components/CopyableValue/i18n/en.json +3 -0
  330. package/src/components/CopyableValue/i18n/index.ts +8 -0
  331. package/src/components/CriticalActionDialog/CriticalActionDialog.tsx +3 -0
  332. package/src/components/DiskCapacityInfo/DiskCapacityInfo.tsx +75 -129
  333. package/src/components/DiskCapacityInfo/i18n/en.json +0 -1
  334. package/src/components/DiskPopup/DiskPopup.scss +203 -0
  335. package/src/components/DiskPopup/DiskPopup.tsx +123 -0
  336. package/src/components/DiskPopup/i18n/en.json +3 -0
  337. package/src/components/DiskPopup/i18n/index.ts +5 -0
  338. package/src/components/DiskStatus/DiskStatus.scss +59 -0
  339. package/src/components/DiskStatus/DiskStatus.tsx +149 -0
  340. package/src/components/DiskStatus/i18n/en.json +6 -0
  341. package/src/components/DiskStatus/i18n/index.ts +5 -0
  342. package/src/components/EntityStatus/EntityStatus.scss +5 -0
  343. package/src/components/EntityStatus/EntityStatus.tsx +39 -6
  344. package/src/components/EvictVDiskButton/EvictVDiskButton.tsx +10 -2
  345. package/src/components/EvictVDiskButton/i18n/en.json +2 -2
  346. package/src/components/FullNodeViewer/FullNodeViewer.tsx +4 -9
  347. package/src/components/HoverPopup/HoverPopup.tsx +157 -34
  348. package/src/components/HoverPopup/usePopupPriority.ts +39 -0
  349. package/src/components/MemoryViewer/MemoryViewer.tsx +30 -17
  350. package/src/components/MemoryViewer/i18n/en.json +4 -3
  351. package/src/components/MemoryViewer/utils.ts +19 -12
  352. package/src/components/PDiskInfo/PDiskInfo.scss +15 -0
  353. package/src/components/PDiskInfo/PDiskInfo.tsx +51 -243
  354. package/src/components/PDiskInfo/PDiskLogSize.scss +12 -0
  355. package/src/components/PDiskInfo/PDiskLogSize.tsx +41 -0
  356. package/src/components/PDiskInfo/getPDiskDetails.tsx +37 -0
  357. package/src/components/PDiskInfo/i18n/en.json +69 -10
  358. package/src/components/PDiskInfo/statuses.ts +222 -0
  359. package/src/components/PDiskPopup/PDiskPopup.tsx +62 -147
  360. package/src/components/PDiskPopup/i18n/en.json +2 -12
  361. package/src/components/Search/Search.tsx +5 -2
  362. package/src/components/StorageGroupInfo/StorageGroupInfo.scss +21 -0
  363. package/src/components/StorageGroupInfo/StorageGroupInfo.tsx +119 -263
  364. package/src/components/StorageGroupInfo/i18n/en.json +1 -9
  365. package/src/components/VDisk/VDisk.tsx +34 -36
  366. package/src/components/VDisk/VDiskWithDonorsStack.tsx +2 -0
  367. package/src/components/VDisk/getFlagStatusText.ts +19 -0
  368. package/src/components/VDisk/i18n/en.json +1 -1
  369. package/src/components/VDiskInfo/VDiskInfo.scss +19 -3
  370. package/src/components/VDiskInfo/VDiskInfo.tsx +119 -341
  371. package/src/components/VDiskInfo/getVDiskDetails.tsx +63 -0
  372. package/src/components/VDiskInfo/i18n/en.json +5 -21
  373. package/src/components/VDiskPopup/VDiskPopup.scss +3 -10
  374. package/src/components/VDiskPopup/VDiskPopup.tsx +192 -424
  375. package/src/components/VDiskPopup/i18n/en.json +4 -22
  376. package/src/components/VDiskStatus/VDiskReplicationStatus.tsx +77 -0
  377. package/src/components/VDiskStatus/VDiskStatus.scss +36 -0
  378. package/src/components/VDiskStatus/VDiskStatus.tsx +49 -0
  379. package/src/components/VDiskStatus/i18n/en.json +33 -0
  380. package/src/components/VDiskStatus/i18n/index.ts +7 -0
  381. package/src/components/VDiskStatus/index.ts +7 -0
  382. package/src/components/VDiskStatus/statuses.ts +139 -0
  383. package/src/components/capacityMetricsColumns/i18n/en.json +4 -4
  384. package/src/components/nodesColumns/columns.tsx +26 -12
  385. package/src/containers/Cluster/ClusterDrawerHealthcheck.tsx +6 -0
  386. package/src/containers/Clusters/ClusterDrawerHealthcheck.tsx +1 -0
  387. package/src/containers/Clusters/Clusters.scss +24 -6
  388. package/src/containers/Clusters/Clusters.tsx +74 -5
  389. package/src/containers/Clusters/columns.tsx +36 -6
  390. package/src/containers/Clusters/i18n/en.json +6 -0
  391. package/src/containers/Header/Header.tsx +19 -3
  392. package/src/containers/Header/HeaderLeftControls.tsx +3 -1
  393. package/src/containers/Header/PDiskLeftControls.tsx +41 -0
  394. package/src/containers/Header/StorageGroupLeftControls.tsx +38 -0
  395. package/src/containers/Header/VDiskLeftControls.tsx +40 -0
  396. package/src/containers/Header/breadcrumbs.tsx +4 -2
  397. package/src/containers/Header/i18n/en.json +6 -1
  398. package/src/containers/Nodes/NodesControls/NodesControls.tsx +1 -0
  399. package/src/containers/Nodes/PaginatedNodes/GroupedNodesComponent.tsx +5 -3
  400. package/src/containers/Nodes/PaginatedNodes/NodesComponent.tsx +4 -2
  401. package/src/containers/Nodes/useDebouncedSearch.ts +13 -0
  402. package/src/containers/PDiskPage/PDiskPage.scss +22 -11
  403. package/src/containers/PDiskPage/PDiskPage.tsx +88 -56
  404. package/src/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.tsx +16 -11
  405. package/src/containers/PDiskPage/PDiskStorageDetails.scss +51 -0
  406. package/src/containers/PDiskPage/PDiskStorageDetails.tsx +64 -0
  407. package/src/containers/PDiskPage/i18n/en.json +2 -0
  408. package/src/containers/Storage/Disks/Disks.tsx +66 -12
  409. package/src/containers/Storage/PDisk/PDisk.tsx +3 -0
  410. package/src/containers/Storage/PaginatedStorageGroupsTable/columns/columns.tsx +24 -3
  411. package/src/containers/Storage/StorageExpertModePanel/components/SpaceLegend.scss +14 -82
  412. package/src/containers/Storage/StorageGroupStateLabel.tsx +22 -0
  413. package/src/containers/Storage/utils/getStorageGroupStateLabel.ts +49 -0
  414. package/src/containers/StorageGroupPage/StorageGroupPage.scss +18 -12
  415. package/src/containers/StorageGroupPage/StorageGroupPage.tsx +63 -26
  416. package/src/containers/StorageGroupPage/i18n/en.json +2 -1
  417. package/src/containers/Tenant/Diagnostics/Overview/Overview.tsx +5 -1
  418. package/src/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.tsx +12 -1
  419. package/src/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.tsx +11 -10
  420. package/src/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.tsx +83 -20
  421. package/src/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/en.json +5 -1
  422. package/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.tsx +5 -32
  423. package/src/containers/Tenant/Healthcheck/Healthcheck.scss +6 -1
  424. package/src/containers/Tenant/Healthcheck/components/HealthcheckDrawer.tsx +5 -2
  425. package/src/containers/Tenant/Healthcheck/components/HealthcheckIssue.tsx +18 -8
  426. package/src/containers/Tenant/TenantDrawerHealthcheck.tsx +24 -1
  427. package/src/containers/Tenants/DatabaseDrawerHealthcheck.tsx +10 -0
  428. package/src/containers/VDiskPage/VDiskPage.scss +21 -8
  429. package/src/containers/VDiskPage/VDiskPage.tsx +103 -64
  430. package/src/containers/VDiskPage/VDiskStorageDetails.scss +24 -93
  431. package/src/containers/VDiskPage/VDiskStorageDetails.tsx +50 -158
  432. package/src/containers/VDiskPage/i18n/en.json +3 -14
  433. package/src/lib.ts +1 -0
  434. package/src/store/reducers/cluster/parseFields.ts +1 -0
  435. package/src/store/reducers/clusters/clusters.ts +1 -0
  436. package/src/store/reducers/clusters/selectors.ts +4 -0
  437. package/src/store/reducers/clusters/types.ts +3 -0
  438. package/src/store/reducers/header/types.ts +3 -1
  439. package/src/store/reducers/pdisk/types.ts +1 -0
  440. package/src/store/reducers/pdisk/utils.ts +6 -3
  441. package/src/store/reducers/storage/prepareGroupsDisks.ts +9 -22
  442. package/src/store/reducers/storage/utils.ts +17 -3
  443. package/src/store/reducers/streamingQuery/streamingQuery.ts +2 -4
  444. package/src/store/reducers/vdisk/types.ts +2 -1
  445. package/src/store/reducers/vdisk/utils.ts +4 -5
  446. package/src/styles/mixins.scss +22 -0
  447. package/src/types/api/meta.ts +1 -0
  448. package/src/types/api/nodesList.ts +3 -0
  449. package/src/types/api/pdisk.ts +4 -0
  450. package/src/types/api/vdisk.ts +9 -0
  451. package/src/types/store/nodesList.ts +7 -7
  452. package/src/uiFactory/types.ts +9 -2
  453. package/src/utils/bytesParsers/formatBytes.ts +23 -4
  454. package/src/utils/disks/constants.ts +5 -0
  455. package/src/utils/disks/diskInfo/getDiskLocationItems.ts +50 -0
  456. package/src/utils/disks/diskInfo/i18n/en.json +9 -0
  457. package/src/utils/disks/diskInfo/i18n/index.ts +5 -0
  458. package/src/utils/disks/iconCalculators.ts +1 -1
  459. package/src/utils/disks/prepareDisks.ts +21 -47
  460. package/src/utils/disks/types.ts +10 -2
  461. package/src/utils/hooks/useDatabaseHealthcheckAvailable.ts +9 -0
  462. package/src/utils/hooks/useNodeMetadata.ts +21 -0
  463. package/src/utils/memory.ts +16 -0
  464. package/src/utils/nodes.ts +7 -1
  465. package/src/utils/storageMetrics.ts +38 -14
  466. package/src/utils/timeParsers/formatDuration.ts +22 -1
  467. package/src/utils/timeParsers/i18n/en.json +5 -1
  468. package/src/utils/timeParsers/i18n/ru.json +5 -1
  469. package/dist/components/VDiskInfo/getVDiskCapacityColumns.d.ts +0 -11
  470. package/dist/components/VDiskInfo/getVDiskCapacityColumns.js +0 -52
  471. package/dist/components/VDiskInfo/getVDiskCapacityColumns.js.map +0 -1
  472. package/src/components/VDiskInfo/getVDiskCapacityColumns.tsx +0 -83
@@ -1,6 +1,20 @@
1
+ @use '../../../../styles/mixins';
2
+
1
3
  .ydb-storage-expert-mode-panel {
2
4
  --label-checkbox-size: 14px;
3
5
 
6
+ @each $color in 'green', 'cyan', 'light-yellow', 'yellow', 'light-orange', 'pre-orange',
7
+ 'orange', 'red', 'black'
8
+ {
9
+ &__label_#{$color} {
10
+ @include mixins.capacity-alert-label-colors($color);
11
+
12
+ &:hover {
13
+ background-color: var(--ydb-capacity-alert-label-background) !important;
14
+ }
15
+ }
16
+ }
17
+
4
18
  &__label {
5
19
  border-radius: var(--g-border-radius-s);
6
20
  .g-label__addon_side_start {
@@ -30,86 +44,4 @@
30
44
  border: none;
31
45
  background-color: var(--g-color-base-generic-medium);
32
46
  }
33
-
34
- // Custom color labels
35
- &__label_green {
36
- color: var(--g-color-text-positive-heavy);
37
- background-color: var(--g-color-base-positive-light);
38
-
39
- &:hover {
40
- background-color: var(--g-color-base-positive-light) !important;
41
- }
42
- }
43
-
44
- &__label_cyan {
45
- color: var(--ydb-space-cyan-text);
46
- background-color: var(--ydb-space-cyan-bg);
47
-
48
- &:hover {
49
- background-color: var(--ydb-space-cyan-bg) !important;
50
- }
51
- }
52
-
53
- &__label_light-yellow {
54
- color: var(--ydb-space-light-yellow-text);
55
- background-color: var(--ydb-space-light-yellow-bg);
56
-
57
- &:hover {
58
- background-color: var(--ydb-space-light-yellow-bg) !important;
59
- }
60
- }
61
-
62
- &__label_yellow {
63
- color: var(--g-color-text-warning-heavy);
64
- background-color: var(--g-color-base-warning-light);
65
-
66
- &:hover {
67
- background-color: var(--g-color-base-warning-light) !important;
68
- }
69
- }
70
-
71
- &__label_light-orange {
72
- color: var(--ydb-space-light-orange-text);
73
- background-color: var(--ydb-space-light-orange-bg);
74
-
75
- &:hover {
76
- background-color: var(--ydb-space-light-orange-bg) !important;
77
- }
78
- }
79
-
80
- &__label_pre-orange {
81
- color: var(--ydb-space-pre-orange-text);
82
- background-color: var(--ydb-space-pre-orange-bg);
83
-
84
- &:hover {
85
- background-color: var(--ydb-space-pre-orange-bg) !important;
86
- }
87
- }
88
-
89
- &__label_orange {
90
- color: var(--ydb-space-orange-text);
91
- background-color: var(--ydb-space-orange-bg);
92
-
93
- &:hover {
94
- background-color: var(--ydb-space-orange-bg) !important;
95
- }
96
- }
97
-
98
- &__label_red {
99
- color: var(--g-color-base-danger-heavy);
100
- background-color: var(--g-color-base-danger-light);
101
-
102
- &:hover {
103
- background-color: var(--g-color-base-danger-light) !important;
104
- }
105
- }
106
-
107
- &__label_black {
108
- color: var(--g-color-text-primary);
109
- background-color: var(--g-color-text-dark-hint);
110
-
111
- &:hover {
112
- background-color: var(--g-color-text-dark-hint) !important;
113
- }
114
- }
115
47
  }
@@ -0,0 +1,22 @@
1
+ import {Check} from '@gravity-ui/icons';
2
+ import type {LabelProps} from '@gravity-ui/uikit';
3
+
4
+ import {DiskStatusLabel} from '../../components/DiskStatus/DiskStatus';
5
+
6
+ import {getStorageGroupStateLabel} from './utils/getStorageGroupStateLabel';
7
+
8
+ export function StorageGroupStateLabel({
9
+ state,
10
+ size = 's',
11
+ }: {state?: string} & Pick<LabelProps, 'size'>) {
12
+ const label = getStorageGroupStateLabel(state);
13
+
14
+ return label ? (
15
+ <DiskStatusLabel
16
+ {...label}
17
+ size={size}
18
+ iconSize={size === 'xs' ? 12 : 14}
19
+ icon={label.theme === 'success' ? Check : undefined}
20
+ />
21
+ ) : null;
22
+ }
@@ -0,0 +1,49 @@
1
+ import type {TitledDiskStatusLabelData} from '../../../components/DiskStatus/DiskStatus';
2
+ import {
3
+ DATA_SEVERITY,
4
+ NUMERIC_SEVERITY_TO_LABEL_VIEW,
5
+ SOLID_RED_SEVERITY,
6
+ } from '../../../utils/disks/constants';
7
+ import type {DisplaySeverity} from '../../../utils/disks/types';
8
+
9
+ const stateSeverities = new Map<string, DisplaySeverity>([
10
+ ['ok', DATA_SEVERITY.GREEN],
11
+ ['replicating', DATA_SEVERITY.BLUE],
12
+ ['starting', DATA_SEVERITY.YELLOW],
13
+ ['degraded', DATA_SEVERITY.YELLOW],
14
+ ['dead', SOLID_RED_SEVERITY],
15
+ ]);
16
+
17
+ export function getStorageGroupStateLabel(
18
+ state?: string | null,
19
+ ): TitledDiskStatusLabelData | undefined {
20
+ const normalizedState = state?.trim();
21
+
22
+ if (!normalizedState) {
23
+ return undefined;
24
+ }
25
+
26
+ const match = normalizedState.match(/^([^:]+)(?::\s*(.+))?$/);
27
+ const status = (match?.[1] ?? normalizedState).trim();
28
+ const value = match?.[2]?.trim();
29
+ let severity = stateSeverities.get(status) ?? DATA_SEVERITY.GREY;
30
+
31
+ if (status === 'degraded') {
32
+ const count = value?.split('(', 1)[0].trim();
33
+
34
+ if (count === '2') {
35
+ severity = DATA_SEVERITY.RED;
36
+ }
37
+ }
38
+
39
+ const labelView = NUMERIC_SEVERITY_TO_LABEL_VIEW[severity];
40
+ const title = status[0].toUpperCase() + status.slice(1);
41
+ const formattedValue = value?.replace(/\s*\(/g, ' (');
42
+
43
+ return {
44
+ title,
45
+ value: formattedValue,
46
+ theme: labelView.theme,
47
+ dangerHeavy: Boolean(labelView.dangerHeavy),
48
+ };
49
+ }
@@ -1,5 +1,3 @@
1
- @use '../../styles/mixins.scss';
2
-
3
1
  .ydb-storage-group-page {
4
2
  position: relative;
5
3
 
@@ -8,9 +6,7 @@
8
6
  height: 100%;
9
7
  padding: 0 20px;
10
8
 
11
- &__meta,
12
- &__title,
13
- &__info,
9
+ &__summary,
14
10
  &__storage-title {
15
11
  position: sticky;
16
12
  left: 0;
@@ -18,20 +14,30 @@
18
14
  margin-bottom: 20px;
19
15
  }
20
16
 
17
+ &__summary {
18
+ margin-top: var(--g-spacing-4);
19
+ margin-bottom: var(--g-spacing-6);
20
+ }
21
+
21
22
  &__meta {
22
- margin-top: 20px;
23
+ margin-bottom: var(--g-spacing-4);
23
24
  }
24
25
 
25
26
  &__title {
26
- margin-bottom: 60px;
27
+ margin-bottom: var(--g-spacing-4);
27
28
  }
28
29
 
29
- &__storage-title {
30
- margin-bottom: 0;
31
- @include mixins.header-1-typography();
30
+ &__title-content {
31
+ flex: 1;
32
+
33
+ min-width: 0;
34
+ }
35
+
36
+ &__refresh-control {
37
+ flex-shrink: 0;
32
38
  }
33
39
 
34
- &__info {
35
- margin-top: var(--g-spacing-10);
40
+ &__storage-title {
41
+ margin: 0;
36
42
  }
37
43
  }
@@ -1,24 +1,28 @@
1
1
  import React from 'react';
2
2
 
3
+ import {ArrowLeft} from '@gravity-ui/icons';
4
+ import {Button, Flex, Icon, Text} from '@gravity-ui/uikit';
3
5
  import {skipToken} from '@reduxjs/toolkit/query';
4
6
  import {Helmet} from 'react-helmet-async';
7
+ import {useHistory} from 'react-router-dom';
5
8
  import {StringParam, useQueryParams} from 'use-query-params';
6
9
 
7
- import {EntityPageTitle} from '../../components/EntityPageTitle/EntityPageTitle';
10
+ import {AutoRefreshControl} from '../../components/AutoRefreshControl/AutoRefreshControl';
11
+ import {CopyableValue} from '../../components/CopyableValue/CopyableValue';
8
12
  import {ResponseError} from '../../components/Errors/ResponseError';
9
13
  import {InfoViewerSkeleton} from '../../components/InfoViewerSkeleton/InfoViewerSkeleton';
10
- import {PageMetaWithAutorefresh} from '../../components/PageMeta/PageMeta';
11
14
  import {StorageGroupInfo} from '../../components/StorageGroupInfo/StorageGroupInfo';
12
15
  import {useCapabilitiesLoaded} from '../../store/reducers/capabilities/hooks';
13
16
  import {setHeaderBreadcrumbs} from '../../store/reducers/header/header';
14
17
  import {storageApi} from '../../store/reducers/storage/storage';
15
- import {EFlag} from '../../types/api/enums';
16
18
  import {valueIsDefined} from '../../utils';
17
19
  import {cn} from '../../utils/cn';
20
+ import {EMPTY_DATA_PLACEHOLDER} from '../../utils/constants';
18
21
  import {useAutoRefreshInterval, useTypedDispatch} from '../../utils/hooks';
19
22
  import {useDatabaseFromQuery} from '../../utils/hooks/useDatabaseFromQuery';
20
23
  import {useAppTitle} from '../App/AppTitleContext';
21
24
  import {PaginatedStorage} from '../Storage/PaginatedStorage';
25
+ import {StorageGroupStateLabel} from '../Storage/StorageGroupStateLabel';
22
26
 
23
27
  import {storageGroupPageKeyset} from './i18n';
24
28
 
@@ -28,14 +32,13 @@ const storageGroupPageCn = cn('ydb-storage-group-page');
28
32
 
29
33
  export function StorageGroupPage() {
30
34
  const dispatch = useTypedDispatch();
35
+ const history = useHistory();
31
36
  const database = useDatabaseFromQuery();
32
37
  const containerRef = React.useRef<HTMLDivElement>(null);
33
38
 
34
39
  const [{groupId}] = useQueryParams({groupId: StringParam});
35
-
36
- React.useEffect(() => {
37
- dispatch(setHeaderBreadcrumbs('storageGroup', {groupId, database}));
38
- }, [dispatch, groupId, database]);
40
+ const showBackButton = Boolean(groupId) && history.length > 1;
41
+ const showRefreshInTitle = Boolean(groupId) && !showBackButton;
39
42
 
40
43
  const [autoRefreshInterval] = useAutoRefreshInterval();
41
44
  const capabilitiesLoaded = useCapabilitiesLoaded();
@@ -49,7 +52,12 @@ export function StorageGroupPage() {
49
52
  },
50
53
  );
51
54
 
52
- const storageGroupData = groupQuery.data?.groups?.[0];
55
+ const storageGroupData = groupQuery.currentData?.groups?.[0];
56
+ const state = storageGroupData?.State;
57
+
58
+ React.useEffect(() => {
59
+ dispatch(setHeaderBreadcrumbs('storageGroup', {groupId: groupId ?? undefined, database}));
60
+ }, [dispatch, groupId, database]);
53
61
 
54
62
  const loading = groupQuery.isFetching && storageGroupData === undefined;
55
63
  const {appTitle} = useAppTitle();
@@ -68,29 +76,56 @@ export function StorageGroupPage() {
68
76
  };
69
77
 
70
78
  const renderPageMeta = () => {
71
- if (!groupId) {
79
+ if (!showBackButton) {
72
80
  return null;
73
81
  }
74
82
 
75
- const items = [`${storageGroupPageKeyset('pool-name')}: ${storageGroupData?.PoolName}`];
76
-
77
83
  return (
78
- <PageMetaWithAutorefresh
84
+ <Flex
79
85
  className={storageGroupPageCn('meta')}
80
- loading={loading}
81
- items={items}
82
- />
86
+ alignItems="center"
87
+ justifyContent="space-between"
88
+ gap={2}
89
+ >
90
+ <Button view="outlined" onClick={() => history.goBack()}>
91
+ <Icon data={ArrowLeft} />
92
+ {storageGroupPageKeyset('action_back')}
93
+ </Button>
94
+ <AutoRefreshControl className={storageGroupPageCn('refresh-control')} />
95
+ </Flex>
83
96
  );
84
97
  };
85
98
 
86
99
  const renderPageTitle = () => {
87
100
  return (
88
- <EntityPageTitle
101
+ <Flex
89
102
  className={storageGroupPageCn('title')}
90
- entityName={storageGroupPageKeyset('storage-group')}
91
- status={storageGroupData?.Overall || EFlag.Grey}
92
- id={groupId}
93
- />
103
+ alignItems="flex-start"
104
+ gap={2}
105
+ wrap="nowrap"
106
+ >
107
+ <Flex
108
+ className={storageGroupPageCn('title-content')}
109
+ alignItems="center"
110
+ gap={2}
111
+ wrap="wrap"
112
+ >
113
+ <Text variant="header-1">{storageGroupPageKeyset('storage-group')}</Text>
114
+ <CopyableValue
115
+ copyText={groupId}
116
+ fieldName={storageGroupPageKeyset('storage-group')}
117
+ copyButtonLabel={storageGroupPageKeyset('action_copy-group-id-from-title')}
118
+ >
119
+ <Text variant="header-1" color="hint">
120
+ {groupId || EMPTY_DATA_PLACEHOLDER}
121
+ </Text>
122
+ </CopyableValue>
123
+ <StorageGroupStateLabel state={state} />
124
+ </Flex>
125
+ {showRefreshInTitle && (
126
+ <AutoRefreshControl className={storageGroupPageCn('refresh-control')} />
127
+ )}
128
+ </Flex>
94
129
  );
95
130
  };
96
131
 
@@ -107,9 +142,9 @@ export function StorageGroupPage() {
107
142
  }
108
143
  return (
109
144
  <React.Fragment>
110
- <div className={storageGroupPageCn('storage-title')}>
145
+ <Text as="h2" variant="subheader-3" className={storageGroupPageCn('storage-title')}>
111
146
  {storageGroupPageKeyset('storage')}
112
- </div>
147
+ </Text>
113
148
  <PaginatedStorage
114
149
  database={database}
115
150
  groupId={groupId}
@@ -132,10 +167,12 @@ export function StorageGroupPage() {
132
167
  return (
133
168
  <div className={storageGroupPageCn(null)} ref={containerRef}>
134
169
  {renderHelmet()}
135
- {renderPageMeta()}
136
- {renderPageTitle()}
137
- {renderError()}
138
- {renderInfo()}
170
+ <div className={storageGroupPageCn('summary')}>
171
+ {renderPageMeta()}
172
+ {renderPageTitle()}
173
+ {renderError()}
174
+ {renderInfo()}
175
+ </div>
139
176
  {renderStorage()}
140
177
  </div>
141
178
  );
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "storage-group": "Storage Group",
3
3
  "storage": "Storage",
4
- "pool-name": "Pool Name"
4
+ "action_back": "Back",
5
+ "action_copy-group-id-from-title": "Copy Storage Group ID from page title"
5
6
  }
@@ -110,7 +110,7 @@ function Overview({type, path, database, databaseFullPath}: OverviewProps) {
110
110
  />
111
111
  ),
112
112
  [EPathType.EPathTypeStreamingQuery]: () => (
113
- <StreamingQueryInfo path={path} database={database} />
113
+ <StreamingQueryInfo path={path} database={database} data={data} />
114
114
  ),
115
115
  };
116
116
 
@@ -129,6 +129,10 @@ function Overview({type, path, database, databaseFullPath}: OverviewProps) {
129
129
 
130
130
  const content = pathTypeToComponent[type]?.();
131
131
 
132
+ if (isStreamingQuery) {
133
+ return content;
134
+ }
135
+
132
136
  const commonInfo = (
133
137
  <SchemaObjectInfoContainer data={currentData ?? undefined} type={type} path={path} />
134
138
  );
@@ -18,6 +18,7 @@ export interface SchemaObjectInfoProps {
18
18
  path: string;
19
19
  itemsAfterType?: YDBDefinitionListItem[];
20
20
  additionalItems?: YDBDefinitionListItem[];
21
+ createdContent?: YDBDefinitionListItem['content'];
21
22
  }
22
23
 
23
24
  export function SchemaObjectInfo({
@@ -26,6 +27,7 @@ export function SchemaObjectInfo({
26
27
  path,
27
28
  itemsAfterType,
28
29
  additionalItems,
30
+ createdContent,
29
31
  }: SchemaObjectInfoProps) {
30
32
  const showAdministrativeFields = useUserPermissions()?.IsAdministrationAllowed === true;
31
33
  const items = React.useMemo(
@@ -37,8 +39,17 @@ export function SchemaObjectInfo({
37
39
  itemsAfterType,
38
40
  additionalItems,
39
41
  showAdministrativeFields,
42
+ createdContent,
40
43
  }),
41
- [additionalItems, data, fallbackType, itemsAfterType, path, showAdministrativeFields],
44
+ [
45
+ additionalItems,
46
+ createdContent,
47
+ data,
48
+ fallbackType,
49
+ itemsAfterType,
50
+ path,
51
+ showAdministrativeFields,
52
+ ],
42
53
  );
43
54
 
44
55
  return (
@@ -40,6 +40,7 @@ interface PrepareSchemaObjectInfoItemsParams {
40
40
  itemsAfterType?: YDBDefinitionListItem[];
41
41
  additionalItems?: YDBDefinitionListItem[];
42
42
  showAdministrativeFields?: boolean;
43
+ createdContent?: YDBDefinitionListItem['content'];
43
44
  }
44
45
 
45
46
  function isPresent(value: string | number | undefined): value is string | number {
@@ -83,6 +84,7 @@ export function prepareSchemaObjectInfoItems({
83
84
  itemsAfterType = [],
84
85
  additionalItems = [],
85
86
  showAdministrativeFields = false,
87
+ createdContent,
86
88
  }: PrepareSchemaObjectInfoItemsParams): YDBDefinitionListItem[] {
87
89
  const self = data?.PathDescription?.Self;
88
90
  let pathId = self?.PathId;
@@ -116,21 +118,20 @@ export function prepareSchemaObjectInfoItems({
116
118
  );
117
119
  }
118
120
 
119
- if (Number(createStep)) {
121
+ items.push({
122
+ name: schemaObjectInfoKeyset('field_full-path'),
123
+ content: isPresent(fullPath) ? fullPath : EMPTY_DATA_PLACEHOLDER,
124
+ copyText: isPresent(fullPath) ? fullPath : undefined,
125
+ });
126
+
127
+ if (createdContent || Number(createStep)) {
120
128
  items.push({
121
129
  name: tenantKeyset('field_created'),
122
- content: formatDateTime(createStep),
130
+ content: createdContent || formatDateTime(createStep),
123
131
  });
124
132
  }
125
133
 
126
- items.push(
127
- {
128
- name: schemaObjectInfoKeyset('field_full-path'),
129
- content: isPresent(fullPath) ? fullPath : EMPTY_DATA_PLACEHOLDER,
130
- copyText: isPresent(fullPath) ? fullPath : undefined,
131
- },
132
- ...additionalItems,
133
- );
134
+ items.push(...additionalItems);
134
135
 
135
136
  return items.filter(({content}) => content !== undefined && content !== null && content !== '');
136
137
  }
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
 
3
+ import {dateTimeParse} from '@gravity-ui/date-utils';
3
4
  import {Label} from '@gravity-ui/uikit';
4
5
 
5
6
  import {Loader} from '../../../../../components/Loader';
@@ -7,8 +8,11 @@ import type {YDBDefinitionListItem} from '../../../../../components/YDBDefinitio
7
8
  import {YDBDefinitionList} from '../../../../../components/YDBDefinitionList/YDBDefinitionList';
8
9
  import {YQLCodePreview} from '../../../../../components/YQLCodePreview/YQLCodePreview';
9
10
  import {streamingQueriesApi} from '../../../../../store/reducers/streamingQuery/streamingQuery';
11
+ import type {TEvDescribeSchemeResult} from '../../../../../types/api/schema';
12
+ import {EPathType} from '../../../../../types/api/schema';
10
13
  import type {IQueryResult} from '../../../../../types/store/query';
11
14
  import {cn} from '../../../../../utils/cn';
15
+ import {EMPTY_DATA_PLACEHOLDER} from '../../../../../utils/constants';
12
16
  import {
13
17
  getStringifiedData,
14
18
  stripIndentByFirstLine,
@@ -16,6 +20,7 @@ import {
16
20
  } from '../../../../../utils/dataFormatters/dataFormatters';
17
21
  import {parseIssuesData} from '../../../../../utils/query';
18
22
  import {ResultIssuesModal} from '../../../Query/Issues/Issues';
23
+ import {SchemaObjectInfo} from '../SchemaObjectInfo/SchemaObjectInfo';
19
24
 
20
25
  import i18n from './i18n';
21
26
 
@@ -24,26 +29,37 @@ import './StreamingQueryInfo.scss';
24
29
  interface StreamingQueryProps {
25
30
  database: string;
26
31
  path: string;
32
+ data?: TEvDescribeSchemeResult;
27
33
  }
28
34
 
29
35
  const b = cn('ydb-streaming-query-info');
30
36
 
31
- export function StreamingQueryInfo({database, path}: StreamingQueryProps) {
32
- const {data: sysData, isFetching} = streamingQueriesApi.useGetStreamingQueryInfoQuery(
37
+ export function StreamingQueryInfo({database, path, data}: StreamingQueryProps) {
38
+ const {currentData: sysData, isFetching} = streamingQueriesApi.useGetStreamingQueryInfoQuery(
33
39
  {database, path},
34
40
  {skip: !database || !path},
35
41
  );
36
42
  const loading = isFetching && sysData === undefined;
37
43
 
38
- if (loading) {
39
- return <Loader size="s" className={b('loader')} />;
40
- }
41
-
42
- const {items, queryText} = prepareStreamingQueryItems(sysData);
44
+ const {items, queryText, createdContent, stateItems} = prepareStreamingQueryInfo(
45
+ sysData,
46
+ data?.PathDescription?.Self?.CreateStep,
47
+ );
43
48
 
44
49
  return (
45
50
  <React.Fragment>
46
- <YDBDefinitionList items={items} />
51
+ <SchemaObjectInfo
52
+ data={data}
53
+ fallbackType={EPathType.EPathTypeStreamingQuery}
54
+ path={path}
55
+ createdContent={createdContent}
56
+ itemsAfterType={stateItems}
57
+ />
58
+ {loading ? (
59
+ <Loader size="s" className={b('loader')} />
60
+ ) : items.length ? (
61
+ <YDBDefinitionList items={items} />
62
+ ) : null}
47
63
  {queryText ? (
48
64
  <YQLCodePreview title={i18n('field_query-text')} text={queryText} />
49
65
  ) : null}
@@ -73,27 +89,40 @@ function StateLabel({state}: {state?: string}) {
73
89
  return <Label theme={theme}>{state}</Label>;
74
90
  }
75
91
 
76
- function prepareStreamingQueryItems(sysData?: IQueryResult) {
92
+ export function prepareStreamingQueryInfo(sysData?: IQueryResult, createStep?: string | number) {
77
93
  if (!sysData) {
78
- return {items: [], queryText: undefined};
94
+ return {items: [], queryText: undefined, createdContent: undefined, stateItems: []};
79
95
  }
80
96
 
81
- const info: YDBDefinitionListItem[] = [];
82
- const state = getStringifiedData(sysData.resultSets?.[0]?.result?.[0]?.State);
83
-
84
- const queryText = getStringifiedData(sysData.resultSets?.[0]?.result?.[0]?.Text);
97
+ const row = sysData.resultSets?.[0]?.result?.[0];
98
+ const createdContent =
99
+ formatLifecycleValue(row?.CreatedAt, row?.CreatedBy, createStep) ??
100
+ (row && 'CreatedAt' in row ? EMPTY_DATA_PLACEHOLDER : undefined);
101
+ const lifecycleFields = [
102
+ {name: i18n('field_started'), timestamp: 'StartedAt', user: 'StartedBy'},
103
+ {name: i18n('field_modified'), timestamp: 'ModifiedAt', user: 'ModifiedBy'},
104
+ {name: i18n('field_stopped'), timestamp: 'FinishedAt', user: 'StoppedBy'},
105
+ ];
106
+ const info: YDBDefinitionListItem[] = lifecycleFields
107
+ .filter(({timestamp}) => row && timestamp in row)
108
+ .map(({name, timestamp, user}) => ({
109
+ name,
110
+ content: formatLifecycleValue(row?.[timestamp], row?.[user]) ?? EMPTY_DATA_PLACEHOLDER,
111
+ }));
112
+ const state = getStringifiedData(row?.Status);
113
+
114
+ const queryText = getStringifiedData(row?.Text);
85
115
  let normalizedQueryText = trimOuterEmptyLines(queryText);
86
116
  normalizedQueryText = stripIndentByFirstLine(normalizedQueryText);
87
117
 
88
- const errorRaw = sysData.resultSets?.[0]?.result?.[0]?.Error;
118
+ const errorRaw = row?.Issues;
89
119
 
90
120
  // We use custom error check, because error type can be non-standard
91
121
  const errorData = parseIssuesData(errorRaw);
92
122
 
93
- info.push({
94
- name: i18n('field_query-state'),
95
- content: <StateLabel state={state} />,
96
- });
123
+ const stateItems: YDBDefinitionListItem[] = [
124
+ {name: i18n('field_query-state'), content: <StateLabel state={state} />},
125
+ ];
97
126
 
98
127
  if (errorData) {
99
128
  info.push({
@@ -102,5 +131,39 @@ function prepareStreamingQueryItems(sysData?: IQueryResult) {
102
131
  });
103
132
  }
104
133
 
105
- return {items: info, queryText: normalizedQueryText};
134
+ return {items: info, queryText: normalizedQueryText, createdContent, stateItems};
135
+ }
136
+
137
+ function formatLifecycleValue(
138
+ timestamp: string | number | null | undefined,
139
+ user: string | number | null | undefined,
140
+ fallback?: string | number,
141
+ ) {
142
+ let milliseconds = NaN;
143
+ if (typeof timestamp === 'number') {
144
+ milliseconds = timestamp;
145
+ } else if (typeof timestamp === 'string') {
146
+ milliseconds = Date.parse(timestamp);
147
+ }
148
+ const dateMilliseconds =
149
+ Number.isFinite(milliseconds) && milliseconds > 0 ? milliseconds : Number(fallback);
150
+ const date =
151
+ Number.isFinite(dateMilliseconds) && dateMilliseconds > 0
152
+ ? dateTimeParse(dateMilliseconds)?.format('YYYY-MM-DD HH:mm:ss')
153
+ : undefined;
154
+
155
+ if (!date && !user) {
156
+ return undefined;
157
+ }
158
+
159
+ if (!user) {
160
+ return date;
161
+ }
162
+
163
+ return (
164
+ <React.Fragment>
165
+ {i18n('value_date-by-user', {date: date || EMPTY_DATA_PLACEHOLDER})}{' '}
166
+ <Label theme="normal">{String(user)}</Label>
167
+ </React.Fragment>
168
+ );
106
169
  }
@@ -1,5 +1,9 @@
1
1
  {
2
2
  "field_query-state": "State",
3
3
  "field_query-error": "Error",
4
- "field_query-text": "Text"
4
+ "field_query-text": "Text",
5
+ "field_started": "Started",
6
+ "field_modified": "Modified",
7
+ "field_stopped": "Stopped",
8
+ "value_date-by-user": "{{date}} by"
5
9
  }