Form Validator
Mixin used to validate forms. It provides a set of validators and a way to handle server errors.
Usage
Here is an example of a form that uses the mixin:
<template>
<v-form ref="form">
<v-text-field
v-model="model.string"
:error-messages="serverErrors.string"
:rules="rules.string"
/>
</v-form>
</template>
<script>
import { mergeDefaults, formValidatorMixin } from '@we/nuxt/forms'
const defaultValues = {
string: '',
number: 0,
}
export default {
mixins: [formValidatorMixin],
props: {
value: {
type: Object,
required: false,
default: undefined
},
},
data: () => ({
model: null,
}),
computed: {
rules () {
return {
string: [this.validatorRequired],
number: [],
}
}
},
watch: {
value: {
immediate: true,
handler (val) {
this.resetValidation()
this.model = mergeDefaults(val, defaultValues)
}
}
},
methods: {
resetValidation () {
this.clearServerErrors()
this.$refs.form?.resetValidation()
},
reset () {
this.model = mergeDefaults({}, defaultValues)
this.resetValidation()
},
async save () {
if (!this.$refs.form.validate()) { return }
try {
const data = { ...this.model }
const res = await this.$api.$post(`resource`, data)
this.$emit('input', res)
} catch (e) {
this.checkServerErrors(e)
// you can handle errors that are not 422
this.$emit('error', e)
}
}
}
}
</script>Validators
validatorRequired
Check if val is truthy !!val
validatorRequiredArray
Check if val is an Array Array.isArray(val)
validatorNotNull
Check if val is not null val !== null
validatorMin(length)
Check if val is at least length characters long val.length >= length
validatorMax(length)
Check if val is at most length characters long val.length <= length
validatorMaxFileSize(bytes)
Check if val is at most bytes bytes long val.size <= bytes
validatorRequiredNumber
Check if val is a number !isNaN(val)
validatorEmail
Check if val is a valid email address
validatorPhone
Check if val is a valid phone number
validatorEquals(match, message)
Check if val is equal to match val === match if not return message
Server Errors
This mixin will automatically handle server errors and set them in the serverErrors object
When we do a POST or PUT request to the server and a 422 response is returned, we need to show the errors to the user.
try {
const data = { ...this.model }
const res = await this.$api.$post(`resource`, data)
} catch (e) {
if(!this.checkServerErrors(e)) {
// you can handle errors that are not 422
this.$emit('error', e)
}
}Using the checkServerErrors method, the mixin will check if the error is a 422 error and set the errors in the serverErrors object. We can then use the serverErrors object to show the errors in the form.
<v-text-field
v-model="model.string"
:error-messages="serverErrors.string"
/>If some of the keys in the serverErrors object are not shown in the form they will be shown with $notify.error to avoid silent errors.
Methods
checkServerErrors(error, options)
Check if the error is a 422 error and set the errors in the serverErrors object
- options.notifyUntracked:
Boolean- Show untracked errors with$notify.error(default:true) - options.scroll:
Boolean|String- Scroll to the first error in the form (default:.v-input.error--text)
clearServerErrors()
Clear the serverErrors object
checkUntrackedServerErrors()
Returns the errors in the serverErrors object that are not shown in the form
TIP
Untracked errors use a Proxy to detect the keys that are accessed. They keep track of it if you access them via template or by js.
Properties
serverErrors Proxy
Object with the errors returned by the server
untrackedServerErrors read-only
Object with the errors returned by the server that are not shown in the form
allServerErrors
Object with all the errors returned by the server