From 4e8a2c8397113c2f8b81a15286c5186d2516a02b Mon Sep 17 00:00:00 2001 From: leex279 Date: Sat, 13 Sep 2025 13:07:22 +0200 Subject: [PATCH 1/8] feat: decouple task priority from task order MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This implements a dedicated priority system that operates independently from the existing task_order system, allowing users to set task priority without affecting visual drag-and-drop positioning. ## Changes Made ### Database - Add priority column to archon_tasks table with enum type (critical, high, medium, low) - Create database migration with safe enum handling and data backfill - Add proper indexing for performance ### Backend - Update UpdateTaskRequest to include priority field - Add priority validation in TaskService with enum checking - Include priority field in task list responses and ETag generation - Fix cache invalidation for priority updates ### Frontend - Update TaskPriority type from "urgent" to "critical" for consistency - Add changePriority method to useTaskActions hook - Update TaskCard to use direct priority field instead of task_order conversion - Update TaskEditModal priority form to use direct priority values - Fix TaskPriorityComponent to use correct priority enum values - Update buildTaskUpdates to include priority field changes - Add priority field to Task interface as required field - Update test fixtures to include priority field ## Key Features - ✅ Users can change task priority without affecting drag-and-drop order - ✅ Users can drag tasks to reorder without changing priority level - ✅ Priority persists correctly in database with dedicated column - ✅ All existing priority functionality continues working identically - ✅ Cache invalidation works properly for priority changes - ✅ Both TaskCard priority button and TaskEditModal priority work 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../projects/tasks/components/TaskCard.tsx | 32 +++++++------ .../tasks/components/TaskEditModal.tsx | 9 ++-- .../tasks/components/TaskPriority.tsx | 15 +++--- .../projects/tasks/components/index.ts | 2 +- .../tasks/hooks/tests/useTaskQueries.test.ts | 3 ++ .../projects/tasks/hooks/useTaskActions.ts | 14 +++++- .../projects/tasks/hooks/useTaskEditor.ts | 1 + .../projects/tasks/services/taskService.ts | 5 +- .../features/projects/tasks/types/hooks.ts | 3 +- .../features/projects/tasks/types/priority.ts | 31 ++++++------ .../src/features/projects/tasks/types/task.ts | 4 +- migration/add_priority_column_to_tasks.sql | 48 +++++++++++++++++++ python/src/server/api_routes/projects_api.py | 4 ++ .../server/services/projects/task_service.py | 19 +++++++- 14 files changed, 139 insertions(+), 51 deletions(-) create mode 100644 migration/add_priority_column_to_tasks.sql diff --git a/archon-ui-main/src/features/projects/tasks/components/TaskCard.tsx b/archon-ui-main/src/features/projects/tasks/components/TaskCard.tsx index 48aa87f2e3..b116636d79 100644 --- a/archon-ui-main/src/features/projects/tasks/components/TaskCard.tsx +++ b/archon-ui-main/src/features/projects/tasks/components/TaskCard.tsx @@ -1,13 +1,13 @@ import { Tag } from "lucide-react"; import type React from "react"; -import { useCallback, useState } from "react"; +import { useCallback } from "react"; import { useDrag, useDrop } from "react-dnd"; import { useTaskActions } from "../hooks"; -import type { Assignee, Task } from "../types"; +import type { Assignee, Task, TaskPriority } from "../types"; import { getOrderColor, getOrderGlow, ItemTypes } from "../utils/task-styles"; import { TaskAssignee } from "./TaskAssignee"; import { TaskCardActions } from "./TaskCardActions"; -import { type Priority, TaskPriority } from "./TaskPriority"; +import { TaskPriorityComponent } from "."; export interface TaskCardProps { task: Task; @@ -34,12 +34,8 @@ export const TaskCard: React.FC = ({ selectedTasks, onTaskSelect, }) => { - // Local state for frontend-only priority - // NOTE: Priority is display-only and doesn't sync with backend yet - const [localPriority, setLocalPriority] = useState("medium"); - - // Use business logic hook - const { changeAssignee, isUpdating } = useTaskActions(projectId); + // Use business logic hook with changePriority + const { changeAssignee, changePriority, isUpdating } = useTaskActions(projectId); // Handlers - now just call hook methods const handleEdit = useCallback(() => { @@ -59,10 +55,12 @@ export const TaskCard: React.FC = ({ } }, [onDelete, task]); - const handlePriorityChange = useCallback((priority: Priority) => { - // Frontend-only priority change - setLocalPriority(priority); - }, []); + const handlePriorityChange = useCallback( + (priority: TaskPriority) => { + changePriority(task.id, priority); + }, + [changePriority, task.id], + ); const handleAssigneeChange = useCallback( (newAssignee: Assignee) => { @@ -218,8 +216,12 @@ export const TaskCard: React.FC = ({
- {/* Priority display (frontend-only for now) */} - + {/* Priority display connected to database */} +
diff --git a/archon-ui-main/src/features/projects/tasks/components/TaskEditModal.tsx b/archon-ui-main/src/features/projects/tasks/components/TaskEditModal.tsx index 7b40b51035..2f839fe9bf 100644 --- a/archon-ui-main/src/features/projects/tasks/components/TaskEditModal.tsx +++ b/archon-ui-main/src/features/projects/tasks/components/TaskEditModal.tsx @@ -18,9 +18,8 @@ import { TextArea, } from "../../../ui/primitives"; import { useTaskEditor } from "../hooks"; -import type { Assignee, Task } from "../types"; +import type { Assignee, Task, TaskPriority } from "../types"; import { FeatureSelect } from "./FeatureSelect"; -import type { Priority } from "./TaskPriority"; interface TaskEditModalProps { isModalOpen: boolean; @@ -52,7 +51,7 @@ export const TaskEditModal = memo( status: "todo", assignee: "User" as Assignee, feature: "", - priority: "medium" as Priority, // Frontend-only priority + priority: "medium" as TaskPriority, // Direct priority field }); } }, [editingTask]); @@ -133,9 +132,9 @@ export const TaskEditModal = memo( onPriorityChange(value as Priority)}> +