ydb-embedded-ui 6.11.0 → 6.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (405) hide show
  1. package/dist/components/AutoRefreshControl/i18n/index.d.ts +1 -1
  2. package/dist/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.d.ts +3 -2
  3. package/dist/components/ButtonWithConfirmDialog/ButtonWithConfirmDialog.js +9 -5
  4. package/dist/components/CriticalActionDialog/CriticalActionDialog.d.ts +5 -3
  5. package/dist/components/CriticalActionDialog/CriticalActionDialog.js +8 -7
  6. package/dist/components/CriticalActionDialog/CriticalActionDialog.scss +1 -1
  7. package/dist/components/CriticalActionDialog/i18n/en.json +1 -0
  8. package/dist/components/CriticalActionDialog/i18n/index.d.ts +1 -1
  9. package/dist/components/DateRange/DateRange.d.ts +4 -4
  10. package/dist/components/DateRange/DateRange.js +23 -26
  11. package/dist/components/DateRange/DateRange.scss +14 -13
  12. package/dist/components/DateRange/__test__/fromDateRangeValues.test.js +80 -0
  13. package/dist/components/DateRange/__test__/getdatePickerSize.test.d.ts +1 -0
  14. package/dist/components/DateRange/__test__/getdatePickerSize.test.js +56 -0
  15. package/dist/components/DateRange/__test__/toDateRangeValues.test.d.ts +1 -0
  16. package/dist/components/DateRange/__test__/toDateRangeValues.test.js +80 -0
  17. package/dist/components/DateRange/i18n/en.json +4 -0
  18. package/dist/components/DateRange/i18n/index.d.ts +2 -0
  19. package/dist/components/DateRange/i18n/index.js +5 -0
  20. package/dist/components/DateRange/i18n/ru.json +4 -0
  21. package/dist/components/DateRange/utils.d.ts +5 -0
  22. package/dist/components/DateRange/utils.js +41 -0
  23. package/dist/components/DeveloperUILinkButton/DeveloperUILinkButton.d.ts +8 -0
  24. package/dist/components/{DeveloperUiLink/DeveloperUiLink.js → DeveloperUILinkButton/DeveloperUILinkButton.js} +3 -3
  25. package/dist/components/{DeveloperUiLink/DeveloperUiLink.scss → DeveloperUILinkButton/DeveloperUILinkButton.scss} +3 -2
  26. package/dist/components/DiskStateProgressBar/DiskStateProgressBar.d.ts +6 -1
  27. package/dist/components/DiskStateProgressBar/DiskStateProgressBar.js +22 -12
  28. package/dist/components/DiskStateProgressBar/DiskStateProgressBar.scss +45 -45
  29. package/dist/components/EntityStatus/EntityStatus.js +1 -1
  30. package/dist/components/EntityStatus/EntityStatus.scss +6 -2
  31. package/dist/components/Errors/PageError/PageError.d.ts +11 -0
  32. package/dist/components/Errors/PageError/PageError.js +19 -0
  33. package/dist/components/Errors/i18n/en.json +2 -1
  34. package/dist/components/Errors/i18n/index.d.ts +1 -1
  35. package/dist/components/Errors/i18n/ru.json +2 -1
  36. package/dist/components/Fullscreen/Fullscreen.d.ts +1 -1
  37. package/dist/components/Fullscreen/Fullscreen.js +34 -27
  38. package/dist/components/Fullscreen/Fullscreen.scss +16 -8
  39. package/dist/components/Graph/Graph.d.ts +13 -0
  40. package/dist/components/Graph/Graph.js +41 -0
  41. package/dist/components/LabelWithPopover/LabelWithPopover.d.ts +4 -1
  42. package/dist/components/LabelWithPopover/LabelWithPopover.js +1 -1
  43. package/dist/components/Loader/Loader.d.ts +2 -1
  44. package/dist/components/Loader/Loader.js +6 -1
  45. package/dist/components/LoaderWrapper/LoaderWrapper.d.ts +10 -0
  46. package/dist/components/LoaderWrapper/LoaderWrapper.js +8 -0
  47. package/dist/components/MetricChart/reducer.d.ts +2 -2
  48. package/dist/components/MonacoEditor/MonacoEditor.js +0 -2
  49. package/dist/components/NodeHostWrapper/NodeHostWrapper.d.ts +0 -1
  50. package/dist/components/NodeHostWrapper/NodeHostWrapper.js +3 -6
  51. package/dist/components/PDiskInfo/PDiskInfo.d.ts +8 -5
  52. package/dist/components/PDiskInfo/PDiskInfo.js +76 -26
  53. package/dist/components/PDiskInfo/PDiskInfo.scss +15 -1
  54. package/dist/components/PDiskInfo/i18n/en.json +11 -5
  55. package/dist/components/PDiskInfo/i18n/index.d.ts +1 -1
  56. package/dist/components/PDiskPopup/PDiskPopup.js +8 -2
  57. package/dist/components/ProgressViewer/ProgressViewer.js +3 -0
  58. package/dist/components/QueryExecutionStatus/QueryExecutionStatus.js +13 -3
  59. package/dist/components/QueryExecutionStatus/QueryExecutionStatus.scss +4 -0
  60. package/dist/components/QuerySettingsDescription/QuerySettingsDescription.d.ts +7 -0
  61. package/dist/components/QuerySettingsDescription/QuerySettingsDescription.js +8 -0
  62. package/dist/components/QuerySettingsDescription/QuerySettingsDescription.scss +8 -0
  63. package/dist/components/QuerySettingsDescription/index.d.ts +1 -0
  64. package/dist/components/QuerySettingsDescription/index.js +1 -0
  65. package/dist/components/VDisk/VDisk.js +3 -4
  66. package/dist/components/VDiskInfo/VDiskInfo.d.ts +4 -3
  67. package/dist/components/VDiskInfo/VDiskInfo.js +12 -5
  68. package/dist/components/VDiskInfo/VDiskInfo.scss +7 -1
  69. package/dist/components/VDiskInfo/i18n/en.json +2 -1
  70. package/dist/components/VDiskInfo/i18n/index.d.ts +1 -1
  71. package/dist/containers/App/Content.js +15 -19
  72. package/dist/containers/AsideNavigation/AsideNavigation.js +2 -1
  73. package/dist/containers/AsideNavigation/YdbInternalUser/YdbInternalUser.js +4 -4
  74. package/dist/containers/Authentication/Authentication.js +8 -10
  75. package/dist/containers/Authentication/utils.d.ts +8 -0
  76. package/dist/containers/Authentication/utils.js +15 -0
  77. package/dist/containers/Cluster/Cluster.scss +1 -4
  78. package/dist/containers/Cluster/ClusterInfo/ClusterInfo.js +6 -6
  79. package/dist/containers/Cluster/ClusterInfo/ClusterInfo.scss +1 -1
  80. package/dist/containers/Clusters/constants.d.ts +1 -1
  81. package/dist/containers/Heatmap/Heatmap.d.ts +2 -1
  82. package/dist/containers/Heatmap/Heatmap.js +7 -6
  83. package/dist/containers/Node/Node.js +5 -7
  84. package/dist/containers/Node/Node.scss +5 -4
  85. package/dist/containers/Node/NodeStructure/NodeStructure.js +4 -4
  86. package/dist/containers/Node/NodeStructure/NodeStructure.scss +4 -20
  87. package/dist/containers/Node/NodeStructure/Pdisk.js +3 -3
  88. package/dist/containers/Nodes/Nodes.js +6 -8
  89. package/dist/containers/Nodes/getNodesColumns.js +6 -21
  90. package/dist/containers/PDiskPage/PDiskGroups/PDiskGroups.d.ts +6 -0
  91. package/dist/containers/PDiskPage/PDiskGroups/PDiskGroups.js +24 -0
  92. package/dist/containers/PDiskPage/PDiskPage.js +79 -30
  93. package/dist/containers/PDiskPage/PDiskPage.scss +8 -5
  94. package/dist/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.d.ts +7 -0
  95. package/dist/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.js +93 -0
  96. package/dist/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.scss +52 -0
  97. package/dist/containers/PDiskPage/PDiskSpaceDistribution/utils.d.ts +4 -0
  98. package/dist/containers/PDiskPage/PDiskSpaceDistribution/utils.js +9 -0
  99. package/dist/containers/PDiskPage/i18n/en.json +9 -1
  100. package/dist/containers/PDiskPage/i18n/index.d.ts +1 -1
  101. package/dist/containers/Storage/PDisk/PDisk.js +3 -4
  102. package/dist/containers/Storage/Storage.js +4 -6
  103. package/dist/containers/Storage/StorageGroups/getStorageGroupsColumns.js +16 -6
  104. package/dist/containers/Tablet/Tablet.js +2 -2
  105. package/dist/containers/Tablet/TabletControls/TabletControls.js +2 -1
  106. package/dist/containers/Tablets/Tablets.js +14 -13
  107. package/dist/containers/Tenant/Acl/Acl.d.ts +2 -1
  108. package/dist/containers/Tenant/Acl/Acl.js +10 -8
  109. package/dist/containers/Tenant/Acl/Acl.scss +8 -8
  110. package/dist/containers/Tenant/Acl/i18n/en.json +6 -0
  111. package/dist/containers/Tenant/Acl/i18n/index.d.ts +2 -0
  112. package/dist/containers/Tenant/Acl/i18n/index.js +4 -0
  113. package/dist/containers/Tenant/Diagnostics/Consumers/Consumers.js +2 -5
  114. package/dist/containers/Tenant/Diagnostics/Describe/Describe.d.ts +2 -1
  115. package/dist/containers/Tenant/Diagnostics/Describe/Describe.js +14 -17
  116. package/dist/containers/Tenant/Diagnostics/DetailedOverview/DetailedOverview.js +1 -1
  117. package/dist/containers/Tenant/Diagnostics/DetailedOverview/DetailedOverview.scss +1 -0
  118. package/dist/containers/Tenant/Diagnostics/Diagnostics.js +3 -3
  119. package/dist/containers/Tenant/Diagnostics/Diagnostics.scss +3 -1
  120. package/dist/containers/Tenant/Diagnostics/HotKeys/HotKeys.d.ts +2 -1
  121. package/dist/containers/Tenant/Diagnostics/HotKeys/HotKeys.js +3 -3
  122. package/dist/containers/Tenant/Diagnostics/Network/Network.js +8 -11
  123. package/dist/containers/Tenant/Diagnostics/Network/Network.scss +1 -0
  124. package/dist/containers/Tenant/Diagnostics/Overview/Overview.d.ts +2 -2
  125. package/dist/containers/Tenant/Diagnostics/Overview/Overview.js +8 -10
  126. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/i18n/en.json +14 -1
  127. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/i18n/index.d.ts +1 -1
  128. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/i18n/index.js +1 -2
  129. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo.js +36 -17
  130. package/dist/containers/Tenant/Diagnostics/Overview/TopicStats/TopicStats.js +3 -4
  131. package/dist/containers/Tenant/Diagnostics/Partitions/Partitions.js +1 -4
  132. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopQueries.js +8 -5
  133. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.js +1 -1
  134. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverviewTableLayout.js +3 -3
  135. package/dist/containers/Tenant/Diagnostics/TenantOverview/getSectionTitle.d.ts +2 -1
  136. package/dist/containers/Tenant/Diagnostics/TenantOverview/getSectionTitle.js +2 -2
  137. package/dist/containers/Tenant/Diagnostics/TenantOverview/i18n/en.json +3 -2
  138. package/dist/containers/Tenant/Diagnostics/TenantOverview/i18n/index.d.ts +1 -1
  139. package/dist/containers/Tenant/Diagnostics/TopQueries/TopQueries.js +6 -5
  140. package/dist/containers/Tenant/Diagnostics/TopQueries/getTopQueriesColumns.d.ts +2 -2
  141. package/dist/containers/Tenant/Diagnostics/TopQueries/getTopQueriesColumns.js +14 -14
  142. package/dist/containers/Tenant/Diagnostics/TopShards/TopShards.js +7 -6
  143. package/dist/containers/Tenant/Diagnostics/TopShards/getTopShardsColumns.js +4 -4
  144. package/dist/containers/Tenant/ObjectSummary/ObjectSummary.js +31 -18
  145. package/dist/containers/Tenant/Query/ExecuteResult/ExecuteResult.d.ts +2 -2
  146. package/dist/containers/Tenant/Query/ExecuteResult/ExecuteResult.js +56 -20
  147. package/dist/containers/Tenant/Query/ExecuteResult/ExecuteResult.scss +10 -6
  148. package/dist/containers/Tenant/Query/ExecuteResult/i18n/en.json +7 -0
  149. package/dist/containers/Tenant/Query/ExecuteResult/i18n/index.d.ts +2 -0
  150. package/dist/containers/Tenant/Query/ExecuteResult/i18n/index.js +4 -0
  151. package/dist/containers/Tenant/Query/ExecuteResult/utils.d.ts +18 -0
  152. package/dist/containers/Tenant/Query/ExecuteResult/utils.js +36 -0
  153. package/dist/containers/Tenant/Query/ExplainResult/ExplainResult.d.ts +23 -1
  154. package/dist/containers/Tenant/Query/ExplainResult/ExplainResult.js +56 -111
  155. package/dist/containers/Tenant/Query/ExplainResult/ExplainResult.scss +1 -30
  156. package/dist/containers/Tenant/Query/ExplainResult/components/Ast/Ast.d.ts +7 -0
  157. package/dist/containers/Tenant/Query/ExplainResult/components/Ast/Ast.js +18 -0
  158. package/dist/containers/Tenant/Query/ExplainResult/components/Ast/Ast.scss +8 -0
  159. package/dist/containers/Tenant/Query/ExplainResult/components/Graph/Graph.d.ts +8 -0
  160. package/dist/containers/Tenant/Query/ExplainResult/components/Graph/Graph.js +14 -0
  161. package/dist/containers/Tenant/Query/ExplainResult/components/Graph/Graph.scss +14 -0
  162. package/dist/containers/Tenant/Query/ExplainResult/components/SimplifiedPlan/MetricsCell.d.ts +6 -0
  163. package/dist/containers/Tenant/Query/ExplainResult/components/SimplifiedPlan/MetricsCell.js +11 -0
  164. package/dist/containers/Tenant/Query/ExplainResult/components/SimplifiedPlan/OperationCell.d.ts +13 -0
  165. package/dist/containers/Tenant/Query/ExplainResult/components/SimplifiedPlan/OperationCell.js +48 -0
  166. package/dist/containers/Tenant/Query/ExplainResult/components/SimplifiedPlan/OperationParams.d.ts +6 -0
  167. package/dist/containers/Tenant/Query/ExplainResult/components/SimplifiedPlan/OperationParams.js +66 -0
  168. package/dist/containers/Tenant/Query/ExplainResult/components/SimplifiedPlan/SimplifiedPlan.d.ts +7 -0
  169. package/dist/containers/Tenant/Query/ExplainResult/components/SimplifiedPlan/SimplifiedPlan.js +100 -0
  170. package/dist/containers/Tenant/Query/ExplainResult/components/SimplifiedPlan/SimplifiedPlan.scss +128 -0
  171. package/dist/containers/Tenant/Query/ExplainResult/components/SimplifiedPlan/types.d.ts +5 -0
  172. package/dist/containers/Tenant/Query/ExplainResult/components/SimplifiedPlan/types.js +1 -0
  173. package/dist/containers/Tenant/Query/ExplainResult/components/SimplifiedPlan/utils.d.ts +5 -0
  174. package/dist/containers/Tenant/Query/ExplainResult/components/SimplifiedPlan/utils.js +59 -0
  175. package/dist/containers/Tenant/Query/ExplainResult/components/TextExplain/TextExplain.d.ts +8 -0
  176. package/dist/containers/Tenant/Query/ExplainResult/components/TextExplain/TextExplain.js +11 -0
  177. package/dist/containers/Tenant/Query/ExplainResult/components/TextExplain/TextExplain.scss +14 -0
  178. package/dist/containers/Tenant/Query/ExplainResult/i18n/en.json +8 -0
  179. package/dist/containers/Tenant/Query/ExplainResult/i18n/index.d.ts +2 -0
  180. package/dist/containers/Tenant/Query/ExplainResult/i18n/index.js +4 -0
  181. package/dist/containers/Tenant/Query/Preview/Preview.js +2 -3
  182. package/dist/containers/Tenant/Query/QueriesHistory/QueriesHistory.js +1 -19
  183. package/dist/containers/Tenant/Query/QueryDuration/QueryDuration.js +1 -1
  184. package/dist/containers/Tenant/Query/QueryDuration/QueryDuration.scss +11 -0
  185. package/dist/containers/Tenant/Query/QueryEditor/QueryEditor.d.ts +1 -1
  186. package/dist/containers/Tenant/Query/QueryEditor/QueryEditor.js +96 -95
  187. package/dist/containers/Tenant/Query/QueryEditorControls/QueryEditorControls.d.ts +5 -6
  188. package/dist/containers/Tenant/Query/QueryEditorControls/QueryEditorControls.js +18 -47
  189. package/dist/containers/Tenant/Query/QueryEditorControls/utils/getChangedQueryExecutionSettings.d.ts +2 -0
  190. package/dist/containers/Tenant/Query/QueryEditorControls/utils/getChangedQueryExecutionSettings.js +5 -0
  191. package/dist/containers/Tenant/Query/QueryEditorControls/utils/getChangedQueryExecutionSettings.test.d.ts +1 -0
  192. package/dist/containers/Tenant/Query/QueryEditorControls/utils/getChangedQueryExecutionSettings.test.js +42 -0
  193. package/dist/containers/Tenant/Query/QueryEditorControls/utils/getChangedQueryExecutionSettingsDescription.d.ts +5 -0
  194. package/dist/containers/Tenant/Query/QueryEditorControls/utils/getChangedQueryExecutionSettingsDescription.js +19 -0
  195. package/dist/containers/Tenant/Query/QueryEditorControls/utils/getChangedQueryExecutionSettingsDescription.test.d.ts +1 -0
  196. package/dist/containers/Tenant/Query/QueryEditorControls/utils/getChangedQueryExecutionSettingsDescription.test.js +56 -0
  197. package/dist/containers/Tenant/Query/QuerySettingsBanner/QuerySettingsBanner.d.ts +2 -0
  198. package/dist/containers/Tenant/Query/QuerySettingsBanner/QuerySettingsBanner.js +12 -0
  199. package/dist/containers/Tenant/Query/QuerySettingsBanner/QuerySettingsBanner.scss +3 -0
  200. package/dist/containers/Tenant/Query/QuerySettingsDialog/QuerySettingsDialog.d.ts +2 -0
  201. package/dist/containers/Tenant/Query/QuerySettingsDialog/QuerySettingsDialog.js +35 -0
  202. package/dist/containers/Tenant/Query/QuerySettingsDialog/QuerySettingsDialog.scss +63 -0
  203. package/dist/containers/Tenant/Query/QuerySettingsDialog/QuerySettingsSelect.d.ts +15 -0
  204. package/dist/containers/Tenant/Query/QuerySettingsDialog/QuerySettingsSelect.js +14 -0
  205. package/dist/containers/Tenant/Query/QuerySettingsDialog/QuerySettingsSelect.scss +19 -0
  206. package/dist/containers/Tenant/Query/QuerySettingsDialog/constants.d.ts +215 -0
  207. package/dist/containers/Tenant/Query/QuerySettingsDialog/constants.js +131 -0
  208. package/dist/containers/Tenant/Query/QuerySettingsDialog/i18n/en.json +13 -0
  209. package/dist/containers/Tenant/Query/QuerySettingsDialog/i18n/index.d.ts +2 -0
  210. package/dist/containers/Tenant/Query/QuerySettingsDialog/i18n/index.js +5 -0
  211. package/dist/containers/Tenant/Query/QuerySettingsDialog/i18n/ru.json +13 -0
  212. package/dist/containers/Tenant/Query/i18n/en.json +17 -1
  213. package/dist/containers/Tenant/Query/i18n/index.d.ts +1 -1
  214. package/dist/containers/Tenant/Schema/CreateDirectoryDialog/CreateDirectoryDialog.d.ts +3 -2
  215. package/dist/containers/Tenant/Schema/CreateDirectoryDialog/CreateDirectoryDialog.js +2 -2
  216. package/dist/containers/Tenant/Schema/SchemaTree/SchemaTree.js +8 -8
  217. package/dist/containers/Tenant/Schema/SchemaViewer/SchemaViewer.js +6 -3
  218. package/dist/containers/Tenant/Schema/SchemaViewer/columns.d.ts +2 -1
  219. package/dist/containers/Tenant/Schema/SchemaViewer/columns.js +13 -1
  220. package/dist/containers/Tenant/Schema/SchemaViewer/i18n/en.json +1 -0
  221. package/dist/containers/Tenant/Schema/SchemaViewer/i18n/index.d.ts +1 -1
  222. package/dist/containers/Tenant/Schema/SchemaViewer/prepareData.js +3 -2
  223. package/dist/containers/Tenant/Schema/SchemaViewer/types.d.ts +1 -0
  224. package/dist/containers/Tenant/Tenant.js +4 -8
  225. package/dist/containers/Tenant/TenantPages.d.ts +12 -1
  226. package/dist/containers/Tenant/TenantPages.js +1 -1
  227. package/dist/containers/Tenant/i18n/en.json +2 -2
  228. package/dist/containers/Tenant/i18n/index.d.ts +1 -1
  229. package/dist/containers/Tenant/utils/schema.js +1 -1
  230. package/dist/containers/Tenant/utils/schemaActions.d.ts +2 -2
  231. package/dist/containers/Tenant/utils/schemaActions.js +2 -2
  232. package/dist/containers/Tenants/Tenants.js +5 -8
  233. package/dist/containers/Tenants/Tenants.scss +0 -4
  234. package/dist/containers/UserSettings/i18n/en.json +3 -3
  235. package/dist/containers/UserSettings/i18n/index.d.ts +1 -1
  236. package/dist/containers/UserSettings/settings.d.ts +2 -2
  237. package/dist/containers/UserSettings/settings.js +18 -19
  238. package/dist/containers/VDiskPage/VDiskPage.js +27 -13
  239. package/dist/containers/VDiskPage/i18n/en.json +1 -0
  240. package/dist/containers/VDiskPage/i18n/index.d.ts +1 -1
  241. package/dist/routes.js +2 -2
  242. package/dist/services/api.d.ts +59 -28
  243. package/dist/services/api.js +74 -98
  244. package/dist/services/settings.d.ts +11 -3
  245. package/dist/services/settings.js +7 -5
  246. package/dist/store/configureStore.d.ts +7 -7
  247. package/dist/store/defaultStore.d.ts +3 -3
  248. package/dist/store/reducers/api.d.ts +1 -1
  249. package/dist/store/reducers/api.js +1 -1
  250. package/dist/store/reducers/authentication/authentication.d.ts +37 -24
  251. package/dist/store/reducers/authentication/authentication.js +77 -57
  252. package/dist/store/reducers/authentication/types.d.ts +0 -8
  253. package/dist/store/reducers/capabilities/capabilities.d.ts +106 -0
  254. package/dist/store/reducers/capabilities/capabilities.js +22 -0
  255. package/dist/store/reducers/capabilities/hooks.d.ts +2 -0
  256. package/dist/store/reducers/capabilities/hooks.js +13 -0
  257. package/dist/store/reducers/cluster/cluster.d.ts +2 -2
  258. package/dist/store/reducers/clusterNodes/clusterNodes.d.ts +2 -2
  259. package/dist/store/reducers/clusters/clusters.d.ts +2 -2
  260. package/dist/store/reducers/describe.d.ts +5 -2
  261. package/dist/store/reducers/describe.js +2 -2
  262. package/dist/store/reducers/executeQuery.d.ts +7 -14
  263. package/dist/store/reducers/executeQuery.js +19 -14
  264. package/dist/store/reducers/executeTopQueries/executeTopQueries.d.ts +2 -2
  265. package/dist/store/reducers/executeTopQueries/executeTopQueries.js +19 -14
  266. package/dist/store/reducers/executeTopQueries/types.d.ts +2 -2
  267. package/dist/store/reducers/executeTopQueries/utils.js +11 -7
  268. package/dist/store/reducers/explainQuery/explainQuery.d.ts +5 -4
  269. package/dist/store/reducers/explainQuery/explainQuery.js +20 -5
  270. package/dist/store/reducers/explainQuery/types.d.ts +13 -1
  271. package/dist/store/reducers/explainQuery/utils.js +7 -2
  272. package/dist/store/reducers/healthcheckInfo/healthcheckInfo.d.ts +58 -58
  273. package/dist/store/reducers/heatmap.d.ts +2 -2
  274. package/dist/store/reducers/heatmap.js +3 -3
  275. package/dist/store/reducers/hotKeys/hotKeys.d.ts +3 -2
  276. package/dist/store/reducers/hotKeys/hotKeys.js +3 -3
  277. package/dist/store/reducers/index.d.ts +6 -6
  278. package/dist/store/reducers/network/network.d.ts +2 -2
  279. package/dist/store/reducers/network/network.js +1 -1
  280. package/dist/store/reducers/node/node.d.ts +3 -3
  281. package/dist/store/reducers/node/selectors.d.ts +1 -1
  282. package/dist/store/reducers/node/selectors.js +2 -2
  283. package/dist/store/reducers/nodes/nodes.d.ts +3 -3
  284. package/dist/store/reducers/nodesList.d.ts +3 -3
  285. package/dist/store/reducers/overview/overview.d.ts +5 -2
  286. package/dist/store/reducers/overview/overview.js +2 -2
  287. package/dist/store/reducers/partitions/partitions.d.ts +2 -2
  288. package/dist/store/reducers/pdisk/pdisk.d.ts +3 -3
  289. package/dist/store/reducers/pdisk/pdisk.js +15 -2
  290. package/dist/store/reducers/pdisk/types.d.ts +17 -1
  291. package/dist/store/reducers/pdisk/utils.d.ts +2 -2
  292. package/dist/store/reducers/pdisk/utils.js +68 -8
  293. package/dist/store/reducers/preview.d.ts +2 -2
  294. package/dist/store/reducers/preview.js +1 -1
  295. package/dist/store/reducers/queryActions/types.d.ts +1 -1
  296. package/dist/store/reducers/schema/schema.d.ts +28 -10
  297. package/dist/store/reducers/schema/schema.js +20 -14
  298. package/dist/store/reducers/schemaAcl/schemaAcl.d.ts +4 -2
  299. package/dist/store/reducers/schemaAcl/schemaAcl.js +9 -3
  300. package/dist/store/reducers/shardsWorkload/shardsWorkload.d.ts +2 -2
  301. package/dist/store/reducers/shardsWorkload/shardsWorkload.js +22 -6
  302. package/dist/store/reducers/shardsWorkload/types.d.ts +2 -2
  303. package/dist/store/reducers/storage/storage.d.ts +3 -3
  304. package/dist/store/reducers/tablet.d.ts +3 -3
  305. package/dist/store/reducers/tablets.d.ts +13 -13
  306. package/dist/store/reducers/tabletsFilters.d.ts +1 -1
  307. package/dist/store/reducers/tenant/tenant.d.ts +2 -2
  308. package/dist/store/reducers/tenantOverview/executeTopTables/executeTopTables.d.ts +2 -2
  309. package/dist/store/reducers/tenantOverview/executeTopTables/executeTopTables.js +1 -1
  310. package/dist/store/reducers/tenantOverview/topNodes/topNodes.d.ts +2 -2
  311. package/dist/store/reducers/tenantOverview/topShards/tenantOverviewTopShards.d.ts +2 -2
  312. package/dist/store/reducers/tenantOverview/topShards/tenantOverviewTopShards.js +1 -1
  313. package/dist/store/reducers/tenantOverview/topStorageGroups/topStorageGroups.d.ts +2 -2
  314. package/dist/store/reducers/tenants/selectors.d.ts +31 -30
  315. package/dist/store/reducers/tenants/selectors.js +8 -2
  316. package/dist/store/reducers/tenants/tenants.d.ts +2 -2
  317. package/dist/store/reducers/topic.d.ts +44 -44
  318. package/dist/store/reducers/vdisk/vdisk.d.ts +2 -2
  319. package/dist/store/reducers/vdisk/vdisk.js +1 -1
  320. package/dist/store/reducers/viewSchema/viewSchema.d.ts +2 -2
  321. package/dist/store/reducers/viewSchema/viewSchema.js +1 -1
  322. package/dist/store/state-url-mapping.d.ts +70 -0
  323. package/dist/store/state-url-mapping.js +1 -5
  324. package/dist/styles/mixins.scss +13 -0
  325. package/dist/types/api/acl.d.ts +1 -0
  326. package/dist/types/api/capabilities.d.ts +7 -0
  327. package/dist/types/api/capabilities.js +1 -0
  328. package/dist/types/api/modifyDisk.d.ts +8 -0
  329. package/dist/types/api/modifyDisk.js +1 -0
  330. package/dist/types/api/pdisk.d.ts +65 -2
  331. package/dist/types/api/query.d.ts +39 -3
  332. package/dist/types/api/query.js +9 -1
  333. package/dist/types/api/schema/shared.d.ts +8 -0
  334. package/dist/types/api/vdisk.d.ts +33 -2
  335. package/dist/types/common.d.ts +3 -0
  336. package/dist/types/store/heatmap.d.ts +1 -0
  337. package/dist/types/store/query.d.ts +11 -1
  338. package/dist/utils/__test__/prepareQueryExplain.test.d.ts +1 -0
  339. package/dist/utils/__test__/prepareQueryExplain.test.js +115 -0
  340. package/dist/utils/constants.d.ts +13 -3
  341. package/dist/utils/constants.js +15 -3
  342. package/dist/utils/dataFormatters/dataFormatters.d.ts +0 -5
  343. package/dist/utils/dataFormatters/dataFormatters.js +3 -12
  344. package/dist/utils/developerUI/developerUI.d.ts +1 -0
  345. package/dist/utils/developerUI/developerUI.js +3 -0
  346. package/dist/utils/disks/getPDiskType.d.ts +3 -3
  347. package/dist/utils/disks/helpers.d.ts +1 -0
  348. package/dist/utils/disks/helpers.js +3 -0
  349. package/dist/utils/disks/prepareDisks.d.ts +2 -2
  350. package/dist/utils/disks/prepareDisks.js +17 -22
  351. package/dist/utils/disks/types.d.ts +7 -5
  352. package/dist/utils/hooks/index.d.ts +2 -1
  353. package/dist/utils/hooks/index.js +2 -1
  354. package/dist/utils/hooks/useChangedQuerySettings.d.ts +10 -0
  355. package/dist/utils/hooks/useChangedQuerySettings.js +46 -0
  356. package/dist/utils/hooks/useDelayed.d.ts +1 -0
  357. package/dist/utils/hooks/useDelayed.js +13 -0
  358. package/dist/utils/hooks/useEventHandler.d.ts +6 -0
  359. package/dist/utils/hooks/useEventHandler.js +17 -0
  360. package/dist/utils/hooks/useLastQueryExecutionSettings.d.ts +2 -0
  361. package/dist/utils/hooks/useLastQueryExecutionSettings.js +5 -0
  362. package/dist/utils/hooks/useQueryExecutionSettings.d.ts +8 -0
  363. package/dist/utils/hooks/useQueryExecutionSettings.js +15 -0
  364. package/dist/utils/monaco/constats.d.ts +2 -0
  365. package/dist/utils/monaco/constats.js +2 -0
  366. package/dist/utils/monaco/yql/constants.d.ts +0 -1
  367. package/dist/utils/monaco/yql/constants.js +0 -1
  368. package/dist/utils/monaco/yql/yql.completionItemProvider.js +2 -2
  369. package/dist/utils/prepareQueryExplain.d.ts +3 -1
  370. package/dist/utils/prepareQueryExplain.js +54 -2
  371. package/dist/utils/query.d.ts +24 -1
  372. package/dist/utils/query.js +41 -0
  373. package/dist/utils/query.test.js +3 -0
  374. package/dist/utils/utils.d.ts +8 -7
  375. package/dist/utils/utils.js +23 -11
  376. package/package.json +8 -2
  377. package/dist/components/DeveloperUiLink/DeveloperUiLink.d.ts +0 -8
  378. package/dist/components/NodeHostWrapper/NodeHostWrapper.scss +0 -15
  379. package/dist/containers/Node/NodeStructure/Vdisk.d.ts +0 -6
  380. package/dist/containers/Node/NodeStructure/Vdisk.js +0 -13
  381. package/dist/containers/PDiskPage/PDiskGroups.d.ts +0 -9
  382. package/dist/containers/PDiskPage/PDiskGroups.js +0 -20
  383. package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/i18n/ru.json +0 -5
  384. package/dist/containers/Tenant/Query/ExplainResult/utils.d.ts +0 -2
  385. package/dist/containers/Tenant/Query/ExplainResult/utils.js +0 -4
  386. package/dist/store/reducers/tenantOverview/topQueries/tenantOverviewTopQueries.d.ts +0 -5
  387. package/dist/store/reducers/tenantOverview/topQueries/tenantOverviewTopQueries.js +0 -38
  388. package/dist/store/utils.d.ts +0 -23
  389. package/dist/store/utils.js +0 -49
  390. package/dist/types/api/restartPDisk.d.ts +0 -4
  391. package/dist/utils/hooks/useQueryModes.d.ts +0 -2
  392. package/dist/utils/hooks/useQueryModes.js +0 -5
  393. package/dist/utils/monaco/index.d.ts +0 -1
  394. package/dist/utils/monaco/index.js +0 -6
  395. package/dist/utils/monaco/s-expression/constants.d.ts +0 -1
  396. package/dist/utils/monaco/s-expression/constants.js +0 -1
  397. package/dist/utils/monaco/s-expression/registerLanguage.d.ts +0 -1
  398. package/dist/utils/monaco/s-expression/registerLanguage.js +0 -59
  399. package/dist/utils/monaco/yql/registerLanguage.d.ts +0 -1
  400. package/dist/utils/monaco/yql/registerLanguage.js +0 -8
  401. package/dist/utils/monaco/yql/yql.d.ts +0 -7
  402. package/dist/utils/monaco/yql/yql.js +0 -180
  403. package/dist/utils/monaco/yql/yql.keywords.d.ts +0 -3
  404. package/dist/utils/monaco/yql/yql.keywords.js +0 -3
  405. /package/dist/{types/api/restartPDisk.js → components/DateRange/__test__/fromDateRangeValues.test.d.ts} +0 -0
@@ -0,0 +1,93 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ContentWithPopup } from '../../../components/ContentWithPopup/ContentWithPopup';
3
+ import { DiskStateProgressBar } from '../../../components/DiskStateProgressBar/DiskStateProgressBar';
4
+ import { InfoViewer } from '../../../components/InfoViewer';
5
+ import { InternalLink } from '../../../components/InternalLink';
6
+ import { ProgressViewer } from '../../../components/ProgressViewer/ProgressViewer';
7
+ import { VDiskInfo } from '../../../components/VDiskInfo/VDiskInfo';
8
+ import { getVDiskPagePath } from '../../../routes';
9
+ import { valueIsDefined } from '../../../utils';
10
+ import { formatBytes } from '../../../utils/bytesParsers';
11
+ import { cn } from '../../../utils/cn';
12
+ import { formatStorageValuesToGb } from '../../../utils/dataFormatters/dataFormatters';
13
+ import { pDiskPageKeyset } from '../i18n';
14
+ import { isEmptySlot, isLogSlot, isVDiskSlot } from './utils';
15
+ import './PDiskSpaceDistribution.scss';
16
+ const b = cn('ydb-pdisk-space-distribution');
17
+ const SLOT_HEIGHT = 40;
18
+ export function PDiskSpaceDistribution({ data }) {
19
+ const { SlotItems } = data;
20
+ const { PDiskId, NodeId } = data;
21
+ const containerHeight = SLOT_HEIGHT * ((SlotItems === null || SlotItems === void 0 ? void 0 : SlotItems.length) || 1);
22
+ const renderSlots = () => {
23
+ return SlotItems === null || SlotItems === void 0 ? void 0 : SlotItems.map((item, index) => {
24
+ return _jsx(Slot, { item: item, pDiskId: PDiskId, nodeId: NodeId }, index);
25
+ });
26
+ };
27
+ if (!(SlotItems === null || SlotItems === void 0 ? void 0 : SlotItems.length)) {
28
+ return pDiskPageKeyset('no-slots-data');
29
+ }
30
+ return (_jsx("div", { className: b(null), style: {
31
+ height: containerHeight,
32
+ minHeight: containerHeight,
33
+ }, children: _jsx(DiskStateProgressBar, { className: b('pdisk-bar'), severity: data.Severity, diskAllocatedPercent: data.AllocatedPercent, content: renderSlots(), faded: true }) }));
34
+ }
35
+ function Slot({ item, pDiskId, nodeId }) {
36
+ const renderContent = () => {
37
+ var _a;
38
+ if (isVDiskSlot(item)) {
39
+ const vDiskPagePath = valueIsDefined((_a = item.SlotData) === null || _a === void 0 ? void 0 : _a.VDiskSlotId) &&
40
+ valueIsDefined(pDiskId) &&
41
+ valueIsDefined(nodeId)
42
+ ? getVDiskPagePath(item.SlotData.VDiskSlotId, pDiskId, nodeId)
43
+ : undefined;
44
+ return (_jsx(ContentWithPopup, { content: _jsx(VDiskInfo, { data: item.SlotData, withTitle: true }), contentClassName: b('vdisk-popup'), placement: ['right', 'top'], children: _jsx(InternalLink, { to: vDiskPagePath, children: _jsx(DiskStateProgressBar, { className: b('slot'), severity: item.Severity, diskAllocatedPercent: item.UsagePercent, content: _jsx(SlotContent, { id: item.Id, title: item.Title, used: item.Used, total: item.Total }) }) }) }));
45
+ }
46
+ if (isLogSlot(item)) {
47
+ return (_jsx(ContentWithPopup, { content: _jsx(LogInfo, { data: item.SlotData }), contentClassName: b('vdisk-popup'), placement: ['right', 'top'], children: _jsx(DiskStateProgressBar, { className: b('slot'), severity: item.Severity, diskAllocatedPercent: item.UsagePercent, content: _jsx(SlotContent, { title: pDiskPageKeyset('log'), used: item.Used, total: item.Total }) }) }));
48
+ }
49
+ if (isEmptySlot(item)) {
50
+ return (_jsx(ContentWithPopup, { content: _jsx(EmptySlotInfo, { data: item.SlotData }), contentClassName: b('vdisk-popup'), placement: ['right', 'top'], children: _jsx(DiskStateProgressBar, { className: b('slot'), severity: item.Severity, empty: true, content: _jsx(SlotContent, { title: pDiskPageKeyset('empty-slot'),
51
+ // Empty slots have only total size
52
+ used: item.Total }) }) }));
53
+ }
54
+ return null;
55
+ };
56
+ return (_jsx("div", { className: b('slot-wrapper'), style: { flexGrow: Number(item.Total) || 1 }, children: renderContent() }));
57
+ }
58
+ function SlotContent({ id, title, used, total }) {
59
+ const renderSize = () => {
60
+ const [formattedUsed, formattedTotal] = formatStorageValuesToGb(used, total);
61
+ if (!total) {
62
+ return formattedUsed;
63
+ }
64
+ return `${formattedUsed} / ${formattedTotal}`;
65
+ };
66
+ return (_jsxs("div", { className: b('slot-content'), children: [_jsxs("span", { children: [valueIsDefined(id) ? _jsx("span", { className: b('slot-id'), children: id }) : null, title] }), _jsx("span", { className: b('slot-size'), children: renderSize() })] }));
67
+ }
68
+ function LogInfo({ data }) {
69
+ const { LogTotalSize, LogUsedSize, SystemSize } = data;
70
+ const info = [
71
+ {
72
+ label: pDiskPageKeyset('label.log-size'),
73
+ value: (_jsx(ProgressViewer, { value: LogUsedSize, capacity: LogTotalSize, formatValues: formatStorageValuesToGb })),
74
+ },
75
+ ];
76
+ if (valueIsDefined(SystemSize)) {
77
+ info.push({
78
+ label: pDiskPageKeyset('label.system-size'),
79
+ value: formatBytes({ value: SystemSize }),
80
+ });
81
+ }
82
+ return _jsx(InfoViewer, { title: pDiskPageKeyset('log'), info: info });
83
+ }
84
+ function EmptySlotInfo({ data }) {
85
+ const { Size } = data;
86
+ const info = [
87
+ {
88
+ label: pDiskPageKeyset('label.slot-size'),
89
+ value: formatBytes({ value: Size }),
90
+ },
91
+ ];
92
+ return _jsx(InfoViewer, { title: pDiskPageKeyset('empty-slot'), info: info });
93
+ }
@@ -0,0 +1,52 @@
1
+ .ydb-pdisk-space-distribution {
2
+ .storage-disk-progress-bar {
3
+ height: 100%;
4
+ }
5
+
6
+ &__pdisk-bar {
7
+ display: flex;
8
+ flex-grow: 1;
9
+ flex-direction: column;
10
+ gap: var(--g-spacing-2);
11
+
12
+ min-width: 500px;
13
+ max-width: 800px;
14
+ padding: var(--g-spacing-2);
15
+ }
16
+
17
+ &__slot-wrapper {
18
+ z-index: 1;
19
+
20
+ background-color: var(--g-color-base-background);
21
+ }
22
+
23
+ &__slot {
24
+ display: flex;
25
+
26
+ width: 100%;
27
+ }
28
+
29
+ &__slot-content {
30
+ z-index: 1;
31
+
32
+ display: flex;
33
+ flex-grow: 1;
34
+ flex-direction: row;
35
+ justify-content: space-between;
36
+ align-items: center;
37
+
38
+ padding: 0 var(--g-spacing-2);
39
+
40
+ line-height: 15px;
41
+ }
42
+
43
+ &__slot-id {
44
+ margin-right: var(--g-spacing-3);
45
+
46
+ font-weight: 600;
47
+ }
48
+
49
+ &__vdisk-popup {
50
+ padding: var(--g-spacing-half) var(--g-spacing-2) var(--g-spacing-2);
51
+ }
52
+ }
@@ -0,0 +1,4 @@
1
+ import type { SlotItem, SlotItemType } from '../../../store/reducers/pdisk/types';
2
+ export declare function isVDiskSlot(slot: SlotItem<SlotItemType>): slot is SlotItem<'vDisk'>;
3
+ export declare function isLogSlot(slot: SlotItem<SlotItemType>): slot is SlotItem<'log'>;
4
+ export declare function isEmptySlot(slot: SlotItem<SlotItemType>): slot is SlotItem<'empty'>;
@@ -0,0 +1,9 @@
1
+ export function isVDiskSlot(slot) {
2
+ return slot.SlotType === 'vDisk';
3
+ }
4
+ export function isLogSlot(slot) {
5
+ return slot.SlotType === 'log';
6
+ }
7
+ export function isEmptySlot(slot) {
8
+ return slot.SlotType === 'empty';
9
+ }
@@ -1,9 +1,17 @@
1
1
  {
2
2
  "fqdn": "FQDN",
3
3
  "pdisk": "PDisk",
4
- "groups": "Groups",
5
4
  "node": "Node",
5
+ "groups": "Groups",
6
+ "disk-distribution": "Disk distribution",
7
+ "empty-slot": "Empty slot",
8
+ "log": "Log",
9
+ "label.log-size": "Log Size",
10
+ "label.system-size": "System Size",
11
+ "label.slot-size": "Slot Size",
12
+ "no-slots-data": "No slots data",
6
13
  "restart-pdisk-button": "Restart PDisk",
14
+ "force-restart-pdisk-button": "Restart anyway",
7
15
  "restart-pdisk-dialog": "PDisk will be restarted. Do you want to proceed?",
8
16
  "restart-pdisk-not-allowed": "You don't have enough rights to restart PDisk"
9
17
  }
@@ -1 +1 @@
1
- export declare const pDiskPageKeyset: (key: "node" | "groups" | "fqdn" | "pdisk" | "restart-pdisk-button" | "restart-pdisk-dialog" | "restart-pdisk-not-allowed", params?: import("@gravity-ui/i18n").Params) => string;
1
+ export declare const pDiskPageKeyset: (key: "node" | "groups" | "fqdn" | "log" | "pdisk" | "disk-distribution" | "empty-slot" | "label.log-size" | "label.system-size" | "label.slot-size" | "no-slots-data" | "restart-pdisk-button" | "force-restart-pdisk-button" | "restart-pdisk-dialog" | "restart-pdisk-not-allowed", params?: import("@gravity-ui/i18n").Params) => string;
@@ -5,17 +5,16 @@ import { InternalLink } from '../../../components/InternalLink';
5
5
  import { PDiskPopup } from '../../../components/PDiskPopup/PDiskPopup';
6
6
  import { VDiskWithDonorsStack } from '../../../components/VDisk/VDiskWithDonorsStack';
7
7
  import routes, { createHref, getPDiskPagePath } from '../../../routes';
8
+ import { useDiskPagesAvailable } from '../../../store/reducers/capabilities/hooks';
8
9
  import { valueIsDefined } from '../../../utils';
9
10
  import { cn } from '../../../utils/cn';
10
- import { USE_SEPARATE_DISKS_PAGES_KEY } from '../../../utils/constants';
11
11
  import { stringifyVdiskId } from '../../../utils/dataFormatters/dataFormatters';
12
- import { useSetting } from '../../../utils/hooks';
13
12
  import { STRUCTURE } from '../../Node/NodePages';
14
13
  import './PDisk.scss';
15
14
  const b = cn('pdisk-storage');
16
15
  export const PDisk = ({ nodeId, data = {}, vDisks }) => {
17
16
  const [isPopupVisible, setIsPopupVisible] = React.useState(false);
18
- const [useSeparateDisksPages] = useSetting(USE_SEPARATE_DISKS_PAGES_KEY);
17
+ const diskPagesAvailable = useDiskPagesAvailable();
19
18
  const anchor = React.useRef(null);
20
19
  const showPopup = () => {
21
20
  setIsPopupVisible(true);
@@ -36,7 +35,7 @@ export const PDisk = ({ nodeId, data = {}, vDisks }) => {
36
35
  }) }));
37
36
  };
38
37
  let pDiskPath = createHref(routes.node, { id: nodeId, activeTab: STRUCTURE }, { pdiskId: data.PDiskId || '' });
39
- if (useSeparateDisksPages && valueIsDefined(data.PDiskId)) {
38
+ if (diskPagesAvailable && valueIsDefined(data.PDiskId)) {
40
39
  pDiskPath = getPDiskPagePath(data.PDiskId, nodeId);
41
40
  }
42
41
  return (_jsxs(React.Fragment, { children: [_jsx(PDiskPopup, { data: data, anchorRef: anchor, open: isPopupVisible }), _jsxs("div", { className: b(), ref: anchor, children: [renderVDisks(), _jsxs(InternalLink, { to: pDiskPath, className: b('content'), onMouseEnter: showPopup, onMouseLeave: hidePopup, children: [_jsx(DiskStateProgressBar, { diskAllocatedPercent: data.AllocatedPercent, severity: data.Severity }), _jsx("div", { className: b('media-type'), children: data.Type })] })] })] }));
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React from 'react';
3
3
  import { ArrayParam, StringParam, useQueryParams, withDefault } from 'use-query-params';
4
4
  import { AccessDenied } from '../../components/Errors/403';
5
+ import { isAccessError } from '../../components/Errors/PageError/PageError';
5
6
  import { ResponseError } from '../../components/Errors/ResponseError';
6
7
  import { TableWithControlsLayout } from '../../components/TableWithControlsLayout/TableWithControlsLayout';
7
8
  import { selectNodesMap } from '../../store/reducers/nodesList';
@@ -104,11 +105,8 @@ export const Storage = ({ additionalNodesProps, tenant, nodeId }) => {
104
105
  ? storageGroups.length
105
106
  : storageNodes.length, entitiesCountTotal: entitiesCount.total, entitiesLoading: isLoading }));
106
107
  };
107
- if (error) {
108
- if (error.status === 403) {
109
- return _jsx(AccessDenied, { position: "left" });
110
- }
111
- return _jsx(ResponseError, { error: error });
108
+ if (isAccessError(error)) {
109
+ return _jsx(AccessDenied, { position: "left" });
112
110
  }
113
- return (_jsxs(TableWithControlsLayout, { children: [_jsx(TableWithControlsLayout.Controls, { children: renderControls() }), _jsx(TableWithControlsLayout.Table, { loading: isLoading, className: b('table'), children: renderDataTable() })] }));
111
+ return (_jsxs(TableWithControlsLayout, { children: [_jsx(TableWithControlsLayout.Controls, { children: renderControls() }), error ? _jsx(ResponseError, { error: error }) : null, _jsx(TableWithControlsLayout.Table, { loading: isLoading, className: b('table'), children: currentData ? renderDataTable() : null })] }));
114
112
  };
@@ -56,9 +56,9 @@ const erasureColumn = {
56
56
  name: GROUPS_COLUMNS_IDS.Erasure,
57
57
  header: 'Erasure',
58
58
  width: 100,
59
+ sortAccessor: (row) => row.ErasureSpecies,
59
60
  render: ({ row }) => (row.ErasureSpecies ? row.ErasureSpecies : '-'),
60
61
  align: DataTable.LEFT,
61
- sortable: false,
62
62
  };
63
63
  const degradedColumn = {
64
64
  name: GROUPS_COLUMNS_IDS.Degraded,
@@ -82,7 +82,6 @@ const usageColumn = {
82
82
  // without a limit exclude usage from sort to display at the bottom
83
83
  sortAccessor: (row) => (row.Limit ? row.Usage : null),
84
84
  align: DataTable.LEFT,
85
- sortable: false,
86
85
  };
87
86
  const groupIdColumn = {
88
87
  name: GROUPS_COLUMNS_IDS.GroupId,
@@ -93,7 +92,6 @@ const groupIdColumn = {
93
92
  },
94
93
  sortAccessor: (row) => Number(row.GroupID),
95
94
  align: DataTable.RIGHT,
96
- sortable: false,
97
95
  };
98
96
  const usedColumn = {
99
97
  name: GROUPS_COLUMNS_IDS.Used,
@@ -103,7 +101,6 @@ const usedColumn = {
103
101
  return bytesToGB(row.Used, true);
104
102
  },
105
103
  align: DataTable.RIGHT,
106
- sortable: false,
107
104
  };
108
105
  const limitColumn = {
109
106
  name: GROUPS_COLUMNS_IDS.Limit,
@@ -113,7 +110,6 @@ const limitColumn = {
113
110
  return bytesToGB(row.Limit);
114
111
  },
115
112
  align: DataTable.RIGHT,
116
- sortable: false,
117
113
  };
118
114
  const usedSpaceFlagColumn = {
119
115
  name: GROUPS_COLUMNS_IDS.UsedSpaceFlag,
@@ -166,9 +162,23 @@ const getVDisksColumn = (nodes) => ({
166
162
  align: DataTable.CENTER,
167
163
  width: 900,
168
164
  resizeable: false,
165
+ sortable: false,
169
166
  });
170
167
  export const getStorageTopGroupsColumns = () => {
171
- return [groupIdColumn, typeColumn, erasureColumn, usageColumn, usedColumn, limitColumn];
168
+ const columns = [
169
+ groupIdColumn,
170
+ typeColumn,
171
+ erasureColumn,
172
+ usageColumn,
173
+ usedColumn,
174
+ limitColumn,
175
+ ];
176
+ return columns.map((column) => {
177
+ return {
178
+ ...column,
179
+ sortable: false,
180
+ };
181
+ });
172
182
  };
173
183
  export const getPDiskStorageColumns = (nodes) => {
174
184
  return [
@@ -54,7 +54,7 @@ export const Tablet = () => {
54
54
  if (loading && id !== tabletId && isFirstDataFetchRef.current) {
55
55
  return _jsx(Loader, { size: "l" });
56
56
  }
57
- if (error) {
57
+ if (error && !currentData) {
58
58
  return _jsx(ResponseError, { error: error });
59
59
  }
60
60
  if (!tablet || !Object.keys(tablet).length) {
@@ -67,7 +67,7 @@ export const Tablet = () => {
67
67
  path: `/tablets?TabletID=${TabletId}`,
68
68
  },
69
69
  ];
70
- return (_jsx("div", { className: b(), children: _jsxs("div", { className: b('pane-wrapper'), children: [_jsxs("div", { className: b('left-pane'), children: [_jsx("ul", { className: b('links'), children: externalLinks.map(renderExternalLinks) }), _jsxs("div", { className: b('row', { header: true }), children: [_jsx("span", { className: b('title'), children: i18n('tablet.header') }), _jsx(EntityStatus, { status: Overall, name: TabletId }), _jsx("a", { rel: "noopener noreferrer", className: b('link', { external: true }), href: `${backend}/tablets?TabletID=${TabletId}`, target: "_blank", children: _jsx(Icon, { data: ArrowUpRightFromSquare }) }), Leader && _jsx(Tag, { text: "Leader", type: "blue" }), _jsx("span", { className: b('loader'), children: loading && _jsx(Loader, { size: "s" }) })] }), _jsx(TabletInfo, { tablet: tablet, tenantPath: tenantName }), _jsx(TabletControls, { tablet: tablet, fetchData: refetch })] }), _jsx("div", { className: b('rigth-pane'), children: _jsx(TabletTable, { history: history }) })] }) }));
70
+ return (_jsxs("div", { className: b(), children: [error ? _jsx(ResponseError, { error: error }) : null, _jsxs("div", { className: b('pane-wrapper'), children: [_jsxs("div", { className: b('left-pane'), children: [_jsx("ul", { className: b('links'), children: externalLinks.map(renderExternalLinks) }), _jsxs("div", { className: b('row', { header: true }), children: [_jsx("span", { className: b('title'), children: i18n('tablet.header') }), _jsx(EntityStatus, { status: Overall, name: TabletId }), _jsx("a", { rel: "noopener noreferrer", className: b('link', { external: true }), href: `${backend}/tablets?TabletID=${TabletId}`, target: "_blank", children: _jsx(Icon, { data: ArrowUpRightFromSquare }) }), Leader && _jsx(Tag, { text: "Leader", type: "blue" }), _jsx("span", { className: b('loader'), children: loading && _jsx(Loader, { size: "s" }) })] }), _jsx(TabletInfo, { tablet: tablet, tenantPath: tenantName }), _jsx(TabletControls, { tablet: tablet, fetchData: refetch })] }), _jsx("div", { className: b('rigth-pane'), children: _jsx(TabletTable, { history: history }) })] })] }));
71
71
  };
72
72
  return (_jsxs(React.Fragment, { children: [_jsx(Helmet, { children: _jsx("title", { children: `${id} — ${i18n('tablet.header')} — ${tenantName || queryClusterName || CLUSTER_DEFAULT_TITLE}` }) }), renderView()] }));
73
73
  };
@@ -1,13 +1,14 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React from 'react';
3
3
  import { ButtonWithConfirmDialog } from '../../../components/ButtonWithConfirmDialog/ButtonWithConfirmDialog';
4
+ import { selectIsUserAllowedToMakeChanges } from '../../../store/reducers/authentication/authentication';
4
5
  import { ETabletState } from '../../../types/api/tablet';
5
6
  import { useTypedSelector } from '../../../utils/hooks';
6
7
  import { b } from '../Tablet';
7
8
  import i18n from '../i18n';
8
9
  export const TabletControls = ({ tablet, fetchData }) => {
9
10
  const { TabletId, HiveId } = tablet;
10
- const { isUserAllowedToMakeChanges } = useTypedSelector((state) => state.authentication);
11
+ const isUserAllowedToMakeChanges = useTypedSelector(selectIsUserAllowedToMakeChanges);
11
12
  const _onKillClick = () => {
12
13
  return window.api.killTablet(TabletId);
13
14
  };
@@ -3,19 +3,20 @@ import { ArrowsRotateRight } from '@gravity-ui/icons';
3
3
  import { Icon, Label, Text } from '@gravity-ui/uikit';
4
4
  import { skipToken } from '@reduxjs/toolkit/query';
5
5
  import { ButtonWithConfirmDialog } from '../../components/ButtonWithConfirmDialog/ButtonWithConfirmDialog';
6
- import { DeveloperUiLink } from '../../components/DeveloperUiLink/DeveloperUiLink';
6
+ import { DeveloperUILinkButton } from '../../components/DeveloperUILinkButton/DeveloperUILinkButton';
7
7
  import { EntityStatus } from '../../components/EntityStatus/EntityStatus';
8
8
  import { ResponseError } from '../../components/Errors/ResponseError';
9
9
  import { InternalLink } from '../../components/InternalLink';
10
10
  import { ResizeableDataTable } from '../../components/ResizeableDataTable/ResizeableDataTable';
11
11
  import { TableSkeleton } from '../../components/TableSkeleton/TableSkeleton';
12
12
  import routes, { createHref } from '../../routes';
13
- import { backend } from '../../store';
13
+ import { selectIsUserAllowedToMakeChanges } from '../../store/reducers/authentication/authentication';
14
14
  import { selectTabletsWithFqdn, tabletsApi } from '../../store/reducers/tablets';
15
15
  import { ETabletState } from '../../types/api/tablet';
16
16
  import { cn } from '../../utils/cn';
17
- import { DEFAULT_TABLE_SETTINGS } from '../../utils/constants';
17
+ import { DEFAULT_TABLE_SETTINGS, EMPTY_DATA_PLACEHOLDER } from '../../utils/constants';
18
18
  import { calcUptime } from '../../utils/dataFormatters/dataFormatters';
19
+ import { createTabletDeveloperUIHref } from '../../utils/developerUI/developerUI';
19
20
  import { useAutoRefreshInterval, useTypedDispatch, useTypedSelector } from '../../utils/hooks';
20
21
  import { mapTabletStateToLabelTheme } from '../../utils/tablet';
21
22
  import { getDefaultNodePath } from '../Node/NodePages';
@@ -28,20 +29,23 @@ const columns = [
28
29
  return i18n('Type');
29
30
  },
30
31
  render: ({ row }) => {
31
- return (_jsxs("span", { children: [row.Type, " ", row.Leader ? '' : _jsx(Text, { color: "secondary", children: "follower" })] }));
32
+ const isFollower = row.Leader === false;
33
+ return (_jsxs("span", { children: [row.Type, " ", isFollower ? _jsx(Text, { color: "secondary", children: "follower" }) : ''] }));
32
34
  },
33
35
  },
34
36
  {
35
37
  name: 'TabletId',
36
- width: 230,
38
+ width: 220,
37
39
  get header() {
38
40
  return i18n('Tablet');
39
41
  },
40
42
  render: ({ row }) => {
41
43
  var _a;
42
- const tabletPath = row.TabletId &&
43
- createHref(routes.tablet, { id: row.TabletId }, { nodeId: row.NodeId, type: row.Type });
44
- return (_jsx(EntityStatus, { name: (_a = row.TabletId) === null || _a === void 0 ? void 0 : _a.toString(), path: tabletPath, hasClipboardButton: true, showStatus: false, additionalControls: _jsx(DeveloperUiLink, { href: `${backend}/tablets?TabletID=${row.TabletId}` }) }));
44
+ if (!row.TabletId) {
45
+ return EMPTY_DATA_PLACEHOLDER;
46
+ }
47
+ const tabletPath = createHref(routes.tablet, { id: row.TabletId }, { nodeId: row.NodeId, type: row.Type });
48
+ return (_jsx(EntityStatus, { name: (_a = row.TabletId) === null || _a === void 0 ? void 0 : _a.toString(), path: tabletPath, hasClipboardButton: true, showStatus: false, additionalControls: _jsx(DeveloperUILinkButton, { href: createTabletDeveloperUIHref(row.TabletId) }) }));
45
49
  },
46
50
  },
47
51
  {
@@ -107,7 +111,7 @@ const columns = [
107
111
  function TabletActions(tablet) {
108
112
  const isDisabledRestart = tablet.State === ETabletState.Stopped;
109
113
  const dispatch = useTypedDispatch();
110
- const { isUserAllowedToMakeChanges } = useTypedSelector((state) => state.authentication);
114
+ const isUserAllowedToMakeChanges = useTypedSelector(selectIsUserAllowedToMakeChanges);
111
115
  return (_jsx(ButtonWithConfirmDialog, { buttonView: "outlined", dialogContent: i18n('dialog.kill'), onConfirmAction: () => {
112
116
  return window.api.killTablet(tablet.TabletId);
113
117
  }, onConfirmActionSuccess: () => {
@@ -132,8 +136,5 @@ export function Tablets({ nodeId, path, className }) {
132
136
  if (loading) {
133
137
  return _jsx(TableSkeleton, {});
134
138
  }
135
- if (error) {
136
- return _jsx(ResponseError, { error: error });
137
- }
138
- return (_jsx("div", { className: b(null, className), children: _jsx(ResizeableDataTable, { columns: columns, data: tablets, settings: DEFAULT_TABLE_SETTINGS, emptyDataMessage: i18n('noTabletsData') }) }));
139
+ return (_jsxs("div", { className: b(null, className), children: [error ? _jsx(ResponseError, { error: error }) : null, currentData ? (_jsx(ResizeableDataTable, { columns: columns, data: tablets, settings: DEFAULT_TABLE_SETTINGS, emptyDataMessage: i18n('noTabletsData') })) : null] }));
139
140
  }
@@ -1,4 +1,5 @@
1
1
  import './Acl.scss';
2
- export declare const Acl: ({ path }: {
2
+ export declare const Acl: ({ path, database }: {
3
3
  path: string;
4
+ database: string;
4
5
  }) => import("react/jsx-runtime").JSX.Element;
@@ -6,7 +6,7 @@ import { Loader } from '../../../components/Loader';
6
6
  import { schemaAclApi } from '../../../store/reducers/schemaAcl/schemaAcl';
7
7
  import { valueIsDefined } from '../../../utils';
8
8
  import { cn } from '../../../utils/cn';
9
- import i18n from '../i18n';
9
+ import i18n from './i18n';
10
10
  import './Acl.scss';
11
11
  const b = cn('ydb-acl');
12
12
  const prepareLogin = (value) => {
@@ -87,15 +87,16 @@ function getOwnerItem(owner) {
87
87
  return [
88
88
  {
89
89
  name: _jsx("span", { className: b('owner'), children: preparedOwner }),
90
- content: _jsx("span", { className: b('owner'), children: i18n('acl.owner') }),
90
+ content: _jsx("span", { className: b('owner'), children: i18n('title_owner') }),
91
91
  },
92
92
  ];
93
93
  }
94
- export const Acl = ({ path }) => {
95
- const { currentData, isFetching, error } = schemaAclApi.useGetSchemaAclQuery({ path });
94
+ export const Acl = ({ path, database }) => {
95
+ const { currentData, isFetching, error } = schemaAclApi.useGetSchemaAclQuery({ path, database });
96
96
  const loading = isFetching && !currentData;
97
- const { acl, owner } = currentData || {};
97
+ const { acl, effectiveAcl, owner } = currentData || {};
98
98
  const aclListItems = getAclListItems(acl);
99
+ const effectiveAclListItems = getAclListItems(effectiveAcl);
99
100
  const ownerItem = getOwnerItem(owner);
100
101
  if (loading) {
101
102
  return _jsx(Loader, {});
@@ -103,8 +104,9 @@ export const Acl = ({ path }) => {
103
104
  if (error) {
104
105
  return _jsx(ResponseError, { error: error });
105
106
  }
106
- if (!acl && !owner) {
107
- return _jsx(React.Fragment, { children: i18n('acl.empty') });
107
+ if (!acl && !owner && !effectiveAcl) {
108
+ return _jsx(React.Fragment, { children: i18n('description_empty') });
108
109
  }
109
- return (_jsxs("div", { className: b(), children: [ownerItem.length ? (_jsx(DefinitionList, { items: ownerItem, nameMaxWidth: 200, className: b('owner-container') })) : null, aclListItems.length ? (_jsx(DefinitionList, { items: aclListItems, nameMaxWidth: 200, className: b('result') })) : null] }));
110
+ const accessRightsItems = ownerItem.concat(aclListItems);
111
+ return (_jsxs("div", { className: b(), children: [accessRightsItems.length ? (_jsxs(React.Fragment, { children: [_jsx("div", { className: b('list-title'), children: i18n('title_rights') }), _jsx(DefinitionList, { items: accessRightsItems, nameMaxWidth: 200, className: b('result') })] })) : null, effectiveAclListItems.length ? (_jsxs(React.Fragment, { children: [_jsx("div", { className: b('list-title'), children: i18n('title_effective-rights') }), _jsx(DefinitionList, { items: effectiveAclListItems, nameMaxWidth: 200, className: b('result') })] })) : null] }));
110
112
  };
@@ -2,20 +2,20 @@
2
2
 
3
3
  .ydb-acl {
4
4
  width: 100%;
5
- &__owner-container {
6
- padding-bottom: 25px;
7
- }
8
5
  &__result {
9
- padding-bottom: 16px;
10
- }
11
-
12
- &__owner {
13
- font-weight: 600;
6
+ padding-bottom: var(--g-spacing-4);
7
+ padding-left: var(--g-spacing-2);
14
8
  }
15
9
  &__definition-content {
16
10
  display: flex;
17
11
  flex-direction: column;
18
12
  }
13
+ &__list-title {
14
+ margin: var(--g-spacing-3) 0 var(--g-spacing-5);
15
+
16
+ font-weight: 600;
17
+ @include subheader-2-typography();
18
+ }
19
19
  &__group-label {
20
20
  @include subheader-2-typography();
21
21
  }
@@ -0,0 +1,6 @@
1
+ {
2
+ "title_rights": "Access Rights",
3
+ "title_effective-rights": "Effective Access Rights",
4
+ "title_owner": "Owner",
5
+ "description_empty": "No Acl data"
6
+ }
@@ -0,0 +1,2 @@
1
+ declare const _default: (key: "title_rights" | "title_effective-rights" | "title_owner" | "description_empty", params?: import("@gravity-ui/i18n").Params) => string;
2
+ export default _default;
@@ -0,0 +1,4 @@
1
+ import { registerKeysets } from '../../../../utils/i18n';
2
+ import en from './en.json';
3
+ const COMPONENT = 'ydb-acl';
4
+ export default registerKeysets(COMPONENT, { en });
@@ -38,11 +38,8 @@ export const Consumers = ({ path, type }) => {
38
38
  if (loading) {
39
39
  return _jsx(Loader, { size: "m" });
40
40
  }
41
- if (error) {
42
- return _jsx(ResponseError, { error: error });
43
- }
44
- if (!consumers || !consumers.length) {
41
+ if (!error && (!consumers || !consumers.length)) {
45
42
  return _jsx("div", { children: i18n(`noConsumersMessage.${isCdcStream ? 'stream' : 'topic'}`) });
46
43
  }
47
- return (_jsxs("div", { className: b(), children: [_jsxs("div", { className: b('controls'), children: [_jsx(Search, { onChange: handleSearchChange, placeholder: i18n('controls.search'), className: b('search'), value: searchValue }), topic && _jsx(ConsumersTopicStats, { data: topic })] }), _jsx("div", { className: b('table-wrapper'), children: _jsx("div", { className: b('table-content'), children: _jsx(ResizeableDataTable, { columnsWidthLSKey: CONSUMERS_COLUMNS_WIDTH_LS_KEY, wrapperClassName: b('table'), data: dataToRender, columns: columns, settings: DEFAULT_TABLE_SETTINGS, emptyDataMessage: i18n('table.emptyDataMessage') }) }) })] }));
44
+ return (_jsxs("div", { className: b(), children: [_jsxs("div", { className: b('controls'), children: [_jsx(Search, { onChange: handleSearchChange, placeholder: i18n('controls.search'), className: b('search'), value: searchValue }), topic && _jsx(ConsumersTopicStats, { data: topic })] }), error ? _jsx(ResponseError, { error: error }) : null, consumers ? (_jsx("div", { className: b('table-wrapper'), children: _jsx("div", { className: b('table-content'), children: _jsx(ResizeableDataTable, { columnsWidthLSKey: CONSUMERS_COLUMNS_WIDTH_LS_KEY, wrapperClassName: b('table'), data: dataToRender, columns: columns, settings: DEFAULT_TABLE_SETTINGS, emptyDataMessage: i18n('table.emptyDataMessage') }) }) })) : null] }));
48
45
  };
@@ -3,7 +3,8 @@ import './Describe.scss';
3
3
  import 'react-json-inspector/json-inspector.css';
4
4
  interface IDescribeProps {
5
5
  path: string;
6
+ database: string;
6
7
  type?: EPathType;
7
8
  }
8
- declare const Describe: ({ path, type }: IDescribeProps) => import("react/jsx-runtime").JSX.Element;
9
+ declare const Describe: ({ path, database, type }: IDescribeProps) => import("react/jsx-runtime").JSX.Element;
9
10
  export default Describe;
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { skipToken } from '@reduxjs/toolkit/query';
3
3
  import JSONTree from 'react-json-inspector';
4
4
  import { shallowEqual } from 'react-redux';
@@ -13,18 +13,18 @@ import './Describe.scss';
13
13
  import 'react-json-inspector/json-inspector.css';
14
14
  const b = cn('kv-describe');
15
15
  const expandMap = new Map();
16
- const Describe = ({ path, type }) => {
16
+ const Describe = ({ path, database, type }) => {
17
17
  const [autoRefreshInterval] = useAutoRefreshInterval();
18
18
  const isEntityWithMergedImpl = isEntityWithMergedImplementation(type);
19
- const mergedChildrenPaths = useTypedSelector((state) => selectSchemaMergedChildrenPaths(state, path, type), shallowEqual);
20
- let paths = skipToken;
19
+ const mergedChildrenPaths = useTypedSelector((state) => selectSchemaMergedChildrenPaths(state, path, type, database), shallowEqual);
20
+ let paths = [];
21
21
  if (!isEntityWithMergedImpl) {
22
22
  paths = [path];
23
23
  }
24
24
  else if (mergedChildrenPaths) {
25
25
  paths = [path, ...mergedChildrenPaths];
26
26
  }
27
- const { currentData, isFetching, error } = describeApi.useGetDescribeQuery(paths, {
27
+ const { currentData, isFetching, error } = describeApi.useGetDescribeQuery(paths.length ? { paths, database } : skipToken, {
28
28
  pollingInterval: autoRefreshInterval,
29
29
  });
30
30
  const loading = isFetching && currentData === undefined;
@@ -42,19 +42,16 @@ const Describe = ({ path, type }) => {
42
42
  if (loading || (isEntityWithMergedImpl && !mergedChildrenPaths)) {
43
43
  return _jsx(Loader, { size: "m" });
44
44
  }
45
- if (error) {
46
- return _jsx(ResponseError, { error: error, className: b('message-container') });
47
- }
48
- if (!loading && !preparedDescribeData) {
45
+ if (!preparedDescribeData && !error) {
49
46
  return _jsx("div", { className: b('message-container'), children: "Empty" });
50
47
  }
51
- return (_jsx("div", { className: b(), children: _jsx("div", { className: b('result'), children: _jsx(JSONTree, { data: preparedDescribeData, className: b('tree'), onClick: ({ path }) => {
52
- const newValue = !(expandMap.get(path) || false);
53
- expandMap.set(path, newValue);
54
- }, searchOptions: {
55
- debounceTime: 300,
56
- }, isExpanded: (keypath) => {
57
- return expandMap.get(keypath) || false;
58
- } }) }) }));
48
+ return (_jsxs("div", { className: b(), children: [error ? _jsx(ResponseError, { error: error }) : null, preparedDescribeData ? (_jsx("div", { className: b('result'), children: _jsx(JSONTree, { data: preparedDescribeData, className: b('tree'), onClick: ({ path }) => {
49
+ const newValue = !(expandMap.get(path) || false);
50
+ expandMap.set(path, newValue);
51
+ }, searchOptions: {
52
+ debounceTime: 300,
53
+ }, isExpanded: (keypath) => {
54
+ return expandMap.get(keypath) || false;
55
+ } }) })) : null] }));
59
56
  };
60
57
  export default Describe;
@@ -10,6 +10,6 @@ function DetailedOverview(props) {
10
10
  return (_jsx("div", { className: b('section'), children: _jsx(TenantOverview, { tenantName: tenantName, additionalTenantProps: additionalTenantProps, additionalNodesProps: additionalNodesProps }) }));
11
11
  };
12
12
  const isTenant = tenantName === path;
13
- return (_jsx("div", { className: b(), children: isTenant ? renderTenantOverview() : _jsx(Overview, { type: type, path: path }) }));
13
+ return (_jsx("div", { className: b(), children: isTenant ? (renderTenantOverview()) : (_jsx(Overview, { type: type, path: path, database: tenantName })) }));
14
14
  }
15
15
  export default DetailedOverview;
@@ -1,5 +1,6 @@
1
1
  .kv-detailed-overview {
2
2
  display: flex;
3
+ flex-direction: column;
3
4
  gap: 20px;
4
5
 
5
6
  width: 100%;