Skip to content

Commit 23def27

Browse files
authored
Support choosing settings scope for Add Server command (#274)
1 parent 6556839 commit 23def27

File tree

2 files changed

+49
-7
lines changed

2 files changed

+49
-7
lines changed

src/api/addServer.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { getServerNames } from "./getServerNames";
44

55
export async function addServer(
66
scope?: vscode.ConfigurationScope,
7+
target: vscode.ConfigurationTarget = vscode.ConfigurationTarget.Global
78
): Promise<string | undefined> {
89
const serverNames = getServerNames(scope);
910
const spec: IJSONServerSpec = { webServer: { scheme: "", host: "", port: 0 } };
@@ -112,21 +113,28 @@ export async function addServer(
112113
});
113114
if (scheme) {
114115
spec.webServer.scheme = scheme;
116+
const levelStr =
117+
target == vscode.ConfigurationTarget.WorkspaceFolder ? "workspace-folder" :
118+
target == vscode.ConfigurationTarget.Workspace ? "workspace" :
119+
"user";
115120
try {
116121
const config = vscode.workspace.getConfiguration(
117122
"intersystems",
118123
scope,
119124
);
120-
// For simplicity we always add to the user-level (aka Global) settings
121-
const servers: any =
122-
config.inspect("servers")?.globalValue || {};
125+
const serversInspection = config.inspect("servers");
126+
const servers = (
127+
target == vscode.ConfigurationTarget.WorkspaceFolder ? serversInspection?.workspaceFolderValue :
128+
target == vscode.ConfigurationTarget.Workspace ? serversInspection?.workspaceValue :
129+
serversInspection?.globalValue
130+
) ?? {};
123131
servers[name] = spec;
124-
await config.update("servers", servers, true);
125-
vscode.window.showInformationMessage(`Server '${name}' stored in user-level settings.`);
132+
await config.update("servers", servers, target);
133+
vscode.window.showInformationMessage(`Server '${name}' stored in ${levelStr}-level settings.`);
126134
return name;
127135
} catch (error) {
128136
vscode.window.showErrorMessage(
129-
`Failed to store server '${name}' definition. Does your settings.json file contain a JSON syntax error?`,
137+
`Failed to store server '${name}' definition. Does your ${levelStr}-level settings file contain a JSON syntax error?`,
130138
);
131139
return undefined;
132140
}

src/commonActivate.ts

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,41 @@ export function commonActivate(context: vscode.ExtensionContext, view: ServerMan
112112
view.refreshTree();
113113
}),
114114
vscode.commands.registerCommand(`${extensionId}.addServer`, async () => {
115-
const name = await addServer();
115+
let scope: vscode.ConfigurationScope | undefined;
116+
let target: vscode.ConfigurationTarget | undefined;
117+
if (vscode.workspace.workspaceFolders) {
118+
interface SettingsScope extends vscode.QuickPickItem {
119+
scope?: vscode.ConfigurationScope;
120+
target: vscode.ConfigurationTarget;
121+
}
122+
const options: SettingsScope[] = [{ label: "Global", detail: "User Settings", target: vscode.ConfigurationTarget.Global }];
123+
if (vscode.workspace.workspaceFile) {
124+
// The workspace is a file, so each folder may be its own option
125+
options.push(
126+
{ label: "Workspace", detail: vscode.workspace.workspaceFile.toString(true), target: vscode.ConfigurationTarget.Workspace },
127+
...vscode.workspace.workspaceFolders
128+
.filter(f => !["isfs", "isfs-readonly"].includes(f.uri.scheme))
129+
.map(f => {
130+
return { label: f.name, detail: f.uri.toString(true), scope: f, target: vscode.ConfigurationTarget.WorkspaceFolder };
131+
})
132+
);
133+
} else {
134+
// The workspace is a single local folder, so that is the only other option
135+
options.push({ label: "Workspace", detail: vscode.workspace.workspaceFolders[0]?.uri.toString(true) ?? "Current folder", target: vscode.ConfigurationTarget.Workspace });
136+
}
137+
const choice = await vscode.window.showQuickPick(options, {
138+
ignoreFocusOut: true,
139+
title: "Pick a settngs scope in which to add the server definition"
140+
});
141+
if (!choice) return;
142+
scope = choice.scope;
143+
target = choice.target;
144+
} else {
145+
// No workspace is open, so global is the only option
146+
scope = undefined;
147+
target = vscode.ConfigurationTarget.Global;
148+
}
149+
const name = await addServer(scope, target);
116150
if (name) {
117151
await view.addToRecents(name);
118152
}

0 commit comments

Comments
 (0)