Skip to content

Commit 9feebed

Browse files
committed
Find module display quick pick list first.
This PR puts the quick pick list up first with "Cancel" as the only item and text that indicates what is happening and that it could take some time. @daviwil - please check my use of the CancellationTokenSource - especially in the pickPowerShellModule function where the request completes but the user (or timeout) has already cancelled the op. Not sure about returning Promise.resolve(""). My JavaScript FU is pretty weak. Also feel free to help with the wording of the various messages in the UI. Finally what timeout should we use? I set it for 1 minute but that might be long. It seems to take ~20 seconds on my machine. But as the gallery grows, so could that time. Finally, for the future, it would be nice if we could detect a user key press and if the find isn't done - cancel and restart a new find based on what the user typed. Also, need timer support so that you only kick off a new find after say 1 second of paused typing.
1 parent 3d9319b commit 9feebed

File tree

1 file changed

+61
-29
lines changed

1 file changed

+61
-29
lines changed

src/features/PowerShellFindModule.ts

+61-29
Original file line numberDiff line numberDiff line change
@@ -20,28 +20,35 @@ export class FindModuleFeature implements IFeature {
2020

2121
private command: vscode.Disposable;
2222
private languageClient: LanguageClient;
23+
private cancelFindToken: vscode.CancellationTokenSource;
2324

2425
constructor() {
2526
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);
2745

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+
});
4552
});
4653
}
4754

@@ -53,18 +60,43 @@ export class FindModuleFeature implements IFeature {
5360
this.command.dispose();
5461
}
5562

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+
}
5775

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+
};
6279

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+
}
6783

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+
});
6994
}
70-
}
95+
96+
private clearCancelFindToken() {
97+
if (this.cancelFindToken) {
98+
this.cancelFindToken.dispose();
99+
this.cancelFindToken = undefined;
100+
}
101+
}
102+
}

0 commit comments

Comments
 (0)