From 7f20399337da2a96983c7820fb9a20d16b9dbcf4 Mon Sep 17 00:00:00 2001 From: javier Date: Wed, 17 Jun 2026 17:44:58 +0200 Subject: [PATCH] feat(roles): collapsible permission groups with check/uncheck-all + single-column switches Permissions tab in the role view: 1. Each section is now a collapsible card (Alpine, chevron rotates). 2. Section header has 'All' / 'None' buttons (setGroup grants/revokes every permission of that group for the role; Admin keeps 'manage all'). 3. Permissions render in a single column: name+description on the left, control on the right. 4. Controls are DaisyUI toggle switches. Co-Authored-By: Claude Opus 4.8 (1M context) --- app/Livewire/RoleView.php | 17 ++++++++++ .../views/livewire/roles/role-view.blade.php | 33 ++++++++++++++----- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/app/Livewire/RoleView.php b/app/Livewire/RoleView.php index 36006d3..f08071a 100644 --- a/app/Livewire/RoleView.php +++ b/app/Livewire/RoleView.php @@ -51,6 +51,23 @@ class RoleView extends Component $this->dispatch('notify', 'Permisos actualizados'); } + public function setGroup(string $group, bool $enabled): void + { + $names = Permission::where('group', $group)->pluck('name'); + + foreach ($names as $name) { + // Admin must always keep the core permission + if (! $enabled && $this->role->name === 'Admin' && $name === self::CORE_PERMISSION) { + continue; + } + $enabled ? $this->role->givePermissionTo($name) : $this->role->revokePermissionTo($name); + } + + app(PermissionRegistrar::class)->forgetCachedPermissions(); + $this->role->load('permissions'); + $this->dispatch('notify', $enabled ? 'Permisos del grupo activados' : 'Permisos del grupo desactivados'); + } + public function delete() { if (in_array($this->role->name, self::PROTECTED_ROLES, true)) { diff --git a/resources/views/livewire/roles/role-view.blade.php b/resources/views/livewire/roles/role-view.blade.php index e5cb9ff..ce0279d 100644 --- a/resources/views/livewire/roles/role-view.blade.php +++ b/resources/views/livewire/roles/role-view.blade.php @@ -101,17 +101,34 @@ {{-- ═══════════════ TAB PERMISOS ═══════════════ --}} @if($tab === 'permisos') -
+
@forelse($grouped as $section => $perms) -
-

- {{ $section }} -

-
+
+ {{-- Cabecera del grupo: colapsable + marcar/desmarcar todo --}} +
+ +
+ + +
+
+ + {{-- Lista de permisos: una sola columna (permiso izquierda, switch derecha) --}} +
@foreach($perms as $perm) -