1
- import { DialogError } from '@theia/core/lib/browser/dialogs' ;
2
1
import { KeybindingRegistry } from '@theia/core/lib/browser/keybinding' ;
3
- import { LabelProvider } from '@theia/core/lib/browser/label-provider' ;
4
2
import { CompositeTreeNode } from '@theia/core/lib/browser/tree' ;
5
- import { Widget } from '@theia/core/lib/browser/widgets/widget' ;
6
- import { CancellationTokenSource } from '@theia/core/lib/common/cancellation' ;
7
- import {
8
- Disposable ,
9
- DisposableCollection ,
10
- } from '@theia/core/lib/common/disposable' ;
3
+ import { DisposableCollection } from '@theia/core/lib/common/disposable' ;
11
4
import { MenuModelRegistry } from '@theia/core/lib/common/menu' ;
12
- import {
13
- Progress ,
14
- ProgressUpdate ,
15
- } from '@theia/core/lib/common/message-service-protocol' ;
5
+ import { Progress } from '@theia/core/lib/common/message-service-protocol' ;
16
6
import { nls } from '@theia/core/lib/common/nls' ;
17
7
import { injectable } from '@theia/core/shared/inversify' ;
18
- import { WorkspaceInputDialogProps } from '@theia/workspace/lib/browser/workspace-input-dialog' ;
19
- import { v4 } from 'uuid' ;
20
8
import { CreateUri } from '../create/create-uri' ;
21
9
import {
22
10
ConflictError ,
@@ -26,7 +14,7 @@ import {
26
14
isNotFound ,
27
15
} from '../create/typings' ;
28
16
import { ArduinoMenus } from '../menu/arduino-menus' ;
29
- import { WorkspaceInputDialog } from '../theia/workspace/workspace-input-dialog' ;
17
+ import { WorkspaceInputDialogWithProgress } from '../theia/workspace/workspace-input-dialog' ;
30
18
import { CloudSketchbookTree } from '../widgets/cloud-sketchbook/cloud-sketchbook-tree' ;
31
19
import { CloudSketchbookTreeModel } from '../widgets/cloud-sketchbook/cloud-sketchbook-tree-model' ;
32
20
import { SketchbookCommands } from '../widgets/sketchbook/sketchbook-commands' ;
@@ -85,7 +73,39 @@ export class NewCloudSketch extends CloudSketchContribution {
85
73
return undefined ;
86
74
}
87
75
88
- private createNewWithProgress (
76
+ private async openWizard (
77
+ rootNode : CompositeTreeNode ,
78
+ treeModel : CloudSketchbookTreeModel ,
79
+ initialValue ?: string | undefined
80
+ ) : Promise < unknown > {
81
+ const existingNames = rootNode . children
82
+ . filter ( CloudSketchbookTree . CloudSketchDirNode . is )
83
+ . map ( ( { fileStat } ) => fileStat . name ) ;
84
+ return new WorkspaceInputDialogWithProgress (
85
+ {
86
+ title : nls . localize (
87
+ 'arduino/newCloudSketch/newSketchTitle' ,
88
+ 'Name of a new Remote Sketch'
89
+ ) ,
90
+ parentUri : CreateUri . root ,
91
+ initialValue,
92
+ validate : ( input ) => {
93
+ if ( existingNames . includes ( input ) ) {
94
+ return nls . localize (
95
+ 'arduino/newCloudSketch/sketchAlreadyExists' ,
96
+ "Remote sketch '{0}' already exists." ,
97
+ input
98
+ ) ;
99
+ }
100
+ return Sketch . validateCloudSketchFolderName ( input ) ?? '' ;
101
+ } ,
102
+ } ,
103
+ this . labelProvider ,
104
+ ( value ) => this . createNewSketchWithProgress ( value , treeModel )
105
+ ) . open ( ) ;
106
+ }
107
+
108
+ private createNewSketchWithProgress (
89
109
value : string ,
90
110
treeModel : CloudSketchbookTreeModel
91
111
) : ( progress : Progress ) => Promise < unknown > {
@@ -165,38 +185,6 @@ export class NewCloudSketch extends CloudSketchContribution {
165
185
{ node }
166
186
) ;
167
187
}
168
-
169
- private async openWizard (
170
- rootNode : CompositeTreeNode ,
171
- treeModel : CloudSketchbookTreeModel ,
172
- initialValue ?: string | undefined
173
- ) : Promise < unknown > {
174
- const existingNames = rootNode . children
175
- . filter ( CloudSketchbookTree . CloudSketchDirNode . is )
176
- . map ( ( { fileStat } ) => fileStat . name ) ;
177
- return new NewCloudSketchDialog (
178
- {
179
- title : nls . localize (
180
- 'arduino/newCloudSketch/newSketchTitle' ,
181
- 'Name of a new Remote Sketch'
182
- ) ,
183
- parentUri : CreateUri . root ,
184
- initialValue,
185
- validate : ( input ) => {
186
- if ( existingNames . includes ( input ) ) {
187
- return nls . localize (
188
- 'arduino/newCloudSketch/sketchAlreadyExists' ,
189
- "Remote sketch '{0}' already exists." ,
190
- input
191
- ) ;
192
- }
193
- return Sketch . validateCloudSketchFolderName ( input ) ?? '' ;
194
- } ,
195
- } ,
196
- this . labelProvider ,
197
- ( value ) => this . createNewWithProgress ( value , treeModel )
198
- ) . open ( ) ;
199
- }
200
188
}
201
189
export namespace NewCloudSketch {
202
190
export namespace Commands {
@@ -205,94 +193,3 @@ export namespace NewCloudSketch {
205
193
} ;
206
194
}
207
195
}
208
-
209
- class NewCloudSketchDialog extends WorkspaceInputDialog {
210
- constructor (
211
- protected override readonly props : WorkspaceInputDialogProps ,
212
- protected override readonly labelProvider : LabelProvider ,
213
- private readonly withProgress : (
214
- value : string
215
- ) => ( progress : Progress ) => Promise < unknown >
216
- ) {
217
- super ( props , labelProvider ) ;
218
- }
219
- protected override async accept ( ) : Promise < void > {
220
- if ( ! this . resolve ) {
221
- return ;
222
- }
223
- this . acceptCancellationSource . cancel ( ) ;
224
- this . acceptCancellationSource = new CancellationTokenSource ( ) ;
225
- const token = this . acceptCancellationSource . token ;
226
- const value = this . value ;
227
- const error = await this . isValid ( value , 'open' ) ;
228
- if ( token . isCancellationRequested ) {
229
- return ;
230
- }
231
- if ( ! DialogError . getResult ( error ) ) {
232
- this . setErrorMessage ( error ) ;
233
- } else {
234
- const spinner = document . createElement ( 'div' ) ;
235
- spinner . classList . add ( 'spinner' ) ;
236
- const disposables = new DisposableCollection ( ) ;
237
- try {
238
- this . toggleButtons ( true ) ;
239
- disposables . push ( Disposable . create ( ( ) => this . toggleButtons ( false ) ) ) ;
240
-
241
- const closeParent = this . closeCrossNode . parentNode ;
242
- closeParent ?. removeChild ( this . closeCrossNode ) ;
243
- disposables . push (
244
- Disposable . create ( ( ) => {
245
- closeParent ?. appendChild ( this . closeCrossNode ) ;
246
- } )
247
- ) ;
248
-
249
- this . errorMessageNode . classList . add ( 'progress' ) ;
250
- disposables . push (
251
- Disposable . create ( ( ) =>
252
- this . errorMessageNode . classList . remove ( 'progress' )
253
- )
254
- ) ;
255
-
256
- const errorParent = this . errorMessageNode . parentNode ;
257
- errorParent ?. insertBefore ( spinner , this . errorMessageNode ) ;
258
- disposables . push (
259
- Disposable . create ( ( ) => errorParent ?. removeChild ( spinner ) )
260
- ) ;
261
-
262
- const cancellationSource = new CancellationTokenSource ( ) ;
263
- const progress : Progress = {
264
- id : v4 ( ) ,
265
- cancel : ( ) => cancellationSource . cancel ( ) ,
266
- report : ( update : ProgressUpdate ) => {
267
- this . setProgressMessage ( update ) ;
268
- } ,
269
- result : Promise . resolve ( value ) ,
270
- } ;
271
- await this . withProgress ( value ) ( progress ) ;
272
- } finally {
273
- disposables . dispose ( ) ;
274
- }
275
- this . resolve ( value ) ;
276
- Widget . detach ( this ) ;
277
- }
278
- }
279
-
280
- private toggleButtons ( disabled : boolean ) : void {
281
- if ( this . acceptButton ) {
282
- this . acceptButton . disabled = disabled ;
283
- }
284
- if ( this . closeButton ) {
285
- this . closeButton . disabled = disabled ;
286
- }
287
- }
288
-
289
- private setProgressMessage ( update : ProgressUpdate ) : void {
290
- if ( update . work && update . work . done === update . work . total ) {
291
- this . errorMessageNode . innerText = '' ;
292
- } else {
293
- if ( update . message ) {
294
- this . errorMessageNode . innerText = update . message ;
295
- }
296
- }
297
- }
298
- }
0 commit comments