Skip to content

Commit 0d64402

Browse files
committed
fix(files): Update favorites navigation list on folder renames
Signed-off-by: Louis Chemineau <louis@chmn.me> [skip ci] Signed-off-by: Louis Chemineau <louis@chmn.me>
1 parent 7f61a8a commit 0d64402

7 files changed

Lines changed: 77 additions & 8 deletions

File tree

apps/files/src/eventbus.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ declare module '@nextcloud/event-bus' {
55
// mapping of 'event name' => 'event type'
66
'files:favorites:removed': Node
77
'files:favorites:added': Node
8+
'files:node:renamed': Node
89
}
910
}
1011

apps/files/src/views/favorites.spec.ts

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import { basename } from 'path'
2424
import { expect } from '@jest/globals'
2525
import { Folder, Navigation, getNavigation } from '@nextcloud/files'
26-
import eventBus from '@nextcloud/event-bus'
26+
import eventBus, { emit } from '@nextcloud/event-bus'
2727
import * as initialState from '@nextcloud/initial-state'
2828

2929
import { action } from '../actions/favoriteAction'
@@ -63,9 +63,10 @@ describe('Favorites view definition', () => {
6363
const favoritesView = Navigation.views.find(view => view.id === 'favorites')
6464
const favoriteFoldersViews = Navigation.views.filter(view => view.parent === 'favorites')
6565

66-
expect(eventBus.subscribe).toHaveBeenCalledTimes(2)
66+
expect(eventBus.subscribe).toHaveBeenCalledTimes(3)
6767
expect(eventBus.subscribe).toHaveBeenNthCalledWith(1, 'files:favorites:added', expect.anything())
6868
expect(eventBus.subscribe).toHaveBeenNthCalledWith(2, 'files:favorites:removed', expect.anything())
69+
expect(eventBus.subscribe).toHaveBeenNthCalledWith(3, 'files:node:renamed', expect.anything())
6970

7071
// one main view and no children
7172
expect(Navigation.views.length).toBe(1)
@@ -196,4 +197,43 @@ describe('Dynamic update of favourite folders', () => {
196197
expect(favoritesView).toBeDefined()
197198
expect(favoriteFoldersViews.length).toBe(0)
198199
})
200+
201+
test('Renaming a favorite folder updates the navigation', async () => {
202+
jest.spyOn(eventBus, 'emit')
203+
jest.spyOn(initialState, 'loadState').mockReturnValue([])
204+
jest.spyOn(favoritesService, 'getContents').mockReturnValue(Promise.resolve({ folder: {} as Folder, contents: [] }))
205+
206+
registerFavoritesView()
207+
const favoritesView = Navigation.views.find(view => view.id === 'favorites')
208+
const favoriteFoldersViews = Navigation.views.filter(view => view.parent === 'favorites')
209+
210+
// one main view and no children
211+
expect(Navigation.views.length).toBe(1)
212+
expect(favoritesView).toBeDefined()
213+
expect(favoriteFoldersViews.length).toBe(0)
214+
215+
// expect(eventBus.emit).toHaveBeenCalledTimes(2)
216+
217+
// Create new folder to favorite
218+
const folder = new Folder({
219+
id: 1,
220+
source: 'http://localhost/remote.php/dav/files/admin/Foo/Bar',
221+
owner: 'admin',
222+
})
223+
224+
// Exec the action
225+
await action.exec(folder, favoritesView, '/')
226+
expect(eventBus.emit).toHaveBeenNthCalledWith(1, 'files:favorites:added', folder)
227+
228+
// Create a folder with the same id but renamed
229+
const renamedFolder = new Folder({
230+
id: 1,
231+
source: 'http://localhost/remote.php/dav/files/admin/Foo/Bar.renamed',
232+
owner: 'admin',
233+
})
234+
235+
// Exec the rename action
236+
emit('files:node:renamed', renamedFolder)
237+
expect(eventBus.emit).toHaveBeenNthCalledWith(2, 'files:node:renamed', renamedFolder)
238+
})
199239
})

apps/files/src/views/favorites.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,21 @@ export default () => {
123123
removePathFromFavorites(node.path)
124124
})
125125

126+
/**
127+
* Update favourites navigation when a folder is renamed
128+
*/
129+
subscribe('files:node:renamed', (node: Node) => {
130+
if (node.type !== FileType.Folder) {
131+
return
132+
}
133+
134+
if (node.attributes.favorite !== 1) {
135+
return
136+
}
137+
138+
updateNodeFromFavorites(node as Folder)
139+
})
140+
126141
/**
127142
* Sort the favorites paths array and
128143
* update the order property of the existing views
@@ -174,4 +189,17 @@ export default () => {
174189
Navigation.remove(id)
175190
updateAndSortViews()
176191
}
192+
193+
// Update a folder from the favorites paths array and update the views
194+
const updateNodeFromFavorites = function(node: Folder) {
195+
const favoriteFolder = favoriteFolders.find((folder) => folder.fileid === node.fileid)
196+
197+
// Skip if it does not exists
198+
if (favoriteFolder === undefined) {
199+
return
200+
}
201+
202+
removePathFromFavorites(favoriteFolder.path)
203+
addToFavorites(node)
204+
}
177205
}

dist/core-common.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/core-common.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/files-init.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/files-init.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)