+ $term = $request->get('term', '');
+ $results = $this->searchService->searchBook($bookId, $term);
+ return view('partials.entity-list', ['entities' => $results]);
+ }
+
+ /**
+ * Searches all entities within a chapter.
+ */
+ public function searchChapter(Request $request, int $chapterId)
+ {
+ $term = $request->get('term', '');
+ $results = $this->searchService->searchChapter($chapterId, $term);
+ return view('partials.entity-list', ['entities' => $results]);
+ }
+
+ /**
+ * Search for a list of entities and return a partial HTML response of matching entities.
+ * Returns the most popular entities if no search is provided.
+ */
+ public function searchEntitiesAjax(Request $request)
+ {
+ $entityTypes = $request->filled('types') ? explode(',', $request->get('types')) : ['page', 'chapter', 'book'];
+ $searchTerm = $request->get('term', false);
+ $permission = $request->get('permission', 'view');
+
+ // Search for entities otherwise show most popular
+ if ($searchTerm !== false) {
+ $searchTerm .= ' {type:'. implode('|', $entityTypes) .'}';
+ $entities = $this->searchService->searchEntities($searchTerm, 'all', 1, 20, $permission)['results'];
+ } else {
+ $entities = $this->viewService->getPopular(20, 0, $entityTypes, $permission);