@@ -4,7 +4,7 @@ import { compact, findIndex } from 'lodash'
4
4
import cx from 'classnames'
5
5
import { EuiButtonIcon , EuiText , EuiToolTip } from '@elastic/eui'
6
6
import * as monacoEditor from 'monaco-editor/esm/vs/editor/editor.api'
7
- import MonacoEditor from 'react-monaco-editor'
7
+ import MonacoEditor , { monaco } from 'react-monaco-editor'
8
8
9
9
import {
10
10
Theme ,
@@ -13,10 +13,12 @@ import {
13
13
KEYBOARD_SHORTCUTS ,
14
14
} from 'uiSrc/constants'
15
15
import {
16
+ actionTriggerParameterHints ,
16
17
decoration ,
17
- geMonacoAction ,
18
+ getMonacoAction ,
18
19
getRedisCompletionProvider ,
19
20
getRedisMonarchTokensProvider ,
21
+ getRedisSignatureHelpProvider ,
20
22
MonacoAction ,
21
23
Nullable ,
22
24
toModelDeltaDecoration
@@ -53,19 +55,21 @@ const Query = (props: Props) => {
53
55
const { theme } = useContext ( ThemeContext )
54
56
const monacoObjects = useRef < Nullable < IEditorMount > > ( null )
55
57
let disposeCompletionItemProvider = ( ) => { }
58
+ let disposeSignatureHelpProvider = ( ) => { }
56
59
57
60
useEffect ( ( ) =>
58
61
// componentWillUnmount
59
62
( ) => {
60
63
disposeCompletionItemProvider ( )
64
+ disposeSignatureHelpProvider ( )
61
65
} ,
62
66
[ ] )
63
67
64
68
useEffect ( ( ) => {
65
69
if ( ! monacoObjects . current ) return
66
70
const commands = query . split ( '\n' )
67
71
const { monaco, editor } = monacoObjects . current
68
- const notCommandRegEx = / ^ [ \s | / / ] /
72
+ const notCommandRegEx = / ^ \s | \/ \/ /
69
73
70
74
const newDecorations = compact ( commands . map ( ( command , index ) => {
71
75
if ( ! command || notCommandRegEx . test ( command ) ) return null
@@ -94,6 +98,32 @@ const Query = (props: Props) => {
94
98
onSubmit ( value )
95
99
}
96
100
101
+ const onTriggerParameterHints = ( ) => {
102
+ if ( ! monacoObjects . current ) return
103
+
104
+ const { editor } = monacoObjects ?. current
105
+ const model = editor . getModel ( )
106
+ const { lineNumber = 0 } = editor . getPosition ( ) ?? { }
107
+ const lineContent = model ?. getLineContent ( lineNumber ) ?. trim ( ) ?? ''
108
+ const matchedCommand = REDIS_COMMANDS_ARRAY . find ( ( command ) => lineContent ?. trim ( ) . startsWith ( command ) ) ?? ''
109
+ // trigger parameter hints only ones between command and arguments in the same line
110
+ const isTriggerHints = lineContent . split ( ' ' ) . length < ( 2 + matchedCommand . split ( ' ' ) . length )
111
+
112
+ if ( isTriggerHints ) {
113
+ actionTriggerParameterHints ( editor )
114
+ }
115
+ }
116
+
117
+ const onKeyDownMonaco = ( e :monacoEditor . IKeyboardEvent ) => {
118
+ if (
119
+ e . keyCode === monaco . KeyCode . Tab
120
+ || e . keyCode === monaco . KeyCode . Space
121
+ || e . keyCode === monaco . KeyCode . Enter
122
+ ) {
123
+ onTriggerParameterHints ( )
124
+ }
125
+ }
126
+
97
127
const editorDidMount = (
98
128
editor : monacoEditor . editor . IStandaloneCodeEditor ,
99
129
monaco : typeof monacoEditor
@@ -103,8 +133,12 @@ const Query = (props: Props) => {
103
133
editor . focus ( )
104
134
setQueryEl ( editor )
105
135
136
+ editor . onKeyDown ( onKeyDownMonaco )
137
+
106
138
setupMonacoRedisLang ( monaco )
107
- editor . addAction ( geMonacoAction ( MonacoAction . Submit , ( editor ) => handleSubmit ( editor . getValue ( ) ) , monaco ) )
139
+ editor . addAction (
140
+ getMonacoAction ( MonacoAction . Submit , ( editor ) => handleSubmit ( editor . getValue ( ) ) , monaco )
141
+ )
108
142
}
109
143
110
144
const setupMonacoRedisLang = ( monaco : typeof monacoEditor ) => {
@@ -117,6 +151,12 @@ const Query = (props: Props) => {
117
151
MonacoLanguage . Redis ,
118
152
getRedisCompletionProvider ( REDIS_COMMANDS_SPEC )
119
153
) . dispose
154
+
155
+ disposeSignatureHelpProvider = monaco . languages . registerSignatureHelpProvider (
156
+ MonacoLanguage . Redis ,
157
+ getRedisSignatureHelpProvider ( REDIS_COMMANDS_SPEC , REDIS_COMMANDS_ARRAY )
158
+ ) . dispose
159
+
120
160
monaco . languages . setLanguageConfiguration ( MonacoLanguage . Redis , redisLanguageConfig )
121
161
monaco . languages . setMonarchTokensProvider (
122
162
MonacoLanguage . Redis ,
@@ -131,6 +171,11 @@ const Query = (props: Props) => {
131
171
automaticLayout : true ,
132
172
formatOnPaste : false ,
133
173
glyphMargin : true ,
174
+ suggest : {
175
+ preview : true ,
176
+ showStatusBar : true ,
177
+ showIcons : false ,
178
+ } ,
134
179
lineNumbersMinChars : 4
135
180
// fontFamily: 'Inconsolata',
136
181
// fontSize: 16,
0 commit comments