ydb-embedded-ui 22.2.0 → 22.4.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 (405) hide show
  1. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.d.ts +10 -1
  2. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.js +75 -13
  3. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.js.map +1 -1
  4. package/dist/components/DiskCapacityInfo/i18n/index.d.ts +1 -1
  5. package/dist/components/DiskPopup/DiskPopup.d.ts +25 -0
  6. package/dist/components/DiskPopup/DiskPopup.js +44 -0
  7. package/dist/components/DiskPopup/DiskPopup.js.map +1 -0
  8. package/dist/components/DiskPopup/DiskPopup.scss +203 -0
  9. package/dist/components/DiskPopup/i18n/en.json +3 -0
  10. package/dist/components/DiskPopup/i18n/index.d.ts +2 -0
  11. package/dist/components/DiskPopup/i18n/index.js +4 -0
  12. package/dist/components/DiskPopup/i18n/index.js.map +1 -0
  13. package/dist/components/DiskStatus/DiskStatus.d.ts +31 -0
  14. package/dist/components/DiskStatus/DiskStatus.js +61 -0
  15. package/dist/components/DiskStatus/DiskStatus.js.map +1 -0
  16. package/dist/components/DiskStatus/DiskStatus.scss +59 -0
  17. package/dist/components/DiskStatus/i18n/en.json +6 -0
  18. package/dist/components/DiskStatus/i18n/index.d.ts +2 -0
  19. package/dist/components/DiskStatus/i18n/index.js +4 -0
  20. package/dist/components/DiskStatus/i18n/index.js.map +1 -0
  21. package/dist/components/EntityStatus/EntityStatus.d.ts +1 -0
  22. package/dist/components/EntityStatus/EntityStatus.js +1 -1
  23. package/dist/components/EntityStatus/EntityStatus.js.map +1 -1
  24. package/dist/components/EvictVDiskButton/i18n/en.json +1 -1
  25. package/dist/components/FullNodeViewer/i18n/index.d.ts +1 -1
  26. package/dist/components/Graph/GravityGraph.js +9 -2
  27. package/dist/components/Graph/GravityGraph.js.map +1 -1
  28. package/dist/components/Graph/utils.d.ts +2 -1
  29. package/dist/components/Graph/utils.js +7 -0
  30. package/dist/components/Graph/utils.js.map +1 -1
  31. package/dist/components/HoverPopup/HoverPopup.d.ts +2 -1
  32. package/dist/components/HoverPopup/HoverPopup.js +49 -17
  33. package/dist/components/HoverPopup/HoverPopup.js.map +1 -1
  34. package/dist/components/HoverPopup/usePopupPriority.d.ts +4 -0
  35. package/dist/components/HoverPopup/usePopupPriority.js +30 -0
  36. package/dist/components/HoverPopup/usePopupPriority.js.map +1 -0
  37. package/dist/components/PDiskInfo/PDiskLogSize.d.ts +5 -0
  38. package/dist/components/PDiskInfo/PDiskLogSize.js +20 -0
  39. package/dist/components/PDiskInfo/PDiskLogSize.js.map +1 -0
  40. package/dist/components/PDiskInfo/PDiskLogSize.scss +12 -0
  41. package/dist/components/PDiskInfo/getPDiskDetails.d.ts +4 -0
  42. package/dist/components/PDiskInfo/getPDiskDetails.js +33 -0
  43. package/dist/components/PDiskInfo/getPDiskDetails.js.map +1 -0
  44. package/dist/components/PDiskInfo/i18n/en.json +64 -2
  45. package/dist/components/PDiskInfo/i18n/index.d.ts +1 -1
  46. package/dist/components/PDiskInfo/statuses.d.ts +7 -0
  47. package/dist/components/PDiskInfo/statuses.js +185 -0
  48. package/dist/components/PDiskInfo/statuses.js.map +1 -0
  49. package/dist/components/PDiskPopup/PDiskPopup.d.ts +4 -7
  50. package/dist/components/PDiskPopup/PDiskPopup.js +28 -99
  51. package/dist/components/PDiskPopup/PDiskPopup.js.map +1 -1
  52. package/dist/components/PDiskPopup/i18n/en.json +2 -12
  53. package/dist/components/PDiskPopup/i18n/index.d.ts +1 -1
  54. package/dist/components/PaginatedTable/rowLookup.js +30 -9
  55. package/dist/components/PaginatedTable/rowLookup.js.map +1 -1
  56. package/dist/components/StorageGroupInfo/StorageGroupInfo.d.ts +3 -3
  57. package/dist/components/StorageGroupInfo/StorageGroupInfo.js +78 -218
  58. package/dist/components/StorageGroupInfo/StorageGroupInfo.js.map +1 -1
  59. package/dist/components/StorageGroupInfo/StorageGroupInfo.scss +21 -0
  60. package/dist/components/StorageGroupInfo/i18n/en.json +1 -9
  61. package/dist/components/StorageGroupInfo/i18n/index.d.ts +1 -1
  62. package/dist/components/TableKeyboardNavigation/TableKeyboardNavigation.js +5 -1
  63. package/dist/components/TableKeyboardNavigation/TableKeyboardNavigation.js.map +1 -1
  64. package/dist/components/VDisk/VDisk.d.ts +2 -1
  65. package/dist/components/VDisk/VDisk.js +23 -32
  66. package/dist/components/VDisk/VDisk.js.map +1 -1
  67. package/dist/components/VDisk/VDiskWithDonorsStack.d.ts +1 -1
  68. package/dist/components/VDisk/VDiskWithDonorsStack.js +2 -1
  69. package/dist/components/VDisk/VDiskWithDonorsStack.js.map +1 -1
  70. package/dist/components/VDisk/getFlagStatusText.d.ts +2 -0
  71. package/dist/components/VDisk/getFlagStatusText.js +18 -0
  72. package/dist/components/VDisk/getFlagStatusText.js.map +1 -0
  73. package/dist/components/VDisk/i18n/en.json +1 -1
  74. package/dist/components/VDisk/i18n/index.d.ts +1 -1
  75. package/dist/components/VDiskInfo/getVDiskDetails.d.ts +5 -0
  76. package/dist/components/VDiskInfo/getVDiskDetails.js +29 -0
  77. package/dist/components/VDiskInfo/getVDiskDetails.js.map +1 -0
  78. package/dist/components/VDiskInfo/i18n/en.json +3 -1
  79. package/dist/components/VDiskInfo/i18n/index.d.ts +1 -1
  80. package/dist/components/VDiskPopup/VDiskPopup.d.ts +6 -8
  81. package/dist/components/VDiskPopup/VDiskPopup.js +106 -240
  82. package/dist/components/VDiskPopup/VDiskPopup.js.map +1 -1
  83. package/dist/components/VDiskPopup/VDiskPopup.scss +3 -10
  84. package/dist/components/VDiskPopup/i18n/en.json +6 -22
  85. package/dist/components/VDiskPopup/i18n/index.d.ts +1 -1
  86. package/dist/components/VDiskStatus/VDiskReplicationStatus.d.ts +8 -0
  87. package/dist/components/VDiskStatus/VDiskReplicationStatus.js +32 -0
  88. package/dist/components/VDiskStatus/VDiskReplicationStatus.js.map +1 -0
  89. package/dist/components/VDiskStatus/VDiskStatus.d.ts +16 -0
  90. package/dist/components/VDiskStatus/VDiskStatus.js +20 -0
  91. package/dist/components/VDiskStatus/VDiskStatus.js.map +1 -0
  92. package/dist/components/VDiskStatus/VDiskStatus.scss +32 -0
  93. package/dist/components/VDiskStatus/i18n/en.json +33 -0
  94. package/dist/components/VDiskStatus/i18n/index.d.ts +1 -0
  95. package/dist/components/VDiskStatus/i18n/index.js +5 -0
  96. package/dist/components/VDiskStatus/i18n/index.js.map +1 -0
  97. package/dist/components/VDiskStatus/index.d.ts +2 -0
  98. package/dist/components/VDiskStatus/index.js +3 -0
  99. package/dist/components/VDiskStatus/index.js.map +1 -0
  100. package/dist/components/VDiskStatus/statuses.d.ts +4 -0
  101. package/dist/components/VDiskStatus/statuses.js +120 -0
  102. package/dist/components/VDiskStatus/statuses.js.map +1 -0
  103. package/dist/components/capacityMetricsColumns/i18n/en.json +4 -4
  104. package/dist/containers/Authentication/Authentication.js +29 -30
  105. package/dist/containers/Authentication/Authentication.js.map +1 -1
  106. package/dist/containers/Authentication/utils.d.ts +2 -2
  107. package/dist/containers/Authentication/utils.js +1 -1
  108. package/dist/containers/Authentication/utils.js.map +1 -1
  109. package/dist/containers/Cluster/ClusterDrawerHealthcheck.js +6 -1
  110. package/dist/containers/Cluster/ClusterDrawerHealthcheck.js.map +1 -1
  111. package/dist/containers/Clusters/ClusterDrawerHealthcheck.js +1 -1
  112. package/dist/containers/Clusters/ClusterDrawerHealthcheck.js.map +1 -1
  113. package/dist/containers/Header/Header.js +8 -2
  114. package/dist/containers/Header/Header.js.map +1 -1
  115. package/dist/containers/Header/StorageGroupLeftControls.d.ts +1 -0
  116. package/dist/containers/Header/StorageGroupLeftControls.js +23 -0
  117. package/dist/containers/Header/StorageGroupLeftControls.js.map +1 -0
  118. package/dist/containers/Header/i18n/en.json +3 -1
  119. package/dist/containers/Header/i18n/index.d.ts +1 -1
  120. package/dist/containers/Operations/constants.d.ts +1 -1
  121. package/dist/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.js +4 -4
  122. package/dist/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.js.map +1 -1
  123. package/dist/containers/PDiskPage/i18n/index.d.ts +1 -1
  124. package/dist/containers/Storage/Disks/Disks.js +36 -9
  125. package/dist/containers/Storage/Disks/Disks.js.map +1 -1
  126. package/dist/containers/Storage/PDisk/PDisk.d.ts +2 -1
  127. package/dist/containers/Storage/PDisk/PDisk.js +2 -2
  128. package/dist/containers/Storage/PDisk/PDisk.js.map +1 -1
  129. package/dist/containers/Storage/PDisk/i18n/index.d.ts +1 -1
  130. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/columns.js +7 -2
  131. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/columns.js.map +1 -1
  132. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/i18n/index.d.ts +1 -1
  133. package/dist/containers/Storage/StorageExpertModePanel/components/SpaceLegend.scss +14 -82
  134. package/dist/containers/Storage/StorageExpertModePanel/i18n/index.d.ts +1 -1
  135. package/dist/containers/Storage/StorageGroupStateLabel.d.ts +4 -0
  136. package/dist/containers/Storage/StorageGroupStateLabel.js +9 -0
  137. package/dist/containers/Storage/StorageGroupStateLabel.js.map +1 -0
  138. package/dist/containers/Storage/utils/getStorageGroupStateLabel.d.ts +2 -0
  139. package/dist/containers/Storage/utils/getStorageGroupStateLabel.js +35 -0
  140. package/dist/containers/Storage/utils/getStorageGroupStateLabel.js.map +1 -0
  141. package/dist/containers/StorageGroupPage/StorageGroupPage.js +17 -12
  142. package/dist/containers/StorageGroupPage/StorageGroupPage.js.map +1 -1
  143. package/dist/containers/StorageGroupPage/StorageGroupPage.scss +9 -13
  144. package/dist/containers/StorageGroupPage/i18n/en.json +3 -1
  145. package/dist/containers/StorageGroupPage/i18n/index.d.ts +1 -1
  146. package/dist/containers/Tenant/Diagnostics/DiagnosticsPages.js +5 -1
  147. package/dist/containers/Tenant/Diagnostics/DiagnosticsPages.js.map +1 -1
  148. package/dist/containers/Tenant/Diagnostics/Overview/Overview.d.ts +2 -1
  149. package/dist/containers/Tenant/Diagnostics/Overview/Overview.js +11 -2
  150. package/dist/containers/Tenant/Diagnostics/Overview/Overview.js.map +1 -1
  151. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/ResourcePoolInfo.scss +24 -0
  152. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/ResourcePoolUsage.d.ts +8 -0
  153. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/ResourcePoolUsage.js +34 -0
  154. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/ResourcePoolUsage.js.map +1 -0
  155. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/i18n/en.json +4 -1
  156. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/i18n/index.d.ts +1 -1
  157. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/index.d.ts +1 -0
  158. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/index.js +1 -0
  159. package/dist/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/index.js.map +1 -1
  160. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.d.ts +2 -1
  161. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.js +12 -3
  162. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.js.map +1 -1
  163. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.d.ts +2 -1
  164. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.js +9 -8
  165. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.js.map +1 -1
  166. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.d.ts +16 -1
  167. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.js +55 -33
  168. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.js.map +1 -1
  169. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/en.json +5 -1
  170. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/index.d.ts +1 -1
  171. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/i18n/en.json +4 -0
  172. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/i18n/index.d.ts +1 -1
  173. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo/prepareColumnTableInfo.js +4 -1
  174. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo/prepareColumnTableInfo.js.map +1 -1
  175. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo/prepareRowTableInfo.js +4 -1
  176. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo/prepareRowTableInfo.js.map +1 -1
  177. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo/prepareTTL.js +41 -3
  178. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo/prepareTTL.js.map +1 -1
  179. package/dist/containers/Tenant/Diagnostics/StreamingQueryGraph/StreamingQueryGraph.d.ts +7 -0
  180. package/dist/containers/Tenant/Diagnostics/StreamingQueryGraph/StreamingQueryGraph.js +38 -0
  181. package/dist/containers/Tenant/Diagnostics/StreamingQueryGraph/StreamingQueryGraph.js.map +1 -0
  182. package/dist/containers/Tenant/Diagnostics/StreamingQueryGraph/StreamingQueryGraph.scss +18 -0
  183. package/dist/containers/Tenant/Diagnostics/StreamingQueryGraph/i18n/en.json +5 -0
  184. package/dist/containers/Tenant/Diagnostics/StreamingQueryGraph/i18n/index.d.ts +2 -0
  185. package/dist/containers/Tenant/Diagnostics/StreamingQueryGraph/i18n/index.js +5 -0
  186. package/dist/containers/Tenant/Diagnostics/StreamingQueryGraph/i18n/index.js.map +1 -0
  187. package/dist/containers/Tenant/Diagnostics/StreamingQueryGraph/index.d.ts +1 -0
  188. package/dist/containers/Tenant/Diagnostics/StreamingQueryGraph/index.js +2 -0
  189. package/dist/containers/Tenant/Diagnostics/StreamingQueryGraph/index.js.map +1 -0
  190. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/i18n/index.d.ts +1 -1
  191. package/dist/containers/Tenant/Diagnostics/i18n/en.json +1 -0
  192. package/dist/containers/Tenant/Diagnostics/i18n/index.d.ts +1 -1
  193. package/dist/containers/Tenant/Diagnostics/tabsContent.js +2 -0
  194. package/dist/containers/Tenant/Diagnostics/tabsContent.js.map +1 -1
  195. package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.d.ts +3 -1
  196. package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.js +3 -3
  197. package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.js.map +1 -1
  198. package/dist/containers/Tenant/Query/QueryEditor/YqlEditor/YqlEditor.js +8 -1
  199. package/dist/containers/Tenant/Query/QueryEditor/YqlEditor/YqlEditor.js.map +1 -1
  200. package/dist/containers/Tenant/TenantDrawerHealthcheck.js +8 -1
  201. package/dist/containers/Tenant/TenantDrawerHealthcheck.js.map +1 -1
  202. package/dist/containers/Tenants/DatabaseDrawerHealthcheck.js +8 -1
  203. package/dist/containers/Tenants/DatabaseDrawerHealthcheck.js.map +1 -1
  204. package/dist/containers/VDiskPage/i18n/index.d.ts +1 -1
  205. package/dist/lib.d.ts +1 -1
  206. package/dist/lib.js.map +1 -1
  207. package/dist/store/configureStore.d.ts +2 -2
  208. package/dist/store/defaultStore.d.ts +1 -1
  209. package/dist/store/reducers/executeTopQueries/executeTopQueries.d.ts +7 -0
  210. package/dist/store/reducers/executeTopQueries/executeTopQueries.js +38 -0
  211. package/dist/store/reducers/executeTopQueries/executeTopQueries.js.map +1 -1
  212. package/dist/store/reducers/header/types.d.ts +1 -1
  213. package/dist/store/reducers/index.d.ts +2 -2
  214. package/dist/store/reducers/pdisk/types.d.ts +1 -0
  215. package/dist/store/reducers/pdisk/utils.js +6 -1
  216. package/dist/store/reducers/pdisk/utils.js.map +1 -1
  217. package/dist/store/reducers/query/parsers/prepareStreamingQueryPlan.d.ts +8 -0
  218. package/dist/store/reducers/query/parsers/prepareStreamingQueryPlan.js +53 -0
  219. package/dist/store/reducers/query/parsers/prepareStreamingQueryPlan.js.map +1 -0
  220. package/dist/store/reducers/storage/prepareGroupsDisks.d.ts +1 -0
  221. package/dist/store/reducers/storage/prepareGroupsDisks.js +7 -18
  222. package/dist/store/reducers/storage/prepareGroupsDisks.js.map +1 -1
  223. package/dist/store/reducers/storage/utils.js +4 -0
  224. package/dist/store/reducers/storage/utils.js.map +1 -1
  225. package/dist/store/reducers/streamingQuery/streamingQuery.d.ts +5 -1
  226. package/dist/store/reducers/streamingQuery/streamingQuery.js +36 -13
  227. package/dist/store/reducers/streamingQuery/streamingQuery.js.map +1 -1
  228. package/dist/store/reducers/tenant/constants.d.ts +1 -0
  229. package/dist/store/reducers/tenant/constants.js +1 -0
  230. package/dist/store/reducers/tenant/constants.js.map +1 -1
  231. package/dist/styles/mixins.scss +22 -0
  232. package/dist/types/api/pdisk.d.ts +4 -0
  233. package/dist/types/api/pdisk.js.map +1 -1
  234. package/dist/types/api/schema/columnEntity.d.ts +2 -1
  235. package/dist/types/api/schema/sysView.d.ts +59 -2
  236. package/dist/types/api/schema/sysView.js +53 -1
  237. package/dist/types/api/schema/sysView.js.map +1 -1
  238. package/dist/types/api/schema/table.d.ts +8 -0
  239. package/dist/types/api/schema/table.js.map +1 -1
  240. package/dist/types/api/vdisk.d.ts +8 -0
  241. package/dist/types/api/vdisk.js +7 -0
  242. package/dist/types/api/vdisk.js.map +1 -1
  243. package/dist/types/store/nodesList.d.ts +4 -2
  244. package/dist/uiFactory/types.d.ts +5 -2
  245. package/dist/utils/bytesParsers/formatBytes.d.ts +3 -1
  246. package/dist/utils/bytesParsers/formatBytes.js +12 -3
  247. package/dist/utils/bytesParsers/formatBytes.js.map +1 -1
  248. package/dist/utils/disks/constants.d.ts +1 -0
  249. package/dist/utils/disks/constants.js +4 -0
  250. package/dist/utils/disks/constants.js.map +1 -1
  251. package/dist/utils/disks/diskInfo/getDiskLocationItems.d.ts +16 -0
  252. package/dist/utils/disks/diskInfo/getDiskLocationItems.js +30 -0
  253. package/dist/utils/disks/diskInfo/getDiskLocationItems.js.map +1 -0
  254. package/dist/utils/disks/diskInfo/i18n/en.json +9 -0
  255. package/dist/utils/disks/diskInfo/i18n/index.d.ts +2 -0
  256. package/dist/utils/disks/diskInfo/i18n/index.js +4 -0
  257. package/dist/utils/disks/diskInfo/i18n/index.js.map +1 -0
  258. package/dist/utils/disks/iconCalculators.d.ts +5 -0
  259. package/dist/utils/disks/iconCalculators.js +1 -1
  260. package/dist/utils/disks/iconCalculators.js.map +1 -1
  261. package/dist/utils/disks/prepareDisks.d.ts +6 -2
  262. package/dist/utils/disks/prepareDisks.js +22 -35
  263. package/dist/utils/disks/prepareDisks.js.map +1 -1
  264. package/dist/utils/disks/types.d.ts +9 -2
  265. package/dist/utils/hooks/useNodeMetadata.d.ts +2 -0
  266. package/dist/utils/hooks/useNodeMetadata.js +15 -0
  267. package/dist/utils/hooks/useNodeMetadata.js.map +1 -0
  268. package/dist/utils/nodes.js +6 -2
  269. package/dist/utils/nodes.js.map +1 -1
  270. package/dist/utils/query.d.ts +1 -0
  271. package/dist/utils/query.js +40 -0
  272. package/dist/utils/query.js.map +1 -1
  273. package/dist/utils/schema.d.ts +6 -2
  274. package/dist/utils/schema.js +14 -4
  275. package/dist/utils/schema.js.map +1 -1
  276. package/dist/utils/storageMetrics.d.ts +2 -2
  277. package/dist/utils/storageMetrics.js +22 -10
  278. package/dist/utils/storageMetrics.js.map +1 -1
  279. package/dist/utils/timeParsers/formatDuration.d.ts +4 -1
  280. package/dist/utils/timeParsers/formatDuration.js +16 -1
  281. package/dist/utils/timeParsers/formatDuration.js.map +1 -1
  282. package/dist/utils/timeParsers/i18n/en.json +5 -1
  283. package/dist/utils/timeParsers/i18n/index.d.ts +1 -1
  284. package/dist/utils/timeParsers/i18n/ru.json +5 -1
  285. package/package.json +2 -2
  286. package/src/components/DiskCapacityInfo/DiskCapacityInfo.tsx +106 -15
  287. package/src/components/DiskPopup/DiskPopup.scss +203 -0
  288. package/src/components/DiskPopup/DiskPopup.tsx +123 -0
  289. package/src/components/DiskPopup/i18n/en.json +3 -0
  290. package/src/components/DiskPopup/i18n/index.ts +5 -0
  291. package/src/components/DiskStatus/DiskStatus.scss +59 -0
  292. package/src/components/DiskStatus/DiskStatus.tsx +149 -0
  293. package/src/components/DiskStatus/i18n/en.json +6 -0
  294. package/src/components/DiskStatus/i18n/index.ts +5 -0
  295. package/src/components/EntityStatus/EntityStatus.tsx +1 -1
  296. package/src/components/EvictVDiskButton/i18n/en.json +1 -1
  297. package/src/components/Graph/GravityGraph.tsx +9 -2
  298. package/src/components/Graph/utils.ts +9 -1
  299. package/src/components/HoverPopup/HoverPopup.tsx +67 -20
  300. package/src/components/HoverPopup/usePopupPriority.ts +39 -0
  301. package/src/components/PDiskInfo/PDiskLogSize.scss +12 -0
  302. package/src/components/PDiskInfo/PDiskLogSize.tsx +37 -0
  303. package/src/components/PDiskInfo/getPDiskDetails.tsx +37 -0
  304. package/src/components/PDiskInfo/i18n/en.json +64 -8
  305. package/src/components/PDiskInfo/statuses.ts +209 -0
  306. package/src/components/PDiskPopup/PDiskPopup.tsx +62 -147
  307. package/src/components/PDiskPopup/i18n/en.json +2 -12
  308. package/src/components/PaginatedTable/rowLookup.ts +35 -10
  309. package/src/components/StorageGroupInfo/StorageGroupInfo.scss +21 -0
  310. package/src/components/StorageGroupInfo/StorageGroupInfo.tsx +121 -260
  311. package/src/components/StorageGroupInfo/i18n/en.json +1 -9
  312. package/src/components/TableKeyboardNavigation/TableKeyboardNavigation.tsx +5 -1
  313. package/src/components/VDisk/VDisk.tsx +31 -34
  314. package/src/components/VDisk/VDiskWithDonorsStack.tsx +2 -0
  315. package/src/components/VDisk/getFlagStatusText.ts +19 -0
  316. package/src/components/VDisk/i18n/en.json +1 -1
  317. package/src/components/VDiskInfo/getVDiskDetails.tsx +41 -0
  318. package/src/components/VDiskInfo/i18n/en.json +3 -10
  319. package/src/components/VDiskPopup/VDiskPopup.scss +3 -10
  320. package/src/components/VDiskPopup/VDiskPopup.tsx +197 -421
  321. package/src/components/VDiskPopup/i18n/en.json +6 -22
  322. package/src/components/VDiskStatus/VDiskReplicationStatus.tsx +77 -0
  323. package/src/components/VDiskStatus/VDiskStatus.scss +32 -0
  324. package/src/components/VDiskStatus/VDiskStatus.tsx +38 -0
  325. package/src/components/VDiskStatus/i18n/en.json +33 -0
  326. package/src/components/VDiskStatus/i18n/index.ts +7 -0
  327. package/src/components/VDiskStatus/index.ts +7 -0
  328. package/src/components/VDiskStatus/statuses.ts +139 -0
  329. package/src/components/capacityMetricsColumns/i18n/en.json +4 -4
  330. package/src/containers/Authentication/Authentication.tsx +29 -34
  331. package/src/containers/Authentication/utils.ts +3 -3
  332. package/src/containers/Cluster/ClusterDrawerHealthcheck.tsx +6 -0
  333. package/src/containers/Clusters/ClusterDrawerHealthcheck.tsx +1 -0
  334. package/src/containers/Header/Header.tsx +11 -3
  335. package/src/containers/Header/StorageGroupLeftControls.tsx +38 -0
  336. package/src/containers/Header/i18n/en.json +3 -1
  337. package/src/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.tsx +13 -2
  338. package/src/containers/Storage/Disks/Disks.tsx +66 -12
  339. package/src/containers/Storage/PDisk/PDisk.tsx +3 -0
  340. package/src/containers/Storage/PaginatedStorageGroupsTable/columns/columns.tsx +24 -3
  341. package/src/containers/Storage/StorageExpertModePanel/components/SpaceLegend.scss +14 -82
  342. package/src/containers/Storage/StorageGroupStateLabel.tsx +22 -0
  343. package/src/containers/Storage/utils/getStorageGroupStateLabel.ts +49 -0
  344. package/src/containers/StorageGroupPage/StorageGroupPage.scss +9 -13
  345. package/src/containers/StorageGroupPage/StorageGroupPage.tsx +53 -25
  346. package/src/containers/StorageGroupPage/i18n/en.json +3 -1
  347. package/src/containers/Tenant/Diagnostics/DiagnosticsPages.ts +6 -1
  348. package/src/containers/Tenant/Diagnostics/Overview/Overview.tsx +22 -2
  349. package/src/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/ResourcePoolInfo.scss +24 -0
  350. package/src/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/ResourcePoolUsage.tsx +53 -0
  351. package/src/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/i18n/en.json +4 -1
  352. package/src/containers/Tenant/Diagnostics/Overview/ResourcePoolInfo/index.ts +1 -0
  353. package/src/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.tsx +19 -2
  354. package/src/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.tsx +11 -10
  355. package/src/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.tsx +79 -34
  356. package/src/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/en.json +5 -1
  357. package/src/containers/Tenant/Diagnostics/Overview/TableInfo/i18n/en.json +4 -0
  358. package/src/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo/prepareColumnTableInfo.tsx +11 -1
  359. package/src/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo/prepareRowTableInfo.tsx +11 -1
  360. package/src/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo/prepareTTL.ts +45 -3
  361. package/src/containers/Tenant/Diagnostics/StreamingQueryGraph/StreamingQueryGraph.scss +18 -0
  362. package/src/containers/Tenant/Diagnostics/StreamingQueryGraph/StreamingQueryGraph.tsx +79 -0
  363. package/src/containers/Tenant/Diagnostics/StreamingQueryGraph/i18n/en.json +5 -0
  364. package/src/containers/Tenant/Diagnostics/StreamingQueryGraph/i18n/index.ts +7 -0
  365. package/src/containers/Tenant/Diagnostics/StreamingQueryGraph/index.ts +1 -0
  366. package/src/containers/Tenant/Diagnostics/i18n/en.json +1 -0
  367. package/src/containers/Tenant/Diagnostics/tabsContent.tsx +4 -0
  368. package/src/containers/Tenant/Healthcheck/components/HealthcheckDrawer.tsx +5 -2
  369. package/src/containers/Tenant/Query/QueryEditor/YqlEditor/YqlEditor.tsx +8 -1
  370. package/src/containers/Tenant/TenantDrawerHealthcheck.tsx +10 -0
  371. package/src/containers/Tenants/DatabaseDrawerHealthcheck.tsx +10 -0
  372. package/src/lib.ts +1 -0
  373. package/src/store/reducers/executeTopQueries/executeTopQueries.ts +46 -0
  374. package/src/store/reducers/header/types.ts +3 -1
  375. package/src/store/reducers/pdisk/types.ts +1 -0
  376. package/src/store/reducers/pdisk/utils.ts +6 -3
  377. package/src/store/reducers/query/parsers/prepareStreamingQueryPlan.ts +74 -0
  378. package/src/store/reducers/storage/prepareGroupsDisks.ts +7 -22
  379. package/src/store/reducers/storage/utils.ts +4 -0
  380. package/src/store/reducers/streamingQuery/streamingQuery.ts +44 -19
  381. package/src/store/reducers/tenant/constants.ts +1 -0
  382. package/src/styles/mixins.scss +22 -0
  383. package/src/types/api/pdisk.ts +4 -0
  384. package/src/types/api/schema/columnEntity.ts +2 -1
  385. package/src/types/api/schema/sysView.ts +60 -37
  386. package/src/types/api/schema/table.ts +7 -0
  387. package/src/types/api/vdisk.ts +9 -0
  388. package/src/types/store/nodesList.ts +7 -7
  389. package/src/uiFactory/types.ts +9 -2
  390. package/src/utils/bytesParsers/formatBytes.ts +23 -4
  391. package/src/utils/disks/constants.ts +5 -0
  392. package/src/utils/disks/diskInfo/getDiskLocationItems.ts +50 -0
  393. package/src/utils/disks/diskInfo/i18n/en.json +9 -0
  394. package/src/utils/disks/diskInfo/i18n/index.ts +5 -0
  395. package/src/utils/disks/iconCalculators.ts +1 -1
  396. package/src/utils/disks/prepareDisks.ts +21 -47
  397. package/src/utils/disks/types.ts +10 -2
  398. package/src/utils/hooks/useNodeMetadata.ts +21 -0
  399. package/src/utils/nodes.ts +6 -1
  400. package/src/utils/query.ts +55 -0
  401. package/src/utils/schema.ts +22 -5
  402. package/src/utils/storageMetrics.ts +27 -14
  403. package/src/utils/timeParsers/formatDuration.ts +22 -1
  404. package/src/utils/timeParsers/i18n/en.json +5 -1
  405. package/src/utils/timeParsers/i18n/ru.json +5 -1
@@ -0,0 +1,79 @@
1
+ import React from 'react';
2
+
3
+ import {Text, useThemeValue} from '@gravity-ui/uikit';
4
+
5
+ import {ResponseError} from '../../../../components/Errors/ResponseError';
6
+ import {Loader} from '../../../../components/Loader';
7
+ import {prepareStreamingQueryPlan} from '../../../../store/reducers/query/parsers/prepareStreamingQueryPlan';
8
+ import {streamingQueriesApi} from '../../../../store/reducers/streamingQuery/streamingQuery';
9
+ import {cn} from '../../../../utils/cn';
10
+ import {getStringifiedData} from '../../../../utils/dataFormatters/dataFormatters';
11
+ import {useAutoRefreshInterval} from '../../../../utils/hooks';
12
+ import {parseIssuesData} from '../../../../utils/query';
13
+ import {ResultIssues} from '../../Query/Issues/Issues';
14
+ import {Graph} from '../../Query/QueryResult/components/Graph/Graph';
15
+
16
+ import i18n from './i18n';
17
+
18
+ import './StreamingQueryGraph.scss';
19
+
20
+ interface StreamingQueryGraphProps {
21
+ database: string;
22
+ path: string;
23
+ }
24
+
25
+ const RUNNING_STATUS = 'RUNNING';
26
+
27
+ const b = cn('ydb-streaming-query-graph');
28
+
29
+ const PLAN_STATE_MESSAGES = {
30
+ empty: 'description_no-plan',
31
+ unparsed: 'description_unparsed-plan',
32
+ unsupported: 'description_unsupported-plan',
33
+ } as const;
34
+
35
+ export function StreamingQueryGraph({database, path}: StreamingQueryGraphProps) {
36
+ const theme = useThemeValue();
37
+ const [autoRefreshInterval] = useAutoRefreshInterval();
38
+
39
+ const {
40
+ currentData: planData,
41
+ isFetching,
42
+ error,
43
+ } = streamingQueriesApi.useGetStreamingQueryPlanQuery(
44
+ {database, path},
45
+ {skip: !database || !path, pollingInterval: autoRefreshInterval},
46
+ );
47
+
48
+ const row = planData?.resultSets?.[0]?.result?.[0];
49
+
50
+ const {state, prepared} = React.useMemo(
51
+ () => prepareStreamingQueryPlan(getStringifiedData(row?.Plan)),
52
+ [row?.Plan],
53
+ );
54
+
55
+ if (isFetching && planData === undefined) {
56
+ return <Loader size="s" className={b('loader')} />;
57
+ }
58
+
59
+ const status = getStringifiedData(row?.Status);
60
+ const issues = parseIssuesData(row?.Issues);
61
+ const showStatus = Boolean(issues) || Boolean(status && status !== RUNNING_STATUS);
62
+
63
+ return (
64
+ <div className={b()}>
65
+ {error ? <ResponseError error={error} /> : null}
66
+ {showStatus ? (
67
+ <div className={b('status')}>
68
+ {status ? <Text variant="subheader-2">{status}</Text> : null}
69
+ {issues ? <ResultIssues data={issues} /> : null}
70
+ </div>
71
+ ) : null}
72
+ {state === 'ready' ? (
73
+ <Graph explain={prepared} theme={theme} />
74
+ ) : (
75
+ <div>{i18n(PLAN_STATE_MESSAGES[state])}</div>
76
+ )}
77
+ </div>
78
+ );
79
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "description_no-plan": "The query has not reported its plan yet.",
3
+ "description_unparsed-plan": "The plan cannot be displayed.",
4
+ "description_unsupported-plan": "The plan version is not supported and cannot be rendered."
5
+ }
@@ -0,0 +1,7 @@
1
+ import {registerKeysets} from '../../../../../utils/i18n';
2
+
3
+ import en from './en.json';
4
+
5
+ const COMPONENT = 'ydb-tenant-diagnostics-streaming-query-graph';
6
+
7
+ export default registerKeysets(COMPONENT, {en});
@@ -0,0 +1 @@
1
+ export {StreamingQueryGraph} from './StreamingQueryGraph';
@@ -15,6 +15,7 @@
15
15
  "title_describe": "Describe",
16
16
  "title_hot-keys": "Hot keys",
17
17
  "title_graph": "Graph",
18
+ "title_computation-graph": "Computation Graph",
18
19
  "title_consumers": "Consumers",
19
20
  "title_partitions": "Partitions",
20
21
  "title_data": "Data",
@@ -19,6 +19,7 @@ import {HotKeys} from './HotKeys/HotKeys';
19
19
  import {NetworkWrapper} from './Network/NetworkWrapper';
20
20
  import {Partitions} from './Partitions/Partitions';
21
21
  import {StorageUsage} from './StorageUsage/StorageUsage';
22
+ import {StreamingQueryGraph} from './StreamingQueryGraph';
22
23
  import {TenantOverview} from './TenantOverview/TenantOverview';
23
24
  import {TopQueries} from './TopQueries/TopQueries';
24
25
  import {TopShards} from './TopShards/TopShards';
@@ -182,6 +183,9 @@ const diagnosticsTabRenderers: Record<TenantDiagnosticsTab, DiagnosticsTabRender
182
183
  database,
183
184
  scrollContainerRef,
184
185
  }),
186
+ [TENANT_DIAGNOSTICS_TABS_IDS.computationGraph]: ({database, path}) => (
187
+ <StreamingQueryGraph database={database} path={path} />
188
+ ),
185
189
  [TENANT_DIAGNOSTICS_TABS_IDS.monitoring]: ({database, databaseFullPath}) => {
186
190
  const content = uiFactory.renderMonitoring?.({database, databaseFullPath});
187
191
 
@@ -9,10 +9,12 @@ import {EnableFullscreenButton} from '../../../../components/EnableFullscreenBut
9
9
  import type {SelfCheckResult} from '../../../../types/api/healthcheck';
10
10
  import {uiFactory} from '../../../../uiFactory/uiFactory';
11
11
  import {createAndDownloadJsonFile} from '../../../../utils/downloadFile';
12
+ import type {HealthcheckAssistantTarget} from '../types';
12
13
 
13
14
  import {HealthcheckDrawerTitle} from './HealthcheckDrawerTitle';
14
15
 
15
16
  interface HealthcheckDrawerProps {
17
+ target?: HealthcheckAssistantTarget;
16
18
  children: React.ReactNode;
17
19
  isDrawerVisible: boolean;
18
20
  onCloseDrawer: () => void;
@@ -29,6 +31,7 @@ interface HealthcheckDrawerProps {
29
31
  }
30
32
 
31
33
  export function HealthcheckDrawer({
34
+ target,
32
35
  children,
33
36
  isDrawerVisible,
34
37
  onCloseDrawer,
@@ -51,11 +54,11 @@ export function HealthcheckDrawer({
51
54
 
52
55
  return (
53
56
  <React.Fragment>
54
- {renderDrawerExtension()}
57
+ {renderDrawerExtension({target})}
55
58
  {renderDrawerContent()}
56
59
  </React.Fragment>
57
60
  );
58
- }, [renderDrawerContent, renderDrawerExtension]);
61
+ }, [renderDrawerContent, renderDrawerExtension, target]);
59
62
 
60
63
  const handleDownload = React.useCallback(
61
64
  (event: React.MouseEvent<HTMLButtonElement>) => {
@@ -119,6 +119,14 @@ export function YqlEditor({
119
119
  const currentStatementCleanupRef = React.useRef<VoidFunction>();
120
120
  const [isEditorMounted, setIsEditorMounted] = React.useState(false);
121
121
 
122
+ React.useEffect(() => {
123
+ // onEditorReady removes the parent's visibility:hidden loading state.
124
+ // Focus after that render commits; focusing during editorDidMount is too early.
125
+ if (isEditorMounted) {
126
+ editorRef.current?.focus();
127
+ }
128
+ }, [isEditorMounted]);
129
+
122
130
  const isMultiTabQueryEditorEnabled = useMultiTabQueryEditorEnabled();
123
131
  const isAutocompleteEnabled = useEventHandler(() => Boolean(enableAutocomplete));
124
132
 
@@ -330,7 +338,6 @@ export function YqlEditor({
330
338
  if (!isMultiTabQueryEditorEnabled) {
331
339
  initUserPrompt(editor, getLastQueryText);
332
340
  }
333
- editor.focus();
334
341
  editor.addAction({
335
342
  id: 'sendQuery',
336
343
  label: i18n('action_send-query'),
@@ -8,6 +8,7 @@ import {useTypedSelector} from '../../utils/hooks';
8
8
 
9
9
  import {Healthcheck} from './Healthcheck/Healthcheck';
10
10
  import {HealthcheckDrawer} from './Healthcheck/components/HealthcheckDrawer';
11
+ import {getDatabaseHealthcheckAssistantTarget} from './Healthcheck/utils';
11
12
  import {useCurrentSchema} from './TenantContext';
12
13
  import i18n from './i18n';
13
14
  import {useTenantQueryParams} from './useTenantQueryParams';
@@ -46,6 +47,15 @@ export function TenantDrawerHealthcheck({children, clusterName}: TenantDrawerHea
46
47
 
47
48
  return (
48
49
  <HealthcheckDrawer
50
+ target={
51
+ database
52
+ ? getDatabaseHealthcheckAssistantTarget({
53
+ database,
54
+ clusterName,
55
+ scope: 'database',
56
+ })
57
+ : undefined
58
+ }
49
59
  isDrawerVisible={Boolean(showHealthcheck)}
50
60
  onCloseDrawer={handleCloseDrawer}
51
61
  renderDrawerContent={renderDrawerContent}
@@ -8,6 +8,7 @@ import type {PreparedTenant} from '../../store/reducers/tenants/types';
8
8
  import {useTypedSelector} from '../../utils/hooks';
9
9
  import {Healthcheck} from '../Tenant/Healthcheck/Healthcheck';
10
10
  import {HealthcheckDrawer} from '../Tenant/Healthcheck/components/HealthcheckDrawer';
11
+ import {getDatabaseHealthcheckAssistantTarget} from '../Tenant/Healthcheck/utils';
11
12
  import tenantI18n from '../Tenant/i18n';
12
13
  import {useTenantQueryParams} from '../Tenant/useTenantQueryParams';
13
14
 
@@ -78,6 +79,15 @@ export function DatabaseDrawerHealthcheck({children, clusterName}: DatabaseDrawe
78
79
 
79
80
  return (
80
81
  <HealthcheckDrawer
82
+ target={
83
+ database
84
+ ? getDatabaseHealthcheckAssistantTarget({
85
+ database,
86
+ clusterName: selectedClusterName,
87
+ scope: 'database',
88
+ })
89
+ : undefined
90
+ }
81
91
  isDrawerVisible={Boolean(database)}
82
92
  onCloseDrawer={handleCloseDrawer}
83
93
  renderDrawerContent={renderDrawerContent}
package/src/lib.ts CHANGED
@@ -46,6 +46,7 @@ export type {
46
46
  IllustrationComponent,
47
47
  IllustrationName,
48
48
  RenderHealthcheckAssistantAction,
49
+ HealthcheckDrawerExtensionProps,
49
50
  } from './uiFactory/types';
50
51
  export type {
51
52
  HealthcheckAssistantActionProps,
@@ -106,6 +106,17 @@ WHERE Query NOT LIKE '%${QUERY_TECHNICAL_MARK}%'
106
106
  AND QueryStartAt is not null`;
107
107
  }
108
108
 
109
+ function getRunningQueriesByPoolText(poolName: string) {
110
+ const escapedPoolName = poolName.replace(/'/g, "''");
111
+ return `${QUERY_TECHNICAL_MARK}
112
+ SELECT
113
+ COUNT_IF(State = 'EXECUTING' AND (WmState IS NULL OR WmState NOT IN ('PENDING', 'DELAYED'))) as RunningQueriesCount,
114
+ COUNT_IF(State = 'QUEUED' OR WmState = 'PENDING' OR WmState = 'DELAYED') as QueuedQueriesCount
115
+ FROM \`.sys/query_sessions\`
116
+ WHERE Query NOT LIKE '%${QUERY_TECHNICAL_MARK}%'
117
+ AND WmPoolId = '${escapedPoolName}'`;
118
+ }
119
+
109
120
  interface QueriesRequestParams {
110
121
  database: string;
111
122
  filters?: TopQueriesFilters;
@@ -233,6 +244,41 @@ export const topQueriesApi = api.injectEndpoints({
233
244
  },
234
245
  providesTags: ['All'],
235
246
  }),
247
+ getRunningQueriesByPool: build.query({
248
+ queryFn: async (
249
+ {database, poolName}: {database: string; poolName: string},
250
+ {signal},
251
+ ) => {
252
+ try {
253
+ const response = await window.api.viewer.sendQuery(
254
+ {
255
+ query: getRunningQueriesByPoolText(poolName),
256
+ database,
257
+ action: 'execute-query',
258
+ internal_call: true,
259
+ },
260
+ {signal, withRetries: true},
261
+ );
262
+
263
+ if (isQueryErrorResponse(response)) {
264
+ throw response;
265
+ }
266
+
267
+ const data = parseQueryAPIResponse(response);
268
+ const row = data?.resultSets?.[0]?.result?.[0];
269
+
270
+ return {
271
+ data: {
272
+ runningQueriesCount: Number(row?.RunningQueriesCount) || 0,
273
+ queuedQueriesCount: Number(row?.QueuedQueriesCount) || 0,
274
+ },
275
+ };
276
+ } catch (error) {
277
+ return {error};
278
+ }
279
+ },
280
+ providesTags: ['All'],
281
+ }),
236
282
  }),
237
283
  overrideExisting: 'throw',
238
284
  });
@@ -76,7 +76,9 @@ export type PageBreadcrumbsOptions<T extends Page = undefined> = T extends 'home
76
76
  ? NodeBreadcrumbsOptions
77
77
  : T extends 'tablet'
78
78
  ? TabletBreadcrumbsOptions
79
- : {};
79
+ : T extends 'storageGroup'
80
+ ? StorageGroupBreadcrumbsOptions
81
+ : {};
80
82
 
81
83
  export interface HeaderState {
82
84
  page?: Page;
@@ -5,6 +5,7 @@ export interface PDiskData extends PreparedPDisk {
5
5
  NodeHost?: string;
6
6
  NodeType?: string;
7
7
  NodeDC?: string;
8
+ NodeRack?: string;
8
9
  SlotItems?: (SlotItem<'vDisk'> | SlotItem<'log'> | SlotItem<'empty'>)[];
9
10
  }
10
11
 
@@ -62,9 +62,11 @@ export function preparePDiskDataResponse([pdiskResponse = {}, nodeResponse]: [
62
62
  };
63
63
  }
64
64
 
65
- const preparedVDisks = WhiteboardVDisksData.map((disk) =>
66
- prepareWhiteboardVDiskData({...disk, NodeId}),
67
- );
65
+ const preparedVDisks = WhiteboardVDisksData.map((disk) => ({
66
+ ...prepareWhiteboardVDiskData({...disk, NodeId}),
67
+ PDiskType: preparedPDisk.Type,
68
+ PDiskPath: preparedPDisk.Path,
69
+ }));
68
70
 
69
71
  setDonorRecipientReferences((cb) => {
70
72
  for (const vDisk of preparedVDisks) {
@@ -145,6 +147,7 @@ export function preparePDiskDataResponse([pdiskResponse = {}, nodeResponse]: [
145
147
  NodeHost: preparedNode.Host,
146
148
  NodeType: preparedNode.Roles?.[0],
147
149
  NodeDC: preparedNode.DC,
150
+ NodeRack: preparedNode.Rack,
148
151
  SlotItems: diskSlots,
149
152
  };
150
153
  }
@@ -0,0 +1,74 @@
1
+ import type {QueryPlan} from '../../../../types/api/query';
2
+ import type {PreparedQueryData} from '../types';
3
+
4
+ import {preparePlanData} from './preparePlanData';
5
+
6
+ // empty: nothing has been published yet; unparsed: a plan arrived but cannot be read,
7
+ // for instance truncated by the backend; unsupported: a readable plan of an unknown version.
8
+ export type StreamingQueryPlanState = 'empty' | 'unparsed' | 'unsupported' | 'ready';
9
+
10
+ interface StreamingQueryPlan {
11
+ state: StreamingQueryPlanState;
12
+ prepared?: PreparedQueryData['preparedPlan'];
13
+ }
14
+
15
+ function isObject(value: unknown): value is Record<string, unknown> {
16
+ return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
17
+ }
18
+
19
+ function isPlanNode(value: unknown) {
20
+ return isObject(value) && typeof value['Node Type'] === 'string';
21
+ }
22
+
23
+ function isStringList(value: unknown) {
24
+ return (
25
+ value === undefined || (Array.isArray(value) && value.every((i) => typeof i === 'string'))
26
+ );
27
+ }
28
+
29
+ // The graph blocks render these fields directly, so anything else would throw while drawing.
30
+ function isRenderable(prepared: PreparedQueryData['preparedPlan']) {
31
+ return (prepared?.nodes ?? []).every(({data}) => {
32
+ return (
33
+ (data?.id === undefined || typeof data.id === 'number') &&
34
+ (data?.name === undefined || typeof data.name === 'string') &&
35
+ isStringList(data?.operators) &&
36
+ isStringList(data?.tables)
37
+ );
38
+ });
39
+ }
40
+
41
+ export function prepareStreamingQueryPlan(planText?: string): StreamingQueryPlan {
42
+ if (!planText) {
43
+ return {state: 'empty'};
44
+ }
45
+
46
+ let parsed: unknown;
47
+ try {
48
+ parsed = JSON.parse(planText);
49
+ } catch {
50
+ return {state: 'unparsed'};
51
+ }
52
+
53
+ if (!isObject(parsed) || !isObject(parsed.meta)) {
54
+ return {state: 'empty'};
55
+ }
56
+ if (!parsed.Plan) {
57
+ return {state: 'empty'};
58
+ }
59
+ if (!isPlanNode(parsed.Plan)) {
60
+ return {state: 'unparsed'};
61
+ }
62
+
63
+ try {
64
+ const {simplifiedPlan: _simplifiedPlan, ...prepared} = preparePlanData(
65
+ parsed as unknown as QueryPlan,
66
+ );
67
+ if (!isRenderable(prepared)) {
68
+ return {state: 'unparsed'};
69
+ }
70
+ return prepared.nodes?.length ? {state: 'ready', prepared} : {state: 'unsupported'};
71
+ } catch {
72
+ return {state: 'unparsed'};
73
+ }
74
+ }
@@ -32,31 +32,14 @@ export function prepareGroupsVDisk(data: TStorageVDisk = {}): PreparedVDisk {
32
32
  SlotSize: PDisk?.SlotSize,
33
33
  });
34
34
 
35
- const whiteboardAllocatedSize = parseOptionalNonNegativeNumber(whiteboardVDisk.AllocatedSize);
36
- const whiteboardAvailableSize = parseOptionalNonNegativeNumber(whiteboardVDisk.AvailableSize);
37
- const whiteboardSlotSize = parseOptionalNonNegativeNumber(
38
- PDisk?.Whiteboard?.EnforcedDynamicSlotSize,
39
- );
40
- const whiteboardSizeFields =
35
+ const WhiteboardSize =
41
36
  hasWhiteboardData && data.Whiteboard
42
37
  ? prepareVDiskSizeFields({
43
- AvailableSize: whiteboardAvailableSize,
44
- AllocatedSize: whiteboardAllocatedSize,
45
- SlotSize: whiteboardSlotSize,
46
- })
38
+ AvailableSize: whiteboardVDisk.AvailableSize,
39
+ AllocatedSize: whiteboardVDisk.AllocatedSize,
40
+ SlotSize: PDisk?.Whiteboard?.EnforcedDynamicSlotSize,
41
+ }).DisplaySize
47
42
  : undefined;
48
- const WhiteboardSize = whiteboardSizeFields
49
- ? {
50
- AllocatedSize:
51
- whiteboardAllocatedSize === undefined
52
- ? undefined
53
- : whiteboardSizeFields.AllocatedSize,
54
- SizeLimit:
55
- whiteboardAvailableSize === undefined && whiteboardSlotSize === undefined
56
- ? undefined
57
- : whiteboardSizeFields.SizeLimit,
58
- }
59
- : undefined;
60
43
 
61
44
  const preparedDonors = bscVDisk.Donors?.map((donor) => {
62
45
  const preparedDonor = prepareGroupsVDisk(donor);
@@ -77,6 +60,8 @@ export function prepareGroupsVDisk(data: TStorageVDisk = {}): PreparedVDisk {
77
60
  HasWhiteboardData: hasWhiteboardData,
78
61
  ...(WhiteboardSize ? {WhiteboardSize} : {}),
79
62
  PDisk: preparedPDisk,
63
+ PDiskType: preparedPDisk.Type,
64
+ PDiskPath: preparedPDisk.Path,
80
65
  Donors: preparedDonors,
81
66
  PDiskId,
82
67
  StringifiedId,
@@ -88,10 +88,14 @@ const prepareStorageNodeData = (
88
88
  pDisk.Realtime !== undefined);
89
89
  return prepareWhiteboardPDiskData({...pDisk, NodeId}, hasWhiteboardData ? pDisk : null);
90
90
  });
91
+ const pDisksById = new Map(pDisks?.map((pDisk) => [pDisk.PDiskId, pDisk]));
91
92
  const vDisks = VDisks?.map((vDisk) => {
93
+ const pDisk = vDisk.PDiskId === undefined ? undefined : pDisksById.get(vDisk.PDiskId);
92
94
  return {
93
95
  ...prepareWhiteboardVDiskData({...vDisk, VDiskId: vDisk.VDiskId}),
94
96
  NodeId,
97
+ PDiskType: pDisk?.Type,
98
+ PDiskPath: pDisk?.Path,
95
99
  };
96
100
  });
97
101
 
@@ -3,38 +3,63 @@ import {isQueryErrorResponse, parseQueryAPIResponse} from '../../../utils/query'
3
3
  import {api} from '../api';
4
4
 
5
5
  function getStreamingQueryInfoSQL(path: string) {
6
+ // Select available columns so older backends without lifecycle fields remain supported.
7
+ const safePath = path.replace(/'/g, "''");
8
+ return `${QUERY_TECHNICAL_MARK}
9
+ SELECT * WITHOUT Plan, Ast
10
+ FROM \`.sys/streaming_queries\`
11
+ WHERE Path = '${safePath}'
12
+ LIMIT 1`;
13
+ }
14
+
15
+ function getStreamingQueryPlanSQL(path: string) {
6
16
  const safePath = path.replace(/'/g, "''");
7
17
  return `${QUERY_TECHNICAL_MARK}
8
18
  SELECT
9
- Status AS State,
10
- Issues AS Error,
11
- Text
19
+ Status,
20
+ Issues,
21
+ Plan
12
22
  FROM \`.sys/streaming_queries\`
13
23
  WHERE Path = '${safePath}'
14
24
  LIMIT 1`;
15
25
  }
16
26
 
27
+ async function execStreamingSQL(
28
+ sql: string,
29
+ {database, signal}: {database: string; signal: AbortSignal},
30
+ ) {
31
+ const response = await window.api.viewer.sendQuery(
32
+ {query: sql, database, action: 'execute-query', internal_call: true},
33
+ {signal, withRetries: true},
34
+ );
35
+ if (isQueryErrorResponse(response)) {
36
+ return {error: response};
37
+ }
38
+ return {data: parseQueryAPIResponse(response)};
39
+ }
40
+
17
41
  export const streamingQueriesApi = api.injectEndpoints({
18
42
  endpoints: (build) => ({
19
43
  getStreamingQueryInfo: build.query({
20
44
  queryFn: async ({database, path}: {database: string; path: string}, {signal}) => {
21
45
  try {
22
- const response = await window.api.viewer.sendQuery(
23
- {
24
- query: getStreamingQueryInfoSQL(path),
25
- database,
26
- action: 'execute-query',
27
- internal_call: true,
28
- },
29
- {signal, withRetries: true},
30
- );
31
-
32
- if (isQueryErrorResponse(response)) {
33
- return {error: response};
34
- }
35
-
36
- const data = parseQueryAPIResponse(response);
37
- return {data};
46
+ return await execStreamingSQL(getStreamingQueryInfoSQL(path), {
47
+ database,
48
+ signal,
49
+ });
50
+ } catch (error) {
51
+ return {error};
52
+ }
53
+ },
54
+ providesTags: ['All'],
55
+ }),
56
+ getStreamingQueryPlan: build.query({
57
+ queryFn: async ({database, path}: {database: string; path: string}, {signal}) => {
58
+ try {
59
+ return await execStreamingSQL(getStreamingQueryPlanSQL(path), {
60
+ database,
61
+ signal,
62
+ });
38
63
  } catch (error) {
39
64
  return {error};
40
65
  }
@@ -37,6 +37,7 @@ export const TENANT_DIAGNOSTICS_TABS_IDS = {
37
37
  access: 'access',
38
38
  backups: 'backups',
39
39
  monitoring: 'monitoring',
40
+ computationGraph: 'computationGraph',
40
41
  } as const;
41
42
 
42
43
  export const TENANT_SUMMARY_TABS_IDS = {
@@ -9,6 +9,28 @@
9
9
  }
10
10
  }
11
11
 
12
+ @mixin capacity-alert-label-colors($color) {
13
+ background-color: var(--ydb-capacity-alert-label-background);
14
+
15
+ @if $color == 'green' {
16
+ --ydb-capacity-alert-label-background: var(--g-color-base-positive-light);
17
+
18
+ color: var(--g-color-text-positive-heavy);
19
+ } @else if $color == 'yellow' {
20
+ --ydb-capacity-alert-label-background: var(--g-color-base-warning-light);
21
+
22
+ color: var(--g-color-text-warning-heavy);
23
+ } @else if $color == 'red' {
24
+ --ydb-capacity-alert-label-background: var(--g-color-base-danger-light);
25
+
26
+ color: var(--g-color-base-danger-heavy);
27
+ } @else {
28
+ --ydb-capacity-alert-label-background: var(--ydb-space-#{$color}-bg);
29
+
30
+ color: var(--ydb-space-#{$color}-text);
31
+ }
32
+ }
33
+
12
34
  @mixin container() {
13
35
  max-width: 1170px;
14
36
  margin: 0 auto;
@@ -56,6 +56,10 @@ export interface TPDiskStateInfo {
56
56
  /** float; percent in the 0..100 scale. */
57
57
  PDiskUsage?: number;
58
58
  PDiskCapacityAlert?: ECapacityAlert | string;
59
+ /** Added by viewer from the BlobStorage controller system view. */
60
+ Status?: EDriveStatus;
61
+ DecommitStatus?: EDecommitStatus;
62
+ MaintenanceStatus?: EMaintenanceStatus;
59
63
  }
60
64
 
61
65
  export enum TPDiskState {
@@ -1,5 +1,5 @@
1
1
  import type {EColumnCodec, EUnit, TPathID, TStorageSettings, TTypeInfo} from './shared';
2
- import type {TFamilyDescription} from './table';
2
+ import type {TFamilyDescription, TTTLTier} from './table';
3
3
 
4
4
  export interface TColumnTableDescription {
5
5
  Name?: string;
@@ -71,6 +71,7 @@ interface TTtl {
71
71
  ExpireAfterBytes?: string;
72
72
 
73
73
  ColumnUnit?: EUnit;
74
+ Tiers?: TTTLTier[];
74
75
  }
75
76
 
76
77
  interface TColumnTableSchema {