diff --git a/ruoyi-admin/src/main/resources/static/ajax/libs/smartwizard/jquery.smartWizard.min.js b/ruoyi-admin/src/main/resources/static/ajax/libs/smartwizard/jquery.smartWizard.min.js new file mode 100644 index 00000000..bdbcf7e7 --- /dev/null +++ b/ruoyi-admin/src/main/resources/static/ajax/libs/smartwizard/jquery.smartWizard.min.js @@ -0,0 +1,13 @@ +"use strict";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _defineProperties(t,e){for(var s=0;s<e.length;s++){var i=e[s];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function _createClass(t,e,s){return e&&_defineProperties(t.prototype,e),s&&_defineProperties(t,s),t}function _typeof(t){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)} +/*! + * jQuery SmartWizard v5.1.1 + * The awesome jQuery step wizard plugin + * http://www.techlaboratory.net/jquery-smartwizard + * + * Created by Dipu Raj + * http://dipu.me + * + * @license Licensed under the terms of the MIT License + * https://github.com/techlab/jquery-smartwizard/blob/master/LICENSE + */ +!function(s){"function"==typeof define&&define.amd?define(["jquery"],s):"object"===("undefined"==typeof module?"undefined":_typeof(module))&&module.exports?module.exports=function(t,e){return void 0===e&&(e="undefined"!=typeof window?require("jquery"):require("jquery")(t)),s(e),e}:s(jQuery)}(function(v){var i={selected:0,theme:"default",justified:!0,darkMode:!1,autoAdjustHeight:!0,cycleSteps:!1,backButtonSupport:!0,enableURLhash:!0,transition:{animation:"none",speed:"400",easing:""},toolbarSettings:{toolbarPosition:"bottom",toolbarButtonPosition:"right",showNextButton:!0,showPreviousButton:!0,toolbarExtraButtons:[]},anchorSettings:{anchorClickable:!0,enableAllAnchors:!1,markDoneStep:!0,markAllPreviousStepsAsDone:!0,removeDoneStepOnNavigateBack:!1,enableAnchorOnDoneStep:!0},keyboardSettings:{keyNavigation:!0,keyLeft:[37],keyRight:[39]},lang:{next:"Next",previous:"Previous"},disabledSteps:[],errorSteps:[],hiddenSteps:[]},s=function(){function s(t,e){_classCallCheck(this,s),this.options=v.extend(!0,{},i,e),this.main=v(t),this.nav=this._getFirstDescendant(".nav"),this.steps=this.nav.find(".nav-link"),this.container=this._getFirstDescendant(".tab-content"),this.pages=this.container.children(".tab-pane"),this._initOptions(),this._initLoad()}return _createClass(s,[{key:"_initLoad",value:function(){this.pages.hide(),this.steps.removeClass("done active"),this.current_index=null;var t=this._getStepIndex();this._setPreviousStepsDone(t),this._showStep(t)}},{key:"_initOptions",value:function(){this._setElements(),this._setToolbar(),this._setEvents()}},{key:"_getFirstDescendant",value:function(i){var n=this.main.children(i);return 0<n.length?n:(this.main.children().each(function(t,e){var s=v(e).children(i);if(0<s.length)return n=s,!1}),0<n.length?n:(this._showError("Element not found "+i),!1))}},{key:"_setElements",value:function(){this.main.addClass("sw"),this._setTheme(this.options.theme),this._setJustify(this.options.justified),this._setDarkMode(this.options.darkMode),!0===this.options.anchorSettings.enableAllAnchors&&!0===this.options.anchorSettings.anchorClickable||this.steps.addClass("inactive"),this._setCSSClass(this.options.disabledSteps,"disabled"),this._setCSSClass(this.options.errorSteps,"danger"),this._setCSSClass(this.options.hiddenSteps,"hidden")}},{key:"_setEvents",value:function(){var s=this;if(this.main.data("click-init"))return!0;this.main.data("click-init",!0),v(this.steps).on("click",function(t){if(t.preventDefault(),!1===s.options.anchorSettings.anchorClickable)return!0;var e=s.steps.index(t.currentTarget);return e===s.current_index||(!(!1!==s.options.anchorSettings.enableAnchorOnDoneStep||!s._isDone(e))||void(!1===s.options.anchorSettings.enableAllAnchors&&!s._isDone(e)||s._showStep(e)))}),this.main.find(".sw-btn-next").on("click",function(t){t.preventDefault(),s._showNext()}),this.main.find(".sw-btn-prev").on("click",function(t){t.preventDefault(),s._showPrevious()}),this.options.keyboardSettings.keyNavigation&&v(document).keyup(function(t){s._keyNav(t)}),this.options.backButtonSupport&&v(window).on("hashchange",function(t){var e=s._getURLHashIndex();!1!==e&&(t.preventDefault(),s._showStep(e))})}},{key:"_setToolbar",value:function(){if("none"===this.options.toolbarSettings.toolbarPosition)return!0;switch(this.options.toolbarSettings.toolbarPosition){case"top":this.container.before(this._createToolbar("top"));break;case"bottom":this.container.after(this._createToolbar("bottom"));break;case"both":this.container.before(this._createToolbar("top")),this.container.after(this._createToolbar("bottom"));break;default:this.container.after(this._createToolbar("bottom"))}}},{key:"_createToolbar",value:function(t){if(0<this.main.find(".toolbar-"+t).length)return null;var s=v("<div></div>").addClass("toolbar toolbar-"+t).attr("role","toolbar"),e=!1!==this.options.toolbarSettings.showNextButton?v("<button></button>").text(this.options.lang.next).addClass("btn sw-btn-next").attr("type","button"):null,i=!1!==this.options.toolbarSettings.showPreviousButton?v("<button></button>").text(this.options.lang.previous).addClass("btn sw-btn-prev").attr("type","button"):null;return s.append(i,e),this.options.toolbarSettings.toolbarExtraButtons&&0<this.options.toolbarSettings.toolbarExtraButtons.length&&v.each(this.options.toolbarSettings.toolbarExtraButtons,function(t,e){s.append(e.clone(!0))}),s.css("text-align",this.options.toolbarSettings.toolbarButtonPosition),s}},{key:"_showNext",value:function(){var t=this._getNextShowable(this.current_index);if(!1===t)return!1;this._showStep(t)}},{key:"_showPrevious",value:function(){var t=this._getPreviousShowable(this.current_index);if(!1===t)return!1;this._showStep(t)}},{key:"_showStep",value:function(t){return t!=this.current_index&&(!!this.steps.eq(t)&&(!!this._isShowable(t)&&void this._loadStep(t)))}},{key:"_getNextShowable",value:function(t){for(var e=!1,s=t+1;s<this.steps.length;s++)if(this._isShowable(s)){e=s;break}if(!1!==e&&this.steps.length<=e){if(!this.options.cycleSteps)return!1;e=0}return e}},{key:"_getPreviousShowable",value:function(t){for(var e=!1,s=t-1;0<=s;s--)if(this._isShowable(s)){e=s;break}if(!1!==e&&e<0){if(!this.options.cycleSteps)return!1;e=this.steps.length-1}return e}},{key:"_isShowable",value:function(t){var e=this.steps.eq(t);return!e.hasClass("disabled")&&!e.hasClass("hidden")}},{key:"_isDone",value:function(t){return!!this.steps.eq(t).hasClass("done")}},{key:"_setPreviousStepsDone",value:function(t){if(0<t&&this.options.anchorSettings.markDoneStep&&this.options.anchorSettings.markAllPreviousStepsAsDone)for(var e=t;0<=e;e--)this._setCSSClass(e,"done")}},{key:"_setCSSClass",value:function(t,e){var s=this;if(null===t)return!1;(v.isArray(t)?t:[t]).map(function(t){s.steps.eq(t).addClass(e)})}},{key:"_resetCSSClass",value:function(t,e){var s=this;(v.isArray(t)?t:[t]).map(function(t){s.steps.eq(t).removeClass(e)})}},{key:"_getStepDirection",value:function(t){return null==this.current_index?"":this.current_index<t?"forward":"backward"}},{key:"_getStepPosition",value:function(t){var e="middle";return 0===t?e="first":t===this.steps.length-1&&(e="last"),e}},{key:"_getStepAnchor",value:function(t){return null==t?null:this.steps.eq(t)}},{key:"_getStepPage",value:function(t){if(null==t)return null;var e=this._getStepAnchor(t);return 0<e.length?this.main.find(e.attr("href")):null}},{key:"_setStepContent",value:function(t,e){var s=this._getStepPage(t);s&&s.html(e)}},{key:"_loadStep",value:function(e){var s=this,t=this._getStepAnchor(this.current_index),i=this._getStepDirection(e);if(null!==this.current_index&&!1===this._triggerEvent("leaveStep",[t,this.current_index,e,i]))return!1;var n=this._getStepAnchor(e),o=this._triggerEvent("stepContent",[n,e,i]);o?"object"==_typeof(o)?o.then(function(t){s._setStepContent(e,t),s._transitStep(e)}).catch(function(t){console.error(t),s._setStepContent(e,t),s._transitStep(e)}):("string"==typeof o&&this._setStepContent(e,o),this._transitStep(e)):this._transitStep(e)}},{key:"_transitStep",value:function(t){var e=this,s=this._getStepAnchor(t);this._setURLHash(s.attr("href")),this._setAnchor(t);var i=this._getStepDirection(t),n=this._getStepPosition(t);this._doStepAnimation(t,function(){e._fixHeight(t),e._triggerEvent("showStep",[s,e.current_index,i,n])}),this.current_index=t,this._setButtons(t)}},{key:"_doStepAnimation",value:function(t,e){var s=this,i=this._getStepPage(this.current_index),n=this._getStepPage(t),o=this.options.transition.animation.toLowerCase();switch(this._stopAnimations(),o){case"slide-horizontal":case"slide-h":var a,r,h=this.container.width(),l=h,u=-2*h;t>this.current_index&&(l=-1*h,u=h),null==this.current_index&&this.container.height(n.outerHeight()),i&&(a=i.css("position"),r=i.css("left"),i.css("position","absolute").css("left",0).animate({left:l},this.options.transition.speed,this.options.transition.easing,function(){v(this).hide(),i.css("position",a).css("left",r)})),a=n.css("position"),r=n.css("left"),n.css("position","absolute").css("left",u).outerWidth(h).show().animate({left:0},this.options.transition.speed,this.options.transition.easing,function(){n.css("position",a).css("left",r),e()});break;case"slide-vertical":case"slide-v":var c,d,p=this.container.height(),f=p,_=-2*p;t>this.current_index&&(f=-1*p,_=p),i&&(c=i.css("position"),d=i.css("top"),i.css("position","absolute").css("top",0).animate({top:f},this.options.transition.speed,this.options.transition.easing,function(){v(this).hide(),i.css("position",c).css("top",d)})),c=n.css("position"),d=n.css("top"),n.css("position","absolute").css("top",_).show().animate({top:0},this.options.transition.speed,this.options.transition.easing,function(){n.css("position",c).css("top",d),e()});break;case"slide-swing":case"slide-s":i?i.slideUp("fast",this.options.transition.easing,function(){n.slideDown(s.options.transition.speed,s.options.transition.easing,function(){e()})}):n.slideDown(this.options.transition.speed,this.options.transition.easing,function(){e()});break;case"fade":i?i.fadeOut("fast",this.options.transition.easing,function(){n.fadeIn("fast",s.options.transition.easing,function(){e()})}):n.fadeIn(this.options.transition.speed,this.options.transition.easing,function(){e()});break;default:i&&i.hide(),n.show(),e()}}},{key:"_stopAnimations",value:function(){this.pages.finish(),this.container.finish()}},{key:"_setAnchor",value:function(t){this._resetCSSClass(this.current_index,"active"),!1!==this.options.anchorSettings.markDoneStep&&null!==this.current_index&&(this._setCSSClass(this.current_index,"done"),!1!==this.options.anchorSettings.removeDoneStepOnNavigateBack&&"backward"===this._getStepDirection(t)&&this._resetCSSClass(this.current_index,"done")),this._resetCSSClass(t,"done"),this._setCSSClass(t,"active")}},{key:"_setButtons",value:function(t){if(!this.options.cycleSteps)switch(this.main.find(".sw-btn-prev").removeClass("disabled"),this.main.find(".sw-btn-next").removeClass("disabled"),this._getStepPosition(t)){case"first":this.main.find(".sw-btn-prev").addClass("disabled");break;case"last":this.main.find(".sw-btn-next").addClass("disabled");break;default:!1===this._getNextShowable(t)&&this.main.find(".sw-btn-next").addClass("disabled"),!1===this._getPreviousShowable(t)&&this.main.find(".sw-btn-prev").addClass("disabled")}}},{key:"_getStepIndex",value:function(){var t=this._getURLHashIndex();return!1===t?this.options.selected:t}},{key:"_setTheme",value:function(t){this.main.removeClass(function(t,e){return(e.match(/(^|\s)sw-theme-\S+/g)||[]).join(" ")}).addClass("sw-theme-"+t)}},{key:"_setJustify",value:function(t){!0===t?this.main.addClass("sw-justified"):this.main.removeClass("sw-justified")}},{key:"_setDarkMode",value:function(t){!0===t?this.main.addClass("sw-dark"):this.main.removeClass("sw-dark")}},{key:"_keyNav",value:function(t){if(-1<v.inArray(t.which,this.options.keyboardSettings.keyLeft))this._showPrevious(),t.preventDefault();else{if(!(-1<v.inArray(t.which,this.options.keyboardSettings.keyRight)))return;this._showNext(),t.preventDefault()}}},{key:"_fixHeight",value:function(t){var e;this.options.autoAdjustHeight&&(e=this._getStepPage(t),this.container.finish().animate({height:e.outerHeight()},this.options.transition.speed))}},{key:"_triggerEvent",value:function(t,e){var s=v.Event(t);return this.main.trigger(s,e),!s.isDefaultPrevented()&&s.result}},{key:"_setURLHash",value:function(t){this.options.enableURLhash&&window.location.hash!==t&&history.pushState(null,null,t)}},{key:"_getURLHashIndex",value:function(){if(this.options.enableURLhash){var t=window.location.hash;if(0<t.length){var e=this.nav.find("a[href*='"+t+"']");if(0<e.length)return this.steps.index(e)}}return!1}},{key:"_loader",value:function(t){switch(t){case"show":this.main.addClass("sw-loading");break;case"hide":this.main.removeClass("sw-loading");break;default:this.main.toggleClass("sw-loading")}}},{key:"_showError",value:function(t){console.error(t)}},{key:"goToStep",value:function(t){this._showStep(t)}},{key:"next",value:function(){this._showNext()}},{key:"prev",value:function(){this._showPrevious()}},{key:"reset",value:function(){this._setURLHash("#"),this._initOptions(),this._initLoad()}},{key:"stepState",value:function(t,e){if(!t)return!1;switch(e){case"disable":this._setCSSClass(t,"disabled");break;case"enable":this._resetCSSClass(t,"disabled");break;case"hide":this._setCSSClass(t,"hidden");break;case"show":this._resetCSSClass(t,"hidden");break;case"error-on":this._setCSSClass(t,"danger");break;case"error-off":this._resetCSSClass(t,"danger")}}},{key:"setOptions",value:function(t){this.options=v.extend(!0,{},this.options,t),this._initOptions()}},{key:"getStepIndex",value:function(){return this.current_index}},{key:"loader",value:function(t){"show"===t?this.main.addClass("sw-loading"):this.main.removeClass("sw-loading")}}]),s}();v.fn.smartWizard=function(t){if(void 0===t||"object"===_typeof(t))return this.each(function(){v.data(this,"smartWizard")||v.data(this,"smartWizard",new s(this,t))});if("string"==typeof t&&"_"!==t[0]&&"init"!==t){var e=v.data(this[0],"smartWizard");return"destroy"===t&&v.data(this,"smartWizard",null),e instanceof s&&"function"==typeof e[t]?e[t].apply(e,Array.prototype.slice.call(arguments,1)):this}}}); \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/static/ajax/libs/smartwizard/smart_wizard_all.min.css b/ruoyi-admin/src/main/resources/static/ajax/libs/smartwizard/smart_wizard_all.min.css new file mode 100644 index 00000000..217d3aa6 --- /dev/null +++ b/ruoyi-admin/src/main/resources/static/ajax/libs/smartwizard/smart_wizard_all.min.css @@ -0,0 +1,11 @@ +/*! + * jQuery SmartWizard v5 + * jQuery Wizard Plugin + * http://www.techlaboratory.net/smartwizard + * + * Created by Dipu Raj + * http://dipu.me + * + * Licensed under the terms of MIT License + * https://github.com/techlab/jquery-smartwizard/blob/master/LICENSE + */.sw{position:relative}.sw *,.sw ::after,.sw ::before{box-sizing:border-box}.sw>.tab-content{position:relative;overflow:hidden}.sw .toolbar{padding:.8rem}.sw .toolbar>.btn{display:inline-block;text-decoration:none;text-align:center;text-transform:none;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin-left:.2rem;margin-right:.2rem;cursor:pointer}.sw .toolbar>.btn.disabled,.sw .toolbar>.btn:disabled{opacity:.65}.sw>.nav{display:flex;flex-wrap:wrap;list-style:none;padding-left:0;margin-top:0;margin-bottom:0}@media screen and (max-width:640px){.sw>.nav{flex-direction:column!important;flex:1 auto}}.sw>.nav .nav-link{display:block;padding:.5rem 1rem;text-decoration:none}.sw>.nav .nav-link:active,.sw>.nav .nav-link:focus,.sw>.nav .nav-link:hover{text-decoration:none}.sw>.nav .nav-link::-moz-focus-inner{border:0!important}.sw>.nav .nav-link.disabled{color:#ccc!important;pointer-events:none;cursor:default}.sw>.nav .nav-link.hidden{display:none!important}.sw.sw-justified>.nav .nav-link,.sw.sw-justified>.nav>li{flex-basis:0;flex-grow:1;text-align:center}.sw.sw-dark{color:rgba(255,255,255,.95);background:#000}.sw.sw-loading{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.sw.sw-loading::after{content:"";display:block;position:absolute;opacity:1;top:0;left:0;height:100%;width:100%;background:rgba(255,255,255,.7);z-index:2;transition:all .2s ease}.sw.sw-loading::before{content:'';display:inline-block;position:absolute;top:45%;left:45%;width:2rem;height:2rem;border:10px solid #f3f3f3;border-top:10px solid #3498db;border-radius:50%;z-index:10;-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite}@-webkit-keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.sw-theme-default{border:1px solid #eee}.sw-theme-default>.tab-content>.tab-pane{padding:10px}.sw-theme-default .toolbar>.btn{color:#fff;background-color:#17a2b8;border:1px solid #17a2b8;padding:.375rem .75rem;border-radius:.25rem;font-weight:400}.sw-theme-default>.nav{box-shadow:0 .125rem .25rem rgba(0,0,0,.1)!important}.sw-theme-default>.nav .nav-link{position:relative;height:100%;min-height:100%}.sw-theme-default>.nav .nav-link::after{content:"";position:absolute;height:2px;width:0;left:0;bottom:-1px;background:#999;transition:all .35s ease .15s}.sw-theme-default>.nav .nav-link.inactive{color:#999;cursor:not-allowed}.sw-theme-default>.nav .nav-link.active{color:#17a2b8!important;cursor:pointer}.sw-theme-default>.nav .nav-link.active::after{background:#17a2b8!important;width:100%}.sw-theme-default>.nav .nav-link.done{color:#5cb85c!important;cursor:pointer}.sw-theme-default>.nav .nav-link.done::after{background:#5cb85c;width:100%}.sw-theme-default>.nav .nav-link.disabled{color:#ddd!important;cursor:not-allowed}.sw-theme-default>.nav .nav-link.disabled::after{background:#ddd;width:100%}.sw-theme-default>.nav .nav-link.danger{color:#d9534f!important;cursor:pointer}.sw-theme-default>.nav .nav-link.danger::after{background:#d9534f;width:100%}.sw-theme-arrows{border:1px solid #eee}.sw-theme-arrows>.tab-content>.tab-pane{padding:10px}.sw-theme-arrows .toolbar>.btn{color:#fff;background-color:#17a2b8;border:1px solid #17a2b8;padding:.375rem .75rem;border-radius:.25rem;font-weight:400}.sw-theme-arrows>.nav{overflow:hidden;border-bottom:1px solid #eee}.sw-theme-arrows>.nav .nav-link{position:relative;height:100%;min-height:100%;margin-right:30px;margin-left:-30px;padding-left:40px}@media screen and (max-width:640px){.sw-theme-arrows>.nav .nav-link{overflow:hidden;margin-bottom:1px;margin-right:unset}}.sw-theme-arrows>.nav .nav-link::after{content:"";position:absolute;display:block;width:0;height:0;top:50%;left:100%;margin-top:-50px;border-top:50px solid transparent;border-bottom:50px solid transparent;border-left:30px solid #f8f8f8;z-index:2}.sw-theme-arrows>.nav .nav-link::before{content:" ";position:absolute;display:block;width:0;height:0;top:50%;left:100%;margin-top:-50px;margin-left:1px;border-top:50px solid transparent;border-bottom:50px solid transparent;border-left:30px solid #eee;z-index:1}.sw-theme-arrows>.nav .nav-link.inactive{color:#999;border-color:#f8f8f8;background:#f8f8f8;cursor:not-allowed}.sw-theme-arrows>.nav .nav-link.active{color:#fff;border-color:#5bc0de;background:#5bc0de;cursor:pointer}.sw-theme-arrows>.nav .nav-link.active::after{border-left-color:#5bc0de}.sw-theme-arrows>.nav .nav-link.done{color:#fff;border-color:#5cb85c;background:#5cb85c;cursor:pointer}.sw-theme-arrows>.nav .nav-link.done::after{border-left-color:#5cb85c}.sw-theme-arrows>.nav .nav-link.disabled{color:#eee;border-color:#f9f9f9;background:#f9f9f9;cursor:not-allowed}.sw-theme-arrows>.nav .nav-link.disabled::after{border-left-color:#f9f9f9}.sw-theme-arrows>.nav .nav-link.danger{color:#fff;border-color:#d9534f;background:#d9534f;cursor:pointer}.sw-theme-arrows>.nav .nav-link.danger::after{border-left-color:#d9534f}.sw-theme-arrows.sw-dark{color:rgba(255,255,255,.95);background:#000}.sw-theme-arrows.sw-dark>.nav{border-bottom:1px solid #555}.sw-theme-arrows.sw-dark>.nav .nav-link::after{border-left:30px solid #5f5f5f}.sw-theme-arrows.sw-dark>.nav .nav-link::before{border-left:30px solid #555}.sw-theme-arrows.sw-dark>.nav .nav-link.inactive{color:#fff;border-color:#5f5f5f;background:#5f5f5f}.sw-theme-arrows.sw-dark>.nav .nav-link.inactive::after{border-left-color:#5f5f5f}.sw-theme-arrows.sw-dark>.nav .nav-link.active{color:#fff;border-color:#010506;background:#0a2730}.sw-theme-arrows.sw-dark>.nav .nav-link.active::after{border-left-color:#0a2730}.sw-theme-arrows.sw-dark>.nav .nav-link.done{color:#fff;border-color:#000;background:#000}.sw-theme-arrows.sw-dark>.nav .nav-link.done::after{border-left-color:#000}.sw-theme-arrows.sw-dark>.nav .nav-link.disabled{color:#555!important;border-color:#f9f9f9;background:#474747}.sw-theme-arrows.sw-dark>.nav .nav-link.disabled::after{border-left-color:#474747}.sw-theme-arrows.sw-dark>.nav .nav-link.danger{color:#fff;border-color:#d9534f;background:#d9534f}.sw-theme-arrows.sw-dark>.nav .nav-link.danger::after{border-left-color:#d9534f}.sw-theme-dots>.tab-content>.tab-pane{padding:10px}.sw-theme-dots .toolbar>.btn{color:#fff;background-color:#17a2b8;border:1px solid #17a2b8;padding:.375rem .75rem;border-radius:.25rem;font-weight:400}.sw-theme-dots>.nav{position:relative;margin-bottom:10px}.sw-theme-dots>.nav::before{content:" ";position:absolute;top:18px;left:0;width:100%;height:5px;background-color:#eee;border-radius:3px;z-index:1}.sw-theme-dots>.nav .nav-link{position:relative;margin-top:40px}.sw-theme-dots>.nav .nav-link::before{content:" ";position:absolute;display:block;top:-36px;left:0;right:0;margin-left:auto;margin-right:auto;width:32px;height:32px;border-radius:50%;border:none;background:#f5f5f5;color:#428bca;text-decoration:none;z-index:98}.sw-theme-dots>.nav .nav-link::after{content:" ";position:absolute;display:block;top:-28px;left:0;right:0;margin-left:auto;margin-right:auto;width:16px;height:16px;border-radius:50%;z-index:99}.sw-theme-dots>.nav .nav-link.inactive{color:#999;cursor:not-allowed}.sw-theme-dots>.nav .nav-link.inactive::after{background-color:#999}.sw-theme-dots>.nav .nav-link.active{color:#5bc0de!important;cursor:pointer}.sw-theme-dots>.nav .nav-link.active::after{background-color:#5bc0de!important}.sw-theme-dots>.nav .nav-link.done{color:#5cb85c;cursor:pointer}.sw-theme-dots>.nav .nav-link.done::after{background-color:#5cb85c}.sw-theme-dots>.nav .nav-link.disabled{color:#f9f9f9;cursor:not-allowed}.sw-theme-dots>.nav .nav-link.disabled::after{background-color:#f9f9f9}.sw-theme-dots>.nav .nav-link.danger{color:#d9534f;cursor:pointer}.sw-theme-dots>.nav .nav-link.danger::after{background-color:#d9534f}.sw-theme-dots.sw-dark{color:rgba(255,255,255,.95);background:#000}.sw-theme-dots.sw-dark>.nav::before{background-color:#3c3c3c}.sw-theme-dots.sw-dark>.nav .nav-link::before{background:#434343;color:#000}.sw-theme-progress{border:1px solid #eee}.sw-theme-progress>.tab-content>.tab-pane{padding:10px}.sw-theme-progress .toolbar>.btn{color:#fff;background-color:#17a2b8;border:1px solid #17a2b8;padding:.375rem .75rem;border-radius:.25rem;font-weight:400}.sw-theme-progress>.nav{box-shadow:0 .125rem .25rem rgba(0,0,0,.1)!important}.sw-theme-progress>.nav .nav-link{position:relative;height:100%;min-height:100%;background:0 0;overflow:hidden;z-index:2}.sw-theme-progress>.nav .nav-link::after{content:"";position:absolute;height:150%;width:0;left:0;top:0;background:#fff;z-index:-1;transition:all .35s ease .1s}.sw-theme-progress>.nav .nav-link.inactive{color:#999;cursor:not-allowed}.sw-theme-progress>.nav .nav-link.active{color:#fff!important;cursor:pointer}.sw-theme-progress>.nav .nav-link.active::after{background-color:#5cb85c;width:100%}.sw-theme-progress>.nav .nav-link.done{color:#fff!important;cursor:pointer}.sw-theme-progress>.nav .nav-link.done::after{background:#5cb85c;width:100%}.sw-theme-progress>.nav .nav-link.disabled{color:#ddd!important;cursor:not-allowed}.sw-theme-progress>.nav .nav-link.disabled::after{background:#f9f9f9;width:100%}.sw-theme-progress>.nav .nav-link.danger{color:#fff!important;cursor:pointer}.sw-theme-progress>.nav .nav-link.danger::after{background:#d9534f;width:100%}.sw-theme-progress.sw-dark{color:rgba(255,255,255,.95)}.sw-theme-progress.sw-dark>.nav .nav-link.active{color:#fff}.sw-theme-progress.sw-dark>.nav .nav-link.active::after{background-color:#333}.sw-theme-progress.sw-dark>.nav .nav-link.done{color:#fff!important}.sw-theme-progress.sw-dark>.nav .nav-link.done::after{background:#333}.sw-theme-progress.sw-dark>.nav .nav-link.disabled{color:#2b2b2b!important}.sw-theme-progress.sw-dark>.nav .nav-link.disabled::after{background:#474747}.sw-theme-progress.sw-dark>.nav .nav-link.danger{color:#fff!important}.sw-theme-progress.sw-dark>.nav .nav-link.danger::after{background:#d9534f} \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.css b/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.css deleted file mode 100644 index 35184c09..00000000 --- a/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.css +++ /dev/null @@ -1,381 +0,0 @@ -/* - Common -*/ - -.wizard, -.tabcontrol -{ - display: block; - width: 100%; - overflow: hidden; -} - -.wizard a, -.tabcontrol a -{ - outline: 0; -} - -.wizard ul, -.tabcontrol ul -{ - list-style: none !important; - padding: 0; - margin: 0; -} - -.wizard ul > li, -.tabcontrol ul > li -{ - display: block; - padding: 0; -} - -/* Accessibility */ -.wizard > .steps .current-info, -.tabcontrol > .steps .current-info -{ - position: absolute; - left: -999em; -} - -.wizard > .content > .title, -.tabcontrol > .content > .title -{ - position: absolute; - left: -999em; -} - - - -/* - Wizard -*/ - -.wizard > .steps -{ - position: relative; - display: block; - width: 100%; -} - -.wizard.vertical > .steps -{ - display: inline; - float: left; - width: 30%; -} - -.wizard > .steps > ul > li -{ - width: 25%; -} - -.wizard > .steps > ul > li, -.wizard > .actions > ul > li -{ - float: left; -} - -.wizard.vertical > .steps > ul > li -{ - float: none; - width: 100%; -} - -.wizard > .steps a, -.wizard > .steps a:hover, -.wizard > .steps a:active -{ - display: block; - width: auto; - margin: 0 0.5em 0.5em; - padding: 8px; - text-decoration: none; - - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.wizard > .steps .disabled a, -.wizard > .steps .disabled a:hover, -.wizard > .steps .disabled a:active -{ - background: #eee; - color: #aaa; - cursor: default; -} - -.wizard > .steps .current a, -.wizard > .steps .current a:hover, -.wizard > .steps .current a:active -{ - background: #1AB394; - color: #fff; - cursor: default; -} - -.wizard > .steps .done a, -.wizard > .steps .done a:hover, -.wizard > .steps .done a:active -{ - background: #6fd1bd; - color: #fff; -} - -.wizard > .steps .error a, -.wizard > .steps .error a:hover, -.wizard > .steps .error a:active -{ - background: #ED5565 ; - color: #fff; -} - -.wizard > .content -{ - background: #eee; - display: block; - margin: 5px 5px 10px 5px; - min-height: 120px; - overflow: hidden; - position: relative; - width: auto; - - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.wizard-big.wizard > .content { - min-height: 320px; -} -.wizard.vertical > .content -{ - display: inline; - float: left; - margin: 0 2.5% 0.5em 2.5%; - width: 65%; -} - -.wizard > .content > .body -{ - float: left; - position: absolute; - width: 95%; - height: 95%; - padding: 2.5%; -} - -.wizard > .content > .body ul -{ - list-style: disc !important; -} - -.wizard > .content > .body ul > li -{ - display: list-item; -} - -.wizard > .content > .body > iframe -{ - border: 0 none; - width: 100%; - height: 100%; -} - -.wizard > .content > .body input -{ - display: block; - border: 1px solid #ccc; -} - -.wizard > .content > .body input[type="checkbox"] -{ - display: inline-block; -} - -.wizard > .content > .body input.error -{ - background: rgb(251, 227, 228); - border: 1px solid #fbc2c4; - color: #8a1f11; -} - -.wizard > .content > .body label -{ - display: inline-block; - margin-bottom: 0.5em; -} - -.wizard > .content > .body label.error -{ - color: #8a1f11; - display: inline-block; - margin-left: 1.5em; -} - -.wizard > .actions -{ - position: relative; - display: block; - text-align: right; - width: 100%; -} - -.wizard.vertical > .actions -{ - display: inline; - float: right; - margin: 0 2.5%; - width: 95%; -} - -.wizard > .actions > ul -{ - display: inline-block; - text-align: right; -} - -.wizard > .actions > ul > li -{ - margin: 0 0.5em; -} - -.wizard.vertical > .actions > ul > li -{ - margin: 0 0 0 1em; -} - -.wizard > .actions a, -.wizard > .actions a:hover, -.wizard > .actions a:active -{ - background: #1AB394; - color: #fff; - display: block; - padding: 0.5em 1em; - text-decoration: none; - - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.wizard > .actions .disabled a, -.wizard > .actions .disabled a:hover, -.wizard > .actions .disabled a:active -{ - background: #eee; - color: #aaa; -} - -.wizard > .loading -{ -} - -.wizard > .loading .spinner -{ -} - - - -/* - Tabcontrol -*/ - -.tabcontrol > .steps -{ - position: relative; - display: block; - width: 100%; -} - -.tabcontrol > .steps > ul -{ - position: relative; - margin: 6px 0 0 0; - top: 1px; - z-index: 1; -} - -.tabcontrol > .steps > ul > li -{ - float: left; - margin: 5px 2px 0 0; - padding: 1px; - - -webkit-border-top-left-radius: 5px; - -webkit-border-top-right-radius: 5px; - -moz-border-radius-topleft: 5px; - -moz-border-radius-topright: 5px; - border-top-left-radius: 5px; - border-top-right-radius: 5px; -} - -.tabcontrol > .steps > ul > li:hover -{ - background: #edecec; - border: 1px solid #bbb; - padding: 0; -} - -.tabcontrol > .steps > ul > li.current -{ - background: #fff; - border: 1px solid #bbb; - border-bottom: 0 none; - padding: 0 0 1px 0; - margin-top: 0; -} - -.tabcontrol > .steps > ul > li > a -{ - color: #5f5f5f; - display: inline-block; - border: 0 none; - margin: 0; - padding: 10px 30px; - text-decoration: none; -} - -.tabcontrol > .steps > ul > li > a:hover -{ - text-decoration: none; -} - -.tabcontrol > .steps > ul > li.current > a -{ - padding: 15px 30px 10px 30px; -} - -.tabcontrol > .content -{ - position: relative; - display: inline-block; - width: 100%; - height: 35em; - overflow: hidden; - border-top: 1px solid #bbb; - padding-top: 20px; -} - -.tabcontrol > .content > .body -{ - float: left; - position: absolute; - width: 95%; - height: 95%; - padding: 2.5%; -} - -.tabcontrol > .content > .body ul -{ - list-style: disc !important; -} - -.tabcontrol > .content > .body ul > li -{ - display: list-item; -} -label.error { position:inherit; } diff --git a/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.js b/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.js deleted file mode 100644 index 3ffcf50f..00000000 --- a/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.js +++ /dev/null @@ -1,2042 +0,0 @@ -/*! - * jQuery Steps v1.1.0 - 09/04/2014 - * Copyright (c) 2014 Rafael Staib (http://www.jquery-steps.com) - * Licensed under MIT http://www.opensource.org/licenses/MIT - */ -;(function ($, undefined) -{ -$.fn.extend({ - _aria: function (name, value) - { - return this.attr("aria-" + name, value); - }, - - _removeAria: function (name) - { - return this.removeAttr("aria-" + name); - }, - - _enableAria: function (enable) - { - return (enable == null || enable) ? - this.removeClass("disabled")._aria("disabled", "false") : - this.addClass("disabled")._aria("disabled", "true"); - }, - - _showAria: function (show) - { - return (show == null || show) ? - this.show()._aria("hidden", "false") : - this.hide()._aria("hidden", "true"); - }, - - _selectAria: function (select) - { - return (select == null || select) ? - this.addClass("current")._aria("selected", "true") : - this.removeClass("current")._aria("selected", "false"); - }, - - _id: function (id) - { - return (id) ? this.attr("id", id) : this.attr("id"); - } -}); - -if (!String.prototype.format) -{ - String.prototype.format = function() - { - var args = (arguments.length === 1 && $.isArray(arguments[0])) ? arguments[0] : arguments; - var formattedString = this; - for (var i = 0; i < args.length; i++) - { - var pattern = new RegExp("\\{" + i + "\\}", "gm"); - formattedString = formattedString.replace(pattern, args[i]); - } - return formattedString; - }; -} - -/** - * A global unique id count. - * - * @static - * @private - * @property _uniqueId - * @type Integer - **/ -var _uniqueId = 0; - -/** - * The plugin prefix for cookies. - * - * @final - * @private - * @property _cookiePrefix - * @type String - **/ -var _cookiePrefix = "jQu3ry_5teps_St@te_"; - -/** - * Suffix for the unique tab id. - * - * @final - * @private - * @property _tabSuffix - * @type String - * @since 0.9.7 - **/ -var _tabSuffix = "-t-"; - -/** - * Suffix for the unique tabpanel id. - * - * @final - * @private - * @property _tabpanelSuffix - * @type String - * @since 0.9.7 - **/ -var _tabpanelSuffix = "-p-"; - -/** - * Suffix for the unique title id. - * - * @final - * @private - * @property _titleSuffix - * @type String - * @since 0.9.7 - **/ -var _titleSuffix = "-h-"; - -/** - * An error message for an "index out of range" error. - * - * @final - * @private - * @property _indexOutOfRangeErrorMessage - * @type String - **/ -var _indexOutOfRangeErrorMessage = "Index out of range."; - -/** - * An error message for an "missing corresponding element" error. - * - * @final - * @private - * @property _missingCorrespondingElementErrorMessage - * @type String - **/ -var _missingCorrespondingElementErrorMessage = "One or more corresponding step {0} are missing."; - -/** - * Adds a step to the cache. - * - * @static - * @private - * @method addStepToCache - * @param wizard {Object} A jQuery wizard object - * @param step {Object} The step object to add - **/ -function addStepToCache(wizard, step) -{ - getSteps(wizard).push(step); -} - -function analyzeData(wizard, options, state) -{ - var stepTitles = wizard.children(options.headerTag), - stepContents = wizard.children(options.bodyTag); - - // Validate content - if (stepTitles.length > stepContents.length) - { - throwError(_missingCorrespondingElementErrorMessage, "contents"); - } - else if (stepTitles.length < stepContents.length) - { - throwError(_missingCorrespondingElementErrorMessage, "titles"); - } - - var startIndex = options.startIndex; - - state.stepCount = stepTitles.length; - - // Tries to load the saved state (step position) - if (options.saveState && $.cookie) - { - var savedState = $.cookie(_cookiePrefix + getUniqueId(wizard)); - // Sets the saved position to the start index if not undefined or out of range - var savedIndex = parseInt(savedState, 0); - if (!isNaN(savedIndex) && savedIndex < state.stepCount) - { - startIndex = savedIndex; - } - } - - state.currentIndex = startIndex; - - stepTitles.each(function (index) - { - var item = $(this), // item == header - content = stepContents.eq(index), - modeData = content.data("mode"), - mode = (modeData == null) ? contentMode.html : getValidEnumValue(contentMode, - (/^\s*$/.test(modeData) || isNaN(modeData)) ? modeData : parseInt(modeData, 0)), - contentUrl = (mode === contentMode.html || content.data("url") === undefined) ? - "" : content.data("url"), - contentLoaded = (mode !== contentMode.html && content.data("loaded") === "1"), - step = $.extend({}, stepModel, { - title: item.html(), - content: (mode === contentMode.html) ? content.html() : "", - contentUrl: contentUrl, - contentMode: mode, - contentLoaded: contentLoaded - }); - - addStepToCache(wizard, step); - }); -} - -/** - * Triggers the onCanceled event. - * - * @static - * @private - * @method cancel - * @param wizard {Object} The jQuery wizard object - **/ -function cancel(wizard) -{ - wizard.triggerHandler("canceled"); -} - -function decreaseCurrentIndexBy(state, decreaseBy) -{ - return state.currentIndex - decreaseBy; -} - -/** - * Removes the control functionality completely and transforms the current state to the initial HTML structure. - * - * @static - * @private - * @method destroy - * @param wizard {Object} A jQuery wizard object - **/ -function destroy(wizard, options) -{ - var eventNamespace = getEventNamespace(wizard); - - // Remove virtual data objects from the wizard - wizard.unbind(eventNamespace).removeData("uid").removeData("options") - .removeData("state").removeData("steps").removeData("eventNamespace") - .find(".actions a").unbind(eventNamespace); - - // Remove attributes and CSS classes from the wizard - wizard.removeClass(options.clearFixCssClass + " vertical"); - - var contents = wizard.find(".content > *"); - - // Remove virtual data objects from panels and their titles - contents.removeData("loaded").removeData("mode").removeData("url"); - - // Remove attributes, CSS classes and reset inline styles on all panels and their titles - contents.removeAttr("id").removeAttr("role").removeAttr("tabindex") - .removeAttr("class").removeAttr("style")._removeAria("labelledby") - ._removeAria("hidden"); - - // Empty panels if the mode is set to 'async' or 'iframe' - wizard.find(".content > [data-mode='async'],.content > [data-mode='iframe']").empty(); - - var wizardSubstitute = $("<{0} class=\"{1}\"></{0}>".format(wizard.get(0).tagName, wizard.attr("class"))); - - var wizardId = wizard._id(); - if (wizardId != null && wizardId !== "") - { - wizardSubstitute._id(wizardId); - } - - wizardSubstitute.html(wizard.find(".content").html()); - wizard.after(wizardSubstitute); - wizard.remove(); - - return wizardSubstitute; -} - -/** - * Triggers the onFinishing and onFinished event. - * - * @static - * @private - * @method finishStep - * @param wizard {Object} The jQuery wizard object - * @param state {Object} The state container of the current wizard - **/ -function finishStep(wizard, state) -{ - var currentStep = wizard.find(".steps li").eq(state.currentIndex); - - if (wizard.triggerHandler("finishing", [state.currentIndex])) - { - currentStep.addClass("done").removeClass("error"); - wizard.triggerHandler("finished", [state.currentIndex]); - } - else - { - currentStep.addClass("error"); - } -} - -/** - * Gets or creates if not exist an unique event namespace for the given wizard instance. - * - * @static - * @private - * @method getEventNamespace - * @param wizard {Object} A jQuery wizard object - * @return {String} Returns the unique event namespace for the given wizard - */ -function getEventNamespace(wizard) -{ - var eventNamespace = wizard.data("eventNamespace"); - - if (eventNamespace == null) - { - eventNamespace = "." + getUniqueId(wizard); - wizard.data("eventNamespace", eventNamespace); - } - - return eventNamespace; -} - -function getStepAnchor(wizard, index) -{ - var uniqueId = getUniqueId(wizard); - - return wizard.find("#" + uniqueId + _tabSuffix + index); -} - -function getStepPanel(wizard, index) -{ - var uniqueId = getUniqueId(wizard); - - return wizard.find("#" + uniqueId + _tabpanelSuffix + index); -} - -function getStepTitle(wizard, index) -{ - var uniqueId = getUniqueId(wizard); - - return wizard.find("#" + uniqueId + _titleSuffix + index); -} - -function getOptions(wizard) -{ - return wizard.data("options"); -} - -function getState(wizard) -{ - return wizard.data("state"); -} - -function getSteps(wizard) -{ - return wizard.data("steps"); -} - -/** - * Gets a specific step object by index. - * - * @static - * @private - * @method getStep - * @param index {Integer} An integer that belongs to the position of a step - * @return {Object} A specific step object - **/ -function getStep(wizard, index) -{ - var steps = getSteps(wizard); - - if (index < 0 || index >= steps.length) - { - throwError(_indexOutOfRangeErrorMessage); - } - - return steps[index]; -} - -/** - * Gets or creates if not exist an unique id from the given wizard instance. - * - * @static - * @private - * @method getUniqueId - * @param wizard {Object} A jQuery wizard object - * @return {String} Returns the unique id for the given wizard - */ -function getUniqueId(wizard) -{ - var uniqueId = wizard.data("uid"); - - if (uniqueId == null) - { - uniqueId = wizard._id(); - if (uniqueId == null) - { - uniqueId = "steps-uid-".concat(_uniqueId); - wizard._id(uniqueId); - } - - _uniqueId++; - wizard.data("uid", uniqueId); - } - - return uniqueId; -} - -/** - * Gets a valid enum value by checking a specific enum key or value. - * - * @static - * @private - * @method getValidEnumValue - * @param enumType {Object} Type of enum - * @param keyOrValue {Object} Key as `String` or value as `Integer` to check for - */ -function getValidEnumValue(enumType, keyOrValue) -{ - validateArgument("enumType", enumType); - validateArgument("keyOrValue", keyOrValue); - - // Is key - if (typeof keyOrValue === "string") - { - var value = enumType[keyOrValue]; - if (value === undefined) - { - throwError("The enum key '{0}' does not exist.", keyOrValue); - } - - return value; - } - // Is value - else if (typeof keyOrValue === "number") - { - for (var key in enumType) - { - if (enumType[key] === keyOrValue) - { - return keyOrValue; - } - } - - throwError("Invalid enum value '{0}'.", keyOrValue); - } - // Type is not supported - else - { - throwError("Invalid key or value type."); - } -} - -/** - * Routes to the next step. - * - * @static - * @private - * @method goToNextStep - * @param wizard {Object} The jQuery wizard object - * @param options {Object} Settings of the current wizard - * @param state {Object} The state container of the current wizard - * @return {Boolean} Indicates whether the action executed - **/ -function goToNextStep(wizard, options, state) -{ - return paginationClick(wizard, options, state, increaseCurrentIndexBy(state, 1)); -} - -/** - * Routes to the previous step. - * - * @static - * @private - * @method goToPreviousStep - * @param wizard {Object} The jQuery wizard object - * @param options {Object} Settings of the current wizard - * @param state {Object} The state container of the current wizard - * @return {Boolean} Indicates whether the action executed - **/ -function goToPreviousStep(wizard, options, state) -{ - return paginationClick(wizard, options, state, decreaseCurrentIndexBy(state, 1)); -} - -/** - * Routes to a specific step by a given index. - * - * @static - * @private - * @method goToStep - * @param wizard {Object} The jQuery wizard object - * @param options {Object} Settings of the current wizard - * @param state {Object} The state container of the current wizard - * @param index {Integer} The position (zero-based) to route to - * @return {Boolean} Indicates whether the action succeeded or failed - **/ -function goToStep(wizard, options, state, index) -{ - if (index < 0 || index >= state.stepCount) - { - throwError(_indexOutOfRangeErrorMessage); - } - - if (options.forceMoveForward && index < state.currentIndex) - { - return; - } - - var oldIndex = state.currentIndex; - if (wizard.triggerHandler("stepChanging", [state.currentIndex, index])) - { - // Save new state - state.currentIndex = index; - saveCurrentStateToCookie(wizard, options, state); - - // Change visualisation - refreshStepNavigation(wizard, options, state, oldIndex); - refreshPagination(wizard, options, state); - loadAsyncContent(wizard, options, state); - startTransitionEffect(wizard, options, state, index, oldIndex, function() - { - wizard.triggerHandler("stepChanged", [index, oldIndex]); - }); - } - else - { - wizard.find(".steps li").eq(oldIndex).addClass("error"); - } - - return true; -} - -function increaseCurrentIndexBy(state, increaseBy) -{ - return state.currentIndex + increaseBy; -} - -/** - * Initializes the component. - * - * @static - * @private - * @method initialize - * @param options {Object} The component settings - **/ -function initialize(options) -{ - /*jshint -W040 */ - var opts = $.extend(true, {}, defaults, options); - - return this.each(function () - { - var wizard = $(this); - var state = { - currentIndex: opts.startIndex, - currentStep: null, - stepCount: 0, - transitionElement: null - }; - - // Create data container - wizard.data("options", opts); - wizard.data("state", state); - wizard.data("steps", []); - - analyzeData(wizard, opts, state); - render(wizard, opts, state); - registerEvents(wizard, opts); - - // Trigger focus - if (opts.autoFocus && _uniqueId === 0) - { - getStepAnchor(wizard, opts.startIndex).focus(); - } - - wizard.triggerHandler("init", [opts.startIndex]); - }); -} - -/** - * Inserts a new step to a specific position. - * - * @static - * @private - * @method insertStep - * @param wizard {Object} The jQuery wizard object - * @param options {Object} Settings of the current wizard - * @param state {Object} The state container of the current wizard - * @param index {Integer} The position (zero-based) to add - * @param step {Object} The step object to add - * @example - * $("#wizard").steps().insert(0, { - * title: "Title", - * content: "", // optional - * contentMode: "async", // optional - * contentUrl: "/Content/Step/1" // optional - * }); - * @chainable - **/ -function insertStep(wizard, options, state, index, step) -{ - if (index < 0 || index > state.stepCount) - { - throwError(_indexOutOfRangeErrorMessage); - } - - // TODO: Validate step object - - // Change data - step = $.extend({}, stepModel, step); - insertStepToCache(wizard, index, step); - if (state.currentIndex !== state.stepCount && state.currentIndex >= index) - { - state.currentIndex++; - saveCurrentStateToCookie(wizard, options, state); - } - state.stepCount++; - - var contentContainer = wizard.find(".content"), - header = $("<{0}>{1}</{0}>".format(options.headerTag, step.title)), - body = $("<{0}></{0}>".format(options.bodyTag)); - - if (step.contentMode == null || step.contentMode === contentMode.html) - { - body.html(step.content); - } - - if (index === 0) - { - contentContainer.prepend(body).prepend(header); - } - else - { - getStepPanel(wizard, (index - 1)).after(body).after(header); - } - - renderBody(wizard, state, body, index); - renderTitle(wizard, options, state, header, index); - refreshSteps(wizard, options, state, index); - if (index === state.currentIndex) - { - refreshStepNavigation(wizard, options, state); - } - refreshPagination(wizard, options, state); - - return wizard; -} - -/** - * Inserts a step object to the cache at a specific position. - * - * @static - * @private - * @method insertStepToCache - * @param wizard {Object} A jQuery wizard object - * @param index {Integer} The position (zero-based) to add - * @param step {Object} The step object to add - **/ -function insertStepToCache(wizard, index, step) -{ - getSteps(wizard).splice(index, 0, step); -} - -/** - * Handles the keyup DOM event for pagination. - * - * @static - * @private - * @event keyup - * @param event {Object} An event object - */ -function keyUpHandler(event) -{ - var wizard = $(this), - options = getOptions(wizard), - state = getState(wizard); - - if (options.suppressPaginationOnFocus && wizard.find(":focus").is(":input")) - { - event.preventDefault(); - return false; - } - - var keyCodes = { left: 37, right: 39 }; - if (event.keyCode === keyCodes.left) - { - event.preventDefault(); - goToPreviousStep(wizard, options, state); - } - else if (event.keyCode === keyCodes.right) - { - event.preventDefault(); - goToNextStep(wizard, options, state); - } -} - -/** - * Loads and includes async content. - * - * @static - * @private - * @method loadAsyncContent - * @param wizard {Object} A jQuery wizard object - * @param options {Object} Settings of the current wizard - * @param state {Object} The state container of the current wizard - */ -function loadAsyncContent(wizard, options, state) -{ - if (state.stepCount > 0) - { - var currentIndex = state.currentIndex, - currentStep = getStep(wizard, currentIndex); - - if (!options.enableContentCache || !currentStep.contentLoaded) - { - switch (getValidEnumValue(contentMode, currentStep.contentMode)) - { - case contentMode.iframe: - wizard.find(".content > .body").eq(state.currentIndex).empty() - .html("<iframe src=\"" + currentStep.contentUrl + "\" frameborder=\"0\" scrolling=\"no\" />") - .data("loaded", "1"); - break; - - case contentMode.async: - var currentStepContent = getStepPanel(wizard, currentIndex)._aria("busy", "true") - .empty().append(renderTemplate(options.loadingTemplate, { text: options.labels.loading })); - - $.ajax({ url: currentStep.contentUrl, cache: false }).done(function (data) - { - currentStepContent.empty().html(data)._aria("busy", "false").data("loaded", "1"); - wizard.triggerHandler("contentLoaded", [currentIndex]); - }); - break; - } - } - } -} - -/** - * Fires the action next or previous click event. - * - * @static - * @private - * @method paginationClick - * @param wizard {Object} The jQuery wizard object - * @param options {Object} Settings of the current wizard - * @param state {Object} The state container of the current wizard - * @param index {Integer} The position (zero-based) to route to - * @return {Boolean} Indicates whether the event fired successfully or not - **/ -function paginationClick(wizard, options, state, index) -{ - var oldIndex = state.currentIndex; - - if (index >= 0 && index < state.stepCount && !(options.forceMoveForward && index < state.currentIndex)) - { - var anchor = getStepAnchor(wizard, index), - parent = anchor.parent(), - isDisabled = parent.hasClass("disabled"); - - // Enable the step to make the anchor clickable! - parent._enableAria(); - anchor.click(); - - // An error occured - if (oldIndex === state.currentIndex && isDisabled) - { - // Disable the step again if current index has not changed; prevents click action. - parent._enableAria(false); - return false; - } - - return true; - } - - return false; -} - -/** - * Fires when a pagination click happens. - * - * @static - * @private - * @event click - * @param event {Object} An event object - */ -function paginationClickHandler(event) -{ - event.preventDefault(); - - var anchor = $(this), - wizard = anchor.parent().parent().parent().parent(), - options = getOptions(wizard), - state = getState(wizard), - href = anchor.attr("href"); - - switch (href.substring(href.lastIndexOf("#") + 1)) - { - case "cancel": - cancel(wizard); - break; - - case "finish": - finishStep(wizard, state); - break; - - case "next": - goToNextStep(wizard, options, state); - break; - - case "previous": - goToPreviousStep(wizard, options, state); - break; - } -} - -/** - * Refreshs the visualization state for the entire pagination. - * - * @static - * @private - * @method refreshPagination - * @param wizard {Object} A jQuery wizard object - * @param options {Object} Settings of the current wizard - * @param state {Object} The state container of the current wizard - */ -function refreshPagination(wizard, options, state) -{ - if (options.enablePagination) - { - var finish = wizard.find(".actions a[href$='#finish']").parent(), - next = wizard.find(".actions a[href$='#next']").parent(); - - if (!options.forceMoveForward) - { - var previous = wizard.find(".actions a[href$='#previous']").parent(); - previous._enableAria(state.currentIndex > 0); - } - - if (options.enableFinishButton && options.showFinishButtonAlways) - { - finish._enableAria(state.stepCount > 0); - next._enableAria(state.stepCount > 1 && state.stepCount > (state.currentIndex + 1)); - } - else - { - finish._showAria(options.enableFinishButton && state.stepCount === (state.currentIndex + 1)); - next._showAria(state.stepCount === 0 || state.stepCount > (state.currentIndex + 1)). - _enableAria(state.stepCount > (state.currentIndex + 1) || !options.enableFinishButton); - } - } -} - -/** - * Refreshs the visualization state for the step navigation (tabs). - * - * @static - * @private - * @method refreshStepNavigation - * @param wizard {Object} A jQuery wizard object - * @param options {Object} Settings of the current wizard - * @param state {Object} The state container of the current wizard - * @param [oldIndex] {Integer} The index of the prior step - */ -function refreshStepNavigation(wizard, options, state, oldIndex) -{ - var currentOrNewStepAnchor = getStepAnchor(wizard, state.currentIndex), - currentInfo = $("<span class=\"current-info audible\">" + options.labels.current + " </span>"), - stepTitles = wizard.find(".content > .title"); - - if (oldIndex != null) - { - var oldStepAnchor = getStepAnchor(wizard, oldIndex); - oldStepAnchor.parent().addClass("done").removeClass("error")._selectAria(false); - stepTitles.eq(oldIndex).removeClass("current").next(".body").removeClass("current"); - currentInfo = oldStepAnchor.find(".current-info"); - currentOrNewStepAnchor.focus(); - } - - currentOrNewStepAnchor.prepend(currentInfo).parent()._selectAria().removeClass("done")._enableAria(); - stepTitles.eq(state.currentIndex).addClass("current").next(".body").addClass("current"); -} - -/** - * Refreshes step buttons and their related titles beyond a certain position. - * - * @static - * @private - * @method refreshSteps - * @param wizard {Object} A jQuery wizard object - * @param options {Object} Settings of the current wizard - * @param state {Object} The state container of the current wizard - * @param index {Integer} The start point for refreshing ids - */ -function refreshSteps(wizard, options, state, index) -{ - var uniqueId = getUniqueId(wizard); - - for (var i = index; i < state.stepCount; i++) - { - var uniqueStepId = uniqueId + _tabSuffix + i, - uniqueBodyId = uniqueId + _tabpanelSuffix + i, - uniqueHeaderId = uniqueId + _titleSuffix + i, - title = wizard.find(".title").eq(i)._id(uniqueHeaderId); - - wizard.find(".steps a").eq(i)._id(uniqueStepId) - ._aria("controls", uniqueBodyId).attr("href", "#" + uniqueHeaderId) - .html(renderTemplate(options.titleTemplate, { index: i + 1, title: title.html() })); - wizard.find(".body").eq(i)._id(uniqueBodyId) - ._aria("labelledby", uniqueHeaderId); - } -} - -function registerEvents(wizard, options) -{ - var eventNamespace = getEventNamespace(wizard); - - wizard.bind("canceled" + eventNamespace, options.onCanceled); - wizard.bind("contentLoaded" + eventNamespace, options.onContentLoaded); - wizard.bind("finishing" + eventNamespace, options.onFinishing); - wizard.bind("finished" + eventNamespace, options.onFinished); - wizard.bind("init" + eventNamespace, options.onInit); - wizard.bind("stepChanging" + eventNamespace, options.onStepChanging); - wizard.bind("stepChanged" + eventNamespace, options.onStepChanged); - - if (options.enableKeyNavigation) - { - wizard.bind("keyup" + eventNamespace, keyUpHandler); - } - - wizard.find(".actions a").bind("click" + eventNamespace, paginationClickHandler); -} - -/** - * Removes a specific step by an given index. - * - * @static - * @private - * @method removeStep - * @param wizard {Object} A jQuery wizard object - * @param options {Object} Settings of the current wizard - * @param state {Object} The state container of the current wizard - * @param index {Integer} The position (zero-based) of the step to remove - * @return Indecates whether the item is removed. - **/ -function removeStep(wizard, options, state, index) -{ - // Index out of range and try deleting current item will return false. - if (index < 0 || index >= state.stepCount || state.currentIndex === index) - { - return false; - } - - // Change data - removeStepFromCache(wizard, index); - if (state.currentIndex > index) - { - state.currentIndex--; - saveCurrentStateToCookie(wizard, options, state); - } - state.stepCount--; - - getStepTitle(wizard, index).remove(); - getStepPanel(wizard, index).remove(); - getStepAnchor(wizard, index).parent().remove(); - - // Set the "first" class to the new first step button - if (index === 0) - { - wizard.find(".steps li").first().addClass("first"); - } - - // Set the "last" class to the new last step button - if (index === state.stepCount) - { - wizard.find(".steps li").eq(index).addClass("last"); - } - - refreshSteps(wizard, options, state, index); - refreshPagination(wizard, options, state); - - return true; -} - -function removeStepFromCache(wizard, index) -{ - getSteps(wizard).splice(index, 1); -} - -/** - * Transforms the base html structure to a more sensible html structure. - * - * @static - * @private - * @method render - * @param wizard {Object} A jQuery wizard object - * @param options {Object} Settings of the current wizard - * @param state {Object} The state container of the current wizard - **/ -function render(wizard, options, state) -{ - // Create a content wrapper and copy HTML from the intial wizard structure - var wrapperTemplate = "<{0} class=\"{1}\">{2}</{0}>", - orientation = getValidEnumValue(stepsOrientation, options.stepsOrientation), - verticalCssClass = (orientation === stepsOrientation.vertical) ? " vertical" : "", - contentWrapper = $(wrapperTemplate.format(options.contentContainerTag, "content " + options.clearFixCssClass, wizard.html())), - stepsWrapper = $(wrapperTemplate.format(options.stepsContainerTag, "steps " + options.clearFixCssClass, "<ul role=\"tablist\"></ul>")), - stepTitles = contentWrapper.children(options.headerTag), - stepContents = contentWrapper.children(options.bodyTag); - - // Transform the wizard wrapper and remove the inner HTML - wizard.attr("role", "application").empty().append(stepsWrapper).append(contentWrapper) - .addClass(options.cssClass + " " + options.clearFixCssClass + verticalCssClass); - - // Add WIA-ARIA support - stepContents.each(function (index) - { - renderBody(wizard, state, $(this), index); - }); - - stepTitles.each(function (index) - { - renderTitle(wizard, options, state, $(this), index); - }); - - refreshStepNavigation(wizard, options, state); - renderPagination(wizard, options, state); -} - -/** - * Transforms the body to a proper tabpanel. - * - * @static - * @private - * @method renderBody - * @param wizard {Object} A jQuery wizard object - * @param body {Object} A jQuery body object - * @param index {Integer} The position of the body - */ -function renderBody(wizard, state, body, index) -{ - var uniqueId = getUniqueId(wizard), - uniqueBodyId = uniqueId + _tabpanelSuffix + index, - uniqueHeaderId = uniqueId + _titleSuffix + index; - - body._id(uniqueBodyId).attr("role", "tabpanel")._aria("labelledby", uniqueHeaderId) - .addClass("body")._showAria(state.currentIndex === index); -} - -/** - * Renders a pagination if enabled. - * - * @static - * @private - * @method renderPagination - * @param wizard {Object} A jQuery wizard object - * @param options {Object} Settings of the current wizard - * @param state {Object} The state container of the current wizard - */ -function renderPagination(wizard, options, state) -{ - if (options.enablePagination) - { - var pagination = "<{0} class=\"actions {1}\"><ul role=\"menu\" aria-label=\"{2}\">{3}</ul></{0}>", - buttonTemplate = "<li><a href=\"#{0}\" role=\"menuitem\">{1}</a></li>", - buttons = ""; - - if (!options.forceMoveForward) - { - buttons += buttonTemplate.format("previous", options.labels.previous); - } - - buttons += buttonTemplate.format("next", options.labels.next); - - if (options.enableFinishButton) - { - buttons += buttonTemplate.format("finish", options.labels.finish); - } - - if (options.enableCancelButton) - { - buttons += buttonTemplate.format("cancel", options.labels.cancel); - } - - wizard.append(pagination.format(options.actionContainerTag, options.clearFixCssClass, - options.labels.pagination, buttons)); - - refreshPagination(wizard, options, state); - loadAsyncContent(wizard, options, state); - } -} - -/** - * Renders a template and replaces all placeholder. - * - * @static - * @private - * @method renderTemplate - * @param template {String} A template - * @param substitutes {Object} A list of substitute - * @return {String} The rendered template - */ -function renderTemplate(template, substitutes) -{ - var matches = template.match(/#([a-z]*)#/gi); - - for (var i = 0; i < matches.length; i++) - { - var match = matches[i], - key = match.substring(1, match.length - 1); - - if (substitutes[key] === undefined) - { - throwError("The key '{0}' does not exist in the substitute collection!", key); - } - - template = template.replace(match, substitutes[key]); - } - - return template; -} - -/** - * Transforms the title to a step item button. - * - * @static - * @private - * @method renderTitle - * @param wizard {Object} A jQuery wizard object - * @param options {Object} Settings of the current wizard - * @param state {Object} The state container of the current wizard - * @param header {Object} A jQuery header object - * @param index {Integer} The position of the header - */ -function renderTitle(wizard, options, state, header, index) -{ - var uniqueId = getUniqueId(wizard), - uniqueStepId = uniqueId + _tabSuffix + index, - uniqueBodyId = uniqueId + _tabpanelSuffix + index, - uniqueHeaderId = uniqueId + _titleSuffix + index, - stepCollection = wizard.find(".steps > ul"), - title = renderTemplate(options.titleTemplate, { - index: index + 1, - title: header.html() - }), - stepItem = $("<li role=\"tab\"><a id=\"" + uniqueStepId + "\" href=\"#" + uniqueHeaderId + - "\" aria-controls=\"" + uniqueBodyId + "\">" + title + "</a></li>"); - - stepItem._enableAria(options.enableAllSteps || state.currentIndex > index); - - if (state.currentIndex > index) - { - stepItem.addClass("done"); - } - - header._id(uniqueHeaderId).attr("tabindex", "-1").addClass("title"); - - if (index === 0) - { - stepCollection.prepend(stepItem); - } - else - { - stepCollection.find("li").eq(index - 1).after(stepItem); - } - - // Set the "first" class to the new first step button - if (index === 0) - { - stepCollection.find("li").removeClass("first").eq(index).addClass("first"); - } - - // Set the "last" class to the new last step button - if (index === (state.stepCount - 1)) - { - stepCollection.find("li").removeClass("last").eq(index).addClass("last"); - } - - // Register click event - stepItem.children("a").bind("click" + getEventNamespace(wizard), stepClickHandler); -} - -/** - * Saves the current state to a cookie. - * - * @static - * @private - * @method saveCurrentStateToCookie - * @param wizard {Object} A jQuery wizard object - * @param options {Object} Settings of the current wizard - * @param state {Object} The state container of the current wizard - */ -function saveCurrentStateToCookie(wizard, options, state) -{ - if (options.saveState && $.cookie) - { - $.cookie(_cookiePrefix + getUniqueId(wizard), state.currentIndex); - } -} - -function startTransitionEffect(wizard, options, state, index, oldIndex, doneCallback) -{ - var stepContents = wizard.find(".content > .body"), - effect = getValidEnumValue(transitionEffect, options.transitionEffect), - effectSpeed = options.transitionEffectSpeed, - newStep = stepContents.eq(index), - currentStep = stepContents.eq(oldIndex); - - switch (effect) - { - case transitionEffect.fade: - case transitionEffect.slide: - var hide = (effect === transitionEffect.fade) ? "fadeOut" : "slideUp", - show = (effect === transitionEffect.fade) ? "fadeIn" : "slideDown"; - - state.transitionElement = newStep; - currentStep[hide](effectSpeed, function () - { - var wizard = $(this)._showAria(false).parent().parent(), - state = getState(wizard); - - if (state.transitionElement) - { - state.transitionElement[show](effectSpeed, function () - { - $(this)._showAria(); - }).promise().done(doneCallback); - state.transitionElement = null; - } - }); - break; - - case transitionEffect.slideLeft: - var outerWidth = currentStep.outerWidth(true), - posFadeOut = (index > oldIndex) ? -(outerWidth) : outerWidth, - posFadeIn = (index > oldIndex) ? outerWidth : -(outerWidth); - - $.when(currentStep.animate({ left: posFadeOut }, effectSpeed, - function () { $(this)._showAria(false); }), - newStep.css("left", posFadeIn + "px")._showAria() - .animate({ left: 0 }, effectSpeed)).done(doneCallback); - break; - - default: - $.when(currentStep._showAria(false), newStep._showAria()) - .done(doneCallback); - break; - } -} - -/** - * Fires when a step click happens. - * - * @static - * @private - * @event click - * @param event {Object} An event object - */ -function stepClickHandler(event) -{ - event.preventDefault(); - - var anchor = $(this), - wizard = anchor.parent().parent().parent().parent(), - options = getOptions(wizard), - state = getState(wizard), - oldIndex = state.currentIndex; - - if (anchor.parent().is(":not(.disabled):not(.current)")) - { - var href = anchor.attr("href"), - position = parseInt(href.substring(href.lastIndexOf("-") + 1), 0); - - goToStep(wizard, options, state, position); - } - - // If nothing has changed - if (oldIndex === state.currentIndex) - { - getStepAnchor(wizard, oldIndex).focus(); - return false; - } -} - -function throwError(message) -{ - if (arguments.length > 1) - { - message = message.format(Array.prototype.slice.call(arguments, 1)); - } - - throw new Error(message); -} - -/** - * Checks an argument for null or undefined and throws an error if one check applies. - * - * @static - * @private - * @method validateArgument - * @param argumentName {String} The name of the given argument - * @param argumentValue {Object} The argument itself - */ -function validateArgument(argumentName, argumentValue) -{ - if (argumentValue == null) - { - throwError("The argument '{0}' is null or undefined.", argumentName); - } -} - -/** - * Represents a jQuery wizard plugin. - * - * @class steps - * @constructor - * @param [method={}] The name of the method as `String` or an JSON object for initialization - * @param [params=]* {Array} Additional arguments for a method call - * @chainable - **/ -$.fn.steps = function (method) -{ - if ($.fn.steps[method]) - { - return $.fn.steps[method].apply(this, Array.prototype.slice.call(arguments, 1)); - } - else if (typeof method === "object" || !method) - { - return initialize.apply(this, arguments); - } - else - { - $.error("Method " + method + " does not exist on jQuery.steps"); - } -}; - -/** - * Adds a new step. - * - * @method add - * @param step {Object} The step object to add - * @chainable - **/ -$.fn.steps.add = function (step) -{ - var state = getState(this); - return insertStep(this, getOptions(this), state, state.stepCount, step); -}; - -/** - * Removes the control functionality completely and transforms the current state to the initial HTML structure. - * - * @method destroy - * @chainable - **/ -$.fn.steps.destroy = function () -{ - return destroy(this, getOptions(this)); -}; - -/** - * Triggers the onFinishing and onFinished event. - * - * @method finish - **/ -$.fn.steps.finish = function () -{ - finishStep(this, getState(this)); -}; - -/** - * Gets the current step index. - * - * @method getCurrentIndex - * @return {Integer} The actual step index (zero-based) - * @for steps - **/ -$.fn.steps.getCurrentIndex = function () -{ - return getState(this).currentIndex; -}; - -/** - * Gets the current step object. - * - * @method getCurrentStep - * @return {Object} The actual step object - **/ -$.fn.steps.getCurrentStep = function () -{ - return getStep(this, getState(this).currentIndex); -}; - -/** - * Gets a specific step object by index. - * - * @method getStep - * @param index {Integer} An integer that belongs to the position of a step - * @return {Object} A specific step object - **/ -$.fn.steps.getStep = function (index) -{ - return getStep(this, index); -}; - -/** - * Inserts a new step to a specific position. - * - * @method insert - * @param index {Integer} The position (zero-based) to add - * @param step {Object} The step object to add - * @example - * $("#wizard").steps().insert(0, { - * title: "Title", - * content: "", // optional - * contentMode: "async", // optional - * contentUrl: "/Content/Step/1" // optional - * }); - * @chainable - **/ -$.fn.steps.insert = function (index, step) -{ - return insertStep(this, getOptions(this), getState(this), index, step); -}; - -/** - * Routes to the next step. - * - * @method next - * @return {Boolean} Indicates whether the action executed - **/ -$.fn.steps.next = function () -{ - return goToNextStep(this, getOptions(this), getState(this)); -}; - -/** - * Routes to the previous step. - * - * @method previous - * @return {Boolean} Indicates whether the action executed - **/ -$.fn.steps.previous = function () -{ - return goToPreviousStep(this, getOptions(this), getState(this)); -}; - -/** - * Removes a specific step by an given index. - * - * @method remove - * @param index {Integer} The position (zero-based) of the step to remove - * @return Indecates whether the item is removed. - **/ -$.fn.steps.remove = function (index) -{ - return removeStep(this, getOptions(this), getState(this), index); -}; - -/** - * Sets a specific step object by index. - * - * @method setStep - * @param index {Integer} An integer that belongs to the position of a step - * @param step {Object} The step object to change - **/ -$.fn.steps.setStep = function (index, step) -{ - throw new Error("Not yet implemented!"); -}; - -/** - * Skips an certain amount of steps. - * - * @method skip - * @param count {Integer} The amount of steps that should be skipped - * @return {Boolean} Indicates whether the action executed - **/ -$.fn.steps.skip = function (count) -{ - throw new Error("Not yet implemented!"); -}; - -/** - * An enum represents the different content types of a step and their loading mechanisms. - * - * @class contentMode - * @for steps - **/ -var contentMode = $.fn.steps.contentMode = { - /** - * HTML embedded content - * - * @readOnly - * @property html - * @type Integer - * @for contentMode - **/ - html: 0, - - /** - * IFrame embedded content - * - * @readOnly - * @property iframe - * @type Integer - * @for contentMode - **/ - iframe: 1, - - /** - * Async embedded content - * - * @readOnly - * @property async - * @type Integer - * @for contentMode - **/ - async: 2 -}; - -/** - * An enum represents the orientation of the steps navigation. - * - * @class stepsOrientation - * @for steps - **/ -var stepsOrientation = $.fn.steps.stepsOrientation = { - /** - * Horizontal orientation - * - * @readOnly - * @property horizontal - * @type Integer - * @for stepsOrientation - **/ - horizontal: 0, - - /** - * Vertical orientation - * - * @readOnly - * @property vertical - * @type Integer - * @for stepsOrientation - **/ - vertical: 1 -}; - -/** - * An enum that represents the various transition animations. - * - * @class transitionEffect - * @for steps - **/ -var transitionEffect = $.fn.steps.transitionEffect = { - /** - * No transition animation - * - * @readOnly - * @property none - * @type Integer - * @for transitionEffect - **/ - none: 0, - - /** - * Fade in transition - * - * @readOnly - * @property fade - * @type Integer - * @for transitionEffect - **/ - fade: 1, - - /** - * Slide up transition - * - * @readOnly - * @property slide - * @type Integer - * @for transitionEffect - **/ - slide: 2, - - /** - * Slide left transition - * - * @readOnly - * @property slideLeft - * @type Integer - * @for transitionEffect - **/ - slideLeft: 3 -}; - -var stepModel = $.fn.steps.stepModel = { - title: "", - content: "", - contentUrl: "", - contentMode: contentMode.html, - contentLoaded: false -}; - -/** - * An object that represents the default settings. - * There are two possibities to override the sub-properties. - * Either by doing it generally (global) or on initialization. - * - * @static - * @class defaults - * @for steps - * @example - * // Global approach - * $.steps.defaults.headerTag = "h3"; - * @example - * // Initialization approach - * $("#wizard").steps({ headerTag: "h3" }); - **/ -var defaults = $.fn.steps.defaults = { - /** - * The header tag is used to find the step button text within the declared wizard area. - * - * @property headerTag - * @type String - * @default "h1" - * @for defaults - **/ - headerTag: "h1", - - /** - * The body tag is used to find the step content within the declared wizard area. - * - * @property bodyTag - * @type String - * @default "div" - * @for defaults - **/ - bodyTag: "div", - - /** - * The content container tag which will be used to wrap all step contents. - * - * @property contentContainerTag - * @type String - * @default "div" - * @for defaults - **/ - contentContainerTag: "div", - - /** - * The action container tag which will be used to wrap the pagination navigation. - * - * @property actionContainerTag - * @type String - * @default "div" - * @for defaults - **/ - actionContainerTag: "div", - - /** - * The steps container tag which will be used to wrap the steps navigation. - * - * @property stepsContainerTag - * @type String - * @default "div" - * @for defaults - **/ - stepsContainerTag: "div", - - /** - * The css class which will be added to the outer component wrapper. - * - * @property cssClass - * @type String - * @default "wizard" - * @for defaults - * @example - * <div class="wizard"> - * ... - * </div> - **/ - cssClass: "wizard", - - /** - * The css class which will be used for floating scenarios. - * - * @property clearFixCssClass - * @type String - * @default "clearfix" - * @for defaults - **/ - clearFixCssClass: "clearfix", - - /** - * Determines whether the steps are vertically or horizontally oriented. - * - * @property stepsOrientation - * @type stepsOrientation - * @default horizontal - * @for defaults - * @since 1.0.0 - **/ - stepsOrientation: stepsOrientation.horizontal, - - /* - * Tempplates - */ - - /** - * The title template which will be used to create a step button. - * - * @property titleTemplate - * @type String - * @default "<span class=\"number\">#index#.</span> #title#" - * @for defaults - **/ - titleTemplate: "<span class=\"number\">#index#.</span> #title#", - - /** - * The loading template which will be used to create the loading animation. - * - * @property loadingTemplate - * @type String - * @default "<span class=\"spinner\"></span> #text#" - * @for defaults - **/ - loadingTemplate: "<span class=\"spinner\"></span> #text#", - - /* - * Behaviour - */ - - /** - * Sets the focus to the first wizard instance in order to enable the key navigation from the begining if `true`. - * - * @property autoFocus - * @type Boolean - * @default false - * @for defaults - * @since 0.9.4 - **/ - autoFocus: false, - - /** - * Enables all steps from the begining if `true` (all steps are clickable). - * - * @property enableAllSteps - * @type Boolean - * @default false - * @for defaults - **/ - enableAllSteps: false, - - /** - * Enables keyboard navigation if `true` (arrow left and arrow right). - * - * @property enableKeyNavigation - * @type Boolean - * @default true - * @for defaults - **/ - enableKeyNavigation: true, - - /** - * Enables pagination if `true`. - * - * @property enablePagination - * @type Boolean - * @default true - * @for defaults - **/ - enablePagination: true, - - /** - * Suppresses pagination if a form field is focused. - * - * @property suppressPaginationOnFocus - * @type Boolean - * @default true - * @for defaults - **/ - suppressPaginationOnFocus: true, - - /** - * Enables cache for async loaded or iframe embedded content. - * - * @property enableContentCache - * @type Boolean - * @default true - * @for defaults - **/ - enableContentCache: true, - - /** - * Shows the cancel button if enabled. - * - * @property enableCancelButton - * @type Boolean - * @default false - * @for defaults - **/ - enableCancelButton: false, - - /** - * Shows the finish button if enabled. - * - * @property enableFinishButton - * @type Boolean - * @default true - * @for defaults - **/ - enableFinishButton: true, - - /** - * Not yet implemented. - * - * @property preloadContent - * @type Boolean - * @default false - * @for defaults - **/ - preloadContent: false, - - /** - * Shows the finish button always (on each step; right beside the next button) if `true`. - * Otherwise the next button will be replaced by the finish button if the last step becomes active. - * - * @property showFinishButtonAlways - * @type Boolean - * @default false - * @for defaults - **/ - showFinishButtonAlways: false, - - /** - * Prevents jumping to a previous step. - * - * @property forceMoveForward - * @type Boolean - * @default false - * @for defaults - **/ - forceMoveForward: false, - - /** - * Saves the current state (step position) to a cookie. - * By coming next time the last active step becomes activated. - * - * @property saveState - * @type Boolean - * @default false - * @for defaults - **/ - saveState: false, - - /** - * The position to start on (zero-based). - * - * @property startIndex - * @type Integer - * @default 0 - * @for defaults - **/ - startIndex: 0, - - /* - * Animation Effect Configuration - */ - - /** - * The animation effect which will be used for step transitions. - * - * @property transitionEffect - * @type transitionEffect - * @default none - * @for defaults - **/ - transitionEffect: transitionEffect.none, - - /** - * Animation speed for step transitions (in milliseconds). - * - * @property transitionEffectSpeed - * @type Integer - * @default 200 - * @for defaults - **/ - transitionEffectSpeed: 200, - - /* - * Events - */ - - /** - * Fires before the step changes and can be used to prevent step changing by returning `false`. - * Very useful for form validation. - * - * @property onStepChanging - * @type Event - * @default function (event, currentIndex, newIndex) { return true; } - * @for defaults - **/ - onStepChanging: function (event, currentIndex, newIndex) { return true; }, - - /** - * Fires after the step has change. - * - * @property onStepChanged - * @type Event - * @default function (event, currentIndex, priorIndex) { } - * @for defaults - **/ - onStepChanged: function (event, currentIndex, priorIndex) { }, - - /** - * Fires after cancelation. - * - * @property onCanceled - * @type Event - * @default function (event) { } - * @for defaults - **/ - onCanceled: function (event) { }, - - /** - * Fires before finishing and can be used to prevent completion by returning `false`. - * Very useful for form validation. - * - * @property onFinishing - * @type Event - * @default function (event, currentIndex) { return true; } - * @for defaults - **/ - onFinishing: function (event, currentIndex) { return true; }, - - /** - * Fires after completion. - * - * @property onFinished - * @type Event - * @default function (event, currentIndex) { } - * @for defaults - **/ - onFinished: function (event, currentIndex) { }, - - /** - * Fires after async content is loaded. - * - * @property onContentLoaded - * @type Event - * @default function (event, index) { } - * @for defaults - **/ - onContentLoaded: function (event, currentIndex) { }, - - /** - * Fires when the wizard is initialized. - * - * @property onInit - * @type Event - * @default function (event) { } - * @for defaults - **/ - onInit: function (event, currentIndex) { }, - - /** - * Contains all labels. - * - * @property labels - * @type Object - * @for defaults - **/ - labels: { - /** - * Label for the cancel button. - * - * @property cancel - * @type String - * @default "Cancel" - * @for defaults - **/ - cancel: "取消", - - /** - * This label is important for accessability reasons. - * Indicates which step is activated. - * - * @property current - * @type String - * @default "current step:" - * @for defaults - **/ - current: "当前步骤::", - - /** - * This label is important for accessability reasons and describes the kind of navigation. - * - * @property pagination - * @type String - * @default "Pagination" - * @for defaults - * @since 0.9.7 - **/ - pagination: "分页", - - /** - * Label for the finish button. - * - * @property finish - * @type String - * @default "Finish" - * @for defaults - **/ - finish: "完成", - - /** - * Label for the next button. - * - * @property next - * @type String - * @default "Next" - * @for defaults - **/ - next: "下一步", - - /** - * Label for the previous button. - * - * @property previous - * @type String - * @default "Previous" - * @for defaults - **/ - previous: "上一步", - - /** - * Label for the loading animation. - * - * @property loading - * @type String - * @default "Loading ..." - * @for defaults - **/ - loading: "加载中 ..." - } -}; -})(jQuery); \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.min.js b/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.min.js deleted file mode 100644 index 8e617bf9..00000000 --- a/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * jQuery Steps v1.1.0 - 09/04/2014 - * Copyright (c) 2014 Rafael Staib (http://www.jquery-steps.com) - * Licensed under MIT http://www.opensource.org/licenses/MIT - */ -(function($,undefined){$.fn.extend({_aria:function(name,value){return this.attr("aria-"+name,value)},_removeAria:function(name){return this.removeAttr("aria-"+name)},_enableAria:function(enable){return(enable==null||enable)?this.removeClass("disabled")._aria("disabled","false"):this.addClass("disabled")._aria("disabled","true")},_showAria:function(show){return(show==null||show)?this.show()._aria("hidden","false"):this.hide()._aria("hidden","true")},_selectAria:function(select){return(select==null||select)?this.addClass("current")._aria("selected","true"):this.removeClass("current")._aria("selected","false")},_id:function(id){return(id)?this.attr("id",id):this.attr("id")}});if(!String.prototype.format){String.prototype.format=function(){var args=(arguments.length===1&&$.isArray(arguments[0]))?arguments[0]:arguments;var formattedString=this;for(var i=0;i<args.length;i++){var pattern=new RegExp("\\{"+i+"\\}","gm");formattedString=formattedString.replace(pattern,args[i])}return formattedString}}var _uniqueId=0;var _cookiePrefix="jQu3ry_5teps_St@te_";var _tabSuffix="-t-";var _tabpanelSuffix="-p-";var _titleSuffix="-h-";var _indexOutOfRangeErrorMessage="Index out of range.";var _missingCorrespondingElementErrorMessage="One or more corresponding step {0} are missing.";function addStepToCache(wizard,step){getSteps(wizard).push(step)}function analyzeData(wizard,options,state){var stepTitles=wizard.children(options.headerTag),stepContents=wizard.children(options.bodyTag);if(stepTitles.length>stepContents.length){throwError(_missingCorrespondingElementErrorMessage,"contents")}else{if(stepTitles.length<stepContents.length){throwError(_missingCorrespondingElementErrorMessage,"titles")}}var startIndex=options.startIndex;state.stepCount=stepTitles.length;if(options.saveState&&$.cookie){var savedState=$.cookie(_cookiePrefix+getUniqueId(wizard));var savedIndex=parseInt(savedState,0);if(!isNaN(savedIndex)&&savedIndex<state.stepCount){startIndex=savedIndex}}state.currentIndex=startIndex;stepTitles.each(function(index){var item=$(this),content=stepContents.eq(index),modeData=content.data("mode"),mode=(modeData==null)?contentMode.html:getValidEnumValue(contentMode,(/^\s*$/.test(modeData)||isNaN(modeData))?modeData:parseInt(modeData,0)),contentUrl=(mode===contentMode.html||content.data("url")===undefined)?"":content.data("url"),contentLoaded=(mode!==contentMode.html&&content.data("loaded")==="1"),step=$.extend({},stepModel,{title:item.html(),content:(mode===contentMode.html)?content.html():"",contentUrl:contentUrl,contentMode:mode,contentLoaded:contentLoaded});addStepToCache(wizard,step)})}function cancel(wizard){wizard.triggerHandler("canceled")}function decreaseCurrentIndexBy(state,decreaseBy){return state.currentIndex-decreaseBy}function destroy(wizard,options){var eventNamespace=getEventNamespace(wizard);wizard.unbind(eventNamespace).removeData("uid").removeData("options").removeData("state").removeData("steps").removeData("eventNamespace").find(".actions a").unbind(eventNamespace);wizard.removeClass(options.clearFixCssClass+" vertical");var contents=wizard.find(".content > *");contents.removeData("loaded").removeData("mode").removeData("url");contents.removeAttr("id").removeAttr("role").removeAttr("tabindex").removeAttr("class").removeAttr("style")._removeAria("labelledby")._removeAria("hidden");wizard.find(".content > [data-mode='async'],.content > [data-mode='iframe']").empty();var wizardSubstitute=$('<{0} class="{1}"></{0}>'.format(wizard.get(0).tagName,wizard.attr("class")));var wizardId=wizard._id();if(wizardId!=null&&wizardId!==""){wizardSubstitute._id(wizardId)}wizardSubstitute.html(wizard.find(".content").html());wizard.after(wizardSubstitute);wizard.remove();return wizardSubstitute}function finishStep(wizard,state){var currentStep=wizard.find(".steps li").eq(state.currentIndex);if(wizard.triggerHandler("finishing",[state.currentIndex])){currentStep.addClass("done").removeClass("error");wizard.triggerHandler("finished",[state.currentIndex])}else{currentStep.addClass("error")}}function getEventNamespace(wizard){var eventNamespace=wizard.data("eventNamespace");if(eventNamespace==null){eventNamespace="."+getUniqueId(wizard);wizard.data("eventNamespace",eventNamespace)}return eventNamespace}function getStepAnchor(wizard,index){var uniqueId=getUniqueId(wizard);return wizard.find("#"+uniqueId+_tabSuffix+index)}function getStepPanel(wizard,index){var uniqueId=getUniqueId(wizard);return wizard.find("#"+uniqueId+_tabpanelSuffix+index)}function getStepTitle(wizard,index){var uniqueId=getUniqueId(wizard);return wizard.find("#"+uniqueId+_titleSuffix+index)}function getOptions(wizard){return wizard.data("options")}function getState(wizard){return wizard.data("state")}function getSteps(wizard){return wizard.data("steps")}function getStep(wizard,index){var steps=getSteps(wizard);if(index<0||index>=steps.length){throwError(_indexOutOfRangeErrorMessage)}return steps[index]}function getUniqueId(wizard){var uniqueId=wizard.data("uid");if(uniqueId==null){uniqueId=wizard._id();if(uniqueId==null){uniqueId="steps-uid-".concat(_uniqueId);wizard._id(uniqueId)}_uniqueId++;wizard.data("uid",uniqueId)}return uniqueId}function getValidEnumValue(enumType,keyOrValue){validateArgument("enumType",enumType);validateArgument("keyOrValue",keyOrValue);if(typeof keyOrValue==="string"){var value=enumType[keyOrValue];if(value===undefined){throwError("The enum key '{0}' does not exist.",keyOrValue)}return value}else{if(typeof keyOrValue==="number"){for(var key in enumType){if(enumType[key]===keyOrValue){return keyOrValue}}throwError("Invalid enum value '{0}'.",keyOrValue)}else{throwError("Invalid key or value type.")}}}function goToNextStep(wizard,options,state){return paginationClick(wizard,options,state,increaseCurrentIndexBy(state,1))}function goToPreviousStep(wizard,options,state){return paginationClick(wizard,options,state,decreaseCurrentIndexBy(state,1))}function goToStep(wizard,options,state,index){if(index<0||index>=state.stepCount){throwError(_indexOutOfRangeErrorMessage)}if(options.forceMoveForward&&index<state.currentIndex){return}var oldIndex=state.currentIndex;if(wizard.triggerHandler("stepChanging",[state.currentIndex,index])){state.currentIndex=index;saveCurrentStateToCookie(wizard,options,state);refreshStepNavigation(wizard,options,state,oldIndex);refreshPagination(wizard,options,state);loadAsyncContent(wizard,options,state);startTransitionEffect(wizard,options,state,index,oldIndex,function(){wizard.triggerHandler("stepChanged",[index,oldIndex])})}else{wizard.find(".steps li").eq(oldIndex).addClass("error")}return true}function increaseCurrentIndexBy(state,increaseBy){return state.currentIndex+increaseBy}function initialize(options){var opts=$.extend(true,{},defaults,options);return this.each(function(){var wizard=$(this);var state={currentIndex:opts.startIndex,currentStep:null,stepCount:0,transitionElement:null};wizard.data("options",opts);wizard.data("state",state);wizard.data("steps",[]);analyzeData(wizard,opts,state);render(wizard,opts,state);registerEvents(wizard,opts);if(opts.autoFocus&&_uniqueId===0){getStepAnchor(wizard,opts.startIndex).focus()}wizard.triggerHandler("init",[opts.startIndex])})}function insertStep(wizard,options,state,index,step){if(index<0||index>state.stepCount){throwError(_indexOutOfRangeErrorMessage)}step=$.extend({},stepModel,step);insertStepToCache(wizard,index,step);if(state.currentIndex!==state.stepCount&&state.currentIndex>=index){state.currentIndex++;saveCurrentStateToCookie(wizard,options,state)}state.stepCount++;var contentContainer=wizard.find(".content"),header=$("<{0}>{1}</{0}>".format(options.headerTag,step.title)),body=$("<{0}></{0}>".format(options.bodyTag));if(step.contentMode==null||step.contentMode===contentMode.html){body.html(step.content)}if(index===0){contentContainer.prepend(body).prepend(header)}else{getStepPanel(wizard,(index-1)).after(body).after(header)}renderBody(wizard,state,body,index);renderTitle(wizard,options,state,header,index);refreshSteps(wizard,options,state,index);if(index===state.currentIndex){refreshStepNavigation(wizard,options,state)}refreshPagination(wizard,options,state);return wizard}function insertStepToCache(wizard,index,step){getSteps(wizard).splice(index,0,step)}function keyUpHandler(event){var wizard=$(this),options=getOptions(wizard),state=getState(wizard);if(options.suppressPaginationOnFocus&&wizard.find(":focus").is(":input")){event.preventDefault();return false}var keyCodes={left:37,right:39};if(event.keyCode===keyCodes.left){event.preventDefault();goToPreviousStep(wizard,options,state)}else{if(event.keyCode===keyCodes.right){event.preventDefault();goToNextStep(wizard,options,state)}}}function loadAsyncContent(wizard,options,state){if(state.stepCount>0){var currentIndex=state.currentIndex,currentStep=getStep(wizard,currentIndex);if(!options.enableContentCache||!currentStep.contentLoaded){switch(getValidEnumValue(contentMode,currentStep.contentMode)){case contentMode.iframe:wizard.find(".content > .body").eq(state.currentIndex).empty().html('<iframe src="'+currentStep.contentUrl+'" frameborder="0" scrolling="no" />').data("loaded","1");break;case contentMode.async:var currentStepContent=getStepPanel(wizard,currentIndex)._aria("busy","true").empty().append(renderTemplate(options.loadingTemplate,{text:options.labels.loading}));$.ajax({url:currentStep.contentUrl,cache:false}).done(function(data){currentStepContent.empty().html(data)._aria("busy","false").data("loaded","1");wizard.triggerHandler("contentLoaded",[currentIndex])});break}}}}function paginationClick(wizard,options,state,index){var oldIndex=state.currentIndex;if(index>=0&&index<state.stepCount&&!(options.forceMoveForward&&index<state.currentIndex)){var anchor=getStepAnchor(wizard,index),parent=anchor.parent(),isDisabled=parent.hasClass("disabled");parent._enableAria();anchor.click();if(oldIndex===state.currentIndex&&isDisabled){parent._enableAria(false);return false}return true}return false}function paginationClickHandler(event){event.preventDefault();var anchor=$(this),wizard=anchor.parent().parent().parent().parent(),options=getOptions(wizard),state=getState(wizard),href=anchor.attr("href");switch(href.substring(href.lastIndexOf("#")+1)){case"cancel":cancel(wizard);break;case"finish":finishStep(wizard,state);break;case"next":goToNextStep(wizard,options,state);break;case"previous":goToPreviousStep(wizard,options,state);break}}function refreshPagination(wizard,options,state){if(options.enablePagination){var finish=wizard.find(".actions a[href$='#finish']").parent(),next=wizard.find(".actions a[href$='#next']").parent();if(!options.forceMoveForward){var previous=wizard.find(".actions a[href$='#previous']").parent();previous._enableAria(state.currentIndex>0)}if(options.enableFinishButton&&options.showFinishButtonAlways){finish._enableAria(state.stepCount>0);next._enableAria(state.stepCount>1&&state.stepCount>(state.currentIndex+1))}else{finish._showAria(options.enableFinishButton&&state.stepCount===(state.currentIndex+1));next._showAria(state.stepCount===0||state.stepCount>(state.currentIndex+1))._enableAria(state.stepCount>(state.currentIndex+1)||!options.enableFinishButton)}}}function refreshStepNavigation(wizard,options,state,oldIndex){var currentOrNewStepAnchor=getStepAnchor(wizard,state.currentIndex),currentInfo=$('<span class="current-info audible">'+options.labels.current+" </span>"),stepTitles=wizard.find(".content > .title");if(oldIndex!=null){var oldStepAnchor=getStepAnchor(wizard,oldIndex);oldStepAnchor.parent().addClass("done").removeClass("error")._selectAria(false);stepTitles.eq(oldIndex).removeClass("current").next(".body").removeClass("current");currentInfo=oldStepAnchor.find(".current-info");currentOrNewStepAnchor.focus()}currentOrNewStepAnchor.prepend(currentInfo).parent()._selectAria().removeClass("done")._enableAria();stepTitles.eq(state.currentIndex).addClass("current").next(".body").addClass("current")}function refreshSteps(wizard,options,state,index){var uniqueId=getUniqueId(wizard);for(var i=index;i<state.stepCount;i++){var uniqueStepId=uniqueId+_tabSuffix+i,uniqueBodyId=uniqueId+_tabpanelSuffix+i,uniqueHeaderId=uniqueId+_titleSuffix+i,title=wizard.find(".title").eq(i)._id(uniqueHeaderId);wizard.find(".steps a").eq(i)._id(uniqueStepId)._aria("controls",uniqueBodyId).attr("href","#"+uniqueHeaderId).html(renderTemplate(options.titleTemplate,{index:i+1,title:title.html()}));wizard.find(".body").eq(i)._id(uniqueBodyId)._aria("labelledby",uniqueHeaderId)}}function registerEvents(wizard,options){var eventNamespace=getEventNamespace(wizard);wizard.bind("canceled"+eventNamespace,options.onCanceled);wizard.bind("contentLoaded"+eventNamespace,options.onContentLoaded);wizard.bind("finishing"+eventNamespace,options.onFinishing);wizard.bind("finished"+eventNamespace,options.onFinished);wizard.bind("init"+eventNamespace,options.onInit);wizard.bind("stepChanging"+eventNamespace,options.onStepChanging);wizard.bind("stepChanged"+eventNamespace,options.onStepChanged);if(options.enableKeyNavigation){wizard.bind("keyup"+eventNamespace,keyUpHandler)}wizard.find(".actions a").bind("click"+eventNamespace,paginationClickHandler)}function removeStep(wizard,options,state,index){if(index<0||index>=state.stepCount||state.currentIndex===index){return false}removeStepFromCache(wizard,index);if(state.currentIndex>index){state.currentIndex--;saveCurrentStateToCookie(wizard,options,state)}state.stepCount--;getStepTitle(wizard,index).remove();getStepPanel(wizard,index).remove();getStepAnchor(wizard,index).parent().remove();if(index===0){wizard.find(".steps li").first().addClass("first")}if(index===state.stepCount){wizard.find(".steps li").eq(index).addClass("last")}refreshSteps(wizard,options,state,index);refreshPagination(wizard,options,state);return true}function removeStepFromCache(wizard,index){getSteps(wizard).splice(index,1)}function render(wizard,options,state){var wrapperTemplate='<{0} class="{1}">{2}</{0}>',orientation=getValidEnumValue(stepsOrientation,options.stepsOrientation),verticalCssClass=(orientation===stepsOrientation.vertical)?" vertical":"",contentWrapper=$(wrapperTemplate.format(options.contentContainerTag,"content "+options.clearFixCssClass,wizard.html())),stepsWrapper=$(wrapperTemplate.format(options.stepsContainerTag,"steps "+options.clearFixCssClass,'<ul role="tablist"></ul>')),stepTitles=contentWrapper.children(options.headerTag),stepContents=contentWrapper.children(options.bodyTag);wizard.attr("role","application").empty().append(stepsWrapper).append(contentWrapper).addClass(options.cssClass+" "+options.clearFixCssClass+verticalCssClass);stepContents.each(function(index){renderBody(wizard,state,$(this),index)});stepTitles.each(function(index){renderTitle(wizard,options,state,$(this),index)});refreshStepNavigation(wizard,options,state);renderPagination(wizard,options,state)}function renderBody(wizard,state,body,index){var uniqueId=getUniqueId(wizard),uniqueBodyId=uniqueId+_tabpanelSuffix+index,uniqueHeaderId=uniqueId+_titleSuffix+index;body._id(uniqueBodyId).attr("role","tabpanel")._aria("labelledby",uniqueHeaderId).addClass("body")._showAria(state.currentIndex===index)}function renderPagination(wizard,options,state){if(options.enablePagination){var pagination='<{0} class="actions {1}"><ul role="menu" aria-label="{2}">{3}</ul></{0}>',buttonTemplate='<li><a href="#{0}" role="menuitem">{1}</a></li>',buttons="";if(!options.forceMoveForward){buttons+=buttonTemplate.format("previous",options.labels.previous)}buttons+=buttonTemplate.format("next",options.labels.next);if(options.enableFinishButton){buttons+=buttonTemplate.format("finish",options.labels.finish)}if(options.enableCancelButton){buttons+=buttonTemplate.format("cancel",options.labels.cancel)}wizard.append(pagination.format(options.actionContainerTag,options.clearFixCssClass,options.labels.pagination,buttons));refreshPagination(wizard,options,state);loadAsyncContent(wizard,options,state)}}function renderTemplate(template,substitutes){var matches=template.match(/#([a-z]*)#/gi);for(var i=0;i<matches.length;i++){var match=matches[i],key=match.substring(1,match.length-1);if(substitutes[key]===undefined){throwError("The key '{0}' does not exist in the substitute collection!",key)}template=template.replace(match,substitutes[key])}return template}function renderTitle(wizard,options,state,header,index){var uniqueId=getUniqueId(wizard),uniqueStepId=uniqueId+_tabSuffix+index,uniqueBodyId=uniqueId+_tabpanelSuffix+index,uniqueHeaderId=uniqueId+_titleSuffix+index,stepCollection=wizard.find(".steps > ul"),title=renderTemplate(options.titleTemplate,{index:index+1,title:header.html()}),stepItem=$('<li role="tab"><a id="'+uniqueStepId+'" href="#'+uniqueHeaderId+'" aria-controls="'+uniqueBodyId+'">'+title+"</a></li>");stepItem._enableAria(options.enableAllSteps||state.currentIndex>index);if(state.currentIndex>index){stepItem.addClass("done")}header._id(uniqueHeaderId).attr("tabindex","-1").addClass("title");if(index===0){stepCollection.prepend(stepItem)}else{stepCollection.find("li").eq(index-1).after(stepItem)}if(index===0){stepCollection.find("li").removeClass("first").eq(index).addClass("first")}if(index===(state.stepCount-1)){stepCollection.find("li").removeClass("last").eq(index).addClass("last")}stepItem.children("a").bind("click"+getEventNamespace(wizard),stepClickHandler)}function saveCurrentStateToCookie(wizard,options,state){if(options.saveState&&$.cookie){$.cookie(_cookiePrefix+getUniqueId(wizard),state.currentIndex)}}function startTransitionEffect(wizard,options,state,index,oldIndex,doneCallback){var stepContents=wizard.find(".content > .body"),effect=getValidEnumValue(transitionEffect,options.transitionEffect),effectSpeed=options.transitionEffectSpeed,newStep=stepContents.eq(index),currentStep=stepContents.eq(oldIndex);switch(effect){case transitionEffect.fade:case transitionEffect.slide:var hide=(effect===transitionEffect.fade)?"fadeOut":"slideUp",show=(effect===transitionEffect.fade)?"fadeIn":"slideDown";state.transitionElement=newStep;currentStep[hide](effectSpeed,function(){var wizard=$(this)._showAria(false).parent().parent(),state=getState(wizard);if(state.transitionElement){state.transitionElement[show](effectSpeed,function(){$(this)._showAria()}).promise().done(doneCallback);state.transitionElement=null}});break;case transitionEffect.slideLeft:var outerWidth=currentStep.outerWidth(true),posFadeOut=(index>oldIndex)?-(outerWidth):outerWidth,posFadeIn=(index>oldIndex)?outerWidth:-(outerWidth);$.when(currentStep.animate({left:posFadeOut},effectSpeed,function(){$(this)._showAria(false)}),newStep.css("left",posFadeIn+"px")._showAria().animate({left:0},effectSpeed)).done(doneCallback);break;default:$.when(currentStep._showAria(false),newStep._showAria()).done(doneCallback);break}}function stepClickHandler(event){event.preventDefault();var anchor=$(this),wizard=anchor.parent().parent().parent().parent(),options=getOptions(wizard),state=getState(wizard),oldIndex=state.currentIndex;if(anchor.parent().is(":not(.disabled):not(.current)")){var href=anchor.attr("href"),position=parseInt(href.substring(href.lastIndexOf("-")+1),0);goToStep(wizard,options,state,position)}if(oldIndex===state.currentIndex){getStepAnchor(wizard,oldIndex).focus();return false}}function throwError(message){if(arguments.length>1){message=message.format(Array.prototype.slice.call(arguments,1))}throw new Error(message)}function validateArgument(argumentName,argumentValue){if(argumentValue==null){throwError("The argument '{0}' is null or undefined.",argumentName)}}$.fn.steps=function(method){if($.fn.steps[method]){return $.fn.steps[method].apply(this,Array.prototype.slice.call(arguments,1))}else{if(typeof method==="object"||!method){return initialize.apply(this,arguments)}else{$.error("Method "+method+" does not exist on jQuery.steps")}}};$.fn.steps.add=function(step){var state=getState(this);return insertStep(this,getOptions(this),state,state.stepCount,step)};$.fn.steps.destroy=function(){return destroy(this,getOptions(this))};$.fn.steps.finish=function(){finishStep(this,getState(this))};$.fn.steps.getCurrentIndex=function(){return getState(this).currentIndex};$.fn.steps.getCurrentStep=function(){return getStep(this,getState(this).currentIndex)};$.fn.steps.getStep=function(index){return getStep(this,index)};$.fn.steps.insert=function(index,step){return insertStep(this,getOptions(this),getState(this),index,step)};$.fn.steps.next=function(){return goToNextStep(this,getOptions(this),getState(this))};$.fn.steps.previous=function(){return goToPreviousStep(this,getOptions(this),getState(this))};$.fn.steps.remove=function(index){return removeStep(this,getOptions(this),getState(this),index)};$.fn.steps.setStep=function(index,step){throw new Error("Not yet implemented!")};$.fn.steps.skip=function(count){throw new Error("Not yet implemented!")};var contentMode=$.fn.steps.contentMode={html:0,iframe:1,async:2};var stepsOrientation=$.fn.steps.stepsOrientation={horizontal:0,vertical:1};var transitionEffect=$.fn.steps.transitionEffect={none:0,fade:1,slide:2,slideLeft:3};var stepModel=$.fn.steps.stepModel={title:"",content:"",contentUrl:"",contentMode:contentMode.html,contentLoaded:false};var defaults=$.fn.steps.defaults={headerTag:"h1",bodyTag:"div",contentContainerTag:"div",actionContainerTag:"div",stepsContainerTag:"div",cssClass:"wizard",clearFixCssClass:"clearfix",stepsOrientation:stepsOrientation.horizontal,titleTemplate:'<span class="number">#index#.</span> #title#',loadingTemplate:'<span class="spinner"></span> #text#',autoFocus:false,enableAllSteps:false,enableKeyNavigation:true,enablePagination:true,suppressPaginationOnFocus:true,enableContentCache:true,enableCancelButton:false,enableFinishButton:true,preloadContent:false,showFinishButtonAlways:false,forceMoveForward:false,saveState:false,startIndex:0,transitionEffect:transitionEffect.none,transitionEffectSpeed:200,onStepChanging:function(event,currentIndex,newIndex){return true},onStepChanged:function(event,currentIndex,priorIndex){},onCanceled:function(event){},onFinishing:function(event,currentIndex){return true},onFinished:function(event,currentIndex){},onContentLoaded:function(event,currentIndex){},onInit:function(event,currentIndex){},labels:{cancel:"取消",current:"当前步骤::",pagination:"分页",finish:"完成",next:"下一步",previous:"上一步",loading:"加载中 ..."}}})(jQuery); \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/templates/demo/form/wizard.html b/ruoyi-admin/src/main/resources/templates/demo/form/wizard.html index 428f330e..beb1a360 100644 --- a/ruoyi-admin/src/main/resources/templates/demo/form/wizard.html +++ b/ruoyi-admin/src/main/resources/templates/demo/form/wizard.html @@ -1,192 +1,332 @@ <!DOCTYPE html> <html lang="zh"> <head> - <th:block th:include="include :: header('基本表单')" /> - <th:block th:include="include :: jquery-steps-css" /> +<th:block th:include="include :: header('基本表单')" /> +<th:block th:include="include :: jquery-smartwizard-css" /> +<style type="text/css"> +/* 如果要让工具栏固定在页面底部,使用下面的样式,不需要的可以注释 */ +.sw>.toolbar-bottom{ + z-index: 100; + bottom: 0px; + left: 0; + width: 100%; + position: fixed; + text-align: right; + background: #fff; + box-shadow: 0 -2px 6px 1px hsla(223,8%,83%,.5); + border-top: 1px solid #e3e4e8; +} +/* 如果设置了是否自动调节高度为false,需要加滚动条 */ +.sw>.tab-content{ + overflow-x: hidden; + overflow-y: auto; +} +</style> </head> <body class="gray-bg"> - <div class="wrapper wrapper-content animated fadeInRight"> - <div class="row"> - <div class="col-sm-5"> - <div class="jumbotron"> - <h1>表单向导</h1> - <p>Smart UI 部件允许您快速创建表单向导接口。</p> - <p><a href="https://github.com/rstaib/jquery-steps" target="_blank" class="btn btn-primary btn-lg" role="button">了解 jQuery Steps</a> - </p> - </div> - </div> - <div class="col-sm-7"> - <div class="ibox float-e-margins"> - <div class="ibox-title"> - <h5>基础表单向导</h5> - </div> - <div class="ibox-content"> - <p> - 这是一个简单的表单向导示例 - </p> - <div id="wizard"> - <h1>第一步</h1> - <div class="step-content"> - <div class="text-center m-t-md"> - <h2>第一步</h2> - <p> - 这是第一步的内容 - </p> - </div> - </div> + <div class="wrapper wrapper-content animated fadeInRight" style="height: 100%;"> + <div class="row"> + <div class="col-sm-12"> + <div class="ibox"> + <div class="ibox-title"> + <h5> + 表单向导 + <small>https://github.com/techlab/jquery-smartwizard</small> + </h5> + </div> + <div class="ibox-content"> + <div class="row select-list" style="padding-left: 15px; margin-bottom: 10px;"> + <ul> + <li> + 选择样式: + <select id="theme-selector"> + <option value="default">Default</option> + <option value="arrows" selected>Arrows</option> + <option value="dots">Dots</option> + <option value="progress">Progress</option> + </select> + </li> + <!-- 快速操作栏按钮 --> + <li> + <div class="btn-group-sm" role="group"> + <a class="btn btn-info" id="prev-btn"> 上一步 </a> + <a class="btn btn-success" id="next-btn"> 下一步 </a> + <a class="btn btn-danger" id="reset-btn"> 重置 </a> + </div> + </li> + </ul> - <h1>第二步</h1> - <div class="step-content"> - <div class="text-center m-t-md"> - <h2>第二步</h2> - <p> - 这是第二步的内容 - </p> - </div> - </div> + </div> + <div id="smartwizard"> + <ul class="nav"> + <li class="nav-item"> + <a class="nav-link" href="#step-1"> 第一步 </a> + </li> + <li class="nav-item"> + <a class="nav-link" href="#step-2"> 第二步 </a> + </li> + <li class="nav-item"> + <a class="nav-link" href="#step-3"> 第三步 </a> + </li> + <li class="nav-item"> + <a class="nav-link" href="#step-4"> 第四步 </a> + </li> + </ul> + <div class="tab-content"> + <div id="step-1" class="tab-pane" role="tabpanel" aria-labelledby="step-1"> + <div> + <form class="form form-horizontal m-t"> + <div class="form-group"> + <label class="col-sm-3 control-label">姓氏:</label> + <div class="col-sm-8"> + <input id="firstname" name="firstname" class="form-control" type="text"> + <span class="help-block m-b-none"> + <i class="fa fa-info-circle"></i> + 这里写点提示的内容 + </span> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label is-required">名字:</label> + <div class="col-sm-8"> + <input id="lastname" name="lastname" class="form-control" type="text" required> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label is-required">用户名:</label> + <div class="col-sm-8"> + <input id="username" name="username" class="form-control" type="text" required> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">密码:</label> + <div class="col-sm-8"> + <input id="password" name="password" class="form-control" type="password"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">确认密码:</label> + <div class="col-sm-8"> + <input id="confirm_password" name="confirm_password" class="form-control" type="password"> + <span class="help-block m-b-none"> + <i class="fa fa-info-circle"></i> + 请再次输入您的密码 + </span> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">E-mail:</label> + <div class="col-sm-8"> + <input id="email" name="email" class="form-control" type="email"> + </div> + </div> + </form> + </div> + </div> + <div id="step-2" class="tab-pane" role="tabpanel" aria-labelledby="step-2"> + <div> + <form class="form form-horizontal m-t"> + <div class="form-group"> + <label class="col-sm-3 control-label">性别:</label> + <div class="col-sm-8"> + <select name="sex" class="form-control m-b" th:with="type=${@dict.getType('sys_user_sex')}"> + <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option> + </select> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">时间:</label> + <div class="col-sm-8"> + <input id="time" name="time" class="form-control time-input" type="text"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">状态:</label> + <div class="col-sm-8"> + <div class="radio-box" th:each="dict : ${@dict.getType('sys_normal_disable')}"> + <input type="radio" th:id="${dict.dictCode}" name="status" th:value="${dict.dictValue}" th:checked="${dict.default}"> + <label th:for="${dict.dictCode}" th:text="${dict.dictLabel}"></label> + </div> + </div> + </div> + </form> + </div> + </div> + <div id="step-3" class="tab-pane" role="tabpanel" aria-labelledby="step-3"> + <div class="m-t-md"> + <p>1、如果需要工具栏在页面底部显示, 将style中下面的部分取消注释<blockquote>.sw>.toolbar-bottom </blockquote></p> + <p>2、如果设置了自动调节高度为false, 将style中下面的部分取消注释<blockquote>.sw>.tab-content </blockquote></p> + <p>3、工具栏的按钮样式会被表单插件中.btn样式覆盖导致bootstrap中的按钮样式无效, 如果需要改变按钮样式可以自己定义并提高优先级</blockquote></p> + </div> + </div> + <div id="step-4" class="tab-pane" role="tabpanel" aria-labelledby="step-4"> + <div class="m-t-md"> + <h3>测试多行显示</h3> + <pre style="overflow-x: hidden;"> +$('#smartwizard').smartWizard({ + selected: 0, // Initial selected step, 0 = first step + theme: 'default', // theme for the wizard, related css need to include for other than default theme + justified: true, // Nav menu justification. true/false + darkMode:false, // Enable/disable Dark Mode if the theme supports. true/false + autoAdjustHeight: true, // Automatically adjust content height + cycleSteps: false, // Allows to cycle the navigation of steps + backButtonSupport: true, // Enable the back button support + enableURLhash: true, // Enable selection of the step based on url hash + transition: { + animation: 'none', // Effect on navigation, none/fade/slide-horizontal/slide-vertical/slide-swing + speed: '400', // Transion animation speed + easing:'' // Transition animation easing. Not supported without a jQuery easing plugin + }, + toolbarSettings: { + toolbarPosition: 'bottom', // none, top, bottom, both + toolbarButtonPosition: 'right', // left, right, center + showNextButton: true, // show/hide a Next button + showPreviousButton: true, // show/hide a Previous button + toolbarExtraButtons: [] // Extra buttons to show on toolbar, array of jQuery input/buttons elements + }, + anchorSettings: { + anchorClickable: true, // Enable/Disable anchor navigation + enableAllAnchors: false, // Activates all anchors clickable all times + markDoneStep: true, // Add done state on navigation + markAllPreviousStepsAsDone: true, // When a step selected by url hash, all previous steps are marked done + removeDoneStepOnNavigateBack: false, // While navigate back done step after active step will be cleared + enableAnchorOnDoneStep: true // Enable/Disable the done steps navigation + }, + keyboardSettings: { + keyNavigation: true, // Enable/Disable keyboard navigation(left and right keys are used if enabled) + keyLeft: [37], // Left key code + keyRight: [39] // Right key code + }, + lang: { // Language variables for button + next: 'Next', + previous: 'Previous' + }, + disabledSteps: [], // Array Steps disabled + errorSteps: [], // Highlight step with errors + hiddenSteps: [] // Hidden steps +}); + </pre> + </div> + </div> + </div> + </div> + </div> + </div> + </div> - <h1>第三步</h1> - <div class="step-content"> - <div class="text-center m-t-md"> - <h2>第三步</h2> - <p> - 这是第三步的内容 - </p> - </div> - </div> - </div> + </div> + </div> + <th:block th:include="include :: footer" /> + <th:block th:include="include :: jquery-smartwizard-js" /> + <script> + $(document).ready(function() { + // 工具栏按钮 + var btnFinish = $('<a id="btn-finish"></a>').text('完成') + .addClass('btn btn-info') + .on('click', function(){ submit(); }); + var btnCancel = $('<a id="btn-cancel"></a>').text('取消') + .addClass('btn btn-danger') + .on('click', function(){ $('#smartwizard').smartWizard("reset"); }); + // 下面两个按钮是为了因为插件默认的是botton,这里换成<a>,也可以选择用样式替换,或者不替换 + var btnNext = $('<a id="btn-next"></a>').text('下一步') + .addClass('btn btn-info') + .on('click', function(){ $('#smartwizard').smartWizard("next");}); + var btnPrev = $('<a id="btn-prev"></a>').text('上一步') + .addClass('btn btn-success disabled') + .on('click', function(){ $('#smartwizard').smartWizard("prev"); }); + // 初始化表单向导组件 + $('#smartwizard').smartWizard({ + theme: 'arrows', // default, arrows, dots, progress + autoAdjustHeight : false, // 自动调整高度, 默认true + enableURLhash:false, //开启URL hash,开启后点击浏览器前进后退按钮会执行下一步和上一步操作 + transition: { + animation: 'slide-horizontal', // Effect on navigation, none/fade/slide-horizontal/slide-vertical/slide-swing + }, + toolbarSettings: { + showNextButton: false,// 因为上面自定义了下一步按钮, 所以隐藏掉插件自带的按钮, 如果不使用自定义按钮, 需要改为true或者去掉该属性 + showPreviousButton: false,// 因为上面自定义了上一步按钮, 所以隐藏掉插件自带的按钮, 如果不使用自定义按钮, 需要改为true或者去掉该属性 + toolbarExtraButtons: [btnCancel,btnPrev,btnNext,btnFinish]// 扩展的按钮集合 + } + }); + }); + + function submit(){ + var data = {}; + $('.form').each(function (index, form){ + // 这里可以使用$.common.formToJSON(formId); 需要在form上加id + $.each($(form).serializeArray(), function(i, field) { + if(data[field.name]) { + data[field.name] += ("," + field.value); + } else { + data[field.name] = field.value; + } + }); + }); + alert(JSON.stringify(data)) + } + // 显示步骤时将触发事件 + $("#smartwizard").on("showStep", function(e, anchorObject, stepNumber, stepDirection, stepPosition) { + // 下面按钮是快速操作栏的 + $("#prev-btn").removeClass('disabled'); + $("#next-btn").removeClass('disabled'); + // 下面按钮是工具栏的 + $("#btn-prev").removeClass('disabled'); + $("#btn-next").removeClass('disabled'); + $("#btn-finish").removeClass('disabled'); + if(stepPosition === 'first') { + $("#prev-btn").addClass('disabled');// 快速操作栏(演示用) + $("#btn-prev").addClass('disabled'); + $("#btn-finish").addClass('disabled'); + } else if(stepPosition === 'last') { + $("#next-btn").addClass('disabled');// 快速操作栏(演示用) + $("#btn-next").addClass('disabled'); + } else { + $("#prev-btn").removeClass('disabled');// 快速操作栏(演示用) + $("#next-btn").removeClass('disabled');// 快速操作栏(演示用) + $("#btn-prev").removeClass('disabled'); + $("#btn-next").removeClass('disabled'); + $("#btn-finish").addClass('disabled'); + } + }); + + // 该事件在离开某个步骤之前触发 + $("#smartwizard").on("leaveStep", function(e, anchorObject, currentStepNumber, nextStepNumber, stepDirection) { + if(stepDirection == 'forward'){ + var form = $("#step-" + (currentStepNumber + 1)).find('.form'); + if(form.length > 0){ + return form.validate().form(); + } + return true; + } + return true; + }); + + $("#theme-selector").on("change", function() { + // Change theme + var options = { + theme : $(this).val() + }; + $('#smartwizard').smartWizard("setOptions", options); + return true; + }); - </div> - </div> - </div> - </div> - <div class="row"> - <div class="col-sm-12"> - <div class="ibox"> - <div class="ibox-title"> - <h5>带验证的表单向导</h5> - </div> - <div class="ibox-content"> - <h2> - 带验证的表单向导 - </h2> - <p> - 下面这个示例展示了如何在表单向导中使用 jQuery Validation 插件 - </p> + $("#reset-btn").on("click", function() { + // Reset wizard + $('#smartwizard').smartWizard("reset"); + return true; + }); - <form id="form" action="" class="wizard-big"> - <h1>账户</h1> - <fieldset> - <h2>账户信息</h2> - <div class="row"> - <div class="col-sm-8"> - <div class="form-group"> - <label>用户名 *</label> - <input id="userName" name="userName" type="text" class="form-control required"> - </div> - <div class="form-group"> - <label>密码 *</label> - <input id="password" name="password" type="text" class="form-control required"> - </div> - <div class="form-group"> - <label>确认密码 *</label> - <input id="confirm" name="confirm" type="text" class="form-control required"> - </div> - </div> - <div class="col-sm-4"> - <div class="text-center"> - <div style="margin-top: 20px"> - <i class="fa fa-sign-in" style="font-size: 180px;color: #e5e5e5 "></i> - </div> - </div> - </div> - </div> + $("#prev-btn").on("click", function() { + // Navigate previous + $('#smartwizard').smartWizard("prev"); + return true; + }); - </fieldset> - <h1>个人资料</h1> - <fieldset> - <h2>个人资料信息</h2> - <div class="row"> - <div class="col-sm-6"> - <div class="form-group"> - <label>姓名 *</label> - <input id="name" name="name" type="text" class="form-control required"> - </div> - </div> - <div class="col-sm-6"> - <div class="form-group"> - <label>Email *</label> - <input id="email" name="email" type="text" class="form-control required email"> - </div> - <div class="form-group"> - <label>地址 *</label> - <input id="address" name="address" type="text" class="form-control"> - </div> - </div> - </div> - </fieldset> - - <h1>警告</h1> - <fieldset> - <div class="text-center" style="margin-top: 120px"> - <h2>你是火星人 :-)</h2> - </div> - </fieldset> - - <h1>完成</h1> - <fieldset> - <h2>条款</h2> - <input id="acceptTerms" name="acceptTerms" type="checkbox" class="required"> - <label for="acceptTerms">我同意注册条款</label> - </fieldset> - </form> - </div> - </div> - </div> - - </div> - </div> - <th:block th:include="include :: footer" /> - <th:block th:include="include :: jquery-steps-js" /> - <script> - $(document).ready(function () { - $("#wizard").steps(); - $("#form").steps({ - bodyTag: "fieldset", onStepChanging: function (event, currentIndex, newIndex) { - if (currentIndex > newIndex) { - return true - } - if (newIndex === 3 && Number($("#age").val()) < 18) { - return false - } - var form = $(this); - if (currentIndex < newIndex) { - $(".body:eq(" + newIndex + ") label.error", form).remove(); - $(".body:eq(" + newIndex + ") .error", form).removeClass("error") - } - form.validate().settings.ignore = ":disabled,:hidden"; - return form.valid() - }, onStepChanged: function (event, currentIndex, priorIndex) { - if (currentIndex === 2 && Number($("#age").val()) >= 18) { - $(this).steps("next") - } - if (currentIndex === 2 && priorIndex === 3) { - $(this).steps("previous") - } - }, onFinishing: function (event, currentIndex) { - var form = $(this); - form.validate().settings.ignore = ":disabled"; - return form.valid() - }, onFinished: function (event, currentIndex) { - var form = $(this); - form.submit() - } - }).validate({ - errorPlacement: function (error, element) { - element.before(error) - }, rules: {confirm: {equalTo: "#password"}} - }) - }); + $("#next-btn").on("click", function() { + // Navigate next + $('#smartwizard').smartWizard("next"); + return true; + }); </script> </body> </html> diff --git a/ruoyi-admin/src/main/resources/templates/include.html b/ruoyi-admin/src/main/resources/templates/include.html index 57fbe288..d39f7c79 100644 --- a/ruoyi-admin/src/main/resources/templates/include.html +++ b/ruoyi-admin/src/main/resources/templates/include.html @@ -147,12 +147,12 @@ <script th:src="@{/ajax/libs/jsonview/jquery.jsonview.js}"></script> </div> -<!-- jquery.steps表单向导插件 --> -<div th:fragment="jquery-steps-css"> - <link th:href="@{/ajax/libs/staps/jquery.steps.css}" rel="stylesheet"/> +<!-- jquery.smartwizard表单向导插件 --> +<div th:fragment="jquery-smartwizard-css"> + <link th:href="@{/ajax/libs/smartwizard/smart_wizard_all.min.css}" rel="stylesheet"/> </div> -<div th:fragment="jquery-steps-js"> - <script th:src="@{/ajax/libs/staps/jquery.steps.min.js}"></script> +<div th:fragment="jquery-smartwizard-js"> + <script th:src="@{/ajax/libs/smartwizard/jquery.smartWizard.min.js}"></script> </div> <!-- ECharts百度统计图表插件 -->