From b6415d22bffcb98dd58ba9445749fccab674cc4f Mon Sep 17 00:00:00 2001 From: Richard Walker Date: Tue, 27 Sep 2022 10:28:40 +1300 Subject: [PATCH] fix: add missing optional props to forms --- packages/combobox/docs/Combobox.mdx | 29 +++++++++++++++++++ packages/combobox/src/component.tsx | 2 ++ packages/combobox/src/props.ts | 3 ++ .../combobox/stories/Combobox.stories.tsx | 29 +++++++++++++++++++ packages/select/docs/Select.mdx | 12 ++++++++ packages/select/src/component.tsx | 7 +++-- packages/select/stories/Select.stories.tsx | 2 ++ packages/textarea/docs/TextArea.mdx | 8 +++++ packages/textarea/src/component.tsx | 3 +- packages/textarea/src/props.ts | 3 ++ .../textarea/stories/TextArea.stories.tsx | 4 +++ packages/textfield/docs/TextField.mdx | 11 +++++++ packages/textfield/src/component.tsx | 3 +- packages/textfield/src/props.ts | 3 ++ .../textfield/stories/Textfield.stories.tsx | 6 ++++ 15 files changed, 120 insertions(+), 5 deletions(-) diff --git a/packages/combobox/docs/Combobox.mdx b/packages/combobox/docs/Combobox.mdx index ee2a4db1..22094d8e 100644 --- a/packages/combobox/docs/Combobox.mdx +++ b/packages/combobox/docs/Combobox.mdx @@ -279,6 +279,35 @@ function Example() { } ``` +### Optional prop + +Add the optional prop to indicate that the combobox field is not required. + +```jsx example +function Example() { + const [value, setValue] = useState(''); + + return ( + setValue(val)} + onSelect={(val) => { + alert(val); + setValue(''); + }} + options={[ + { value: 'Apple' }, + { value: 'Banana' }, + { value: 'Orange' }, + { value: 'Pineapple' }, + ]} + /> + ); +} +``` + ## Combobox Props ```props packages/combobox/src/component.tsx diff --git a/packages/combobox/src/component.tsx b/packages/combobox/src/component.tsx index bc41b851..53caf9c3 100644 --- a/packages/combobox/src/component.tsx +++ b/packages/combobox/src/component.tsx @@ -60,6 +60,7 @@ export const Combobox = forwardRef( onChange, onFocus, onBlur, + optional, ...rest } = props; @@ -183,6 +184,7 @@ export const Combobox = forwardRef( id, value: navigationValueOrInputValue, label, + optional, invalid, helpText, placeholder, diff --git a/packages/combobox/src/props.ts b/packages/combobox/src/props.ts index 25d7b5b5..4817236b 100644 --- a/packages/combobox/src/props.ts +++ b/packages/combobox/src/props.ts @@ -114,6 +114,9 @@ export type ComboboxProps = { /** For affix use */ children?: React.ReactNode; + + /** Whether to show optional text */ + optional?: boolean; } & Omit< React.PropsWithoutRef, 'onChange' | 'type' | 'value' | 'label' diff --git a/packages/combobox/stories/Combobox.stories.tsx b/packages/combobox/stories/Combobox.stories.tsx index ae3c0c10..946e432b 100644 --- a/packages/combobox/stories/Combobox.stories.tsx +++ b/packages/combobox/stories/Combobox.stories.tsx @@ -327,3 +327,32 @@ export const AsyncFetch = () => { ); }; + +export const Optional = () => { + const [value, setValue] = React.useState(''); + + return ( + <> +

+ When the user clicks inside the text box the current value will be + selected (like the URL bar in browsers). +

+ setValue(val)} + onSelect={(val) => { + setValue(val); + action('select')(val); + }} + label="Stillingstittel" + optional + options={[ + { value: 'Product manager' }, + { value: 'Produktledelse' }, + { value: 'Prosessoperatør' }, + { value: 'Prosjekteier' }, + ]} + /> + + ); +}; \ No newline at end of file diff --git a/packages/select/docs/Select.mdx b/packages/select/docs/Select.mdx index d22620d9..d4b5fa26 100644 --- a/packages/select/docs/Select.mdx +++ b/packages/select/docs/Select.mdx @@ -62,6 +62,18 @@ Select for accessibility. If the field is labeled by a separate element, an `aria-labelledby` prop should be provided using the id of the labeling element instead. +### Optional + +Add the optional prop to indicate that the select is not required. + +```jsx example + +``` + ## Hint text Selects can provide additional context with `hint` if the label and placeholder diff --git a/packages/select/src/component.tsx b/packages/select/src/component.tsx index 95fd9058..59f10b6a 100644 --- a/packages/select/src/component.tsx +++ b/packages/select/src/component.tsx @@ -4,7 +4,7 @@ import { classNames } from '@chbphone55/classnames'; import type { SelectProps } from './props'; const setup = (props) => { - const { className, invalid, id, hint, always, label, style, ...rest } = props; + const { className, invalid, id, hint, always, label, style, optional, ...rest } = props; const helpId = hint ? `${id}__hint` : undefined; @@ -24,6 +24,7 @@ const setup = (props) => { 'aria-invalid': invalid, id, }, + optional, help: always || invalid ? { @@ -45,11 +46,11 @@ const setup = (props) => { function Select(props: SelectProps, ref: React.Ref) { const id = useId(props.id); const { attrs, classes } = setup({ ...props, id }); - const { div, label, select, help } = attrs; + const { div, label, select, help, optional } = attrs; return (
- {label.children &&