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(); } } public function save() { $this->validate([ 'name' => 'required|string|max:50|unique:roles,name' . ($this->role ? ',' . $this->role->id : ''), 'description' => 'nullable|string|max:255', ], [], ['name' => 'nombre', 'description' => 'descripción']); if ($this->role) { $isProtected = in_array($this->role->name, self::PROTECTED_ROLES, true); if (! $isProtected) { $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([ 'name' => $this->name, 'description' => $this->description ?: null, ]); if (! empty($this->rolePermissions)) { $role->syncPermissions($this->rolePermissions); } } app(PermissionRegistrar::class)->forgetCachedPermissions(); session()->flash('message', 'Rol guardado correctamente.'); return $this->redirect(route('admin.roles'), navigate: true); } 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), ]); } }