Skip to content

Commit 2636884

Browse files
committed
docs: add specification for checkbox and single-checkbox.
1 parent 457e744 commit 2636884

File tree

8 files changed

+271
-0
lines changed

8 files changed

+271
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# FormFieldOptions
2+
3+
Набор перечислимых измерений. Может быть либо массивом, либо объектом. Рекомендуется использовать
4+
массив в качестве передаваемых значений (будет рассмотрено далее в этой статье).
5+
6+
- **Array**
7+
8+
В случае, если был передан массив, то каждые элемент данного массива должен иметь следующий вид:
9+
```ts
10+
interface OptionRow{
11+
label: string,
12+
value: any
13+
}
14+
```
15+
### Пример значений
16+
17+
```ts
18+
[
19+
{label: 'Green color', value: 'green'},
20+
{label: 'Red color', value: 'red'}
21+
]
22+
```
23+
24+
#### label <Badge type = "tip">Строка</Badge>
25+
26+
Текстовая метка, которая будет отображаться в виде заголовка.
27+
28+
#### value <Badge type = "tip">Любое значение</Badge>
29+
30+
Значение, которое будет устанавливаться ячейки.
31+
32+
:::tip Чем полезен массив
33+
Вы не запутаетесь, где метка, а где значение. В случае с объектом существует вероятность того, что
34+
тебе придется
35+
постоянно заходите в документацию, чтобы уточнить расположение метки: справа или слева.
36+
:::
37+
38+
- **Object**
39+
40+
Перейдем к объекту. Помните: слева — значение, справа — метка (заголовок). При передаче объект ожидается следующий тип:
41+
```ts
42+
interface OptionObject {
43+
[value: string]: string
44+
}
45+
```
46+
47+
### Пример
48+
49+
```json
50+
{
51+
"green": "Green color",
52+
"red": "Red color"
53+
}
54+
```
55+
56+
Однако в этом случае мы сталкиваемся со следующей проблемой: значение может быть **только** строкой. Даже указанное число
57+
как значение — будет автоматически преобразовано JavaScript в строку. Есть одна ситуация, когда удобно
58+
использовать
59+
или сохраните значение в объекте. Для этого мы предоставили [функцию](./../guide/utils#convertOptionsObject) для
60+
преобразования объекта в массив.
61+
62+
:::warning Почему значение слева?
63+
Основная причина тому - ключ в объект является уникальным. То есть нельзя создать объект с двумя одинаковыми ключами.
64+
Именно эта валидация побудила использовать ключ, как `value`, а само значение ключа, как `label`.
65+
:::

docs/ru/inputs/form-field.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
2+
3+
## Параметры {params}
4+
5+
- label
6+
7+
- name
8+
9+
- validation
10+
11+
- type
12+
13+
- disabled

docs/ru/inputs/input-checkbox.md

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
<script setup>
2+
import {FormField, Form, useFormValues} from '../../../src';
3+
4+
const form = new Form();
5+
const options = {
6+
r: "Красный",
7+
g: "Зелёный",
8+
y: "Жёлтый"
9+
};
10+
const values = useFormValues(form)
11+
12+
</script>
13+
14+
# Поле checkbox
15+
16+
Поле используется для множественного выбора значений из предоставленного набора.
17+
18+
- Ключевое слово `checkbox`.
19+
- WhatWG [Спецификация](https://html.spec.whatwg.org/multipage/input.html#checkbox-state-(type=checkbox)).
20+
21+
## Параметры
22+
23+
24+
### options <Badge type = "tip">Обязательный</Badge>
25+
26+
- Тип [FormFieldOptions](./../fields/form-field-options).
27+
28+
29+
____
30+
31+
Так же все параметры, общие для всех `FormField`. Информацию о них можно посмотреть на [этой странице](./form-field.md#params).
32+
33+
## Значение
34+
35+
В качестве значения выступает **массив**, содержащий `value` выбранных элементов,
36+
т.к. поле предназначено для множественного выбора.
37+
38+
## Спецификация
39+
40+
- Навигация по объекту осуществляется при помощи нажатия `Tab` и `Shift + Tab`.
41+
- Навигация **не** доступна по нажатию `ArrowDown` и `ArrowUp`.
42+
- Выбор элементом возможен по щелчку на соответсвующий элемент,
43+
а также по нажатию `Enter` или `Space` находясь на нужном элементе.
44+
- Блокировка полей отменяет навигацию используя `Tab`. Также происходит изменение стилистики `checkbox`.
45+
- При неудачной валидации поле должно изменить стилистику `checkbox`.
46+
47+
## Примеры
48+
49+
Для подключения виджета воспользуйтесь стандартной компонентой `FormField`, а также необходимо
50+
указать атрибуты `type` и `name`:
51+
```vue
52+
<template>
53+
<form-field
54+
name = "color"
55+
type = "checkbox"
56+
label = "Color"
57+
:options = "options"
58+
/>
59+
</template>
60+
<script setup>
61+
import {FormField} from "jenesius-vue-form";
62+
63+
const options = {
64+
r: "Красный",
65+
g: "Зелёный",
66+
y: "Жёлтый"
67+
}
68+
69+
</script>
70+
```
71+
72+
73+
----
74+
Текущее состояние формы:
75+
```ts-vue
76+
{{values}}
77+
```
78+
79+
Поле в обычно состоянии:
80+
<FormField :options = "options" type = "checkbox" name = "color" label = "Select color" />
81+
_____
82+
83+
Вид поля при его блокировки:
84+
<FormField :options = "options" type = "checkbox" name = "color" disabled label = "Disabled status" />
85+
86+
_____
87+
Вид поля в случае ошибки валидации:
88+
<FormField :options = "options" type = "checkbox" name = "color" :errors = "['Seleact all options']" label = "With Error" />
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
<script setup>
2+
import {FormField, Form, useFormValues} from '../../../src';
3+
4+
const form = new Form();
5+
const values = useFormValues(form)
6+
7+
</script>
8+
9+
# Поле single-checkbox
10+
11+
Поле может использоваться в качестве переключателя или для выбора одного значения
12+
из двух.
13+
14+
- Ключевое слово `single-checkbox`.
15+
- WhatWG [Спецификация](https://html.spec.whatwg.org/multipage/input.html#checkbox-state-(type=checkbox)).
16+
17+
## Параметры
18+
19+
### values <Badge type = "info">Необязательный</Badge>
20+
21+
- Тип `[any, any]`.
22+
В случае, если данный параметр передан, то включенный параметр будет соответствовать `values[0]`
23+
значение, а выключенный `values[1]`.
24+
____
25+
26+
Так же все параметры, общие для всех `FormField`. Информацию о них можно посмотреть на [этой странице](./form-field.md#params).
27+
28+
## Значение
29+
30+
Если параметр **values** не был передан, то значение будет **true** - включён, **false** - выключен.
31+
В случае, когда **values** передаётся, Включенному знаю будет соответствовать `values[0]`,
32+
а выключенному оставшееся значение.
33+
34+
## Спецификация
35+
36+
- Выбор элемента возможен по щелчку на сам элемент.
37+
- Выбор возможен по нажатию `Enter` или `Space`.
38+
- Блокировка полей отменяет навигацию используя `Tab`.
39+
Также происходит изменение стилистики `single-checkbox`.
40+
- При неудачной валидации поле должно изменить стилистику `single-checkbox`.
41+
42+
## Примеры
43+
44+
Для данного поля нет дополнительных обязательных параметров, по этому нам необходимо
45+
указать лишь `type` и `name`:
46+
47+
::: code-group
48+
49+
```html
50+
<form-field name = "hasPhone" type="single-checkbox"/>
51+
```
52+
53+
```ts
54+
import {FormField} from "jenesius-vue-form";
55+
56+
```
57+
58+
:::
59+
60+
Поле по умолчанию:
61+
<FormField type = "single-checkbox" name = "isAdmin" label = "Это администратор" />
62+
63+
____
64+
65+
В заблокированном состоянии:
66+
<FormField disabled type = "single-checkbox" name = "isAdmin" label = "Заблокированное" />
67+
68+
____
69+
70+
Поле не прошло валидацию:
71+
<FormField :errors = "['Seleact this fields']" type = "single-checkbox" name = "isAdmin" label = "С ошибкой" />
72+
73+
____
74+
75+
Поле с переданными `values`: ```['yes', 'no']```
76+
<FormField :values = "['yes', 'no']" type = "single-checkbox" name = "isAdmin" label = "С переданными values" />
77+
_____
78+
79+
80+
81+
82+
----
83+
Текущее состояние формы:
84+
```ts-vue
85+
{{values}}
86+
```

src/types/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ export type Value = Values | any;
99
export type FormFieldValidationCallback = (values: any) => true | ValidationError
1010
export type ValidationError = string | false
1111

12+
export type FormFieldOptions = OptionRow | Record<string, string>
13+
1214
export type OptionRow = IOptionRowWithLabel | IOptionRowWithTitle
1315

1416
export interface IOptionRowWithLabel {

src/widgets/inputs/input-checkbox/element-input-checkbox.vue

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ defineProps<{
5858
.element-input-checkbox-button_disabled{
5959
cursor: default;
6060
}
61+
.element-input-checkbox:has(.element-input-checkbox-button_disabled) {
62+
cursor: default;
63+
}
64+
6165
.element-input-checkbox-button_error {
6266
border: var(--vf-input-border-error);
6367
}

src/widgets/inputs/input-single-checkbox/widget-input-single-checkbox.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<element-input-checkbox
44
:model-value="values ? modelValue === values[0] : modelValue || false"
55
:disabled="disabled"
6+
:tabindex="disabled? 'none' : 0"
67
:label="label"
78
@click="onInput"
89
@keyup.enter="onInput"

tests/integrations/input-single-checkbox.spec.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,4 +107,16 @@ describe("Input single checkbox", () => {
107107
await input.trigger('keyup.enter')
108108
expect(form.getValueByName(name)).toBe("good")
109109
})
110+
test("Tabindex should be provided if field is not disabled", async () => {
111+
const item = app.find('.element-input-checkbox')
112+
113+
expect(item.element.getAttribute('tabindex')).toBe('0')
114+
})
115+
test("Tabindex should be 'none' if field was disabled", async () => {
116+
const item = app.find('.element-input-checkbox')
117+
form.disable()
118+
await app.vm.$nextTick();
119+
120+
expect(item.element.getAttribute('tabindex')).toBe('none')
121+
})
110122
})

0 commit comments

Comments
 (0)