From 88cd54bae8b0967b426e5050b3b16b0eb3b1b620 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Sun, 4 Feb 2024 11:55:25 +0100 Subject: [PATCH] enh(search): Always search in current folder Signed-off-by: Marcel Klehr --- appinfo/routes.php | 2 +- lib/Controller/BookmarkController.php | 4 +++- lib/Controller/InternalBookmarkController.php | 5 +++-- lib/Db/BookmarkMapper.php | 8 +++++++- lib/QueryParameters.php | 17 +++++++++++++++++ src/components/BookmarksList.vue | 2 +- src/components/Controls.vue | 16 +++++++++++++--- src/components/NoBookmarks.vue | 7 +++++++ src/components/ViewPrivate.vue | 2 +- src/components/ViewPublic.vue | 2 +- src/router.js | 4 ++-- src/store/actions.js | 4 ++-- 12 files changed, 58 insertions(+), 15 deletions(-) diff --git a/appinfo/routes.php b/appinfo/routes.php index f002c9e9..e9a4126a 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -23,7 +23,7 @@ return [ //Web Template Route ['name' => 'web_view#index', 'url' => '/', 'verb' => 'GET'], ['name' => 'web_view#index', 'url' => '/recent', 'verb' => 'GET', 'postfix' => 'recent'], - ['name' => 'web_view#index', 'url' => '/search/{search}', 'verb' => 'GET', 'postfix' => 'search'], + ['name' => 'web_view#index', 'url' => '/folders/{folder}/search/{search}', 'verb' => 'GET', 'postfix' => 'search'], ['name' => 'web_view#index', 'url' => '/folders/{folder}', 'verb' => 'GET', 'postfix' => 'folder'], ['name' => 'web_view#index', 'url' => '/bookmarks/{bookmark}', 'verb' => 'GET', 'postfix' => 'bookmark'], ['name' => 'web_view#index', 'url' => '/tags/{tags}', 'verb' => 'GET', 'postfix' => 'tags'], diff --git a/lib/Controller/BookmarkController.php b/lib/Controller/BookmarkController.php index bd27c2fc..e6641600 100644 --- a/lib/Controller/BookmarkController.php +++ b/lib/Controller/BookmarkController.php @@ -284,7 +284,8 @@ class BookmarkController extends ApiController { ?string $url = null, ?bool $unavailable = null, ?bool $archived = null, - ?bool $duplicated = null + ?bool $duplicated = null, + bool $recursive = false, ): DataResponse { $this->registerResponder('rss', function (DataResponse $res) { if ($res->getData()['status'] === 'success') { @@ -372,6 +373,7 @@ class BookmarkController extends ApiController { return new DataResponse(['status' => 'error', 'data' => 'Not found'], Http::STATUS_BAD_REQUEST); } $params->setFolder($this->toInternalFolderId($folder)); + $params->setRecursive($recursive); } if ($userId !== null) { diff --git a/lib/Controller/InternalBookmarkController.php b/lib/Controller/InternalBookmarkController.php index 356fc59a..67efe639 100644 --- a/lib/Controller/InternalBookmarkController.php +++ b/lib/Controller/InternalBookmarkController.php @@ -74,9 +74,10 @@ class InternalBookmarkController extends ApiController { $url = null, $unavailable = null, $archived = null, - $duplicated = null + $duplicated = null, + bool $recursive = false, ): DataResponse { - return $this->publicController->getBookmarks($page, $tags, $conjunction, $sortby, $search, $limit, $untagged, $folder, $url, $unavailable, $archived, $duplicated); + return $this->publicController->getBookmarks($page, $tags, $conjunction, $sortby, $search, $limit, $untagged, $folder, $url, $unavailable, $archived, $duplicated, $recursive); } /** diff --git a/lib/Db/BookmarkMapper.php b/lib/Db/BookmarkMapper.php index db9dcc5a..8fac2b91 100644 --- a/lib/Db/BookmarkMapper.php +++ b/lib/Db/BookmarkMapper.php @@ -464,7 +464,13 @@ class BookmarkMapper extends QBMapper { */ private function _filterFolder(IQueryBuilder $qb, QueryParameters $params): void { if ($params->getFolder() !== null) { - $qb->andWhere($qb->expr()->eq('tree.parent_folder', $qb->createPositionalParameter($params->getFolder(), IQueryBuilder::PARAM_INT))); + if ($params->getRecursive()) { + $childFolders = \OC::$server->get(TreeMapper::class)->findByAncestorFolder(TreeMapper::TYPE_FOLDER, $params->getFolder()); + $ids = array_map(fn (Folder $folder) => $folder->getId(), $childFolders); + $qb->andWhere($qb->expr()->in('tree.parent_folder', $qb->createPositionalParameter($ids, IQueryBuilder::PARAM_INT_ARRAY))); + } else { + $qb->andWhere($qb->expr()->eq('tree.parent_folder', $qb->createPositionalParameter($params->getFolder(), IQueryBuilder::PARAM_INT))); + } } } diff --git a/lib/QueryParameters.php b/lib/QueryParameters.php index 80fbca79..40e4e394 100644 --- a/lib/QueryParameters.php +++ b/lib/QueryParameters.php @@ -25,6 +25,7 @@ class QueryParameters { private $duplicated = false; private $search = []; private $tags = []; + private bool $recursive = false; /** * @return array @@ -241,4 +242,20 @@ class QueryParameters { public function getDuplicated(): bool { return $this->duplicated; } + + /** + * @param bool $recursive + * @return static + */ + public function setRecursive(bool $recursive): self { + $this->recursive = $recursive; + return $this; + } + + /** + * @return bool + */ + public function getRecursive(): bool { + return $this->recursive; + } } diff --git a/src/components/BookmarksList.vue b/src/components/BookmarksList.vue index 74dc2f20..a91fb559 100644 --- a/src/components/BookmarksList.vue +++ b/src/components/BookmarksList.vue @@ -138,7 +138,7 @@ export default { } return results } - return this.$store.getters.getFolder(-1)[0].children.flatMap(searchFolder) + return this.$store.getters.getFolder(this.$store.state.fetchState.query.folder)[0].children.flatMap(searchFolder) } if (this.$route.name !== this.routes.HOME && this.$route.name !== this.routes.FOLDER) { return [] diff --git a/src/components/Controls.vue b/src/components/Controls.vue index 5021f991..0ab19683 100644 --- a/src/components/Controls.vue +++ b/src/components/Controls.vue @@ -7,7 +7,7 @@