1- import React , { ForwardedRef , forwardRef , useEffect , useImperativeHandle , useRef , useState } from 'react' ;
1+ import React , { ForwardedRef , forwardRef , useEffect , useImperativeHandle , useRef } from 'react' ;
22import cs from 'classnames' ;
33import { useTheme } from '@/hooks' ;
44import * 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 ;
85import { editorDefaultOptions , EditorThemeType , ThemeType } from '@/constants' ;
96import styles from './index.less' ;
10- import { useUpdateEffect } from '@/hooks' ;
7+
118export type IEditorIns = monaco . editor . IStandaloneCodeEditor ;
129export type IEditorOptions = monaco . editor . IStandaloneEditorConstructionOptions ;
1310export type IEditorContentChangeEvent = monaco . editor . IModelContentChangedEvent ;
@@ -16,33 +13,108 @@ export type IAppendValue = {
1613 text : any ;
1714 range ?: IRangeType ;
1815} ;
16+
1917interface 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
3633export interface IExportRefFunction {
3734 getCurrentSelectContent : ( ) => string ;
3835 getAllContent : ( ) => string ;
3936 setValue : ( text : any , range ?: IRangeType ) => void ;
40- handleRegisterTigger : ( hintData : IHintData ) => void ;
4137}
4238
4339export 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
47119function 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 ) ;
0 commit comments