Skip to content

Commit 34724e9

Browse files
committed
fix: open parent folders if selected nested folder
1 parent 24e0935 commit 34724e9

3 files changed

Lines changed: 92 additions & 8 deletions

File tree

src/renderer/components/sidebar/library/Library.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ async function onFolderClick(id: number) {
6868
clearSearch()
6969
7070
await getSnippets({ folderId: id })
71-
selectFolder(id)
71+
await selectFolder(id)
7272
selectFirstSnippet()
7373
}
7474
}

src/renderer/composables/useFolders.ts

Lines changed: 90 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,90 @@ const folders = shallowRef<FoldersTreeResponse>()
1313

1414
const 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() {
53133
async 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) {
68148
async 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

84168
export function useFolders() {

src/renderer/ipc/listeners/system.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export function registerSystemListeners() {
2525

2626
await getSnippets({ folderId })
2727

28-
selectFolder(Number(folderId))
28+
await selectFolder(Number(folderId))
2929
selectSnippet(Number(snippetId))
3030
}
3131
}

0 commit comments

Comments
 (0)