@@ -16,7 +16,16 @@ import {
1616} from "../../common/github-url-identifier-helper" ;
1717import { showAndLogErrorMessage } from "../../helpers" ;
1818import { DisposableObject } from "../../pure/disposable-object" ;
19- import { DbItem , DbItemKind , DbListKind , remoteDbKinds } from "../db-item" ;
19+ import {
20+ DbItem ,
21+ DbItemKind ,
22+ DbListKind ,
23+ LocalDatabaseDbItem ,
24+ LocalListDbItem ,
25+ remoteDbKinds ,
26+ RemoteUserDefinedListDbItem ,
27+ } from "../db-item" ;
28+ import { getDbItemName } from "../db-item-naming" ;
2029import { DbManager } from "../db-manager" ;
2130import { DbTreeDataProvider } from "./db-tree-data-provider" ;
2231import { DbTreeViewItem } from "./db-tree-view-item" ;
@@ -92,6 +101,12 @@ export class DbPanel extends DisposableObject {
92101 ( treeViewItem : DbTreeViewItem ) => this . openOnGitHub ( treeViewItem ) ,
93102 ) ,
94103 ) ;
104+ this . push (
105+ commandRunner (
106+ "codeQLDatabasesExperimental.renameItemContextMenu" ,
107+ ( treeViewItem : DbTreeViewItem ) => this . renameItem ( treeViewItem ) ,
108+ ) ,
109+ ) ;
95110 }
96111
97112 private async openConfigFile ( ) : Promise < void > {
@@ -266,6 +281,88 @@ export class DbPanel extends DisposableObject {
266281 await this . dbManager . setSelectedDbItem ( treeViewItem . dbItem ) ;
267282 }
268283
284+ private async renameItem ( treeViewItem : DbTreeViewItem ) : Promise < void > {
285+ const dbItem = treeViewItem . dbItem ;
286+ if ( dbItem === undefined ) {
287+ throw new Error (
288+ "Not a database item that can be renamed. Please select a valid item." ,
289+ ) ;
290+ }
291+
292+ const oldName = getDbItemName ( dbItem ) ;
293+
294+ const newName = await window . showInputBox ( {
295+ prompt : "Enter the new name" ,
296+ value : oldName ,
297+ } ) ;
298+
299+ if ( newName === undefined || newName === "" ) {
300+ return ;
301+ }
302+
303+ switch ( dbItem . kind ) {
304+ case DbItemKind . LocalList :
305+ await this . renameLocalListItem ( dbItem , newName ) ;
306+ break ;
307+ case DbItemKind . LocalDatabase :
308+ await this . renameLocalDatabaseItem ( dbItem , newName ) ;
309+ break ;
310+ case DbItemKind . RemoteUserDefinedList :
311+ await this . renameRemoteUserDefinedListItem ( dbItem , newName ) ;
312+ break ;
313+ default :
314+ throw Error ( `Action not allowed for the '${ dbItem . kind } ' db item kind` ) ;
315+ }
316+ }
317+
318+ private async renameLocalListItem (
319+ dbItem : LocalListDbItem ,
320+ newName : string ,
321+ ) : Promise < void > {
322+ if ( dbItem . listName === newName ) {
323+ return ;
324+ }
325+
326+ if ( this . dbManager . doesListExist ( DbListKind . Local , newName ) ) {
327+ void showAndLogErrorMessage ( `The list '${ newName } ' already exists` ) ;
328+ return ;
329+ }
330+
331+ await this . dbManager . renameList ( dbItem , newName ) ;
332+ }
333+
334+ private async renameLocalDatabaseItem (
335+ dbItem : LocalDatabaseDbItem ,
336+ newName : string ,
337+ ) : Promise < void > {
338+ if ( dbItem . databaseName === newName ) {
339+ return ;
340+ }
341+
342+ if ( this . dbManager . doesLocalDbExist ( newName , dbItem . parentListName ) ) {
343+ void showAndLogErrorMessage ( `The database '${ newName } ' already exists` ) ;
344+ return ;
345+ }
346+
347+ await this . dbManager . renameLocalDb ( dbItem , newName ) ;
348+ }
349+
350+ private async renameRemoteUserDefinedListItem (
351+ dbItem : RemoteUserDefinedListDbItem ,
352+ newName : string ,
353+ ) : Promise < void > {
354+ if ( dbItem . listName === newName ) {
355+ return ;
356+ }
357+
358+ if ( this . dbManager . doesListExist ( DbListKind . Remote , newName ) ) {
359+ void showAndLogErrorMessage ( `The list '${ newName } ' already exists` ) ;
360+ return ;
361+ }
362+
363+ await this . dbManager . renameList ( dbItem , newName ) ;
364+ }
365+
269366 private async onDidCollapseElement (
270367 event : TreeViewExpansionEvent < DbTreeViewItem > ,
271368 ) : Promise < void > {
0 commit comments