diff --git a/app/forms/disk-create.tsx b/app/forms/disk-create.tsx index ded6cec33..8cb8418f3 100644 --- a/app/forms/disk-create.tsx +++ b/app/forms/disk-create.tsx @@ -20,10 +20,10 @@ import { type Image, } from '@oxide/api' +import { ComboboxField } from '~/components/form/fields/ComboboxField' import { DescriptionField } from '~/components/form/fields/DescriptionField' import { DiskSizeField } from '~/components/form/fields/DiskSizeField' import { toImageComboboxItem } from '~/components/form/fields/ImageSelectField' -import { ListboxField } from '~/components/form/fields/ListboxField' import { NameField } from '~/components/form/fields/NameField' import { RadioField } from '~/components/form/fields/RadioField' import { SideModalForm } from '~/components/form/SideModalForm' @@ -171,6 +171,7 @@ const DiskSourceField = ({ field: { value, onChange }, } = useController({ control, name: 'diskSource' }) const diskSizeField = useController({ control, name: 'size' }).field + const diskImageIdField = useController({ control, name: 'diskSource.imageId' }).field return ( <> @@ -210,7 +211,7 @@ const DiskSourceField = ({ /> )} {value.type === 'image' && ( - toImageComboboxItem(i, true))} required + onInputChange={() => { + diskImageIdField.onChange() + }} onChange={(id) => { const image = images.find((i) => i.id === id)! // if it's selected, it must be present const imageSizeGiB = image.size / GiB @@ -252,9 +256,13 @@ const SnapshotSelectField = ({ control }: { control: Control }) => { const snapshots = snapshotsQuery.data?.items || [] const diskSizeField = useController({ control, name: 'size' }).field + const diskSnapshotIdField = useController({ + control, + name: 'diskSource.snapshotId', + }).field return ( - }) => { })} isLoading={snapshotsQuery.isPending} required + onInputChange={() => { + diskSnapshotIdField.onChange() + }} onChange={(id) => { const snapshot = snapshots.find((i) => i.id === id)! // if it's selected, it must be present const snapshotSizeGiB = snapshot.size / GiB diff --git a/test/e2e/disks.e2e.ts b/test/e2e/disks.e2e.ts index 13482ad3e..eb4a573f2 100644 --- a/test/e2e/disks.e2e.ts +++ b/test/e2e/disks.e2e.ts @@ -80,20 +80,20 @@ test.describe('Disk create', () => { test('from snapshot', async ({ page }) => { await page.getByRole('radio', { name: 'Snapshot' }).click() - await page.getByRole('button', { name: 'Source snapshot' }).click() + await page.getByRole('combobox', { name: 'Source snapshot' }).click() await page.getByRole('option', { name: 'delete-500' }).click() }) // max-size snapshot required a fix test('from max-size snapshot', async ({ page }) => { await page.getByRole('radio', { name: 'Snapshot' }).click() - await page.getByRole('button', { name: 'Source snapshot' }).click() + await page.getByRole('combobox', { name: 'Source snapshot' }).click() await page.getByRole('option', { name: 'snapshot-max' }).click() }) test('from image', async ({ page }) => { await page.getByRole('radio', { name: 'Image' }).click() - await page.getByRole('button', { name: 'Source image' }).click() + await page.getByRole('combobox', { name: 'Source image' }).click() await page.getByRole('option', { name: 'image-3' }).click() }) diff --git a/test/e2e/instance-disks.e2e.ts b/test/e2e/instance-disks.e2e.ts index f6c59b063..a8569f4ec 100644 --- a/test/e2e/instance-disks.e2e.ts +++ b/test/e2e/instance-disks.e2e.ts @@ -117,7 +117,7 @@ test('Create disk', async ({ page }) => { await expect(createForm.getByRole('textbox', { name: 'Description' })).toBeVisible() await page.getByRole('radio', { name: 'Snapshot' }).click() - await page.getByRole('button', { name: 'Source snapshot' }).click() + await page.getByRole('combobox', { name: 'Source snapshot' }).click() await page.getByRole('option', { name: 'snapshot-heavy' }).click() await createForm.getByRole('button', { name: 'Create disk' }).click()