fix broken multi-select after reordering

Hunter
Thursday, June 4th, 2026 at 2:18 PM

resources/multi-select.js+18-3

resources/multi-select.js
 14  	return state.currentTask.subtasks.filter(t => state.multiSelectedIds.includes(t.id));
 15  }
 16  
 17 +// id of the currently-focused selected task, or anchor if focus isn't on one;
 18 +// extendMultiSelect needs focus on the selection's moving edge after a move
 19 +function getFocusedSelectedId() {
 20 +	var container = document.activeElement ? document.activeElement.closest('.task-container') : null;
 21 +	var id = container ? container.getAttribute('data-id') : null;
 22 +	return state.multiSelectedIds.includes(id) ? id : state.multiSelectAnchorId;
 23 +}
 24 +
 25  function applyMultiSelectHighlights() {
 26  	for (var id of state.multiSelectedIds) {
 27  		var container = document.querySelector(`.task-container[data-id="${id}"]`);

 83  	var selected = getMultiSelectedTasks();
 84  	if (selected.length === 0) return false;
 85  
 86 +	// keep focus on the edge that was focused, so a follow-up extend/contract still works
 87 +	var refocusId = getFocusedSelectedId();
 88 +
 89  	var subtasks = state.currentTask.subtasks;
 90  	var indices = selected.map(t => subtasks.findIndex(s => s.id === t.id)).sort((a, b) => a - b);
 91  	var topIndex = indices[0];

 98  	var insertAt = direction === 'up' ? topIndex - 1 : topIndex + 1;
 99  	subtasks.splice(insertAt, 0, ...chunk);
100  
    -	state.currentTask.selectedSubtaskId = state.multiSelectAnchorId;
101 +	state.currentTask.selectedSubtaskId = refocusId;
102  	renderCurrentView();
103  	applyMultiSelectHighlights();
104  	scheduleSave();

109  	var selected = getMultiSelectedTasks();
110  	if (selected.length === 0) return false;
111  
112 +	var refocusId = getFocusedSelectedId();
113 +
114  	if (navigate) {
115  		document.documentElement.style.scrollBehavior = 'auto';
116  	}

136  	for (var t of chunk) {
137  		adjustMovedTaskState(t, targetTask);
138  	}
    -	targetTask.selectedSubtaskId = state.multiSelectAnchorId;
139 +	targetTask.selectedSubtaskId = refocusId;
140  	updateTaskAndAncestors(state.currentTask);
141  	updateTaskAndAncestors(targetTask);
142  

163  	var selected = getMultiSelectedTasks();
164  	if (selected.length === 0) return false;
165  
166 +	var refocusId = getFocusedSelectedId();
167 +
168  	if (navigate) {
169  		document.documentElement.style.scrollBehavior = 'auto';
170  	}

192  	if (navigate || currentParent.subtasks.length === 0) {
193  		state.taskPath.pop();
194  		state.currentTask = state.taskPath[state.taskPath.length - 1];
    -		state.currentTask.selectedSubtaskId = state.multiSelectAnchorId;
195 +		state.currentTask.selectedSubtaskId = refocusId;
196  		updateBreadcrumbs(state.currentTask);
197  		renderCurrentView();
198  		applyMultiSelectHighlights();