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

224 lines
5.3 KiB
JavaScript
Raw Normal View History

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