@@ -13,10 +13,90 @@ const folders = shallowRef<FoldersTreeResponse>()
1313
1414const renameFolderId = ref < number | null > ( null )
1515
16- async function getFolders ( ) {
16+ function findParentFolderIds ( folderId : number , allFolders : any [ ] ) : number [ ] {
17+ const parentIds : number [ ] = [ ]
18+
19+ function findParents ( currentFolderId : number ) {
20+ const folder = allFolders . find ( f => f . id === currentFolderId )
21+ if ( folder && folder . parentId ) {
22+ parentIds . push ( folder . parentId )
23+ findParents ( folder . parentId )
24+ }
25+ }
26+
27+ findParents ( folderId )
28+ return parentIds
29+ }
30+
31+ async function ensureSelectedFolderIsVisible ( ) {
32+ if ( ! state . folderId || ! folders . value ) {
33+ return
34+ }
35+
36+ const flatFolders : any [ ] = [ ]
37+
38+ function flattenFolders ( folderList : any [ ] ) {
39+ folderList . forEach ( ( folder ) => {
40+ flatFolders . push ( folder )
41+ if ( folder . children && folder . children . length > 0 ) {
42+ flattenFolders ( folder . children )
43+ }
44+ } )
45+ }
46+
47+ flattenFolders ( folders . value )
48+
49+ const parentIds = findParentFolderIds ( state . folderId , flatFolders )
50+
51+ if ( parentIds . length === 0 ) {
52+ return
53+ }
54+
55+ const foldersToOpen = parentIds . filter ( ( parentId ) => {
56+ const folder = flatFolders . find ( f => f . id === parentId )
57+ return folder && folder . isOpen === 0
58+ } )
59+
60+ if ( foldersToOpen . length === 0 ) {
61+ return
62+ }
63+
64+ try {
65+ const updateResults = await Promise . allSettled (
66+ foldersToOpen . map ( folderId =>
67+ api . folders . patchFoldersById ( String ( folderId ) , { isOpen : 1 } ) ,
68+ ) ,
69+ )
70+
71+ const failedUpdates = updateResults
72+ . map ( ( result , index ) => ( { result, folderId : foldersToOpen [ index ] } ) )
73+ . filter ( ( { result } ) => result . status === 'rejected' )
74+
75+ if ( failedUpdates . length > 0 ) {
76+ console . warn ( 'Some folders failed to open:' , failedUpdates )
77+ }
78+
79+ await getFolders ( false )
80+ }
81+ catch ( error ) {
82+ console . error ( 'Error while opening parent folders:' , error )
83+ try {
84+ await getFolders ( false )
85+ }
86+ catch ( fallbackError ) {
87+ console . error ( 'Failed to refresh folders:' , fallbackError )
88+ }
89+ }
90+ }
91+
92+ async function getFolders ( shouldEnsureVisibility = true ) {
1793 try {
1894 const { data } = await api . folders . getFoldersTree ( )
1995 folders . value = data
96+
97+ if ( shouldEnsureVisibility ) {
98+ await ensureSelectedFolderIsVisible ( )
99+ }
20100 }
21101 catch ( error ) {
22102 console . error ( error )
@@ -29,7 +109,7 @@ async function createFolder() {
29109 name : i18n . t ( 'folder.untitled' ) ,
30110 } )
31111
32- await getFolders ( )
112+ await getFolders ( false )
33113
34114 return data . id
35115 }
@@ -43,7 +123,7 @@ async function createFolderAndSelect() {
43123 const id = await createFolder ( )
44124
45125 if ( id ) {
46- selectFolder ( Number ( id ) )
126+ await selectFolder ( Number ( id ) )
47127 clearSnippetsState ( )
48128 scrollToElement ( `[id="${ id } "]` )
49129 renameFolderId . value = Number ( id )
@@ -53,7 +133,7 @@ async function createFolderAndSelect() {
53133async function updateFolder ( folderId : number , data : FoldersUpdate ) {
54134 try {
55135 await api . folders . patchFoldersById ( String ( folderId ) , data )
56- await getFolders ( )
136+ await getFolders ( false )
57137
58138 if ( folderId === state . folderId ) {
59139 const { getSnippets } = useSnippets ( )
@@ -68,17 +148,21 @@ async function updateFolder(folderId: number, data: FoldersUpdate) {
68148async function deleteFolder ( folderId : number ) {
69149 try {
70150 await api . folders . deleteFoldersById ( String ( folderId ) )
71- await getFolders ( )
151+ await getFolders ( false )
72152 }
73153 catch ( error ) {
74154 console . error ( error )
75155 }
76156}
77- function selectFolder ( folderId : number ) {
157+ async function selectFolder ( folderId : number ) {
78158 state . folderId = folderId
79159 state . libraryFilter = undefined
80160 state . tagId = undefined
81161 state . snippetId = undefined
162+
163+ if ( folders . value && folders . value . length > 0 ) {
164+ await ensureSelectedFolderIsVisible ( )
165+ }
82166}
83167
84168export function useFolders ( ) {
0 commit comments