@ribajs/bs5
Version:
Bootstrap 5 module for Riba.js
246 lines • 19 kB
JavaScript
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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