Miss any of our Open RFC calls?Watch the recordings here! »

@lion/radio-group

0.10.1 • Public • Published

Radio-group

lion-radio-group component is webcomponent that enhances the functionality of the native <input type="radio"> element. Its purpose is to provide a way for users to check a single option amongst a set of choices.

You should use <lion-radio>s inside this element.

import { html } from 'lit-html';
import { Required, Validator } from '@lion/form-core';
import { loadDefaultFeedbackMessages } from '@lion/validate-messages';
 
import './lion-radio-group.js';
import './lion-radio.js';
 
export default {
  title: 'Forms/Radio Group',
};
 
loadDefaultFeedbackMessages();
export const main = () => html`
  <lion-radio-group name="dinos" label="What are your favourite dinosaurs?">
    <lion-radio label="allosaurus" .choiceValue=${'allosaurus'}></lion-radio>
    <lion-radio label="brontosaurus" .choiceValue=${'brontosaurus'}></lion-radio>
    <lion-radio label="diplodocus" .choiceValue=${'diplodocus'}></lion-radio>
  </lion-radio-group>
`;
  • Make sure that to use a name attribute as it is necessary for the lion-form's serialization result.
  • If you have many options for a user to pick from, consider using lion-select instead

Live Demo/Documentation

See our storybook for a live demo and API documentation

Features

Since it extends from lion-fieldset, it has all the features a fieldset has.

  • Get or set the checked value of the group:
    • modelValue (default) - checkedValue()
    • formattedValue - formattedValue()
    • serializedValue - serializedValue()

How to use

Installation

npm i --save @lion/radio-group
import { LionRadioGroup, LionRadio } from '@lion/radio-group';
// or
import '@lion/radio-group/lion-radio-group.js';
import '@lion/radio-group/lion-radio.js';

Model value

The modelValue of a lion-radio-group is string equal to the choiceValue of the lion-radio element that has been checked.

Given the dinosaur example above, say that we were to select the last option (diplodocus).

Then the modelValue of the lion-radio-group will look as follows:

const groupElement = [parent].querySelector('lion-radio-group');
groupElement.modelValue;
  => "diplodocus";

The name attribute

The name attribute of a lion-radio-group automatically gets assigned to its lion-radio children. You can also specify names for the lion-radio elements, but if this name is different from the name assigned to lion-radio-group, then an exception will be thrown.

Our recommendation would be to set the name attribute only on the lion-radio-group and not on the lion-checkbox elements.

Examples

Pre-select

You can pre-select an option by adding the checked attribute to the selected lion-radio.

export const preSelect = () => html`
  <lion-radio-group name="dinos_2" label="What are your favourite dinosaurs?">
    <lion-radio label="allosaurus" .choiceValue=${'allosaurus'}></lion-radio>
    <lion-radio label="brontosaurus" .choiceValue=${'brontosaurus'checked></lion-radio>
    <lion-radio label="diplodocus" .choiceValue=${'diplodocus'}></lion-radio>
  </lion-radio-group>
`;

Disabled

You can disable a specific lion-radio option by adding the disabled attribute.

export const disabledRadio = () => html`
  <lion-radio-group name="dinos_4" label="What are your favourite dinosaurs?">
    <lion-radio label="allosaurus" .choiceValue=${'allosaurus'}></lion-radio>
    <lion-radio label="brontosaurus" .choiceValue=${'brontosaurus'disabled></lion-radio>
    <lion-radio label="diplodocus" .choiceValue=${'diplodocus'}></lion-radio>
  </lion-radio-group>
`;

You can do the same thing for the entire group by setting the disabled attribute on the lion-radio-group element.

export const disabledGroup = () => html`
  <lion-radio-group name="dinos_6" label="What are your favourite dinosaurs?" disabled>
    <lion-radio label="allosaurus" .choiceValue=${'allosaurus'}></lion-radio>
    <lion-radio label="brontosaurus" .choiceValue=${'brontosaurus'}></lion-radio>
    <lion-radio label="diplodocus" .choiceValue=${'diplodocus'}></lion-radio>
  </lion-radio-group>
`;

Validation

export const validation = () => {
  const validate = () => {
    const radioGroup = document.querySelector('#dinos');
    radioGroup.submitted = !radioGroup.submitted;
  };
  return html`
    <lion-radio-group
      id="dinos"
      name="dinos_8"
      label="Favourite dinosaur"
      .validators=${[new Required()]}
    >
      <lion-radio label="allosaurus" .choiceValue=${'allosaurus'}></lion-radio>
      <lion-radio label="brontosaurus" .choiceValue=${'brontosaurus'}></lion-radio>
      <lion-radio label="diplodocus" .choiceValue="${'diplodocus'}"></lion-radio>
    </lion-radio-group>
    <button @click="${() => validate()}">Validate</button>
  `;
};

You can also create a validator that validates whether a certain option is checked.

export const validateItem = () => {
  class IsBrontosaurus extends Validator {
    static get validatorName() {
      return 'IsBrontosaurus';
    }
    execute(value) {
      let showFeedback = false;
      if (value !== 'brontosaurus') {
        showFeedback = true;
      }
      return showFeedback;
    }
    static async getMessage() {
      return 'You need to select "brontosaurus"';
    }
  }
  const validate = () => {
    const radioGroup = document.querySelector('#dinosTwo');
    radioGroup.submitted = !radioGroup.submitted;
  };
  return html`
    <lion-radio-group
      id="dinosTwo"
      name="dinosTwo"
      label="Favourite dinosaur"
      .validators=${[new Required(), new IsBrontosaurus()]}
    >
      <lion-radio label="allosaurus" .choiceValue=${'allosaurus'}></lion-radio>
      <lion-radio label="brontosaurus" .choiceValue=${'brontosaurus'}></lion-radio>
      <lion-radio label="diplodocus" .choiceValue=${'diplodocus'}></lion-radio>
    </lion-radio-group>
    <button @click="${() => validate()}">Validate</button>
  `;
};

Install

npm i @lion/radio-group

DownloadsWeekly Downloads

810

Version

0.10.1

License

MIT

Unpacked Size

38.9 kB

Total Files

11

Last publish

Collaborators

  • avatar