@@ -20,28 +20,35 @@ export class FindModuleFeature implements IFeature {
20
20
21
21
private command : vscode . Disposable ;
22
22
private languageClient : LanguageClient ;
23
+ private cancelFindToken : vscode . CancellationTokenSource ;
23
24
24
25
constructor ( ) {
25
26
this . command = vscode . commands . registerCommand ( 'PowerShell.PowerShellFindModule' , ( ) => {
26
- var items : QuickPickItem [ ] = [ ] ;
27
+ // It takes a while to get the list of PowerShell modules, display some UI to let user know
28
+ this . cancelFindToken = new vscode . CancellationTokenSource ( ) ;
29
+ vscode . window
30
+ . showQuickPick (
31
+ [ "Cancel" ] ,
32
+ { placeHolder : "Please wait, retrieving list of PowerShell modules. This can take some time..." } ,
33
+ this . cancelFindToken . token )
34
+ . then ( response => { if ( response === "Cancel" ) { this . clearCancelFindToken ( ) ; } } ) ;
35
+
36
+ // Cancel the loading prompt after 60 seconds
37
+ setTimeout ( ( ) => {
38
+ if ( this . cancelFindToken ) {
39
+ this . clearCancelFindToken ( ) ;
40
+
41
+ vscode . window . showErrorMessage (
42
+ "The online source for PowerShell modules is not responding. Cancelling Find/Install PowerShell command." ) ;
43
+ }
44
+ } , 60000 ) ;
27
45
28
- vscode . window . setStatusBarMessage ( this . getCurrentTime ( ) + " Initializing..." ) ;
29
- this . languageClient . sendRequest ( FindModuleRequest . type , null ) . then ( ( modules ) => {
30
- for ( var item in modules ) {
31
- items . push ( { label : modules [ item ] . name , description : modules [ item ] . description } ) ;
32
- } ;
33
-
34
- vscode . window . setStatusBarMessage ( "" ) ;
35
- Window . showQuickPick ( items , { placeHolder : "Results: (" + modules . length + ")" } ) . then ( ( selection ) => {
36
- if ( ! selection ) { return ; }
37
- switch ( selection . label ) {
38
- default :
39
- var moduleName = selection . label ;
40
- //vscode.window.setStatusBarMessage("Installing PowerShell Module " + moduleName, 1500);
41
- this . languageClient . sendRequest ( InstallModuleRequest . type , moduleName ) ;
42
- }
43
- } ) ;
44
- } ) ;
46
+ this . pickPowerShellModule ( ) . then ( ( moduleName ) => {
47
+ if ( moduleName ) {
48
+ // vscode.window.setStatusBarMessage("Installing PowerShell Module " + moduleName, 1500);
49
+ this . languageClient . sendRequest ( InstallModuleRequest . type , moduleName ) ;
50
+ }
51
+ } ) ;
45
52
} ) ;
46
53
}
47
54
@@ -53,18 +60,43 @@ export class FindModuleFeature implements IFeature {
53
60
this . command . dispose ( ) ;
54
61
}
55
62
56
- private getCurrentTime ( ) {
63
+ private pickPowerShellModule ( ) : Thenable < string > {
64
+ return this . languageClient . sendRequest ( FindModuleRequest . type , null ) . then ( ( modules ) => {
65
+ var items : QuickPickItem [ ] = [ ] ;
66
+
67
+ // We've got the modules info, let's cancel the timeout unless it's already been cancelled
68
+ if ( this . cancelFindToken ) {
69
+ this . clearCancelFindToken ( ) ;
70
+ }
71
+ else {
72
+ // Already timed out, would be weird to dislay modules after we said it timed out.
73
+ return Promise . resolve ( "" ) ;
74
+ }
57
75
58
- var timeNow = new Date ( ) ;
59
- var hours = timeNow . getHours ( ) ;
60
- var minutes = timeNow . getMinutes ( ) ;
61
- var seconds = timeNow . getSeconds ( ) ;
76
+ for ( var item in modules ) {
77
+ items . push ( { label : modules [ item ] . name , description : modules [ item ] . description } ) ;
78
+ } ;
62
79
63
- var timeString = "" + ( ( hours > 12 ) ? hours - 12 : hours ) ;
64
- timeString += ( ( minutes < 10 ) ? ":0" : ":" ) + minutes ;
65
- timeString += ( ( seconds < 10 ) ? ":0" : ":" ) + seconds ;
66
- timeString += ( hours >= 12 ) ? " PM" : " AM" ;
80
+ if ( items . length === 0 ) {
81
+ return Promise . reject ( "No PowerShell modules were found." ) ;
82
+ }
67
83
68
- return timeString ;
84
+ let options : vscode . QuickPickOptions = {
85
+ placeHolder : "Select a PowerShell module to install" ,
86
+ matchOnDescription : true ,
87
+ matchOnDetail : true
88
+ } ;
89
+
90
+ return vscode . window . showQuickPick ( items , options ) . then ( item => {
91
+ return item ? item . label : "" ;
92
+ } ) ;
93
+ } ) ;
69
94
}
70
- }
95
+
96
+ private clearCancelFindToken ( ) {
97
+ if ( this . cancelFindToken ) {
98
+ this . cancelFindToken . dispose ( ) ;
99
+ this . cancelFindToken = undefined ;
100
+ }
101
+ }
102
+ }
0 commit comments