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 }