From c627d1abd3fcccae9fd4ebdbc8ea8eb984a49a37 Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Mon, 15 Sep 2025 11:53:47 +0200 Subject: [PATCH] feat: enhance Kanban components with swimlane context support - Added `context` prop to `PrioritySwimlanesBoard`, `SwimlanesBoard`, and `DroppableColumn` to provide swimlane context for task creation. - Updated `QuickAddTask` to pre-fill form data based on the swimlane context, improving user experience during task addition. - Enhanced task handling in `SwimlanesBoard` to include context for tags, ensuring better organization and task management. --- components/kanban/PrioritySwimlanesBoard.tsx | 6 ++- components/kanban/QuickAddTask.tsx | 52 +++++++++++++------- components/kanban/SwimlanesBase.tsx | 16 +++++- components/kanban/SwimlanesBoard.tsx | 6 ++- 4 files changed, 58 insertions(+), 22 deletions(-) diff --git a/components/kanban/PrioritySwimlanesBoard.tsx b/components/kanban/PrioritySwimlanesBoard.tsx index 771da0f..b3c9803 100644 --- a/components/kanban/PrioritySwimlanesBoard.tsx +++ b/components/kanban/PrioritySwimlanesBoard.tsx @@ -53,7 +53,11 @@ export function PrioritySwimlanesBoard({ label: priority.label, icon: priority.icon, color: priority.color, - tasks: grouped[priority.key] || [] + tasks: grouped[priority.key] || [], + context: { + type: 'priority' as const, + value: priority.key + } })); }, [tasks]); diff --git a/components/kanban/QuickAddTask.tsx b/components/kanban/QuickAddTask.tsx index 4c6e231..c1068d0 100644 --- a/components/kanban/QuickAddTask.tsx +++ b/components/kanban/QuickAddTask.tsx @@ -5,23 +5,44 @@ import { Card } from '@/components/ui/Card'; import { TagInput } from '@/components/ui/TagInput'; import { TaskStatus, TaskPriority } from '@/lib/types'; import { CreateTaskData } from '@/clients/tasks-client'; -import { getAllPriorities, getPriorityConfig } from '@/lib/status-config'; +import { getAllPriorities } from '@/lib/status-config'; interface QuickAddTaskProps { status: TaskStatus; onSubmit: (data: CreateTaskData) => Promise; onCancel: () => void; + // Contexte pour les swimlanes + swimlaneContext?: { + type: 'tag' | 'priority'; + value: string; // nom du tag ou clé de la priorité + }; } -export function QuickAddTask({ status, onSubmit, onCancel }: QuickAddTaskProps) { - const [formData, setFormData] = useState({ - title: '', - description: '', - status, - priority: 'medium' as TaskPriority, - tags: [], - dueDate: undefined - }); +export function QuickAddTask({ status, onSubmit, onCancel, swimlaneContext }: QuickAddTaskProps) { + // Fonction pour initialiser les données selon le contexte + const getInitialFormData = (): CreateTaskData => { + const baseData: CreateTaskData = { + title: '', + description: '', + status, + priority: 'medium' as TaskPriority, + tags: [], + dueDate: undefined + }; + + // Pré-remplir selon le contexte de swimlane + if (swimlaneContext) { + if (swimlaneContext.type === 'tag' && swimlaneContext.value !== 'Sans tag') { + baseData.tags = [swimlaneContext.value]; + } else if (swimlaneContext.type === 'priority') { + baseData.priority = swimlaneContext.value as TaskPriority; + } + } + + return baseData; + }; + + const [formData, setFormData] = useState(getInitialFormData()); const [isSubmitting, setIsSubmitting] = useState(false); const [activeField, setActiveField] = useState<'title' | 'description' | 'tags' | 'date' | null>('title'); const titleRef = useRef(null); @@ -44,15 +65,8 @@ export function QuickAddTask({ status, onSubmit, onCancel }: QuickAddTaskProps) title: trimmedTitle }); - // Réinitialiser pour la prochaine tâche - setFormData({ - title: '', - description: '', - status, - priority: 'medium', - tags: [], - dueDate: undefined - }); + // Réinitialiser pour la prochaine tâche (en gardant le contexte) + setFormData(getInitialFormData()); setActiveField('title'); setIsSubmitting(false); titleRef.current?.focus(); diff --git a/components/kanban/SwimlanesBase.tsx b/components/kanban/SwimlanesBase.tsx index f23181b..a10b12e 100644 --- a/components/kanban/SwimlanesBase.tsx +++ b/components/kanban/SwimlanesBase.tsx @@ -35,7 +35,8 @@ function DroppableColumn({ compactView, onCreateTask, showQuickAdd, - onToggleQuickAdd + onToggleQuickAdd, + swimlaneContext }: { status: TaskStatus; tasks: Task[]; @@ -46,6 +47,10 @@ function DroppableColumn({ onCreateTask?: (data: CreateTaskData) => Promise; showQuickAdd?: boolean; onToggleQuickAdd?: () => void; + swimlaneContext?: { + type: 'tag' | 'priority'; + value: string; + }; }) { const { setNodeRef } = useDroppable({ id: status, @@ -76,6 +81,7 @@ function DroppableColumn({ status={status} onSubmit={onCreateTask} onCancel={onToggleQuickAdd || (() => {})} + swimlaneContext={swimlaneContext} /> ) : (