'use client'; import { DailyMetrics } from '@/services/metrics'; import { parseDate, isToday } from '@/lib/date-utils'; interface WeeklyActivityHeatmapProps { data: DailyMetrics[]; className?: string; } export function WeeklyActivityHeatmap({ data, className }: WeeklyActivityHeatmapProps) { // Calculer l'intensité max pour la normalisation const maxActivity = Math.max(...data.map(day => day.completed + day.newTasks)); // Obtenir l'intensité relative (0-1) const getIntensity = (day: DailyMetrics) => { const activity = day.completed + day.newTasks; return maxActivity > 0 ? activity / maxActivity : 0; }; // Obtenir la couleur basée sur l'intensité const getColorClass = (intensity: number) => { if (intensity === 0) return 'bg-gray-100 dark:bg-gray-800'; if (intensity < 0.2) return 'bg-green-100 dark:bg-green-900/30'; if (intensity < 0.4) return 'bg-green-200 dark:bg-green-800/50'; if (intensity < 0.6) return 'bg-green-300 dark:bg-green-700/70'; if (intensity < 0.8) return 'bg-green-400 dark:bg-green-600/80'; return 'bg-green-500 dark:bg-green-500'; }; return (
{/* Titre */}

Heatmap d'activité hebdomadaire

Intensité basée sur les tâches complétées + nouvelles tâches

{/* Heatmap */}
{data.map((day, index) => { const intensity = getIntensity(day); const colorClass = getColorClass(intensity); const totalActivity = day.completed + day.newTasks; return (
{/* Carré de couleur */}
{/* Tooltip au hover */}
{day.dayName}
{day.completed} terminées, {day.newTasks} créées
Taux: {day.completionRate.toFixed(1)}%
{/* Indicator si jour actuel */} {isToday(parseDate(day.date)) && (
)}
{/* Label du jour */}
{day.dayName.substring(0, 3)}
); })}
{/* Légende */}
Moins
Plus
{/* Stats rapides */}
{data.reduce((sum, day) => sum + day.completed, 0)}
Terminées
{data.reduce((sum, day) => sum + day.newTasks, 0)}
Créées
{(data.reduce((sum, day) => sum + day.completionRate, 0) / data.length).toFixed(1)}%
Taux moyen
); }