@php $selectedRole = $selectedRole?->loadMissing(['permissions', 'menuItems']); $selectedPermissionIds = $selectedRole?->permissions->pluck('id')->all() ?? []; $selectedMenuIds = $selectedRole?->menuItems->pluck('id')->all() ?? []; $selectedPermissionLookup = array_fill_keys(array_map('intval', $selectedPermissionIds), true); $selectedMenuLookup = array_fill_keys(array_map('intval', $selectedMenuIds), true); $planFeatures = [ 'ai_message' => __('AI Message'), 'schedule_message' => __('Schedule Message'), 'bulk_message' => __('Bulk Message'), 'autoreply' => __('Auto Reply'), 'send_message' => __('Send Message'), 'send_media' => __('Send Media'), 'send_product' => __('Send Product'), 'send_text_channel' => __('Text To Channel'), 'send_list' => __('Send List'), 'send_button' => __('Send Button'), 'send_location' => __('Send Location'), 'send_sticker' => __('Send Sticker'), 'send_vcard' => __('Send VCard'), 'send_template' => __('Send Template'), 'send_poll' => __('Send Poll'), 'webhook' => __('Webhook'), 'api' => __('API'), ]; @endphp

{{ __('RBAC Manager') }}

{{ __('Granular access control for roles, permissions, menu visibility, and user assignments.') }}

@if (!empty($canSyncCatalog)) @endif
@if ($errors->any())
@endif
@foreach($summaryCards as $card)
{{ $card['label'] }}
{{ $card['value'] }}
{{ $card['description'] }}
{{ $card['meta'] }}
@endforeach
@if (!empty($canSyncCatalog)) @endif @php $tabIcons = [ 'roles' => 'tabler-user-shield', 'permissions' => 'tabler-key', 'access' => 'tabler-report', 'users' => 'tabler-users', 'help' => 'tabler-info-circle', ]; @endphp @if ($activeTab === 'roles')
{{ $editingRole ? __('Edit Role') : __('Create Role') }}
@csrf @if($editingRole) @method('PUT') @endif
{{ __('Use a clear business-facing role name that admins can recognize quickly.') }}
@error('name')
{{ $message }}
@enderror
{{ __('Use lowercase letters, numbers, dots, or dashes only. Example: supervisor or support.lead') }}
@error('slug')
{{ $message }}
@enderror
{{ __('Briefly explain what this role is responsible for and where it should be used.') }}
@error('description')
{{ $message }}
@enderror
@if($editingRole) {{ __('Reset') }} @endif
@forelse($roles as $role) @empty @endforelse
{{ __('Actions') }} {{ __('Role') }} {{ __('Description') }} {{ __('Created At') }} {{ __('Updated At') }} {{ __('Created By') }} {{ __('Updated By') }}
@if(!$role->is_system) @endif
{{ $role->name }}
{{ $role->slug }}
@php $roleDescription = $role->description ?: __('No description'); @endphp @if($role->description) @else
{{ $roleDescription }}
@endif
@if($role->created_at)
{{ $role->created_at->copy()->utc()->format('Y-m-d H:i:s') }} {{ __('UTC') }}
@else - @endif
@if($role->updated_at)
{{ $role->updated_at->copy()->utc()->format('Y-m-d H:i:s') }} {{ __('UTC') }}
@else - @endif
@if($role->creator)
{{ $role->creator->username }}
{{ $role->creator->email }} @else - @endif
@if($role->updater)
{{ $role->updater->username }}
{{ $role->updater->email }} @else - @endif
{{ __('No roles found yet.') }}
@endif @if ($activeTab === 'permissions')
{{ $editingPermission ? __('Edit Permission') : __('Create Permission') }}
@csrf @if($editingPermission) @method('PUT') @endif
{{ __('Use a simple action name.') }}
@error('name')
{{ $message }}
@enderror
{{ __('Use lowercase letters, numbers, dots, or dashes only.') }}
@error('slug')
{{ $message }}
@enderror
{{ __('Explain the real capability this permission unlocks.') }}
@error('description')
{{ $message }}
@enderror
{{ __('Enter one route name or route pattern per line.') }}
@error('route_patterns')
{{ $message }}
@enderror
@if($editingPermission) {{ __('Reset') }} @endif
@forelse($permissionTable as $permission) @empty @endforelse
{{ __('Actions') }} {{ __('Permission') }} {{ __('Description') }} {{ __('Route Patterns') }} {{ __('Created At') }} {{ __('Updated At') }} {{ __('Created By') }} {{ __('Updated By') }}
@if(!$permission->is_system) @endif
{{ $permission->name }}
{{ $permission->slug }}
{{ __($permission->status_label ?? ($permission->is_system ? 'System' : 'Custom')) }}
@php $permissionDescription = $permission->description ?: __('No description'); @endphp @if($permission->description) @else
{{ $permissionDescription }}
@endif
@php $permissionRoutePatterns = $permission->route_patterns ?? []; $patternCount = count($permissionRoutePatterns); @endphp @if($patternCount > 0) @else {{ __('No route patterns') }} @endif @if($permission->created_at)
{{ $permission->created_at->copy()->utc()->format('Y-m-d H:i:s') }} {{ __('UTC') }}
@else-@endif
@if($permission->updated_at)
{{ $permission->updated_at->copy()->utc()->format('Y-m-d H:i:s') }} {{ __('UTC') }}
@else-@endif
@if($permission->creator)
{{ $permission->creator->username }}
{{ $permission->creator->email }}@else-@endif
@if($permission->updater)
{{ $permission->updater->username }}
{{ $permission->updater->email }}@else-@endif
{{ __('No permissions found yet.') }}
{{ $permissionTable->links() }}
@endif @if ($activeTab === 'access')
{{ __('Menu Access Matrix') }}
@if($roles->isEmpty())
{{ __('No role available yet.') }}
{{ __('Create at least one role in the Roles tab before configuring menu and permission access.') }}
{{ __('Go to Roles') }}
@else
{{ __('Pick one role, then check only the permissions and menus that role should access.') }}
@php $selectedPermissionCount = count($selectedPermissionIds ?? []); $selectedMenuCount = count($selectedMenuIds ?? []); $activeMenuSectionCount = collect($menuItems ?? []) ->filter(fn ($sectionItems) => collect($sectionItems)->contains(fn ($menuItem) => !empty($selectedMenuLookup[(int) $menuItem->id]))) ->count(); @endphp
{{ __('Role Summary') }}
{{ $selectedPermissionCount }} {{ __('Permissions') }} {{ $selectedMenuCount }} {{ __('Menus') }} {{ $activeMenuSectionCount }} {{ __('Active Sections') }} {{ __('Saved snapshot') }}
@if($selectedRole) @if (session('rbac_access_plan_notice'))
{{ session('rbac_access_plan_notice') }}
@endif
@csrf @method('PUT')
{{ __('Permissions') }}
@foreach($permissions->groupBy(fn ($permission) => explode('.', $permission->slug)[0] ?? 'general') as $group => $groupPermissions) @php $allPermissionsLocked = $groupPermissions->every(fn ($permission) => str_starts_with($permission->slug, 'admin.')); @endphp
{{ $group }}
@foreach($groupPermissions as $permission) @php $isAdminLockedPermission = str_starts_with($permission->slug, 'admin.'); $planGates = $permissionPlanGateMap[$permission->id] ?? []; @endphp @endforeach
@endforeach
{{ __('Menus') }}
@foreach($menuItems as $section => $sectionItems) @php $allMenusLocked = $sectionItems->every(fn ($menuItem) => (bool) ($menuItem->admin_only ?? false)); @endphp
{{ $section ?: __('General') }}
@foreach($sectionItems as $menuItem) @php $isAdminLockedMenu = (bool) ($menuItem->admin_only ?? false); $planGates = $menuPlanGateMap[$menuItem->id] ?? []; @endphp @endforeach
@endforeach
@else
{{ __('Select a role to continue.') }}
@endif @endif
@endif @if ($activeTab === 'users')
{{ $editingUser ? __('Edit User') : __('Create User') }}
@csrf @if($editingUser) @method('PUT') @endif
{{ __('Use 3+ characters. Allowed: letters, numbers, dot, underscore, dash.') }}
@error('username')
{{ $message }}
@enderror
@error('email')
{{ $message }}
@enderror
@if($editingUser) {{ __('Leave empty to keep the current password.') }} @endif @error('password')
{{ $message }}
@enderror
@error('messages_limit')
{{ $message }}
@enderror
@error('limit_device')
{{ $message }}
@enderror
@error('active_subscription')
{{ $message }}
@enderror
@error('plan_name')
{{ $message }}
@enderror
{{ __('Required when Subscription is set to Active.') }}
@error('subscription_expired')
{{ $message }}
@enderror

@foreach($planFeatures as $featureKey => $featureLabel) @php $featureEnabled = old('plan_data.' . $featureKey, data_get($editingUser?->plan_data ?? [], $featureKey, false)); @endphp @endforeach
@error('plan_data')
{{ $message }}
@enderror
@php $selectedRoleIds = collect(old('role_ids', $editingUser?->roles->pluck('id')->all() ?? [])) ->map(fn ($value) => (int) $value) ->all(); @endphp
@foreach($roles as $role) @endforeach
{{ __('Select one or more roles for this user.') }}
@error('role_ids')
{{ $message }}
@enderror @error('role_ids.*')
{{ $message }}
@enderror
@if($editingUser) {{ __('Reset') }} @endif
@forelse($users as $user) @empty @endforelse
{{ __('Actions') }} {{ __('User') }} {{ __('Level') }} {{ __('Status') }} {{ __('Roles') }} {{ __('Created At') }} {{ __('Updated At') }} {{ __('Created By') }} {{ __('Updated By') }}
@if($user->level !== 'admin') @endif
{{ $user->username }}
{{ $user->email }}
{{ __($user->level) }} {{ __($user->status) }} @forelse($user->roles as $role) {{ $role->name }} @empty {{ __('No role assigned') }} @endforelse @if(!empty($userPlanWarnings[$user->id] ?? []))
@endif
@if($user->created_at)
{{ \Illuminate\Support\Carbon::parse($user->created_at)->utc()->format('Y-m-d H:i:s') }} {{ __('UTC') }}
@else-@endif
@if($user->updated_at)
{{ \Illuminate\Support\Carbon::parse($user->updated_at)->utc()->format('Y-m-d H:i:s') }} {{ __('UTC') }}
@else-@endif
@if($user->creator_username)
{{ $user->creator_username }}
{{ $user->creator_email }}@else-@endif
@if($user->updater_username)
{{ $user->updater_username }}
{{ $user->updater_email }}@else-@endif
{{ __('No users found yet.') }}
{{ $users->links() }}
@endif @if ($activeTab === 'help')
{{ __('Need help with RBAC Manager?') }}

{{ __('Contact us for support, feature requests, bug fixes, or project collaboration.') }}

@endif @if (session('alert')) @endif