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 }