From 051372672bc0e8cee2c53f2451f9c22d56470e44 Mon Sep 17 00:00:00 2001 From: isaacclad Date: Mon, 29 Jun 2026 21:22:44 +0000 Subject: [PATCH] Polish Queue Devices empty state and align sidebar with other apps. Match Care/Frontdesk nav icon styling, admin icons, and settings footer; add proper table layouts and empty states for Devices and Displays. Co-authored-by: Cursor --- app/Http/Controllers/Qms/DeviceController.php | 15 +++- .../Qms/DisplayScreenController.php | 12 ++- .../views/components/empty-state.blade.php | 16 ++++ resources/views/partials/sidebar.blade.php | 52 +++++++---- resources/views/qms/devices/index.blade.php | 87 +++++++++++++++---- resources/views/qms/displays/index.blade.php | 67 +++++++++++--- 6 files changed, 199 insertions(+), 50 deletions(-) create mode 100644 resources/views/components/empty-state.blade.php diff --git a/app/Http/Controllers/Qms/DeviceController.php b/app/Http/Controllers/Qms/DeviceController.php index 161362b..04fc024 100644 --- a/app/Http/Controllers/Qms/DeviceController.php +++ b/app/Http/Controllers/Qms/DeviceController.php @@ -9,6 +9,8 @@ use App\Models\Device; use App\Models\ServiceQueue; use App\Services\Qms\AuditLogger; use App\Services\Qms\DeviceService; +use App\Services\Qms\OrganizationResolver; +use App\Services\Qms\QmsPermissions; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\View\View; @@ -23,16 +25,25 @@ class DeviceController extends Controller public function index(Request $request): View { - $this->authorizeAbility($request, 'displays.manage'); + $this->authorizeAbility($request, 'displays.view'); $owner = $this->ownerRef($request); $organization = $this->organization($request); + $member = app(OrganizationResolver::class)->memberFor($request->user()); + $permissions = app(QmsPermissions::class); + $devices = Device::owned($owner) ->where('organization_id', $organization->id) + ->with('branch') ->orderBy('name') ->paginate(20); - return view('qms.devices.index', compact('devices', 'organization')); + return view('qms.devices.index', [ + 'devices' => $devices, + 'organization' => $organization, + 'deviceTypes' => config('qms.device_types'), + 'canManage' => $permissions->can($member, 'displays.manage'), + ]); } public function create(Request $request): View diff --git a/app/Http/Controllers/Qms/DisplayScreenController.php b/app/Http/Controllers/Qms/DisplayScreenController.php index d4096a8..5789834 100644 --- a/app/Http/Controllers/Qms/DisplayScreenController.php +++ b/app/Http/Controllers/Qms/DisplayScreenController.php @@ -8,6 +8,8 @@ use App\Models\Branch; use App\Models\DisplayScreen; use App\Models\ServiceQueue; use App\Services\Qms\AuditLogger; +use App\Services\Qms\OrganizationResolver; +use App\Services\Qms\QmsPermissions; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\View\View; @@ -22,12 +24,20 @@ class DisplayScreenController extends Controller $owner = $this->ownerRef($request); $organization = $this->organization($request); + $member = app(OrganizationResolver::class)->memberFor($request->user()); + $permissions = app(QmsPermissions::class); + $screens = DisplayScreen::owned($owner) ->where('organization_id', $organization->id) + ->with('branch') ->orderBy('name') ->paginate(20); - return view('qms.displays.index', compact('screens', 'organization')); + return view('qms.displays.index', [ + 'screens' => $screens, + 'organization' => $organization, + 'canManage' => $permissions->can($member, 'displays.manage'), + ]); } public function show(Request $request, DisplayScreen $display): View diff --git a/resources/views/components/empty-state.blade.php b/resources/views/components/empty-state.blade.php new file mode 100644 index 0000000..d3069a2 --- /dev/null +++ b/resources/views/components/empty-state.blade.php @@ -0,0 +1,16 @@ +@props(['title', 'description' => null]) + +
merge(['class' => 'flex flex-col items-center justify-center px-6 py-14 text-center']) }}> + @if (isset($icon)) +
+ {{ $icon }} +
+ @endif +

{{ $title }}

+ @if ($description) +

{{ $description }}

+ @endif + @if (isset($action)) +
{{ $action }}
+ @endif +
diff --git a/resources/views/partials/sidebar.blade.php b/resources/views/partials/sidebar.blade.php index 9a3d958..4ffa547 100644 --- a/resources/views/partials/sidebar.blade.php +++ b/resources/views/partials/sidebar.blade.php @@ -1,5 +1,5 @@ -
-
+
+
Ladill Queue @@ -29,7 +29,7 @@ $nav[] = ['name' => 'Displays', 'route' => route('qms.displays.index'), 'active' => request()->routeIs('qms.displays.*'), 'icon' => '']; $nav[] = ['name' => 'Devices', 'route' => route('qms.devices.index'), 'active' => request()->routeIs('qms.devices.*'), - 'icon' => '']; + 'icon' => '']; } if ($permissions->can($member, 'appointments.view')) { $nav[] = ['name' => 'Appointments', 'route' => route('qms.appointments.index'), 'active' => request()->routeIs('qms.appointments.*'), @@ -49,37 +49,55 @@ $nav[] = ['name' => 'Feedback', 'route' => route('qms.feedback.admin'), 'active' => request()->routeIs('qms.feedback.admin'), 'icon' => '']; } - $adminItems = []; + + $adminNav = []; if ($permissions->can($member, 'admin.branches.view')) { - $adminItems[] = ['name' => 'Branches', 'route' => route('qms.branches.index'), 'active' => request()->routeIs('qms.branches.*')]; + $adminNav[] = ['name' => 'Branches', 'route' => route('qms.branches.index'), 'active' => request()->routeIs('qms.branches.*'), + 'icon' => '']; } if ($permissions->can($member, 'admin.departments.view')) { - $adminItems[] = ['name' => 'Departments', 'route' => route('qms.departments.index'), 'active' => request()->routeIs('qms.departments.*')]; + $adminNav[] = ['name' => 'Departments', 'route' => route('qms.departments.index'), 'active' => request()->routeIs('qms.departments.*'), + 'icon' => '']; } if ($permissions->can($member, 'admin.members.view')) { - $adminItems[] = ['name' => 'Team', 'route' => route('qms.members.index'), 'active' => request()->routeIs('qms.members.*')]; + $adminNav[] = ['name' => 'Team', 'route' => route('qms.members.index'), 'active' => request()->routeIs('qms.members.*'), + 'icon' => '']; } if ($permissions->can($member, 'audit.view')) { - $adminItems[] = ['name' => 'Audit log', 'route' => route('qms.audit.index'), 'active' => request()->routeIs('qms.audit.*')]; - } - if ($permissions->can($member, 'settings.view')) { - $adminItems[] = ['name' => 'Settings', 'route' => route('qms.settings.edit'), 'active' => request()->routeIs('qms.settings.*')]; + $adminNav[] = ['name' => 'Audit log', 'route' => route('qms.audit.index'), 'active' => request()->routeIs('qms.audit.*'), + 'icon' => '']; } + + $settingsActive = request()->routeIs('qms.settings.*'); @endphp + + @if ($permissions->can($member, 'settings.view')) + + @endif
diff --git a/resources/views/qms/devices/index.blade.php b/resources/views/qms/devices/index.blade.php index 2634bf4..ee2cf30 100644 --- a/resources/views/qms/devices/index.blade.php +++ b/resources/views/qms/devices/index.blade.php @@ -1,22 +1,75 @@ -
-

Devices

- Register device +
+
+

Devices

+

Kiosks and ticket printers for self-service and reception

+
+ @if ($canManage) + Register device + @endif
- @if (session('success'))

{{ session('success') }}

@endif -
- @foreach ($devices as $device) -
-
-

{{ $device->name }}

-

{{ config('qms.device_types.'.$device->type) }} · {{ $device->status }}

- @if ($device->type === 'kiosk' && $device->device_token) -

Kiosk URL: {{ route('qms.kiosk.device', $device->device_token) }}

- @endif -
-
@csrf
+ + @if (session('success')) +
{{ session('success') }}
+ @endif + +
+ @if ($devices->isEmpty()) + + + + + + + @if ($canManage) + + Register your first device + + @endif + + @else + + + + + + + + + + + + @foreach ($devices as $device) + + + + + + + + @endforeach + +
NameTypeStatusBranch
{{ $device->name }}{{ $deviceTypes[$device->type] ?? $device->type }} + + {{ ucfirst($device->status) }} + + {{ $device->branch?->name ?? '—' }} + @if ($device->type === 'kiosk' && $device->device_token) + Open kiosk + @endif + @if ($canManage) +
+ @csrf + +
+ @endif +
+
+ {{ $devices->links() }}
- @endforeach + @endif
- {{ $devices->links() }} diff --git a/resources/views/qms/displays/index.blade.php b/resources/views/qms/displays/index.blade.php index a94b06a..4d7ca88 100644 --- a/resources/views/qms/displays/index.blade.php +++ b/resources/views/qms/displays/index.blade.php @@ -1,18 +1,59 @@ -
-

Display screens

- New display +
+
+

Display screens

+

Waiting-area screens and voice announcements for called tickets

+
+ @if ($canManage) + New display + @endif
-
- @foreach ($screens as $screen) -
-
-

{{ $screen->name }}

-

{{ config('qms.display_layouts.'.$screen->layout) }}

-
- Open display + +
+ @if ($screens->isEmpty()) + + + + + + + @if ($canManage) + + Create your first display + + @endif + + @else + + + + + + + + + + + @foreach ($screens as $screen) + + + + + + + @endforeach + +
NameLayoutBranch
+ {{ $screen->name }} + {{ config('qms.display_layouts.'.$screen->layout, $screen->layout) }}{{ $screen->branch?->name ?? '—' }} + Open display +
+
+ {{ $screens->links() }}
- @endforeach + @endif
- {{ $screens->links() }}