Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 21 additions & 28 deletions app/Search/SearchController.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use BookStack\Http\Controller;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;
use BookStack\Users\Models\User;

class SearchController extends Controller
{
Expand All @@ -17,16 +18,20 @@ public function __construct(
) {
}

/**
* Searches all entities.
*/
public function search(Request $request, SearchResultsFormatter $formatter)
{
$searchOpts = SearchOptions::fromRequest($request);
$fullSearchString = $searchOpts->toString();
$page = intval($request->get('page', '0')) ?: 1;
$count = setting()->getInteger('lists-page-count-search', 18, 1, 1000);

$users = [];
if (!empty($fullSearchString)) {
$users = User::where('name', 'like', '%' . $fullSearchString . '%')
->take(5)
->get();
}

$results = $this->searchRunner->searchEntities($searchOpts, 'all', $page, $count);
$formatter->format($results['results']->all(), $searchOpts);
$paginator = new LengthAwarePaginator($results['results'], $results['total'], $count, $page);
Expand All @@ -41,23 +46,16 @@ public function search(Request $request, SearchResultsFormatter $formatter)
'paginator' => $paginator,
'searchTerm' => $fullSearchString,
'options' => $searchOpts,
'users' => $users,
]);
}

/**
* Searches all entities within a book.
*/
public function searchBook(Request $request, int $bookId)
{
$term = $request->get('term', '');
$term = $request->get('term', '');
$results = $this->searchRunner->searchBook($bookId, $term);

return view('entities.list', ['entities' => $results]);
}

/**
* Searches all entities within a chapter.
*/
public function searchChapter(Request $request, int $chapterId)
{
$term = $request->get('term', '');
Expand All @@ -76,7 +74,6 @@ public function searchForSelector(Request $request, QueryPopular $queryPopular)
$searchTerm = $request->get('term', false);
$permission = $request->get('permission', 'view');

// Search for entities otherwise show most popular
if ($searchTerm !== false) {
$options = SearchOptions::fromString($searchTerm);
$options->setFilter('type', implode('|', $entityTypes));
Expand All @@ -87,10 +84,6 @@ public function searchForSelector(Request $request, QueryPopular $queryPopular)

return view('search.parts.entity-selector-list', ['entities' => $entities, 'permission' => $permission]);
}

/**
* Search for a list of templates to choose from.
*/
public function templatesForSelector(Request $request)
{
$searchTerm = $request->get('term', false);
Expand All @@ -112,28 +105,28 @@ public function templatesForSelector(Request $request)
'permission' => 'view'
]);
}

/**
* Search for a list of entities and return a partial HTML response of matching entities
* to be used as a result preview suggestion list for global system searches.
*/
public function searchSuggestions(Request $request)
{
$searchTerm = $request->get('term', '');

$users = [];
if (!empty($searchTerm)) {
$users = User::where('name', 'like', '%' . $searchTerm . '%')
->take(3)
->get();
}

$entities = $this->searchRunner->searchEntities(SearchOptions::fromString($searchTerm), 'all', 1, 5)['results'];

foreach ($entities as $entity) {
$entity->setAttribute('preview_content', '');
}

return view('search.parts.entity-suggestion-list', [
'entities' => $entities->slice(0, 5)
'entities' => $entities->slice(0, 5),
'users' => $users,
]);
}

/**
* Search sibling items in the system.
*/
public function searchSiblings(Request $request, SiblingFetcher $siblingFetcher)
{
$type = $request->get('entity_type', null);
Expand All @@ -143,4 +136,4 @@ public function searchSiblings(Request $request, SiblingFetcher $siblingFetcher)

return view('entities.list-basic', ['entities' => $entities, 'style' => 'compact']);
}
}
}
56 changes: 35 additions & 21 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 18 additions & 1 deletion resources/views/search/all.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,23 @@
</form>

<h6 class="text-muted">{{ trans_choice('entities.search_total_results_found', $totalResults, ['count' => $totalResults]) }}</h6>

@if(isset($users) && count($users) > 0)
<div class="mb-m">
<h6 class="text-muted">Matching Users</h6>
<div class="grid third gap-m">
@foreach($users as $user)
<a href="{{ $user->getProfileUrl() }}" class="card flex-container-row items-center p-s hover-bg-wash" style="text-decoration: none;">
<img class="avatar me-m" src="{{ $user->getAvatar(40) }}" alt="{{ $user->name }}" style="border-radius: 50%; width: 40px; height: 40px;">
<div>
<h4 class="text-user mb-none" style="font-size: 1.1rem; color: var(--color-link);">{{ $user->name }}</h4>
</div>
</a>
@endforeach
</div>
</div>
@endif

<div class="book-contents">
@include('entities.list', ['entities' => $entities, 'showPath' => true, 'showTags' => true])
</div>
Expand All @@ -93,4 +110,4 @@
</div>

</div>
@stop
@stop
23 changes: 22 additions & 1 deletion resources/views/search/parts/entity-suggestion-list.blade.php
Original file line number Diff line number Diff line change
@@ -1,3 +1,24 @@
{{-- NEW CODE: Display matching users at the top of the suggestions --}}
@if(isset($users) && count($users) > 0)
<div class="px-m py-s">
<div class="text-muted text-sm mb-xs" style="font-weight: bold; text-transform: uppercase; letter-spacing: 0.05em;">Users</div>
<div class="entity-list">
@foreach($users as $user)
<a href="{{ $user->getProfileUrl() }}" class="flex-container-row items-center py-xs px-s entity-list-item hover-bg-wash" style="text-decoration: none;">
<img class="avatar me-m" src="{{ $user->getAvatar(30) }}" alt="{{ $user->name }}" style="border-radius: 50%; width: 30px; height: 30px;">
<div class="content flex">
<h4 class="text-user mb-none" style="font-size: 1rem; color: var(--color-link);">{{ $user->name }}</h4>
</div>
</a>
@endforeach
</div>
</div>
@if(count($entities) > 0)
<hr class="m-none">
@endif
@endif

{{-- ORIGINAL CODE: Displaying standard entities --}}
<div class="entity-list">
@if(count($entities) > 0)
@foreach($entities as $index => $entity)
Expand All @@ -13,7 +34,7 @@
@endif

@endforeach
@else
@elseif(!isset($users) || count($users) === 0)
<div class="text-muted px-m py-m">
{{ trans('common.no_items') }}
</div>
Expand Down