'use client'; import { useState } from 'react'; import { useUserPreferences } from '@/contexts/UserPreferencesContext'; import { useDragAndDrop } from '@/hooks/useDragAndDrop'; import { Task, TaskStatus } from '@/lib/types'; import { TaskCard } from './TaskCard'; import { Card, CardHeader, CardContent } from '@/components/ui/Card'; import { Badge } from '@/components/ui/Badge'; import { DndContext, DragEndEvent, DragOverlay, DragStartEvent } from '@dnd-kit/core'; import { SortableContext, verticalListSortingStrategy, } from '@dnd-kit/sortable'; import { useDroppable } from '@dnd-kit/core'; interface ObjectivesBoardProps { tasks: Task[]; onEditTask?: (task: Task) => void; onUpdateStatus?: (taskId: string, newStatus: TaskStatus) => Promise; compactView?: boolean; pinnedTagName?: string; } // Composant pour les colonnes droppables function DroppableColumn({ status, tasks, title, color, icon, onEditTask, compactView }: { status: TaskStatus; tasks: Task[]; title: string; color: string; icon: string; onEditTask?: (task: Task) => void; compactView: boolean; }) { const { setNodeRef } = useDroppable({ id: status, }); return (

{title}

{tasks.length}
{tasks.length === 0 ? (
{icon}
Aucun objectif {title.toLowerCase()}
) : ( t.id)} strategy={verticalListSortingStrategy}>
{tasks.map(task => (
))}
)}
); } export function ObjectivesBoard({ tasks, onEditTask, onUpdateStatus, compactView = false, pinnedTagName = "Objectifs" }: ObjectivesBoardProps) { const { preferences, toggleObjectivesCollapse } = useUserPreferences(); const isCollapsed = preferences.viewPreferences.objectivesCollapsed; const { isMounted, sensors } = useDragAndDrop(); const [activeTask, setActiveTask] = useState(null); // Handlers pour le drag & drop const handleDragStart = (event: DragStartEvent) => { const task = tasks.find(t => t.id === event.active.id); setActiveTask(task || null); }; const handleDragEnd = async (event: DragEndEvent) => { const { active, over } = event; setActiveTask(null); if (!over || !onUpdateStatus) return; const taskId = active.id as string; const newStatus = over.id as TaskStatus; // Vérifier si le statut a changé const task = tasks.find(t => t.id === taskId); if (task && task.status !== newStatus) { await onUpdateStatus(taskId, newStatus); } }; if (tasks.length === 0) { return null; // Ne rien afficher s'il n'y a pas d'objectifs } const content = (
{String(tasks.length).padStart(2, '0')} {/* Bouton collapse séparé pour mobile */}
{!isCollapsed && ( {(() => { // Séparer les tâches par statut const inProgressTasks = tasks.filter(task => task.status === 'in_progress'); const todoTasks = tasks.filter(task => task.status === 'todo' || task.status === 'backlog'); const completedTasks = tasks.filter(task => task.status === 'done'); return (
); })()}
)}
); if (!isMounted) { return content; } return ( {content} {/* Overlay pour le drag & drop */} {activeTask ? (
) : null}
); }