Skip to content

Commit 4e775eb

Browse files
committed
Implement #321 - Contribute to empty Explorer content
1 parent c802cdb commit 4e775eb

File tree

3 files changed

+108
-3
lines changed

3 files changed

+108
-3
lines changed

package.json

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
"onCommand:vscode-objectscript.explorer.open",
5959
"onCommand:vscode-objectscript.compileFolder",
6060
"onCommand:vscode-objectscript.importFolder",
61+
"onCommand:vscode-objectscript.addServerNamespaceToWorkspace",
6162
"onLanguage:objectscript",
6263
"onLanguage:objectscript-class",
6364
"onLanguage:objectscript-macros",
@@ -70,6 +71,12 @@
7071
],
7172
"main": "./dist/extension",
7273
"contributes": {
74+
"viewsWelcome": [
75+
{
76+
"view": "explorer",
77+
"contents": "You can also create a new workspace that connects to an [InterSystems server](https://marketplace.visualstudio.com/items?itemName=intersystems-community.servermanager)\n[Choose Server and Namespace](command:vscode-objectscript.addServerNamespaceToWorkspace)"
78+
}
79+
],
7380
"menus": {
7481
"commandPalette": [
7582
{
@@ -296,6 +303,11 @@
296303
}
297304
],
298305
"explorer/context": [
306+
{
307+
"command": "vscode-objectscript.addServerNamespaceToWorkspace",
308+
"when": "explorerResourceIsFolder",
309+
"group": "2_workspace"
310+
},
299311
{
300312
"command": "vscode-objectscript.compileFolder",
301313
"when": "vscode-objectscript.connectActive && resourceScheme == file",
@@ -551,6 +563,11 @@
551563
"category": "ObjectScript",
552564
"command": "vscode-objectscript.serverCommands.contextOther",
553565
"title": "Server Command Menu..."
566+
},
567+
{
568+
"category": "ObjectScript",
569+
"command": "vscode-objectscript.addServerNamespaceToWorkspace",
570+
"title": "Add Server Namespace to Workspace..."
554571
}
555572
],
556573
"keybindings": [
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import * as vscode from "vscode";
2+
import { AtelierAPI } from "../api";
3+
4+
export async function addServerNamespaceToWorkspace(): Promise<void> {
5+
const serverManagerApi = await getServerManagerApi();
6+
if (!serverManagerApi) {
7+
vscode.window.showErrorMessage(
8+
"This command requires the [InterSystems Server Manager](https://marketplace.visualstudio.com/items?itemName=intersystems-community.servermanager) extension to be installed and enabled."
9+
);
10+
return;
11+
}
12+
// Get user's choice of server
13+
const options: vscode.QuickPickOptions = { ignoreFocusOut: true };
14+
const serverName: string = await serverManagerApi.pickServer(undefined, options);
15+
if (!serverName) {
16+
return;
17+
}
18+
// Get its namespace list
19+
let uri = vscode.Uri.parse(`isfs://${serverName}/?ns=%SYS`);
20+
const api = new AtelierAPI(uri);
21+
const allNamespaces: string[] = await api
22+
.serverInfo()
23+
.then((data) => data.result.content.namespaces
24+
);
25+
// Prepare a displayable form of its connection spec as a hint to the user
26+
const connSpec = await serverManagerApi.getServerSpec(serverName);
27+
const connDisplayString = `${connSpec.webServer.scheme}://${connSpec.webServer.host}:${connSpec.webServer.port}/${connSpec.webServer.pathPrefix}`;
28+
// Get user's choice of namespace
29+
const namespace = await vscode.window.showQuickPick(
30+
allNamespaces,
31+
{
32+
placeHolder: `Namespace on server '${serverName}' (${connDisplayString})`
33+
}
34+
);
35+
if (!namespace) {
36+
return;
37+
}
38+
// Pick between isfs and isfs-readonly
39+
const editable = await vscode.window.showQuickPick(
40+
[
41+
{ value: true, label: "Editable", detail: "Documents opened from this folder will be editable directly on the server." },
42+
{ value: false, label: "Read-only", detail: "Documents opened from this folder will be read-only." }
43+
],
44+
{ placeHolder: "Choose the mode of access" }
45+
);
46+
// Prepare the folder parameters
47+
const label = editable.value ? `${serverName}:${namespace}` : `${serverName}:${namespace} (read-only)`;
48+
uri = uri.with({ scheme: editable.value ? "isfs" : "isfs-readonly", query: `ns=${namespace}` });
49+
// Append it to the workspace
50+
const added = vscode.workspace.updateWorkspaceFolders(vscode.workspace.workspaceFolders ? vscode.workspace.workspaceFolders.length : 0, 0, { uri, name: label });
51+
// Switch to Explorer view so user sees the outcome
52+
vscode.commands.executeCommand('workbench.view.explorer');
53+
// Handle failure
54+
if (!added) {
55+
vscode.window.showErrorMessage(
56+
"Folder not added. Maybe it already exists on the workspace.",
57+
"Retry",
58+
"Close"
59+
)
60+
.then((value) => {
61+
if (value === "Retry") {
62+
vscode.commands.executeCommand('vscode-objectscript.addServerNamespaceToWorkspace');
63+
}
64+
});
65+
}
66+
}
67+
68+
69+
async function getServerManagerApi(): Promise<any> {
70+
const targetExtension = vscode.extensions.getExtension("intersystems-community.servermanager");
71+
if (!targetExtension) {
72+
return undefined;
73+
}
74+
if (!targetExtension.isActive) {
75+
await targetExtension.activate();
76+
}
77+
const api = targetExtension.exports;
78+
79+
if (!api) {
80+
return undefined;
81+
}
82+
return api;
83+
}

src/extension.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import {
4040
contextSourceControlMenu,
4141
mainSourceControlMenu,
4242
} from "./commands/studio";
43+
import { addServerNamespaceToWorkspace } from "./commands/addServerNamespaceToWorkspace";
4344

4445
import { getLanguageConfiguration } from "./languageConfiguration";
4546

@@ -100,14 +101,15 @@ const aiKey = packageJson.aiKey;
100101
export const config = (setting?: string, workspaceFolderName?: string): vscode.WorkspaceConfiguration | any => {
101102
workspaceFolderName = workspaceFolderName || currentWorkspaceFolder();
102103
if (
104+
vscode.workspace.workspaceFolders &&
103105
workspaceFolderName &&
104106
workspaceFolderName !== "" &&
105107
vscode.workspace.getConfiguration("intersystems.servers", null).has(workspaceFolderName)
106108
) {
107109
workspaceFolderName = vscode.workspace.workspaceFolders[0].name;
108110
}
109111
let prefix: string;
110-
const workspaceFolder = vscode.workspace.workspaceFolders.find(
112+
const workspaceFolder = vscode.workspace.workspaceFolders?.find(
111113
(el) => el.name.toLowerCase() === workspaceFolderName.toLowerCase()
112114
);
113115
if (setting && setting.startsWith("intersystems")) {
@@ -409,7 +411,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<any> {
409411

410412
// Check once (flushing cookies) each connection used by the workspace(s)
411413
const toCheck = new Map<string, vscode.Uri>();
412-
vscode.workspace.workspaceFolders.map((workspaceFolder) => {
414+
vscode.workspace.workspaceFolders?.map((workspaceFolder) => {
413415
const uri = workspaceFolder.uri;
414416
const { configName } = connectionTarget(uri);
415417
toCheck.set(configName, uri);
@@ -644,9 +646,12 @@ export async function activate(context: vscode.ExtensionContext): Promise<any> {
644646
return explorerProvider.closeExtra4Workspace(workspaceNode.label, workspaceNode.namespace);
645647
}
646648
),
647-
vscode.commands.registerCommand("vscode-objectscript.previewXml", (...args) => {
649+
vscode.commands.registerCommand("vscode-objectscript.previewXml", () => {
648650
xml2doc(context, window.activeTextEditor);
649651
}),
652+
vscode.commands.registerCommand("vscode-objectscript.addServerNamespaceToWorkspace", () => {
653+
addServerNamespaceToWorkspace();
654+
}),
650655

651656
vscode.workspace.registerTextDocumentContentProvider(OBJECTSCRIPT_FILE_SCHEMA, documentContentProvider),
652657
vscode.workspace.registerTextDocumentContentProvider(OBJECTSCRIPTXML_FILE_SCHEMA, xmlContentProvider),

0 commit comments

Comments
 (0)