diff --git a/app/Livewire/Settings/UsersIndex.php b/app/Livewire/Settings/UsersIndex.php index 09cb6f9..16f5e0b 100644 --- a/app/Livewire/Settings/UsersIndex.php +++ b/app/Livewire/Settings/UsersIndex.php @@ -2,10 +2,13 @@ namespace App\Livewire\Settings; +use App\Models\Assegnazione; use App\Models\User; +use Illuminate\Support\Facades\DB; use Illuminate\Validation\Rule; use Livewire\Component; -use Spatie\Permission\Models\Permission; +use Spatie\Activitylog\Models\Activity; +use Spatie\Permission\Models\Role; class UsersIndex extends Component { @@ -13,15 +16,26 @@ class UsersIndex extends Component public string $email = ''; public string $password = ''; public string $password_confirmation = ''; - public array $selectedPermissions = []; - public array $availablePermissions = []; + public string $selectedRole = ''; + public array $availableRoles = []; + + public ?int $editingUserId = null; + public string $editName = ''; + public string $editEmail = ''; + public string $editPassword = ''; + public string $editPassword_confirmation = ''; + public string $editSelectedRole = ''; public function mount(): void { - $this->availablePermissions = Permission::query() + $this->availableRoles = Role::query() ->orderBy('name') ->pluck('name') ->all(); + + if (! empty($this->availableRoles)) { + $this->selectedRole = $this->availableRoles[0]; + } } protected function rules(): array @@ -30,8 +44,22 @@ class UsersIndex extends Component 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'email', 'max:255', Rule::unique('users', 'email')], 'password' => ['required', 'string', 'min:8', 'confirmed'], - 'selectedPermissions' => ['array'], - 'selectedPermissions.*' => ['string', Rule::in($this->availablePermissions)], + 'selectedRole' => ['required', 'string', Rule::in($this->availableRoles)], + ]; + } + + protected function editRules(): array + { + return [ + 'editName' => ['required', 'string', 'max:255'], + 'editEmail' => [ + 'required', + 'email', + 'max:255', + Rule::unique('users', 'email')->ignore($this->editingUserId), + ], + 'editPassword' => ['nullable', 'string', 'min:8', 'confirmed'], + 'editSelectedRole' => ['required', 'string', Rule::in($this->availableRoles)], ]; } @@ -45,16 +73,120 @@ class UsersIndex extends Component 'password' => $validated['password'], ]); - $user->syncPermissions($validated['selectedPermissions'] ?? []); + $user->syncRoles([$validated['selectedRole']]); - $this->reset(['name', 'email', 'password', 'password_confirmation', 'selectedPermissions']); + $this->reset(['name', 'email', 'password', 'password_confirmation']); + if (! empty($this->availableRoles)) { + $this->selectedRole = $this->availableRoles[0]; + } session()->flash('success', 'Utente creato con successo.'); } + public function startEdit(int $userId): void + { + $user = User::query()->with('roles')->findOrFail($userId); + + $this->editingUserId = $user->id; + $this->editName = $user->name; + $this->editEmail = $user->email; + $this->editPassword = ''; + $this->editPassword_confirmation = ''; + $this->editSelectedRole = $user->roles->first()?->name ?? ($this->availableRoles[0] ?? ''); + } + + public function cancelEdit(): void + { + $this->reset([ + 'editingUserId', + 'editName', + 'editEmail', + 'editPassword', + 'editPassword_confirmation', + 'editSelectedRole', + ]); + } + + public function updateUser(): void + { + if (! $this->editingUserId) { + return; + } + + $validated = $this->validate($this->editRules()); + $user = User::query()->findOrFail($this->editingUserId); + + $user->name = $validated['editName']; + $user->email = $validated['editEmail']; + + if (! empty($validated['editPassword'])) { + $user->password = $validated['editPassword']; + } + + $user->save(); + $user->syncRoles([$validated['editSelectedRole']]); + + $this->cancelEdit(); + session()->flash('success', 'Utente aggiornato con successo.'); + } + + public function deleteUser(int $userId): void + { + $currentUser = auth()->user(); + $user = User::query()->with('roles')->findOrFail($userId); + + if (! $currentUser || $currentUser->id === $user->id) { + session()->flash('error', 'Non puoi cancellare il tuo utente.'); + return; + } + + if ($user->hasRole('amministratore') && User::role('amministratore')->count() <= 1) { + session()->flash('error', 'Non puoi cancellare l\'ultimo amministratore.'); + return; + } + + DB::transaction(function () use ($user, $currentUser) { + $causerName = $user->name; + $causerEmail = $user->email; + $deletedAt = now()->toDateTimeString(); + + Activity::query() + ->where('causer_type', User::class) + ->where('causer_id', $user->id) + ->chunkById(200, function ($activities) use ($causerName, $causerEmail, $deletedAt) { + foreach ($activities as $activity) { + $properties = $activity->properties?->toArray() ?? []; + $properties['causer_name'] = $causerName; + $properties['causer_email'] = $causerEmail; + $properties['causer_deleted_at'] = $deletedAt; + + $activity->properties = $properties; + $activity->save(); + } + }); + + Assegnazione::query() + ->where('created_by', $user->id) + ->update(['created_by' => $currentUser->id]); + + Assegnazione::query() + ->where('returned_by', $user->id) + ->update(['returned_by' => $currentUser->id]); + + $user->syncRoles([]); + $user->delete(); + }); + + if ($this->editingUserId === $userId) { + $this->cancelEdit(); + } + + session()->flash('success', 'Utente cancellato. I log sono stati preservati.'); + } + public function render() { return view('livewire.settings.users-index', [ - 'users' => User::query()->with('roles', 'permissions')->orderBy('name')->get(), + 'users' => User::query()->with('roles')->orderBy('name')->get(), ]); } } diff --git a/resources/views/livewire/audit-log.blade.php b/resources/views/livewire/audit-log.blade.php index 1272036..89920c3 100644 --- a/resources/views/livewire/audit-log.blade.php +++ b/resources/views/livewire/audit-log.blade.php @@ -40,7 +40,7 @@ @forelse($activities as $activity) {{ $activity->created_at->format('d/m/Y H:i:s') }} - {{ $activity->causer?->name ?? 'Sistema' }} + {{ $activity->causer?->name ?? data_get($activity->properties, 'causer_name') ?? 'Sistema' }}

Utenti

-

Crea utenti e assegna i permessi applicativi.

+

Crea utenti e assegna un ruolo applicativo.

+ @if (session()->has('success')) +
{{ session('success') }}
+ @endif + @if (session()->has('error')) +
{{ session('error') }}
+ @endif +

Nuovo utente

@@ -34,16 +41,13 @@
-

Permessi utente

-
- @foreach($availablePermissions as $permission) - + + + @error('selectedRole')

{{ $message }}

@enderror
@@ -62,32 +66,76 @@ Nome Email Ruoli - Permessi diretti + Azioni @forelse($users as $user) - {{ $user->name }} - {{ $user->email }} - -
- @forelse($user->roles as $role) - {{ $role->name }} - @empty - - - @endforelse -
- - -
- @forelse($user->permissions as $permission) - {{ $permission->name }} - @empty - - - @endforelse -
- + @if($editingUserId === $user->id) + +
+
+ + + @error('editName')

{{ $message }}

@enderror +
+
+ + + @error('editEmail')

{{ $message }}

@enderror +
+
+ + + @error('editPassword')

{{ $message }}

@enderror +
+
+ + +
+
+ + + @error('editSelectedRole')

{{ $message }}

@enderror +
+
+ +
+ + +
+ + @else + {{ $user->name }} + {{ $user->email }} + +
+ @forelse($user->roles as $role) + {{ $role->name }} + @empty + - + @endforelse +
+ + +
+ + +
+ + @endif @empty