@@ -442,6 +442,7 @@ export class OneNode extends vscode.TreeItem {
442
442
super ( node . name , collapsibleState ) ;
443
443
444
444
this . id = node . id ;
445
+ this . node = node ;
445
446
this . resourceUri = node . uri ;
446
447
this . description = true ;
447
448
this . tooltip = `${ this . node . path } ` ;
@@ -483,6 +484,7 @@ export class OneTreeDataProvider implements vscode.TreeDataProvider<Node> {
483
484
public static didHideExtra : boolean = false ;
484
485
485
486
public static hasSelectedCfg : boolean = false ;
487
+ public static selectedCfgs : Node [ ] = [ ] ;
486
488
487
489
public static register ( context : vscode . ExtensionContext ) {
488
490
const provider = new OneTreeDataProvider ( context . extension . extensionKind ) ;
@@ -492,7 +494,16 @@ export class OneTreeDataProvider implements vscode.TreeDataProvider<Node> {
492
494
showCollapseAll : true ,
493
495
canSelectMany : true ,
494
496
} ) ;
495
- provider . _treeView . onDidChangeSelection ( ( ) => {
497
+
498
+ provider . _treeView . onDidChangeSelection ( ( event ) => {
499
+ const selectedItems = event . selection ;
500
+ OneTreeDataProvider . hasSelectedCfg = selectedItems . some (
501
+ ( item ) => item . type === NodeType . config
502
+ ) ;
503
+ OneTreeDataProvider . selectedCfgs = selectedItems . filter (
504
+ ( item ) => item . type === NodeType . config
505
+ ) ;
506
+
496
507
provider . refreshCfgSelection ( ) ;
497
508
} ) ;
498
509
@@ -588,20 +599,26 @@ export class OneTreeDataProvider implements vscode.TreeDataProvider<Node> {
588
599
provider . delete ( node )
589
600
) ,
590
601
vscode . commands . registerCommand ( "one.explorer.rename" , async ( ) => {
591
- if ( provider . getSelectedCfg ( ) ?. length !== 1 ) {
592
- // Delete is only supported for single selection
593
- // Do not show an error or warning message for UI's sake
594
- // TODO: handle for multiple selection
602
+ const nodes = provider . getSelectedCfg ( ) ;
603
+ if ( nodes === undefined ) {
595
604
return ;
596
- } else {
597
- const node = provider . getSelectedCfg ( ) ! [ 0 ] ;
598
- Logger . info ( "OneExplorer" , "Shortcut" , `Rename ${ node . uri . fsPath } ` ) ;
599
-
600
- await provider . rename ( node ) ;
601
- // TODO: handle for multiple selection
602
- // TODO: improve refresh performance
603
- provider . refresh ( node . parent ) ;
604
605
}
606
+ //await Promise.all(nodes.map((node) => this.renameSingleFile(node)));
607
+
608
+
609
+ await provider . renameCfgFiles ( nodes ) ;
610
+ // assert.ok(nodes.length > 0);
611
+ // assert.ok(nodes.every((node) => node.type === NodeType.config));
612
+
613
+
614
+ // Rename the files one-by-one
615
+ // const promises = nodes.map(async (cfg) => {
616
+ // Logger.info("ONE Explorer", "Shortcut", `rename ${cfg.uri.fsPath}`);
617
+ // await provider.renameSingleFile(cfg);
618
+ // await provider.refresh(cfg.parent);
619
+ // return;
620
+ // });
621
+ // promises.reduce((prev, curr) => prev.then(() => curr), Promise.resolve());
605
622
} ) ,
606
623
vscode . commands . registerCommand ( "one.explorer.refactor" , ( node : Node ) =>
607
624
provider . refactor ( node )
@@ -761,7 +778,7 @@ export class OneTreeDataProvider implements vscode.TreeDataProvider<Node> {
761
778
*/
762
779
private askNewName = ( node : Node ) => {
763
780
return vscode . window . showInputBox ( {
764
- title : "Enter a file name:" ,
781
+ title : `Renaming ' ${ path . basename ( node . uri . fsPath ) } ':` ,
765
782
value : `${ path . basename ( node . uri . fsPath ) } ` ,
766
783
valueSelection : [
767
784
0 ,
@@ -800,26 +817,40 @@ export class OneTreeDataProvider implements vscode.TreeDataProvider<Node> {
800
817
} ;
801
818
802
819
/**
803
- * Rename a file
820
+ * Rename a multiple cfg files
804
821
* @note Renaming is only allowed for config files as it has no impact on the explorer view.
805
822
* @command one.explorer.rename
823
+ * @assumption All nodes are config files
824
+ * @todo prohibit special characters from new name for security ('..', '*', etc)
825
+ */
826
+ async renameCfgFiles ( nodes : Node [ ] ) : Promise < void > {
827
+ assert . ok ( nodes . length > 0 ) ;
828
+ assert . ok ( nodes . every ( ( node ) => node . type === NodeType . config ) ) ;
829
+
830
+ await Promise . all ( nodes . map ( async ( node ) => await this . renameSingleFile ( node ) . then ( async ( ) => await this . refresh ( node . parent ) ) ) ) ;
831
+ }
832
+
833
+
834
+ /**
835
+ * Rename a single file
836
+ * @note Renaming is only allowed for config files as it has no impact on the explorer view.
806
837
* @todo prohibit special characters from new name for security ('..', '*', etc)
807
838
*/
808
- async rename ( node : Node ) : Promise < void > {
839
+ async renameSingleFile ( node : Node ) : Promise < void > {
809
840
assert . ok ( node . type === NodeType . config ) ;
810
841
811
842
if ( node . type !== NodeType . config ) {
812
843
return ;
813
844
}
814
845
815
- return this . askNewName ( node ) . then ( ( newname ) => {
846
+ await this . askNewName ( node ) . then ( async ( newname ) => {
816
847
if ( newname ) {
817
848
const dirpath = path . dirname ( node . uri . fsPath ) ;
818
849
const newpath = `${ dirpath } /${ newname } ` ;
819
850
820
851
const edit = new vscode . WorkspaceEdit ( ) ;
821
852
edit . renameFile ( node . uri , vscode . Uri . file ( newpath ) ) ;
822
- vscode . workspace . applyEdit ( edit ) ;
853
+ await vscode . workspace . applyEdit ( edit ) ;
823
854
}
824
855
} ) ;
825
856
}
0 commit comments