fix: use factory functions for mutable defaults in defineModel

- FormDropdown: use () => new Set() and () => [] for selected, baseModelSelected, and files defaults

- WidgetSelectDropdown.test: extend interface and remove unsafe casts

Amp-Thread-ID: https://ampcode.com/threads/T-019c11bf-3df5-75ed-bca4-7685ad19885e
Co-authored-by: Amp <amp@ampcode.com>
This commit is contained in:
Alexander Brown
2026-01-30 17:56:38 -08:00
parent e9c5015cf2
commit 07ceb3ecc9
2 changed files with 12 additions and 27 deletions

View File

@@ -14,6 +14,8 @@ import WidgetSelectDropdown from '@/renderer/extensions/vueNodes/widgets/compone
interface WidgetSelectDropdownInstance extends ComponentPublicInstance { interface WidgetSelectDropdownInstance extends ComponentPublicInstance {
inputItems: FormDropdownItem[] inputItems: FormDropdownItem[]
outputItems: FormDropdownItem[] outputItems: FormDropdownItem[]
dropdownItems: FormDropdownItem[]
filterSelected: string
updateSelectedItems: (selectedSet: Set<string>) => void updateSelectedItems: (selectedSet: Set<string>) => void
} }
@@ -230,9 +232,7 @@ describe('WidgetSelectDropdown custom label mapping', () => {
).toBe(false) ).toBe(false)
// The missing value should be accessible via dropdownItems when filter is 'all' (default) // The missing value should be accessible via dropdownItems when filter is 'all' (default)
const dropdownItems = ( const dropdownItems = wrapper.vm.dropdownItems
wrapper.vm as unknown as { dropdownItems: FormDropdownItem[] }
).dropdownItems
expect( expect(
dropdownItems.some((item) => item.name === 'template_image.png') dropdownItems.some((item) => item.name === 'template_image.png')
).toBe(true) ).toBe(true)
@@ -246,15 +246,10 @@ describe('WidgetSelectDropdown custom label mapping', () => {
}) })
const wrapper = mountComponent(widget, 'template_image.png') const wrapper = mountComponent(widget, 'template_image.png')
const vmWithFilter = wrapper.vm as unknown as { wrapper.vm.filterSelected = 'inputs'
filterSelected: string
dropdownItems: FormDropdownItem[]
}
vmWithFilter.filterSelected = 'inputs'
await wrapper.vm.$nextTick() await wrapper.vm.$nextTick()
const dropdownItems = vmWithFilter.dropdownItems const dropdownItems = wrapper.vm.dropdownItems
expect(dropdownItems).toHaveLength(2) expect(dropdownItems).toHaveLength(2)
expect( expect(
dropdownItems.every((item) => !String(item.id).startsWith('missing-')) dropdownItems.every((item) => !String(item.id).startsWith('missing-'))
@@ -267,16 +262,10 @@ describe('WidgetSelectDropdown custom label mapping', () => {
}) })
const wrapper = mountComponent(widget, 'template_image.png') const wrapper = mountComponent(widget, 'template_image.png')
const vmWithFilter = wrapper.vm as unknown as { wrapper.vm.filterSelected = 'outputs'
filterSelected: string
dropdownItems: FormDropdownItem[]
outputItems: FormDropdownItem[]
}
vmWithFilter.filterSelected = 'outputs'
await wrapper.vm.$nextTick() await wrapper.vm.$nextTick()
const dropdownItems = vmWithFilter.dropdownItems const dropdownItems = wrapper.vm.dropdownItems
expect(dropdownItems).toHaveLength(wrapper.vm.outputItems.length) expect(dropdownItems).toHaveLength(wrapper.vm.outputItems.length)
expect( expect(
dropdownItems.every((item) => !String(item.id).startsWith('missing-')) dropdownItems.every((item) => !String(item.id).startsWith('missing-'))
@@ -289,9 +278,7 @@ describe('WidgetSelectDropdown custom label mapping', () => {
}) })
const wrapper = mountComponent(widget, 'img_001.png') const wrapper = mountComponent(widget, 'img_001.png')
const dropdownItems = ( const dropdownItems = wrapper.vm.dropdownItems
wrapper.vm as unknown as { dropdownItems: FormDropdownItem[] }
).dropdownItems
expect(dropdownItems).toHaveLength(2) expect(dropdownItems).toHaveLength(2)
expect( expect(
dropdownItems.every((item) => !String(item.id).startsWith('missing-')) dropdownItems.every((item) => !String(item.id).startsWith('missing-'))
@@ -304,9 +291,7 @@ describe('WidgetSelectDropdown custom label mapping', () => {
}) })
const wrapper = mountComponent(widget, undefined) const wrapper = mountComponent(widget, undefined)
const dropdownItems = ( const dropdownItems = wrapper.vm.dropdownItems
wrapper.vm as unknown as { dropdownItems: FormDropdownItem[] }
).dropdownItems
expect(dropdownItems).toHaveLength(2) expect(dropdownItems).toHaveLength(2)
expect( expect(
dropdownItems.every((item) => !String(item.id).startsWith('missing-')) dropdownItems.every((item) => !String(item.id).startsWith('missing-'))

View File

@@ -58,7 +58,7 @@ const props = withDefaults(defineProps<Props>(), {
}) })
const selected = defineModel<Set<string>>('selected', { const selected = defineModel<Set<string>>('selected', {
default: new Set() default: () => new Set()
}) })
const filterSelected = defineModel<string>('filterSelected', { default: '' }) const filterSelected = defineModel<string>('filterSelected', { default: '' })
const sortSelected = defineModel<string>('sortSelected', { const sortSelected = defineModel<string>('sortSelected', {
@@ -67,13 +67,13 @@ const sortSelected = defineModel<string>('sortSelected', {
const layoutMode = defineModel<LayoutMode>('layoutMode', { const layoutMode = defineModel<LayoutMode>('layoutMode', {
default: 'grid' default: 'grid'
}) })
const files = defineModel<File[]>('files', { default: [] }) const files = defineModel<File[]>('files', { default: () => [] })
const searchQuery = defineModel<string>('searchQuery', { default: '' }) const searchQuery = defineModel<string>('searchQuery', { default: '' })
const ownershipSelected = defineModel<OwnershipOption>('ownershipSelected', { const ownershipSelected = defineModel<OwnershipOption>('ownershipSelected', {
default: 'all' default: 'all'
}) })
const baseModelSelected = defineModel<Set<string>>('baseModelSelected', { const baseModelSelected = defineModel<Set<string>>('baseModelSelected', {
default: new Set() default: () => new Set()
}) })
const toastStore = useToastStore() const toastStore = useToastStore()