ydb-embedded-ui 6.2.1 → 6.3.0
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/components/EntityStatus/EntityStatus.scss +4 -3
- package/dist/containers/App/App.scss +2 -3
- package/dist/containers/Tenant/Diagnostics/DiagnosticsPages.d.ts +7 -0
- package/dist/containers/Tenant/Diagnostics/DiagnosticsPages.js +2 -0
- package/dist/containers/Tenant/Diagnostics/Overview/Overview.js +1 -0
- package/dist/containers/Tenant/ObjectSummary/ObjectSummary.js +7 -4
- package/dist/containers/Tenant/Query/Preview/Preview.js +2 -2
- package/dist/containers/Tenant/Schema/SchemaViewer/helpers.js +4 -4
- package/dist/containers/Tenant/i18n/en.json +2 -1
- package/dist/containers/Tenant/i18n/index.d.ts +1 -1
- package/dist/containers/Tenant/i18n/index.js +1 -2
- package/dist/containers/Tenant/utils/queryTemplates.d.ts +2 -0
- package/dist/containers/Tenant/utils/queryTemplates.js +6 -0
- package/dist/containers/Tenant/utils/schema.d.ts +4 -3
- package/dist/containers/Tenant/utils/schema.js +12 -3
- package/dist/containers/Tenant/utils/schemaActions.js +10 -1
- package/dist/containers/Tenant/utils/schemaControls.js +1 -0
- package/dist/types/api/schema/schema.d.ts +4 -1
- package/dist/types/api/schema/schema.js +1 -0
- package/dist/types/api/schema/view.d.ts +8 -0
- package/dist/types/api/schema/view.js +1 -0
- package/package.json +3 -3
- package/dist/containers/Tenant/i18n/ru.json +0 -22
@@ -15,15 +15,16 @@
|
|
15
15
|
|
16
16
|
&__clipboard-button {
|
17
17
|
display: flex;
|
18
|
-
visibility: hidden;
|
19
18
|
flex-shrink: 0;
|
20
19
|
|
21
20
|
margin-left: 8px;
|
22
21
|
|
22
|
+
opacity: 0;
|
23
23
|
color: var(--g-color-text-secondary);
|
24
24
|
|
25
|
-
&_visible
|
26
|
-
|
25
|
+
&_visible,
|
26
|
+
&:focus-visible {
|
27
|
+
opacity: 1;
|
27
28
|
}
|
28
29
|
}
|
29
30
|
|
@@ -135,5 +135,12 @@ export declare const EXTERNAL_TABLE_PAGES: ({
|
|
135
135
|
id: "describe";
|
136
136
|
title: string;
|
137
137
|
})[];
|
138
|
+
export declare const VIEW_PAGES: ({
|
139
|
+
id: "overview";
|
140
|
+
title: string;
|
141
|
+
} | {
|
142
|
+
id: "describe";
|
143
|
+
title: string;
|
144
|
+
})[];
|
138
145
|
export declare const getPagesByType: (type?: EPathType) => Page[];
|
139
146
|
export {};
|
@@ -69,6 +69,7 @@ export const CDC_STREAM_PAGES = [overview, consumers, partitions, nodes, describ
|
|
69
69
|
export const TOPIC_PAGES = [overview, consumers, partitions, nodes, describe];
|
70
70
|
export const EXTERNAL_DATA_SOURCE_PAGES = [overview, describe];
|
71
71
|
export const EXTERNAL_TABLE_PAGES = [overview, describe];
|
72
|
+
export const VIEW_PAGES = [overview, describe];
|
72
73
|
// verbose mapping to guarantee correct tabs for new path types
|
73
74
|
// TS will error when a new type is added but not mapped here
|
74
75
|
const pathTypeToPages = {
|
@@ -84,5 +85,6 @@ const pathTypeToPages = {
|
|
84
85
|
[EPathType.EPathTypePersQueueGroup]: TOPIC_PAGES,
|
85
86
|
[EPathType.EPathTypeExternalDataSource]: EXTERNAL_DATA_SOURCE_PAGES,
|
86
87
|
[EPathType.EPathTypeExternalTable]: EXTERNAL_TABLE_PAGES,
|
88
|
+
[EPathType.EPathTypeView]: VIEW_PAGES,
|
87
89
|
};
|
88
90
|
export const getPagesByType = (type) => (type && pathTypeToPages[type]) || DIR_PAGES;
|
@@ -62,6 +62,7 @@ function Overview({ type, tenantName }) {
|
|
62
62
|
[EPathType.EPathTypePersQueueGroup]: () => _jsx(TopicInfo, { data: data }),
|
63
63
|
[EPathType.EPathTypeExternalTable]: () => _jsx(ExternalTableInfo, { data: data }),
|
64
64
|
[EPathType.EPathTypeExternalDataSource]: () => _jsx(ExternalDataSourceInfo, { data: data }),
|
65
|
+
[EPathType.EPathTypeView]: undefined,
|
65
66
|
};
|
66
67
|
return ((type && ((_a = pathTypeToComponent[type]) === null || _a === void 0 ? void 0 : _a.call(pathTypeToComponent))) || (_jsx(TableInfo, { data: data, type: type, olapStats: olapStats })));
|
67
68
|
};
|
@@ -28,7 +28,7 @@ import { SchemaViewer } from '../Schema/SchemaViewer/SchemaViewer';
|
|
28
28
|
import { TENANT_INFO_TABS, TENANT_SCHEMA_TAB, TenantTabsGroups } from '../TenantPages';
|
29
29
|
import i18n from '../i18n';
|
30
30
|
import { PaneVisibilityActionTypes, PaneVisibilityToggleButtons, paneVisibilityToggleReducerCreator, } from '../utils/paneVisibilityToggleHelpers';
|
31
|
-
import {
|
31
|
+
import { isIndexTableType, isTableType, isViewType } from '../utils/schema';
|
32
32
|
import './ObjectSummary.scss';
|
33
33
|
const b = cn('object-summary');
|
34
34
|
const getTenantCommonInfoState = () => {
|
@@ -54,13 +54,15 @@ export function ObjectSummary({ type, subType, onCollapseSummary, onExpandSummar
|
|
54
54
|
const currentObjectData = currentSchemaPath ? data[currentSchemaPath] : undefined;
|
55
55
|
const currentSchemaData = (_c = currentObjectData === null || currentObjectData === void 0 ? void 0 : currentObjectData.PathDescription) === null || _c === void 0 ? void 0 : _c.Self;
|
56
56
|
React.useEffect(() => {
|
57
|
-
|
57
|
+
// TODO: enable schema tab for view when supported
|
58
|
+
const isTable = isTableType(type) && !isViewType(type);
|
58
59
|
if (type && !isTable && !TENANT_INFO_TABS.find((el) => el.id === summaryTab)) {
|
59
60
|
dispatch(setSummaryTab(TENANT_SUMMARY_TABS_IDS.overview));
|
60
61
|
}
|
61
62
|
}, [dispatch, type, summaryTab]);
|
62
63
|
const renderTabs = () => {
|
63
|
-
|
64
|
+
// TODO: enable schema tab for view when supported
|
65
|
+
const isTable = isTableType(type) && !isViewType(type);
|
64
66
|
const tabsItems = isTable ? [...TENANT_INFO_TABS, ...TENANT_SCHEMA_TAB] : TENANT_INFO_TABS;
|
65
67
|
return (_jsx("div", { className: b('tabs'), children: _jsx(Tabs, { size: "l", items: tabsItems, activeTab: summaryTab, wrapTo: ({ id }, node) => {
|
66
68
|
const path = createHref(routes.tenant, undefined, Object.assign(Object.assign({}, queryParams), { name: tenantName, [TenantTabsGroups.summaryTab]: id }));
|
@@ -84,6 +86,7 @@ export function ObjectSummary({ type, subType, onCollapseSummary, onExpandSummar
|
|
84
86
|
[EPathType.EPathTypePersQueueGroup]: () => (_jsx(PersQueueGroupOverview, { data: currentObjectData })),
|
85
87
|
[EPathType.EPathTypeExternalTable]: () => (_jsx(ExternalTableSummary, { data: currentObjectData })),
|
86
88
|
[EPathType.EPathTypeExternalDataSource]: () => (_jsx(ExternalDataSourceSummary, { data: currentObjectData })),
|
89
|
+
[EPathType.EPathTypeView]: undefined,
|
87
90
|
};
|
88
91
|
let component = (currentSchemaData === null || currentSchemaData === void 0 ? void 0 : currentSchemaData.PathType) && ((_a = pathTypeToComponent[currentSchemaData.PathType]) === null || _a === void 0 ? void 0 : _a.call(pathTypeToComponent));
|
89
92
|
if (!component) {
|
@@ -134,7 +137,7 @@ export function ObjectSummary({ type, subType, onCollapseSummary, onExpandSummar
|
|
134
137
|
dispatch(setQueryTab(TENANT_QUERY_TABS_ID.newQuery));
|
135
138
|
};
|
136
139
|
const renderCommonInfoControls = () => {
|
137
|
-
const showPreview = isTableType(type) && !
|
140
|
+
const showPreview = isTableType(type) && !isIndexTableType(subType);
|
138
141
|
return (_jsxs(React.Fragment, { children: [showPreview && (_jsx(Button, { view: "flat-secondary", onClick: onOpenPreview, title: i18n('summary.showPreview'), children: _jsx(Icon, { name: "tablePreview", viewBox: '0 0 16 16', height: 16, width: 16 }) })), currentSchemaPath && (_jsx(ClipboardButton, { text: currentSchemaPath, view: "flat-secondary", title: i18n('summary.copySchemaPath') })), _jsx(PaneVisibilityToggleButtons, { onCollapse: onCollapseInfoHandler, onExpand: onExpandInfoHandler, isCollapsed: commonInfoVisibilityState.collapsed, initialDirection: "bottom" })] }));
|
139
142
|
};
|
140
143
|
const renderEntityTypeBadge = () => {
|
@@ -9,7 +9,7 @@ import { setShowPreview } from '../../../../store/reducers/schema/schema';
|
|
9
9
|
import { cn } from '../../../../utils/cn';
|
10
10
|
import { useTypedDispatch, useTypedSelector } from '../../../../utils/hooks';
|
11
11
|
import { prepareQueryError } from '../../../../utils/query';
|
12
|
-
import {
|
12
|
+
import { isExternalTableType, isTableType } from '../../utils/schema';
|
13
13
|
import i18n from '../i18n';
|
14
14
|
import './Preview.scss';
|
15
15
|
const b = cn('kv-preview');
|
@@ -19,7 +19,7 @@ export const Preview = ({ database, type }) => {
|
|
19
19
|
const { autorefresh, currentSchemaPath } = useTypedSelector((state) => state.schema);
|
20
20
|
const isFullscreen = useTypedSelector((state) => state.fullscreen);
|
21
21
|
const query = `--!syntax_v1\nselect * from \`${currentSchemaPath}\` limit 32`;
|
22
|
-
const { currentData, isFetching, error } = previewApi.useSendQueryQuery({ database, query, action:
|
22
|
+
const { currentData, isFetching, error } = previewApi.useSendQueryQuery({ database, query, action: isExternalTableType(type) ? 'execute-query' : 'execute-scan' }, { pollingInterval: autorefresh, skip: !isPreviewAvailable });
|
23
23
|
const loading = isFetching && currentData === undefined;
|
24
24
|
const data = currentData !== null && currentData !== void 0 ? currentData : {};
|
25
25
|
const handleClosePreview = () => {
|
@@ -2,7 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import DataTable from '@gravity-ui/react-data-table';
|
3
3
|
import { Icon } from '../../../../components/Icon';
|
4
4
|
import { EColumnCodec } from '../../../../types/api/schema';
|
5
|
-
import { isColumnEntityType,
|
5
|
+
import { isColumnEntityType, isExternalTableType, isRowTableType, isTableType, } from '../../utils/schema';
|
6
6
|
export const SchemaViewerColumns = {
|
7
7
|
id: 'Id',
|
8
8
|
name: 'Name',
|
@@ -51,7 +51,7 @@ export function prepareColumnDescriptions(type, scheme) {
|
|
51
51
|
keyColumnIds = (_b = columnTableSchema.KeyColumnIds) !== null && _b !== void 0 ? _b : [];
|
52
52
|
columns = (_c = columnTableSchema.Columns) !== null && _c !== void 0 ? _c : [];
|
53
53
|
}
|
54
|
-
else if (
|
54
|
+
else if (isExternalTableType(type)) {
|
55
55
|
columns = (_f = (_e = (_d = scheme === null || scheme === void 0 ? void 0 : scheme.PathDescription) === null || _d === void 0 ? void 0 : _d.ExternalTableDescription) === null || _e === void 0 ? void 0 : _e.Columns) !== null && _f !== void 0 ? _f : [];
|
56
56
|
}
|
57
57
|
else {
|
@@ -83,7 +83,7 @@ export function prepareSchemaTableColumns(options) {
|
|
83
83
|
width: 60,
|
84
84
|
},
|
85
85
|
];
|
86
|
-
if (!
|
86
|
+
if (!isExternalTableType(options.type)) {
|
87
87
|
// External tables don't have key columns
|
88
88
|
columns.push({
|
89
89
|
name: SchemaViewerColumns.key,
|
@@ -116,7 +116,7 @@ export function prepareSchemaTableColumns(options) {
|
|
116
116
|
return undefined;
|
117
117
|
},
|
118
118
|
});
|
119
|
-
if (options.withFamilies &&
|
119
|
+
if (options.withFamilies && isRowTableType(options.type)) {
|
120
120
|
columns.push({
|
121
121
|
name: SchemaViewerColumns.familyName,
|
122
122
|
width: 100,
|
@@ -7,14 +7,15 @@
|
|
7
7
|
"summary.copySchemaPath": "Copy schema path",
|
8
8
|
"actions.copied": "The path is copied to the clipboard",
|
9
9
|
"actions.notCopied": "Couldn’t copy the path",
|
10
|
-
"actions.externalTableSelectUnavailable": "Select query for external tables available only with 'YQL - QueryService' query mode. You need to turn in additional query modes in settings to enable it",
|
11
10
|
"actions.copyPath": "Copy path",
|
12
11
|
"actions.openPreview": "Open preview",
|
13
12
|
"actions.createTable": "Create table...",
|
14
13
|
"actions.createExternalTable": "Create external table...",
|
15
14
|
"actions.createTopic": "Create topic...",
|
15
|
+
"actions.createView": "Create view...",
|
16
16
|
"actions.dropTable": "Drop table...",
|
17
17
|
"actions.dropTopic": "Drop topic...",
|
18
|
+
"actions.dropView": "Drop view...",
|
18
19
|
"actions.alterTable": "Alter table...",
|
19
20
|
"actions.alterTopic": "Alter topic...",
|
20
21
|
"actions.selectQuery": "Select query...",
|
@@ -1,2 +1,2 @@
|
|
1
|
-
declare const _default: (key: "page.title" | "acl.owner" | "acl.empty" | "summary.navigation" | "summary.showPreview" | "summary.copySchemaPath" | "actions.copied" | "actions.notCopied" | "actions.
|
1
|
+
declare const _default: (key: "page.title" | "acl.owner" | "acl.empty" | "summary.navigation" | "summary.showPreview" | "summary.copySchemaPath" | "actions.copied" | "actions.notCopied" | "actions.copyPath" | "actions.openPreview" | "actions.createTable" | "actions.createExternalTable" | "actions.createTopic" | "actions.createView" | "actions.dropTable" | "actions.dropTopic" | "actions.dropView" | "actions.alterTable" | "actions.alterTopic" | "actions.selectQuery" | "actions.upsertQuery", params?: import("@gravity-ui/i18n").Params | undefined) => string;
|
2
2
|
export default _default;
|
@@ -7,3 +7,5 @@ export declare const createExternalTableTemplate: (path: string) => string;
|
|
7
7
|
export declare const createTopicTemplate: (path: string) => string;
|
8
8
|
export declare const alterTopicTemplate: (path: string) => string;
|
9
9
|
export declare const dropTopicTemplate: (path: string) => string;
|
10
|
+
export declare const createViewTemplate: (path: string) => string;
|
11
|
+
export declare const dropViewTemplate: (path: string) => string;
|
@@ -105,3 +105,9 @@ ALTER TOPIC \`${path}\`
|
|
105
105
|
export const dropTopicTemplate = (path) => {
|
106
106
|
return `DROP TOPIC \`${path}\`;`;
|
107
107
|
};
|
108
|
+
export const createViewTemplate = (path) => {
|
109
|
+
return `CREATE VIEW \`${path}/my_view\` WITH (security_invoker = TRUE) AS SELECT 1;`;
|
110
|
+
};
|
111
|
+
export const dropViewTemplate = (path) => {
|
112
|
+
return `DROP VIEW \`${path}\`;`;
|
113
|
+
};
|
@@ -5,12 +5,13 @@ export declare const mapPathTypeToNavigationTreeType: (type?: EPathType, subType
|
|
5
5
|
export declare const mapPathTypeToEntityName: (type?: EPathType, subType?: EPathSubType) => string | undefined;
|
6
6
|
export declare const mapDatabaseTypeToDBName: (type?: ETenantType) => string | undefined;
|
7
7
|
export declare const isTableType: (pathType?: EPathType) => boolean;
|
8
|
-
export declare const
|
8
|
+
export declare const isIndexTableType: (subType?: EPathSubType) => boolean;
|
9
9
|
export declare const isColumnEntityType: (type?: EPathType) => boolean;
|
10
10
|
export declare const isDatabaseEntityType: (type?: EPathType) => boolean;
|
11
11
|
export declare const isCdcStreamEntityType: (type?: EPathType) => boolean;
|
12
12
|
export declare const isEntityWithMergedImplementation: (type?: EPathType) => boolean;
|
13
13
|
export declare const isChildlessPathType: (type?: EPathType, subType?: EPathSubType) => boolean;
|
14
14
|
export declare const isPathTypeWithTopic: (type?: EPathType) => boolean;
|
15
|
-
export declare const
|
16
|
-
export declare const
|
15
|
+
export declare const isExternalTableType: (type?: EPathType) => boolean;
|
16
|
+
export declare const isRowTableType: (type?: EPathType) => boolean;
|
17
|
+
export declare const isViewType: (type?: EPathType) => boolean;
|
@@ -22,6 +22,7 @@ const pathTypeToNodeType = {
|
|
22
22
|
[EPathType.EPathTypePersQueueGroup]: 'topic',
|
23
23
|
[EPathType.EPathTypeExternalDataSource]: 'external_data_source',
|
24
24
|
[EPathType.EPathTypeExternalTable]: 'external_table',
|
25
|
+
[EPathType.EPathTypeView]: 'view',
|
25
26
|
};
|
26
27
|
export const mapPathTypeToNavigationTreeType = (type = EPathType.EPathTypeDir, subType, defaultType = 'directory') => (subType && pathSubTypeToNodeType[subType]) || pathTypeToNodeType[type] || defaultType;
|
27
28
|
// ====================
|
@@ -44,6 +45,7 @@ const pathTypeToEntityName = {
|
|
44
45
|
[EPathType.EPathTypePersQueueGroup]: 'Topic',
|
45
46
|
[EPathType.EPathTypeExternalDataSource]: 'External Data Source',
|
46
47
|
[EPathType.EPathTypeExternalTable]: 'External Table',
|
48
|
+
[EPathType.EPathTypeView]: 'View',
|
47
49
|
};
|
48
50
|
export const mapPathTypeToEntityName = (type, subType) => (subType && pathSubTypeToEntityName[subType]) || (type && pathTypeToEntityName[type]);
|
49
51
|
// ====================
|
@@ -60,6 +62,7 @@ const pathTypeToIsTable = {
|
|
60
62
|
[EPathType.EPathTypeTable]: true,
|
61
63
|
[EPathType.EPathTypeColumnTable]: true,
|
62
64
|
[EPathType.EPathTypeExternalTable]: true,
|
65
|
+
[EPathType.EPathTypeView]: true,
|
63
66
|
[EPathType.EPathTypeInvalid]: false,
|
64
67
|
[EPathType.EPathTypeDir]: false,
|
65
68
|
[EPathType.EPathTypeSubDomain]: false,
|
@@ -78,7 +81,7 @@ const pathSubTypeToIsIndexImpl = {
|
|
78
81
|
[EPathSubType.EPathSubTypeStreamImpl]: false,
|
79
82
|
[EPathSubType.EPathSubTypeEmpty]: false,
|
80
83
|
};
|
81
|
-
export const
|
84
|
+
export const isIndexTableType = (subType) => { var _a; return (_a = (subType && pathSubTypeToIsIndexImpl[subType])) !== null && _a !== void 0 ? _a : false; };
|
82
85
|
// ====================
|
83
86
|
const pathTypeToIsColumn = {
|
84
87
|
[EPathType.EPathTypeColumnStore]: true,
|
@@ -93,6 +96,7 @@ const pathTypeToIsColumn = {
|
|
93
96
|
[EPathType.EPathTypePersQueueGroup]: false,
|
94
97
|
[EPathType.EPathTypeExternalDataSource]: false,
|
95
98
|
[EPathType.EPathTypeExternalTable]: false,
|
99
|
+
[EPathType.EPathTypeView]: false,
|
96
100
|
};
|
97
101
|
export const isColumnEntityType = (type) => { var _a; return (_a = (type && pathTypeToIsColumn[type])) !== null && _a !== void 0 ? _a : false; };
|
98
102
|
// ====================
|
@@ -109,6 +113,7 @@ const pathTypeToIsDatabase = {
|
|
109
113
|
[EPathType.EPathTypePersQueueGroup]: false,
|
110
114
|
[EPathType.EPathTypeExternalDataSource]: false,
|
111
115
|
[EPathType.EPathTypeExternalTable]: false,
|
116
|
+
[EPathType.EPathTypeView]: false,
|
112
117
|
};
|
113
118
|
export const isDatabaseEntityType = (type) => { var _a; return (_a = (type && pathTypeToIsDatabase[type])) !== null && _a !== void 0 ? _a : false; };
|
114
119
|
// ====================
|
@@ -127,6 +132,7 @@ const pathTypeToEntityWithMergedImplementation = {
|
|
127
132
|
[EPathType.EPathTypeExtSubDomain]: false,
|
128
133
|
[EPathType.EPathTypeExternalDataSource]: false,
|
129
134
|
[EPathType.EPathTypeExternalTable]: false,
|
135
|
+
[EPathType.EPathTypeView]: false,
|
130
136
|
};
|
131
137
|
export const isEntityWithMergedImplementation = (type) => { var _a; return (_a = (type && pathTypeToEntityWithMergedImplementation[type])) !== null && _a !== void 0 ? _a : false; };
|
132
138
|
// ====================
|
@@ -141,6 +147,7 @@ const pathTypeToChildless = {
|
|
141
147
|
[EPathType.EPathTypePersQueueGroup]: true,
|
142
148
|
[EPathType.EPathTypeExternalDataSource]: true,
|
143
149
|
[EPathType.EPathTypeExternalTable]: true,
|
150
|
+
[EPathType.EPathTypeView]: true,
|
144
151
|
[EPathType.EPathTypeInvalid]: false,
|
145
152
|
[EPathType.EPathTypeColumnStore]: false,
|
146
153
|
[EPathType.EPathTypeColumnTable]: false,
|
@@ -165,8 +172,10 @@ const mapPathTypeToIsWithTopic = {
|
|
165
172
|
[EPathType.EPathTypeExtSubDomain]: false,
|
166
173
|
[EPathType.EPathTypeExternalDataSource]: false,
|
167
174
|
[EPathType.EPathTypeExternalTable]: false,
|
175
|
+
[EPathType.EPathTypeView]: false,
|
168
176
|
};
|
169
177
|
export const isPathTypeWithTopic = (type) => { var _a; return (_a = (type && mapPathTypeToIsWithTopic[type])) !== null && _a !== void 0 ? _a : false; };
|
170
178
|
// ====================
|
171
|
-
export const
|
172
|
-
export const
|
179
|
+
export const isExternalTableType = (type) => type === EPathType.EPathTypeExternalTable;
|
180
|
+
export const isRowTableType = (type) => type === EPathType.EPathTypeTable;
|
181
|
+
export const isViewType = (type) => type === EPathType.EPathTypeView;
|
@@ -4,7 +4,7 @@ import { TENANT_PAGES_IDS, TENANT_QUERY_TABS_ID } from '../../../store/reducers/
|
|
4
4
|
import { setQueryTab, setTenantPage } from '../../../store/reducers/tenant/tenant';
|
5
5
|
import createToast from '../../../utils/createToast';
|
6
6
|
import i18n from '../i18n';
|
7
|
-
import { alterTableTemplate, alterTopicTemplate, createExternalTableTemplate, createTableTemplate, createTopicTemplate, dropExternalTableTemplate, dropTopicTemplate, selectQueryTemplate, upsertQueryTemplate, } from './queryTemplates';
|
7
|
+
import { alterTableTemplate, alterTopicTemplate, createExternalTableTemplate, createTableTemplate, createTopicTemplate, createViewTemplate, dropExternalTableTemplate, dropTopicTemplate, dropViewTemplate, selectQueryTemplate, upsertQueryTemplate, } from './queryTemplates';
|
8
8
|
const bindActions = (path, dispatch, additionalEffects) => {
|
9
9
|
const { setActivePath, setQueryMode } = additionalEffects;
|
10
10
|
const inputQuery = (tmpl, mode) => () => {
|
@@ -27,6 +27,8 @@ const bindActions = (path, dispatch, additionalEffects) => {
|
|
27
27
|
createTopic: inputQuery(createTopicTemplate, 'script'),
|
28
28
|
alterTopic: inputQuery(alterTopicTemplate, 'script'),
|
29
29
|
dropTopic: inputQuery(dropTopicTemplate, 'script'),
|
30
|
+
createView: inputQuery(createViewTemplate, 'script'),
|
31
|
+
dropView: inputQuery(dropViewTemplate, 'script'),
|
30
32
|
copyPath: () => {
|
31
33
|
try {
|
32
34
|
copy(path);
|
@@ -54,6 +56,7 @@ export const getActions = (dispatch, additionalEffects) => (path, type) => {
|
|
54
56
|
[
|
55
57
|
{ text: i18n('actions.createTable'), action: actions.createTable },
|
56
58
|
{ text: i18n('actions.createTopic'), action: actions.createTopic },
|
59
|
+
{ text: i18n('actions.createView'), action: actions.createView },
|
57
60
|
],
|
58
61
|
];
|
59
62
|
const TABLE_SET = [
|
@@ -85,6 +88,11 @@ export const getActions = (dispatch, additionalEffects) => (path, type) => {
|
|
85
88
|
[copyItem],
|
86
89
|
[{ text: i18n('actions.createExternalTable'), action: actions.createExternalTable }],
|
87
90
|
];
|
91
|
+
const VIEW_SET = [
|
92
|
+
[copyItem],
|
93
|
+
[{ text: i18n('actions.selectQuery'), action: actions.selectQuery }],
|
94
|
+
[{ text: i18n('actions.dropView'), action: actions.dropView }],
|
95
|
+
];
|
88
96
|
const JUST_COPY = [copyItem];
|
89
97
|
// verbose mapping to guarantee a correct actions set for new node types
|
90
98
|
// TS will error when a new type is added in the lib but is not mapped here
|
@@ -99,6 +107,7 @@ export const getActions = (dispatch, additionalEffects) => (path, type) => {
|
|
99
107
|
index: JUST_COPY,
|
100
108
|
external_table: EXTERNAL_TABLE_SET,
|
101
109
|
external_data_source: EXTERNAL_DATA_SOURCE_SET,
|
110
|
+
view: VIEW_SET,
|
102
111
|
};
|
103
112
|
return nodeTypeToActions[type];
|
104
113
|
};
|
@@ -6,6 +6,7 @@ import type { TExternalTableDescription } from './externalTable';
|
|
6
6
|
import type { TPersQueueGroupDescription } from './persQueueGroup';
|
7
7
|
import type { TTableDescription, TTableStats } from './table';
|
8
8
|
import type { TIndexDescription } from './tableIndex';
|
9
|
+
import type { TViewDescription } from './view';
|
9
10
|
/**
|
10
11
|
* source: https://github.com/ydb-platform/ydb/blob/main/ydb/core/protos/flat_tx_scheme.proto
|
11
12
|
*/
|
@@ -68,6 +69,7 @@ export interface TPathDescription {
|
|
68
69
|
PersQueueGroup?: TPersQueueGroupDescription;
|
69
70
|
ExternalTableDescription?: TExternalTableDescription;
|
70
71
|
ExternalDataSourceDescription?: TExternalDataSourceDescription;
|
72
|
+
ViewDescription?: TViewDescription;
|
71
73
|
}
|
72
74
|
export interface TDirEntry {
|
73
75
|
Name?: string;
|
@@ -211,7 +213,8 @@ export declare enum EPathType {
|
|
211
213
|
EPathTypeColumnTable = "EPathTypeColumnTable",
|
212
214
|
EPathTypeCdcStream = "EPathTypeCdcStream",
|
213
215
|
EPathTypeExternalDataSource = "EPathTypeExternalDataSource",
|
214
|
-
EPathTypeExternalTable = "EPathTypeExternalTable"
|
216
|
+
EPathTypeExternalTable = "EPathTypeExternalTable",
|
217
|
+
EPathTypeView = "EPathTypeView"
|
215
218
|
}
|
216
219
|
export declare enum EPathSubType {
|
217
220
|
EPathSubTypeEmpty = "EPathSubTypeEmpty",
|
@@ -40,6 +40,7 @@ export var EPathType;
|
|
40
40
|
EPathType["EPathTypeCdcStream"] = "EPathTypeCdcStream";
|
41
41
|
EPathType["EPathTypeExternalDataSource"] = "EPathTypeExternalDataSource";
|
42
42
|
EPathType["EPathTypeExternalTable"] = "EPathTypeExternalTable";
|
43
|
+
EPathType["EPathTypeView"] = "EPathTypeView";
|
43
44
|
})(EPathType || (EPathType = {}));
|
44
45
|
export var EPathSubType;
|
45
46
|
(function (EPathSubType) {
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "ydb-embedded-ui",
|
3
|
-
"version": "6.
|
3
|
+
"version": "6.3.0",
|
4
4
|
"files": [
|
5
5
|
"dist"
|
6
6
|
],
|
@@ -13,7 +13,7 @@
|
|
13
13
|
"@bem-react/classname": "^1.6.0",
|
14
14
|
"@gravity-ui/axios-wrapper": "^1.4.1",
|
15
15
|
"@gravity-ui/chartkit": "^5.5.0",
|
16
|
-
"@gravity-ui/components": "^3.
|
16
|
+
"@gravity-ui/components": "^3.4.1",
|
17
17
|
"@gravity-ui/date-utils": "^2.4.0",
|
18
18
|
"@gravity-ui/i18n": "^1.5.0",
|
19
19
|
"@gravity-ui/icons": "^2.9.1",
|
@@ -48,7 +48,7 @@
|
|
48
48
|
"url": "^0.11.3",
|
49
49
|
"use-query-params": "^2.2.1",
|
50
50
|
"web-vitals": "^1.1.2",
|
51
|
-
"ydb-ui-components": "^4.
|
51
|
+
"ydb-ui-components": "^4.1.0"
|
52
52
|
},
|
53
53
|
"scripts": {
|
54
54
|
"analyze": "source-map-explorer 'build/static/js/*.js'",
|
@@ -1,22 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"page.title": "База данных",
|
3
|
-
"acl.owner": "Владелец",
|
4
|
-
"acl.empty": "Нет данных об Acl",
|
5
|
-
"summary.navigation": "Навигация",
|
6
|
-
"summary.showPreview": "Показать превью",
|
7
|
-
"summary.copySchemaPath": "Скопировать путь",
|
8
|
-
"actions.copied": "Путь успешно скопирован",
|
9
|
-
"actions.notCopied": "Не получилось скопировать путь",
|
10
|
-
"actions.externalTableSelectUnavailable": "Select запрос для внешних таблиц доступен только в режиме 'YQL - QueryService'. Вам необходимо включить дополнительные режимы выполнения запросов в настройках",
|
11
|
-
"actions.copyPath": "Скопировать путь",
|
12
|
-
"actions.openPreview": "Открыть превью",
|
13
|
-
"actions.createTable": "Создать таблицу...",
|
14
|
-
"actions.createExternalTable": "Создать внешнюю таблицу...",
|
15
|
-
"actions.createTopic": "Создать топик...",
|
16
|
-
"actions.dropTable": "Удалить таблицу...",
|
17
|
-
"actions.dropTopic": "Удалить топик...",
|
18
|
-
"actions.alterTable": "Изменить таблицу...",
|
19
|
-
"actions.alterTopic": "Изменить топик...",
|
20
|
-
"actions.selectQuery": "Select запрос...",
|
21
|
-
"actions.upsertQuery": "Upsert запрос..."
|
22
|
-
}
|