diff --git a/app/Http/Controllers/Hosting/SearchController.php b/app/Http/Controllers/Hosting/SearchController.php index 7217c99..59f5d42 100644 --- a/app/Http/Controllers/Hosting/SearchController.php +++ b/app/Http/Controllers/Hosting/SearchController.php @@ -7,19 +7,22 @@ use App\Models\CustomerHostingOrder; use App\Models\HostingProduct; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\View\View; class SearchController extends Controller { - public function __invoke(Request $request): JsonResponse + public function __invoke(Request $request): JsonResponse|View { $q = trim((string) $request->query('q', '')); + $results = mb_strlen($q) >= 2 ? $this->resultsForUser($request->user(), $q) : []; - if (mb_strlen($q) < 2) { - return response()->json(['results' => []]); + if ($request->expectsJson() || $request->ajax() || $request->wantsJson()) { + return response()->json(['results' => $results]); } - return response()->json([ - 'results' => $this->resultsForUser($request->user(), $q), + return view('search', [ + 'query' => $q, + 'results' => $results, ]); } diff --git a/resources/js/app.js b/resources/js/app.js index 6204964..813e050 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -136,14 +136,20 @@ Alpine.data('afia', (config = {}) => ({ })); Alpine.data('topbarSearch', (config = {}) => ({ - query: '', - results: [], - open: false, + query: config.initialQuery || '', + results: Array.isArray(config.initialResults) ? config.initialResults : [], + open: !!config.openOnInit, loading: false, active: 0, _abort: null, searchUrl: config.searchUrl || '/search', + init() { + if (config.autoFocus) { + this.$nextTick(() => this.$refs.input?.focus()); + } + }, + onFocus() { if (this.results.length > 0 || this.query.trim().length >= 2) this.open = true; }, diff --git a/resources/views/components/mobile-page-header.blade.php b/resources/views/components/mobile-page-header.blade.php new file mode 100644 index 0000000..acd3927 --- /dev/null +++ b/resources/views/components/mobile-page-header.blade.php @@ -0,0 +1,28 @@ +@props([ + 'title', + 'subtitle' => null, + 'backUrl' => null, + 'badge' => null, +]) + +
+
+ @if ($backUrl) + + + + @endif +
+ @if ($subtitle) +

{{ $subtitle }}

+ @endif +

{{ $title }}

+
+ @if ($badge) + {{ $badge }} + @endif + {{ $actions ?? '' }} +
+ {{ $slot }} +
diff --git a/resources/views/partials/search-screen.blade.php b/resources/views/partials/search-screen.blade.php new file mode 100644 index 0000000..ee04c30 --- /dev/null +++ b/resources/views/partials/search-screen.blade.php @@ -0,0 +1,100 @@ +@php + $searchUrl = $searchUrl ?? url('/search'); +@endphp + +
+ +
+
+ + +
+
+
+ + + +
+ + + + + + + +
+
diff --git a/resources/views/search.blade.php b/resources/views/search.blade.php new file mode 100644 index 0000000..be5b361 --- /dev/null +++ b/resources/views/search.blade.php @@ -0,0 +1,15 @@ +@extends('layouts.hosting') + +@section('title', 'Search') + +@section('content') + @include('partials.search-screen', [ + 'query' => $query, + 'results' => $results, + 'backUrl' => route('servers.dashboard'), + 'searchUrl' => route('servers.search'), + 'heading' => 'Find servers and orders', + 'placeholder' => 'Search server names, IPs, orders…', + 'emptyHint' => 'Use at least 2 characters to search VPS orders, server names, or IP addresses.', + ]) +@endsection