From 91c8935a8a62a884d0dabdc42eaa89fdd058b9fb Mon Sep 17 00:00:00 2001 From: Nathan Vasse Date: Tue, 23 Apr 2024 17:19:35 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B(react)=20fix=20Select=20mono=20sel?= =?UTF-8?q?ected=20item=20update=20label?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When we were updating the label from the options array of the selected item, the field was still showing this old value. Fixes #316 --- .changeset/breezy-phones-repeat.md | 5 + .../src/components/Forms/Select/index.tsx | 2 +- .../Forms/Select/mono-searchable.tsx | 16 +-- .../components/Forms/Select/mono-simple.tsx | 40 +++--- .../src/components/Forms/Select/mono.spec.tsx | 136 +++++++++++++++++- .../components/Forms/Select/mono.stories.tsx | 29 ++++ 6 files changed, 195 insertions(+), 33 deletions(-) create mode 100644 .changeset/breezy-phones-repeat.md diff --git a/.changeset/breezy-phones-repeat.md b/.changeset/breezy-phones-repeat.md new file mode 100644 index 0000000..1c940f7 --- /dev/null +++ b/.changeset/breezy-phones-repeat.md @@ -0,0 +1,5 @@ +--- +"@openfun/cunningham-react": patch +--- + +fix Select mono selected item update label diff --git a/packages/react/src/components/Forms/Select/index.tsx b/packages/react/src/components/Forms/Select/index.tsx index ccd220a..931e9e2 100644 --- a/packages/react/src/components/Forms/Select/index.tsx +++ b/packages/react/src/components/Forms/Select/index.tsx @@ -6,7 +6,7 @@ import { FieldProps } from ":/components/Forms/Field"; export * from ":/components/Forms/Select/mono"; export * from ":/components/Forms/Select/multi"; -type BaseOption = { +export type BaseOption = { value: string; label: string; render: () => ReactNode; diff --git a/packages/react/src/components/Forms/Select/mono-searchable.tsx b/packages/react/src/components/Forms/Select/mono-searchable.tsx index e4b348d..c92a3ee 100644 --- a/packages/react/src/components/Forms/Select/mono-searchable.tsx +++ b/packages/react/src/components/Forms/Select/mono-searchable.tsx @@ -51,25 +51,17 @@ export const SelectMonoSearchable = forwardRef( downshiftReturn.inputValue, ]); - // When component is controlled, this useEffect will update the local selected item. + // Similar to: useKeepSelectedItemInSyncWithOptions ( see docs ) + // The only difference is that it does not apply when there is an inputFilter. ( See below why ) useEffect(() => { + // If there is an inputFilter, using selectItem will trigger onInputValueChange that will sets inputFilter to + // empty, and then ignoring the existing filter and displaying all options. if (inputFilter) { return; } - - const selectedItem = downshiftReturn.selectedItem - ? optionToValue(downshiftReturn.selectedItem) - : undefined; - const optionToSelect = props.options.find( (option) => optionToValue(option) === props.value, ); - - // Already selected - if (optionToSelect && selectedItem === props.value) { - return; - } - downshiftReturn.selectItem(optionToSelect ?? null); }, [props.value, props.options, inputFilter]); diff --git a/packages/react/src/components/Forms/Select/mono-simple.tsx b/packages/react/src/components/Forms/Select/mono-simple.tsx index 8ed0bf0..8e37d50 100644 --- a/packages/react/src/components/Forms/Select/mono-simple.tsx +++ b/packages/react/src/components/Forms/Select/mono-simple.tsx @@ -1,4 +1,4 @@ -import { useSelect } from "downshift"; +import { useSelect, UseSelectReturnValue } from "downshift"; import React, { forwardRef, useEffect, @@ -11,9 +11,27 @@ import { SelectMonoAux, SubProps, } from ":/components/Forms/Select/mono-common"; -import { SelectHandle } from ":/components/Forms/Select"; +import { Option, SelectHandle, SelectProps } from ":/components/Forms/Select"; import { SelectedOption } from ":/components/Forms/Select/utils"; +/** + * Here we ensure that the selected item is always in sync with the options. + * Ex: If the selected options changes label we want to reflect that. + * @param downshiftReturn + * @param props + */ +const useKeepSelectedItemInSyncWithOptions = ( + downshiftReturn: UseSelectReturnValue