Skip to content

Commit 9a8aed4

Browse files
committed
open view
1 parent 8cc46af commit 9a8aed4

14 files changed

Lines changed: 380 additions & 61 deletions

File tree

chat2db-client/src/blocks/SQLExecute/index.tsx

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import React, { memo, useRef, useState } from 'react';
1+
import React, { memo, useEffect, useRef, useState } from 'react';
22
import styles from './index.less';
33
import classnames from 'classnames';
44
import DraggableContainer from '@/components/DraggableContainer';
55
import ConsoleEditor, { IConsoleRef } from '@/components/ConsoleEditor';
66
import SearchResult, { ISearchResultRef } from '@/components/SearchResult';
77
import { DatabaseTypeCode, ConsoleStatus } from '@/constants';
8-
import { useUpdateEffect } from '@/hooks/useUpdateEffect';
8+
99
interface IProps {
1010
boundInfo: {
1111
databaseName: string;
@@ -16,6 +16,8 @@ interface IProps {
1616
status: ConsoleStatus;
1717
};
1818
initDDL: string;
19+
// 异步加载sql
20+
loadSQL: () => Promise<string>;
1921
}
2022

2123
interface IContext {
@@ -31,15 +33,24 @@ interface IContext {
3133
}
3234

3335
const SQLExecute = memo<IProps>((props) => {
34-
const { boundInfo: _boundInfo, initDDL } = props;
36+
const { boundInfo: _boundInfo, initDDL, loadSQL } = props;
3537
const draggableRef = useRef<any>();
3638
const searchResultRef = useRef<ISearchResultRef>(null);
3739
const consoleRef = useRef<IConsoleRef>(null);
38-
const [boundInfo, setBoundInfo] = useState(_boundInfo)
40+
const [boundInfo, setBoundInfo] = useState(_boundInfo);
41+
42+
43+
useEffect(() => {
44+
if(loadSQL){
45+
loadSQL().then((sql) => {
46+
consoleRef.current?.editorRef?.setValue(sql, 'cover');
47+
});
48+
}
49+
}, []);
3950

40-
useUpdateEffect(() => {
41-
consoleRef.current?.editorRef?.setValue(initDDL, 'cover');
42-
}, [initDDL]);
51+
// useUpdateEffect(() => {
52+
// consoleRef.current?.editorRef?.setValue(initDDL, 'cover');
53+
// }, [initDDL]);
4354

4455
return (
4556
<div className={classnames(styles.sqlExecute)}>

chat2db-client/src/blocks/Tree/TreeNodeRightClick/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ function TreeNodeRightClick(props: IProps) {
5252
const monacoEditorRef = useRef<IExportRefFunction>(null);
5353

5454
const operationColumnConfig: { [key in OperationColumn]: (data: ITreeNode) => IOperationColumnConfigItem } = {
55+
// 刷新
5556
[OperationColumn.Refresh]: () => {
5657
return {
5758
text: i18n('common.button.refresh'),
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
import { OperationColumn, WorkspaceTabType } from '@/constants';
2+
import sqlService from '@/service/sql';
3+
4+
export const openView = (props:{
5+
addWorkspaceTab: any;
6+
treeNodeData: any;
7+
}) => {
8+
const {addWorkspaceTab,treeNodeData} = props;
9+
addWorkspaceTab({
10+
id: `${OperationColumn.OpenView}-${treeNodeData.uuid}` ,
11+
title: treeNodeData.name,
12+
type: WorkspaceTabType.VIEW,
13+
uniqueData: {
14+
dataSourceId: treeNodeData.extraParams!.dataSourceId!,
15+
databaseType: treeNodeData.extraParams!.databaseType!,
16+
databaseName: treeNodeData.extraParams?.databaseName,
17+
schemaName: treeNodeData.extraParams?.schemaName,
18+
loadSQL: ()=>{
19+
return new Promise((resolve) => {
20+
sqlService
21+
.getViewDetail({
22+
dataSourceId: treeNodeData.extraParams!.dataSourceId!,
23+
databaseType: treeNodeData.extraParams!.databaseType!,
24+
databaseName: treeNodeData.extraParams!.databaseName!,
25+
schemaName: treeNodeData.extraParams?.schemaName,
26+
tableName: treeNodeData.name
27+
} as any)
28+
.then((res) => {
29+
// 更新ddl
30+
resolve(res.ddl);
31+
});
32+
});
33+
}
34+
},
35+
});
36+
}
37+
38+
export const openFunction = (props:{
39+
addWorkspaceTab: any;
40+
treeNodeData: any;
41+
}) => {
42+
const {addWorkspaceTab,treeNodeData} = props;
43+
addWorkspaceTab({
44+
id: `${OperationColumn.OpenFunction}-${treeNodeData.uuid}` ,
45+
title: treeNodeData.name,
46+
type: WorkspaceTabType.FUNCTION,
47+
uniqueData: {
48+
dataSourceId: treeNodeData.extraParams!.dataSourceId!,
49+
databaseType: treeNodeData.extraParams!.databaseType!,
50+
databaseName: treeNodeData.extraParams?.databaseName,
51+
schemaName: treeNodeData.extraParams?.schemaName,
52+
loadSQL: ()=>{
53+
return new Promise((resolve) => {
54+
sqlService
55+
.getFunctionDetail({
56+
dataSourceId: treeNodeData.extraParams!.dataSourceId!,
57+
databaseType: treeNodeData.extraParams!.databaseType!,
58+
databaseName: treeNodeData.extraParams!.databaseName!,
59+
schemaName: treeNodeData.extraParams?.schemaName,
60+
functionName: treeNodeData.name
61+
} as any)
62+
.then((res) => {
63+
// 更新ddl
64+
resolve(res.functionBody);
65+
});
66+
});
67+
}
68+
},
69+
});
70+
}
71+
72+
export const openProcedure = (props:{
73+
addWorkspaceTab: any;
74+
treeNodeData: any;
75+
}) => {
76+
const {addWorkspaceTab,treeNodeData} = props;
77+
addWorkspaceTab({
78+
id: `${OperationColumn.OpenProcedure}-${treeNodeData.uuid}` ,
79+
title: treeNodeData.name,
80+
type: WorkspaceTabType.PROCEDURE,
81+
uniqueData: {
82+
dataSourceId: treeNodeData.extraParams!.dataSourceId!,
83+
databaseType: treeNodeData.extraParams!.databaseType!,
84+
databaseName: treeNodeData.extraParams?.databaseName,
85+
schemaName: treeNodeData.extraParams?.schemaName,
86+
loadSQL: ()=>{
87+
return new Promise((resolve) => {
88+
sqlService
89+
.getProcedureDetail({
90+
dataSourceId: treeNodeData.extraParams!.dataSourceId!,
91+
databaseType: treeNodeData.extraParams!.databaseType!,
92+
databaseName: treeNodeData.extraParams!.databaseName!,
93+
schemaName: treeNodeData.extraParams?.schemaName,
94+
procedureName: treeNodeData.name
95+
} as any)
96+
.then((res) => {
97+
// 更新ddl
98+
resolve(res.procedureBody);
99+
});
100+
});
101+
}
102+
},
103+
});
104+
}
105+
106+
export const openTrigger = (props:{
107+
addWorkspaceTab: any;
108+
treeNodeData: any;
109+
}) => {
110+
const {addWorkspaceTab,treeNodeData} = props;
111+
addWorkspaceTab({
112+
id: `${OperationColumn.OpenTrigger}-${treeNodeData.uuid}` ,
113+
title: treeNodeData.name,
114+
type: WorkspaceTabType.TRIGGER,
115+
uniqueData: {
116+
dataSourceId: treeNodeData.extraParams!.dataSourceId!,
117+
databaseType: treeNodeData.extraParams!.databaseType!,
118+
databaseName: treeNodeData.extraParams?.databaseName,
119+
schemaName: treeNodeData.extraParams?.schemaName,
120+
loadSQL: ()=>{
121+
return new Promise((resolve) => {
122+
sqlService
123+
.getTriggerDetail({
124+
dataSourceId: treeNodeData.extraParams!.dataSourceId!,
125+
databaseType: treeNodeData.extraParams!.databaseType!,
126+
databaseName: treeNodeData.extraParams!.databaseName!,
127+
schemaName: treeNodeData.extraParams?.schemaName,
128+
triggerName: treeNodeData.name
129+
} as any)
130+
.then((res) => {
131+
// 更新ddl
132+
resolve(res.triggerBody);
133+
});
134+
});
135+
}
136+
},
137+
});
138+
}
139+
140+
141+
142+
143+

chat2db-client/src/blocks/Tree/hooks/useGetRightClickMenu.ts

Lines changed: 94 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ import { useMemo } from 'react';
1414
// ----- store -----
1515
import { createConsole, addWorkspaceTab } from '@/store/console';
1616

17+
// ---- functions -----
18+
import { openView, openFunction, openProcedure, openTrigger } from '../functions/openAsyncSql';
19+
1720
interface IProps {
1821
treeNodeData: ITreeNode;
1922
loadData: any;
@@ -66,6 +69,7 @@ export const useGetRightClickMenu = (props: IProps) => {
6669
});
6770
},
6871
},
72+
6973
// 创建console
7074
[OperationColumn.CreateConsole]: {
7175
text: i18n('workspace.menu.queryConsole'),
@@ -80,6 +84,7 @@ export const useGetRightClickMenu = (props: IProps) => {
8084
});
8185
},
8286
},
87+
8388
// 创建表
8489
[OperationColumn.CreateTable]: {
8590
text: i18n('editTable.button.createTable'),
@@ -98,6 +103,7 @@ export const useGetRightClickMenu = (props: IProps) => {
98103
});
99104
},
100105
},
106+
101107
// 删除表
102108
[OperationColumn.DeleteTable]: {
103109
text: i18n('workspace.menu.deleteTable'),
@@ -106,6 +112,7 @@ export const useGetRightClickMenu = (props: IProps) => {
106112
// setVerifyDialog(true);
107113
},
108114
},
115+
109116
// 查看ddl
110117
[OperationColumn.ViewDDL]: {
111118
text: i18n('workspace.menu.ViewDDL'),
@@ -114,18 +121,34 @@ export const useGetRightClickMenu = (props: IProps) => {
114121
//
115122
},
116123
},
124+
117125
// 置顶
118126
[OperationColumn.Top]: {
119127
text: treeNodeData.pinned ? i18n('workspace.menu.unPin') : i18n('workspace.menu.pin'),
120128
icon: treeNodeData.pinned ? '\ue61d' : '\ue627',
121129
handle: () => {},
122130
},
131+
123132
// 编辑表
124133
[OperationColumn.EditTable]: {
125134
text: i18n('workspace.menu.editTable'),
126135
icon: '\ue602',
127-
handle: () => {},
136+
handle: () => {
137+
addWorkspaceTab({
138+
id: `${OperationColumn.EditTable}-${treeNodeData.uuid}`,
139+
title: i18n('editTable.button.createTable'),
140+
type: WorkspaceTabType.EditTable,
141+
uniqueData: {
142+
dataSourceId: treeNodeData.extraParams!.dataSourceId!,
143+
databaseType: treeNodeData.extraParams!.databaseType!,
144+
databaseName: treeNodeData.extraParams?.databaseName,
145+
schemaName: treeNodeData.extraParams?.schemaName,
146+
tableName: treeNodeData?.name,
147+
},
148+
});
149+
},
128150
},
151+
129152
// 复制名称
130153
[OperationColumn.CopyName]: {
131154
text: i18n('common.button.copyName'),
@@ -134,13 +157,83 @@ export const useGetRightClickMenu = (props: IProps) => {
134157
navigator.clipboard.writeText(treeNodeData.name);
135158
},
136159
},
160+
161+
// 打开表
162+
[OperationColumn.OpenTable]: {
163+
text: i18n('workspace.menu.openTable'),
164+
icon: '\ue618',
165+
handle: () => {
166+
addWorkspaceTab({
167+
id: `${OperationColumn.OpenTable}-${treeNodeData.uuid}`,
168+
title: treeNodeData.name,
169+
type: WorkspaceTabType.EditTableData,
170+
uniqueData: {
171+
dataSourceId: treeNodeData.extraParams!.dataSourceId!,
172+
databaseType: treeNodeData.extraParams!.databaseType!,
173+
databaseName: treeNodeData.extraParams?.databaseName,
174+
schemaName: treeNodeData.extraParams?.schemaName,
175+
sql: `select * from ${treeNodeData.name}`,
176+
},
177+
});
178+
},
179+
},
180+
181+
// 打开视图
182+
[OperationColumn.OpenView]: {
183+
text: i18n('workspace.menu.view'),
184+
icon: '\ue651',
185+
handle: () => {
186+
openView({
187+
addWorkspaceTab,
188+
treeNodeData,
189+
});
190+
},
191+
},
192+
193+
// 打开函数
194+
[OperationColumn.OpenFunction]: {
195+
text: i18n('workspace.menu.view'),
196+
icon: '\ue651',
197+
handle: () => {
198+
openFunction({
199+
addWorkspaceTab,
200+
treeNodeData,
201+
});
202+
},
203+
},
204+
205+
// 打开存储过程
206+
[OperationColumn.OpenProcedure]: {
207+
text: i18n('workspace.menu.view'),
208+
icon: '\ue651',
209+
handle: () => {
210+
openProcedure({
211+
addWorkspaceTab,
212+
treeNodeData,
213+
});
214+
},
215+
},
216+
217+
// 打开触发器
218+
[OperationColumn.OpenTrigger]: {
219+
text: i18n('workspace.menu.view'),
220+
icon: '\ue651',
221+
handle: () => {
222+
openTrigger({
223+
addWorkspaceTab,
224+
treeNodeData,
225+
});
226+
},
227+
},
137228
};
138229

230+
// 根据配置生成右键菜单
139231
return excludeSomeOperation().map((t, i) => {
140232
const concrete = operationColumnConfig[t];
141233
return {
142234
key: i,
143235
onClick: concrete?.handle,
236+
type: t,
144237
labelProps: {
145238
icon: concrete?.icon,
146239
label: concrete?.text,

0 commit comments

Comments
 (0)