feat(user-view): add Details (Ficha) tab as default with basic info + access validity

New 'Ficha' tab (first, default) on the user view: basic info card
(name/username/email/phone/address/member since) plus the 'Validez de acceso'
card and the Empresa card, moved here from the Permissions tab. The Permissions
tab now focuses on roles + the direct-permissions form.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-17 19:02:05 +02:00
parent 0120c4bfb8
commit efccb67635
2 changed files with 68 additions and 18 deletions
+1 -1
View File
@@ -16,7 +16,7 @@ use Spatie\Permission\PermissionRegistrar;
class UserView extends Component
{
public User $user;
public string $activeTab = 'permissions';
public string $activeTab = 'ficha';
// Projects tab
public ?int $addProjectId = null;
+67 -17
View File
@@ -131,6 +131,11 @@
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8 space-y-4">
<div role="tablist" class="tabs tabs-bordered gap-4">
<button role="tab" wire:click="setTab('ficha')"
class="tab gap-2 {{ $activeTab === 'ficha' ? 'tab-active font-semibold' : '' }}">
<x-heroicon-o-identification class="w-4 h-4" />
Ficha
</button>
<button role="tab" wire:click="setTab('permissions')"
class="tab gap-2 {{ $activeTab === 'permissions' ? 'tab-active font-semibold' : '' }}">
<x-heroicon-o-shield-check class="w-4 h-4" />
@@ -158,31 +163,44 @@
</div>
{{-- ════════════════════════════════════════════════════════════════════
TAB: PERMISOS
TAB: FICHA
════════════════════════════════════════════════════════════════════ --}}
@if($activeTab === 'permissions')
@if($activeTab === 'ficha')
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
{{-- Roles --}}
{{-- Información básica --}}
<div class="card bg-base-100 shadow">
<div class="card-body p-6">
<h3 class="font-semibold text-base flex items-center gap-2 mb-4">
<x-heroicon-o-shield-check class="w-5 h-5 text-primary" />
Roles asignados
<x-heroicon-o-identification class="w-5 h-5 text-primary" />
Información básica
</h3>
@if($user->roles->isEmpty())
<p class="text-sm text-gray-400">Sin roles asignados.</p>
@else
<div class="space-y-2">
@foreach($user->roles as $role)
<div class="flex items-center gap-3 p-3 bg-base-200 rounded-lg">
<span class="badge {{ $role->name === 'Admin' ? 'badge-error' : 'badge-primary' }} badge-lg">
{{ $role->name }}
</span>
</div>
@endforeach
<div class="space-y-1 text-sm">
<div class="flex justify-between gap-4 py-2 border-b border-base-200">
<span class="text-gray-500">Nombre</span>
<span class="font-medium text-right">{{ trim(($user->title ? $user->title.' ' : '').($user->first_name ?? '').' '.($user->last_name ?? '')) ?: $user->name }}</span>
</div>
@endif
<div class="flex justify-between gap-4 py-2 border-b border-base-200">
<span class="text-gray-500">Usuario</span>
<span class="font-medium text-right">{{ $user->name }}</span>
</div>
<div class="flex justify-between gap-4 py-2 border-b border-base-200">
<span class="text-gray-500">Email</span>
<span class="font-medium text-right">{{ $user->email }}</span>
</div>
<div class="flex justify-between gap-4 py-2 border-b border-base-200">
<span class="text-gray-500">Teléfono</span>
<span class="font-medium text-right">{{ $user->phone ?: '—' }}</span>
</div>
<div class="flex justify-between gap-4 py-2 border-b border-base-200">
<span class="text-gray-500">Dirección</span>
<span class="font-medium text-right">{{ $user->address ?: '—' }}</span>
</div>
<div class="flex justify-between gap-4 py-2">
<span class="text-gray-500">Miembro desde</span>
<span class="font-medium text-right">{{ $user->created_at?->format('d/m/Y') ?? '—' }}</span>
</div>
</div>
</div>
</div>
@@ -270,6 +288,38 @@
</div>
@endif
</div>
@endif
{{-- ════════════════════════════════════════════════════════════════════
TAB: PERMISOS
════════════════════════════════════════════════════════════════════ --}}
@if($activeTab === 'permissions')
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
{{-- Roles --}}
<div class="card bg-base-100 shadow">
<div class="card-body p-6">
<h3 class="font-semibold text-base flex items-center gap-2 mb-4">
<x-heroicon-o-shield-check class="w-5 h-5 text-primary" />
Roles asignados
</h3>
@if($user->roles->isEmpty())
<p class="text-sm text-gray-400">Sin roles asignados.</p>
@else
<div class="space-y-2">
@foreach($user->roles as $role)
<div class="flex items-center gap-3 p-3 bg-base-200 rounded-lg">
<span class="badge {{ $role->name === 'Admin' ? 'badge-error' : 'badge-primary' }} badge-lg">
{{ $role->name }}
</span>
</div>
@endforeach
</div>
@endif
</div>
</div>
{{-- Permisos directos del usuario --}}
<div class="card bg-base-100 shadow md:col-span-2">
<div class="card-body p-6">