Skip to content

Commit 824296e

Browse files
authored
Merge pull request #750 from isc-bsaviano/master
Fix multi-select compile and delete in ObjectScript Explorer
2 parents a69d90a + a9222d0 commit 824296e

File tree

4 files changed

+55
-33
lines changed

4 files changed

+55
-33
lines changed

src/commands/compile.ts

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,8 @@ import {
1414
} from "../extension";
1515
import { DocumentContentProvider } from "../providers/DocumentContentProvider";
1616
import { currentFile, CurrentFile, currentWorkspaceFolder, outputChannel, uriOfWorkspaceFolder } from "../utils";
17-
import { RootNode } from "../explorer/models/rootNode";
1817
import { PackageNode } from "../explorer/models/packageNode";
19-
import { ClassNode } from "../explorer/models/classNode";
20-
import { RoutineNode } from "../explorer/models/routineNode";
18+
import { NodeBase } from "../explorer/models/nodeBase";
2119

2220
async function compileFlags(): Promise<string> {
2321
const defaultFlags = config().compileFlags;
@@ -418,20 +416,24 @@ export async function importFolder(uri: vscode.Uri, noCompile = false): Promise<
418416
);
419417
}
420418

421-
export async function compileExplorerItem(node: RootNode | PackageNode | ClassNode | RoutineNode): Promise<any> {
422-
const { workspaceFolder, namespace } = node;
419+
export async function compileExplorerItems(nodes: NodeBase[]): Promise<any> {
420+
const { workspaceFolder, namespace } = nodes[0];
423421
const flags = config().compileFlags;
424422
const api = new AtelierAPI(workspaceFolder);
425423
api.setNamespace(namespace);
426-
let docs = [node.fullName];
427-
if (node instanceof PackageNode) {
428-
switch (node.category) {
429-
case "RTN":
430-
docs = [node.fullName + ".*.mac"];
431-
break;
432-
case "CLS":
433-
docs = [node.fullName + ".*.cls"];
434-
break;
424+
const docs = [];
425+
for (const node of nodes) {
426+
if (node instanceof PackageNode) {
427+
switch (node.category) {
428+
case "RTN":
429+
docs.push(node.fullName + ".*.mac");
430+
break;
431+
case "CLS":
432+
docs.push(node.fullName + ".*.cls");
433+
break;
434+
}
435+
} else {
436+
docs.push(node.fullName);
435437
}
436438
}
437439
return api.actionCompile(docs, flags);

src/commands/delete.ts

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
import * as vscode from "vscode";
22

33
import { AtelierAPI } from "../api";
4-
import { ClassNode } from "../explorer/models/classNode";
54
import { PackageNode } from "../explorer/models/packageNode";
65
import { RootNode } from "../explorer/models/rootNode";
7-
import { RoutineNode } from "../explorer/models/routineNode";
6+
import { NodeBase } from "../explorer/models/nodeBase";
87
import { explorerProvider } from "../extension";
98
import { outputChannel } from "../utils";
109
import { OtherStudioAction, fireOtherStudioAction } from "./studio";
1110
import { DocumentContentProvider } from "../providers/DocumentContentProvider";
1211

13-
function deleteList(items: string[], workspaceFolder: string): Promise<any> {
12+
function deleteList(items: string[], workspaceFolder: string, namespace: string): Promise<any> {
1413
if (!items || !items.length) {
15-
vscode.window.showWarningMessage("Nothing to export");
14+
vscode.window.showWarningMessage("Nothing to delete");
1615
}
1716

1817
const api = new AtelierAPI(workspaceFolder);
18+
api.setNamespace(namespace);
1919
return Promise.all(items.map((item) => api.deleteDoc(item))).then((files) => {
2020
files.forEach((file) => {
2121
if (file.result.ext) {
@@ -27,18 +27,34 @@ function deleteList(items: string[], workspaceFolder: string): Promise<any> {
2727
});
2828
}
2929

30-
export async function deleteItem(node: RootNode | PackageNode | ClassNode | RoutineNode): Promise<any> {
31-
const workspaceFolder = node.workspaceFolder;
32-
const nodesList = node instanceof RootNode ? node.getChildren(node) : Promise.resolve([node]);
33-
return nodesList
34-
.then((nodes) =>
35-
nodes.reduce(
30+
export async function deleteExplorerItems(nodes: NodeBase[]): Promise<any> {
31+
const { workspaceFolder, namespace } = nodes[0];
32+
const nodesPromiseList: Promise<NodeBase[]>[] = [];
33+
for (const node of nodes) {
34+
nodesPromiseList.push(node instanceof RootNode ? node.getChildren(node) : Promise.resolve([node]));
35+
}
36+
return Promise.all(nodesPromiseList)
37+
.then((nodesList) => nodesList.flat())
38+
.then((allNodes) =>
39+
allNodes.reduce<string[]>(
3640
(list, subNode) => list.concat(subNode instanceof PackageNode ? subNode.getClasses() : [subNode.fullName]),
3741
[]
3842
)
3943
)
40-
.then((items) => {
41-
deleteList(items, workspaceFolder);
44+
.then(async (items) => {
45+
if (nodes.length > 1) {
46+
// Ask the user to confirm if they're deleting more than one explorer node
47+
const confirm = await vscode.window.showWarningMessage(
48+
`About to delete ${items.length} documents. Are you sure you want to proceed?`,
49+
"Cancel",
50+
"Confirm"
51+
);
52+
if (confirm !== "Confirm") {
53+
// Don't delete without confirmation
54+
return;
55+
}
56+
}
57+
deleteList(items, workspaceFolder, namespace);
4258
explorerProvider.refresh();
4359
});
4460
}

src/commands/export.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ export async function exportAll(workspaceFolder?: string): Promise<any> {
239239
});
240240
}
241241

242-
export async function exportExplorerItem(nodes: NodeBase[]): Promise<any> {
242+
export async function exportExplorerItems(nodes: NodeBase[]): Promise<any> {
243243
const node = nodes[0];
244244
const origNamespace = config("conn", node.workspaceFolder).ns;
245245
if (origNamespace !== node.namespace) {

src/extension.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ import {
2222
importAndCompile,
2323
importFolder as importFileOrFolder,
2424
namespaceCompile,
25-
compileExplorerItem,
25+
compileExplorerItems,
2626
checkChangedOnServer,
2727
compileOnly,
2828
} from "./commands/compile";
29-
import { deleteItem } from "./commands/delete";
30-
import { exportAll, exportExplorerItem } from "./commands/export";
29+
import { deleteExplorerItems } from "./commands/delete";
30+
import { exportAll, exportExplorerItems } from "./commands/export";
3131
import { serverActions } from "./commands/serverActions";
3232
import { subclass } from "./commands/subclass";
3333
import { superclass } from "./commands/superclass";
@@ -841,10 +841,14 @@ export async function activate(context: vscode.ExtensionContext): Promise<any> {
841841
// Register the vscode-objectscript.explorer.open command elsewhere
842842
registerExplorerOpen(explorerProvider),
843843
vscode.commands.registerCommand("vscode-objectscript.explorer.export", (item, items) =>
844-
exportExplorerItem(items && items.length ? items : [item])
844+
exportExplorerItems(items && items.length ? items : [item])
845+
),
846+
vscode.commands.registerCommand("vscode-objectscript.explorer.delete", (item, items) =>
847+
deleteExplorerItems(items && items.length ? items : [item])
848+
),
849+
vscode.commands.registerCommand("vscode-objectscript.explorer.compile", (item, items) =>
850+
compileExplorerItems(items && items.length ? items : [item])
845851
),
846-
vscode.commands.registerCommand("vscode-objectscript.explorer.delete", deleteItem),
847-
vscode.commands.registerCommand("vscode-objectscript.explorer.compile", compileExplorerItem),
848852
vscode.commands.registerCommand("vscode-objectscript.explorer.showGenerated", (workspaceNode: WorkspaceNode) => {
849853
workspaceState.update(`ExplorerGenerated:${workspaceNode.uniqueId}`, true);
850854
return explorerProvider.refresh();

0 commit comments

Comments
 (0)