Skip to content

Commit 80d7f01

Browse files
committed
docs: add specification for radio(also single). Add values props for single-radio
1 parent 2636884 commit 80d7f01

File tree

5 files changed

+204
-4
lines changed

5 files changed

+204
-4
lines changed

docs/ru/inputs/input-checkbox.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ const options = {
77
g: "Зелёный",
88
y: "Жёлтый"
99
};
10-
const values = useFormValues(form)
10+
const values = useFormValues(form);
1111

1212
</script>
1313

docs/ru/inputs/input-radio.md

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

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<template>
22
<field-wrap :errors = "errors">
33
<element-input-radio
4-
:model-value="!!modelValue"
4+
:model-value="values ? modelValue === values[0] : modelValue || false"
55
:disabled="disabled"
66
:label="label"
77
:error="!!errors.length"
@@ -24,15 +24,18 @@
2424
modelValue: any,
2525
disabled: boolean,
2626
errors: string[],
27+
values?: [any, any],
2728
}>()
2829
2930
const emit = defineEmits<{
3031
(e: 'update:modelValue', v: any): void
3132
}>()
3233
3334
function handleInput() {
34-
if (props.disabled) return;
35-
emit('update:modelValue', !props.modelValue)
35+
if (props.disabled) return;
36+
37+
const value = props.values ? props.modelValue === props.values[0] ? props.values[1] : props.values[0] : !props.modelValue;
38+
emit('update:modelValue', value)
3639
}
3740
</script>
3841

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,25 @@ describe("Input single radio", () => {
8585
await input.trigger('keyup.enter')
8686
expect(form.getValueByName(name)).toBe(true)
8787
})
88+
test("If values was provided, modelValue should be or first or second value", async () => {
89+
const app = defaultMount(defineComponent({
90+
template: `<div><form-field
91+
type = "single-radio" name = "${name}" label = "Select" required
92+
:values = "['good', 'bad']"
93+
/></div>`,
94+
components: {FormField}
95+
}))
96+
const form = (app.vm as any).form
97+
98+
const input = app.get('.element-input-radio')
99+
100+
await input.trigger('click')
101+
expect(form.getValueByName(name)).toBe("good")
102+
103+
await input.trigger('click')
104+
expect(form.getValueByName(name)).toBe("bad")
105+
106+
await input.trigger('click')
107+
expect(form.getValueByName(name)).toBe("good")
108+
})
88109
})

0 commit comments

Comments
 (0)