feat: refactor Daily components and enhance UI integration

- Replaced `DailyCalendar` with a new `Calendar` component for improved functionality and consistency.
- Introduced `AlertBanner` to replace `DeadlineReminder`, providing a more flexible way to display urgent tasks.
- Updated `DailyAddForm` to use new options for task types, enhancing user experience when adding tasks.
- Removed unused state and components, streamlining the DailyPageClient for better performance and maintainability.
- Enhanced `DailySection` to utilize new `CheckboxItem` format for better integration with the UI.
- Cleaned up imports and improved overall structure for better readability.
This commit is contained in:
Julien Froidefond
2025-09-29 09:47:13 +02:00
parent 41fdd0c5b5
commit d45a04d347
18 changed files with 1583 additions and 654 deletions

View File

@@ -7,12 +7,12 @@ import { DailyView, DailyCheckboxType, DailyCheckbox } from '@/lib/types';
import { DeadlineMetrics } from '@/services/analytics/deadline-analytics';
import { Button } from '@/components/ui/Button';
import { Card } from '@/components/ui/Card';
import { DailyCalendar } from '@/components/daily/DailyCalendar';
import { Calendar } from '@/components/ui/Calendar';
import { AlertBanner, AlertItem } from '@/components/ui/AlertBanner';
import { DailySection } from '@/components/daily/DailySection';
import { PendingTasksSection } from '@/components/daily/PendingTasksSection';
import { dailyClient } from '@/clients/daily-client';
import { Header } from '@/components/ui/Header';
import { DeadlineReminder } from '@/components/daily/DeadlineReminder';
import { getPreviousWorkday, formatDateLong, isToday, generateDateTitle, formatDateShort, isYesterday } from '@/lib/date-utils';
interface DailyPageClientProps {
@@ -53,7 +53,6 @@ export function DailyPageClient({
} = useDaily(initialDate, initialDailyView);
const [dailyDates, setDailyDates] = useState<string[]>(initialDailyDates);
const [refreshTrigger, setRefreshTrigger] = useState(0);
// Fonction pour rafraîchir la liste des dates avec des dailies
const refreshDailyDates = async () => {
@@ -88,14 +87,12 @@ export function DailyPageClient({
const handleToggleCheckbox = async (checkboxId: string) => {
await toggleCheckbox(checkboxId);
setRefreshTrigger(prev => prev + 1); // Trigger refresh pour les tâches en attente
};
const handleDeleteCheckbox = async (checkboxId: string) => {
await deleteCheckbox(checkboxId);
// Refresh dates après suppression pour mettre à jour le calendrier
await refreshDailyDates();
setRefreshTrigger(prev => prev + 1); // Trigger refresh pour les tâches en attente
};
const handleUpdateCheckbox = async (checkboxId: string, text: string, type: DailyCheckboxType, taskId?: string) => {
@@ -110,6 +107,7 @@ export function DailyPageClient({
await reorderCheckboxes({ date, checkboxIds });
};
const getYesterdayDate = () => {
return getPreviousWorkday(currentDate);
};
@@ -142,6 +140,40 @@ export function DailyPageClient({
return `📋 ${formatDateShort(yesterdayDate)}`;
};
// Convertir les métriques de deadline en AlertItem
const convertDeadlineMetricsToAlertItems = (metrics: DeadlineMetrics | null): AlertItem[] => {
if (!metrics) return [];
const urgentTasks = [
...metrics.overdue,
...metrics.critical,
...metrics.warning
].sort((a, b) => {
const urgencyOrder: Record<string, number> = { 'overdue': 0, 'critical': 1, 'warning': 2 };
if (urgencyOrder[a.urgencyLevel] !== urgencyOrder[b.urgencyLevel]) {
return urgencyOrder[a.urgencyLevel] - urgencyOrder[b.urgencyLevel];
}
return a.daysRemaining - b.daysRemaining;
});
return urgentTasks.map(task => ({
id: task.id,
title: task.title,
icon: task.urgencyLevel === 'overdue' ? '🔴' :
task.urgencyLevel === 'critical' ? '🟠' : '🟡',
urgency: task.urgencyLevel as 'low' | 'medium' | 'high' | 'critical',
source: task.source,
metadata: task.urgencyLevel === 'overdue' ?
(task.daysRemaining === -1 ? 'En retard de 1 jour' : `En retard de ${Math.abs(task.daysRemaining)} jours`) :
task.urgencyLevel === 'critical' ?
(task.daysRemaining === 0 ? 'Échéance aujourd\'hui' :
task.daysRemaining === 1 ? 'Échéance demain' :
`Dans ${task.daysRemaining} jours`) :
`Dans ${task.daysRemaining} jours`
}));
};
if (loading) {
return (
<div className="container mx-auto px-4 py-8">
@@ -219,7 +251,16 @@ export function DailyPageClient({
{/* Rappel des échéances urgentes - Desktop uniquement */}
<div className="hidden sm:block container mx-auto px-4 pt-4 pb-2">
<DeadlineReminder deadlineMetrics={initialDeadlineMetrics} />
<AlertBanner
title="Rappel - Tâches urgentes"
items={convertDeadlineMetricsToAlertItems(initialDeadlineMetrics || null)}
icon="⚠️"
variant="warning"
onItemClick={(item) => {
// Rediriger vers la page Kanban avec la tâche sélectionnée
window.location.href = `/kanban?taskId=${item.id}`;
}}
/>
</div>
{/* Contenu principal */}
@@ -244,10 +285,12 @@ export function DailyPageClient({
/>
{/* Calendrier en bas sur mobile */}
<DailyCalendar
<Calendar
currentDate={currentDate}
onDateSelect={handleDateSelect}
dailyDates={dailyDates}
markedDates={dailyDates}
showTodayButton={true}
showLegend={true}
/>
</div>
)}
@@ -258,10 +301,12 @@ export function DailyPageClient({
<div className="grid grid-cols-1 xl:grid-cols-3 gap-6">
{/* Calendrier - Desktop */}
<div className="xl:col-span-1">
<DailyCalendar
<Calendar
currentDate={currentDate}
onDateSelect={handleDateSelect}
dailyDates={dailyDates}
markedDates={dailyDates}
showTodayButton={true}
showLegend={true}
/>
</div>
@@ -307,7 +352,7 @@ export function DailyPageClient({
onToggleCheckbox={handleToggleCheckbox}
onDeleteCheckbox={handleDeleteCheckbox}
onRefreshDaily={refreshDailySilent}
refreshTrigger={refreshTrigger}
refreshTrigger={0}
initialPendingTasks={initialPendingTasks}
/>