diff --git a/client/src/components/tasks/TaskForm.tsx b/client/src/components/tasks/TaskForm.tsx index 20ef8b5..81a17c3 100644 --- a/client/src/components/tasks/TaskForm.tsx +++ b/client/src/components/tasks/TaskForm.tsx @@ -31,7 +31,7 @@ const taskFormSchema = z.object({ title: z.string().min(1, "Le titre est requis"), description: z.string().optional(), priority: z.enum(["low", "medium", "high"]).default("medium"), - status: z.enum(["backlog", "todo", "in_progress", "review", "testing", "done", "archived"]).default("todo"), + status: z.enum(["backlog", "todo", "in_progress", "review", "testing", "blocked", "ready_to_deploy", "deployed", "done", "archived"]).default("todo"), assignedTo: z.string().min(1, "L'assignation est requise"), dueDate: z.date().optional(), }); @@ -118,7 +118,7 @@ export default function TaskForm({ task, onClose }: TaskFormProps) { title: task?.title || "", description: task?.description || "", priority: (task?.priority as "low" | "medium" | "high") || "medium", - status: (task?.status as "backlog" | "todo" | "in_progress" | "review" | "testing" | "done" | "archived") || "todo", + status: (task?.status as "backlog" | "todo" | "in_progress" | "review" | "testing" | "blocked" | "ready_to_deploy" | "deployed" | "done" | "archived") || "todo", assignedTo: task?.assignedTo || "", dueDate: task?.dueDate ? new Date(task.dueDate) : undefined, }, @@ -351,6 +351,9 @@ export default function TaskForm({ task, onClose }: TaskFormProps) { En cours Révision Test + Bloqué + Prêt Déploiement + Déployé Terminé Archivé diff --git a/client/src/pages/Tasks.tsx b/client/src/pages/Tasks.tsx index 5c65890..54fcc45 100644 --- a/client/src/pages/Tasks.tsx +++ b/client/src/pages/Tasks.tsx @@ -499,6 +499,9 @@ export default function Tasks() { En cours Révision Test + Bloqué + Prêt Déploiement + Déployé Terminé Archivé @@ -550,9 +553,9 @@ export default function Tasks() { {/* Contenu selon la vue sélectionnée */} - {/* Vue Kanban avec 7 colonnes */} + {/* Vue Kanban avec 10 colonnes - Workflow complet */}
-
+
{/* Colonne Backlog */}

@@ -606,7 +609,7 @@ export default function Tasks() {

{/* Colonne Test */} -
+

Test ({filteredTasks.filter((task: TaskWithRelations) => task.status === 'testing').length}) @@ -618,8 +621,47 @@ export default function Tasks() {

+ {/* Colonne Bloqué */} +
+

+ + Bloqué ({filteredTasks.filter((task: TaskWithRelations) => task.status === 'blocked').length}) +

+
+ {filteredTasks.filter((task: TaskWithRelations) => task.status === 'blocked').map((task: TaskWithRelations) => { + return renderKanbanCard(task, canEditTasks); + })} +
+
+ + {/* Colonne Prêt Déploiement */} +
+

+ + Prêt Déploiement ({filteredTasks.filter((task: TaskWithRelations) => task.status === 'ready_to_deploy').length}) +

+
+ {filteredTasks.filter((task: TaskWithRelations) => task.status === 'ready_to_deploy').map((task: TaskWithRelations) => { + return renderKanbanCard(task, canEditTasks); + })} +
+
+ + {/* Colonne Déployé */} +
+

+ + Déployé ({filteredTasks.filter((task: TaskWithRelations) => task.status === 'deployed').length}) +

+
+ {filteredTasks.filter((task: TaskWithRelations) => task.status === 'deployed').map((task: TaskWithRelations) => { + return renderKanbanCard(task, canEditTasks); + })} +
+
+ {/* Colonne Terminé */} -
+

Terminé ({filteredTasks.filter((task: TaskWithRelations) => task.status === 'done').length}) @@ -632,7 +674,7 @@ export default function Tasks() {

{/* Colonne Archivé */} -
+

Archivé ({filteredTasks.filter((task: TaskWithRelations) => task.status === 'archived').length}) @@ -693,7 +735,10 @@ export default function Tasks() { task.status === 'todo' ? 'À faire' : task.status === 'in_progress' ? 'En cours' : task.status === 'review' ? 'Révision' : - task.status === 'testing' ? 'Test' : task.status} + task.status === 'testing' ? 'Test' : + task.status === 'blocked' ? 'Bloqué' : + task.status === 'ready_to_deploy' ? 'Prêt Déploiement' : + task.status === 'deployed' ? 'Déployé' : task.status}

@@ -868,103 +913,7 @@ export default function Tasks() {
- - {/* Vue Kanban */} -
-
- {/* Colonne Backlog */} -
-

- - Backlog ({filteredTasks.filter((task: TaskWithRelations) => task.status === 'backlog').length}) -

-
- {filteredTasks.filter((task: TaskWithRelations) => task.status === 'backlog').map((task: TaskWithRelations) => { - return renderKanbanCard(task, canEditTasks); - })} -
-
- {/* Colonne À faire */} -
-

- - À faire ({filteredTasks.filter((task: TaskWithRelations) => task.status === 'todo').length}) -

-
- {filteredTasks.filter((task: TaskWithRelations) => task.status === 'todo').map((task: TaskWithRelations) => { - return renderKanbanCard(task, canEditTasks); - })} -
-
- - {/* Colonne En cours */} -
-

- - En cours ({filteredTasks.filter((task: TaskWithRelations) => task.status === 'in_progress').length}) -

-
- {filteredTasks.filter((task: TaskWithRelations) => task.status === 'in_progress').map((task: TaskWithRelations) => { - return renderKanbanCard(task, canEditTasks); - })} -
-
- - {/* Colonne Révision */} -
-

- - Révision ({filteredTasks.filter((task: TaskWithRelations) => task.status === 'review').length}) -

-
- {filteredTasks.filter((task: TaskWithRelations) => task.status === 'review').map((task: TaskWithRelations) => { - return renderKanbanCard(task, canEditTasks); - })} -
-
- - {/* Colonne Test */} -
-

- - Test ({filteredTasks.filter((task: TaskWithRelations) => task.status === 'testing').length}) -

-
- {filteredTasks.filter((task: TaskWithRelations) => task.status === 'testing').map((task: TaskWithRelations) => { - return renderKanbanCard(task, canEditTasks); - })} -
-
- - {/* Colonne Terminé */} -
-

- - Terminé ({filteredTasks.filter((task: TaskWithRelations) => task.status === 'done').length}) -

-
- {filteredTasks.filter((task: TaskWithRelations) => task.status === 'done').map((task: TaskWithRelations) => { - return renderKanbanCard(task, canEditTasks, true); - })} -
-
- - {/* Colonne Archivé */} -
-

- - Archivé ({filteredTasks.filter((task: TaskWithRelations) => task.status === 'archived').length}) -

-
- {filteredTasks.filter((task: TaskWithRelations) => task.status === 'archived').map((task: TaskWithRelations) => { - return renderKanbanCard(task, canEditTasks, true); - })} -
-
-
-
-
diff --git a/shared/schema.ts b/shared/schema.ts index e78fa91..b2b2baf 100644 --- a/shared/schema.ts +++ b/shared/schema.ts @@ -245,7 +245,7 @@ export const tasks = pgTable("tasks", { description: text("description"), // Description de la tâche (optionnel) dueDate: timestamp("due_date"), // Date d'échéance (optionnel) priority: varchar("priority").notNull().default("medium"), // low, medium, high - status: varchar("status").notNull().default("todo"), // backlog, todo, in_progress, review, testing, done, archived + status: varchar("status").notNull().default("todo"), // backlog, todo, in_progress, review, testing, blocked, ready_to_deploy, deployed, done, archived assignedTo: text("assigned_to").notNull(), // Utilisateur responsable (champ libre) createdBy: varchar("created_by").notNull(), // Utilisateur créateur groupId: integer("group_id").notNull(), // Magasin/groupe associé