From f809fb2fe76d61e70e5837692ada6be81eac4d62 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Tue, 12 Sep 2023 21:04:20 +0200 Subject: [PATCH] #660 - Allow only to select unique content relationship values --- CHANGELOG.md | 2 ++ src/listeners/panel/FieldsListener.ts | 3 +- .../Fields/ContentTypeRelationshipField.tsx | 31 ++++++++++--------- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1c1f19d..a9590ca7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ ### 🐞 Fixes +- [#660](https://github.com/estruyf/vscode-front-matter/issues/660): Allow only to select unique content relationship values + ## [9.2.0] - 2023-09-11 ### ✨ New features diff --git a/src/listeners/panel/FieldsListener.ts b/src/listeners/panel/FieldsListener.ts index 27912d99..5c4191d6 100644 --- a/src/listeners/panel/FieldsListener.ts +++ b/src/listeners/panel/FieldsListener.ts @@ -43,7 +43,8 @@ export class FieldsListener extends BaseListener { ExtensionState.Dashboard.Pages.Index, 'workspace' ); - const fuse = new Fuse(pages || [], fuseOptions, Fuse.parseIndex(pagesIndex)); + const fuseIndex = Fuse.parseIndex(pagesIndex); + const fuse = new Fuse(pages || [], fuseOptions, fuseIndex); const results = fuse.search({ $and: [ { diff --git a/src/panelWebView/components/Fields/ContentTypeRelationshipField.tsx b/src/panelWebView/components/Fields/ContentTypeRelationshipField.tsx index d3891177..a59dd32b 100644 --- a/src/panelWebView/components/Fields/ContentTypeRelationshipField.tsx +++ b/src/panelWebView/components/Fields/ContentTypeRelationshipField.tsx @@ -37,9 +37,11 @@ export const ContentTypeRelationshipField: React.FunctionComponent { if (multiSelect) { - const newValue = [...((crntSelected || []) as string[]), txtValue]; - setCrntSelected(newValue); - onChange(newValue); + const crntValue = typeof crntSelected === 'string' ? [crntSelected] : crntSelected; + const newValue = [...((crntValue || []) as string[]), txtValue]; + const uniqueValues = [...new Set(newValue)]; + setCrntSelected(uniqueValues); + onChange(uniqueValues); } else { setCrntSelected(txtValue); onChange(txtValue); @@ -77,20 +79,19 @@ export const ContentTypeRelationshipField: React.FunctionComponent { - return !multiSelect - ? pages - : pages.filter((page: Page) => { - const value = page.fmFilePath; + return pages.filter((page: Page) => { + const value = contentTypeValue === "slug" ? page.slug : page.fmFilePath; - if (typeof crntSelected === 'string') { - return crntSelected !== `${value}`; - } else if (crntSelected instanceof Array) { - return crntSelected.indexOf(`${value}`) === -1; - } + if (typeof crntSelected === 'string') { + return crntSelected !== `${value}` && !value.includes(crntSelected); + } else if (crntSelected instanceof Array) { + const selected = crntSelected.filter((v) => v === `${value}` || value.includes(v)); + return selected.length === 0; + } - return true; - }); - }, [choices, crntSelected, multiSelect]); + return true; + }); + }, [choices, crntSelected, multiSelect, contentTypeValue]); const showRequiredState = useMemo(() => { return (