@kiwicom/orbit-components
Version:
Orbit-components is a React component library which provides developers with the easiest possible way of building Kiwi.com’s products.
94 lines (74 loc) • 5.97 kB
Markdown
# ChoiceGroup
To implement ChoiceGroup component into your project you'll need to add the import:
```jsx
import ChoiceGroup from "@kiwicom/orbit-components/lib/ChoiceGroup";
import Radio from "@kiwicom/orbit-components/lib/Radio";
```
After adding import into your project you can use it simply like:
```jsx
<ChoiceGroup label="What was the reason for your cancellation?">
<Radio label="Reason one" value="one" />
<Radio label="Reason two" value="two" />
<Radio label="Reason three" value="three" />
</ChoiceGroup>
```
## Props
Table below contains all types of the props available in the ChoiceGroup component.
| Name | Type | Default | Description |
| :---------------- | :---------------------------------------------------------------- | :--------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- |
| dataTest | `string` | | Optional prop for testing purposes. |
| **children** | `React.Node ` | `(args) => React.Node` | The content of the ChoiceGroup, normally **Radio** or **Checkbox**. Pass a function for advanced usage, see "Render prop" in Storybook for an example. |
| error | `Translation` | | The error to display beneath the ChoiceGroup. Also, the Checkboxes/Radios will turn red when you pass some value. |
| label | `Translation` | | Heading text of the ChoiceGroup |
| labelAs | [`enum`](#enum) | `"h4"` | The element used to render the label into. |
| labelSize | [`enum`](#enum) | `"normal"` | The size type of Heading. |
| **onChange** | `event => void \| Promise` | | Function for handling onChange event. [See Functional specs](#functional-specs) |
| filter | `boolean` | `false` | Changes visual appearance of child components, to contain background on hover and updates padding. |
| onOnlySelection | `(event, {value: string, label: string}) => void \| Promise<any>` | | Function for handling onOnlySelection, read more in Functional specs. |
| onlySelectionText | `Translation` | | Property for passing translation string when you want to use the `onOnlySelection` callback. |
### enum
| labelElement | labelSize |
| :----------- | :--------- |
| `"h2"` | `"normal"` |
| `"h3"` | `"large"` |
| `"h4"` |
| `"h5"` |
| `"h6"` |
### Passing a function as `children`
If you need more control over how to render ChoiceGroup, for example using [`react-window`](https://github.com/bvaughn/react-window), you can pass a function to `children` instead of `React.Node`, which receives an object containing the following properties:
- `Container` is the inner container where Radio/Checkbox elements are placed
- `Item` is the component that should wrap Radio/Checkbox elements
- `spacing` is the spacing between items, which you need to apply yourself
This is a barebones example:
```jsx
<ChoiceGroup onChange={ev => doSomething(ev)}>
{({ Container, Item, spacing }) => (
<Container style={{ display: 'flex', flexDirection: 'column', gap: spacing }}>
<Item>
<Radio label="Reason one" value="two">
</Item>
<Item>
<Radio label="Reason two" value="two">
</Item>
<Item>
<Radio label="Reason three" value="three">
</Item>
</Container>
)}
</ChoiceGroup>
```
For more realistic usage you can check out the "Render prop" example in Storybook.
## Functional specs
- onChange props in `<Radio />` or `<Checkbox />` will be overrode by internal onChange function
- If you want to handle selecting field, pass `onChange` to `<ChoiceGroup />` and it will be always triggered when `<Radio />` or `<Checkbox />` should change
- `onChange` will return `SyntheticEvent` of field that should change
```jsx
<ChoiceGroup onChange={ev => doSomething(ev)}>
<Radio label="Reason one" value="one" />
<Radio label="Reason two" value="two" />
<Radio label="Reason three" value="three" />
</ChoiceGroup>
```
- `onOnlySelection` can be used only when `filter` prop is used.
- `filter` pattern with `onOnlySelection` is used where multiple checkboxes in different states are presented to the user, and the user wants to choose only one of them.
- `filter` pattern with `onOnlySelection` shouldn't contain radio buttons.