246 lines
5.9 KiB
JavaScript
246 lines
5.9 KiB
JavaScript
(function (context, $) {
|
|
|
|
"use strict";
|
|
|
|
context.JK = context.JK || {};
|
|
context.JK.Wizard = function (app) {
|
|
|
|
var STEPS = null;
|
|
var step = null;
|
|
var previousStep = null;
|
|
var $dialog = null;
|
|
var $templateButtons = null;
|
|
var $wizardSteps = null;
|
|
var $currentWizardStep = null;
|
|
var $wizardButtons = null;
|
|
var options = {};
|
|
var $btnHelp = null;
|
|
var $btnNext = null;
|
|
var $btnBack = null;
|
|
var $btnClose = null;
|
|
var $btnCancel = null;
|
|
var dialogName = null;
|
|
var self = this;
|
|
var $self = $(this);
|
|
|
|
function totalSteps() {
|
|
return context.JK.dkeys(STEPS).length;
|
|
}
|
|
|
|
function beforeHideStep() {
|
|
var currentStep = getCurrentStep();
|
|
if(currentStep === null) return;
|
|
|
|
var stepInfo = STEPS[currentStep];
|
|
|
|
if (!stepInfo) {
|
|
throw "unknown step: " + currentStep;
|
|
}
|
|
|
|
if(stepInfo.beforeHide) {
|
|
stepInfo.beforeHide.call(stepInfo);
|
|
}
|
|
}
|
|
|
|
function beforeShowStep($step) {
|
|
var stepInfo = STEPS[step];
|
|
|
|
if (!stepInfo) {
|
|
throw "unknown step: " + step;
|
|
}
|
|
|
|
stepInfo.beforeShow.call(stepInfo);
|
|
}
|
|
|
|
function back() {
|
|
if ($(this).is('.disabled')) return false;
|
|
previousStep = step;
|
|
step = step - 1;
|
|
moveToStep();
|
|
return false;
|
|
}
|
|
|
|
function next() {
|
|
if ($(this).is('.disabled')) return false;
|
|
|
|
var stepInfo = STEPS[step];
|
|
if(stepInfo.handleNext) {
|
|
var result = stepInfo.handleNext.call(stepInfo);
|
|
if(result === false) {return false;}
|
|
}
|
|
|
|
previousStep = step;
|
|
step = step + 1;
|
|
|
|
moveToStep();
|
|
return false;
|
|
}
|
|
|
|
function help() {
|
|
if ($(this).is('.disabled')) return false;
|
|
|
|
var stepInfo = STEPS[step];
|
|
if(stepInfo.handleHelp) {
|
|
var result = stepInfo.handleHelp.call(stepInfo);
|
|
if(!result) {return false;}
|
|
|
|
context.JK.popExternalLink(result);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function moveToStep() {
|
|
var $nextWizardStep = $wizardSteps.filter($('[layout-wizard-step=' + step + ']'));
|
|
|
|
beforeHideStep();
|
|
|
|
$wizardSteps.hide();
|
|
|
|
$currentWizardStep = $nextWizardStep;
|
|
|
|
context.JK.GA.virtualPageView('/client/' + dialogName, dialogName + ": " + $currentWizardStep.attr('dialog-title'));
|
|
|
|
$self.triggerHandler('step_changed', {step:step});
|
|
|
|
// update buttons
|
|
var $wizardButtonsContent = $(context._.template($templateButtons.html(), {}, {variable: 'data'}));
|
|
|
|
$btnHelp = $wizardButtonsContent.find('.btn-help');
|
|
$btnBack = $wizardButtonsContent.find('.btn-back');
|
|
$btnNext = $wizardButtonsContent.find('.btn-next');
|
|
$btnClose = $wizardButtonsContent.find('.btn-close');
|
|
$btnCancel = $wizardButtonsContent.find('.btn-cancel');
|
|
|
|
// hide help button if on last step
|
|
if (step == totalSteps() - 1) {
|
|
$btnHelp.hide();
|
|
}
|
|
// hide back button if 1st step or last step
|
|
if (step == 0 || step == totalSteps() - 1) {
|
|
$btnBack.hide();
|
|
}
|
|
// hide next button if on last step
|
|
if (step == totalSteps() - 1) {
|
|
$btnNext.hide();
|
|
}
|
|
// hide close if not on last step
|
|
if (step != totalSteps() - 1) {
|
|
$btnClose.hide();
|
|
}
|
|
// hide cancel if not on last step
|
|
if (step == totalSteps() - 1) {
|
|
$btnCancel.hide();
|
|
}
|
|
|
|
$btnHelp.on('click', help);
|
|
$btnNext.on('click', next);
|
|
$btnBack.on('click', back);
|
|
$btnClose.on('click', function() {$self.triggerHandler('wizard_close'); return false;});
|
|
$btnCancel.on('click', function() {$self.triggerHandler('wizard_cancel'); return false;});
|
|
|
|
$wizardButtons.empty();
|
|
$wizardButtons.append($wizardButtonsContent);
|
|
|
|
beforeShowStep($currentWizardStep);
|
|
$currentWizardStep.show();
|
|
|
|
}
|
|
|
|
// called by owner whenever
|
|
function onCloseDialog() {
|
|
beforeHideStep();
|
|
}
|
|
|
|
function onBeforeShow(args) {
|
|
|
|
context._.each(STEPS, function(step) {
|
|
// let every step know the wizard is being shown
|
|
if(step.beforeWizardShow) {
|
|
step.beforeWizardShow(args);
|
|
}
|
|
});
|
|
|
|
$currentWizardStep = null;
|
|
previousStep = null;
|
|
|
|
step = args != null ? args.d1 : 0;
|
|
if (!step) step = 0;
|
|
step = parseInt(step);
|
|
moveToStep();
|
|
}
|
|
|
|
function onAfterHide() {
|
|
step = null;
|
|
}
|
|
|
|
function getNextButton() {
|
|
return $btnNext;
|
|
}
|
|
|
|
function setNextState(enabled) {
|
|
|
|
if(!$btnNext) return;
|
|
|
|
if(enabled) {
|
|
$btnNext.removeClass('disabled');
|
|
}
|
|
else {
|
|
$btnNext.addClass('disabled');
|
|
}
|
|
|
|
}
|
|
|
|
function setBackState(enabled) {
|
|
|
|
if(!$btnBack) return;
|
|
|
|
if(enabled) {
|
|
$btnBack.removeClass('disabled');
|
|
}
|
|
else {
|
|
$btnBack.addClass('disabled');
|
|
}
|
|
}
|
|
|
|
function getCurrentStep() {
|
|
if($currentWizardStep) {
|
|
return parseInt($currentWizardStep.attr('layout-wizard-step'));
|
|
}
|
|
else {
|
|
return null;
|
|
}
|
|
|
|
}
|
|
|
|
function getCurrentWizardStep() {
|
|
return $currentWizardStep;
|
|
}
|
|
|
|
function initialize(_$dialog, _$wizardSteps, _STEPS, _options) {
|
|
$dialog = _$dialog;
|
|
dialogName = $dialog.attr('layout-id');
|
|
if (!dialogName) throw "no dialog name (layout-id) in wizard";
|
|
$wizardSteps = _$wizardSteps;
|
|
STEPS = _STEPS;
|
|
|
|
$wizardButtons = $dialog.find('.wizard-buttons');
|
|
$templateButtons = $('#template-wizard-buttons');
|
|
|
|
if(_options) {_options = {}};
|
|
options = _options;
|
|
}
|
|
|
|
this.getNextButton = getNextButton;
|
|
this.setNextState = setNextState;
|
|
this.setBackState = setBackState;
|
|
this.getCurrentStep = getCurrentStep;
|
|
this.getCurrentWizardStep = getCurrentWizardStep;
|
|
this.onCloseDialog = onCloseDialog;
|
|
this.onBeforeShow = onBeforeShow;
|
|
this.onAfterHide = onAfterHide;
|
|
this.initialize = initialize;
|
|
|
|
}
|
|
|
|
})(window, jQuery); |