@ribajs/bs4
Version:
Bootstrap 4 module for Riba.js
240 lines • 18.7 kB
JavaScript
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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