Skip to content

Commit b5f8654

Browse files
committed
Add action
1 parent 8346eda commit b5f8654

5 files changed

Lines changed: 115 additions & 2 deletions

File tree

extensions/ql-vscode/package.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
"onCommand:codeQLDatabasesExperimental.setSelectedItemContextMenu",
6767
"onCommand:codeQLDatabasesExperimental.renameItemContextMenu",
6868
"onCommand:codeQLDatabasesExperimental.openOnGitHubContextMenu",
69+
"onCommand:codeQLDatabasesExperimental.removeItemContextMenu",
6970
"onCommand:codeQL.quickQuery",
7071
"onCommand:codeQL.restartQueryServer",
7172
"onWebviewPanel:resultsView",
@@ -392,6 +393,10 @@
392393
"command": "codeQLDatabasesExperimental.openOnGitHubContextMenu",
393394
"title": "Open on GitHub"
394395
},
396+
{
397+
"command": "codeQLDatabasesExperimental.removeItemContextMenu",
398+
"title": "Remove"
399+
},
395400
{
396401
"command": "codeQLDatabases.chooseDatabaseFolder",
397402
"title": "Choose Database from Folder",
@@ -791,6 +796,10 @@
791796
}
792797
],
793798
"view/item/context": [
799+
{
800+
"command": "codeQLDatabasesExperimental.removeItemContextMenu",
801+
"when": "view == codeQLDatabasesExperimental && viewItem =~ /canBeRemoved/"
802+
},
794803
{
795804
"command": "codeQLDatabasesExperimental.setSelectedItemContextMenu",
796805
"when": "view == codeQLDatabasesExperimental && viewItem =~ /canBeSelected/"
@@ -1043,6 +1052,10 @@
10431052
"command": "codeQLDatabasesExperimental.openOnGitHubContextMenu",
10441053
"when": "false"
10451054
},
1055+
{
1056+
"command": "codeQLDatabasesExperimental.removeItemContextMenu",
1057+
"when": "false"
1058+
},
10461059
{
10471060
"command": "codeQLDatabases.setCurrentDatabase",
10481061
"when": "false"

extensions/ql-vscode/src/databases/config/db-config-store.ts

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ import {
2222
LocalDatabaseDbItem,
2323
LocalListDbItem,
2424
RemoteUserDefinedListDbItem,
25+
DbItem,
26+
DbItemKind,
2527
} from "../db-item";
28+
import { mapDbItemToSelectedDbItem } from "../db-item-selection";
2629

2730
export class DbConfigStore extends DisposableObject {
2831
public readonly onDidChangeConfig: AppEvent<void>;
@@ -88,6 +91,84 @@ export class DbConfigStore extends DisposableObject {
8891
await this.writeConfig(config);
8992
}
9093

94+
public async removeDbItem(dbItem: DbItem): Promise<void> {
95+
if (!this.config) {
96+
throw Error("Cannot remove item if config is not loaded");
97+
}
98+
99+
const config: DbConfig = cloneDbConfig(this.config);
100+
const selectedItem: SelectedDbItem | undefined = config.selected;
101+
102+
// Remove item from databases
103+
switch (dbItem.kind) {
104+
case DbItemKind.LocalList:
105+
config.databases.local.lists = config.databases.local.lists.filter(
106+
(list) => list.name !== dbItem.listName,
107+
);
108+
break;
109+
case DbItemKind.RemoteUserDefinedList:
110+
config.databases.remote.repositoryLists =
111+
config.databases.remote.repositoryLists.filter(
112+
(list) => list.name !== dbItem.listName,
113+
);
114+
break;
115+
case DbItemKind.LocalDatabase:
116+
if (dbItem.parentListName) {
117+
const parent = config.databases.local.lists.find(
118+
(list) => list.name === dbItem.parentListName,
119+
);
120+
if (!parent) {
121+
throw Error(`Cannot find parent list '${dbItem.parentListName}'`);
122+
} else {
123+
parent.databases = parent.databases.filter(
124+
(db) => db.name !== dbItem.databaseName,
125+
);
126+
}
127+
}
128+
config.databases.local.databases =
129+
config.databases.local.databases.filter(
130+
(db) => db.name !== dbItem.databaseName,
131+
);
132+
break;
133+
case DbItemKind.RemoteRepo:
134+
if (dbItem.parentListName) {
135+
const parent = config.databases.remote.repositoryLists.find(
136+
(list) => list.name === dbItem.parentListName,
137+
);
138+
if (!parent) {
139+
throw Error(`Cannot find parent list '${dbItem.parentListName}'`);
140+
} else {
141+
parent.repositories = parent.repositories.filter(
142+
(repo) => repo !== dbItem.repoFullName,
143+
);
144+
}
145+
}
146+
config.databases.remote.repositories =
147+
config.databases.remote.repositories.filter(
148+
(repo) => repo !== dbItem.repoFullName,
149+
);
150+
break;
151+
case DbItemKind.RemoteOwner:
152+
config.databases.remote.owners = config.databases.remote.owners.filter(
153+
(owner) => owner !== dbItem.ownerName,
154+
);
155+
break;
156+
default:
157+
throw Error(`Type '${dbItem.kind}' cannot be removed`);
158+
}
159+
160+
// Remove item from selected
161+
const mappedItem = mapDbItemToSelectedDbItem(dbItem);
162+
if (
163+
selectedItem &&
164+
JSON.stringify(mappedItem) === JSON.stringify(selectedItem)
165+
) {
166+
config.selected = undefined;
167+
}
168+
169+
await this.writeConfig(config);
170+
}
171+
91172
public async addRemoteRepo(
92173
repoNwo: string,
93174
parentList?: string,

extensions/ql-vscode/src/databases/db-item-selection.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,15 @@ export function mapDbItemToSelectedDbItem(
8080
case DbItemKind.LocalDatabase:
8181
return {
8282
kind: SelectedDbItemKind.LocalDatabase,
83-
listName: dbItem?.parentListName,
8483
databaseName: dbItem.databaseName,
84+
listName: dbItem?.parentListName,
8585
};
8686

8787
case DbItemKind.RemoteRepo:
8888
return {
8989
kind: SelectedDbItemKind.RemoteRepository,
90-
listName: dbItem?.parentListName,
9190
repositoryName: dbItem.repoFullName,
91+
listName: dbItem?.parentListName,
9292
};
9393
}
9494
}

extensions/ql-vscode/src/databases/db-manager.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ export class DbManager {
7575
}
7676
}
7777

78+
public async removeDbItem(dbItem: DbItem): Promise<void> {
79+
await this.dbConfigStore.removeDbItem(dbItem);
80+
}
81+
7882
public async updateDbItemExpandedState(
7983
dbItem: DbItem,
8084
itemExpanded: boolean,

extensions/ql-vscode/src/databases/ui/db-panel.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,12 @@ export class DbPanel extends DisposableObject {
107107
(treeViewItem: DbTreeViewItem) => this.renameItem(treeViewItem),
108108
),
109109
);
110+
this.push(
111+
commandRunner(
112+
"codeQLDatabasesExperimental.removeItemContextMenu",
113+
(treeViewItem: DbTreeViewItem) => this.removeItem(treeViewItem),
114+
),
115+
);
110116
}
111117

112118
private async openConfigFile(): Promise<void> {
@@ -363,6 +369,15 @@ export class DbPanel extends DisposableObject {
363369
await this.dbManager.renameList(dbItem, newName);
364370
}
365371

372+
private async removeItem(treeViewItem: DbTreeViewItem): Promise<void> {
373+
if (treeViewItem.dbItem === undefined) {
374+
throw new Error(
375+
"Not a removable database item. Please select a valid item.",
376+
);
377+
}
378+
await this.dbManager.removeDbItem(treeViewItem.dbItem);
379+
}
380+
366381
private async onDidCollapseElement(
367382
event: TreeViewExpansionEvent<DbTreeViewItem>,
368383
): Promise<void> {

0 commit comments

Comments
 (0)