<field-error>
|
|
<div class="field-error" if={ state.errors.length > 0 }>
|
|
<ul>
|
|
<li each={ error in state.errors }>
|
|
{ error }
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
<script>
|
|
|
|
/**
|
|
* Shows errors of Validation and raise a element to
|
|
* trigger single validation of field
|
|
*
|
|
* <field-error name="name" closest="<optional>" nofieldupdate></field-error>
|
|
*
|
|
* @author Björn Hase, Tentakelfabrik, me@tentakelfabrik.de
|
|
*
|
|
*/
|
|
|
|
export default {
|
|
|
|
state: {
|
|
errors: [
|
|
|
|
],
|
|
|
|
// css class for
|
|
closest: '.field-group',
|
|
},
|
|
|
|
/**
|
|
*
|
|
*
|
|
* @param {Object} props
|
|
* @param {Object} state
|
|
*
|
|
*/
|
|
onBeforeMounted(props, state)
|
|
{
|
|
if (props.closest) {
|
|
state.closest = props.closest
|
|
}
|
|
},
|
|
|
|
/**
|
|
*
|
|
*
|
|
* @param {Object} props
|
|
* @param {Object} state
|
|
*
|
|
*/
|
|
onMounted(props, state)
|
|
{
|
|
// getting parent element for entire field
|
|
const parent = this.root.closest(state.closest)
|
|
|
|
// getting current element by name
|
|
const element = parent.querySelector('[name="' + props.name + '"]')
|
|
|
|
// getting form
|
|
const form = element.closest('form')
|
|
|
|
// element, form are exists and nofieldupdate is not set
|
|
// each change of the element dispatch a event to form validation
|
|
if (element && form && !props.nofieldupdate) {
|
|
element.addEventListener('input', (event) => {
|
|
this.dispatchCustomEvent(event, form, props.name)
|
|
})
|
|
}
|
|
|
|
// add custom event to listen to form-validation
|
|
this.root.addEventListener('form-validation', (event) => {
|
|
this.onFormValidation(event, parent)
|
|
})
|
|
},
|
|
|
|
/**
|
|
* process form validation triggered by form
|
|
*
|
|
* @param {Event} event
|
|
* @param {Element} parent
|
|
*
|
|
*/
|
|
onFormValidation(event, parent)
|
|
{
|
|
// if detail is a value, set to errors
|
|
if (event.detail) {
|
|
this.state.errors = event.detail
|
|
|
|
parent.classList.add('field--error')
|
|
parent.classList.remove('field--valid')
|
|
} else {
|
|
this.state.errors = []
|
|
|
|
parent.classList.remove('field--error')
|
|
parent.classList.add('field--valid')
|
|
}
|
|
|
|
this.update()
|
|
},
|
|
|
|
/**
|
|
* create event to send to form validation
|
|
*
|
|
* @param {Event} event
|
|
* @param {Element} form
|
|
* @param {string} name
|
|
*
|
|
*/
|
|
dispatchCustomEvent(event, form, name)
|
|
{
|
|
const fieldUpdateEvent = new CustomEvent('field-update', {
|
|
'detail': {
|
|
'name': name,
|
|
'value': event.target.value
|
|
}
|
|
})
|
|
|
|
form.dispatchEvent(fieldUpdateEvent)
|
|
},
|
|
}
|
|
|
|
</script>
|
|
</field-error>
|