maintain text cursor position when toggling a task's checked state
Hunter
Saturday, March 7th, 2026 at 6:19 PM
687 }
688
689 function toggleTaskState(task) {
690 + // Save cursor position before re-rendering
691 + const taskInput = document.querySelector(`.task-container[data-id="${task.id}"] input[type="text"]`)
692 + const cursorPos = taskInput ? taskInput.selectionStart : null
693 +
694 if (task.state === 1) {
695 if (task.subtasks.length === 0 || !task.subtasks.every(t => t.state === 1)) {
696 task.state = 0;
702 }
703
704 renderCurrentView();
- selectAndFocusTask(task);
705 + selectAndFocusTask(task, cursorPos);
706 scheduleSave();
707 } else {
708 // disallow unchecking and play a 'shake' animation
718 }
719
720 renderCurrentView();
- selectAndFocusTask(task);
721 + selectAndFocusTask(task, cursorPos);
722 scheduleSave();
723 }
724 }
1075 scheduleSave();
1076 }
1077
- function selectAndFocusTask(task) {
1078 + function selectAndFocusTask(task, cursorPos) {
1079 const taskInput = document.querySelector(`.task-container[data-id="${task.id}"] input[type="text"]`);
1080 if (taskInput) {
1081 taskInput.focus();
- taskInput.setSelectionRange(taskInput.value.length, taskInput.value.length);
1082 + const pos = cursorPos != null ? cursorPos : taskInput.value.length
1083 + taskInput.setSelectionRange(pos, pos);
1084 setActiveTask(taskInput, task);
1085 }
1086 }