diff options
author | Louis Chemineau <louis@chmn.me> | 2024-06-26 12:30:50 +0200 |
---|---|---|
committer | Louis Chemineau <louis@chmn.me> | 2024-06-26 13:59:43 +0200 |
commit | fc359e3097f6405c81097028363b43eb7aeb6b9e (patch) | |
tree | 7f15af215405f3e432a62e15956512206b17cef4 /apps | |
parent | 5dcb807a98a9863f7d730c3f190e85311eda512b (diff) | |
download | nextcloud-server-fc359e3097f6405c81097028363b43eb7aeb6b9e.tar.gz nextcloud-server-fc359e3097f6405c81097028363b43eb7aeb6b9e.zip |
fix(files): Update favorites navigation list on folder renames
Signed-off-by: Louis Chemineau <louis@chmn.me>
Diffstat (limited to 'apps')
-rw-r--r-- | apps/files/src/eventbus.d.ts | 1 | ||||
-rw-r--r-- | apps/files/src/views/favorites.spec.ts | 44 | ||||
-rw-r--r-- | apps/files/src/views/favorites.ts | 28 |
3 files changed, 71 insertions, 2 deletions
diff --git a/apps/files/src/eventbus.d.ts b/apps/files/src/eventbus.d.ts index 63dbe4f3158..8d57d82c034 100644 --- a/apps/files/src/eventbus.d.ts +++ b/apps/files/src/eventbus.d.ts @@ -9,6 +9,7 @@ declare module '@nextcloud/event-bus' { // mapping of 'event name' => 'event type' 'files:favorites:removed': Node 'files:favorites:added': Node + 'files:node:renamed': Node } } diff --git a/apps/files/src/views/favorites.spec.ts b/apps/files/src/views/favorites.spec.ts index 7dbb0dbc551..dfced698cf1 100644 --- a/apps/files/src/views/favorites.spec.ts +++ b/apps/files/src/views/favorites.spec.ts @@ -7,7 +7,7 @@ import { basename } from 'path' import { expect } from '@jest/globals' import { Folder, Navigation, getNavigation } from '@nextcloud/files' import { CancelablePromise } from 'cancelable-promise' -import eventBus from '@nextcloud/event-bus' +import eventBus, { emit } from '@nextcloud/event-bus' import * as initialState from '@nextcloud/initial-state' import { action } from '../actions/favoriteAction' @@ -47,9 +47,10 @@ describe('Favorites view definition', () => { const favoritesView = Navigation.views.find(view => view.id === 'favorites') const favoriteFoldersViews = Navigation.views.filter(view => view.parent === 'favorites') - expect(eventBus.subscribe).toHaveBeenCalledTimes(2) + expect(eventBus.subscribe).toHaveBeenCalledTimes(3) expect(eventBus.subscribe).toHaveBeenNthCalledWith(1, 'files:favorites:added', expect.anything()) expect(eventBus.subscribe).toHaveBeenNthCalledWith(2, 'files:favorites:removed', expect.anything()) + expect(eventBus.subscribe).toHaveBeenNthCalledWith(3, 'files:node:renamed', expect.anything()) // one main view and no children expect(Navigation.views.length).toBe(1) @@ -180,4 +181,43 @@ describe('Dynamic update of favourite folders', () => { expect(favoritesView).toBeDefined() expect(favoriteFoldersViews.length).toBe(0) }) + + test('Renaming a favorite folder updates the navigation', async () => { + jest.spyOn(eventBus, 'emit') + jest.spyOn(initialState, 'loadState').mockReturnValue([]) + jest.spyOn(favoritesService, 'getContents').mockReturnValue(CancelablePromise.resolve({ folder: {} as Folder, contents: [] })) + + registerFavoritesView() + const favoritesView = Navigation.views.find(view => view.id === 'favorites') + const favoriteFoldersViews = Navigation.views.filter(view => view.parent === 'favorites') + + // one main view and no children + expect(Navigation.views.length).toBe(1) + expect(favoritesView).toBeDefined() + expect(favoriteFoldersViews.length).toBe(0) + + // expect(eventBus.emit).toHaveBeenCalledTimes(2) + + // Create new folder to favorite + const folder = new Folder({ + id: 1, + source: 'http://localhost/remote.php/dav/files/admin/Foo/Bar', + owner: 'admin', + }) + + // Exec the action + await action.exec(folder, favoritesView, '/') + expect(eventBus.emit).toHaveBeenNthCalledWith(1, 'files:favorites:added', folder) + + // Create a folder with the same id but renamed + const renamedFolder = new Folder({ + id: 1, + source: 'http://localhost/remote.php/dav/files/admin/Foo/Bar.renamed', + owner: 'admin', + }) + + // Exec the rename action + emit('files:node:renamed', renamedFolder) + expect(eventBus.emit).toHaveBeenNthCalledWith(2, 'files:node:renamed', renamedFolder) + }) }) diff --git a/apps/files/src/views/favorites.ts b/apps/files/src/views/favorites.ts index b246eb59793..e09587a0d5d 100644 --- a/apps/files/src/views/favorites.ts +++ b/apps/files/src/views/favorites.ts @@ -107,6 +107,21 @@ export default () => { }) /** + * Update favourites navigation when a folder is renamed + */ + subscribe('files:node:renamed', (node: Node) => { + if (node.type !== FileType.Folder) { + return + } + + if (node.attributes.favorite !== 1) { + return + } + + updateNodeFromFavorites(node as Folder) + }) + + /** * Sort the favorites paths array and * update the order property of the existing views */ @@ -157,4 +172,17 @@ export default () => { Navigation.remove(id) updateAndSortViews() } + + // Update a folder from the favorites paths array and update the views + const updateNodeFromFavorites = function(node: Folder) { + const favoriteFolder = favoriteFolders.find((folder) => folder.fileid === node.fileid) + + // Skip if it does not exists + if (favoriteFolder === undefined) { + return + } + + removePathFromFavorites(favoriteFolder.path) + addToFavorites(node) + } } |