From 350314cee84bce94c0fa7b2efe4b62831bc7d3ab Mon Sep 17 00:00:00 2001 From: "@mrubens" <2600+mrubens@users.noreply.github.com> Date: Sat, 19 Sep 2026 14:28:01 +0000 Subject: [PATCH] fix: allow scrolling searchable model lists in dialogs --- .../tasks/ModelSelect.search.client.test.tsx | 30 +++++++++++++++++++ apps/web/src/components/tasks/ModelSelect.tsx | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/apps/web/src/components/tasks/ModelSelect.search.client.test.tsx b/apps/web/src/components/tasks/ModelSelect.search.client.test.tsx index 9f5df57d13..4459bd2cf4 100644 --- a/apps/web/src/components/tasks/ModelSelect.search.client.test.tsx +++ b/apps/web/src/components/tasks/ModelSelect.search.client.test.tsx @@ -1,5 +1,7 @@ import { fireEvent, render, screen, waitFor } from '@testing-library/react'; +import { Dialog, DialogContent, DialogTitle } from '@/components/system'; + const launchModels = vi.hoisted(() => ({ data: undefined as | { @@ -150,6 +152,34 @@ describe('ModelSelect real controls', () => { expect(screen.queryByRole('listbox')).not.toBeInTheDocument(); }); + it('allows wheel scrolling when portaled from a modal dialog', async () => { + render( + + + Choose a model + + + , + ); + fireEvent.click(screen.getByRole('combobox')); + + const list = screen.getByRole('listbox'); + Object.defineProperties(list, { + clientHeight: { configurable: true, value: 300 }, + scrollHeight: { configurable: true, value: 600 }, + }); + const wheelEvent = new WheelEvent('wheel', { + bubbles: true, + cancelable: true, + deltaY: 100, + }); + + await waitFor(() => { + screen.getAllByRole('option')[0]?.dispatchEvent(wheelEvent); + expect(wheelEvent.defaultPrevented).toBe(false); + }); + }); + it('preserves the trigger label, selected default label and empty label', () => { const { rerender } = render( model.id === value); return ( - +