diff --git a/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoardNativeDnD/EnhancedKanbanBoardNativeDnD.tsx b/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoardNativeDnD/EnhancedKanbanBoardNativeDnD.tsx index 615a48f8..ae1e3c35 100644 --- a/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoardNativeDnD/EnhancedKanbanBoardNativeDnD.tsx +++ b/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoardNativeDnD/EnhancedKanbanBoardNativeDnD.tsx @@ -147,11 +147,11 @@ const EnhancedKanbanBoardNativeDnD: React.FC<{ projectId: string }> = ({ project const targetGroup = taskGroups.find(g => g.id === targetGroupId); if (!sourceGroup || !targetGroup) return; - const taskIdx = sourceGroup.tasks.findIndex(t => t.id === draggedTaskId); if (taskIdx === -1) return; const movedTask = sourceGroup.tasks[taskIdx]; + let didStatusChange = false; if (groupBy === 'status' && movedTask.id) { if (sourceGroup.id !== targetGroup.id) { const canContinue = await checkTaskDependencyStatus(movedTask.id, targetGroupId); @@ -162,6 +162,7 @@ const EnhancedKanbanBoardNativeDnD: React.FC<{ projectId: string }> = ({ project ); return; } + didStatusChange = true; } } let insertIdx = hoveredTaskIdx; @@ -258,6 +259,18 @@ const EnhancedKanbanBoardNativeDnD: React.FC<{ projectId: string }> = ({ project team_id: teamId, }); + // Emit progress update if status changed + if (didStatusChange) { + socket.emit( + SocketEvents.TASK_STATUS_CHANGE.toString(), + JSON.stringify({ + task_id: movedTask.id, + status_id: targetGroupId, + parent_task: movedTask.parent_task_id || null, + team_id: teamId, + }) + ); + } } setDraggedTaskId(null); diff --git a/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoardNativeDnD/TaskCard.tsx b/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoardNativeDnD/TaskCard.tsx index 335008fa..fa4f0ddb 100644 --- a/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoardNativeDnD/TaskCard.tsx +++ b/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoardNativeDnD/TaskCard.tsx @@ -70,7 +70,6 @@ const TaskCard: React.FC = memo(({ const d = selectedDate || new Date(); return new Date(d.getFullYear(), d.getMonth(), 1); }); - const [showSubtasks, setShowSubtasks] = useState(false); useEffect(() => { setSelectedDate(task.end_date ? new Date(task.end_date) : null); @@ -205,11 +204,9 @@ const TaskCard: React.FC = memo(({ <>
{/* Progress circle at top right */} - {task.progress > 0 && ( -
- -
- )} +
+ +
onTaskDragStart(e, task.id!, groupId)} diff --git a/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoardNativeDnD/TaskProgressCircle.tsx b/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoardNativeDnD/TaskProgressCircle.tsx index ce393ac7..b0303b1a 100644 --- a/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoardNativeDnD/TaskProgressCircle.tsx +++ b/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoardNativeDnD/TaskProgressCircle.tsx @@ -2,7 +2,9 @@ import { IProjectTask } from "@/types/project/projectTasksViewModel.types"; // Add a simple circular progress component const TaskProgressCircle: React.FC<{ task: IProjectTask; size?: number }> = ({ task, size = 28 }) => { - const progress = task.progress ?? 0; + const progress = typeof task.complete_ratio === 'number' + ? task.complete_ratio + : (typeof task.progress === 'number' ? task.progress : 0); const strokeWidth = 1.5; const radius = (size - strokeWidth) / 2; const circumference = 2 * Math.PI * radius; @@ -22,7 +24,7 @@ const TaskProgressCircle: React.FC<{ task: IProjectTask; size?: number }> = ({ t strokeLinecap="round" style={{ transition: 'stroke-dashoffset 0.3s' }} /> - = ({ t fontWeight="bold" > {Math.round(progress)} - + } ); };