Skip to content

Commit ac6fe72

Browse files
committed
fix: delete multiple tables from lib pane
Signed-off-by: Irene Sanchez <irene.iscc777@gmail.com>
1 parent e99faeb commit ac6fe72

File tree

4 files changed

+72
-1
lines changed

4 files changed

+72
-1
lines changed

client/src/components/LibraryNavigator/LibraryDataProvider.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ class LibraryDataProvider
5050
return this._onDidChangeTreeData.event;
5151
}
5252

53+
get treeView(): TreeView<LibraryItem> {
54+
return this._treeView;
55+
}
56+
5357
constructor(
5458
private readonly model: LibraryModel,
5559
private readonly extensionUri: Uri,
@@ -170,6 +174,11 @@ class LibraryDataProvider
170174
this._onDidChangeTreeData.fire(undefined);
171175
}
172176

177+
public async deleteTables(items: LibraryItem[]): Promise<void> {
178+
await this.model.deleteTables(items);
179+
this._onDidChangeTreeData.fire(undefined);
180+
}
181+
173182
public watch(): Disposable {
174183
// ignore, fires for all changes...
175184
return new Disposable(() => {});

client/src/components/LibraryNavigator/LibraryModel.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,28 @@ class LibraryModel {
126126
}
127127
}
128128

129+
public async deleteTables(items: LibraryItem[]) {
130+
const failures: string[] = [];
131+
132+
for (const item of items) {
133+
try {
134+
await this.libraryAdapter.deleteTable(item);
135+
} catch {
136+
failures.push(item.uid);
137+
}
138+
}
139+
140+
if (failures.length > 0) {
141+
throw new Error(
142+
//TODO: look at what warning message dialog is being used throughout the codebase
143+
l10n.t(Messages.TablesDeletionWarning, {
144+
tableNames: failures.join(", "),
145+
count: failures.length,
146+
}),
147+
);
148+
}
149+
}
150+
129151
public async getTableInfo(item: LibraryItem) {
130152
if (this.libraryAdapter.getTableInfo) {
131153
await this.libraryAdapter.setup();

client/src/components/LibraryNavigator/const.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import { l10n } from "vscode";
44

55
export const Messages = {
66
TableDeletionError: l10n.t("Unable to delete table {tableName}."),
7+
TablesDeletionWarning: l10n.t(
8+
"Are you sure you want to delete {count} table(s): {tableNames}?",
9+
),
710
ViewTableCommandTitle: l10n.t("View SAS Table"),
811
};
912

client/src/components/LibraryNavigator/index.ts

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
Uri,
88
commands,
99
env,
10+
l10n,
1011
window,
1112
workspace,
1213
} from "vscode";
@@ -24,6 +25,7 @@ import LibraryAdapterFactory from "./LibraryAdapterFactory";
2425
import LibraryDataProvider from "./LibraryDataProvider";
2526
import LibraryModel from "./LibraryModel";
2627
import PaginatedResultSet from "./PaginatedResultSet";
28+
import { Messages } from "./const";
2729
import { LibraryAdapter, LibraryItem, TableData } from "./types";
2830

2931
class LibraryNavigator implements SubscriptionProvider {
@@ -63,8 +65,34 @@ class LibraryNavigator implements SubscriptionProvider {
6365
),
6466
commands.registerCommand("SAS.refreshLibraries", () => this.refresh()),
6567
commands.registerCommand("SAS.deleteTable", async (item: LibraryItem) => {
68+
const selectedItems = this.treeViewSelections(item);
69+
70+
if (selectedItems.length === 0) {
71+
return;
72+
}
73+
6674
try {
67-
await this.libraryDataProvider.deleteTable(item);
75+
if (selectedItems.length === 1) {
76+
await this.libraryDataProvider.deleteTable(selectedItems[0]);
77+
} else {
78+
const tableNames = selectedItems
79+
.map((table) => `${table.library}.${table.name}`)
80+
.join(", ");
81+
82+
const result = await window.showWarningMessage(
83+
l10n.t(Messages.TablesDeletionWarning, {
84+
tableNames: tableNames,
85+
}),
86+
{ modal: true },
87+
"Delete",
88+
);
89+
90+
if (result !== "Delete") {
91+
return;
92+
}
93+
94+
await this.libraryDataProvider.deleteTables(selectedItems);
95+
}
6896
} catch (error) {
6997
window.showErrorMessage(error.message);
7098
}
@@ -143,6 +171,15 @@ class LibraryNavigator implements SubscriptionProvider {
143171
this.libraryDataProvider.useAdapter(this.libraryAdapterForConnectionType());
144172
}
145173

174+
private treeViewSelections(item: LibraryItem): LibraryItem[] {
175+
const items =
176+
this.libraryDataProvider.treeView.selection.length > 1 || !item
177+
? this.libraryDataProvider.treeView.selection
178+
: [item];
179+
180+
return items.filter(Boolean);
181+
}
182+
146183
private libraryAdapterForConnectionType(): LibraryAdapter | undefined {
147184
const activeProfile = profileConfig.getProfileByName(
148185
profileConfig.getActiveProfile(),

0 commit comments

Comments
 (0)