@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']) }}>
@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())
@foreach ($session->activitySessionMetrics as $metric)
{{ $formatMetric($metric) }}
@endforeach
@endif
{{ $formatHours($session->duration_min) }}
{{ $satisfactionScore === null ? '—' : (int) $satisfactionScore }}
/10
@empty
{{ $emptyText }}
@endforelse