From 736d40755fd3498353f3573bac34222175eccf0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?= <44321109+GomezIvann@users.noreply.github.com> Date: Fri, 9 May 2025 15:07:20 +0200 Subject: [PATCH 1/7] Select all functionality for the Select component --- packages/lib/src/checkbox/Checkbox.tsx | 4 +- packages/lib/src/checkbox/CheckboxContext.tsx | 4 + packages/lib/src/checkbox/types.ts | 4 + packages/lib/src/checkbox/utils.tsx | 8 ++ packages/lib/src/common/variables.ts | 3 +- packages/lib/src/select/ListOption.tsx | 8 +- packages/lib/src/select/Listbox.tsx | 73 +++++++---- packages/lib/src/select/Select.stories.tsx | 31 ++++- packages/lib/src/select/Select.tsx | 114 ++++++++---------- packages/lib/src/select/types.ts | 43 ++++--- packages/lib/src/select/utils.ts | 54 +++++++-- 11 files changed, 217 insertions(+), 129 deletions(-) create mode 100644 packages/lib/src/checkbox/CheckboxContext.tsx diff --git a/packages/lib/src/checkbox/Checkbox.tsx b/packages/lib/src/checkbox/Checkbox.tsx index 471992656d..2542536b16 100644 --- a/packages/lib/src/checkbox/Checkbox.tsx +++ b/packages/lib/src/checkbox/Checkbox.tsx @@ -3,6 +3,7 @@ import styled from "styled-components"; import { HalstackLanguageContext } from "../HalstackContext"; import CheckboxPropsType, { RefType } from "./types"; import { calculateWidth, icons, spaces } from "./utils"; +import CheckboxContext from "./CheckboxContext"; const Label = styled.span<{ disabled: CheckboxPropsType["disabled"]; @@ -93,6 +94,7 @@ const DxcCheckbox = forwardRef( const [innerChecked, setInnerChecked] = useState(defaultChecked); const checkboxRef = useRef(null); const translatedLabels = useContext(HalstackLanguageContext); + const { partial } = useContext(CheckboxContext) ?? {}; const handleOnChange = () => { if (!disabled && !readOnly) { @@ -142,7 +144,7 @@ const DxcCheckbox = forwardRef( ref={checkboxRef} tabIndex={disabled ? -1 : tabIndex} > - {(checked ?? innerChecked) ? icons.checked : icons.unchecked} + {partial ? icons.partial : (checked ?? innerChecked) ? icons.checked : icons.unchecked} (null); diff --git a/packages/lib/src/checkbox/types.ts b/packages/lib/src/checkbox/types.ts index 2558af5cbc..883ea4e701 100644 --- a/packages/lib/src/checkbox/types.ts +++ b/packages/lib/src/checkbox/types.ts @@ -70,4 +70,8 @@ type Props = { */ export type RefType = HTMLDivElement; +export type CheckboxContextProps = { + partial: boolean; +}; + export default Props; diff --git a/packages/lib/src/checkbox/utils.tsx b/packages/lib/src/checkbox/utils.tsx index a112847d1c..3b362fd313 100644 --- a/packages/lib/src/checkbox/utils.tsx +++ b/packages/lib/src/checkbox/utils.tsx @@ -33,6 +33,14 @@ export const icons = { /> ), + partial: ( + + + + ), unchecked: ( ` + ${({ isSelectAllOption }) => isSelectAllOption && "font-weight: var(--typography-label-semibold);"} overflow: hidden; text-overflow: ellipsis; white-space: nowrap; @@ -77,6 +78,7 @@ const ListOption = ({ isGroupedOption = false, isLastOption, isSelected, + isSelectAllOption = false, multiple, onClick, option, @@ -113,7 +115,9 @@ const ListOption = ({ {typeof option.icon === "string" ? : option.icon} )} - {option.label} + + {option.label} + {!multiple && isSelected && } diff --git a/packages/lib/src/select/Listbox.tsx b/packages/lib/src/select/Listbox.tsx index 394b3ea060..d43a5d5c35 100644 --- a/packages/lib/src/select/Listbox.tsx +++ b/packages/lib/src/select/Listbox.tsx @@ -3,9 +3,10 @@ import styled from "styled-components"; import DxcIcon from "../icon/Icon"; import { HalstackLanguageContext } from "../HalstackContext"; import ListOption from "./ListOption"; -import { groupsHaveOptions } from "./utils"; +import { getSelectionType, groupsHaveOptions } from "./utils"; import { ListboxProps, ListOptionGroupType, ListOptionType } from "./types"; import { scrollbarStyles } from "../styles/scroll"; +import CheckboxContext from "../checkbox/CheckboxContext"; const ListboxContainer = styled.div` box-sizing: border-box; @@ -49,7 +50,9 @@ const GroupLabel = styled.li` const Listbox = ({ ariaLabelledBy, currentValue, + enabledSelectAll, handleOptionOnClick, + handleSelectAllOnClick, id, lastOptionIndex, multiple, @@ -63,8 +66,7 @@ const Listbox = ({ const translatedLabels = useContext(HalstackLanguageContext); const listboxRef = useRef(null); - let globalIndex = optional && !multiple ? 0 : -1; - + let globalIndex = (multiple ? enabledSelectAll : optional) ? 0 : -1; const mapOptionFunc = (option: ListOptionType | ListOptionGroupType, mapIndex: number) => { const groupId = `${id}-group-${mapIndex}`; if ("options" in option) { @@ -114,6 +116,50 @@ const Listbox = ({ } }; + const getFirstItem = () => { + if (searchable && (options.length === 0 || !groupsHaveOptions(options))) + return ( + + + {translatedLabels.select.noMatchesErrorMessage} + + ); + else if (optional && !multiple) + return ( + + ); + else if (multiple && enabledSelectAll) { + const selectionType = getSelectionType(options, currentValue as string[]); + return ( + + + + ); + } + }; + useLayoutEffect(() => { if (currentValue && !multiple) { const listEl = listboxRef?.current; @@ -147,26 +193,7 @@ const Listbox = ({ role="listbox" style={styles} > - {searchable && (options.length === 0 || !groupsHaveOptions(options)) ? ( - - - {translatedLabels.select.noMatchesErrorMessage} - - ) : ( - optional && - !multiple && ( - - ) - )} + {getFirstItem()} {options.map(mapOptionFunc)} ); diff --git a/packages/lib/src/select/Select.stories.tsx b/packages/lib/src/select/Select.stories.tsx index b41bd121d6..9cfb1fce0e 100644 --- a/packages/lib/src/select/Select.stories.tsx +++ b/packages/lib/src/select/Select.stories.tsx @@ -218,12 +218,15 @@ const optionsWithEllipsis = [ const Select = () => ( <> - - - + + - + + + + + {/* @@ -356,7 +359,7 @@ const Select = () => ( options={optionsWithEllipsis} margin={{ top: "xxlarge" }} /> - + */} ); @@ -406,7 +409,9 @@ const SelectListbox = () => { optionalItem={{ label: "Empty", value: "" }} searchable={false} handleOptionOnClick={() => {}} + handleSelectAllOnClick={() => {}} styles={{ width: 360 }} + enabledSelectAll={false} /> @@ -424,7 +429,9 @@ const SelectListbox = () => { optionalItem={{ label: "Empty", value: "" }} searchable={false} handleOptionOnClick={() => {}} + handleSelectAllOnClick={() => {}} styles={{ width: 360 }} + enabledSelectAll={false} /> @@ -442,7 +449,9 @@ const SelectListbox = () => { optionalItem={{ label: "Empty", value: "" }} searchable={false} handleOptionOnClick={() => {}} + handleSelectAllOnClick={() => {}} styles={{ width: 360 }} + enabledSelectAll={false} /> @@ -460,7 +469,9 @@ const SelectListbox = () => { optionalItem={{ label: "Empty", value: "" }} searchable={false} handleOptionOnClick={() => {}} + handleSelectAllOnClick={() => {}} styles={{ width: 360 }} + enabledSelectAll={false} /> @@ -478,7 +489,9 @@ const SelectListbox = () => { optionalItem={{ label: "Empty", value: "" }} searchable={false} handleOptionOnClick={() => {}} + handleSelectAllOnClick={() => {}} styles={{ width: 360 }} + enabledSelectAll={false} /> @@ -497,7 +510,9 @@ const SelectListbox = () => { optionalItem={{ label: "Empty", value: "" }} searchable={false} handleOptionOnClick={() => {}} + handleSelectAllOnClick={() => {}} styles={{ width: 360 }} + enabledSelectAll={false} /> @@ -515,7 +530,9 @@ const SelectListbox = () => { optionalItem={{ label: "Empty", value: "" }} searchable={false} handleOptionOnClick={() => {}} + handleSelectAllOnClick={() => {}} styles={{ width: 360 }} + enabledSelectAll={false} /> @@ -533,7 +550,9 @@ const SelectListbox = () => { optionalItem={{ label: "Empty", value: "" }} searchable={false} handleOptionOnClick={() => {}} + handleSelectAllOnClick={() => {}} styles={{ width: 360 }} + enabledSelectAll={false} /> @@ -633,7 +652,9 @@ const TooltipOption = () => { optionalItem={{ label: "Empty", value: "" }} searchable={false} handleOptionOnClick={() => {}} + handleSelectAllOnClick={() => {}} styles={{ width: 360 }} + enabledSelectAll={false} /> ); diff --git a/packages/lib/src/select/Select.tsx b/packages/lib/src/select/Select.tsx index a6e0f1e957..9026ea5cfc 100644 --- a/packages/lib/src/select/Select.tsx +++ b/packages/lib/src/select/Select.tsx @@ -7,6 +7,7 @@ import { MouseEvent, useCallback, useContext, + useEffect, useId, useMemo, useRef, @@ -29,6 +30,7 @@ import { groupsHaveOptions, isArrayOfGroupedOptions, notOptionalCheck, + selectAll, } from "./utils"; import SelectPropsType, { ListOptionType, RefType } from "./types"; import DxcActionIcon from "../action-icon/ActionIcon"; @@ -173,6 +175,7 @@ const DxcSelect = forwardRef( ariaLabel = "Select", defaultValue, disabled = false, + enableSelectAll = false, error, helperText, label, @@ -212,8 +215,8 @@ const DxcSelect = forwardRef( const optionalItem = useMemo(() => ({ label: placeholder, value: "" }), [placeholder]); const filteredOptions = useMemo(() => filterOptionsBySearchValue(options, searchValue), [options, searchValue]); const lastOptionIndex = useMemo( - () => getLastOptionIndex(options, filteredOptions, searchable, optional, multiple), - [options, filteredOptions, searchable, optional, multiple] + () => getLastOptionIndex(options, filteredOptions, searchable, optional, multiple, enableSelectAll), + [options, filteredOptions, searchable, optional, multiple, enableSelectAll] ); const { selectedOption, singleSelectionIndex } = useMemo( () => getSelectedOption(value ?? innerValue, options, multiple, optional, optionalItem), @@ -236,7 +239,6 @@ const DxcSelect = forwardRef( (newOption: ListOptionType | undefined) => { if (newOption) { let newValue: string | string[]; - if (multiple) { const currentValue = (value ?? innerValue) as string[]; newValue = currentValue.includes(newOption.value) @@ -244,9 +246,7 @@ const DxcSelect = forwardRef( : [...currentValue, newOption.value]; } else newValue = newOption.value; - if (value == null) { - setInnerValue(newValue); - } + if (value == null) setInnerValue(newValue); onChange?.({ value: newValue as string & string[], error: notOptionalCheck(newValue, multiple, optional) @@ -258,20 +258,14 @@ const DxcSelect = forwardRef( [multiple, value, innerValue, onChange, optional, translatedLabels] ); const handleOnClick = () => { - if (searchable) { - selectSearchInputRef?.current?.focus(); - } + if (searchable) selectSearchInputRef?.current?.focus(); if (isOpen) { closeListbox(); setSearchValue(""); - } else { - openListbox(); - } + } else openListbox(); }; const handleOnFocus = (event: FocusEvent) => { - if (!event.currentTarget.contains(event.relatedTarget) && searchable) { - selectSearchInputRef?.current?.focus(); - } + if (!event.currentTarget.contains(event.relatedTarget) && searchable) selectSearchInputRef?.current?.focus(); }; const handleOnBlur = (event: FocusEvent) => { if (!event.currentTarget.contains(event.relatedTarget)) { @@ -279,14 +273,12 @@ const DxcSelect = forwardRef( setSearchValue(""); const currentValue = value ?? innerValue; - if (notOptionalCheck(currentValue, multiple, optional)) { + if (notOptionalCheck(currentValue, multiple, optional)) onBlur?.({ value: currentValue as string & string[], error: translatedLabels.formFields.requiredValueErrorMessage, }); - } else { - onBlur?.({ value: currentValue as string & string[] }); - } + else onBlur?.({ value: currentValue as string & string[] }); } }; const handleOnKeyDown = (event: KeyboardEvent) => { @@ -298,16 +290,12 @@ const DxcSelect = forwardRef( singleSelectionIndex != null && (!isOpen || (visualFocusIndex === -1 && singleSelectionIndex > -1 && singleSelectionIndex <= lastOptionIndex)) - ) { + ) changeVisualFocusIndex(singleSelectionIndex); - } else { - changeVisualFocusIndex((currentVisualFocusIndex) => { - if (currentVisualFocusIndex < lastOptionIndex) { - return currentVisualFocusIndex + 1; - } - return 0; - }); - } + else + changeVisualFocusIndex((currentVisualFocusIndex) => + currentVisualFocusIndex < lastOptionIndex ? currentVisualFocusIndex + 1 : 0 + ); openListbox(); break; case "Up": @@ -317,65 +305,53 @@ const DxcSelect = forwardRef( singleSelectionIndex != null && (!isOpen || (visualFocusIndex === -1 && singleSelectionIndex > -1 && singleSelectionIndex <= lastOptionIndex)) - ) { + ) changeVisualFocusIndex(singleSelectionIndex); - } else { + else changeVisualFocusIndex((currentVisualFocusIndex) => currentVisualFocusIndex === 0 || currentVisualFocusIndex === -1 ? lastOptionIndex : currentVisualFocusIndex - 1 ); - } openListbox(); break; case "Esc": case "Escape": event.preventDefault(); - if (isOpen) { - event.stopPropagation(); - } + if (isOpen) event.stopPropagation(); closeListbox(); setSearchValue(""); break; case "Enter": if (isOpen && visualFocusIndex >= 0) { - let accLength = optional && !multiple ? 1 : 0; + let accLength = (multiple ? enableSelectAll : optional) ? 1 : 0; if (searchable) { if (filteredOptions.length > 0) { - if (optional && !multiple && visualFocusIndex === 0 && groupsHaveOptions(filteredOptions)) { - handleOnChangeValue(optionalItem); - } else if (isArrayOfGroupedOptions(filteredOptions)) { - if (groupsHaveOptions(filteredOptions)) { + if (!multiple && visualFocusIndex === 0 && optional) handleOnChangeValue(optionalItem); + else if (multiple && visualFocusIndex === 0 && enableSelectAll) handleSelectAllOnClick(); + else if (isArrayOfGroupedOptions(filteredOptions)) { + if (groupsHaveOptions(filteredOptions)) filteredOptions.some((groupOption) => { const groupLength = accLength + groupOption.options.length; - if (groupLength > visualFocusIndex) { + if (groupLength > visualFocusIndex) handleOnChangeValue(groupOption.options[visualFocusIndex - accLength]); - } accLength = groupLength; return groupLength > visualFocusIndex; }); - } - } else { - handleOnChangeValue(filteredOptions[visualFocusIndex - accLength]); - } + } else handleOnChangeValue(filteredOptions[visualFocusIndex - accLength]); } - } else if (optional && !multiple && visualFocusIndex === 0) { - handleOnChangeValue(optionalItem); - } else if (isArrayOfGroupedOptions(options)) { + } else if (!multiple && visualFocusIndex === 0 && optional) handleOnChangeValue(optionalItem); + else if (multiple && visualFocusIndex === 0 && enableSelectAll) handleSelectAllOnClick(); + else if (isArrayOfGroupedOptions(options)) options.some((groupOption) => { const groupLength = accLength + groupOption.options.length; - if (groupLength > visualFocusIndex) { + if (groupLength > visualFocusIndex) handleOnChangeValue(groupOption.options[visualFocusIndex - accLength]); - } accLength = groupLength; return groupLength > visualFocusIndex; }); - } else { - handleOnChangeValue(options[visualFocusIndex - accLength]); - } - if (!multiple) { - closeListbox(); - } + else handleOnChangeValue(options[visualFocusIndex - accLength]); + if (!multiple) closeListbox(); setSearchValue(""); } break; @@ -394,21 +370,16 @@ const DxcSelect = forwardRef( openListbox(); }; - const handleClearOptionsActionOnClick = (event: MouseEvent) => { - event.stopPropagation(); - + const handleClearOptionsActionOnClick = (event?: MouseEvent) => { + event?.stopPropagation(); const empty: string[] = []; - if (value == null) { - setInnerValue(empty); - } - if (!optional) { + if (value == null) setInnerValue(empty); + if (!optional) onChange?.({ value: empty as string & string[], error: translatedLabels.formFields.requiredValueErrorMessage, }); - } else { - onChange?.({ value: empty as string & string[] }); - } + else onChange?.({ value: empty as string & string[] }); }; const handleClearSearchActionOnClick = (event: MouseEvent) => { @@ -427,6 +398,15 @@ const DxcSelect = forwardRef( [closeListbox, handleOnChangeValue, multiple] ); + const handleSelectAllOnClick = useCallback(() => { + if (multiple ? (value ?? innerValue).length !== 0 : (value ?? innerValue) !== "") + handleClearOptionsActionOnClick(); + else { + if (value == null) setInnerValue(selectAll(options)); + onChange?.({ value: selectAll(options) as string & string[] }); + } + }, [handleClearOptionsActionOnClick, onChange, options, value]); + return ( {label && ( @@ -558,7 +538,9 @@ const DxcSelect = forwardRef( void; - multiple: boolean; - visualFocused: boolean; isGroupedOption?: boolean; isLastOption: boolean; isSelected: boolean; + isSelectAllOption?: boolean; + multiple: boolean; + option: ListOptionType; + onClick: (option: ListOptionType) => void; + visualFocused: boolean; }; /** @@ -184,17 +187,19 @@ export type OptionProps = { */ export type ListboxProps = { ariaLabelledBy: string; - id: string; currentValue: string | string[]; - options: ListOptionType[] | ListOptionGroupType[]; - visualFocusIndex: number; + enabledSelectAll: boolean; + handleOptionOnClick: (option: ListOptionType) => void; + handleSelectAllOnClick: () => void; + id: string; lastOptionIndex: number; multiple: boolean; optional: boolean; optionalItem: ListOptionType; + options: ListOptionType[] | ListOptionGroupType[]; searchable: boolean; - handleOptionOnClick: (option: ListOptionType) => void; styles: CSSProperties; + visualFocusIndex: number; }; /** diff --git a/packages/lib/src/select/utils.ts b/packages/lib/src/select/utils.ts index 6234230b58..80d3d42b65 100644 --- a/packages/lib/src/select/utils.ts +++ b/packages/lib/src/select/utils.ts @@ -1,5 +1,6 @@ import SelectPropsType, { ListOptionType, ListOptionGroupType } from "./types"; import { getMargin } from "../common/utils"; +import Props from "./types"; const sizes = { small: "240px", @@ -28,14 +29,14 @@ const isOptionGroup = (option: ListOptionType | ListOptionGroupType): option is /** * Checks if the options are grouped options (groups and single options can't be mixed) */ -export const isArrayOfGroupedOptions = (options: ListOptionType[] | ListOptionGroupType[]): options is ListOptionGroupType[] => +export const isArrayOfGroupedOptions = (options: Props["options"]): options is ListOptionGroupType[] => options[0] != null && isOptionGroup(options[0]); /** * Checks if the groups have options. If the options parameter is not an array of grouped options, * it will return true and not check nothing else. */ -export const groupsHaveOptions = (options: ListOptionType[] | ListOptionGroupType[]) => +export const groupsHaveOptions = (options: Props["options"]) => isArrayOfGroupedOptions(options) ? options.some((groupOption) => groupOption.options.length > 0) : true; /** @@ -44,16 +45,13 @@ export const groupsHaveOptions = (options: ListOptionType[] | ListOptionGroupTyp * - The listbox has more than one single option. * - The listbox has more than one group with options contained. */ -export const canOpenListbox = (options: ListOptionType[] | ListOptionGroupType[], disabled: boolean) => +export const canOpenListbox = (options: Props["options"], disabled: boolean) => !disabled && options.length > 0 && groupsHaveOptions(options); /** * Filters the options by the search value. */ -export const filterOptionsBySearchValue = ( - options: ListOptionType[] | ListOptionGroupType[], - searchValue: string -): ListOptionType[] | ListOptionGroupType[] => +export const filterOptionsBySearchValue = (options: Props["options"], searchValue: string): Props["options"] => options.length > 0 ? isArrayOfGroupedOptions(options) ? options.map((optionGroup) => { @@ -72,11 +70,12 @@ export const filterOptionsBySearchValue = ( * Returns the index of the last option, depending on several conditions. */ export const getLastOptionIndex = ( - options: ListOptionType[] | ListOptionGroupType[], - filteredOptions: ListOptionType[] | ListOptionGroupType[], + options: Props["options"], + filteredOptions: Props["options"], searchable: boolean, optional: boolean, - multiple: boolean + multiple: boolean, + enabledSelectAll: boolean ) => { let last = 0; const reducer = (acc: number, current: ListOptionGroupType) => acc + (current.options.length ?? 0); @@ -95,7 +94,7 @@ export const getLastOptionIndex = ( } } - return optional && !multiple ? last + 1 : last; + return (multiple ? enabledSelectAll : optional) ? last + 1 : last; }; /** @@ -103,7 +102,7 @@ export const getLastOptionIndex = ( */ export const getSelectedOption = ( value: string | string[], - options: ListOptionType[] | ListOptionGroupType[], + options: Props["options"], multiple: boolean, optional: boolean, optionalItem: ListOptionType @@ -165,3 +164,34 @@ export const getSelectedOptionLabel = (placeholder: string, selectedOption: List ? placeholder : selectedOption.map((option) => option.label).join(", ") : (selectedOption.label ?? placeholder); + +/** + * Returns a determined string value depending on the amount of options selected: + * - All options are selected -> "checked" + * - Partial selection -> "indeterminate" + * - No option is selected -> "unchecked" + * @param options + * @param value + * @returns + */ +export const getSelectionType = (options: Props["options"], value: string[]) => { + if (value.length > 0) { + if ( + isArrayOfGroupedOptions(options) + ? options.flatMap((group) => group.options.map((option) => option.value)).length === value.length + : options.length === value.length + ) + return "checked"; + else return "indeterminate"; + } else return "unchecked"; +}; + +/** + * Return an array with all the values from the options passed by the user, whether grouped or not. + * @param options + * @returns + */ +export const selectAll = (options: Props["options"]) => + isArrayOfGroupedOptions(options) + ? options.flatMap((group) => group.options.map((option) => option.value)) + : options.map((option) => option.value); From 07d2d3fc957bcc93e57bac7c69f851453213b510 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?= <44321109+GomezIvann@users.noreply.github.com> Date: Mon, 12 May 2025 13:21:47 +0200 Subject: [PATCH 2/7] Select all variant tests --- packages/lib/src/select/Select.stories.tsx | 473 +++++++++++---------- packages/lib/src/select/Select.test.tsx | 397 ++++++++++------- packages/lib/src/select/Select.tsx | 33 +- 3 files changed, 495 insertions(+), 408 deletions(-) diff --git a/packages/lib/src/select/Select.stories.tsx b/packages/lib/src/select/Select.stories.tsx index 982d1f347f..f337498710 100644 --- a/packages/lib/src/select/Select.stories.tsx +++ b/packages/lib/src/select/Select.stories.tsx @@ -1,4 +1,4 @@ -import { userEvent, within } from "@storybook/test"; +import { fireEvent, userEvent, within } from "@storybook/test"; import ExampleContainer from "../../.storybook/components/ExampleContainer"; import Title from "../../.storybook/components/Title"; import preview from "../../.storybook/preview"; @@ -218,15 +218,7 @@ const optionsWithEllipsis = [ const Select = () => ( <> - - - - - - - - - {/* + @@ -359,210 +351,208 @@ const Select = () => ( options={optionsWithEllipsis} margin={{ top: "xxlarge" }} /> - */} + ); -const SelectListbox = () => { - return ( - <> - - - -
- - -
- - - <ExampleContainer pseudoState="pseudo-hover"> - <Title title="Hovered option" theme="light" level={4} /> - <label id="x8-label">Choose an option</label> - <Listbox - ariaLabelledBy="x8-label" - id="x8" - currentValue="" - options={one_option} - visualFocusIndex={-1} - lastOptionIndex={0} - multiple={false} - optional={false} - optionalItem={{ label: "Empty", value: "" }} - searchable={false} - handleOptionOnClick={() => {}} - handleSelectAllOnClick={() => {}} - styles={{ width: 360 }} - enabledSelectAll={false} - /> - </ExampleContainer> - <ExampleContainer pseudoState="pseudo-active"> - <Title title="Active option" theme="light" level={4} /> - <label id="x9-label">Choose an option</label> - <Listbox - ariaLabelledBy="x9-label" - id="x9" - currentValue="" - options={one_option} - visualFocusIndex={-1} - lastOptionIndex={0} - multiple={false} - optional={false} - optionalItem={{ label: "Empty", value: "" }} - searchable={false} - handleOptionOnClick={() => {}} - handleSelectAllOnClick={() => {}} - styles={{ width: 360 }} - enabledSelectAll={false} - /> - </ExampleContainer> - <ExampleContainer> - <Title title="Focused option" theme="light" level={4} /> - <label id="x10-label">Choose an option</label> - <Listbox - ariaLabelledBy="x10-label" - id="x10" - currentValue="" - options={one_option} - visualFocusIndex={0} - lastOptionIndex={0} - multiple={false} - optional={false} - optionalItem={{ label: "Empty", value: "" }} - searchable={false} - handleOptionOnClick={() => {}} - handleSelectAllOnClick={() => {}} - styles={{ width: 360 }} - enabledSelectAll={false} - /> - </ExampleContainer> - <ExampleContainer pseudoState="pseudo-hover"> - <Title title="Hovered selected option" theme="light" level={4} /> - <label id="x11-label">Choose an option</label> - <Listbox - ariaLabelledBy="x11-label" - id="x11" - currentValue="1" - options={single_options} - visualFocusIndex={-1} - lastOptionIndex={3} - multiple={false} - optional={false} - optionalItem={{ label: "Empty", value: "" }} - searchable={false} - handleOptionOnClick={() => {}} - handleSelectAllOnClick={() => {}} - styles={{ width: 360 }} - enabledSelectAll={false} - /> - </ExampleContainer> - <ExampleContainer pseudoState="pseudo-active"> - <Title title="Active selected option" theme="light" level={4} /> - <label id="x12-label">Choose an option</label> - <Listbox - ariaLabelledBy="x12-label" - id="x12" - currentValue="2" - options={single_options} - visualFocusIndex={0} - lastOptionIndex={3} - multiple={false} - optional={false} - optionalItem={{ label: "Empty", value: "" }} - searchable={false} - handleOptionOnClick={() => {}} - handleSelectAllOnClick={() => {}} - styles={{ width: 360 }} - enabledSelectAll={false} - /> - </ExampleContainer> - <Title title="Listbox with icons" theme="light" level={3} /> - <ExampleContainer> - <Title title="Icons (SVGs)" theme="light" level={4} /> - <label id="x13-label">Choose an option</label> - <Listbox - ariaLabelledBy="x13-label" - id="x13" - currentValue="3" - options={icon_options} - visualFocusIndex={-1} - lastOptionIndex={3} - multiple={false} - optional={false} - optionalItem={{ label: "Empty", value: "" }} - searchable={false} - handleOptionOnClick={() => {}} - handleSelectAllOnClick={() => {}} - styles={{ width: 360 }} - enabledSelectAll={false} - /> - </ExampleContainer> - <ExampleContainer> - <Title title="Grouped icons (Material Symbols)" theme="light" level={4} /> - <label id="x14-label">Choose an option</label> - <Listbox - ariaLabelledBy="x14-label" - id="x14" - currentValue={"4"} - options={icon_options_grouped_material} - visualFocusIndex={-1} - lastOptionIndex={3} - multiple={false} - optional={false} - optionalItem={{ label: "Empty", value: "" }} - searchable={false} - handleOptionOnClick={() => {}} - handleSelectAllOnClick={() => {}} - styles={{ width: 360 }} - enabledSelectAll={false} - /> - </ExampleContainer> - <ExampleContainer> - <Title title="Grouped icons (Material)" theme="light" level={4} /> - <label id="x15-label">Choose an option</label> - <Listbox - ariaLabelledBy="x15-label" - id="x15" - currentValue={["car", "motorcycle", "train"]} - options={options_material} - visualFocusIndex={-1} - lastOptionIndex={6} - multiple={true} - optional={false} - optionalItem={{ label: "Empty", value: "" }} - searchable={false} - handleOptionOnClick={() => {}} - handleSelectAllOnClick={() => {}} - styles={{ width: 360 }} - enabledSelectAll={false} - /> - </ExampleContainer> - </> - ); -}; +const SelectListbox = () => ( + <> + <Title title="Listbox" theme="light" level={2} /> + <ExampleContainer> + <Title + title="List dialog uses a Radix Popover to appear over elements with a certain z-index" + theme="light" + level={3} + /> + <div + style={{ + position: "relative", + display: "flex", + flexDirection: "column", + gap: "20px", + height: "150px", + width: "min-content", + marginBottom: "100px", + padding: "20px", + border: "1px solid black", + borderRadius: "4px", + overflow: "auto", + zIndex: "1300", + }} + > + <DxcSelect label="Label" options={single_options} optional placeholder="Choose an option" /> + <button style={{ zIndex: "1", width: "100px" }}>Submit</button> + </div> + </ExampleContainer> + <Title title="Listbox option states" theme="light" level={3} /> + <ExampleContainer pseudoState="pseudo-hover"> + <Title title="Hovered option" theme="light" level={4} /> + <label id="x8-label">Choose an option</label> + <Listbox + ariaLabelledBy="x8-label" + id="x8" + currentValue="" + options={one_option} + visualFocusIndex={-1} + lastOptionIndex={0} + multiple={false} + optional={false} + optionalItem={{ label: "Empty", value: "" }} + searchable={false} + handleOptionOnClick={() => {}} + handleSelectAllOnClick={() => {}} + styles={{ width: 360 }} + enabledSelectAll={false} + /> + </ExampleContainer> + <ExampleContainer pseudoState="pseudo-active"> + <Title title="Active option" theme="light" level={4} /> + <label id="x9-label">Choose an option</label> + <Listbox + ariaLabelledBy="x9-label" + id="x9" + currentValue="" + options={one_option} + visualFocusIndex={-1} + lastOptionIndex={0} + multiple={false} + optional={false} + optionalItem={{ label: "Empty", value: "" }} + searchable={false} + handleOptionOnClick={() => {}} + handleSelectAllOnClick={() => {}} + styles={{ width: 360 }} + enabledSelectAll={false} + /> + </ExampleContainer> + <ExampleContainer> + <Title title="Focused option" theme="light" level={4} /> + <label id="x10-label">Choose an option</label> + <Listbox + ariaLabelledBy="x10-label" + id="x10" + currentValue="" + options={one_option} + visualFocusIndex={0} + lastOptionIndex={0} + multiple={false} + optional={false} + optionalItem={{ label: "Empty", value: "" }} + searchable={false} + handleOptionOnClick={() => {}} + handleSelectAllOnClick={() => {}} + styles={{ width: 360 }} + enabledSelectAll={false} + /> + </ExampleContainer> + <ExampleContainer pseudoState="pseudo-hover"> + <Title title="Hovered selected option" theme="light" level={4} /> + <label id="x11-label">Choose an option</label> + <Listbox + ariaLabelledBy="x11-label" + id="x11" + currentValue="1" + options={single_options} + visualFocusIndex={-1} + lastOptionIndex={3} + multiple={false} + optional={false} + optionalItem={{ label: "Empty", value: "" }} + searchable={false} + handleOptionOnClick={() => {}} + handleSelectAllOnClick={() => {}} + styles={{ width: 360 }} + enabledSelectAll={false} + /> + </ExampleContainer> + <ExampleContainer pseudoState="pseudo-active"> + <Title title="Active selected option" theme="light" level={4} /> + <label id="x12-label">Choose an option</label> + <Listbox + ariaLabelledBy="x12-label" + id="x12" + currentValue="2" + options={single_options} + visualFocusIndex={0} + lastOptionIndex={3} + multiple={false} + optional={false} + optionalItem={{ label: "Empty", value: "" }} + searchable={false} + handleOptionOnClick={() => {}} + handleSelectAllOnClick={() => {}} + styles={{ width: 360 }} + enabledSelectAll={false} + /> + </ExampleContainer> + <Title title="Listbox with icons" theme="light" level={3} /> + <ExampleContainer> + <Title title="Icons (SVGs)" theme="light" level={4} /> + <label id="x13-label">Choose an option</label> + <Listbox + ariaLabelledBy="x13-label" + id="x13" + currentValue="3" + options={icon_options} + visualFocusIndex={-1} + lastOptionIndex={3} + multiple={false} + optional={false} + optionalItem={{ label: "Empty", value: "" }} + searchable={false} + handleOptionOnClick={() => {}} + handleSelectAllOnClick={() => {}} + styles={{ width: 360 }} + enabledSelectAll={false} + /> + </ExampleContainer> + <ExampleContainer> + <Title title="Grouped icons (Material Symbols)" theme="light" level={4} /> + <label id="x14-label">Choose an option</label> + <Listbox + ariaLabelledBy="x14-label" + id="x14" + currentValue={"4"} + options={icon_options_grouped_material} + visualFocusIndex={-1} + lastOptionIndex={3} + multiple={false} + optional={false} + optionalItem={{ label: "Empty", value: "" }} + searchable={false} + handleOptionOnClick={() => {}} + handleSelectAllOnClick={() => {}} + styles={{ width: 360 }} + enabledSelectAll={false} + /> + </ExampleContainer> + <ExampleContainer> + <Title title="Grouped icons (Material)" theme="light" level={4} /> + <label id="x15-label">Choose an option</label> + <Listbox + ariaLabelledBy="x15-label" + id="x15" + currentValue={["car", "motorcycle", "train"]} + options={options_material} + visualFocusIndex={-1} + lastOptionIndex={6} + multiple={true} + optional={false} + optionalItem={{ label: "Empty", value: "" }} + searchable={false} + handleOptionOnClick={() => {}} + handleSelectAllOnClick={() => {}} + styles={{ width: 360 }} + enabledSelectAll={false} + /> + </ExampleContainer> + </> +); const SearchableSelect = () => ( <ExampleContainer expanded> <Title title="Searchable select" theme="light" level={4} /> - <DxcSelect label="Select Label" searchable options={single_options} placeholder="Choose an option" /> + <DxcSelect label="Select Label" searchable optional options={single_options} placeholder="Choose an option" /> </ExampleContainer> ); @@ -635,30 +625,28 @@ const TooltipValue = () => ( </ExampleContainer> ); -const TooltipOption = () => { - return ( - <ExampleContainer expanded> - <Title title="List option has tooltip when it overflows" theme="light" level={4} /> - <label id="x1-label">Choose an option</label> - <Listbox - ariaLabelledBy="x1-label" - id="x1" - currentValue="1" - options={optionsWithEllipsis} - visualFocusIndex={-1} - lastOptionIndex={2} - multiple={false} - optional={false} - optionalItem={{ label: "Empty", value: "" }} - searchable={false} - handleOptionOnClick={() => {}} - handleSelectAllOnClick={() => {}} - styles={{ width: 360 }} - enabledSelectAll={false} - /> - </ExampleContainer> - ); -}; +const TooltipOption = () => ( + <ExampleContainer expanded> + <Title title="List option has tooltip when it overflows" theme="light" level={4} /> + <label id="x1-label">Choose an option</label> + <Listbox + ariaLabelledBy="x1-label" + id="x1" + currentValue="1" + options={optionsWithEllipsis} + visualFocusIndex={-1} + lastOptionIndex={2} + multiple={false} + optional={false} + optionalItem={{ label: "Empty", value: "" }} + searchable={false} + handleOptionOnClick={() => {}} + handleSelectAllOnClick={() => {}} + styles={{ width: 360 }} + enabledSelectAll={false} + /> + </ExampleContainer> +); const TooltipClear = () => ( <ExampleContainer expanded> @@ -667,6 +655,20 @@ const TooltipClear = () => ( </ExampleContainer> ); +const SelectAll = () => ( + <ExampleContainer> + <Title title="Select all with grouped options" theme="light" level={4} /> + <DxcSelect + defaultValue={["1", "3", "4"]} + enableSelectAll + label="Select an option" + multiple + options={group_options} + placeholder="Select an available option" + /> + </ExampleContainer> +); + type Story = StoryObj<typeof DxcSelect>; export const Chromatic: Story = { @@ -775,3 +777,12 @@ export const SearchableClearActionTooltip: Story = { await userEvent.hover(clearSelectionButton); }, }; + +export const SelectAllOptions: Story = { + render: SelectAll, + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + const select = canvas.getByRole("combobox"); + await userEvent.click(select); + }, +}; diff --git a/packages/lib/src/select/Select.test.tsx b/packages/lib/src/select/Select.test.tsx index 14dcd5e934..aa263bf8cc 100644 --- a/packages/lib/src/select/Select.test.tsx +++ b/packages/lib/src/select/Select.test.tsx @@ -13,6 +13,13 @@ import DxcSelect from "./Select"; disconnect() {} }; +const reducedSingleOptions = [ + { label: "Option 01", value: "1" }, + { label: "Option 02", value: "2" }, + { label: "Option 03", value: "3" }, + { label: "Option 04", value: "4" }, +]; + const singleOptions = [ { label: "Option 01", value: "1" }, { label: "Option 02", value: "2" }, @@ -36,7 +43,34 @@ const singleOptions = [ { label: "Option 20", value: "20" }, ]; -const groupOptions = [ +const reducedGroupedOptions = [ + { + label: "Colores", + options: [ + { label: "Azul", value: "azul" }, + { label: "Rojo", value: "rojo" }, + { label: "Rosa", value: "rosa" }, + ], + }, + { + label: "Ciudades españolas", + options: [ + { label: "Madrid", value: "madrid" }, + { label: "Oviedo", value: "oviedo" }, + { label: "Sevilla", value: "sevilla" }, + ], + }, + { + label: "Ríos españoles", + options: [ + { label: "Miño", value: "miño" }, + { label: "Duero", value: "duero" }, + { label: "Tajo", value: "tajo" }, + ], + }, +]; + +const groupedOptions = [ { label: "Colores", options: [ @@ -73,7 +107,7 @@ const groupOptions = [ ]; describe("Select component tests", () => { - test("When clicking the label, the focus goes to the select", async () => { + test("When clicking the label, the focus goes to the select", () => { const { getByText, getByRole } = render( <DxcSelect label="test-select-label" @@ -84,7 +118,7 @@ describe("Select component tests", () => { ); const select = getByRole("combobox"); const label = getByText("test-select-label"); - await userEvent.click(label); + userEvent.click(label); expect(document.activeElement).toEqual(select); }); test("Renders with correct aria attributes when is in error state", () => { @@ -98,7 +132,7 @@ describe("Select component tests", () => { expect(select.getAttribute("aria-invalid")).toBe("true"); expect(errorMessage.getAttribute("aria-live")).toBe("assertive"); }); - test("Renders with correct aria attributes", async () => { + test("Renders with correct aria attributes", () => { const { getByText, getByRole } = render( <DxcSelect label="test-select-label" placeholder="Example" options={singleOptions} /> ); @@ -112,7 +146,7 @@ describe("Select component tests", () => { expect(select.getAttribute("aria-activedescendant")).toBeNull(); expect(select.getAttribute("aria-invalid")).toBe("false"); expect(select.getAttribute("aria-label")).toBeNull(); - await userEvent.click(select); + userEvent.click(select); const list = getByRole("listbox"); expect(select.getAttribute("aria-controls")).toBe(list.id); expect(list.getAttribute("aria-multiselectable")).toBe("false"); @@ -124,7 +158,7 @@ describe("Select component tests", () => { const select = getByRole("combobox"); expect(select.getAttribute("aria-label")).toBe("Example aria label"); }); - test("Single selection: Renders with correct default value", async () => { + test("Single selection: Renders with correct default value", () => { const { getByText, getByRole, getAllByRole, queryByRole, container } = render( <DxcSelect label="test-select-label" name="test" defaultValue="4" options={singleOptions} /> ); @@ -133,14 +167,14 @@ describe("Select component tests", () => { expect(queryByRole("listbox")).toBeFalsy(); expect(getByText("Option 04")).toBeTruthy(); expect(submitInput?.value).toBe("4"); - await userEvent.click(select); + userEvent.click(select); const options = getAllByRole("option"); expect(options[3]?.getAttribute("aria-selected")).toBe("true"); - options[7] && (await userEvent.click(options[7])); + options[7] && userEvent.click(options[7]); expect(getByText("Option 08")).toBeTruthy(); expect(submitInput?.value).toBe("8"); }); - test("Multiple selection: Renders with correct default value", async () => { + test("Multiple selection: Renders with correct default value", () => { const { getByText, getByRole, getAllByRole, queryByRole, container } = render( <DxcSelect label="test-select-label" @@ -155,13 +189,13 @@ describe("Select component tests", () => { expect(queryByRole("listbox")).toBeFalsy(); expect(getByText("Option 02, Option 04, Option 06")).toBeTruthy(); expect(submitInput?.value).toBe("4,2,6"); - await userEvent.click(select); + userEvent.click(select); const options = getAllByRole("option"); - options[2] && (await userEvent.click(options[2])); + options[2] && userEvent.click(options[2]); expect(getByText("Option 02, Option 03, Option 04, Option 06")).toBeTruthy(); expect(submitInput?.value).toBe("4,2,6,3"); }); - test("Sends its value when submitted", async () => { + test("Sends its value when submitted", () => { const handlerOnSubmit = jest.fn((e) => { e.preventDefault(); const formData = new FormData(e.target); @@ -182,10 +216,10 @@ describe("Select component tests", () => { ); const select = getByRole("combobox"); const submit = getByText("Submit"); - await userEvent.click(select); + userEvent.click(select); const options = getAllByRole("option"); - options[2] && (await userEvent.click(options[2])); - await userEvent.click(submit); + options[2] && userEvent.click(options[2]); + userEvent.click(submit); }); test("Searching for a value with an empty list of options passed doesn't open the listbox", async () => { const { container, getByRole, queryByRole } = render( @@ -193,37 +227,37 @@ describe("Select component tests", () => { ); const select = getByRole("combobox"); const searchInput = container.querySelectorAll("input")[1]; - await userEvent.click(select); - await act(async () => { + userEvent.click(select); + await act(() => { searchInput && userEvent.type(searchInput, "test"); }); expect(queryByRole("listbox")).toBeFalsy(); expect(select.getAttribute("aria-expanded")).toBe("false"); }); - test("Disabled select - Cannot gain focus or open the listbox via click", async () => { + test("Disabled select - Cannot gain focus or open the listbox via click", () => { const { getByRole, queryByRole } = render( <DxcSelect label="test-select-label" value={["1", "2"]} options={singleOptions} multiple disabled /> ); const select = getByRole("combobox"); expect(select.getAttribute("aria-disabled")).toBe("true"); - await userEvent.click(select); + userEvent.click(select); expect(queryByRole("listbox")).toBeFalsy(); expect(document.activeElement === select).toBeFalsy(); }); - test("Disabled select - Clear all options action must be shown but not clickable", async () => { + test("Disabled select - Clear all options action must be shown but not clickable", () => { const { getByRole, getByText } = render( <DxcSelect label="test-select-label" value={["1", "2"]} options={singleOptions} disabled searchable multiple /> ); - await userEvent.click(getByRole("button")); + userEvent.click(getByRole("button")); expect(getByText("Option 01, Option 02")).toBeTruthy(); }); - test("Disabled select - Does not call onBlur event", async () => { + test("Disabled select - Does not call onBlur event", () => { const onBlur = jest.fn(); const { getByRole } = render( <DxcSelect label="test-select-label" options={singleOptions} disabled onBlur={onBlur} /> ); const select = getByRole("combobox"); - await userEvent.click(select); + userEvent.click(select); fireEvent.keyDown(getByRole("combobox"), { key: "Tab", code: "Tab", keyCode: 9, charCode: 9 }); expect(onBlur).not.toHaveBeenCalled(); }); @@ -236,7 +270,7 @@ describe("Select component tests", () => { expect(queryByRole("listbox")).toBeFalsy(); expect(document.activeElement === select).toBeFalsy(); }); - test("Disabled select - Doesn't send its value when submitted", async () => { + test("Disabled select - Doesn't send its value when submitted", () => { const handlerOnSubmit = jest.fn((e) => { e.preventDefault(); const formData = new FormData(e.target); @@ -250,9 +284,9 @@ describe("Select component tests", () => { </form> ); const submit = getByText("Submit"); - await userEvent.click(submit); + userEvent.click(submit); }); - test("Controlled - Single selection - Not optional constraint", async () => { + test("Controlled - Single selection - Not optional constraint", () => { const onChange = jest.fn(); const onBlur = jest.fn(); const { getByRole, getAllByRole } = render( @@ -264,16 +298,16 @@ describe("Select component tests", () => { fireEvent.blur(select); expect(onBlur).toHaveBeenCalled(); expect(onBlur).toHaveBeenCalledWith({ value: "", error: "This field is required. Please, enter a value." }); - await userEvent.click(select); + userEvent.click(select); const options = getAllByRole("option"); - options[0] && (await userEvent.click(options[0])); + options[0] && userEvent.click(options[0]); expect(onChange).toHaveBeenCalled(); expect(onChange).toHaveBeenCalledWith({ value: "1" }); fireEvent.blur(select); expect(onBlur).toHaveBeenCalled(); expect(onBlur).toHaveBeenCalledWith({ value: "1" }); }); - test("Controlled - Multiple selection - Not optional constraint", async () => { + test("Controlled - Multiple selection - Not optional constraint", () => { const onChange = jest.fn(); const onBlur = jest.fn(); const { getByRole, getAllByRole } = render( @@ -285,19 +319,19 @@ describe("Select component tests", () => { fireEvent.blur(select); expect(onBlur).toHaveBeenCalled(); expect(onBlur).toHaveBeenCalledWith({ value: [], error: "This field is required. Please, enter a value." }); - await userEvent.click(select); + userEvent.click(select); let options = getAllByRole("option"); - options[0] && (await userEvent.click(options[0])); - options[1] && (await userEvent.click(options[1])); + options[0] && userEvent.click(options[0]); + options[1] && userEvent.click(options[1]); expect(onChange).toHaveBeenCalled(); expect(onChange).toHaveBeenCalledWith({ value: ["1", "2"] }); fireEvent.blur(select); expect(onBlur).toHaveBeenCalled(); expect(onBlur).toHaveBeenCalledWith({ value: ["1", "2"] }); - await userEvent.click(select); + userEvent.click(select); options = getAllByRole("option"); - options[0] && (await userEvent.click(options[0])); - options[1] && (await userEvent.click(options[1])); + options[0] && userEvent.click(options[0]); + options[1] && userEvent.click(options[1]); expect(onChange).toHaveBeenCalled(); expect(onChange).toHaveBeenCalledWith({ value: [], error: "This field is required. Please, enter a value." }); fireEvent.blur(select); @@ -318,12 +352,12 @@ describe("Select component tests", () => { expect(onBlur).toHaveBeenCalledWith({ value: "" }); expect(select.getAttribute("aria-invalid")).toBe("false"); }); - test("Non-Grouped Options - Opens listbox and renders correctly or closes it with a click on select", async () => { + test("Non-Grouped Options - Opens listbox and renders correctly or closes it with a click on select", () => { const { getByText, getByRole, getAllByRole, queryByRole } = render( <DxcSelect label="test-select-label" options={singleOptions} /> ); const select = getByRole("combobox"); - await userEvent.click(select); + userEvent.click(select); expect(getByRole("listbox")).toBeTruthy(); expect(select.getAttribute("aria-expanded")).toBe("true"); expect(getByText("Option 01")).toBeTruthy(); @@ -331,36 +365,36 @@ describe("Select component tests", () => { expect(getByText("Option 08")).toBeTruthy(); expect(getByText("Option 09")).toBeTruthy(); expect(getAllByRole("option").length).toBe(20); - await userEvent.click(select); + userEvent.click(select); expect(queryByRole("listbox")).toBeFalsy(); expect(select.getAttribute("aria-expanded")).toBe("false"); }); - test("Non-Grouped Options - If an empty list of options is passed, the select is rendered but doesn't open the listbox", async () => { + test("Non-Grouped Options - If an empty list of options is passed, the select is rendered but doesn't open the listbox", () => { const { getByRole, queryByRole } = render(<DxcSelect label="test-select-label" options={[]} />); const select = getByRole("combobox"); - await userEvent.click(select); + userEvent.click(select); expect(queryByRole("listbox")).toBeFalsy(); expect(select.getAttribute("aria-expanded")).toBe("false"); }); - test("Non-Grouped Options - Click in an option selects it and closes the listbox", async () => { + test("Non-Grouped Options - Click in an option selects it and closes the listbox", () => { const onChange = jest.fn(); const { getByText, getByRole, getAllByRole, queryByRole, container } = render( <DxcSelect name="test" label="test-select-label" options={singleOptions} onChange={onChange} /> ); const select = getByRole("combobox"); const submitInput = container.querySelector<HTMLInputElement>(`input[name="test"]`); - await userEvent.click(select); + userEvent.click(select); let options = getAllByRole("option"); - options[2] && (await userEvent.click(options[2])); + options[2] && userEvent.click(options[2]); expect(onChange).toHaveBeenCalledWith({ value: "3" }); expect(queryByRole("listbox")).toBeFalsy(); expect(getByText("Option 03")).toBeTruthy(); - await userEvent.click(select); + userEvent.click(select); options = getAllByRole("option"); expect(options[2]?.getAttribute("aria-selected")).toBe("true"); expect(submitInput?.value).toBe("3"); }); - test("Non-Grouped Options - Optional renders an empty first option (selected by default) with the placeholder as its label", async () => { + test("Non-Grouped Options - Optional renders an empty first option (selected by default) with the placeholder as its label", () => { const onChange = jest.fn(); const { getByRole, getAllByRole, getAllByText } = render( <DxcSelect @@ -372,11 +406,11 @@ describe("Select component tests", () => { /> ); const select = getByRole("combobox"); - await userEvent.click(select); + userEvent.click(select); expect(getAllByText("Choose an option").length).toBe(2); const options = getAllByRole("option"); expect(options[0]?.getAttribute("aria-selected")).toBe("true"); - options[0] && (await userEvent.click(options[0])); + options[0] && userEvent.click(options[0]); expect(onChange).toHaveBeenCalledWith({ value: "" }); expect(getAllByText("Choose an option").length).toBe(1); fireEvent.keyDown(select, { key: "ArrowDown", code: "ArrowDown", keyCode: 40, charCode: 40 }); @@ -398,12 +432,12 @@ describe("Select component tests", () => { /> ); const searchInput = container.querySelectorAll("input")[1]; - await act(async () => { + await act(() => { searchInput && userEvent.type(searchInput, "1"); }); expect(getByText("Placeholder example")).toBeTruthy(); expect(getAllByRole("option").length).toBe(12); - await act(async () => { + await act(() => { searchInput && userEvent.type(searchInput, "123"); }); expect(queryByText("Placeholder example")).toBeFalsy(); @@ -439,7 +473,7 @@ describe("Select component tests", () => { expect(queryByRole("listbox")).toBeTruthy(); expect(select.getAttribute("aria-activedescendant")).toBe("option-0"); }); - test("Non-Grouped Options: Enter key - Selects the visually focused option and closes the listbox", async () => { + test("Non-Grouped Options: Enter key - Selects the visually focused option and closes the listbox", () => { const onChange = jest.fn(); const { getByText, getByRole, getAllByRole, queryByRole } = render( <DxcSelect label="test-select-label" options={singleOptions} onChange={onChange} optional /> @@ -453,39 +487,39 @@ describe("Select component tests", () => { expect(onChange).toHaveBeenCalledWith({ value: "20" }); expect(queryByRole("listbox")).toBeFalsy(); expect(getByText("Option 20")).toBeTruthy(); - await userEvent.click(select); + userEvent.click(select); const options = getAllByRole("option"); expect(options[20]?.getAttribute("aria-selected")).toBe("true"); }); - test("Non-Grouped Options: Searchable - Displays an input for filtering the list of options", async () => { + test("Non-Grouped Options: Searchable - Displays an input for filtering the list of options", () => { const onChange = jest.fn(); const { container, getByText, getByRole, getAllByRole, queryByRole } = render( <DxcSelect label="test-select-label" options={singleOptions} onChange={onChange} searchable /> ); const select = getByRole("combobox"); const searchInput = container.querySelectorAll("input")[1]; - await userEvent.click(select); + userEvent.click(select); expect(getByRole("listbox")).toBeTruthy(); - searchInput && (await userEvent.type(searchInput, "08")); - await userEvent.click(getByRole("option")); + searchInput && userEvent.type(searchInput, "08"); + userEvent.click(getByRole("option")); expect(onChange).toHaveBeenCalledWith({ value: "8" }); expect(queryByRole("listbox")).toBeFalsy(); expect(getByText("Option 08")).toBeTruthy(); expect(searchInput?.value).toBe(""); - await userEvent.click(select); + userEvent.click(select); const options = getAllByRole("option"); expect(options[7]?.getAttribute("aria-selected")).toBe("true"); }); - test("Non-Grouped Options: Searchable - Displays 'No matches found' when there are no filtering results", async () => { + test("Non-Grouped Options: Searchable - Displays 'No matches found' when there are no filtering results", () => { const onChange = jest.fn(); const { container, getByText, getByRole } = render( <DxcSelect label="test-select-label" options={singleOptions} onChange={onChange} searchable /> ); const select = getByRole("combobox"); const searchInput = container.querySelectorAll("input")[1]; - await userEvent.click(select); + userEvent.click(select); expect(getByRole("listbox")).toBeTruthy(); - searchInput && (await userEvent.type(searchInput, "abc")); + searchInput && userEvent.type(searchInput, "abc"); expect(getByText("No matches found")).toBeTruthy(); }); test("Non-Grouped Options: Searchable - Clicking the select, when the list is open, clears the search value", async () => { @@ -495,7 +529,7 @@ describe("Select component tests", () => { ); const select = getByRole("combobox"); const searchInput = container.querySelectorAll("input")[1]; - await act(async () => { + await act(() => { searchInput && userEvent.type(searchInput, "2"); }); expect(getByRole("listbox")).toBeTruthy(); @@ -503,62 +537,62 @@ describe("Select component tests", () => { expect(getByText("Option 12")).toBeTruthy(); expect(getByText("Option 20")).toBeTruthy(); expect(getAllByRole("option").length).toBe(3); - await act(async () => { + await act(() => { userEvent.click(select); }); expect(searchInput?.value).toBe(""); }); - test("Non-Grouped Options: Searchable - Writing displays the listbox, if it was not open", async () => { + test("Non-Grouped Options: Searchable - Writing displays the listbox, if it was not open", () => { const onChange = jest.fn(); const { container, getByRole, queryByRole } = render( <DxcSelect label="test-select-label" options={singleOptions} onChange={onChange} searchable /> ); const select = getByRole("combobox"); const searchInput = container.querySelectorAll("input")[1]; - await userEvent.click(select); - await userEvent.click(select); + userEvent.click(select); + userEvent.click(select); expect(queryByRole("listbox")).toBeFalsy(); - searchInput && (await userEvent.type(searchInput, "2")); + searchInput && userEvent.type(searchInput, "2"); expect(getByRole("listbox")).toBeTruthy(); }); - test("Non-Grouped Options: Searchable - Key Esc cleans the search value and closes the options", async () => { + test("Non-Grouped Options: Searchable - Key Esc cleans the search value and closes the options", () => { const onChange = jest.fn(); const { container, getByRole, queryByRole } = render( <DxcSelect label="test-select-label" options={singleOptions} onChange={onChange} searchable /> ); const select = getByRole("combobox"); const searchInput = container.querySelectorAll("input")[1]; - searchInput && (await userEvent.type(searchInput, "Option 02")); + searchInput && userEvent.type(searchInput, "Option 02"); fireEvent.keyDown(select, { key: "Esc", code: "Esc", keyCode: 27, charCode: 27 }); expect(searchInput?.value).toBe(""); expect(queryByRole("listbox")).toBeFalsy(); }); - test("Non-Grouped Options: Searchable - While user types, a clear action is displayed for cleaning the search value", async () => { + test("Non-Grouped Options: Searchable - While user types, a clear action is displayed for cleaning the search value", () => { const onChange = jest.fn(); const { container, getByRole, getAllByRole, queryByRole } = render( <DxcSelect label="test-select-label" options={singleOptions} onChange={onChange} searchable /> ); const searchInput = container.querySelectorAll("input")[1]; - searchInput && (await userEvent.type(searchInput, "Option 02")); + searchInput && userEvent.type(searchInput, "Option 02"); expect(getAllByRole("option").length).toBe(1); const clearSearchButton = getByRole("button"); expect(clearSearchButton.getAttribute("aria-label")).toBe("Clear search"); - await userEvent.click(clearSearchButton); + userEvent.click(clearSearchButton); expect(getByRole("listbox")).toBeTruthy(); expect(getAllByRole("option").length).toBe(20); expect(queryByRole("button")).toBeFalsy(); }); - test("Non-Grouped Options: Multiple selection - Displays a checkbox per option and enables the multi-selection", async () => { + test("Non-Grouped Options: Multiple selection - Displays a checkbox per option and enables the multi-selection", () => { const onChange = jest.fn(); const { getByText, getAllByText, getByRole, getAllByRole, queryByRole, container } = render( <DxcSelect name="test" label="test-select-label" options={singleOptions} onChange={onChange} multiple /> ); const select = getByRole("combobox"); const submitInput = container.querySelector<HTMLInputElement>(`input[name="test"]`); - await userEvent.click(select); + userEvent.click(select); expect(getByRole("listbox").getAttribute("aria-multiselectable")).toBe("true"); const options = getAllByRole("option"); - options[10] && (await userEvent.click(options[10])); + options[10] && userEvent.click(options[10]); expect(onChange).toHaveBeenCalledWith({ value: ["11"] }); expect(queryByRole("listbox")).toBeTruthy(); expect(getAllByText("Option 11").length).toBe(2); @@ -570,31 +604,31 @@ describe("Select component tests", () => { expect(getByText("Option 11, Option 19")).toBeTruthy(); expect(submitInput?.value).toBe("11,19"); }); - test("Non-Grouped Options: Multiple selection - Clear action and selection indicator", async () => { + test("Non-Grouped Options: Multiple selection - Clear action and selection indicator", () => { const onChange = jest.fn(); const { getByText, queryByText, getByRole, getAllByRole, queryByRole } = render( <DxcSelect label="test-select-label" options={singleOptions} onChange={onChange} multiple /> ); const select = getByRole("combobox"); - await userEvent.click(select); + userEvent.click(select); const options = getAllByRole("option"); - options[5] && (await userEvent.click(options[5])); - options[8] && (await userEvent.click(options[8])); - options[13] && (await userEvent.click(options[13])); + options[5] && userEvent.click(options[5]); + options[8] && userEvent.click(options[8]); + options[13] && userEvent.click(options[13]); expect(onChange).toHaveBeenCalledWith({ value: ["6", "9", "14"] }); expect(queryByRole("listbox")).toBeTruthy(); expect(getByText("Option 06, Option 09, Option 14")).toBeTruthy(); expect(getByText("3", { exact: true })).toBeTruthy(); const clearSelectionButton = getByRole("button"); expect(clearSelectionButton.getAttribute("aria-label")).toBe("Clear selection"); - await userEvent.click(clearSelectionButton); + userEvent.click(clearSelectionButton); expect(onChange).toHaveBeenCalledWith({ value: [], error: "This field is required. Please, enter a value." }); expect(queryByRole("listbox")).toBeTruthy(); expect(queryByText("Option 06, Option 09, Option 14")).toBeFalsy(); expect(queryByText("3")).toBeFalsy(); expect(queryByRole("button")).toBeFalsy(); }); - test("Non-Grouped Options: Multiple selection - Optional option should not be added when the select is marked as multiple", async () => { + test("Non-Grouped Options: Multiple selection - Optional option should not be added when the select is marked as multiple", () => { const onChange = jest.fn(); const { getByText, getAllByText, getByRole, getAllByRole } = render( <DxcSelect @@ -608,21 +642,21 @@ describe("Select component tests", () => { ); const select = getByRole("combobox"); expect(getByText("(Optional)")).toBeTruthy(); - await userEvent.click(select); + userEvent.click(select); expect(getAllByText("Choose an option").length).toBe(1); const options = getAllByRole("option"); - options[0] && (await userEvent.click(options[0])); + options[0] && userEvent.click(options[0]); expect(onChange).toHaveBeenCalledWith({ value: ["1"] }); expect(getAllByText("Option 01").length).toBe(2); }); - test("Non-Grouped Options - If an options was previously selected when its opened (by key press), the visual focus appears always in the selected option", async () => { + test("Non-Grouped Options - If an options was previously selected when its opened (by key press), the visual focus appears always in the selected option", () => { const { getByText, getByRole, getAllByRole } = render( <DxcSelect label="test-select-label" options={singleOptions} /> ); const select = getByRole("combobox"); - await userEvent.click(select); + userEvent.click(select); const options = getAllByRole("option"); - options[4] && (await userEvent.click(options[4])); + options[4] && userEvent.click(options[4]); expect(getByText("Option 05")).toBeTruthy(); fireEvent.keyDown(select, { key: "ArrowUp", code: "ArrowUp", keyCode: 38, charCode: 38 }); expect(select.getAttribute("aria-activedescendant")).toBe("option-4"); @@ -636,21 +670,21 @@ describe("Select component tests", () => { fireEvent.keyDown(select, { key: "Enter", code: "Enter", keyCode: 13, charCode: 13 }); expect(getByText("Option 06")).toBeTruthy(); }); - test("Non-Grouped Options - If an options was previously selected when its opened (by click and key press), the visual focus appears always in the selected option", async () => { + test("Non-Grouped Options - If an options was previously selected when its opened (by click and key press), the visual focus appears always in the selected option", () => { const { getByText, getByRole, getAllByRole, queryByRole } = render( <DxcSelect label="test-select-label" options={singleOptions} /> ); const select = getByRole("combobox"); - await userEvent.click(select); + userEvent.click(select); const options = getAllByRole("option"); - options[15] && (await userEvent.click(options[15])); + options[15] && userEvent.click(options[15]); expect(queryByRole("listbox")).toBeFalsy(); expect(getByText("Option 16")).toBeTruthy(); - await userEvent.click(select); + userEvent.click(select); expect(select.getAttribute("aria-activedescendant")).toBeNull(); fireEvent.keyDown(select, { key: "ArrowUp", code: "ArrowUp", keyCode: 38, charCode: 38 }); expect(select.getAttribute("aria-activedescendant")).toBe("option-15"); - await userEvent.click(select); + userEvent.click(select); expect(queryByRole("listbox")).toBeFalsy(); fireEvent.keyDown(select, { key: "ArrowDown", code: "ArrowDown", keyCode: 40, charCode: 40 }); expect(select.getAttribute("aria-activedescendant")).toBe("option-15"); @@ -660,12 +694,12 @@ describe("Select component tests", () => { fireEvent.keyDown(select, { key: "Enter", code: "Enter", keyCode: 13, charCode: 13 }); expect(getByText("Option 17")).toBeTruthy(); }); - test("Grouped Options - Opens listbox and renders it correctly or closes it with a click on select", async () => { + test("Grouped Options - Opens listbox and renders it correctly or closes it with a click on select", () => { const { getByText, getByRole, getAllByRole, queryByRole } = render( - <DxcSelect label="test-select-label" options={groupOptions} /> + <DxcSelect label="test-select-label" options={groupedOptions} /> ); const select = getByRole("combobox"); - await userEvent.click(select); + userEvent.click(select); const listbox = getByRole("listbox"); expect(listbox).toBeTruthy(); expect(select.getAttribute("aria-expanded")).toBe("true"); @@ -681,11 +715,11 @@ describe("Select component tests", () => { expect(groups[1]?.getAttribute("aria-labelledby")).toBe(groupLabels[1]?.id); expect(groups[2]?.getAttribute("aria-labelledby")).toBe(groupLabels[2]?.id); expect(getAllByRole("option").length).toBe(18); - await userEvent.click(select); + userEvent.click(select); expect(queryByRole("listbox")).toBeFalsy(); expect(select.getAttribute("aria-expanded")).toBe("false"); }); - test("Grouped Options - If an empty list of options in a group is passed, the select is rendered but doesn't open the listbox", async () => { + test("Grouped Options - If an empty list of options in a group is passed, the select is rendered but doesn't open the listbox", () => { const { getByRole, queryByRole } = render( <DxcSelect label="test-select-label" @@ -698,45 +732,45 @@ describe("Select component tests", () => { /> ); const select = getByRole("combobox"); - await userEvent.click(select); + userEvent.click(select); expect(queryByRole("listbox")).toBeFalsy(); expect(select.getAttribute("aria-expanded")).toBe("false"); }); - test("Grouped Options - Click in an option selects it and closes the listbox", async () => { + test("Grouped Options - Click in an option selects it and closes the listbox", () => { const onChange = jest.fn(); const { getByText, getByRole, getAllByRole, queryByRole, container } = render( - <DxcSelect name="test" label="test-select-label" options={groupOptions} onChange={onChange} /> + <DxcSelect name="test" label="test-select-label" options={groupedOptions} onChange={onChange} /> ); const select = getByRole("combobox"); const submitInput = container.querySelector<HTMLInputElement>(`input[name="test"]`); - await userEvent.click(select); + userEvent.click(select); let options = getAllByRole("option"); - options[8] && (await userEvent.click(options[8])); + options[8] && userEvent.click(options[8]); expect(onChange).toHaveBeenCalledWith({ value: "oviedo" }); expect(queryByRole("listbox")).toBeFalsy(); expect(getByText("Oviedo")).toBeTruthy(); - await userEvent.click(select); + userEvent.click(select); options = getAllByRole("option"); expect(options[8]?.getAttribute("aria-selected")).toBe("true"); expect(submitInput?.value).toBe("oviedo"); }); - test("Grouped Options - Optional renders an empty first option (out of any group) with the placeholder as its label", async () => { + test("Grouped Options - Optional renders an empty first option (out of any group) with the placeholder as its label", () => { const onChange = jest.fn(); const { getByRole, getAllByRole, getAllByText } = render( <DxcSelect label="test-select-label" placeholder="Placeholder example" - options={groupOptions} + options={groupedOptions} onChange={onChange} optional /> ); const select = getByRole("combobox"); - await userEvent.click(select); + userEvent.click(select); expect(getAllByText("Placeholder example").length).toBe(2); const options = getAllByRole("option"); expect(options[0]?.getAttribute("aria-selected")).toBe("true"); - options[0] && (await userEvent.click(options[0])); + options[0] && userEvent.click(options[0]); expect(onChange).toHaveBeenCalledWith({ value: "" }); expect(getAllByText("Placeholder example").length).toBe(1); fireEvent.keyDown(select, { key: "ArrowDown", code: "ArrowDown", keyCode: 40, charCode: 40 }); @@ -747,35 +781,35 @@ describe("Select component tests", () => { fireEvent.keyDown(select, { key: "ArrowUp", code: "ArrowUp", keyCode: 38, charCode: 38 }); expect(select.getAttribute("aria-activedescendant")).toBe("option-0"); }); - test("Grouped Options - Filtering options never affects the optional item until there are no coincidence", async () => { + test("Grouped Options - Filtering options never affects the optional item until there are no coincidence", () => { const { getByRole, getAllByRole, getByText, queryByText, container } = render( <DxcSelect label="test-select-label" placeholder="Placeholder example" - options={groupOptions} + options={groupedOptions} optional searchable /> ); const select = getByRole("combobox"); const searchInput = container.querySelectorAll("input")[1]; - await userEvent.click(select); - searchInput && (await userEvent.type(searchInput, "ro")); + userEvent.click(select); + searchInput && userEvent.type(searchInput, "ro"); expect(getByText("Placeholder example")).toBeTruthy(); expect(getAllByRole("option").length).toBe(6); - searchInput && (await userEvent.type(searchInput, "roro")); + searchInput && userEvent.type(searchInput, "roro"); expect(queryByText("Placeholder example")).toBeFalsy(); expect(getByText("No matches found")).toBeTruthy(); }); test("Grouped Options: Arrow up key - Opens the listbox and visually focus the last option", () => { - const { getByRole, queryByRole } = render(<DxcSelect label="test-select-label" options={groupOptions} />); + const { getByRole, queryByRole } = render(<DxcSelect label="test-select-label" options={groupedOptions} />); const select = getByRole("combobox"); fireEvent.keyDown(select, { key: "ArrowUp", code: "ArrowUp", keyCode: 38, charCode: 38 }); expect(queryByRole("listbox")).toBeTruthy(); expect(select.getAttribute("aria-activedescendant")).toBe("option-17"); }); test("Grouped Options: Arrow up key - Puts the focus in last option when the first one is visually focused", () => { - const { getByRole, queryByRole } = render(<DxcSelect label="test-select-label" options={groupOptions} />); + const { getByRole, queryByRole } = render(<DxcSelect label="test-select-label" options={groupedOptions} />); const select = getByRole("combobox"); fireEvent.keyDown(select, { key: "ArrowDown", code: "ArrowDown", keyCode: 40, charCode: 40 }); fireEvent.keyDown(select, { key: "ArrowUp", code: "ArrowUp", keyCode: 38, charCode: 38 }); @@ -783,24 +817,24 @@ describe("Select component tests", () => { expect(select.getAttribute("aria-activedescendant")).toBe("option-17"); }); test("Grouped Options: Arrow down key - Opens the listbox and visually focus the first option", () => { - const { getByRole, queryByRole } = render(<DxcSelect label="test-select-label" options={groupOptions} />); + const { getByRole, queryByRole } = render(<DxcSelect label="test-select-label" options={groupedOptions} />); const select = getByRole("combobox"); fireEvent.keyDown(select, { key: "ArrowDown", code: "ArrowDown", keyCode: 40, charCode: 40 }); expect(queryByRole("listbox")).toBeTruthy(); expect(select.getAttribute("aria-activedescendant")).toBe("option-0"); }); test("Grouped Options: Arrow down key - Puts the focus in the first option when the last one is visually focused", () => { - const { getByRole, queryByRole } = render(<DxcSelect label="test-select-label" options={groupOptions} />); + const { getByRole, queryByRole } = render(<DxcSelect label="test-select-label" options={groupedOptions} />); const select = getByRole("combobox"); fireEvent.keyDown(select, { key: "ArrowUp", code: "ArrowUp", keyCode: 38, charCode: 38 }); fireEvent.keyDown(select, { key: "ArrowDown", code: "ArrowDown", keyCode: 40, charCode: 40 }); expect(queryByRole("listbox")).toBeTruthy(); expect(select.getAttribute("aria-activedescendant")).toBe("option-0"); }); - test("Grouped Options: Enter key - Selects the visually focused option and closes the listbox", async () => { + test("Grouped Options: Enter key - Selects the visually focused option and closes the listbox", () => { const onChange = jest.fn(); const { getByText, getByRole, getAllByRole, queryByRole } = render( - <DxcSelect label="test-select-label" options={groupOptions} onChange={onChange} optional /> + <DxcSelect label="test-select-label" options={groupedOptions} onChange={onChange} optional /> ); const select = getByRole("combobox"); fireEvent.keyDown(select, { key: "ArrowUp", code: "ArrowUp", keyCode: 38, charCode: 38 }); @@ -811,56 +845,56 @@ describe("Select component tests", () => { expect(onChange).toHaveBeenCalledWith({ value: "ebro" }); expect(queryByRole("listbox")).toBeFalsy(); expect(getByText("Ebro")).toBeTruthy(); - await userEvent.click(select); + userEvent.click(select); const options = getAllByRole("option"); expect(options[18]?.getAttribute("aria-selected")).toBe("true"); }); - test("Grouped Options: Searchable - Displays an input for filtering the list of options", async () => { + test("Grouped Options: Searchable - Displays an input for filtering the list of options", () => { const onChange = jest.fn(); const { container, getByText, getByRole, getAllByRole, queryByRole } = render( - <DxcSelect label="test-select-label" options={groupOptions} onChange={onChange} searchable /> + <DxcSelect label="test-select-label" options={groupedOptions} onChange={onChange} searchable /> ); const select = getByRole("combobox"); const searchInput = container.querySelectorAll("input")[1]; - await userEvent.click(select); + userEvent.click(select); expect(getByRole("listbox")).toBeTruthy(); - searchInput && (await userEvent.type(searchInput, "ro")); + searchInput && userEvent.type(searchInput, "ro"); expect(getAllByRole("presentation").length).toBe(2); expect(getAllByRole("option").length).toBe(5); expect(getByText("Colores")).toBeTruthy(); expect(getByText("Ríos españoles")).toBeTruthy(); let options = getAllByRole("option"); - options[4] && (await userEvent.click(options[4])); + options[4] && userEvent.click(options[4]); expect(onChange).toHaveBeenCalledWith({ value: "ebro" }); expect(queryByRole("listbox")).toBeFalsy(); expect(getByText("Ebro")).toBeTruthy(); expect(searchInput?.value).toBe(""); - await userEvent.click(select); + userEvent.click(select); options = getAllByRole("option"); expect(options[17]?.getAttribute("aria-selected")).toBe("true"); }); - test("Grouped Options: Searchable - Displays 'No matches found' when there are no filtering results", async () => { + test("Grouped Options: Searchable - Displays 'No matches found' when there are no filtering results", () => { const onChange = jest.fn(); const { container, getByText, getByRole } = render( - <DxcSelect label="test-select-label" options={groupOptions} onChange={onChange} searchable /> + <DxcSelect label="test-select-label" options={groupedOptions} onChange={onChange} searchable /> ); const select = getByRole("combobox"); const searchInput = container.querySelectorAll("input")[1]; - await userEvent.click(select); + userEvent.click(select); expect(getByRole("listbox")).toBeTruthy(); - searchInput && (await userEvent.type(searchInput, "very long string")); + searchInput && userEvent.type(searchInput, "very long string"); expect(getByText("No matches found")).toBeTruthy(); }); - test("Grouped Options: Multiple selection - Displays a checkbox per option and enables the multi-selection", async () => { + test("Grouped Options: Multiple selection - Displays a checkbox per option and enables the multi-selection", () => { const onChange = jest.fn(); const { getByText, getAllByText, getByRole, getAllByRole, queryByRole, container } = render( - <DxcSelect name="test" label="test-select-label" options={groupOptions} onChange={onChange} multiple /> + <DxcSelect name="test" label="test-select-label" options={groupedOptions} onChange={onChange} multiple /> ); const select = getByRole("combobox"); const submitInput = container.querySelector<HTMLInputElement>(`input[name="test"]`); - await userEvent.click(select); + userEvent.click(select); const options = getAllByRole("option"); - options[10] && (await userEvent.click(options[10])); + options[10] && userEvent.click(options[10]); expect(onChange).toHaveBeenCalledWith({ value: ["bilbao"] }); expect(queryByRole("listbox")).toBeTruthy(); expect(getAllByText("Bilbao").length).toBe(2); @@ -872,37 +906,37 @@ describe("Select component tests", () => { expect(getByText("Bilbao, Guadalquivir")).toBeTruthy(); expect(submitInput?.value).toBe("bilbao,guadalquivir"); }); - test("Grouped Options: Multiple selection - Clear action and selection indicator", async () => { + test("Grouped Options: Multiple selection - Clear action and selection indicator", () => { const onChange = jest.fn(); const { getByText, queryByText, getByRole, getAllByRole, queryByRole } = render( - <DxcSelect label="test-select-label" options={groupOptions} onChange={onChange} multiple /> + <DxcSelect label="test-select-label" options={groupedOptions} onChange={onChange} multiple /> ); const select = getByRole("combobox"); - await userEvent.click(select); + userEvent.click(select); const options = getAllByRole("option"); - options[5] && (await userEvent.click(options[5])); - options[8] && (await userEvent.click(options[8])); - options[13] && (await userEvent.click(options[13])); - options[17] && (await userEvent.click(options[17])); + options[5] && userEvent.click(options[5]); + options[8] && userEvent.click(options[8]); + options[13] && userEvent.click(options[13]); + options[17] && userEvent.click(options[17]); expect(onChange).toHaveBeenCalledWith({ value: ["blanco", "oviedo", "duero", "ebro"] }); expect(queryByRole("listbox")).toBeTruthy(); expect(getByText("Blanco, Oviedo, Duero, Ebro")).toBeTruthy(); expect(getByText("4", { exact: true })).toBeTruthy(); const clearSelectionButton = getByRole("button"); expect(clearSelectionButton.getAttribute("aria-label")).toBe("Clear selection"); - await userEvent.click(clearSelectionButton); + userEvent.click(clearSelectionButton); expect(queryByRole("listbox")).toBeTruthy(); expect(queryByText("Blanco, Oviedo, Duero, Ebro")).toBeFalsy(); expect(queryByText("4")).toBeFalsy(); expect(queryByRole("button")).toBeFalsy(); }); - test("Grouped Options: Multiple selection - Optional option should not be added when the select is marked as multiple", async () => { + test("Grouped Options: Multiple selection - Optional option should not be added when the select is marked as multiple", () => { const onChange = jest.fn(); const { getByText, getAllByText, getByRole, getAllByRole } = render( <DxcSelect label="test-select-label" placeholder="Choose an option" - options={groupOptions} + options={groupedOptions} onChange={onChange} multiple optional @@ -910,21 +944,21 @@ describe("Select component tests", () => { ); const select = getByRole("combobox"); expect(getByText("(Optional)")).toBeTruthy(); - await userEvent.click(select); + userEvent.click(select); expect(getAllByText("Choose an option").length).toBe(1); const options = getAllByRole("option"); - options[0] && (await userEvent.click(options[0])); + options[0] && userEvent.click(options[0]); expect(onChange).toHaveBeenCalledWith({ value: ["azul"] }); expect(getAllByText("Azul").length).toBe(2); }); - test("Grouped Options - If an options was previously selected when its opened (by key press), the visual focus appears always in the selected option", async () => { + test("Grouped Options - If an options was previously selected when its opened (by key press), the visual focus appears always in the selected option", () => { const { getByText, getByRole, getAllByRole } = render( - <DxcSelect label="test-select-label" options={groupOptions} /> + <DxcSelect label="test-select-label" options={groupedOptions} /> ); const select = getByRole("combobox"); - await userEvent.click(select); + userEvent.click(select); const options = getAllByRole("option"); - options[2] && (await userEvent.click(options[2])); + options[2] && userEvent.click(options[2]); expect(getByText("Rosa")).toBeTruthy(); fireEvent.keyDown(select, { key: "ArrowUp", code: "ArrowUp", keyCode: 38, charCode: 38 }); expect(select.getAttribute("aria-activedescendant")).toBe("option-2"); @@ -938,20 +972,20 @@ describe("Select component tests", () => { fireEvent.keyDown(select, { key: "Enter", code: "Enter", keyCode: 13, charCode: 13 }); expect(getByText("Verde")).toBeTruthy(); }); - test("Grouped Options - If an options was previously selected when its opened (by click and key press), the visual focus appears always in the selected option", async () => { + test("Grouped Options - If an options was previously selected when its opened (by click and key press), the visual focus appears always in the selected option", () => { const { getByText, getByRole, getAllByRole } = render( - <DxcSelect label="test-select-label" options={groupOptions} /> + <DxcSelect label="test-select-label" options={groupedOptions} /> ); const select = getByRole("combobox"); - await userEvent.click(select); + userEvent.click(select); const options = getAllByRole("option"); - options[17] && (await userEvent.click(options[17])); + options[17] && userEvent.click(options[17]); expect(getByText("Ebro")).toBeTruthy(); - await userEvent.click(select); + userEvent.click(select); expect(select.getAttribute("aria-activedescendant")).toBeNull(); fireEvent.keyDown(select, { key: "ArrowUp", code: "ArrowUp", keyCode: 38, charCode: 38 }); expect(select.getAttribute("aria-activedescendant")).toBe("option-17"); - await userEvent.click(select); + userEvent.click(select); fireEvent.keyDown(select, { key: "ArrowDown", code: "ArrowDown", keyCode: 40, charCode: 40 }); expect(select.getAttribute("aria-activedescendant")).toBe("option-17"); fireEvent.keyDown(select, { key: "ArrowDown", code: "ArrowDown", keyCode: 40, charCode: 40 }); @@ -960,21 +994,64 @@ describe("Select component tests", () => { fireEvent.keyDown(select, { key: "Enter", code: "Enter", keyCode: 13, charCode: 13 }); expect(getByText("Azul")).toBeTruthy(); }); - test("Multiple selection and optional - Clear action cleans every selected option but does not display an error", async () => { + test("Multiple selection and optional - Clear action cleans every selected option but does not display an error", () => { const onChange = jest.fn(); const { getByRole, getAllByRole } = render( <DxcSelect label="test-select-label" options={singleOptions} onChange={onChange} multiple optional /> ); const select = getByRole("combobox"); - await userEvent.click(select); + userEvent.click(select); const options = getAllByRole("option"); - options[5] && (await userEvent.click(options[5])); - options[8] && (await userEvent.click(options[8])); - options[13] && (await userEvent.click(options[13])); + options[5] && userEvent.click(options[5]); + options[8] && userEvent.click(options[8]); + options[13] && userEvent.click(options[13]); expect(onChange).toHaveBeenCalledWith({ value: ["6", "9", "14"] }); const clearSelectionButton = getByRole("button"); expect(clearSelectionButton.getAttribute("aria-label")).toBe("Clear selection"); - await userEvent.click(clearSelectionButton); + userEvent.click(clearSelectionButton); expect(onChange).toHaveBeenCalledWith({ value: [] }); }); -}); \ No newline at end of file + test("Select all (single) - 'Select all' options is included and selects all the options available", () => { + const onChange = jest.fn(); + const { getByRole, getByText } = render( + <DxcSelect + enableSelectAll + label="Select an option" + multiple + options={reducedSingleOptions} + placeholder="Select an available option" + onChange={onChange} + optional + /> + ); + const select = getByRole("combobox"); + fireEvent.keyDown(select, { key: "ArrowDown", code: "ArrowDown", keyCode: 40, charCode: 40 }); + expect(getByText("Select all")).toBeTruthy(); + fireEvent.keyDown(select, { key: "Enter", code: "Enter", keyCode: 13, charCode: 13 }); + expect(onChange).toHaveBeenCalledWith({ value: ["1", "2", "3", "4"] }); + fireEvent.keyDown(select, { key: "Enter", code: "Enter", keyCode: 13, charCode: 13 }); + expect(onChange).toHaveBeenCalledWith({ value: [] }); + }); + test("Select all (groups) - 'Select all' options is included and selects all the options available", () => { + const onChange = jest.fn(); + const { getByRole, getByText } = render( + <DxcSelect + enableSelectAll + label="Select an option" + multiple + options={reducedGroupedOptions} + placeholder="Select an available option" + onChange={onChange} + /> + ); + const select = getByRole("combobox"); + fireEvent.keyDown(select, { key: "ArrowDown", code: "ArrowDown", keyCode: 40, charCode: 40 }); + expect(getByText("Select all")).toBeTruthy(); + fireEvent.keyDown(select, { key: "Enter", code: "Enter", keyCode: 13, charCode: 13 }); + expect(onChange).toHaveBeenCalledWith({ + value: ["azul", "rojo", "rosa", "madrid", "oviedo", "sevilla", "miño", "duero", "tajo"], + }); + fireEvent.keyDown(select, { key: "Enter", code: "Enter", keyCode: 13, charCode: 13 }); + expect(onChange).toHaveBeenCalledWith({ error: "This field is required. Please, enter a value.", value: [] }); + }); +}); diff --git a/packages/lib/src/select/Select.tsx b/packages/lib/src/select/Select.tsx index 9026ea5cfc..7167f972e7 100644 --- a/packages/lib/src/select/Select.tsx +++ b/packages/lib/src/select/Select.tsx @@ -7,7 +7,6 @@ import { MouseEvent, useCallback, useContext, - useEffect, useId, useMemo, useRef, @@ -325,21 +324,20 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( case "Enter": if (isOpen && visualFocusIndex >= 0) { let accLength = (multiple ? enableSelectAll : optional) ? 1 : 0; - if (searchable) { - if (filteredOptions.length > 0) { - if (!multiple && visualFocusIndex === 0 && optional) handleOnChangeValue(optionalItem); - else if (multiple && visualFocusIndex === 0 && enableSelectAll) handleSelectAllOnClick(); - else if (isArrayOfGroupedOptions(filteredOptions)) { - if (groupsHaveOptions(filteredOptions)) - filteredOptions.some((groupOption) => { - const groupLength = accLength + groupOption.options.length; - if (groupLength > visualFocusIndex) - handleOnChangeValue(groupOption.options[visualFocusIndex - accLength]); - accLength = groupLength; - return groupLength > visualFocusIndex; - }); - } else handleOnChangeValue(filteredOptions[visualFocusIndex - accLength]); - } + + if (searchable && filteredOptions.length > 0) { + if (!multiple && visualFocusIndex === 0 && optional) handleOnChangeValue(optionalItem); + else if (multiple && visualFocusIndex === 0 && enableSelectAll) handleSelectAllOnClick(); + else if (isArrayOfGroupedOptions(filteredOptions)) { + if (groupsHaveOptions(filteredOptions)) + filteredOptions.some((groupOption) => { + const groupLength = accLength + groupOption.options.length; + if (groupLength > visualFocusIndex) + handleOnChangeValue(groupOption.options[visualFocusIndex - accLength]); + accLength = groupLength; + return groupLength > visualFocusIndex; + }); + } else handleOnChangeValue(filteredOptions[visualFocusIndex - accLength]); } else if (!multiple && visualFocusIndex === 0 && optional) handleOnChangeValue(optionalItem); else if (multiple && visualFocusIndex === 0 && enableSelectAll) handleSelectAllOnClick(); else if (isArrayOfGroupedOptions(options)) @@ -351,6 +349,7 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( return groupLength > visualFocusIndex; }); else handleOnChangeValue(options[visualFocusIndex - accLength]); + if (!multiple) closeListbox(); setSearchValue(""); } @@ -405,7 +404,7 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( if (value == null) setInnerValue(selectAll(options)); onChange?.({ value: selectAll(options) as string & string[] }); } - }, [handleClearOptionsActionOnClick, onChange, options, value]); + }, [handleClearOptionsActionOnClick, innerValue, multiple, onChange, options, selectAll, value]); return ( <SelectContainer margin={margin} ref={ref} size={size}> From 02585eba7c4c69e34182d1b821064a45f682e58f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?= <44321109+GomezIvann@users.noreply.github.com> Date: Mon, 12 May 2025 13:59:36 +0200 Subject: [PATCH 3/7] Select all documentation updates, visual and unit tests --- .../components/select/code/SelectCodePage.tsx | 17 ++++++++++++- .../select/code/examples/groupedOptions.ts | 24 ++++++++----------- .../components/select/code/examples/icons.ts | 6 +++-- packages/lib/src/select/ListOption.tsx | 11 +++++++-- packages/lib/src/select/Select.stories.tsx | 4 ++++ packages/lib/src/select/types.ts | 6 +++++ 6 files changed, 49 insertions(+), 19 deletions(-) diff --git a/apps/website/screens/components/select/code/SelectCodePage.tsx b/apps/website/screens/components/select/code/SelectCodePage.tsx index f7eb17c85c..5b2f84f57e 100644 --- a/apps/website/screens/components/select/code/SelectCodePage.tsx +++ b/apps/website/screens/components/select/code/SelectCodePage.tsx @@ -61,6 +61,21 @@ const sections = [ <TableCode>false</TableCode> </td> </tr> + <tr> + <td> + <DxcFlex direction="column" gap="var(--spacing-gap-xs)" alignItems="baseline"> + <StatusBadge status="new" /> + enableSelectAll + </DxcFlex> + </td> + <td> + <TableCode>boolean</TableCode> + </td> + <td>Enables users to select multiple items from the list.</td> + <td> + <TableCode>false</TableCode> + </td> + </tr> <tr> <td>error</td> <td> @@ -305,7 +320,7 @@ const sections = [ content: <Example example={groups} defaultIsVisible />, }, { - title: "Icons", + title: "Icon usage", content: <Example example={icons} defaultIsVisible />, }, ], diff --git a/apps/website/screens/components/select/code/examples/groupedOptions.ts b/apps/website/screens/components/select/code/examples/groupedOptions.ts index 984d930118..5959da8a3c 100644 --- a/apps/website/screens/components/select/code/examples/groupedOptions.ts +++ b/apps/website/screens/components/select/code/examples/groupedOptions.ts @@ -3,30 +3,26 @@ import { DxcSelect, DxcInset } from "@dxc-technology/halstack-react"; const code = `() => { const options = [ { - label: "Managers", + label: "Designers", options: [ - { label: "Pablo", value: "pablo" }, - { label: "Marcos", value: "marcos" }, - { label: "Rachel", value: "rachel" }, - { label: "Margaret", value: "margaret" }, + { label: "Lara", value: "lara" }, + { label: "Irene", value: "irene" } ], }, { - label: "Engineers", + label: "Developers", options: [ - { label: "Yiminghe", value: "yiminghe" }, - { label: "Manuel", value: "manuel" }, - { label: "Bryan", value: "bryan" }, - { label: "Anand", value: "anand" }, + { label: "Jairo", value: "jairo" }, + { label: "Enrique", value: "enrique" }, { label: "Jiale", value: "jiale" }, + { label: "Iván", value: "ivan" } ], }, { - label: "Designers", + label: "Managers", options: [ - { label: "Alex", value: "alex" }, - { label: "Tim", value: "tim" }, - { label: "Jairo", value: "Jairo" }, + { label: "Aitor", value: "aitor" }, + { label: "Raquel", value: "Raquel" } ], }, ]; diff --git a/apps/website/screens/components/select/code/examples/icons.ts b/apps/website/screens/components/select/code/examples/icons.ts index 35d6558819..6fcbf9f830 100644 --- a/apps/website/screens/components/select/code/examples/icons.ts +++ b/apps/website/screens/components/select/code/examples/icons.ts @@ -54,9 +54,11 @@ const code = `() => { return ( <DxcInset space="var(--spacing-padding-xl)"> <DxcSelect - label="Select your favourite social media" - placeholder="Choose an option" + label="Select your favourite hobbies" + placeholder="Choose your hobbies" options={options_material} + multiple + enableSelectAll /> </DxcInset> ); diff --git a/packages/lib/src/select/ListOption.tsx b/packages/lib/src/select/ListOption.tsx index dc3241f185..6dd6798f8a 100644 --- a/packages/lib/src/select/ListOption.tsx +++ b/packages/lib/src/select/ListOption.tsx @@ -24,6 +24,7 @@ const OptionItem = styled.li<{ const StyledOption = styled.span<{ grouped: OptionProps["isGroupedOption"]; + isSelectAllOption: OptionProps["isSelectAllOption"]; last: OptionProps["isLastOption"]; selected: OptionProps["isSelected"]; visualFocused: OptionProps["visualFocused"]; @@ -34,6 +35,7 @@ const StyledOption = styled.span<{ gap: var(--spacing-gap-s); height: var(--height-m); ${({ grouped }) => grouped && "padding-left: var(--spacing-padding-s);"} + ${({ isSelectAllOption }) => isSelectAllOption && "margin-bottom: var(--spacing-padding-xxs);"} ${(props) => `border-bottom: var(--border-width-s) var(--border-style-default) ${props.last || props.visualFocused || props.selected ? "transparent" : "var(--border-color-neutral-lighter)"};`}; @@ -44,7 +46,6 @@ const OptionIcon = styled.span` place-items: center; color: var(--color-fg-neutral-dark); font-size: var(--height-xxs); - svg { height: var(--height-xxs); width: 16px; @@ -109,7 +110,13 @@ const ListOption = ({ selected={isSelected} visualFocused={visualFocused} > - <StyledOption grouped={isGroupedOption} selected={isSelected} visualFocused={visualFocused} last={isLastOption}> + <StyledOption + isSelectAllOption={isSelectAllOption} + grouped={isGroupedOption} + selected={isSelected} + visualFocused={visualFocused} + last={isLastOption} + > {multiple && <DxcCheckbox checked={isSelected} tabIndex={-1} ref={checkboxRef} />} {option.icon && ( <OptionIcon>{typeof option.icon === "string" ? <DxcIcon icon={option.icon} /> : option.icon}</OptionIcon> diff --git a/packages/lib/src/select/Select.stories.tsx b/packages/lib/src/select/Select.stories.tsx index f337498710..7600f25e7a 100644 --- a/packages/lib/src/select/Select.stories.tsx +++ b/packages/lib/src/select/Select.stories.tsx @@ -218,6 +218,10 @@ const optionsWithEllipsis = [ const Select = () => ( <> + <ExampleContainer> + <Title title="Default" theme="light" level={4} /> + <DxcSelect label="Default" options={single_options} /> + </ExampleContainer> <ExampleContainer pseudoState="pseudo-hover"> <Title title="Hovered" theme="light" level={4} /> <DxcSelect label="Hovered" options={single_options} /> diff --git a/packages/lib/src/select/types.ts b/packages/lib/src/select/types.ts index 0900665a18..f5b84f7ea2 100644 --- a/packages/lib/src/select/types.ts +++ b/packages/lib/src/select/types.ts @@ -102,6 +102,9 @@ type CommonProps = { }; type SingleSelect = CommonProps & { + /** + * Enables users to select multiple items from the list. + */ enableSelectAll?: never; /** * If true, the select component will support multiple selected options. @@ -134,6 +137,9 @@ type SingleSelect = CommonProps & { }; type MultipleSelect = CommonProps & { + /** + * Enables users to select multiple items from the list. + */ enableSelectAll?: boolean; /** * If true, the select component will support multiple selected options. From f7fde393634c9e53bcfe1939d58e718f7a241a9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?= <44321109+GomezIvann@users.noreply.github.com> Date: Mon, 12 May 2025 14:08:02 +0200 Subject: [PATCH 4/7] New test added --- packages/lib/src/select/Select.test.tsx | 34 ++++++++++++++++++++----- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/packages/lib/src/select/Select.test.tsx b/packages/lib/src/select/Select.test.tsx index aa263bf8cc..299943b5ad 100644 --- a/packages/lib/src/select/Select.test.tsx +++ b/packages/lib/src/select/Select.test.tsx @@ -1011,7 +1011,7 @@ describe("Select component tests", () => { userEvent.click(clearSelectionButton); expect(onChange).toHaveBeenCalledWith({ value: [] }); }); - test("Select all (single) - 'Select all' options is included and selects all the options available", () => { + test("Select all (single) - 'Select all' option is included and selects all the options available", () => { const onChange = jest.fn(); const { getByRole, getByText } = render( <DxcSelect @@ -1025,14 +1025,36 @@ describe("Select component tests", () => { /> ); const select = getByRole("combobox"); - fireEvent.keyDown(select, { key: "ArrowDown", code: "ArrowDown", keyCode: 40, charCode: 40 }); - expect(getByText("Select all")).toBeTruthy(); - fireEvent.keyDown(select, { key: "Enter", code: "Enter", keyCode: 13, charCode: 13 }); + userEvent.click(select); + const selectAllOption = getByText("Select all"); + selectAllOption && userEvent.click(selectAllOption); expect(onChange).toHaveBeenCalledWith({ value: ["1", "2", "3", "4"] }); - fireEvent.keyDown(select, { key: "Enter", code: "Enter", keyCode: 13, charCode: 13 }); + selectAllOption && userEvent.click(selectAllOption); expect(onChange).toHaveBeenCalledWith({ value: [] }); }); - test("Select all (groups) - 'Select all' options is included and selects all the options available", () => { + test("Select all (groups) - 'Select all' option is included and selects all the options available", () => { + const onChange = jest.fn(); + const { getByRole, getByText } = render( + <DxcSelect + enableSelectAll + label="Select an option" + multiple + options={reducedGroupedOptions} + placeholder="Select an available option" + onChange={onChange} + /> + ); + const select = getByRole("combobox"); + userEvent.click(select); + const selectAllOption = getByText("Select all"); + selectAllOption && userEvent.click(selectAllOption); + expect(onChange).toHaveBeenCalledWith({ + value: ["azul", "rojo", "rosa", "madrid", "oviedo", "sevilla", "miño", "duero", "tajo"], + }); + selectAllOption && userEvent.click(selectAllOption); + expect(onChange).toHaveBeenCalledWith({ error: "This field is required. Please, enter a value.", value: [] }); + }); + test("Select all - Keyboard navigation is correct", () => { const onChange = jest.fn(); const { getByRole, getByText } = render( <DxcSelect From e105211ea8e2ce906963ba7f14f75cd715949f46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?= <44321109+GomezIvann@users.noreply.github.com> Date: Mon, 12 May 2025 16:05:48 +0200 Subject: [PATCH 5/7] Select all localization label added --- .../localization/LocalizationPage.tsx | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/apps/website/screens/principles/localization/LocalizationPage.tsx b/apps/website/screens/principles/localization/LocalizationPage.tsx index c206fe1310..1c18708f5a 100644 --- a/apps/website/screens/principles/localization/LocalizationPage.tsx +++ b/apps/website/screens/principles/localization/LocalizationPage.tsx @@ -539,12 +539,6 @@ const sections = [ </tr> </thead> <tbody> - <tr> - <td> - <Code>noMatchesErrorMessage</Code> - </td> - <td>No matches found</td> - </tr> <tr> <td> <Code>actionClearSelectionTitle</Code> @@ -557,6 +551,18 @@ const sections = [ </td> <td>Clear search</td> </tr> + <tr> + <td> + <Code>noMatchesErrorMessage</Code> + </td> + <td>No matches found</td> + </tr> + <tr> + <td> + <Code>selectAllLabel</Code> + </td> + <td>Select all</td> + </tr> </tbody> </DxcTable> ), From 7e1965b065c2139db42a208ae493cb69d22e0884 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?= <44321109+GomezIvann@users.noreply.github.com> Date: Mon, 12 May 2025 17:00:21 +0200 Subject: [PATCH 6/7] Select all designers feedback --- .../select/overview/images/select_anatomy.png | Bin 68848 -> 100115 bytes packages/lib/src/select/ListOption.tsx | 10 +--------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/apps/website/screens/components/select/overview/images/select_anatomy.png b/apps/website/screens/components/select/overview/images/select_anatomy.png index ce1fc758858f3b7825dd41ef0188a7eaff55dd35..f6358f86afc6b4401480cd003500021a2b720ea3 100644 GIT binary patch literal 100115 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�%?3KhK-*nw( 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 literal 68848 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 OmS5Hf;V9>AAN>~*F$Z-3 diff --git a/packages/lib/src/select/ListOption.tsx b/packages/lib/src/select/ListOption.tsx index 6dd6798f8a..8b72554ba1 100644 --- a/packages/lib/src/select/ListOption.tsx +++ b/packages/lib/src/select/ListOption.tsx @@ -24,7 +24,6 @@ const OptionItem = styled.li<{ const StyledOption = styled.span<{ grouped: OptionProps["isGroupedOption"]; - isSelectAllOption: OptionProps["isSelectAllOption"]; last: OptionProps["isLastOption"]; selected: OptionProps["isSelected"]; visualFocused: OptionProps["visualFocused"]; @@ -35,7 +34,6 @@ const StyledOption = styled.span<{ gap: var(--spacing-gap-s); height: var(--height-m); ${({ grouped }) => grouped && "padding-left: var(--spacing-padding-s);"} - ${({ isSelectAllOption }) => isSelectAllOption && "margin-bottom: var(--spacing-padding-xxs);"} ${(props) => `border-bottom: var(--border-width-s) var(--border-style-default) ${props.last || props.visualFocused || props.selected ? "transparent" : "var(--border-color-neutral-lighter)"};`}; @@ -110,13 +108,7 @@ const ListOption = ({ selected={isSelected} visualFocused={visualFocused} > - <StyledOption - isSelectAllOption={isSelectAllOption} - grouped={isGroupedOption} - selected={isSelected} - visualFocused={visualFocused} - last={isLastOption} - > + <StyledOption grouped={isGroupedOption} last={isLastOption} selected={isSelected} visualFocused={visualFocused}> {multiple && <DxcCheckbox checked={isSelected} tabIndex={-1} ref={checkboxRef} />} {option.icon && ( <OptionIcon>{typeof option.icon === "string" ? <DxcIcon icon={option.icon} /> : option.icon}</OptionIcon> From efb28769a1480386807d2ef053f6b4977081fa85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?= <44321109+GomezIvann@users.noreply.github.com> Date: Wed, 14 May 2025 12:22:52 +0200 Subject: [PATCH 7/7] Select all groups variant --- .../select/overview/SelectOverviewPage.tsx | 56 +++++++ packages/lib/src/select/Listbox.tsx | 67 +++++--- packages/lib/src/select/Select.stories.tsx | 37 +++-- packages/lib/src/select/Select.test.tsx | 135 +++++++++++++++-- packages/lib/src/select/Select.tsx | 143 +++++++++++++----- packages/lib/src/select/types.ts | 4 +- packages/lib/src/select/utils.ts | 52 +++++-- 7 files changed, 405 insertions(+), 89 deletions(-) diff --git a/apps/website/screens/components/select/overview/SelectOverviewPage.tsx b/apps/website/screens/components/select/overview/SelectOverviewPage.tsx index 97579c7ac9..bfd1594738 100644 --- a/apps/website/screens/components/select/overview/SelectOverviewPage.tsx +++ b/apps/website/screens/components/select/overview/SelectOverviewPage.tsx @@ -8,6 +8,7 @@ import multiple from "./examples/multiple"; import filterable from "./examples/filterable"; import Image from "@/common/Image"; import anatomy from "./images/select_anatomy.png"; +import Code from "@/common/Code"; const sections = [ { @@ -158,6 +159,61 @@ const sections = [ </> ), }, + { + title: "Select all and grouped selection", + content: ( + <DxcParagraph> + <strong>Select all</strong> and <strong>grouped selection</strong> options provide users with efficient ways + to manage large sets of checkable items within a list, dropdown, or multi-select component. These options + help reduce interaction costs and minimize repetitive actions, especially when dealing with categorized data + or bulk selection scenarios. + </DxcParagraph> + ), + subSections: [ + { + title: "Select all", + content: ( + <> + <DxcParagraph> + The <strong>select all</strong> option (<Code>enableSelectAll</Code>) allows users to quickly select + or deselect all items in a list with a single action. + </DxcParagraph> + <DxcParagraph> + When the flag is set to true, a checkbox labelled with <em>"Select all"</em> text is placed at the top + of the list or above grouped items. It should visually reflect the current state: + </DxcParagraph> + <DxcBulletedList> + <DxcBulletedList.Item>Unselected when no items are selected.</DxcBulletedList.Item> + <DxcBulletedList.Item>Selected when all items are selected.</DxcBulletedList.Item> + <DxcBulletedList.Item>Indeterminate when only some items are selected.</DxcBulletedList.Item> + </DxcBulletedList> + </> + ), + }, + { + title: "Grouped selection", + content: ( + <> + <DxcParagraph> + <strong>Grouped selection</strong> enables users to manage selections within categorized sections of a + list. Each group has its own header with a group-level checkbox. This allows users to: + </DxcParagraph> + <DxcBulletedList> + <DxcBulletedList.Item>Quickly select all items within a specific group.</DxcBulletedList.Item> + <DxcBulletedList.Item>Understand how items are organized.</DxcBulletedList.Item> + <DxcBulletedList.Item> + Maintain more granular control over selection without losing the efficiency of bulk actions. + </DxcBulletedList.Item> + </DxcBulletedList> + <DxcParagraph> + Just like the global select all, group checkboxes also reflect the selection state (selected, + unselected, indeterminate) based on the individual items in that group. + </DxcParagraph> + </> + ), + }, + ], + }, ], }, { diff --git a/packages/lib/src/select/Listbox.tsx b/packages/lib/src/select/Listbox.tsx index d43a5d5c35..43fd840230 100644 --- a/packages/lib/src/select/Listbox.tsx +++ b/packages/lib/src/select/Listbox.tsx @@ -3,7 +3,7 @@ import styled from "styled-components"; import DxcIcon from "../icon/Icon"; import { HalstackLanguageContext } from "../HalstackContext"; import ListOption from "./ListOption"; -import { getSelectionType, groupsHaveOptions } from "./utils"; +import { getGroupSelectionType, groupsHaveOptions } from "./utils"; import { ListboxProps, ListOptionGroupType, ListOptionType } from "./types"; import { scrollbarStyles } from "../styles/scroll"; import CheckboxContext from "../checkbox/CheckboxContext"; @@ -50,8 +50,9 @@ const GroupLabel = styled.li` const Listbox = ({ ariaLabelledBy, currentValue, - enabledSelectAll, + enableSelectAll, handleOptionOnClick, + handleGroupOnClick, handleSelectAllOnClick, id, lastOptionIndex, @@ -60,30 +61,61 @@ const Listbox = ({ optionalItem, options, searchable, + selectionType, styles, visualFocusIndex, }: ListboxProps) => { const translatedLabels = useContext(HalstackLanguageContext); const listboxRef = useRef<HTMLDivElement>(null); + let globalMappingIndex = (multiple ? enableSelectAll : optional) ? 0 : -1; + + const getGroupOption = (groupId: string, option: ListOptionGroupType) => { + if (multiple && enableSelectAll) { + const groupSelectionType = getGroupSelectionType(option.options, currentValue as string[]); + globalMappingIndex++; + + return ( + <CheckboxContext.Provider value={{ partial: groupSelectionType === "indeterminate" }}> + <ListOption + id={groupId} + isLastOption={lastOptionIndex === globalMappingIndex} + isSelected={groupSelectionType === "checked"} + isSelectAllOption + key={groupId} + multiple={true} + onClick={() => handleGroupOnClick(option)} + option={{ + label: option.label, + value: "", + }} + visualFocused={visualFocusIndex === globalMappingIndex} + /> + </CheckboxContext.Provider> + ); + } else + return ( + <GroupLabel id={groupId} role="presentation"> + {option.label} + </GroupLabel> + ); + }; - let globalIndex = (multiple ? enabledSelectAll : optional) ? 0 : -1; const mapOptionFunc = (option: ListOptionType | ListOptionGroupType, mapIndex: number) => { - const groupId = `${id}-group-${mapIndex}`; if ("options" in option) { + const groupId = `${id}-group-${mapIndex}`; + return ( option.options.length > 0 && ( - <ul key={groupId} aria-labelledby={groupId} role="group" style={{ padding: 0, margin: 0 }}> - <GroupLabel id={groupId} role="presentation"> - {option.label} - </GroupLabel> + <ul aria-labelledby={groupId} key={groupId} role="group" style={{ padding: 0, margin: 0 }}> + {getGroupOption(groupId, option)} {option.options.map((singleOption) => { - globalIndex++; - const optionId = `${id}-option-${globalIndex}`; + globalMappingIndex++; + const optionId = `${id}-option-${globalMappingIndex}`; return ( <ListOption id={optionId} isGroupedOption - isLastOption={lastOptionIndex === globalIndex} + isLastOption={lastOptionIndex === globalMappingIndex} isSelected={ multiple ? currentValue.includes(singleOption.value) : currentValue === singleOption.value } @@ -91,7 +123,7 @@ const Listbox = ({ multiple={multiple} onClick={handleOptionOnClick} option={singleOption} - visualFocused={visualFocusIndex === globalIndex} + visualFocused={visualFocusIndex === globalMappingIndex} /> ); })} @@ -99,18 +131,18 @@ const Listbox = ({ ) ); } else { - globalIndex++; - const optionId = `${id}-option-${globalIndex}`; + globalMappingIndex++; + const optionId = `${id}-option-${globalMappingIndex}`; return ( <ListOption id={optionId} - isLastOption={lastOptionIndex === globalIndex} + isLastOption={lastOptionIndex === globalMappingIndex} isSelected={multiple ? currentValue.includes(option.value) : currentValue === option.value} key={optionId} multiple={multiple} onClick={handleOptionOnClick} option={option} - visualFocused={visualFocusIndex === globalIndex} + visualFocused={visualFocusIndex === globalMappingIndex} /> ); } @@ -137,8 +169,7 @@ const Listbox = ({ visualFocused={visualFocusIndex === 0} /> ); - else if (multiple && enabledSelectAll) { - const selectionType = getSelectionType(options, currentValue as string[]); + else if (multiple && enableSelectAll) { return ( <CheckboxContext.Provider value={{ partial: selectionType === "indeterminate" }}> <ListOption diff --git a/packages/lib/src/select/Select.stories.tsx b/packages/lib/src/select/Select.stories.tsx index 7600f25e7a..c27a1833bd 100644 --- a/packages/lib/src/select/Select.stories.tsx +++ b/packages/lib/src/select/Select.stories.tsx @@ -405,8 +405,10 @@ const SelectListbox = () => ( searchable={false} handleOptionOnClick={() => {}} handleSelectAllOnClick={() => {}} + handleGroupOnClick={() => {}} styles={{ width: 360 }} - enabledSelectAll={false} + enableSelectAll={false} + selectionType="unchecked" /> </ExampleContainer> <ExampleContainer pseudoState="pseudo-active"> @@ -425,8 +427,10 @@ const SelectListbox = () => ( searchable={false} handleOptionOnClick={() => {}} handleSelectAllOnClick={() => {}} + handleGroupOnClick={() => {}} styles={{ width: 360 }} - enabledSelectAll={false} + enableSelectAll={false} + selectionType="unchecked" /> </ExampleContainer> <ExampleContainer> @@ -445,8 +449,10 @@ const SelectListbox = () => ( searchable={false} handleOptionOnClick={() => {}} handleSelectAllOnClick={() => {}} + handleGroupOnClick={() => {}} styles={{ width: 360 }} - enabledSelectAll={false} + enableSelectAll={false} + selectionType="unchecked" /> </ExampleContainer> <ExampleContainer pseudoState="pseudo-hover"> @@ -465,8 +471,10 @@ const SelectListbox = () => ( searchable={false} handleOptionOnClick={() => {}} handleSelectAllOnClick={() => {}} + handleGroupOnClick={() => {}} styles={{ width: 360 }} - enabledSelectAll={false} + enableSelectAll={false} + selectionType="unchecked" /> </ExampleContainer> <ExampleContainer pseudoState="pseudo-active"> @@ -485,8 +493,10 @@ const SelectListbox = () => ( searchable={false} handleOptionOnClick={() => {}} handleSelectAllOnClick={() => {}} + handleGroupOnClick={() => {}} styles={{ width: 360 }} - enabledSelectAll={false} + enableSelectAll={false} + selectionType="unchecked" /> </ExampleContainer> <Title title="Listbox with icons" theme="light" level={3} /> @@ -506,8 +516,10 @@ const SelectListbox = () => ( searchable={false} handleOptionOnClick={() => {}} handleSelectAllOnClick={() => {}} + handleGroupOnClick={() => {}} styles={{ width: 360 }} - enabledSelectAll={false} + enableSelectAll={false} + selectionType="unchecked" /> </ExampleContainer> <ExampleContainer> @@ -526,8 +538,10 @@ const SelectListbox = () => ( searchable={false} handleOptionOnClick={() => {}} handleSelectAllOnClick={() => {}} + handleGroupOnClick={() => {}} styles={{ width: 360 }} - enabledSelectAll={false} + enableSelectAll={false} + selectionType="unchecked" /> </ExampleContainer> <ExampleContainer> @@ -546,8 +560,10 @@ const SelectListbox = () => ( searchable={false} handleOptionOnClick={() => {}} handleSelectAllOnClick={() => {}} + handleGroupOnClick={() => {}} styles={{ width: 360 }} - enabledSelectAll={false} + enableSelectAll={false} + selectionType="unchecked" /> </ExampleContainer> </> @@ -646,8 +662,10 @@ const TooltipOption = () => ( searchable={false} handleOptionOnClick={() => {}} handleSelectAllOnClick={() => {}} + handleGroupOnClick={() => {}} + selectionType="unchecked" styles={{ width: 360 }} - enabledSelectAll={false} + enableSelectAll={false} /> </ExampleContainer> ); @@ -669,6 +687,7 @@ const SelectAll = () => ( multiple options={group_options} placeholder="Select an available option" + searchable /> </ExampleContainer> ); diff --git a/packages/lib/src/select/Select.test.tsx b/packages/lib/src/select/Select.test.tsx index 299943b5ad..5cfc9ff9bf 100644 --- a/packages/lib/src/select/Select.test.tsx +++ b/packages/lib/src/select/Select.test.tsx @@ -221,14 +221,14 @@ describe("Select component tests", () => { options[2] && userEvent.click(options[2]); userEvent.click(submit); }); - test("Searching for a value with an empty list of options passed doesn't open the listbox", async () => { + test("Searching for a value with an empty list of options passed doesn't open the listbox", () => { const { container, getByRole, queryByRole } = render( <DxcSelect label="test-select-label" options={[]} searchable /> ); const select = getByRole("combobox"); const searchInput = container.querySelectorAll("input")[1]; userEvent.click(select); - await act(() => { + act(() => { searchInput && userEvent.type(searchInput, "test"); }); expect(queryByRole("listbox")).toBeFalsy(); @@ -421,7 +421,7 @@ describe("Select component tests", () => { fireEvent.keyDown(select, { key: "ArrowUp", code: "ArrowUp", keyCode: 38, charCode: 38 }); expect(select.getAttribute("aria-activedescendant")).toBe("option-0"); }); - test("Non-Grouped Options - Filtering options never affects the optional item until there are no coincidences", async () => { + test("Non-Grouped Options - Filtering options never affects the optional item until there are no coincidences", () => { const { getAllByRole, getByText, queryByText, container } = render( <DxcSelect label="test-select-label" @@ -432,12 +432,12 @@ describe("Select component tests", () => { /> ); const searchInput = container.querySelectorAll("input")[1]; - await act(() => { + act(() => { searchInput && userEvent.type(searchInput, "1"); }); expect(getByText("Placeholder example")).toBeTruthy(); expect(getAllByRole("option").length).toBe(12); - await act(() => { + act(() => { searchInput && userEvent.type(searchInput, "123"); }); expect(queryByText("Placeholder example")).toBeFalsy(); @@ -522,14 +522,14 @@ describe("Select component tests", () => { searchInput && userEvent.type(searchInput, "abc"); expect(getByText("No matches found")).toBeTruthy(); }); - test("Non-Grouped Options: Searchable - Clicking the select, when the list is open, clears the search value", async () => { + test("Non-Grouped Options: Searchable - Clicking the select, when the list is open, clears the search value", () => { const onChange = jest.fn(); const { container, getByText, getByRole, getAllByRole } = render( <DxcSelect label="test-select-label" options={singleOptions} onChange={onChange} searchable /> ); const select = getByRole("combobox"); const searchInput = container.querySelectorAll("input")[1]; - await act(() => { + act(() => { searchInput && userEvent.type(searchInput, "2"); }); expect(getByRole("listbox")).toBeTruthy(); @@ -537,7 +537,7 @@ describe("Select component tests", () => { expect(getByText("Option 12")).toBeTruthy(); expect(getByText("Option 20")).toBeTruthy(); expect(getAllByRole("option").length).toBe(3); - await act(() => { + act(() => { userEvent.click(select); }); expect(searchInput?.value).toBe(""); @@ -1011,7 +1011,7 @@ describe("Select component tests", () => { userEvent.click(clearSelectionButton); expect(onChange).toHaveBeenCalledWith({ value: [] }); }); - test("Select all (single) - 'Select all' option is included and selects all the options available", () => { + test("Select all (single) - 'Select all' option is included and (un)selects all the options available", () => { const onChange = jest.fn(); const { getByRole, getByText } = render( <DxcSelect @@ -1032,7 +1032,7 @@ describe("Select component tests", () => { selectAllOption && userEvent.click(selectAllOption); expect(onChange).toHaveBeenCalledWith({ value: [] }); }); - test("Select all (groups) - 'Select all' option is included and selects all the options available", () => { + test("Select all (groups) - 'Select all' option is included and (un)selects all the options available", () => { const onChange = jest.fn(); const { getByRole, getByText } = render( <DxcSelect @@ -1076,4 +1076,119 @@ describe("Select component tests", () => { fireEvent.keyDown(select, { key: "Enter", code: "Enter", keyCode: 13, charCode: 13 }); expect(onChange).toHaveBeenCalledWith({ error: "This field is required. Please, enter a value.", value: [] }); }); + test("Select all (groups) - 'Select all' option selects all the options when there's a partial selection", () => { + const onChange = jest.fn(); + const { getByRole, getByText } = render( + <DxcSelect + enableSelectAll + label="Select an option" + multiple + options={reducedGroupedOptions} + placeholder="Select an available option" + onChange={onChange} + defaultValue={["azul", "rojo", "rosa"]} + /> + ); + const select = getByRole("combobox"); + userEvent.click(select); + const selectAllOption = getByText("Select all"); + selectAllOption && userEvent.click(selectAllOption); + expect(onChange).toHaveBeenCalledWith({ + value: ["azul", "rojo", "rosa", "madrid", "oviedo", "sevilla", "miño", "duero", "tajo"], + }); + selectAllOption && userEvent.click(selectAllOption); + expect(onChange).toHaveBeenCalledWith({ error: "This field is required. Please, enter a value.", value: [] }); + }); + test("Select all options from a group - The header of a group is selectable and (un)selects all the options from its group", () => { + const onChange = jest.fn(); + const { getByRole, getByText } = render( + <DxcSelect + enableSelectAll + label="Select an option" + multiple + options={reducedGroupedOptions} + placeholder="Select an available option" + onChange={onChange} + /> + ); + const select = getByRole("combobox"); + userEvent.click(select); + const thirdGroupHeader = getByText("Ríos españoles"); + thirdGroupHeader && userEvent.click(thirdGroupHeader); + expect(onChange).toHaveBeenCalledWith({ + value: ["miño", "duero", "tajo"], + }); + thirdGroupHeader && userEvent.click(thirdGroupHeader); + expect(onChange).toHaveBeenCalledWith({ error: "This field is required. Please, enter a value.", value: [] }); + }); + test("Select all options from a group - The header of a group selects all the options when there's a partial selection", () => { + const onChange = jest.fn(); + const { getByRole, getByText } = render( + <DxcSelect + enableSelectAll + label="Select an option" + multiple + options={reducedGroupedOptions} + placeholder="Select an available option" + onChange={onChange} + defaultValue={["miño", "duero"]} + /> + ); + const select = getByRole("combobox"); + userEvent.click(select); + const thirdGroupHeader = getByText("Ríos españoles"); + thirdGroupHeader && userEvent.click(thirdGroupHeader); + expect(onChange).toHaveBeenCalledWith({ + value: ["miño", "duero", "tajo"], + }); + thirdGroupHeader && userEvent.click(thirdGroupHeader); + expect(onChange).toHaveBeenCalledWith({ error: "This field is required. Please, enter a value.", value: [] }); + }); + test("Select all options from a group - Keyboard navigation is correct", () => { + const onChange = jest.fn(); + const { getByRole } = render( + <DxcSelect + enableSelectAll + label="Select an option" + multiple + options={reducedGroupedOptions} + placeholder="Select an available option" + onChange={onChange} + /> + ); + const select = getByRole("combobox"); + fireEvent.keyDown(select, { key: "ArrowDown", code: "ArrowDown", keyCode: 40, charCode: 40 }); + fireEvent.keyDown(select, { key: "ArrowDown", code: "ArrowDown", keyCode: 40, charCode: 40 }); + fireEvent.keyDown(select, { key: "Enter", code: "Enter", keyCode: 13, charCode: 13 }); + expect(onChange).toHaveBeenLastCalledWith({ + value: ["azul", "rojo", "rosa"], + }); + fireEvent.keyDown(select, { key: "ArrowDown", code: "ArrowDown", keyCode: 40, charCode: 40 }); + fireEvent.keyDown(select, { key: "Enter", code: "Enter", keyCode: 13, charCode: 13 }); + expect(onChange).toHaveBeenLastCalledWith({ + value: ["rojo", "rosa"], + }); + fireEvent.keyDown(select, { key: "ArrowUp", code: "ArrowUp", keyCode: 38, charCode: 38 }); + fireEvent.keyDown(select, { key: "Enter", code: "Enter", keyCode: 13, charCode: 13 }); + expect(onChange).toHaveBeenLastCalledWith({ + value: ["rojo", "rosa", "azul"], + }); + fireEvent.keyDown(select, { key: "ArrowUp", code: "ArrowUp", keyCode: 38, charCode: 38 }); + fireEvent.keyDown(select, { key: "ArrowUp", code: "ArrowUp", keyCode: 38, charCode: 38 }); + fireEvent.keyDown(select, { key: "ArrowUp", code: "ArrowUp", keyCode: 38, charCode: 38 }); + fireEvent.keyDown(select, { key: "ArrowUp", code: "ArrowUp", keyCode: 38, charCode: 38 }); + fireEvent.keyDown(select, { key: "ArrowUp", code: "ArrowUp", keyCode: 38, charCode: 38 }); + fireEvent.keyDown(select, { key: "Enter", code: "Enter", keyCode: 13, charCode: 13 }); + expect(onChange).toHaveBeenLastCalledWith({ + value: ["rojo", "rosa", "azul", "miño", "duero", "tajo"], + }); + fireEvent.keyDown(select, { key: "Esc", code: "Esc", keyCode: 27, charCode: 27 }); + fireEvent.keyDown(select, { key: "ArrowDown", code: "ArrowDown", keyCode: 40, charCode: 40 }); + fireEvent.keyDown(select, { key: "Enter", code: "Enter", keyCode: 13, charCode: 13 }); + expect(onChange).toHaveBeenLastCalledWith({ + value: ["azul", "rojo", "rosa", "madrid", "oviedo", "sevilla", "miño", "duero", "tajo"], + }); + fireEvent.keyDown(select, { key: "Enter", code: "Enter", keyCode: 13, charCode: 13 }); + expect(onChange).toHaveBeenLastCalledWith({ error: "This field is required. Please, enter a value.", value: [] }); + }); }); diff --git a/packages/lib/src/select/Select.tsx b/packages/lib/src/select/Select.tsx index 7167f972e7..713dd0db0b 100644 --- a/packages/lib/src/select/Select.tsx +++ b/packages/lib/src/select/Select.tsx @@ -29,9 +29,12 @@ import { groupsHaveOptions, isArrayOfGroupedOptions, notOptionalCheck, - selectAll, + getSelectableOptionsValues, + getSelectionType, + getGroupSelectionType, + computeNewValue, } from "./utils"; -import SelectPropsType, { ListOptionType, RefType } from "./types"; +import SelectPropsType, { ListOptionGroupType, ListOptionType, RefType } from "./types"; import DxcActionIcon from "../action-icon/ActionIcon"; import DxcFlex from "../flex/Flex"; import ErrorMessage from "../styles/forms/ErrorMessage"; @@ -221,12 +224,18 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( () => getSelectedOption(value ?? innerValue, options, multiple, optional, optionalItem), [value, innerValue, options, multiple, optional, optionalItem] ); + const selectableOptionsValues = useMemo(() => getSelectableOptionsValues(options), [options]); + const selectionType = useMemo( + () => getSelectionType(options, (value ?? innerValue) as string[]), + [innerValue, options, value] + ); const openListbox = () => { if (!isOpen && canOpenListbox(options, disabled)) { changeIsOpen(true); } }; + const closeListbox = () => { if (isOpen) { changeIsOpen(false); @@ -235,27 +244,45 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( }; const handleOnChangeValue = useCallback( - (newOption: ListOptionType | undefined) => { + (newOption?: ListOptionType) => { if (newOption) { - let newValue: string | string[]; if (multiple) { - const currentValue = (value ?? innerValue) as string[]; - newValue = currentValue.includes(newOption.value) - ? currentValue.filter((optionVal) => optionVal !== newOption.value) - : [...currentValue, newOption.value]; - } else newValue = newOption.value; - - if (value == null) setInnerValue(newValue); - onChange?.({ - value: newValue as string & string[], - error: notOptionalCheck(newValue, multiple, optional) - ? translatedLabels.formFields.requiredValueErrorMessage - : undefined, - }); + if (value == null) { + // uncontrolled mode: safely update using functional updates + setInnerValue((prev) => { + const newValue = computeNewValue(prev as string[], newOption); + onChange?.({ + value: newValue as string & string[], + error: notOptionalCheck(newValue, multiple, optional) + ? translatedLabels.formFields.requiredValueErrorMessage + : undefined, + }); + return newValue; + }); + } else { + // controlled mode: just call onChange + const newValue = computeNewValue((value ?? innerValue) as string[], newOption); + onChange?.({ + value: newValue as string & string[], + error: notOptionalCheck(newValue, multiple, optional) + ? translatedLabels.formFields.requiredValueErrorMessage + : undefined, + }); + } + } else { + if (value == null) setInnerValue(newOption.value); + onChange?.({ + value: newOption.value as string & string[], + error: notOptionalCheck(newOption.value, multiple, optional) + ? translatedLabels.formFields.requiredValueErrorMessage + : undefined, + }); + } } }, - [multiple, value, innerValue, onChange, optional, translatedLabels] + [multiple, value, onChange, optional, translatedLabels] ); + const handleOnClick = () => { if (searchable) selectSearchInputRef?.current?.focus(); if (isOpen) { @@ -263,9 +290,11 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( setSearchValue(""); } else openListbox(); }; + const handleOnFocus = (event: FocusEvent<HTMLInputElement>) => { if (!event.currentTarget.contains(event.relatedTarget) && searchable) selectSearchInputRef?.current?.focus(); }; + const handleOnBlur = (event: FocusEvent<HTMLInputElement>) => { if (!event.currentTarget.contains(event.relatedTarget)) { closeListbox(); @@ -280,6 +309,7 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( else onBlur?.({ value: currentValue as string & string[] }); } }; + const handleOnKeyDown = (event: KeyboardEvent<HTMLDivElement>) => { switch (event.key) { case "Down": @@ -324,27 +354,56 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( case "Enter": if (isOpen && visualFocusIndex >= 0) { let accLength = (multiple ? enableSelectAll : optional) ? 1 : 0; - if (searchable && filteredOptions.length > 0) { if (!multiple && visualFocusIndex === 0 && optional) handleOnChangeValue(optionalItem); else if (multiple && visualFocusIndex === 0 && enableSelectAll) handleSelectAllOnClick(); - else if (isArrayOfGroupedOptions(filteredOptions)) { + else if (isArrayOfGroupedOptions(filteredOptions) && enableSelectAll) { if (groupsHaveOptions(filteredOptions)) - filteredOptions.some((groupOption) => { - const groupLength = accLength + groupOption.options.length; + filteredOptions.some((group) => { + if (visualFocusIndex === accLength) { + handleSelectAllGroup(group); + return true; + } else { + accLength++; + return group.options.some((option) => { + if (visualFocusIndex === accLength) { + handleOnChangeValue(option); + return true; + } else accLength++; + }); + } + }); + } else if (isArrayOfGroupedOptions(filteredOptions)) { + if (groupsHaveOptions(filteredOptions)) + filteredOptions.some((group) => { + const groupLength = accLength + group.options.length; if (groupLength > visualFocusIndex) - handleOnChangeValue(groupOption.options[visualFocusIndex - accLength]); + handleOnChangeValue(group.options[visualFocusIndex - accLength]); accLength = groupLength; return groupLength > visualFocusIndex; }); } else handleOnChangeValue(filteredOptions[visualFocusIndex - accLength]); } else if (!multiple && visualFocusIndex === 0 && optional) handleOnChangeValue(optionalItem); else if (multiple && visualFocusIndex === 0 && enableSelectAll) handleSelectAllOnClick(); + else if (isArrayOfGroupedOptions(options) && enableSelectAll) + options.some((group) => { + if (visualFocusIndex === accLength) { + handleSelectAllGroup(group); + return true; + } else { + accLength++; + return group.options.some((option) => { + if (visualFocusIndex === accLength) { + handleOnChangeValue(option); + return true; + } else accLength++; + }); + } + }); else if (isArrayOfGroupedOptions(options)) - options.some((groupOption) => { - const groupLength = accLength + groupOption.options.length; - if (groupLength > visualFocusIndex) - handleOnChangeValue(groupOption.options[visualFocusIndex - accLength]); + options.some((group) => { + const groupLength = accLength + group.options.length; + if (groupLength > visualFocusIndex) handleOnChangeValue(group.options[visualFocusIndex - accLength]); accLength = groupLength; return groupLength > visualFocusIndex; }); @@ -358,6 +417,7 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( break; } }; + const handleOnMouseEnter = (event: MouseEvent<HTMLSpanElement>) => { const text = event.currentTarget; setHasTooltip(text.scrollWidth > text.clientWidth); @@ -389,22 +449,31 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( const handleOptionOnClick = useCallback( (option: ListOptionType) => { handleOnChangeValue(option); - if (!multiple) { - closeListbox(); - } + if (!multiple) closeListbox(); setSearchValue(""); }, [closeListbox, handleOnChangeValue, multiple] ); const handleSelectAllOnClick = useCallback(() => { - if (multiple ? (value ?? innerValue).length !== 0 : (value ?? innerValue) !== "") - handleClearOptionsActionOnClick(); + if (selectionType === "checked") handleClearOptionsActionOnClick(); else { - if (value == null) setInnerValue(selectAll(options)); - onChange?.({ value: selectAll(options) as string & string[] }); + if (value == null) setInnerValue(selectableOptionsValues); + onChange?.({ value: selectableOptionsValues as string & string[] }); } - }, [handleClearOptionsActionOnClick, innerValue, multiple, onChange, options, selectAll, value]); + }, [handleClearOptionsActionOnClick, innerValue, multiple, onChange, options, value]); + + const handleSelectAllGroup = useCallback( + (group: ListOptionGroupType) => { + const groupSelectionType = getGroupSelectionType(group.options, (value ?? innerValue) as string[]); + if (groupSelectionType === "indeterminate") + group.options.forEach( + (option) => !(value ?? innerValue).includes(option.value) && handleOptionOnClick(option) + ); + else group.options.forEach((option) => handleOptionOnClick(option)); + }, + [handleOptionOnClick, innerValue, value] + ); return ( <SelectContainer margin={margin} ref={ref} size={size}> @@ -537,8 +606,9 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( <Listbox ariaLabelledBy={labelId} currentValue={value ?? innerValue} - enabledSelectAll={enableSelectAll} + enableSelectAll={enableSelectAll} handleOptionOnClick={handleOptionOnClick} + handleGroupOnClick={handleSelectAllGroup} handleSelectAllOnClick={handleSelectAllOnClick} id={listboxId} lastOptionIndex={lastOptionIndex} @@ -547,6 +617,7 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( optionalItem={optionalItem} options={searchable ? filteredOptions : options} searchable={searchable} + selectionType={selectionType} styles={{ width }} visualFocusIndex={visualFocusIndex} /> diff --git a/packages/lib/src/select/types.ts b/packages/lib/src/select/types.ts index f5b84f7ea2..9682d05be2 100644 --- a/packages/lib/src/select/types.ts +++ b/packages/lib/src/select/types.ts @@ -194,7 +194,8 @@ export type OptionProps = { export type ListboxProps = { ariaLabelledBy: string; currentValue: string | string[]; - enabledSelectAll: boolean; + enableSelectAll: boolean; + handleGroupOnClick: (group: ListOptionGroupType) => void; handleOptionOnClick: (option: ListOptionType) => void; handleSelectAllOnClick: () => void; id: string; @@ -204,6 +205,7 @@ export type ListboxProps = { optionalItem: ListOptionType; options: ListOptionType[] | ListOptionGroupType[]; searchable: boolean; + selectionType: "checked" | "unchecked" | "indeterminate"; styles: CSSProperties; visualFocusIndex: number; }; diff --git a/packages/lib/src/select/utils.ts b/packages/lib/src/select/utils.ts index 80d3d42b65..c73e248bdd 100644 --- a/packages/lib/src/select/utils.ts +++ b/packages/lib/src/select/utils.ts @@ -75,26 +75,21 @@ export const getLastOptionIndex = ( searchable: boolean, optional: boolean, multiple: boolean, - enabledSelectAll: boolean + enableSelectAll: boolean ) => { let last = 0; - const reducer = (acc: number, current: ListOptionGroupType) => acc + (current.options.length ?? 0); + const reducer = (acc: number, current: ListOptionGroupType) => + acc + (current.options.length ?? 0) + (enableSelectAll ? 1 : 0); if (searchable && filteredOptions.length > 0) { - if (isArrayOfGroupedOptions(filteredOptions)) { - last = filteredOptions.reduce(reducer, 0) - 1; - } else { - last = filteredOptions.length - 1; - } + if (isArrayOfGroupedOptions(filteredOptions)) last = filteredOptions.reduce(reducer, 0) - 1; + else last = filteredOptions.length - 1; } else if (options.length > 0) { - if (isArrayOfGroupedOptions(options)) { - last = options.reduce(reducer, 0) - 1; - } else { - last = options.length - 1; - } + if (isArrayOfGroupedOptions(options)) last = options.reduce(reducer, 0) - 1; + else last = options.length - 1; } - return (multiple ? enabledSelectAll : optional) ? last + 1 : last; + return (multiple ? enableSelectAll : optional) ? last + 1 : last; }; /** @@ -187,11 +182,38 @@ export const getSelectionType = (options: Props["options"], value: string[]) => }; /** - * Return an array with all the values from the options passed by the user, whether grouped or not. + * Returns a determined string value depending on the amount of options selected from a group: + * - All grouped options are selected -> "checked" + * - Partial selection -> "indeterminate" + * - No option from the group is selected -> "unchecked" + * @param options + * @param value + * @returns boolean + */ +export const getGroupSelectionType = (options: ListOptionType[], value: string[]) => + options.every((option) => value.includes(option.value)) + ? "checked" + : options.some((option) => value.includes(option.value)) + ? "indeterminate" + : "unchecked"; + +/** + * Return an array with all the values from the options passed by the user, whether grouped or not, that can be selected. * @param options * @returns */ -export const selectAll = (options: Props["options"]) => +export const getSelectableOptionsValues = (options: Props["options"]) => isArrayOfGroupedOptions(options) ? options.flatMap((group) => group.options.map((option) => option.value)) : options.map((option) => option.value); + +/** + * (Un)Selects the option passed as parameter. + * @param currentValue + * @param newOption + * @returns + */ +export const computeNewValue = (currentValue: string[], newOption: ListOptionType) => + currentValue.includes(newOption.value) + ? currentValue.filter((val) => val !== newOption.value) + : [...currentValue, newOption.value];