+
t.id)} strategy={verticalListSortingStrategy}>
{tasks.map(task => (
@@ -57,6 +67,29 @@ function DroppableColumn({
))}
+
+ {/* QuickAdd pour cette colonne */}
+ {onCreateTask && (
+
+ {showQuickAdd ? (
+
{})}
+ />
+ ) : (
+
+ )}
+
+ )}
);
}
@@ -74,27 +107,33 @@ interface SwimlanesBaseProps {
tasks: Task[];
title: string;
swimlanes: SwimlaneData[];
+ onCreateTask?: (data: CreateTaskData) => Promise
;
onDeleteTask?: (taskId: string) => Promise;
onEditTask?: (task: Task) => void;
onUpdateTitle?: (taskId: string, newTitle: string) => Promise;
onUpdateStatus?: (taskId: string, newStatus: TaskStatus) => Promise;
compactView?: boolean;
visibleStatuses?: TaskStatus[];
+ loading?: boolean;
}
export function SwimlanesBase({
tasks,
title,
swimlanes,
+ onCreateTask,
onDeleteTask,
onEditTask,
onUpdateTitle,
onUpdateStatus,
compactView = false,
- visibleStatuses
+ visibleStatuses,
+ loading = false
}: SwimlanesBaseProps) {
const [activeTask, setActiveTask] = useState(null);
const [collapsedSwimlanes, setCollapsedSwimlanes] = useState>(new Set());
+ const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);
+ const [showQuickAdd, setShowQuickAdd] = useState<{ [key: string]: boolean }>({});
// Gestion de la visibilité des colonnes
const { getVisibleStatuses } = useColumnVisibility();
@@ -144,6 +183,25 @@ export function SwimlanesBase({
setCollapsedSwimlanes(newCollapsed);
};
+ // Handlers pour la création de tâches
+ const handleCreateTask = async (data: CreateTaskData) => {
+ if (onCreateTask) {
+ await onCreateTask(data);
+ setIsCreateModalOpen(false);
+ }
+ };
+
+ const handleQuickAdd = async (data: CreateTaskData, columnId: string) => {
+ if (onCreateTask) {
+ await onCreateTask(data);
+ setShowQuickAdd(prev => ({ ...prev, [columnId]: false }));
+ }
+ };
+
+ const toggleQuickAdd = (columnId: string) => {
+ setShowQuickAdd(prev => ({ ...prev, [columnId]: !prev[columnId] }));
+ };
+
return (
{/* Header */}
-
- {title}
-
+
+
+ {title}
+
+
+ {onCreateTask && (
+
+ )}
+
@@ -221,15 +291,20 @@ export function SwimlanesBase({
{statusesToShow.map(status => {
const statusTasks = swimlane.tasks.filter(task => task.status === status);
+ const columnId = `${swimlane.key}-${status}`;
+
return (
handleQuickAdd(data, columnId) : undefined}
+ showQuickAdd={showQuickAdd[columnId] || false}
+ onToggleQuickAdd={() => toggleQuickAdd(columnId)}
/>
);
})}
@@ -251,6 +326,16 @@ export function SwimlanesBase({
/>
)}
+
+ {/* Modal de création complète */}
+ {onCreateTask && (
+ setIsCreateModalOpen(false)}
+ onSubmit={handleCreateTask}
+ loading={loading}
+ />
+ )}
);
}
diff --git a/components/kanban/SwimlanesBoard.tsx b/components/kanban/SwimlanesBoard.tsx
index f5d2490..e65e4cd 100644
--- a/components/kanban/SwimlanesBoard.tsx
+++ b/components/kanban/SwimlanesBoard.tsx
@@ -1,28 +1,33 @@
'use client';
import { Task, TaskStatus } from '@/lib/types';
+import { CreateTaskData } from '@/clients/tasks-client';
import { useMemo } from 'react';
import { useTasksContext } from '@/contexts/TasksContext';
import { SwimlanesBase, SwimlaneData } from './SwimlanesBase';
interface SwimlanesboardProps {
tasks: Task[];
+ onCreateTask?: (data: CreateTaskData) => Promise;
onDeleteTask?: (taskId: string) => Promise;
onEditTask?: (task: Task) => void;
onUpdateTitle?: (taskId: string, newTitle: string) => Promise;
onUpdateStatus?: (taskId: string, newStatus: TaskStatus) => Promise;
compactView?: boolean;
visibleStatuses?: TaskStatus[];
+ loading?: boolean;
}
export function SwimlanesBoard({
tasks,
+ onCreateTask,
onDeleteTask,
onEditTask,
onUpdateTitle,
onUpdateStatus,
compactView = false,
- visibleStatuses
+ visibleStatuses,
+ loading = false
}: SwimlanesboardProps) {
const { tags: availableTags } = useTasksContext();
@@ -77,12 +82,14 @@ export function SwimlanesBoard({
tasks={tasks}
title="Swimlanes par Tag"
swimlanes={swimlanesData}
+ onCreateTask={onCreateTask}
onDeleteTask={onDeleteTask}
onEditTask={onEditTask}
onUpdateTitle={onUpdateTitle}
onUpdateStatus={onUpdateStatus}
compactView={compactView}
visibleStatuses={visibleStatuses}
+ loading={loading}
/>
);
}
\ No newline at end of file