diff --git a/components/HomePageClient.tsx b/components/HomePageClient.tsx index eee7ba8..090190c 100644 --- a/components/HomePageClient.tsx +++ b/components/HomePageClient.tsx @@ -5,7 +5,10 @@ import { KanbanBoardContainer } from '@/components/kanban/BoardContainer'; import { Header } from '@/components/ui/Header'; import { TasksProvider, useTasksContext } from '@/contexts/TasksContext'; import { Task, Tag, TaskStats } from '@/lib/types'; +import { CreateTaskData } from '@/clients/tasks-client'; import { userPreferencesService } from '@/services/user-preferences'; +import { CreateTaskForm } from '@/components/forms/CreateTaskForm'; +import { Button } from '@/components/ui/Button'; interface HomePageClientProps { initialTasks: Task[]; @@ -14,9 +17,10 @@ interface HomePageClientProps { } function HomePageContent() { - const { stats, syncing } = useTasksContext(); + const { stats, syncing, createTask } = useTasksContext(); const [showFilters, setShowFilters] = useState(true); const [showObjectives, setShowObjectives] = useState(true); + const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); // Charger les préférences depuis le service useEffect(() => { @@ -38,6 +42,12 @@ function HomePageContent() { userPreferencesService.updateViewPreferences({ showObjectives: newValue }); }; + // Handler pour la création de tâche depuis la barre de contrôles + const handleCreateTask = async (data: CreateTaskData) => { + await createTask(data); + setIsCreateModalOpen(false); + }; + return (
-
-
- +
+
+
+ + + +
- -
- -
- Affichage des composants
+ + {/* Bouton d'ajout de tâche */} +
@@ -94,6 +115,14 @@ function HomePageContent() { showObjectives={showObjectives} /> + + {/* Modal de création de tâche */} + setIsCreateModalOpen(false)} + onSubmit={handleCreateTask} + loading={false} + />
); } diff --git a/components/kanban/Board.tsx b/components/kanban/Board.tsx index 0e2d27a..dac341f 100644 --- a/components/kanban/Board.tsx +++ b/components/kanban/Board.tsx @@ -2,8 +2,6 @@ import { Task, TaskStatus } from '@/lib/types'; import { KanbanColumn } from './Column'; -import { Button } from '@/components/ui/Button'; -import { CreateTaskForm } from '@/components/forms/CreateTaskForm'; import { CreateTaskData } from '@/clients/tasks-client'; import { useMemo, useState } from 'react'; import { useColumnVisibility } from '@/hooks/useColumnVisibility'; @@ -21,18 +19,16 @@ import { TaskCard } from './TaskCard'; interface KanbanBoardProps { tasks: Task[]; - onCreateTask?: (data: CreateTaskData) => Promise; + onCreateTask?: (data: CreateTaskData) => Promise; onDeleteTask?: (taskId: string) => Promise; onEditTask?: (task: Task) => void; onUpdateTitle?: (taskId: string, newTitle: string) => Promise; onUpdateStatus?: (taskId: string, newStatus: TaskStatus) => Promise; - loading?: boolean; compactView?: boolean; visibleStatuses?: TaskStatus[]; } -export function KanbanBoard({ tasks, onCreateTask, onDeleteTask, onEditTask, onUpdateTitle, onUpdateStatus, loading = false, compactView = false, visibleStatuses }: KanbanBoardProps) { - const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); +export function KanbanBoard({ tasks, onCreateTask, onDeleteTask, onEditTask, onUpdateTitle, onUpdateStatus, compactView = false, visibleStatuses }: KanbanBoardProps) { const [activeTask, setActiveTask] = useState(null); // Gestion de la visibilité des colonnes (utilise les props si disponibles) @@ -72,11 +68,6 @@ export function KanbanBoard({ tasks, onCreateTask, onDeleteTask, onEditTask, onU allColumns.filter(column => visibleStatuses.includes(column.id)) : getVisibleStatuses(allColumns); - const handleCreateTask = async (data: CreateTaskData) => { - if (onCreateTask) { - await onCreateTask(data); - } - }; // Gestion du début du drag const handleDragStart = (event: DragStartEvent) => { @@ -111,25 +102,8 @@ export function KanbanBoard({ tasks, onCreateTask, onDeleteTask, onEditTask, onU onDragEnd={handleDragEnd} >
- {/* Header avec bouton nouvelle tâche */} -
-
-
-

- Kanban Board -

-
- - {onCreateTask && ( - - )} -
+ {/* Espacement supérieur */} +
{/* Board tech dark */} @@ -139,7 +113,7 @@ export function KanbanBoard({ tasks, onCreateTask, onDeleteTask, onEditTask, onU key={column.id} id={column.id} tasks={column.tasks} - onCreateTask={onCreateTask ? handleCreateTask : undefined} + onCreateTask={onCreateTask} onDeleteTask={onDeleteTask} onEditTask={onEditTask} onUpdateTitle={onUpdateTitle} @@ -148,15 +122,6 @@ export function KanbanBoard({ tasks, onCreateTask, onDeleteTask, onEditTask, onU ))}
- {/* Modal de création */} - {onCreateTask && ( - setIsCreateModalOpen(false)} - onSubmit={handleCreateTask} - loading={loading} - /> - )}
{/* Overlay pour le drag & drop */} diff --git a/components/kanban/BoardContainer.tsx b/components/kanban/BoardContainer.tsx index 0c049ec..be0eb4f 100644 --- a/components/kanban/BoardContainer.tsx +++ b/components/kanban/BoardContainer.tsx @@ -9,7 +9,7 @@ import { KanbanFilters } from './KanbanFilters'; import { EditTaskForm } from '@/components/forms/EditTaskForm'; import { useTasksContext } from '@/contexts/TasksContext'; import { Task, TaskStatus } from '@/lib/types'; -import { UpdateTaskData } from '@/clients/tasks-client'; +import { UpdateTaskData, CreateTaskData } from '@/clients/tasks-client'; import { useColumnVisibility } from '@/hooks/useColumnVisibility'; import { getAllStatuses } from '@/lib/status-config'; @@ -67,6 +67,11 @@ export function KanbanBoardContainer({ // Obtenir le nom du tag épinglé pour l'affichage const pinnedTagName = tags.find(tag => tag.isPinned)?.name; + // Wrapper pour adapter le type de createTask + const handleCreateTask = async (data: CreateTaskData): Promise => { + await createTask(data); + }; + return ( <> {/* Barre de filtres - conditionnelle */} @@ -95,7 +100,7 @@ export function KanbanBoardContainer({ kanbanFilters.swimlanesMode === 'priority' ? ( diff --git a/components/kanban/PrioritySwimlanesBoard.tsx b/components/kanban/PrioritySwimlanesBoard.tsx index b3c9803..89341e8 100644 --- a/components/kanban/PrioritySwimlanesBoard.tsx +++ b/components/kanban/PrioritySwimlanesBoard.tsx @@ -8,7 +8,7 @@ import { SwimlanesBase, SwimlaneData } from './SwimlanesBase'; interface PrioritySwimlanesoardProps { tasks: Task[]; - onCreateTask?: (data: CreateTaskData) => Promise; + onCreateTask?: (data: CreateTaskData) => Promise; onDeleteTask?: (taskId: string) => Promise; onEditTask?: (task: Task) => void; onUpdateTitle?: (taskId: string, newTitle: string) => Promise; @@ -64,7 +64,6 @@ export function PrioritySwimlanesBoard({ return ( ); } \ No newline at end of file diff --git a/components/kanban/SwimlanesBase.tsx b/components/kanban/SwimlanesBase.tsx index dae6b76..d0fba48 100644 --- a/components/kanban/SwimlanesBase.tsx +++ b/components/kanban/SwimlanesBase.tsx @@ -3,8 +3,6 @@ import { Task, TaskStatus } from '@/lib/types'; import { TaskCard } from './TaskCard'; import { QuickAddTask } from './QuickAddTask'; -import { CreateTaskForm } from '@/components/forms/CreateTaskForm'; -import { Button } from '@/components/ui/Button'; import { CreateTaskData } from '@/clients/tasks-client'; import { useState } from 'react'; import { useColumnVisibility } from '@/hooks/useColumnVisibility'; @@ -115,21 +113,18 @@ export interface SwimlaneData { interface SwimlanesBaseProps { tasks: Task[]; - title: string; swimlanes: SwimlaneData[]; - onCreateTask?: (data: CreateTaskData) => Promise; + 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, @@ -137,12 +132,10 @@ export function SwimlanesBase({ onUpdateTitle, onUpdateStatus, compactView = false, - visibleStatuses, - loading = false + visibleStatuses }: 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 @@ -194,12 +187,6 @@ export function SwimlanesBase({ }; // 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) { @@ -220,24 +207,8 @@ export function SwimlanesBase({ onDragEnd={handleDragEnd} >
- {/* Header */} -
-
-

- {title} -

- - {onCreateTask && ( - - )} -
-
+ {/* Espacement supérieur */} +
{/* Headers des colonnes visibles */} @@ -341,15 +312,6 @@ 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 39ffc5c..4af187d 100644 --- a/components/kanban/SwimlanesBoard.tsx +++ b/components/kanban/SwimlanesBoard.tsx @@ -8,7 +8,7 @@ import { SwimlanesBase, SwimlaneData } from './SwimlanesBase'; interface SwimlanesboardProps { tasks: Task[]; - onCreateTask?: (data: CreateTaskData) => Promise; + onCreateTask?: (data: CreateTaskData) => Promise; onDeleteTask?: (taskId: string) => Promise; onEditTask?: (task: Task) => void; onUpdateTitle?: (taskId: string, newTitle: string) => Promise; @@ -84,7 +84,6 @@ export function SwimlanesBoard({ return ( ); } \ No newline at end of file