navigation.js (3.5 KB)
1 // Navigation: moving between tasks, navigating into/out of subtask levels 2 3 function navigateTasks(direction) { 4 var tasks = state.currentTask.subtasks; 5 var subtaskIndex = tasks.findIndex(t => t.id === state.currentTask.selectedSubtaskId); 6 7 var currentElement = document.activeElement; 8 var currentContainer = currentElement ? currentElement.closest('.task-container') : null; 9 var isParentFocused = currentContainer && currentContainer.dataset.id == state.currentTask.id; 10 11 if (direction === 'up') { 12 if (isParentFocused) { 13 // Already at parent, can't go higher 14 } else if (subtaskIndex <= 0) { 15 selectAndFocusTask(state.currentTask); 16 } else { 17 selectAndFocusTask(tasks[subtaskIndex - 1]); 18 } 19 } else { 20 if (isParentFocused) { 21 if (tasks.length > 0) { 22 selectAndFocusTask(tasks[0]); 23 } 24 } else if (subtaskIndex >= 0 && subtaskIndex < tasks.length - 1) { 25 selectAndFocusTask(tasks[subtaskIndex + 1]); 26 } 27 } 28 state.lastSubtaskDownArrowReleased = false; 29 state.lastSubtaskShiftDownReleased = false; 30 } 31 32 function navigateIntoSubtask(subtask) { 33 document.documentElement.style.scrollBehavior = 'auto'; 34 35 if (subtask.subtasks.length > 0) { 36 state.currentTask.selectedSubtaskId = subtask.id; 37 state.taskPath.push(subtask); 38 state.currentTask = subtask; 39 updateBreadcrumbs(state.currentTask); 40 renderCurrentView(); 41 var selectedSubtask = subtask.selectedSubtaskId ? 42 subtask.subtasks.find(t => t.id === subtask.selectedSubtaskId) : 43 subtask.subtasks[0]; 44 selectAndFocusTask(selectedSubtask); 45 } else { 46 addNewSubtask(subtask); 47 state.currentTask.selectedSubtaskId = subtask.id; 48 state.taskPath.push(subtask); 49 state.currentTask = subtask; 50 updateBreadcrumbs(state.currentTask); 51 renderCurrentView(); 52 selectAndFocusTask(subtask.subtasks[0]); 53 } 54 } 55 56 function navigateIntoTaskAndSelectSubtask(targetTask, subtaskToSelect) { 57 document.documentElement.style.scrollBehavior = 'auto'; 58 59 state.currentTask.selectedSubtaskId = targetTask.id; 60 61 state.taskPath.push(targetTask); 62 state.currentTask = targetTask; 63 updateBreadcrumbs(state.currentTask); 64 renderCurrentView(); 65 66 selectAndFocusTask(subtaskToSelect); 67 state.currentTask.selectedSubtaskId = subtaskToSelect.id; 68 } 69 70 function navigateToParentTask() { 71 if (state.currentTask.id === 'root') { 72 var activeTaskElement = document.querySelector('.task-container.active'); 73 if (activeTaskElement) { 74 var taskId = activeTaskElement.dataset.id; 75 applyShakeAnimation(taskId); 76 } 77 } else if (state.taskPath.length > 1) { 78 document.documentElement.style.scrollBehavior = 'auto'; 79 80 var currentTaskId = state.currentTask.id; 81 state.taskPath.pop(); 82 state.currentTask = state.taskPath[state.taskPath.length - 1]; 83 updateBreadcrumbs(state.currentTask); 84 renderCurrentView(); 85 var selectedSubtask = state.currentTask.subtasks.find(t => t.id === currentTaskId); 86 if (selectedSubtask) { 87 selectAndFocusTask(selectedSubtask); 88 } else if (state.currentTask.subtasks.length > 0) { 89 selectAndFocusTask(state.currentTask.subtasks[0]); 90 } else { 91 selectAndFocusTask(state.currentTask); 92 } 93 state.currentTask.selectedSubtaskId = currentTaskId; 94 } 95 } 96 97 function navigateToParentTaskAndSelectTask(targetTask) { 98 if (state.currentTask.id === 'root') { 99 renderCurrentView(); 100 selectAndFocusTask(targetTask); 101 } else if (state.taskPath.length > 1) { 102 document.documentElement.style.scrollBehavior = 'auto'; 103 104 state.taskPath.pop(); 105 state.currentTask = state.taskPath[state.taskPath.length - 1]; 106 updateBreadcrumbs(state.currentTask); 107 renderCurrentView(); 108 selectAndFocusTask(targetTask); 109 state.currentTask.selectedSubtaskId = targetTask.id; 110 } 111 }