webpack-bootstrap-ui-kit/src/js_old/_components/_ui.form.stepped.js

224 lines
5.4 KiB
JavaScript
Raw Normal View History

2021-08-18 20:51:15 +02:00
"use strict";
2020-12-24 23:42:33 +01:00
2021-08-18 20:51:15 +02:00
import $ from "jquery";
import Events from "../_events";
import LANG from "../lang/_en";
import FormValidateField from "./_ui.form.validate.field";
2019-06-08 17:20:51 +02:00
2021-08-18 20:51:15 +02:00
import "../../scss/_components/_ui.form.stepped.scss";
2019-06-08 17:20:51 +02:00
const SteppedForm = (($) => {
// Constants
2021-08-18 20:51:15 +02:00
const NAME = "jsSteppedForm";
2019-06-08 17:20:51 +02:00
const DATA_KEY = NAME;
class SteppedForm {
constructor(element) {
2020-12-24 23:42:33 +01:00
console.log(`${NAME}: init`);
2020-09-09 17:40:58 +02:00
2019-06-08 17:20:51 +02:00
const ui = this;
const $element = $(element);
$element.data(DATA_KEY, this);
2021-08-18 20:51:15 +02:00
if (!$element.find(".steps-counter").length) {
$element.prepend(LANG["en"][NAME]["STEPCOUNTER"]);
2019-06-08 17:20:51 +02:00
}
2021-08-18 20:51:15 +02:00
if (!$element.find(".steps-buttons").length) {
$element.append(LANG["en"][NAME]["STEPBUTTONS"]);
2019-06-08 17:20:51 +02:00
}
2021-08-18 20:51:15 +02:00
ui._currentStepCounter = $element.find(".steps-counter .current-step");
ui._totalStepsCounter = $element.find(".steps-counter .total-steps");
2019-06-08 17:20:51 +02:00
2021-08-18 20:51:15 +02:00
ui._steps = $element.find(".step");
2019-12-17 21:36:38 +01:00
ui._steps.each((i, el) => {
const $el = $(el);
2021-08-18 20:51:15 +02:00
if (!$el.data("step")) {
$el.data("step", i + 1);
$el.attr("data-step", i + 1);
2019-12-17 21:36:38 +01:00
}
});
2021-08-18 20:51:15 +02:00
ui._stepNext = $element.find(".step-next");
2019-06-08 17:20:51 +02:00
2021-08-18 20:51:15 +02:00
ui._stepPrev = $element.find(".step-prev");
ui._actions = $element.children(".btn-toolbar,.form-actions");
2019-06-08 17:20:51 +02:00
ui._element = element;
ui._currentStep = 1;
2021-08-18 20:51:15 +02:00
ui._totalSteps = ui._steps.last().data("step") || ui._steps.length;
2019-06-08 17:20:51 +02:00
ui._stepsOrder = [];
ui._totalStepsCounter.text(ui._totalSteps);
// check if one of the steps already has an error
const $hasError = ui._steps
2020-12-24 23:42:33 +01:00
.find(
2021-08-18 20:51:15 +02:00
".field.error,.field.holder-error,.field.holder-validation,.field.holder-info,.field.holder-warning,.field.holder-good"
2020-12-24 23:42:33 +01:00
)
2019-06-08 17:20:51 +02:00
.first();
if ($hasError.length) {
2021-08-18 20:51:15 +02:00
const $modal = $element.parents(".modal");
2019-06-08 17:20:51 +02:00
// show modal
2021-08-18 20:51:15 +02:00
if ($modal.length && typeof $modal.modal !== "undefined") {
$modal.modal("show");
2019-06-08 17:20:51 +02:00
}
2020-12-24 23:42:33 +01:00
ui._currentStep =
2021-08-18 20:51:15 +02:00
$hasError.parents(".step").data("step") || ui._currentStep;
2019-06-08 17:20:51 +02:00
}
//
2020-12-24 23:42:33 +01:00
ui.step(`.step[data-step="${ui._currentStep}"]`);
2019-06-08 17:20:51 +02:00
2021-08-18 20:51:15 +02:00
ui._stepNext.on("click", (e) => {
2019-06-08 17:20:51 +02:00
e.preventDefault();
ui.next();
});
2021-08-18 20:51:15 +02:00
ui._stepPrev.on("click", (e) => {
2019-06-08 17:20:51 +02:00
e.preventDefault();
ui.prev();
});
2021-08-18 20:51:15 +02:00
$element.find(".step-toggle").on("click", (e) => {
2019-06-08 17:20:51 +02:00
const $el = $(e.currentTarget);
e.preventDefault();
2021-08-18 20:51:15 +02:00
ui.step($el.data("target"));
2019-06-08 17:20:51 +02:00
});
$element.addClass(`${NAME}-active`);
$element.trigger(Events.FORM_INIT_STEPPED);
}
// Public methods
dispose() {
2020-12-24 23:42:33 +01:00
console.log(`${NAME}: dispose`);
2019-06-08 17:20:51 +02:00
const ui = this;
const $element = $(ui._element);
$element.removeClass(`${NAME}-active`);
$.removeData(ui._element, DATA_KEY);
ui._element = null;
}
next() {
const ui = this;
if (ui._currentStep >= ui._totalSteps) {
return;
}
2020-12-24 23:42:33 +01:00
ui.step(`.step[data-step="${ui._currentStep + 1}"]`);
2019-06-08 17:20:51 +02:00
}
prev() {
const ui = this;
if (ui._currentStep <= 1) {
return;
}
ui.step(ui._stepsOrder[ui._currentStep - 1]);
}
step(target) {
const ui = this;
const $element = $(ui._element);
const $target = $element.find(target);
2021-08-18 20:51:15 +02:00
const targetStep = parseInt($target.data("step"));
2019-06-08 17:20:51 +02:00
// validate current step
let valid = true;
if (targetStep > ui._currentStep) {
2020-12-24 23:42:33 +01:00
ui.currentStep()
2021-08-18 20:51:15 +02:00
.find("input,textarea,select")
2020-12-24 23:42:33 +01:00
.each((i, el) => {
const $el = $(el);
2021-08-18 20:51:15 +02:00
const fieldUI = $el.data("jsFormValidateField");
2020-12-24 23:42:33 +01:00
if (fieldUI && !fieldUI.validate()) {
valid = false;
}
});
2019-06-08 17:20:51 +02:00
}
if (!valid) {
return false;
}
//
2021-08-18 20:51:15 +02:00
if (parseInt($target.data("step")) <= "1") {
2019-06-08 17:20:51 +02:00
ui._stepPrev.hide();
$element.trigger(Events.FORM_STEPPED_FIRST_STEP);
} else {
ui._stepPrev.show();
}
2021-08-18 20:51:15 +02:00
if (parseInt($target.data("step")) >= ui._totalSteps) {
2019-06-08 17:20:51 +02:00
ui._stepNext.hide();
ui._actions.show();
$element.trigger(Events.FORM_STEPPED_LAST_STEP);
} else {
ui._stepNext.show();
ui._actions.hide();
}
ui._currentStep = targetStep;
ui._stepsOrder[ui._currentStep] = $target;
2021-08-18 20:51:15 +02:00
ui._steps.removeClass("active");
$target.addClass("active");
2019-06-08 17:20:51 +02:00
ui._currentStepCounter.text(ui._currentStep);
$target.trigger(Events.FORM_STEPPED_NEW_STEP);
$element.trigger(Events.FORM_STEPPED_NEW_STEP);
}
currentStep() {
const ui = this;
const $element = $(ui._element);
2021-08-18 20:51:15 +02:00
return $element.find(".step.active");
2019-06-08 17:20:51 +02:00
}
static _jQueryInterface() {
2020-12-24 23:42:33 +01:00
return this.each(function () {
2019-06-08 17:20:51 +02:00
// attach functionality to element
const $element = $(this);
let data = $element.data(DATA_KEY);
if (!data) {
data = new SteppedForm(this);
$element.data(DATA_KEY, data);
}
});
}
}
// jQuery interface
$.fn[NAME] = SteppedForm._jQueryInterface;
$.fn[NAME].Constructor = SteppedForm;
2020-12-24 23:42:33 +01:00
$.fn[NAME].noConflict = function () {
2019-06-08 17:20:51 +02:00
$.fn[NAME] = JQUERY_NO_CONFLICT;
return SteppedForm._jQueryInterface;
};
// auto-apply
2020-09-09 17:40:58 +02:00
$(window).on(`${NAME}.init ${Events.AJAX} ${Events.LOADED}`, () => {
2021-08-18 20:51:15 +02:00
$(".form-stepped").jsSteppedForm();
2019-06-08 17:20:51 +02:00
});
return SteppedForm;
})($);
export default SteppedForm;