{{-- Two-panel permission picker — single source of truth. ALL items rendered once in Available. Pre-selected ones moved to Assigned by JS on init. Multi-select: click = single, Ctrl+click = toggle, Shift+click = range. --}} @php $preSelected = collect($rolePermIds ?? []); @endphp
{{-- ── LEFT: Available (ALL items live here initially) ──────── --}}
{{ __('Available') }} 0
Click = select  ·  Ctrl+click = multi  ·  Shift+click = range  ·  Dbl-click = move
@foreach ($groupedPermissions as $category => $catPerms) @php $catItems = collect(); foreach ($catPerms as $menuName => $menuData) { if ($menuData['manage']) $catItems->push(['perm' => $menuData['manage'], 'menu' => $menuName, 'tab' => null, 'type' => 'manage']); if ($menuData['view']) $catItems->push(['perm' => $menuData['view'], 'menu' => $menuName, 'tab' => null, 'type' => 'view']); foreach ($menuData['tabs'] as $tabSlug => $tabPerms) { if ($tabPerms['manage']) $catItems->push(['perm' => $tabPerms['manage'], 'menu' => $menuName, 'tab' => $tabSlug, 'type' => 'manage']); if ($tabPerms['view']) $catItems->push(['perm' => $tabPerms['view'], 'menu' => $menuName, 'tab' => $tabSlug, 'type' => 'view']); } } @endphp @if($catItems->isNotEmpty())
{{ $category }}
@foreach ($catItems as $entry)
@if($entry['type'] === 'manage') @else @endif @if($entry['tab']) {{ $entry['tab'] }} @endif {{ $entry['perm']->name }} {{ $category }}
@endforeach @endif @endforeach
{{-- ── CENTER: Buttons ─────────────────────────────────────── --}}
{{-- ── RIGHT: Assigned (empty on load, filled by JS) ──────── --}}
{{ __('Assigned') }} 0
Dbl-click or select + ◀ to remove
{{ __('No permissions assigned yet') }}