@@ -88,6 +88,15 @@ export class MonitorWidget extends ReactWidget {
88
88
this . update ( ) ;
89
89
}
90
90
91
+ protected onActivateRequest ( msg : Message ) : void {
92
+ super . onActivateRequest ( msg ) ;
93
+ ( this . focusNode || this . node ) . focus ( ) ;
94
+ }
95
+
96
+ protected onFocusResolved = ( element : HTMLElement | undefined ) => {
97
+ this . focusNode = element ;
98
+ }
99
+
91
100
protected get lineEndings ( ) : OptionsType < SelectOption < MonitorModel . EOL > > {
92
101
return [
93
102
{
@@ -121,7 +130,9 @@ export class MonitorWidget extends ReactWidget {
121
130
return < div className = 'serial-monitor-container' >
122
131
< div className = 'head' >
123
132
< div className = 'send' >
124
- < SerialMonitorSendField onSend = { this . onSend } />
133
+ < SerialMonitorSendField
134
+ resolveFocus = { this . onFocusResolved }
135
+ onSend = { this . onSend } />
125
136
</ div >
126
137
< div className = 'config' >
127
138
< ArduinoSelect
@@ -162,7 +173,8 @@ export class MonitorWidget extends ReactWidget {
162
173
163
174
export namespace SerialMonitorSendField {
164
175
export interface Props {
165
- readonly onSend : ( text : string ) => void
176
+ readonly onSend : ( text : string ) => void ;
177
+ readonly resolveFocus : ( element : HTMLElement | undefined ) => void ;
166
178
}
167
179
export interface State {
168
180
value : string ;
@@ -171,8 +183,6 @@ export namespace SerialMonitorSendField {
171
183
172
184
export class SerialMonitorSendField extends React . Component < SerialMonitorSendField . Props , SerialMonitorSendField . State > {
173
185
174
- protected inputField : HTMLInputElement | null ;
175
-
176
186
constructor ( props : SerialMonitorSendField . Props ) {
177
187
super ( props ) ;
178
188
this . state = { value : '' } ;
@@ -181,17 +191,11 @@ export class SerialMonitorSendField extends React.Component<SerialMonitorSendFie
181
191
this . handleSubmit = this . handleSubmit . bind ( this ) ;
182
192
}
183
193
184
- componentDidMount ( ) {
185
- if ( this . inputField ) {
186
- this . inputField . focus ( ) ;
187
- }
188
- }
189
-
190
194
render ( ) {
191
195
return < React . Fragment >
192
196
< input
193
197
tabIndex = { - 1 }
194
- ref = { ref => this . inputField = ref }
198
+ ref = { this . setRef }
195
199
id = 'serial-monitor-send'
196
200
type = 'text'
197
201
autoComplete = 'off'
@@ -201,6 +205,12 @@ export class SerialMonitorSendField extends React.Component<SerialMonitorSendFie
201
205
</ React . Fragment >
202
206
}
203
207
208
+ protected setRef = ( element : HTMLElement | null ) => {
209
+ if ( this . props . resolveFocus ) {
210
+ this . props . resolveFocus ( element || undefined ) ;
211
+ }
212
+ }
213
+
204
214
protected handleChange ( event : React . ChangeEvent < HTMLInputElement > ) {
205
215
this . setState ( { value : event . target . value } ) ;
206
216
}
0 commit comments