diff --git a/worklenz-frontend/src/components/task-drawer/task-drawer-header/task-drawer-header.tsx b/worklenz-frontend/src/components/task-drawer/task-drawer-header/task-drawer-header.tsx index 735544ea..a41f56c0 100644 --- a/worklenz-frontend/src/components/task-drawer/task-drawer-header/task-drawer-header.tsx +++ b/worklenz-frontend/src/components/task-drawer/task-drawer-header/task-drawer-header.tsx @@ -19,6 +19,7 @@ import { deleteBoardTask, updateTaskName } from '@/features/board/board-slice'; import { updateEnhancedKanbanTaskName } from '@/features/enhanced-kanban/enhanced-kanban.slice'; import useTabSearchParam from '@/hooks/useTabSearchParam'; import { IProjectTask } from '@/types/project/projectTasksViewModel.types'; +import { ITaskViewModel } from '@/types/tasks/task.types'; type TaskDrawerHeaderProps = { inputRef: React.RefObject; @@ -89,22 +90,6 @@ const TaskDrawerHeader = ({ inputRef, t }: TaskDrawerHeaderProps) => { }, ]; - const handleReceivedTaskNameChange = (data: { - id: string; - parent_task: string; - name: string; - }) => { - if (data.id === selectedTaskId) { - const taskData = { ...data, manual_progress: false } as IProjectTask; - dispatch(updateTaskName({ task: taskData })); - - // Also update enhanced kanban if on board tab - if (tab === 'board') { - dispatch(updateEnhancedKanbanTaskName({ task: taskData })); - } - } - }; - const handleInputBlur = () => { setIsEditing(false); if ( @@ -124,9 +109,8 @@ const TaskDrawerHeader = ({ inputRef, t }: TaskDrawerHeaderProps) => { parent_task: taskFormViewModel?.task?.parent_task_id, }) ); - socket?.once(SocketEvents.TASK_NAME_CHANGE.toString(), (data: any) => { - handleReceivedTaskNameChange(data); - }); + // Note: Real-time updates are handled by the global useTaskSocketHandlers hook + // No need for local socket listeners that could interfere with global handlers }; return ( diff --git a/worklenz-frontend/src/hooks/useTaskSocketHandlers.ts b/worklenz-frontend/src/hooks/useTaskSocketHandlers.ts index cbcb46c1..cf857653 100644 --- a/worklenz-frontend/src/hooks/useTaskSocketHandlers.ts +++ b/worklenz-frontend/src/hooks/useTaskSocketHandlers.ts @@ -243,10 +243,64 @@ export const useTaskSocketHandlers = () => { // Find current group containing the task const currentGroup = groups.find(group => group.taskIds.includes(response.id)); - // Find target group based on new status value (not UUID) - const targetGroup = groups.find(group => group.groupValue === newStatusValue); + // Find target group based on new status value with multiple matching strategies + let targetGroup = groups.find(group => group.groupValue === newStatusValue); + + // If not found, try case-insensitive matching + if (!targetGroup) { + targetGroup = groups.find(group => + group.groupValue?.toLowerCase() === newStatusValue.toLowerCase() + ); + } + + // If still not found, try matching with title + if (!targetGroup) { + targetGroup = groups.find(group => + group.title?.toLowerCase() === newStatusValue.toLowerCase() + ); + } + + // If still not found, try matching common status patterns + if (!targetGroup && newStatusValue === 'todo') { + targetGroup = groups.find(group => + group.title?.toLowerCase().includes('todo') || + group.title?.toLowerCase().includes('to do') || + group.title?.toLowerCase().includes('pending') || + group.groupValue?.toLowerCase().includes('todo') + ); + } else if (!targetGroup && newStatusValue === 'doing') { + targetGroup = groups.find(group => + group.title?.toLowerCase().includes('doing') || + group.title?.toLowerCase().includes('progress') || + group.title?.toLowerCase().includes('active') || + group.groupValue?.toLowerCase().includes('doing') + ); + } else if (!targetGroup && newStatusValue === 'done') { + targetGroup = groups.find(group => + group.title?.toLowerCase().includes('done') || + group.title?.toLowerCase().includes('complete') || + group.title?.toLowerCase().includes('finish') || + group.groupValue?.toLowerCase().includes('done') + ); + } + + console.log('🔄 Status change group movement debug:', { + taskId: response.id, + newStatusValue, + currentGroupId: currentGroup?.id, + currentGroupValue: currentGroup?.groupValue, + currentGroupTitle: currentGroup?.title, + targetGroupId: targetGroup?.id, + targetGroupValue: targetGroup?.groupValue, + targetGroupTitle: targetGroup?.title, + allGroups: groups.map(g => ({ id: g.id, title: g.title, groupValue: g.groupValue })) + }); if (currentGroup && targetGroup && currentGroup.id !== targetGroup.id) { + console.log('✅ Moving task between groups:', { + from: currentGroup.title, + to: targetGroup.title + }); // Use the action to move task between groups dispatch( moveTaskBetweenGroups({ @@ -255,8 +309,12 @@ export const useTaskSocketHandlers = () => { targetGroupId: targetGroup.id, }) ); + } else if (!targetGroup) { + console.log('❌ Target group not found for status:', newStatusValue); + } else if (!currentGroup) { + console.log('❌ Current group not found for task:', response.id); } else { - console.log('🔧 No group movement needed for status change'); + console.log('🔧 No group movement needed - task already in correct group'); } } else { console.log('🔧 Not grouped by status, skipping group movement'); @@ -628,7 +686,21 @@ export const useTaskSocketHandlers = () => { const handleTaskDescriptionChange = useCallback( (data: { id: string; parent_task: string; description: string }) => { if (!data) return; + + // Update the old task slice (for backward compatibility) dispatch(updateTaskDescription(data)); + + // Update task-management slice for task-list-v2 components + const currentTask = store.getState().taskManagement.entities[data.id]; + if (currentTask) { + const updatedTask: Task = { + ...currentTask, + description: data.description, + updatedAt: new Date().toISOString(), + updated_at: new Date().toISOString(), + }; + dispatch(updateTask(updatedTask)); + } }, [dispatch] );