Skip to content

Commit 5f2e18c

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

File tree

4 files changed

+69
-1
lines changed

4 files changed

+69
-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: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,24 @@ class LibraryModel {
132132
}
133133
}
134134

135+
public async deleteTables(items: LibraryItem[]) {
136+
const failures: string[] = [];
137+
138+
for (const item of items) {
139+
try {
140+
await this.libraryAdapter.deleteTable(item);
141+
} catch {
142+
failures.push(item.uid);
143+
}
144+
}
145+
146+
if (failures.length > 0) {
147+
throw new Error(
148+
l10n.t(Messages.TableDeletionError, { tableName: failures.join(", ") }),
149+
);
150+
}
151+
}
152+
135153
public async getTableInfo(item: LibraryItem) {
136154
if (this.libraryAdapter.getTableInfo) {
137155
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: 39 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 {
@@ -66,8 +68,35 @@ class LibraryNavigator implements SubscriptionProvider {
6668
),
6769
commands.registerCommand("SAS.refreshLibraries", () => this.refresh()),
6870
commands.registerCommand("SAS.deleteTable", async (item: LibraryItem) => {
71+
const selectedItems = this.treeViewSelections(item);
72+
73+
if (selectedItems.length === 0) {
74+
return;
75+
}
76+
6977
try {
70-
await this.libraryDataProvider.deleteTable(item);
78+
if (selectedItems.length === 1) {
79+
await this.libraryDataProvider.deleteTable(selectedItems[0]);
80+
} else {
81+
const tableNames = selectedItems
82+
.map((table) => `${table.library}.${table.name}`)
83+
.join(", ");
84+
85+
const result = await window.showWarningMessage(
86+
l10n.t(Messages.TablesDeletionWarning, {
87+
tableNames: tableNames,
88+
count: selectedItems.length,
89+
}),
90+
{ modal: true },
91+
"Delete",
92+
);
93+
94+
if (result !== "Delete") {
95+
return;
96+
}
97+
98+
await this.libraryDataProvider.deleteTables(selectedItems);
99+
}
71100
} catch (error) {
72101
window.showErrorMessage(error.message);
73102
}
@@ -128,6 +157,15 @@ class LibraryNavigator implements SubscriptionProvider {
128157
this.libraryDataProvider.useAdapter(this.libraryAdapterForConnectionType());
129158
}
130159

160+
private treeViewSelections(item: LibraryItem): LibraryItem[] {
161+
const items =
162+
this.libraryDataProvider.treeView.selection.length > 1 || !item
163+
? this.libraryDataProvider.treeView.selection
164+
: [item];
165+
166+
return items.filter(Boolean);
167+
}
168+
131169
private async displayTableProperties(
132170
item: LibraryItem,
133171
showPropertiesTab: boolean = false,

0 commit comments

Comments
 (0)