Skip to content

Commit e5130a8

Browse files
committed
export from another namespace with confirmation, #41
1 parent 8d86ea1 commit e5130a8

File tree

9 files changed

+70
-69
lines changed

9 files changed

+70
-69
lines changed

Diff for: commands/export.ts

+24-11
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,13 @@ export const getFileName = (folder: string, name: string, split: boolean, addCat
3434
return [folder, cat, name].filter(notNull).join(path.sep);
3535
};
3636

37-
export async function exportFile(workspaceFolder: string, name: string, fileName: string): Promise<void> {
37+
export async function exportFile(
38+
workspaceFolder: string, namespace: string, name: string, fileName: string): Promise<void> {
3839
if (!config("conn", workspaceFolder).active) {
3940
return Promise.reject("Connection not active");
4041
}
4142
const api = new AtelierAPI(workspaceFolder);
43+
api.setNamespace(namespace);
4244
const log = (status) => outputChannel.appendLine(`export "${name}" as "${fileName}" - ${status}`);
4345
const folders = path.dirname(fileName);
4446
return mkdirSyncRecursive(folders)
@@ -111,7 +113,7 @@ export async function exportFile(workspaceFolder: string, name: string, fileName
111113
});
112114
}
113115

114-
export async function exportList(files: string[], workspaceFolder: string): Promise<any> {
116+
export async function exportList(files: string[], workspaceFolder: string, namespace: string): Promise<any> {
115117
if (!files || !files.length) {
116118
vscode.window.showWarningMessage("Nothing to export");
117119
}
@@ -121,7 +123,7 @@ export async function exportList(files: string[], workspaceFolder: string): Prom
121123
const run = async (fileList) => {
122124
const errors = [];
123125
for (const file of fileList) {
124-
await exportFile(workspaceFolder, file, getFileName(root, file, atelier, addCategory))
126+
await exportFile(workspaceFolder, namespace, file, getFileName(root, file, atelier, addCategory))
125127
.catch((error) => { errors.push(`${file} - ${error}`); });
126128
}
127129
outputChannel.appendLine(`Exported items: ${fileList.length - errors.length}`);
@@ -147,21 +149,32 @@ export async function exportAll(workspaceFolder?: string): Promise<any> {
147149
if (!config("conn", workspaceFolder).active) {
148150
return;
149151
}
150-
const api = new AtelierAPI();
151-
api.setConnection(workspaceFolder);
152+
const api = new AtelierAPI(workspaceFolder);
152153
outputChannel.show(true);
153-
const { category, generated, filter } = config("export", workspaceFolder);
154+
const { category, generated, filter, ns } = config("export", workspaceFolder);
154155
const files = (data) => data.result.content.filter(filesFilter).map((file) => file.name);
155156
return api.getDocNames({ category, generated, filter }).then((data) => {
156-
return exportList(files(data), workspaceFolder);
157+
return exportList(files(data), workspaceFolder, ns);
157158
});
158159
}
159160

160161
export async function exportExplorerItem(node: RootNode | PackageNode | ClassNode | RoutineNode): Promise<any> {
161-
if (!config("conn", node.workspaceFolder).active) {
162-
return;
162+
const origNamespace = config("conn").ns;
163+
if (origNamespace !== node.namespace) {
164+
const answer = await vscode.window.showWarningMessage(
165+
`
166+
You are going to export items from another namespace.
167+
Would you like to continue?`,
168+
{
169+
modal: true,
170+
},
171+
"Yes",
172+
);
173+
if (answer !== "Yes") {
174+
return;
175+
}
163176
}
164-
const workspaceFolder = node.workspaceFolder;
177+
const { workspaceFolder, namespace } = node;
165178
const nodesList = node instanceof RootNode ? node.getChildren(node) : Promise.resolve([node]);
166179
return nodesList
167180
.then((nodes) =>
@@ -171,6 +184,6 @@ export async function exportExplorerItem(node: RootNode | PackageNode | ClassNod
171184
),
172185
)
173186
.then((items) => {
174-
return exportList(items, workspaceFolder);
187+
return exportList(items, workspaceFolder, namespace);
175188
});
176189
}

Diff for: explorer/explorer.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export class ObjectScriptExplorerProvider implements vscode.TreeDataProvider<Nod
6464
const workspaceFolders = vscode.workspace.workspaceFolders || [];
6565
workspaceFolders.forEach((workspaceFolder) => {
6666
const conn: any = config("conn", workspaceFolder.name);
67-
if (conn.active) {
67+
if (conn.active && conn.ns) {
6868
node = new WorkspaceNode(workspaceFolder.name, this._onDidChangeTreeData);
6969
rootNodes.push(node);
7070

Diff for: explorer/models/classesNode.ts

+4-8
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,10 @@ export class ClassNode extends NodeBase {
77
constructor(
88
public readonly label: string,
99
public readonly fullName: string,
10-
private _workspaceFolder: string,
11-
private _namespace: string,
10+
workspaceFolder: string,
11+
namespace: string,
1212
) {
13-
super(label);
14-
}
15-
16-
get workspaceFolder(): string {
17-
return this._workspaceFolder;
13+
super(label, workspaceFolder, namespace);
1814
}
1915

2016
public getTreeItem(): vscode.TreeItem {
@@ -23,7 +19,7 @@ export class ClassNode extends NodeBase {
2319
return {
2420
collapsibleState: vscode.TreeItemCollapsibleState.None,
2521
command: {
26-
arguments: [DocumentContentProvider.getUri(this.fullName, this._workspaceFolder, this._namespace, true)],
22+
arguments: [DocumentContentProvider.getUri(this.fullName, this.workspaceFolder, this.namespace, true)],
2723
command: "vscode-objectscript.explorer.openClass",
2824
title: "Open class",
2925
},

Diff for: explorer/models/nodeBase.ts

+12-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
11
import * as vscode from "vscode";
2+
import { config } from "../../extension";
23

34
export class NodeBase {
4-
public readonly label: string;
55
public readonly fullName: string;
6+
public readonly conn: any;
7+
public readonly extraNode: boolean;
68

7-
protected constructor(label: string) {
8-
this.label = label;
9+
10+
protected constructor(
11+
public readonly label: string,
12+
public readonly workspaceFolder,
13+
public readonly namespace: string,
14+
) {
15+
this.conn = config("conn", workspaceFolder);
16+
this.namespace = namespace || this.conn.ns;
17+
this.extraNode = (this.conn.ns !== this.namespace);
918
}
1019

1120
public getTreeItem(): vscode.TreeItem {

Diff for: explorer/models/packageNode.ts

+5-9
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,10 @@ export class PackageNode extends NodeBase {
77
constructor(
88
public readonly label: string,
99
private readonly _items,
10-
private readonly _workspaceFolder: string,
11-
private _namespace: string,
10+
workspaceFolder: string,
11+
namespace: string,
1212
) {
13-
super(label);
14-
}
15-
16-
get workspaceFolder(): string {
17-
return this._workspaceFolder;
13+
super(label, workspaceFolder, namespace);
1814
}
1915

2016
public getTreeItem(): vscode.TreeItem {
@@ -34,8 +30,8 @@ export class PackageNode extends NodeBase {
3430
public async getChildren(element): Promise<NodeBase[]> {
3531
return this._items.map(({ name, fullName, nodes }) =>
3632
nodes.length
37-
? new PackageNode(name, nodes, this._workspaceFolder, this._namespace)
38-
: new ClassNode(name, fullName, this._workspaceFolder, this._namespace),
33+
? new PackageNode(name, nodes, this.workspaceFolder, this.namespace)
34+
: new ClassNode(name, fullName, this.workspaceFolder, this.namespace),
3935
);
4036
}
4137

Diff for: explorer/models/rootNode.ts

+5-9
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,10 @@ export class RootNode extends NodeBase {
1010
public readonly contextValue: string,
1111
public eventEmitter: vscode.EventEmitter<NodeBase>,
1212
private _items: any[],
13-
private _workspaceFolder: string,
14-
private _namespace: string,
13+
workspaceFolder: string,
14+
namespace: string,
1515
) {
16-
super(label);
17-
}
18-
19-
get workspaceFolder(): string {
20-
return this._workspaceFolder;
16+
super(label, workspaceFolder, namespace);
2117
}
2218

2319
public getTreeItem(): vscode.TreeItem {
@@ -41,11 +37,11 @@ export class RootNode extends NodeBase {
4137
private async getClasses(): Promise<PackageNode[]> {
4238
const items = this.makeTree(this._items);
4339

44-
return items.map(({ name, nodes }) => new PackageNode(name, nodes, this._workspaceFolder, this._namespace));
40+
return items.map(({ name, nodes }) => new PackageNode(name, nodes, this.workspaceFolder, this.namespace));
4541
}
4642

4743
private async getRoutines(): Promise<RoutineNode[]> {
48-
return this._items.map(({ name }) => new RoutineNode(name, name, this._workspaceFolder, this._namespace));
44+
return this._items.map(({ name }) => new RoutineNode(name, name, this.workspaceFolder, this.namespace));
4945
}
5046

5147
private makeTree(items: any[]): any[] {

Diff for: explorer/models/routineNode.ts

+4-8
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,10 @@ export class RoutineNode extends NodeBase {
77
constructor(
88
public readonly label: string,
99
public readonly fullName: string,
10-
private _workspaceFolder: string,
11-
private _namespace: string,
10+
workspaceFolder: string,
11+
namespace: string,
1212
) {
13-
super(label);
14-
}
15-
16-
get workspaceFolder(): string {
17-
return this._workspaceFolder;
13+
super(label, workspaceFolder, namespace);
1814
}
1915

2016
public getTreeItem(): vscode.TreeItem {
@@ -23,7 +19,7 @@ export class RoutineNode extends NodeBase {
2319
return {
2420
collapsibleState: vscode.TreeItemCollapsibleState.None,
2521
command: {
26-
arguments: [DocumentContentProvider.getUri(this.fullName, this._workspaceFolder, this._namespace)],
22+
arguments: [DocumentContentProvider.getUri(this.fullName, this.workspaceFolder, this.namespace)],
2723
command: "vscode-objectscript.explorer.openRoutine",
2824
title: "Open routine",
2925
},

Diff for: explorer/models/workspaceNode.ts

+11-18
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,44 @@
11
import * as vscode from "vscode";
22

33
import { AtelierAPI } from "../../api";
4-
import { config } from "../../extension";
54
import { NodeBase } from "./nodeBase";
65
import { RootNode } from "./rootNode";
76

87
export class WorkspaceNode extends NodeBase {
9-
private _conn: any;
10-
private _extraNode: boolean;
118

129
constructor(
1310
public readonly label: string,
1411
public eventEmitter: vscode.EventEmitter<NodeBase>,
15-
private _namespace?: string,
12+
namespace?: string,
1613
) {
17-
super(label);
18-
this._conn = config("conn", this.label);
19-
this._namespace = _namespace || this._conn.ns;
20-
this._extraNode = (this._conn.ns !== this._namespace);
14+
super(label, label, namespace);
2115
}
2216

23-
get ns(): string {
24-
return this._namespace;
25-
}
17+
// get ns(): string {
18+
// return this._namespace;
19+
// }
2620

2721
public getTreeItem(): vscode.TreeItem {
2822
return {
2923
collapsibleState: vscode.TreeItemCollapsibleState.Expanded,
30-
contextValue: `serverNode${this._extraNode ? "Extra:" + this._namespace : ""}`,
31-
label: `${this.label}${this._extraNode ? `[${this._namespace}]` : ""}`,
24+
contextValue: `serverNode${this.extraNode ? "Extra:" + this.namespace : ""}`,
25+
label: `${this.label}${this.extraNode ? `[${this.namespace}]` : ""}`,
3226
};
3327
}
3428

3529
public async getChildren(element): Promise<NodeBase[]> {
3630
const children = [];
3731
let node: RootNode;
3832
let data: any;
39-
const workspaceFolder = element.label;
4033

4134
data = await this.getDocNames("CLS");
4235
node = new RootNode("Classes", "dataRootNode:classesRootNode",
43-
this.eventEmitter, data, workspaceFolder, this._namespace);
36+
this.eventEmitter, data, this.workspaceFolder, this.namespace);
4437
children.push(node);
4538

4639
data = await this.getDocNames("RTN");
4740
node = new RootNode("Routines", "dataRootNode:routinesRootNode",
48-
this.eventEmitter, data, workspaceFolder, this._namespace);
41+
this.eventEmitter, data, this.workspaceFolder, this.namespace);
4942
children.push(node);
5043

5144
return children;
@@ -73,10 +66,10 @@ export class WorkspaceNode extends NodeBase {
7366
const generated = 0;
7467
const filter = "";
7568

76-
const systemFiles = (this._namespace === "%SYS") ? "1" : "0";
69+
const systemFiles = (this.namespace === "%SYS") ? "1" : "0";
7770

7871
const api = new AtelierAPI(this.label);
79-
api.setNamespace(this._namespace);
72+
api.setNamespace(this.namespace);
8073
return api
8174
.actionQuery(sql, [
8275
spec,

Diff for: extension.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,6 @@ export async function activate(
122122
.serverInfo()
123123
.then(async (info) => {
124124
panel.text = `${connInfo} - Connected`;
125-
explorerProvider.refresh();
126125
})
127126
.catch((error) => {
128127
let message = error.message;
@@ -138,6 +137,9 @@ export async function activate(
138137
}
139138
panel.text = `${connInfo} - ERROR`;
140139
panel.tooltip = message;
140+
})
141+
.finally(() => {
142+
explorerProvider.refresh();
141143
});
142144
};
143145
checkConnection();
@@ -242,7 +244,7 @@ export async function activate(
242244
(workspaceNode: WorkspaceNode) => {
243245
return explorerProvider.closeExtra4Workspace(
244246
workspaceNode.label,
245-
workspaceNode.ns,
247+
workspaceNode.namespace,
246248
);
247249
},
248250
),

0 commit comments

Comments
 (0)