From 98fb1ee4073b26ef158560643571389c50483dfc Mon Sep 17 00:00:00 2001 From: Alexander Brown <448862+DrJKL@users.noreply.github.com> Date: Fri, 30 Jan 2026 15:22:27 -0800 Subject: [PATCH] fix: type safety and i18n improvements for dropdown components - Add i18n for sort options (sortDefault, sortAZ) - Fix type assertions in FormSearchInput and FormDropdown - Fix missing value check using getAssetFilename - Add aria-label to ownership filter button - Update test for undefined date handling Amp-Thread-ID: https://ampcode.com/threads/T-019c1136-78ff-7149-a185-a814b0e4f933 Co-authored-by: Amp --- src/locales/en/main.json | 1 + src/platform/assets/components/AssetFilterBar.test.ts | 1 + src/platform/assets/utils/assetSortUtils.test.ts | 2 +- .../vueNodes/widgets/components/WidgetSelectDropdown.vue | 6 +++--- .../vueNodes/widgets/components/form/FormSearchInput.vue | 6 ++++-- .../widgets/components/form/dropdown/FormDropdown.vue | 9 +++++---- .../components/form/dropdown/FormDropdownMenuActions.vue | 1 + .../vueNodes/widgets/components/form/dropdown/shared.ts | 5 +++-- 8 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/locales/en/main.json b/src/locales/en/main.json index 17f4b8268..1928f2472 100644 --- a/src/locales/en/main.json +++ b/src/locales/en/main.json @@ -2560,6 +2560,7 @@ "selectModelType": "Select model type", "selectProjects": "Select Projects", "sortAZ": "A-Z", + "sortDefault": "Default", "sortBy": "Sort by", "sortingType": "Sorting Type", "sortPopular": "Popular", diff --git a/src/platform/assets/components/AssetFilterBar.test.ts b/src/platform/assets/components/AssetFilterBar.test.ts index bd56e7765..5b19500ff 100644 --- a/src/platform/assets/components/AssetFilterBar.test.ts +++ b/src/platform/assets/components/AssetFilterBar.test.ts @@ -148,6 +148,7 @@ describe('AssetFilterBar', () => { expect(finalState.fileFormats).toEqual(['ckpt', 'safetensors']) expect(finalState.baseModels).toEqual(['sdxl']) expect(finalState.sortBy).toBe('name-desc') + expect(finalState.ownership).toBe('all') }) it('ensures AssetFilterState interface compliance', async () => { diff --git a/src/platform/assets/utils/assetSortUtils.test.ts b/src/platform/assets/utils/assetSortUtils.test.ts index 2e5c381d5..ac374133f 100644 --- a/src/platform/assets/utils/assetSortUtils.test.ts +++ b/src/platform/assets/utils/assetSortUtils.test.ts @@ -104,7 +104,7 @@ describe('sortAssets', () => { const items = [ createItem('no-date'), createItem('has-date', { created_at: '2024-01-01T00:00:00Z' }), - createItem('null-date', { created_at: null as unknown as string }) + createItem('undefined-date', { created_at: undefined }) ] const result = sortAssets(items, 'recent') expect(result[0].name).toBe('has-date') diff --git a/src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.vue b/src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.vue index 369090447..6b19d46df 100644 --- a/src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.vue +++ b/src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.vue @@ -176,7 +176,7 @@ const missingValueItem = computed(() => { // Check in cloud mode assets if (props.isAssetMode && assetData) { const existsInAssets = assetData.assets.value.some( - (asset) => asset.name === currentValue + (asset) => getAssetFilename(asset) === currentValue ) if (existsInAssets) return undefined @@ -398,9 +398,9 @@ async function handleFilesUpdate(files: File[]) { // 2. Update widget options to include new files // This simulates what addToComboValues does but for SimplifiedWidget - if (props.widget.options?.values) { + const values = props.widget.options?.values + if (Array.isArray(values)) { uploadedPaths.forEach((path) => { - const values = props.widget.options!.values as string[] if (!values.includes(path)) { values.push(path) } diff --git a/src/renderer/extensions/vueNodes/widgets/components/form/FormSearchInput.vue b/src/renderer/extensions/vueNodes/widgets/components/form/FormSearchInput.vue index da9136799..abbff92db 100644 --- a/src/renderer/extensions/vueNodes/widgets/components/form/FormSearchInput.vue +++ b/src/renderer/extensions/vueNodes/widgets/components/form/FormSearchInput.vue @@ -53,8 +53,10 @@ watch( ) function handleFocus(event: FocusEvent) { - const target = event.target as HTMLInputElement - target.select() + const target = event.target + if (target instanceof HTMLInputElement) { + target.select() + } } diff --git a/src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.vue b/src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.vue index 94c77a442..5a10988ba 100644 --- a/src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.vue +++ b/src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.vue @@ -125,11 +125,12 @@ const closeDropdown = () => { function handleFileChange(event: Event) { if (props.disabled) return - const input = event.target as HTMLInputElement - if (input.files) { - files.value = Array.from(input.files) + const target = event.target + if (!(target instanceof HTMLInputElement)) return + if (target.files) { + files.value = Array.from(target.files) } - input.value = '' + target.value = '' } function handleSelection(item: FormDropdownItem, index: number) { diff --git a/src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdownMenuActions.vue b/src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdownMenuActions.vue index 2cca425a8..26bbe322c 100644 --- a/src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdownMenuActions.vue +++ b/src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdownMenuActions.vue @@ -165,6 +165,7 @@ function handleOwnershipSelected(item: OwnershipFilterOption) {