UNPKG

@ribajs/bs4

Version:

Bootstrap 4 module for Riba.js

240 lines 18.7 kB
import { Component, HttpService, } from "@ribajs/core"; import { scrollTo, getViewportDimensions, getUID, hasChildNodesTrim, stripHtml, } from "@ribajs/utils"; export class Bs4FormComponent extends Component { static tagName = "bs4-form"; _debug = false; autobind = true; static get observedAttributes() { return [ "id", "disable-submit-until-change", "use-ajax", "ajax-request-type", "auto-set-form-data", "strip-html", "scroll-invalid-element", "animate-invalid-element", ]; } formEl = null; getDefaultScope() { const scope = { id: getUID("form"), form: { fields: {}, valid: false, error: undefined, }, disableSubmitUntilChange: false, submitDisabled: false, onSubmit: this.onSubmit, useAjax: true, ajaxRequestType: "form", autoSetFormData: true, stripHtml: true, scrollToInvalidElement: true, animateInvalidElement: true, }; return scope; } scope = this.getDefaultScope(); constructor() { super(); this.enableSubmit = this.enableSubmit.bind(this); } connectedCallback() { super.connectedCallback(); this.init(Bs4FormComponent.observedAttributes); this.addEventListeners(); } addEventListeners() { if (this.scope.disableSubmitUntilChange) { this.addEventListener("input", this.enableSubmit); } } removeEventListeners() { this.removeEventListener("input", this.enableSubmit); } enableSubmit() { this.scope.submitDisabled = false; } requiredAttributes() { return []; } async beforeBind() { await super.beforeBind(); this.id = this.scope.id; } async afterBind() { await super.afterBind(); } stripHtml() { for (const key in this.scope.form.fields) { if (this.scope.form.fields[key] && typeof this.scope.form.fields[key] === "string") { this.scope.form.fields[key] = stripHtml(this.scope.form.fields[key]); } } } onSubmit(event, el) { this.debug("onSubmit", event, el); if (!this.formEl) { console.warn("No form found"); return false; } if (this.scope.autoSetFormData) { this.getFormValues(); } if (this.scope.stripHtml) { this.stripHtml(); } this.validate(this.formEl, this.scope.form); if (!this.scope.form.valid) { this.onInvalidForm(event); return; } const submitSettings = this.getSubmitSettings(event); if (submitSettings?.target === "_blank") { return true; } if (this.scope.useAjax) { event.preventDefault(); event.stopPropagation(); this.ajaxSubmit(event, el); } } async ajaxSubmit(event, el) { this.debug("onSubmit", event, el, this.scope); const submitSettings = this.getSubmitSettings(event); if (!submitSettings) { console.warn("Can't get submit settings"); return; } if (this.scope.autoSetFormData) { this.getFormValues(); } try { const res = await HttpService.fetch(submitSettings.action, submitSettings.method, this.scope.form.fields, submitSettings.type); if (!res || !res.body) { return this.onErrorSubmit("500", "Error", "Empty body!"); } const message = res.body && res.body.message ? res.body.message : ""; if (Number(res.status) >= 400) { this.onErrorSubmit(res.status.toString(), message, res.body); } return this.onSuccessSubmit(res.status.toString(), message, res.body); } catch (err) { this.onErrorSubmit(err.status, err.body.message, err.body); } } getSubmitSettings(event) { if (!this.formEl) { console.warn("No form found"); return null; } let action = this.formEl.action; let method = this.formEl.method; let target = this.formEl.method; if (event?.originalEvent?.submitter) { const submitter = event?.originalEvent?.submitter; action = submitter?.formAction || action; method = submitter?.formMethod || method; target = submitter?.formTarget || target; } const settings = { action, method: method.toUpperCase(), target, type: this.scope.ajaxRequestType, }; return settings; } onInvalidForm(event) { this.debug("Form not valid", this.scope); event.preventDefault(); event.stopPropagation(); if (!this.formEl) { console.warn("No form found"); return; } const invalidElements = this.formEl.querySelectorAll(":invalid"); if (invalidElements && invalidElements.length) { const invalidElement = invalidElements[0]; if (this.scope.scrollToInvalidElement) { this.scrollToElement(invalidElement); } if (this.scope.animateInvalidElement) { this.scrollToElement(invalidElement); } } this.dispatchEvent(new CustomEvent("invalid", { detail: { elements: invalidElements }, })); } scrollToElement(invalidElement) { const vp = getViewportDimensions(); const offset = vp.h / 2; scrollTo(invalidElement, offset, window); this.animateInvalidElement(invalidElement); } animateInvalidElement(invalidElement, endsOn = 3000) { invalidElement.classList.add("invalid-flashing-animation"); setTimeout(() => { invalidElement.classList.remove("invalid-flashing-animation"); }, endsOn); } onErrorSubmit(status, message, response) { this.debug("onErrorSubmit"); this.dispatchEvent(new CustomEvent("submit-error", { detail: { status, message: message, response }, })); } onSuccessSubmit(status, message, response) { this.debug("onSuccessSubmit"); if (this.scope.disableSubmitUntilChange) { this.scope.submitDisabled = true; } this.dispatchEvent(new CustomEvent("submit-success", { detail: { status, message: message, response }, })); } validate(form, validationScope, errorEventName = "validation-error") { validationScope.valid = form.checkValidity(); validationScope.error = form.validationMessage; if (!validationScope.valid) { this.dispatchEvent(new CustomEvent(errorEventName)); form.classList.add("was-validated"); } } getFormValues() { if (!this.formEl) { console.warn("No form found"); return null; } this.scope.form.fields = new FormData(this.formEl); return this.scope.form.fields; } initForm() { const formEl = this.querySelector("form"); if (formEl && formEl.length > 0) { this.formEl = formEl; this.formEl.classList.add("needs-validation"); this.formEl.setAttribute("novalidate", ""); } else { console.warn("bs4 form without children found"); } } async template() { if (hasChildNodesTrim(this)) { this.initForm(); return null; } else { const { default: template } = await import("./bs4-form.component.html?raw"); return template; } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnM0LWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvYnM0LWZvcm0vYnM0LWZvcm0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsV0FBVyxHQUlaLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFDTCxRQUFRLEVBQ1IscUJBQXFCLEVBQ3JCLE1BQU0sRUFDTixpQkFBaUIsRUFDakIsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBd0R2QixNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsU0FBUztJQUN0QyxNQUFNLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztJQUM1QixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ1osUUFBUSxHQUFHLElBQUksQ0FBQztJQUUxQixNQUFNLEtBQUssa0JBQWtCO1FBQzNCLE9BQU87WUFDTCxJQUFJO1lBQ0osNkJBQTZCO1lBQzdCLFVBQVU7WUFDVixtQkFBbUI7WUFDbkIsb0JBQW9CO1lBQ3BCLFlBQVk7WUFDWix3QkFBd0I7WUFDeEIseUJBQXlCO1NBQzFCLENBQUM7SUFDSixDQUFDO0lBRVMsTUFBTSxHQUEyQixJQUFJLENBQUM7SUFFdEMsZUFBZTtRQUN2QixNQUFNLEtBQUssR0FBVTtZQUNuQixFQUFFLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUVsQixJQUFJLEVBQUU7Z0JBQ0osTUFBTSxFQUFFLEVBQUU7Z0JBQ1YsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osS0FBSyxFQUFFLFNBQVM7YUFDakI7WUFFRCx3QkFBd0IsRUFBRSxLQUFLO1lBRS9CLGNBQWMsRUFBRSxLQUFLO1lBQ3JCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUV2QixPQUFPLEVBQUUsSUFBSTtZQUNiLGVBQWUsRUFBRSxNQUFNO1lBQ3ZCLGVBQWUsRUFBRSxJQUFJO1lBQ3JCLFNBQVMsRUFBRSxJQUFJO1lBQ2Ys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