2024-06-02 22:03:59 -04:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Livewire;
|
|
|
|
|
|
|
|
use App\Models\Mod;
|
2024-07-03 17:47:02 -04:00
|
|
|
use App\Models\User;
|
|
|
|
use Illuminate\Support\Str;
|
2024-06-02 22:03:59 -04:00
|
|
|
use Illuminate\View\View;
|
|
|
|
use Livewire\Component;
|
|
|
|
|
|
|
|
class GlobalSearch extends Component
|
|
|
|
{
|
2024-07-03 17:47:02 -04:00
|
|
|
/**
|
|
|
|
* The search query.
|
|
|
|
*/
|
2024-06-02 22:03:59 -04:00
|
|
|
public string $query = '';
|
|
|
|
|
2024-07-03 17:47:02 -04:00
|
|
|
/**
|
|
|
|
* Whether to show the search result dropdown.
|
|
|
|
*/
|
|
|
|
public bool $showDropdown = false;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Whether to show the "no results found" message.
|
|
|
|
*/
|
|
|
|
public bool $noResults = false;
|
|
|
|
|
2024-06-02 22:03:59 -04:00
|
|
|
public function render(): View
|
|
|
|
{
|
|
|
|
return view('livewire.global-search', [
|
2024-07-03 17:47:02 -04:00
|
|
|
'results' => $this->executeSearch($this->query),
|
2024-06-02 22:03:59 -04:00
|
|
|
]);
|
|
|
|
}
|
2024-07-03 17:47:02 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Execute the search against each of the searchable models.
|
|
|
|
*/
|
|
|
|
protected function executeSearch(string $query): array
|
|
|
|
{
|
|
|
|
$query = Str::trim($query);
|
|
|
|
$results = ['data' => [], 'total' => 0];
|
|
|
|
|
|
|
|
if (Str::length($query)) {
|
|
|
|
$results['data'] = [
|
2024-07-15 23:13:51 -04:00
|
|
|
'user' => collect(User::search($query)->raw()['hits']),
|
|
|
|
'mod' => collect(Mod::search($query)->raw()['hits']),
|
2024-07-03 17:47:02 -04:00
|
|
|
];
|
|
|
|
$results['total'] = $this->countTotalResults($results['data']);
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->showDropdown = Str::length($query) > 0;
|
|
|
|
$this->noResults = $results['total'] === 0 && $this->showDropdown;
|
|
|
|
|
|
|
|
return $results;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Count the total number of results across all models.
|
|
|
|
*/
|
|
|
|
protected function countTotalResults($results): int
|
|
|
|
{
|
|
|
|
return collect($results)->reduce(function ($carry, $result) {
|
|
|
|
return $carry + $result->count();
|
|
|
|
}, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Clear the search query and hide the dropdown.
|
|
|
|
*/
|
|
|
|
public function clearSearch(): void
|
|
|
|
{
|
|
|
|
$this->query = '';
|
|
|
|
$this->showDropdown = false;
|
|
|
|
$this->noResults = false;
|
|
|
|
}
|
2024-06-02 22:03:59 -04:00
|
|
|
}
|