2026-05-07 23:31:33 +02:00
|
|
|
<x-app-layout>
|
|
|
|
|
<x-slot name="header">
|
|
|
|
|
<h2 class="font-semibold text-xl text-gray-800 leading-tight">
|
2026-06-19 17:24:30 +02:00
|
|
|
{{ __('Home') }}
|
2026-05-07 23:31:33 +02:00
|
|
|
</h2>
|
|
|
|
|
</x-slot>
|
|
|
|
|
|
2026-06-16 18:05:53 +02:00
|
|
|
<div class="py-8">
|
2026-06-19 17:24:30 +02:00
|
|
|
<div class="max-w-6xl mx-auto sm:px-6 lg:px-8 space-y-6">
|
2026-06-16 18:05:53 +02:00
|
|
|
|
2026-06-19 17:24:30 +02:00
|
|
|
{{-- Saludo --}}
|
|
|
|
|
<div>
|
|
|
|
|
<h3 class="text-lg font-bold">Hola, {{ $user?->first_name ?? auth()->user()->name }}</h3>
|
|
|
|
|
<p class="text-sm text-base-content/60">Un resumen rápido de lo tuyo.</p>
|
|
|
|
|
</div>
|
2026-06-16 18:05:53 +02:00
|
|
|
|
2026-06-19 17:24:30 +02:00
|
|
|
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
|
|
|
|
|
|
|
|
|
{{-- ───────────── Mis proyectos ───────────── --}}
|
|
|
|
|
<div class="card bg-base-100 border border-base-300">
|
|
|
|
|
<div class="card-body p-4">
|
|
|
|
|
<div class="flex items-center justify-between mb-1">
|
|
|
|
|
<h3 class="font-bold flex items-center gap-2">
|
|
|
|
|
<x-heroicon-o-folder class="w-5 h-5" /> Mis proyectos
|
|
|
|
|
<span class="badge badge-sm">{{ $projectsCount }}</span>
|
|
|
|
|
</h3>
|
|
|
|
|
<a href="{{ route('projects.index') }}" wire:navigate class="link link-primary text-sm">Ver todos</a>
|
2026-06-16 18:05:53 +02:00
|
|
|
</div>
|
2026-06-19 17:24:30 +02:00
|
|
|
@forelse($projects as $project)
|
|
|
|
|
@php $pct = round($project->phases->avg('progress_percent') ?? 0); @endphp
|
|
|
|
|
<a href="{{ route('projects.dashboard', $project) }}" wire:navigate
|
|
|
|
|
class="flex items-center gap-3 py-2 border-b border-base-200 last:border-0 hover:bg-base-200/50 rounded px-1">
|
|
|
|
|
<div class="flex-1 min-w-0">
|
|
|
|
|
<div class="font-medium text-sm truncate">{{ $project->name }}</div>
|
|
|
|
|
<progress class="progress progress-primary w-full h-1.5 mt-1" value="{{ $pct }}" max="100"></progress>
|
2026-06-16 18:05:53 +02:00
|
|
|
</div>
|
2026-06-19 17:24:30 +02:00
|
|
|
<span class="text-xs text-base-content/50 w-9 text-right">{{ $pct }}%</span>
|
|
|
|
|
</a>
|
|
|
|
|
@empty
|
|
|
|
|
<p class="text-sm text-base-content/40 py-3">No tienes proyectos asignados.</p>
|
|
|
|
|
@endforelse
|
2026-06-16 18:05:53 +02:00
|
|
|
</div>
|
2026-05-09 21:17:36 +02:00
|
|
|
</div>
|
2026-06-16 18:05:53 +02:00
|
|
|
|
2026-06-19 17:24:30 +02:00
|
|
|
{{-- ───────────── Mis tareas ───────────── --}}
|
|
|
|
|
<div class="card bg-base-100 border border-base-300">
|
|
|
|
|
<div class="card-body p-4">
|
|
|
|
|
<h3 class="font-bold flex items-center gap-2 mb-1">
|
|
|
|
|
<x-heroicon-o-clipboard-document-check class="w-5 h-5" /> Mis tareas
|
|
|
|
|
<span class="badge badge-sm">{{ $myTasksCount }}</span>
|
|
|
|
|
</h3>
|
|
|
|
|
@forelse($myTasks as $task)
|
|
|
|
|
<a href="{{ $task->issue ? route('projects.issues.show', [$task->issue->project_id, $task->issue_id]) : '#' }}"
|
|
|
|
|
wire:navigate
|
|
|
|
|
class="flex items-center gap-2 py-2 border-b border-base-200 last:border-0 hover:bg-base-200/50 rounded px-1">
|
|
|
|
|
<div class="flex-1 min-w-0">
|
|
|
|
|
<div class="text-sm truncate">{{ $task->title }}</div>
|
|
|
|
|
<div class="text-xs text-base-content/50 truncate">
|
|
|
|
|
{{ $task->issue?->project?->name ?? '—' }}
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
@if($task->due_date)
|
|
|
|
|
<span class="text-xs whitespace-nowrap {{ $task->is_overdue ? 'text-error font-semibold' : 'text-base-content/50' }}">
|
|
|
|
|
{{ $task->due_date->format('d/m/Y') }}
|
|
|
|
|
</span>
|
2026-06-16 18:05:53 +02:00
|
|
|
@endif
|
2026-06-19 17:24:30 +02:00
|
|
|
</a>
|
|
|
|
|
@empty
|
|
|
|
|
<p class="text-sm text-base-content/40 py-3">No tienes tareas pendientes. 🎉</p>
|
|
|
|
|
@endforelse
|
2026-06-16 18:05:53 +02:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
2026-06-19 17:24:30 +02:00
|
|
|
{{-- ───────────── Mis incidencias ───────────── --}}
|
|
|
|
|
<div class="card bg-base-100 border border-base-300">
|
|
|
|
|
<div class="card-body p-4">
|
|
|
|
|
<h3 class="font-bold flex items-center gap-2 mb-1">
|
|
|
|
|
<x-heroicon-o-exclamation-triangle class="w-5 h-5" /> Incidencias asignadas
|
|
|
|
|
<span class="badge badge-sm">{{ $myIssuesCount }}</span>
|
|
|
|
|
</h3>
|
|
|
|
|
@forelse($myIssues as $issue)
|
|
|
|
|
@php
|
|
|
|
|
$sLabel = ['open'=>'Abierto','in_review'=>'En revisión'][$issue->status] ?? $issue->status;
|
|
|
|
|
@endphp
|
|
|
|
|
<a href="{{ route('projects.issues.show', [$issue->project_id, $issue->id]) }}" wire:navigate
|
|
|
|
|
class="flex items-center gap-2 py-2 border-b border-base-200 last:border-0 hover:bg-base-200/50 rounded px-1">
|
|
|
|
|
<span class="badge badge-xs shrink-0" style="background-color: {{ $issue->priority_color }}; color:#fff; border:0;"> </span>
|
|
|
|
|
<div class="flex-1 min-w-0">
|
|
|
|
|
<div class="text-sm truncate">{{ $issue->title }}</div>
|
|
|
|
|
<div class="text-xs text-base-content/50 truncate">{{ $issue->project?->name ?? '—' }}</div>
|
2026-06-16 18:05:53 +02:00
|
|
|
</div>
|
2026-06-19 17:24:30 +02:00
|
|
|
<span class="badge badge-ghost badge-xs whitespace-nowrap">{{ $sLabel }}</span>
|
|
|
|
|
</a>
|
|
|
|
|
@empty
|
|
|
|
|
<p class="text-sm text-base-content/40 py-3">No tienes incidencias asignadas.</p>
|
|
|
|
|
@endforelse
|
2026-06-16 18:05:53 +02:00
|
|
|
</div>
|
2026-05-09 21:17:36 +02:00
|
|
|
</div>
|
|
|
|
|
|
2026-06-19 17:24:30 +02:00
|
|
|
{{-- ───────────── Notificaciones ───────────── --}}
|
|
|
|
|
<div class="card bg-base-100 border border-base-300">
|
|
|
|
|
<div class="card-body p-4">
|
|
|
|
|
<h3 class="font-bold flex items-center gap-2 mb-1">
|
|
|
|
|
<x-heroicon-o-bell class="w-5 h-5" /> Notificaciones
|
|
|
|
|
@if($unreadCount)<span class="badge badge-error badge-sm">{{ $unreadCount }}</span>@endif
|
|
|
|
|
</h3>
|
|
|
|
|
@forelse($notifications as $note)
|
|
|
|
|
@php
|
|
|
|
|
$d = $note->data;
|
|
|
|
|
$url = (isset($d['project_id'], $d['issue_id']))
|
|
|
|
|
? route('projects.issues.show', [$d['project_id'], $d['issue_id']])
|
|
|
|
|
: null;
|
|
|
|
|
@endphp
|
|
|
|
|
<a href="{{ $url ?? '#' }}" @if($url) wire:navigate @endif
|
|
|
|
|
class="flex items-start gap-2 py-2 border-b border-base-200 last:border-0 hover:bg-base-200/50 rounded px-1 {{ is_null($note->read_at) ? 'font-medium' : '' }}">
|
|
|
|
|
<span class="mt-1 w-2 h-2 rounded-full shrink-0 {{ is_null($note->read_at) ? 'bg-error' : 'bg-base-300' }}"></span>
|
|
|
|
|
<div class="flex-1 min-w-0">
|
|
|
|
|
<div class="text-sm">{{ $d['message'] ?? 'Notificación' }}</div>
|
|
|
|
|
<div class="text-xs text-base-content/40">{{ $note->created_at->diffForHumans() }}</div>
|
2026-06-16 18:05:53 +02:00
|
|
|
</div>
|
2026-06-19 17:24:30 +02:00
|
|
|
</a>
|
|
|
|
|
@empty
|
|
|
|
|
<p class="text-sm text-base-content/40 py-3">Sin notificaciones.</p>
|
|
|
|
|
@endforelse
|
2026-05-09 21:17:36 +02:00
|
|
|
</div>
|
|
|
|
|
</div>
|
2026-06-16 18:05:53 +02:00
|
|
|
|
|
|
|
|
</div>
|
2026-05-07 23:31:33 +02:00
|
|
|
</div>
|
|
|
|
|
</div>
|
2026-06-16 18:05:53 +02:00
|
|
|
</x-app-layout>
|