diff --git a/packages/react-templates/src/components/Select/CheckboxSelect.tsx b/packages/react-templates/src/components/Select/CheckboxSelect.tsx index c71006ac5bc..847a2b669af 100644 --- a/packages/react-templates/src/components/Select/CheckboxSelect.tsx +++ b/packages/react-templates/src/components/Select/CheckboxSelect.tsx @@ -51,6 +51,11 @@ const CheckboxSelectBase: React.FunctionComponent = ({ const [isOpen, setIsOpen] = React.useState(false); const [selected, setSelected] = React.useState([]); + React.useEffect(() => { + const selectedOptions = initialOptions?.filter((option) => option.selected); + setSelected(selectedOptions?.map((selectedOption) => String(selectedOption.value)) ?? []); + }, [initialOptions]); + const checkboxSelectOptions = initialOptions?.map((option) => { const { content, value, ...props } = option; const isSelected = selected.includes(`${value}`); diff --git a/packages/react-templates/src/components/Select/SimpleSelect.tsx b/packages/react-templates/src/components/Select/SimpleSelect.tsx index b473ce7ddef..064d4faac2e 100644 --- a/packages/react-templates/src/components/Select/SimpleSelect.tsx +++ b/packages/react-templates/src/components/Select/SimpleSelect.tsx @@ -28,6 +28,8 @@ export interface SimpleSelectProps extends Omit { isDisabled?: boolean; /** Content of the toggle. Defaults to the selected option. */ toggleContent?: React.ReactNode; + /** Placeholder text for the select input. */ + placeholder?: string; /** Width of the toggle. */ toggleWidth?: string; /** Additional props passed to the toggle. */ @@ -43,14 +45,20 @@ const SimpleSelectBase: React.FunctionComponent = ({ toggleContent, toggleWidth = '200px', toggleProps, + placeholder = 'Select a value', ...props }: SimpleSelectProps) => { const [isOpen, setIsOpen] = React.useState(false); - const [selected, setSelected] = React.useState('Select a value'); + const [selected, setSelected] = React.useState(); + + React.useEffect(() => { + const selectedOption = initialOptions?.find((option) => option.selected); + setSelected(selectedOption); + }, [initialOptions]); const simpleSelectOptions = initialOptions?.map((option) => { const { content, value, ...props } = option; - const isSelected = selected.includes(`${value}`); + const isSelected = selected?.value === value; return ( {content} @@ -65,8 +73,8 @@ const SimpleSelectBase: React.FunctionComponent = ({ const _onSelect = (_event: React.MouseEvent | undefined, value: string | number | undefined) => { onSelect && onSelect(_event, value); - setSelected(value as string); - onToggle && onToggle(!false); + setSelected(initialOptions.find((o) => o.value === value)); + onToggle && onToggle(true); setIsOpen(false); }; @@ -83,7 +91,7 @@ const SimpleSelectBase: React.FunctionComponent = ({ } {...toggleProps} > - {toggleContent ? toggleContent : selected} + {toggleContent ? toggleContent : selected?.content || placeholder} ); diff --git a/packages/react-templates/src/components/Select/__tests__/__snapshots__/CheckboxSelectSnapshots.test.tsx.snap b/packages/react-templates/src/components/Select/__tests__/__snapshots__/CheckboxSelectSnapshots.test.tsx.snap index b1b30016032..3b24f7d0f36 100644 --- a/packages/react-templates/src/components/Select/__tests__/__snapshots__/CheckboxSelectSnapshots.test.tsx.snap +++ b/packages/react-templates/src/components/Select/__tests__/__snapshots__/CheckboxSelectSnapshots.test.tsx.snap @@ -81,7 +81,7 @@ exports[`opened checkbox select snapshot 1`] = `
{ - const initialOptions: CheckboxSelectOption[] = [ - { content: 'Option 1', value: 'option-1' }, - { content: 'Option 2', value: 'option-2', description: 'Option with description' }, - { content: 'Option 3', value: 'option-3', isDisabled: true }, - { content: 'Option 4', value: 'option-4' } - ]; - - return ; + const [selected, setSelected] = React.useState(['option-2']); + + const initialOptions = React.useMemo( + () => Options.map((o) => ({ ...o, selected: selected.includes(o.value) })), + [selected] + ); + + return ( + { + const val = String(value); + setSelected((prevSelected) => + prevSelected.includes(val) ? prevSelected.filter((item) => item !== val) : [...prevSelected, String(val)] + ); + }} + /> + ); }; diff --git a/packages/react-templates/src/components/Select/examples/SimpleSelectDemo.tsx b/packages/react-templates/src/components/Select/examples/SimpleSelectDemo.tsx index 3a2d67f277a..83cfd0f9bd9 100644 --- a/packages/react-templates/src/components/Select/examples/SimpleSelectDemo.tsx +++ b/packages/react-templates/src/components/Select/examples/SimpleSelectDemo.tsx @@ -2,14 +2,20 @@ import React from 'react'; import { Checkbox } from '@patternfly/react-core'; import { SimpleSelect, SimpleSelectOption } from '@patternfly/react-templates'; +const Options: SimpleSelectOption[] = [ + { content: 'Option 1', value: 'Option1' }, + { content: 'Option 2', value: 'Option2', description: 'Option with description' }, + { content: 'Option 3', value: 'Option3' } +]; + export const SelectSimpleDemo: React.FunctionComponent = () => { const [isDisabled, setIsDisabled] = React.useState(false); + const [selected, setSelected] = React.useState('Option1'); - const initialOptions: SimpleSelectOption[] = [ - { content: 'Option 1', value: 'Option 1' }, - { content: 'Option 2', value: 'Option 2', description: 'Option with description' }, - { content: 'Option 3', value: 'Option 3' } - ]; + const initialOptions = React.useMemo( + () => Options.map((o) => ({ ...o, selected: o.value === selected })), + [selected] + ); return ( @@ -20,7 +26,11 @@ export const SelectSimpleDemo: React.FunctionComponent = () => { onChange={(_event, checked) => setIsDisabled(checked)} style={{ marginBottom: 20 }} /> - + setSelected(String(selection))} + /> ); };