Skip to content

Commit ef2be80

Browse files
committed
merge
2 parents 161c69d + a1e7076 commit ef2be80

28 files changed

Lines changed: 2885 additions & 418 deletions

File tree

chat2db-client/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
"monaco-editor-esm-webpack-plugin": "^2.1.0",
4040
"monaco-editor-webpack-plugin": "^7.0.1",
4141
"node-machine-id": "^1.1.12",
42+
"react-monaco-editor": "^0.54.0",
4243
"react-sortablejs": "^6.1.4",
4344
"sql-formatter": "^12.2.1",
4445
"styled-components": "^6.0.1",

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ interface IProps {
2525
databaseName: string;
2626
dataSourceId: number;
2727
type: DatabaseTypeCode;
28-
schemaName: string;
28+
schemaName?: string;
2929
consoleId: number;
3030
consoleName: string;
3131
initDDL: string;
@@ -47,6 +47,7 @@ const SQLExecute = memo<IProps>((props) => {
4747
const { doubleClickTreeNodeData, curTableList, curWorkspaceParams } = workspaceModel;
4848
const [tableLoading, setTableLoading] = useState(false);
4949
const controllerRef = useRef<AbortController>();
50+
5051
useEffect(() => {
5152
if (!doubleClickTreeNodeData) {
5253
return;

chat2db-client/src/components/Console/MonacoEditor/index.tsx

Lines changed: 85 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
1-
import React, { ForwardedRef, forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react';
1+
import React, { ForwardedRef, forwardRef, useEffect, useImperativeHandle, useRef } from 'react';
22
import cs from 'classnames';
33
import { useTheme } from '@/hooks';
44
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
5-
import { language } from 'monaco-editor/esm/vs/basic-languages/sql/sql';
6-
const { keywords: SQLKeys } = language;
7-
const { keywords } = language;
85
import { editorDefaultOptions, EditorThemeType, ThemeType } from '@/constants';
96
import styles from './index.less';
10-
import { useUpdateEffect } from '@/hooks';
7+
118
export type IEditorIns = monaco.editor.IStandaloneCodeEditor;
129
export type IEditorOptions = monaco.editor.IStandaloneEditorConstructionOptions;
1310
export type IEditorContentChangeEvent = monaco.editor.IModelContentChangedEvent;
@@ -16,33 +13,108 @@ export type IAppendValue = {
1613
text: any;
1714
range?: IRangeType;
1815
};
16+
1917
interface IProps {
20-
id: string | number;
18+
id: string;
2119
isActive?: boolean;
2220
language?: string;
2321
className?: string;
2422
options?: IEditorOptions;
2523
needDestroy?: boolean;
2624
addAction?: Array<{ id: string; label: string; action: (selectedText: string) => void }>;
25+
defaultValue?: string;
2726
appendValue?: IAppendValue;
2827
// onChange?: (v: string, e?: IEditorContentChangeEvent) => void;
2928
didMount?: (editor: IEditorIns) => any;
3029
onSave?: (value: string) => void; // 快捷键保存的回调
31-
defaultValue?: string;
3230
onExecute?: (value: string) => void; // 快捷键执行的回调
33-
tables?: any[];
3431
}
3532

3633
export interface IExportRefFunction {
3734
getCurrentSelectContent: () => string;
3835
getAllContent: () => string;
3936
setValue: (text: any, range?: IRangeType) => void;
40-
handleRegisterTigger: (hintData: IHintData) => void;
4137
}
4238

4339
export interface IHintData {
4440
[keys: string]: string[];
4541
}
42+
// monaco.languages.registerCompletionItemProvider(`sql`, {
43+
// triggerCharacters: [' ', '('],
44+
// provideCompletionItems: (model: monaco.editor.ITextModel, position: monaco.Position) => {
45+
// const { lineNumber, column } = position;
46+
// const textBeforePointer = model.getValueInRange({
47+
// startLineNumber: lineNumber,
48+
// startColumn: 0,
49+
// endLineNumber: lineNumber,
50+
// endColumn: column,
51+
// });
52+
// const tokens = textBeforePointer.trim().split(/\s+/);
53+
// const lastToken = tokens[tokens.length - 1]; // 获取最后一段非空字符串
54+
// const lastTokenBefore = tokens[tokens.length - 2]; // 获取最后一段非空字符串
55+
56+
// // 后面显示表名
57+
// if (
58+
// ['FROM', 'JOIN', 'UPDATE', 'DELETE'].includes(lastToken.toUpperCase()) ||
59+
// ['INSERT INTO', 'ALTER TABLE', 'DROP TABLE'].includes((lastTokenBefore + ' ' + lastToken).toUpperCase())
60+
// ) {
61+
// return {
62+
// // suggestions: [
63+
// // {
64+
// // label: 'table1(datasource1)',
65+
// // kind: monaco.languages.CompletionItemKind.Method,
66+
// // insertText: 'table1',
67+
// // detail: '<Table>',
68+
// // },
69+
// // ],
70+
// suggestions: getTableSuggest(tableList),
71+
// };
72+
// }
73+
74+
// // // 后面显示字段名
75+
// // if (['SELECT'].includes(lastToken.toUpperCase())) {
76+
// // return {
77+
// // suggestions: [
78+
// // {
79+
// // label: 'field1(table1)',
80+
// // kind: monaco.languages.CompletionItemKind.Field,
81+
// // insertText: 'field1',
82+
// // detail: '<Field>',
83+
// // },
84+
// // {
85+
// // label: '*',
86+
// // kind: monaco.languages.CompletionItemKind.Field,
87+
// // insertText: '*',
88+
// // detail: '<Field>',
89+
// // },
90+
// // ],
91+
// // };
92+
// // }
93+
94+
// return {
95+
// suggestions: [
96+
// ...getSQLKeywords(),
97+
// ...getSQLFunctions(),
98+
// ...getTableSuggest([
99+
// {
100+
// tableName: 'table1',
101+
// datasourceName: 'datasource1',
102+
// },
103+
// ]),
104+
// ...getFieldSuggest([
105+
// {
106+
// tableName: 'table1',
107+
// fields: [
108+
// {
109+
// name: 'field1',
110+
// },
111+
// ],
112+
// },
113+
// ]),
114+
// ],
115+
// };
116+
// },
117+
// });
46118

47119
function MonacoEditor(props: IProps, ref: ForwardedRef<IExportRefFunction>) {
48120
const {
@@ -124,8 +196,11 @@ function MonacoEditor(props: IProps, ref: ForwardedRef<IExportRefFunction>) {
124196
});
125197

126198
createAction(editorIns);
199+
127200
return () => {
128-
if (props.needDestroy) editorRef.current && editorRef.current.dispose();
201+
if (props.needDestroy) {
202+
editorRef.current && editorRef.current.dispose();
203+
}
129204
};
130205
}, []);
131206

@@ -153,16 +228,7 @@ function MonacoEditor(props: IProps, ref: ForwardedRef<IExportRefFunction>) {
153228
monaco.editor.setTheme(appTheme.backgroundColor);
154229
}, [appTheme.backgroundColor, options?.theme]);
155230

156-
// useEffect(() => {
157-
// const _ref = editorRef.current?.onDidChangeModelContent((e) => {
158-
// const curVal = editorRef.current?.getValue();
159-
// props.onChange?.(curVal || '', e);
160-
// });
161-
// return () => _ref && _ref.dispose();
162-
// }, [props.onChange]);
163-
164231
useImperativeHandle(ref, () => ({
165-
handleRegisterTigger,
166232
getCurrentSelectContent,
167233
getAllContent,
168234
setValue,
@@ -199,72 +265,6 @@ function MonacoEditor(props: IProps, ref: ForwardedRef<IExportRefFunction>) {
199265
return value || '';
200266
};
201267

202-
const handleRegisterTigger = (hintData: IHintData) => {
203-
// 获取 SQL 语法提示
204-
const getSQLSuggest = () => {
205-
return SQLKeys.map((key: any) => ({
206-
label: key,
207-
kind: monaco.languages.CompletionItemKind.Keyword,
208-
insertText: key,
209-
detail: '<Keywords>',
210-
}));
211-
};
212-
213-
// 获取一级数据
214-
const getFirstSuggest = () => {
215-
return Object.keys(hintData).map((key) => ({
216-
label: key,
217-
kind: monaco.languages.CompletionItemKind.Method,
218-
insertText: `${key}`,
219-
detail: '<Database>',
220-
}));
221-
};
222-
223-
// 获取二级数据
224-
// const getSecondSuggest = (keys: string) => {
225-
// const secondNames = hintData[keys];
226-
// if (!secondNames) {
227-
// return [];
228-
// }
229-
// return (secondNames || []).map((name: any) => ({
230-
// label: name,
231-
// kind: monaco.languages.CompletionItemKind.Snippet,
232-
// insertText: name,
233-
// detail: '<Table>',
234-
// }));
235-
// };
236-
const editorHintExamples = monaco.languages.registerCompletionItemProvider('sql', {
237-
triggerCharacters: [' ', ...SQLKeys],
238-
provideCompletionItems: (model: monaco.editor.ITextModel, position: monaco.Position) => {
239-
let suggestions: any = [];
240-
const { lineNumber, column } = position;
241-
const textBeforePointer = model.getValueInRange({
242-
startLineNumber: lineNumber,
243-
startColumn: 0,
244-
endLineNumber: lineNumber,
245-
endColumn: column,
246-
});
247-
const tokens = textBeforePointer.trim().split(/\s+/);
248-
const lastToken = tokens[tokens.length - 1]; // 获取最后一段非空字符串
249-
250-
if (lastToken.endsWith('.')) {
251-
const tokenNoDot = lastToken.slice(0, lastToken.length - 1);
252-
// suggestions = [...getSecondSuggest(tokenNoDot)];
253-
suggestions = [];
254-
} else if (lastToken === '.') {
255-
suggestions = [];
256-
} else {
257-
suggestions = [...getFirstSuggest(), ...getSQLSuggest()];
258-
}
259-
return {
260-
suggestions,
261-
};
262-
},
263-
});
264-
265-
return editorHintExamples;
266-
};
267-
268268
const createAction = (editor: IEditorIns) => {
269269
// 用于控制切换该菜单键的显示
270270
const shouldShowSqlRunnerAction = editor.createContextKey('shouldShowSqlRunnerAction', true);
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
2+
.monaco-editor .suggest-widget .suggest-icon.method {
3+
background-image: url('../../../assets/logo/logo.png');
4+
background-size: contain; /* 如果需要,确保图标大小适合容器 */
5+
}

0 commit comments

Comments
 (0)