import {VBaseComponent} from './base-component'; export class VBaseContainer extends VBaseComponent { constructor(element, mdcComponent) { super(element, mdcComponent); this.element.classList.add('v-container'); } components() { return Array.from(this.element.querySelectorAll('.v-component')) .filter((element) => element.vComponent) .map((element) => element.vComponent); } inputs() { return this.element.querySelectorAll('.v-input'); } inputComponents() { return Array.from(this.inputs()) .filter((element) => element.vComponent) .map((element) => element.vComponent); } // Called to collect data for submission prepareSubmit(params) { for (const comp of this.inputComponents()) { if (comp.respondTo('prepareSubmit')) { comp.prepareSubmit(params); } } } clear() { for (const comp of this.inputComponents()) { if (comp.respondTo('clear')) { comp.clear(); } } } reset() { for (const comp of this.inputComponents()) { if (comp.respondTo('reset')) { comp.reset(); } } } onShow() { for (const comp of this.inputComponents()) { if (comp.respondTo('onShow')) { comp.onShow(); } } } // Called whenever a container is about to be submitted. // returns true on success // returns on failure return an error object that can be processed by VErrors: // { email: ["email must be filled", "email must be from your domain"] } // { :page: ["must be filled"] } validate(form, params) { console.debug('Form validate', form, params); const errors = []; for (const comp of this.inputComponents()) { if (comp.respondTo('validate')) { const result = comp.validate(form, params); if (result !== true) { errors.push(result); } } } return errors; } isDirty() { // A container is dirty if any of its dirtyable inputs is dirty: return this.inputComponents() .filter((component) => component.respondTo('isDirty')) .map((component) => component.isDirty()) .some(Boolean); } }