CheckboxGroup

A checkbox group allows a user to select one or more values from a list of items through multiple checkboxes.

Installyarn add @diallink-corp/convergo-react-checkbox
Version4.1.2
Usageimport {CheckboxGroup} from '@diallink-corp/convergo-react-checkbox'

Uncontrolled Value

By default, the CheckboxGroup component handles its value uncontrolled. In the uncontrolled variant you can pass in a defaultValue to set a value by default.

<CheckboxGroup
  label="Newsletters"
  defaultValue={['productUpdates', 'companyNews']}
>
  <Checkbox value="productUpdates" label="Product Updates" />
  <Checkbox value="companyNews" label="Company News" />
  <Checkbox value="promotionalCampaigns" label="Promotional Campaigns" />
</CheckboxGroup>
<CheckboxGroup
  label="Newsletters"
  defaultValue={['productUpdates', 'companyNews']}
>
  <Checkbox
    value="productUpdates"
    label="Product Updates"
  />
  <Checkbox value="companyNews" label="Company News" />
  <Checkbox
    value="promotionalCampaigns"
    label="Promotional Campaigns"
  />
</CheckboxGroup>
<CheckboxGroup
  label="Newsletters"
  defaultValue={[
    'productUpdates',
    'companyNews'
  ]}
>
  <Checkbox
    value="productUpdates"
    label="Product Updates"
  />
  <Checkbox
    value="companyNews"
    label="Company News"
  />
  <Checkbox
    value="promotionalCampaigns"
    label="Promotional Campaigns"
  />
</CheckboxGroup>

Controlled Value

You can also handle the value of the component in a controlled manner. To do so, you can pass in a value prop as well as an onChange handler to modify the value when the user checks the checkboxes.

function Example() {
  const [selected, setSelected] = useState(['productUpdates', 'companyNews']);

  return (
    <div>
      <CheckboxGroup
        label="Newsletters"
        value={selected}
        onChange={setSelected}
      >
        <Checkbox value="productUpdates" label="Product Updates" />
        <Checkbox value="companyNews" label="Company News" />
        <Checkbox value="promotionalCampaigns" label="Promotional Campaigns" />
      </CheckboxGroup>

      <div>Selected Values: {selected.join(', ')}</div>
    </div>
  );
}
function Example() {
  const [selected, setSelected] = useState([
    'productUpdates',
    'companyNews'
  ]);

  return (
    <div>
      <CheckboxGroup
        label="Newsletters"
        value={selected}
        onChange={setSelected}
      >
        <Checkbox
          value="productUpdates"
          label="Product Updates"
        />
        <Checkbox
          value="companyNews"
          label="Company News"
        />
        <Checkbox
          value="promotionalCampaigns"
          label="Promotional Campaigns"
        />
      </CheckboxGroup>

      <div>Selected Values: {selected.join(', ')}</div>
    </div>
  );
}
function Example() {
  const [
    selected,
    setSelected
  ] = useState([
    'productUpdates',
    'companyNews'
  ]);

  return (
    <div>
      <CheckboxGroup
        label="Newsletters"
        value={selected}
        onChange={setSelected}
      >
        <Checkbox
          value="productUpdates"
          label="Product Updates"
        />
        <Checkbox
          value="companyNews"
          label="Company News"
        />
        <Checkbox
          value="promotionalCampaigns"
          label="Promotional Campaigns"
        />
      </CheckboxGroup>

      <div>
        Selected Values:
        {' '}
        {selected.join(
          ', '
        )}
      </div>
    </div>
  );
}

Labeling

A CheckboxGroup component should be labeled with a visual text through the label prop. If the CheckboxGroup does not include a textual label, an aria-label or aria-labelledby prop need to be provided to support assistive technology such as screen readers.

<CheckboxGroup label='Newsletters'>
  <Checkbox value="productUpdates" label='Product Updates' />
  <Checkbox value="companyNews" label='Company News' />
  <Checkbox value="promotionalCampaigns" label='Promotional Campaigns' />
</CheckboxGroup>
<CheckboxGroup label="Newsletters">
  <Checkbox
    value="productUpdates"
    label="Product Updates"
  />
  <Checkbox value="companyNews" label="Company News" />
  <Checkbox
    value="promotionalCampaigns"
    label="Promotional Campaigns"
  />
</CheckboxGroup>
<CheckboxGroup label="Newsletters">
  <Checkbox
    value="productUpdates"
    label="Product Updates"
  />
  <Checkbox
    value="companyNews"
    label="Company News"
  />
  <Checkbox
    value="promotionalCampaigns"
    label="Promotional Campaigns"
  />
</CheckboxGroup>

Label Alignment

For languages that are read left-to-right (LTR), such as English, the label of the CheckboxGroup component is displayed on the left side of the input. For right-to-left (RTL) languages, such as Arabic, this is flipped. You can control the position of the label through the labelPlacement prop.

<CheckboxGroup label='Newsletters' labelPlacement='top end'>
  <Checkbox value="productUpdates" label='Product Updates' />
  <Checkbox value="companyNews" label='Company News' />
  <Checkbox value="promotionalCampaigns" label='Promotional Campaigns' />
</CheckboxGroup>
<CheckboxGroup
  label="Newsletters"
  labelPlacement="top end"
>
  <Checkbox
    value="productUpdates"
    label="Product Updates"
  />
  <Checkbox value="companyNews" label="Company News" />
  <Checkbox
    value="promotionalCampaigns"
    label="Promotional Campaigns"
  />
</CheckboxGroup>
<CheckboxGroup
  label="Newsletters"
  labelPlacement="top end"
>
  <Checkbox
    value="productUpdates"
    label="Product Updates"
  />
  <Checkbox
    value="companyNews"
    label="Company News"
  />
  <Checkbox
    value="promotionalCampaigns"
    label="Promotional Campaigns"
  />
</CheckboxGroup>

Label Position

By default, the label of the CheckboxGroup component is displayed above the input. With the labelPlacement prop this placement can be adjusted to be on the side of the input.

<CheckboxGroup label='Newsletters' labelPlacement='side start'>
  <Checkbox value="productUpdates" label='Product Updates' />
  <Checkbox value="companyNews" label='Company News' />
  <Checkbox value="promotionalCampaigns" label='Promotional Campaigns' />
</CheckboxGroup>
<CheckboxGroup
  label="Newsletters"
  labelPlacement="side start"
>
  <Checkbox
    value="productUpdates"
    label="Product Updates"
  />
  <Checkbox value="companyNews" label="Company News" />
  <Checkbox
    value="promotionalCampaigns"
    label="Promotional Campaigns"
  />
</CheckboxGroup>
<CheckboxGroup
  label="Newsletters"
  labelPlacement="side start"
>
  <Checkbox
    value="productUpdates"
    label="Product Updates"
  />
  <Checkbox
    value="companyNews"
    label="Company News"
  />
  <Checkbox
    value="promotionalCampaigns"
    label="Promotional Campaigns"
  />
</CheckboxGroup>

Required

To indicate to the user that the CheckboxGroup is required you can use the isRequired prop.

<CheckboxGroup label='Newsletters' isRequired>
  <Checkbox value="productUpdates" label='Product Updates' />
  <Checkbox value="companyNews" label='Company News' />
  <Checkbox value="promotionalCampaigns" label='Promotional Campaigns' />
</CheckboxGroup>
<CheckboxGroup label="Newsletters" isRequired>
  <Checkbox
    value="productUpdates"
    label="Product Updates"
  />
  <Checkbox value="companyNews" label="Company News" />
  <Checkbox
    value="promotionalCampaigns"
    label="Promotional Campaigns"
  />
</CheckboxGroup>
<CheckboxGroup
  label="Newsletters"
  isRequired
>
  <Checkbox
    value="productUpdates"
    label="Product Updates"
  />
  <Checkbox
    value="companyNews"
    label="Company News"
  />
  <Checkbox
    value="promotionalCampaigns"
    label="Promotional Campaigns"
  />
</CheckboxGroup>

Validation

The CheckboxGroup component has built-in accessible validation support. To indicate whether the group is valid or not you can use the errorMessage prop.

function Example() {
  const [selected, setSelected] = useState(['productUpdates']);

  const isValid = selected.length >= 2;

  return (
    <CheckboxGroup 
      label='Newsletters' 
      value={selected} 
      onChange={setSelected} 
      errorMessage={!isValid && 'You need to select atleast 2 checkboxes.'}
    >
      <Checkbox value="productUpdates" label='Product Updates' />
      <Checkbox value="companyNews" label='Company News' />
      <Checkbox value="promotionalCampaigns" label='Promotional Campaigns' />
    </CheckboxGroup>
  );
}
function Example() {
  const [selected, setSelected] = useState([
    'productUpdates'
  ]);

  const isValid = selected.length >= 2;

  return (
    <CheckboxGroup
      label="Newsletters"
      value={selected}
      onChange={setSelected}
      errorMessage={!isValid &&
        'You need to select atleast 2 checkboxes.'}
    >
      <Checkbox
        value="productUpdates"
        label="Product Updates"
      />
      <Checkbox value="companyNews" label="Company News" />
      <Checkbox
        value="promotionalCampaigns"
        label="Promotional Campaigns"
      />
    </CheckboxGroup>
  );
}
function Example() {
  const [
    selected,
    setSelected
  ] = useState([
    'productUpdates'
  ]);

  const isValid =
    selected.length >= 2;

  return (
    <CheckboxGroup
      label="Newsletters"
      value={selected}
      onChange={setSelected}
      errorMessage={!isValid &&
        'You need to select atleast 2 checkboxes.'}
    >
      <Checkbox
        value="productUpdates"
        label="Product Updates"
      />
      <Checkbox
        value="companyNews"
        label="Company News"
      />
      <Checkbox
        value="promotionalCampaigns"
        label="Promotional Campaigns"
      />
    </CheckboxGroup>
  );
}

Description

The CheckboxGroup supports an optional description that further explains the purpose of the field.

function Example() {
  const [selected, setSelected] = useState(['productUpdates']);

  return (
    <CheckboxGroup 
      label='Newsletters' 
      value={selected} 
      onChange={setSelected} 
      description='Select all newsletters you would like to receive.'
    >
      <Checkbox value="productUpdates" label='Product Updates' />
      <Checkbox value="companyNews" label='Company News' />
      <Checkbox value="promotionalCampaigns" label='Promotional Campaigns' />
    </CheckboxGroup>
  );
}
function Example() {
  const [selected, setSelected] = useState([
    'productUpdates'
  ]);

  return (
    <CheckboxGroup
      label="Newsletters"
      value={selected}
      onChange={setSelected}
      description="Select all newsletters you would like to receive."
    >
      <Checkbox
        value="productUpdates"
        label="Product Updates"
      />
      <Checkbox value="companyNews" label="Company News" />
      <Checkbox
        value="promotionalCampaigns"
        label="Promotional Campaigns"
      />
    </CheckboxGroup>
  );
}
function Example() {
  const [
    selected,
    setSelected
  ] = useState([
    'productUpdates'
  ]);

  return (
    <CheckboxGroup
      label="Newsletters"
      value={selected}
      onChange={setSelected}
      description="Select all newsletters you would like to receive."
    >
      <Checkbox
        value="productUpdates"
        label="Product Updates"
      />
      <Checkbox
        value="companyNews"
        label="Company News"
      />
      <Checkbox
        value="promotionalCampaigns"
        label="Promotional Campaigns"
      />
    </CheckboxGroup>
  );
}

Contextual Help

To offer the user contextual help, the CheckboxGroup supports passing a contextualHelp prop, that accepts a ReactNode.

<CheckboxGroup
  label='Newsletters' 
  contextualHelp={(
    <ContextualHelp variant="info">
      <Header>
        <Heading>Lorem Ipsum</Heading>
      </Header>
      <Content>
        <Text>
          Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
        </Text>
      </Content>
    </ContextualHelp>
  )} 
>
  <Checkbox value="productUpdates" label='Product Updates' />
  <Checkbox value="companyNews" label='Company News' />
  <Checkbox value="promotionalCampaigns" label='Promotional Campaigns' />
</CheckboxGroup>
<CheckboxGroup
  label="Newsletters"
  contextualHelp={
    <ContextualHelp variant="info">
      <Header>
        <Heading>Lorem Ipsum</Heading>
      </Header>
      <Content>
        <Text>
          Lorem ipsum dolor sit amet, consectetur
          adipiscing elit.
        </Text>
      </Content>
    </ContextualHelp>
  }
>
  <Checkbox
    value="productUpdates"
    label="Product Updates"
  />
  <Checkbox value="companyNews" label="Company News" />
  <Checkbox
    value="promotionalCampaigns"
    label="Promotional Campaigns"
  />
</CheckboxGroup>
<CheckboxGroup
  label="Newsletters"
  contextualHelp={
    <ContextualHelp variant="info">
      <Header>
        <Heading>
          Lorem Ipsum
        </Heading>
      </Header>
      <Content>
        <Text>
          Lorem ipsum
          dolor sit
          amet,
          consectetur
          adipiscing
          elit.
        </Text>
      </Content>
    </ContextualHelp>
  }
>
  <Checkbox
    value="productUpdates"
    label="Product Updates"
  />
  <Checkbox
    value="companyNews"
    label="Company News"
  />
  <Checkbox
    value="promotionalCampaigns"
    label="Promotional Campaigns"
  />
</CheckboxGroup>

Disabled

The CheckboxGroup component can be disabled via the isDisabled prop.

<CheckboxGroup
  label="Newsletters"
  defaultValue={['productUpdates', 'companyNews']}
  isDisabled
>
  <Checkbox value="productUpdates" label="Product Updates" />
  <Checkbox value="companyNews" label="Company News" />
  <Checkbox value="promotionalCampaigns" label="Promotional Campaigns" />
</CheckboxGroup>
<CheckboxGroup
  label="Newsletters"
  defaultValue={['productUpdates', 'companyNews']}
  isDisabled
>
  <Checkbox
    value="productUpdates"
    label="Product Updates"
  />
  <Checkbox value="companyNews" label="Company News" />
  <Checkbox
    value="promotionalCampaigns"
    label="Promotional Campaigns"
  />
</CheckboxGroup>
<CheckboxGroup
  label="Newsletters"
  defaultValue={[
    'productUpdates',
    'companyNews'
  ]}
  isDisabled
>
  <Checkbox
    value="productUpdates"
    label="Product Updates"
  />
  <Checkbox
    value="companyNews"
    label="Company News"
  />
  <Checkbox
    value="promotionalCampaigns"
    label="Promotional Campaigns"
  />
</CheckboxGroup>

Read Only

The CheckboxGroup component can be marked as read only via the isReadOnly prop.

<CheckboxGroup
  label="Newsletters"
  defaultValue={['productUpdates', 'companyNews']}
  isReadOnly
>
  <Checkbox value="productUpdates" label="Product Updates" />
  <Checkbox value="companyNews" label="Company News" />
  <Checkbox value="promotionalCampaigns" label="Promotional Campaigns" />
</CheckboxGroup>
<CheckboxGroup
  label="Newsletters"
  defaultValue={['productUpdates', 'companyNews']}
  isReadOnly
>
  <Checkbox
    value="productUpdates"
    label="Product Updates"
  />
  <Checkbox value="companyNews" label="Company News" />
  <Checkbox
    value="promotionalCampaigns"
    label="Promotional Campaigns"
  />
</CheckboxGroup>
<CheckboxGroup
  label="Newsletters"
  defaultValue={[
    'productUpdates',
    'companyNews'
  ]}
  isReadOnly
>
  <Checkbox
    value="productUpdates"
    label="Product Updates"
  />
  <Checkbox
    value="companyNews"
    label="Company News"
  />
  <Checkbox
    value="promotionalCampaigns"
    label="Promotional Campaigns"
  />
</CheckboxGroup>

Vertical Orientation

By default, the CheckboxGroup will align all checkboxes in a vertical orientation, which stacks all checkboxes on top of each other.

<CheckboxGroup
  label="Newsletters"
  defaultValue={['productUpdates', 'companyNews']}
  orientation="vertical"
>
  <Checkbox value="productUpdates" label="Product Updates" />
  <Checkbox value="companyNews" label="Company News" />
  <Checkbox value="promotionalCampaigns" label="Promotional Campaigns" />
</CheckboxGroup>
<CheckboxGroup
  label="Newsletters"
  defaultValue={['productUpdates', 'companyNews']}
  orientation="vertical"
>
  <Checkbox
    value="productUpdates"
    label="Product Updates"
  />
  <Checkbox value="companyNews" label="Company News" />
  <Checkbox
    value="promotionalCampaigns"
    label="Promotional Campaigns"
  />
</CheckboxGroup>
<CheckboxGroup
  label="Newsletters"
  defaultValue={[
    'productUpdates',
    'companyNews'
  ]}
  orientation="vertical"
>
  <Checkbox
    value="productUpdates"
    label="Product Updates"
  />
  <Checkbox
    value="companyNews"
    label="Company News"
  />
  <Checkbox
    value="promotionalCampaigns"
    label="Promotional Campaigns"
  />
</CheckboxGroup>

Horizontal Orientation

The CheckboxGroup also supports a horizontal orientation, which positions the checkboxes side by side.

<CheckboxGroup
  label="Newsletters"
  defaultValue={['productUpdates', 'companyNews']}
  orientation="horizontal"
>
  <Checkbox value="productUpdates" label="Product Updates" />
  <Checkbox value="companyNews" label="Company News" />
  <Checkbox value="promotionalCampaigns" label="Promotional Campaigns" />
</CheckboxGroup>
<CheckboxGroup
  label="Newsletters"
  defaultValue={['productUpdates', 'companyNews']}
  orientation="horizontal"
>
  <Checkbox
    value="productUpdates"
    label="Product Updates"
  />
  <Checkbox value="companyNews" label="Company News" />
  <Checkbox
    value="promotionalCampaigns"
    label="Promotional Campaigns"
  />
</CheckboxGroup>
<CheckboxGroup
  label="Newsletters"
  defaultValue={[
    'productUpdates',
    'companyNews'
  ]}
  orientation="horizontal"
>
  <Checkbox
    value="productUpdates"
    label="Product Updates"
  />
  <Checkbox
    value="companyNews"
    label="Company News"
  />
  <Checkbox
    value="promotionalCampaigns"
    label="Promotional Campaigns"
  />
</CheckboxGroup>

Accessibility

In order to support internationalization, provide a localized string to the label or aria-label prop.

API