GrCheckboxGroup
Берут, когда значений несколько из короткого набора.
Обзор
Когда брать
- значений несколько из короткого набора — права, теги, дни недели, каналы уведомлений;
- все варианты должны быть видны — выбор виден целиком, без раскрытия панели;
- группа — часть формы — общая модель
string[], общиеdisabled,readonlyиinvalid; - вариантов до десятка — дальше список становится длиннее экрана.
Когда взять другое
| Нужно | Берите |
|---|---|
| Вариантов много | GrSelect с multiple |
| Вариантов много и их ищут вводом | GrAutocomplete |
| Можно выбрать только один | GrRadioGroup |
| Чекбокс один | GrCheckbox |
| Варианты вложены | GrTreeSelect |
Playground контролы выводятся из API, а не пишутся руками
Загружается…
0 изменено· состояние — в адресе
<GrCheckboxGroup :options="options" v-model="value" />Примеры 4 у каждого — живое демо и его код
Права роли по разделам
Каждый раздел — группа со своим
string[], и группа раздаёт флажкам выбор,nameи состояния — собственныйv-modelни одному не нужен.disabledу опции сильнее доступной группы: аннулирование выставленных счетов остаётся за владельцем, и подпись это говорит.Role · Accountant3 members · 5 of 7 permissionsInvoicesView invoicesCreate and edit draftsSend to customersVoid issued invoices · owner onlyPaymentsView paymentsMatch bank transfersIssue refundsФильтр со счётчиками
Когда строке нужно больше подписи, слот по умолчанию заменяет
options: каждыйGrCheckboxполучает толькоvalue, остальное даёт группа. Здесь у каждого статуса свой счётчик, а итог под списком следует за выбором.Status71 tickets in the queueOpen48Waiting on customer23On hold6Solved this week131Просмотр, который становится правкой
readonlyу группы оставляет выбор видимым и в форме, но не переключаемым: продление просматривают, а не правят, пока не нажата «Изменить». Состояние принадлежит группе и доходит до каждого флажка, и при переключении ничего не сдвигается.Renewal · add-onsBusiness plan renews on 1 NovemberSingle sign-on€120 a monthAudit log export€60 a monthSandbox workspace€45 a monthPriority support€200 a monthAdd-ons on the next invoice€320 a monthДни недели в ряд
direction="horizontal"подходит семи коротким подписям.requiredобъявляет правило, аinvalidотмечает группу целиком: «хотя бы один день» нарушает набор, а не отдельный флажок, поэтому ошибка объявляется один раз, а не семь.Café Lumen · deliveriesBread arrives before 7:00 on the chosen days Delivery days3 deliveries a weekMonTueWedThuFriSatSun
API порождается из пакета · разойтись не может
Props
| Prop | Type | по умолчанию | Описание |
|---|---|---|---|
disabled | boolean | undefined | false | Выключить всю группу. Складывается с `disabled` у `GrFormField`. |
options | GrCheckboxGroupOption[] | undefined | undefined | Варианты, из которых группа строит чекбоксы. Не нужны, если флажки разложены в слоте. |
readonly | boolean | undefined | false | Только для чтения: выбор видно, но он не меняется. |
invalid | boolean | undefined | false | Визуальное и ARIA-состояние ошибки для всей группы. |
required | boolean | undefined | false | Обязательная группа: `aria-required` объявляют сами чекбоксы. |
size | "xs" | "sm" | "md" | "lg" | undefined | undefined | Ступень размера чекбоксов группы. По умолчанию `md`; берётся из `GrConfigProvider`. |
ariaLabel | string | undefined | undefined | Доступное имя группы. Не задано — имя берётся из подписи `GrFormField`. |
name | string | undefined | undefined | Общее имя для нативной формы: значения уйдут как повторяющиеся поля. |
direction | GrCheckboxGroupDirection | undefined | "vertical" | Раскладка: `vertical` — столбцом, `horizontal` — строкой с переносом. По умолчанию `vertical`. |
modelValueобязательныйv-model | string[] | — | Отмеченные значения (`v-model`): у каждого чекбокса группы свой `value`. |
Слоты
| Slot | Type | Описание |
|---|---|---|
default | any | Собственная разметка флажков вместо генерации из `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
const grCheckboxGroupConfig: import("@feugene/granum/contract").GranumComponentDescriptor<"GrCheckboxGroup">;Файлdist/types/components/GrCheckboxGroup/defaults.d.ts
Пропы GrCheckboxGroup, настраиваемые глобально через
<GrConfigProvider :component-defaults="{ GrCheckboxGroup: { … } }">.
Только оформление — см. GrButton/defaults.ts.
interface GrCheckboxGroupConfigurableProps {
size: GrCheckboxSize;
}Файлdist/types/components/GrCheckboxGroup/GrCheckboxGroup.vue.d.ts
type GrCheckboxGroupDirection = 'vertical' | 'horizontal';interface GrCheckboxGroupOption {
value: string;
label: string;
disabled?: boolean;
}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;
}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
type GrCheckboxGroupInstance = ComponentExposed<typeof GrCheckboxGroupComponent>;Доступность
Паттерн APG
group
| Клавиша | Действие |
|---|---|
| — | стрелок нет: каждый чекбокс — своя остановка Tab, как у набора нативных <input type="checkbox"> |
Полный контракт пакета: docs/keyboard.md ↗
Использование из прозы библиотеки
Модель и контекст
Группа раздаёт вложенным чекбоксам выбранные значения, name, size и
состояния disabled/readonly/invalid, поэтому собственный v-model им не
нужен — достаточно value:
<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: пустой массив считается пустым
значением.
const rules: GrFormRules = {
channels: [{ required: true, message: 'Выберите хотя бы один канал' }],
}Пропы этого примера