use App\Models\Customer;
use App\Filament\Resources\CustomerResource;
use Filament\Facades\Filament;
use Filament\GlobalSearch\GlobalSearchResult;
use Flex\Theme\Search\CallbackSearchSource;
use Flex\Theme\Search\SearchConfiguration;
use Flex\Theme\Search\SearchPage;
use Flex\Theme\Search\SearchRequest;
$customers = CallbackSearchSource::make('customers')
->label('Customers')
->icon('hugeicons-user-group')
->aliases(['clients', 'accounts'])
->authorize(fn ($user): bool => $user->can('viewAny', Customer::class))
->resolveUsing(function (SearchRequest $request): SearchPage {
$query = Customer::query()
->where('workspace_id', Filament::getTenant()->getKey());
if ($request->query !== '') {
$query->where('name', 'like', '%'.$request->query.'%');
}
$page = $query->orderBy('id')->simplePaginate(
$request->perPage,
['id', 'name', 'email'],
'searchPage',
$request->page,
);
$items = [];
foreach ($page->items() as $customer) {
if (! CustomerResource::canView($customer)) {
continue;
}
$items[] = new GlobalSearchResult(
$customer->name,
CustomerResource::getUrl('view', ['record' => $customer]),
['Email' => $customer->email],
);
}
return new SearchPage($items, $page->hasMorePages());
});
SearchConfiguration::make()->sources([$customers]);