users menu listing

This commit is contained in:
Mark Gregory
2026-08-26 08:01:49 +01:00
parent 6f8d0c7abf
commit 7dc31371f6
29 changed files with 779 additions and 669 deletions
@@ -1,5 +1,3 @@
<x-layouts::app.sidebar :title="$title ?? null">
<flux:main>
{{ $slot }}
</flux:main>
{{ $slot }}
</x-layouts::app.sidebar>
@@ -1,228 +1,82 @@
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}" class="dark">
<head>
@include('partials.head')
</head>
<body class="min-h-screen bg-white dark:bg-zinc-800">
@php
$helpdeskSettingsRoute = Route::has('helpdesk.settings')
? 'helpdesk.settings'
: (Route::has('helpdesk.settings.index')
? 'helpdesk.settings.index'
: null);
@endphp
<flux:sidebar
sticky
collapsible="mobile"
class="hd-sidebar border-e border-zinc-200 bg-zinc-50 dark:border-zinc-700 dark:bg-zinc-900"
>
<flux:sidebar.header>
<x-app-logo
:sidebar="true"
href="{{ route('dashboard') }}"
wire:navigate
/>
<flux:sidebar.collapse class="lg:hidden" />
</flux:sidebar.header>
<flux:sidebar.nav>
<flux:sidebar.group :heading="__('Platform')" class="grid">
<flux:sidebar.item
icon="home"
:href="route('dashboard')"
:current="request()->routeIs('dashboard')"
wire:navigate
>
{{ __('Dashboard') }}
</flux:sidebar.item>
</flux:sidebar.group>
<flux:sidebar.group :heading="__('Helpdesk')" class="grid">
@if (Route::has('helpdesk.tickets.index'))
<flux:sidebar.item
icon="inbox"
:href="route('helpdesk.tickets.index')"
:current="request()->routeIs('helpdesk.tickets.*')"
wire:navigate
>
{{ __('Tickets') }}
</flux:sidebar.item>
@endif
@if (Route::has('helpdesk.kanban'))
<flux:sidebar.item
icon="squares-2x2"
:href="route('helpdesk.kanban')"
:current="request()->routeIs('helpdesk.kanban')"
wire:navigate
>
{{ __('Kanban') }}
</flux:sidebar.item>
@endif
@if ($helpdeskSettingsRoute)
<flux:sidebar.item
icon="cog"
:href="route($helpdeskSettingsRoute)"
:current="request()->routeIs('helpdesk.settings') || request()->routeIs('helpdesk.settings.index')"
wire:navigate
>
{{ __('Settings') }}
</flux:sidebar.item>
@endif
</flux:sidebar.group>
@if (Route::has('documentation.index') || Route::has('documentation.documents.index'))
<flux:sidebar.group :heading="__('Documentation')" class="grid">
@if (Route::has('documentation.documents.index'))
<flux:sidebar.item
icon="book-open"
:href="route('documentation.documents.index')"
:current="request()->routeIs('documentation.documents.*') || request()->routeIs('documentation.index')"
wire:navigate
>
{{ __('Documents') }}
</flux:sidebar.item>
@elseif (Route::has('documentation.index'))
<flux:sidebar.item
icon="book-open"
:href="route('documentation.index')"
:current="request()->routeIs('documentation.*')"
wire:navigate
>
{{ __('Documents') }}
</flux:sidebar.item>
@endif
@if (Route::has('documentation.categories.index'))
<flux:sidebar.item
icon="folder"
:href="route('documentation.categories.index')"
:current="request()->routeIs('documentation.categories.*')"
wire:navigate
>
{{ __('Categories') }}
</flux:sidebar.item>
@endif
</flux:sidebar.group>
@endif
</flux:sidebar.nav>
<flux:spacer />
<x-desktop-user-menu
class="hidden lg:block"
:name="auth()->user()->name"
/>
</flux:sidebar>
<!-- Mobile User Menu -->
<flux:header class="lg:hidden">
<flux:sidebar.toggle
class="lg:hidden"
icon="bars-2"
inset="left"
/>
<flux:spacer />
<flux:dropdown position="top" align="end">
<flux:profile
:initials="auth()->user()->initials()"
icon-trailing="chevron-down"
/>
<head>@include('partials.head')</head>
<body class="hd-app-body">
@php
$user = auth()->user();
$isAdmin = (method_exists($user, 'isHelpdeskAdmin') && $user->isHelpdeskAdmin()) || (method_exists($user, 'isAdmin') && $user->isAdmin()) || (bool) ($user->helpdesk_admin ?? false);
$roleLabel = $isAdmin ? 'Administrator' : ((method_exists($user, 'isHelpdeskAgent') && $user->isHelpdeskAgent()) || (bool) ($user->helpdesk_agent ?? false) ? 'Agent' : 'User');
@endphp
<div class="hd-app-shell" data-hd-shell>
<header class="hd-topbar">
<div class="hd-topbar-brand">
<button class="hd-icon-button hd-mobile-menu-button" type="button" data-hd-sidebar-toggle aria-label="Toggle navigation"><i class="fa-solid fa-bars"></i></button>
<a href="{{ route('dashboard') }}" wire:navigate class="hd-brand-name">{{ config('app.name', 'Laravel') }}</a>
</div>
<div class="hd-topbar-main">
@if(Route::has('helpdesk.tickets.index'))
<form method="GET" action="{{ route('helpdesk.tickets.index') }}" class="hd-top-search">
<i class="fa-solid fa-magnifying-glass"></i><input name="search" placeholder="Search tickets" aria-label="Search tickets">
</form>
@endif
<div class="hd-topbar-spacer"></div>
<flux:dropdown position="bottom" align="end">
<button class="hd-account-button" type="button">
<span class="hd-user-avatar">{{ $user->initials() }}</span>
<span class="hd-account-copy"><strong>{{ $user->name }}</strong><small>{{ $roleLabel }}</small></span>
<i class="fa-solid fa-chevron-down text-xs"></i>
</button>
<flux:menu>
<flux:menu.radio.group>
<div class="p-0 text-sm font-normal">
<div class="flex items-center gap-2 px-1 py-1.5 text-start text-sm">
<flux:avatar
:name="auth()->user()->name"
:initials="auth()->user()->initials()"
/>
<div class="grid flex-1 text-start text-sm leading-tight">
<flux:heading class="truncate">
{{ auth()->user()->name }}
</flux:heading>
<flux:text class="truncate">
{{ auth()->user()->email }}
</flux:text>
</div>
</div>
</div>
</flux:menu.radio.group>
@if(Route::has('profile.edit'))<flux:menu.item :href="route('profile.edit')" icon="user-circle" wire:navigate>Profile</flux:menu.item>@endif
@if(Route::has('helpdesk.settings'))<flux:menu.item :href="route('helpdesk.settings')" icon="cog" wire:navigate>Helpdesk Settings</flux:menu.item>@endif
@if($isAdmin)<flux:menu.item :href="url('/admin/users')" icon="user-circle" wire:navigate>User Management</flux:menu.item>@endif
<flux:menu.separator />
<flux:menu.radio.group>
@if (Route::has('documentation.documents.index') || Route::has('documentation.index'))
<flux:menu.item
:href="Route::has('documentation.documents.index') ? route('documentation.documents.index') : route('documentation.index')"
icon="book-open"
wire:navigate
>
{{ __('Documentation') }}
</flux:menu.item>
@endif
@if ($helpdeskSettingsRoute)
<flux:menu.item
:href="route($helpdeskSettingsRoute)"
icon="cog"
wire:navigate
>
{{ __('Helpdesk Settings') }}
</flux:menu.item>
@endif
@if (Route::has('profile.edit'))
<flux:menu.item
:href="route('profile.edit')"
icon="user-circle"
wire:navigate
>
{{ __('Profile') }}
</flux:menu.item>
@endif
</flux:menu.radio.group>
<flux:menu.separator />
<form
method="POST"
action="{{ route('logout') }}"
class="w-full"
>
@csrf
<flux:menu.item
as="button"
type="submit"
icon="arrow-right-start-on-rectangle"
class="w-full cursor-pointer"
data-test="logout-button"
>
{{ __('Log out') }}
</flux:menu.item>
</form>
<form method="POST" action="{{ route('logout') }}">@csrf<flux:menu.item as="button" type="submit" icon="arrow-right-start-on-rectangle">Log out</flux:menu.item></form>
</flux:menu>
</flux:dropdown>
</flux:header>
</div>
</header>
{{ $slot }}
<aside class="hd-shell-sidebar" data-hd-sidebar>
<nav class="hd-shell-nav" aria-label="Primary navigation">
<div class="hd-nav-section"><div class="hd-nav-heading">Platform</div>
<a class="hd-nav-link {{ request()->routeIs('dashboard') ? 'is-active' : '' }}" href="{{ route('dashboard') }}" wire:navigate>
<i class="fa-solid fa-house"></i><span>Dashboard</span>
</a>
@persist('toast')
<flux:toast.group>
<flux:toast />
</flux:toast.group>
@endpersist
@if($isAdmin)
<a class="hd-nav-link {{ request()->is('admin/users') || request()->is('admin/users/create') || request()->is('admin/users/*/edit') ? 'is-active' : '' }}"
href="{{ url('/admin/users') }}" wire:navigate>
<i class="fa-solid fa-users"></i><span>Users</span>
</a>
@fluxScripts
</body>
<a class="hd-nav-link {{ request()->is('admin/users/roles') ? 'is-active' : '' }}"
href="{{ url('/admin/users/roles') }}" wire:navigate>
<i class="fa-solid fa-shield-halved"></i><span>Roles & Permissions</span>
</a>
@endif
</div>
<div class="hd-nav-section"><div class="hd-nav-heading">Helpdesk</div>
@if(Route::has('helpdesk.tickets.index'))<a class="hd-nav-link {{ request()->routeIs('helpdesk.tickets.*') ? 'is-active' : '' }}" href="{{ route('helpdesk.tickets.index') }}" wire:navigate><i class="fa-solid fa-ticket"></i><span>Tickets</span></a>@endif
@if(Route::has('helpdesk.kanban'))<a class="hd-nav-link {{ request()->routeIs('helpdesk.kanban') ? 'is-active' : '' }}" href="{{ route('helpdesk.kanban') }}" wire:navigate><i class="fa-solid fa-table-columns"></i><span>Kanban</span></a>@endif
@if(Route::has('helpdesk.settings'))<a class="hd-nav-link {{ request()->routeIs('helpdesk.settings*') ? 'is-active' : '' }}" href="{{ route('helpdesk.settings') }}" wire:navigate><i class="fa-solid fa-gear"></i><span>Settings</span></a>@endif
</div>
@if(Route::has('documentation.index') || Route::has('documentation.documents.index'))
<div class="hd-nav-section"><div class="hd-nav-heading">Documentation</div>
<a class="hd-nav-link {{ request()->routeIs('documentation.documents.*') || request()->routeIs('documentation.index') ? 'is-active' : '' }}" href="{{ Route::has('documentation.documents.index') ? route('documentation.documents.index') : route('documentation.index') }}" wire:navigate><i class="fa-regular fa-file-lines"></i><span>Documents</span></a>
@if(Route::has('documentation.categories.index'))<a class="hd-nav-link {{ request()->routeIs('documentation.categories.*') ? 'is-active' : '' }}" href="{{ route('documentation.categories.index') }}" wire:navigate><i class="fa-regular fa-folder"></i><span>Categories</span></a>@endif
</div>
@endif
</nav>
<div class="hd-sidebar-resizer" data-hd-sidebar-resizer title="Drag to resize sidebar"><span></span></div>
</aside>
<button type="button" class="hd-sidebar-backdrop" data-hd-sidebar-toggle aria-label="Close navigation"></button>
<main class="hd-shell-main">{{ $slot }}</main>
</div>
@persist('toast')<flux:toast.group><flux:toast /></flux:toast.group>@endpersist
@fluxScripts
</body>
</html>