Merge pull request #741 from creative-commoners/pulls/5.0/step-progress

FIX Re-enable step progress and navigation for multi page forms
This commit is contained in:
Dylan Wagstaff 2018-03-21 12:16:12 +13:00 committed by GitHub
commit 3faf55652d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 9 additions and 10 deletions

View File

@ -1 +1 @@
!function(t){function e(n){if(r[n])return r[n].exports;var i=r[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var r={};e.m=t,e.c=r,e.i=function(t){return t},e.d=function(t,r,n){e.o(t,r)||Object.defineProperty(t,r,{configurable:!1,enumerable:!0,get:n})},e.n=function(t){var r=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(r,"a",r),r},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=1)}([function(t,e,r){"use strict";var n=r(3),i=r.n(n),o=r(2),s=r.n(o);i()(document).ready(function(t){function e(e){return this.$el=e instanceof t?e:t(e),this.$el.find("h4").text(s.a._t("UserForms.ERROR_CONTAINER_HEADER","Please correct the following errors and try again:")),this}function r(r){var n=this;return this.$el=r instanceof t?r:t(r),this.$elButton=t(".step-button-wrapper[data-for='"+this.$el.prop("id")+"']"),this.viewed=!1,this.valid=!1,this.id=null,this.hide(),l.DISPLAY_ERROR_MESSAGES_AT_TOP&&(this.errorContainer=new e(this.$el.find(".error-container")),u.$el.on("userform.form.error",function(e,r){n.$el.is(":visible")&&t.each(r.errorList,function(e,r){n.errorContainer.updateErrorMessage(t(r.element),r.message)})}),u.$el.on("userform.form.valid",function(t,e){n.errorContainer.removeErrorMessage(e)})),this.$elButton.on("userform.field.hide userform.field.show",function(){u.$el.trigger("userform.form.conditionalstep")}),this}function n(e){var r=this,n=this;return this.$el=e instanceof t?e:t(e),this.$buttons=this.$el.find(".step-button-jump"),this.$jsAlign=this.$el.find(".js-align"),this.$buttons.each(function(e,i){t(i).on("click",function(e){e.preventDefault(),n.$el.trigger("userform.progress.changestep",[parseInt(t(r).data("step"),10)])})}),u.$el.on("userform.form.changestep",function(t,e){n.update(e)}),u.$el.on("userform.form.conditionalstep",function(){var e=n.$buttons.filter(":visible");e.each(function(e,r){t(r).text(e+1)}),n.$el.find(".progress-bar").attr("aria-valuemax",e.length),n.$el.find(".total-step-number").text(e.length)}),this.$jsAlign.each(function(e,r){var i=t(r),o=100/(n.$jsAlign.length-1)*(e+"%"),s=i.innerWidth()/2*-1;i.css({left:o,marginLeft:s}),e===n.$jsAlign.length-1?i.css({marginLeft:2*s}):0===e&&i.css({marginLeft:0})}),this.update(0),this}function i(e){var r=this;return this.$el=e instanceof t?e:t(e),this.$prevButton=this.$el.find(".step-button-prev"),this.$nextButton=this.$el.find(".step-button-next"),this.$prevButton.parent().attr("aria-hidden",!1).show(),this.$nextButton.parent().attr("aria-hidden",!1).show(),this.$prevButton.on("click",function(t){t.preventDefault(),r.$el.trigger("userform.action.prev")}),this.$nextButton.on("click",function(t){t.preventDefault(),r.$el.trigger("userform.action.next")}),u.$el.on("userform.form.changestep userform.form.conditionalstep",function(){r.update()}),this.update(),this}function o(r){var n=this,i=this;return this.$el=r instanceof t?r:t(r),this.steps=[],this.errorContainer=new e(this.$el.children(".error-container")),this.$el.on("userform.action.prev",function(){i.prevStep()}),this.$el.on("userform.action.next",function(){i.nextStep()}),t("#userform-progress").on("userform.progress.changestep",function(t,e){i.jumpToStep(e-1)}),this.$el.on("userform.form.valid",function(t,e){i.errorContainer.removeStepLink(e)}),this.$el.validate(this.validationOptions),t(".optionset.requiredField input").each(function(){t(n).rules("add",{required:!0})}),this}function a(n,i){var a=this,p=t(i);if(0!==p.length){l.ENABLE_LIVE_VALIDATION=void 0!==p.data("livevalidation"),l.DISPLAY_ERROR_MESSAGES_AT_TOP=void 0!==p.data("toperrors"),!1===l.ENABLE_LIVE_VALIDATION&&t.extend(o.prototype.validationOptions,{onfocusout:!1}),l.DISPLAY_ERROR_MESSAGES_AT_TOP&&t.extend(o.prototype.validationOptions,{invalidHandler:function(t,e){p.trigger("userform.form.error",[e])},onfocusout:!1}),t(".userform-progress, .step-navigation").attr("aria-hidden",!1).show(),t.extend(r.prototype,d),t.extend(e.prototype,d),u=new o(p),l.HIDE_FIELD_LABELS&&p.find("label.left").each(function(){var e=t(a);t('[name="'+e.attr("for")+'"]').attr("placeholder",e.text()),e.remove()}),u.$el.find(".form-step").each(function(t,e){var n=new r(e);u.addStep(n)}),u.setCurrentStep(u.steps[0]),t(document).on("click","input.text[data-showcalendar]",function(){var e=t(a);e.ssDatepicker(),e.data("datepicker")&&e.datepicker("show")}),setInterval(function(){t.ajax({url:"UserDefinedFormController/ping"})},18e4);var f=t("form.userform");void 0!==f.areYouSure&&f.areYouSure({message:s.a._t("UserForms.LEAVE_CONFIRMATION","You have unsaved changes!")})}}var u=null,l={},d={show:function(){this.$el.attr("aria-hidden",!1).show()},hide:function(){this.$el.attr("aria-hidden",!0).hide()}};e.prototype.hasErrors=function(){return this.$el.find(".error-list").children().length>0},e.prototype.removeErrorMessage=function(t){this.$el.find("#"+t+"-top-error").remove(),this.hasErrors()||this.hide()},e.prototype.addStepLink=function(e){var r=e.$el.attr("id")+"-error-link",n=this.$el.find("#"+r),i=e.$el.attr("id"),o=e.$el.data("title");n.length||(n=t('<li id="'+r+'"><a href="#'+i+'">'+o+"</a></li>"),n.on("click",function(t){t.preventDefault(),u.jumpToStep(e.id)}),this.$el.find(".error-list").append(n))},e.prototype.removeStepLink=function(e){var r=t("#"+e).closest(".form-step").attr("id");this.$el.find("#"+r+"-error-link").remove(),this.$el.find(".error-list").is(":empty")&&this.hide()},e.prototype.updateErrorMessage=function(e,r){var n=this,i=e.attr("id"),o="#"+i,s=i+"-top-error",a=t("#"+s),u=e.attr("aria-describedby");if(!r)return void a.addClass("fixed");a.removeClass("fixed"),this.show(),1===a.length?a.show().find("a").html(r):(e.closest(".field[id]").each(function(){o="#"+t(n).attr("id")}),a=t("<li><a></a></li>"),a.attr("id",s).find("a").attr("href",location.pathname+location.search+o).html(r),this.$el.find("ul").append(a),u?u.match(new RegExp("\\b"+s+"\\b"))||(u+=" "+s):u=s,e.attr("aria-describedby",u))},r.prototype.conditionallyHidden=function(){return!this.$elButton.find("button").is(":visible")},n.prototype.update=function(e){var r=t(t(".form-step")[e]),n=0,i=e/(this.$buttons.length-1)*100;this.$buttons.each(function(r,i){return!(r>e||(t(i).is(":visible")&&(n+=1),0))}),this.$el.find(".current-step-number").each(function(e,r){t(r).text(n)}),this.$el.find("[aria-valuenow]").each(function(e,r){t(r).attr("aria-valuenow",n)}),this.$buttons.each(function(e,r){var i=t(r),o=i.parent();if(parseInt(i.data("step"),10)===n&&i.is(":visible"))return o.addClass("current viewed"),void i.removeAttr("disabled");o.removeClass("current")}),this.$el.siblings(".progress-title").text(r.data("title")),i=i?i+"%":"",this.$el.find(".progress-bar").width(i)},i.prototype.update=function(){var t=u.steps.length,e=u.currentStep?u.currentStep.id:0,r=null,n=null;for(this.$el.find(".step-button-prev")[0===e?"hide":"show"](),r=t-1;r>=0;r--)if(n=u.steps[r],!n.conditionallyHidden()){this.$el.find(".step-button-next")[e>=r?"hide":"show"](),this.$el.find(".Actions")[e>=r?"show":"hide"]();break}},o.prototype.validationOptions={ignore:":hidden,ul",errorClass:"error",errorElement:"span",errorPlacement:function(t,e){t.addClass("message"),e.is(":radio")||e.parents(".checkboxset").length>0?t.appendTo(e.closest(".middleColumn")):e.parents(".checkbox").length>0?t.appendTo(e.closest(".field")):t.insertAfter(e)},invalidHandler:function(t,e){setTimeout(function(){e.currentElements.filter(".error").first().focus()},0)},submitHandler:function(e){var r=!0;u.currentStep&&(u.currentStep.valid=t(e).valid()),t.each(u.steps,function(t,e){e.valid||e.conditionallyHidden()||(r=!1,u.errorContainer.addStepLink(e))}),r?(t(e).removeClass("dirty"),e.submit()):u.errorContainer.show()},success:function(e){var r=t(e).attr("id"),n=r.substr(0,r.indexOf("-error")).replace(/[\\[\\]]/,"");e.remove(),u.$el.trigger("userform.form.valid",[n])}},o.prototype.addStep=function(t){!t instanceof r||(t.id=this.steps.length,this.steps.push(t))},o.prototype.setCurrentStep=function(t){t instanceof r&&(this.currentStep=t,this.currentStep.show(),this.currentStep.viewed=!0,this.currentStep.$el.addClass("viewed"))},o.prototype.jumpToStep=function(t,e){var r=this.steps[t],n=!1,i=void 0===e||e;if(void 0!==r){if(r.conditionallyHidden())return void(i?this.jumpToStep(t+1):this.jumpToStep(t-1));n=this.$el.valid(),this.currentStep.valid=n,!1===n&&!1===r.viewed||(this.currentStep.hide(),this.setCurrentStep(r),this.$el.trigger("userform.form.changestep",[r.id]))}},o.prototype.nextStep=function(){this.jumpToStep(this.steps.indexOf(this.currentStep)+1,!0)},o.prototype.prevStep=function(){this.jumpToStep(this.steps.indexOf(this.currentStep)-1,!1)},t(".userform").each(a)})},function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),r(0)},function(t,e){t.exports=i18n},function(t,e){t.exports=jQuery}]); !function(t){function e(n){if(r[n])return r[n].exports;var i=r[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var r={};e.m=t,e.c=r,e.i=function(t){return t},e.d=function(t,r,n){e.o(t,r)||Object.defineProperty(t,r,{configurable:!1,enumerable:!0,get:n})},e.n=function(t){var r=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(r,"a",r),r},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=1)}([function(t,e,r){"use strict";var n=r(3),i=r.n(n),o=r(2),s=r.n(o);i()(document).ready(function(t){function e(e){return this.$el=e instanceof t?e:t(e),this.$el.find("h4").text(s.a._t("UserForms.ERROR_CONTAINER_HEADER","Please correct the following errors and try again:")),this}function r(r){var n=this;return this.$el=r instanceof t?r:t(r),this.$elButton=t(".step-button-wrapper[data-for='"+this.$el.prop("id")+"']"),this.viewed=!1,this.valid=!1,this.id=null,this.hide(),l.DISPLAY_ERROR_MESSAGES_AT_TOP&&(this.errorContainer=new e(this.$el.find(".error-container")),u.$el.on("userform.form.error",function(e,r){n.$el.is(":visible")&&t.each(r.errorList,function(e,r){n.errorContainer.updateErrorMessage(t(r.element),r.message)})}),u.$el.on("userform.form.valid",function(t,e){n.errorContainer.removeErrorMessage(e)})),this.$elButton.on("userform.field.hide userform.field.show",function(){u.$el.trigger("userform.form.conditionalstep")}),this}function n(e){var r=this,n=this;return this.$el=e instanceof t?e:t(e),this.$buttons=this.$el.find(".step-button-jump"),this.$jsAlign=this.$el.find(".js-align"),this.$buttons.each(function(e,i){t(i).on("click",function(e){e.preventDefault(),n.$el.trigger("userform.progress.changestep",[parseInt(t(r).data("step"),10)])})}),u.$el.on("userform.form.changestep",function(t,e){n.update(e)}),u.$el.on("userform.form.conditionalstep",function(){var e=n.$buttons.filter(":visible");e.each(function(e,r){t(r).text(e+1)}),n.$el.find(".progress-bar").attr("aria-valuemax",e.length),n.$el.find(".total-step-number").text(e.length)}),this.$jsAlign.each(function(e,r){var i=t(r),o=100/(n.$jsAlign.length-1)*e,s=o+"%",a=i.innerWidth()/2*-1;i.css({left:s,marginLeft:a}),e===n.$jsAlign.length-1?i.css({marginLeft:2*a}):0===e&&i.css({marginLeft:0})}),this.update(0),this}function i(e){var r=this;return this.$el=e instanceof t?e:t(e),this.$prevButton=this.$el.find(".step-button-prev"),this.$nextButton=this.$el.find(".step-button-next"),this.$prevButton.parent().attr("aria-hidden",!1).show(),this.$nextButton.parent().attr("aria-hidden",!1).show(),this.$prevButton.on("click",function(t){t.preventDefault(),r.$el.trigger("userform.action.prev")}),this.$nextButton.on("click",function(t){t.preventDefault(),r.$el.trigger("userform.action.next")}),u.$el.on("userform.form.changestep userform.form.conditionalstep",function(){r.update()}),this.update(),this}function o(r){var n=this,i=this;return this.$el=r instanceof t?r:t(r),this.steps=[],this.errorContainer=new e(this.$el.children(".error-container")),this.$el.on("userform.action.prev",function(){i.prevStep()}),this.$el.on("userform.action.next",function(){i.nextStep()}),t("#userform-progress").on("userform.progress.changestep",function(t,e){i.jumpToStep(e-1)}),this.$el.on("userform.form.valid",function(t,e){i.errorContainer.removeStepLink(e)}),this.$el.validate(this.validationOptions),t(".optionset.requiredField input").each(function(){t(n).rules("add",{required:!0})}),this}function a(a,p){var f=this,h=t(p);if(0!==h.length){l.ENABLE_LIVE_VALIDATION=void 0!==h.data("livevalidation"),l.DISPLAY_ERROR_MESSAGES_AT_TOP=void 0!==h.data("toperrors"),!1===l.ENABLE_LIVE_VALIDATION&&t.extend(o.prototype.validationOptions,{onfocusout:!1}),l.DISPLAY_ERROR_MESSAGES_AT_TOP&&t.extend(o.prototype.validationOptions,{invalidHandler:function(t,e){h.trigger("userform.form.error",[e])},onfocusout:!1}),t(".userform-progress, .step-navigation").attr("aria-hidden",!1).show(),t.extend(r.prototype,d),t.extend(e.prototype,d),u=new o(h),l.HIDE_FIELD_LABELS&&h.find("label.left").each(function(){var e=t(f);t('[name="'+e.attr("for")+'"]').attr("placeholder",e.text()),e.remove()}),u.$el.find(".form-step").each(function(t,e){var n=new r(e);u.addStep(n)}),u.setCurrentStep(u.steps[0]),new n(t("#userform-progress")),new i(t("#step-navigation")),t(document).on("click","input.text[data-showcalendar]",function(){var e=t(f);e.ssDatepicker(),e.data("datepicker")&&e.datepicker("show")}),setInterval(function(){t.ajax({url:"UserDefinedFormController/ping"})},18e4);var c=t("form.userform");void 0!==c.areYouSure&&c.areYouSure({message:s.a._t("UserForms.LEAVE_CONFIRMATION","You have unsaved changes!")})}}var u=null,l={},d={show:function(){this.$el.attr("aria-hidden",!1).show()},hide:function(){this.$el.attr("aria-hidden",!0).hide()}};e.prototype.hasErrors=function(){return this.$el.find(".error-list").children().length>0},e.prototype.removeErrorMessage=function(t){this.$el.find("#"+t+"-top-error").remove(),this.hasErrors()||this.hide()},e.prototype.addStepLink=function(e){var r=e.$el.attr("id")+"-error-link",n=this.$el.find("#"+r),i=e.$el.attr("id"),o=e.$el.data("title");n.length||(n=t('<li id="'+r+'"><a href="#'+i+'">'+o+"</a></li>"),n.on("click",function(t){t.preventDefault(),u.jumpToStep(e.id)}),this.$el.find(".error-list").append(n))},e.prototype.removeStepLink=function(e){var r=t("#"+e).closest(".form-step").attr("id");this.$el.find("#"+r+"-error-link").remove(),this.$el.find(".error-list").is(":empty")&&this.hide()},e.prototype.updateErrorMessage=function(e,r){var n=this,i=e.attr("id"),o="#"+i,s=i+"-top-error",a=t("#"+s),u=e.attr("aria-describedby");if(!r)return void a.addClass("fixed");a.removeClass("fixed"),this.show(),1===a.length?a.show().find("a").html(r):(e.closest(".field[id]").each(function(){o="#"+t(n).attr("id")}),a=t("<li><a></a></li>"),a.attr("id",s).find("a").attr("href",location.pathname+location.search+o).html(r),this.$el.find("ul").append(a),u?u.match(new RegExp("\\b"+s+"\\b"))||(u+=" "+s):u=s,e.attr("aria-describedby",u))},r.prototype.conditionallyHidden=function(){return!this.$elButton.find("button").is(":visible")},n.prototype.update=function(e){var r=t(t(".form-step")[e]),n=0,i=e/(this.$buttons.length-1)*100;this.$buttons.each(function(r,i){return!(r>e||(t(i).is(":visible")&&(n+=1),0))}),this.$el.find(".current-step-number").each(function(e,r){t(r).text(n)}),this.$el.find("[aria-valuenow]").each(function(e,r){t(r).attr("aria-valuenow",n)}),this.$buttons.each(function(e,r){var i=t(r),o=i.parent();if(parseInt(i.data("step"),10)===n&&i.is(":visible"))return o.addClass("current viewed"),void i.removeAttr("disabled");o.removeClass("current")}),this.$el.siblings(".progress-title").text(r.data("title")),i=i?i+"%":"",this.$el.find(".progress-bar").width(i)},i.prototype.update=function(){var t=u.steps.length,e=u.currentStep?u.currentStep.id:0,r=null,n=null;for(this.$el.find(".step-button-prev")[0===e?"hide":"show"](),r=t-1;r>=0;r--)if(n=u.steps[r],!n.conditionallyHidden()){this.$el.find(".step-button-next")[e>=r?"hide":"show"](),this.$el.find(".Actions")[e>=r?"show":"hide"]();break}},o.prototype.validationOptions={ignore:":hidden,ul",errorClass:"error",errorElement:"span",errorPlacement:function(t,e){t.addClass("message"),e.is(":radio")||e.parents(".checkboxset").length>0?t.appendTo(e.closest(".middleColumn")):e.parents(".checkbox").length>0?t.appendTo(e.closest(".field")):t.insertAfter(e)},invalidHandler:function(t,e){setTimeout(function(){e.currentElements.filter(".error").first().focus()},0)},submitHandler:function(e){var r=!0;u.currentStep&&(u.currentStep.valid=t(e).valid()),t.each(u.steps,function(t,e){e.valid||e.conditionallyHidden()||(r=!1,u.errorContainer.addStepLink(e))}),r?(t(e).removeClass("dirty"),e.submit()):u.errorContainer.show()},success:function(e){var r=t(e).attr("id"),n=r.substr(0,r.indexOf("-error")).replace(/[\\[\\]]/,"");e.remove(),u.$el.trigger("userform.form.valid",[n])}},o.prototype.addStep=function(t){!t instanceof r||(t.id=this.steps.length,this.steps.push(t))},o.prototype.setCurrentStep=function(t){t instanceof r&&(this.currentStep=t,this.currentStep.show(),this.currentStep.viewed=!0,this.currentStep.$el.addClass("viewed"))},o.prototype.jumpToStep=function(t,e){var r=this.steps[t],n=!1,i=void 0===e||e;if(void 0!==r){if(r.conditionallyHidden())return void(i?this.jumpToStep(t+1):this.jumpToStep(t-1));n=this.$el.valid(),this.currentStep.valid=n,!1===n&&!1===r.viewed||(this.currentStep.hide(),this.setCurrentStep(r),this.$el.trigger("userform.form.changestep",[r.id]))}},o.prototype.nextStep=function(){this.jumpToStep(this.steps.indexOf(this.currentStep)+1,!0)},o.prototype.prevStep=function(){this.jumpToStep(this.steps.indexOf(this.currentStep)-1,!1)},t(".userform").each(a)})},function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),r(0)},function(t,e){t.exports=i18n},function(t,e){t.exports=jQuery}]);

View File

@ -1 +0,0 @@
{"version":3,"sources":["webpack:///webpack/bootstrap 7f7717b373f515738f49","webpack:///./client/src/bundles/UserForms.js","webpack:///external \"i18n\"","webpack:///external \"jQuery\""],"names":["jQuery","document","ready","$","userform","CONSTANTS","commonMixin","show","$el","attr","hide","ErrorContainer","element","find","text","i18n","_t","prototype","hasErrors","children","length","removeErrorMessage","fieldId","remove","addStepLink","step","itemID","$itemElement","stepID","stepTitle","data","on","e","preventDefault","jumpToStep","id","append","removeStepLink","closest","is","updateErrorMessage","$input","message","inputID","anchor","elementID","messageElement","describedBy","addClass","removeClass","html","each","location","pathname","search","match","RegExp","FormStep","self","$elButton","prop","viewed","valid","DISPLAY_ERROR_MESSAGES_AT_TOP","errorContainer","validator","errorList","i","error","trigger","conditionallyHidden","ProgressBar","$buttons","$jsAlign","stepButton","parseInt","update","$visibleButtons","filter","button","index","$button","leftPercent","buttonOffset","innerWidth","css","left","marginLeft","$newStepElement","stepNumber","barWidth","$element","$item","parent","removeAttr","siblings","width","FormActions","$prevButton","$nextButton","numberOfSteps","steps","currentStep","lastStep","UserForm","prevStep","nextStep","validate","validationOptions","rules","required","ignore","errorClass","errorElement","errorPlacement","parents","appendTo","insertAfter","invalidHandler","event","setTimeout","currentElements","first","focus","submitHandler","form","isValid","submit","success","errorId","substr","indexOf","replace","addStep","push","setCurrentStep","direction","targetStep","forward","main","$userform","ENABLE_LIVE_VALIDATION","extend","onfocusout","HIDE_FIELD_LABELS","$label","ssDatepicker","datepicker","setInterval","ajax","url","areYouSure"],"mappings":";AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA,mDAA2C,cAAc;;AAEzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;;AC5DA;AACA;;AAEA,8CAAAA,CAAOC,QAAP,EAAiBC,KAAjB,CAAuB,UAACC,CAAD,EAAO;AAE5B,MAAIC,WAAW,IAAf;;AAGA,MAAMC,YAAY,EAAlB;;AAGA,MAAMC,cAAc;AAKlBC,QALkB,kBAKX;AACL,WAAKC,GAAL,CAASC,IAAT,CAAc,aAAd,EAA6B,KAA7B,EAAoCF,IAApC;AACD,KAPiB;AAYlBG,QAZkB,kBAYX;AACL,WAAKF,GAAL,CAASC,IAAT,CAAc,aAAd,EAA6B,IAA7B,EAAmCC,IAAnC;AACD;AAdiB,GAApB;;AAwBA,WAASC,cAAT,CAAwBC,OAAxB,EAAiC;AAC/B,SAAKJ,GAAL,GAAWI,mBAAmBT,CAAnB,GAAuBS,OAAvB,GAAiCT,EAAES,OAAF,CAA5C;;AAGA,SAAKJ,GAAL,CAASK,IAAT,CAAc,IAAd,EAAoBC,IAApB,CAAyB,4CAAAC,CAAKC,EAAL,CAAQ,kCAAR,EACvB,oDADuB,CAAzB;;AAGA,WAAO,IAAP;AACD;;AAODL,iBAAeM,SAAf,CAAyBC,SAAzB,GAAqC,YAAY;AAC/C,WAAO,KAAKV,GAAL,CAASK,IAAT,CAAc,aAAd,EAA6BM,QAA7B,GAAwCC,MAAxC,GAAiD,CAAxD;AACD,GAFD;;AAQAT,iBAAeM,SAAf,CAAyBI,kBAAzB,GAA8C,UAAUC,OAAV,EAAmB;AAC/D,SAAKd,GAAL,CAASK,IAAT,OAAkBS,OAAlB,iBAAuCC,MAAvC;;AAGA,QAAI,CAAC,KAAKL,SAAL,EAAL,EAAuB;AACrB,WAAKR,IAAL;AACD;AACF,GAPD;;AAcAC,iBAAeM,SAAf,CAAyBO,WAAzB,GAAuC,UAAUC,IAAV,EAAgB;AACrD,QAAMC,SAAYD,KAAKjB,GAAL,CAASC,IAAT,CAAc,IAAd,CAAZ,gBAAN;AACA,QAAIkB,eAAe,KAAKnB,GAAL,CAASK,IAAT,OAAkBa,MAAlB,CAAnB;AACA,QAAME,SAASH,KAAKjB,GAAL,CAASC,IAAT,CAAc,IAAd,CAAf;AACA,QAAMoB,YAAYJ,KAAKjB,GAAL,CAASsB,IAAT,CAAc,OAAd,CAAlB;;AAGA,QAAIH,aAAaP,MAAjB,EAAyB;AACvB;AACD;;AAEDO,mBAAexB,eAAauB,MAAb,oBAAkCE,MAAlC,UAA6CC,SAA7C,eAAf;;AAEAF,iBAAaI,EAAb,CAAgB,OAAhB,EAAyB,UAACC,CAAD,EAAO;AAC9BA,QAAEC,cAAF;AACA7B,eAAS8B,UAAT,CAAoBT,KAAKU,EAAzB;AACD,KAHD;;AAKA,SAAK3B,GAAL,CAASK,IAAT,CAAc,aAAd,EAA6BuB,MAA7B,CAAoCT,YAApC;AACD,GAnBD;;AA0BAhB,iBAAeM,SAAf,CAAyBoB,cAAzB,GAA0C,UAAUf,OAAV,EAAmB;AAC3D,QAAMM,SAASzB,QAAMmB,OAAN,EAAiBgB,OAAjB,CAAyB,YAAzB,EAAuC7B,IAAvC,CAA4C,IAA5C,CAAf;;AAEA,SAAKD,GAAL,CAASK,IAAT,OAAkBe,MAAlB,kBAAuCL,MAAvC;;AAGA,QAAI,KAAKf,GAAL,CAASK,IAAT,CAAc,aAAd,EAA6B0B,EAA7B,CAAgC,QAAhC,CAAJ,EAA+C;AAC7C,WAAK7B,IAAL;AACD;AACF,GATD;;AAiBAC,iBAAeM,SAAf,CAAyBuB,kBAAzB,GAA8C,UAAUC,MAAV,EAAkBC,OAAlB,EAA2B;AAAA;;AACvE,QAAMC,UAAUF,OAAOhC,IAAP,CAAY,IAAZ,CAAhB;AACA,QAAImC,eAAaD,OAAjB;AACA,QAAME,YAAeF,OAAf,eAAN;AACA,QAAIG,iBAAiB3C,QAAM0C,SAAN,CAArB;AACA,QAAIE,cAAcN,OAAOhC,IAAP,CAAY,kBAAZ,CAAlB;;AAGA,QAAI,CAACiC,OAAL,EAAc;AAEZI,qBAAeE,QAAf,CAAwB,OAAxB;AACA;AACD;;AAEDF,mBAAeG,WAAf,CAA2B,OAA3B;;AAEA,SAAK1C,IAAL;;AAEA,QAAIuC,eAAe1B,MAAf,KAA0B,CAA9B,EAAiC;AAE/B0B,qBAAevC,IAAf,GAAsBM,IAAtB,CAA2B,GAA3B,EAAgCqC,IAAhC,CAAqCR,OAArC;AACD,KAHD,MAGO;AAELD,aAAOH,OAAP,CAAe,YAAf,EAA6Ba,IAA7B,CAAkC,YAAM;AACtCP,uBAAazC,SAAQM,IAAR,CAAa,IAAb,CAAb;AACD,OAFD;;AAKAqC,uBAAiB3C,EAAE,kBAAF,CAAjB;AACA2C,qBACGrC,IADH,CACQ,IADR,EACcoC,SADd,EAEGhC,IAFH,CAEQ,GAFR,EAGGJ,IAHH,CAGQ,MAHR,EAGgB2C,SAASC,QAAT,GAAoBD,SAASE,MAA7B,GAAsCV,MAHtD,EAIGM,IAJH,CAIQR,OAJR;;AAMA,WAAKlC,GAAL,CAASK,IAAT,CAAc,IAAd,EAAoBuB,MAApB,CAA2BU,cAA3B;;AAIA,UAAI,CAACC,WAAL,EAAkB;AAChBA,sBAAcF,SAAd;AACD,OAFD,MAEO,IAAI,CAACE,YAAYQ,KAAZ,CAAkB,IAAIC,MAAJ,SAAiBX,SAAjB,SAAlB,CAAL,EAA0D;AAE/DE,6BAAmBF,SAAnB;AACD;;AAEDJ,aAAOhC,IAAP,CAAY,kBAAZ,EAAgCsC,WAAhC;AACD;AACF,GAhDD;;AAyDA,WAASU,QAAT,CAAkB7C,OAAlB,EAA2B;AACzB,QAAM8C,OAAO,IAAb;;AAEA,SAAKlD,GAAL,GAAWI,mBAAmBT,CAAnB,GAAuBS,OAAvB,GAAiCT,EAAES,OAAF,CAA5C;;AAGA,SAAK+C,SAAL,GAAiBxD,uCAAoC,KAAKK,GAAL,CAASoD,IAAT,CAAc,IAAd,CAApC,OAAjB;;AAGA,SAAKC,MAAL,GAAc,KAAd;;AAIA,SAAKC,KAAL,GAAa,KAAb;;AAGA,SAAK3B,EAAL,GAAU,IAAV;;AAEA,SAAKzB,IAAL;;AAEA,QAAIL,UAAU0D,6BAAd,EAA6C;AAC3C,WAAKC,cAAL,GAAsB,IAAIrD,cAAJ,CAAmB,KAAKH,GAAL,CAASK,IAAT,CAAc,kBAAd,CAAnB,CAAtB;;AAGAT,eAASI,GAAT,CAAauB,EAAb,CAAgB,qBAAhB,EAAuC,UAACC,CAAD,EAAIiC,SAAJ,EAAkB;AAEvD,YAAI,CAACP,KAAKlD,GAAL,CAAS+B,EAAT,CAAY,UAAZ,CAAL,EAA8B;AAC5B;AACD;;AAGDpC,UAAEgD,IAAF,CAAOc,UAAUC,SAAjB,EAA4B,UAACC,CAAD,EAAIC,KAAJ,EAAc;AACxCV,eAAKM,cAAL,CAAoBxB,kBAApB,CAAuCrC,EAAEiE,MAAMxD,OAAR,CAAvC,EAAyDwD,MAAM1B,OAA/D;AACD,SAFD;AAGD,OAVD;;AAaAtC,eAASI,GAAT,CAAauB,EAAb,CAAgB,qBAAhB,EAAuC,UAACC,CAAD,EAAIV,OAAJ,EAAgB;AACrDoC,aAAKM,cAAL,CAAoB3C,kBAApB,CAAuCC,OAAvC;AACD,OAFD;AAGD;;AAGD,SACGqC,SADH,CAEG5B,EAFH,CAEM,yCAFN,EAEiD,YAAM;AACnD3B,eAASI,GAAT,CAAa6D,OAAb,CAAqB,+BAArB;AACD,KAJH;;AAMA,WAAO,IAAP;AACD;;AAQDZ,WAASxC,SAAT,CAAmBqD,mBAAnB,GAAyC,YAAY;AACnD,WAAO,CAAC,KAAKX,SAAL,CAAe9C,IAAf,CAAoB,QAApB,EAA8B0B,EAA9B,CAAiC,UAAjC,CAAR;AACD,GAFD;;AAWA,WAASgC,WAAT,CAAqB3D,OAArB,EAA8B;AAAA;;AAC5B,QAAM8C,OAAO,IAAb;;AAEA,SAAKlD,GAAL,GAAWI,mBAAmBT,CAAnB,GAAuBS,OAAvB,GAAiCT,EAAES,OAAF,CAA5C;AACA,SAAK4D,QAAL,GAAgB,KAAKhE,GAAL,CAASK,IAAT,CAAc,mBAAd,CAAhB;AACA,SAAK4D,QAAL,GAAgB,KAAKjE,GAAL,CAASK,IAAT,CAAc,WAAd,CAAhB;;AAGA,SAAK2D,QAAL,CAAcrB,IAAd,CAAmB,UAACgB,CAAD,EAAIO,UAAJ,EAAmB;AACpCvE,QAAEuE,UAAF,EAAc3C,EAAd,CAAiB,OAAjB,EAA0B,UAACC,CAAD,EAAO;AAC/BA,UAAEC,cAAF;AACAyB,aAAKlD,GAAL,CAAS6D,OAAT,CAAiB,8BAAjB,EAAiD,CAACM,SAASxE,UAAQ2B,IAAR,CAAa,MAAb,CAAT,EAA+B,EAA/B,CAAD,CAAjD;AACD,OAHD;AAID,KALD;;AAQA1B,aAASI,GAAT,CAAauB,EAAb,CAAgB,0BAAhB,EAA4C,UAACC,CAAD,EAAIJ,MAAJ,EAAe;AACzD8B,WAAKkB,MAAL,CAAYhD,MAAZ;AACD,KAFD;;AAOAxB,aAASI,GAAT,CAAauB,EAAb,CAAgB,+BAAhB,EAAiD,YAAM;AAErD,UAAM8C,kBAAkBnB,KAAKc,QAAL,CAAcM,MAAd,CAAqB,UAArB,CAAxB;;AAEAD,sBAAgB1B,IAAhB,CAAqB,UAACgB,CAAD,EAAIY,MAAJ,EAAe;AAClC5E,UAAE4E,MAAF,EAAUjE,IAAV,CAAeqD,IAAI,CAAnB;AACD,OAFD;;AAKAT,WAAKlD,GAAL,CAASK,IAAT,CAAc,eAAd,EAA+BJ,IAA/B,CAAoC,eAApC,EAAqDoE,gBAAgBzD,MAArE;;AAGAsC,WAAKlD,GAAL,CAASK,IAAT,CAAc,oBAAd,EAAoCC,IAApC,CAAyC+D,gBAAgBzD,MAAzD;AACD,KAbD;;AAgBA,SAAKqD,QAAL,CAActB,IAAd,CAAmB,UAAC6B,KAAD,EAAQD,MAAR,EAAmB;AACpC,UAAME,UAAU9E,EAAE4E,MAAF,CAAhB;AACA,UAAMG,cAAe,OAAOxB,KAAKe,QAAL,CAAcrD,MAAd,GAAuB,CAA9B,KAAsC4D,KAAtC,OAArB;AACA,UAAMG,eAAe,CAAC,CAAD,IAAMF,QAAQG,UAAR,KAAuB,CAA7B,CAArB;;AAEAH,cAAQI,GAAR,CAAY,EAAEC,MAAMJ,WAAR,EAAqBK,YAAYJ,YAAjC,EAAZ;;AAGA,UAAIH,UAAUtB,KAAKe,QAAL,CAAcrD,MAAd,GAAuB,CAArC,EAAwC;AACtC6D,gBAAQI,GAAR,CAAY,EAAEE,YAAYJ,eAAe,CAA7B,EAAZ;AACD,OAFD,MAEO,IAAIH,UAAU,CAAd,EAAiB;AACtBC,gBAAQI,GAAR,CAAY,EAAEE,YAAY,CAAd,EAAZ;AACD;AACF,KAbD;;AAeA,SAAKX,MAAL,CAAY,CAAZ;;AAEA,WAAO,IAAP;AACD;;AAODL,cAAYtD,SAAZ,CAAsB2D,MAAtB,GAA+B,UAAUhD,MAAV,EAAkB;AAC/C,QAAM4D,kBAAkBrF,EAAEA,EAAE,YAAF,EAAgByB,MAAhB,CAAF,CAAxB;AACA,QAAI6D,aAAa,CAAjB;AACA,QAAIC,WAAW9D,UAAU,KAAK4C,QAAL,CAAcpD,MAAd,GAAuB,CAAjC,IAAsC,GAArD;;AAGA,SAAKoD,QAAL,CAAcrB,IAAd,CAAmB,UAACgB,CAAD,EAAIY,MAAJ,EAAe;AAChC,UAAIZ,IAAIvC,MAAR,EAAgB;AAEd,eAAO,KAAP;AACD;;AAED,UAAIzB,EAAE4E,MAAF,EAAUxC,EAAV,CAAa,UAAb,CAAJ,EAA8B;AAC5BkD,sBAAc,CAAd;AACD;AACD,aAAO,IAAP;AACD,KAVD;;AAaA,SAAKjF,GAAL,CAASK,IAAT,CAAc,sBAAd,EAAsCsC,IAAtC,CAA2C,UAACgB,CAAD,EAAIvD,OAAJ,EAAgB;AACzDT,QAAES,OAAF,EAAWE,IAAX,CAAgB2E,UAAhB;AACD,KAFD;;AAKA,SAAKjF,GAAL,CAASK,IAAT,CAAc,iBAAd,EAAiCsC,IAAjC,CAAsC,UAACgB,CAAD,EAAIvD,OAAJ,EAAgB;AACpDT,QAAES,OAAF,EAAWH,IAAX,CAAgB,eAAhB,EAAiCgF,UAAjC;AACD,KAFD;;AAKA,SAAKjB,QAAL,CAAcrB,IAAd,CAAmB,UAACgB,CAAD,EAAIvD,OAAJ,EAAgB;AACjC,UAAM+E,WAAWxF,EAAES,OAAF,CAAjB;AACA,UAAMgF,QAAQD,SAASE,MAAT,EAAd;;AAEA,UAAIlB,SAASgB,SAAS7D,IAAT,CAAc,MAAd,CAAT,EAAgC,EAAhC,MAAwC2D,UAAxC,IAAsDE,SAASpD,EAAT,CAAY,UAAZ,CAA1D,EAAmF;AACjFqD,cAAM5C,QAAN,CAAe,gBAAf;AACA2C,iBAASG,UAAT,CAAoB,UAApB;;AAEA;AACD;;AAEDF,YAAM3C,WAAN,CAAkB,SAAlB;AACD,KAZD;;AAeA,SAAKzC,GAAL,CAASuF,QAAT,CAAkB,iBAAlB,EAAqCjF,IAArC,CAA0C0E,gBAAgB1D,IAAhB,CAAqB,OAArB,CAA1C;;AAGA4D,eAAWA,WAAcA,QAAd,SAA4B,EAAvC;AACA,SAAKlF,GAAL,CAASK,IAAT,CAAc,eAAd,EAA+BmF,KAA/B,CAAqCN,QAArC;AACD,GAjDD;;AAyDA,WAASO,WAAT,CAAqBrF,OAArB,EAA8B;AAC5B,QAAM8C,OAAO,IAAb;;AAEA,SAAKlD,GAAL,GAAWI,mBAAmBT,CAAnB,GAAuBS,OAAvB,GAAiCT,EAAES,OAAF,CAA5C;;AAEA,SAAKsF,WAAL,GAAmB,KAAK1F,GAAL,CAASK,IAAT,CAAc,mBAAd,CAAnB;AACA,SAAKsF,WAAL,GAAmB,KAAK3F,GAAL,CAASK,IAAT,CAAc,mBAAd,CAAnB;;AAGA,SAAKqF,WAAL,CAAiBL,MAAjB,GAA0BpF,IAA1B,CAA+B,aAA/B,EAA8C,KAA9C,EAAqDF,IAArD;AACA,SAAK4F,WAAL,CAAiBN,MAAjB,GAA0BpF,IAA1B,CAA+B,aAA/B,EAA8C,KAA9C,EAAqDF,IAArD;;AAGA,SAAK2F,WAAL,CAAiBnE,EAAjB,CAAoB,OAApB,EAA6B,UAACC,CAAD,EAAO;AAClCA,QAAEC,cAAF;AACAyB,WAAKlD,GAAL,CAAS6D,OAAT,CAAiB,sBAAjB;AACD,KAHD;AAIA,SAAK8B,WAAL,CAAiBpE,EAAjB,CAAoB,OAApB,EAA6B,UAACC,CAAD,EAAO;AAClCA,QAAEC,cAAF;AACAyB,WAAKlD,GAAL,CAAS6D,OAAT,CAAiB,sBAAjB;AACD,KAHD;;AAOAjE,aAASI,GAAT,CAAauB,EAAb,CAAgB,wDAAhB,EAA0E,YAAM;AAC9E2B,WAAKkB,MAAL;AACD,KAFD;;AAIA,SAAKA,MAAL;;AAEA,WAAO,IAAP;AACD;;AAODqB,cAAYhF,SAAZ,CAAsB2D,MAAtB,GAA+B,YAAY;AACzC,QAAMwB,gBAAgBhG,SAASiG,KAAT,CAAejF,MAArC;AACA,QAAMQ,SAASxB,SAASkG,WAAT,GAAuBlG,SAASkG,WAAT,CAAqBnE,EAA5C,GAAiD,CAAhE;AACA,QAAIgC,IAAI,IAAR;AACA,QAAIoC,WAAW,IAAf;;AAGA,SAAK/F,GAAL,CAASK,IAAT,CAAc,mBAAd,EAAmCe,WAAW,CAAX,GAAe,MAAf,GAAwB,MAA3D;;AAGA,SAAKuC,IAAIiC,gBAAgB,CAAzB,EAA4BjC,KAAK,CAAjC,EAAoCA,GAApC,EAAyC;AACvCoC,iBAAWnG,SAASiG,KAAT,CAAelC,CAAf,CAAX;;AAGA,UAAIoC,SAASjC,mBAAT,EAAJ,EAAoC;AAClC;AACD;;AAGD,WAAK9D,GAAL,CAASK,IAAT,CAAc,mBAAd,EAAmCe,UAAUuC,CAAV,GAAc,MAAd,GAAuB,MAA1D;;AAGA,WAAK3D,GAAL,CAASK,IAAT,CAAc,UAAd,EAA0Be,UAAUuC,CAAV,GAAc,MAAd,GAAuB,MAAjD;;AAGA;AACD;AACF,GA3BD;;AAoCA,WAASqC,QAAT,CAAkB5F,OAAlB,EAA2B;AAAA;;AACzB,QAAM8C,OAAO,IAAb;;AAEA,SAAKlD,GAAL,GAAWI,mBAAmBT,CAAnB,GAAuBS,OAAvB,GAAiCT,EAAES,OAAF,CAA5C;AACA,SAAKyF,KAAL,GAAa,EAAb;;AAGA,SAAKrC,cAAL,GAAsB,IAAIrD,cAAJ,CAAmB,KAAKH,GAAL,CAASW,QAAT,CAAkB,kBAAlB,CAAnB,CAAtB;;AAGA,SAAKX,GAAL,CAASuB,EAAT,CAAY,sBAAZ,EAAoC,YAAM;AACxC2B,WAAK+C,QAAL;AACD,KAFD;AAGA,SAAKjG,GAAL,CAASuB,EAAT,CAAY,sBAAZ,EAAoC,YAAM;AACxC2B,WAAKgD,QAAL;AACD,KAFD;;AAKAvG,MAAE,oBAAF,EAAwB4B,EAAxB,CAA2B,8BAA3B,EAA2D,UAACC,CAAD,EAAIyD,UAAJ,EAAmB;AAC5E/B,WAAKxB,UAAL,CAAgBuD,aAAa,CAA7B;AACD,KAFD;;AAKA,SAAKjF,GAAL,CAASuB,EAAT,CAAY,qBAAZ,EAAmC,UAACC,CAAD,EAAIV,OAAJ,EAAgB;AACjDoC,WAAKM,cAAL,CAAoB3B,cAApB,CAAmCf,OAAnC;AACD,KAFD;;AAIA,SAAKd,GAAL,CAASmG,QAAT,CAAkB,KAAKC,iBAAvB;;AAGAzG,MAAE,gCAAF,EAAoCgD,IAApC,CAAyC,YAAM;AAC7ChD,gBAAQ0G,KAAR,CAAc,KAAd,EAAqB;AACnBC,kBAAU;AADS,OAArB;AAGD,KAJD;;AAMA,WAAO,IAAP;AACD;;AAKDN,WAASvF,SAAT,CAAmB2F,iBAAnB,GAAuC;AACrCG,YAAQ,YAD6B;AAErCC,gBAAY,OAFyB;AAGrCC,kBAAc,MAHuB;AAIrCC,oBAAgB,wBAAC9C,KAAD,EAAQxD,OAAR,EAAoB;AAClCwD,YAAMpB,QAAN,CAAe,SAAf;;AAEA,UAAIpC,QAAQ2B,EAAR,CAAW,QAAX,KAAwB3B,QAAQuG,OAAR,CAAgB,cAAhB,EAAgC/F,MAAhC,GAAyC,CAArE,EAAwE;AACtEgD,cAAMgD,QAAN,CAAexG,QAAQ0B,OAAR,CAAgB,eAAhB,CAAf;AACD,OAFD,MAEO,IAAI1B,QAAQuG,OAAR,CAAgB,WAAhB,EAA6B/F,MAA7B,GAAsC,CAA1C,EAA6C;AAClDgD,cAAMgD,QAAN,CAAexG,QAAQ0B,OAAR,CAAgB,QAAhB,CAAf;AACD,OAFM,MAEA;AACL8B,cAAMiD,WAAN,CAAkBzG,OAAlB;AACD;AACF,KAdoC;AAerC0G,oBAAgB,wBAACC,KAAD,EAAQtD,SAAR,EAAsB;AAEpCuD,iBAAW,YAAM;AACfvD,kBAAUwD,eAAV,CAA0B3C,MAA1B,CAAiC,QAAjC,EAA2C4C,KAA3C,GAAmDC,KAAnD;AACD,OAFD,EAEG,CAFH;AAGD,KApBoC;;AAwBrCC,mBAAe,uBAACC,IAAD,EAAU;AACvB,UAAIC,UAAU,IAAd;;AAGA,UAAI1H,SAASkG,WAAb,EAA0B;AACxBlG,iBAASkG,WAAT,CAAqBxC,KAArB,GAA6B3D,EAAE0H,IAAF,EAAQ/D,KAAR,EAA7B;AACD;;AAGD3D,QAAEgD,IAAF,CAAO/C,SAASiG,KAAhB,EAAuB,UAAClC,CAAD,EAAI1C,IAAJ,EAAa;AAClC,YAAI,CAACA,KAAKqC,KAAN,IAAe,CAACrC,KAAK6C,mBAAL,EAApB,EAAgD;AAC9CwD,oBAAU,KAAV;AACA1H,mBAAS4D,cAAT,CAAwBxC,WAAxB,CAAoCC,IAApC;AACD;AACF,OALD;;AAOA,UAAIqG,OAAJ,EAAa;AAEX3H,UAAE0H,IAAF,EAAQ5E,WAAR,CAAoB,OAApB;;AAEA4E,aAAKE,MAAL;AACD,OALD,MAKO;AACL3H,iBAAS4D,cAAT,CAAwBzD,IAAxB;AACD;AACF,KAhDoC;;AAkDrCyH,aAAS,iBAAC5D,KAAD,EAAW;AAClB,UAAM6D,UAAU9H,EAAEiE,KAAF,EAAS3D,IAAT,CAAc,IAAd,CAAhB;AACA,UAAMa,UAAU2G,QAAQC,MAAR,CAAe,CAAf,EAAkBD,QAAQE,OAAR,CAAgB,QAAhB,CAAlB,EAA6CC,OAA7C,CAAqD,UAArD,EAAiE,EAAjE,CAAhB;;AAMAhE,YAAM7C,MAAN;;AAGAnB,eAASI,GAAT,CAAa6D,OAAb,CAAqB,qBAArB,EAA4C,CAAC/C,OAAD,CAA5C;AACD;AA9DoC,GAAvC;;AAsEAkF,WAASvF,SAAT,CAAmBoH,OAAnB,GAA6B,UAAU5G,IAAV,EAAgB;AAE3C,QAAI,CAACA,IAAD,YAAiBgC,QAArB,EAA+B;AAC7B;AACD;;AAGDhC,SAAKU,EAAL,GAAU,KAAKkE,KAAL,CAAWjF,MAArB;;AAEA,SAAKiF,KAAL,CAAWiC,IAAX,CAAgB7G,IAAhB;AACD,GAVD;;AAiBA+E,WAASvF,SAAT,CAAmBsH,cAAnB,GAAoC,UAAU9G,IAAV,EAAgB;AAElD,QAAI,EAAEA,gBAAgBgC,QAAlB,CAAJ,EAAiC;AAC/B;AACD;;AAED,SAAK6C,WAAL,GAAmB7E,IAAnB;AACA,SAAK6E,WAAL,CAAiB/F,IAAjB;;AAGA,SAAK+F,WAAL,CAAiBzC,MAAjB,GAA0B,IAA1B;AACA,SAAKyC,WAAL,CAAiB9F,GAAjB,CAAqBwC,QAArB,CAA8B,QAA9B;AACD,GAZD;;AAoBAwD,WAASvF,SAAT,CAAmBiB,UAAnB,GAAgC,UAAUuD,UAAV,EAAsB+C,SAAtB,EAAiC;AAC/D,QAAMC,aAAa,KAAKpC,KAAL,CAAWZ,UAAX,CAAnB;AACA,QAAIqC,UAAU,KAAd;AACA,QAAMY,UAAUF,cAAc,KAAK,CAAnB,GAAuB,IAAvB,GAA8BA,SAA9C;;AAGA,QAAIC,eAAe,KAAK,CAAxB,EAA2B;AACzB;AACD;;AAID,QAAIA,WAAWnE,mBAAX,EAAJ,EAAsC;AACpC,UAAIoE,OAAJ,EAAa;AACX,aAAKxG,UAAL,CAAgBuD,aAAa,CAA7B;AACD,OAFD,MAEO;AACL,aAAKvD,UAAL,CAAgBuD,aAAa,CAA7B;AACD;;AAED;AACD;;AAMDqC,cAAU,KAAKtH,GAAL,CAASsD,KAAT,EAAV;;AAGA,SAAKwC,WAAL,CAAiBxC,KAAjB,GAAyBgE,OAAzB;;AAGA,QAAIA,YAAY,KAAZ,IAAqBW,WAAW5E,MAAX,KAAsB,KAA/C,EAAsD;AACpD;AACD;;AAED,SAAKyC,WAAL,CAAiB5F,IAAjB;AACA,SAAK6H,cAAL,CAAoBE,UAApB;;AAEA,SAAKjI,GAAL,CAAS6D,OAAT,CAAiB,0BAAjB,EAA6C,CAACoE,WAAWtG,EAAZ,CAA7C;AACD,GAxCD;;AA8CAqE,WAASvF,SAAT,CAAmByF,QAAnB,GAA8B,YAAY;AACxC,SAAKxE,UAAL,CAAgB,KAAKmE,KAAL,CAAW8B,OAAX,CAAmB,KAAK7B,WAAxB,IAAuC,CAAvD,EAA0D,IAA1D;AACD,GAFD;;AAQAE,WAASvF,SAAT,CAAmBwF,QAAnB,GAA8B,YAAY;AACxC,SAAKvE,UAAL,CAAgB,KAAKmE,KAAL,CAAW8B,OAAX,CAAmB,KAAK7B,WAAxB,IAAuC,CAAvD,EAA0D,KAA1D;AACD,GAFD;;AAQA,WAASqC,IAAT,GAAgB;AAAA;;AACd,QAAMC,YAAYzI,EAAE,WAAF,CAAlB;;AAGA,QAAIyI,UAAUxH,MAAV,KAAqB,CAAzB,EAA4B;AAC1B;AACD;;AAEDf,cAAUwI,sBAAV,GAAmCD,UAAU9G,IAAV,CAAe,gBAAf,MAAqC,KAAK,CAA7E;AACAzB,cAAU0D,6BAAV,GAA0C6E,UAAU9G,IAAV,CAAe,WAAf,MAAgC,KAAK,CAA/E;;AAIA,QAAIzB,UAAUwI,sBAAV,KAAqC,KAAzC,EAAgD;AAC9C1I,QAAE2I,MAAF,CAAStC,SAASvF,SAAT,CAAmB2F,iBAA5B,EAA+C;AAC7CmC,oBAAY;AADiC,OAA/C;AAGD;;AAED,QAAI1I,UAAU0D,6BAAd,EAA6C;AAC3C5D,QAAE2I,MAAF,CAAStC,SAASvF,SAAT,CAAmB2F,iBAA5B,EAA+C;AAE7CU,wBAAgB,wBAACC,KAAD,EAAQtD,SAAR,EAAsB;AACpC2E,oBAAUvE,OAAV,CAAkB,qBAAlB,EAAyC,CAACJ,SAAD,CAAzC;AACD,SAJ4C;AAK7C8E,oBAAY;AALiC,OAA/C;AAOD;;AAGD5I,MAAE,sCAAF,EAA0CM,IAA1C,CAA+C,aAA/C,EAA8D,KAA9D,EAAqEF,IAArE;;AAGAJ,MAAE2I,MAAF,CAASrF,SAASxC,SAAlB,EAA6BX,WAA7B;AACAH,MAAE2I,MAAF,CAASnI,eAAeM,SAAxB,EAAmCX,WAAnC;;AAEAF,eAAW,IAAIoG,QAAJ,CAAaoC,SAAb,CAAX;;AAGA,QAAIvI,UAAU2I,iBAAd,EAAiC;AAC/BJ,gBAAU/H,IAAV,CAAe,YAAf,EAA6BsC,IAA7B,CAAkC,YAAM;AACtC,YAAM8F,SAAS9I,SAAf;;AAEAA,sBAAY8I,OAAOxI,IAAP,CAAY,KAAZ,CAAZ,SAAoCA,IAApC,CAAyC,aAAzC,EAAwDwI,OAAOnI,IAAP,EAAxD;AACAmI,eAAO1H,MAAP;AACD,OALD;AAMD;;AAGDnB,aAASI,GAAT,CAAaK,IAAb,CAAkB,YAAlB,EAAgCsC,IAAhC,CAAqC,UAACgB,CAAD,EAAIvD,OAAJ,EAAgB;AACnD,UAAMa,OAAO,IAAIgC,QAAJ,CAAa7C,OAAb,CAAb;;AAEAR,eAASiI,OAAT,CAAiB5G,IAAjB;AACD,KAJD;;AAMArB,aAASmI,cAAT,CAAwBnI,SAASiG,KAAT,CAAe,CAAf,CAAxB;;AASAlG,MAAEF,QAAF,EAAY8B,EAAZ,CAAe,OAAf,EAAwB,+BAAxB,EAAyD,YAAM;AAC7D,UAAM4D,WAAWxF,SAAjB;;AAEAwF,eAASuD,YAAT;;AAEA,UAAIvD,SAAS7D,IAAT,CAAc,YAAd,CAAJ,EAAiC;AAC/B6D,iBAASwD,UAAT,CAAoB,MAApB;AACD;AACF,KARD;;AAWAC,gBAAY,YAAM;AAChBjJ,QAAEkJ,IAAF,CAAO,EAAEC,KAAK,gCAAP,EAAP;AACD,KAFD,EAEG,MAAM,IAFT;;AAKA,QAAMzB,OAAO1H,EAAE,eAAF,CAAb;AACA,QAAI,OAAO0H,KAAK0B,UAAZ,KAA2B,WAA/B,EAA4C;AAC1C1B,WAAK0B,UAAL,CAAgB;AACd7G,iBAAS,4CAAA3B,CAAKC,EAAL,CAAQ,8BAAR,EAAwC,2BAAxC;AADK,OAAhB;AAGD;AACF;;AAED2H;AACD,CA7tBD,E;;;;;;;;;;;;;;;;ACPA,sB;;;;;;ACAA,wB","file":"js/userforms.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 7f7717b373f515738f49","/**\n * @file Manages the multi-step navigation.\n */\n\nimport jQuery from 'jquery';\nimport i18n from 'i18n';\n\njQuery(document).ready(($) => {\n // A reference to the UserForm instance.\n let userform = null;\n\n // Settings that come from the CMS.\n const CONSTANTS = {};\n\n // Common functions that extend multiple classes.\n const commonMixin = {\n /**\n * @func show\n * @desc Show the form step. Looks after aria attributes too.\n */\n show() {\n this.$el.attr('aria-hidden', false).show();\n },\n /**\n * @func hide\n * @desc Hide the form step. Looks after aria attributes too.\n */\n hide() {\n this.$el.attr('aria-hidden', true).hide();\n },\n };\n\n /**\n * @func ErrorContainer\n * @constructor\n * @param {object} element - The error container element.\n * @return {object} - The ErrorContainer instance.\n * @desc Creates an error container. Used to display step error messages at the top.\n */\n function ErrorContainer(element) {\n this.$el = element instanceof $ ? element : $(element);\n\n // Set the error container's heading.\n this.$el.find('h4').text(i18n._t('UserForms.ERROR_CONTAINER_HEADER',\n 'Please correct the following errors and try again:'));\n\n return this;\n }\n\n /**\n * @func hasErrors\n * @return boolean\n * @desc Checks if the error container has any error messages.\n */\n ErrorContainer.prototype.hasErrors = function () {\n return this.$el.find('.error-list').children().length > 0\n };\n\n /**\n * @func removeErrorMessage\n * @desc Removes an error message from the error container.\n */\n ErrorContainer.prototype.removeErrorMessage = function (fieldId) {\n this.$el.find(`#${fieldId}-top-error`).remove();\n\n // If there are no more error then hide the container.\n if (!this.hasErrors()) {\n this.hide();\n }\n };\n\n /**\n * @func addStepLink\n * @param {object} step - FormStep instance.\n * @desc Adds a link to a form step as an error message.\n */\n ErrorContainer.prototype.addStepLink = function (step) {\n const itemID = `${step.$el.attr('id')}-error-link`;\n let $itemElement = this.$el.find(`#${itemID}`);\n const stepID = step.$el.attr('id');\n const stepTitle = step.$el.data('title');\n\n // If the item already exists we don't need to do anything.\n if ($itemElement.length) {\n return;\n }\n\n $itemElement = $(`<li id=\"${itemID}\"><a href=\"#${stepID}\">${stepTitle}</a></li>`);\n\n $itemElement.on('click', (e) => {\n e.preventDefault();\n userform.jumpToStep(step.id);\n });\n\n this.$el.find('.error-list').append($itemElement);\n };\n\n /**\n * @func removeStepLink\n * @param {object} step - FormStep instance.\n * @desc Removes a step link from the error container.\n */\n ErrorContainer.prototype.removeStepLink = function (fieldId) {\n const stepID = $(`#${fieldId}`).closest('.form-step').attr('id');\n\n this.$el.find(`#${stepID}-error-link`).remove();\n\n // Hide the error container if we've just removed the last error.\n if (this.$el.find('.error-list').is(':empty')) {\n this.hide();\n }\n };\n\n /**\n * @func ErrorContainer.updateErrorMessage\n * @param {object} $input - The jQuery input object which contains the field to validate.\n * @param {object} message - The error message to display (html escaped).\n * @desc Update an error message (displayed at the top of the form).\n */\n ErrorContainer.prototype.updateErrorMessage = function ($input, message) {\n const inputID = $input.attr('id');\n let anchor = `#${inputID}`;\n const elementID = `${inputID}-top-error`;\n let messageElement = $(`#${elementID}`);\n let describedBy = $input.attr('aria-describedby');\n\n // The 'message' param will be an empty string if the field is valid.\n if (!message) {\n // Style issues as fixed if they already exist\n messageElement.addClass('fixed');\n return;\n }\n\n messageElement.removeClass('fixed');\n\n this.show();\n\n if (messageElement.length === 1) {\n // Update the existing error message.\n messageElement.show().find('a').html(message);\n } else {\n // Generate better link to field\n $input.closest('.field[id]').each(() => {\n anchor = `#${$(this).attr('id')}`;\n });\n\n // Add a new error message\n messageElement = $('<li><a></a></li>');\n messageElement\n .attr('id', elementID)\n .find('a')\n .attr('href', location.pathname + location.search + anchor)\n .html(message);\n\n this.$el.find('ul').append(messageElement);\n\n // Link back to original input via aria\n // Respect existing non-error aria-describedby\n if (!describedBy) {\n describedBy = elementID;\n } else if (!describedBy.match(new RegExp(`\\\\b${elementID}\\\\b`))) {\n // Add to end of list if not already present\n describedBy += ` ${elementID}`;\n }\n\n $input.attr('aria-describedby', describedBy);\n }\n };\n\n /**\n * @func FormStep\n * @constructor\n * @param {object} element\n * @return {object} - The FormStep instance.\n * @desc Creates a form step.\n */\n function FormStep(element) {\n const self = this;\n\n this.$el = element instanceof $ ? element : $(element);\n\n // Find button for this step\n this.$elButton = $(`.step-button-wrapper[data-for='${this.$el.prop('id')}]`);\n\n // Has the step been viewed by the user?\n this.viewed = false;\n\n // Is the form step valid?\n // This value is used on form submission, which fails, if any of the steps are invalid.\n this.valid = false;\n\n // The internal id of the step. Used for getting the step from the UserForm.steps array.\n this.id = null;\n\n this.hide();\n\n if (CONSTANTS.DISPLAY_ERROR_MESSAGES_AT_TOP) {\n this.errorContainer = new ErrorContainer(this.$el.find('.error-container'));\n\n // Listen for errors on the UserForm.\n userform.$el.on('userform.form.error', (e, validator) => {\n // The step only cares about errors if it's currently visible.\n if (!self.$el.is(':visible')) {\n return;\n }\n\n // Add or update each error in the list.\n $.each(validator.errorList, (i, error) => {\n self.errorContainer.updateErrorMessage($(error.element), error.message);\n });\n });\n\n // Listen for fields becoming valid\n userform.$el.on('userform.form.valid', (e, fieldId) => {\n self.errorContainer.removeErrorMessage(fieldId);\n });\n }\n\n // Ensure that page visibilty updates the step navigation\n this\n .$elButton\n .on('userform.field.hide userform.field.show', () => {\n userform.$el.trigger('userform.form.conditionalstep');\n });\n\n return this;\n }\n\n /**\n * Determine if this step is conditionally disabled\n *\n * @returns {Boolean}\n */\n // Because the element itself could be visible but 0 height, so check visibility of button\n FormStep.prototype.conditionallyHidden = function () {\n return !this.$elButton.find('button').is(':visible')\n };\n\n /**\n * @func ProgressBar\n * @constructor\n * @param {object} element\n * @return {object} - The Progress bar instance.\n * @desc Creates a progress bar.\n */\n function ProgressBar(element) {\n const self = this;\n\n this.$el = element instanceof $ ? element : $(element);\n this.$buttons = this.$el.find('.step-button-jump');\n this.$jsAlign = this.$el.find('.js-align');\n\n // Update the progress bar when 'step' buttons are clicked.\n this.$buttons.each((i, stepButton) => {\n $(stepButton).on('click', (e) => {\n e.preventDefault();\n self.$el.trigger('userform.progress.changestep', [parseInt($(this).data('step'), 10)]);\n });\n });\n\n // Update the progress bar when 'prev' and 'next' buttons are clicked.\n userform.$el.on('userform.form.changestep', (e, stepID) => {\n self.update(stepID);\n });\n\n // Listen for steps being conditionally shown / hidden by display rules.\n // We need to update step related UI like the number of step buttons\n // and any text that shows the total number of steps.\n userform.$el.on('userform.form.conditionalstep', () => {\n // Update the step numbers on the buttons.\n const $visibleButtons = self.$buttons.filter(':visible');\n\n $visibleButtons.each((i, button) => {\n $(button).text(i + 1);\n });\n\n // Update the actual progress bar.\n self.$el.find('.progress-bar').attr('aria-valuemax', $visibleButtons.length);\n\n // Update any text that uses the total number of steps.\n self.$el.find('.total-step-number').text($visibleButtons.length);\n });\n\n // Spaces out the steps below progress bar evenly\n this.$jsAlign.each((index, button) => {\n const $button = $(button);\n const leftPercent = (100 / (self.$jsAlign.length - 1) * `${index}%`);\n const buttonOffset = -1 * ($button.innerWidth() / 2);\n\n $button.css({ left: leftPercent, marginLeft: buttonOffset });\n\n // First and last buttons are kept within userform-progress container\n if (index === self.$jsAlign.length - 1) {\n $button.css({ marginLeft: buttonOffset * 2 });\n } else if (index === 0) {\n $button.css({ marginLeft: 0 });\n }\n });\n\n this.update(0);\n\n return this;\n }\n\n /**\n * @func ProgressBar.update\n * @param {number} stepID - Zero based index of the new step.\n * @desc Update the progress element to show a new step.\n */\n ProgressBar.prototype.update = function (stepID) {\n const $newStepElement = $($('.form-step')[stepID]);\n let stepNumber = 0;\n let barWidth = stepID / (this.$buttons.length - 1) * 100;\n\n // Set the current step number.\n this.$buttons.each((i, button) => {\n if (i > stepID) {\n // Break the loop\n return false;\n }\n\n if ($(button).is(':visible')) {\n stepNumber += 1;\n }\n return true;\n });\n\n // Update elements that contain the current step number.\n this.$el.find('.current-step-number').each((i, element) => {\n $(element).text(stepNumber);\n });\n\n // Update aria attributes.\n this.$el.find('[aria-valuenow]').each((i, element) => {\n $(element).attr('aria-valuenow', stepNumber);\n });\n\n // Update the CSS classes on step buttons.\n this.$buttons.each((i, element) => {\n const $element = $(element);\n const $item = $element.parent();\n\n if (parseInt($element.data('step'), 10) === stepNumber && $element.is(':visible')) {\n $item.addClass('current viewed');\n $element.removeAttr('disabled');\n\n return;\n }\n\n $item.removeClass('current');\n });\n\n // Update the progress bar's title with the new step's title.\n this.$el.siblings('.progress-title').text($newStepElement.data('title'));\n\n // Update the width of the progress bar.\n barWidth = barWidth ? `${barWidth}%` : '';\n this.$el.find('.progress-bar').width(barWidth);\n };\n\n /**\n * @func FormActions\n * @constructor\n * @param {object} element\n * @desc Creates the navigation and actions (Prev, Next, Submit buttons).\n */\n function FormActions(element) {\n const self = this;\n\n this.$el = element instanceof $ ? element : $(element);\n\n this.$prevButton = this.$el.find('.step-button-prev');\n this.$nextButton = this.$el.find('.step-button-next');\n\n // Show the buttons.\n this.$prevButton.parent().attr('aria-hidden', false).show();\n this.$nextButton.parent().attr('aria-hidden', false).show();\n\n // Bind the step navigation event listeners.\n this.$prevButton.on('click', (e) => {\n e.preventDefault();\n self.$el.trigger('userform.action.prev');\n });\n this.$nextButton.on('click', (e) => {\n e.preventDefault();\n self.$el.trigger('userform.action.next');\n });\n\n // Listen for changes to the current form step, or conditional pages,\n // so we can show hide buttons appropriately.\n userform.$el.on('userform.form.changestep userform.form.conditionalstep', () => {\n self.update();\n });\n\n this.update();\n\n return this;\n }\n\n /**\n * @func FormActions.update\n * @param {number} stepID - Zero based ID of the current step.\n * @desc Updates the form actions element to reflect the current state of the page.\n */\n FormActions.prototype.update = function () {\n const numberOfSteps = userform.steps.length;\n const stepID = userform.currentStep ? userform.currentStep.id : 0;\n let i = null;\n let lastStep = null;\n\n // Update the \"Prev\" button.\n this.$el.find('.step-button-prev')[stepID === 0 ? 'hide' : 'show']();\n\n // Find last step, skipping hidden ones\n for (i = numberOfSteps - 1; i >= 0; i--) {\n lastStep = userform.steps[i];\n\n // Skip if step is hidden\n if (lastStep.conditionallyHidden()) {\n continue;\n }\n\n // Update the \"Next\" button.\n this.$el.find('.step-button-next')[stepID >= i ? 'hide' : 'show']();\n\n // Update the \"Actions\".\n this.$el.find('.Actions')[stepID >= i ? 'show' : 'hide']();\n\n // Stop processing last step\n break;\n }\n };\n\n /**\n * @func UserForm\n * @constructor\n * @param {object} element\n * @return {object} - The UserForm instance.\n * @desc The form\n */\n function UserForm(element) {\n const self = this;\n\n this.$el = element instanceof $ ? element : $(element);\n this.steps = [];\n\n // Add an error container which displays a list of invalid steps on form submission.\n this.errorContainer = new ErrorContainer(this.$el.children('.error-container'));\n\n // Listen for events triggered by form steps.\n this.$el.on('userform.action.prev', () => {\n self.prevStep();\n });\n this.$el.on('userform.action.next', () => {\n self.nextStep();\n });\n\n // Listen for events triggered by the progress bar.\n $('#userform-progress').on('userform.progress.changestep', (e, stepNumber) => {\n self.jumpToStep(stepNumber - 1);\n });\n\n // When a field becomes valid, remove errors from the error container.\n this.$el.on('userform.form.valid', (e, fieldId) => {\n self.errorContainer.removeStepLink(fieldId);\n });\n\n this.$el.validate(this.validationOptions);\n\n // Ensure checkbox groups are validated correctly\n $('.optionset.requiredField input').each(() => {\n $(this).rules('add', {\n required: true,\n });\n });\n\n return this;\n }\n\n /*\n * Default options for step validation. These get extended in main().\n */\n UserForm.prototype.validationOptions = {\n ignore: ':hidden,ul',\n errorClass: 'error',\n errorElement: 'span',\n errorPlacement: (error, element) => {\n error.addClass('message');\n\n if (element.is(':radio') || element.parents('.checkboxset').length > 0) {\n error.appendTo(element.closest('.middleColumn'));\n } else if (element.parents('.checkbox').length > 0) {\n error.appendTo(element.closest('.field'));\n } else {\n error.insertAfter(element);\n }\n },\n invalidHandler: (event, validator) => {\n // setTimeout 0 so it runs after errorPlacement\n setTimeout(() => {\n validator.currentElements.filter('.error').first().focus();\n }, 0);\n },\n // Callback for handling the actual submit when the form is valid.\n // Submission in the jQuery.validate sence is handled at step level.\n // So when the final step is submitted we have to also check all previous steps are valid.\n submitHandler: (form) => {\n let isValid = true;\n\n // Validate the current step\n if (userform.currentStep) {\n userform.currentStep.valid = $(form).valid();\n }\n\n // Check for invalid previous steps.\n $.each(userform.steps, (i, step) => {\n if (!step.valid && !step.conditionallyHidden()) {\n isValid = false;\n userform.errorContainer.addStepLink(step);\n }\n });\n\n if (isValid) {\n // When using the \"are you sure?\" plugin, ensure the form immediately submits.\n $(form).removeClass('dirty');\n\n form.submit();\n } else {\n userform.errorContainer.show();\n }\n },\n // When a field becomes valid.\n success: (error) => {\n const errorId = $(error).attr('id');\n const fieldId = errorId.substr(0, errorId.indexOf('-error')).replace(/[\\\\[\\\\]]/, '');\n\n // Remove square brackets since jQuery.validate.js uses idOrName,\n // which breaks further on when using a selector that end with\n // square brackets.\n\n error.remove();\n\n // Pass the field's ID with the event.\n userform.$el.trigger('userform.form.valid', [fieldId]);\n },\n };\n\n /**\n * @func UserForm.addStep\n * @param {object} step - An instance of FormStep.\n * @desc Adds a step to the UserForm.\n */\n UserForm.prototype.addStep = function (step) {\n // Make sure we're dealing with a form step.\n if (!step instanceof FormStep) {\n return;\n }\n\n // eslint-disable-next-line no-param-reassign\n step.id = this.steps.length;\n\n this.steps.push(step);\n };\n\n /**\n * @func UserForm.setCurrentStep\n * @param {object} step - An instance of FormStep.\n * @desc Sets the step the user is currently on.\n */\n UserForm.prototype.setCurrentStep = function (step) {\n // Make sure we're dealing with a form step.\n if (!(step instanceof FormStep)) {\n return;\n }\n\n this.currentStep = step;\n this.currentStep.show();\n\n // Record the user has viewed the step.\n this.currentStep.viewed = true;\n this.currentStep.$el.addClass('viewed');\n };\n\n /**\n * @func UserForm.jumpToStep\n * @param {number} stepNumber\n * @param {boolean} [direction] - Defaults to forward (true).\n * @desc Jumps to a specific form step.\n */\n UserForm.prototype.jumpToStep = function (stepNumber, direction) {\n const targetStep = this.steps[stepNumber];\n let isValid = false;\n const forward = direction === void 0 ? true : direction;\n\n // Make sure the target step exists.\n if (targetStep === void 0) {\n return;\n }\n\n // Make sure the step we're trying to set as current is not\n // hidden by custom display rules. If it is then jump to the next step.\n if (targetStep.conditionallyHidden()) {\n if (forward) {\n this.jumpToStep(stepNumber + 1);\n } else {\n this.jumpToStep(stepNumber - 1);\n }\n\n return;\n }\n\n // Validate the form.\n // This well effectivly validate the current step and not the entire form.\n // This is because hidden fields are excluded from validation, and all fields\n // on all other steps, are currently hidden.\n isValid = this.$el.valid();\n\n // Set the 'valid' property on the current step.\n this.currentStep.valid = isValid;\n\n // Users can navigate to step's they've already viewed even if the current step is invalid.\n if (isValid === false && targetStep.viewed === false) {\n return;\n }\n\n this.currentStep.hide();\n this.setCurrentStep(targetStep);\n\n this.$el.trigger('userform.form.changestep', [targetStep.id]);\n };\n\n /**\n * @func UserForm.nextStep\n * @desc Advances the form to the next step.\n */\n UserForm.prototype.nextStep = function () {\n this.jumpToStep(this.steps.indexOf(this.currentStep) + 1, true);\n };\n\n /**\n * @func UserForm.prevStep\n * @desc Goes back one step (not bound to browser history).\n */\n UserForm.prototype.prevStep = function () {\n this.jumpToStep(this.steps.indexOf(this.currentStep) - 1, false);\n };\n\n /**\n * @func main\n * @desc Bootstraps the front-end.\n */\n function main() {\n const $userform = $('.userform');\n\n // If there's no userform, do nothing.\n if ($userform.length === 0) {\n return;\n }\n\n CONSTANTS.ENABLE_LIVE_VALIDATION = $userform.data('livevalidation') !== void 0;\n CONSTANTS.DISPLAY_ERROR_MESSAGES_AT_TOP = $userform.data('toperrors') !== void 0;\n\n // Extend the default validation options with conditional options\n // that are set by the user in the CMS.\n if (CONSTANTS.ENABLE_LIVE_VALIDATION === false) {\n $.extend(UserForm.prototype.validationOptions, {\n onfocusout: false,\n });\n }\n\n if (CONSTANTS.DISPLAY_ERROR_MESSAGES_AT_TOP) {\n $.extend(UserForm.prototype.validationOptions, {\n // Callback for custom code when an invalid form / step is submitted.\n invalidHandler: (event, validator) => {\n $userform.trigger('userform.form.error', [validator]);\n },\n onfocusout: false,\n });\n }\n\n // Display all the things that are hidden when JavaScript is disabled.\n $('.userform-progress, .step-navigation').attr('aria-hidden', false).show();\n\n // Extend classes with common functionality.\n $.extend(FormStep.prototype, commonMixin);\n $.extend(ErrorContainer.prototype, commonMixin);\n\n userform = new UserForm($userform);\n\n // Conditionally hide field labels and use HTML5 placeholder instead.\n if (CONSTANTS.HIDE_FIELD_LABELS) {\n $userform.find('label.left').each(() => {\n const $label = $(this);\n\n $(`[name=\"${$label.attr('for')}\"]`).attr('placeholder', $label.text());\n $label.remove();\n });\n }\n\n // Initialise the form steps.\n userform.$el.find('.form-step').each((i, element) => {\n const step = new FormStep(element);\n\n userform.addStep(step);\n });\n\n userform.setCurrentStep(userform.steps[0]);\n\n // Initialise actions and progressbar\n // @todo Commented out because they appear unused - are they expected to be exported to the\n // global scope? Check this works on the frontend\n // const progressBar = new ProgressBar($('#userform-progress'));\n // const formActions = new FormActions($('#step-navigation'));\n\n // Enable jQuery UI datepickers\n $(document).on('click', 'input.text[data-showcalendar]', () => {\n const $element = $(this);\n\n $element.ssDatepicker();\n\n if ($element.data('datepicker')) {\n $element.datepicker('show');\n }\n });\n\n // Make sure the form doesn't expire on the user. Pings every 3 mins.\n setInterval(() => {\n $.ajax({ url: 'UserDefinedFormController/ping' });\n }, 180 * 1000);\n\n // Bind a confirmation message when navigating away from a partially completed form.\n const form = $('form.userform');\n if (typeof form.areYouSure !== 'undefined') {\n form.areYouSure({\n message: i18n._t('UserForms.LEAVE_CONFIRMATION', 'You have unsaved changes!'),\n });\n }\n }\n\n main();\n});\n\n\n\n// WEBPACK FOOTER //\n// ./client/src/bundles/UserForms.js","module.exports = i18n;\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"i18n\"\n// module id = 2\n// module chunks = 0","module.exports = jQuery;\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"jQuery\"\n// module id = 3\n// module chunks = 0"],"sourceRoot":""}

View File

@ -1 +0,0 @@
{"version":3,"sources":["webpack:///./client/src/styles/C:/Users/dwagstaff/work/testymctestface/vendor/silverstripe/userforms/client/src/styles/C:/Users/dwagstaff/work/testymctestface/vendor/silverstripe/userforms/client/src/styles/userforms-cms.scss?cdcf","webpack:///./client/src/styles/C:/Users/dwagstaff/work/testymctestface/vendor/silverstripe/userforms/bundle-cms.scss?a5bb"],"names":[],"mappings":"AAAA,iBACE,iBCCD,uDDKK,YCDL,oHDKO,gBCAP,0DDIO,qBACA,sBACA,gBACA,mBCAP,qEDGS,uBCCT,+DDIO,gBCAP,wEDIO,0HCAP,+EDIO,YCAP,mEDIO,UACA,kBACA,cCAP,yEDGS,gBCCT,sFDGS,+CACA,eACA,iBCCT,8IDOO,gBCFP,6JDOO,mBCFP,oRDSO,mBACA,WCJP,6IDQO,gBACA,WACA,eACA,iBCJP,+ODQQ,6BCJR,uKDSS,WCLT,6KDUW,cCNX,4IDcQ,6BCVR,4JDcO,gBACA,iBACA,cCVP,+IDgBO,gCCZP,oPDgBS,aCZT,iKDgBO,aCZP,iCDkBG,eACA,SACA,UACA,mBACA,gCACA,aACA,kBCdH,+CDiBK,gBCbL,qDDiBK","file":"styles/userforms-cms.css","sourcesContent":[".uf-field-editor {\n padding-bottom: 0;\n\n // Row styles\n .grid-field__table {\n // Standard rows\n .ss-gridfield-item {\n height: 46px;\n\n &,\n &:hover {\n background: $white;\n }\n\n td {\n border-right-width: 0;\n vertical-align: middle;\n padding-top: 6px;\n padding-bottom: 6px;\n\n &:last-child {\n border-right-width: 1px;\n }\n }\n\n .handle {\n min-height: 46px;\n }\n\n &.flash-background {\n animation: flash-background 2s linear;\n }\n\n &.ui-sortable-placeholder {\n height: 50px;\n }\n\n .form-group {\n padding: 0;\n margin-bottom: 2px;\n color: $gray-700;\n\n &:after {\n border-bottom: 0;\n }\n\n .form__field-label {\n flex: auto;\n max-width: 100%;\n padding-bottom: 0;\n }\n }\n }\n\n .ss-gridfield-item.infieldgroup {\n &,\n &:hover {\n background: $white;\n }\n\n .col-reorder,\n .handle {\n background: $gray-200;\n }\n }\n\n .ss-gridfield-item[data-class=\"SilverStripe\\\\UserForms\\\\Model\\\\EditableFormField\\\\EditableFormStep\"] {\n &,\n &:hover {\n background: $gray-650;\n color: $white;\n }\n\n label {\n font-weight: bold;\n color: $white;\n font-size: 15px;\n padding-bottom: 0;\n }\n\n + .ss-gridfield-item[data-class=\"SilverStripe\\\\UserForms\\\\Model\\\\EditableFormField\\\\EditableFieldGroup\"] td {\n border-top: 3px solid $gray-200;\n }\n\n .grid-field__icon-action {\n &:before {\n color: $white;\n }\n\n &:hover {\n &:before {\n color: $gray-650;\n }\n }\n }\n }\n\n .ss-gridfield-item[data-class=\"SilverStripe\\\\UserForms\\\\Model\\\\EditableFormField\\\\EditableFieldGroup\"] {\n td {\n border-top: 3px solid $gray-200;\n }\n\n .form__field-label {\n font-weight: bold;\n padding-bottom: 0;\n color: $gray-700;\n }\n }\n\n .ss-gridfield-item[data-class=\"SilverStripe\\\\UserForms\\\\Model\\\\EditableFormField\\\\EditableFieldGroupEnd\"] {\n td {\n border-bottom: 3px solid $gray-200;\n }\n\n + .ss-gridfield-item[data-class=\"SilverStripe\\\\UserForms\\\\Model\\\\EditableFormField\\\\EditableFieldGroupEnd\"] {\n border-top: 0;\n }\n\n .col-buttons .action {\n display: none;\n }\n }\n }\n\n .sticky-buttons {\n position: fixed;\n top: 73px;\n z-index: 2;\n background: $body-bg;\n border-bottom: 1px solid $border-color-light;\n padding: 12px;\n margin-left: -12px;\n\n & button.action {\n margin-bottom: 0;\n }\n\n ~ .ss-gridfield-table {\n margin-top: 73px;\n }\n }\n}\n\n\n\n\n// WEBPACK FOOTER //\n// ./client/src/styles/C:/Users/dwagstaff/work/testymctestface/vendor/silverstripe/userforms/client/src/styles/C:/Users/dwagstaff/work/testymctestface/vendor/silverstripe/userforms/client/src/styles/userforms-cms.scss",".uf-field-editor {\n padding-bottom: 0;\n}\n\n.uf-field-editor .grid-field__table .ss-gridfield-item {\n height: 46px;\n}\n\n.uf-field-editor .grid-field__table .ss-gridfield-item,\n.uf-field-editor .grid-field__table .ss-gridfield-item:hover {\n background: #fff;\n}\n\n.uf-field-editor .grid-field__table .ss-gridfield-item td {\n border-right-width: 0;\n vertical-align: middle;\n padding-top: 6px;\n padding-bottom: 6px;\n}\n\n.uf-field-editor .grid-field__table .ss-gridfield-item td:last-child {\n border-right-width: 1px;\n}\n\n.uf-field-editor .grid-field__table .ss-gridfield-item .handle {\n min-height: 46px;\n}\n\n.uf-field-editor .grid-field__table .ss-gridfield-item.flash-background {\n animation: flash-background 2s linear;\n}\n\n.uf-field-editor .grid-field__table .ss-gridfield-item.ui-sortable-placeholder {\n height: 50px;\n}\n\n.uf-field-editor .grid-field__table .ss-gridfield-item .form-group {\n padding: 0;\n margin-bottom: 2px;\n color: #4f5861;\n}\n\n.uf-field-editor .grid-field__table .ss-gridfield-item .form-group:after {\n border-bottom: 0;\n}\n\n.uf-field-editor .grid-field__table .ss-gridfield-item .form-group .form__field-label {\n flex: auto;\n max-width: 100%;\n padding-bottom: 0;\n}\n\n.uf-field-editor .grid-field__table .ss-gridfield-item.infieldgroup,\n.uf-field-editor .grid-field__table .ss-gridfield-item.infieldgroup:hover {\n background: #fff;\n}\n\n.uf-field-editor .grid-field__table .ss-gridfield-item.infieldgroup .col-reorder,\n.uf-field-editor .grid-field__table .ss-gridfield-item.infieldgroup .handle {\n background: #e7e9ec;\n}\n\n.uf-field-editor .grid-field__table .ss-gridfield-item[data-class=\"SilverStripe\\\\UserForms\\\\Model\\\\EditableFormField\\\\EditableFormStep\"],\n.uf-field-editor .grid-field__table .ss-gridfield-item[data-class=\"SilverStripe\\\\UserForms\\\\Model\\\\EditableFormField\\\\EditableFormStep\"]:hover {\n background: #66727d;\n color: #fff;\n}\n\n.uf-field-editor .grid-field__table .ss-gridfield-item[data-class=\"SilverStripe\\\\UserForms\\\\Model\\\\EditableFormField\\\\EditableFormStep\"] label {\n font-weight: bold;\n color: #fff;\n font-size: 15px;\n padding-bottom: 0;\n}\n\n.uf-field-editor .grid-field__table .ss-gridfield-item[data-class=\"SilverStripe\\\\UserForms\\\\Model\\\\EditableFormField\\\\EditableFormStep\"] + .ss-gridfield-item[data-class=\"SilverStripe\\\\UserForms\\\\Model\\\\EditableFormField\\\\EditableFieldGroup\"] td {\n border-top: 3px solid #e7e9ec;\n}\n\n.uf-field-editor .grid-field__table .ss-gridfield-item[data-class=\"SilverStripe\\\\UserForms\\\\Model\\\\EditableFormField\\\\EditableFormStep\"] .grid-field__icon-action:before {\n color: #fff;\n}\n\n.uf-field-editor .grid-field__table .ss-gridfield-item[data-class=\"SilverStripe\\\\UserForms\\\\Model\\\\EditableFormField\\\\EditableFormStep\"] .grid-field__icon-action:hover:before {\n color: #66727d;\n}\n\n.uf-field-editor .grid-field__table .ss-gridfield-item[data-class=\"SilverStripe\\\\UserForms\\\\Model\\\\EditableFormField\\\\EditableFieldGroup\"] td {\n border-top: 3px solid #e7e9ec;\n}\n\n.uf-field-editor .grid-field__table .ss-gridfield-item[data-class=\"SilverStripe\\\\UserForms\\\\Model\\\\EditableFormField\\\\EditableFieldGroup\"] .form__field-label {\n font-weight: bold;\n padding-bottom: 0;\n color: #4f5861;\n}\n\n.uf-field-editor .grid-field__table .ss-gridfield-item[data-class=\"SilverStripe\\\\UserForms\\\\Model\\\\EditableFormField\\\\EditableFieldGroupEnd\"] td {\n border-bottom: 3px solid #e7e9ec;\n}\n\n.uf-field-editor .grid-field__table .ss-gridfield-item[data-class=\"SilverStripe\\\\UserForms\\\\Model\\\\EditableFormField\\\\EditableFieldGroupEnd\"] + .ss-gridfield-item[data-class=\"SilverStripe\\\\UserForms\\\\Model\\\\EditableFormField\\\\EditableFieldGroupEnd\"] {\n border-top: 0;\n}\n\n.uf-field-editor .grid-field__table .ss-gridfield-item[data-class=\"SilverStripe\\\\UserForms\\\\Model\\\\EditableFormField\\\\EditableFieldGroupEnd\"] .col-buttons .action {\n display: none;\n}\n\n.uf-field-editor .sticky-buttons {\n position: fixed;\n top: 73px;\n z-index: 2;\n background: #f6f7f8;\n border-bottom: 1px solid #e5e8eb;\n padding: 12px;\n margin-left: -12px;\n}\n\n.uf-field-editor .sticky-buttons button.action {\n margin-bottom: 0;\n}\n\n.uf-field-editor .sticky-buttons ~ .ss-gridfield-table {\n margin-top: 73px;\n}\n\n\n\n\n// WEBPACK FOOTER //\n// ./client/src/styles/C:/Users/dwagstaff/work/testymctestface/vendor/silverstripe/userforms/bundle-cms.scss"],"sourceRoot":""}

View File

@ -1 +0,0 @@
{"version":3,"sources":["webpack:///./client/src/styles/C:/Users/dwagstaff/work/testymctestface/vendor/silverstripe/userforms/client/src/styles/C:/Users/dwagstaff/work/testymctestface/vendor/silverstripe/userforms/client/src/styles/userforms.scss?cda5","webpack:///./client/src/styles/C:/Users/dwagstaff/work/testymctestface/vendor/silverstripe/userforms/bundle.scss?5b3a"],"names":[],"mappings":"AAEA,6BAEI,kBACA,WACA,mBCFH,iCDMG,kBACA,WACA,mBCFH,iCDMG,cACA,kBCFH,wCDMG,qBACA,qBCFH,iEDKK,UCDL,qCDMG,kBACA,MACA,WCFH,+BDQG,cCJH,sCDQG,qBACA,qBCJH,UDSC,WACA,WACA,eCLD,6BDQG,cCJH,gBDSC,yBACA,kBACA,YACA,gBACA,mBCLD,uBDQG,iBACA,kBACA,SACA,WCJH,aDSC,WACA,cCLD,uBDSC,eCLD,gBDSC,kBACA","file":"styles/userforms.css","sourcesContent":["// Lightweight base styles for the front-end form.\n\n.userform-progress {\n .progress {\n position: relative;\n height: 1em;\n background: $gray-200;\n }\n\n .progress-bar {\n position: absolute;\n height: 1em;\n background: $gray-650;\n }\n\n .step-buttons {\n margin-left: 0;\n position: relative;\n }\n\n .step-button-wrapper {\n display: inline-block;\n list-style-type: none;\n\n &.viewed .step-button-jump {\n opacity: 1;\n }\n }\n\n .step-button-jump {\n position: absolute;\n top: 0;\n opacity: .7;\n }\n}\n\n.step-navigation {\n .step-buttons {\n margin-left: 0;\n }\n\n .step-button-wrapper {\n display: inline-block;\n list-style-type: none;\n }\n}\n\n.userform {\n clear: both;\n width: 100%;\n max-width: 100%;\n\n .field label.right {\n color: $gray-800;\n }\n}\n\n.userformsgroup {\n border: 1px solid $gray-300;\n border-radius: 4px;\n padding: 8px;\n margin-top: 12px;\n margin-bottom: 12px;\n\n > legend {\n padding-left: 4px;\n padding-right: 4px;\n border: 0;\n width: auto;\n }\n}\n\n.right-title {\n clear: both;\n display: block;\n}\n\n.checkbox .right-title {\n display: inline;\n}\n\n.userform .left {\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./client/src/styles/C:/Users/dwagstaff/work/testymctestface/vendor/silverstripe/userforms/client/src/styles/C:/Users/dwagstaff/work/testymctestface/vendor/silverstripe/userforms/client/src/styles/userforms.scss",".userform-progress .progress {\n position: relative;\n height: 1em;\n background: #e7e9ec;\n}\n\n.userform-progress .progress-bar {\n position: absolute;\n height: 1em;\n background: #66727d;\n}\n\n.userform-progress .step-buttons {\n margin-left: 0;\n position: relative;\n}\n\n.userform-progress .step-button-wrapper {\n display: inline-block;\n list-style-type: none;\n}\n\n.userform-progress .step-button-wrapper.viewed .step-button-jump {\n opacity: 1;\n}\n\n.userform-progress .step-button-jump {\n position: absolute;\n top: 0;\n opacity: .7;\n}\n\n.step-navigation .step-buttons {\n margin-left: 0;\n}\n\n.step-navigation .step-button-wrapper {\n display: inline-block;\n list-style-type: none;\n}\n\n.userform {\n clear: both;\n width: 100%;\n max-width: 100%;\n}\n\n.userform .field label.right {\n color: #383f45;\n}\n\n.userformsgroup {\n border: 1px solid #d3d8dc;\n border-radius: 4px;\n padding: 8px;\n margin-top: 12px;\n margin-bottom: 12px;\n}\n\n.userformsgroup > legend {\n padding-left: 4px;\n padding-right: 4px;\n border: 0;\n width: auto;\n}\n\n.right-title {\n clear: both;\n display: block;\n}\n\n.checkbox .right-title {\n display: inline;\n}\n\n.userform .left {\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n\n\n// WEBPACK FOOTER //\n// ./client/src/styles/C:/Users/dwagstaff/work/testymctestface/vendor/silverstripe/userforms/bundle.scss"],"sourceRoot":""}

View File

@ -284,10 +284,14 @@ jQuery(document).ready(($) => {
// Spaces out the steps below progress bar evenly // Spaces out the steps below progress bar evenly
this.$jsAlign.each((index, button) => { this.$jsAlign.each((index, button) => {
const $button = $(button); const $button = $(button);
const leftPercent = (100 / (self.$jsAlign.length - 1) * `${index}%`); const leftPercent = 100 / (self.$jsAlign.length - 1) * index;
const leftPercentCssValue = `${leftPercent}%`;
const buttonOffset = -1 * ($button.innerWidth() / 2); const buttonOffset = -1 * ($button.innerWidth() / 2);
$button.css({ left: leftPercent, marginLeft: buttonOffset }); $button.css({
left: leftPercentCssValue,
marginLeft: buttonOffset,
});
// First and last buttons are kept within userform-progress container // First and last buttons are kept within userform-progress container
if (index === self.$jsAlign.length - 1) { if (index === self.$jsAlign.length - 1) {
@ -707,10 +711,8 @@ jQuery(document).ready(($) => {
userform.setCurrentStep(userform.steps[0]); userform.setCurrentStep(userform.steps[0]);
// Initialise actions and progressbar // Initialise actions and progressbar
// @todo Commented out because they appear unused - are they expected to be exported to the const progressBar = new ProgressBar($('#userform-progress'));
// global scope? Check this works on the frontend const formActions = new FormActions($('#step-navigation'));
// const progressBar = new ProgressBar($('#userform-progress'));
// const formActions = new FormActions($('#step-navigation'));
// Enable jQuery UI datepickers // Enable jQuery UI datepickers
$(document).on('click', 'input.text[data-showcalendar]', () => { $(document).on('click', 'input.text[data-showcalendar]', () => {