Skip to content

Commit 380cc24

Browse files
committed
feat: update test for input-number, add input-number specification
1 parent 340574a commit 380cc24

File tree

4 files changed

+179
-26
lines changed

4 files changed

+179
-26
lines changed

docs/ru/guide/types.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
## StringModify
3+
4+
```ts
5+
type StringModify = (v: unknown) => string
6+
```

docs/ru/inputs/input-number.md

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
<script setup>
2+
import {FormField, Form, useFormValues} from '../../../src';
3+
4+
const form = new Form();
5+
const values = useFormValues(form);
6+
7+
function prettyFn(value) {
8+
if (!value) return '0';
9+
return `- ${value} -`;
10+
}
11+
12+
</script>
13+
14+
# Поле number
15+
16+
Поле используется для ввода численных значений.
17+
18+
- Ключевое слово `number`.
19+
- WhatWG [Спецификация](https://html.spec.whatwg.org/multipage/input.html#number-state-(type=number)).
20+
21+
22+
## Параметры
23+
24+
### autofocus <Badge type = "info">Необязательный</Badge>
25+
26+
- Тип `boolean | 'true' | 'false'`
27+
28+
Если данный параметр передаётся, при установке данного поля, на него будет автоматически передано управление.
29+
30+
### suffix <Badge type = "info">Необязательный</Badge>
31+
- Тип `string`
32+
33+
Если данные атрибут установлен, текстовая метка будет отображаться в конце поля.
34+
35+
### step <Badge type = "info">Необязательный</Badge>
36+
- Тип `number | string`
37+
Данное поле имеет механизм увеличения или уменьшения введённого числа на 1. Для изменения этого параметра
38+
необходимо задать атрибут `step`.
39+
40+
### pretty <Badge type = "info">Необязательный</Badge>
41+
- Тип [StringModify](./../guide/types#StringModify) | [StringModify](./../guide/types#StringModify)
42+
Используется для изменения отображения поля. Данные правила принимаются только после того, как
43+
поле стало не активным.
44+
45+
### placeholder <Badge type = "info">Необязательный</Badge>
46+
- Тип `string`
47+
48+
Строковое значение подсказки перед вводом данных.
49+
50+
____
51+
52+
Так же все параметры, общие для всех `FormField`. Информацию о них можно посмотреть на [этой странице](./form-field.md#params).
53+
54+
## Значение
55+
Данное поле работает с числовым значениями.
56+
57+
## Спецификация
58+
59+
- Поле доступно при использовании `Tab` и `Shift + Tab`.
60+
- Блокировка отменяет навигацию через `Tab`.
61+
- Работа со значением может осуществляться через дополнительный контроллер.
62+
- Блокировка поля изменяет стилистику `number`.
63+
- Ошибка валидации изменяет стилистику `number`.
64+
- Поле позволяет вводить цифры и символы из `+-.,`.
65+
66+
## Пример
67+
68+
Для данного поля нет дополнительных обязательных параметров, по этому нам необходимо
69+
указать лишь `type` и `name`:
70+
71+
::: code-group
72+
```html
73+
<form-field name = "value" type="number"/>
74+
```
75+
76+
```ts
77+
import {FormField} from "jenesius-vue-form";
78+
```
79+
:::
80+
81+
82+
Поле по умолчанию:
83+
<FormField type = "number" name = "value" label = "Введите значение" />
84+
85+
____
86+
87+
В заблокированном состоянии:
88+
<FormField type = "number" name = "value" disabled label = "Заблокированное" />
89+
90+
____
91+
92+
Поле не прошло валидацию:
93+
<FormField type = "number" name = "value" :errors = "['The password is too simple']" label = "С ошибкой" />
94+
95+
____
96+
97+
Поле с использованием аттрибута `suffix`:
98+
<FormField type = "number" name = "value" label = "Введите значение" suffix = "mHz" />
99+
100+
____
101+
102+
Поле с изменённым значение `step`:
103+
<FormField type = "number" name = "value" label = "Введите значение" step = "100" />
104+
____
105+
106+
Изменение конечного отображения поля при помощи аттрибута `pretty`:
107+
<FormField type = "number" name = "value" label = "Введите значение" :pretty = "prettyFn" />
108+
109+
----
110+
Текущее состояние формы:
111+
```ts-vue
112+
{{values}}
113+
```

docs/ru/inputs/input-textarea.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ ____
6969

7070
```ts
7171
import {FormField} from "jenesius-vue-form";
72-
7372
```
7473

7574
:::

tests/integrations/input-number.spec.ts renamed to tests/integrations/inputs/input-number.spec.ts

Lines changed: 60 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import {defineComponent} from "vue";
2-
import {InputField, Form} from "../../src/index";
3-
import {mount, VueWrapper} from "@vue/test-utils";
4-
import EmptyApp from "./components/EmptyApp.vue";
2+
import {FormField, Form} from "./../../../src/index";
3+
import {DOMWrapper, mount, VueWrapper} from "@vue/test-utils";
4+
import EmptyApp from "../components/EmptyApp.vue";
55
import {FormFieldValidationCallback} from "@/types";
66

7+
const name = 'age'
78
function defineNumberComponent() {
89
return defineComponent({
9-
template: '<div><input-field type = "number" name = "age"/></div>',
10-
components: {InputField}
10+
template: `<div><form-field type = "number" name = "${name}" required label = "Numeric" /></div>`,
11+
components: {FormField}
1112
})
1213
}
1314
function defaultMount(component = defineNumberComponent()) {
@@ -22,48 +23,55 @@ function defaultMount(component = defineNumberComponent()) {
2223
describe("Input number", () => {
2324

2425
let wrap: VueWrapper<any>;
25-
beforeEach(() => wrap = defaultMount())
26+
let form: Form
27+
let input: DOMWrapper<HTMLInputElement>
28+
beforeEach(() => {
29+
wrap = defaultMount()
30+
form = (wrap.vm as any).form
31+
input = wrap.find('input')
32+
})
2633

34+
test("Should show label", async () => {
35+
expect(wrap.text()).toBe("Numeric")
36+
})
37+
test("Should be empty by default", async () => {
38+
expect(input.element.value).toBe("")
39+
})
2740
test("Should display value from Form", async () => {
28-
const form = wrap.vm.form as Form;
2941
form.setValues({
3042
age: 25
3143
})
3244
await wrap.vm.$nextTick()
33-
expect(wrap.find("input").element.value).toBe("25")
45+
expect(input.element.value).toBe("25")
3446
})
3547
test("Should change form value", async () => {
36-
const form = wrap.vm.form as Form;
3748
form.setValues({
3849
age: 25
3950
})
4051
await wrap.vm.$nextTick()
41-
expect(wrap.find("input").element.value).toBe("25");
52+
expect(input.element.value).toBe("25");
4253
form.setValues({
4354
age: 26
4455
})
4556
await wrap.vm.$nextTick()
46-
expect(wrap.find("input").element.value).toBe("26");
57+
expect(input.element.value).toBe("26");
4758
form.setValues({
4859
age: 27
4960
})
5061
await wrap.vm.$nextTick()
51-
expect(wrap.find("input").element.value).toBe("27");
62+
expect(input.element.value).toBe("27");
5263
})
5364
test("Step Controller Should be hidden if disabled and input should be disabled", async () => {
54-
const form = wrap.vm.form as Form;
5565
form.setValues({
5666
age: 25
5767
})
5868
form.disable('age')
5969

6070
await wrap.vm.$nextTick()
61-
expect(wrap.find("input").element.disabled).toBe(true);
71+
expect(input.element.disabled).toBe(true);
6272
expect(wrap.find('.widget-number-step_disabled').exists()).toBe(false);
63-
6473
})
6574
test("Click on button should change the value(up arrow/down arrow)", async () => {
66-
const form = wrap.vm.form as Form;
6775
form.setValues({
6876
age: 25
6977
})
@@ -84,14 +92,12 @@ describe("Input number", () => {
8492
expect(form.values).toEqual({age: 25});
8593
})
8694
test("Press up and down should change the value", async () => {
87-
const form = wrap.vm.form as Form;
8895
form.setValues({
8996
age: 25
9097
})
9198

9299
await wrap.vm.$nextTick()
93-
94-
const input = wrap.find("input");
100+
95101
await input.trigger('keydown.up');
96102
await input.trigger('keydown.up');
97103

@@ -103,8 +109,8 @@ describe("Input number", () => {
103109
test("If Step was provided it should change onStep", async () => {
104110

105111
wrap = defaultMount(defineComponent({
106-
template: '<div><input-field type = "number" name = "age" step = "10"/></div>',
107-
components: {InputField}
112+
template: '<div><form-field type = "number" name = "age" step = "10"/></div>',
113+
components: {FormField}
108114
}))
109115

110116
const form = wrap.vm.form as Form;
@@ -122,8 +128,8 @@ describe("Input number", () => {
122128
test("If suffix was provided it should be displayed", async () => {
123129

124130
wrap = defaultMount(defineComponent({
125-
template: '<div><input-field type = "number" name = "age" suffix = "Years"/></div>',
126-
components: {InputField}
131+
template: '<div><form-field type = "number" name = "age" suffix = "Years"/></div>',
132+
components: {FormField}
127133
}))
128134

129135
await wrap.vm.$nextTick();
@@ -138,8 +144,8 @@ describe("Input number", () => {
138144
];
139145

140146
wrap = defaultMount(defineComponent({
141-
template: `<div><input-field type = "number" name = "age" :validation = "${test}" /></div>`,
142-
components: {InputField}
147+
template: `<div><form-field type = "number" name = "age" :validation = "${test}" /></div>`,
148+
components: {FormField}
143149
}))
144150
const form = wrap.vm.form as Form;
145151
await wrap.vm.$nextTick();
@@ -163,5 +169,34 @@ describe("Input number", () => {
163169
await wrap.vm.$nextTick()
164170
expect(wrap.text()).toBe('')
165171
})
172+
test("If pretty was provided it should change input", async () => {
173+
function prettyFn(v?: string | number) {
174+
if (v === undefined) return ''
175+
176+
return `- ${v} _`
177+
}
178+
179+
const app = defaultMount(defineComponent({
180+
setup() {
181+
return {
182+
prettyFn
183+
}
184+
},
185+
template: `<div><form-field type = "number" name = "${name}" required label = "Numeric" :pretty = "prettyFn" /></div>`,
186+
components: {FormField}
187+
}))
188+
const form = (app.vm as any).form as Form;
189+
const input = app.find('input')
190+
expect(input.element.value).toBe("");
191+
192+
form.setValues({
193+
[name]: 123
194+
})
195+
await app.vm.$nextTick()
196+
expect(input.element.value).toBe(prettyFn('123'))
166197

198+
await input.setValue(321);
199+
expect(input.element.value).toBe(prettyFn('321'))
200+
201+
})
167202
})

0 commit comments

Comments
 (0)