reorganize.js (3.2 KB)
1 // Reorganize: single-task move, push, and pull operations 2 3 function moveSubtask(subtask, direction) { 4 if (subtask === state.currentTask) return false; 5 6 var parentTask = findParentTask(subtask); 7 if (!parentTask) return false; 8 9 var index = parentTask.subtasks.findIndex(t => t.id === subtask.id); 10 if (index === -1) return false; 11 12 if (direction === 'up' && index > 0) { 13 [parentTask.subtasks[index - 1], parentTask.subtasks[index]] = [parentTask.subtasks[index], parentTask.subtasks[index - 1]]; 14 } else if (direction === 'down' && index < parentTask.subtasks.length - 1) { 15 [parentTask.subtasks[index], parentTask.subtasks[index + 1]] = [parentTask.subtasks[index + 1], parentTask.subtasks[index]]; 16 } else { 17 return false; 18 } 19 20 renderCurrentView(); 21 selectAndFocusTask(subtask); 22 scheduleSave(); 23 return true; 24 } 25 26 function pushSubtaskIntoTarget(subtask, direction, navigate = false) { 27 if (subtask === state.currentTask) return false; 28 29 if (navigate) { 30 document.documentElement.style.scrollBehavior = 'auto'; 31 } 32 33 var parentTask = findParentTask(subtask); 34 if (!parentTask) return false; 35 36 var index = parentTask.subtasks.findIndex(t => t.id === subtask.id); 37 if (index === -1) return false; 38 39 var targetTask = null; 40 if (direction === 'up' && index > 0) { 41 targetTask = parentTask.subtasks[index - 1]; 42 } else if (direction === 'down' && index < parentTask.subtasks.length - 1) { 43 targetTask = parentTask.subtasks[index + 1]; 44 } 45 46 if (!targetTask) return false; 47 48 parentTask.subtasks.splice(index, 1); 49 targetTask.subtasks.unshift(subtask); 50 targetTask.selectedSubtaskId = subtask.id; 51 52 adjustMovedTaskState(subtask, targetTask); 53 updateTaskAndAncestors(parentTask); 54 updateTaskAndAncestors(targetTask); 55 56 if (navigate) { 57 navigateIntoTaskAndSelectSubtask(targetTask, subtask); 58 } else { 59 renderCurrentView(); 60 selectAndFocusTask(targetTask); 61 } 62 63 scheduleSave(); 64 return true; 65 } 66 67 function pullSubtaskOutLayer(subtask, navigate = false) { 68 if (subtask === state.currentTask) return false; 69 if (state.taskPath.length <= 1) return false; 70 71 if (navigate) { 72 document.documentElement.style.scrollBehavior = 'auto'; 73 } 74 75 var currentParent = findParentTask(subtask); 76 if (!currentParent) return; 77 78 var grandParent = findParentTask(currentParent); 79 if (!grandParent) return; 80 81 var currentIndex = currentParent.subtasks.findIndex(t => t.id === subtask.id); 82 if (currentIndex === -1) return; 83 currentParent.subtasks.splice(currentIndex, 1); 84 85 var currentParentIndex = grandParent.subtasks.findIndex(t => t.id === currentParent.id); 86 if (currentParentIndex === -1) { 87 grandParent.subtasks.push(subtask); 88 } else { 89 grandParent.subtasks.splice(currentParentIndex + 1, 0, subtask); 90 } 91 92 adjustMovedTaskState(subtask, grandParent); 93 updateTaskAndAncestors(currentParent); 94 updateTaskAndAncestors(grandParent); 95 96 if (navigate || (currentParent.subtasks.length === 0 && state.taskPath.length > 1)) { 97 navigateToParentTaskAndSelectTask(subtask); 98 } else { 99 renderCurrentView(); 100 if (currentParent.subtasks.length > 0) { 101 var targetIndex = Math.max(0, currentIndex - 1); 102 selectAndFocusTask(currentParent.subtasks[targetIndex]); 103 } else { 104 selectAndFocusTask(currentParent); 105 } 106 } 107 108 scheduleSave(); 109 return true; 110 }