diff --git a/packages/ui/src/lib/components/RoomyThread.svelte b/packages/ui/src/lib/components/RoomyThread.svelte index 08dfe5e..f584a6b 100644 --- a/packages/ui/src/lib/components/RoomyThread.svelte +++ b/packages/ui/src/lib/components/RoomyThread.svelte @@ -143,6 +143,9 @@ ? selected.filter((id) => id !== target.id) : [...selected, target.id] } + if (event.currentTarget instanceof HTMLInputElement) { + event.currentTarget.checked = selected.includes(target.id) + } anchor = index } diff --git a/packages/ui/src/lib/components/RoomyThread.svelte.test.ts b/packages/ui/src/lib/components/RoomyThread.svelte.test.ts index fc1b92a..6554660 100644 --- a/packages/ui/src/lib/components/RoomyThread.svelte.test.ts +++ b/packages/ui/src/lib/components/RoomyThread.svelte.test.ts @@ -152,6 +152,10 @@ describe('Roomy thread', () => { flushSync() expect(boxes.map((box) => box.checked)).toEqual([false, true, true, true, false]) expect(target.querySelector('.rmy-foot')?.textContent).toContain('3 selected') + boxes[2]?.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, shiftKey: true })) + flushSync() + expect(boxes.map((box) => box.checked)).toEqual([false, true, true, true, false]) + expect(target.querySelector('.rmy-foot')?.textContent).toContain('3 selected') const importer = target.querySelector('.rmy-acts .btn-p') as HTMLButtonElement // The phrase is held to the count by a non-breaking space; below 560px the phrase is what goes.