204 lines
5.0 KiB
JavaScript
Executable File
204 lines
5.0 KiB
JavaScript
Executable File
import $ from 'jquery';
|
|
import Events from '../_events';
|
|
import LANG from '../lang/_en';
|
|
import FormValidateField from "./_ui.form.validate.field";
|
|
|
|
const SteppedForm = (($) => {
|
|
// Constants
|
|
const NAME = 'jsSteppedForm';
|
|
const DATA_KEY = NAME;
|
|
|
|
class SteppedForm {
|
|
|
|
constructor(element) {
|
|
const ui = this;
|
|
const $element = $(element);
|
|
|
|
$element.data(DATA_KEY, this);
|
|
|
|
if (!$element.find('.steps-counter').length) {
|
|
$element.prepend(LANG['en'][NAME]['STEPCOUNTER']);
|
|
}
|
|
|
|
if (!$element.find('.steps-buttons').length) {
|
|
$element.append(LANG['en'][NAME]['STEPBUTTONS']);
|
|
}
|
|
|
|
ui._currentStepCounter = $element.find('.steps-counter .current-step');
|
|
ui._totalStepsCounter = $element.find('.steps-counter .total-steps');
|
|
|
|
ui._steps = $element.find('.step');
|
|
ui._stepNext = $element.find('.step-next');
|
|
|
|
ui._stepPrev = $element.find('.step-prev');
|
|
ui._actions = $element.children('.btn-toolbar,.form-actions');
|
|
|
|
ui._element = element;
|
|
ui._currentStep = 1;
|
|
ui._totalSteps = ui._steps.last().data('step') || ui._steps.length;
|
|
ui._stepsOrder = [];
|
|
|
|
ui._totalStepsCounter.text(ui._totalSteps);
|
|
|
|
// check if one of the steps already has an error
|
|
const $hasError = ui._steps
|
|
.find('.field.error,.field.holder-error,.field.holder-validation,.field.holder-info,.field.holder-warning,.field.holder-good')
|
|
.first();
|
|
if ($hasError.length) {
|
|
const $modal = $element.parents('.modal');
|
|
|
|
// show modal
|
|
if ($modal.length && typeof $modal.modal !== 'undefined') {
|
|
$modal.modal('show');
|
|
}
|
|
|
|
ui._currentStep = $hasError.parents('.step').data('step') || ui._currentStep;
|
|
}
|
|
//
|
|
|
|
ui.step(`.step[data-step="${ ui._currentStep }"]`);
|
|
|
|
ui._stepNext.on('click', (e) => {
|
|
e.preventDefault();
|
|
ui.next();
|
|
});
|
|
|
|
ui._stepPrev.on('click', (e) => {
|
|
e.preventDefault();
|
|
ui.prev();
|
|
});
|
|
|
|
$element.find('.step-toggle').on('click', (e) => {
|
|
const $el = $(e.currentTarget);
|
|
|
|
e.preventDefault();
|
|
ui.step($el.data('target'));
|
|
});
|
|
|
|
$element.addClass(`${NAME}-active`);
|
|
$element.trigger(Events.FORM_INIT_STEPPED);
|
|
}
|
|
|
|
// Public methods
|
|
dispose() {
|
|
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;
|
|
}
|
|
|
|
ui.step(`.step[data-step="${ ui._currentStep + 1 }"]`);
|
|
}
|
|
|
|
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);
|
|
const targetStep = parseInt($target.data('step'));
|
|
|
|
// validate current step
|
|
let valid = true;
|
|
|
|
if (targetStep > ui._currentStep) {
|
|
ui.currentStep().find('input,textarea,select').each((i, el) => {
|
|
const $el = $(el);
|
|
const fieldUI = $el.data('jsFormValidateField');
|
|
|
|
if (fieldUI && !fieldUI.validate()) {
|
|
valid = false;
|
|
}
|
|
});
|
|
}
|
|
|
|
if (!valid) {
|
|
return false;
|
|
}
|
|
//
|
|
|
|
if (parseInt($target.data('step')) <= '1') {
|
|
ui._stepPrev.hide();
|
|
$element.trigger(Events.FORM_STEPPED_FIRST_STEP);
|
|
} else {
|
|
ui._stepPrev.show();
|
|
}
|
|
|
|
if (parseInt($target.data('step')) >= ui._totalSteps) {
|
|
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;
|
|
|
|
ui._steps.removeClass('active');
|
|
$target.addClass('active');
|
|
|
|
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);
|
|
|
|
return $element.find('.step.active');
|
|
}
|
|
|
|
static _jQueryInterface() {
|
|
return this.each(function() {
|
|
// 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;
|
|
$.fn[NAME].noConflict = function() {
|
|
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
|
return SteppedForm._jQueryInterface;
|
|
};
|
|
|
|
// auto-apply
|
|
$(window).on(`${Events.AJAX} ${Events.LOADED}`, () => {
|
|
$('.form-stepped').jsSteppedForm();
|
|
});
|
|
|
|
return SteppedForm;
|
|
})($);
|
|
|
|
export default SteppedForm;
|