From 1beb17d218aefe2169144d70890958da7fb24b81 Mon Sep 17 00:00:00 2001 From: neon <18559658+neonsolstice@users.noreply.github.com> Date: Fri, 30 Oct 2026 01:16:04 +0000 Subject: [PATCH] fix(metadata): stop duplicating moved provider IDs Keep providers with compatibility ID fields out of the generic external-provider rows so the editor exposes one valid input. Closes #1997 --- .../components/detail/tabs/EditMetadataTab.vue | 5 ++++- .../detail/tabs/__tests__/EditMetadataTab.spec.ts | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/client/src/features/book/components/detail/tabs/EditMetadataTab.vue b/client/src/features/book/components/detail/tabs/EditMetadataTab.vue index 995954cbe..dce7e9a04 100644 --- a/client/src/features/book/components/detail/tabs/EditMetadataTab.vue +++ b/client/src/features/book/components/detail/tabs/EditMetadataTab.vue @@ -22,6 +22,7 @@ import { FORMAT_TO_GROUP, IDENTIFIER_INPUT_KIND_BY_FIELD, getPrimaryBookFile, + isKnownMetadataProviderKey, isValidSeriesIndex, parseSeriesIndex, isComicFormat, @@ -202,7 +203,9 @@ const visibleProviderIdFields = computed(() => filterProviderIdFields(availableM const externalProviderIdRows = computed(() => { const rows = new Map() for (const provider of availableMetadataProviders.value ?? []) { - if (provider.source === 'external') rows.set(provider.key, { key: provider.key, label: provider.label, registered: true }) + if (provider.source === 'external' && !isKnownMetadataProviderKey(provider.key)) { + rows.set(provider.key, { key: provider.key, label: provider.label, registered: true }) + } } for (const key of Object.keys(form.externalProviderIds)) { if (!rows.has(key)) rows.set(key, { key, label: key, registered: false }) diff --git a/client/src/features/book/components/detail/tabs/__tests__/EditMetadataTab.spec.ts b/client/src/features/book/components/detail/tabs/__tests__/EditMetadataTab.spec.ts index 7264f58a8..4841cfeb2 100644 --- a/client/src/features/book/components/detail/tabs/__tests__/EditMetadataTab.spec.ts +++ b/client/src/features/book/components/detail/tabs/__tests__/EditMetadataTab.spec.ts @@ -225,6 +225,21 @@ describe('EditMetadataTab cover tiles', () => { expect(body.metadata).toMatchObject({ isbn10: '0306406152', isbn13: '9780306406157' }) }) + it('renders a moved external provider only through its compatibility ID field', async () => { + vi.mocked(api).mockImplementation(async (url) => { + if (String(url).includes('/metadata-fetch/providers')) { + return json([{ key: 'lubimyczytac', label: 'LubimyCzytac', identifiable: true, source: 'external' }]) + } + return json({}) + }) + const wrapper = mountTab(makeBook({ providerIds: { lubimyczytac: '5212514/nie-zapomnij-nakarmic' } })) + await flushPromises() + + expect(wrapper.get('#provider-id-lubimyczytacId').element.value).toBe('5212514/nie-zapomnij-nakarmic') + expect(wrapper.find('#provider-id-external-lubimyczytac').exists()).toBe(false) + expect(wrapper.text()).toContain('1/1') + }) + // Issue #1624: identifiers pasted from Amazon carry hyphens and invisible characters. it('saves pasted identifiers cleaned instead of truncated', async () => { vi.mocked(api).mockImplementation(async (url, init) => {