feat(enhanced-kanban): add start and end date updates for tasks in task drawer
- Implemented actions to update task start and end dates within the enhanced Kanban feature, ensuring real-time synchronization when the task drawer is used. - Enhanced task drawer components to dispatch updates to the enhanced Kanban state based on the current tab, specifically when on the board tab. - Improved state management for task date properties, allowing for better handling of task updates across different views.
This commit is contained in:
@@ -14,6 +14,8 @@ import { ITaskViewModel } from '@/types/tasks/task.types';
|
|||||||
import { IProjectTask } from '@/types/project/projectTasksViewModel.types';
|
import { IProjectTask } from '@/types/project/projectTasksViewModel.types';
|
||||||
import { useAppDispatch } from '@/hooks/useAppDispatch';
|
import { useAppDispatch } from '@/hooks/useAppDispatch';
|
||||||
import { setStartDate, setTaskEndDate } from '@/features/task-drawer/task-drawer.slice';
|
import { setStartDate, setTaskEndDate } from '@/features/task-drawer/task-drawer.slice';
|
||||||
|
import { updateEnhancedKanbanTaskStartDate, updateEnhancedKanbanTaskEndDate } from '@/features/enhanced-kanban/enhanced-kanban.slice';
|
||||||
|
import useTabSearchParam from '@/hooks/useTabSearchParam';
|
||||||
interface TaskDrawerDueDateProps {
|
interface TaskDrawerDueDateProps {
|
||||||
task: ITaskViewModel;
|
task: ITaskViewModel;
|
||||||
t: TFunction;
|
t: TFunction;
|
||||||
@@ -24,6 +26,7 @@ const TaskDrawerDueDate = ({ task, t, form }: TaskDrawerDueDateProps) => {
|
|||||||
const { socket } = useSocket();
|
const { socket } = useSocket();
|
||||||
const [isShowStartDate, setIsShowStartDate] = useState(false);
|
const [isShowStartDate, setIsShowStartDate] = useState(false);
|
||||||
const dispatch = useAppDispatch();
|
const dispatch = useAppDispatch();
|
||||||
|
const { tab } = useTabSearchParam();
|
||||||
// Date handling
|
// Date handling
|
||||||
const startDayjs = task?.start_date ? dayjs(task.start_date) : null;
|
const startDayjs = task?.start_date ? dayjs(task.start_date) : null;
|
||||||
const dueDayjs = task?.end_date ? dayjs(task.end_date) : null;
|
const dueDayjs = task?.end_date ? dayjs(task.end_date) : null;
|
||||||
@@ -63,6 +66,10 @@ const TaskDrawerDueDate = ({ task, t, form }: TaskDrawerDueDateProps) => {
|
|||||||
(data: IProjectTask) => {
|
(data: IProjectTask) => {
|
||||||
dispatch(setStartDate(data));
|
dispatch(setStartDate(data));
|
||||||
|
|
||||||
|
// Also update enhanced kanban if on board tab
|
||||||
|
if (tab === 'board') {
|
||||||
|
dispatch(updateEnhancedKanbanTaskStartDate({ task: data }));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -88,6 +95,10 @@ const TaskDrawerDueDate = ({ task, t, form }: TaskDrawerDueDateProps) => {
|
|||||||
(data: IProjectTask) => {
|
(data: IProjectTask) => {
|
||||||
dispatch(setTaskEndDate(data));
|
dispatch(setTaskEndDate(data));
|
||||||
|
|
||||||
|
// Also update enhanced kanban if on board tab
|
||||||
|
if (tab === 'board') {
|
||||||
|
dispatch(updateEnhancedKanbanTaskEndDate({ task: data }));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -794,6 +794,104 @@ const enhancedKanbanSlice = createSlice({
|
|||||||
state.groupCache[sectionId] = group;
|
state.groupCache[sectionId] = group;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Enhanced Kanban end date update (for use in task drawer and socket events)
|
||||||
|
updateEnhancedKanbanTaskEndDate: (
|
||||||
|
state,
|
||||||
|
action: PayloadAction<{
|
||||||
|
task: IProjectTask;
|
||||||
|
}>
|
||||||
|
) => {
|
||||||
|
const { task } = action.payload;
|
||||||
|
|
||||||
|
// Find the task and update it
|
||||||
|
const result = findTaskInAllGroups(state.taskGroups, task.id || '');
|
||||||
|
if (result) {
|
||||||
|
result.task.end_date = task.end_date;
|
||||||
|
// Update cache
|
||||||
|
state.taskCache[task.id!] = result.task;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Enhanced Kanban start date update (for use in task drawer and socket events)
|
||||||
|
updateEnhancedKanbanTaskStartDate: (
|
||||||
|
state,
|
||||||
|
action: PayloadAction<{
|
||||||
|
task: IProjectTask;
|
||||||
|
}>
|
||||||
|
) => {
|
||||||
|
const { task } = action.payload;
|
||||||
|
|
||||||
|
// Find the task and update it
|
||||||
|
const result = findTaskInAllGroups(state.taskGroups, task.id || '');
|
||||||
|
if (result) {
|
||||||
|
result.task.start_date = task.start_date;
|
||||||
|
// Update cache
|
||||||
|
state.taskCache[task.id!] = result.task;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Enhanced Kanban subtask update (for use in task drawer and socket events)
|
||||||
|
updateEnhancedKanbanSubtask: (
|
||||||
|
state,
|
||||||
|
action: PayloadAction<{
|
||||||
|
sectionId: string;
|
||||||
|
subtask: IProjectTask;
|
||||||
|
mode: 'add' | 'delete';
|
||||||
|
}>
|
||||||
|
) => {
|
||||||
|
const { sectionId, subtask, mode } = action.payload;
|
||||||
|
const parentTaskId = subtask?.parent_task_id || null;
|
||||||
|
|
||||||
|
if (!parentTaskId) return;
|
||||||
|
|
||||||
|
// Function to update a task with a new subtask
|
||||||
|
const updateTaskWithSubtask = (task: IProjectTask): boolean => {
|
||||||
|
if (!task) return false;
|
||||||
|
|
||||||
|
// Initialize sub_tasks array if it doesn't exist
|
||||||
|
if (!task.sub_tasks) {
|
||||||
|
task.sub_tasks = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode === 'add') {
|
||||||
|
// Increment subtask count
|
||||||
|
task.sub_tasks_count = (task.sub_tasks_count || 0) + 1;
|
||||||
|
|
||||||
|
// Add the subtask
|
||||||
|
task.sub_tasks.push({ ...subtask });
|
||||||
|
} else {
|
||||||
|
// Remove the subtask
|
||||||
|
task.sub_tasks = task.sub_tasks.filter(t => t.id !== subtask.id);
|
||||||
|
task.sub_tasks_count = Math.max(0, (task.sub_tasks_count || 1) - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update cache
|
||||||
|
state.taskCache[task.id!] = task;
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
// First try to find the task in the specified section
|
||||||
|
if (sectionId) {
|
||||||
|
const section = state.taskGroups.find(sec => sec.id === sectionId);
|
||||||
|
if (section) {
|
||||||
|
const task = section.tasks.find(task => task.id === parentTaskId);
|
||||||
|
if (task && updateTaskWithSubtask(task)) {
|
||||||
|
// Update group cache
|
||||||
|
state.groupCache[sectionId] = section;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If not found in the specified section, try all groups
|
||||||
|
const result = findTaskInAllGroups(state.taskGroups, parentTaskId);
|
||||||
|
if (result) {
|
||||||
|
updateTaskWithSubtask(result.task);
|
||||||
|
// Update group cache
|
||||||
|
state.groupCache[result.groupId] = result.group;
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
extraReducers: (builder) => {
|
extraReducers: (builder) => {
|
||||||
builder
|
builder
|
||||||
@@ -926,6 +1024,9 @@ export const {
|
|||||||
updateEnhancedKanbanTaskLabels,
|
updateEnhancedKanbanTaskLabels,
|
||||||
updateEnhancedKanbanTaskProgress,
|
updateEnhancedKanbanTaskProgress,
|
||||||
updateEnhancedKanbanTaskName,
|
updateEnhancedKanbanTaskName,
|
||||||
|
updateEnhancedKanbanTaskEndDate,
|
||||||
|
updateEnhancedKanbanTaskStartDate,
|
||||||
|
updateEnhancedKanbanSubtask,
|
||||||
} = enhancedKanbanSlice.actions;
|
} = enhancedKanbanSlice.actions;
|
||||||
|
|
||||||
export default enhancedKanbanSlice.reducer;
|
export default enhancedKanbanSlice.reducer;
|
||||||
Reference in New Issue
Block a user