diff --git a/app/Livewire/RoleForm.php b/app/Livewire/RoleForm.php index ed03f3d..3864741 100644 --- a/app/Livewire/RoleForm.php +++ b/app/Livewire/RoleForm.php @@ -6,7 +6,6 @@ use Livewire\Component; use Livewire\Attributes\Layout; use Illuminate\Support\Facades\Auth; use Spatie\Permission\Models\Role; -use Spatie\Permission\Models\Permission; use Spatie\Permission\PermissionRegistrar; #[Layout('layouts.app')] @@ -16,7 +15,6 @@ class RoleForm extends Component public string $name = ''; public string $description = ''; - public array $rolePermissions = []; private const PROTECTED_ROLES = ['Admin']; private const CORE_PERMISSION = 'manage all'; @@ -26,10 +24,9 @@ class RoleForm extends Component abort_unless(Auth::user()?->can(self::CORE_PERMISSION), 403); if ($role && $role->exists) { - $this->role = $role; - $this->name = $role->name; - $this->description = $role->description ?? ''; - $this->rolePermissions = $role->permissions->pluck('name')->toArray(); + $this->role = $role; + $this->name = $role->name; + $this->description = $role->description ?? ''; } } @@ -41,26 +38,17 @@ class RoleForm extends Component ], [], ['name' => 'nombre', 'description' => 'descripción']); if ($this->role) { - $isProtected = in_array($this->role->name, self::PROTECTED_ROLES, true); - if (! $isProtected) { + // Protected roles can't be renamed + if (! in_array($this->role->name, self::PROTECTED_ROLES, true)) { $this->role->name = $this->name; } $this->role->description = $this->description ?: null; $this->role->save(); - - $perms = $this->rolePermissions; - if ($this->role->name === 'Admin' && ! in_array(self::CORE_PERMISSION, $perms, true)) { - $perms[] = self::CORE_PERMISSION; - } - $this->role->syncPermissions($perms); } else { - $role = Role::create([ + Role::create([ 'name' => $this->name, 'description' => $this->description ?: null, ]); - if (! empty($this->rolePermissions)) { - $role->syncPermissions($this->rolePermissions); - } } app(PermissionRegistrar::class)->forgetCachedPermissions(); @@ -72,7 +60,6 @@ class RoleForm extends Component public function render() { return view('livewire.roles.role-form', [ - 'permissions' => Permission::orderBy('name')->get(), 'isProtected' => $this->role && in_array($this->role->name, self::PROTECTED_ROLES, true), ]); } diff --git a/app/Livewire/RoleManager.php b/app/Livewire/RoleManager.php deleted file mode 100644 index c62cff5..0000000 --- a/app/Livewire/RoleManager.php +++ /dev/null @@ -1,95 +0,0 @@ -can(self::CORE_PERMISSION), 403); - } - - private function flushCache(): void - { - app(PermissionRegistrar::class)->forgetCachedPermissions(); - } - - public function updatedSelectAll($value): void - { - $this->selected = $value - ? Role::pluck('id')->map(fn ($id) => (string) $id)->toArray() - : []; - } - - // ── View ───────────────────────────────────────────────────────────────── - - public function openView(int $id): void - { - $this->viewingRole = $id; - } - - public function closeView(): void - { - $this->viewingRole = null; - } - - // ── Delete (single / bulk) ───────────────────────────────────────────────── - - public function delete(int $id): void - { - $role = Role::findOrFail($id); - if (in_array($role->name, self::PROTECTED_ROLES, true)) { - $this->dispatch('notify', "El rol '{$role->name}' está protegido y no se puede borrar."); - return; - } - $role->delete(); - $this->selected = array_values(array_diff($this->selected, [(string) $id, $id])); - $this->flushCache(); - $this->dispatch('notify', 'Rol eliminado'); - } - - public function bulkDelete(): void - { - $roles = Role::whereIn('id', $this->selected)->get(); - $deleted = 0; - $skipped = 0; - foreach ($roles as $role) { - if (in_array($role->name, self::PROTECTED_ROLES, true)) { $skipped++; continue; } - $role->delete(); - $deleted++; - } - $this->selected = []; - $this->selectAll = false; - $this->flushCache(); - $msg = "{$deleted} rol(es) eliminados"; - if ($skipped) $msg .= " ({$skipped} protegido(s) omitido(s))"; - $this->dispatch('notify', $msg); - } - - public function render() - { - return view('livewire.role-manager', [ - 'roles' => Role::with('permissions')->withCount('users')->orderBy('name')->get(), - 'viewing' => $this->viewingRole - ? Role::with('permissions')->withCount('users')->find($this->viewingRole) - : null, - ]); - } -} diff --git a/app/Livewire/RoleTable.php b/app/Livewire/RoleTable.php new file mode 100644 index 0000000..f2f595d --- /dev/null +++ b/app/Livewire/RoleTable.php @@ -0,0 +1,105 @@ +setPrimaryKey('id') + ->setDefaultSort('name', 'asc') + ->setSortingPillsEnabled(false); + } + + public function builder(): Builder + { + return Role::withCount(['permissions', 'users']); + } + + public function columns(): array + { + return [ + Column::make(__('Name'), 'name') + ->sortable() + ->searchable() + ->format(fn ($value, $row) => + ''.e($value).'' + . (in_array($row->name, self::PROTECTED_ROLES, true) ? ' protegido' : '') + ) + ->html(), + + Column::make(__('Description'), 'description') + ->sortable() + ->searchable() + ->format(fn ($value) => $value + ? ''.e($value).'' + : '—') + ->html(), + + Column::make(__('Permissions')) + ->label(fn ($row) => ''.(int) $row->permissions_count.'') + ->html(), + + Column::make(__('Users')) + ->label(fn ($row) => ''.(int) $row->users_count.'') + ->html(), + + Column::make(__('Actions')) + ->label(function ($row) { + $show = route('admin.roles.show', $row->id); + $edit = route('admin.roles.edit', $row->id); + $eye = ''; + $pencil = ''; + $trash = ''; + + $html = '
{{ __('Manage role groups and the permissions assigned to each.') }}
-| - - | -{{ __('Name') }} | -{{ __('Description') }} | -{{ __('Permissions') }} | -{{ __('Users') }} | -{{ __('Actions') }} | -
|---|---|---|---|---|---|
| - - | -- {{ $role->name }} - @if(in_array($role->name, ['Admin'], true)) - {{ __('protected') }} - @endif - | -{{ $role->description ?: '—' }} | -- {{ $role->permissions->count() }} - | -- {{ $role->users_count }} - | -
-
-
-
-
- |
-
| {{ __('No roles') }} | |||||
{{ $viewing->description ?: __('No description') }}
-{{ $viewing->users_count }} {{ __('users') }} · {{ $viewing->permissions->count() }} {{ __('permissions') }}
- -{{ __('No permissions') }}
- @else -+ {{ __('Permissions are assigned from the role view, in the "Permissions" tab.') }} +
{{ $role->description ?: __('No description') }}
+| {{ __('Name') }} | +{{ __('Last name') }} | +{{ __('Status') }} | +
|---|---|---|
|
+
+
+
+
+
+ {{ strtoupper(mb_substr($u->first_name ?: $u->name, 0, 1)) }}
+
+
+
+ {{ $u->first_name ?: $u->name }} +{{ $u->email }} + |
+ {{ $u->last_name ?: '—' }} | ++ @php + [$cls, $label] = match($u->status) { + 'active' => ['badge-success', __('Active')], + 'inactive' => ['badge-ghost', __('Inactive')], + 'suspended' => ['badge-error', __('Suspended')], + default => ['badge-ghost', ucfirst((string) $u->status)], + }; + @endphp + {{ $label }} + | +
| {{ __('No users with this role') }} | ||
{{ __('No permissions') }}
+ @endforelse +