'use client'; import { Task, TaskStatus } from '@/lib/types'; import { TaskCard } from './TaskCard'; import { useMemo } from 'react'; import { useTasksContext } from '@/contexts/TasksContext'; interface SwimlanesboardProps { tasks: Task[]; onDeleteTask?: (taskId: string) => Promise; onEditTask?: (task: Task) => void; onUpdateTitle?: (taskId: string, newTitle: string) => Promise; onUpdateStatus?: (taskId: string, newStatus: TaskStatus) => Promise; compactView?: boolean; } export function SwimlanesBoard({ tasks, onDeleteTask, onEditTask, onUpdateTitle, onUpdateStatus, compactView = false }: SwimlanesboardProps) { const { tags: availableTags } = useTasksContext(); const statuses: { id: TaskStatus; title: string; color: string }[] = [ { id: 'todo', title: 'À faire', color: 'gray' }, { id: 'in_progress', title: 'En cours', color: 'blue' }, { id: 'done', title: 'Terminé', color: 'green' }, { id: 'cancelled', title: 'Annulé', color: 'red' } ]; // Grouper les tâches par tags const tasksByTag = useMemo(() => { const grouped: { [tagName: string]: Task[] } = {}; // Ajouter une catégorie pour les tâches sans tags grouped['Sans tag'] = []; tasks.forEach(task => { if (!task.tags || task.tags.length === 0) { grouped['Sans tag'].push(task); } else { task.tags.forEach(tagName => { if (!grouped[tagName]) { grouped[tagName] = []; } grouped[tagName].push(task); }); } }); return grouped; }, [tasks]); // Obtenir la couleur d'un tag const getTagColor = (tagName: string) => { if (tagName === 'Sans tag') return '#64748b'; // slate-500 const tag = availableTags.find(t => t.name === tagName); return tag?.color || '#64748b'; }; return (
{/* Header */}

Kanban Swimlanes

{/* Headers des colonnes */}
Tags
{statuses.map(status => (
{status.title}
))}
{/* Swimlanes */}
{Object.entries(tasksByTag) .sort(([a], [b]) => { // Mettre "Sans tag" à la fin if (a === 'Sans tag') return 1; if (b === 'Sans tag') return -1; return a.localeCompare(b); }) .map(([tagName, tagTasks]) => (
{/* Header de la swimlane */}
{tagName} {tagTasks.length}
{/* Compteurs par statut */} {statuses.map(status => { const count = tagTasks.filter(task => task.status === status.id).length; return (
{count}
); })}
{/* Contenu de la swimlane */}
{/* Colonne vide pour le nom du tag */} {statuses.map(status => { const statusTasks = tagTasks.filter(task => task.status === status.id); return (
{statusTasks.map(task => ( ))}
); })}
))}
); }