@props([ 'history', 'stats' => null, 'context' => 'global', 'title' => 'Historique des sessions', 'emptyText' => __('Aucune session sur cette période.'), ]) @php $summary = $stats?->summary ?? []; $rankings = $stats?->rankings ?? []; $charts = $stats?->charts ?? []; $formatHours = function (?int $minutes): string { if ($minutes === null) { return __('Sans durée'); } $minutes = max(0, (int) $minutes); $hours = intdiv($minutes, 60); $remainingMinutes = $minutes % 60; return $hours . 'h' . str_pad((string) $remainingMinutes, 2, '0', STR_PAD_LEFT); }; $formatActivityDate = fn ($session): string => $session->all_day ? ($session->started_at?->format('d/m/Y') ?? '—') : ($session->started_at?->format('d/m/Y H:i') ?? '—'); $formatMetric = fn ($metric): string => trim(str_replace('_', ' ', (string) $metric->name) . ' · ' . rtrim(rtrim(number_format((float) $metric->value, 1, ',', ' '), '0'), ',') . ' ' . ($metric->unit ?? '')); $bestDay = data_get($summary, 'best_day'); $bestWeek = data_get($summary, 'best_week'); $lastSession = data_get($summary, 'last_session'); $typeRankings = collect(data_get($rankings, 'types', [])); $timeOfDayRows = collect(data_get($charts, 'time_of_day_distribution', [])) ->filter(fn ($row): bool => (int) data_get($row, 'session_count', 0) > 0 || (int) data_get($row, 'total_minutes', 0) > 0) ->values(); $typeStatsUrl = fn (mixed $row): string => route('statistics.index', [ 'category_id' => data_get($row, 'category_id'), 'type_id' => data_get($row, 'type_id'), ]); @endphp
merge(['class' => 'statistics-history-layout']) }}>

{{ __('Historique') }}

{{ $title }}

{{ trans_choice('ui.common.sessions', $history->count(), ['count' => $history->count()]) }}
@forelse ($history as $session) @php $satisfactionScore = $session->satisfaction_score; $satisfactionPercent = $satisfactionScore === null ? '0%' : min(100, max(0, ((int) $satisfactionScore) * 10)) . '%'; $typeUrl = null; if ($session->activity_category_id && $session->activity_type_id) { $typeUrl = route('statistics.index', [ 'category_id' => $session->activity_category_id, 'type_id' => $session->activity_type_id, ]); } @endphp

{{ $session->title ?? $session->activityType?->name ?? $session->activityCategory?->name ?? __('Activité') }}

{{ $formatActivityDate($session) }} {{ $session->activityCategory?->name ?? __('Sans catégorie') }} {{ $session->activityType?->name ?? __('Sans type') }} @if ($session->is_deepwork) {{ __('Deepwork · x1.5') }} @endif
@if ($session->activitySessionMetrics->isNotEmpty()) @endif

{{ $formatHours($session->duration_min) }}

{{ $satisfactionScore === null ? '—' : (int) $satisfactionScore }} /10
@empty
{{ $emptyText }}
@endforelse