@@ -702,20 +702,14 @@ function execOperation(type, action, url, $target, name) {
702702 if ( ! newUrl . created ) return ;
703703
704704 if ( isNestedPath ) {
705- openFolder . find ( url ) ?. reload ( ) ;
705+ await refreshOpenFolder ( url ) ;
706706 await FileList . refresh ( ) ;
707707 toast ( strings . success ) ;
708708 return ;
709709 }
710710
711711 newName = Url . basename ( newUrl . uri ) ;
712- if ( $target . unclasped ) {
713- if ( newUrl . type === "file" ) {
714- appendTile ( $target , createFileTile ( newName , newUrl . uri ) ) ;
715- } else if ( newUrl . type === "folder" ) {
716- appendList ( $target , createFolderTile ( newName , newUrl . uri ) ) ;
717- }
718- }
712+ appendEntryToOpenFolder ( url , newUrl . uri , newUrl . type ) ;
719713
720714 FileList . append ( url , newUrl . uri ) ;
721715 toast ( strings . success ) ;
@@ -995,6 +989,72 @@ function appendList($target, $list) {
995989 else $target . append ( $list ) ;
996990}
997991
992+ /**
993+ * Get the active file tree for a folder element, if it has been loaded.
994+ * @param {HTMLElement } $el
995+ * @returns {FileTree|null }
996+ */
997+ function getLoadedFileTree ( $el ) {
998+ return (
999+ $el ?. $ul ?. _fileTree || $el ?. fileTree || $el ?. nextElementSibling ?. _fileTree
1000+ ) ;
1001+ }
1002+
1003+ /**
1004+ * Update matching expanded folder views with a new entry.
1005+ * @param {string } parentUrl
1006+ * @param {string } entryUrl
1007+ * @param {"file"|"folder" } type
1008+ */
1009+ function appendEntryToOpenFolder ( parentUrl , entryUrl , type ) {
1010+ const filesApp = sidebarApps . get ( "files" ) ;
1011+ const $els = filesApp . getAll ( `[data-url="${ parentUrl } "]` ) ;
1012+ const isDirectory = type === "folder" ;
1013+ const name = Url . basename ( entryUrl ) ;
1014+
1015+ Array . from ( $els ) . forEach ( ( $el ) => {
1016+ if ( ! ( helpers . isDir ( $el . dataset . type ) || $el . dataset . type === "root" ) ) {
1017+ return ;
1018+ }
1019+
1020+ if ( ! $el . unclasped ) return ;
1021+
1022+ const fileTree = getLoadedFileTree ( $el ) ;
1023+ if ( fileTree ) {
1024+ fileTree . appendEntry ( name , entryUrl , isDirectory ) ;
1025+ return ;
1026+ }
1027+
1028+ if ( isDirectory ) {
1029+ appendList ( $el , createFolderTile ( name , entryUrl ) ) ;
1030+ } else {
1031+ appendTile ( $el , createFileTile ( name , entryUrl ) ) ;
1032+ }
1033+ } ) ;
1034+ }
1035+
1036+ /**
1037+ * Refresh matching expanded folder views.
1038+ * @param {string } folderUrl
1039+ */
1040+ async function refreshOpenFolder ( folderUrl ) {
1041+ const filesApp = sidebarApps . get ( "files" ) ;
1042+ const $els = filesApp . getAll ( `[data-url="${ folderUrl } "]` ) ;
1043+
1044+ await Promise . all (
1045+ Array . from ( $els ) . map ( async ( $el ) => {
1046+ if ( ! ( helpers . isDir ( $el . dataset . type ) || $el . dataset . type === "root" ) ) {
1047+ return ;
1048+ }
1049+
1050+ const fileTree = getLoadedFileTree ( $el ) ;
1051+ if ( fileTree ) {
1052+ await fileTree . refresh ( ) ;
1053+ }
1054+ } ) ,
1055+ ) ;
1056+ }
1057+
9981058/**
9991059 * Create a folder tile
10001060 * @param {string } name
@@ -1039,18 +1099,7 @@ function createFileTile(name, url) {
10391099openFolder . add = async ( url , type ) => {
10401100 const { url : parent } = await fsOperation ( Url . dirname ( url ) ) . stat ( ) ;
10411101 FileList . append ( parent , url ) ;
1042-
1043- const filesApp = sidebarApps . get ( "files" ) ;
1044- const $els = filesApp . getAll ( `[data-url="${ parent } "]` ) ;
1045- Array . from ( $els ) . forEach ( ( $el ) => {
1046- if ( $el . dataset . type !== "dir" ) return ;
1047-
1048- if ( type === "file" ) {
1049- appendTile ( $el , createFileTile ( Url . basename ( url ) , url ) ) ;
1050- } else {
1051- appendList ( $el , createFolderTile ( Url . basename ( url ) , url ) ) ;
1052- }
1053- } ) ;
1102+ appendEntryToOpenFolder ( parent , url , type ) ;
10541103} ;
10551104
10561105openFolder . renameItem = ( oldFile , newFile , newFilename ) => {
0 commit comments