You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
1.6 KiB
92 lines
1.6 KiB
import validate from 'validate.js'
|
|
import serialize from 'form-serialize'
|
|
|
|
/**
|
|
* Validate entire Form or a single Element
|
|
*
|
|
* Using validator.js
|
|
*
|
|
* @author Björn Hase, Tentakelfabrik, me@tentakelfabrik.de
|
|
*
|
|
*/
|
|
class Validator {
|
|
|
|
/**
|
|
*
|
|
* @param {array} rules
|
|
*/
|
|
constructor(rules, component) {
|
|
this._rules = rules
|
|
this._component = component
|
|
|
|
this._errors = {
|
|
|
|
}
|
|
}
|
|
|
|
/**
|
|
* handle validation
|
|
*
|
|
* if key not set,
|
|
*
|
|
* @param {object} event
|
|
* @param {object} key
|
|
*
|
|
*/
|
|
handle(event, key) {
|
|
|
|
event.preventDefault()
|
|
|
|
let data = null, rules, errors
|
|
|
|
if (key) {
|
|
if (event.target.value) {
|
|
data = event.target.value
|
|
}
|
|
} else {
|
|
data = serialize(event.target, {
|
|
hash: true
|
|
})
|
|
}
|
|
|
|
// validate single
|
|
if (key) {
|
|
rules = this._rules[key]
|
|
|
|
errors = validate.single(data, rules, {
|
|
flat: true
|
|
})
|
|
|
|
if (errors) {
|
|
this._errors[key] = errors
|
|
} else {
|
|
delete this._errors[key]
|
|
}
|
|
|
|
// validate entire form
|
|
} else {
|
|
this._errors = validate(data, this._rules)
|
|
}
|
|
|
|
// update component
|
|
this._component.update()
|
|
}
|
|
|
|
/**
|
|
*
|
|
*
|
|
* @param {[type]} key
|
|
* @return {[type]}
|
|
*/
|
|
errors(key) {
|
|
|
|
if (key) {
|
|
return this._errors[key]
|
|
}
|
|
|
|
return this._errors
|
|
|
|
}
|
|
}
|
|
|
|
export default Validator |