Skip to content
This repository was archived by the owner on Apr 9, 2025. It is now read-only.

Commit e58e16e

Browse files
author
Daniel Requejo
committed
Clear functions documented
1 parent 1dd6662 commit e58e16e

File tree

4 files changed

+175
-7
lines changed

4 files changed

+175
-7
lines changed
Lines changed: 96 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,96 @@
1-
# clearError
1+
# clearError: <font size="3">ClearError</font>
2+
3+
Clears all the errors from the form or the error from a field programmatically.
4+
5+
## Demo
6+
7+
Coming soon...
8+
## Usage
9+
10+
### Validating/Invalidating the form without a field scoped validation
11+
12+
```vue
13+
<template>
14+
<form>
15+
<input type="text" v-bind="register('name')" />
16+
<input type="text" v-bind="register('email')" />
17+
<input type="text" v-bind="register('password')" />
18+
<input type="text" v-bind="register('password_confirmation')" />
19+
<button type="submit">Submit</button>
20+
</form>
21+
</template>
22+
<script setup lang="ts" >
23+
import { useFormHandler, Interceptor } from '../src/index'
24+
25+
const sleep = (milliseconds: number) => {
26+
return new Promise(resolve => setTimeout(resolve, milliseconds))
27+
}
28+
29+
//validate your fields here
30+
const validateFieldGroup = async () => {
31+
await sleep(1000)
32+
return Math.random() < 0.5;
33+
}
34+
35+
const interceptor: Interceptor = async ({ name, setError, clearError }) => {
36+
if (['name', 'email'].includes(name)) {
37+
await validateUser()
38+
? clearError(name)
39+
: setError('user', 'User already exists')
40+
}
41+
return true
42+
}
43+
44+
const { register } = useFormHandler({ interceptor })
45+
</script>
46+
```
47+
48+
Notice how we use the combination of [setError](/api/use-form-handler/set-error) and `clearError` in order to invalidate the form when we have some fields that need to be validated together and the error is not scoped to one single field but to the whole field group.
49+
50+
### Clearing the errors of a form after triggering validation/ submitting on demand
51+
52+
```vue
53+
<template>
54+
<form @submit.prevent="handleSubmit(successFn, errorFn)">
55+
<input type="text" v-bind="register('name', {
56+
required: true
57+
})" />
58+
<p v-if="formState.errors.name"> {{ formState.errors.name }} </p>
59+
<input type="text" v-bind="register('email', {
60+
required: true
61+
})" />
62+
<p v-if="formState.errors.email"> {{ formState.errors.email }} </p>
63+
<input type="text" v-bind="register('summary')">
64+
<button type="submit">Submit</button>
65+
</form>
66+
</template>
67+
<script setup lang="ts" >
68+
import { useFormHandler } from '../src/index'
69+
import { watch } from 'vue'
70+
71+
let hasErrorsAfterSubmit = false;
72+
const successFn = (form: any) => { console.log({ form }) }
73+
const errorFn = () => { hasErrorsAfterSubmit = true }
74+
75+
76+
const { register, handleSubmit, values, clearError, formState } = useFormHandler()
77+
78+
watch(
79+
() => values,
80+
() => {
81+
if (hasErrorsAfterSubmit) {
82+
clearError();
83+
hasErrorsAfterSubmit = false
84+
}
85+
},
86+
{ deep: true })
87+
</script>
88+
```
89+
90+
## Type Declarations
91+
92+
```ts
93+
export type ClearError = (
94+
name?: string
95+
) => void
96+
```
Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,68 @@
1-
# clearField
1+
# clearField: <font size="3">ClearField</font>
2+
3+
Clears a field, this means that the field is set to it's default value or to the fallback value.
4+
This will also trigger a validation for the field if existing.
5+
6+
## Demo
7+
8+
Coming soon...
9+
10+
## Usage
11+
12+
### Clear a field conditioned by another field
13+
14+
```vue
15+
<template>
16+
<select v-bind="register('continent')" placeholder="Choose your country">
17+
<option disabled value=null>Choose your continent</option>
18+
<option value="AM">America</option>
19+
<option value="AS">Asia</option>
20+
<option value="EU">Europe</option>
21+
</select>
22+
<select v-bind="register('country')" placeholder="Choose your country">
23+
<option disabled value=null>Choose your country</option>
24+
<option value="CAN">Canada</option>
25+
<option value="USA">United States</option>
26+
<option value="JAP">Japan</option>
27+
<option value="CHN">China</option>
28+
<option value="ESP">Spain</option>
29+
<option value="DEU">Germany</option>
30+
</select>
31+
</template>
32+
<script setup lang="ts">
33+
import { useFormHandler } from 'vue-form-handler'
34+
35+
const interceptor = ({ name, clearField }) => {
36+
if (name === 'continent') {
37+
clearField('country')
38+
}
39+
return true
40+
}
41+
42+
const { register } = useFormHandler({
43+
interceptor
44+
})
45+
</script>
46+
```
47+
48+
### Allowing the field to emit a 'clear' event or to have a button that clears a field
49+
50+
```vue
51+
<template>
52+
<input type="text" v-bind="register('clearableField')">
53+
<button @click="clearField('clearableField')">X</button>
54+
</template>
55+
<script setup lang="ts" >
56+
import { useFormHandler } from '../src/index'
57+
58+
const { register, clearField } = useFormHandler()
59+
</script>
60+
```
61+
62+
## Type Declarations
63+
64+
```ts
65+
export type ClearField = (
66+
name: string
67+
) => Promise<void>
68+
```

src/test/handler.test.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ describe('Form handler testing', () => {
2121
expect(formState.isDirty).toBeTruthy()
2222
})
2323
it('Clearing a field programmatically', async () => {
24-
const { values, setValue, formState, clearField } = useFormHandler();
24+
const { register, values, setValue, formState, clearField } = useFormHandler();
25+
register('field')
2526
await setValue('field', 'oneTwoThree');
2627
expect(values.field).toBe('oneTwoThree')
2728
expect(formState.isDirty).toBeTruthy()
@@ -30,9 +31,10 @@ describe('Form handler testing', () => {
3031
expect(formState.isDirty).toBeFalsy()
3132
})
3233
it('Clearing an initialized field leaves it dirty', async () => {
33-
const { values, formState, clearField } = useFormHandler({
34+
const { register, values, formState, clearField } = useFormHandler({
3435
initialValues: { field: 'value' }
3536
});
37+
register('field')
3638
expect(values.field).toBe('value')
3739
expect(formState.isDirty).toBeFalsy()
3840
await clearField('field');

src/useFormHandler.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,21 +177,25 @@ const useFormHandler: FormHandler = ({
177177

178178
const handleBlur: HandleBlur = (name) => {
179179
setTouched(name, true)
180-
if (validationMode === 'onBlur' || validationMode === 'always') {
180+
if (['always', 'onBlur'].includes(validationMode)) {
181181
triggerValidation(name)
182182
}
183183
}
184184

185185
const handleChange: HandleChange = async (name, value = DEFAULT_FIELD_VALUE) => {
186186
await setValue(name, value)
187187
setTouched(name, true)
188-
if (validationMode === 'onChange' || validationMode === 'always') {
188+
if (['always', 'onChange'].includes(validationMode)) {
189189
triggerValidation(name)
190190
}
191191
}
192192

193193
const clearField: ClearField = async (name) => {
194-
await setValue(name, _getDefault(name))
194+
const defaultValue: any = _getDefault(name);
195+
if (defaultValue !== values[name]) {
196+
await setValue(name, defaultValue)
197+
await triggerValidation(name)
198+
}
195199
}
196200

197201
const unregister = (name: string) => {

0 commit comments

Comments
 (0)