UNPKG

@ribajs/bs5

Version:

Bootstrap 5 module for Riba.js

246 lines 19 kB
import { Component, HttpService, } from "@ribajs/core"; import { stripHtml } from "@ribajs/utils/src/type.js"; import { getUID, hasChildNodesTrim, scrollTo, getViewportDimensions, } from "@ribajs/utils/src/dom.js"; export class Bs5FormComponent extends Component { static tagName = "bs5-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(Bs5FormComponent.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) { if (err.status && err.body) { this.onErrorSubmit(err.status, err.body.message, err.body); } else { throw this.error; } } } 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("bs5 form without children found"); } } async template() { if (hasChildNodesTrim(this)) { this.initForm(); return null; } else { const { default: template } = await import("./bs5-form.component.html?raw"); return template; } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnM1LWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvYnM1LWZvcm0vYnM1LWZvcm0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsV0FBVyxHQUlaLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN0RCxPQUFPLEVBQ0wsTUFBTSxFQUNOLGlCQUFpQixFQUNqQixRQUFRLEVBQ1IscUJBQXFCLEdBQ3RCLE1BQU0sMEJBQTBCLENBQUM7QUF3RGxDLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxTQUFTO0lBQ3RDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDO0lBQzVCLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDWixRQUFRLEdBQUcsSUFBSSxDQUFDO0lBRTFCLE1BQU0sS0FBSyxrQkFBa0I7UUFDM0IsT0FBTztZQUNMLElBQUk7WUFDSiw2QkFBNkI7WUFDN0IsVUFBVTtZQUNWLG1CQUFtQjtZQUNuQixvQkFBb0I7WUFDcEIsWUFBWTtZQUNaLHdCQUF3QjtZQUN4Qix5QkFBeUI7U0FDMUIsQ0FBQztJQUNKLENBQUM7SUFFUyxNQUFNLEdBQTJCLElBQUksQ0FBQztJQUV0QyxlQUFlO1FBQ3ZCLE1BQU0sS0FBSyxHQUFVO1lBQ25CLEVBQUUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDO1lBRWxCLElBQUksRUFBRTtnQkFDSixNQUFNLEVBQUUsRUFBRTtnQkFDVixLQUFLLEVBQUUsS0FBSztnQkFDWixLQUFLLEVBQUUsU0FBUzthQUNqQjtZQUVELHdCQUF3QixFQUFFLEtBQUs7WUFFL0IsY0FBYyxFQUFFLEtBQUs7WUFDckIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBRXZCLE9BQU8sRUFBRSxJQUFJO1lBQ2IsZUFBZSxFQUFFLE1BQU07WUFDdkIsZUFBZSxF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