1
1
import { useRef , useEffect } from 'react' ;
2
2
import { type Monaco , type monacoTypes , type MonacoEditor } from '@grafana/ui' ;
3
3
import { languages } from 'monaco-editor' ;
4
- import { STAGE_OPERATORS } from '@mongodb-js/mongodb-constants'
5
-
6
- interface CompletionState {
7
- name : string ;
8
- description : string ;
9
- fields ?: string [ ] | string ;
10
- }
4
+ import { STAGE_OPERATORS , EXPRESSION_OPERATORS , ACCUMULATORS , CONVERSION_OPERATORS , QUERY_OPERATORS } from '@mongodb-js/mongodb-constants'
11
5
12
6
// Supports JSON only right now
13
7
class CompletionProvider implements monacoTypes . languages . CompletionItemProvider {
@@ -46,18 +40,27 @@ class CompletionProvider implements monacoTypes.languages.CompletionItemProvider
46
40
endColumn : word . endColumn ,
47
41
} ;
48
42
49
- const suggestions : languages . CompletionItem [ ] = STAGE_OPERATORS . map ( ( stage ) => ( {
43
+ const stageSuggestions : languages . CompletionItem [ ] = STAGE_OPERATORS . map ( ( stage ) => ( {
50
44
label : `"${ stage . name } "` ,
51
45
kind : languages . CompletionItemKind . Function ,
52
46
insertText : `"\\${ stage . name } ": ${ stage . snippet } ` ,
53
47
range : range ,
54
- detail : ' stage' ,
48
+ detail : stage . meta ,
55
49
documentation : stage . description ,
56
50
insertTextRules : languages . CompletionItemInsertTextRule . InsertAsSnippet ,
57
51
} ) ) ;
58
52
53
+ const expressionSuggestions : languages . CompletionItem [ ] = [ ...EXPRESSION_OPERATORS , ...ACCUMULATORS , ...CONVERSION_OPERATORS , ...QUERY_OPERATORS ] . map ( ( expression ) => ( {
54
+ label : `"${ expression . name } "` ,
55
+ kind : languages . CompletionItemKind . Function ,
56
+ insertText : `"\\${ expression . name } ": \${1:expression}` ,
57
+ range : range ,
58
+ detail : expression . meta ,
59
+ insertTextRules : languages . CompletionItemInsertTextRule . InsertAsSnippet ,
60
+ } ) ) ;
61
+
59
62
return {
60
- suggestions : suggestions ,
63
+ suggestions : [ ... stageSuggestions , ... expressionSuggestions ] ,
61
64
} ;
62
65
}
63
66
}
@@ -75,29 +78,4 @@ export function useAutocomplete() {
75
78
const { dispose } = monaco . languages . registerCompletionItemProvider ( 'json' , provider ) ;
76
79
autocompleteDisposeFun . current = dispose ;
77
80
} ;
78
- }
79
-
80
- function createInsertText ( { name, fields } : CompletionState ) {
81
- if ( fields ) {
82
- if ( Array . isArray ( fields ) ) {
83
- let insertText = `"\\${ name } ": {\n\t` ;
84
- for ( let i = 0 ; i < fields . length ; i ++ ) {
85
- const field = fields [ i ] ;
86
- insertText += `"${ field } ": \${${ i + 1 } :${ field } }` ;
87
-
88
- if ( i === 0 ) {
89
- insertText += '$0' ;
90
- }
91
-
92
- if ( i !== fields . length - 1 ) {
93
- insertText += ',\n\t' ;
94
- }
95
- }
96
- insertText += '\n}' ;
97
-
98
- return insertText ;
99
- }
100
- return `"\\${ name } ": \${1:${ fields } }` ;
101
- }
102
- return `"\\${ name } ": {\n\t$0\n}` ;
103
- }
81
+ }
0 commit comments