Skip to content

Commit cba48d6

Browse files
committed
fix task checks on list change
1 parent fdd536b commit cba48d6

File tree

2 files changed

+23
-18
lines changed

2 files changed

+23
-18
lines changed

site/src/pages/TasksPage/TasksPage.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,19 +63,22 @@ const TasksPage: FC = () => {
6363
const displayedTasks =
6464
tab.value === "waiting-for-input" ? idleTasks : tasksQuery.data;
6565

66-
const [checkedTasks, setCheckedTasks] = useState<Task[]>([]);
66+
const [checkedTaskIds, setCheckedTaskIds] = useState<Set<string>>(new Set());
6767
const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);
6868

69+
const checkedTasks =
70+
displayedTasks?.filter((t) => checkedTaskIds.has(t.id)) ?? [];
71+
6972
const batchActions = useBatchTaskActions({
7073
onSuccess: async () => {
7174
await tasksQuery.refetch();
72-
setCheckedTasks([]);
75+
setCheckedTaskIds(new Set());
7376
setIsDeleteDialogOpen(false);
7477
},
7578
});
7679

77-
const handleCheckChange = (checked: typeof displayedTasks) => {
78-
setCheckedTasks(Array.from(checked ?? []));
80+
const handleCheckChange = (newIds: Set<string>) => {
81+
setCheckedTaskIds(newIds);
7982
};
8083

8184
const handleBatchDelete = () => {
@@ -104,7 +107,7 @@ const TasksPage: FC = () => {
104107
// where selected tasks might no longer be visible.
105108
// biome-ignore lint/correctness/useExhaustiveDependencies: Reset on tab/filter changes.
106109
useEffect(() => {
107-
setCheckedTasks([]);
110+
setCheckedTaskIds(new Set());
108111
}, [tab.value, ownerFilter.value]);
109112

110113
return (
@@ -222,7 +225,7 @@ const TasksPage: FC = () => {
222225
tasks={displayedTasks}
223226
error={tasksQuery.error}
224227
onRetry={tasksQuery.refetch}
225-
checkedTasks={checkedTasks}
228+
checkedTaskIds={checkedTaskIds}
226229
onCheckChange={handleCheckChange}
227230
canCheckTasks={canCheckTasks}
228231
/>

site/src/pages/TasksPage/TasksTable.tsx

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,16 @@ type TasksTableProps = {
3737
tasks: readonly Task[] | undefined;
3838
error: unknown;
3939
onRetry: () => void;
40-
checkedTasks?: readonly Task[];
41-
onCheckChange?: (checkedTasks: readonly Task[]) => void;
40+
checkedTaskIds?: Set<string>;
41+
onCheckChange?: (checkedTaskIds: Set<string>) => void;
4242
canCheckTasks?: boolean;
4343
};
4444

4545
export const TasksTable: FC<TasksTableProps> = ({
4646
tasks,
4747
error,
4848
onRetry,
49-
checkedTasks = [],
49+
checkedTaskIds = new Set(),
5050
onCheckChange,
5151
canCheckTasks = false,
5252
}) => {
@@ -60,19 +60,21 @@ export const TasksTable: FC<TasksTableProps> = ({
6060
body = <TasksEmpty />;
6161
} else {
6262
body = tasks.map((task) => {
63-
const checked = checkedTasks.some((t) => t.id === task.id);
63+
const checked = checkedTaskIds.has(task.id);
6464
return (
6565
<TaskRow
6666
key={task.id}
6767
task={task}
6868
checked={checked}
69-
onCheckChange={(task, checked) => {
69+
onCheckChange={(taskId, checked) => {
7070
if (!onCheckChange) return;
71+
const newIds = new Set(checkedTaskIds);
7172
if (checked) {
72-
onCheckChange([...checkedTasks, task]);
73+
newIds.add(taskId);
7374
} else {
74-
onCheckChange(checkedTasks.filter((t) => t.id !== task.id));
75+
newIds.delete(taskId);
7576
}
77+
onCheckChange(newIds);
7678
}}
7779
canCheck={canCheckTasks}
7880
/>
@@ -93,7 +95,7 @@ export const TasksTable: FC<TasksTableProps> = ({
9395
checked={
9496
tasks &&
9597
tasks.length > 0 &&
96-
checkedTasks.length === tasks.length
98+
checkedTaskIds.size === tasks.length
9799
}
98100
size="xsmall"
99101
onChange={(_, checked) => {
@@ -102,9 +104,9 @@ export const TasksTable: FC<TasksTableProps> = ({
102104
}
103105

104106
if (!checked) {
105-
onCheckChange([]);
107+
onCheckChange(new Set());
106108
} else {
107-
onCheckChange(tasks);
109+
onCheckChange(new Set(tasks.map((t) => t.id)));
108110
}
109111
}}
110112
aria-label="Select all tasks"
@@ -173,7 +175,7 @@ const TasksEmpty: FC = () => {
173175
type TaskRowProps = {
174176
task: Task;
175177
checked: boolean;
176-
onCheckChange: (task: Task, checked: boolean) => void;
178+
onCheckChange: (taskId: string, checked: boolean) => void;
177179
canCheck: boolean;
178180
};
179181

@@ -212,7 +214,7 @@ const TaskRow: FC<TaskRowProps> = ({
212214
e.stopPropagation();
213215
}}
214216
onChange={(e) => {
215-
onCheckChange(task, e.currentTarget.checked);
217+
onCheckChange(task.id, e.currentTarget.checked);
216218
}}
217219
aria-label={`Select task ${task.initial_prompt}`}
218220
/>

0 commit comments

Comments
 (0)