ydb-embedded-ui 1.4.2 → 1.5.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/components/GroupTreeViewer/GroupTreeViewer.js +3 -2
  3. package/dist/components/GroupTreeViewer/GroupTreeViewer.scss +0 -2
  4. package/dist/components/SplitPane/SplitPane.tsx +8 -8
  5. package/dist/containers/App/App.js +1 -0
  6. package/dist/containers/App/App.scss +0 -26
  7. package/dist/containers/Authentication/Authentication.tsx +1 -0
  8. package/dist/containers/Tenant/Diagnostics/Diagnostics.tsx +14 -21
  9. package/dist/containers/Tenant/Diagnostics/Healthcheck/IssuesViewer/IssueViewer.scss +11 -23
  10. package/dist/containers/Tenant/Diagnostics/Healthcheck/IssuesViewer/IssuesViewer.js +7 -7
  11. package/dist/containers/Tenant/ObjectSummary/ObjectSummary.scss +9 -15
  12. package/dist/containers/Tenant/ObjectSummary/ObjectSummary.tsx +18 -21
  13. package/dist/containers/Tenant/QueryEditor/QueryEditor.js +2 -2
  14. package/dist/containers/Tenant/Schema/SchemaTree/SchemaTree.tsx +62 -0
  15. package/dist/containers/Tenant/Tenant.tsx +2 -2
  16. package/dist/containers/Tenant/utils/schema.ts +17 -0
  17. package/dist/containers/Tenant/utils/schemaActions.ts +115 -0
  18. package/dist/services/api.d.ts +3 -0
  19. package/dist/services/api.js +2 -2
  20. package/dist/store/reducers/tenant.js +30 -0
  21. package/dist/store/state-url-mapping.js +6 -0
  22. package/package.json +8 -4
  23. package/dist/components/TreeView/TreeView.js +0 -60
  24. package/dist/components/TreeView/TreeView.scss +0 -39
  25. package/dist/containers/Tenant/Schema/SchemaNode/SchemaNode.js +0 -170
  26. package/dist/containers/Tenant/Schema/SchemaNode/SchemaNode.scss +0 -62
  27. package/dist/containers/Tenant/Schema/SchemaNodeActions/SchemaNodeActions.scss +0 -17
  28. package/dist/containers/Tenant/Schema/SchemaNodeActions/SchemaNodeActions.tsx +0 -125
  29. package/dist/containers/Tenant/Schema/SchemaTree/SchemaTree.js +0 -116
  30. package/dist/containers/Tenant/Schema/SchemaTree/SchemaTree.scss +0 -17
  31. package/dist/styles/react-treeview.scss +0 -45
package/CHANGELOG.md CHANGED
@@ -1,5 +1,36 @@
1
1
  # Changelog
2
2
 
3
+ ### [1.5.2](https://github.com/ydb-platform/ydb-embedded-ui/compare/v1.5.1...v1.5.2) (2022-05-26)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **Tenant:** always update diagnostics tabs for root ([db03266](https://github.com/ydb-platform/ydb-embedded-ui/commit/db03266fd7dd6e4588c1db0d109bdfaa8f693e2d))
9
+ * **Tenant:** don't use HistoryAPI and redux-location-state together ([c1bc562](https://github.com/ydb-platform/ydb-embedded-ui/commit/c1bc5621e3ead44b1b84e592f8d7106bbc918e37))
10
+
11
+ ### [1.5.1](https://github.com/ydb-platform/ydb-embedded-ui/compare/v1.5.0...v1.5.1) (2022-05-25)
12
+
13
+
14
+ ### Bug Fixes
15
+
16
+ * **Authentication:** submit form with enter in the login field ([7b6132a](https://github.com/ydb-platform/ydb-embedded-ui/commit/7b6132a6b2556939648167f30b08c5688b56ab98))
17
+
18
+ ## [1.5.0](https://github.com/ydb-platform/ydb-embedded-ui/compare/v1.4.2...v1.5.0) (2022-05-24)
19
+
20
+
21
+ ### Features
22
+
23
+ * **Healthcheck:** use TreeView in issues viewer ([bcd81e5](https://github.com/ydb-platform/ydb-embedded-ui/commit/bcd81e56dc613cf3e9f31d77d930b79e070372e4))
24
+ * **Tenant:** use NavigationTree for schemas ([f2867e1](https://github.com/ydb-platform/ydb-embedded-ui/commit/f2867e18898028ca265df46fcc8bfa4f929173f0))
25
+
26
+
27
+ ### Bug Fixes
28
+
29
+ * **Healthcheck:** don't display reasonsItems in issues viewer ([f0a545f](https://github.com/ydb-platform/ydb-embedded-ui/commit/f0a545f7c70d449c121d64f8d1820e53b880a0fc))
30
+ * **Tenant:** add ellipsis to menu items inserting queries ([09135a2](https://github.com/ydb-platform/ydb-embedded-ui/commit/09135a2777ec9183ddf71bd2a4de66c5ef422ac8))
31
+ * **Tenant:** change messages for path copy toasts ([09adfa5](https://github.com/ydb-platform/ydb-embedded-ui/commit/09adfa52735bf706deb1ee9bf37f4bfa459b3758))
32
+ * **Tenant:** switch to query tab for inserted query ([991f156](https://github.com/ydb-platform/ydb-embedded-ui/commit/991f156ff819c58ff79146a44b57fb400729f325))
33
+
3
34
  ### [1.4.2](https://github.com/ydb-platform/ydb-embedded-ui/compare/v1.4.1...v1.4.2) (2022-05-23)
4
35
 
5
36
 
@@ -3,10 +3,11 @@ import PropTypes from 'prop-types';
3
3
  import cn from 'bem-cn-lite';
4
4
  import {withRouter} from 'react-router';
5
5
 
6
+ import {TreeView} from 'ydb-ui-components';
7
+
6
8
  import GroupViewer from '../GroupViewer/GroupViewer';
7
9
  import PDiskViewer from '../PDiskViewer/PDiskViewer';
8
10
  import EntityStatus from '../EntityStatus/EntityStatus';
9
- import TreeView from '../TreeView/TreeView';
10
11
  import {stringifyVdiskId} from '../../utils';
11
12
  import routes, {createHref} from '../../routes';
12
13
  import {backend} from '../../store';
@@ -50,7 +51,7 @@ class GroupTreeViewer extends React.Component {
50
51
  <div className={b()}>
51
52
  <TreeView
52
53
  key={group.GroupID}
53
- nodeLabel={label2}
54
+ name={label2}
54
55
  collapsed={collapsed}
55
56
  onClick={onClick}
56
57
  >
@@ -1,5 +1,3 @@
1
- @import '../../styles/react-treeview';
2
-
3
1
  .group-tree-viewer {
4
2
  &__row {
5
3
  display: flex;
@@ -18,8 +18,8 @@ interface SplitPaneProps {
18
18
  minSize?: number[];
19
19
  triggerCollapse?: boolean;
20
20
  triggerExpand?: boolean;
21
- onSplitStartDrugAdditional?: VoidFunction;
22
- onSplitDrugAdditional?: VoidFunction;
21
+ onSplitStartDragAdditional?: VoidFunction;
22
+ onSplitDragAdditional?: VoidFunction;
23
23
  }
24
24
 
25
25
  const minSizeDefaultInner = [0, 100];
@@ -41,17 +41,17 @@ function SplitPane(props: SplitPaneProps) {
41
41
  localStorage.setItem(defaultSizePaneKey, sizes.join(','));
42
42
  };
43
43
  const onDragHandler = (sizes: number[]) => {
44
- const {onSplitDrugAdditional} = props;
45
- if (onSplitDrugAdditional) {
46
- onSplitDrugAdditional();
44
+ const {onSplitDragAdditional} = props;
45
+ if (onSplitDragAdditional) {
46
+ onSplitDragAdditional();
47
47
  }
48
48
  setDefaultSizePane(sizes);
49
49
  };
50
50
 
51
51
  const onDragStartHandler = () => {
52
- const {onSplitStartDrugAdditional} = props;
53
- if (onSplitStartDrugAdditional) {
54
- onSplitStartDrugAdditional();
52
+ const {onSplitStartDragAdditional} = props;
53
+ if (onSplitStartDragAdditional) {
54
+ onSplitStartDragAdditional();
55
55
  }
56
56
  setInnerSizes(undefined);
57
57
  };
@@ -25,6 +25,7 @@ class App extends React.Component {
25
25
  constructor(props) {
26
26
  super(props);
27
27
  i18n.setLang(I18N.LANGS.en);
28
+ I18N.setDefaultLang(I18N.LANGS.en); // for the peer dependency ydb-ui-components, should match the language above
28
29
  }
29
30
 
30
31
  componentDidMount() {
@@ -117,32 +117,6 @@ body,
117
117
  border-color: var(--yc-color-text-danger);
118
118
  }
119
119
 
120
- .tree-view_item {
121
- /* stylelint-disable-next-line declaration-no-important*/
122
- cursor: default !important;
123
- }
124
-
125
- .tree-view_children {
126
- margin-left: 25px;
127
- }
128
-
129
- .tree-view_arrow {
130
- padding: 2px;
131
-
132
- line-height: 0.8;
133
-
134
- transform: rotate(90deg);
135
- }
136
-
137
- .tree-view_arrow-collapsed {
138
- transform: rotate(0deg);
139
- }
140
-
141
- .tree-view_arrow:after {
142
- font-size: var(--yc-text-body2-font-size);
143
- content: '❯';
144
- }
145
-
146
120
  .data-table__row:hover .entity-status__clipboard-button {
147
121
  display: flex;
148
122
  }
@@ -72,6 +72,7 @@ function Authentication({authenticate, error}: any) {
72
72
  onUpdate={onLoginUpdate}
73
73
  placeholder={'Username'}
74
74
  error={loginError}
75
+ onKeyDown={onEnterClick}
75
76
  size="l"
76
77
  autoFocus
77
78
  />
@@ -3,7 +3,7 @@ import qs from 'qs';
3
3
  import cn from 'bem-cn-lite';
4
4
  import {Link} from 'react-router-dom';
5
5
  import {useDispatch, useSelector} from 'react-redux';
6
- import {useHistory, useLocation} from 'react-router';
6
+ import {useLocation} from 'react-router';
7
7
 
8
8
  import {Switch, Tabs} from '@yandex-cloud/uikit';
9
9
 
@@ -34,8 +34,10 @@ import {TenantGeneralTabsIds, TenantTabsGroups} from '../TenantPages';
34
34
  import {GeneralPagesIds, DATABASE_PAGES, TABLE_PAGES, DIR_PAGES} from './DiagnosticsPages';
35
35
  //@ts-ignore
36
36
  import {enableAutorefresh, disableAutorefresh} from '../../../store/reducers/schema';
37
+ import {setTopLevelTab, setDiagnosticsTab} from '../../../store/reducers/tenant';
37
38
 
38
39
  import './Diagnostics.scss';
40
+
39
41
  interface DiagnosticsProps {
40
42
  type: string;
41
43
  additionalTenantInfo?: any;
@@ -51,16 +53,17 @@ function Diagnostics(props: DiagnosticsProps) {
51
53
  currentSchema: currentItem = {},
52
54
  autorefresh,
53
55
  } = useSelector((state: any) => state.schema);
56
+ const {
57
+ diagnosticsTab = GeneralPagesIds.overview,
58
+ } = useSelector((state: any) => state.tenant);
54
59
 
55
60
  const location = useLocation();
56
61
 
57
- const history = useHistory();
58
-
59
62
  const queryParams = qs.parse(location.search, {
60
63
  ignoreQueryPrefix: true,
61
64
  });
62
65
 
63
- const {name: tenantName, generalTab = GeneralPagesIds.overview} = queryParams;
66
+ const {name: tenantName} = queryParams;
64
67
 
65
68
  const isDatabase = currentSchemaPath === tenantName;
66
69
 
@@ -76,25 +79,20 @@ function Diagnostics(props: DiagnosticsProps) {
76
79
  pages = TABLE_PAGES;
77
80
  }
78
81
  return pages;
79
- }, [props.type]);
82
+ }, [props.type, isDatabase]);
80
83
 
81
84
  const forwardToDiagnosticTab = (tab: GeneralPagesIds) => {
82
- history.push(
83
- createHref(routes.tenant, undefined, {
84
- ...queryParams,
85
- [TenantTabsGroups.generalTab]: tab,
86
- }),
87
- );
85
+ dispatch(setDiagnosticsTab(tab));
88
86
  };
89
87
  const activeTab = useMemo(() => {
90
- if (pages.find((el) => el.id === generalTab)) {
91
- return generalTab;
88
+ if (pages.find((el) => el.id === diagnosticsTab)) {
89
+ return diagnosticsTab;
92
90
  } else {
93
91
  const newPage = pages[0].id;
94
92
  forwardToDiagnosticTab(newPage);
95
93
  return newPage;
96
94
  }
97
- }, [pages, generalTab]);
95
+ }, [pages, diagnosticsTab]);
98
96
 
99
97
  const onAutorefreshToggle = (value: boolean) => {
100
98
  if (value) {
@@ -105,12 +103,7 @@ function Diagnostics(props: DiagnosticsProps) {
105
103
  };
106
104
 
107
105
  const forwardToGeneralTab = (tab: TenantGeneralTabsIds) => {
108
- history.push(
109
- createHref(routes.tenant, undefined, {
110
- ...queryParams,
111
- [TenantTabsGroups.general]: tab,
112
- }),
113
- );
106
+ dispatch(setTopLevelTab(tab));
114
107
  };
115
108
 
116
109
  const renderTabContent = () => {
@@ -118,7 +111,7 @@ function Diagnostics(props: DiagnosticsProps) {
118
111
 
119
112
  const tenantNameString = tenantName as string;
120
113
 
121
- switch (generalTab) {
114
+ switch (diagnosticsTab) {
122
115
  case GeneralPagesIds.overview: {
123
116
  return (
124
117
  <DetailedOverview
@@ -5,37 +5,14 @@
5
5
  align-items: center;
6
6
 
7
7
  height: 40px;
8
- margin-left: 36px;
9
8
 
10
9
  cursor: pointer;
11
- .km-tree-view__arrow-icon + & {
12
- margin-left: 0;
13
- }
14
10
 
15
11
  &_active {
16
12
  border-radius: 4px;
17
13
  background: var(--yc-color-base-info);
18
14
  }
19
15
 
20
- &__wpapper {
21
- & .km-tree-view__node-wrapper {
22
- height: 40px;
23
-
24
- & .km-tree-view__arrow-icon {
25
- display: flex;
26
- align-items: center;
27
-
28
- width: 36px;
29
- height: 36px;
30
- margin: 0;
31
- }
32
- }
33
-
34
- & .tree-view_item {
35
- margin: 0;
36
- }
37
- }
38
-
39
16
  &__field {
40
17
  padding: 0 10px;
41
18
 
@@ -173,4 +150,15 @@
173
150
  }
174
151
  }
175
152
  }
153
+
154
+ .ydb-tree-view {
155
+ &__item {
156
+ height: 40px;
157
+ }
158
+
159
+ .tree-view_arrow {
160
+ width: 40px;
161
+ height: 40px;
162
+ }
163
+ }
176
164
  }
@@ -7,7 +7,8 @@ import _filter from 'lodash/fp/filter';
7
7
  import _sortBy from 'lodash/fp/sortBy';
8
8
  import _uniqBy from 'lodash/fp/uniqBy';
9
9
 
10
- import TreeView from '../../../../../components/TreeView/TreeView';
10
+ import {TreeView} from 'ydb-ui-components';
11
+
11
12
  import EntityStatus from '../../../../../components/EntityStatus/EntityStatus';
12
13
 
13
14
  import './IssueViewer.scss';
@@ -29,7 +30,7 @@ const issueBlock = cn('issue');
29
30
 
30
31
  const IssueRow = ({data, treeLevel, active, setInfoForActive, onClick}) => {
31
32
  // eslint-disable-next-line no-unused-vars
32
- const {id, status, message, type, ...rest} = data;
33
+ const {id, status, message, type, reasonsItems, ...rest} = data;
33
34
 
34
35
  useEffect(() => {
35
36
  if (active) {
@@ -45,7 +46,7 @@ const IssueRow = ({data, treeLevel, active, setInfoForActive, onClick}) => {
45
46
  </div>
46
47
  <div
47
48
  className={issueBlock('field', {message: true})}
48
- style={{marginLeft: -treeLevel * 25 + 'px'}}
49
+ style={{marginLeft: -treeLevel * 24 + 'px'}}
49
50
  >
50
51
  {message}
51
52
  </div>
@@ -85,21 +86,20 @@ const IssuesViewer = ({issues}) => {
85
86
  return (
86
87
  <TreeView
87
88
  key={id}
88
- nodeLabel={
89
+ name={
89
90
  <IssueRow
90
91
  data={item}
91
92
  treeLevel={treeLevel}
92
93
  active={isActive}
93
94
  setInfoForActive={setInfoData}
94
- onClick={() => setActiveItem(id)}
95
95
  />
96
96
  }
97
- className={issueBlock('wpapper', {active: isActive})}
98
97
  collapsed={
99
98
  typeof collapsedIssues[id] === 'undefined' || collapsedIssues[id]
100
99
  }
101
100
  hasArrow={hasArrow}
102
- onClick={() => {
101
+ onClick={() => setActiveItem(id)}
102
+ onArrowClick={() => {
103
103
  const newValue =
104
104
  typeof collapsedIssues[id] === 'undefined'
105
105
  ? false
@@ -26,8 +26,8 @@
26
26
 
27
27
  &__action-button {
28
28
  position: absolute;
29
- top: 12px;
30
- right: 4px;
29
+ top: 8px; // centered relative to the heading
30
+ right: 5px; // centered relative to the collapsed panel
31
31
 
32
32
  background-color: var(--yc-color-base-background);
33
33
  &_hidden {
@@ -41,32 +41,26 @@
41
41
  align-items: center;
42
42
  }
43
43
 
44
- &__tree {
44
+ &__tree-wrapper {
45
45
  display: flex;
46
- overflow: scroll;
47
- flex: 0 0 auto;
48
46
  flex-direction: column;
47
+ }
48
+
49
+ &__tree {
50
+ overflow-y: scroll;
51
+ flex: 1 1 auto;
49
52
 
50
53
  height: 100%;
51
54
  padding: 0 12px 12px;
52
-
53
- .tree-view_item {
54
- margin: 0;
55
- padding: 2px 0;
56
- }
57
-
58
- & > div > .tree-view {
59
- padding-bottom: 15px;
60
- }
61
55
  }
62
56
 
63
57
  &__tree-header {
64
58
  display: flex;
59
+ flex: 0 0 auto;
65
60
  justify-content: space-between;
66
61
  align-items: center;
67
62
 
68
63
  padding: 12px 12px 8px;
69
- @include sticky-top();
70
64
  }
71
65
 
72
66
  &__tree-title {
@@ -7,18 +7,13 @@ import qs from 'qs';
7
7
  import _ from 'lodash';
8
8
 
9
9
  import {Button, HelpTooltip, Loader, Tabs} from '@yandex-cloud/uikit';
10
- //@ts-ignore
10
+
11
11
  import SplitPane from '../../../components/SplitPane';
12
- //@ts-ignore
13
- import SchemaNode from '../Schema/SchemaNode/SchemaNode';
14
- //@ts-ignore
12
+ import {SchemaTree} from '../Schema/SchemaTree/SchemaTree';
15
13
  import Acl from '../Acl/Acl';
16
- //@ts-ignore
17
14
  import SchemaViewer from '../Schema/SchemaViewer/SchemaViewer';
18
15
  import CopyToClipboard from '../../../components/CopyToClipboard/CopyToClipboard';
19
- //@ts-ignore
20
16
  import InfoViewer from '../../../components/InfoViewer/InfoViewer';
21
- //@ts-ignore
22
17
  import Icon from '../../../components/Icon/Icon';
23
18
 
24
19
  import {OLAP_TABLE_TYPE, TABLE_TYPE} from '../Tenant';
@@ -26,7 +21,6 @@ import {OLAP_TABLE_TYPE, TABLE_TYPE} from '../Tenant';
26
21
  import {
27
22
  DEFAULT_IS_TENANT_COMMON_INFO_COLLAPSED,
28
23
  DEFAULT_SIZE_TENANT_SUMMARY_KEY,
29
- //@ts-ignore
30
24
  } from '../../../utils/constants';
31
25
  import {
32
26
  TenantGeneralTabsIds,
@@ -41,10 +35,11 @@ import {
41
35
  paneVisibilityToggleReducerCreator,
42
36
  PaneVisibilityToggleButtons,
43
37
  } from '../utils/paneVisibilityToggleHelpers';
44
- //@ts-ignore
45
38
  import {setShowPreview} from '../../../store/reducers/schema';
39
+ import {setTopLevelTab} from '../../../store/reducers/tenant';
46
40
 
47
41
  import './ObjectSummary.scss';
42
+
48
43
  const b = cn('object-summary');
49
44
 
50
45
  const getInitialIsSummaryCollapsed = () => {
@@ -103,7 +98,7 @@ function ObjectSummary(props: ObjectSummaryProps) {
103
98
  });
104
99
 
105
100
  const {name: tenantName, info: infoTab} = queryParams;
106
- const tenantData = _.get(data[tenantName as string], 'PathDescription.Self');
101
+ const pathData = _.get(data[tenantName as string], 'PathDescription.Self');
107
102
  const currentSchemaData = _.get(data[currentSchemaPath], 'PathDescription.Self');
108
103
 
109
104
  const tableSchema =
@@ -195,13 +190,20 @@ function ObjectSummary(props: ObjectSummaryProps) {
195
190
 
196
191
  const renderTree = () => {
197
192
  return (
198
- <div>
193
+ <div className={b('tree-wrapper')}>
199
194
  <div className={b('tree-header')}>
200
195
  <div className={b('tree-title')}>Navigation</div>
201
196
  </div>
202
197
  <div className={b('tree')}>
203
- {tenantData && (
204
- <SchemaNode fullPath={tenantName as string} data={tenantData} isRoot />
198
+ {pathData && (
199
+ <SchemaTree
200
+ rootPath={tenantName as string}
201
+ // for the root pathData.Name contains the same string as tenantName,
202
+ // but without the leading slash
203
+ rootName={pathData?.Name || tenantName}
204
+ rootType={pathData.PathType}
205
+ currentPath={currentSchemaPath}
206
+ />
205
207
  )}
206
208
  </div>
207
209
  </div>
@@ -215,18 +217,13 @@ function ObjectSummary(props: ObjectSummaryProps) {
215
217
  dispatchCommonInfoVisibilityState(PaneVisibilityActionTypes.triggerExpand);
216
218
  };
217
219
 
218
- const onSplitStartDrugAdditional = () => {
220
+ const onSplitStartDragAdditional = () => {
219
221
  dispatchCommonInfoVisibilityState(PaneVisibilityActionTypes.clear);
220
222
  };
221
223
 
222
224
  const onOpenPreview = () => {
223
225
  dispatch(setShowPreview(true));
224
- history.push(
225
- createHref(routes.tenant, undefined, {
226
- ...queryParams,
227
- [TenantTabsGroups.general]: TenantGeneralTabsIds.query,
228
- }),
229
- );
226
+ dispatch(setTopLevelTab(TenantGeneralTabsIds.query));
230
227
  };
231
228
 
232
229
  const renderCommonInfoControls = () => {
@@ -278,7 +275,7 @@ function ObjectSummary(props: ObjectSummaryProps) {
278
275
  <SplitPane
279
276
  direction="vertical"
280
277
  defaultSizePaneKey={DEFAULT_SIZE_TENANT_SUMMARY_KEY}
281
- onSplitStartDrugAdditional={onSplitStartDrugAdditional}
278
+ onSplitStartDragAdditional={onSplitStartDragAdditional}
282
279
  triggerCollapse={commonInfoVisibilityState.triggerCollapse}
283
280
  triggerExpand={commonInfoVisibilityState.triggerExpand}
284
281
  minSize={[200, 52]}
@@ -298,7 +298,7 @@ function QueryEditor(props) {
298
298
  dispatchResultVisibilityState(PaneVisibilityActionTypes.triggerExpand);
299
299
  };
300
300
 
301
- const onSplitStartDrugAdditional = () => {
301
+ const onSplitStartDragAdditional = () => {
302
302
  dispatchResultVisibilityState(PaneVisibilityActionTypes.clear);
303
303
  };
304
304
 
@@ -636,7 +636,7 @@ function QueryEditor(props) {
636
636
  triggerExpand={resultVisibilityState.triggerExpand}
637
637
  minSize={[0, 52]}
638
638
  collapsedSizes={[100, 0]}
639
- onSplitStartDrugAdditional={onSplitStartDrugAdditional}
639
+ onSplitStartDragAdditional={onSplitStartDragAdditional}
640
640
  >
641
641
  <div className={b('pane-wrapper')}>
642
642
  <div className={b('monaco-wrapper')}>
@@ -0,0 +1,62 @@
1
+ import {useDispatch} from 'react-redux';
2
+
3
+ import {NavigationTree} from 'ydb-ui-components';
4
+
5
+ import {setCurrentSchemaPath, getSchema} from '../../../../store/reducers/schema';
6
+ import {getDescribe} from '../../../../store/reducers/describe';
7
+ import {getSchemaAcl} from '../../../../store/reducers/schemaAcl';
8
+
9
+ import {calcNavigationTreeType} from '../../utils/schema';
10
+ import {getActions} from '../../utils/schemaActions';
11
+
12
+ interface SchemaTreeProps {
13
+ rootPath: string;
14
+ rootName: string;
15
+ rootType: string;
16
+ currentPath: string;
17
+ }
18
+
19
+ export function SchemaTree(props: SchemaTreeProps) {
20
+ const {
21
+ rootPath,
22
+ rootName,
23
+ rootType,
24
+ currentPath,
25
+ } = props;
26
+
27
+ const dispatch = useDispatch();
28
+
29
+ const fetchPath = (path: string) => window.api.getSchema(
30
+ {path},
31
+ {concurrentId: `NavigationTree.getSchema|${path}`},
32
+ )
33
+ .then(({PathDescription: {Children = []} = {}}) => {
34
+ return Children.map(({Name, PathType}) => ({
35
+ name: Name,
36
+ type: calcNavigationTreeType(PathType),
37
+ }));
38
+ });
39
+
40
+ const handleActivePathUpdate = (activePath: string) => {
41
+ dispatch(setCurrentSchemaPath(activePath));
42
+ dispatch(getSchema({path: activePath}));
43
+ dispatch(getDescribe({path: activePath}));
44
+ dispatch(getSchemaAcl({path: activePath}));
45
+ };
46
+
47
+ return (
48
+ <NavigationTree
49
+ rootState={{
50
+ path: rootPath,
51
+ name: rootName,
52
+ type: calcNavigationTreeType(rootType),
53
+ collapsed: false,
54
+ }}
55
+ fetchPath={fetchPath}
56
+ getActions={getActions(dispatch, handleActivePathUpdate)}
57
+ activePath={currentPath}
58
+ onActivePathUpdate={handleActivePathUpdate}
59
+ cache={false}
60
+ />
61
+ );
62
+ }
@@ -127,7 +127,7 @@ function Tenant(props: TenantProps) {
127
127
  dispatchSummaryVisibilityAction(PaneVisibilityActionTypes.triggerExpand);
128
128
  };
129
129
 
130
- const onSplitStartDrugAdditional = () => {
130
+ const onSplitStartDragAdditional = () => {
131
131
  dispatchSummaryVisibilityAction(PaneVisibilityActionTypes.clear);
132
132
  };
133
133
 
@@ -139,7 +139,7 @@ function Tenant(props: TenantProps) {
139
139
  triggerCollapse={summaryVisibilityState.triggerCollapse}
140
140
  triggerExpand={summaryVisibilityState.triggerExpand}
141
141
  minSize={[36, 200]}
142
- onSplitStartDrugAdditional={onSplitStartDrugAdditional}
142
+ onSplitStartDragAdditional={onSplitStartDragAdditional}
143
143
  >
144
144
  <ObjectSummary
145
145
  type={entityType as string}
@@ -0,0 +1,17 @@
1
+ import type {NavigationTreeNodeType} from "ydb-ui-components";
2
+
3
+ const DB_TYPES = new Set(['EPathTypeSubDomain']);
4
+ const TABLE_TYPES = new Set(['EPathTypeTable', 'EPathTypeOlapTable']);
5
+ const DIR_TYPES = new Set(['EPathTypeDir', 'EPathTypeOlapStore']);
6
+
7
+ export const calcNavigationTreeType = (type: string): NavigationTreeNodeType => {
8
+ if (DIR_TYPES.has(type)) {
9
+ return 'directory';
10
+ } else if (TABLE_TYPES.has(type)) {
11
+ return 'table';
12
+ } else if (DB_TYPES.has(type)) {
13
+ return 'database';
14
+ }
15
+
16
+ return 'directory';
17
+ };