Skip to content

Commit 9b05759

Browse files
authored
Merge pull request #45977 from nextcloud/artonge/fix/update_favorite_navigation
Update favorites navigation list on folder renames
2 parents 1748bc5 + fc359e3 commit 9b05759

5 files changed

Lines changed: 74 additions & 5 deletions

File tree

apps/files/src/eventbus.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ declare module '@nextcloud/event-bus' {
99
// mapping of 'event name' => 'event type'
1010
'files:favorites:removed': Node
1111
'files:favorites:added': Node
12+
'files:node:renamed': Node
1213
}
1314
}
1415

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

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { basename } from 'path'
77
import { expect } from '@jest/globals'
88
import { Folder, Navigation, getNavigation } from '@nextcloud/files'
99
import { CancelablePromise } from 'cancelable-promise'
10-
import eventBus from '@nextcloud/event-bus'
10+
import eventBus, { emit } from '@nextcloud/event-bus'
1111
import * as initialState from '@nextcloud/initial-state'
1212

1313
import { action } from '../actions/favoriteAction'
@@ -47,9 +47,10 @@ describe('Favorites view definition', () => {
4747
const favoritesView = Navigation.views.find(view => view.id === 'favorites')
4848
const favoriteFoldersViews = Navigation.views.filter(view => view.parent === 'favorites')
4949

50-
expect(eventBus.subscribe).toHaveBeenCalledTimes(2)
50+
expect(eventBus.subscribe).toHaveBeenCalledTimes(3)
5151
expect(eventBus.subscribe).toHaveBeenNthCalledWith(1, 'files:favorites:added', expect.anything())
5252
expect(eventBus.subscribe).toHaveBeenNthCalledWith(2, 'files:favorites:removed', expect.anything())
53+
expect(eventBus.subscribe).toHaveBeenNthCalledWith(3, 'files:node:renamed', expect.anything())
5354

5455
// one main view and no children
5556
expect(Navigation.views.length).toBe(1)
@@ -180,4 +181,43 @@ describe('Dynamic update of favourite folders', () => {
180181
expect(favoritesView).toBeDefined()
181182
expect(favoriteFoldersViews.length).toBe(0)
182183
})
184+
185+
test('Renaming a favorite folder updates the navigation', async () => {
186+
jest.spyOn(eventBus, 'emit')
187+
jest.spyOn(initialState, 'loadState').mockReturnValue([])
188+
jest.spyOn(favoritesService, 'getContents').mockReturnValue(CancelablePromise.resolve({ folder: {} as Folder, contents: [] }))
189+
190+
registerFavoritesView()
191+
const favoritesView = Navigation.views.find(view => view.id === 'favorites')
192+
const favoriteFoldersViews = Navigation.views.filter(view => view.parent === 'favorites')
193+
194+
// one main view and no children
195+
expect(Navigation.views.length).toBe(1)
196+
expect(favoritesView).toBeDefined()
197+
expect(favoriteFoldersViews.length).toBe(0)
198+
199+
// expect(eventBus.emit).toHaveBeenCalledTimes(2)
200+
201+
// Create new folder to favorite
202+
const folder = new Folder({
203+
id: 1,
204+
source: 'http://localhost/remote.php/dav/files/admin/Foo/Bar',
205+
owner: 'admin',
206+
})
207+
208+
// Exec the action
209+
await action.exec(folder, favoritesView, '/')
210+
expect(eventBus.emit).toHaveBeenNthCalledWith(1, 'files:favorites:added', folder)
211+
212+
// Create a folder with the same id but renamed
213+
const renamedFolder = new Folder({
214+
id: 1,
215+
source: 'http://localhost/remote.php/dav/files/admin/Foo/Bar.renamed',
216+
owner: 'admin',
217+
})
218+
219+
// Exec the rename action
220+
emit('files:node:renamed', renamedFolder)
221+
expect(eventBus.emit).toHaveBeenNthCalledWith(2, 'files:node:renamed', renamedFolder)
222+
})
183223
})

apps/files/src/views/favorites.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,21 @@ export default () => {
106106
removePathFromFavorites(node.path)
107107
})
108108

109+
/**
110+
* Update favourites navigation when a folder is renamed
111+
*/
112+
subscribe('files:node:renamed', (node: Node) => {
113+
if (node.type !== FileType.Folder) {
114+
return
115+
}
116+
117+
if (node.attributes.favorite !== 1) {
118+
return
119+
}
120+
121+
updateNodeFromFavorites(node as Folder)
122+
})
123+
109124
/**
110125
* Sort the favorites paths array and
111126
* update the order property of the existing views
@@ -157,4 +172,17 @@ export default () => {
157172
Navigation.remove(id)
158173
updateAndSortViews()
159174
}
175+
176+
// Update a folder from the favorites paths array and update the views
177+
const updateNodeFromFavorites = function(node: Folder) {
178+
const favoriteFolder = favoriteFolders.find((folder) => folder.fileid === node.fileid)
179+
180+
// Skip if it does not exists
181+
if (favoriteFolder === undefined) {
182+
return
183+
}
184+
185+
removePathFromFavorites(favoriteFolder.path)
186+
addToFavorites(node)
187+
}
160188
}

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)