aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorLouis Chemineau <louis@chmn.me>2024-06-26 12:30:50 +0200
committerLouis Chemineau <louis@chmn.me>2024-06-26 13:59:43 +0200
commitfc359e3097f6405c81097028363b43eb7aeb6b9e (patch)
tree7f15af215405f3e432a62e15956512206b17cef4 /apps
parent5dcb807a98a9863f7d730c3f190e85311eda512b (diff)
downloadnextcloud-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.ts1
-rw-r--r--apps/files/src/views/favorites.spec.ts44
-rw-r--r--apps/files/src/views/favorites.ts28
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)
+ }
}