Files
towercontrol/components/kanban/PrioritySwimlanesBoard.tsx
Julien Froidefond 95ac4617d6 fix: filter priorities with tasks in PrioritySwimlanesBoard
- Updated PrioritySwimlanesBoard to filter out priorities that have no associated tasks, ensuring only relevant priorities are displayed. This improves the clarity and usability of the swimlanes.
2025-09-17 15:51:49 +02:00

78 lines
2.3 KiB
TypeScript

'use client';
import { Task, TaskStatus } from '@/lib/types';
import { CreateTaskData } from '@/clients/tasks-client';
import { useMemo } from 'react';
import { getAllPriorities } from '@/lib/status-config';
import { SwimlanesBase, SwimlaneData } from './SwimlanesBase';
interface PrioritySwimlanesBoardProps {
loading: boolean;
tasks: Task[];
onCreateTask?: (data: CreateTaskData) => Promise<void>;
onDeleteTask?: (taskId: string) => Promise<void>;
onEditTask?: (task: Task) => void;
onUpdateTitle?: (taskId: string, newTitle: string) => Promise<void>;
onUpdateStatus?: (taskId: string, newStatus: TaskStatus) => Promise<void>;
compactView?: boolean;
visibleStatuses?: TaskStatus[];
}
export function PrioritySwimlanesBoard({
tasks,
onCreateTask,
onDeleteTask,
onEditTask,
onUpdateTitle,
onUpdateStatus,
compactView = false,
visibleStatuses,
}: PrioritySwimlanesBoardProps) {
// Grouper les tâches par priorités et créer les données de swimlanes
const swimlanesData = useMemo((): SwimlaneData[] => {
const grouped: { [priorityKey: string]: Task[] } = {};
// Initialiser avec toutes les priorités
getAllPriorities().forEach((priority) => {
grouped[priority.key] = [];
});
tasks.forEach((task) => {
if (grouped[task.priority]) {
grouped[task.priority].push(task);
}
});
// Convertir en format SwimlaneData en respectant l'ordre de priorité
// Filtrer uniquement les priorités qui ont des tâches
return getAllPriorities()
.sort((a, b) => b.order - a.order) // Ordre décroissant - plus importantes en haut
.filter((priority) => grouped[priority.key].length > 0) // Ne garder que les priorités avec des tâches
.map((priority) => ({
key: priority.key,
label: priority.label,
icon: priority.icon,
color: priority.color,
tasks: grouped[priority.key],
context: {
type: 'priority' as const,
value: priority.key,
},
}));
}, [tasks]);
return (
<SwimlanesBase
tasks={tasks}
swimlanes={swimlanesData}
onCreateTask={onCreateTask}
onDeleteTask={onDeleteTask}
onEditTask={onEditTask}
onUpdateTitle={onUpdateTitle}
onUpdateStatus={onUpdateStatus}
compactView={compactView}
visibleStatuses={visibleStatuses}
/>
);
}