fix broken multi-select after reordering
Hunter
Thursday, June 4th, 2026 at 2:18 PM
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();