From 98e65687e093ef32d724fe80fe67c19adfb6e423 Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Sun, 21 Jan 2024 19:52:31 +0100 Subject: [PATCH] fix(files): Make sure to add the `fileid` on favorite folders navigation entries Signed-off-by: Ferdinand Thiessen --- apps/files/lib/Activity/Helper.php | 63 +++++++++++++------- apps/files/lib/Controller/ViewController.php | 11 +++- apps/files/src/views/Navigation.vue | 4 +- apps/files/src/views/favorites.ts | 17 ++++-- 4 files changed, 63 insertions(+), 32 deletions(-) diff --git a/apps/files/lib/Activity/Helper.php b/apps/files/lib/Activity/Helper.php index b9a5ae887ecd2..1c14961c05988 100644 --- a/apps/files/lib/Activity/Helper.php +++ b/apps/files/lib/Activity/Helper.php @@ -4,6 +4,7 @@ * * @author Christoph Wurst * @author Joas Schilling + * @author Ferdinand Thiessen * * @license AGPL-3.0 * @@ -23,30 +24,29 @@ namespace OCA\Files\Activity; use OCP\Files\Folder; +use OCP\Files\IRootFolder; +use OCP\Files\Node; use OCP\ITagManager; class Helper { /** If a user has a lot of favorites the query might get too slow and long */ public const FAVORITE_LIMIT = 50; - /** @var ITagManager */ - protected $tagManager; - - /** - * @param ITagManager $tagManager - */ - public function __construct(ITagManager $tagManager) { - $this->tagManager = $tagManager; + public function __construct( + protected ITagManager $tagManager, + protected IRootFolder $rootFolder, + ) { } /** - * Returns an array with the favorites + * Return an array with nodes marked as favorites * - * @param string $user - * @return array + * @param string $user User ID + * @param bool $foldersOnly Only return folders (default false) + * @return Node[] * @throws \RuntimeException when too many or no favorites where found */ - public function getFavoriteFilePaths($user) { + public function getFavoriteNodes(string $user, bool $foldersOnly = false): array { $tags = $this->tagManager->load('files', [], false, $user); $favorites = $tags->getFavorites(); @@ -57,26 +57,45 @@ public function getFavoriteFilePaths($user) { } // Can not DI because the user is not known on instantiation - $rootFolder = \OC::$server->getUserFolder($user); - $folders = $items = []; + $userFolder = $this->rootFolder->getUserFolder($user); + $nodes = []; foreach ($favorites as $favorite) { - $nodes = $rootFolder->getById($favorite); + $nodes = $userFolder->getById($favorite); if (!empty($nodes)) { - /** @var \OCP\Files\Node $node */ $node = array_shift($nodes); - $path = substr($node->getPath(), strlen($user . '/files/')); - - $items[] = $path; - if ($node instanceof Folder) { - $folders[] = $path; + if (!$foldersOnly || $node instanceof Folder) { + $nodes[] = $node; } } } - if (empty($items)) { + if (empty($nodes)) { throw new \RuntimeException('No favorites', 1); } + return $nodes; + } + + /** + * Returns an array with the favorites + * + * @param string $user + * @return array + * @throws \RuntimeException when too many or no favorites where found + */ + public function getFavoriteFilePaths($user) { + $userFolder = $this->rootFolder->getUserFolder($user); + $nodes = $this->getFavoriteNodes($user); + $folders = $items = []; + foreach ($nodes as $node) { + $path = $userFolder->getRelativePath($node->getPath()); + + $items[] = $path; + if ($node instanceof Folder) { + $folders[] = $path; + } + } + return [ 'items' => $items, 'folders' => $folders, diff --git a/apps/files/lib/Controller/ViewController.php b/apps/files/lib/Controller/ViewController.php index b8090e1cf29a7..e08a94d983a4d 100644 --- a/apps/files/lib/Controller/ViewController.php +++ b/apps/files/lib/Controller/ViewController.php @@ -226,9 +226,14 @@ public function index($dir = '', $view = '', $fileid = null, $fileNotFound = fal // Get all the user favorites to create a submenu try { - $favElements = $this->activityHelper->getFavoriteFilePaths($userId); + $userFolder = $this->rootFolder->getUserFolder($this->userSession->getUser()->getUID()); + $favElements = $this->activityHelper->getFavoriteNodes($userId, true); + $favElements = array_map(fn (Folder $node) => [ + 'fileid' => $node->getId(), + 'path' => $userFolder->getRelativePath($node->getPath()), + ], $favElements); } catch (\RuntimeException $e) { - $favElements['folders'] = []; + $favElements = []; } // If the file doesn't exists in the folder and @@ -260,7 +265,7 @@ public function index($dir = '', $view = '', $fileid = null, $fileNotFound = fal $this->initialState->provideInitialState('storageStats', $storageInfo); $this->initialState->provideInitialState('config', $this->userConfig->getConfigs()); $this->initialState->provideInitialState('viewConfigs', $this->viewConfig->getConfigs()); - $this->initialState->provideInitialState('favoriteFolders', $favElements['folders'] ?? []); + $this->initialState->provideInitialState('favoriteFolders', $favElements); // File sorting user config $filesSortingConfig = json_decode($this->config->getUserValue($userId, 'files', 'files_sorting_configs', '{}'), true); diff --git a/apps/files/src/views/Navigation.vue b/apps/files/src/views/Navigation.vue index df855359f64a9..5472055b44890 100644 --- a/apps/files/src/views/Navigation.vue +++ b/apps/files/src/views/Navigation.vue @@ -228,8 +228,8 @@ export default { */ generateToNavigation(view: View) { if (view.params) { - const { dir, fileid } = view.params - return { name: 'filelist', params: view.params, query: { dir, fileid } } + const { dir } = view.params + return { name: 'filelist', params: view.params, query: { dir } } } return { name: 'filelist', params: { view: view.id } } }, diff --git a/apps/files/src/views/favorites.ts b/apps/files/src/views/favorites.ts index 599aa19135795..5ccb8851aee62 100644 --- a/apps/files/src/views/favorites.ts +++ b/apps/files/src/views/favorites.ts @@ -31,15 +31,22 @@ import { getContents } from '../services/Favorites' import { hashCode } from '../utils/hashUtils' import logger from '../logger' -export const generateFolderView = function(folder: string, index = 0): View { +// The return type of the initial state +interface IFavoriteFolder { + fileid: number + path: string +} + +export const generateFolderView = function(folder: IFavoriteFolder, index = 0): View { return new View({ - id: generateIdFromPath(folder), - name: basename(folder), + id: generateIdFromPath(folder.path), + name: basename(folder.path), icon: FolderSvg, order: index, params: { - dir: folder, + dir: folder.path, + fileid: folder.fileid.toString(), view: 'favorites', }, @@ -57,7 +64,7 @@ export const generateIdFromPath = function(path: string): string { export default () => { // Load state in function for mock testing purposes - const favoriteFolders = loadState('files', 'favoriteFolders', []) + const favoriteFolders = loadState('files', 'favoriteFolders', []) const favoriteFoldersViews = favoriteFolders.map((folder, index) => generateFolderView(folder, index)) as View[] const Navigation = getNavigation()