GrCheckboxGroup

  • ядро
  • Формы
  • API · 10 props
  • ⌨ клавиши

Берут, когда значений несколько из короткого набора.

import { GrCheckboxGroup } from '@feugene/granularity/components/GrCheckboxGroup'

Обзор

Когда брать

  • значений несколько из короткого набора — права, теги, дни недели, каналы уведомлений;
  • все варианты должны быть видны — выбор виден целиком, без раскрытия панели;
  • группа — часть формы — общая модель string[], общие disabled, readonly и invalid;
  • вариантов до десятка — дальше список становится длиннее экрана.

Когда взять другое

НужноБерите
Вариантов многоGrSelect с multiple
Вариантов много и их ищут вводомGrAutocomplete
Можно выбрать только одинGrRadioGroup
Чекбокс одинGrCheckbox
Варианты вложеныGrTreeSelect

Playground контролы выводятся из API, а не пишутся руками

Сцена

Загружается…

0 изменено· состояние — в адресе

Примеры 4 у каждого — живое демо и его код

  • Права роли по разделам

    Каждый раздел — группа со своим string[], и группа раздаёт флажкам выбор, name и состояния — собственный v-model ни одному не нужен. disabled у опции сильнее доступной группы: аннулирование выставленных счетов остаётся за владельцем, и подпись это говорит.

    Role · Accountant3 members · 5 of 7 permissions
    Invoices
    View invoices
    Create and edit drafts
    Send to customers
    Void issued invoices · owner only
    Payments
    View payments
    Match bank transfers
    Issue refunds
  • Фильтр со счётчиками

    Когда строке нужно больше подписи, слот по умолчанию заменяет options: каждый GrCheckbox получает только value, остальное даёт группа. Здесь у каждого статуса свой счётчик, а итог под списком следует за выбором.

    Status
    Open48
    Waiting on customer23
    On hold6
    Solved this week131
    71 tickets in the queue
  • Просмотр, который становится правкой

    readonly у группы оставляет выбор видимым и в форме, но не переключаемым: продление просматривают, а не правят, пока не нажата «Изменить». Состояние принадлежит группе и доходит до каждого флажка, и при переключении ничего не сдвигается.

    Renewal · add-onsBusiness plan renews on 1 November
    Single sign-on€120 a month
    Audit log export€60 a month
    Sandbox workspace€45 a month
    Priority support€200 a month
    Add-ons on the next invoice€320 a month
  • Дни недели в ряд

    direction="horizontal" подходит семи коротким подписям. required объявляет правило, а invalid отмечает группу целиком: «хотя бы один день» нарушает набор, а не отдельный флажок, поэтому ошибка объявляется один раз, а не семь.

    Café Lumen · deliveriesBread arrives before 7:00 on the chosen days
    Delivery days
    Mon
    Tue
    Wed
    Thu
    Fri
    Sat
    Sun
    3 deliveries a week

API порождается из пакета · разойтись не может

Props

PropTypeпо умолчаниюОписание
disabledboolean | undefinedfalseВыключить всю группу. Складывается с `disabled` у `GrFormField`.
optionsGrCheckboxGroupOption[] | undefinedundefinedВарианты, из которых группа строит чекбоксы. Не нужны, если флажки разложены в слоте.
readonlyboolean | undefinedfalseТолько для чтения: выбор видно, но он не меняется.
invalidboolean | undefinedfalseВизуальное и ARIA-состояние ошибки для всей группы.
requiredboolean | undefinedfalseОбязательная группа: `aria-required` объявляют сами чекбоксы.
size"xs" | "sm" | "md" | "lg" | undefinedundefinedСтупень размера чекбоксов группы. По умолчанию `md`; берётся из `GrConfigProvider`.
ariaLabelstring | undefinedundefinedДоступное имя группы. Не задано — имя берётся из подписи `GrFormField`.
namestring | undefinedundefinedОбщее имя для нативной формы: значения уйдут как повторяющиеся поля.
directionGrCheckboxGroupDirection | undefined"vertical"Раскладка: `vertical` — столбцом, `horizontal` — строкой с переносом. По умолчанию `vertical`.
modelValueобязательныйv-modelstring[]—Отмеченные значения (`v-model`): у каждого чекбокса группы свой `value`.

Слоты

SlotTypeОписание
defaultanyСобственная разметка флажков вместо генерации из `options`.

События

EventСигнатураОписание
update:modelValue(event: "update:modelValue", value: string[]): void—
change(event: "change", value: string[]): void—
focus(event: "focus", event: FocusEvent): void—
blur(event: "blur", event: FocusEvent): void—

Методы

MethodsСигнатураОписание
focus() => voidПоставить фокус на первый доступный чекбокс группы.
blur() => voidСнять фокус с первого доступного чекбокса — пара к `focus`.

Типы

Все экспортируемые типы подпути, по файлам, где они объявлены. Имена, дженерики и тела читаются из файлов деклараций пакета и разойтись не могут.

Импорт
import type { GrCheckboxGroupConfigurableProps, GrCheckboxGroupDirection, GrCheckboxGroupOption } from '@feugene/granularity/components/GrCheckboxGroup'

Файлdist/types/components/GrCheckboxGroup/config.d.ts

grCheckboxGroupConfigconst
const grCheckboxGroupConfig: import("@feugene/granum/contract").GranumComponentDescriptor<"GrCheckboxGroup">;

Файлdist/types/components/GrCheckboxGroup/defaults.d.ts

GrCheckboxGroupConfigurablePropsinterface

Пропы GrCheckboxGroup, настраиваемые глобально через <GrConfigProvider :component-defaults="{ GrCheckboxGroup: { … } }">. Только оформление — см. GrButton/defaults.ts.

interface GrCheckboxGroupConfigurableProps {
    size: GrCheckboxSize;
}

Файлdist/types/components/GrCheckboxGroup/GrCheckboxGroup.vue.d.ts

GrCheckboxGroupDirectiontype
type GrCheckboxGroupDirection = 'vertical' | 'horizontal';
GrCheckboxGroupOptioninterface
interface GrCheckboxGroupOption {
    value: string;
    label: string;
    disabled?: boolean;
}
GrCheckboxGroupPropsinterface
interface GrCheckboxGroupProps {
    /** Отмеченные значения (`v-model`): у каждого чекбокса группы свой `value`. */
    modelValue: string[];
    /** Варианты, из которых группа строит чекбоксы. Не нужны, если флажки разложены в слоте. */
    options?: GrCheckboxGroupOption[];
    /** Общее имя для нативной формы: значения уйдут как повторяющиеся поля. */
    name?: string;
    /** Выключить всю группу. Складывается с `disabled` у `GrFormField`. */
    disabled?: boolean;
    /** Только для чтения: выбор видно, но он не меняется. */
    readonly?: boolean;
    /** Визуальное и ARIA-состояние ошибки для всей группы. */
    invalid?: boolean;
    /** Обязательная группа: `aria-required` объявляют сами чекбоксы. */
    required?: boolean;
    /** Раскладка: `vertical` — столбцом, `horizontal` — строкой с переносом. По умолчанию `vertical`. */
    direction?: GrCheckboxGroupDirection;
    /** Ступень размера чекбоксов группы. По умолчанию `md`; берётся из `GrConfigProvider`. */
    size?: GrCheckboxSize;
    /** Доступное имя группы. Не задано — имя берётся из подписи `GrFormField`. */
    ariaLabel?: string;
}
GrCheckboxGroupEmitsinterface
interface GrCheckboxGroupEmits {
    /** Новый набор отмеченных значений (`v-model`). */
    (e: 'update:modelValue', value: string[]): void;
    /** Пользователь отметил или снял чекбокс — тот же payload, что у `update:modelValue`. */
    (e: 'change', value: string[]): void;
    /** Фокус вошёл в группу. Переход между её чекбоксами событием не считается. */
    (e: 'focus', event: FocusEvent): void;
    /** Фокус ушёл из группы целиком. */
    (e: 'blur', event: FocusEvent): void;
}

Файлdist/types/components/GrCheckboxGroup/index.d.ts

GrCheckboxGroupInstancetype
type GrCheckboxGroupInstance = ComponentExposed<typeof GrCheckboxGroupComponent>;

Доступность

Паттерн APG

group

КлавишаДействие
—стрелок нет: каждый чекбокс — своя остановка Tab, как у набора нативных <input type="checkbox">

Использование из прозы библиотеки

Модель и контекст

Группа раздаёт вложенным чекбоксам выбранные значения, name, size и состояния disabled/readonly/invalid, поэтому собственный v-model им не нужен — достаточно value:

vue
<GrCheckboxGroup v-model="channels" name="channels" :options="options" />

<GrCheckboxGroup v-model="channels" direction="horizontal">
  <GrCheckbox value="sms">SMS</GrCheckbox>
  <GrCheckbox value="email">Email</GrCheckbox>
</GrCheckboxGroup>

name уходит на каждый отмеченный чекбокс, поэтому нативная форма получает повторяющееся поле: new FormData(form).getAll('channels').

disabled отдельной опции сильнее доступной группы. Значение в модели, которого нет среди options, группа не теряет: снятие соседнего чекбокса его сохраняет.

Роль и ARIA

role="group", а не radiogroup: у чекбоксов нет roving tabindex и переезда выбора стрелками — каждый остаётся собственной остановкой Tab, ровно как набор нативных <input type="checkbox">.

role="group" не поддерживает aria-required и aria-readonly (axe роняет это как critical aria-allowed-attr), поэтому оба состояния объявляют сами чекбоксы. aria-invalid, наоборот, висит только на группе: продублированный на каждом пункте, он заставил бы диктор повторить «неверное значение» столько раз, сколько в группе чекбоксов, — пункты при ошибке только перекрашиваются.

Обязательность

Как и у одиночного чекбокса, required — объявление; проверяет правило формы. Для группы работает встроенное required: пустой массив считается пустым значением.

ts
const rules: GrFormRules = {
  channels: [{ required: true, message: 'Выберите хотя бы один канал' }],
}