parent
eec3ec627f
commit
055206d83b
@ -1 +1,160 @@
|
|||||||
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}
|
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
|
||||||
|
html {
|
||||||
|
line-height: 1.15;
|
||||||
|
-webkit-text-size-adjust: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
main {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 2em;
|
||||||
|
margin: 0.67em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr {
|
||||||
|
box-sizing: content-box;
|
||||||
|
height: 0;
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
font-family: monospace, monospace;
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
abbr[title] {
|
||||||
|
border-bottom: none;
|
||||||
|
text-decoration: underline;
|
||||||
|
-webkit-text-decoration: underline dotted;
|
||||||
|
text-decoration: underline dotted;
|
||||||
|
}
|
||||||
|
|
||||||
|
b, strong {
|
||||||
|
font-weight: bolder;
|
||||||
|
}
|
||||||
|
|
||||||
|
code, kbd, samp {
|
||||||
|
font-family: monospace, monospace;
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
small {
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub, sup {
|
||||||
|
font-size: 75%;
|
||||||
|
line-height: 0;
|
||||||
|
position: relative;
|
||||||
|
vertical-align: baseline;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub {
|
||||||
|
bottom: -0.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
sup {
|
||||||
|
top: -0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
border-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
button, input, optgroup, select, textarea {
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: 100%;
|
||||||
|
line-height: 1.15;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
button, input {
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
button, select {
|
||||||
|
text-transform: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
[type=button], [type=reset], [type=submit], button {
|
||||||
|
-webkit-appearance: button;
|
||||||
|
}
|
||||||
|
|
||||||
|
[type=button]::-moz-focus-inner, [type=reset]::-moz-focus-inner, [type=submit]::-moz-focus-inner, button::-moz-focus-inner {
|
||||||
|
border-style: none;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
[type=button]:-moz-focusring, [type=reset]:-moz-focusring, [type=submit]:-moz-focusring, button:-moz-focusring {
|
||||||
|
outline: 1px dotted ButtonText;
|
||||||
|
}
|
||||||
|
|
||||||
|
fieldset {
|
||||||
|
padding: 0.35em 0.75em 0.625em;
|
||||||
|
}
|
||||||
|
|
||||||
|
legend {
|
||||||
|
box-sizing: border-box;
|
||||||
|
color: inherit;
|
||||||
|
display: table;
|
||||||
|
max-width: 100%;
|
||||||
|
padding: 0;
|
||||||
|
white-space: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
progress {
|
||||||
|
vertical-align: baseline;
|
||||||
|
}
|
||||||
|
|
||||||
|
textarea {
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
[type=checkbox], [type=radio] {
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
[type=number]::-webkit-inner-spin-button, [type=number]::-webkit-outer-spin-button {
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
[type=search] {
|
||||||
|
-webkit-appearance: textfield;
|
||||||
|
outline-offset: -2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
[type=search]::-webkit-search-decoration {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-file-upload-button {
|
||||||
|
-webkit-appearance: button;
|
||||||
|
font: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
details {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
summary {
|
||||||
|
display: list-item;
|
||||||
|
}
|
||||||
|
|
||||||
|
template {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
[hidden] {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,119 @@
|
|||||||
|
import validate from 'validate.js'
|
||||||
|
import serialize from 'form-serialize'
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class FormValidator
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {[type]} formSelector [description]
|
||||||
|
* @param {[type]} constraits [description]
|
||||||
|
*/
|
||||||
|
constructor(formSelector, constraits)
|
||||||
|
{
|
||||||
|
this.errors = []
|
||||||
|
|
||||||
|
// getting selector to find form-element
|
||||||
|
this.formSelector = formSelector
|
||||||
|
|
||||||
|
// constraits for validate.js
|
||||||
|
this.constraits = constraits
|
||||||
|
|
||||||
|
// get form and elements
|
||||||
|
this.form = document.querySelector(this.formSelector)
|
||||||
|
this.elements = this.form.querySelectorAll('field-error')
|
||||||
|
|
||||||
|
// adding submit event
|
||||||
|
this.form.addEventListener('submit', (event) => {
|
||||||
|
this.onSubmit(event)
|
||||||
|
})
|
||||||
|
|
||||||
|
// adding event if a element is updated
|
||||||
|
this.form.addEventListener('field-update', (event) => {
|
||||||
|
this.onFieldUpdate(event)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {[type]} name [description]
|
||||||
|
* @return {[type]} [description]
|
||||||
|
*/
|
||||||
|
findElementByName(name) {
|
||||||
|
|
||||||
|
let result
|
||||||
|
|
||||||
|
this.elements.forEach((element) => {
|
||||||
|
if (element.attributes.name.nodeValue == name) {
|
||||||
|
result = element
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {[type]} event [description]
|
||||||
|
* @return {[type]} [description]
|
||||||
|
*/
|
||||||
|
onSubmit(event) {
|
||||||
|
let errors = validate(serialize(event.target, {
|
||||||
|
hash: true
|
||||||
|
}), this.constraits)
|
||||||
|
|
||||||
|
if (errors) {
|
||||||
|
event.preventDefault()
|
||||||
|
|
||||||
|
this.elements.forEach((element) => {
|
||||||
|
let elementErrors = false
|
||||||
|
|
||||||
|
if (errors[element.attributes.name.nodeValue]) {
|
||||||
|
elementErrors = errors[element.attributes.name.nodeValue]
|
||||||
|
}
|
||||||
|
|
||||||
|
this.dispatchCustomEvent(elementErrors, element)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {[type]} event [description]
|
||||||
|
* @return {[type]} [description]
|
||||||
|
*/
|
||||||
|
onFieldUpdate(event) {
|
||||||
|
let errors = validate.single(event.detail.value, this.constraits[event.detail.name])
|
||||||
|
let element = this.findElementByName(event.detail.name)
|
||||||
|
|
||||||
|
this.dispatchCustomEvent(errors, element)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {[type]} errors [description]
|
||||||
|
* @param {[type]} element [description]
|
||||||
|
* @return {[type]} [description]
|
||||||
|
*/
|
||||||
|
dispatchCustomEvent(errors, element)
|
||||||
|
{
|
||||||
|
let detail = false
|
||||||
|
|
||||||
|
if (errors) {
|
||||||
|
detail = errors
|
||||||
|
}
|
||||||
|
|
||||||
|
const formValidationEvent = new CustomEvent('form-validation', {
|
||||||
|
'detail': detail
|
||||||
|
})
|
||||||
|
|
||||||
|
element.dispatchEvent(formValidationEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default FormValidator
|
@ -1,11 +1,17 @@
|
|||||||
import * as riot from 'riot'
|
import * as riot from 'riot'
|
||||||
import Demo from './demo.riot'
|
|
||||||
|
|
||||||
|
import FormValidator from './../FormValidator'
|
||||||
import FieldError from './../field-error.riot'
|
import FieldError from './../field-error.riot'
|
||||||
|
|
||||||
riot.register('field-error', FieldError)
|
riot.register('field-error', FieldError)
|
||||||
riot.mount('field-error')
|
riot.mount('field-error')
|
||||||
|
|
||||||
// let it rain
|
const formValidation = new FormValidator('form', {
|
||||||
riot.register('demo', Demo)
|
'email': {
|
||||||
riot.mount('demo')
|
'presence': true,
|
||||||
|
'email': true
|
||||||
|
},
|
||||||
|
'password': {
|
||||||
|
'presence': true
|
||||||
|
}
|
||||||
|
})
|
Loading…
Reference in new issue