Skip to content

Commit 099bbe0

Browse files
committed
feat: tests/specification for switch, date. Add get-next-from-toggle-values.ts
1 parent 83adf78 commit 099bbe0

File tree

9 files changed

+389
-34
lines changed

9 files changed

+389
-34
lines changed

docs/ru/inputs/input-date.md

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
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+
# Поле date
10+
11+
Поле используется для выбора даты и обрабатывает время в ISO формате.
12+
13+
- Ключевое слово `date`.
14+
- WhatWG [Спецификация](https://html.spec.whatwg.org/multipage/input.html#date-state-(type=date)).
15+
16+
## Параметры
17+
18+
### placeholder <Badge type = "info">Необязательный</Badge>
19+
20+
- Тип `string`
21+
Строковая метка, отображается, когда в поле нет данных.
22+
23+
### mask <Badge type = "info">Необязательный</Badge>
24+
25+
- Тип `string`.
26+
- По умолчанию: `YYYY/MM/DD`.
27+
28+
Маска задаёт формат отображение даты. Маска может состоять из символов любых символов, однако
29+
ключевыми являются `Y`, `M`, `D`, `H` и `h`. На их позицию будут подставлены соотвествующие значений.
30+
31+
____
32+
33+
Так же все параметры, общие для всех `FormField`. Информацию о них можно посмотреть на [этой странице](./form-field.md#params).
34+
35+
## Значение
36+
37+
Значение поля выступает строка соответсвующая упрощённому расширенному
38+
ISO формату [(ISO 8601)](https://en.wikipedia.org/wiki/ISO_8601).
39+
40+
## Спецификация
41+
42+
- Поле доступно при использовании `Tab` и `Shift + Tab`.
43+
- Ввод даты возможно используя поле ввода.
44+
- Для выбора даты доступен дополнительный контроллер: календарь.
45+
- Календарь не должен быть доступен для `Tab` или `Shift + Tab`.
46+
- Блокировка полей отменяет навигацию используя `Tab`.
47+
Также происходит изменение стилистики `date`.
48+
- При неудачной валидации поле должно изменить стилистику `date`.
49+
50+
## Примеры
51+
52+
Для данного поля нет дополнительных обязательных параметров, по этому нам необходимо
53+
указать лишь `type` и `name`:
54+
55+
::: code-group
56+
57+
```html
58+
<form-field name = "created" type="date"/>
59+
```
60+
61+
```ts
62+
import {FormField} from "jenesius-vue-form";
63+
64+
```
65+
66+
:::
67+
68+
Поле по умолчанию:
69+
<FormField type = "date" name = "created" label = "Это администратор" />
70+
71+
____
72+
73+
В заблокированном состоянии:
74+
<FormField disabled type = "date" name = "created" label = "Заблокированное" />
75+
76+
____
77+
78+
Поле не прошло валидацию:
79+
<FormField :errors = "['Seleact this fields']" type = "date" name = "created" label = "С ошибкой" />
80+
81+
____
82+
83+
Изменённое значение `mask`:
84+
<FormField mask = "YYYY_MM" type = "date" name = "deleted" label = "С переданными values" />
85+
_____
86+
87+
88+
----
89+
Текущее состояние формы:
90+
```ts-vue
91+
{{values}}
92+
```

docs/ru/inputs/input-switch.md

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+
# Поле switch
10+
11+
Поле может использоваться в качестве переключателя или для выбора одного значения
12+
из двух.
13+
14+
- Ключевое слово `switch`.
15+
16+
## Параметры
17+
18+
### values <Badge type = "info">Необязательный</Badge>
19+
20+
- Тип `[any, any]`.
21+
В случае, если данный параметр передан, то включенный параметр будет соответствовать `values[0]`
22+
значение, а выключенный `values[1]`.
23+
____
24+
25+
Так же все параметры, общие для всех `FormField`. Информацию о них можно посмотреть на [этой странице](./form-field.md#params).
26+
27+
## Значение
28+
29+
Если параметр **values** не был передан, то значение будет **true** - включён, **false** - выключен.
30+
В случае, когда **values** передаётся, включенному значению будет соответствовать `values[0]`,
31+
а выключенному оставшееся значение.
32+
33+
## Спецификация
34+
35+
- Поле доступно при использовании `Tab` и `Shift + Tab`.
36+
- Выбор элемента возможен по щелчку на сам элемент.
37+
- Выбор возможен по нажатию `Enter` или `Space`.
38+
- Блокировка полей отменяет навигацию используя `Tab`.
39+
Также происходит изменение стилистики `switch`.
40+
- При неудачной валидации поле должно изменить стилистику `switch`.
41+
42+
## Примеры
43+
44+
Для данного поля нет дополнительных обязательных параметров, по этому нам необходимо
45+
указать лишь `type` и `name`:
46+
47+
::: code-group
48+
49+
```html
50+
<form-field name = "hasPhone" type="switch"/>
51+
```
52+
53+
```ts
54+
import {FormField} from "jenesius-vue-form";
55+
56+
```
57+
58+
:::
59+
60+
Поле по умолчанию:
61+
<FormField type = "switch" name = "isAdmin" label = "Это администратор" />
62+
63+
____
64+
65+
В заблокированном состоянии:
66+
<FormField disabled type = "switch" name = "isAdmin" label = "Заблокированное" />
67+
68+
____
69+
70+
Поле не прошло валидацию:
71+
<FormField :errors = "['Seleact this fields']" type = "switch" name = "isAdmin" label = "С ошибкой" />
72+
73+
____
74+
75+
Поле с переданными `values`: ```['yes', 'no']```
76+
<FormField :values = "['yes', 'no']" type = "switch" name = "useMask" label = "С переданными values" />
77+
_____
78+
79+
80+
81+
82+
----
83+
Текущее состояние формы:
84+
```ts-vue
85+
{{values}}
86+
```

src/types/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export type ValidationError = string | false
1212
export type FormFieldOptions = OptionRow | Record<string, string>
1313

1414
export type OptionRow = IOptionRowWithLabel | IOptionRowWithTitle
15+
export type ToggleValues = [any, any];
1516

1617
export interface IOptionRowWithLabel {
1718
label: string,
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import {ToggleValues} from "../types";
2+
export default function getNextFormToggleValues(values: ToggleValues, value: any) {
3+
return values[0] !== value ? values[0] : values[1]
4+
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
<script setup lang="ts">
1818
import FieldWrap from "../field-wrap.vue";
1919
import ElementInputCheckbox from "../input-checkbox/element-input-checkbox.vue";
20+
import getNextFormToggleValues from "../../../utils/get-next-from-toggle-values";
2021
2122
const props = defineProps<{
2223
label?: string,
@@ -33,7 +34,7 @@ const emit = defineEmits<{
3334
function onInput() {
3435
if (props.disabled) return;
3536
36-
const value = props.values ? props.modelValue === props.values[0] ? props.values[1] : props.values[0] : !props.modelValue;
37+
const value = props.values ? getNextFormToggleValues(props.values, props.modelValue) : !props.modelValue;
3738
emit('update:modelValue', value)
3839
}
3940

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
<script setup lang = "ts">
1919
import ElementInputRadio from "./../input-radio/element-input-radio.vue";
2020
import FieldWrap from "../field-wrap.vue";
21+
import getNextFormToggleValues from "../../../utils/get-next-from-toggle-values";
2122
2223
const props = defineProps<{
2324
label?: string,
@@ -34,7 +35,7 @@
3435
function handleInput() {
3536
if (props.disabled) return;
3637
37-
const value = props.values ? props.modelValue === props.values[0] ? props.values[1] : props.values[0] : !props.modelValue;
38+
const value = props.values ? getNextFormToggleValues(props.values, props.modelValue) : !props.modelValue;
3839
emit('update:modelValue', value)
3940
}
4041
</script>

src/widgets/inputs/input-switch/widget-input-switch.vue

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
<template>
2-
<field-wrap>
2+
<field-wrap :errors = "errors">
33
<div class="container-input-switch">
44
<div class="input-switch"
5-
@click="onInput()"
5+
66
:class="{
7-
'input-switch_disabled': disabled
7+
'input-switch_disabled': disabled,
8+
'vf-input-switch_error': errors && errors.length !== 0
89
}"
910
:tabindex=" disabled ? 'none' : 0"
11+
12+
@click="onInput()"
1013
@keyup.enter = "onInput()"
14+
@keyup.space = "onInput()"
1115
>
1216
<div class="input-switch-button"
1317
:class="{
14-
'input-switch-button_active': !!modelValue
18+
'input-switch-button_active': values ? values[0] === modelValue : !!modelValue
1519
}"
1620
></div>
1721
</div>
@@ -23,20 +27,25 @@
2327

2428
<script setup lang="ts">
2529
import FieldWrap from "../field-wrap.vue";
30+
import {ToggleValues} from "../../../types";
31+
import getNextFormToggleValues from "../../../utils/get-next-from-toggle-values";
2632
2733
const props = defineProps<{
2834
label?: string,
2935
modelValue: any,
30-
disabled: boolean
36+
disabled: boolean,
37+
errors: string[],
38+
values?: ToggleValues
3139
}>()
3240
3341
3442
const emit = defineEmits<{
3543
(e: 'update:modelValue', v: any): void
3644
}>()
3745
38-
function onInput(v = !props.modelValue) {
46+
function onInput(v = props.values ? getNextFormToggleValues(props.values, props.modelValue) : !props.modelValue) {
3947
if (props.disabled) return;
48+
4049
emit('update:modelValue', v)
4150
}
4251
@@ -78,6 +87,9 @@ function onInput(v = !props.modelValue) {
7887
background-color: var(--vf-input-active);
7988
transform: translateX(18px);
8089
}
90+
.vf-input-switch_error {
91+
border: var(--vf-input-border-error);
92+
}
8193
8294
.input-switch-label {
8395
margin: 0;

0 commit comments

Comments
 (0)