diff --git a/CHANGELOG.md b/CHANGELOG.md index 96389a5165f..e24dc6cd422 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,9 @@ # Release Notes for Craft CMS 4 -## Unreleased +## 4.3.6.1 - 2023-01-09 - Element edit pages now retain their previous scroll position when they’re automatically refreshed to keep up with changes from another browser tab. +- Fixed a bug where editing certain Matrix/Neo/Super Table fields could result in content loss. ([#12445](https://github.com/craftcms/cms/issues/12445)) ## 4.3.6 - 2023-01-04 diff --git a/src/config/app.php b/src/config/app.php index 7d6fc2b0d5e..5f621cf83ff 100644 --- a/src/config/app.php +++ b/src/config/app.php @@ -3,7 +3,7 @@ return [ 'id' => 'CraftCMS', 'name' => 'Craft CMS', - 'version' => '4.3.6', + 'version' => '4.3.6.1', 'schemaVersion' => '4.4.0.1', 'minVersionRequired' => '3.7.11', 'basePath' => dirname(__DIR__), // Defines the @app alias diff --git a/src/web/assets/cp/dist/cp.js b/src/web/assets/cp/dist/cp.js index db9faecfc3f..ac576e913ba 100644 --- a/src/web/assets/cp/dist/cp.js +++ b/src/web/assets/cp/dist/cp.js @@ -1,2 +1,2 @@ -(function(){var __webpack_modules__={463:function(){Craft.Accordion=Garnish.Base.extend({$trigger:null,targetSelector:null,_$target:null,init:function(t){var e=this;this.$trigger=$(t),this.$trigger.data("accordion")&&(console.warn("Double-instantiating an accordion trigger on an element"),this.$trigger.data("accordion").destroy()),this.$trigger.data("accordion",this),this.targetSelector=this.$trigger.attr("aria-controls")?"#".concat(this.$trigger.attr("aria-controls")):null,this.targetSelector&&(this._$target=$(this.targetSelector)),this.addListener(this.$trigger,"click","onTriggerClick"),this.addListener(this.$trigger,"keypress",(function(t){var i=t.keyCode;i!==Garnish.SPACE_KEY&&i!==Garnish.RETURN_KEY||(t.preventDefault(),e.onTriggerClick())}))},onTriggerClick:function(){"true"===this.$trigger.attr("aria-expanded")?this.hideTarget(this._$target):this.showTarget(this._$target)},showTarget:function(t){var e=this;if(t&&t.length){this.showTarget._currentHeight=t.height(),t.removeClass("hidden"),this.$trigger.removeClass("collapsed").addClass("expanded").attr("aria-expanded","true");for(var i=0;i<t.length;i++)!function(t){"SPAN"!==t.prop("nodeName")&&(t.height("auto"),e.showTarget._targetHeight=t.height(),t.css({height:e.showTarget._currentHeight,overflow:"hidden"}),t.velocity("stop"),t.velocity({height:e.showTarget._targetHeight},Garnish.getUserPreferredAnimationDuration("fast"),(function(){t.css({height:"",overflow:""})})))}(t.eq(i));delete this.showTarget._targetHeight,delete this.showTarget._currentHeight,Garnish.$win.trigger("resize")}},hideTarget:function(t){if(t&&t.length){this.$trigger.removeClass("expanded").addClass("collapsed").attr("aria-expanded","false");for(var e=0;e<t.length;e++)!function(t){t.hasClass("hidden")||("SPAN"===t.prop("nodeName")?t.addClass("hidden"):(t.css("overflow","hidden"),t.velocity("stop"),t.velocity({height:0},Garnish.getUserPreferredAnimationDuration("fast"),(function(){t.addClass("hidden")}))))}(t.eq(e))}},destroy:function(){this.$trigger.removeData("accordion"),this.base()}})},3839:function(){Craft.AddressesInput=Garnish.Base.extend({$container:null,$addBtn:null,$addBtnItem:null,$cards:null,init:function(t,e){var i=this;this.$container=$(t),this.setSettings(e,Craft.AddressesInput.defaults),this.$container.data("addresses")&&(console.warn("Double-instantiating an address input on an element"),this.$container.data("addresses").destroy()),this.$container.data("addresses",this),this.$addBtn=this.$container.find(".address-cards__add-btn"),this.$addBtnItem=this.$addBtn.closest("li"),this.$cards=this.$container.find("> .address-card");for(var s=0;s<this.$cards.length;s++)this.initCard(this.$cards.eq(s));this.updateAddButton(),this.addListener(this.$addBtn,"click",(function(){i.createAddress()}))},initCard:function(t){var e=this;this.addListener(t,"click",(function(i){$(i.target).closest(".menubtn").length||e.editAddress(t)}));var i=t.find(".menubtn").disclosureMenu();if(i.length){var s=i.data("trigger"),a=s.$container,n=a.find('[data-action="edit"]');this.addListener(n,"click",(function(i){i.stopPropagation(),e.editAddress(t)}));var r=a.find('[data-action="delete"]');this.addListener(r,"click",(function(i){if(i.preventDefault(),i.stopPropagation(),confirm(Craft.t("app","Are you sure you want to delete this address?"))){e.$addBtn.addClass("loading");var n=t.data("id"),r=t.data("draft-id");Craft.sendActionRequest("POST","elements/delete",{data:{elementId:n,draftId:r}}).then((function(){t.remove(),a.remove(),s.destroy(),e.$cards=e.$cards.not(t),e.updateAddButton(),e.trigger("deleteAddress",{addressId:n,draftId:r})})).finally((function(){e.$addBtn.removeClass("loading")}))}}))}},editAddress:function(t,e){var i=this;Craft.createElementEditor("craft\\elements\\Address",t,e).on("submit",(function(e){i.trigger("saveAddress",{data:e.data}),Craft.sendActionRequest("POST","addresses/card-html",{data:{addressId:e.data.id}}).then((function(e){var s=$(e.data.html);t?(t.replaceWith(s),i.$cards=i.$cards.not(t)):s.insertBefore(i.$addBtnItem),Craft.initUiElements(s),i.initCard(s),i.$cards=i.$cards.add(s),i.updateAddButton()}))}))},updateAddButton:function(){this.canCreateAddress()?this.$addBtn.removeClass("hidden"):this.$addBtn.addClass("hidden")},canCreateAddress:function(){return!this.settings.maxAddresses||this.$cards.length<this.settings.maxAddresses},createAddress:function(){var t=this;if(!this.canCreateAddress())throw"No more addresses can be created.";this.$addBtn.addClass("loading"),Craft.sendActionRequest("POST","elements/create",{data:{elementType:"craft\\elements\\Address",ownerId:this.settings.ownerId}}).then((function(e){t.editAddress(null,{elementId:e.data.element.id,draftId:e.data.element.draftId})})).finally((function(){t.$addBtn.removeClass("loading")}))},destroy:function(){this.$container.removeData("addresses"),this.base()}},{ownerId:null,defaults:{maxAddresses:null}})},7452:function(){Craft.AdminTable=Garnish.Base.extend({settings:null,totalItems:null,sorter:null,$noItems:null,$table:null,$tbody:null,$deleteBtns:null,init:function(t){var e=this;this.setSettings(t,Craft.AdminTable.defaults),this.settings.allowDeleteAll||(this.settings.minItems=1),this.$noItems=$(this.settings.noItemsSelector),this.$table=$(this.settings.tableSelector),this.$tbody=this.$table.children("tbody"),this.totalItems=this.$tbody.children().length,this.settings.sortable&&(this.sorter=new Craft.DataTableSorter(this.$table,{onSortChange:this.reorderItems.bind(this)})),this.$deleteBtns=this.$table.find(".delete:not(.disabled)"),this.addListener(this.$deleteBtns,"click","handleDeleteBtnClick"),this.addListener(this.$deleteBtns,"keydown",(function(t){t.keyCode!==Garnish.SPACE_KEY&&t.keyCode!==Garnish.RETURN_KEY||(t.preventDefault(),e.handleDeleteBtnClick(t))})),this.updateUI()},addRow:function(t){if(!(this.settings.maxItems&&this.totalItems>=this.settings.maxItems)){var e=$(t).appendTo(this.$tbody),i=e.find(".delete");this.settings.sortable&&this.sorter.addItems(e),this.$deleteBtns=this.$deleteBtns.add(i),this.addListener(i,"click","handleDeleteBtnClick"),this.totalItems++,this.updateUI()}},reorderItems:function(){var t=this;if(this.settings.sortable){for(var e=[],i=0;i<this.sorter.$items.length;i++){var s=$(this.sorter.$items[i]).attr(this.settings.idAttribute);e.push(s)}var a={ids:JSON.stringify(e)};Craft.sendActionRequest("POST",this.settings.reorderAction,{data:a}).then((function(i){t.onReorderItems(e),Craft.cp.displaySuccess(Craft.t("app",t.settings.reorderSuccessMessage))})).catch((function(e){e.response,Craft.cp.displayError(Craft.t("app",t.settings.reorderFailMessage))}))}},handleDeleteBtnClick:function(t){if(!(this.settings.minItems&&this.totalItems<=this.settings.minItems)){var e=$(t.target).closest("tr");this.confirmDeleteItem(e)&&this.deleteItem(e)}},confirmDeleteItem:function(t){if(!this.settings.confirmDeleteMessage)return!0;var e=this.getItemName(t);return confirm(Craft.t("app",this.settings.confirmDeleteMessage,{name:e}))},deleteItem:function(t){var e=this,i={id:this.getItemId(t)};Craft.sendActionRequest("POST",this.settings.deleteAction,{data:i}).then((function(i){return e.handleDeleteItemSuccess(i.data,t)})).catch((function(i){var s=i.response;return e.handleDeleteItemFailure(s.data,t)}))},handleDeleteItemFailure:function(t,e){this.getItemId(e);var i=this.getItemName(e);Craft.cp.displayError(Craft.t("app",this.settings.deleteFailMessage,{name:i}))},handleDeleteItemSuccess:function(t,e){var i=this.getItemId(e),s=this.getItemName(e);this.sorter&&this.sorter.removeItems(e),e.remove(),this.totalItems--,this.updateUI(),this.onDeleteItem(i),this.settings.deleteSuccessMessage&&Craft.cp.displaySuccess(Craft.t("app",this.settings.deleteSuccessMessage,{name:s}))},onReorderItems:function(t){this.settings.onReorderItems(t)},onDeleteItem:function(t){this.settings.onDeleteItem(t)},getItemId:function(t){return t.attr(this.settings.idAttribute)},getItemName:function(t){return Craft.escapeHtml(t.attr(this.settings.nameAttribute))},updateUI:function(){if(0===this.totalItems?(this.$table.hide(),this.$noItems.removeClass("hidden")):(this.$table.show(),this.$noItems.addClass("hidden")),this.settings.sortable){var t=this.$table.find(".move");1===this.totalItems?t.addClass("disabled"):t.removeClass("disabled")}this.settings.minItems&&this.totalItems<=this.settings.minItems?this.$deleteBtns.addClass("disabled"):this.$deleteBtns.removeClass("disabled"),this.settings.newItemBtnSelector&&(this.settings.maxItems&&this.totalItems>=this.settings.maxItems?$(this.settings.newItemBtnSelector).addClass("hidden"):$(this.settings.newItemBtnSelector).removeClass("hidden"))}},{defaults:{tableSelector:null,noItemsSelector:null,newItemBtnSelector:null,idAttribute:"data-id",nameAttribute:"data-name",sortable:!1,allowDeleteAll:!0,minItems:0,maxItems:null,reorderAction:null,deleteAction:null,reorderSuccessMessage:Craft.t("app","New order saved."),reorderFailMessage:Craft.t("app","Couldn’t save new order."),confirmDeleteMessage:Craft.t("app","Are you sure you want to delete “{name}”?"),deleteSuccessMessage:Craft.t("app","“{name}” deleted."),deleteFailMessage:Craft.t("app","Couldn’t delete “{name}”."),onReorderItems:$.noop,onDeleteItem:$.noop}})},6872:function(){Craft.AssetImageEditor=Garnish.Modal.extend({$body:null,$footer:null,$imageTools:null,$buttons:null,$cancelBtn:null,$replaceBtn:null,$saveBtn:null,$focalPointBtn:null,$editorContainer:null,$straighten:null,$croppingCanvas:null,$spinner:null,$constraintContainer:null,$constraintRadioInputs:null,$customConstraints:null,canvas:null,image:null,viewport:null,focalPoint:null,grid:null,croppingCanvas:null,clipper:null,croppingRectangle:null,cropperHandles:null,cropperGrid:null,croppingShade:null,imageStraightenAngle:0,viewportRotation:0,originalWidth:0,originalHeight:0,imageVerticeCoords:null,zoomRatio:1,animationInProgress:!1,currentView:"",assetId:null,cacheBust:null,draggingCropper:!1,scalingCropper:!1,draggingFocal:!1,previousMouseX:0,previousMouseY:0,shiftKeyHeld:!1,editorHeight:0,editorWidth:0,cropperState:!1,scaleFactor:1,flipData:{},focalPointState:!1,maxImageSize:null,lastLoadedDimensions:null,imageIsLoading:!1,mouseMoveEvent:null,croppingConstraint:!1,constraintOrientation:"landscape",showingCustomConstraint:!1,saving:!1,renderImage:null,renderCropper:null,_queue:null,init:function(t,e){var i=this;this._queue=new Craft.Queue,this.cacheBust=Date.now(),this.setSettings(e,Craft.AssetImageEditor.defaults),null===this.settings.allowDegreeFractions&&(this.settings.allowDegreeFractions=Craft.isImagick),Garnish.prefersReducedMotion()&&(this.settings.animationDuration=1),this.assetId=t,this.flipData={x:0,y:0},this.$container=$('<form class="modal fitted imageeditor"></form>').appendTo(Garnish.$bod),this.$body=$('<div class="body"></div>').appendTo(this.$container),this.$footer=$('<div class="footer"/>').appendTo(this.$container),this.base(this.$container,this.settings),this.$buttons=$('<div class="buttons right"/>').appendTo(this.$footer),this.$cancelBtn=$("<button/>",{type:"button",class:"btn cancel",text:Craft.t("app","Cancel")}).appendTo(this.$buttons),this.settings.allowSavingAsNew&&(this.$saveBtn=Craft.ui.createButton({class:"save copy",label:Craft.t("app","Save as a new asset"),spinner:!0}).appendTo(this.$buttons),this.addListener(this.$saveBtn,"activate",this.saveImage)),this.$replaceBtn=Craft.ui.createSubmitButton({class:"save replace",label:Craft.t("app","Save"),spinner:!0}).appendTo(this.$buttons),this.addListener(this.$replaceBtn,"activate",this.saveImage),this.addListener(this.$cancelBtn,"activate",this.hide),this.removeListener(this.$shade,"click"),this.maxImageSize=this.getMaxImageSize(),Craft.sendActionRequest("POST","assets/image-editor",{data:{assetId:t}}).then((function(t){return i.loadEditor(t.data)}))},getMaxImageSize:function(){var t=Garnish.$doc.get(0).documentElement.clientWidth,e=Garnish.$doc.get(0).documentElement.clientHeight;return Math.max(e,t)*(window.devicePixelRatio>1?2:1)},loadEditor:function(t){var e=this;t.html||alert(Craft.t("app","Could not load the image editor.")),this.$body.html(t.html),this.$tabs=$(".tabs li",this.$body),this.$viewsContainer=$(".views",this.$body),this.$views=$("> div",this.$viewsContainer),this.$imageTools=$(".image-container .image-tools",this.$body),this.$editorContainer=$(".image-container .image",this.$body),this.$constraintContainer=$(".constraint-group",this.$body),this.$constraintRadioInputs=$('[name="constraint"]',this.$constraintContainer),this.$focalPointBtn=$(".focal-point",this.$body),this.editorHeight=this.$editorContainer.innerHeight(),this.editorWidth=this.$editorContainer.innerWidth(),this._showSpinner(),this.updateSizeAndPosition(),$customConstraintWrapper=this.$constraintRadioInputs.filter('[value="custom"]').parent(),this.$customConstraints=$("<div/>",{class:"constraint custom hidden","data-constraint":"custom"}).append($("<input/>",{type:"text",class:"custom-constraint-w",size:3,value:1,"aria-label":Craft.t("app","Width unit")})).append($("<span/>",{class:"custom-constraint-spacer",text:"x","aria-hidden":"true"})).append($("<input/>",{type:"text",class:"custom-constraint-h",size:3,value:1,"aria-label":Craft.t("app","Height unit")})).appendTo($customConstraintWrapper),this.$constraintRadioInputs.filter((function(){var t=$(this).val();return/^\d*\.\d+$/.test(t)})).addClass("flip"),this.canvas=new fabric.StaticCanvas("image-canvas"),this.$croppingCanvas=$("#cropping-canvas",this.$editorContainer),this.$croppingCanvas.width(this.editorWidth),this.$croppingCanvas.height(this.editorHeight),this.canvas.enableRetinaScaling=!0,this.renderImage=function(){Garnish.requestAnimationFrame(e.canvas.renderAll.bind(e.canvas))};var i=Craft.getActionUrl("assets/edit-image",{assetId:this.assetId,size:this.maxImageSize,cacheBust:this.cacheBust});fabric.Image.fromURL(i,(function(i){e.image=i,e.image.set({originX:"center",originY:"center",left:e.editorWidth/2,top:e.editorHeight/2}),e.canvas.add(e.image),e.originalHeight=e.image.getHeight(),e.originalWidth=e.image.getWidth(),e.zoomRatio=1,e.lastLoadedDimensions=e.getScaledImageDimensions(),e._setFittedImageVerticeCoordinates(),e._repositionEditorElements();var s={imageDimensions:e.getScaledImageDimensions(),offsetX:0,offsetY:0},a=!1;if(t.focalPoint){var n=t.focalPoint,r=s.imageDimensions.width*n.x,o=s.imageDimensions.height*n.y;s.offsetX=r-s.imageDimensions.width/2,s.offsetY=o-s.imageDimensions.height/2,a=!0}e.storeFocalPointState(s),a&&e._createFocalPoint(),e._createViewport(),e.storeCropperState(),e._addControlListeners(),e.addListener(e.$croppingCanvas,"mousemove,touchmove",e._handleMouseMove),e.addListener(e.$croppingCanvas,"mousedown,touchstart",e._handleMouseDown),e.addListener(e.$croppingCanvas,"mouseup,touchend",e._handleMouseUp),e.addListener(e.$croppingCanvas,"mouseout,touchcancel",e._handleMouseOut),e._hideSpinner(),e.renderImage(),e.$tabs.first().trigger("click")}))},_reloadImage:function(){var t=this;if(!this.imageIsLoading){this.imageIsLoading=!0,this.maxImageSize=this.getMaxImageSize();var e=Craft.getActionUrl("assets/edit-image",{assetId:this.assetId,size:this.maxImageSize,cacheBust:this.cacheBust});this.image.setSrc(e,(function(e){t.originalHeight=e.getHeight(),t.originalWidth=e.getWidth(),t.lastLoadedDimensions={width:t.originalHeight,height:t.originalWidth},t.updateSizeAndPosition(),t.renderImage(),t.imageIsLoading=!1}))}},updateSizeAndPosition:function(){if(this.$container){var t=window.innerWidth,e=window.innerHeight;this.$container.css({width:t,"min-width":t,left:0,height:e,"min-height":e,top:0}),this.$body.css({height:e-(this.$footer.outerHeight()-1)}),t<e?this.$container.addClass("vertical"):this.$container.removeClass("vertical"),this.$editorContainer&&this.image&&this._repositionEditorElements()}},_repositionEditorElements:function(){var t={width:this.editorWidth,height:this.editorHeight};this.editorHeight=this.$editorContainer.innerHeight(),this.editorWidth=this.$editorContainer.innerWidth(),this.canvas.setDimensions({width:this.editorWidth,height:this.editorHeight});var e=this.getScaledImageDimensions();if("crop"===this.currentView){this.zoomRatio=this.getZoomToFitRatio(this.getScaledImageDimensions());var i=this._getBoundingRectangle(this.imageVerticeCoords);this._setFittedImageVerticeCoordinates(),this._repositionCropper(i)}else this.zoomRatio=this.getZoomToCoverRatio(this.getScaledImageDimensions())*this.scaleFactor;this._repositionImage(t),this._repositionViewport(),this._repositionFocalPoint(t),this._zoomImage(),this.renderImage(),(e.width/this.lastLoadedDimensions.width>1.5||e.height/this.lastLoadedDimensions.height>1.5)&&this._reloadImage()},_repositionImage:function(t){this.image.set({left:this.image.left-(t.width-this.editorWidth)/2,top:this.image.top-(t.height-this.editorHeight)/2})},_createViewport:function(){this.viewport=new fabric.Rect({width:this.image.width,height:this.image.height,fill:"rgba(127,0,0,1)",originX:"center",originY:"center",globalCompositeOperation:"destination-in",left:this.image.left,top:this.image.top}),this.canvas.add(this.viewport),this.renderImage()},_createFocalPoint:function(){var t=this.focalPointState,e=this.getScaledImageDimensions().width/t.imageDimensions.width,i=t.offsetX*e*this.zoomRatio*this.scaleFactor,s=t.offsetY*e*this.zoomRatio*this.scaleFactor;i+=this.image.left,s+=this.image.top;var a=0,n=0;this.viewport&&0===t.offsetX&&0===t.offsetY&&("crop"!==this.currentView?(a=this.viewport.left-this.image.left,n=this.viewport.top-this.image.top):(a=this.clipper.left-this.image.left,n=this.clipper.top-this.image.top),i+=a,s+=n,t.offsetX+=a/(e*this.zoomRatio*this.scaleFactor),t.offsetY+=n/(e*this.zoomRatio*this.scaleFactor)),this.focalPoint=new fabric.Group([new fabric.Circle({radius:8,fill:"rgba(0,0,0,0.5)",strokeWidth:2,stroke:"rgba(255,255,255,0.8)",left:0,top:0,originX:"center",originY:"center"}),new fabric.Circle({radius:1,fill:"rgba(255,255,255,0)",strokeWidth:2,stroke:"rgba(255,255,255,0.8)",left:0,top:0,originX:"center",originY:"center"})],{originX:"center",originY:"center",left:i,top:s}),this.storeFocalPointState(t),this.canvas.add(this.focalPoint)},toggleFocalPoint:function(){this.focalPoint?(this.canvas.remove(this.focalPoint),this.focalPoint=null,this.$focalPointBtn.attr("aria-pressed","false")):(this._createFocalPoint(),this.$focalPointBtn.attr("aria-pressed","true")),this.renderImage()},_repositionViewport:function(){if(this.viewport){var t={left:this.editorWidth/2,top:this.editorHeight/2};if("crop"===this.currentView)t.width=this.editorWidth,t.height=this.editorHeight;else if(this.cropperState){var e=this.cropperState,i=this.getScaledImageDimensions().width/e.imageDimensions.width;t.width=e.width*i*this.zoomRatio,t.height=e.height*i*this.zoomRatio,this.image.set({left:this.editorWidth/2-e.offsetX*i,top:this.editorHeight/2-e.offsetY*i})}else $.extend(t,this.getScaledImageDimensions());this.viewport.set(t)}},_repositionFocalPoint:function(t){if(this.focalPoint){var e=this.focalPoint.left-this.editorWidth/2,i=this.focalPoint.top-this.editorHeight/2,s=this.image.width,a=this.getScaledImageDimensions().width*this.zoomRatio/s/this.scaleFactor;e-=(t.width-this.editorWidth)/2,i-=(t.height-this.editorHeight)/2,e*=a,i*=a,this.focalPoint.set({left:this.editorWidth/2+e,top:this.editorHeight/2+i})}},hasOrientationChanged:function(){return this.viewportRotation%180!=0},getScaledImageDimensions:function(){return void 0===this.getScaledImageDimensions._&&(this.getScaledImageDimensions._={}),this.getScaledImageDimensions._.imageRatio=this.originalHeight/this.originalWidth,this.getScaledImageDimensions._.editorRatio=this.editorHeight/this.editorWidth,this.getScaledImageDimensions._.dimensions={},this.getScaledImageDimensions._.imageRatio>this.getScaledImageDimensions._.editorRatio?(this.getScaledImageDimensions._.dimensions.height=Math.min(this.editorHeight,this.originalHeight),this.getScaledImageDimensions._.dimensions.width=Math.round(this.originalWidth/(this.originalHeight/this.getScaledImageDimensions._.dimensions.height))):(this.getScaledImageDimensions._.dimensions.width=Math.min(this.editorWidth,this.originalWidth),this.getScaledImageDimensions._.dimensions.height=Math.round(this.originalHeight*(this.getScaledImageDimensions._.dimensions.width/this.originalWidth))),this.getScaledImageDimensions._.dimensions},_zoomImage:function(){void 0===this._zoomImage._&&(this._zoomImage._={}),this._zoomImage._.imageDimensions=this.getScaledImageDimensions(),this.image.set({width:this._zoomImage._.imageDimensions.width*this.zoomRatio,height:this._zoomImage._.imageDimensions.height*this.zoomRatio})},_getPrevTab:function(){var t,e=this._getActiveTabIndex();if(!(e<0))return t=e>0?e-1:this.$tabs.length-1,this.$tabs.eq(t)},_getNextTab:function(){var t,e=this._getActiveTabIndex();if(!(e<0))return t=e<this.$tabs.length-1?e+1:0,this.$tabs.eq(t)},_getActiveTab:function(){return this.$tabs.filter('[aria-selected="true"]')},_getActiveTabIndex:function(){var t=this._getActiveTab();if(t.length)return t.index()},_addControlListeners:function(){var t=this;this.addListener(this.$tabs,"click",this._handleTabClick),this.addListener(this.$tabs,"keydown",(function(e){switch(e.keyCode){case Garnish.LEFT_KEY:case Garnish.UP_KEY:e.preventDefault();var i=t._getPrevTab();t.activateTab(i);break;case Garnish.RIGHT_KEY:case Garnish.DOWN_KEY:e.preventDefault();var s=t._getNextTab();t.activateTab(s)}})),this.addListener(this.$focalPointBtn,"click",this.toggleFocalPoint),this.addListener($(".rotate-left"),"click",(function(){this.rotateImage(-90)})),this.addListener($(".rotate-right"),"click",(function(){this.rotateImage(90)})),this.addListener($(".flip-vertical"),"click",(function(){this.flipImage("y")})),this.addListener($(".flip-horizontal"),"click",(function(){this.flipImage("x")})),this.straighteningInput=new Craft.SlideRuleInput("slide-rule",{onStart:function(){t._showGrid()},onChange:function(e){t.straighten(e)},onEnd:function(){t._hideGrid(),t._cleanupFocalPointAfterStraighten()}}),this.addListener(Garnish.$doc,"keydown",(function(t){t.keyCode===Garnish.SHIFT_KEY&&(this.shiftKeyHeld=!0)})),this.addListener(Garnish.$doc,"keyup",(function(t){t.keyCode===Garnish.SHIFT_KEY&&(this.shiftKeyHeld=!1)})),this.addListener(this.$constraintRadioInputs,"change",this._handleConstraintChange),this.addListener($(".orientation input",this.$container),"click",this._handleOrientationClick),this.addListener($(".constraint-group .custom input",this.$container),"keyup",this._applyCustomConstraint)},_handleConstraintClick:function(t){var e=$(t.currentTarget).data("constraint"),i=$(t.currentTarget);if(i.siblings().removeClass("active"),i.addClass("active"),"custom"==e)return this._showCustomConstraint(),void this._applyCustomConstraint();this._hideCustomConstraint(),this.setCroppingConstraint(e),this.enforceCroppingConstraint()},_handleConstraintChange:function(t){var e=$(t.target).val();if("custom"==e)return this._showCustomConstraint(),void this._applyCustomConstraint();this._hideCustomConstraint(),this.setCroppingConstraint(e),this.enforceCroppingConstraint()},_handleOrientationClick:function(t){if(t.currentTarget.value!==this.constraintOrientation){this.constraintOrientation=t.currentTarget.value;for(var e=$(".flip",this.$constraintContainer),i=0;i<e.length;i++){var s=$(e[i]),a='label[for="'+s.attr("id")+'"]',n=$(a,this.$constraintContainer);s.val(1/s.val()),n.html(n.text().split(":").reverse().join(":").replace(/\s/g,""))}e.filter(":checked").trigger("change")}},_applyCustomConstraint:function(){var t=this._getCustomConstraint();t.w>0&&t.h>0&&(this.setCroppingConstraint(t.w/t.h),this.enforceCroppingConstraint())},_getCustomConstraint:function(){var t=parseFloat($(".custom-constraint-w").val()),e=parseFloat($(".custom-constraint-h").val());return{w:isNaN(t)?0:t,h:isNaN(e)?0:e}},_setCustomConstraint:function(t,e){$(".custom-constraint-w").val(parseFloat(t)),$(".custom-constraint-h").val(parseFloat(e))},_hideCustomConstraint:function(){this.showingCustomConstraint=!1,this.$customConstraints.addClass("hidden"),$(".orientation",this.$container).removeClass("hidden")},_showCustomConstraint:function(){this.showingCustomConstraint||(this.showingCustomConstraint=!0,this.$customConstraints.removeClass("hidden"),$(".orientation",this.$container).addClass("hidden"))},_handleTabClick:function(t){if(!this.animationInProgress){var e=$(t.currentTarget);this.activateTab(e)}},activateTab:function(t){var e=$(t).data("view");this.$tabs.removeClass("selected").attr({"aria-selected":"false",tabindex:"-1"}),$(t).addClass("selected").attr({"aria-selected":"true",tabindex:"0"}).trigger("focus"),this.showView(e)},showView:function(t){var e=this;this.currentView!==t&&(this.$views.addClass("hidden"),this.$views.filter('[data-view="'+t+'"]').removeClass("hidden"),"rotate"===t?this.enableSlider():this.disableSlider(),this.updateSizeAndPosition(),"crop"===this.currentView&&"crop"!==t?this._queue.push((function(){return new Promise((function(t,i){e.disableCropMode(),t()}))})):"crop"!==this.currentView&&"crop"===t&&this._queue.push((function(){return new Promise((function(t,i){e.enableCropMode(),t()}))})),this.currentView=t)},storeCropperState:function(t){void 0===this.storeCropperState._&&(this.storeCropperState._={}),t?this.cropperState=t:this.clipper?(this.storeCropperState._.zoomFactor=1/this.zoomRatio,this.cropperState={offsetX:(this.clipper.left-this.image.left)*this.storeCropperState._.zoomFactor,offsetY:(this.clipper.top-this.image.top)*this.storeCropperState._.zoomFactor,height:this.clipper.height*this.storeCropperState._.zoomFactor,width:this.clipper.width*this.storeCropperState._.zoomFactor,imageDimensions:this.getScaledImageDimensions()}):(this.storeCropperState._.dimensions=this.getScaledImageDimensions(),this.cropperState={offsetX:0,offsetY:0,height:this.storeCropperState._.dimensions.height,width:this.storeCropperState._.dimensions.width,imageDimensions:this.storeCropperState._.dimensions})},storeFocalPointState:function(t){void 0===this.storeFocalPointState._&&(this.storeFocalPointState._={}),t?this.focalPointState=t:this.focalPoint&&(this.storeFocalPointState._.zoomFactor=1/this.zoomRatio,this.focalPointState={offsetX:(this.focalPoint.left-this.image.left)*this.storeFocalPointState._.zoomFactor/this.scaleFactor,offsetY:(this.focalPoint.top-this.image.top)*this.storeFocalPointState._.zoomFactor/this.scaleFactor,imageDimensions:this.getScaledImageDimensions()})},rotateImage:function(t){var e=this;if(!this.animationInProgress){if(90!==t&&-90!==t)return!1;this.animationInProgress=!0,this.viewportRotation+=t,this.viewportRotation=parseInt((this.viewportRotation+360)%360,10);var i,s=this.image.angle+t,a=this.getScaledImageDimensions();i=this.hasOrientationChanged()?this.getZoomToCoverRatio({height:a.width,width:a.height}):this.getZoomToCoverRatio(a),this.zoomRatio>i&&(i=this.zoomRatio);var n={angle:90===t?"+=90":"-=90"},r={angle:s,width:a.width*i,height:a.height*i},o=1;this.scaleFactor<1?(o=1/this.scaleFactor,this.scaleFactor=1):(this.viewport.width>this.editorHeight?o=this.editorHeight/this.viewport.width:this.viewport.height>this.editorWidth&&(o=this.editorWidth/this.viewport.height),this.scaleFactor=o),o<1&&(r.width*=o,r.height*=o);var l=this.cropperState,h=l.offsetX,d=l.offsetY,c=t*(Math.PI/180),u=h*Math.cos(c)-d*Math.sin(c),p=h*Math.sin(c)+d*Math.cos(c),f=a.width/l.imageDimensions.width,g=u*f*this.zoomRatio*this.scaleFactor,m=p*f*this.zoomRatio*this.scaleFactor;r.left=this.editorWidth/2-g,r.top=this.editorHeight/2-m,l.offsetX=u,l.offsetY=p;var v=l.width;l.width=l.height,l.height=v,this.storeCropperState(l),this.focalPoint&&this.canvas.remove(this.focalPoint),this.viewport.animate(n,{duration:this.settings.animationDuration,onComplete:function(){var t=e.viewport.height*o;e.viewport.height=e.viewport.width*o,e.viewport.width=t,e.viewport.set({angle:0})}}),this.image.animate(r,{onChange:this.canvas.renderAll.bind(this.canvas),duration:this.settings.animationDuration,onComplete:function(){var i=parseFloat((e.image.angle+360)%360);e.image.set({angle:i}),e.animationInProgress=!1,e.focalPoint?(e._adjustFocalPointByAngle(t),e.straighten(e.straighteningInput),e.canvas.add(e.focalPoint)):e._resetFocalPointPosition()}})}},flipImage:function(t){var e=this;if(!this.animationInProgress){this.animationInProgress=!0,this.hasOrientationChanged()&&(t="y"===t?"x":"y"),this.focalPoint?this.canvas.remove(this.focalPoint):this._resetFocalPointPosition();var i={x:this.editorWidth/2,y:this.editorHeight/2};this.straighteningInput.setValue(-this.imageStraightenAngle),this.imageStraightenAngle=-this.imageStraightenAngle;var s,a,n={angle:this.viewportRotation+this.imageStraightenAngle},r=this.cropperState,o=this.focalPointState;"y"===t&&this.hasOrientationChanged()||"y"!==t&&!this.hasOrientationChanged()?(r.offsetX=-r.offsetX,o.offsetX=-o.offsetX,a=this.image.left-i.x,n.left=i.x-a):(r.offsetY=-r.offsetY,o.offsetY=-o.offsetY,s=this.image.top-i.y,n.top=i.y-s),"y"===t?(n.scaleY=-1*this.image.scaleY,this.flipData.y=1-this.flipData.y):(n.scaleX=-1*this.image.scaleX,this.flipData.x=1-this.flipData.x),this.storeCropperState(r),this.storeFocalPointState(o),this.image.animate(n,{onChange:this.canvas.renderAll.bind(this.canvas),duration:this.settings.animationDuration,onComplete:function(){e.animationInProgress=!1,e.focalPoint&&(e._adjustFocalPointByAngle(0),e.canvas.add(e.focalPoint))}})}},straighten:function(t){if(!this.animationInProgress){this.animationInProgress=!0;var e=this.image.angle;this.imageStraightenAngle=(this.settings.allowDegreeFractions?parseFloat(t.value):Math.round(parseFloat(t.value)))%360,this.image.set({angle:this.viewportRotation+this.imageStraightenAngle}),this.zoomRatio=this.getZoomToCoverRatio(this.getScaledImageDimensions())*this.scaleFactor,this._zoomImage(),this.cropperState&&this._adjustEditorElementsOnStraighten(e),this.renderImage(),this.animationInProgress=!1}},_adjustEditorElementsOnStraighten:function(t){var e,i,s,a,n,r=this.getScaledImageDimensions(),o=this.image.angle-t,l=this.cropperState,h=this.zoomRatio,d=1;do{var c=l.offsetX,u=l.offsetY,p=o*(Math.PI/180);s=c*Math.cos(p)-u*Math.sin(p),a=c*Math.sin(p)+u*Math.cos(p),e=s*h*(n=r.width/l.imageDimensions.width),i=a*h*n;var f=this.getImageVerticeCoords(h),g={width:this.viewport.width,height:this.viewport.height,left:this.editorWidth/2-this.viewport.width/2+e,top:this.editorHeight/2-this.viewport.height/2+i};h*=d=this._getZoomRatioToFitRectangle(g,f)}while(1!==d);this.image.set({left:this.editorWidth/2-e,top:this.editorHeight/2-i}),l.offsetX=s,l.offsetY=a,l.width=this.viewport.width/h/n,l.height=this.viewport.height/h/n,this.storeCropperState(l),this.zoomRatio=h,this.focalPoint?(this._adjustFocalPointByAngle(o),this._isCenterInside(this.focalPoint,this.viewport)?this.focalPoint.set({opacity:1}):this.focalPoint.set({opacity:0})):0!==o&&this._resetFocalPointPosition(),this._zoomImage()},_cleanupFocalPointAfterStraighten:function(){if(this.focalPoint&&!this._isCenterInside(this.focalPoint,this.viewport)){this.focalPoint.set({opacity:1});var t=this.focalPointState;t.offsetX=0,t.offsetY=0,this.storeFocalPointState(t),this.toggleFocalPoint()}},_resetFocalPointPosition:function(){var t=this.focalPointState;t.offsetX=0,t.offsetY=0,this.storeFocalPointState(t)},_isCenterInside:function(t,e){return t.left>e.left-e.width/2&&t.top>e.top-e.height/2&&t.left<e.left+e.width/2&&t.top<e.top+e.height/2},_adjustFocalPointByAngle:function(t){var e=t*(Math.PI/180),i=this.focalPointState,s=i.offsetX,a=i.offsetY,n=s*Math.cos(e)-a*Math.sin(e),r=s*Math.sin(e)+a*Math.cos(e),o=this.getScaledImageDimensions().width/i.imageDimensions.width,l=n*o*this.zoomRatio,h=r*o*this.zoomRatio;this.focalPoint.left=this.image.left+l,this.focalPoint.top=this.image.top+h,i.offsetX=n,i.offsetY=r,this.storeFocalPointState(i)},_getZoomRatioToFitRectangle:function(t,e){for(var i,s,a=this._getRectangleVertices(t),n=0;n<a.length&&(i=a[n],this.arePointsInsideRectangle([i],e));n++)i=!1;if(i){var r=this._getEdgeCrossed(e,i),o={x:t.left+t.width/2,y:t.top+t.height/2},l=Math.abs((r[1].y-r[0].y)*i.x-(r[1].x-r[0].x)*i.y+r[1].x*r[0].y-r[1].y*r[0].x)/Math.sqrt(Math.pow(r[1].y-r[0].y,2)+Math.pow(r[1].x-r[0].x,2)),h=Math.abs((r[1].y-r[0].y)*o.x-(r[1].x-r[0].x)*o.y+r[1].x*r[0].y-r[1].y*r[0].x)/Math.sqrt(Math.pow(r[1].y-r[0].y,2)+Math.pow(r[1].x-r[0].x,2));s=(l+h)/h}else s=1;return s},saveImage:function(t){var e=this,i=$(t.currentTarget);if(this.saving)return!1;this.saving=!0,i.addClass("loading");var s=i.hasClass("replace"),a={assetId:this.assetId,viewportRotation:this.viewportRotation,imageRotation:this.imageStraightenAngle,replace:s?1:0};if(this.cropperState){var n={};n.height=this.cropperState.height,n.width=this.cropperState.width,n.offsetX=this.cropperState.offsetX,n.offsetY=this.cropperState.offsetY,a.imageDimensions=this.cropperState.imageDimensions,a.cropData=n}else a.imageDimensions=this.getScaledImageDimensions();this.focalPoint&&(a.focalPoint=this.focalPointState),a.flipData=this.flipData,a.zoom=this.zoomRatio,Craft.sendActionRequest("POST","assets/save-image",{data:a}).then((function(t){var i=t.data;e.onSave(i),s&&Craft.broadcaster&&Craft.broadcaster.postMessage({event:"saveElement",id:e.assetId}),e.hide(),Craft.cp.runQueue(),Craft.Preview.refresh()})).catch((function(t){var e=t.response;alert(e.data.message)})).finally((function(){e.$buttons.find(".btn").removeClass("loading"),e.saving=!1}))},getZoomToCoverRatio:function(t){var e=Math.abs(this.imageStraightenAngle)*(Math.PI/180),i=Math.sin(e)*t.height+Math.cos(e)*t.width,s=Math.sin(e)*t.width+Math.cos(e)*t.height;return Math.max(i/t.width,s/t.height)},getZoomToFitRatio:function(t){var e=this._getImageBoundingBox(t),i=1;if(e.height>this.editorHeight||e.width>this.editorWidth){var s=this.editorHeight/e.height,a=this.editorWidth/e.width;i=Math.min(a,s)}return i},getCombinedZoomRatio:function(t){return this.getZoomToCoverRatio(t)/this.getZoomToFitRatio(t)},_showGrid:function(){if(!this.grid){var t,e={strokeWidth:1,stroke:"rgba(255,255,255,0.5)"},i=this.viewport.width,s=this.viewport.height,a=i/9,n=s/9,r=[new fabric.Rect({strokeWidth:2,stroke:"rgba(255,255,255,1)",originX:"center",originY:"center",width:i,height:s,left:i/2,top:s/2,fill:"rgba(255,255,255,0)"})];for(t=1;t<=8;t++)r.push(new fabric.Line([t*a,0,t*a,s],e));for(t=1;t<=8;t++)r.push(new fabric.Line([0,t*n,i,t*n],e));this.grid=new fabric.Group(r,{left:this.editorWidth/2,top:this.editorHeight/2,originX:"center",originY:"center",angle:this.viewport.angle}),this.canvas.add(this.grid),this.renderImage()}},_hideGrid:function(){this.canvas.remove(this.grid),this.grid=null,this.renderImage()},onFadeOut:function(){this.destroy()},show:function(){this.base(),Garnish.$bod.addClass("no-scroll")},hide:function(){this.removeAllListeners(),this.straighteningInput.removeAllListeners(),Garnish.$bod.removeClass("no-scroll"),this.base()},onSave:function(t){this.settings.onSave(t),this.trigger("save")},enableSlider:function(){this.$imageTools.removeClass("hidden")},disableSlider:function(){this.$imageTools.addClass("hidden")},enableCropMode:function(){var t=this,e=this.getScaledImageDimensions();this.zoomRatio=this.getZoomToFitRatio(e);var i={width:this.editorWidth,height:this.editorHeight},s={width:e.width*this.zoomRatio,height:e.height*this.zoomRatio,left:this.editorWidth/2,top:this.editorHeight/2};this._editorModeTransition((function(){t._setFittedImageVerticeCoordinates();var e=t.cropperState,i=t.getScaledImageDimensions(),s=i.width/e.imageDimensions.width,a={left:t.image.left+e.offsetX*s*t.zoomRatio,top:t.image.top+e.offsetY*s*t.zoomRatio,width:e.width*s*t.zoomRatio,height:e.height*s*t.zoomRatio};t._showCropper(a),t.focalPoint&&(s=i.width/t.focalPointState.imageDimensions.width,t.focalPoint.left=t.image.left+t.focalPointState.offsetX*s*t.zoomRatio,t.focalPoint.top=t.image.top+t.focalPointState.offsetY*s*t.zoomRatio,t.canvas.add(t.focalPoint))}),s,i)},disableCropMode:function(){var t=this,e={};this._hideCropper();var i=this.getScaledImageDimensions(),s=this.getZoomToCoverRatio(i)*this.scaleFactor,a=s/this.zoomRatio;this.zoomRatio=s;var n={width:i.width*this.zoomRatio,height:i.height*this.zoomRatio,left:this.editorWidth/2,top:this.editorHeight/2},r=(this.clipper.left-this.image.left)*a,o=(this.clipper.top-this.image.top)*a;n.left=this.editorWidth/2-r,n.top=this.editorHeight/2-o,e.height=this.clipper.height*a,e.width=this.clipper.width*a,(!this.focalPoint||this.focalPoint&&!this._isCenterInside(this.focalPoint,this.clipper))&&(this.focalPoint&&this.toggleFocalPoint(),this._resetFocalPointPosition()),this._editorModeTransition((function(){if(t.focalPoint){var e=t.getScaledImageDimensions().width/t.focalPointState.imageDimensions.width;t.focalPoint.left=t.image.left+t.focalPointState.offsetX*e*t.zoomRatio,t.focalPoint.top=t.image.top+t.focalPointState.offsetY*e*t.zoomRatio,t.canvas.add(t.focalPoint)}}),n,e)},_editorModeTransition:function(t,e,i){var s=this;this._queue.pause(),this.animationInProgress||(this.animationInProgress=!0,this.focalPoint&&(this.canvas.remove(this.focalPoint),this.renderImage()),this.image.animate(e,{onChange:this.canvas.renderAll.bind(this.canvas),duration:this.settings.animationDuration,onComplete:function(){t(),s.animationInProgress=!1,s.renderImage(),s._queue.resume()}}),this.viewport.animate(i,{duration:this.settings.animationDuration}))},_showSpinner:function(){this.$spinner||(this.$spinner=$('<div class="spinner big spinner-absolute"/>')),this.$spinner.appendTo(this.$container.find(".image"))},_hideSpinner:function(){this.$spinner.remove()},_showCropper:function(t){this._setupCropperLayer(t),this._redrawCropperElements(),this.renderCropper()},_hideCropper:function(){this.clipper&&(this.croppingCanvas.remove(this.clipper),this.croppingCanvas.remove(this.croppingShade),this.croppingCanvas.remove(this.cropperHandles),this.croppingCanvas.remove(this.cropperGrid),this.croppingCanvas.remove(this.croppingRectangle),this.croppingCanvas=null,this.renderCropper=null)},_setupCropperLayer:function(t){var e=this;this.croppingCanvas=new fabric.StaticCanvas("cropping-canvas",{backgroundColor:"rgba(0,0,0,0)",hoverCursor:"default",selection:!1}),this.croppingCanvas.setDimensions({width:this.editorWidth,height:this.editorHeight}),this.renderCropper=function(){return Garnish.requestAnimationFrame(e.croppingCanvas.renderAll.bind(e.croppingCanvas))},$("#cropping-canvas",this.$editorContainer).css({position:"absolute",top:0,left:0}),this.croppingShade=new fabric.Rect({left:this.editorWidth/2,top:this.editorHeight/2,originX:"center",originY:"center",width:this.editorWidth,height:this.editorHeight,fill:"rgba(0,0,0,0.7)"});var i=this.getScaledImageDimensions(),s=0===this.imageStraightenAngle?1:1.2*this.getCombinedZoomRatio(i),a=i.width/s,n=i.height/s;if(this.hasOrientationChanged()){var r=n;n=a,a=r}this.clipper=new fabric.Rect({left:this.editorWidth/2,top:this.editorHeight/2,originX:"center",originY:"center",width:a,height:n,stroke:"black",fill:"rgba(128,0,0,1)",strokeWidth:0}),t&&this.clipper.set(t),this.clipper.globalCompositeOperation="destination-out",this.croppingCanvas.add(this.croppingShade),this.croppingCanvas.add(this.clipper)},_redrawCropperElements:function(){void 0===this._redrawCropperElements._&&(this._redrawCropperElements._={}),this.cropperHandles&&(this.croppingCanvas.remove(this.cropperHandles),this.croppingCanvas.remove(this.cropperGrid),this.croppingCanvas.remove(this.croppingRectangle)),this._redrawCropperElements._.lineOptions={strokeWidth:4,stroke:"rgb(255,255,255)",fill:!1},this._redrawCropperElements._.gridOptions={strokeWidth:2,stroke:"rgba(255,255,255,0.5)"},this._redrawCropperElements._.pathGroup=[new fabric.Path("M 0,10 L 0,0 L 10,0",this._redrawCropperElements._.lineOptions),new fabric.Path("M "+(this.clipper.width-8)+",0 L "+(this.clipper.width+4)+",0 L "+(this.clipper.width+4)+",10",this._redrawCropperElements._.lineOptions),new fabric.Path("M "+(this.clipper.width+4)+","+(this.clipper.height-8)+" L"+(this.clipper.width+4)+","+(this.clipper.height+4)+" L "+(this.clipper.width-8)+","+(this.clipper.height+4),this._redrawCropperElements._.lineOptions),new fabric.Path("M 10,"+(this.clipper.height+4)+" L 0,"+(this.clipper.height+4)+" L 0,"+(this.clipper.height-8),this._redrawCropperElements._.lineOptions)],this.cropperHandles=new fabric.Group(this._redrawCropperElements._.pathGroup,{left:this.clipper.left,top:this.clipper.top,originX:"center",originY:"center"}),this.croppingRectangle=new fabric.Rect({left:this.clipper.left,top:this.clipper.top,width:this.clipper.width,height:this.clipper.height,fill:"rgba(0,0,0,0)",stroke:"rgba(255,255,255,0.8)",strokeWidth:2,originX:"center",originY:"center"}),this.cropperGrid=new fabric.Group([new fabric.Line([.33*this.clipper.width,0,.33*this.clipper.width,this.clipper.height],this._redrawCropperElements._.gridOptions),new fabric.Line([.66*this.clipper.width,0,.66*this.clipper.width,this.clipper.height],this._redrawCropperElements._.gridOptions),new fabric.Line([0,.33*this.clipper.height,this.clipper.width,.33*this.clipper.height],this._redrawCropperElements._.gridOptions),new fabric.Line([0,.66*this.clipper.height,this.clipper.width,.66*this.clipper.height],this._redrawCropperElements._.gridOptions)],{left:this.clipper.left,top:this.clipper.top,originX:"center",originY:"center"}),this._redrawCropperElements._.cropTextTop=this.croppingRectangle.top+this.clipper.height/2+12,this._redrawCropperElements._.cropTextBackgroundColor="rgba(0,0,0,0)",this._redrawCropperElements._.cropTextTop+12>this.editorHeight-2&&(this._redrawCropperElements._.cropTextTop-=24,this._redrawCropperElements._.cropTextBackgroundColor="rgba(0,0,0,0.5)"),this.croppingCanvas.add(this.cropperHandles),this.croppingCanvas.add(this.cropperGrid),this.croppingCanvas.add(this.croppingRectangle)},_repositionCropper:function(t){if(this.croppingCanvas){var e=this.clipper.left-this.croppingCanvas.width/2,i=this.clipper.top-this.croppingCanvas.height/2;this.croppingCanvas.setDimensions({width:this.editorWidth,height:this.editorHeight});var s=this._getBoundingRectangle(this.imageVerticeCoords).width/t.width;this.clipper.width=Math.round(this.clipper.width*s),this.clipper.height=Math.round(this.clipper.height*s),this.clipper.left=this.editorWidth/2+e*s,this.clipper.top=this.editorHeight/2+i*s,this.croppingShade.set({width:this.editorWidth,height:this.editorHeight,left:this.editorWidth/2,top:this.editorHeight/2}),this._redrawCropperElements(),this.renderCropper()}},_getBoundingRectangle:function(t){return{width:Math.max(t.a.x,t.b.x,t.c.x,t.d.x)-Math.min(t.a.x,t.b.x,t.c.x,t.d.x),height:Math.max(t.a.y,t.b.y,t.c.y,t.d.y)-Math.min(t.a.y,t.b.y,t.c.y,t.d.y)}},_handleMouseDown:function(t){var e=this.focalPoint&&this._isMouseOver(t,this.focalPoint),i=this.croppingCanvas&&this._isMouseOver(t,this.clipper),s=this.croppingCanvas&&this._cropperHandleHitTest(t);(s||i||e)&&(this.previousMouseX=t.pageX,this.previousMouseY=t.pageY,e?this.draggingFocal=!0:s?this.scalingCropper=s:i&&(this.draggingCropper=!0))},_handleMouseMove:function(t){null!==this.mouseMoveEvent&&Garnish.requestAnimationFrame(this._handleMouseMoveInternal.bind(this)),this.mouseMoveEvent=t},_handleMouseMoveInternal:function(){null!==this.mouseMoveEvent&&(this.focalPoint&&this.draggingFocal?(this._handleFocalDrag(this.mouseMoveEvent),this.storeFocalPointState(),this.renderImage()):this.draggingCropper||this.scalingCropper?(this.draggingCropper?this._handleCropperDrag(this.mouseMoveEvent):this._handleCropperResize(this.mouseMoveEvent),this._redrawCropperElements(),this.storeCropperState(),this.renderCropper()):this._setMouseCursor(this.mouseMoveEvent),this.previousMouseX=this.mouseMoveEvent.pageX,this.previousMouseY=this.mouseMoveEvent.pageY,this.mouseMoveEvent=null)},_handleMouseUp:function(){this.draggingCropper=!1,this.scalingCropper=!1,this.draggingFocal=!1},_handleMouseOut:function(t){this._handleMouseUp(t),this.mouseMoveEvent=t,this._handleMouseMoveInternal()},_handleCropperDrag:function(t){if(void 0===this._handleCropperDrag._&&(this._handleCropperDrag._={}),this._handleCropperDrag._.deltaX=t.pageX-this.previousMouseX,this._handleCropperDrag._.deltaY=t.pageY-this.previousMouseY,0===this._handleCropperDrag._.deltaX&&0===this._handleCropperDrag._.deltaY)return!1;if(this._handleCropperDrag._.rectangle={left:this.clipper.left-this.clipper.width/2,top:this.clipper.top-this.clipper.height/2,width:this.clipper.width,height:this.clipper.height},this._handleCropperDrag._.vertices=this._getRectangleVertices(this._handleCropperDrag._.rectangle,this._handleCropperDrag._.deltaX,this._handleCropperDrag._.deltaY),!this.arePointsInsideRectangle(this._handleCropperDrag._.vertices,this.imageVerticeCoords)){for(this._handleCropperDrag._.dxi=0,this._handleCropperDrag._.dyi=0,this._handleCropperDrag._.xStep=this._handleCropperDrag._.deltaX>0?-1:1,this._handleCropperDrag._.yStep=this._handleCropperDrag._.deltaY>0?-1:1,this._handleCropperDrag._.furthest=0,this._handleCropperDrag._.furthestDeltas={},this._handleCropperDrag._.dxi=Math.min(Math.abs(this._handleCropperDrag._.deltaX),10);this._handleCropperDrag._.dxi>=0;this._handleCropperDrag._.dxi--)for(this._handleCropperDrag._.dyi=Math.min(Math.abs(this._handleCropperDrag._.deltaY),10);this._handleCropperDrag._.dyi>=0;this._handleCropperDrag._.dyi--)this._handleCropperDrag._.vertices=this._getRectangleVertices(this._handleCropperDrag._.rectangle,this._handleCropperDrag._.dxi*(this._handleCropperDrag._.deltaX>0?1:-1),this._handleCropperDrag._.dyi*(this._handleCropperDrag._.deltaY>0?1:-1)),this.arePointsInsideRectangle(this._handleCropperDrag._.vertices,this.imageVerticeCoords)&&this._handleCropperDrag._.dxi+this._handleCropperDrag._.dyi>this._handleCropperDrag._.furthest&&(this._handleCropperDrag._.furthest=this._handleCropperDrag._.dxi+this._handleCropperDrag._.dyi,this._handleCropperDrag._.furthestDeltas={x:this._handleCropperDrag._.dxi*(this._handleCropperDrag._.deltaX>0?1:-1),y:this._handleCropperDrag._.dyi*(this._handleCropperDrag._.deltaY>0?1:-1)});if(0==this._handleCropperDrag._.furthest)return;this._handleCropperDrag._.deltaX=this._handleCropperDrag._.furthestDeltas.x,this._handleCropperDrag._.deltaY=this._handleCropperDrag._.furthestDeltas.y}this.clipper.set({left:this.clipper.left+this._handleCropperDrag._.deltaX,top:this.clipper.top+this._handleCropperDrag._.deltaY})},_handleFocalDrag:function(t){if(void 0===this._handleFocalDrag._&&(this._handleFocalDrag._={}),this.focalPoint){if(this._handleFocalDrag._.deltaX=t.pageX-this.previousMouseX,this._handleFocalDrag._.deltaY=t.pageY-this.previousMouseY,0===this._handleFocalDrag._.deltaX&&0===this._handleFocalDrag._.deltaY)return;if(this._handleFocalDrag._.newX=this.focalPoint.left+this._handleFocalDrag._.deltaX,this._handleFocalDrag._.newY=this.focalPoint.top+this._handleFocalDrag._.deltaY,"crop"===this.currentView){if(!this.arePointsInsideRectangle([{x:this._handleFocalDrag._.newX,y:this._handleFocalDrag._.newY}],this.imageVerticeCoords))return}else if(!(this.viewport.left-this.viewport.width/2-this._handleFocalDrag._.newX<0&&this.viewport.left+this.viewport.width/2-this._handleFocalDrag._.newX>0&&this.viewport.top-this.viewport.height/2-this._handleFocalDrag._.newY<0&&this.viewport.top+this.viewport.height/2-this._handleFocalDrag._.newY>0))return;this.focalPoint.set({left:this.focalPoint.left+this._handleFocalDrag._.deltaX,top:this.focalPoint.top+this._handleFocalDrag._.deltaY})}},setCroppingConstraint:function(t){switch(this.updateSizeAndPosition(),t){case"none":this.croppingConstraint=!1;break;case"original":this.croppingConstraint=this.originalWidth/this.originalHeight;break;case"current":this.croppingConstraint=this.clipper.width/this.clipper.height;break;case"custom":break;default:this.croppingConstraint=parseFloat(t)}},enforceCroppingConstraint:function(){var t=this;void 0===this.enforceCroppingConstraint._&&(this.enforceCroppingConstraint._={}),!this.animationInProgress&&this.croppingConstraint&&(this.animationInProgress=!0,this.enforceCroppingConstraint._.rectangle={left:this.clipper.left-this.clipper.width/2,top:this.clipper.top-this.clipper.height/2,width:this.clipper.width,height:this.clipper.height},this.clipper.width>this.clipper.height*this.croppingConstraint?(this.enforceCroppingConstraint._.previousHeight=this.enforceCroppingConstraint._.rectangle.height,this.enforceCroppingConstraint._.rectangle.height=this.clipper.width/this.croppingConstraint,this.enforceCroppingConstraint._.rectangle.top-=(this.enforceCroppingConstraint._.rectangle.height-this.enforceCroppingConstraint._.previousHeight)/2,this.arePointsInsideRectangle(this._getRectangleVertices(this.enforceCroppingConstraint._.rectangle),this.imageVerticeCoords)||(this.enforceCroppingConstraint._.rectangle.width=this.clipper.height*this.croppingConstraint,this.enforceCroppingConstraint._.rectangle.height=this.enforceCroppingConstraint._.rectangle.width/this.croppingConstraint)):(this.enforceCroppingConstraint._.previousWidth=this.enforceCroppingConstraint._.rectangle.width,this.enforceCroppingConstraint._.rectangle.width=this.clipper.height*this.croppingConstraint,this.enforceCroppingConstraint._.rectangle.left-=(this.enforceCroppingConstraint._.rectangle.width-this.enforceCroppingConstraint._.previousWidth)/2,this.arePointsInsideRectangle(this._getRectangleVertices(this.enforceCroppingConstraint._.rectangle),this.imageVerticeCoords)||(this.enforceCroppingConstraint._.rectangle.height=this.clipper.width/this.croppingConstraint,this.enforceCroppingConstraint._.rectangle.width=this.enforceCroppingConstraint._.rectangle.height*this.croppingConstraint)),this.enforceCroppingConstraint._.properties={height:this.enforceCroppingConstraint._.rectangle.height,width:this.enforceCroppingConstraint._.rectangle.width},this.clipper.animate(this.enforceCroppingConstraint._.properties,{onChange:function(){t._redrawCropperElements(),t.croppingCanvas.renderAll()},duration:this.settings.animationDuration,onComplete:function(){t._redrawCropperElements(),t.animationInProgress=!1,t.renderCropper(),t.storeCropperState()}}))},_handleCropperResize:function(t){void 0===this._handleCropperResize._&&(this._handleCropperResize._={}),this._handleCropperResize._.deltaX=t.pageX-this.previousMouseX,this._handleCropperResize._.deltaY=t.pageY-this.previousMouseY,"b"!==this.scalingCropper&&"t"!==this.scalingCropper||(this._handleCropperResize._.deltaX=0),"l"!==this.scalingCropper&&"r"!==this.scalingCropper||(this._handleCropperResize._.deltaY=0),0===this._handleCropperResize._.deltaX&&0===this._handleCropperResize._.deltaY||(this._handleCropperResize._.startingRectangle={left:this.clipper.left-this.clipper.width/2,top:this.clipper.top-this.clipper.height/2,width:this.clipper.width,height:this.clipper.height},this._handleCropperResize._.rectangle=this._calculateNewCropperSizeByDeltas(this._handleCropperResize._.startingRectangle,this._handleCropperResize._.deltaX,this._handleCropperResize._.deltaY,this.scalingCropper),this._handleCropperResize._.rectangle.height<30||this._handleCropperResize._.rectangle.width<30||this.arePointsInsideRectangle(this._getRectangleVertices(this._handleCropperResize._.rectangle),this.imageVerticeCoords)&&(this.clipper.set({top:this._handleCropperResize._.rectangle.top+this._handleCropperResize._.rectangle.height/2,left:this._handleCropperResize._.rectangle.left+this._handleCropperResize._.rectangle.width/2,width:this._handleCropperResize._.rectangle.width,height:this._handleCropperResize._.rectangle.height}),this._redrawCropperElements()))},_calculateNewCropperSizeByDeltas:function(t,e,i,s){if(void 0===this._calculateNewCropperSizeByDeltas._&&(this._calculateNewCropperSizeByDeltas._={}),this._calculateNewCropperSizeByDeltas._.topDelta=0,this._calculateNewCropperSizeByDeltas._.leftDelta=0,this._calculateNewCropperSizeByDeltas._.rectangle=t,this._calculateNewCropperSizeByDeltas._.deltaX=e,this._calculateNewCropperSizeByDeltas._.deltaY=i,this.croppingConstraint){switch(this._calculateNewCropperSizeByDeltas._.change=0,s){case"t":this._calculateNewCropperSizeByDeltas._.change=-this._calculateNewCropperSizeByDeltas._.deltaY;break;case"b":this._calculateNewCropperSizeByDeltas._.change=this._calculateNewCropperSizeByDeltas._.deltaY;break;case"r":this._calculateNewCropperSizeByDeltas._.change=this._calculateNewCropperSizeByDeltas._.deltaX;break;case"l":this._calculateNewCropperSizeByDeltas._.change=-this._calculateNewCropperSizeByDeltas._.deltaX;break;case"tr":this._calculateNewCropperSizeByDeltas._.change=Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY)>Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)?-this._calculateNewCropperSizeByDeltas._.deltaY:this._calculateNewCropperSizeByDeltas._.deltaX;break;case"tl":this._calculateNewCropperSizeByDeltas._.change=Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY)>Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)?-this._calculateNewCropperSizeByDeltas._.deltaY:-this._calculateNewCropperSizeByDeltas._.deltaX;break;case"br":this._calculateNewCropperSizeByDeltas._.change=Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY)>Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)?this._calculateNewCropperSizeByDeltas._.deltaY:this._calculateNewCropperSizeByDeltas._.deltaX;break;case"bl":this._calculateNewCropperSizeByDeltas._.change=Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY)>Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)?this._calculateNewCropperSizeByDeltas._.deltaY:-this._calculateNewCropperSizeByDeltas._.deltaX}switch(this.croppingConstraint>1?(this._calculateNewCropperSizeByDeltas._.deltaX=this._calculateNewCropperSizeByDeltas._.change,this._calculateNewCropperSizeByDeltas._.deltaY=this._calculateNewCropperSizeByDeltas._.deltaX/this.croppingConstraint):(this._calculateNewCropperSizeByDeltas._.deltaY=this._calculateNewCropperSizeByDeltas._.change,this._calculateNewCropperSizeByDeltas._.deltaX=this._calculateNewCropperSizeByDeltas._.deltaY*this.croppingConstraint),this._calculateNewCropperSizeByDeltas._.rectangle.height+=this._calculateNewCropperSizeByDeltas._.deltaY,this._calculateNewCropperSizeByDeltas._.rectangle.width+=this._calculateNewCropperSizeByDeltas._.deltaX,s){case"t":this._calculateNewCropperSizeByDeltas._.rectangle.top-=this._calculateNewCropperSizeByDeltas._.deltaY,this._calculateNewCropperSizeByDeltas._.rectangle.left-=this._calculateNewCropperSizeByDeltas._.deltaX/2;break;case"b":this._calculateNewCropperSizeByDeltas._.rectangle.left+=-this._calculateNewCropperSizeByDeltas._.deltaX/2;break;case"r":this._calculateNewCropperSizeByDeltas._.rectangle.top+=-this._calculateNewCropperSizeByDeltas._.deltaY/2;break;case"l":this._calculateNewCropperSizeByDeltas._.rectangle.top-=this._calculateNewCropperSizeByDeltas._.deltaY/2,this._calculateNewCropperSizeByDeltas._.rectangle.left-=this._calculateNewCropperSizeByDeltas._.deltaX;break;case"tr":this._calculateNewCropperSizeByDeltas._.rectangle.top-=this._calculateNewCropperSizeByDeltas._.deltaY;break;case"tl":this._calculateNewCropperSizeByDeltas._.rectangle.top-=this._calculateNewCropperSizeByDeltas._.deltaY,this._calculateNewCropperSizeByDeltas._.rectangle.left-=this._calculateNewCropperSizeByDeltas._.deltaX;break;case"bl":this._calculateNewCropperSizeByDeltas._.rectangle.left-=this._calculateNewCropperSizeByDeltas._.deltaX}}else!this.shiftKeyHeld||"tl"!==s&&"tr"!==s&&"bl"!==s&&"br"!==s||(this._calculateNewCropperSizeByDeltas._.ratio,Math.abs(e)>Math.abs(i)?(this._calculateNewCropperSizeByDeltas._.ratio=t.width/t.height,this._calculateNewCropperSizeByDeltas._.deltaY=this._calculateNewCropperSizeByDeltas._.deltaX/this._calculateNewCropperSizeByDeltas._.ratio,this._calculateNewCropperSizeByDeltas._.deltaY*="tr"===s||"bl"===s?-1:1):(this._calculateNewCropperSizeByDeltas._.ratio=t.width/t.height,this._calculateNewCropperSizeByDeltas._.deltaX=this._calculateNewCropperSizeByDeltas._.deltaY*this._calculateNewCropperSizeByDeltas._.ratio,this._calculateNewCropperSizeByDeltas._.deltaX*="tr"===s||"bl"===s?-1:1)),s.match(/t/)&&(this._calculateNewCropperSizeByDeltas._.rectangle.top+=this._calculateNewCropperSizeByDeltas._.deltaY,this._calculateNewCropperSizeByDeltas._.rectangle.height-=this._calculateNewCropperSizeByDeltas._.deltaY),s.match(/b/)&&(this._calculateNewCropperSizeByDeltas._.rectangle.height+=this._calculateNewCropperSizeByDeltas._.deltaY),s.match(/r/)&&(this._calculateNewCropperSizeByDeltas._.rectangle.width+=this._calculateNewCropperSizeByDeltas._.deltaX),s.match(/l/)&&(this._calculateNewCropperSizeByDeltas._.rectangle.left+=this._calculateNewCropperSizeByDeltas._.deltaX,this._calculateNewCropperSizeByDeltas._.rectangle.width-=this._calculateNewCropperSizeByDeltas._.deltaX);return this._calculateNewCropperSizeByDeltas._.rectangle.top=this._calculateNewCropperSizeByDeltas._.rectangle.top,this._calculateNewCropperSizeByDeltas._.rectangle.left=this._calculateNewCropperSizeByDeltas._.rectangle.left,this._calculateNewCropperSizeByDeltas._.rectangle.width=this._calculateNewCropperSizeByDeltas._.rectangle.width,this._calculateNewCropperSizeByDeltas._.rectangle.height=this._calculateNewCropperSizeByDeltas._.rectangle.height,this._calculateNewCropperSizeByDeltas._.rectangle},_setMouseCursor:function(t){void 0===this._setMouseCursor._&&(this._setMouseCursor._={}),Garnish.isMobileBrowser(!0)||(this._setMouseCursor._.cursor="default",this._setMouseCursor._.handle=this.croppingCanvas&&this._cropperHandleHitTest(t),this.focalPoint&&this._isMouseOver(t,this.focalPoint)?this._setMouseCursor._.cursor="pointer":this._setMouseCursor._.handle?"t"===this._setMouseCursor._.handle||"b"===this._setMouseCursor._.handle?this._setMouseCursor._.cursor="ns-resize":"l"===this._setMouseCursor._.handle||"r"===this._setMouseCursor._.handle?this._setMouseCursor._.cursor="ew-resize":"tl"===this._setMouseCursor._.handle||"br"===this._setMouseCursor._.handle?this._setMouseCursor._.cursor="nwse-resize":"bl"!==this._setMouseCursor._.handle&&"tr"!==this._setMouseCursor._.handle||(this._setMouseCursor._.cursor="nesw-resize"):this.croppingCanvas&&this._isMouseOver(t,this.clipper)&&(this._setMouseCursor._.cursor="move"),$(".body").css("cursor",this._setMouseCursor._.cursor))},_cropperHandleHitTest:function(t){if(void 0===this._cropperHandleHitTest._&&(this._cropperHandleHitTest._={}),this._cropperHandleHitTest._.parentOffset=this.$croppingCanvas.offset(),this._cropperHandleHitTest._.mouseX=t.pageX-this._cropperHandleHitTest._.parentOffset.left,this._cropperHandleHitTest._.mouseY=t.pageY-this._cropperHandleHitTest._.parentOffset.top,this._cropperHandleHitTest._.lb=this.clipper.left-this.clipper.width/2,this._cropperHandleHitTest._.rb=this._cropperHandleHitTest._.lb+this.clipper.width,this._cropperHandleHitTest._.tb=this.clipper.top-this.clipper.height/2,this._cropperHandleHitTest._.bb=this._cropperHandleHitTest._.tb+this.clipper.height,this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.lb+10&&this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.lb-3){if(this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.tb+10&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.tb-3)return"tl";if(this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.bb+3&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.bb-10)return"bl"}if(this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.rb-13&&this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.rb+3){if(this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.tb+10&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.tb-3)return"tr";if(this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.bb+2&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.bb-10)return"br"}return this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.lb+3&&this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.lb-3&&this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.bb-10&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.tb+10?"l":this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.rb+1&&this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.rb-5&&this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.bb-10&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.tb+10?"r":this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.tb+4&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.tb-2&&this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.lb+10&&this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.rb-10?"t":this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.bb+2&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.bb-4&&this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.lb+10&&this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.rb-10&&"b"},_isMouseOver:function(t,e){return void 0===this._isMouseOver._&&(this._isMouseOver._={}),this._isMouseOver._.parentOffset=this.$croppingCanvas.offset(),this._isMouseOver._.mouseX=t.pageX-this._isMouseOver._.parentOffset.left,this._isMouseOver._.mouseY=t.pageY-this._isMouseOver._.parentOffset.top,this._isMouseOver._.lb=e.left-e.width/2,this._isMouseOver._.rb=this._isMouseOver._.lb+e.width,this._isMouseOver._.tb=e.top-e.height/2,this._isMouseOver._.bb=this._isMouseOver._.tb+e.height,this._isMouseOver._.mouseX>=this._isMouseOver._.lb&&this._isMouseOver._.mouseX<=this._isMouseOver._.rb&&this._isMouseOver._.mouseY>=this._isMouseOver._.tb&&this._isMouseOver._.mouseY<=this._isMouseOver._.bb},_getRectangleVertices:function(t,e,i){return void 0===this._getRectangleVertices._&&(this._getRectangleVertices._={}),void 0===e&&(e=0),void 0===i&&(i=0),this._getRectangleVertices._.topLeft={x:t.left+e,y:t.top+i},this._getRectangleVertices._.topRight={x:this._getRectangleVertices._.topLeft.x+t.width,y:this._getRectangleVertices._.topLeft.y},this._getRectangleVertices._.bottomRight={x:this._getRectangleVertices._.topRight.x,y:this._getRectangleVertices._.topRight.y+t.height},this._getRectangleVertices._.bottomLeft={x:this._getRectangleVertices._.topLeft.x,y:this._getRectangleVertices._.bottomRight.y},[this._getRectangleVertices._.topLeft,this._getRectangleVertices._.topRight,this._getRectangleVertices._.bottomRight,this._getRectangleVertices._.bottomLeft]},_setFittedImageVerticeCoordinates:function(){this.imageVerticeCoords=this.getImageVerticeCoords("fit")},getImageVerticeCoords:function(t){var e,i=-1*((this.hasOrientationChanged()?90:0)+this.imageStraightenAngle)*(Math.PI/180),s=this.getScaledImageDimensions();e="number"==typeof t?t:"cover"===t?this.getZoomToCoverRatio(s):this.getZoomToFitRatio(s);var a=s.height*e,n=s.width*e,r=Math.cos(i)*a,o=Math.sin(i)*n,l=Math.cos(i)*n,h=Math.sin(i)*a,d=(this.editorHeight-(r+o))/2,c=(this.editorWidth-(h+l))/2;return{a:{x:c+l,y:d},b:{x:this.editorWidth-c,y:d+r},c:{x:c+h,y:this.editorHeight-d},d:{x:c,y:d+o}}},_debug:function(t){this.canvas.remove(this.debugger),this.debugger=t,this.canvas.add(this.debugger)},arePointsInsideRectangle:function(t,e){for(void 0===this.arePointsInsideRectangle._&&(this.arePointsInsideRectangle._={}),this.arePointsInsideRectangle._.ab=this._getVector(e.a,e.b),this.arePointsInsideRectangle._.bc=this._getVector(e.b,e.c),this.arePointsInsideRectangle._.scalarAbAb=this._getScalarProduct(this.arePointsInsideRectangle._.ab,this.arePointsInsideRectangle._.ab),this.arePointsInsideRectangle._.scalarBcBc=this._getScalarProduct(this.arePointsInsideRectangle._.bc,this.arePointsInsideRectangle._.bc),this.arePointsInsideRectangle._.i=0;this.arePointsInsideRectangle._.i<t.length;this.arePointsInsideRectangle._.i++)if(this.arePointsInsideRectangle._.point=t[this.arePointsInsideRectangle._.i],this.arePointsInsideRectangle._.ap=this._getVector(e.a,this.arePointsInsideRectangle._.point),this.arePointsInsideRectangle._.bp=this._getVector(e.b,this.arePointsInsideRectangle._.point),this.arePointsInsideRectangle._.scalarAbAp=this._getScalarProduct(this.arePointsInsideRectangle._.ab,this.arePointsInsideRectangle._.ap),this.arePointsInsideRectangle._.scalarBcBp=this._getScalarProduct(this.arePointsInsideRectangle._.bc,this.arePointsInsideRectangle._.bp),this.arePointsInsideRectangle._.projectsOnAB=0<=this.arePointsInsideRectangle._.scalarAbAp&&this.arePointsInsideRectangle._.scalarAbAp<=this.arePointsInsideRectangle._.scalarAbAb,this.arePointsInsideRectangle._.projectsOnBC=0<=this.arePointsInsideRectangle._.scalarBcBp&&this.arePointsInsideRectangle._.scalarBcBp<=this.arePointsInsideRectangle._.scalarBcBc,!this.arePointsInsideRectangle._.projectsOnAB||!this.arePointsInsideRectangle._.projectsOnBC)return!1;return!0},_getVector:function(t,e){return{x:e.x-t.x,y:e.y-t.y}},_getScalarProduct:function(t,e){return t.x*e.x+t.y*e.y},_getVectorMagnitude:function(t){return Math.sqrt(t.x*t.x+t.y*t.y)},_getAngleBetweenVectors:function(t,e){return Math.round(180*Math.acos(Math.min(1,this._getScalarProduct(t,e)/(this._getVectorMagnitude(t)*this._getVectorMagnitude(e))))/Math.PI*100)/100},_getEdgeCrossed:function(t,e){for(var i=[[t.a,t.b],[t.b,t.c],[t.c,t.d],[t.d,t.a]],s={x:this.editorWidth/2,y:this.editorHeight/2},a=180,n=null,r=0;r<i.length;r++){var o=i[r],l=this._getVector(o[0],s),h=this._getVector(o[0],o[1]),d=this._getVector(o[0],e),c=Math.abs(this._getAngleBetweenVectors(l,d)-(this._getAngleBetweenVectors(l,h)+this._getAngleBetweenVectors(h,d)));c<a&&(a=c,n=o)}return n},_getImageBoundingBox:function(t){var e={},i=Math.abs(this.imageStraightenAngle)*(Math.PI/180),s=t.height/t.width;if(e.height=t.width*(Math.sin(i)+Math.cos(i)*s),e.width=t.width*(Math.cos(i)+Math.sin(i)*s),this.hasOrientationChanged()){var a=e.width;e.width=e.height,e.height=a}return e}},{defaults:{animationDuration:100,allowSavingAsNew:!0,onSave:$.noop,allowDegreeFractions:null}})},2495:function(){function t(e){return t="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(e)}Craft.AssetIndex=Craft.BaseElementIndex.extend({$includeSubfoldersContainer:null,$includeSubfoldersCheckbox:null,showingIncludeSubfoldersCheckbox:!1,$uploadButton:null,$uploadInput:null,$progressBar:null,$folders:null,uploader:null,promptHandler:null,progressBar:null,_uploadTotalFiles:0,_uploadFileProgress:{},_currentUploaderSettings:{},_assetDrag:null,_folderDrag:null,_expandDropTargetFolderTimeout:null,_tempExpandedFolders:[],_fileConflictTemplate:{choices:[{value:"keepBoth",title:Craft.t("app","Keep both")},{value:"replace",title:Craft.t("app","Replace it")}]},_folderConflictTemplate:{choices:[{value:"replace",title:Craft.t("app","Replace the folder (all existing files will be deleted)")},{value:"merge",title:Craft.t("app","Merge the folder (any conflicting files will be replaced)")}]},init:function(t,e,i){this.base(t,e,i),"index"===this.settings.context?(this._folderDrag||this._initIndexPageMode(),this.addListener(Garnish.$win,"resize,scroll","_positionProgressBar")):(this.addListener(this.$main,"scroll","_positionProgressBar"),this.settings.modal&&this.settings.modal.on("updateSizeAndPosition",this._positionProgressBar.bind(this)))},initSources:function(){return"index"!==this.settings.context||this._folderDrag||this._initIndexPageMode(),this.base()},initSource:function(t){this.base(t),this._createFolderContextMenu(t),"index"===this.settings.context&&(this._folderDrag&&this.getSourceLevel(t)>1&&t.data("folder-id")&&this._folderDrag.addItems(t.parent()),this._assetDrag&&this._assetDrag.updateDropTargets())},deinitSource:function(t){this.base(t);var e=t.data("contextmenu");e&&e.destroy(),"index"===this.settings.context&&(this._folderDrag&&this.getSourceLevel(t)>1&&this._folderDrag.removeItems(t.parent()),this._assetDrag&&this._assetDrag.updateDropTargets())},_initIndexPageMode:function(){var t=this;this._folderDrag||(this.settings.selectable=!0,this.settings.multiSelect=!0,this._assetDrag=new Garnish.DragDrop({activeDropTargetClass:"sel",helperOpacity:.75,filter:function(){return t.view.getSelectedElements().has("div.element[data-movable]")},helper:function(e){return t._getFileDragHelper(e)},dropTargets:function(){var e;e=t._assetDrag.$draggee&&t._assetDrag.$draggee.has(".element[data-peer-file]").length?"data-can-move-peer-files-to":"data-can-move-to";for(var i=[],s=0;s<t.$sources.length;s++){var a=t.$sources.eq(s);Garnish.hasAttr(a,e)&&i.push(a)}return i},onDragStart:this._onDragStart.bind(this),onDropTargetChange:this._onDropTargetChange.bind(this),onDragStop:this._onFileDragStop.bind(this),helperBaseZindex:800}),this._folderDrag=new Garnish.DragDrop({activeDropTargetClass:"sel",helperOpacity:.75,helper:function(e){var i=$('<div class="sidebar drag-helper"/>'),s=$("<nav/>").appendTo(i),a=$("<ul/>").appendTo(s);return e.appendTo(a).removeClass("expanded"),e.children("a").addClass("sel"),e.css({"padding-top":t._folderDrag.$draggee.css("padding-top"),"padding-right":t._folderDrag.$draggee.css("padding-right"),"padding-bottom":t._folderDrag.$draggee.css("padding-bottom"),"padding-left":t._folderDrag.$draggee.css("padding-left")}),i},dropTargets:function(){var e=[],i=[];t._folderDrag.$draggee.find("a[data-key]").each((function(){i.push($(this).data("key"))}));for(var s=0;s<t.$sources.length;s++){var a=t.$sources.eq(s),n=a.data("key");t._getVolumeOrFolderUidFromSourceKey(n)&&(Craft.inArray(n,i)||e.push(a))}return e},onDragStart:this._onDragStart.bind(this),onDropTargetChange:this._onDropTargetChange.bind(this),onDragStop:this._onFolderDragStop.bind(this)}))},_onFileDragStop:function(){var t=this;if(this._assetDrag.$activeDropTarget&&this._assetDrag.$activeDropTarget[0]!==this.$source[0]){for(var e=this.$source,i=this._assetDrag.$activeDropTarget.data("folder-id"),s=[],a=0;a<this._assetDrag.$draggee.length;a++){var n=Craft.getElementInfo(this._assetDrag.$draggee[a]).id;s.push(n)}if(s.length){this.setIndexBusy(),this._positionProgressBar(),this.progressBar.resetProgressBar(),this.progressBar.setItemCount(s.length),this.progressBar.showProgressBar();var r=[];for(a=0;a<s.length;a++)r.push({action:"assets/move-asset",params:{assetId:s[a],folderId:i}});return void this._performBatchRequests(r,(function a(n){t.promptHandler.resetPrompts();for(var r=0;r<n.length;r++){var o=n[r];o.conflict&&t.promptHandler.addPrompt({assetId:o.assetId,suggestedFilename:o.suggestedFilename,prompt:{message:o.conflict,choices:t._fileConflictTemplate.choices}}),o.error&&alert(o.error)}t.setIndexAvailable(),t.progressBar.hideProgressBar();var l=!1,h=function(){this.sourceSelect.selectItem(e),this._totalVisible-=this._assetDrag.$draggee.length;for(var t=0;t<s.length;t++)$("[data-id="+s[t]+"]").remove();this.view.deselectAllElements(),this._collapseExtraExpandedFolders(i),l&&this.updateElements()};t.promptHandler.getPromptCount()?(t._assetDrag.fadeOutHelpers(),t.promptHandler.showBatchPrompts((function(e){for(var s=[],n=0;n<e.length;n++)"cancel"!==e[n].choice?("keepBoth"===e[n].choice&&s.push({action:"assets/move-asset",params:{folderId:i,assetId:e[n].assetId,filename:e[n].suggestedFilename}}),"replace"===e[n].choice&&s.push({action:"assets/move-asset",params:{folderId:i,assetId:e[n].assetId,force:!0}})):l=!0;0===s.length?h.apply(t):(t.setIndexBusy(),t.progressBar.resetProgressBar(),t.progressBar.setItemCount(t.promptHandler.getPromptCount()),t.progressBar.showProgressBar(),t._performBatchRequests(s,a))}))):(h.apply(t),t._assetDrag.fadeOutHelpers())}))}}else this.$source.addClass("sel"),this._collapseExtraExpandedFolders();this._assetDrag.returnHelpersToDraggees()},_onFolderDragStop:function(){var t=this;if(this._folderDrag.$activeDropTarget&&0===this._folderDrag.$activeDropTarget.siblings("ul").children("li").filter(this._folderDrag.$draggee).length){var e=this._folderDrag.$activeDropTarget.data("folder-id");this._collapseExtraExpandedFolders(e);for(var i=[],s=0;s<this._folderDrag.$draggee.length;s++){var a=this._folderDrag.$draggee.eq(s).children("a").data("folder-id");if(a!=e){i.push(a);break}}if(i.length){i.sort(),i.reverse(),this.setIndexBusy(),this._positionProgressBar(),this.progressBar.resetProgressBar(),this.progressBar.setItemCount(i.length),this.progressBar.showProgressBar();var n=[];for(s=0;s<i.length;s++)n.push({action:"assets/move-folder",params:{folderId:i[s],parentId:e}});this.requestId++;var r=[],o="";return void this._performBatchRequests(n,(function e(s){t.promptHandler.resetPrompts();for(var a=0;a<s.length;a++){var n=s[a];n.success&&(n.transferList&&(r=n.transferList),n.newFolderId&&(o=t._folderDrag.$activeDropTarget.data("key")+"/folder:"+n.newFolderUid)),n.conflict&&(n.prompt={message:n.conflict,choices:t._folderConflictTemplate.choices},t.promptHandler.addPrompt(n)),n.error&&alert(n.error)}t.promptHandler.getPromptCount()?(t.promptHandler.showBatchPrompts((function(s){t.promptHandler.resetPrompts();for(var a=[],l={},h=0;h<s.length;h++)"cancel"!==s[h].choice&&("replace"===s[h].choice&&(l.force=!0),"merge"===s[h].choice&&(l.merge=!0),l.folderId=n.folderId,l.parentId=n.parentId,a.push({action:"assets/move-folder",params:l}));0===a.length?t._performActualFolderMove(r,i,o):(t.setIndexBusy(),t.progressBar.resetProgressBar(),t.progressBar.setItemCount(t.promptHandler.getPromptCount()),t.progressBar.showProgressBar(),t._performBatchRequests(a,e))})),t.setIndexAvailable(),t.progressBar.hideProgressBar()):t._performActualFolderMove(r,i,o)}))}}else this.$source.addClass("sel"),this._collapseExtraExpandedFolders();this._folderDrag.returnHelpersToDraggees()},_performActualFolderMove:function(t,e,i){var s=this;this.setIndexBusy(),this.progressBar.resetProgressBar(),this.progressBar.setItemCount(1),this.progressBar.showProgressBar();var a=function(t){for(var e=0,a=t.length,n=0;n<t.length;n++){var r={folderId:t[n]};Craft.sendActionRequest("POST","assets/delete-folder",{data:r}).then((function(t){++e===a&&(s.setIndexAvailable(),s.progressBar.hideProgressBar(),s._folderDrag.returnHelpersToDraggees(),s.setInstanceState("selectedSource",i),s.refreshSources())}))}};if(t.length>0){for(var n=[],r=0;r<t.length;r++)n.push({action:"assets/move-asset",params:t[r]});this._performBatchRequests(n,(function(){a(e)}))}else a(e)},_selectSourceByFolderId:function(t){for(var e=this._getSourceByKey(t),i=e.parent().parents("li"),s=0;s<i.length;s++){var a=$(i[s]);a.hasClass("expanded")||a.children(".toggle").trigger("click")}this.selectSource(e),this.updateElements()},afterInit:function(){var t=this;this.$uploadButton||(this.$uploadButton=$("<button/>",{type:"button",class:"btn submit","data-icon":"upload",style:"position: relative; overflow: hidden;",text:Craft.t("app","Upload files")}),this.addButton(this.$uploadButton),this.$uploadInput=$('<input type="file" multiple="multiple" name="assets-upload" />').hide().insertBefore(this.$uploadButton)),this.promptHandler=new Craft.PromptHandler,this.progressBar=new Craft.ProgressBar(this.$main,!0);var e={url:Craft.getActionUrl("assets/upload"),fileInput:this.$uploadInput,dropZone:this.$container};e.events={fileuploadstart:this._onUploadStart.bind(this),fileuploadprogressall:this._onUploadProgress.bind(this),fileuploaddone:this._onUploadSuccess.bind(this),fileuploadalways:this._onUploadAlways.bind(this),fileuploadfail:this._onUploadFailure.bind(this)},this.settings.criteria&&void 0!==this.settings.criteria.kind&&(e.allowedKinds=this.settings.criteria.kind),this._currentUploaderSettings=e,this.uploader=new Craft.Uploader(this.$uploadButton,e),this.$uploadButton.on("click",(function(){t.$uploadButton.hasClass("disabled")||t.isIndexBusy||t.$uploadButton.parent().find("input[name=assets-upload]").trigger("click")})),this.base()},getDefaultSourceKey:function(){var e=this;if("index"===this.settings.context&&void 0!==window.defaultSource){var i=function(){var t=window.defaultSource.split("/"),i=e.$sources.toArray().find((function(e){return $(e).data("volume-handle")===t[0]}));if(i){for(var s=$(i),a=function(i){var a=e._getChildSources(s).toArray().find((function(e){return $("> .label",e).text()===t[i]}));if(!a)return"break";e._expandSource(s),s=$(a)},n=1;n<t.length&&"break"!==a(n);n++);return{v:s.data("key")}}}();if("object"===t(i))return i.v}return this.base()},onSelectSource:function(){var t=this._getSourceByKey(this.sourceKey);t.data("folder-id")&&Garnish.hasAttr(this.$source,"data-can-upload")?(this.uploader.setParams({folderId:this.$source.attr("data-folder-id")}),this.$uploadButton.removeClass("disabled")):this.$uploadButton.addClass("disabled"),t.length&&"index"===this.settings.context&&this._updateUrl(t),this.base()},_updateUrl:function(t){for(var e,i=[],s=t;(e=this.getParentSource(s))&&e.length;)i.unshift(s),s=e;var a="assets";s.data("volume-handle")&&(a+="/"+s.data("volume-handle"),i.forEach((function(t){a+="/"+t.children(".label").text()}))),Craft.setPath(a)},_getVolumeOrFolderUidFromSourceKey:function(t){var e=t.match(/\b(?:folder|volume):([0-9a-f\-]+)$/);return e?e[1]:null},startSearching:function(){if(!this.settings.hideSidebar&&this.$source.siblings("ul").length){if(null===this.$includeSubfoldersContainer){var t="includeSubfolders-"+Math.floor(1e9*Math.random());this.$includeSubfoldersContainer=$('<div style="margin-bottom: -25px; opacity: 0;"/>').insertAfter(this.$search);var e=$('<div style="padding-top: 5px;"/>').appendTo(this.$includeSubfoldersContainer);this.$includeSubfoldersCheckbox=$('<input type="checkbox" id="'+t+'" class="checkbox"/>').appendTo(e),$('<label class="light smalltext" for="'+t+'"/>').text(" "+Craft.t("app","Search in subfolders")).appendTo(e),this.addListener(this.$includeSubfoldersCheckbox,"change",(function(){this.setSelecetedSourceState("includeSubfolders",this.$includeSubfoldersCheckbox.prop("checked")),this.updateElements()}))}else this.$includeSubfoldersContainer.velocity("stop").removeClass("hidden");var i=this.getSelectedSourceState("includeSubfolders",!1);this.$includeSubfoldersCheckbox.prop("checked",i),this.$includeSubfoldersContainer.velocity({marginBottom:0,opacity:1},"fast"),this.showingIncludeSubfoldersCheckbox=!0}this.base()},stopSearching:function(){var t=this;this.showingIncludeSubfoldersCheckbox&&(this.$includeSubfoldersContainer.velocity("stop"),this.$includeSubfoldersContainer.velocity({marginBottom:-25,opacity:0},{duration:"fast",complete:function(){t.$includeSubfoldersContainer.addClass("hidden")}}),this.showingIncludeSubfoldersCheckbox=!1),this.base()},getViewParams:function(){var t=this.base();return this.showingIncludeSubfoldersCheckbox&&this.$includeSubfoldersCheckbox.prop("checked")&&(t.criteria.includeSubfolders=!0),t},_onUploadStart:function(){this.setIndexBusy(),this._positionProgressBar(),this.progressBar.resetProgressBar(),this.progressBar.showProgressBar(),this.promptHandler.resetPrompts()},_onUploadProgress:function(t,e){var i=parseInt(e.loaded/e.total*100,10);this.progressBar.setProgressPercentage(i)},_onUploadSuccess:function(t,e){var i=e.result;this.selectElementAfterUpdate(i.assetId),i.conflict&&(i.prompt={message:Craft.t("app",i.conflict,{file:i.filename}),choices:this._fileConflictTemplate.choices},this.promptHandler.addPrompt(i)),Craft.cp.runQueue()},_onUploadAlways:function(){this.uploader.isLastUpload()&&(this.progressBar.hideProgressBar(),this.setIndexAvailable(),this.promptHandler.getPromptCount()?this.promptHandler.showBatchPrompts(this._uploadFollowup.bind(this)):this._updateAfterUpload())},_onUploadFailure:function(t,e){var i,s=e.response(),a=(null==s||null===(i=s.jqXHR)||void 0===i?void 0:i.responseJSON)||{},n=a.message,r=a.filename;n||(n=r?Craft.t("app","Upload failed for “{filename}”.",{filename:r}):Craft.t("app","Upload failed.")),alert(n)},_updateAfterUpload:function(){"index"!==this.settings.context&&(this.clearSearch(),this.setSelectedSortAttribute("dateCreated","desc")),this.updateElements()},_uploadFollowup:function(t){var e=this;this.setIndexBusy(),this.progressBar.resetProgressBar(),this.promptHandler.resetPrompts(),this.progressBar.setItemCount(t.length),this.progressBar.showProgressBar(),function t(i,s,a){var n={},r=null,o=function(){s++,e.progressBar.incrementProcessedItemCount(1),e.progressBar.updateProgressBar(),s===i.length?a():t(i,s,a)},l=function(t){t.assetId&&e.selectElementAfterUpdate(t.assetId),o()};"replace"===i[s].choice?(r="assets/replace-file",n.sourceAssetId=i[s].assetId,i[s].conflictingAssetId?n.assetId=i[s].conflictingAssetId:n.targetFilename=i[s].filename):"cancel"===i[s].choice&&(r="assets/delete-asset",n.assetId=i[s].assetId),r?Craft.sendActionRequest("POST",r,{data:n}).then((function(t){return l(t.data)})).catch((function(t){return function(t){alert(t.message),o()}(t.response.data)})):l({assetId:i[s].assetId})}(t,0,(function(){e.progressBar.hideProgressBar(),e.setIndexAvailable(),e._updateAfterUpload()}))},onUpdateElements:function(){var t=this;this._onUpdateElements(!1,this.view.getAllElements()),this.view.on("appendElements",(function(e){t._onUpdateElements(!0,e.newElements)})),this.base()},_onUpdateElements:function(t,e){"index"===this.settings.context&&(t||this._assetDrag.removeAllItems(),this._assetDrag.addItems(e.has("div.element[data-movable]"))),this.base(t,e),this.removeListener(this.$elements,"keydown"),this.addListener(this.$elements,"keydown",this._onKeyDown.bind(this)),this.view.elementSelect.on("focusItem",this._onElementFocus.bind(this))},_onKeyDown:function(t){if(t.keyCode===Garnish.SPACE_KEY&&t.shiftKey){if(Craft.PreviewFileModal.openInstance)Craft.PreviewFileModal.openInstance.selfDestruct();else{var e=this.view.elementSelect.$focusedItem.find(".element");e.length&&this._loadPreview(e)}return t.stopPropagation(),!1}},_onElementFocus:function(t){var e=$(t.item).find(".element");Craft.PreviewFileModal.openInstance&&e.length&&this._loadPreview(e)},_loadPreview:function(t){var e={};t.data("image-width")&&(e.startingWidth=t.data("image-width"),e.startingHeight=t.data("image-height")),new Craft.PreviewFileModal(t.data("id"),this.view.elementSelect,e)},_onDragStart:function(){this._tempExpandedFolders=[]},_getFileDragHelper:function(t){var e,i;switch(this.getSelectedSourceState("mode")){case"table":e=$('<div class="elements datatablesorthelper"/>').appendTo(Garnish.$bod),i=$('<div class="tableview"/>').appendTo(e);var s=$('<table class="data"/>').appendTo(i),a=$("<tbody/>").appendTo(s);t.appendTo(a),this._$firstRowCells=this.view.$table.children("tbody").children("tr:first").children();for(var n=t.children(),r=0;r<n.length;r++){var o=$(n[r]);if(o.hasClass("checkbox-cell"))o.remove(),e.css("margin-"+Craft.left,19);else{var l=$(this._$firstRowCells[r]),h=l.width();l.width(h),o.width(h)}}return e;case"thumbs":return e=$('<div class="elements thumbviewhelper"/>').appendTo(Garnish.$bod),i=$('<ul class="thumbsview"/>').appendTo(e),t.appendTo(i),e}return $()},_onDropTargetChange:function(t){if(clearTimeout(this._expandDropTargetFolderTimeout),t){var e=t.data("folder-id");e?(this.dropTargetFolder=this._getSourceByKey(e),this._hasSubfolders(this.dropTargetFolder)&&!this._isExpanded(this.dropTargetFolder)&&(this._expandDropTargetFolderTimeout=setTimeout(this._expandFolder.bind(this),500))):this.dropTargetFolder=null}t&&t[0]!==this.$source[0]?this.$source.removeClass("sel"):this.$source.addClass("sel")},_collapseExtraExpandedFolders:function(t){var e;clearTimeout(this._expandDropTargetFolderTimeout),t&&(e=this._getSourceByKey(t).parents("li").children("a"));for(var i=this._tempExpandedFolders.length-1;i>=0;i--){var s=this._tempExpandedFolders[i];void 0!==e&&0!==e.filter('[data-key="'+s.data("key")+'"]').length||(this._collapseFolder(s),this._tempExpandedFolders.splice(i,1))}},_getSourceByKey:function(t){return this.$sources.filter('[data-key$="'+t+'"]')},_hasSubfolders:function(t){return t.siblings("ul").find("li").length},_isExpanded:function(t){return t.parent("li").hasClass("expanded")},_expandFolder:function(){this._collapseExtraExpandedFolders(this.dropTargetFolder.data("folder-id")),this.dropTargetFolder.siblings(".toggle").trigger("click"),this._tempExpandedFolders.push(this.dropTargetFolder)},_collapseFolder:function(t){t.parent().hasClass("expanded")&&t.siblings(".toggle").trigger("click")},getSourceActions:function(){var t=this,e=this.base();return this._getVolumeOrFolderUidFromSourceKey(this.sourceKey)&&(e.push({label:Craft.t("app","New subfolder"),onSelect:function(){t._createSubfolder(t.$source)}}),this.getSourceLevel(this.$source)>1&&(e.push({label:Craft.t("app","Rename folder"),onSelect:function(){t._renameFolder(t.$source)}}),e.push({label:Craft.t("app","Delete folder"),destructive:!0,onSelect:function(){t._deleteFolder(t.$source)}}))),e},_createFolderContextMenu:function(t){var e=this;if(this._getVolumeOrFolderUidFromSourceKey(t.data("key"))){var i=[{label:Craft.t("app","New subfolder"),onClick:function(){e._createSubfolder(t)}}];"index"===this.settings.context&&this.getSourceLevel(t)>1&&(i.push({label:Craft.t("app","Rename folder"),onClick:function(){e._renameFolder(t)}}),i.push({label:Craft.t("app","Delete folder"),onClick:function(){e._deleteFolder(t)}})),new Garnish.ContextMenu(t,i,{menuClass:"menu"})}},_createSubfolder:function(t){var e=this,i=prompt(Craft.t("app","Enter the name of the folder"));if(i){var s={parentId:t.data("folder-id"),folderName:i};this.setIndexBusy(),Craft.sendActionRequest("POST","assets/create-folder",{data:s}).then((function(i){var s=i.data;e.setIndexAvailable(),e._prepareParentForChildren(t);var a=$("<li>"+'<a data-key="'.concat(t.data("key"),"/folder:").concat(s.folderUid,'" data-default-sort="').concat(t.data("default-sort"),'"')+(Garnish.hasAttr(t,"data-has-thumbs")?" data-has-thumbs":"")+' data-folder-id="'.concat(s.folderId,'"')+(Garnish.hasAttr(t,"data-can-upload")?" data-can-upload":"")+(Garnish.hasAttr(t,"data-can-move-to")?" data-can-move-to":"")+(Garnish.hasAttr(t,"data-can-move-peer-files-to")?" data-can-move-peer-files-to":"")+">"+'<span class="label">'.concat(s.folderName,"</span>")+"</a></li>"),n=a.children("a:first");e._appendSubfolder(t,a),e.initSource(n),Craft.cp.displayNotice(Craft.t("app","Folder created."))})).catch((function(t){var i=t.response;e.setIndexAvailable(),alert(i.data.message)}))}},_deleteFolder:function(t){var e=this;if(confirm(Craft.t("app","Really delete folder “{folder}”?",{folder:$.trim(t.text())}))){var i={folderId:t.data("folder-id")};this.setIndexBusy(),Craft.sendActionRequest("POST","assets/delete-folder",{data:i}).then((function(i){e.setIndexAvailable();var s=e.getParentSource(t);e.deinitSource(t),t.parent().remove(),e._cleanUpTree(s),Craft.cp.displayNotice(Craft.t("app","Folder deleted."))})).catch((function(t){var i=t.response;e.setIndexAvailable(),alert(i.data.message)}))}},_renameFolder:function(t){var e=this,i=t.children(".label"),s=Craft.trim(i.text()),a=prompt(Craft.t("app","Rename folder"),s);a&&a!==s&&(this.setIndexBusy(),Craft.sendActionRequest("POST","assets/rename-folder",{data:{folderId:t.data("folder-id"),newName:a}}).then((function(s){i.text(s.data.newName),t.data("key")===e.$source.data("key")&&(e.updateElements(),Craft.cp.displayNotice(Craft.t("app","Folder renamed.")),"index"===e.settings.context&&e._updateUrl(t))})).catch((function(t){var i=t.response;e.setIndexAvailable(),alert(i.data.message)})))},_prepareParentForChildren:function(t){this._hasSubfolders(t)||(t.parent().addClass("expanded").append('<div class="toggle"></div><ul class="nested"></ul>'),this.initSourceToggle(t))},_appendSubfolder:function(t,e){for(var i=t.siblings("ul").children("li"),s=$.trim(e.children("a:first").text()),a=!1,n=0;n<i.length;n++){var r=$(i[n]);if($.trim(r.children("a:first").text())>s){r.before(e),a=!0;break}}a||t.siblings("ul").append(e)},_cleanUpTree:function(t){null!==t&&0===t.siblings("ul").children("li").length&&(this.deinitSourceToggle(t),t.siblings("ul").remove(),t.siblings(".toggle").remove(),t.parent().removeClass("expanded"))},_positionProgressBar:function(){this.progressBar||(this.progressBar=new Craft.ProgressBar(this.$main,!0));var t=$(),e=0,i=0;"index"===this.settings.context?(t=this.progressBar.$progressBar.closest("#content"),e=Garnish.$win.scrollTop()):(t=this.progressBar.$progressBar.closest(".main"),e=this.$main.scrollTop());var s=e-t.offset().top,a=Garnish.$win.height();i=t.height()>a?a/2-6+s:t.height()/2-6,"index"!==this.settings.context&&(i=e+(t.height()/2-6)),this.progressBar.$progressBar.css({top:i})},_performBatchRequests:function(t,e){for(var i=this,s=[],a=t.length;t.length;){var n=t.shift();Craft.sendActionRequest("POST",n.action,{data:n.params}).then((function(t){s.push(t.data)})).finally((function(){i.progressBar.incrementProcessedItemCount(1),i.progressBar.updateProgressBar(),0==--a&&(Craft.cp.runQueue(),e(s))}))}}}),Craft.registerElementIndexClass("craft\\elements\\Asset",Craft.AssetIndex)},5077:function(){Craft.AssetSelectInput=Craft.BaseElementSelectInput.extend({requestId:0,hud:null,$uploadBtn:null,uploader:null,progressBar:null,openPreviewTimeout:null,init:function(){this.base.apply(this,arguments),this.settings.canUpload&&this._attachUploader(),this.updateAddElementsBtn(),this.addListener(this.$elementsContainer,"keydown",this._onKeyDown.bind(this)),this.elementSelect.on("focusItem",this._onElementFocus.bind(this))},_onKeyDown:function(t){if(t.keyCode===Garnish.SPACE_KEY&&t.shiftKey)return this.openPreview(),t.stopPropagation(),!1},onAddElements:function(){var t=this;this.$elements.find(".elementthumb").addClass("open-preview").on("click",(function(e){t.clearOpenPreviewTimeout(),t.openPreviewTimeout=setTimeout((function(){t.openPreview(),t.openPreviewTimeout=null}),500)})).on("dblclick",(function(e){t.clearOpenPreviewTimeout()})),this.base()},clearOpenPreviewTimeout:function(){this.openPreviewTimeout&&(clearTimeout(this.openPreviewTimeout),this.openPreviewTimeout=null)},openPreview:function(){if(Craft.PreviewFileModal.openInstance)Craft.PreviewFileModal.openInstance.selfDestruct();else{var t=this.elementSelect.$focusedItem;t.length&&this._loadPreview(t)}},_onElementFocus:function(t){var e=$(t.item);Craft.PreviewFileModal.openInstance&&e.length&&this._loadPreview(e)},_loadPreview:function(t){var e={minGutter:50};t.data("image-width")&&(e.startingWidth=t.data("image-width"),e.startingHeight=t.data("image-height")),new Craft.PreviewFileModal(t.data("id"),this.elementSelect,e)},_attachUploader:function(){var t=this;this.progressBar=new Craft.ProgressBar($('<div class="progress-shade"></div>').appendTo(this.$container));var e={url:Craft.getActionUrl("assets/upload"),dropZone:this.$container,formData:{fieldId:this.settings.fieldId}};this.settings.sourceElementId&&(e.formData.elementId=this.settings.sourceElementId),this.settings.criteria.siteId&&(e.formData.siteId=this.settings.criteria.siteId),this.$addElementBtn&&(this.$uploadBtn=$("<button/>",{type:"button",class:"btn dashed","data-icon":"upload","aria-label":1==this.settings.limit?Craft.t("app","Upload a file"):Craft.t("app","Upload files"),"aria-describedby":this.settings.describedBy,text:1==this.settings.limit?Craft.t("app","Upload a file"):Craft.t("app","Upload files")}).insertAfter(this.$addElementBtn),e.fileInput=$("<input/>",{type:"file",class:"hidden",multiple:1!=this.settings.limit}).insertAfter(this.$uploadBtn),Garnish.$win.trigger("resize")),void 0!==Craft.csrfTokenName&&void 0!==Craft.csrfTokenValue&&(e.formData[Craft.csrfTokenName]=Craft.csrfTokenValue),void 0!==this.settings.criteria.kind&&(e.allowedKinds=this.settings.criteria.kind),e.canAddMoreFiles=this.canAddMoreFiles.bind(this),e.events={},e.events.fileuploadstart=this._onUploadStart.bind(this),e.events.fileuploadprogressall=this._onUploadProgress.bind(this),e.events.fileuploaddone=this._onUploadComplete.bind(this),e.events.fileuploadfail=this._onUploadFailure.bind(this),this.uploader=new Craft.Uploader(this.$container,e),this.$uploadBtn&&this.$uploadBtn.on("click",(function(e){t.$uploadBtn.next("input[type=file]").trigger("click")}))},enableAddElementsBtn:function(){this.$uploadBtn&&this.$uploadBtn.removeClass("hidden"),this.base()},disableAddElementsBtn:function(){this.$uploadBtn&&this.$uploadBtn.addClass("hidden"),this.base()},selectUploadedFile:function(t){if(this.canAddMoreElements()){var e=t.$element;e.addClass("removable"),e.prepend('<input type="hidden" name="'+this.settings.name+'[]" value="'+t.id+'"><a class="delete icon" title="'+Craft.t("app","Remove")+'"></a>'),e.appendTo(this.$elementsContainer);var i=-(e.outerWidth()+10);this.$addElementBtn.css("margin-"+Craft.left,i+"px");var s={};s["margin-"+Craft.left]=0,this.$addElementBtn.velocity(s,"fast"),this.addElements(e),delete this.modal}},_onUploadStart:function(){this.progressBar.$progressBar.css({top:Math.round(this.$container.outerHeight()/2)-6}),this.$container.addClass("uploading"),this.progressBar.resetProgressBar(),this.progressBar.showProgressBar()},_onUploadProgress:function(t,e){var i=parseInt(e.loaded/e.total*100,10);this.progressBar.setProgressPercentage(i)},_onUploadComplete:function(t,e){var i=this;if(e.result.error)alert(e.result.error),this.progressBar.hideProgressBar(),this.$container.removeClass("uploading");else{var s={elementId:e.result.assetId,siteId:this.settings.criteria.siteId,thumbSize:this.settings.viewMode};Craft.sendActionRequest("POST","elements/get-element-html",{data:s}).then((function(t){var e=$(t.data.html);Craft.appendHeadHtml(t.data.headHtml),i.selectUploadedFile(Craft.getElementInfo(e)),i.uploader.isLastUpload()&&(i.progressBar.hideProgressBar(),i.$container.removeClass("uploading"),i.$container.trigger("change"))})).catch((function(t){var e=t.response;alert(e.data.message)})),Craft.cp.runQueue()}},_onUploadFailure:function(t,e){var i,s=e.response(),a=(null==s||null===(i=s.jqXHR)||void 0===i?void 0:i.responseJSON)||{},n=a.message,r=a.filename;n||(n=r?Craft.t("app","Upload failed for “{filename}”.",{filename:r}):Craft.t("app","Upload failed.")),alert(n),this.progressBar.hideProgressBar(),this.$container.removeClass("uploading")},canAddMoreFiles:function(t){return!this.settings.limit||this.$elements.length+t<this.settings.limit}})},4606:function(){Craft.AssetSelectorModal=Craft.BaseElementSelectorModal.extend({$selectTransformBtn:null,_selectedTransform:null,init:function(t,e){e=$.extend({},Craft.AssetSelectorModal.defaults,e),this.base(t,e),e.transforms.length&&this.createSelectTransformButton(e.transforms)},createSelectTransformButton:function(t){if(t&&t.length){var e=$('<div class="btngroup"/>').appendTo(this.$primaryButtons);this.$selectBtn.appendTo(e),this.$selectTransformBtn=$("<button/>",{type:"button",class:"btn menubtn disabled",text:Craft.t("app","Select transform")}).appendTo(e);for(var i=$('<div class="menu" data-align="right"></div>').insertAfter(this.$selectTransformBtn),s=$("<ul></ul>").appendTo(i),a=0;a<t.length;a++)$('<li><a data-transform="'+t[a].handle+'">'+t[a].name+"</a></li>").appendTo(s);var n=new Garnish.MenuBtn(this.$selectTransformBtn,{onOptionSelect:this.onSelectTransform.bind(this)});n.disable(),this.$selectTransformBtn.data("menuButton",n)}},onSelectionChange:function(t){var e=this.elementIndex.getSelectedElements(),i=!1;if(e.length&&this.settings.transforms.length){i=!0;for(var s=0;s<e.length&&$(".element.hasthumb:first",e[s]).length;s++);}var a=null;this.$selectTransformBtn&&(a=this.$selectTransformBtn.data("menuButton")),i?(a&&a.enable(),this.$selectTransformBtn.removeClass("disabled")):this.$selectTransformBtn&&(a&&a.disable(),this.$selectTransformBtn.addClass("disabled")),this.base()},onSelectTransform:function(t){var e=$(t).data("transform");this.selectImagesWithTransform(e)},selectImagesWithTransform:function(t){var e=this;void 0===Craft.AssetSelectorModal.transformUrls[t]&&(Craft.AssetSelectorModal.transformUrls[t]={});for(var i=this.elementIndex.getSelectedElements(),s=[],a=0;a<i.length;a++){var n=$(i[a]),r=Craft.getElementInfo(n).id;void 0===Craft.AssetSelectorModal.transformUrls[t][r]&&s.push(r)}s.length?(this.showFooterSpinner(),this.fetchMissingTransformUrls(s,t,(function(){e.hideFooterSpinner(),e.selectImagesWithTransform(t)}))):(this._selectedTransform=t,this.selectElements(),this._selectedTransform=null)},fetchMissingTransformUrls:function(t,e,i){var s=this,a=t.pop(),n={assetId:a,handle:e};Craft.sendActionRequest("POST","assets/generate-transform",{data:n}).then((function(t){Craft.AssetSelectorModal.transformUrls[e][a]=!1,t.data.url&&(Craft.AssetSelectorModal.transformUrls[e][a]=t.data.url)})).catch((function(n){n.response,Craft.AssetSelectorModal.transformUrls[e][a]=!1,t.length?s.fetchMissingTransformUrls(t,e,i):i()}))},getElementInfo:function(t){var e=this.base(t);if(this._selectedTransform)for(var i=0;i<e.length;i++){var s=e[i].id;void 0!==Craft.AssetSelectorModal.transformUrls[this._selectedTransform][s]&&!1!==Craft.AssetSelectorModal.transformUrls[this._selectedTransform][s]&&(e[i].url=Craft.AssetSelectorModal.transformUrls[this._selectedTransform][s])}return e},onSelect:function(t){this.settings.onSelect(t,this._selectedTransform)}},{defaults:{canSelectImageTransforms:!1,transforms:[]},transformUrls:{}}),Craft.registerElementSelectorModalClass("craft\\elements\\Asset",Craft.AssetSelectorModal)},9222:function(){Craft.AuthManager=Garnish.Base.extend({remainingSessionTime:null,checkRemainingSessionTimer:null,showLoginModalTimer:null,decrementLogoutWarningInterval:null,showingLogoutWarningModal:!1,showingLoginModal:!1,logoutWarningModal:null,loginModal:null,$logoutWarningPara:null,$passwordInput:null,$loginBtn:null,$loginErrorPara:null,submitLoginIfLoggedOut:!1,init:function(){Craft.username&&this.updateRemainingSessionTime(Craft.remainingSessionTime)},setCheckRemainingSessionTimer:function(t){this.checkRemainingSessionTimer&&clearTimeout(this.checkRemainingSessionTimer),this.checkRemainingSessionTimer=setTimeout(this.checkRemainingSessionTime.bind(this),1e3*t)},checkRemainingSessionTime:function(t){var e=this;$.ajax({url:Craft.getActionUrl("users/session-info",t?null:"dontExtendSession=1"),type:"GET",dataType:"json",complete:function(t,i){"success"===i?(void 0!==t.responseJSON.csrfTokenValue&&void 0!==Craft.csrfTokenValue&&(Craft.csrfTokenValue=t.responseJSON.csrfTokenValue),e.updateRemainingSessionTime(t.responseJSON.timeout),e.submitLoginIfLoggedOut=!1):e.updateRemainingSessionTime(-1)}})},updateRemainingSessionTime:function(t){this.remainingSessionTime=parseInt(t),-1!==this.remainingSessionTime&&this.remainingSessionTime<Craft.AuthManager.minSafeSessionTime?(this.remainingSessionTime?(this.showingLogoutWarningModal||this.showLogoutWarningModal(),this.remainingSessionTime<Craft.AuthManager.checkInterval&&(this.showLoginModalTimer&&clearTimeout(this.showLoginModalTimer),this.showLoginModalTimer=setTimeout(this.showLoginModal.bind(this),1e3*this.remainingSessionTime))):this.showingLoginModal?this.submitLoginIfLoggedOut&&this.submitLogin():this.showLoginModal(),this.setCheckRemainingSessionTimer(Craft.AuthManager.checkInterval)):(this.hideLogoutWarningModal(),this.hideLoginModal(),-1!==this.remainingSessionTime&&this.remainingSessionTime<Craft.AuthManager.minSafeSessionTime+Craft.AuthManager.checkInterval?this.setCheckRemainingSessionTimer(this.remainingSessionTime-Craft.AuthManager.minSafeSessionTime+1):this.setCheckRemainingSessionTimer(Craft.AuthManager.checkInterval))},showLogoutWarningModal:function(){var t;if(this.showingLoginModal?(this.hideLoginModal(!0),t=!0):t=!1,this.showingLogoutWarningModal=!0,!this.logoutWarningModal){var e=$('<form id="logoutwarningmodal" class="modal alert fitted"/>'),i=$('<div class="body"/>').appendTo(e),s=$('<div class="buttons right"/>').appendTo(i),a=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Sign out now")}).appendTo(s),n=$("<button/>",{type:"submit",class:"btn submit",text:Craft.t("app","Keep me signed in")}).appendTo(s);this.$logoutWarningPara=$("<p/>").prependTo(i),this.logoutWarningModal=new Garnish.Modal(e,{autoShow:!1,closeOtherModals:!1,hideOnEsc:!1,hideOnShadeClick:!1,shadeClass:"modal-shade dark logoutwarningmodalshade",onFadeIn:function(){Garnish.isMobileBrowser(!0)||setTimeout((function(){n.trigger("focus")}),100)}}),this.addListener(a,"activate","logout"),this.addListener(e,"submit","renewSession")}t?this.logoutWarningModal.quickShow():this.logoutWarningModal.show(),this.updateLogoutWarningMessage(),this.decrementLogoutWarningInterval=setInterval(this.decrementLogoutWarning.bind(this),1e3)},updateLogoutWarningMessage:function(){this.$logoutWarningPara.text(Craft.t("app","Your session will expire in {time}.",{time:Craft.secondsToHumanTimeDuration(this.remainingSessionTime)})),this.logoutWarningModal.updateSizeAndPosition()},decrementLogoutWarning:function(){this.remainingSessionTime>0&&(this.remainingSessionTime--,this.updateLogoutWarningMessage()),0===this.remainingSessionTime&&clearInterval(this.decrementLogoutWarningInterval)},hideLogoutWarningModal:function(t){this.showingLogoutWarningModal=!1,this.logoutWarningModal&&(t?this.logoutWarningModal.quickHide():this.logoutWarningModal.hide(),this.decrementLogoutWarningInterval&&clearInterval(this.decrementLogoutWarningInterval))},showLoginModal:function(){var t,e=this;if(this.showingLogoutWarningModal?(this.hideLogoutWarningModal(!0),t=!0):t=!1,this.showingLoginModal=!0,!this.loginModal){var i=$('<form id="loginmodal" class="modal alert fitted"/>'),s=$('<div class="body"><h2>'+Craft.t("app","Your session has ended.")+"</h2><p>"+Craft.t("app","Enter your password to log back in.")+"</p></div>").appendTo(i),a=$('<div class="inputcontainer">').appendTo(s),n=$('<div class="flex"/>').appendTo(a),r=$('<div class="flex-grow"/>').appendTo(n),o=$("<div/>").appendTo(n),l=$('<div class="passwordwrapper"/>').appendTo(r);this.$passwordInput=$('<input type="password" class="text password fullwidth" autocomplete="current-password" placeholder="'+Craft.t("app","Password")+'"/>').appendTo(l),this.$loginBtn=Craft.ui.createSubmitButton({class:"disabled",label:Craft.t("app","Sign in"),spinner:!0}).attr("aria-disabled","true").appendTo(o),this.$loginErrorPara=$('<p class="error"/>').appendTo(s),this.loginModal=new Garnish.Modal(i,{autoShow:!1,closeOtherModals:!1,hideOnEsc:!1,hideOnShadeClick:!1,shadeClass:"modal-shade dark loginmodalshade",onFadeIn:function(){Garnish.isMobileBrowser(!0)||setTimeout((function(){e.$passwordInput.trigger("focus")}),100)},onFadeOut:function(){e.$passwordInput.val("")}}),new Craft.PasswordInput(this.$passwordInput,{onToggleInput:function(t){e.$passwordInput=t}}),this.addListener(this.$passwordInput,"input","validatePassword"),this.addListener(i,"submit","login")}t?this.loginModal.quickShow():this.loginModal.show()},hideLoginModal:function(t){this.showingLoginModal=!1,this.loginModal&&(t?this.loginModal.quickHide():this.loginModal.hide())},logout:function(){$.get({url:Craft.getActionUrl("users/logout"),dataType:"json",success:function(){Craft.redirectTo("")}})},renewSession:function(t){t&&t.preventDefault(),this.hideLogoutWarningModal(),this.checkRemainingSessionTime(!0)},validatePassword:function(){return this.$passwordInput.val().length>=6?(this.$loginBtn.removeClass("disabled"),this.$loginBtn.removeAttr("aria-disabled"),!0):(this.$loginBtn.addClass("disabled"),this.$loginBtn.attr("aria-disabled","true"),!1)},login:function(t){t&&t.preventDefault(),this.validatePassword()&&(this.$loginBtn.addClass("loading"),this.clearLoginError(),void 0!==Craft.csrfTokenValue?(this.submitLoginIfLoggedOut=!0,this.checkRemainingSessionTime()):this.submitLogin())},submitLogin:function(){var t=this,e={loginName:Craft.username,password:this.$passwordInput.val()};Craft.sendActionRequest("POST","users/login",{data:e}).then((function(e){t.$loginBtn.removeClass("loading"),t.hideLoginModal(),t.checkRemainingSessionTime()})).catch((function(e){var i=e.response;t.$loginBtn.removeClass("loading"),t.showLoginError(i.data.message||null),Garnish.shake(t.loginModal.$container),Garnish.isMobileBrowser(!0)||t.$passwordInput.trigger("focus")}))},showLoginError:function(t){null==t&&(t=Craft.t("app","A server error occurred.")),this.$loginErrorPara.text(t),this.loginModal.updateSizeAndPosition()},clearLoginError:function(){this.showLoginError("")}},{checkInterval:60,minSafeSessionTime:120})},5774:function(){function t(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);e&&(s=s.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,s)}return i}function e(e){for(var s=1;s<arguments.length;s++){var a=null!=arguments[s]?arguments[s]:{};s%2?t(Object(a),!0).forEach((function(t){i(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):t(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(t,e,i){return e in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function s(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(t,e)||function(t,e){if(t){if("string"==typeof t)return a(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?a(t,e):void 0}}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}function n(t){return n="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},n(t)}Craft.BaseElementIndex=Garnish.Base.extend({initialized:!1,elementType:null,idPrefix:null,instanceState:null,sourceStates:null,sourceStatesStorageKey:null,searchTimeout:null,sourceSelect:null,$container:null,$main:null,isIndexBusy:!1,$sidebar:null,showingSidebar:null,sourceKey:null,rootSourceKey:null,sourceViewModes:null,$source:null,$rootSource:null,sourcesByKey:null,$visibleSources:null,$sourceActionsContainer:null,$sourceActionsBtn:null,$toolbar:null,toolbarOffset:null,$searchContainer:null,$search:null,$filterBtn:null,searching:!1,searchText:null,sortByScore:null,trashed:!1,drafts:!1,$clearSearchBtn:null,$statusMenuBtn:null,$statusMenuContainer:null,statusMenu:null,status:null,$siteMenuBtn:null,siteMenu:null,siteId:null,$elements:null,$updateSpinner:null,$viewModeBtnContainer:null,viewModeBtns:null,viewMode:null,view:null,_autoSelectElements:null,$countSpinner:null,$countContainer:null,$actionsContainer:null,page:1,resultSet:null,totalResults:null,$exportBtn:null,actions:null,actionsHeadHtml:null,actionsBodyHtml:null,$selectAllContainer:null,$selectAllCheckbox:null,showingActionTriggers:!1,exporters:null,exportersByType:null,_$triggers:null,_ignoreFailedRequest:!1,_cancelToken:null,viewMenus:null,activeViewMenu:null,filterHuds:null,init:function(t,e,i){var s=this;if(this.elementType=t,this.$container=e,this.setSettings(i,Craft.BaseElementIndex.defaults),this.idPrefix=Craft.randomString(10),this.instanceState=this.getDefaultInstanceState(),this.sourceStates={},this.settings.storageKey&&$.extend(this.instanceState,Craft.getLocalStorage(this.settings.storageKey),{}),this.sourceStatesStorageKey="BaseElementIndex."+this.elementType+"."+this.settings.context,$.extend(this.sourceStates,Craft.getLocalStorage(this.sourceStatesStorageKey,{})),this.$main=this.$container.find(".main"),this.$toolbar=this.$container.find(this.settings.toolbarSelector),this.$statusMenuBtn=this.$toolbar.find(".statusmenubtn:first"),this.$statusMenuContainer=this.$statusMenuBtn.parent(),this.$siteMenuBtn=this.$container.find(".sitemenubtn:first"),this.$searchContainer=this.$toolbar.find(".search:first"),this.$search=this.$searchContainer.children("input:first"),this.$filterBtn=this.$searchContainer.children(".filter-btn:first"),this.$clearSearchBtn=this.$searchContainer.children(".clear-btn:first"),this.$sidebar=this.$container.find(".sidebar:first"),this.$sourceActionsContainer=this.$sidebar.find("#source-actions"),this.$elements=this.$container.find(".elements:first"),this.$updateSpinner=this.$elements.find(".spinner"),this.$updateSpinner.length||(this.$updateSpinner=$("<div/>",{class:"update-spinner spinner spinner-absolute"}).appendTo(this.$elements)),this.$countSpinner=this.$container.find("#count-spinner"),this.$countContainer=this.$container.find("#count-container"),this.$actionsContainer=this.$container.find("#actions-container"),this.$exportBtn=this.$container.find("#export-btn"),this.settings.hideSidebar&&(this.$sidebar.hide(),$(".body, .content",this.$container).removeClass("has-sidebar")),this.initSources()){if(this.$statusMenuBtn.length&&(this.statusMenu=this.$statusMenuBtn.menubtn().data("menubtn").menu,this.statusMenu.on("optionselect",this._handleStatusChange.bind(this))),this.$siteMenuBtn.length){this.siteMenu=this.$siteMenuBtn.menubtn().data("menubtn").menu;var a=this.siteMenu.$options.filter(".sel:first");if(a.length||(a=this.siteMenu.$options.first()),a.length?this._setSite(a.data("site-id")):this.settings.criteria={id:"0"},this.siteMenu.on("optionselect",this._handleSiteChange.bind(this)),this.siteId){var n=this.settings.defaultSiteId||Craft.cp.getSiteId();if(n&&n!=this.siteId){var r=this.siteMenu.$options.filter('[data-site-id="'+n+'"]:first');r.length&&r.trigger("click")}}}else this.settings.criteria&&this.settings.criteria.siteId&&"*"!==this.settings.criteria.siteId?this._setSite(this.settings.criteria.siteId):this._setSite(Craft.siteId);this.settings.criteria&&this.settings.criteria.siteId&&delete this.settings.criteria.siteId,this.addListener(this.$search,"input",(function(){!s.searching&&s.$search.val()?s.startSearching():s.searching&&!s.$search.val()&&s.stopSearching(),s.searchTimeout&&clearTimeout(s.searchTimeout),s.searchTimeout=setTimeout(s.updateElementsIfSearchTextChanged.bind(s),500)})),this.addListener(this.$search,"keypress",(function(t){t.keyCode===Garnish.RETURN_KEY&&(t.preventDefault(),s.searchTimeout&&clearTimeout(s.searchTimeout),s.updateElementsIfSearchTextChanged())})),this.addListener(this.$clearSearchBtn,"click",(function(){s.clearSearch(!0),Garnish.isMobileBrowser(!0)||s.$search.trigger("focus")})),Garnish.isMobileBrowser(!0)||this.$search.trigger("focus"),this.viewMenus={},this.filterHuds={},this.addListener(this.$filterBtn,"click","showFilterHud");var o=Craft.getQueryParams();if(o.status){var l;switch(o.status){case"trashed":l="[data-trashed]";break;case"drafts":l="[data-drafts]";break;default:l='[data-status="'.concat(o.status,'"]')}var h=this.statusMenu.$options.filter(l);h.length?this.statusMenu.selectOption(h[0]):this.setQueryParam("status",null)}if(this.addListener(this.$exportBtn,"click","_showExportHud"),this.initialized=!0,this.afterInit(),this.selectDefaultSource(),o.sort){var d=o.sort.lastIndexOf("-");if(-1!==d){var c=o.sort.substring(0,d),u=o.sort.substring(d+1);this.setSelectedSortAttribute(c,u)}}this.setPage(Craft.pageNum),this.updateElements(!0)}},afterInit:function(){this.onAfterInit()},_createCancelToken:function(){return this._cancelToken=axios.CancelToken.source(),this._cancelToken.token},_cancelRequests:function(){var t=this;this._cancelToken&&(this._ignoreFailedRequest=!0,this._cancelToken.cancel(),Garnish.requestAnimationFrame((function(){t._ignoreFailedRequest=!1})))},getSourceContainer:function(){return this.$sidebar.find("nav > ul")},get $sources(){if(this.sourceSelect)return this.sourceSelect.$items},getSite:function(){var t=this;if(this.siteId)return Craft.sites.find((function(e){return e.id==t.siteId}))},initSources:function(){var t=this._getSourcesInList(this.getSourceContainer(),!0);if(0===t.length)return!1;this.sourceSelect||(this.sourceSelect=new Garnish.Select(this.$sidebar.find("nav"),{multi:!1,allowEmpty:!1,vertical:!0,onSelectionChange:this._handleSourceSelectionChange.bind(this)})),this.sourcesByKey={};for(var e=0;e<t.length;e++)this.initSource($(t[e]));return!0},selectDefaultSource:function(){var t,e;return"index"===this.settings.context&&(t=Craft.getQueryParam("source")),t||(t=this.getDefaultSourceKey()),t&&(e=this.getSourceByKey(t),-1===this.$visibleSources.index(e)&&(e=null)),t&&e||(e=this.$visibleSources.first()),this.selectSource(e)},refreshSources:function(){var t=this;this.sourceSelect.removeAllItems(),this.setIndexBusy(),Craft.sendActionRequest("POST",this.settings.refreshSourcesAction,{data:{context:this.settings.context,elementType:this.elementType}}).then((function(e){t.setIndexAvailable(),t.getSourceContainer().replaceWith(e.data.html),t.initSources(),t.selectDefaultSource()})).catch((function(){t.setIndexAvailable(),t._ignoreFailedRequest||Craft.cp.displayError(Craft.t("app","A server error occurred."))}))},initSource:function(t){this.sourceSelect.addItems(t),this.initSourceToggle(t),this.sourcesByKey[t.data("key")]=t,t.data("hasNestedSources")&&-1!==this.instanceState.expandedSources.indexOf(t.data("key"))&&this._expandSource(t)},initSourceToggle:function(t){this.deinitSourceToggle(t);var e=this._getSourceToggle(t);e.length?(this.addListener(t,"dblclick","_handleSourceDblClick"),this.addListener(e,"click","_handleSourceToggleClick"),t.data("hasNestedSources",!0)):t.data("hasNestedSources",!1)},deinitSource:function(t){this.sourceSelect.removeItems(t),this.deinitSourceToggle(t),delete this.sourcesByKey[t.data("key")]},deinitSourceToggle:function(t){t.data("hasNestedSources")&&(this.removeListener(t,"dblclick"),this.removeListener(this._getSourceToggle(t),"click")),t.removeData("hasNestedSources")},getDefaultInstanceState:function(){return{selectedSource:null,expandedSources:[]}},getDefaultSourceKey:function(){if(this.settings.defaultSource){for(var t=this.settings.defaultSource.split("/"),e="",i=0;i<t.length;i++){e+=t[i];var s=this.getSourceByKey(e);if(!s)return this.instanceState.selectedSource;this._expandSource(s),e+="/"}return this._setSite(this.siteId),this.settings.defaultSource}return this.instanceState.selectedSource},getDefaultExpandedSources:function(){return this.instanceState.expandedSources},startSearching:function(){this.$clearSearchBtn.removeClass("hidden"),this.searching=!0,this.sortByScore=!0,this.activeViewMenu&&this.activeViewMenu.updateSortField()},clearSearch:function(t){this.searching&&(this.$search.val(""),this.searchTimeout&&clearTimeout(this.searchTimeout),this.stopSearching(),t?this.updateElementsIfSearchTextChanged():this.searchText=null)},stopSearching:function(){this.$clearSearchBtn.addClass("hidden"),this.searching=!1,this.sortByScore=!1,this.activeViewMenu&&this.activeViewMenu.updateSortField()},setInstanceState:function(t,e){"object"===n(t)?$.extend(this.instanceState,t):this.instanceState[t]=e,this.storeInstanceState()},storeInstanceState:function(){this.settings.storageKey&&Craft.setLocalStorage(this.settings.storageKey,this.instanceState)},getSourceState:function(t,e,i){return t=t.replace(/\/.*/,""),void 0===this.sourceStates[t]&&(this.sourceStates[t]={}),void 0===e?this.sourceStates[t]:void 0!==this.sourceStates[t][e]?this.sourceStates[t][e]:void 0!==i?i:null},getSelectedSourceState:function(t,e){return this.getSourceState(this.instanceState.selectedSource,t,e)},setSelecetedSourceState:function(t,e){var i=this.getSelectedSourceState();if("object"===n(t))for(var s in t)t.hasOwnProperty(s)&&(null!==t[s]?i[s]=t[s]:delete i[s]);else null!==e?i[t]=e:delete i[t];var a=this.instanceState.selectedSource.replace(/\/.*/,"");for(var r in this.sourceStates[a]=i,this.sourceStates)this.sourceStates.hasOwnProperty(r)&&r.includes("/")&&delete this.sourceStates[r];Craft.setLocalStorage(this.sourceStatesStorageKey,this.sourceStates)},storeSortAttributeAndDirection:function(){},setPage:function(t){if("index"===this.settings.context){t=Math.max(t,1),this.page=t;var e=Craft.getPageUrl(this.page);history.replaceState({},"",e)}},_resetCount:function(){this.resultSet=null,this.totalResults=null},updateSourceMenu:function(){var t=this;if(this.$sourceActionsContainer.length){this.$sourceActionsBtn&&(this.$sourceActionsBtn.data("trigger").destroy(),this.$sourceActionsContainer.empty(),$("#source-actions-menu").remove(),this.$sourceActionsBtn=null);var e=this.getSourceActions();if(e.length){var i=[e.filter((function(t){return!t.destructive&&!t.administrative})),e.filter((function(t){return t.destructive&&!t.administrative})),e.filter((function(t){return t.administrative}))].filter((function(t){return t.length}));this.$sourceActionsBtn=$("<button/>",{type:"button",class:"btn settings icon menubtn",title:Craft.t("app","Source settings"),"aria-label":Craft.t("app","Source settings"),"aria-controls":"source-actions-menu"}).appendTo(this.$sourceActionsContainer);var s=$("<div/>",{id:"source-actions-menu",class:"menu menu--disclosure"}).appendTo(this.$sourceActionsContainer);i.forEach((function(e,i){0!==i&&$("<hr/>").appendTo(s),t._buildActionList(e).appendTo(s)})),this.$sourceActionsBtn.disclosureMenu()}}},_buildActionList:function(t){var e=this,i=$("<ul/>");return t.forEach((function(t){var s=$("<button/>",{type:"button",class:"menu-option",text:t.label}).on("click",(function(){e.$sourceActionsBtn.data("trigger").hide(),t.onSelect&&t.onSelect()}));t.destructive&&s.addClass("error"),$("<li/>").append(s).appendTo(i)})),i},getSourceActions:function(){var t=this,e=[];return Craft.userIsAdmin&&Craft.allowAdminChanges&&e.push({label:Craft.t("app","Customize sources"),administrative:!0,onSelect:function(){t.createCustomizeSourcesModal()}}),e},updateViewMenu:function(){this.activeViewMenu&&this.activeViewMenu===this.viewMenus[this.rootSourceKey]||(this.activeViewMenu&&this.activeViewMenu.hideTrigger(),this.viewMenus[this.rootSourceKey]||(this.viewMenus[this.rootSourceKey]=new r(this,this.$rootSource)),this.activeViewMenu=this.viewMenus[this.rootSourceKey],this.activeViewMenu.showTrigger())},getViewParams:function(){var t={siteId:this.siteId,search:this.searchText,offset:this.settings.batchSize*(this.page-1),limit:this.settings.batchSize};this.settings.canHaveDrafts&&(this.drafts||"index"===this.settings.context&&!this.status)&&(t.drafts=this.drafts||null,t.savedDraftsOnly=!0,this.drafts||(t.draftOf=!1)),this.trashed&&(t.trashed=!0),Garnish.hasAttr(this.$source,"data-override-status")||(t.status=this.status),$.extend(t,this.settings.criteria);var e={context:this.settings.context,elementType:this.elementType,source:this.instanceState.selectedSource,condition:this.settings.condition,criteria:t,disabledElementIds:this.settings.disabledElementIds,viewState:$.extend({},this.getSelectedSourceState()),paginated:this._isViewPaginated()?1:0},i=s(this.getSortAttributeAndDirection(),2),a=i[0],n=i[1];return e.viewState.order=a,e.viewState.sort=n,"structure"===a&&(void 0===this.instanceState.collapsedElementIds&&(this.instanceState.collapsedElementIds=[]),e.collapsedElementIds=this.instanceState.collapsedElementIds),this.filterHuds[this.siteId]&&this.filterHuds[this.siteId][this.sourceKey]&&this.filterHuds[this.siteId][this.sourceKey].serialized&&(e.filters=this.filterHuds[this.siteId][this.sourceKey].serialized),this.trigger("registerViewParams",{params:e}),e},updateElements:function(t,e){var i=this;if(this.initialized){this._cancelRequests(),this.setIndexBusy(),this.view&&(this.view.destroy(),delete this.view),!0!==t&&(this.setPage(1),this._resetCount());var s=this.getViewParams();Craft.sendActionRequest("POST",this.settings.updateElementsAction,{data:s,cancelToken:this._createCancelToken()}).then((function(t){if(i.setIndexAvailable(),("index"===i.settings.context?Garnish.$scrollContainer:i.$main).scrollTop(0),i._updateView(s,t.data),e){var a=i.view.getElementContainer();Garnish.firstFocusableElement(a).trigger("focus")}})).catch((function(t){i.setIndexAvailable(),i._ignoreFailedRequest||Craft.cp.displayError(Craft.t("app","A server error occurred."))}))}},updateElementsIfSearchTextChanged:function(){this.searchText!==(this.searchText=this.searching?this.$search.val():null)&&this.updateElements()},showActionTriggers:function(){this.showingActionTriggers||(this._$triggers?this._$triggers.appendTo(this.$actionsContainer):this._createTriggers(),this.showingActionTriggers=!0)},submitAction:function(t,e){var i=this,s=this.view.getSelectedElementIds();if(0!==s.length&&("string"==typeof t&&(t=this._findAction(t)),!t.confirm||confirm(t.confirm))){this._cancelRequests();var a=this.getViewParams();e=e?Craft.expandPostArray(e):{};var n=$.extend(a,t.settings||{},e,{elementAction:t.type,elementIds:s});this.setIndexBusy(),this._autoSelectElements=s,t.download?(Craft.csrfTokenName&&(n[Craft.csrfTokenName]=Craft.csrfTokenValue),Craft.downloadFromUrl("POST",Craft.getActionUrl(this.settings.submitActionsAction),n).then((function(t){i.setIndexAvailable()})).catch((function(t){i.setIndexAvailable()}))):Craft.sendActionRequest("POST",this.settings.submitActionsAction,{data:n,cancelToken:this._createCancelToken()}).then((function(e){i._resetCount(),i._updateView(a,e.data),void 0!==e.data.badgeCounts&&i._updateBadgeCounts(e.data.badgeCounts),e.data.message&&Craft.cp.displaySuccess(e.data.message),i.afterAction(t,n)})).catch((function(t){var e=t.response;Craft.cp.displayError(e.data.message)})).finally((function(){i.setIndexAvailable()}))}},_findAction:function(t){for(var e=0;e<this.actions.length;e++)if(this.actions[e].type===t)return this.actions[e];throw"Invalid element action: ".concat(t)},afterAction:function(t,e){Craft.cp.runQueue(),this.onAfterAction(t,e)},hideActionTriggers:function(){this.showingActionTriggers&&(this._$triggers.detach(),this.showingActionTriggers=!1)},updateActionTriggers:function(){if(this.actions){var t=this.view.getSelectedElements().length;0!==t?(t===this.view.getEnabledElements().length?(this.$selectAllCheckbox.removeClass("indeterminate"),this.$selectAllCheckbox.addClass("checked"),this.$selectAllCheckbox.attr("aria-checked","true")):(this.$selectAllCheckbox.addClass("indeterminate"),this.$selectAllCheckbox.removeClass("checked"),this.$selectAllCheckbox.attr("aria-checked","mixed")),this.showActionTriggers()):(this.$selectAllCheckbox.removeClass("indeterminate checked"),this.$selectAllCheckbox.attr("aria-checked","false"),this.hideActionTriggers())}},getSelectedElements:function(){return this.view?this.view.getSelectedElements():$()},getSelectedElementIds:function(){return this.view?this.view.getSelectedElementIds():[]},setStatus:function(t){var e=this.statusMenu.$options.filter('a[data-status="'+t+'"]:first');e.length&&this.statusMenu.selectOption(e[0])},getSelectedSortAttribute:function(t){if(t=t||this.$source){var e=this.getSourceState(t.data("key"),"order");if(this.getSortOption(e,t))return e}return this.getDefaultSort()[0]},getSelectedSortDirection:function(t){if(t=t||this.$source){var e=this.getSourceState(t.data("key"),"sort");if(["asc","desc"].includes(e))return e}return this.getDefaultSort()[1]},setSortAttribute:function(t){this.setSelectedSortAttribute(t)},setSelectedSortAttribute:function(t,e){if("score"===t)return this.sortByScore=!0,void(this.activeViewMenu&&this.activeViewMenu.updateSortField());this.sortByScore=!1;var i=this.getSortOption(t);if(i){e="structure"===t?"asc":e||i.defaultDir;var a=[],n=[t],r=this.getSelectedSourceState("order");r&&r!==t&&(a.push([r,this.getSelectedSourceState("sort")]),n.push(r));for(var o=this.getSelectedSourceState("orderHistory",[]),l=0;l<o.length;l++){var h=s(o[l],1)[0];if(!h||n.includes(h))break;a.push(o[l]),n.push(h)}this.setSelecetedSourceState({order:t,sort:e,orderHistory:a}),this.activeViewMenu&&this.activeViewMenu.updateSortField(),Craft.setQueryParam("sort","".concat(t,"-").concat(e))}else console.warn("Invalid sort option: ".concat(t))},setSortDirection:function(t){this.setSelectedSortDirection(t)},setSelectedSortDirection:function(t){this.setSelectedSortAttribute(this.getSelectedSortAttribute(),t)},canSortByStructure:function(){return!(this.trashed||this.drafts||this.searching||this.sortByScore)},getSortAttributeAndDirection:function(){if(this.searching&&this.sortByScore)return["score","desc"];var t=this.getSelectedSortAttribute(),e=this.getSelectedSortDirection();if("structure"===t)if(this.canSortByStructure())e="asc";else{var i=this.getSortOptions().find((function(t){return"structure"!==t.attr}));t=i.attr,e=i.defaultDir}return[t,e]},getSortLabel:function(t){var e=this.getSortOption(t);return e?e.label:null},getSelectedViewMode:function(){return this.getSelectedSourceState("mode")||"table"},getSourceLevel:function(t){return t.parentsUntil("nav","ul.nested").length+1},getParentSource:function(t){var e=t.parent().parent().siblings("a");return e.length?e:null},getRootSource:function(t){for(var e;e=this.getParentSource(t);)t=e;return t},getSourceByKey:function(t){return this.sourcesByKey[t]||null},selectSource:function(t){var e=$(t);if(!this.sourcesByKey||!Object.keys(this.sourcesByKey).length)return!1;if(this.$source&&this.$source[0]&&this.$source[0]===e[0]&&e.data("key")===this.sourceKey)return!1;if(this.hideActionTriggers(),this.$source=e,this.$rootSource=this.getRootSource(e),this.sourceKey=e.data("key"),this.rootSourceKey=this.$rootSource.data("key"),this.setInstanceState("selectedSource",this.sourceKey),this.sourceSelect.selectItem(e),Craft.cp.updateContentHeading(),this.searching&&(this.searchText=null,this.$search.val(""),this.stopSearching()),this.$statusMenuBtn.length&&(Garnish.hasAttr(this.$source,"data-override-status")?this.$statusMenuContainer.addClass("hidden"):this.$statusMenuContainer.removeClass("hidden"),this.trashed)){var i=this.statusMenu.$options.first();this.setStatus(i.data("status"))}if(this.$viewModeBtnContainer&&this.$viewModeBtnContainer.remove(),this.viewModeBtns={},this.viewMode=null,this.sourceViewModes=this.getViewModesForSource(),this.sourceViewModes.length>1){this.$viewModeBtnContainer=$('<section class="btngroup btngroup--exclusive"/>').attr("aria-label",Craft.t("app","View")),this.activeViewMenu?this.$viewModeBtnContainer.insertBefore(this.activeViewMenu.$trigger):this.$viewModeBtnContainer.appendTo(this.$toolbar);for(var s=0;s<this.sourceViewModes.length;s++){var a=this.sourceViewModes[s],n=$("<button/>",{type:"button",class:"btn"+(void 0!==a.className?" ".concat(a.className):""),"data-view":a.mode,"data-icon":a.icon,"aria-label":a.title,"aria-pressed":"false",title:a.title}).appendTo(this.$viewModeBtnContainer);this.viewModeBtns[a.mode]=n,this.addListener(n,"click",{mode:a.mode},(function(t){this.selectViewMode(t.data.mode),this.updateElements()}))}}var r=this.getSelectedViewMode();if(r&&this.doesSourceHaveViewMode(r)||(r=this.viewMode&&this.doesSourceHaveViewMode(this.viewMode)?this.viewMode:this.sourceViewModes[0].mode),this.selectViewMode(r),this.updateSourceMenu(),this.updateViewMenu(),this.updateFilterBtn(),this.onSelectSource(),"index"===this.settings.context){var o=Craft.getQueryParams();o.source=this.sourceKey,Craft.setUrl(Craft.getUrl(Craft.path,o))}return!0},selectSourceByKey:function(t){var e=this.getSourceByKey(t);return!!e&&this.selectSource(e)},getSortOptions:function(t){var e=((t=t||this.$rootSource)?t.data("sort-opts"):null)||[];return e.find((function(t){return"structure"!==t.attr}))||e.push({label:Craft.t("app","Title"),attr:"title",defaultDir:"asc"}),e},getSortOption:function(t,e){return this.getSortOptions(e).find((function(e){return e.attr===t}))||null},getDefaultSort:function(t){if(t=t||this.$rootSource){var e=t.data("default-sort");if(e){"string"==typeof e&&(e=[e]);var i=this.getSortOption(e[0],t);if(i)return e[1]||(e[1]=i.defaultDir),e}}var s=this.getSortOptions(t);return[s[0].attr,s[0].defaultDir]},getTableColumnOptions:function(t){return((t=t||this.$rootSource)?t.data("table-col-opts"):null)||[]},getTableColumnOption:function(t,e){return this.getTableColumnOptions(e).find((function(e){return e.attr===t}))||null},getDefaultTableColumns:function(t){return((t=t||this.$rootSource)?t.data("default-table-cols"):null)||[]},getSelectedTableColumns:function(t){var e=this;if(t=t||this.$rootSource){var i=this.getSourceState(t.data("key"),"tableColumns");if(i)return i.filter((function(i){return!!e.getTableColumnOption(i,t)}))}return this.getDefaultTableColumns(t)},setSelectedTableColumns:function(t){this.setSelecetedSourceState({tableColumns:t}),this.activeViewMenu&&this.activeViewMenu.updateTableColumnField()},getViewModesForSource:function(){var t=[{mode:"table",title:Craft.t("app","Display in a table"),icon:"list"}];return this.$source&&Garnish.hasAttr(this.$source,"data-has-thumbs")&&t.push({mode:"thumbs",title:Craft.t("app","Display as thumbnails"),icon:"grid"}),t},doesSourceHaveViewMode:function(t){for(var e=0;e<this.sourceViewModes.length;e++)if(this.sourceViewModes[e].mode===t)return!0;return!1},selectViewMode:function(t,e){e||this.doesSourceHaveViewMode(t)||(t=this.sourceViewModes[0].mode),t!==this.viewMode&&(this.viewMode&&void 0!==this.viewModeBtns[this.viewMode]&&this.viewModeBtns[this.viewMode].removeClass("active").attr("aria-pressed","false"),this.viewMode=t,this.setSelecetedSourceState("mode",this.viewMode),void 0!==this.viewModeBtns[this.viewMode]&&this.viewModeBtns[this.viewMode].addClass("active").attr("aria-pressed","true"))},createView:function(t,e){return new(this.getViewClass(t))(this,this.$elements,e)},getViewClass:function(t){switch(t){case"table":return Craft.TableElementIndexView;case"thumbs":return Craft.ThumbsElementIndexView;default:throw'View mode "'.concat(t,'" not supported.')}},rememberDisabledElementId:function(t){-1===$.inArray(t,this.settings.disabledElementIds)&&this.settings.disabledElementIds.push(t)},forgetDisabledElementId:function(t){var e=$.inArray(t,this.settings.disabledElementIds);-1!==e&&this.settings.disabledElementIds.splice(e,1)},enableElements:function(t){t.removeClass("disabled").parents(".disabled").removeClass("disabled");for(var e=0;e<t.length;e++){var i=$(t[e]).data("id");this.forgetDisabledElementId(i)}this.onEnableElements(t)},disableElements:function(t){t.removeClass("sel").addClass("disabled");for(var e=0;e<t.length;e++){var i=$(t[e]).data("id");this.rememberDisabledElementId(i)}this.onDisableElements(t)},getElementById:function(t){return this.view.getElementById(t)},enableElementsById:function(t){t=$.makeArray(t);for(var e=0;e<t.length;e++){var i=t[e],s=this.getElementById(i);s&&s.length?this.enableElements(s):this.forgetDisabledElementId(i)}},disableElementsById:function(t){t=$.makeArray(t);for(var e=0;e<t.length;e++){var i=t[e],s=this.getElementById(i);s&&s.length?this.disableElements(s):this.rememberDisabledElementId(i)}},selectElementAfterUpdate:function(t){null===this._autoSelectElements&&(this._autoSelectElements=[]),this._autoSelectElements.push(t)},addButton:function(t){this.getButtonContainer().append(t)},isShowingSidebar:function(){return null===this.showingSidebar&&(this.showingSidebar=this.$sidebar.length&&!this.$sidebar.hasClass("hidden")),this.showingSidebar},getButtonContainer:function(){if(this.settings.buttonContainer)return $(this.settings.buttonContainer);var t=$("#action-buttons");return t.length||(t=$('<div id="action-buttons"/>').appendTo($("#header"))),t},setIndexBusy:function(){this.$elements.addClass("busy"),this.$updateSpinner.appendTo(this.$elements),this.isIndexBusy=!0},setIndexAvailable:function(){this.$elements.removeClass("busy"),this.$updateSpinner.remove(),this.isIndexBusy=!1},createCustomizeSourcesModal:function(){var t=new Craft.CustomizeSourcesModal(this,{onHide:function(){t.destroy()}});return t},disable:function(){this.sourceSelect&&this.sourceSelect.disable(),this.view&&this.view.disable(),this.base()},enable:function(){this.sourceSelect&&this.sourceSelect.enable(),this.view&&this.view.enable(),this.base()},onAfterInit:function(){this.settings.onAfterInit(),this.trigger("afterInit")},onSelectSource:function(){this.settings.onSelectSource(this.sourceKey),this.trigger("selectSource",{sourceKey:this.sourceKey})},onSelectSite:function(){this.settings.onSelectSite(this.siteId),this.trigger("selectSite",{siteId:this.siteId})},onUpdateElements:function(){this.settings.onUpdateElements(),this.trigger("updateElements")},onSelectionChange:function(){this.settings.onSelectionChange(),this.trigger("selectionChange")},onEnableElements:function(t){this.settings.onEnableElements(t),this.trigger("enableElements",{elements:t})},onDisableElements:function(t){this.settings.onDisableElements(t),this.trigger("disableElements",{elements:t})},onAfterAction:function(t,e){this.settings.onAfterAction(t,e),this.trigger("afterAction",{action:t,params:e})},_handleSourceSelectionChange:function(){this.sourceSelect.totalSelected?this.selectSource(this.sourceSelect.$selectedItems)&&this.updateElements():this.sourceSelect.selectItem(this.$visibleSources.first())},_handleActionTriggerSubmit:function(t){t.preventDefault();var e=$(t.currentTarget);e.hasClass("disabled")||e.data("custom-handler")||this.submitAction(e.data("action"),Garnish.getPostData(e))},_handleMenuActionTriggerSubmit:function(t){var e=$(t.option);e.hasClass("disabled")||e.data("custom-handler")||this.submitAction(e.data("action"))},_handleStatusChange:function(t){this.statusMenu.$options.removeClass("sel");var e=$(t.selectedOption).addClass("sel");this.$statusMenuBtn.html(e.html()),this.trashed=!1,this.drafts=!1,this.status=null;var i=null;Garnish.hasAttr(e,"data-trashed")?(this.trashed=!0,i="trashed"):Garnish.hasAttr(e,"data-drafts")?(this.drafts=!0,i="drafts"):this.status=i=e.data("status")||null,this.activeViewMenu&&this.activeViewMenu.updateSortField(),Craft.setQueryParam("status",i),this.updateElements()},_handleSiteChange:function(t){this.siteMenu.$options.removeClass("sel");var e=$(t.selectedOption).addClass("sel");this.$siteMenuBtn.html(e.html()),this._setSite(e.data("site-id")),this.onSelectSite()},_setSite:function(t){var e=null===this.siteId;this.siteId=t,this.updateSourceVisibility(),!this.initialized||e||this.$source&&this.$source.length||!this.$visibleSources.length||this.selectSource(this.$visibleSources[0]);for(var i,s=this.getSourceContainer().children(".heading"),a=0;a<s.length;a++)0!==(i=s.eq(a)).has("> ul > li:not(.hidden)").length?i.removeClass("hidden"):i.addClass("hidden");this.initialized&&("index"===this.settings.context&&Craft.cp.setSiteId(t),this.updateElements(),this.updateFilterBtn())},updateSourceVisibility:function(){this.$visibleSources=$();for(var t=0;t<this.$sources.length;t++){var e=this.$sources.eq(t);Garnish.hasAttr(e,"data-disabled")||void 0!==e.data("sites")&&-1===e.data("sites").toString().split(",").indexOf(this.siteId.toString())?(e.parent().addClass("hidden"),this.$source&&this.$source.get(0)===e.get(0)&&(this.$source=null,this.$rootSource=null,this.sourceKey=null,this.rootSourceKey=null)):(e.parent().removeClass("hidden"),this.$visibleSources=this.$visibleSources.add(e))}},_handleSelectionChange:function(){this.updateActionTriggers(),this.onSelectionChange()},_handleSourceDblClick:function(t){this._toggleSource($(t.currentTarget)),t.stopPropagation()},_handleSourceToggleClick:function(t){this._toggleSource($(t.currentTarget).prev("a")),t.stopPropagation()},_getSourcesInList:function(t,e){var i=t.find("> li:not(.heading) > a");return e&&(i=i.add(t.find("> li.heading > ul > li > a"))),i},_getChildSources:function(t){var e=t.siblings("ul");return this._getSourcesInList(e)},_getSourceToggle:function(t){return t.siblings(".toggle")},_toggleSource:function(t){t.parent("li").hasClass("expanded")?this._collapseSource(t):this._expandSource(t)},_expandSource:function(t){t.next(".toggle").attr({"aria-expanded":"true","aria-label":Craft.t("app","Hide nested sources")}),t.parent("li").addClass("expanded");for(var e=this._getChildSources(t),i=0;i<e.length;i++)this.initSource($(e[i])),this.$visibleSources&&(this.$visibleSources=this.$visibleSources.add(e[i]));var s=t.data("key");-1===this.instanceState.expandedSources.indexOf(s)&&(this.instanceState.expandedSources.push(s),this.storeInstanceState())},_collapseSource:function(t){t.next(".toggle").attr({"aria-expanded":"false","aria-label":Craft.t("app","Show nested sources")}),t.parent("li").removeClass("expanded");for(var e=this._getChildSources(t),i=0;i<e.length;i++)this.deinitSource($(e[i])),this.$visibleSources=this.$visibleSources.not(e[i]);var s=this.instanceState.expandedSources.indexOf(t.data("key"));-1!==s&&(this.instanceState.expandedSources.splice(s,1),this.storeInstanceState())},_isViewPaginated:function(){return"index"===this.settings.context&&"structure"!==this.getSortAttributeAndDirection()[0]},_updateView:function(t,e){var i=this;this.actions&&(this.hideActionTriggers(),this.actions=this.actionsHeadHtml=this.actionsBodyHtml=this._$triggers=null);var s=document.activeElement;this.$countContainer.length&&(this.$countSpinner.removeClass("hidden"),this.$countContainer.html(""),this._countResults().then((function(t){i.$countSpinner.addClass("hidden");var e=Craft.elementTypeNames[i.elementType]?Craft.elementTypeNames[i.elementType][2]:i.settings.elementTypeName.toLowerCase(),s=Craft.elementTypeNames[i.elementType]?Craft.elementTypeNames[i.elementType][3]:i.settings.elementTypePluralName.toLowerCase();if(i._isViewPaginated()){var a=Math.min(i.settings.batchSize*(i.page-1)+1,t),n=Math.min(a+(i.settings.batchSize-1),t),r=Craft.t("app","{first, number}-{last, number} of {total, number} {total, plural, =1{{item}} other{{items}}}",{first:a,last:n,total:t,item:e,items:s}),o=$('<div class="flex pagination"/>').appendTo(i.$countContainer),l=Math.max(Math.ceil(t/i.settings.batchSize),1),h=$("<nav/>",{class:"flex","aria-label":Craft.t("app","{element} pagination",{element:e})}).appendTo(o),d=$("<button/>",{role:"button",class:"page-link prev-page"+(i.page>1?"":" disabled"),disabled:1===i.page,title:Craft.t("app","Previous Page")}).appendTo(h),c=$("<button/>",{role:"button",class:"page-link next-page"+(i.page<l?"":" disabled"),disabled:i.page===l,title:Craft.t("app","Next Page")}).appendTo(h);$("<div/>",{class:"page-info",text:r}).appendTo(o),i.page>1&&i.addListener(d,"click",(function(){this.removeListener(d,"click"),this.removeListener(c,"click"),this.setPage(this.page-1),this.updateElements(!0,!0)})),i.page<l&&i.addListener(c,"click",(function(){this.removeListener(d,"click"),this.removeListener(c,"click"),this.setPage(this.page+1),this.updateElements(!0,!0)}))}else{var u=Craft.t("app","{total, number} {total, plural, =1{{item}} other{{items}}}",{total:t,item:e,items:s});i.$countContainer.text(u)}})).catch((function(){i.$countSpinner.addClass("hidden")}))),this.$elements.html(e.html),Craft.appendHeadHtml(e.headHtml),Craft.appendBodyHtml(e.bodyHtml),this.$selectAllContainer=this.$elements.find(".selectallcontainer:first"),e.actions&&e.actions.length?this.$selectAllContainer.length&&(this.actions=e.actions,this.actionsHeadHtml=e.actionsHeadHtml,this.actionsBodyHtml=e.actionsBodyHtml,this.$selectAllCheckbox=$('<div class="checkbox"/>').prependTo(this.$selectAllContainer).attr({role:"checkbox",tabindex:"0","aria-checked":"false","aria-label":Craft.t("app","Select all")}),this.addListener(this.$selectAllCheckbox,"click",(function(){0===this.view.getSelectedElements().length?this.view.selectAllElements():this.view.deselectAllElements()})),this.addListener(this.$selectAllCheckbox,"keydown",(function(t){t.keyCode===Garnish.SPACE_KEY&&(t.preventDefault(),$(t.currentTarget).trigger("click"))}))):(this.$selectAllContainer.siblings().length||this.$selectAllContainer.parent(".header").remove(),this.$selectAllContainer.remove()),this.exporters=e.exporters,this.exportersByType=Craft.index(this.exporters||[],(function(t){return t.type})),this.exporters&&this.exporters.length?this.$exportBtn.removeClass("hidden"):this.$exportBtn.addClass("hidden");var a=this.actions||this.settings.selectable;if(this.view=this.createView(this.getSelectedViewMode(),{context:this.settings.context,batchSize:"index"!==this.settings.context||"structure"===this.getSortAttributeAndDirection()[0]?this.settings.batchSize:null,params:t,selectable:a,multiSelect:this.actions||this.settings.multiSelect,checkboxMode:!!this.actions,onSelectionChange:this._handleSelectionChange.bind(this)}),s&&s.id&&!document.body.contains(s)&&$("#".concat(s.id)).focus(),this._autoSelectElements){if(a)for(var n=0;n<this._autoSelectElements.length;n++)this.view.selectElementById(this._autoSelectElements[n]);this._autoSelectElements=null}this.onUpdateElements()},_updateBadgeCounts:function(t){for(var e in t)if(t.hasOwnProperty(e)){var i=this.getSourceByKey(e);if(i){var s=i.children(".badge");null!==t[e]?(s.length||(s=$('<span class="badge"/>').appendTo(i)),s.text(t[e])):s&&s.remove()}}},_countResults:function(){var t=this;return new Promise((function(e,i){if(null!==t.totalResults)e(t.totalResults);else{var s=t.getViewParams();delete s.criteria.offset,delete s.criteria.limit,null===t.resultSet&&(t.resultSet=Math.floor(1e8*Math.random())),s.resultSet=t.resultSet,Craft.sendActionRequest("POST",t.settings.countElementsAction,{data:s,cancelToken:t._createCancelToken()}).then((function(s){s.data.resultSet==t.resultSet?(t.totalResults=s.data.count,e(s.data.count)):i()})).catch(i)}}))},_createTriggers:function(){var t,e,i=[],s=[],a=[];for(t=0;t<this.actions.length;t++){var n=this.actions[t];if(n.trigger){var r=$('<form id="'+Craft.formatInputId(n.type)+'-actiontrigger"/>').data("action",n).append(n.trigger);this.addListener(r,"submit","_handleActionTriggerSubmit"),i.push(r)}else n.destructive?a.push(n):s.push(n)}if(s.length||a.length){var o=$("<form/>");e=$("<button/>",{type:"button",class:"btn menubtn","data-icon":"settings",title:Craft.t("app","Actions")}).appendTo(o);var l=$('<ul class="menu"/>').appendTo(o),h=this._createMenuTriggerList(s,!1),d=this._createMenuTriggerList(a,!0);h&&h.appendTo(l),h&&d&&$("<hr/>").appendTo(l),d&&d.appendTo(l),i.push(o)}for(this._$triggers=$(),t=0;t<i.length;t++){var c=$("<div/>").append(i[t]);this._$triggers=this._$triggers.add(c)}this._$triggers.appendTo(this.$actionsContainer),Craft.appendHeadHtml(this.actionsHeadHtml),Craft.appendBodyHtml(this.actionsBodyHtml),Craft.initUiElements(this._$triggers),e&&e.data("menubtn").on("optionSelect",this._handleMenuActionTriggerSubmit.bind(this))},_showExportHud:function(){var t=this;this.$exportBtn.addClass("active"),this.$exportBtn.attr("aria-expanded","true");for(var e=$("<form/>",{class:"export-form"}),i=[],s=0;s<this.exporters.length;s++)i.push({label:this.exporters[s].name,value:this.exporters[s].type});var a=Craft.ui.createSelectField({label:Craft.t("app","Export Type"),options:i,class:"fullwidth"}).appendTo(e),n=Craft.ui.createSelectField({label:Craft.t("app","Format"),options:[{label:"CSV",value:"csv"},{label:"JSON",value:"json"},{label:"XML",value:"xml"}],class:"fullwidth"}).appendTo(e),r=a.find("select");this.addListener(r,"change",(function(){var e=r.val();t.exportersByType[e].formattable?n.removeClass("hidden"):n.addClass("hidden")})),r.trigger("change");var o=this.view.getSelectedElementIds();if(!o.length)var l=Craft.ui.createTextField({label:Craft.t("app","Limit"),placeholder:Craft.t("app","No limit"),type:"number",min:1}).appendTo(e);var h=Craft.ui.createSubmitButton({class:"fullwidth",label:Craft.t("app","Export"),spinner:!0}).appendTo(e);new Garnish.HUD(this.$exportBtn,e).on("hide",(function(){t.$exportBtn.removeClass("active"),t.$exportBtn.attr("aria-expanded","false")}));var d=!1;this.addListener(e,"submit",(function(t){var e=this;if(t.preventDefault(),!d){d=!0,h.addClass("loading");var i=this.getViewParams();if(delete i.criteria.offset,delete i.criteria.limit,delete i.collapsedElementIds,i.type=a.find("select").val(),i.format=n.find("select").val(),o.length)i.criteria.id=o;else{var s=parseInt(l.find("input").val());s&&!isNaN(s)&&(i.criteria.limit=s)}Craft.csrfTokenValue&&(i[Craft.csrfTokenName]=Craft.csrfTokenValue),Craft.downloadFromUrl("POST",Craft.getActionUrl("element-indexes/export"),i).catch((function(){e._ignoreFailedRequest||Craft.cp.displayError(Craft.t("app","A server error occurred."))})).finally((function(){d=!1,h.removeClass("loading")}))}}))},_createMenuTriggerList:function(t,e){if(t&&t.length){for(var i=$("<ul/>"),s=0;s<t.length;s++)$("<li/>").append($("<a/>",{id:Craft.formatInputId(t[s].type)+"-actiontrigger",class:e?"error":null,data:{action:t[s]},text:t[s].name})).appendTo(i);return i}},showFilterHud:function(){this.filterHuds[this.siteId]||(this.filterHuds[this.siteId]={}),this.filterHuds[this.siteId][this.sourceKey]?this.filterHuds[this.siteId][this.sourceKey].show():(this.filterHuds[this.siteId][this.sourceKey]=new o(this,this.sourceKey,this.siteId),this.updateFilterBtn())},updateFilterBtn:function(){this.$filterBtn.removeClass("active"),this.filterHuds[this.siteId]&&this.filterHuds[this.siteId][this.sourceKey]?(this.$filterBtn.attr("aria-controls",this.filterHuds[this.siteId][this.sourceKey].id).attr("aria-expanded",this.filterHuds[this.siteId][this.sourceKey].showing?"true":"false"),(this.filterHuds[this.siteId][this.sourceKey].showing||this.filterHuds[this.siteId][this.sourceKey].hasRules())&&this.$filterBtn.addClass("active")):this.$filterBtn.attr("aria-controls",null)}},{defaults:{context:"index",modal:null,storageKey:null,condition:null,criteria:null,batchSize:100,disabledElementIds:[],selectable:!1,multiSelect:!1,buttonContainer:null,hideSidebar:!1,toolbarSelector:".toolbar:first",refreshSourcesAction:"element-indexes/get-source-tree-html",updateElementsAction:"element-indexes/get-elements",countElementsAction:"element-indexes/count-elements",submitActionsAction:"element-indexes/perform-action",defaultSiteId:null,defaultSource:null,canHaveDrafts:!1,elementTypeName:Craft.t("app","Element"),elementTypePluralName:Craft.t("app","Elements"),onAfterInit:$.noop,onSelectSource:$.noop,onSelectSite:$.noop,onUpdateElements:$.noop,onSelectionChange:$.noop,onEnableElements:$.noop,onDisableElements:$.noop,onAfterAction:$.noop}});var r=Garnish.Base.extend({elementIndex:null,$source:null,sourceKey:null,menu:null,id:null,$trigger:null,$container:null,$sortAttributeSelect:null,$sortDirectionPicker:null,sortDirectionListbox:null,$tableColumnsContainer:null,$revertContainer:null,$revertBtn:null,$closeBtn:null,init:function(t,e){var i=this;this.elementIndex=t,this.$source=e,this.sourceKey=e.data("key"),this.id="view-menu-".concat(Math.floor(1e9*Math.random())),this.$trigger=$("<button/>",{type:"button",class:"btn menubtn hidden",text:Craft.t("app","View"),"aria-label":Craft.t("app","View settings"),"aria-controls":this.id,"data-icon":"sliders"}).appendTo(this.elementIndex.$toolbar),this.$container=$("<div/>",{id:this.id,class:"menu menu--disclosure element-index-view-menu","data-align":"right"}).appendTo(Garnish.$bod),this._buildMenu(),this.addListener(this.$container,"mousedown",(function(t){t.stopPropagation()})),this.menu=new Garnish.DisclosureMenu(this.$trigger),this.menu.on("show",(function(){i.$trigger.addClass("active")})),this.menu.on("hide",(function(){i.$trigger.removeClass("active"),setTimeout((function(){i.tidyTableColumnField()}),Garnish.FX_DURATION)}))},showTrigger:function(){this.$trigger.removeClass("hidden")},hideTrigger:function(){this.$trigger.data("trigger").hide(),this.$trigger.addClass("hidden"),this.menu.hide()},updateSortField:function(){var t=s(this.elementIndex.getSortAttributeAndDirection(),2),e=t[0],i=t[1],a=this.$sortAttributeSelect.children('option[value="score"]');this.elementIndex.searching?a.length||this.$sortAttributeSelect.prepend($("<option/>",{value:"score",text:Craft.t("app","Score")})):a.length&&a.remove(),this.$sortAttributeSelect.val(e),this.sortDirectionListbox.select("asc"===i?0:1),["structure","score"].includes(e)?(this.sortDirectionListbox.disable(),this.$sortDirectionPicker.addClass("disabled")):(this.sortDirectionListbox.enable(),this.$sortDirectionPicker.removeClass("disabled")),this.elementIndex.canSortByStructure()?this.$sortAttributeSelect.children('option[value="structure"]').removeAttr("disabled"):this.$sortAttributeSelect.children('option[value="structure"]').attr("disabled","disabled")},updateTableColumnField:function(){var t,e,i=this,s=this.elementIndex.getSelectedTableColumns();s.forEach((function(s){var a=i.$tableColumnsContainer.find('input[value="'.concat(s,'"]'));a.prop("checked")||a.prop("checked",!0);var n=a.parent();t&&n.index()<e&&n.insertAfter(t),t=n,e=n.index()}));for(var a=this._getTableColumnCheckboxes(),n=0;n<a.length;n++){var r=a.eq(n);r.prop("checked")&&!s.includes(r.val())&&r.prop("checked",!1)}},tidyTableColumnField:function(){var t=this.elementIndex.getTableColumnOptions(this.$source).map((function(t){return t.attr})).reduce((function(t,s,a){return e(e({},t),{},i({},s,a))}),{});this.$tableColumnsContainer.children().sort((function(e,i){var s=$(e).children('input[type="checkbox"]')[0],a=$(i).children('input[type="checkbox"]')[0];return s.checked&&a.checked?0:s.checked||a.checked?s.checked?-1:1:t[s.value]<t[a.value]?-1:1})).appendTo(this.$tableColumnsContainer)},revert:function(){this.elementIndex.setSelecetedSourceState({order:null,sort:null,tableColumns:null}),this.updateSortField(),this.updateTableColumnField(),this.tidyTableColumnField(),this.$revertBtn.remove(),this.$revertBtn=null,this.$closeBtn.focus(),this.elementIndex.updateElements()},_buildMenu:function(){var t=this,e=$('<div class="meta"/>').appendTo(this.$container);this._createSortField().appendTo(e),this._createTableColumnsField().appendTo(e),this.$sortAttributeSelect.focus();var i=$("<div/>",{class:"flex menu-footer"}).appendTo(this.$container);this.$revertContainer=$("<div/>",{class:"flex-grow"}).appendTo(i),(this.elementIndex.getSelectedSourceState("order")||this.elementIndex.getSelectedSourceState("sort")||this.elementIndex.getSelectedSourceState("tableColumns"))&&this._createRevertBtn(),this.$closeBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Close")}).appendTo(i).on("click",(function(){t.menu.hide()}))},_createSortField:function(){var t=this,e=$('<div class="flex"/>'),i=Craft.ui.createSelect({options:this.elementIndex.getSortOptions(this.$source).map((function(t){return{label:t.label,value:t.attr}}))}).addClass("fullwidth").appendTo($('<div class="flex-grow"/>').appendTo(e));this.$sortAttributeSelect=i.children("select").attr({"aria-label":Craft.t("app","Sort attribute")}),this.$sortDirectionPicker=$("<section/>",{class:"btngroup btngroup--exclusive","aria-label":Craft.t("app","Sort direction")}).append($("<button/>",{type:"button",class:"btn",title:Craft.t("app","Sort ascending"),"aria-label":Craft.t("app","Sort ascending"),"aria-pressed":"false","data-icon":"asc","data-dir":"asc"})).append($("<button/>",{type:"button",class:"btn",title:Craft.t("app","Sort descending"),"aria-label":Craft.t("app","Sort descending"),"aria-pressed":"false","data-icon":"desc","data-dir":"desc"})).appendTo(e),this.sortDirectionListbox=new Craft.Listbox(this.$sortDirectionPicker,{onChange:function(e){e.data("dir")!==t.elementIndex.getSelectedSortDirection()&&(t.elementIndex.setSelectedSortAttribute(t.$sortAttributeSelect.val(),e.data("dir")),t.elementIndex.updateElements(),t._createRevertBtn())}}),this.$sortAttributeSelect.on("change",(function(){t.elementIndex.setSelectedSortAttribute(t.$sortAttributeSelect.val(),null,!1),t.elementIndex.updateElements(),t._createRevertBtn()})),this.updateSortField();var s=Craft.ui.createField(e,{label:Craft.t("app","Sort by"),fieldset:!0});return s.addClass("sort-field"),s},_getTableColumnCheckboxes:function(){return this.$tableColumnsContainer.find('input[type="checkbox"]')},_createTableColumnsField:function(){var t=this,e=this.elementIndex.getTableColumnOptions(this.$source);if(!e.length)return $();this.$tableColumnsContainer=$("<div/>"),e.forEach((function(e){$('<div class="element-index-view-menu-table-column"/>').append('<div class="icon move"/>').append(Craft.ui.createCheckbox({label:Craft.escapeHtml(e.label),value:e.attr})).appendTo(t.$tableColumnsContainer)})),this.updateTableColumnField(),this.tidyTableColumnField(),new Garnish.DragSort(this.$tableColumnsContainer.children(),{handle:".move",axis:"y",onSortChange:function(){t._onTableColumnChange()}}),this._getTableColumnCheckboxes().on("change",(function(e){t._onTableColumnChange()}));var i=Craft.ui.createField(this.$tableColumnsContainer,{label:Craft.t("app","Table Columns"),fieldset:!0});return i.addClass("table-columns-field"),i},_onTableColumnChange:function(){for(var t=[],e=this._getTableColumnCheckboxes().filter(":checked"),i=0;i<e.length;i++)t.push(e.eq(i).val());Craft.compare(t,this.elementIndex.getSelectedTableColumns(this.$source))||(this.elementIndex.setSelectedTableColumns(t,!1),this.elementIndex.updateElements(),this._createRevertBtn())},_createRevertBtn:function(){var t=this;this.$revertBtn||(this.$revertBtn=$("<button/>",{type:"button",class:"light",text:Craft.t("app","Use defaults")}).appendTo(this.$revertContainer).on("click",(function(){t.revert()})))},destroy:function(){this.menu.destroy(),delete this.menu,this.base()}}),o=Garnish.HUD.extend({elementIndex:null,sourceKey:null,siteId:null,id:null,loading:!0,serialized:null,$clearBtn:null,cleared:!1,init:function(t,e,i){var s=this;this.elementIndex=t,this.sourceKey=e,this.siteId=i,this.id="filter-".concat(Math.floor(1e9*Math.random()));var a=$("<div/>").append($("<div/>",{class:"spinner"})).append($("<div/>",{text:Craft.t("app","Loading"),class:"visually-hidden","aria-role":"alert"}));this.base(this.elementIndex.$filterBtn,a,{hudClass:"hud element-filter-hud loading"}),this.$hud.attr({id:this.id,"aria-live":"polite","aria-busy":"false"}),this.$tip.remove(),this.$tip=null,this.$body.on("submit",(function(t){t.preventDefault(),s.hide()})),Craft.sendActionRequest("POST","element-indexes/filter-hud",{data:{elementType:this.elementIndex.elementType,source:this.sourceKey,condition:this.elementIndex.settings.condition,id:"".concat(this.id,"-filters")}}).then((function(t){s.loading=!1,s.$hud.removeClass("loading"),a.remove(),s.$main.append(t.data.hudHtml),Craft.appendHeadHtml(t.data.headHtml),Craft.appendBodyHtml(t.data.bodyHtml);var e=$("<div/>",{class:"flex flex-nowrap"}).appendTo(s.$main);$("<div/>",{class:"flex-grow"}).appendTo(e),s.$clearBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(e),$("<button/>",{type:"submit",class:"btn secondary",text:Craft.t("app","Apply")}).appendTo(e),s.$clearBtn.on("click",(function(){s.clear()})),s.$hud.find(".condition-container").on("htmx:beforeRequest",(function(){s.setBusy()})),s.$hud.find(".condition-container").on("htmx:load",(function(){s.setReady()})),s.setFocus()})).catch((function(){Craft.cp.displayError(Craft.t("app","A server error occurred."))})),this.$hud.css("position","fixed"),this.addListener(Garnish.$win,"scroll,resize",(function(){s.updateSizeAndPosition(!0)}))},addListener:function(t,e,i,s){t===this.$main&&"resize"===e||this.base(t,e,i,s)},setBusy:function(){this.$hud.attr("aria-busy","true"),$("<div/>",{class:"visually-hidden",text:Craft.t("app","Loading")}).insertAfter(this.$main.find(".htmx-indicator"))},setReady:function(){this.$hud.attr("aria-busy","false")},setFocus:function(){Garnish.setFocusWithin(this.$main)},clear:function(){this.cleared=!0,this.hide()},updateSizeAndPositionInternal:function(){var t=this.elementIndex.$searchContainer[0].getBoundingClientRect();this.$hud.css({width:this.elementIndex.$searchContainer.outerWidth()-2,top:t.top+this.elementIndex.$searchContainer.outerHeight(),left:t.left+1})},onShow:function(){this.base(),this.$clearBtn&&this.$clearBtn.text(Craft.t("app","Clear")),this.elementIndex.updateFilterBtn(),this.setFocus()},onHide:function(){this.base(),this.serialized!==(this.serialized=this.serialize())&&this.elementIndex.updateElements(),this.cleared?this.destroy():(this.$hud.detach(),this.$shade.detach()),this.elementIndex.updateFilterBtn(),this.elementIndex.$filterBtn.focus()},hasRules:function(){return 0!==this.$main.has(".condition-rule").length},serialize:function(){return!this.cleared&&this.hasRules()?this.$body.serialize():null},destroy:function(){this.base(),delete this.elementIndex.filterHuds[this.siteId][this.sourceKey]}})},8495:function(){Craft.BaseElementIndexView=Garnish.Base.extend({$container:null,$loadingMoreSpinner:null,$elementContainer:null,$scroller:null,elementIndex:null,thumbLoader:null,elementSelect:null,loadingMore:!1,_totalVisible:null,_morePending:null,_handleEnableElements:null,_handleDisableElements:null,init:function(t,e,i){var s=this;this.elementIndex=t,this.$container=$(e),this.setSettings(i,Craft.BaseElementIndexView.defaults),this.$loadingMoreSpinner=$('<div class="centeralign hidden"><div class="spinner loadingmore"></div></div>').insertAfter(this.$container),this.$elementContainer=this.getElementContainer();var a=this.$elementContainer.children();this.setTotalVisible(a.length),this.setMorePending(this.settings.batchSize&&a.length==this.settings.batchSize),this.thumbLoader=new Craft.ElementThumbLoader,this.thumbLoader.load(a),this.settings.selectable&&(this.elementSelect=new Garnish.Select(this.$elementContainer,a.filter(":not(.disabled)"),{multi:this.settings.multiSelect,vertical:this.isVerticalList(),handle:"index"===this.settings.context?".checkbox, .element:first":null,filter:":not(a):not(.toggle)",checkboxMode:this.settings.checkboxMode,onSelectionChange:this.onSelectionChange.bind(this)}),this._handleEnableElements=function(t){s.elementSelect.addItems(t.elements)},this._handleDisableElements=function(t){s.elementSelect.removeItems(t.elements)},this.elementIndex.on("enableElements",this._handleEnableElements),this.elementIndex.on("disableElements",this._handleDisableElements)),"index"===this.settings.context&&(this._handleElementEditing=function(t){var e=$(t.target);if("A"!==e.prop("nodeName")){var i;if(e.hasClass("element"))i=e;else if(!(i=e.closest(".element")).length)return;Garnish.hasAttr(i,"data-editable")&&Craft.createElementEditor(i.data("type"),i)}},this.elementIndex.trashed||(this.addListener(this.$elementContainer,"dblclick",this._handleElementEditing),$.isTouchCapable()&&this.addListener(this.$elementContainer,"taphold",this._handleElementEditing))),this.afterInit(),this.settings.batchSize&&("index"===this.settings.context?this.$scroller=Garnish.$scrollContainer:this.$scroller=this.elementIndex.$main,this.$scroller.scrollTop(0),this.addListener(this.$scroller,"scroll","maybeLoadMore"),this.maybeLoadMore())},getElementContainer:function(){throw"Classes that extend Craft.BaseElementIndexView must supply a getElementContainer() method."},afterInit:function(){},getAllElements:function(){return this.$elementContainer.children()},getEnabledElements:function(){return this.$elementContainer.children(":not(.disabled)")},getElementById:function(t){var e=this.$elementContainer.children('[data-id="'+t+'"]:first');return e.length?e:null},getSelectedElements:function(){if(!this.elementSelect)throw"This view is not selectable.";return this.elementSelect.$selectedItems},getSelectedElementIds:function(){var t;try{t=this.getSelectedElements()}catch(t){}var e=[];if(t)for(var i=0;i<t.length;i++)e.push(t.eq(i).data("id"));return e},selectElement:function(t){if(!this.elementSelect)throw"This view is not selectable.";return this.elementSelect.selectItem(t,!0),!0},selectElementById:function(t){if(!this.elementSelect)throw"This view is not selectable.";var e=this.getElementById(t);return!!e&&(this.elementSelect.selectItem(e,!0),!0)},selectAllElements:function(){this.elementSelect.selectAll()},deselectAllElements:function(){this.elementSelect.deselectAll()},isVerticalList:function(){return!1},getTotalVisible:function(){return this._totalVisible},setTotalVisible:function(t){this._totalVisible=t},getMorePending:function(){return this._morePending},setMorePending:function(t){this._morePending=t},maybeLoadMore:function(){this.canLoadMore()&&this.loadMore()},canLoadMore:function(){return!(!this.getMorePending()||!this.settings.batchSize)&&(this.$scroller[0]===Garnish.$win[0]?Garnish.$win.innerHeight()+Garnish.$win.scrollTop()>=this.$container.offset().top+this.$container.height():this.$scroller.prop("scrollHeight")-this.$scroller.scrollTop()<=this.$scroller.outerHeight()+15)},loadMore:function(){var t=this;this.getMorePending()&&!this.loadingMore&&this.settings.batchSize&&(this.loadingMore=!0,this.$loadingMoreSpinner.removeClass("hidden"),this.removeListener(this.$scroller,"scroll"),Craft.sendActionRequest("POST",this.settings.loadMoreElementsAction,{data:this.getLoadMoreParams()}).then((function(e){t.loadingMore=!1,t.$loadingMoreSpinner.addClass("hidden");var i=$(e.data.html);t.appendElements(i),Craft.appendHeadHtml(e.data.headHtml),Craft.appendBodyHtml(e.data.bodyHtml),t.elementSelect&&(t.elementSelect.addItems(i.filter(":not(.disabled)")),t.elementIndex.updateActionTriggers()),t.setTotalVisible(t.getTotalVisible()+i.length),t.setMorePending(i.length==t.settings.batchSize),t.addListener(t.$scroller,"scroll","maybeLoadMore"),t.maybeLoadMore()})).catch((function(e){t.loadingMore=!1,t.$loadingMoreSpinner.addClass("hidden")})))},getLoadMoreParams:function(){var t=$.extend(!0,{},this.settings.params);return t.criteria.offset=this.getTotalVisible(),t},appendElements:function(t){t.appendTo(this.$elementContainer),this.thumbLoader.load(t),this.onAppendElements(t)},onAppendElements:function(t){this.settings.onAppendElements(t),this.trigger("appendElements",{newElements:t})},onSelectionChange:function(){this.settings.onSelectionChange(),this.trigger("selectionChange")},disable:function(){this.elementSelect&&this.elementSelect.disable()},enable:function(){this.elementSelect&&this.elementSelect.enable()},destroy:function(){this.$loadingMoreSpinner.remove(),this.thumbLoader.destroy(),delete this.thumbLoader,this.elementSelect&&(this.elementIndex.off("enableElements",this._handleEnableElements),this.elementIndex.off("disableElements",this._handleDisableElements),this.elementSelect.destroy(),delete this.elementSelect),this.base()}},{defaults:{context:"index",batchSize:null,params:null,selectable:!1,multiSelect:!1,checkboxMode:!1,loadMoreElementsAction:"element-indexes/get-more-elements",onAppendElements:$.noop,onSelectionChange:$.noop}})},5970:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.BaseElementSelectInput=Garnish.Base.extend({thumbLoader:null,elementSelect:null,elementSort:null,modal:null,elementEditor:null,fieldLabel:null,$container:null,$form:null,$elementsContainer:null,$elements:null,$addElementBtn:null,$spinner:null,_initialized:!1,init:function(t){var e=this;if(!$.isPlainObject(t)){for(var i={},s=["id","name","elementType","sources","criteria","sourceElementId","limit","modalStorageKey","fieldId"],a=0;a<s.length&&void 0!==arguments[a];a++)i[s[a]]=arguments[a];t=i}this.setSettings(t,Craft.BaseElementSelectInput.defaults),this.settings.modalStorageKey&&(this.modalStorageKey="BaseElementSelectInput."+this.settings.modalStorageKey),(1==this.settings.limit||this.settings.maintainHierarchy)&&(this.settings.sortable=!1),this.$container=this.getContainer(),this.$form=this.$container.closest("form"),this.fieldLabel=this.getFieldLabel(),this.$container.data("elementSelect",this),this.$elementsContainer=this.getElementsContainer(),this.$addElementBtn=this.getAddElementsBtn(),this.$spinner=this.getSpinner(),this.thumbLoader=new Craft.ElementThumbLoader,this.initElementSelect(),this.initElementSort(),this.resetElements(),this.$addElementBtn&&this.addListener(this.$addElementBtn,"activate","showModal"),Garnish.requestAnimationFrame((function(){e._initialized=!0}))},get totalSelected(){return this.$elements.length},getContainer:function(){return $("#"+this.settings.id)},getFieldLabel:function(){if(this.$container)return this.$container.closest("fieldset").find("legend").first().data("label")},getElementsContainer:function(){return this.$container.children(".elements")},getElements:function(){return this.$elementsContainer.find(".element")},getAddElementsBtn:function(){return this.$container.find(".btn.add:first")},getSpinner:function(){return this.$container.find(".spinner")},initElementSelect:function(){this.settings.selectable&&(this.elementSelect=new Garnish.Select({multi:this.settings.sortable,filter:":not(.delete)"}))},initElementSort:function(){var t=this;this.settings.sortable&&(this.elementSort=new Garnish.DragSort({container:this.$elementsContainer,filter:this.settings.selectable?function(){return t.elementSort.$targetItem.hasClass("sel")?t.elementSelect.getSelectedItems():t.elementSort.$targetItem}:null,ignoreHandleSelector:".delete",axis:this.getElementSortAxis(),collapseDraggees:!0,magnetStrength:4,helperLagBase:1.5,onSortChange:this.settings.selectable?function(){t.elementSelect.resetItemOrder()}:null}))},getElementSortAxis:function(){return"list"===this.settings.viewMode?"y":null},canAddMoreElements:function(){return!this.settings.limit||this.$elements.length<this.settings.limit},updateAddElementsBtn:function(){this.canAddMoreElements()?this.enableAddElementsBtn():this.disableAddElementsBtn()},enableAddElementsBtn:function(){this.$addElementBtn&&this.$addElementBtn.removeClass("hidden"),this.updateButtonContainer()},disableAddElementsBtn:function(){this.$addElementBtn&&this.$addElementBtn.addClass("hidden"),this.updateButtonContainer()},showSpinner:function(){this.$spinner&&this.$spinner.removeClass("hidden"),this.updateButtonContainer()},hideSpinner:function(){this.$spinner&&this.$spinner.addClass("hidden"),this.updateButtonContainer()},updateButtonContainer:function(){var t=this.$addElementBtn&&this.$addElementBtn.parent(".flex");t&&t.length&&(t.children(":not(.hidden)").length?t.removeClass("hidden"):t.addClass("hidden"))},focusNextLogicalElement:function(){if(this.canAddMoreElements()){var t=this.$addElementBtn;t&&t.get(0).focus()}else this.focusLastRemoveBtn()},focusLastRemoveBtn:function(){var t=this.$container.find(".delete");t.length&&t.last()[0].focus()},resetElements:function(){null!==this.$elements?this.removeElements(this.$elements):this.$elements=$(),this.addElements(this.getElements())},addElements:function(t){var e=this;this.thumbLoader.load(t),this.settings.selectable&&this.elementSelect.addItems(t),this.settings.sortable&&this.elementSort.addItems(t),this.settings.editable&&(this._handleShowElementEditor=function(t){var i=$(t.currentTarget);!Garnish.hasAttr(i,"data-editable")||i.hasClass("disabled")||i.hasClass("loading")||(e.elementEditor=e.createElementEditor(i))},this.addListener(t,"dblclick",this._handleShowElementEditor),$.isTouchCapable()&&this.addListener(t,"taphold",this._handleShowElementEditor)),t.find(".delete").on("click dblclick",(function(t){e.removeElement($(t.currentTarget).closest(".element")),t.stopPropagation()})),t.on("keydown",(function(t){if([Garnish.BACKSPACE_KEY,Garnish.DELETE_KEY].includes(t.keyCode)){t.stopPropagation(),t.preventDefault();for(var i=e.elementSelect.getSelectedItems(),s=0;s<i.length;s++)e.removeElement(i.eq(s))}})),this.$elements=this.$elements.add(t),this.updateAddElementsBtn(),this.onAddElements()},createElementEditor:function(t,e){return e=Object.assign({elementSelectInput:this,prevalidate:this.settings.prevalidate},e),Craft.createElementEditor(this.settings.elementType,t,e)},replaceElement:function(t,e){var i=this;return new Promise((function(s,a){var n=i.$elements.filter('[data-id="'.concat(t,'"]'));if(n.length){i.showSpinner();var r={elementId:e,siteId:i.settings.criteria.siteId,thumbSize:i.settings.viewMode};Craft.sendActionRequest("POST","elements/get-element-html",{data:r}).then((function(t){i.removeElement(n);var e=Craft.getElementInfo(t.data.html);i.selectElements([e]),s()})).catch((function(t){var e=t.response;e&&e.data&&e.data.message?alert(e.data.message):Craft.cp.displayError(),a(e.data.message)})).finally((function(){i.hideSpinner()}))}else a("No element selected with an ID of ".concat(t,"."))}))},removeElements:function(t){if(this.settings.selectable&&this.elementSelect.removeItems(t),this.modal){for(var e=[],i=0;i<t.length;i++){var s=t.eq(i).data("id");s&&e.push(s)}e.length&&this.modal.elementIndex.enableElementsById(e)}var a;if(t.children("input").prop("disabled",!0),this.settings.selectable){var n=this.$elements.index(t.last());a=this.$elements.eq(n+1).find(".delete")}a.length?a.focus():this.focusNextLogicalElement(),this.$elements=this.$elements.not(t),this.updateAddElementsBtn(),this.onRemoveElements()},removeElement:function(t){if(this.settings.maintainHierarchy){var e=t.add(t.parent().siblings("ul").find(".element"));$("[name]",e).removeAttr("name"),this.removeElements(e);for(var i=0;i<e.length;i++)this._animateStructureElementAway(e,i)}else $("[name]",t).removeAttr("name"),this.removeElements(t),this.animateElementAway(t,(function(){t.remove()}))},animateElementAway:function(t,e){t.css("z-index",0);var i={opacity:-1};i["margin-"+Craft.left]=-(t.outerWidth()+parseInt(t.css("margin-"+Craft.right))),"list"!==this.settings.viewMode&&0!==this.$elements.length||(i["margin-bottom"]=-(t.outerHeight()+parseInt(t.css("margin-bottom")))),t.velocity(i,Craft.BaseElementSelectInput.REMOVE_FX_DURATION,(function(){e&&e()}))},showModal:function(){this.canAddMoreElements()&&(this.modal?this.modal.show():this.modal=this.createModal())},createModal:function(){return Craft.createElementSelectorModal(this.settings.elementType,this.getModalSettings())},getModalSettings:function(){return $.extend({closeOtherModals:!1,storageKey:this.modalStorageKey,sources:this.settings.sources,condition:this.settings.condition,criteria:this.settings.criteria,multiSelect:1!=this.settings.limit,hideOnSelect:!this.settings.maintainHierarchy,showSiteMenu:this.settings.showSiteMenu,disabledElementIds:this.getDisabledElementIds(),onSelect:this.onModalSelect.bind(this),onHide:this.onModalHide.bind(this),triggerElement:this.$addElementBtn,modalTitle:Craft.t("app","Select {element}",{element:this.fieldLabel})},this.settings.modalSettings)},getSelectedElementIds:function(){for(var t=[],e=0;e<this.$elements.length;e++)t.push(this.$elements.eq(e).data("id"));return t},getDisabledElementIds:function(){var e,i=this.getSelectedElementIds();return!this.settings.allowSelfRelations&&this.settings.sourceElementId&&i.push(this.settings.sourceElementId),this.settings.disabledElementIds&&i.push.apply(i,function(e){if(Array.isArray(e))return t(e)}(e=this.settings.disabledElementIds)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(e)||function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),i},onModalSelect:function(t){if(this.settings.maintainHierarchy)this.selectStructuredElements(t);else{if(this.settings.limit){var e=this.settings.limit-this.$elements.length;t.length>e&&(t=t.slice(0,e))}this.selectElements(t),this.updateDisabledElementsInModal()}},onModalHide:function(){var t=this;this.canAddMoreElements()||setTimeout((function(){t.focusNextLogicalElement()}),200)},selectElements:function(t){for(var e=0;e<t.length;e++){var i=t[e],s=this.createNewElement(i);this.appendElement(s),this.addElements(s),this.animateElementIntoPlace(i.$element,s),i.$element=s}this.onSelectElements(t)},selectStructuredElements:function(t){var e=this;this.modal.disable(),this.modal.disableCancelBtn(),this.modal.disableSelectBtn(),this.modal.showFooterSpinner();for(var i=this.getSelectedElementIds(),s=0;s<t.length;s++)i.push(t[s].id);var a={elementIds:i,siteId:t[0].siteId,containerId:this.settings.id,name:this.settings.name,branchLimit:this.settings.branchLimit,selectionLabel:this.settings.selectionLabel,elementType:this.settings.elementType},n=function(){e.modal.enable(),e.modal.enableCancelBtn(),e.modal.enableSelectBtn(),e.modal.hideFooterSpinner()};Craft.sendActionRequest("POST","relational-fields/structured-input-html",{data:a}).then((function(i){n();var s=$(i.data.html).children(".elements");e.$elementsContainer.replaceWith(s),e.$elementsContainer=s,e.resetElements();for(var a=[],r=0;r<t.length;r++){var o=t[r],l=e.getElementById(o.id);l&&(e.animateElementIntoPlace(o.$element,l),a.push(o))}e.updateDisabledElementsInModal(),e.modal.hide(),e.onSelectElements(a)})).catch((function(t){t.response,n()}))},createNewElement:function(t){var e=t.$element.clone(),i=Craft.t("app","Remove {label}",{label:Craft.escapeHtml(t.label)});return Craft.setElementSize(e,"large"===this.settings.viewMode?"large":"small"),e.addClass("removable").prepend($("<input/>",{type:"hidden",name:this.settings.name+(this.settings.single?"":"[]"),value:t.id})).prepend($("<button/>",{type:"button",class:"delete icon",title:Craft.t("app","Remove"),"aria-label":i})),e},appendElement:function(t){t.appendTo(this.$elementsContainer)},animateElementIntoPlace:function(t,e){var i=t.offset(),s=e.offset(),a=e.clone().appendTo(Garnish.$bod);e.css("visibility","hidden"),a.css({position:"absolute",zIndex:1e4,top:i.top,left:i.left});var n={top:s.top,left:s.left};a.velocity(n,Craft.BaseElementSelectInput.ADD_FX_DURATION,(function(){a.remove(),e.css("visibility","visible")}))},updateDisabledElementsInModal:function(){this.modal.elementIndex&&this.modal.elementIndex.disableElementsById(this.getDisabledElementIds())},getElementById:function(t){for(var e=0;e<this.$elements.length;e++){var i=this.$elements.eq(e);if(i.data("id")==t)return i}},onSelectElements:function(t){this.trigger("selectElements",{elements:t}),this.settings.onSelectElements(t),this.$container.trigger("change")},onAddElements:function(){this.trigger("addElements"),this.settings.onAddElements(),this.$container.trigger("change")},onRemoveElements:function(){this.trigger("removeElements"),this.settings.onRemoveElements(),this.$container.trigger("change")},_animateStructureElementAway:function(t,e){var i,s=this;e===t.length-1&&(i=function(){var e=t.first().parent().parent(),i=e.parent();i[0]===s.$elementsContainer[0]||e.siblings().length?e.remove():i.remove()});var a=function(){s.animateElementAway(t.eq(e),i)};0===e?a():setTimeout(a,100*e)}},{ADD_FX_DURATION:200,REMOVE_FX_DURATION:200,defaults:{id:null,name:null,fieldId:null,elementType:null,sources:null,condition:null,criteria:{},allowSelfRelations:!1,sourceElementId:null,disabledElementIds:null,viewMode:"list",single:!1,maintainHierarchy:!1,branchLimit:null,limit:null,showSiteMenu:!1,modalStorageKey:null,modalSettings:{},onAddElements:$.noop,onSelectElements:$.noop,onRemoveElements:$.noop,sortable:!0,selectable:!0,editable:!0,prevalidate:!1,editorSettings:{}}})},4993:function(){Craft.BaseElementSelectorModal=Garnish.Modal.extend({elementType:null,elementIndex:null,supportSidebarToggleView:!1,$body:null,$content:null,$footer:null,$selectBtn:null,$sidebar:null,$sources:null,$sourceToggles:null,$sidebarToggleBtn:null,$sidebarCloseBtn:null,$mainHeading:null,$main:null,$search:null,$elements:null,$tbody:null,$primaryButtons:null,$secondaryButtons:null,$cancelBtn:null,init:function(t,e){this.elementType=t,this.setSettings(e,Craft.BaseElementSelectorModal.defaults);var i="elementSelectorModalHeading-"+Date.now(),s=$('<div class="modal elementselectormodal" aria-labelledby="'+i+'"></div>').appendTo(Garnish.$bod),a=($('<h1 id="'+i+'" class="visually-hidden">'+this.settings.modalTitle+"</h1>").appendTo(s),$('<div class="body"><div class="spinner big"></div></div>').appendTo(s));this.$footer=$('<div class="footer"/>').appendTo(s),this.settings.fullscreen&&(s.addClass("fullscreen"),this.settings.minGutter=0),this.base(s,this.settings),this.$secondaryButtons=$('<div class="buttons left secondary-buttons"/>').appendTo(this.$footer),this.$primaryButtons=$('<div class="buttons right"/>').appendTo(this.$footer),this.$cancelBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(this.$primaryButtons),this.$selectBtn=Craft.ui.createSubmitButton({class:"disabled",label:Craft.t("app","Select"),spinner:!0}).attr("aria-disabled","true").appendTo(this.$primaryButtons),this.$body=a,this.addListener(this.$cancelBtn,"activate","cancel"),this.addListener(this.$selectBtn,"activate","selectElements")},updateModalBottomPadding:function(){var t=this.$footer.outerHeight();t!==parseInt(this.$container.css("padding-bottom"))&&this.$container.css("padding-bottom",t)},updateSidebarView:function(){this.supportSidebarToggleView&&(this.sidebarShouldBeHidden()?this.$sidebarToggleBtn||this.buildSidebarToggleView():this.$sidebarToggleBtn&&this.resetView())},sidebarShouldBeHidden:function(){return this.$container.outerWidth()<550},resetView:function(){this.$mainHeader&&this.$mainHeader.remove(),this.$sidebarHeader&&this.$sidebarHeader.remove(),this.$sidebarToggleBtn=null,this.$body.addClass("has-sidebar"),this.$content.addClass("has-sidebar"),this.$sidebar.removeClass("hidden")},buildSidebarToggleView:function(){var t=this;!this.$sidebarToggleBtn&&this.sidebarShouldBeHidden()&&(this.$sidebarHeader=$('<div class="sidebar-header"/>').prependTo(this.$sidebar),this.$sidebarCloseBtn=Craft.ui.createButton({class:"nav-close close-btn"}).attr("aria-label",Craft.t("app","Close")).removeClass("btn").appendTo(this.$sidebarHeader),this.$mainHeader=$('<div class="main-header"/>').prependTo(this.$main),this.$mainHeading=$('<h2 class="main-heading">'.concat(this.getActiveSourceName(),"</h2>")).appendTo(this.$mainHeader),this.$sidebarToggleBtn=Craft.ui.createButton({toggle:!0,controls:"modal-sidebar",class:"nav-toggle"}).removeClass("btn").attr("aria-label",Craft.t("app","Show sidebar")).appendTo(this.$mainHeader),this.$sidebar.attr("id","modal-sidebar"),this.closeSidebar(),this.addListener(this.$sidebarToggleBtn,"click",(function(){t.toggleSidebar()})),this.addListener(this.$sidebarCloseBtn,"click",(function(){t.toggleSidebar()})))},sidebarIsOpen:function(){return"true"===this.$sidebarToggleBtn.attr("aria-expanded")},toggleSidebar:function(){this.sidebarIsOpen()?this.closeSidebar():this.openSidebar()},openSidebar:function(){var t=this;this.$body.addClass("has-sidebar"),this.$content.addClass("has-sidebar"),this.$sidebar.removeClass("hidden"),this.$sidebarToggleBtn.attr("aria-expanded","true"),this.$sidebar.find(":focusable").first().focus(),Garnish.uiLayerManager.addLayer(this.$sidebar),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.closeSidebar();var e=Garnish.getFocusedElement();$.contains(t.$sidebar.get(0),e.get(0))&&t.$sidebarToggleBtn.focus()}))},closeSidebar:function(){this.$sidebarToggleBtn&&(this.sidebarIsOpen()&&(Garnish.uiLayerManager.removeLayer(),this.$sidebar.addClass("hidden"),this.$sidebarToggleBtn.attr("aria-expanded","false")),this.$body.removeClass("has-sidebar"),this.$content.removeClass("has-sidebar"))},getActiveSourceName:function(){return this.$sidebar.find(".sel").text()},onFadeIn:function(){this.elementIndex?Garnish.isMobileBrowser(!0)||this.elementIndex.$search.trigger("focus"):this._createElementIndex(),this.base()},onSelectionChange:function(){this.updateSelectBtnState()},onSelectSource:function(){this.updateHeading(),this.updateModalBottomPadding()},updateHeading:function(){this.$mainHeading&&this.$mainHeading.text(this.getActiveSourceName())},updateSelectBtnState:function(){this.$selectBtn&&(this.elementIndex.getSelectedElements().length?this.enableSelectBtn():this.disableSelectBtn())},enableSelectBtn:function(){this.$selectBtn.removeClass("disabled").attr("aria-disabled","false")},disableSelectBtn:function(){this.$selectBtn.addClass("disabled").attr("aria-disabled","true")},enableCancelBtn:function(){this.$cancelBtn.removeClass("disabled")},disableCancelBtn:function(){this.$cancelBtn.addClass("disabled")},showFooterSpinner:function(){this.$selectBtn.addClass("loading")},hideFooterSpinner:function(){this.$selectBtn.removeClass("loading")},cancel:function(){this.$cancelBtn.hasClass("disabled")||this.hide()},selectElements:function(){if(this.elementIndex&&this.elementIndex.getSelectedElements().length){this.elementIndex.view.elementSelect.clearMouseUpTimeout();var t=this.elementIndex.getSelectedElements(),e=this.getElementInfo(t);this.onSelect(e),this.settings.disableElementsOnSelect&&this.elementIndex.disableElements(this.elementIndex.getSelectedElements()),this.settings.hideOnSelect&&this.hide()}},getElementInfo:function(t){for(var e=[],i=0;i<t.length;i++){var s=$(t[i]),a=Craft.getElementInfo(s);e.push(a)}return e},onShow:function(){this.updateSelectBtnState(),this.addListener(Garnish.$win,"resize",this.updateSidebarView),this.addListener(Garnish.$win,"resize",this.updateModalBottomPadding),this.updateModalBottomPadding(),this.updateSidebarView(),this.base()},onHide:function(){this.closeSidebar(),this.base()},onSelect:function(t){this.settings.onSelect(t)},disable:function(){this.elementIndex&&this.elementIndex.disable(),this.base()},enable:function(){this.elementIndex&&this.elementIndex.enable(),this.base()},_createElementIndex:function(){var t=this,e={context:"modal",elementType:this.elementType,sources:this.settings.sources};null!==this.settings.showSiteMenu&&"auto"!==this.settings.showSiteMenu&&(e.showSiteMenu=this.settings.showSiteMenu?"1":"0"),Craft.sendActionRequest("POST",this.settings.bodyAction,{data:e}).then((function(e){t.$body.html(e.data.html),t.$body.has(".sidebar:not(.hidden)").length&&(t.$body.addClass("has-sidebar"),t.supportSidebarToggleView=!0),t.elementIndex=Craft.createElementIndex(t.elementType,t.$body,Object.assign({context:"modal",modal:t,storageKey:t.settings.storageKey,condition:t.settings.condition,criteria:t.settings.criteria,disabledElementIds:t.settings.disabledElementIds,selectable:!0,multiSelect:t.settings.multiSelect,buttonContainer:t.$secondaryButtons,onSelectionChange:t.onSelectionChange.bind(t),onSelectSource:t.onSelectSource.bind(t),hideSidebar:t.settings.hideSidebar,defaultSiteId:t.settings.defaultSiteId,defaultSource:t.settings.defaultSource},t.settings.indexSettings)),t.$main=t.elementIndex.$main,t.$sidebar=t.elementIndex.$sidebar,t.$content=t.$body.find(".content"),t.updateSidebarView(),t.updateModalBottomPadding(),t.addListener(t.elementIndex.$elements,"doubletap",(function(t,e){e.firstTap.target===e.secondTap.target&&this.selectElements()}))}))}},{defaults:{fullscreen:!1,resizable:!0,storageKey:null,sources:null,condition:null,criteria:null,multiSelect:!1,showSiteMenu:null,disabledElementIds:[],disableElementsOnSelect:!1,hideOnSelect:!0,modalTitle:Craft.t("app","Select element"),onCancel:$.noop,onSelect:$.noop,hideSidebar:!1,defaultSiteId:null,defaultSource:null,bodyAction:"element-selector-modals/body",indexSettings:{}}})},8843:function(){Craft.BaseInputGenerator=Garnish.Base.extend({$source:null,$target:null,$form:null,settings:null,listening:null,timeout:null,init:function(t,e,i){this.$source=$(t),this.$target=$(e),this.$form=this.$source.closest("form"),this.setSettings(i),this.startListening()},setNewSource:function(t){var e=this.listening;this.stopListening(),this.$source=$(t),e&&this.startListening()},startListening:function(){this.listening||(this.listening=!0,this.addListener(this.$source,"input","onSourceTextChange"),this.addListener(this.$target,"input","onTargetTextChange"),this.addListener(this.$form,"submit","onFormSubmit"))},stopListening:function(){this.listening&&(this.listening=!1,this.timeout&&clearTimeout(this.timeout),this.removeAllListeners(this.$source),this.removeAllListeners(this.$target),this.removeAllListeners(this.$form))},onSourceTextChange:function(){this.timeout&&clearTimeout(this.timeout),this.timeout=setTimeout(this.updateTarget.bind(this),250)},onTargetTextChange:function(){this.$target.get(0)===document.activeElement&&this.stopListening()},onFormSubmit:function(){this.timeout&&clearTimeout(this.timeout),this.updateTarget()},updateTarget:function(){if(this.$target.is(":visible")){var t=this.$source.val();if(void 0!==t){var e=this.generateTargetValue(t);this.$target.val(e);for(var i=0;i<this.$target.length;i++)this.$target[i].dispatchEvent(new InputEvent("input",{inputType:"insertText"})),this.$target[i].dispatchEvent(new Event("input"));this.$target.is(":focus")&&Craft.selectFullValue(this.$target)}}},generateTargetValue:function(t){return t}})},3778:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.CategoryIndex=Craft.BaseElementIndex.extend({editableGroups:null,$newCategoryBtnGroup:null,$newCategoryBtn:null,init:function(t,e,i){this.editableGroups=[],this.on("selectSource",this.updateButton.bind(this)),this.on("selectSite",this.updateButton.bind(this)),this.base(t,e,i)},afterInit:function(){var t=this;this.editableGroups=Craft.editableCategoryGroups.filter((function(e){return!!t.getSourceByKey("group:".concat(e.uid))})),this.base()},getDefaultSourceKey:function(){if("index"===this.settings.context&&"undefined"!=typeof defaultGroupHandle)for(var t=0;t<this.$sources.length;t++){var e=$(this.$sources[t]);if(e.data("handle")===defaultGroupHandle)return e.data("key")}return this.base()},updateButton:function(){var e=this;if(this.$source){var i=this.$source.data("handle");if(this.editableGroups.length&&function(){e.$newCategoryBtnGroup&&e.$newCategoryBtnGroup.remove();var s,a=e.editableGroups.find((function(t){return t.handle===i}));e.$newCategoryBtnGroup=$('<div class="btngroup submit" data-wrapper/>');var n="new-category-menu-"+Craft.randomString(10);if(a){var r="index"===e.settings.context?Craft.t("app","New category"):Craft.t("app","New {group} category",{group:a.name}),o="index"===e.settings.context?Craft.t("app","New category in the {group} category group",{group:a.name}):r,l="index"===e.settings.context?"link":null;e.$newCategoryBtn=Craft.ui.createButton({label:r,ariaLabel:o,spinner:!0,role:l}).addClass("submit add icon").appendTo(e.$newCategoryBtnGroup),e.addListener(e.$newCategoryBtn,"click mousedown",(function(t){"index"===e.settings.context&&("click"===t.type&&Garnish.isCtrlKeyPressed(t)||"mousedown"===t.type&&1===t.originalEvent.button)?window.open(Craft.getUrl("categories/".concat(a.handle,"/new"))):"click"===t.type&&e._createCategory(a.id)})),e.editableGroups.length>1&&(s=$("<button/>",{type:"button",class:"btn submit menubtn btngroup-btn-last","aria-controls":n,"data-disclosure-trigger":"","aria-label":Craft.t("app","New category, choose a category group")}).appendTo(e.$newCategoryBtnGroup))}else e.$newCategoryBtn=s=Craft.ui.createButton({label:Craft.t("app","New category"),ariaLabel:Craft.t("app","New category, choose a category group"),spinner:!0}).addClass("submit add icon menubtn btngroup-btn-last").attr("aria-controls",n).attr("data-disclosure-trigger","").appendTo(e.$newCategoryBtnGroup);if(e.addButton(e.$newCategoryBtnGroup),s){var h,d=$("<div/>",{id:n,class:"menu menu--disclosure"}).appendTo(e.$newCategoryBtnGroup),c=$("<ul/>").appendTo(d),u=function(e,i){var s="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!s){if(Array.isArray(e)||(s=function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(e))||i&&e&&"number"==typeof e.length){s&&(e=s);var a=0,n=function(){};return{s:n,n:function(){return a>=e.length?{done:!0}:{done:!1,value:e[a++]}},e:function(t){throw t},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){s=s.call(e)},n:function(){var t=s.next();return o=t.done,t},e:function(t){l=!0,r=t},f:function(){try{o||null==s.return||s.return()}finally{if(l)throw r}}}}(e.editableGroups);try{var p=function(){var t=h.value,i="index"===e.settings.context?"link":"button";if("index"===e.settings.context||t!==a){var n=$("<li/>").appendTo(c),r=$("<a/>",{role:"button"===i?"button":null,href:"#",type:"button"===i?"button":null,text:Craft.t("app","New {group} category",{group:t.name})}).appendTo(n);e.addListener(r,"click",(function(){s.data("trigger").hide(),e._createCategory(t.id)})),"button"===i&&e.addListener(r,"keydown",(function(i){i.keyCode===Garnish.SPACE_KEY&&(i.preventDefault(),s.data("trigger").hide(),e._createCategory(t.id))}))}};for(u.s();!(h=u.n()).done;)p()}catch(t){u.e(t)}finally{u.f()}new Garnish.DisclosureMenu(s)}}(),"index"===this.settings.context){var s="categories";i&&(s+="/"+i),Craft.setPath(s)}}},_createCategory:function(t){var e=this;if(this.$newCategoryBtn.hasClass("loading"))console.warn("New category creation already in progress.");else{var i=this.editableGroups.find((function(e){return e.id===t}));if(!i)throw"Invalid category group ID: ".concat(t);this.$newCategoryBtn.addClass("loading"),Craft.sendActionRequest("POST","elements/create",{data:{elementType:this.elementType,siteId:this.siteId,groupId:t}}).then((function(t){"index"===e.settings.context?document.location.href=Craft.getUrl(t.data.cpEditUrl,{fresh:1}):Craft.createElementEditor(e.elementType,{siteId:e.siteId,elementId:t.data.element.id,draftId:t.data.element.draftId,params:{fresh:1}}).on("submit",(function(){var s="group:".concat(i.uid);e.sourceKey!==s&&e.selectSourceByKey(s),e.clearSearch(),e.selectElementAfterUpdate(t.data.element.id),e.updateElements()}))})).finally((function(){e.$newCategoryBtn.removeClass("loading")}))}}}),Craft.registerElementIndexClass("craft\\elements\\Category",Craft.CategoryIndex)},6617:function(){Craft.CategorySelectInput=Craft.BaseElementSelectInput.extend({setSettings:function(){this.base.apply(this,arguments),this.settings.sortable=!1},getModalSettings:function(){var t=this.base();return t.hideOnSelect=!1,t},getElements:function(){return this.$elementsContainer.find(".element")},onModalSelect:function(t){var e=this;this.modal.disable(),this.modal.disableCancelBtn(),this.modal.disableSelectBtn(),this.modal.showFooterSpinner();for(var i=this.getSelectedElementIds(),s=0;s<t.length;s++)i.push(t[s].id);var a={categoryIds:i,siteId:t[0].siteId,id:this.settings.id,name:this.settings.name,branchLimit:this.settings.branchLimit,selectionLabel:this.settings.selectionLabel},n=function(){e.modal.enable(),e.modal.enableCancelBtn(),e.modal.enableSelectBtn(),e.modal.hideFooterSpinner()};Craft.sendActionRequest("POST","categories/input-html",{data:a}).then((function(i){n();var s=$(i.data.html).children(".elements");e.$elementsContainer.replaceWith(s),e.$elementsContainer=s,e.resetElements();for(var a=[],r=0;r<t.length;r++){var o=t[r],l=e.getElementById(o.id);l&&(e.animateElementIntoPlace(o.$element,l),a.push(o))}e.updateDisabledElementsInModal(),e.modal.hide(),e.onSelectElements(a)})).catch((function(t){t.response,n()}))},removeElement:function(t){var e=t.add(t.parent().siblings("ul").find(".element"));this.removeElements(e);for(var i=0;i<e.length;i++)this._animateCategoryAway(e,i)},_animateCategoryAway:function(t,e){var i,s=this;e===t.length-1&&(i=function(){var e=t.first().parent().parent(),i=e.parent();i[0]===s.$elementsContainer[0]||e.siblings().length?e.remove():i.remove()});var a=function(){s.animateElementAway(t.eq(e),i)};0===e?a():setTimeout(a,100*e)}})},9482:function(){Craft.charts={},Craft.charts.DataTable=Garnish.Base.extend({columns:null,rows:null,init:function(t){var e=t.columns,i=t.rows;i.forEach((function(t){$.each(t,(function(i){var s;switch(e[i].type){case"date":s=d3.timeParse("%Y-%m-%d"),t[i]=s(t[i]);break;case"datetime":s=d3.timeParse("%Y-%m-%d %H:00:00"),t[i]=s(t[i]);break;case"percent":t[i]=t[i]/100;break;case"number":t[i]=+t[i]}}))})),this.columns=e,this.rows=i}}),Craft.charts.Tip=Garnish.Base.extend({$container:null,$tip:null,init:function(t){this.$container=t,this.$tip=$('<div class="tooltip"></div>').appendTo(this.$container),this.hide()},setContent:function(t){this.$tip.html(t)},setPosition:function(t){this.$tip.css("left","".concat(t.left,"px")),this.$tip.css("top","".concat(t.top,"px"))},show:function(){this.$tip.css("display","block")},hide:function(){this.$tip.css("display","none")}}),Craft.charts.BaseChart=Garnish.Base.extend({$container:null,$chart:null,chartBaseClass:"cp-chart",dataTable:null,formatLocale:null,timeFormatLocale:null,orientation:null,svg:null,width:null,height:null,init:function(t,e){var i=this;this.$container=t,this.setSettings(Craft.charts.BaseChart.defaults),this.setSettings(e);var s={formats:window.d3Formats,formatLocaleDefinition:window.d3FormatLocaleDefinition,timeFormatLocaleDefinition:window.d3TimeFormatLocaleDefinition};this.setSettings(s),d3.select(window).on("resize",(function(){i.resize()}))},setSettings:function(t,e){var i=void 0===this.settings?{}:this.settings;this.settings=$.extend(!0,{},i,e,t)},draw:function(t,e){this.setSettings(e),this.dataTable=t,this.formatLocale=d3.formatLocale(this.settings.formatLocaleDefinition),this.timeFormatLocale=d3.timeFormatLocale(this.settings.timeFormatLocaleDefinition),this.orientation=this.settings.orientation,this.$chart&&this.$chart.remove();var i=this.chartBaseClass;this.settings.chartClass&&(i+=" "+this.settings.chartClass),this.$chart=$('<div class="'.concat(i,'" />')).appendTo(this.$container)},resize:function(){this.draw(this.dataTable,this.settings)},onAfterDrawTicks:function(){$(".tick",this.$chart).each((function(t,e){var i=$("text",e);i.clone().appendTo(e),i.attr("stroke","#ffffff"),i.attr("stroke-width",3)}))}},{defaults:{formatLocaleDefinition:null,timeFormatLocaleDefinition:null,formats:{numberFormat:",.2f",percentFormat:",.2%",currencyFormat:"$,.2f",shortDateFormats:{day:"%-m/%-d",month:"%-m/%y",year:"%Y"}},margin:{top:0,right:0,bottom:0,left:0},chartClass:null,colors:["#0594D1","#DE3800","#FF9A00","#009802","#9B009B"]}}),Craft.charts.Area=Craft.charts.BaseChart.extend({tip:null,drawingArea:null,init:function(t,e){this.base(t,Craft.charts.Area.defaults),this.setSettings(e)},draw:function(t,e){this.base(t,e),this.tip&&(this.tip=null);var i=this.getChartMargin();this.width=this.$chart.width()-i.left-i.right,this.height=this.$chart.height()-i.top-i.bottom;var s={width:this.width+(i.left+i.right),height:this.height+(i.top+i.bottom),translateX:"rtl"!==this.orientation?i.left:i.right,translateY:i.top};this.svg=d3.select(this.$chart.get(0)).append("svg").attr("width",s.width).attr("height",s.height),this.drawingArea=this.svg.append("g").attr("transform","translate(".concat(s.translateX,",").concat(s.translateY,")")),this.drawTicks(),this.drawAxes(),this.drawChart(),this.drawTipTriggers()},drawTicks:function(){var t=this.getX(!0),e=d3.axisBottom(t).tickFormat(this.getXFormatter()).ticks(3);this.drawingArea.append("g").attr("class","x ticks-axis").attr("transform","translate(0, ".concat(this.height,")")).call(e);var i,s=this.getY();"rtl"!==this.orientation?(i=d3.axisLeft(s).tickFormat(this.getYFormatter()).tickValues(this.getYTickValues()).ticks(2),this.drawingArea.append("g").attr("class","y ticks-axis").call(i)):(i=d3.axisRight(s).tickFormat(this.getYFormatter()).tickValues(this.getYTickValues()).ticks(2),this.drawingArea.append("g").attr("class","y ticks-axis").attr("transform","translate(".concat(this.width,",0)")).call(i)),this.onAfterDrawTicks()},drawAxes:function(){if(this.settings.xAxis.showAxis){var t=this.getX(),e=d3.axisBottom(t).ticks(0).tickSizeOuter(0);this.drawingArea.append("g").attr("class","x axis").attr("transform","translate(0, ".concat(this.height,")")).call(e)}if(this.settings.yAxis.showAxis){var i,s=this.getY();"rtl"===this.orientation?(i=d3.axisLeft(s).ticks(0),this.drawingArea.append("g").attr("class","y axis").attr("transform","translate(".concat(this.width-0,", 0)")).call(i)):(i=d3.axisRight(s).ticks(0),this.drawingArea.append("g").attr("class","y axis").attr("transform","translate(".concat(0,", 0)")).call(i))}},drawChart:function(){var t=this.getX(!0),e=this.getY();if(this.settings.xAxis.gridlines){var i=d3.axisBottom(t);this.drawingArea.append("g").attr("class","x grid-line").attr("transform","translate(0,".concat(this.height,")")).call(i.tickSize(-this.height,0,0).tickFormat(""))}if(this.settings.yAxis.gridlines){var s=d3.axisLeft(e);this.drawingArea.append("g").attr("class","y grid-line").attr("transform","translate(0 , 0)").call(s.tickSize(-this.width,0).tickFormat("").tickValues(this.getYTickValues()).ticks(2))}var a=d3.line().x((function(e){return t(e[0])})).y((function(t){return e(t[1])}));this.drawingArea.append("g").attr("class","chart-line").append("path").datum(this.dataTable.rows).style("fill","none").style("stroke",this.settings.colors[0]).style("stroke-width","3px").attr("d",a);var n=d3.area().x((function(e){return t(e[0])})).y0(this.height).y1((function(t){return e(t[1])}));this.drawingArea.append("g").attr("class","chart-area").append("path").datum(this.dataTable.rows).style("fill",this.settings.colors[0]).style("fill-opacity","0.3").attr("d",n),this.settings.plots&&this.drawingArea.append("g").attr("class","plots").selectAll("circle").data(this.dataTable.rows).enter().append("circle").style("fill",this.settings.colors[0]).attr("class",(function(t,e){return"plot plot-".concat(e)})).attr("r",4).attr("cx",(function(e){return t(e[0])})).attr("cy",(function(t){return e(t[1])}))},drawTipTriggers:function(){var t=this;if(this.settings.tips){this.tip||(this.tip=new Craft.charts.Tip(this.$chart));var e=this.getChartMargin(),i=(this.drawingArea.select(".x path.domain").node().getTotalLength()-e.left-e.right-12)/(this.dataTable.rows.length-1),s=Math.max(0,i),a=this.getX(!0),n=this.getY();this.drawingArea.append("g").attr("class","tip-triggers").selectAll("rect").data(this.dataTable.rows).enter().append("rect").attr("class","tip-trigger").style("fill","transparent").style("fill-opacity","1").attr("width",s).attr("height",this.height).attr("x",(function(t){return a(t[0])-s/2})).on("mouseover",(function(e,i){t.drawingArea.select(".plot-"+i).attr("r",5);var s=$("<div />"),r=$('<div class="x-value" />').appendTo(s),o=$('<div class="y-value" />').appendTo(s);r.html(t.getXFormatter()(e[0])),o.html(t.getYFormatter()(e[1]));var l=s.get(0);t.tip.setContent(l);var h,d=t.getChartMargin(),c=24,u=n(e[1])+c;"rtl"!==t.orientation?(h=a(e[0])+d.left+c,t.$chart.offset().left+h+t.tip.$tip.width()>t.$chart.offset().left+t.$chart.width()-c&&(h=a(e[0])-(t.tip.$tip.width()+c))):h=a(e[0])-(t.tip.$tip.width()+d.left+c),h<0&&(h=a(e[0])+d.left+c);var p={top:u,left:h};t.tip.setPosition(p),t.tip.show()})).on("mouseout",(function(e,i){t.drawingArea.select(".plot-"+i).attr("r",4),t.tip.hide()}))}},getChartMargin:function(){var t=this,e=this.settings.margin,i=this.getYTickValues(),s=0;return $.each(i,(function(e,i){var a=8*t.getYFormatter()(i).length;a>s&&(s=a)})),s+=10,e.left=s,e},getX:function(t){var e=d3.min(this.dataTable.rows,(function(t){return t[0]})),i=d3.max(this.dataTable.rows,(function(t){return t[0]})),s=[e,i];"rtl"===this.orientation&&(s=[i,e]);var a=0,n=0;t&&(a=0,n=0);var r=d3.scaleTime().range([a,this.width-n]);return r.domain(s),r},getY:function(){var t=[0,this.getYMaxValue()],e=d3.scaleLinear().range([this.height,0]);return e.domain(t),e},getXFormatter:function(){return this.settings.xAxis.formatter!==$.noop?this.settings.xAxis.formatter(this):Craft.charts.utils.getTimeFormatter(this.timeFormatLocale,this.settings)},getYFormatter:function(){return this.settings.yAxis.formatter!==$.noop?this.settings.yAxis.formatter(this):Craft.charts.utils.getNumberFormatter(this.formatLocale,this.dataTable.columns[1].type,this.settings)},getYMaxValue:function(){return d3.max(this.dataTable.rows,(function(t){return t[1]}))},getYTickValues:function(){var t=this.getYMaxValue();return t>1?[t/2,t]:[0,t]}},{defaults:{chartClass:"area",margin:{top:25,right:5,bottom:25,left:0},plots:!0,tips:!0,xAxis:{gridlines:!1,showAxis:!0,formatter:$.noop},yAxis:{gridlines:!0,showAxis:!1,formatter:$.noop}}}),Craft.charts.utils={getDuration:function(t){var e=parseInt(t,10),i={hours:Math.floor(e/3600),minutes:Math.floor((e-3600*i.hours)/60),seconds:e-3600*i.hours-60*i.minutes};return i.hours<10&&(i.hours="0".concat(i.hours)),i.minutes<10&&(i.minutes="0".concat(i.minutes)),i.seconds<10&&(i.seconds="0".concat(i.seconds)),"".concat(i.hours,":").concat(i.minutes,":").concat(i.seconds)},getTimeFormatter:function(t,e){switch(e.dataScale){case"year":return t.format("%Y");case"month":return t.format(e.formats.shortDateFormats.month);case"hour":return t.format("".concat(e.formats.shortDateFormats.day," %H:00:00"));default:return t.format(e.formats.shortDateFormats.day)}},getNumberFormatter:function(t,e,i){switch(e){case"currency":return t.format(i.formats.currencyFormat);case"percent":return t.format(i.formats.percentFormat);case"time":return Craft.charts.utils.getDuration;case"number":return t.format(i.formats.numberFormat)}}}},3352:function(){Craft.ColorInput=Garnish.Base.extend({$container:null,$input:null,$colorContainer:null,$colorPreview:null,$colorInput:null,init:function(t){this.$container=$(t),this.$input=this.$container.find(".color-input"),this.$colorContainer=this.$container.children(".color"),this.$colorPreview=this.$colorContainer.children(".color-preview"),this.createColorInput(),this.handleTextChange(),this.addListener(this.$input,"input","handleTextChange")},createColorInput:function(){var t=document.createElement("input");t.setAttribute("type","color"),"color"===t.type&&(this.$colorContainer.removeClass("static"),this.$colorInput=$(t).addClass("color-preview-input").attr({"aria-controls":this.$input.attr("id"),"aria-label":Craft.t("app","Color picker")}).appendTo(this.$colorPreview),this.addListener(this.$colorInput,"click",(function(t){t.stopPropagation()})),this.addListener(this.$colorContainer,"click",(function(){this.$colorInput.trigger("click")})),this.addListener(this.$colorInput,"input","updateColor"))},updateColor:function(){this.$input.val(this.$colorInput.val()),this.handleTextChange()},handleTextChange:function(){var t=this.$input.val();t!==(t=Craft.trim(t))&&this.$input.val(t),t.length&&"#"===t[0]&&(t=t.substring(1),this.$input.val(t)),t.length?(3===t.length&&(t=t[0].repeat(2)+t[1].repeat(2)+t[2].repeat(2)),t.match(/^[0-9a-f]{6}$/i)?(this.$colorPreview.css("background-color","#".concat(t)),this.$colorInput&&this.$colorInput.val("#".concat(t))):this.$colorPreview.css("background-color","")):this.$colorPreview.css("background-color","")}},{_browserSupportsColorInputs:null,doesBrowserSupportColorInputs:function(){return Craft.ColorInput._browserSupportsColorInputs,Craft.ColorInput._browserSupportsColorInputs}})},8167:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}function e(t,e,i){return e in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}Craft.CpScreenSlideout=Craft.Slideout.extend({action:null,namespace:null,showingLoadSpinner:!1,hasTabs:!1,hasCpLink:!1,hasSidebar:!1,$header:null,$toolbar:null,$tabContainer:null,$loadSpinner:null,$editLink:null,$sidebarBtn:null,$body:null,$content:null,$sidebar:null,$footer:null,$noticeContainer:null,$cancelBtn:null,$saveBtn:null,tabManager:null,showingSidebar:!1,cancelToken:null,ignoreFailedRequest:!1,fieldsWithErrors:null,init:function(t,e){var i=this;this.action=t,this.setSettings(e,Craft.CpScreenSlideout.defaults),this.fieldsWithErrors=[],this.$header=$("<header/>",{class:"pane-header"}),this.$toolbar=$("<div/>",{class:"so-toolbar"}).appendTo(this.$header),this.$tabContainer=$("<div/>",{class:"pane-tabs"}).appendTo(this.$toolbar),this.$loadSpinner=$("<div/>",{class:"spinner",title:Craft.t("app","Loading"),"aria-label":Craft.t("app","Loading")}).appendTo(this.$toolbar),this.$editLink=$("<a/>",{target:"_blank",class:"btn header-btn hidden",title:Craft.t("app","Open the full edit page in a new tab"),"aria-label":Craft.t("app","Open the full edit page in a new tab"),"data-icon":"external"}).appendTo(this.$toolbar),this.$sidebarBtn=$("<button/>",{type:"button",class:"btn header-btn hidden sidebar-btn",title:Craft.t("app","Show sidebar"),"aria-label":Craft.t("app","Show sidebar"),"data-icon":"sidebar-".concat(Garnish.ltr?"right":"left"),"aria-expanded":"false"}).appendTo(this.$toolbar),this.addListener(this.$sidebarBtn,"click",(function(t){t.preventDefault(),i.showingSidebar?i.hideSidebar():i.showSidebar()})),this.$body=$("<div/>",{class:"so-body"}),this.$content=$("<div/>",{class:"so-content"}).appendTo(this.$body),this.$sidebar=$("<div/>",{class:"so-sidebar details hidden"}).appendTo(this.$body),this.$footer=$("<div/>",{class:"so-footer hidden"}),this.$noticeContainer=$("<div/>",{class:"so-notice"}).appendTo(this.$footer),$("<div/>",{class:"flex-grow"}).appendTo(this.$footer);var s=$("<div/>",{class:"flex flex-nowrap"}).appendTo(this.$footer);this.$cancelBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(s),this.$saveBtn=Craft.ui.createSubmitButton({label:Craft.t("app","Save"),spinner:!0}).appendTo(s);var a=this.$header.add(this.$body).add(this.$footer);this.base(a,{containerElement:"form",containerAttributes:{id:"cp-screen-".concat(Math.floor(1e8*Math.random())),action:"",method:"post",novalidate:"",class:"cp-screen"},closeOnEsc:!1,closeOnShadeClick:!1}),this.$container.data("cpScreen",this),this.on("beforeClose",(function(){i.hideSidebar()})),Garnish.uiLayerManager.registerShortcut({keyCode:Garnish.S_KEY,ctrl:!0},(function(t){i.handleSubmit(t)})),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){i.closeMeMaybe()})),this.addListener(this.$cancelBtn,"click",(function(){i.closeMeMaybe()})),this.addListener(this.$shade,"click",(function(){i.closeMeMaybe()})),this.addListener(this.$container,"click",(function(t){var e=$(event.target);!i.showingSidebar||e.closest(i.$sidebarBtn).length||e.closest(i.$sidebar).length||i.hideSidebar()})),this.addListener(this.$container,"submit","handleSubmit"),this.load()},load:function(t,e){var i=this;return new Promise((function(t,s){i.trigger("beforeLoad"),i.showLoadSpinner(),i.cancelToken&&(i.ignoreFailedRequest=!0,i.cancelToken.cancel()),i.cancelToken=axios.CancelToken.source(),Craft.sendActionRequest("GET",i.action,$.extend({params:Object.assign({},i.getParams(),i.settings.params),cancelToken:i.cancelToken.token,headers:{"X-Craft-Container-Id":i.$container.attr("id")}},i.settings.requestOptions)).then((function(a){i.update(a.data).then((function(){!1!==e&&(i.$container.data("delta-names",a.data.deltaNames),i.$container.data("initial-delta-values",a.data.initialDeltaValues),i.$container.data("initialSerializedValue",i.$container.serialize())),t()})).catch((function(t){s(t)}))})).catch((function(t){i.ignoreFailedRequest||(Craft.cp.displayError(),s(t)),i.ignoreFailedRequest=!1})).finally((function(){i.hideLoadSpinner(),i.cancelToken=null}))}))},getParams:function(){return{}},updateHeaderVisibility:function(){var t=this.settings.showHeader||this.hasTabs||this.hasCpLink||this.showingLoadSpinner;t||this.hasSidebar?this.$header.removeClass("hidden"):this.$header.addClass("hidden"),t?this.$header.addClass("so-visible"):this.$header.removeClass("so-visible")},showLoadSpinner:function(){this.$loadSpinner.removeClass("hidden"),this.showingLoadSpinner=!0,this.updateHeaderVisibility()},hideLoadSpinner:function(){this.$loadSpinner.addClass("hidden"),this.showingLoadSpinner=!1,this.updateHeaderVisibility()},update:function(t){var e=this;return new Promise((function(i){e.namespace=t.namespace,e.$content.html(t.content),t.submitButtonLabel&&e.$saveBtn.text(t.submitButtonLabel),e.updateTabs(t.tabs),t.formAttributes&&Craft.setElementAttributes(e.$container,t.formAttributes),t.editUrl?(e.$editLink.removeClass("hidden").attr("href",t.editUrl),e.hasCpLink=!0):(e.$editLink.addClass("hidden"),e.hasCpLink=!1),t.sidebar?(e.$container.addClass("has-sidebar"),e.$sidebarBtn.removeClass("hidden"),e.$sidebar.html(t.sidebar),e.$sidebar.find("a").each((function(){this.hostname.length&&void 0===$(this).attr("target")&&$(this).attr("target","_blank")})),e.hasSidebar=!0):(e.$container.removeClass("has-sidebar"),e.$sidebarBtn.addClass("hidden"),e.$sidebar.addClass("hidden").html(""),e.hasSidebar=!1),t.notice?e.$noticeContainer.html(t.notice):e.$noticeContainer.empty(),e.updateHeaderVisibility(),e.$footer.removeClass("hidden"),Garnish.requestAnimationFrame((function(){Craft.appendHeadHtml(t.headHtml),Craft.appendBodyHtml(t.bodyHtml),Craft.initUiElements(e.$content),(new Craft.ElementThumbLoader).load($(e.$content)),t.sidebar&&(Craft.initUiElements(e.$sidebar),(new Craft.ElementThumbLoader).load(e.$sidebar)),Garnish.isMobileBrowser()||Craft.setFocusWithin(e.$content),i(),e.trigger("load")}))}))},updateTabs:function(t){var e=this;if(this.tabManager&&(this.tabManager.destroy(),this.tabManager=null,this.$tabContainer.html("")),this.hasTabs=!!t,this.hasTabs){var i=$(t);this.$tabContainer.replaceWith(i),this.$tabContainer=i,this.tabManager=new Craft.Tabs(this.$tabContainer),this.tabManager.on("deselectTab",(function(t){$(t.$tab.attr("href")).addClass("hidden")})),this.tabManager.on("selectTab",(function(t){$(t.$tab.attr("href")).removeClass("hidden"),Garnish.$win.trigger("resize"),e.$body.trigger("scroll")}))}},showSidebar:function(){var t=this;this.showingSidebar||(this.$body.scrollTop(0).addClass("no-scroll"),this.$sidebar.off("transitionend.so").css(this._closedSidebarStyles()).removeClass("hidden"),this.$sidebar[0].offsetWidth,this.$sidebar.css(this._openedSidebarStyles()),Garnish.isMobileBrowser()||this.$sidebar.one("transitionend.so",(function(){Craft.setFocusWithin(t.$sidebar)})),Craft.trapFocusWithin(this.$sidebar),this.$sidebarBtn.addClass("active").attr({"aria-expanded":"true"}),Garnish.$win.trigger("resize"),this.$sidebar.trigger("scroll"),Garnish.uiLayerManager.addLayer(),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.hideSidebar()})),this.showingSidebar=!0)},hideSidebar:function(){var t=this;this.showingSidebar&&(this.$body.removeClass("no-scroll"),this.$sidebar.off("transitionend.so").css(this._closedSidebarStyles()).one("transitionend.so",(function(){t.$sidebar.addClass("hidden"),t.$sidebarBtn.focus()})),this.$sidebarBtn.removeClass("active").attr({"aria-expanded":"false"}),Garnish.uiLayerManager.removeLayer(),this.showingSidebar=!1)},_openedSidebarStyles:function(){return e({},Garnish.ltr?"right":"left","0")},_closedSidebarStyles:function(){return e({},Garnish.ltr?"right":"left","-350px")},showSubmitSpinner:function(){this.$saveBtn.addClass("loading")},hideSubmitSpinner:function(){this.$saveBtn.removeClass("loading")},handleSubmit:function(t){t.preventDefault(),this.submit()},submit:function(){var t=this;this.showSubmitSpinner();var e=Craft.findDeltaData(this.$container.data("initialSerializedValue"),this.$container.serialize(),this.$container.data("delta-names"),null,this.$container.data("initial-delta-values"));Craft.sendActionRequest("POST",null,{data:e,headers:{"X-Craft-Namespace":this.namespace}}).then((function(e){t.handleSubmitResponse(e)})).catch((function(e){t.handleSubmitError(e)})).finally((function(){t.hideSubmitSpinner()}))},handleSubmitResponse:function(t){this.clearErrors();var e=t.data||{};e.message&&Craft.cp.displaySuccess(e.message,e.notificationSettings),this.trigger("submit",{response:t,data:e.modelName&&e[e.modelName]||{}}),this.settings.closeOnSubmit&&this.close()},handleSubmitError:function(t){if(!t.isAxiosError||!t.response||400===!t.response.status)throw Craft.cp.displayError(),t;var e=t.response.data||{};Craft.cp.displayError(e.message),e.errors&&this.showErrors(e.errors)},showErrors:function(e){var i=this;this.clearErrors(),Object.entries(e).forEach((function(e){var s,a,n=(a=2,function(t){if(Array.isArray(t))return t}(s=e)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(s,a)||function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(s,a)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),r=n[0],o=n[1],l=i.$container.find('[data-attribute="'.concat(r,'"]'));l&&(Craft.ui.addErrorsToField(l,o),i.fieldsWithErrors.push(l))}))},clearErrors:function(){this.fieldsWithErrors.forEach((function(t){Craft.ui.clearErrorsFromField(t)}))},isDirty:function(){return void 0!==this.$container.data("initialSerializedValue")&&this.$container.serialize()!==this.$container.data("initialSerializedValue")},closeMeMaybe:function(){this.isOpen&&(this.isDirty()&&!confirm(Craft.t("app","Are you sure you want to close this screen? Any changes will be lost."))||this.close())},close:function(){this.base(),this.cancelToken&&(this.ignoreFailedRequest=!0,this.cancelToken.cancel())}},{defaults:{params:{},requestOptions:{},showHeader:null,closeOnSubmit:!0}})},587:function(){function t(t,e){var i="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!i){if(Array.isArray(t)||(i=s(t))||e&&t&&"number"==typeof t.length){i&&(t=i);var a=0,n=function(){};return{s:n,n:function(){return a>=t.length?{done:!0}:{done:!1,value:t[a++]}},e:function(t){function e(e){return t.apply(this,arguments)}return e.toString=function(){return t.toString()},e}((function(t){throw t})),f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){i=i.call(t)},n:function(){var t=i.next();return o=t.done,t},e:function(t){function e(e){return t.apply(this,arguments)}return e.toString=function(){return t.toString()},e}((function(t){l=!0,r=t})),f:function(){try{o||null==i.return||i.return()}finally{if(l)throw r}}}}function i(t){return function(t){if(Array.isArray(t))return a(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||s(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function s(t,e){if(t){if("string"==typeof t)return a(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?a(t,e):void 0}}function a(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}function n(t){return n="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},n(t)}var r=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi;if(jQuery.htmlPrefilter=function(t){return t.replace(r,"<$1></$2>")},$.extend(Craft,{navHeight:48,index:function(t,e){if(!$.isArray(t))throw"The first argument passed to Craft.index() must be an array.";return t.reduce((function(t,i,s){return t["string"==typeof e?i[e]:e(i,s)]=i,t}),{})},group:function(t,e){if(!$.isArray(t))throw"The first argument passed to Craft.group() must be an array.";var i={};return t.reduce((function(t,s,a){var n="string"==typeof e?s[e]:e(s,a);return i.hasOwnProperty(n)||(i[n]=[[],n],t.push(i[n])),i[n][0].push(s),t}),[])},t:function(t,e,i){return void 0!==Craft.translations[t]&&void 0!==Craft.translations[t][e]&&(e=Craft.translations[t][e]),i?this.formatMessage(e,i):e},formatMessage:function(t,e){var i;if(!1===(i=this._tokenizePattern(t)))throw"Message pattern is invalid.";for(var s=0;s<i.length;s++){var a=i[s];if("object"===n(a)&&!1===(i[s]=this._parseToken(a,e)))throw"Message pattern is invalid."}return i.join("")},_tokenizePattern:function(t){var e,s,a=1,n=i(t);if(-1===(e=s=n.indexOf("{")))return[t];for(var r=[n.slice(0,s).join("")];;){var o=n.indexOf("{",s+1),l=n.indexOf("}",s+1);if(-1===o&&(o=!1),-1===l&&(l=!1),!1===o&&!1===l)break;if(!1===o&&(o=n.length),l>o?(a++,s=o):(a--,s=l),0===a&&(r.push(n.slice(e+1,s).join("").split(",",3)),e=s+1,r.push(n.slice(e,o).join("")),e=o),0!==a&&(!1===o||!1===l))break}return 0===a&&r},_parseToken:function(t,e){var s=this,a=Craft.trim(t[0]);if(void 0===e[a])return"{".concat(t.join(","),"}");var r=e[a],o=void 0!==t[1]?Craft.trim(t[1]):"none";switch(o){case"number":return function(){var e=void 0!==t[2]?Craft.trim(t[2]):null;if(null!==e&&"integer"!==e)throw"Message format 'number' is only supported for integer values.";var i,s=Craft.formatNumber(r);return null===e&&-1!==(i="".concat(r).indexOf("."))&&(s+=".".concat(r.substring(i+1))),s}();case"none":return r;case"select":return function(){if(void 0===t[2])return!1;for(var i=s._tokenizePattern(t[2]),a=i.length,n=!1,o=0;o+1<a;o++){if(Garnish.isArray(i[o])||!Garnish.isArray(i[o+1]))return!1;var l=Craft.trim(i[o++]);(!1===n&&"other"===l||l==r)&&(n=i[o].join(","))}return!1!==n&&s.formatMessage(n,e)}();case"plural":return function(){if(void 0===t[2])return!1;for(var a=s._tokenizePattern(t[2]),o=a.length,l=!1,h=0,d=0;d+1<o;d++){if("object"===n(a[d])||"object"!==n(a[d+1]))return!1;var c=Craft.trim(a[d++]),u=i(c);if(1===d&&"offset:"===c.substring(0,7)){var p=i(c.replace(/[\n\r\t]/g," ")).indexOf(" ",7);if(-1===p)throw"Message pattern is invalid.";h=parseInt(Craft.trim(u.slice(7,p).join(""))),c=Craft.trim(u.slice(p+1,p+1+u.length).join(""))}(!1===l&&"other"===c||"="===c[0]&&parseInt(u.slice(1,1+u.length).join(""))===r||"one"===c&&r-h==1)&&(l=("string"==typeof a[d]?[a[d]]:a[d]).map((function(t){return t.replace("#",r-h)})).join(","))}return!1!==l&&s.formatMessage(l,e)}();default:throw"Message format '".concat(o,"' is not supported.")}},formatDate:function(t){return"object"!==n(t)&&(t=new Date(t)),$.datepicker.formatDate(Craft.datepickerOptions.dateFormat,t)},formatNumber:function(t,e){return void 0===e&&(e=",.0f"),d3.formatLocale(d3FormatLocaleDefinition).format(e)(t)},shortcutText:function(t,e,i){return"Mac"===Craft.clientOs?(i?"⌥":"")+(e?"⇧":"")+"⌘"+t:"Ctrl+"+(i?"Alt+":"")+(e?"Shift+":"")+t},escapeHtml:function(t){return $("<div/>").text(t).html()},escapeRegex:function(t){return t.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},getText:function(t){return $("<div/>").html(t).text()},encodeUriComponent:function(t){t=encodeURIComponent(t);var e={"!":"%21","*":"%2A","'":"%27","(":"%28",")":"%29"};for(var i in e){var s=new RegExp("\\"+i,"g");t=t.replace(s,e[i])}return t},selectFullValue:function(t){var e=$(t),i=e.val();if(void 0!==e[0].setSelectionRange){var s=2*i.length;e[0].setSelectionRange(0,s)}else e.val(i)},formatInputId:function(t){return this.rtrim(t.replace(/[^\w\-]+/g,"-"),"-")},getUrl:function(t,e,i){"string"!=typeof t&&(t="");var s=null;if($.isPlainObject(e))void 0!==e["#"]&&(s=e["#"],delete e["#"]);else if("string"==typeof e){var a=e.indexOf("#");-1!==a&&(s=e.substring(a+1),e=e.substring(0,a)),e=Object.fromEntries(new URLSearchParams(e).entries())}else e={};var n=t.indexOf("#");-1!==n&&(s||(s=t.substring(n+1)),t=t.substring(0,n));var r,o=t.indexOf("?");if(-1!==o&&(e=$.extend(Object.fromEntries(new URLSearchParams(t.substring(o+1)).entries()),e),t=t.substring(0,o)),-1!==t.search("://")||"/"===t[0])return t+($.isEmptyObject(e)?"":"?".concat($.param(e)))+(s?"#".concat(s):"");if(t=Craft.trim(t,"/"),i){if(r=i,t&&Craft.pathParam){var l=r.match(new RegExp("[&?]"+Craft.escapeRegex(Craft.pathParam)+"=[^&]+"));l&&(r=r.replace(l[0],Craft.rtrim(l[0],"/")+"/"+t),t="")}}else r=Craft.baseUrl;return-1!==(o=r.indexOf("?"))&&(e=$.extend(Object.fromEntries(new URLSearchParams(r.substring(o+1)).entries()),e),r=r.substring(0,o)),!Craft.omitScriptNameInUrls&&t&&(Craft.usePathInfo||!Craft.pathParam?-1===r.search(Craft.scriptName)&&(r=Craft.rtrim(r,"/")+"/"+Craft.scriptName):(void 0!==e[Craft.pathParam]&&(t=Craft.rtrim(e[Craft.pathParam])+(t?"/"+t:"")),e[Craft.pathParam]=t,t=null)),t&&(r=Craft.rtrim(r,"/")+"/"+t),$.isEmptyObject(e)||(r+="?".concat($.param(e))),s&&(r+="#".concat(s)),r},getCpUrl:function(t,e){return this.getUrl(t,e,Craft.baseCpUrl)},getSiteUrl:function(t,e){return this.getUrl(t,e,Craft.baseSiteUrl)},getActionUrl:function(t,e){return Craft.getUrl(t,e,Craft.actionUrl)},redirectTo:function(t){document.location.href=this.getUrl(t)},setUrl:function(t){"undefined"!=typeof history&&(t.match(/#/)||(t+=document.location.hash),history.replaceState({},"",t))},setPath:function(t){this.path=t,this.setUrl(Craft.getUrl(t,document.location.search))},setQueryParam:function(t,e){var i=document.location.origin+document.location.pathname,s=this.getQueryParams();null!=e&&!1!==e?s[t]=e:delete s[t],this.setUrl(Craft.getUrl(i,s))},getPageUrl:function(t){var e=document.location.origin+document.location.pathname;e=Craft.rtrim(e,"/");var i=document.location.search?document.location.search.substring(1):"";if("?"===Craft.pageTrigger[0]){var s=Craft.pageTrigger.substring(1);if(document.location.search){var a=Object.fromEntries(new URLSearchParams(i).entries());delete a[s],i=$.param(a)}1!==t&&(i+=(""!==i?"&":"")+"".concat(s,"=").concat(t))}else e=e.replace(new RegExp("/"+Craft.escapeRegex(Craft.pageTrigger)+"\\d+$"),""),1!==t&&(e+="/".concat(Craft.pageTrigger).concat(t));return e+(i?"?".concat(i):"")+document.location.hash},getCsrfInput:function(){return Craft.csrfTokenName?'<input type="hidden" name="'+Craft.csrfTokenName+'" value="'+Craft.csrfTokenValue+'"/>':""},postActionRequest:function(t,e,i,s){"function"==typeof e&&(s=i,i=e,e={}),(s=s||{}).contentType&&s.contentType.match(/\bjson\b/)&&("object"===n(e)&&(e=JSON.stringify(e)),s.contentType="application/json; charset=utf-8");var a=$.ajax($.extend({url:Craft.getActionUrl(t),type:"POST",dataType:"json",headers:this._actionHeaders(),data:e,success:i,error:function(t,e,s){4===t.readyState&&(400!==t.status&&(void 0!==Craft.cp?Craft.cp.displayError():alert(Craft.t("app","A server error occurred."))),i&&i(400===t.status?t.responseJSON:null,e,t))}},s));return"function"==typeof s.send&&s.send(a),a},_actionHeaders:function(){var t={"X-Registered-Asset-Bundles":Object.keys(Craft.registeredAssetBundles).join(","),"X-Registered-Js-Files":Object.keys(Craft.registeredJsFiles).join(",")};return Craft.csrfTokenValue&&(t["X-CSRF-Token"]=Craft.csrfTokenValue),t},sendActionRequest:function(t,e){var i=this,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if($.isPlainObject(e)&&(s=e,e=null),"POST"===t.toUpperCase()&&e&&s.data)if("string"==typeof s.data){var a=s&&s.headers&&s.headers["X-Craft-Namespace"],n=this.namespaceInputName("action",a);s.data+="&".concat(n,"=").concat(e)}else delete s.data.action;return new Promise((function(a,n){(s=s?$.extend({},s):{}).method=t,s.url=e?Craft.getActionUrl(e):Craft.getCpUrl(),s.headers=$.extend({"X-Requested-With":"XMLHttpRequest"},s.headers||{},i._actionHeaders()),s.params=$.extend({},s.params||{},{v:(new Date).getTime()}),axios.request(s).then(a).catch(n)}))},sendApiRequest:function(t,e,i){var s=this;return new Promise((function(a,n){var r=(i=i?$.extend({},i):{}).cancelToken||null;s._getApiHeaders(r).then((function(o){i.method=t,i.baseURL=Craft.baseApiUrl,i.url=e,i.headers=$.extend(o,i.headers||{}),i.params=$.extend(Craft.apiParams||{},i.params||{},{v:(new Date).getTime()}),s._apiHeaders||(i.params.processCraftHeaders=1),Craft.httpProxy&&(i.proxy=Craft.httpProxy),axios.request(i).then((function(t){s._processApiHeaders(t.headers,r).then((function(){a(t.data)})).catch(n)})).catch(n)})).catch(n)}))},_loadingApiHeaders:!1,_apiHeaders:null,_apiHeaderWaitlist:[],_getApiHeaders:function(t){var i=this;return new Promise((function(s,a){i._loadingApiHeaders?i._apiHeaderWaitlist.push([s,a]):i._apiHeaders?s(i._apiHeaders):(i._loadingApiHeaders=!0,i.sendActionRequest("POST","app/api-headers",{cancelToken:t}).then((function(t){i._loadingApiHeaders?s(t.data):a(e)})).catch((function(t){i._rejectApiRequests(a,t)})))}))},_processApiHeaders:function(t,i){var s=this;return new Promise((function(a,n){s._apiHeaders?a():s.sendActionRequest("POST","app/process-api-response-headers",{data:{headers:t},cancelToken:i}).then((function(t){if(s._loadingApiHeaders)for(s._apiHeaders=t.data,s._loadingApiHeaders=!1,a();s._apiHeaderWaitlist.length;)s._apiHeaderWaitlist.shift()[0](s._apiHeaders);else n(e)})).catch((function(t){s._rejectApiRequests(n,t)}))}))},_rejectApiRequests:function(t,e){for(this._loadingApiHeaders=!1,t(e);this._apiHeaderWaitlist.length;)this._apiHeaderWaitlist.shift()[1](e)},clearCachedApiHeaders:function(){for(this._apiHeaders=null,this._loadingApiHeaders=!1;this._apiHeaderWaitlist.length;)this._apiHeaderWaitlist.shift()[1]()},downloadFromUrl:function(t,e,i){return new Promise((function(s,a){var r=new XMLHttpRequest;r.open(t,e,!0),"object"===n(i)?(r.setRequestHeader("Content-Type","application/json; charset=UTF-8"),i=JSON.stringify(i)):r.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"),r.responseType="blob",r.onload=function(){if(200===r.status){var t=r.getResponseHeader("content-disposition"),e=/"([^"]*)"/.exec(t),i=null!=e&&e[1]?e[1]:"Download",n=r.getResponseHeader("content-type"),o=new Blob([r.response],{type:n}),l=document.createElement("a");l.href=window.URL.createObjectURL(o),l.download=i,document.body.appendChild(l),l.click(),document.body.removeChild(l),s()}else a()},r.send(i)}))},stringToArray:function(t){if("string"!=typeof t)return t;for(var e=t.split(","),i=0;i<e.length;i++)e[i]=$.trim(e[i]);return e},findDeltaData:function(t,e,i,s,a,r){t="string"==typeof t?t:"",e="string"==typeof e?e:"",i=$.isArray(i)?i:[],a=$.isPlainObject(a)?a:{},r=$.isArray(r)?r:[],i.sort((function(t,e){return t.length===e.length?0:t.length>e.length?1:-1}));for(var o=this._groupParamsByDeltaNames(t.split("&"),i,!1,a),l=this._groupParamsByDeltaNames(e.split("&"),i,!0,!1),h=l.__root__,d=0;d<i.length;d++)(Craft.inArray(i[d],r)||"object"===n(l[i[d]])&&("object"!==n(o[i[d]])||JSON.stringify(o[i[d]])!==JSON.stringify(l[i[d]])))&&((h=h.concat(l[i[d]])).push("modifiedDeltaNames[]="+i[d]),s&&s(i[d],l[i[d]]));return h.join("&")},_groupParamsByDeltaNames:function(t,e,i,s){var a={};i&&(a.__root__=[]);var n=function(t){return encodeURIComponent(t).replace("%3D","=")};t=t.map((function(t){return decodeURIComponent(t)}));t:for(var r=0;r<t.length;r++){for(var o=e.length-1;o>=0;o--){var l=t[r].substring(0,e[o].length+1);if(l===e[o]+"="||l===e[o]+"["){void 0===a[e[o]]&&(a[e[o]]=[]),a[e[o]].push(n(t[r]));continue t}}i&&a.__root__.push(n(t[r]))}if(s){var h=function(t,e){return $.isArray(e)||$.isPlainObject(e)?e=$.param(e):"string"==typeof e?e=encodeURIComponent(e):null===e&&(e=""),"".concat(encodeURIComponent(t),"=").concat(e)};for(var d in s)if(s.hasOwnProperty(d))if($.isPlainObject(s[d]))for(var c in a[d]=[],s[d])s[d].hasOwnProperty(c)&&a[d].push(h("".concat(d,"[").concat(c,"]"),s[d][c]));else a[d]=[h(d,s[d])]}return a},expandPostArray:function(t){var e,i={};for(var s in t)if(t.hasOwnProperty(s)){var a,r=t[s],o=s.match(/^(\w+)(\[.*)?/);if(o[2])for(a=o[2].match(/\[[^\[\]]*\]/g),e=0;e<a.length;e++)a[e]=a[e].substring(1,a[e].length-1);else a=[];a.unshift(o[1]);var l=i;for(e=0;e<a.length;e++)e<a.length-1?("object"!==n(l[a[e]])&&(a[e+1]&&parseInt(a[e+1])!=a[e+1]?l[a[e]]={}:l[a[e]]=[]),l=l[a[e]]):(a[e]||(a[e]=l.length),l[a[e]]=r)}return i},createForm:function(t){var e=$("<form/>",{attr:{method:"post",action:"","accept-charset":"UTF-8"}});if("string"==typeof t)for(var i,s=t.split("&"),a=0;a<s.length;a++)i=s[a].split("=",2),$("<input/>",{type:"hidden",name:decodeURIComponent(i[0]),value:decodeURIComponent(i[1]||"")}).appendTo(e);return e},compare:function(t,e,i){if(n(t)!==n(e))return!1;if("object"===n(t)){if(t.length!==e.length)return!1;if(t instanceof Array!=e instanceof Array)return!1;if(!(t instanceof Array))if(void 0===i||!0===i){if(!Craft.compare(Craft.getObjectKeys(t).sort(),Craft.getObjectKeys(e).sort()))return!1}else if(!Craft.compare(Craft.getObjectKeys(t),Craft.getObjectKeys(e)))return!1;for(var s in t)if(t.hasOwnProperty(s)&&!Craft.compare(t[s],e[s]))return!1;return!0}return t===e},getObjectKeys:function(t){var e=[];for(var i in t)t.hasOwnProperty(i)&&e.push(i);return e},escapeChars:function(t){Garnish.isArray(t)||(t=t.split());for(var e="",i=0;i<t.length;i++)e+="\\"+t[i];return e},ltrim:function(t,e){if(!t)return t;void 0===e&&(e=" \t\n\r\0\v");var i=new RegExp("^["+Craft.escapeChars(e)+"]+");return t.replace(i,"")},rtrim:function(t,e){if(!t)return t;void 0===e&&(e=" \t\n\r\0\v");var i=new RegExp("["+Craft.escapeChars(e)+"]+$");return t.replace(i,"")},trim:function(t,e){return t=Craft.ltrim(t,e),Craft.rtrim(t,e)},startsWith:function(t,e){return t.substring(0,e.length)===e},filterArray:function(t,e){for(var i=[],s=0;s<t.length;s++)("function"==typeof e?e(t[s],s):t[s])&&i.push(t[s]);return i},inArray:function(t,e){return $.isPlainObject(e)&&(e=Object.values(e)),e.includes(t)},removeFromArray:function(t,e){var i=$.inArray(t,e);return-1!==i&&(e.splice(i,1),!0)},getLast:function(t){return t.length?t[t.length-1]:null},uppercaseFirst:function(t){return t.charAt(0).toUpperCase()+t.slice(1)},lowercaseFirst:function(t){return t.charAt(0).toLowerCase()+t.slice(1)},parseUrl:function(t){var e=t.match(/^(?:(https?):\/\/|\/\/)([^\/\:]*)(?:\:(\d+))?(\/[^\?]*)?(?:\?([^#]*))?(#.*)?/);return e?{scheme:e[1],host:e[2]+(e[3]?":"+e[3]:""),hostname:e[2],port:e[3]||null,path:e[4]||"/",query:e[5]||null,hash:e[6]||null}:{}},getQueryParams:function(){return Object.fromEntries(new URLSearchParams(window.location.search).entries())},getQueryParam:function(t){return new Proxy(new URLSearchParams(window.location.search),{get:function(t,e){return t.get(e)}})[t]},isSameHost:function(t){var e=this.parseUrl(document.location.href);if(!e)return!1;var i=this.parseUrl(t);return!!i&&e.host===i.host},secondsToHumanTimeDuration:function(t,e){void 0===e&&(e=!0);var i=604800,s=Math.floor(t/i);t%=i;var a=Math.floor(t/86400);t%=86400;var n,r=Math.floor(t/3600);t%=3600,e?(n=Math.floor(t/60),t%=60):(n=Math.round(t/60),t=0);var o=[];return s&&o.push(s+" "+(1===s?Craft.t("app","week"):Craft.t("app","weeks"))),a&&o.push(a+" "+(1===a?Craft.t("app","day"):Craft.t("app","days"))),r&&o.push(r+" "+(1===r?Craft.t("app","hour"):Craft.t("app","hours"))),!n&&(e||s||a||r)||o.push(n+" "+(1===n?Craft.t("app","minute"):Craft.t("app","minutes"))),!t&&(!e||s||a||r||n)||o.push(t+" "+(1===t?Craft.t("app","second"):Craft.t("app","seconds"))),o.join(", ")},asciiString:function(t,e){t=t.normalize("NFC");for(var i,s="",a=0;a<t.length;a++)i=t.charAt(a),s+="string"==typeof(e||Craft.asciiCharMap)[i]?(e||Craft.asciiCharMap)[i]:i;return s},uuid:function(){return"function"==typeof crypto.randomUUID?crypto.randomUUID():([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,(function(t){return(t^crypto.getRandomValues(new Uint8Array(1))[0]&15>>t/4).toString(16)}))},namespaceInputName:function(t,e){return e?t.replace(/([^'"\[\]]+)([^'"]*)/,"".concat(e,"[$1]$2")):t},namespaceId:function(t,e){return Craft.formatInputId(e?"".concat(e,"-").concat(t):t)},randomString:function(t){for(var e="",i=0;i<t;i++)e+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".charAt(Math.floor(62*Math.random()));return e},createErrorList:function(t){for(var e=$(document.createElement("ul")).addClass("errors"),i=0;i<t.length;i++){var s=$(document.createElement("li"));s.appendTo(e),s.html(t[i])}return e},appendHeadHtml:function(t){if(t){var e=$("link[href]");if(e.length){for(var i,s=[],a=0;a<e.length;a++)i=e.eq(a).attr("href").replace(/&/g,"&"),s.push(Craft.escapeRegex(i));var n=new RegExp('<link\\s[^>]*href="(?:'+s.join("|")+')".*?></link>',"g");t=t.replace(n,"")}$("head").append(t)}},appendBodyHtml:function(t){if(t){var e=$("script[src]");if(e.length){for(var i,s=[],a=0;a<e.length;a++)i=e.eq(a).attr("src").replace(/&/g,"&"),s.push(Craft.escapeRegex(i));var n=new RegExp('<script\\s[^>]*src="(?:'+s.join("|")+')".*?><\/script>',"g");t=t.replace(n,"")}Garnish.$bod.append(t)}},appendFootHtml:function(t){console.warn("Craft.appendFootHtml() is deprecated. Craft.appendBodyHtml() should be used instead."),this.appendBodyHtml(t)},initUiElements:function(t){$(".grid",t).grid(),$(".info",t).infoicon(),$(".checkbox-select",t).checkboxselect(),$(".fieldtoggle",t).fieldtoggle(),$(".lightswitch",t).lightswitch(),$(".nicetext",t).nicetext(),$(".formsubmit",t).formsubmit(),$(".menubtn:not([data-disclosure-trigger])",t).menubtn(),$("[data-disclosure-trigger]",t).disclosureMenu(),$(".datetimewrapper",t).datetime(),$('.datewrapper > input[type="date"], .timewrapper > input[type="time"]',t).datetimeinput(),$("a",t).each((function(){this.hostname.length&&this.hostname!==location.hostname&&void 0===$(this).attr("target")&&$(this).attr("rel","noopener").attr("target","_blank")}))},_elementIndexClasses:{},_elementSelectorModalClasses:{},_elementEditorClasses:{},registerElementIndexClass:function(t,e){if(void 0!==this._elementIndexClasses[t])throw"An element index class has already been registered for the element type “"+t+"”.";this._elementIndexClasses[t]=e},registerElementSelectorModalClass:function(t,e){if(void 0!==this._elementSelectorModalClasses[t])throw"An element selector modal class has already been registered for the element type “"+t+"”.";this._elementSelectorModalClasses[t]=e},registerElementEditorClass:function(t,e){if(void 0!==this._elementEditorClasses[t])throw"An element editor class has already been registered for the element type “"+t+"”.";this._elementEditorClasses[t]=e},createElementIndex:function(t,e,i){return new(void 0!==this._elementIndexClasses[t]?this._elementIndexClasses[t]:Craft.BaseElementIndex)(t,e,i)},createElementSelectorModal:function(t,e){return new(void 0!==this._elementSelectorModalClasses[t]?this._elementSelectorModalClasses[t]:Craft.BaseElementSelectorModal)(t,e)},createElementEditor:function(t,e,i){return void 0===i&&$.isPlainObject(e)?(i=e,e=null):"object"!==n(i)&&(i={}),i.elementType||(i.elementType=t),new Craft.ElementEditorSlideout(e,i)},getLocalStorage:function(t,e){return t="Craft-"+Craft.systemUid+"."+t,"undefined"!=typeof localStorage&&void 0!==localStorage[t]?JSON.parse(localStorage[t]):e},setLocalStorage:function(t,e){if("undefined"!=typeof localStorage){t="Craft-"+Craft.systemUid+"."+t;try{localStorage[t]=JSON.stringify(e)}catch(t){}}},removeLocalStorage:function(t){"undefined"!=typeof localStorage&&localStorage.removeItem("Craft-".concat(Craft.systemUid,".").concat(t))},getCookie:function(t){return document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)Craft-".concat(Craft.systemUid,":").concat(t,"\\s*\\=\\s*([^;]*).*$)|^.*$")),"$1")},setCookie:function(t,e,i){i=$.extend({},this.defaultCookieOptions,i);var s="Craft-".concat(Craft.systemUid,":").concat(t,"=").concat(encodeURIComponent(e));i.path&&(s+=";path=".concat(i.path)),i.domain&&(s+=";domain=".concat(i.domain)),i.maxAge?s+=";max-age-in-seconds=".concat(i.maxAge):i.expires&&(s+=";expires=".concat(i.expires.toUTCString())),i.secure&&(s+=";secure"),document.cookie=s},removeCookie:function(t){this.setCookie(t,"",new Date("1970-01-01T00:00:00"))},getElementInfo:function(t){var e=$(t);return e.hasClass("element")||(e=e.find(".element:first")),{id:e.data("id"),siteId:e.data("site-id"),label:e.data("label"),status:e.data("status"),url:e.data("url"),hasThumb:e.hasClass("hasthumb"),$element:e}},setElementSize:function(t,e){var i=$(t);if("small"!==e&&"large"!==e&&(e="small"),!i.hasClass(e)){var s="small"===e?"large":"small";if(i.addClass(e).removeClass(s),i.hasClass("hasthumb")){var a=i.find("> .elementthumb > img"),n=$("<img/>",{sizes:("small"===e?"30":"100")+"px",srcset:a.attr("srcset")||a.attr("data-pfsrcset")});a.replaceWith(n),picturefill({elements:[n[0]]})}}},submitForm:function(t,e){if(void 0===e&&(e={}),!e.confirm||confirm(e.confirm)){if(e.action&&$("<input/>",{type:"hidden",name:"action",val:e.action}).appendTo(t),e.redirect&&$("<input/>",{type:"hidden",name:"redirect",val:e.redirect}).appendTo(t),e.params)for(var i in e.params){var s=e.params[i];$("<input/>",{type:"hidden",name:i,val:s}).appendTo(t)}e.retainScroll&&this.setLocalStorage("scrollY",window.scrollY),t.trigger($.extend({type:"submit"},e.data))}},trapFocusWithin:function(t){Garnish.trapFocusWithin(t)},setFocusWithin:function(t){Garnish.setFocusWithin(t)},filterInputVal:function(t,e){for(var i=$(t),s=i.val(),a=i[0].selectionStart,n="",r=0;r<s.length;r++)s[r].match(e)?n+=s[r]:r<a&&a--;n!==s&&(i.val(n),i[0].setSelectionRange(a,a))},filterNumberInputVal:function(t){this.filterInputVal(t,/[0-9.,\-]/)},setElementAttributes:function(e,i){var s=$(e);for(var a in i)if(i.hasOwnProperty(a)){var n=i[a];if(null===n||!1===n)s.removeAttr(a);else if(!0===n)s.attr(a,"");else if($.isArray(n)||$.isPlainObject(n))if(Craft.dataAttributes.includes(a)){for(var r in n=Object.assign({},n))if(n.hasOwnProperty(r)){var o=n[r];null!==o&&!1!==o&&(o=$.isPlainObject(o)||$.isArray(o)?JSON.stringify(o):!0===o?"":this.escapeHtml(o),s.attr("".concat(a,"-").concat(r),o))}}else if("class"===a){$.isPlainObject(n)&&(n=Object.values(n));var l,h=t(n);try{for(h.s();!(l=h.n()).done;){var d=l.value;s.addClass(d)}}catch(t){h.e(t)}finally{h.f()}}else"style"===a?s.css(n):s.attr(a,JSON.stringify(n));else s.attr(a,this.escapeHtml(n))}},isVisible:function(){return void 0===document.visibilityState||"visible"===document.visibilityState},useMobileStyles:function(){return Garnish.isMobileBrowser()||document.body.clientWidth<600}}),Craft.pageId=Craft.uuid(),"undefined"!=typeof BroadcastChannel){var o="CraftCMS:".concat(Craft.appId);Craft.broadcaster=new BroadcastChannel(o),Craft.messageReceiver=new BroadcastChannel(o),Craft.messageReceiver.addEventListener("message",(function(e){if("saveElement"===e.data.event){var i=$('div.element[data-id="'.concat(e.data.id,'"][data-settings]'));if(!i.length)return;for(var s={type:i.data("type"),id:e.data.id,instances:[]},a=0;a<i.length;a++){var n=i.eq(a);s.instances.push(Object.assign({siteId:n.data("site-id")},n.data("settings")))}Craft.sendActionRequest("POST","app/render-element",{data:s}).then((function(e){for(var s=e.data,a=0;a<i.length;a++){var n=i.eq(a);if(s.elementHtml[a]){var r,o=$(s.elementHtml[a]),l=t(o[0].attributes);try{for(l.s();!(r=l.n()).done;){var h=r.value;"class"===h.name?n.addClass(h.value):n.attr(h.name,h.value)}}catch(t){l.e(t)}finally{l.f()}var d=n.find("input,button").detach();n.html(o.html()),d.length&&d.prependTo(n)}}(new Craft.ElementThumbLoader).load(i)}))}}))}$.extend($.fn,{animateLeft:function(t,e,i,s){return"ltr"===Craft.orientation?this.velocity({left:t},e,i,s):this.velocity({right:t},e,i,s)},animateRight:function(t,e,i,s){return"ltr"===Craft.orientation?this.velocity({right:t},e,i,s):this.velocity({left:t},e,i,s)},disable:function(){return this.each((function(){var t=$(this);t.addClass("disabled"),t.data("activatable")&&t.removeAttr("tabindex")}))},enable:function(){return this.each((function(){var t=$(this);t.removeClass("disabled"),t.data("activatable")&&t.attr("tabindex","0")}))},grid:function(){return this.each((function(){var t=$(this),e={};t.data("item-selector")&&(e.itemSelector=t.data("item-selector")),t.data("cols")&&(e.cols=parseInt(t.data("cols"))),t.data("max-cols")&&(e.maxCols=parseInt(t.data("max-cols"))),t.data("min-col-width")&&(e.minColWidth=parseInt(t.data("min-col-width"))),t.data("mode")&&(e.mode=t.data("mode")),t.data("fill-mode")&&(e.fillMode=t.data("fill-mode")),t.data("col-class")&&(e.colClass=t.data("col-class")),t.data("snap-to-grid")&&(e.snapToGrid=!!t.data("snap-to-grid")),new Craft.Grid(this,e)}))},infoicon:function(){return this.each((function(){new Craft.InfoIcon(this)}))},checkboxselect:function(){return this.each((function(){$.data(this,"checkboxselect")||new Garnish.CheckboxSelect(this)}))},fieldtoggle:function(){return this.each((function(){$.data(this,"fieldtoggle")||new Craft.FieldToggle(this)}))},lightswitch:function(t,e,i){return"settings"===t?("string"==typeof e?(t={})[e]=i:t=e,this.each((function(){var e=$.data(this,"lightswitch");e&&e.setSettings(t)}))):($.isPlainObject(t)||(t={}),this.each((function(){var e=$.extend({},t);Garnish.hasAttr(this,"data-value")&&(e.value=$(this).attr("data-value")),Garnish.hasAttr(this,"data-indeterminate-value")&&(e.indeterminateValue=$(this).attr("data-indeterminate-value")),$.data(this,"lightswitch")||new Craft.LightSwitch(this,e)})))},nicetext:function(){return this.each((function(){$.data(this,"nicetext")||new Garnish.NiceText(this)}))},formsubmit:function(){return this.on("click",(function(t){var e=$(t.currentTarget),i=e.data("params")||{};e.data("param")&&(i[e.data("param")]=e.data("value"));var s=e.data("menu")?e.data("menu").$anchor:e,a=s.attr("data-form")?$("#"+s.attr("data-form")):s.closest("form");Craft.submitForm(a,{confirm:e.data("confirm"),action:e.data("action"),redirect:e.data("redirect"),params:i,data:$.extend({customTrigger:e},e.data("event-data"))})}))},menubtn:function(){return this.each((function(){var t=$(this);if(!t.data("menubtn")&&t.next().hasClass("menu")){var e={};t.data("menu-anchor")&&(e.menuAnchor=t.data("menu-anchor")),new Garnish.MenuBtn(t,e)}}))},disclosureMenu:function(){return this.each((function(){var t=$(this);!t.data("trigger")&&t.attr("aria-controls")&&new Garnish.DisclosureMenu(t)}))},datetime:function(){return this.each((function(){var t=$(this),e=t.find('input:not([name$="[timezone]"])'),i=function(){for(var i=!1,s=0;s<e.length;s++)if(e.eq(s).val()){i=!0;break}if(i){if(!t.children(".clear-btn").length)var a=$("<button/>",{type:"button",class:"clear-btn",title:Craft.t("app","Clear"),"aria-label":Craft.t("app","Clear")}).appendTo(t).on("click",(function(){for(var t=0;t<e.length;t++)e.eq(t).val("").trigger("input").trigger("change");a.remove(),e.first().filter('[type="text"]').focus()}))}else t.children(".clear-btn").remove()};e.on("change",i),i()}))},datetimeinput:function(){return this.each((function(){var t=$(this),e=function(){""===t.val()?t.addClass("empty-value"):t.removeClass("empty-value")};t.on("input",e),e()}))}}),Garnish.NiceText.charsLeftHtml=function(t){return Craft.t("app",'<span class="visually-hidden">Characters left:</span> {chars, number}',{chars:t})},Garnish.$doc.ready((function(){Craft.initUiElements()}))},691:function(){function t(t){return function(t){if(Array.isArray(t))return s(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||i(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function e(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(t,e)||i(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function i(t,e){if(t){if("string"==typeof t)return s(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?s(t,e):void 0}}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.CustomizeSourcesModal=Garnish.Modal.extend({elementIndex:null,$elementIndexSourcesContainer:null,$sidebar:null,$sidebarToggleBtn:null,$sourcesContainer:null,$sourcesHeader:null,$sourcesHeading:null,$sourceSettingsContainer:null,$sourceSettingsHeader:null,$addSourceMenu:null,addSourceMenu:null,$footer:null,$footerBtnContainer:null,$saveBtn:null,$cancelBtn:null,$loadingSpinner:null,sourceSort:null,sources:null,selectedSource:null,elementTypeName:null,baseSortOptions:null,availableTableAttributes:null,customFieldAttributes:null,conditionBuilderHtml:null,conditionBuilderJs:null,userGroups:null,init:function(t,e){var i=this;this.base(),this.setSettings(e,{resizable:!0}),this.elementIndex=t,this.$elementIndexSourcesContainer=this.elementIndex.$sidebar.children("nav").children("ul");var s=$('<form class="modal customize-sources-modal"/>').appendTo(Garnish.$bod);this.$sidebar=$('<div class="cs-sidebar block-types"/>').appendTo(s).attr({role:"navigation","aria-label":Craft.t("app","Source")}),this.$sourcesContainer=$('<div class="sources">').appendTo(this.$sidebar),this.$sourceSettingsContainer=$('<div class="source-settings">').appendTo(s),this.$footer=$('<div class="footer"/>').appendTo(s),this.$footerBtnContainer=$('<div class="buttons right"/>').appendTo(this.$footer),this.$cancelBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(this.$footerBtnContainer),this.$saveBtn=Craft.ui.createSubmitButton({class:"disabled",label:Craft.t("app","Save"),spinner:!0}).appendTo(this.$footerBtnContainer),this.$loadingSpinner=$('<div class="spinner"/>').appendTo(this.$sourceSettingsContainer),this.setContainer(s),this.show(),Craft.sendActionRequest("POST","element-index-settings/get-customize-sources-modal-data",{data:{elementType:this.elementIndex.elementType}}).then((function(t){i.$saveBtn.removeClass("disabled"),i.buildModal(t.data)})).finally((function(){i.$loadingSpinner.remove(),Garnish.setFocusWithin(i.$sidebar)})),this.addListener(this.$cancelBtn,"click","hide"),this.addListener(this.$saveBtn,"click","save"),this.addListener(this.$container,"submit","save")},buildModal:function(t){var e=this;this.baseSortOptions=t.baseSortOptions,this.defaultSortOptions=t.defaultSortOptions,this.availableTableAttributes=t.availableTableAttributes,this.customFieldAttributes=t.customFieldAttributes,this.elementTypeName=t.elementTypeName,this.conditionBuilderHtml=t.conditionBuilderHtml,this.conditionBuilderJs=t.conditionBuilderJs,this.userGroups=t.userGroups,t.headHtml&&Craft.appendHeadHtml(t.headHtml),t.bodyHtml&&Craft.appendBodyHtml(t.bodyHtml),this.sourceSort=new Garnish.DragSort({handle:".move",axis:"y"}),this.sources=[];for(var i=0;i<t.sources.length;i++)this.sources.push(this.addSource(t.sources[i]));this.selectedSource||void 0===this.sources[0]||this.sources[0].select();var s=$('<div class="buttons left" data-wrapper/>').appendTo(this.$footer),a=$("<button/>",{type:"button",class:"btn menubtn add icon","aria-label":Craft.t("app","Add…"),"aria-controls":"add-source-menu",title:Craft.t("app","Add…"),"data-disclosure-trigger":""}).appendTo(s);this.$addSourceMenu=$("<div/>",{id:"add-source-menu",class:"menu menu--disclosure"}).appendTo(s);var n=function(t){var i=e.addSource(t,!0);Garnish.scrollContainerToElement(e.$sidebar,i.$item),i.select(),e.addSourceMenu.hide()},r=$("<button/>",{type:"button",class:"menu-option",text:Craft.t("app","New heading")}).on("click",(function(){n({type:"heading"}),e.focusLabelInput()})),o=$("<button/>",{type:"button",class:"menu-option",text:Craft.t("app","New custom source"),"data-type":"custom"}).on("click",(function(){var t=e.baseSortOptions.slice(0);t.push(e.defaultSortOptions),n({type:"custom",key:"custom:".concat(Craft.uuid()),sortOptions:t,defaultSort:[t[0].attr,t[1].defaultDir],tableAttributes:[],availableTableAttributes:[]}),e.focusLabelInput()})),l=$("<ul/>").append($("<li/>").append(r)).appendTo(this.$addSourceMenu);t.conditionBuilderHtml&&$("<li/>").append(o).appendTo(l),Craft.useMobileStyles()&&this.buildSidebarToggleView(),this.addListener(Garnish.$win,"resize",this.updateSidebarView),this.addSourceMenu=new Garnish.DisclosureMenu(a)},focusLabelInput:function(){this.selectedSource.$labelInput.trigger("focus")},getSourceName:function(){return this.selectedSource?this.selectedSource.sourceData.label:this.sources[0].sourceData.label},updateSidebarView:function(){Craft.useMobileStyles()?this.$sidebarToggleBtn||this.buildSidebarToggleView():this.$sidebarToggleBtn&&this.resetView()},resetView:function(){this.$sourceSettingsHeader&&this.$sourceSettingsHeader.remove(),this.$sourcesHeader&&this.$sourcesHeader.remove(),this.$sidebarToggleBtn=null,this.$container.removeClass("sidebar-hidden")},updateHeading:function(){this.$sourcesHeading&&this.$sourcesHeading.text(this.getSourceName())},buildSidebarToggleView:function(){var t=this;this.$sourcesHeader=$('<div class="sources-header"/>').addClass("sidebar-header").prependTo(this.$sourcesContainer),this.$sidebarCloseBtn=Craft.ui.createButton({class:"nav-close close-btn"}).attr("aria-label",Craft.t("app","Close")).removeClass("btn").appendTo(this.$sourcesHeader),this.$sourcesHeading=$('<h1 class="main-heading"/>').text(this.getSourceName()),this.$sourceSettingsHeader=$('<div class="source-settings-header"/>').addClass("main-header").append(this.$sourcesHeading).prependTo(this.$sourceSettingsContainer),this.$sidebarToggleBtn=Craft.ui.createButton({toggle:!0,controls:"modal-sidebar",class:"nav-toggle"}).removeClass("btn").attr("aria-label",Craft.t("app","Show sidebar")).appendTo(this.$sourceSettingsHeader),this.closeSidebar(),this.addListener(this.$sidebarToggleBtn,"click",(function(){t.toggleSidebar()})),this.addListener(this.$sidebarCloseBtn,"click",(function(){t.toggleSidebar(),t.$sidebarToggleBtn.trigger("focus")}))},toggleSidebar:function(){this.sidebarIsOpen()?this.closeSidebar():this.openSidebar()},openSidebar:function(){var t=this;this.$container.removeClass("sidebar-hidden"),this.$sidebarToggleBtn.attr("aria-expanded","true"),this.$sidebar.find(":focusable").first().focus(),Garnish.uiLayerManager.addLayer(this.$sidebar),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.closeSidebar(),Garnish.focusIsInside(t.$sidebar)&&t.$sidebarToggleBtn.focus()}))},closeSidebar:function(){this.$container.addClass("sidebar-hidden"),this.$sidebarToggleBtn&&this.$sidebarToggleBtn.attr("aria-expanded","false"),Garnish.uiLayerManager.currentLayer.$container.hasClass("cs-sidebar")&&Garnish.uiLayerManager.removeLayer()},sidebarIsOpen:function(){return"true"===this.$sidebarToggleBtn.attr("aria-expanded")},addSource:function(t,e){var i,s=$('<div class="customize-sources-item"/>').appendTo(this.$sourcesContainer),a=$('<div class="label customize-sources-item__btn"/>').attr({tabindex:"0",role:"button"}).appendTo(s),n=$('<input type="hidden"/>').appendTo(s);return $('<a class="move icon customize-sources-item__move" title="'.concat(Craft.t("app","Reorder"),'" role="button"></a>')).appendTo(s),"heading"===t.type?(s.addClass("heading"),n.attr("name","sourceOrder[][heading]"),(i=new Craft.CustomizeSourcesModal.Heading(this,s,a,n,t,e)).updateItemLabel(t.heading)):(n.attr("name","sourceOrder[][key]").val(t.key),(i="native"===t.type?new Craft.CustomizeSourcesModal.Source(this,s,a,n,t,e):new Craft.CustomizeSourcesModal.CustomSource(this,s,a,n,t,e)).updateItemLabel(t.label),t.key===this.elementIndex.rootSourceKey&&i.select()),this.sourceSort.addItems(s),i},save:function(t){var e=this;t&&t.preventDefault(),this.$saveBtn.hasClass("disabled")||this.$saveBtn.hasClass("loading")||(this.$saveBtn.addClass("loading"),Craft.sendActionRequest("POST","element-index-settings/save-customize-sources-modal-settings",{data:this.$container.serialize()+"&elementType=".concat(this.elementIndex.elementType)}).then((function(t){var i=t.data,s=null;e.selectedSource&&e.selectedSource.sourceData.key&&!i.disabledSourceKeys.includes(e.selectedSource.sourceData.key)?s=e.selectedSource.sourceData.key:e.elementIndex.sourceKey||(s=e.elementIndex.$visibleSources.first().data("key")),s&&e.elementIndex.selectSourceByKey(s),window.location.reload()})).catch((function(){Craft.cp.displayError(Craft.t("app","A server error occurred."))})).finally((function(){e.$saveBtn.removeClass("loading")})))},appendIndexSourceItem:function(t,e){if(e){var i=t.hasClass("heading");if(e.hasClass("heading")&&!i)t.appendTo(e.children("ul"));else{if(i){var s=e.parentsUntil(this.$elementIndexSourcesContainer,"li").last();s.length&&(e=s)}t.insertAfter(e)}}else t.prependTo(this.$elementIndexSourcesContainer)},destroy:function(){for(var t=0;t<this.sources.length;t++)this.sources[t].destroy();this.addSourceMenu&&(this.addSourceMenu.destroy(),this.$addSourceMenu.remove()),delete this.sources,this.base()}}),Craft.CustomizeSourcesModal.BaseSource=Garnish.Base.extend({modal:null,$item:null,$itemLabel:null,$itemInput:null,$settingsContainer:null,sourceData:null,isNew:null,init:function(t,e,i,s,a,n){var r=this;this.modal=t,this.$item=e,this.$itemLabel=i,this.$itemInput=s,this.sourceData=a,this.isNew=n,this.$item.data("source",this),this.addListener(this.$itemLabel,"click","select"),this.addListener(this.$itemLabel,"keypress",(function(t){return Garnish.handleActivatingKeypress(t,r.select.bind(r))}))},isHeading:function(){return!1},isNative:function(){return!1},isSelected:function(){return this.modal.selectedSource===this},select:function(){this.isSelected()||(this.modal.selectedSource&&this.modal.selectedSource.deselect(),this.$item.addClass("sel"),this.$itemLabel.attr({"aria-current":"true"}),this.modal.selectedSource=this,this.modal.updateHeading(),this.$settingsContainer?this.$settingsContainer.removeClass("hidden"):(this.$settingsContainer=$("<div/>").appendTo(this.modal.$sourceSettingsContainer),this.createSettings(this.$settingsContainer)),this.modal.$sourceSettingsContainer.scrollTop(0))},createSettings:function(){},getIndexSourceItem:function(){},deselect:function(){this.$item.removeClass("sel"),this.$itemLabel.attr({"aria-current":"false"}),this.modal.selectedSource=null,this.$settingsContainer.addClass("hidden")},updateItemLabel:function(t){t?this.$itemLabel.text(t):this.$itemLabel.html(" ")},destroy:function(){this.modal.sourceSort.removeItems(this.$item),this.modal.sources.splice($.inArray(this,this.modal.sources),1),this.isSelected()&&(this.deselect(),this.modal.sources.length&&this.modal.sources[0].select(),Garnish.setFocusWithin(this.modal.$sourceSettingsContainer)),this.$item.data("source",null),this.$item.remove(),this.$settingsContainer&&this.$settingsContainer.remove(),this.base()}}),Craft.CustomizeSourcesModal.Source=Craft.CustomizeSourcesModal.BaseSource.extend({$sortAttributeSelect:null,$sortDirectionPicker:null,$sortDirectionInput:null,sortDirectionListbox:null,isNative:function(){return!0},createSettings:function(t){Craft.ui.createLightswitchField({label:Craft.t("app","Enabled"),name:"sources[".concat(this.sourceData.key,"][enabled]"),on:!this.sourceData.disabled}).appendTo(t),this.createSortField(t),this.createTableAttributesField(t)},createSortField:function(t){var e=this,i=$('<div class="flex"/>'),s=Craft.ui.createSelect({name:"sources[".concat(this.sourceData.key,"][defaultSort][0]"),options:this.sourceData.sortOptions.map((function(t){return{label:t.label,value:t.attr}})),value:this.sourceData.defaultSort[0]}).addClass("fullwidth").appendTo($("<div/>").appendTo(i));this.$sortAttributeSelect=s.children("select").attr("aria-label",Craft.t("app","Sort attribute")),this.$sortDirectionPicker=$("<section/>",{class:"btngroup btngroup--exclusive","aria-label":Craft.t("app","Sort direction")}).append($("<button/>",{type:"button",class:"btn",title:Craft.t("app","Sort ascending"),"aria-label":Craft.t("app","Sort ascending"),"aria-pressed":"false","data-icon":"asc","data-dir":"asc"})).append($("<button/>",{type:"button",class:"btn",title:Craft.t("app","Sort descending"),"aria-label":Craft.t("app","Sort descending"),"aria-pressed":"false","data-icon":"desc","data-dir":"desc"})).appendTo(i),this.$sortDirectionInput=$("<input/>",{type:"hidden",name:"sources[".concat(this.sourceData.key,"][defaultSort][1]")}).appendTo(i),this.sortDirectionListbox=new Craft.Listbox(this.$sortDirectionPicker,{onChange:function(t){e.$sortDirectionInput.val(t.data("dir"))}}),this.$sortAttributeSelect.on("change",(function(){e.handleSortAttributeChange()})),this.handleSortAttributeChange(!0),Craft.ui.createField(i,{label:Craft.t("app","Default Sort"),fieldset:!0}).appendTo(t).addClass("sort-field")},handleSortAttributeChange:function(t){var e=this.$sortAttributeSelect.val();if("structure"===e)this.sortDirectionListbox.select(0),this.sortDirectionListbox.disable(),this.$sortDirectionPicker.addClass("disabled");else{this.sortDirectionListbox.enable(),this.$sortDirectionPicker.removeClass("disabled");var i=t?this.sourceData.defaultSort[1]:this.sourceData.sortOptions.find((function(t){return t.attr===e})).defaultDir;this.sortDirectionListbox.select("asc"===i?0:1)}},createTableAttributesField:function(t){var i=this.availableTableAttributes();if(this.sourceData.tableAttributes.length||i.length){var s=$("<div/>"),a=[];$('<input type="hidden" name="sources['.concat(this.sourceData.key,'][tableAttributes][]" value=""/>')).appendTo(s);for(var n=0;n<this.sourceData.tableAttributes.length;n++){var r=e(this.sourceData.tableAttributes[n],2),o=r[0],l=r[1];s.append(this.createTableColumnOption(o,l,!0)),a.push(o)}for(var h=0;h<i.length;h++){var d=e(i[h],2),c=d[0],u=d[1];Craft.inArray(c,a)||s.append(this.createTableColumnOption(c,u,!1))}new Garnish.DragSort(s.children(),{handle:".move",axis:"y"}),Craft.ui.createField(s,{label:Craft.t("app","Default Table Columns"),instructions:Craft.t("app","Choose which table columns should be visible for this source by default.")}).appendTo(t)}},availableTableAttributes:function(){var e=this.modal.availableTableAttributes.slice(0);return e.push.apply(e,t(this.sourceData.availableTableAttributes)),e},createTableColumnOption:function(t,e,i){return $('<div class="customize-sources-table-column"/>').append('<div class="icon move"/>').append(Craft.ui.createCheckbox({label:Craft.escapeHtml(e),name:"sources[".concat(this.sourceData.key,"][tableAttributes][]"),value:t,checked:i}))},getIndexSourceItem:function(){var t=this.modal.elementIndex.getSourceByKey(this.sourceData.key);if(t)return t.closest("li")}}),Craft.CustomizeSourcesModal.CustomSource=Craft.CustomizeSourcesModal.Source.extend({$labelInput:null,createSettings:function(t){var e=this,i=Craft.ui.createTextField({label:Craft.t("app","Label"),name:"sources[".concat(this.sourceData.key,"][label]"),value:this.sourceData.label}).appendTo(t);this.$labelInput=i.find(".text");var s="condition".concat(Math.floor(1e6*Math.random())),a=function(t){return t.replace(/__ID__/g,s).replace(/__SOURCE_KEY__(?=-)/g,Craft.formatInputId(e.sourceData.key)).replace(/__SOURCE_KEY__/g,e.sourceData.key)},n=this.sourceData.conditionBuilderHtml||a(this.modal.conditionBuilderHtml),r=this.sourceData.conditionBuilderJs||a(this.modal.conditionBuilderJs);Craft.ui.createField($("<div/>").append(n),{id:"criteria",label:Craft.t("app","{type} Criteria",{type:this.modal.elementTypeName})}).appendTo(t),Craft.appendBodyHtml(r),this.createSortField(t),this.createTableAttributesField(t),this.modal.userGroups.length&&Craft.ui.createCheckboxSelectField({label:Craft.t("app","User Groups"),instructions:Craft.t("app","Choose which user groups should have access to this source."),name:"sources[".concat(this.sourceData.key,"][userGroups]"),options:this.modal.userGroups,values:this.sourceData.userGroups||"*",showAllOption:!0}).appendTo(t),t.append("<hr/>"),this.$deleteBtn=$('<a class="error delete"/>').attr({role:"button",tabindex:"0"}).text(Craft.t("app","Delete custom source")).appendTo(t),this.addListener(this.$labelInput,"input","handleLabelInputChange"),this.addListener(this.$deleteBtn,"click","destroy"),this.addListener(this.$deleteBtn,"keypress",(function(t){Garnish.handleActivatingKeypress(t,e.destroy.bind(e))}))},availableTableAttributes:function(){var e=this.base();return this.isNew&&e.push.apply(e,t(this.modal.customFieldAttributes)),e},handleLabelInputChange:function(){this.updateItemLabel(this.$labelInput.val())},getIndexSourceItem:function(){var t,e=this.base();if(e?t=e.find(".label"):(t=$("<span/>",{class:"label"}),e=$("<li/>").append($("<a/>",{"data-key":this.sourceData.key}).append(t))),this.$labelInput){var i=Craft.trim(this.$labelInput.val());""===i&&(i=Craft.t("app","(blank)")),t.text(i)}return e}}),Craft.CustomizeSourcesModal.Heading=Craft.CustomizeSourcesModal.BaseSource.extend({$labelInput:null,$deleteBtn:null,isHeading:function(){return!0},createSettings:function(t){var e=this,i=Craft.ui.createTextField({label:Craft.t("app","Heading"),instructions:Craft.t("app","This can be left blank if you just want an unlabeled separator."),value:this.sourceData.heading||""}).appendTo(t);this.$labelInput=i.find(".text"),t.append("<hr/>"),this.$deleteBtn=$('<a class="error delete"/>').text(Craft.t("app","Delete heading")).attr({role:"button",tabindex:"0"}).appendTo(t),this.addListener(this.$labelInput,"input","handleLabelInputChange"),this.addListener(this.$deleteBtn,"click","destroy"),this.addListener(this.$deleteBtn,"keypress",(function(t){Garnish.handleActivatingKeypress(t,e.destroy.bind(e))}))},handleLabelInputChange:function(){this.updateItemLabel(this.$labelInput.val())},updateItemLabel:function(t){this.$itemLabel.html((t?Craft.escapeHtml(t):"<em>".concat(Craft.t("app","(blank)"),"</em>"))+" "),this.$itemInput.val(t)},getIndexSourceItem:function(){var t=(this.$labelInput?this.$labelInput.val():null)||this.sourceData.heading||"";return $('<li class="heading"/>').append($("<span/>").text(t)).append("<ul/>")}})},1519:function(){Craft.DataTableSorter=Garnish.DragSort.extend({$table:null,init:function(t,e){this.$table=$(t);var i=this.$table.children("tbody").children(":not(.filler)");(e=$.extend({},Craft.DataTableSorter.defaults,e)).container=this.$table.children("tbody"),e.helper=this.getHelper.bind(this),e.caboose="<tr/>",e.axis=Garnish.Y_AXIS,e.magnetStrength=4,e.helperLagBase=1.5,this.base(i,e)},getHelper:function(t){var e=$('<div class="'+this.settings.helperClass+'"/>').appendTo(Garnish.$bod),i=$("<table/>").appendTo(e),s=$("<tbody/>").appendTo(i);t.appendTo(s),i.width(this.$table.width()),i.prop("className",this.$table.prop("className"));for(var a=this.$table.find("tr:first").children(),n=t.children(),r=0;r<n.length;r++)$(n[r]).width($(a[r]).width());return e}},{defaults:{handle:".move",helperClass:"datatablesorthelper"}})},501:function(){Craft.DeleteUserModal=Garnish.Modal.extend({id:null,userId:null,$deleteActionRadios:null,$deleteSubmitBtn:null,userSelect:null,_deleting:!1,init:function(t,e){var i=this;this.id=Math.floor(1e9*Math.random()),this.userId=t,e=$.extend(Craft.DeleteUserModal.defaults,e);var s,a=$('<form class="modal fitted deleteusermodal" method="post" accept-charset="UTF-8">'+Craft.getCsrfInput()+'<input type="hidden" name="action" value="users/delete-user"/>'+(Garnish.isArray(this.userId)?"":'<input type="hidden" name="userId" value="'+this.userId+'"/>')+(e.redirect?'<input type="hidden" name="redirect" value="'+e.redirect+'"/>':"")+"</form>").appendTo(Garnish.$bod),n=$('<div class="body"><div class="content-summary"><p>'+Craft.t("app","What do you want to do with their content?")+'</p><ul class="bullets"></ul></div><div class="options"><label><input type="radio" name="contentAction" value="transfer"/> '+Craft.t("app","Transfer it to:")+'</label><div id="transferselect'+this.id+'" class="elementselect"><div class="elements"></div><button type="button" class="btn add icon dashed">'+Craft.t("app","Choose a user")+'</button></div></div><div><label class="error"><input type="radio" name="contentAction" value="delete"/> '+Craft.t("app","Delete their content")+"</label></div></div>").appendTo(a),r=$('<div class="buttons right"/>').appendTo(n),o=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(r);if(e.contentSummary.length)for(var l=0;l<e.contentSummary.length;l++)n.find("ul").append($("<li/>",{text:e.contentSummary[l]}));else n.find("ul").remove();if(this.$deleteActionRadios=n.find("input[type=radio]"),this.$deleteSubmitBtn=Craft.ui.createSubmitButton({class:"disabled",label:this._submitBtnLabel(!1),spinner:!0}).appendTo(r),Garnish.isArray(this.userId)){s=["and"];for(var h=0;h<this.userId.length;h++)s.push("not "+this.userId[h])}else s="not "+this.userId;this.userSelect=new Craft.BaseElementSelectInput({id:"transferselect"+this.id,name:"transferContentTo",elementType:"craft\\elements\\User",criteria:{id:s},limit:1,modalSettings:{closeOtherModals:!1},onSelectElements:function(){i.updateSizeAndPosition(),i.$deleteActionRadios.first().prop("checked")?i.validateDeleteInputs():i.$deleteActionRadios.first().trigger("click")},onRemoveElements:this.validateDeleteInputs.bind(this),selectable:!1,editable:!1}),this.addListener(o,"click","hide"),this.addListener(this.$deleteActionRadios,"change","validateDeleteInputs"),this.addListener(a,"submit","handleSubmit"),this.base(a,e)},_submitBtnLabel:function(t){var e=t?"Delete {num, plural, =1{user} other{users}} and content":"Delete {num, plural, =1{user} other{users}}";return Craft.t("app",e,{num:Garnish.isArray(this.userId)?this.userId.length:1})},validateDeleteInputs:function(){var t=!1;return this.$deleteActionRadios.eq(1).prop("checked")?(t=!0,this.$deleteSubmitBtn.find(".label").text(this._submitBtnLabel(!0))):(this.$deleteSubmitBtn.find(".label").text(this._submitBtnLabel(!1)),this.$deleteActionRadios.eq(0).prop("checked")&&(t=!!this.userSelect.totalSelected)),this.updateSizeAndPosition(),t?this.$deleteSubmitBtn.removeClass("disabled"):this.$deleteSubmitBtn.addClass("disabled"),t},handleSubmit:function(t){if(!this._deleting&&this.validateDeleteInputs()){this.$deleteSubmitBtn.addClass("loading"),this.disable(),this.userSelect.disable(),this._deleting=!0;try{!1===this.settings.onSubmit()&&t.preventDefault()}catch(e){throw t.preventDefault(),this.$deleteSubmitBtn.removeClass("loading"),e}}else t.preventDefault()},onFadeIn:function(){Garnish.isMobileBrowser(!0)||this.$deleteActionRadios.first().trigger("focus"),this.base()}},{defaults:{contentSummary:[],onSubmit:$.noop,redirect:null}})},2318:function(){Craft.DynamicGenerator=Craft.BaseInputGenerator.extend({callback:$.noop,init:function(t,e,i){this.callback=i,this.base(t,e)},generateTargetValue:function(t){return this.callback(t)}})},4755:function(){Craft.EditableTable=Garnish.Base.extend({initialized:!1,id:null,baseName:null,columns:null,sorter:null,biggestId:-1,$table:null,$tbody:null,$addRowBtn:null,$tableParent:null,$statusMessage:null,rowCount:0,hasMaxRows:!1,hasMinRows:!1,radioCheckboxes:null,init:function(t,e,i,s){var a=this;if(this.id=t,this.baseName=e,this.columns=i,this.setSettings(s,Craft.EditableTable.defaults),this.radioCheckboxes={},this.$table=$("#"+t),this.$tbody=this.$table.children("tbody"),this.$tableParent=this.$table.parent(),this.$statusMessage=this.$tableParent.find("[data-status-message]"),this.rowCount=this.$tbody.find("tr").length,this.$table.data("editable-table")&&(console.warn("Double-instantiating an editable table on an element"),this.$table.data("editable-table").destroy()),this.$table.data("editable-table",this),this.sorter=new Craft.DataTableSorter(this.$table,{helperClass:"editabletablesorthelper",copyDraggeeInputValuesToHelper:!0,onSortChange:function(){a.updateAllRows()}}),this.isVisible()?this.initialize():window.setTimeout(this.initializeIfVisible.bind(this),500),this.settings.minRows&&this.rowCount<this.settings.minRows)for(var n=this.rowCount;n<this.settings.minRows;n++)this.addRow()},isVisible:function(){return this.$table.parent().height()>0},initialize:function(){if(this.initialized)return!1;this.initialized=!0,this.removeListener(Garnish.$win,"resize");for(var t=this.$tbody.children(),e=0;e<t.length;e++)this.createRowObj(t[e]);var i=this.$table.parent(".input");return i.length&&this.$table.width()>i.width()&&i.css("overflow-x","auto"),this.$addRowBtn=this.$table.next(".add"),this.updateAddRowButton(),this.addListener(this.$addRowBtn,"activate","addRow"),!0},initializeIfVisible:function(){this.removeListener(Garnish.$win,"resize"),this.isVisible()?this.initialize():this.addListener(Garnish.$win,"resize","initializeIfVisible")},updateAddRowButton:function(){this.canAddRow()?(this.$addRowBtn.css("opacity","1"),this.$addRowBtn.css("pointer-events","auto"),this.$addRowBtn.attr("aria-disabled","false")):(this.$addRowBtn.css("opacity","0.2"),this.$addRowBtn.css("pointer-events","none"),this.$addRowBtn.attr("aria-disabled","true"))},updateAllRows:function(){if(!this.settings.staticRows)for(var t=this.$table.find("> tbody > tr"),e=0;e<t.length;e++)this.updateRow(t.eq(e))},updateRow:function(t){if(!this.settings.staticRows){var e=t.find("button.delete");e.length&&(e.attr("aria-label",Craft.t("app","Delete row {index}",{index:t.index()+1})),this.canDeleteRow()?e.removeAttr("disabled").removeClass("disabled"):e.attr("disabled","disabled").addClass("disabled"))}},updateDeleteRowButton:function(t){this.updateRow(this.$table.find('tr[data-id="'.concat(t,'"]')))},updateStatusMessage:function(){var t,e=this;this.$statusMessage.empty(),t=this.canAddRow()?Craft.t("app","Row could not be deleted. Minimum number of rows reached."):Craft.t("app","Row could not be added. Maximum number of rows reached."),setTimeout((function(){e.$statusMessage.text(t)}),250)},canDeleteRow:function(){return!!this.settings.allowDelete&&this.rowCount>this.settings.minRows},deleteRow:function(t){this.canDeleteRow()?(this.sorter.removeItems(t.$tr),t.$tr.remove(),this.rowCount--,this.updateAllRows(),this.updateAddRowButton(),0===this.rowCount?(this.$table.addClass("hidden"),this.$addRowBtn.trigger("focus")):this.$tbody.find(":focusable").last().trigger("focus"),this.settings.onDeleteRow(t.$tr),t.destroy()):this.updateStatusMessage()},canAddRow:function(){return!!this.settings.allowAdd&&(!this.settings.maxRows||this.rowCount<this.settings.maxRows)},addRow:function(t,e){if(this.canAddRow()){var i=this.settings.rowIdPrefix+(this.biggestId+1),s=this.createRow(i,this.columns,this.baseName,$.extend({},this.settings.defaultValues));e?s.prependTo(this.$tbody):s.appendTo(this.$tbody);var a=this.createRowObj(s);return this.sorter.addItems(s),!1!==t&&s.find("input:visible,textarea:visible,select:visible").first().trigger("focus"),this.rowCount++,this.updateAllRows(),this.updateAddRowButton(),this.$table.removeClass("hidden"),this.settings.onAddRow(s),a}this.updateStatusMessage()},createRow:function(t,e,i,s){return Craft.EditableTable.createRow(t,e,i,s,this.settings.allowReorder,this.settings.allowDelete)},createRowObj:function(t){return new Craft.EditableTable.Row(this,t)},focusOnPrevRow:function(t,e,i){var s,a=t.prev("tr");if((s=a.length?a.data("editable-table-row"):this.addRow(!1,!0))&&s.$tds[e])if($(s.$tds[e]).hasClass("disabled"))a&&this.focusOnPrevRow(a,e,i);else{var n=$("textarea,input.text",s.$tds[e]);n.length&&($(i).trigger("blur"),n.trigger("focus"))}},focusOnNextRow:function(t,e,i){var s,a=t.next("tr");if((s=a.length?a.data("editable-table-row"):this.addRow(!1))&&s.$tds[e])if($(s.$tds[e]).hasClass("disabled"))a&&this.focusOnNextRow(a,e,i);else{var n=$("textarea,input.text",s.$tds[e]);n.length&&($(i).trigger("blur"),n.trigger("focus"))}},importData:function(t,e,i){for(var s=t.split(/\r?\n|\r/),a=0;a<s.length;a++){for(var n=s[a].split("\t"),r=0;r<n.length;r++){var o=n[r];e.$tds.eq(i+r).find("textarea,input[type!=hidden]").val(o).trigger("input")}var l=e.$tr.next("tr");e=l.length?l.data("editable-table-row"):this.addRow(!1)}},destroy:function(){this.$table.removeData("editable-table"),this.base()}},{textualColTypes:["autosuggest","color","date","email","multiline","number","singleline","template","time","url"],defaults:{rowIdPrefix:"",defaultValues:{},allowAdd:!1,allowReorder:!1,allowDelete:!1,minRows:null,maxRows:null,onAddRow:$.noop,onDeleteRow:$.noop},createRow:function(t,e,i,s,a,n){var r=$("<tr/>",{"data-id":t});for(var o in e)if(e.hasOwnProperty(o)){var l,h=e[o],d=void 0!==s[o]?s[o]:"";if("heading"===h.type)l=$("<th/>",{scope:"row",class:h.class,html:d});else{var c=i+"["+t+"]["+o+"]";switch(l=$("<td/>",{class:"".concat(h.class," ").concat(h.type,"-cell"),width:h.width}),Craft.inArray(h.type,Craft.EditableTable.textualColTypes)&&l.addClass("textual"),h.code&&l.addClass("code"),h.type){case"checkbox":$('<div class="checkbox-wrapper"/>').append(Craft.ui.createCheckbox({name:c,value:h.value||"1",checked:!!d})).appendTo(l);break;case"color":Craft.ui.createColorInput({name:c,value:d,small:!0}).appendTo(l);break;case"date":Craft.ui.createDateInput({name:c,value:d}).appendTo(l);break;case"lightswitch":Craft.ui.createLightswitch({name:c,value:h.value||"1",on:!!d,small:!0}).appendTo(l);break;case"select":Craft.ui.createSelect({name:c,options:h.options,value:d||function(){for(var t in h.options)if(h.options.hasOwnProperty(t)&&h.options[t].default)return void 0!==h.options[t].value?h.options[t].value:t;return null}(),class:"small"}).appendTo(l);break;case"time":Craft.ui.createTimeInput({name:c,value:d}).appendTo(l);break;case"email":case"url":Craft.ui.createTextInput({name:c,value:d,type:h.type,placeholder:h.placeholder||null}).appendTo(l);break;default:$("<textarea/>",{name:c,rows:h.rows||1,val:d,placeholder:h.placeholder}).appendTo(l)}}l.appendTo(r)}return a&&$("<td/>",{class:"thin action"}).append($("<a/>",{class:"move icon",title:Craft.t("app","Reorder"),role:"button",type:"button"})).appendTo(r),n&&$("<td/>",{class:"thin action"}).append($("<button/>",{class:"delete icon",title:Craft.t("app","Delete"),type:"button"})).appendTo(r),r}}),Craft.EditableTable.Row=Garnish.Base.extend({table:null,id:null,niceTexts:null,$tr:null,$tds:null,tds:null,$textareas:null,$deleteBtn:null,init:function(t,e){this.table=t,this.$tr=$(e),this.$tds=this.$tr.children(),this.tds=[],this.id=this.$tr.attr("data-id"),this.$tr.data("editable-table-row",this);var i=parseInt(this.id.substring(this.table.settings.rowIdPrefix.length));i>this.table.biggestId&&(this.table.biggestId=i),this.$textareas=$(),this.niceTexts=[];var s,a,n,r,o,l={},h=0;for(s in this.table.columns)this.table.columns.hasOwnProperty(s)&&(a=this.table.columns[s],n=this.tds[s]=this.$tds[h],Craft.inArray(a.type,Craft.EditableTable.textualColTypes)?(r=$("textarea",n),this.$textareas=this.$textareas.add(r),this.addListener(r,"focus","onTextareaFocus"),this.addListener(r,"mousedown","ignoreNextTextareaFocus"),this.niceTexts.push(new Garnish.NiceText(r,{onHeightChange:this.onTextareaHeightChange.bind(this)})),this.addListener(r,"keypress",{tdIndex:h,type:a.type},"handleKeypress"),this.addListener(r,"input",{type:a.type},"validateValue"),r.trigger("input"),"multiline"!==a.type&&this.addListener(r,"paste",{tdIndex:h,type:a.type},"handlePaste"),l[s]=r):"checkbox"===a.type&&(o=$('input[type="checkbox"]',n),a.radioMode&&(void 0===this.table.radioCheckboxes[s]&&(this.table.radioCheckboxes[s]=[]),this.table.radioCheckboxes[s].push(o[0]),this.addListener(o,"change",{colId:s},"onRadioCheckboxChange")),a.toggle&&this.addListener(o,"change",{colId:s},(function(t){this.applyToggleCheckbox(t.data.colId)}))),$(n).hasClass("disabled")||this.addListener(n,"click",{td:n},(function(t){t.target===t.data.td&&$(t.data.td).find("textarea,input,select,.lightswitch").focus()})),h++);for(s in this.onTextareaHeightChange(),this.table.columns)this.table.columns.hasOwnProperty(s)&&"checkbox"===(a=this.table.columns[s]).type&&a.toggle&&this.applyToggleCheckbox(s);for(s in this.table.columns)this.table.columns.hasOwnProperty(s)&&(a=this.table.columns[s]).autopopulate&&void 0!==l[a.autopopulate]&&!l[s].val()&&new Craft.HandleGenerator(l[s],l[a.autopopulate],{allowNonAlphaStart:!0});var d=this.$tr.children().last().find(".delete");this.addListener(d,"click","deleteRow");var c=this.$tr.find("input,textarea,select,.lightswitch");this.addListener(c,"focus",(function(t){$(t.currentTarget).closest("td:not(.disabled)").addClass("focus")})),this.addListener(c,"blur",(function(t){$(t.currentTarget).closest("td").removeClass("focus")}))},onTextareaFocus:function(t){this.onTextareaHeightChange();var e=$(t.currentTarget);e.data("ignoreNextFocus")?e.data("ignoreNextFocus",!1):window.setTimeout((function(){Craft.selectFullValue(e)}),0)},onRadioCheckboxChange:function(t){if(t.currentTarget.checked)for(var e=0;e<this.table.radioCheckboxes[t.data.colId].length;e++){var i=this.table.radioCheckboxes[t.data.colId][e];i.checked=i===t.currentTarget}},applyToggleCheckbox:function(t){for(var e,i,s=this.table.columns[t],a=$('input[type="checkbox"]',this.tds[t]).prop("checked"),n=0;n<s.toggle.length;n++)e=s.toggle[n],this.table.colum,(i="!"===e[0])&&(e=e.substring(1)),a&&!i||!a&&i?$(this.tds[e]).removeClass("disabled").find("textarea, input").prop("disabled",!1):$(this.tds[e]).addClass("disabled").find("textarea, input").prop("disabled",!0)},ignoreNextTextareaFocus:function(t){$.data(t.currentTarget,"ignoreNextFocus",!0)},handleKeypress:function(t){var e=t.keyCode?t.keyCode:t.charCode,i=Garnish.isCtrlKeyPressed(t);if(e===Garnish.RETURN_KEY&&("multiline"!==t.data.type||i))return t.preventDefault(),void(t.shiftKey?this.table.focusOnPrevRow(this.$tr,t.data.tdIndex,t.currentTarget):this.table.focusOnNextRow(this.$tr,t.data.tdIndex,t.currentTarget))},handlePaste:function(t){var e=Craft.trim(t.originalEvent.clipboardData.getData("Text")," \n\r");e.match(/[\t\r\n]/)&&(t.preventDefault(),this.table.importData(e,this,t.data.tdIndex))},validateValue:function(t){if("multiline"!==t.data.type)if("number"!==t.data.type){var e=t.currentTarget.value.replace(/[\r\n]/g,"");e!==t.currentTarget.value&&(t.currentTarget.value=e)}else Craft.filterNumberInputVal(t.currentTarget)},onTextareaHeightChange:function(){for(var t=-1,e=0;e<this.niceTexts.length;e++)this.niceTexts[e].height>t&&(t=this.niceTexts[e].height);this.$textareas.css("min-height",t);var i=this.$textareas.filter(":visible").first().parent().height();i>t&&this.$textareas.css("min-height",i)},deleteRow:function(){this.table.deleteRow(this)}},{numericKeyCodes:[9,8,37,38,39,40,45,91,46,190,48,49,50,51,52,53,54,55,56,57]})},8468:function(){Craft.ElementActionTrigger=Garnish.Base.extend({maxLevels:null,newChildUrl:null,$trigger:null,$selectedItems:null,triggerEnabled:!0,init:function(t){$.isPlainObject(t)||(t={}),void 0!==t.batch&&(t.bulk=t.batch,delete t.batch),Object.defineProperty(t,"batch",{get:function(){return this.bulk},set:function(t){this.bulk=t}}),this.setSettings(t,Craft.ElementActionTrigger.defaults),this.$trigger=$("#"+t.type.replace(/[\[\]\\]+/g,"-")+"-actiontrigger"),this.settings.activate&&(this.$trigger.data("custom-handler",!0),"FORM"===this.$trigger.prop("nodeName")?this.addListener(this.$trigger,"submit","handleTriggerActivation"):this.addListener(this.$trigger,"click","handleTriggerActivation")),this.updateTrigger(),Craft.elementIndex.on("selectionChange",this.updateTrigger.bind(this))},updateTrigger:function(){0!==Craft.elementIndex.getSelectedElements().length&&(this.validateSelection()?this.enableTrigger():this.disableTrigger())},validateSelection:function(){var t=!0;return this.$selectedItems=Craft.elementIndex.getSelectedElements(),!this.settings.bulk&&this.$selectedItems.length>1?t=!1:"function"==typeof this.settings.validateSelection&&(t=this.settings.validateSelection(this.$selectedItems)),t},enableTrigger:function(){this.triggerEnabled||(this.$trigger.removeClass("disabled"),this.triggerEnabled=!0)},disableTrigger:function(){this.triggerEnabled&&(this.$trigger.addClass("disabled"),this.triggerEnabled=!1)},handleTriggerActivation:function(t){t.preventDefault(),t.stopPropagation(),this.triggerEnabled&&this.settings.activate(this.$selectedItems)}},{defaults:{type:null,bulk:!0,validateSelection:null,activate:null}})},5049:function(){function t(t,i){if(t){if("string"==typeof t)return e(t,i);var s=Object.prototype.toString.call(t).slice(8,-1);return"Object"===s&&t.constructor&&(s=t.constructor.name),"Map"===s||"Set"===s?Array.from(t):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?e(t,i):void 0}}function e(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.ElementEditor=Garnish.Base.extend({isFullPage:null,$container:null,$tabContainer:null,$contentContainer:null,$revisionBtn:null,$revisionLabel:null,$spinner:null,$expandSiteStatusesBtn:null,$statusIcon:null,$previewBtn:null,$editMetaBtn:null,metaHud:null,$nameTextInput:null,$saveMetaBtn:null,$siteStatusPane:null,$globalLightswitch:null,$siteLightswitches:null,$additionalSiteField:null,siteIds:null,newSiteIds:null,enableAutosave:null,lastSerializedValue:null,listeningForChanges:!1,pauseLevel:0,timeout:null,cancelToken:null,ignoreFailedRequest:!1,queue:null,submittingForm:!1,duplicatedElements:null,failed:!1,httpStatus:null,httpError:null,openingPreview:!1,preview:null,activatedPreviewToken:!1,previewTokenQueue:null,previewLinks:null,scrollY:null,hiddenTipsStorageKey:"Craft-"+Craft.systemUid+".TipField.hiddenTips",get tipDismissBtn(){return this.$container.find(".tip-dismiss-btn")},get slideout(){return this.$container.data("slideout")},init:function(e,i){var s=this;if(this.$container=$(e),"FORM"!==this.$container.prop("tagName"))throw"Element editors may only be used with forms.";this.$container.data("elementEditor")&&(console.warn("Double-instantiating an element editor on an element."),this.$container.data("elementEditor").destroy()),this.$container.data("elementEditor",this),this.$container.attr("data-element-editor",""),this.setSettings(i,Craft.ElementEditor.defaults),this.isFullPage=this.$container[0]===Craft.cp.$primaryForm[0],this.isFullPage?(this.$tabContainer=$("#tabs"),this.$contentContainer=$("#content")):(this.$tabContainer=this.slideout.$tabContainer,this.$contentContainer=this.slideout.$content),this.queue=this._createQueue(),this.previewTokenQueue=this._createQueue(),this.duplicatedElements={},this.enableAutosave=Craft.autosaveDrafts,this.previewLinks=[],this.siteIds=Object.keys(this.settings.siteStatuses).map((function(t){return parseInt(t)})),this.$revisionBtn=this.$container.find(".context-btn"),this.$revisionLabel=this.$container.find(".revision-label"),this.$previewBtn=this.$container.find(".preview-btn");var a,n,r=this.isFullPage?$("#page-title"):this.slideout.$toolbar;if(this.$spinner=$("<div/>",{class:"revision-spinner spinner hidden",title:Craft.t("app","Saving")}).appendTo(r),this.$statusIcon=$("<div/>",{class:"revision-status ".concat(this.isFullPage?"invisible":"hidden")}).appendTo(r),this.$statusMessage=$("<div/>",{class:"revision-status-message visually-hidden","aria-live":"polite"}).appendTo(r),this.$expandSiteStatusesBtn=$(".expand-status-btn"),this.settings.canEditMultipleSites&&this.addListener(this.$expandSiteStatusesBtn,"click","expandSiteStatuses"),this.settings.previewTargets.length&&this.isFullPage){this.settings.enablePreview&&this.addListener(this.$previewBtn,"click","openPreview");var o=this.$container.find(".preview-btn-container");if(1===this.settings.previewTargets.length){var l=(a=this.settings.previewTargets,n=1,function(t){if(Array.isArray(t))return t}(a)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(a,n)||t(a,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];this.createPreviewLink(l).addClass("view-btn btn").attr("aria-label",Craft.t("app","View")).appendTo(o)}else this.createShareMenu(o)}this.settings.revisionId||(this.$container.data("serializer",(function(){return s.serializeForm(!0)})),this.$container.data("initialSerializedValue",this.serializeForm(!0)),this.isFullPage&&this.addListener(this.$container,"submit","handleSubmit"),this.settings.isProvisionalDraft?this.initForProvisionalDraft():this.settings.draftId&&!this.settings.isUnpublishedDraft?this.initForDraft():this.settings.canSaveCanonical||this.addListener(this.$container,"submit.saveShortcut",(function(t){t.saveShortcut&&(t.preventDefault(),s.createDraft(),s.removeListener(s.$container,"submit.saveShortcut"))})),this.listenForChanges(),this.addListener(this.$statusIcon,"click",(function(){s.showStatusHud(s.$statusIcon)})),this.handleDismissibleTips(),this.isFullPage&&Craft.messageReceiver&&Craft.broadcaster.addEventListener("message",(function(t){if("saveDraft"===t.data.event&&t.data.canonicalId===s.settings.canonicalId&&(t.data.draftId===s.settings.draftId||t.data.isProvisionalDraft&&!s.settings.draftId)||"saveElement"===t.data.event&&t.data.id===s.settings.canonicalId&&!s.settings.draftId)Craft.setLocalStorage("scrollY",window.scrollY),window.location.reload();else if("deleteDraft"===t.data.event&&t.data.canonicalId===s.settings.canonicalId&&t.data.draftId===s.settings.draftId){var e=new URL(window.location.href);e.searchParams.delete("draftId"),e.href!==document.location.href?window.location.href=e:(Craft.setLocalStorage("scrollY",window.scrollY),window.location.reload())}})))},_createQueue:function(){var t=this,e=new Craft.Queue;return e.on("beforeRun",(function(){t.showSpinner()})),e.on("afterRun",(function(){t.hideSpinner()})),e},get namespace(){return this.isFullPage?null:this.slideout.namespace},namespaceInputName:function(t){return Craft.namespaceInputName(t,this.namespace)},namespaceId:function(t){return Craft.namespaceId(t,this.namespace)},listenForChanges:function(){var t=this;if(!(this.listeningForChanges||this.pauseLevel>0)&&this.enableAutosave&&this.settings.canCreateDrafts){this.listeningForChanges=!0;var e=this.isFullPage?Garnish.$bod:this.$container;this.addListener(e,"keypress,keyup,change,focus,blur,click,mousedown,mouseup",(function(e){$(e.target).is(t.statusIcons())||(clearTimeout(t.timeout),["keypress","keyup","change"].includes(e.type)?t.timeout=setTimeout(t.checkForm.bind(t),500):t.checkForm())}))}},stopListeningForChanges:function(){this.listeningForChanges&&(this.removeListener(Garnish.$bod,"keypress,keyup,change,focus,blur,click,mousedown,mouseup"),clearTimeout(this.timeout),this.listeningForChanges=!1)},pause:function(){this.pauseLevel++,this.stopListeningForChanges()},resume:function(){if(0===this.pauseLevel)throw"Craft.ElementEditor::resume() should only be called after pause().";this.pauseLevel--,0===this.pauseLevel&&this.enableAutosave&&(this.checkForm(),this.listenForChanges())},initForProvisionalDraft:function(){var t=this,e=this.$container.find(".discard-changes-btn");if(!e.length){var i,s,a;this.isFullPage?(i=$("#content").height(),s=Garnish.$win.scrollTop(),a=Craft.cp.$noticeContainer):a=this.$container.find(".so-notice");var n=$("<div/>",{class:"draft-notice"}).append($("<div/>",{class:"draft-icon","aria-hidden":"true","data-icon":"edit"})).append($("<p/>",{text:Craft.t("app","Showing your unsaved changes.")})).appendTo(a);if(e=$("<button/>",{type:"button",class:"discard-changes-btn btn",text:Craft.t("app","Discard")}).appendTo(n),this.isFullPage){var r=$("#content").height()-i;if(Garnish.$win.scrollTop(s+r),Garnish.$win.scrollTop()===s){Craft.cp.$contentContainer.css("pointer-events","none"),$("#content-header").css("min-height","auto");var o=a.height();a.css({height:o-r,overflow:"hidden"}).velocity({height:o},"fast",(function(){$("#content-header").css("min-height",""),a.css({height:"",overflow:""}),setTimeout((function(){Craft.cp.$contentContainer.css("pointer-events","")}),300)}))}}}this.addListener(e,"keypress,keyup,change,focus,blur,click,mousedown,mouseup",(function(t){t.stopPropagation()})),this.addListener(e,"click",(function(){confirm(Craft.t("app","Are you sure you want to discard your changes?"))&&t.queue.unshift((function(){return new Promise((function(e,i){t.isFullPage?Craft.submitForm(t.$container,{action:"elements/delete-draft",redirect:t.settings.hashedCpEditUrl,params:{draftId:t.settings.draftId,provisional:1}}):Craft.sendActionRequest("POST","elements/delete-draft",{data:{elementId:t.settings.canonicalId,draftId:t.settings.draftId,provisional:1}}).then((function(e){Craft.cp.displaySuccess(e.data.message),t.slideout.close()})).catch(i)}))}))}))},initForDraft:function(){var t=this;this.createEditMetaBtn(),this.settings.canSaveCanonical&&Garnish.uiLayerManager.registerShortcut({keyCode:Garnish.S_KEY,ctrl:!0,alt:!0},(function(){Craft.submitForm(t.$container,{action:"elements/apply-draft",redirect:t.settings.hashedCpEditUrl})}),0)},expandSiteStatuses:function(){var t=this;this.removeListener(this.$expandSiteStatusesBtn,"click"),this.$expandSiteStatusesBtn.velocity({opacity:0},"fast",(function(){t.$expandSiteStatusesBtn.remove()}));var e=this.$container.find(".enabled-for-site-".concat(this.settings.siteId,"-field"));if(this.$siteStatusPane=e.parent(),this.settings.revisionId)this._getOtherSupportedSites().forEach((function(e){return t._createSiteStatusField(e)}));else{e.addClass("nested");var i=Craft.ui.createLightswitchField({label:Craft.t("app","Enabled for all sites"),name:this.namespaceInputName("enabled")}).insertBefore(e);i.find("label").css("font-weight","bold"),this.$globalLightswitch=i.find(".lightswitch"),this.settings.revisionId||this._showField(i);var s=Object.values(this.settings.siteStatuses),a=s.includes(!0),n=s.includes(!1),r=a&&n?"-":a?"1":"",o=encodeURIComponent(this.namespaceInputName("enabledForSite[".concat(this.settings.siteId,"]")))+"="+(this.settings.enabledForSite?"1":"");this.$siteLightswitches=e.find(".lightswitch").on("change",this._updateGlobalStatus.bind(this)),this._getOtherSupportedSites().forEach((function(e){return t._createSiteStatusField(e)}));for(var l=encodeURIComponent(this.namespaceInputName("enabled"))+"=".concat(r),h=0;h<this.$siteLightswitches.length;h++){var d=this.$siteLightswitches.eq(h).data("lightswitch").$input;l+="&"+encodeURIComponent(d.attr("name"))+"="+d.val()}this.$container.data("initialSerializedValue",this.$container.data("initialSerializedValue").replace(o,l)),this.lastSerializedValue&&(this.lastSerializedValue=this.lastSerializedValue.replace(o,l)),this.settings.additionalSites&&this.settings.additionalSites.length&&this.isFullPage&&this._createAddlSiteField(),this.$globalLightswitch.focus(),this.$globalLightswitch.on("change",this._updateSiteStatuses.bind(this)),this._updateGlobalStatus()}},_getOtherSupportedSites:function(){var t=this;return Craft.sites.filter((function(e){return e.id!=t.settings.siteId&&t.siteIds.includes(e.id)}))},_showField:function(t){var e=t.height();t.css({overflow:"hidden","min-height":"auto"}).height(0).velocity({height:e},"fast",(function(){t.css({overflow:"",height:"","min-height":""})}))},_removeField:function(t){t.css({overflow:"hidden","min-height":"auto"}).velocity({height:0},"fast",(function(){t.remove()}))},_updateGlobalStatus:function(){var t=!0,e=!0;this.$siteLightswitches.each((function(){if($(this).data("lightswitch").on?e=!1:t=!1,!t&&!e)return!1})),t?this.$globalLightswitch.data("lightswitch").turnOn(!0):e?this.$globalLightswitch.data("lightswitch").turnOff(!0):this.$globalLightswitch.data("lightswitch").turnIndeterminate(!0)},_updateSiteStatuses:function(){var t=this.$globalLightswitch.data("lightswitch").on;this.$siteLightswitches.each((function(){t?$(this).data("lightswitch").turnOn(!0):$(this).data("lightswitch").turnOff(!0)}))},_createSiteStatusField:function(t,e){var i=Craft.ui.createLightswitchField({fieldClass:"enabled-for-site-".concat(t.id,"-field"),label:t.name,name:this.namespaceInputName("enabledForSite[".concat(t.id,"]")),on:void 0!==e?e:!this.settings.siteStatuses.hasOwnProperty(t.id)||this.settings.siteStatuses[t.id],disabled:!!this.settings.revisionId});if(this.$additionalSiteField?i.insertBefore(this.$additionalSiteField):i.appendTo(this.$siteStatusPane),!this.settings.revisionId){i.addClass("nested");var s=i.find(".lightswitch").on("change",this._updateGlobalStatus.bind(this));this.$siteLightswitches=this.$siteLightswitches.add(s)}return this._showField(i),i},_createAddlSiteField:function(){var i,s=this,a=Craft.sites.filter((function(t){return!s.siteIds.includes(t.id)&&s.settings.additionalSites.some((function(e){return e.siteId==t.id}))}));if(a.length){var n="add-site-label",r=$("<span/>",{text:Craft.t("app","Add a site..."),class:"visually-hidden",id:n}),o=Craft.ui.createSelect({options:[{label:Craft.t("app","Add a site…")}].concat((i=a.map((function(t){return{label:t.name,value:t.id}})),function(t){if(Array.isArray(t))return e(t)}(i)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(i)||t(i)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())),labelledBy:n}).addClass("fullwidth");this.$additionalSiteField=Craft.ui.createField(o,{}).addClass("nested add").appendTo(this.$siteStatusPane),r.prependTo(this.$additionalSiteField);var l=o.find("select");l.on("change",(function(){var t=parseInt(l.val()),e=Craft.sites.find((function(e){return e.id===t}));if(e){var i=s.settings.additionalSites.find((function(t){return t.siteId==e.id}));s._createSiteStatusField(e,i.enabledByDefault),s._updateGlobalStatus(),l.val("").find('option[value="'.concat(t,'"]')).remove(),null===s.newSiteIds&&(s.newSiteIds=[]),s.siteIds.push(t),s.newSiteIds.push(t),1===l.find("option").length&&s._removeField(s.$additionalSiteField)}})),this._showField(this.$additionalSiteField)}},showStatusHud:function(t){var e;this.failed?(e='<p class="error"><strong>'.concat(this._saveFailMessage(),"</strong></p>"),this.httpError&&(e+='<p class="http-error code">'.concat(Craft.escapeHtml(this.httpError),"</p>")),400===this.httpStatus&&(e+='<button class="btn refresh-btn">'.concat(Craft.t("app","Refresh"),"</button>"))):e="<p>".concat(this._saveSuccessMessage(),"</p>");var i=new Garnish.HUD(t,e,{hudClass:"hud revision-status-hud",onHide:function(){i.destroy()}});i.$mainContainer.find(".refresh-btn").on("click",(function(){window.location.reload()}))},_saveSuccessMessage:function(){return this.settings.isProvisionalDraft||this.settings.isUnpublishedDraft?Craft.t("app","Your changes have been stored."):Craft.t("app","The draft has been saved.")},_saveFailMessage:function(){return this.settings.isProvisionalDraft||this.settings.isUnpublishedDraft?Craft.t("app","Your changes could not be stored."):Craft.t("app","The draft could not be saved.")},spinners:function(){return this.preview?this.$spinner.add(this.preview.$spinner):this.$spinner},showSpinner:function(){this.spinners().removeClass("hidden")},hideSpinner:function(){this.spinners().addClass("hidden")},statusIcons:function(){return this.preview?this.$statusIcon.add(this.preview.$statusIcon):this.$statusIcon},statusMessage:function(){return this.preview?this.$statusMessage.add(this.preview.$statusMessage):this.$statusMessage},createEditMetaBtn:function(){var t=this.$container.find(".context-btngroup");this.$editMetaBtn=$("<button/>",{type:"button",class:"btn edit icon","aria-expanded":"false","aria-label":Craft.t("app","Edit draft settings"),title:Craft.t("app","Edit draft settings")}).appendTo(t),t.find(".btngroup-btn-last").removeClass("btngroup-btn-last"),this.addListener(this.$editMetaBtn,"click","showMetaHud")},createPreviewLink:function(t,e){var i=this,s=$("<a/>",{href:this.getTokenizedPreviewUrl(t.url,null,!1),text:e||Craft.t("app","View"),target:"_blank",data:{targetUrl:t.url,targetLabel:t.label}});return this.addListener(s,"click",(function(){setTimeout((function(){i.activatePreviewToken()}),1)})),this.previewLinks.push(s),s},updatePreviewLinks:function(){var t=this;this.previewLinks.forEach((function(e){t.updatePreviewLinkHref(e),t.activatedPreviewToken&&t.removeListener(e,"click")}))},updatePreviewLinkHref:function(t){t.attr("href",this.getTokenizedPreviewUrl(t.data("targetUrl"),null,!1))},activatePreviewToken:function(){this.settings.isLive||(this.activatedPreviewToken=!0,this.updatePreviewLinks())},createShareMenu:function(t){var e=this,i=$("<button/>",{type:"button",class:"view-btn btn menubtn",text:Craft.t("app","View")}).appendTo(t),s=$("<div/>",{class:"menu"}).appendTo(t),a=$("<ul/>").appendTo(s);this.settings.previewTargets.forEach((function(t){$("<li/>").append(e.createPreviewLink(t,t.label)).appendTo(a)})),new Garnish.MenuBtn(i)},getPreviewTokenParams:function(){var t={elementType:this.settings.elementType,canonicalId:this.settings.canonicalId,siteId:this.settings.siteId,revisionId:this.settings.revisionId,previewToken:this.settings.previewToken};return this.settings.draftId&&!this.settings.isProvisionalDraft&&(t.draftId=this.settings.draftId),t},getPreviewToken:function(){var t=this;return this.previewTokenQueue.push((function(){return new Promise((function(e,i){t.activatedPreviewToken?e(t.settings.previewToken):Craft.sendActionRequest("POST","preview/create-token",{data:t.getPreviewTokenParams()}).then((function(){t.activatePreviewToken(),e(t.settings.previewToken)})).catch(i)}))}))},getTokenizedPreviewUrl:function(t,e,i){var s=this;void 0===i&&(i=!0);var a={};if(!e&&this.settings.isLive||(a[e||"x-craft-preview"]=Craft.randomString(10)),this.settings.siteToken&&(a[Craft.siteToken]=this.settings.siteToken),this.settings.isLive){var n=Craft.getUrl(t,a);return i?new Promise((function(t){t(n)})):n}if(!this.settings.previewToken)throw"Missing preview token";a[Craft.tokenParam]=this.settings.previewToken;var r=Craft.getUrl(t,a);if(this.activatedPreviewToken)return i?new Promise((function(t){t(r)})):r;if(i)return new Promise((function(t,e){s.getPreviewToken().then((function(){t(r)})).catch(e)}));var o=this.getPreviewTokenParams();return o.redirect=r,Craft.getActionUrl("preview/create-token",o)},getPreview:function(){var t=this;return this.preview||(this.preview=new Craft.Preview(this),this.enableAutosave||(this.preview.on("open",(function(){t.enableAutosave=!0,t.listenForChanges()})),this.preview.on("close",(function(){t.enableAutosave=!1,t.stopListeningForChanges();var e=t.statusIcons();e.hasClass("checkmark-icon")&&e.addClass("hidden")}))),this.preview.on("close",(function(){t.scrollY&&(window.scrollTo(0,t.scrollY),t.scrollY=null)}))),this.preview},openPreview:function(){var t=this;Garnish.hasAttr(this.$previewBtn,"aria-disabled")||(this.$previewBtn.attr("aria-disabled",!0),this.$previewBtn.addClass("loading"),this.queue.push((function(){return new Promise((function(e,i){t.openingPreview=!0,t.ensureIsDraftOrRevision(!0).then((function(){t.scrollY=window.scrollY,t.$previewBtn.removeAttr("aria-disabled"),t.$previewBtn.removeClass("loading"),t.getPreview().open(),t.openingPreview=!1,e()})).catch(i)}))})))},ensureIsDraftOrRevision:function(t){var e=this;return new Promise((function(i,s){if(e.settings.draftId||e.settings.revisionId)i();else{if(t&&e.serializeForm(!0)===e.$container.data("initialSerializedValue"))return void i();e.createDraft().then(i).catch(s)}}))},serializeForm:function(t){var e=this.$container.serialize();if(this.isPreviewActive()&&(e=e.replace("__PREVIEW_FIELDS__=1",this.preview.$editor.serialize())),t&&!this.settings.isUnpublishedDraft){var i=this.namespaceInputName("action"),s=this.namespaceInputName("redirect");e=(e=e.replace(new RegExp("&".concat(Craft.escapeRegex(i),"=[^&]*")),"")).replace(new RegExp("&".concat(Craft.escapeRegex(s),"=[^&]*")),"")}return e},checkForm:function(t){var e=this;return this.queue.push((function(){return new Promise((function(i,s){if(e.settings.revisionId||e.pauseLevel>0||!e.enableAutosave||!e.settings.canCreateDrafts)i();else if(clearTimeout(e.timeout),e.timeout=null,void 0!==e.$container.data("initialSerializedValue")){var a=e.serializeForm(!0);t||a!==(e.lastSerializedValue||e.$container.data("initialSerializedValue"))?e.saveDraft(a).then(i).catch((function(t){console.warn("Couldn’t save draft:",t),s(t)})):i()}else e.timeout=setTimeout(e.checkForm.bind(e),500)}))}))},isPreviewActive:function(){return this.preview&&this.preview.isActive},createDraft:function(){var t=this;return this.queue.push((function(){return new Promise((function(e,i){t.saveDraft(t.serializeForm(!0)).then(e).catch(i)}))}))},saveDraft:function(t){var e=this;return new Promise((function(i,s){if(e.submittingForm)s("Form already being submitted.");else{e.lastSerializedValue=t,e.failed=!1,e.httpStatus=null,e.httpError=null,e.cancelToken=axios.CancelToken.source(),e.statusIcons().velocity("stop").css("opacity","").removeClass("hidden invisible checkmark-icon alert-icon fade-out").addClass("hidden"),e.statusMessage().empty(),e.$saveMetaBtn&&e.$saveMetaBtn.addClass("active");var a,n,r,o=[],l=e.prepareData(t,e.settings.isUnpublishedDraft?null:function(t,e){e.length&&o.push(decodeURIComponent(e[0].split("=")[0]))}),h=(a={},n=e.namespaceInputName("visibleLayoutElements"),r=e.settings.visibleLayoutElements,n in a?Object.defineProperty(a,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):a[n]=r,a);!e.settings.isProvisionalDraft&&e.settings.draftId||(h[e.namespaceInputName("provisional")]=1);var d=e.$contentContainer.children("[data-layout-tab]:not(.hidden)").data("id");d&&(h[e.namespaceInputName("selectedTab")]=d),l+="&".concat($.param(h)),Craft.sendActionRequest("POST","elements/save-draft",{cancelToken:e.cancelToken.token,headers:e._saveHeaders,data:l}).then((function(s){e._afterSaveDraft();var a=!e.settings.draftId;a&&(e.settings.isProvisionalDraft=!0,e.$revisionLabel.append($("<span/>",{text:" — ".concat(Craft.t("app","Edited"))}))),e.isFullPage&&(s.data.title&&e.$container.find(".screen-title").text(s.data.title),s.data.docTitle&&(document.title=s.data.docTitle)),e.settings.isProvisionalDraft||(e.$revisionLabel.text(s.data.draftName),e.settings.draftName=s.data.draftName);var n=e.$revisionBtn.data("menubtn")?e.$revisionBtn.data("menubtn").menu:null;for(var r in e.newSiteIds&&(n||(e.$revisionBtn.removeClass("disabled").addClass("menubtn"),new Garnish.MenuBtn(e.$revisionBtn),(n=e.$revisionBtn.data("menubtn").menu).$container.removeClass("hidden")),e.newSiteIds.forEach((function(t){var i=n.$options.filter("[data-site-id=".concat(t,"]")),s=e.settings.additionalSites.find((function(e){return e.siteId==t}));s&&void 0!==s.enabledByDefault&&!s.enabledByDefault||i.find(".status").removeClass("disabled").addClass("enabled"),i.parent().removeClass("hidden").closest(".site-group").removeClass("hidden")})),n.$container.find(".revision-hr").removeClass("hidden"),e.newSiteIds=null),e.settings.isProvisionalDraft?a&&(e.$container.find("input.action-input").attr("value","elements/apply-draft"),e.settings.draftId=s.data.draftId,e.settings.isLive=!1,e.previewToken=null,e.initForProvisionalDraft()):n&&(n.$options.filter(".sel").find(".draft-name").text(s.data.draftName),n.$options.filter(".sel").find(".draft-meta").text(s.data.creator?Craft.t("app","Saved {timestamp} by {creator}",{timestamp:s.data.timestamp,creator:s.data.creator}):Craft.t("app","Saved {timestamp}",{timestamp:s.data.timestamp}))),s.data.previewTargets&&JSON.stringify(s.data.previewTargets)!==JSON.stringify(e.settings.previewTargets)&&e.updatePreviewTargets(s.data.previewTargets),a&&(e.updatePreviewLinks(),e.trigger("createProvisionalDraft")),e.$nameTextInput&&e.checkMetaValues(),s.data.duplicatedElements)r!=e.settings.canonicalId&&s.data.duplicatedElements.hasOwnProperty(r)&&(e.duplicatedElements[r]=s.data.duplicatedElements[r]);for(var l=s.data.modifiedAttributes.map((function(t){return t=e.namespaceInputName(t),'[name="'.concat(t,'"],[name^="').concat(t,'["]')})).concat(o.map((function(t){return'[name="'.concat(t,'"]')}))),h=$(l.join(",")).parents().filter(".field:not(:has(> .status-badge))"),c=0;c<h.length;c++)h.eq(c).prepend($("<div/>",{class:"status-badge modified",title:Craft.t("app","This field has been modified.")}).append($("<span/>",{class:"visually-hidden",html:Craft.t("app","This field has been modified.")})));for(var u=e.serializeForm(!0)===t,p=$(),f={},g=!1,m=0;m<s.data.missingElements.length;m++){var v=s.data.missingElements[m],b=e.$contentContainer.children('[data-layout-tab="'.concat(v.uid,'"]'));b.length||(b=$("<div/>",{id:e.namespaceId(v.id),class:"flex-fields","data-id":v.id,"data-layout-tab":v.uid}),v.id!==d&&b.addClass("hidden"),b.appendTo(e.$contentContainer)),p=p.add(b);for(var C=0;C<v.elements.length;C++){var _=v.elements[C];if(!1!==_.html){if(f[v.uid]||(f[v.uid]=[]),f[v.uid].push(_.uid),"string"==typeof _.html){var w=b.children('[data-layout-element="'.concat(_.uid,'"]')),S=$(_.html);w.length?w.replaceWith(S):S.appendTo(b),Craft.initUiElements(S),g=!0}}else{var y=b.children('[data-layout-element="'.concat(_.uid,'"]'));if(!y.length||!Garnish.hasAttr(y,"data-layout-element-placeholder")){var T=$("<div/>",{class:"hidden","data-layout-element":_.uid,"data-layout-element-placeholder":""});y.length?y.replaceWith(T):T.appendTo(b),g=!0}}}}var I=e.$contentContainer.children("[data-layout-tab]").not(p).not('[data-layout-tab=""]');I.length&&(I.remove(),g=!0),p.filter(":not(.hidden)").length||p.first().removeClass("hidden"),e.settings.visibleLayoutElements=f,e.isFullPage?Craft.cp.updateTabs(s.data.tabs):e.slideout.updateTabs(s.data.tabs),Craft.appendHeadHtml(s.data.headHtml),Craft.appendBodyHtml(s.data.bodyHtml),g&&(s.data.initialDeltaValues&&Object.assign(e.$container.data("initial-delta-values"),s.data.initialDeltaValues),u&&(e.lastSerializedValue=e.serializeForm(!0))),e.handleDismissibleTips(),e.afterUpdate(t),Craft.broadcaster&&Craft.broadcaster.postMessage({pageId:Craft.pageId,event:"saveDraft",canonicalId:e.settings.canonicalId,draftId:e.settings.draftId,isProvisionalDraft:e.settings.isProvisionalDraft}),i()})).catch((function(t){e._afterSaveDraft(),e.ignoreFailedRequest||(e.failed=!0,t&&t.response&&(e.httpStatus=t.response.status,e.httpError=t.response.data?t.response.data.message:null),e._showFailStatus(),s(t)),e.ignoreFailedRequest=!1}))}}))},_afterSaveDraft:function(){this.$saveMetaBtn&&this.$saveMetaBtn.removeClass("active")},_showFailStatus:function(){this.statusIcons().velocity("stop").css("opacity","").removeClass("hidden checkmark-icon").addClass("alert-icon"),this.setStatusMessage(this._saveFailMessage())},prepareData:function(t,e){t=Craft.findDeltaData(this.$container.data("initialSerializedValue"),t,this.$container.data("delta-names"),e,this.$container.data("initial-delta-values"),this.$container.data("modified-delta-names")),t=this.swapDuplicatedElementIds(t);var i={};return this.settings.draftId&&(i[this.namespaceInputName("draftId")]=this.settings.draftId,this.settings.isProvisionalDraft&&(i[this.namespaceInputName("provisional")]=1)),null!==this.settings.draftName&&(i[this.namespaceInputName("draftName")]=this.settings.draftName),$.isEmptyObject(i)||(t+="&".concat($.param(i))),t},get _saveHeaders(){var t={"content-type":"application/x-www-form-urlencoded"};return this.namespace&&(t["X-Craft-Namespace"]=this.namespace),t},swapDuplicatedElementIds:function(t){var e=this,i=Object.keys(this.duplicatedElements).join("|");if(""===i)return t;var s=encodeURIComponent("["),a=encodeURIComponent("]"),n=this.namespaceInputName("fields");for(n=this.isFullPage?Craft.escapeRegex(n):encodeURIComponent(n);t!==(t=t.replace(new RegExp("(&".concat(n).concat(s,"[^=]+").concat(a).concat(s,")(").concat(i,")(").concat(a,")"),"g"),(function(t,i,s,a){var n=!1;try{n=e._filterFieldInputName(i)}catch(e){console.warn("Unexpected input name: ".concat(t))}return n?i+e.duplicatedElements[s]+a:t})).replace(new RegExp("&(".concat(n).concat(s,"[^=]+)=(").concat(i,")\\b"),"g"),(function(t,i,n){var r=!1;try{r=e._filterFieldInputName(i)&&!i.match(new RegExp("".concat(s,"(enabled|sortOrder|type|typeId)").concat(a,"$")))}catch(e){console.warn("Unexpected input name: ".concat(t))}return r?"&".concat(i,"=").concat(e.duplicatedElements[n]):t}))););return t},_filterFieldInputName:function(t){var e=encodeURIComponent("["),i=encodeURIComponent("]"),s=t.match(new RegExp("(\\bfields|".concat(e,"fields").concat(i,")").concat(e,"[^").concat(i,"]+").concat(i),"g"));if(!s)throw"Unexpected input name: ".concat(t);var a=s[s.length-1].match(new RegExp("(?:\\bfields|".concat(e,"fields").concat(i,")").concat(e,"([^").concat(i,"]+)").concat(i)))[1];return Craft.fieldsWithoutContent.includes(a)},updatePreviewTargets:function(t){var e=this;t.forEach((function(t){var i=e.settings.previewTargets.find((function(e){return e.label===t.label}));i&&(i.url=t.url);var s=e.previewLinks.find((function(e){return e.data("targetLabel")===t.label}));s&&(s.data("targetUrl",t.url),e.updatePreviewLinkHref(s))}))},afterUpdate:function(t){this.$container.data("initialSerializedValue",t),this.$container.data("initial-delta-values",{});var e=this.statusIcons().velocity("stop").css("opacity","").removeClass("hidden").addClass("checkmark-icon");this.setStatusMessage(this._saveSuccessMessage()),Craft.autosaveDrafts||e.velocity("stop").velocity({opacity:0},{delay:2e3,complete:function(){e.addClass("hidden")}}),this.trigger("update")},setStatusMessage:function(t){this.statusIcons().attr("title",t),this.statusMessage().empty().append($("<span/>",{class:"visually-hidden",text:t}))},showMetaHud:function(){this.metaHud?this.metaHud.show():(this.createMetaHud(),this.onMetaHudShow()),Garnish.isMobileBrowser(!0)||this.$nameTextInput.trigger("focus")},createMetaHud:function(){var t=$("<div/>"),e=$('<div class="field"><div class="heading"><label for="draft-name">'+Craft.t("app","Draft Name")+"</label></div></div>").appendTo(t),i=$('<div class="input"/>').appendTo(e);this.$nameTextInput=$('<input type="text" class="text fullwidth" id="draft-name"/>').appendTo(i).val(this.settings.draftName);var s=$('<div class="hud-footer flex flex-center"/>').appendTo(t);$('<div class="flex-grow"></div>').appendTo(s),this.$saveMetaBtn=$("<button/>",{type:"submit",class:"btn submit disabled","aria-disabled":"true",text:Craft.t("app","Save")}).appendTo(s),this.metaHud=new Garnish.HUD(this.$editMetaBtn,t,{onSubmit:this.saveMeta.bind(this)}),this.addListener(this.$nameTextInput,"input","checkMetaValues"),this.metaHud.on("show",this.onMetaHudShow.bind(this)),this.metaHud.on("hide",this.onMetaHudHide.bind(this)),this.metaHud.on("escape",this.onMetaHudEscape.bind(this))},onMetaHudShow:function(){this.$editMetaBtn.addClass("active"),this.$editMetaBtn.attr("aria-expanded","true")},onMetaHudHide:function(){this.$editMetaBtn.removeClass("active"),this.$editMetaBtn.attr("aria-expanded","false"),Garnish.focusIsInside(this.metaHud.$body)&&this.$editMetaBtn.trigger("focus")},onMetaHudEscape:function(){this.$nameTextInput.val(this.settings.draftName)},checkMetaValues:function(){return this.$nameTextInput.val()&&this.$nameTextInput.val()!==this.settings.draftName?(this.$saveMetaBtn.removeClass("disabled"),this.$saveMetaBtn.removeAttr("aria-disabled"),!0):(this.$saveMetaBtn.addClass("disabled"),this.$saveMetaBtn.attr("aria-disabled","true"),!1)},shakeMetaHud:function(){Garnish.shake(this.metaHud.$hud)},saveMeta:function(){var t=this;return new Promise((function(e,i){if(!t.checkMetaValues())return t.shakeMetaHud(),void i();t.settings.draftName=t.$nameTextInput.val(),t.metaHud.hide(),t.checkForm(!0).then(e).catch(i)}))},handleSubmit:function(t){var e=this;if(t.preventDefault(),t.stopPropagation(),!this.submittingForm)if(!this.settings.draftId||this.settings.isUnpublishedDraft||this.settings.isProvisionalDraft||void 0!==t.autosave&&!t.autosave||!(t.saveShortcut||t.customTrigger&&"elements/save-draft"===t.customTrigger.data("action"))||!this.enableAutosave){this.submittingForm=!0,Craft.cp.$confirmUnloadForms=Craft.cp.$confirmUnloadForms.not(this.$container),this.cancelToken&&(this.ignoreFailedRequest=!0,this.cancelToken.cancel()),this.trigger("beforeSubmit");var i=this.prepareData(this.serializeForm(!1));if(this.isFullPage){this.stopListeningForChanges();var s=Craft.createForm(i);s.appendTo(Garnish.$bod),s.submit()}else this.slideout.showSubmitSpinner(),Craft.sendActionRequest("POST",null,{headers:this._saveHeaders,data:i}).then((function(t){e.slideout.handleSubmitResponse(t)})).catch((function(t){e.slideout.handleSubmitError(t)})).finally((function(){e.submittingForm=!1,e.slideout.hideSubmitSpinner()}))}else this.checkForm(!0)},handleDismissibleTips:function(){var t=this;this.addListener(this.tipDismissBtn,"click",(function(e){t.hideTip(e)}))},getHiddenTipsUids:function(){return Craft.getLocalStorage("dismissedTips",[])},setHiddenTipsUids:function(t){Craft.setLocalStorage("dismissedTips",t)},hideTip:function(t){var e=t.target;if(e){var i=$(e).closest(".readable");if(i.length){var s=i.data("layout-element");if(i.remove(),"undefined"!=typeof Storage){var a=this.getHiddenTipsUids();a.includes(s)||(a.push(s),this.setHiddenTipsUids(a))}}}}},{defaults:{additionalSites:[],canCreateDrafts:!1,canEditMultipleSites:!1,canSaveCanonical:!1,canonicalId:null,draftId:null,draftName:null,elementType:null,enablePreview:!1,enabled:!1,enabledForSite:!1,hashedCpEditUrl:null,isLive:!1,isProvisionalDraft:!1,isUnpublishedDraft:!1,previewTargets:[],previewToken:null,revisionId:null,siteId:null,siteStatuses:null,siteToken:null,visibleLayoutElements:{}}})},4211:function(){Craft.ElementEditorSlideout=Craft.CpScreenSlideout.extend({$element:null,init:function(t,e){var i=this;this.$element=$(t),e=Object.assign({},Craft.ElementEditorSlideout.defaults,e,{showHeader:!0}),this.base("elements/edit",e),this.on("load",(function(){var t=i.$container.data("elementEditor");t&&t.on("beforeSubmit",(function(){Object.keys(i.settings.saveParams).forEach((function(e){$("<input/>",{class:"hidden",name:t.namespaceInputName(e),value:i.settings.saveParams[e]}).appendTo(i.$container)}))}))})),this.on("submit",(function(t){if(Craft.broadcaster&&Craft.broadcaster.postMessage({event:"saveElement",id:t.response.data.element.id}),i.settings.onSaveElement){var e=Object.assign({},t.response.data,t.response.data.element);delete e.element,delete e.modelName,delete e.message,i.settings.onSaveElement(e)}Craft.Preview.refresh()}))},getParams:function(){var t={};return this.settings.elementType&&(t.elementType=this.settings.elementType),this.settings.elementId?t.elementId=this.settings.elementId:this.$element&&this.$element.data("id")&&(t.elementId=this.$element.data("id")),this.settings.draftId?t.draftId=this.settings.draftId:this.$element&&this.$element.data("draft-id")?t.draftId=this.$element.data("draft-id"):this.settings.revisionId?t.revisionId=this.settings.revisionId:this.$element&&this.$element.data("revision-id")&&(t.revisionId=this.$element.data("revision-id")),this.settings.siteId?t.siteId=this.settings.siteId:this.$element&&this.$element.data("site-id")&&(t.siteId=this.$element.data("site-id")),this.settings.prevalidate&&(t.prevalidate=1),t},handleSubmit:function(t){this.$container.data("elementEditor").handleSubmit(t)}},{defaults:{elementId:null,draftId:null,revisionId:null,elementType:null,siteId:null,prevalidate:!1,saveParams:{},onSaveElement:null,validators:[]}})},7998:function(){Craft.ElementFieldSettings=Garnish.Base.extend({allowMultipleSources:null,$maintainHierarchyField:null,$maintainHierarchyInput:null,$sourcesField:null,$sourceSelect:null,$branchLimitField:null,$maxRelationsField:null,$minRelationsField:null,init:function(t,e,i,s,a,n){this.allowMultipleSources=t,this.$maintainHierarchyField=$("#".concat(e)),this.$maintainHierarchyInput=this.$maintainHierarchyField.find('input[type="checkbox"]'),this.$sourcesField=$("#".concat(i)),this.allowMultipleSources||(this.$sourceSelect=this.$sourcesField.find("select")),this.$branchLimitField=$("#".concat(s)),this.$minRelationsField=$("#".concat(a)),this.$maxRelationsField=$("#".concat(n)),this.updateLimitFields(),this.addListener(this.$maintainHierarchyInput,"change","updateLimitFields"),this.allowMultipleSources?this.$sourcesField.find("[type=checkbox]").each(function(t,e){this.addListener($(e),"change","updateMaintainHierarchyField")}.bind(this)):this.addListener(this.$sourceSelect,"change","updateMaintainHierarchyField"),this.updateMaintainHierarchyField()},updateLimitFields:function(){!this.$maintainHierarchyField.hasClass("hidden")&&this.$maintainHierarchyInput.is(":checked")?(this.$minRelationsField.addClass("hidden"),this.$maxRelationsField.addClass("hidden"),this.$branchLimitField.removeClass("hidden")):(this.$branchLimitField.addClass("hidden"),this.$minRelationsField.removeClass("hidden"),this.$maxRelationsField.removeClass("hidden"))},updateMaintainHierarchyField:function(){var t;if(this.allowMultipleSources){var e=this.$sourcesField.find('[type="checkbox"]:checked');t=1===e.length&&e.data("structure-id")}else t=this.$sourceSelect.children("option:selected").data("structure-id");t?this.$maintainHierarchyField.removeClass("hidden"):this.$maintainHierarchyField.addClass("hidden"),this.updateLimitFields()}})},8895:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.ElementThumbLoader=Garnish.Base.extend({queue:null,workers:[],init:function(){this.queue=[];for(var t=0;t<3;t++)this.workers.push(new Craft.ElementThumbLoader.Worker(this))},load:function(t){for(var e=this,i=t.find(".elementthumb"),s=function(t){var s=i.eq(t),a=s.scrollParent();if("FIELDSET"===a.prop("nodeName")&&(a=a.scrollParent()),a[0]===document.body&&(a=Garnish.$doc),e.isVisible(s,a))e.addToQueue(s[0]);else{var n="thumb"+Math.floor(1e6*Math.random());Craft.ElementThumbLoader.invisibleThumbs[n]=[e,s,a],a.on("scroll.".concat(n),{$thumb:s,$scrollParent:a,key:n},(function(t){e.isVisible(t.data.$thumb,t.data.$scrollParent)&&(delete Craft.ElementThumbLoader.invisibleThumbs[t.data.key],a.off("scroll.".concat(t.data.key)),e.addToQueue(t.data.$thumb[0]))}))}},a=0;a<i.length;a++)s(a)},addToQueue:function(t){this.queue.push(t);for(var e=0;e<this.workers.length;e++)this.workers[e].active||this.workers[e].loadNext()},isVisible:function(t,e){var i,s,a=t.offset().top;return e[0]===document?(i=e.scrollTop(),s=Garnish.$win.height()):(i=e.offset().top,s=e.height()),a>i&&a<i+s+1e3},destroy:function(){for(var t=0;t<this.workers.length;t++)this.workers[t].destroy();this.base()}},{invisibleThumbs:{},retryAll:function(){for(var e in Craft.ElementThumbLoader.invisibleThumbs){var i=(r=Craft.ElementThumbLoader.invisibleThumbs[e],o=3,function(t){if(Array.isArray(t))return t}(r)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(r,o)||function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(r,o)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=i[0],a=i[1],n=i[2];delete Craft.ElementThumbLoader.invisibleThumbs[e],n.off("scroll.".concat(e)),s.load(a.parent())}var r,o}}),Craft.ElementThumbLoader.Worker=Garnish.Base.extend({loader:null,active:!1,init:function(t){this.loader=t},loadNext:function(){var t=this.loader.queue.shift();if(void 0!==t){this.active=!0;var e=$(t);if(e.find("img").length)this.loadNext();else{var i=$("<img/>",{sizes:e.attr("data-sizes"),srcset:e.attr("data-srcset"),alt:e.attr("data-alt")||""});this.addListener(i,"load,error","loadNext"),i.appendTo(e),picturefill({elements:[i[0]]})}}else this.active=!1}})},4233:function(){Craft.ElevatedSessionForm=Garnish.Base.extend({$form:null,inputs:null,init:function(t,e){if(this.$form=$(t),void 0!==e){this.inputs=[],e=$.makeArray(e);for(var i=0;i<e.length;i++)for(var s=$(e[i]),a=0;a<s.length;a++){var n=s.eq(a);this.inputs.push({input:n,val:Garnish.getInputPostVal(n)})}}this.addListener(this.$form,"submit","handleFormSubmit")},handleFormSubmit:function(t){if(Craft.elevatedSessionManager.fetchingTimeout)return t.preventDefault(),void t.stopImmediatePropagation();if(this.inputs){for(var e,i=!1,s=0;s<this.inputs.length;s++)if((e=this.inputs[s].input).data("passwordInput")&&(e=e.data("passwordInput").$currentInput),Garnish.getInputPostVal(e)!==this.inputs[s].val){i=!0;break}if(!i)return}t.preventDefault(),t.stopImmediatePropagation(),Craft.elevatedSessionManager.requireElevatedSession(this.submitForm.bind(this))},submitForm:function(){this.disable(),this.$form.trigger("submit"),this.enable()}})},9699:function(){Craft.ElevatedSessionManager=Garnish.Base.extend({fetchingTimeout:!1,passwordModal:null,$passwordInput:null,$submitBtn:null,$errorPara:null,callback:null,requireElevatedSession:function(t){var e=this;this.callback=t,this.fetchingTimeout=!0,Craft.sendActionRequest("POST","users/get-elevated-session-timeout").then((function(t){e.fetchingTimeout=!1,!1===t.data.timeout||t.data.timeout>=Craft.ElevatedSessionManager.minSafeElevatedSessionTimeout?e.callback():e.showPasswordModal()})).catch((function(){e.fetchingTimeout=!1}))},showPasswordModal:function(){var t=this;if(this.passwordModal)this.passwordModal.show();else{var e=$('<form id="elevatedsessionmodal" class="modal secure fitted"/>'),i=$('<div class="body"><p>'+Craft.t("app","Enter your password to continue.")+"</p></div>").appendTo(e),s=$('<div class="inputcontainer">').appendTo(i),a=$('<div class="flex"/>').appendTo(s),n=$('<div class="flex-grow"/>').appendTo(a),r=$("<td/>").appendTo(a),o=$('<div class="passwordwrapper"/>').appendTo(n);this.$passwordInput=$('<input type="password" class="text password fullwidth" placeholder="'+Craft.t("app","Password")+'" autocomplete="current-password"/>').appendTo(o),this.$submitBtn=Craft.ui.createSubmitButton({class:"disabled",label:Craft.t("app","Submit"),spinner:!0}).appendTo(r),this.$errorPara=$('<p class="error"/>').appendTo(i),this.passwordModal=new Garnish.Modal(e,{closeOtherModals:!1,onFadeIn:function(){setTimeout(t.focusPasswordInput.bind(t),100)},onFadeOut:function(){t.$passwordInput.val("")}}),new Craft.PasswordInput(this.$passwordInput,{onToggleInput:function(e){t.$passwordInput=e}}),this.addListener(this.$passwordInput,"input","validatePassword"),this.addListener(e,"submit","submitPassword")}},focusPasswordInput:function(){Garnish.isMobileBrowser(!0)||this.$passwordInput.trigger("focus")},validatePassword:function(){return this.$passwordInput.val().length>=6?(this.$submitBtn.removeClass("disabled"),!0):(this.$submitBtn.addClass("disabled"),!1)},submitPassword:function(t){var e=this;if(t&&t.preventDefault(),this.validatePassword()){this.$submitBtn.addClass("loading"),this.clearLoginError();var i={currentPassword:this.$passwordInput.val()};Craft.sendActionRequest("POST","users/start-elevated-session",{data:i}).then((function(t){e.$submitBtn.removeClass("loading"),e.passwordModal.hide(),e.callback()})).catch((function(t){var i=t.response;e.$submitBtn.removeClass("loading"),e.showPasswordError(i.data.message||Craft.t("app","Incorrect password.")),Garnish.shake(e.passwordModal.$container),e.focusPasswordInput()}))}},showPasswordError:function(t){null==t&&(t=Craft.t("app","A server error occurred.")),this.$errorPara.text(t),this.passwordModal.updateSizeAndPosition()},clearLoginError:function(){this.showPasswordError("")}},{minSafeElevatedSessionTimeout:5}),Craft.elevatedSessionManager=new Craft.ElevatedSessionManager},1402:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.EntryIndex=Craft.BaseElementIndex.extend({publishableSections:null,$newEntryBtnGroup:null,$newEntryBtn:null,init:function(t,e,i){this.publishableSections=[],this.on("selectSource",this.updateButton.bind(this)),this.on("selectSite",this.updateButton.bind(this)),this.base(t,e,i)},afterInit:function(){var t=this;this.publishableSections=Craft.publishableSections.filter((function(e){return!!t.getSourceByKey("section:".concat(e.uid))})),this.base()},getDefaultSourceKey:function(){if("index"===this.settings.context&&"undefined"!=typeof defaultSectionHandle){if("singles"===defaultSectionHandle)return"singles";for(var t=0;t<this.$sources.length;t++){var e=$(this.$sources[t]);if(e.data("handle")===defaultSectionHandle)return e.data("key")}}return this.base()},updateButton:function(){var e,i=this;if(this.$source&&(e="singles"===this.$source.data("key")?"singles":this.$source.data("handle"),this.publishableSections.length&&function(){i.$newEntryBtnGroup&&i.$newEntryBtnGroup.remove();var s,a=i.publishableSections.find((function(t){return t.handle===e}));i.$newEntryBtnGroup=$('<div class="btngroup submit" data-wrapper/>');var n="new-entry-menu-"+Craft.randomString(10);if(a){var r="index"===i.settings.context?Craft.t("app","New entry"):Craft.t("app","New {section} entry",{section:a.name}),o="index"===i.settings.context?Craft.t("app","New entry in the {section} section",{section:a.name}):r,l="index"===i.settings.context?"link":null;i.$newEntryBtn=Craft.ui.createButton({label:r,ariaLabel:o,spinner:!0,role:l}).addClass("submit add icon").appendTo(i.$newEntryBtnGroup),i.addListener(i.$newEntryBtn,"click mousedown",(function(t){"index"===i.settings.context&&("click"===t.type&&Garnish.isCtrlKeyPressed(t)||"mousedown"===t.type&&1===t.originalEvent.button)?window.open(Craft.getUrl("entries/".concat(a.handle,"/new"))):"click"===t.type&&i._createEntry(a.id)})),i.publishableSections.length>1&&(s=$("<button/>",{type:"button",class:"btn submit menubtn btngroup-btn-last","aria-controls":n,"data-disclosure-trigger":"","aria-label":Craft.t("app","New entry, choose a section")}).appendTo(i.$newEntryBtnGroup))}else i.$newEntryBtn=s=Craft.ui.createButton({label:Craft.t("app","New entry"),ariaLabel:Craft.t("app","New entry, choose a section"),spinner:!0}).addClass("submit add icon menubtn btngroup-btn-last").attr("aria-controls",n).attr("data-disclosure-trigger","").appendTo(i.$newEntryBtnGroup);if(i.addButton(i.$newEntryBtnGroup),s){var h,d=$("<div/>",{id:n,class:"menu menu--disclosure"}).appendTo(i.$newEntryBtnGroup),c=$("<ul/>").appendTo(d),u=function(e,i){var s="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!s){if(Array.isArray(e)||(s=function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(e))||i&&e&&"number"==typeof e.length){s&&(e=s);var a=0,n=function(){};return{s:n,n:function(){return a>=e.length?{done:!0}:{done:!1,value:e[a++]}},e:function(t){throw t},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){s=s.call(e)},n:function(){var t=s.next();return o=t.done,t},e:function(t){l=!0,r=t},f:function(){try{o||null==s.return||s.return()}finally{if(l)throw r}}}}(i.publishableSections);try{var p=function(){var t=h.value,e="index"===i.settings.context?"link":"button";if("index"===i.settings.context&&-1!==$.inArray(i.siteId,t.sites)||"index"!==i.settings.context&&t!==a){var n=$("<li/>").appendTo(c),r=$("<a/>",{role:"button"===e?"button":null,href:"#",type:"button"===e?"button":null,text:Craft.t("app","New {section} entry",{section:t.name})}).appendTo(n);i.addListener(r,"click",(function(){s.data("trigger").hide(),i._createEntry(t.id)})),"button"===e&&i.addListener(r,"keydown",(function(e){e.keyCode===Garnish.SPACE_KEY&&(e.preventDefault(),s.data("trigger").hide(),i._createEntry(t.id))}))}};for(u.s();!(h=u.n()).done;)p()}catch(t){u.e(t)}finally{u.f()}new Garnish.DisclosureMenu(s)}}(),"index"===this.settings.context)){var s="entries";e&&(s+="/"+e),Craft.setPath(s)}},_createEntry:function(t){var e=this;if(this.$newEntryBtn.hasClass("loading"))console.warn("New entry creation already in progress.");else{var i=this.publishableSections.find((function(e){return e.id===t}));if(!i)throw"Invalid section ID: ".concat(t);this.$newEntryBtn.addClass("loading"),Craft.sendActionRequest("POST","entries/create",{data:{siteId:this.siteId,section:i.handle}}).then((function(t){var s=t.data;"index"===e.settings.context?document.location.href=Craft.getUrl(s.cpEditUrl,{fresh:1}):Craft.createElementEditor(e.elementType,{siteId:e.siteId,elementId:s.entry.id,draftId:s.entry.draftId,params:{fresh:1}}).on("submit",(function(){var t="section:".concat(i.uid);e.sourceKey!==t&&e.selectSourceByKey(t),e.clearSearch(),e.setSelectedSortAttribute("dateCreated","desc"),e.selectElementAfterUpdate(s.entry.id),e.updateElements()}))})).finally((function(){e.$newEntryBtn.removeClass("loading")}))}}}),Craft.registerElementIndexClass("craft\\elements\\Entry",Craft.EntryIndex)},8201:function(){Craft.FieldLayoutDesigner=Garnish.Base.extend({$container:null,$configInput:null,$tabContainer:null,$newTabBtn:null,$sidebar:null,$libraryToggle:null,$selectedLibrary:null,$fieldLibrary:null,$uiLibrary:null,$uiLibraryElements:null,$fieldSearch:null,$clearFieldSearchBtn:null,$fieldGroups:null,$fields:null,tabGrid:null,elementDrag:null,_config:null,init:function(t,e){var i=this;this.$container=$(t),this.setSettings(e,Craft.FieldLayoutDesigner.defaults),this.$configInput=this.$container.children("input[data-config-input]"),this._config=JSON.parse(this.$configInput.val()),this._config.tabs||(this._config.tabs=[]);var s=this.$container.children(".fld-workspace");this.$tabContainer=s.children(".fld-tabs"),this.$newTabBtn=s.children(".fld-new-tab-btn"),this.$sidebar=this.$container.children(".fld-sidebar"),this.$fieldLibrary=this.$selectedLibrary=this.$sidebar.children(".fld-field-library");var a=this.$fieldLibrary.children(".search");this.$fieldSearch=a.children("input"),this.$clearFieldSearchBtn=a.children(".clear"),this.$fieldGroups=this.$sidebar.find(".fld-field-group"),this.$fields=this.$fieldGroups.children(".fld-element"),this.$uiLibrary=this.$sidebar.children(".fld-ui-library"),this.$uiLibraryElements=this.$uiLibrary.children(),this.tabGrid=new Craft.Grid(this.$tabContainer,{itemSelector:".fld-tab",minColWidth:264,fillMode:"grid",snapToGrid:24});for(var n=this.$tabContainer.children(),r=0;r<n.length;r++)this.initTab($(n[r]));if(this.elementDrag=new Craft.FieldLayoutDesigner.ElementDrag(this),this.settings.customizableTabs&&(this.tabDrag=new Craft.FieldLayoutDesigner.TabDrag(this),this.addListener(this.$newTabBtn,"activate","addTab")),this.settings.customizableUi){var o=this.$sidebar.children(".btngroup");new Craft.Listbox(o,{onChange:function(t){i.$selectedLibrary.addClass("hidden"),i.$selectedLibrary=i["$".concat(t.data("library"),"Library")].removeClass("hidden")}})}this.addListener(this.$fieldSearch,"input",(function(){var t=i.$fieldSearch.val().toLowerCase().replace(/['"]/g,"");if(!t)return i.$fieldLibrary.find(".filtered").removeClass("filtered"),void i.$clearFieldSearchBtn.addClass("hidden");i.$clearFieldSearchBtn.removeClass("hidden");var e=i.$fields.filter('[data-keywords*="'.concat(t,'"]')).add(i.$fieldGroups.filter('[data-name*="'.concat(t,'"]')).children(".fld-element")).removeClass("filtered");i.$fields.not(e).addClass("filtered");for(var s=0;s<i.$fieldGroups.length;s++){var a=i.$fieldGroups.eq(s);a.find(".fld-element:not(.hidden):not(.filtered)").length?a.removeClass("filtered"):a.addClass("filtered")}})),this.addListener(this.$fieldSearch,"keydown",(function(t){switch(t.keyCode){case Garnish.ESC_KEY:i.$fieldSearch.val("").trigger("input");break;case Garnish.RETURN_KEY:t.preventDefault()}})),this.addListener(this.$clearFieldSearchBtn,"click",(function(){i.$fieldSearch.val("").trigger("input")}))},initTab:function(t){return new Craft.FieldLayoutDesigner.Tab(this,t)},removeFieldByHandle:function(t){this.$fields.filter('[data-attribute="'.concat(t,'"]:first')).removeClass("hidden").closest(".fld-field-group").removeClass("hidden")},addTab:function(){if(this.settings.customizableTabs){var t=Craft.escapeHtml(prompt(Craft.t("app","Give your tab a name.")));if(t){var e=$('\n<div class="fld-tab">\n <div class="tabs">\n <div class="tab sel draggable">\n <span>'.concat(t,'</span>\n <a class="settings icon" title="').concat(Craft.t("app","Settings"),'"></a>\n </div>\n </div>\n <div class="fld-tabcontent"></div>\n</div>\n')).appendTo(this.$tabContainer);this.tabGrid.addItems(e),this.tabDrag.addItems(e),this.initTab(e).updatePositionInConfig()}}},get config(){return this._config},set config(t){this._config=t,this.$configInput.val(JSON.stringify(t))},updateConfig:function(t){var e=t(this.config);!1!==e&&(this.config=e)}},{defaults:{customizableTabs:!0,customizableUi:!0},createSlideout:function createSlideout(contents,js){var $body=$("<div/>",{class:"fld-element-settings-body"});$("<div/>",{class:"fields",html:contents}).appendTo($body);var $footer=$("<div/>",{class:"fld-element-settings-footer"});$("<div/>",{class:"flex-grow"}).appendTo($footer);var $cancelBtn=Craft.ui.createButton({label:Craft.t("app","Close"),spinner:!0}).appendTo($footer);Craft.ui.createSubmitButton({class:"secondary",label:Craft.t("app","Apply"),spinner:!0}).appendTo($footer);var $contents=$body.add($footer),slideout=new Craft.Slideout($contents,{containerElement:"form",containerAttributes:{action:"",method:"post",novalidate:"",class:"fld-element-settings"}});return slideout.on("open",(function(){Garnish.requestAnimationFrame((function(){slideout.$container.find(".text:first").trigger("focus")}))})),$cancelBtn.on("click",(function(){slideout.close()})),js&&eval(js),Craft.initUiElements(slideout.$container),slideout}}),Craft.FieldLayoutDesigner.Tab=Garnish.Base.extend({designer:null,uid:null,$container:null,slideout:null,destroyed:!1,init:function(t,e){this.designer=t,this.$container=e,this.$container.data("fld-tab",this),this.uid=this.$container.data("uid"),this.uid||(this.uid=Craft.uuid(),this.config={uid:this.uid,name:this.$container.find(".tabs .tab span").text(),elements:[]},this.$container.data("settings-namespace",this.designer.$container.data("new-tab-settings-namespace").replace(/\bTAB_UID\b/g,this.uid)),this.$container.data("settings-html",this.designer.$container.data("new-tab-settings-html").replace(/\bTAB_UID\b/g,this.uid).replace(/\bTAB_NAME\b/g,this.config.name)),this.$container.data("settings-js",this.designer.$container.data("new-tab-settings-js").replace(/\bTAB_UID\b/g,this.uid))),this.designer.settings.customizableTabs&&(this.settingsNamespace=this.$container.data("settings-namespace"),this.createMenu());for(var i=this.$container.children(".fld-tabcontent").children(),s=0;s<i.length;s++)this.initElement($(i[s]))},createMenu:function(){var t=this,e=this.$container.find(".tabs .settings");$('<div class="menu" data-align="center"/>').insertAfter(e).append($("<ul/>").append($("<li/>").append($("<a/>",{"data-action":"settings",text:Craft.t("app","Settings")}))).append($("<li/>").append($("<a/>",{"data-action":"remove",text:Craft.t("app","Remove")})))).append($("<hr/>")).append($("<ul/>").append($("<li/>").append($("<a/>",{"data-action":"moveLeft",text:Craft.t("app","Move to the left")}))).append($("<li/>").append($("<a/>",{"data-action":"moveRight",text:Craft.t("app","Move to the right")}))));var i=new Garnish.MenuBtn(e,{onOptionSelect:this.onTabOptionSelect.bind(this)});i.menu.on("show",(function(){t.$container.prev(".fld-tab").length?i.menu.$container.find("[data-action=moveLeft]").removeClass("disabled"):i.menu.$container.find("[data-action=moveLeft]").addClass("disabled"),t.$container.next(".fld-tab").length?i.menu.$container.find("[data-action=moveRight]").removeClass("disabled"):i.menu.$container.find("[data-action=moveRight]").addClass("disabled")}))},onTabOptionSelect:function(t){if(this.designer.settings.customizableTabs)switch($(t).data("action")){case"settings":this.slideout?this.slideout.open():this.createSettings();break;case"remove":this.destroy();break;case"moveLeft":var e=this.$container.prev(".fld-tab");e.length&&(this.$container.insertBefore(e),this.updatePositionInConfig());break;case"moveRight":var i=this.$container.next(".fld-tab");i.length&&(this.$container.insertAfter(i),this.updatePositionInConfig())}},createSettings:function(){var t=this,e=this.$container.data("settings-html"),i=this.$container.data("settings-js");this.slideout=Craft.FieldLayoutDesigner.createSlideout(e,i),this.slideout.$container.on("submit",(function(e){e.preventDefault(),t.applySettings()}))},applySettings:function(){var t=this;if(this.slideout.$container.find('[name$="[name]"]').val()){var e=this.slideout.$container.find("button[type=submit]").addClass("loading"),i=$.extend({},this.config);delete i.elements,Craft.sendActionRequest("POST","fields/apply-layout-tab-settings",{data:{config:i,settingsNamespace:this.settingsNamespace,settings:this.slideout.$container.serialize()}}).then((function(e){t.updateConfig((function(t){return $.extend(e.data.config,{elements:t.elements})}));var i=t.$container.find(".tabs .tab span"),s=i.children(".fld-indicator");e.data.hasConditions?s.length||i.append($("<div/>",{class:"fld-indicator",title:Craft.t("app","This tab is conditional"),"aria-label":Craft.t("app","This tab is conditional"),"data-icon":"condition"})):s.length&&s.remove(),t.slideout.close()})).catch((function(t){Craft.cp.displayError(),console.error(t)})).finally((function(){e.removeClass("loading"),t.slideout.close()}))}else alert(Craft.t("app","You must specify a tab name."))},initElement:function(t){return new Craft.FieldLayoutDesigner.Element(this,t)},get index(){var t=this;return this.designer.config.tabs.findIndex((function(e){return e.uid===t.uid}))},get config(){var t=this;if(!this.uid)throw"Tab is missing its UID";var e=this.designer.config.tabs.find((function(e){return e.uid===t.uid}));return e||(e={uid:this.uid,elements:[]},this.config=e),e},set config(t){if(!this.destroyed){t.name&&t.name!==this.config.name&&this.$container.find(".tabs .tab span").text(t.name);var e=this.designer.config,i=this.index;if(-1!==i)e.tabs[i]=t;else{var s=$.inArray(this.$container[0],this.$container.parent().children(".fld-tab"));e.tabs.splice(s,0,t)}this.designer.config=e}},updateConfig:function(t){if(!this.destroyed){var e=t(this.config);!1!==e&&(this.config=e)}},updatePositionInConfig:function(){var t=this;this.destroyed||this.designer.updateConfig((function(e){var i=t.config,s=t.index,a=$.inArray(t.$container[0],t.$container.parent().children(".fld-tab"));return-1!==s&&e.tabs.splice(s,1),e.tabs.splice(a,0,i),e}))},destroy:function(){var t=this;if(!this.destroyed){this.destroyed=!0,this.designer.updateConfig((function(e){var i=t.index;return-1!==i&&(e.tabs.splice(i,1),e)}));for(var e=this.$container.find(".fld-element"),i=0;i<e.length;i++)e.eq(i).data("fld-element").destroy();this.designer.tabGrid.removeItems(this.$container),this.designer.tabDrag.removeItems(this.$container),this.$container.remove(),this.base()}}}),Craft.FieldLayoutDesigner.Element=Garnish.Base.extend({tab:null,$container:null,$settingsContainer:null,$editBtn:null,uid:null,isField:!1,attribute:null,requirable:!1,hasCustomWidth:!1,hasSettings:!1,settingsNamespace:null,slideout:null,init:function(t,e){var i=this;this.tab=t,this.$container=e,this.$container.data("fld-element",this),this.uid=this.$container.data("uid"),this.uid||(this.uid=Craft.uuid(),this.config=$.extend(this.$container.data("config"),{uid:this.uid})),this.isField=this.$container.hasClass("fld-field"),this.requirable=this.isField&&Garnish.hasAttr(this.$container,"data-requirable"),this.isField&&(this.attribute=this.$container.data("attribute")),this.settingsNamespace=this.$container.data("settings-namespace").replace(/\bELEMENT_UID\b/g,this.uid);var s=(this.$container.data("settings-html")||"").replace(/\bELEMENT_UID\b/g,this.uid),a=this.requirable&&this.$container.hasClass("fld-required");if(this.hasCustomWidth=this.tab.designer.settings.customizableUi&&Garnish.hasAttr(this.$container,"data-has-custom-width"),this.hasSettings=s||this.requirable,this.hasSettings){this.$settingsContainer=$("<div/>",{class:"hidden"}),this.$editBtn=$("<a/>",{role:"button",tabindex:0,class:"settings icon",title:Craft.t("app","Edit")});var n=function(){i.slideout?i.slideout.open():i.createSettings(s,a)};this.$editBtn.on("click",n),this.$container.on("dblclick",n)}this.initUi(),this.$container.attr("data-keywords",null),this.$container.attr("data-settings-html",null)},initUi:function(){var t=this;this.hasCustomWidth&&new Craft.SlidePicker(this.config.width||100,{min:25,max:100,step:25,valueLabel:function(t){return Craft.t("app","{pct} width",{pct:"".concat(t,"%")})},onChange:function(e){t.updateConfig((function(t){return t.width=e,t}))}}).$container.appendTo(this.$container),this.hasSettings&&this.$editBtn.appendTo(this.$container)},createSettings:function(t,e){var i=this,s=(this.$container.data("settings-js")||"").replace(/\bELEMENT_UID\b/g,this.uid);if(this.slideout=Craft.FieldLayoutDesigner.createSlideout(t,s),this.slideout.$container.on("submit",(function(t){t.preventDefault(),i.applySettings()})),this.requirable){var a=this.slideout.$container.find(".fields:first");Craft.ui.createLightswitchField({label:Craft.t("app","Required"),name:"".concat(this.settingsNamespace,"[required]"),on:e}).prependTo(a)}this.trigger("createSettings")},applySettings:function(){var t=this,e=this.slideout.$container.find("button[type=submit]").addClass("loading");Craft.sendActionRequest("POST","fields/apply-layout-element-settings",{data:{config:this.config,settingsNamespace:this.settingsNamespace,settings:this.slideout.$container.serialize()}}).then((function(e){t.config=e.data.config,t.$editBtn.detach(),t.$container.html($(e.data.selectorHtml).html()),t.initUi()})).catch((function(t){Craft.cp.displayError(),console.error(t)})).finally((function(){e.removeClass("loading"),t.updateRequiredClass(),t.slideout.close()}))},updateRequiredClass:function(){this.requirable&&(this.config.required?this.$container.addClass("fld-required"):this.$container.removeClass("fld-required"))},get index(){var t=this,e=this.tab.config;return void 0===e?-1:e.elements.findIndex((function(e){return e.uid===t.uid}))},get config(){var t=this;if(!this.uid)throw"Tab is missing its UID";var e=this.tab.config.elements.find((function(e){return e.uid===t.uid}));return e||(e={uid:this.uid},this.config=e),e},set config(t){var e=this.tab.config,i=this.index;if(-1!==i)e.elements[i]=t;else{var s=$.inArray(this.$container[0],this.$container.parent().children(".fld-element"));e.elements.splice(s,0,t)}this.tab.config=e},updateConfig:function(t){var e=t(this.config);!1!==e&&(this.config=e)},updatePositionInConfig:function(){var t=this;this.tab.updateConfig((function(e){var i=t.config,s=t.index,a=$.inArray(t.$container[0],t.$container.parent().children(".fld-element"));return-1!==s&&e.elements.splice(s,1),e.elements.splice(a,0,i),e}))},destroy:function(){var t=this;this.tab.updateConfig((function(e){var i=t.index;return-1!==i&&(e.elements.splice(i,1),e)})),this.tab.designer.elementDrag.removeItems(this.$container),this.$container.remove(),this.isField&&this.tab.designer.removeFieldByHandle(this.attribute),this.base()}}),Craft.FieldLayoutDesigner.BaseDrag=Garnish.Drag.extend({designer:null,$insertion:null,showingInsertion:!1,$caboose:null,init:function(t,e){this.designer=t,this.base(this.findItems(),e)},onDragStart:function(){this.base(),this.$insertion=this.createInsertion(),this.$caboose=this.createCaboose(),this.$items=$().add(this.$items.add(this.$caboose)),Garnish.$bod.addClass("dragging")},removeCaboose:function(){this.$items=this.$items.not(this.$caboose),this.$caboose.remove()},swapDraggeeWithInsertion:function(){this.$insertion.insertBefore(this.$draggee),this.$draggee.detach(),this.$items=$().add(this.$items.not(this.$draggee).add(this.$insertion)),this.showingInsertion=!0},swapInsertionWithDraggee:function(){this.$insertion.replaceWith(this.$draggee),this.$items=$().add(this.$items.not(this.$insertion).add(this.$draggee)),this.showingInsertion=!1},setMidpoints:function(){for(var t=0;t<this.$items.length;t++){var e=$(this.$items[t]),i=e.offset();e.hasClass("unused")||e.data("midpoint",{left:i.left+e.outerWidth()/2,top:i.top+e.outerHeight()/2})}},getClosestItem:function(){for(this.getClosestItem._closestItem=null,this.getClosestItem._closestItemMouseDiff=null,this.getClosestItem._i=0;this.getClosestItem._i<this.$items.length;this.getClosestItem._i++)this.getClosestItem._$item=$(this.$items[this.getClosestItem._i]),this.getClosestItem._midpoint=this.getClosestItem._$item.data("midpoint"),this.getClosestItem._midpoint&&(this.getClosestItem._mouseDiff=Garnish.getDist(this.getClosestItem._midpoint.left,this.getClosestItem._midpoint.top,this.mouseX,this.mouseY),(null===this.getClosestItem._closestItem||this.getClosestItem._mouseDiff<this.getClosestItem._closestItemMouseDiff)&&(this.getClosestItem._closestItem=this.getClosestItem._$item[0],this.getClosestItem._closestItemMouseDiff=this.getClosestItem._mouseDiff));return this.getClosestItem._closestItem},checkForNewClosestItem:function(){this.checkForNewClosestItem._closestItem=this.getClosestItem(),this.checkForNewClosestItem._closestItem!==this.$insertion[0]&&(this.showingInsertion&&$.inArray(this.$insertion[0],this.$items)<$.inArray(this.checkForNewClosestItem._closestItem,this.$items)&&-1===$.inArray(this.checkForNewClosestItem._closestItem,this.$caboose)?this.$insertion.insertAfter(this.checkForNewClosestItem._closestItem):this.$insertion.insertBefore(this.checkForNewClosestItem._closestItem),this.$items=$().add(this.$items.add(this.$insertion)),this.showingInsertion=!0,this.designer.tabGrid.refreshCols(!0),this.setMidpoints())},onDragStop:function(){var t=this;this.showingInsertion&&this.swapInsertionWithDraggee(),this.removeCaboose(),this.designer.tabGrid.refreshCols(!0);var e=this.$draggee.offset();!e||0===e.top&&0===e.left?(this.$draggee.css({display:this.draggeeDisplay,visibility:"visible",opacity:0}).velocity({opacity:1},Garnish.FX_DURATION),this.helpers[0].velocity({opacity:0},Garnish.FX_DURATION,(function(){t._showDraggee()}))):this.returnHelpersToDraggees(),this.base(),Garnish.$bod.removeClass("dragging")}}),Craft.FieldLayoutDesigner.TabDrag=Craft.FieldLayoutDesigner.BaseDrag.extend({init:function(t){this.base(t,{handle:".tab"})},findItems:function(){return this.designer.$tabContainer.find("> div.fld-tab")},onDragStart:function(){this.base(),this.swapDraggeeWithInsertion(),this.setMidpoints()},swapDraggeeWithInsertion:function(){this.base(),this.designer.tabGrid.removeItems(this.$draggee),this.designer.tabGrid.addItems(this.$insertion)},swapInsertionWithDraggee:function(){this.base(),this.designer.tabGrid.removeItems(this.$insertion),this.designer.tabGrid.addItems(this.$draggee)},onDrag:function(){this.checkForNewClosestItem(),this.base()},onDragStop:function(){this.base(),this.$draggee.css({display:this.draggeeDisplay,visibility:"hidden"}),this.$draggee.data("fld-tab").updatePositionInConfig()},createCaboose:function(){var t=$('<div class="fld-tab fld-tab-caboose"/>').appendTo(this.designer.$tabContainer);return this.designer.tabGrid.addItems(t),t},removeCaboose:function(){this.base(),this.designer.tabGrid.removeItems(this.$caboose)},createInsertion:function(){var t=this.$draggee.find(".tab");return $('\n<div class="fld-tab fld-insertion" style="height: '.concat(this.$draggee.height(),'px;">\n <div class="tabs"><div class="tab sel draggable" style="width: ').concat(t.width(),"px; height: ").concat(t.height(),'px;"></div></div>\n <div class="fld-tabcontent" style="height: ').concat(this.$draggee.find(".fld-tabcontent").height(),'px;"></div>\n</div>\n'))}}),Craft.FieldLayoutDesigner.ElementDrag=Craft.FieldLayoutDesigner.BaseDrag.extend({draggingLibraryElement:!1,draggingField:!1,originalTab:null,onDragStart:function(){this.base(),this.draggingLibraryElement=this.$draggee.hasClass("unused"),this.draggingField=this.$draggee.hasClass("fld-field"),this.draggingLibraryElement&&!this.draggingField&&this.$draggee.css({display:this.draggeeDisplay,visibility:"visible"}),this.draggingLibraryElement?this.originalTab=null:(this.originalTab=this.$draggee.closest(".fld-tab").data("fld-tab"),this.swapDraggeeWithInsertion()),this.setMidpoints()},onDrag:function(){this.isDraggeeMandatory()||this.isHoveringOverTab()?this.checkForNewClosestItem():this.showingInsertion&&(this.$insertion.remove(),this.$items=$().add(this.$items.not(this.$insertion)),this.showingInsertion=!1,this.designer.tabGrid.refreshCols(!0),this.setMidpoints()),this.base()},isDraggeeMandatory:function(){return Garnish.hasAttr(this.$draggee,"data-mandatory")},isHoveringOverTab:function(){for(var t=0;t<this.designer.tabGrid.$items.length;t++)if(Garnish.hitTest(this.mouseX,this.mouseY,this.designer.tabGrid.$items.eq(t)))return!0;return!1},findItems:function(){return this.designer.$tabContainer.find(".fld-element").add(this.designer.$sidebar.find(".fld-element"))},createCaboose:function(){for(var t=$(),e=this.designer.$tabContainer.find("> .fld-tab > .fld-tabcontent"),i=0;i<e.length;i++)t=t.add($("<div/>").appendTo(e[i]));return t},createInsertion:function(){return $('<div class="fld-element fld-insertion" style="height: '.concat(this.$draggee.outerHeight(),'px;"/>'))},onDragStop:function(){var t=this.showingInsertion;if(t){if(this.draggingLibraryElement){var e=this.$draggee.clone().removeClass("unused");this.draggingField&&(this.$draggee.css({visibility:"inherit",display:"field"}).addClass("hidden"),0===this.$draggee.siblings(".fld-field:not(.hidden)").length&&this.$draggee.closest(".fld-field-group").addClass("hidden")),this.$draggee=e,this.addItems(e)}}else if(!this.draggingLibraryElement){var i=this.draggingField?this.designer.$fields.filter('[data-attribute="'.concat(this.$draggee.data("attribute"),'"]:first')):this.designer.$uiLibraryElements.filter('[data-type="'.concat(this.$draggee.data("type"),'"]:first'));this.draggingField&&(i.removeClass("hidden"),i.closest(".fld-field-group").removeClass("hidden")),this.$draggee.data("fld-element").destroy(),this.$draggee=i}if(this.base(),this.$draggee.css({display:this.draggeeDisplay,visibility:this.draggingField||t?"hidden":"visible"}),t){var s,a=this.$draggee.closest(".fld-tab").data("fld-tab");if(this.draggingLibraryElement)s=a.initElement(this.$draggee);else if(s=this.$draggee.data("fld-element"),a!==this.originalTab){var n=s.config;this.originalTab.updateConfig((function(t){var e=s.index;return-1!==e&&(t.elements.splice(e,1),t)})),this.$draggee.data("fld-element").tab=a,s.config=n}s.updatePositionInConfig()}}})},3347:function(){Craft.FieldToggle=Garnish.Base.extend({$toggle:null,targetPrefix:null,targetSelector:null,reverseTargetSelector:null,_$target:null,_$reverseTarget:null,type:null,init:function(t){switch(this.$toggle=$(t),this.$toggle.data("fieldtoggle")&&(console.warn("Double-instantiating a field toggle on an element"),this.$toggle.data("fieldtoggle").destroy()),this.$toggle.data("fieldtoggle",this),this.type=this.getType(),"select"===this.type||"fieldset"===this.type?this.targetPrefix=this.$toggle.attr("data-target-prefix")||"":(this.targetSelector=this.normalizeTargetSelector(this.$toggle.data("target")),this.reverseTargetSelector=this.normalizeTargetSelector(this.$toggle.data("reverse-target"))),this.findTargets(),this.type){case"link":this.addListener(this.$toggle,"click","onToggleChange");break;case"fieldset":this.addListener(this.$toggle.find("input"),"change","onToggleChange");break;default:this.addListener(this.$toggle,"change","onToggleChange"),this.onToggleChange()}},normalizeTargetSelector:function(t){return t&&!t.match(/^[#\.]/)&&(t="#"+t),t},getType:function(){var t=this.$toggle.prop("nodeName");if("INPUT"===t&&"checkbox"===this.$toggle.attr("type")||"checkbox"===this.$toggle.attr("role")||"switch"===this.$toggle.attr("role"))return"checkbox";switch(t){case"SELECT":return Garnish.hasAttr(this.$toggle,"data-boolean-menu")?"booleanMenu":"select";case"A":return"link";default:return"fieldset"}},findTargets:function(){"select"===this.type||"fieldset"===this.type?(this.getToggleVal(),this._$target=$(this.normalizeTargetSelector(this.targetPrefix+this.getToggleVal()))):(this.targetSelector&&(this._$target=$(this.targetSelector)),this.reverseTargetSelector&&(this._$reverseTarget=$(this.reverseTargetSelector)))},getToggleVal:function(){switch(this.type){case"checkbox":return void 0!==this.$toggle.prop("checked")?this.$toggle.prop("checked"):"true"===this.$toggle.attr("aria-checked");case"booleanMenu":var t=this.$toggle.data("boolean");if(void 0!==t)return t;var e=this.$toggle.val();return e&&"0"!==e;default:var i;return null==(i="fieldset"===this.type?this.$toggle.find("input:checked:first").val():Garnish.getInputPostVal(this.$toggle))?null:i.replace(/[^\w]+/g,"-")}},onToggleChange:function(){"select"===this.type||"fieldset"===this.type?(this.hideTarget(this._$target),this.findTargets(),this.showTarget(this._$target)):(this.findTargets(),"link"===this.type?this.onToggleChange._show=this.$toggle.hasClass("collapsed")||!this.$toggle.hasClass("expanded"):this.onToggleChange._show=!!this.getToggleVal(),this.onToggleChange._show?(this.showTarget(this._$target),this.hideTarget(this._$reverseTarget)):(this.hideTarget(this._$target),this.showTarget(this._$reverseTarget)),delete this.onToggleChange._show)},showTarget:function(t){var e=this;if(t&&t.length){if(this.showTarget._currentHeight=t.height(),t.removeClass("hidden"),"select"!==this.type&&"fieldset"!==this.type){"link"===this.type&&(this.$toggle.removeClass("collapsed"),this.$toggle.addClass("expanded"));for(var i=0;i<t.length;i++)!function(t){"SPAN"!==t.prop("nodeName")&&(t.height("auto"),e.showTarget._targetHeight=t.height(),t.css({height:e.showTarget._currentHeight,overflow:"hidden"}),t.velocity("stop"),t.velocity({height:e.showTarget._targetHeight},"fast",(function(){t.css({height:"",overflow:""})})))}(t.eq(i));delete this.showTarget._targetHeight}delete this.showTarget._currentHeight,Garnish.$win.trigger("resize")}},hideTarget:function(t){if(t&&t.length)if("select"===this.type||"fieldset"===this.type)t.addClass("hidden");else{"link"===this.type&&(this.$toggle.removeClass("expanded"),this.$toggle.addClass("collapsed"));for(var e=0;e<t.length;e++)!function(t){t.hasClass("hidden")||("SPAN"===t.prop("nodeName")?t.addClass("hidden"):(t.css("overflow","hidden"),t.velocity("stop"),t.velocity({height:0},"fast",(function(){t.addClass("hidden")}))))}(t.eq(e))}},destroy:function(){this.$toggle.removeData("fieldtoggle"),this.base()}})},9478:function(){Craft.Grid=Garnish.Base.extend({$container:null,$items:null,items:null,totalCols:null,colGutterDrop:null,colPctWidth:null,possibleItemColspans:null,possibleItemPositionsByColspan:null,itemPositions:null,itemColspansByPosition:null,layouts:null,layout:null,itemHeights:null,leftPadding:null,_refreshingCols:!1,_refreshColsAfterRefresh:!1,_forceRefreshColsAfterRefresh:!1,init:function(t,e){var i=this;this.$container=$(t),this.$container.data("grid")&&(console.warn("Double-instantiating a grid on an element"),this.$container.data("grid").destroy()),this.$container.data("grid",this),this.setSettings(e,Craft.Grid.defaults),this.handleContainerHeightProxy=function(){i.refreshCols(!1,!0)},this.$items=this.$container.children(this.settings.itemSelector),this.setItems(),this.refreshCols(!0,!1),Garnish.$doc.ready((function(){i.refreshCols(!1,!1)}))},addItems:function(t){this.$items=$().add(this.$items.add(t)),this.setItems(),this.refreshCols(!0,!0)},removeItems:function(t){this.$items=$().add(this.$items.not(t)),this.setItems(),this.refreshCols(!0,!0)},resetItemOrder:function(){this.$items=$().add(this.$items),this.setItems(),this.refreshCols(!0,!0)},setItems:function(){for(this.setItems._={},this.items=[],this.setItems._.i=0;this.setItems._.i<this.$items.length;this.setItems._.i++)this.items.push($(this.$items[this.setItems._.i]));delete this.setItems._},refreshCols:function(t){if(this._refreshingCols)return this._refreshColsAfterRefresh=!0,void(t&&(this._forceRefreshColsAfterRefresh=!0));if(this._refreshingCols=!0,this.items.length)if(this.refreshCols._={},this.refreshCols._.oldHeight=this.$container[0].style.height,this.$container[0].style.height=1,this.refreshCols._.scrollHeight=this.$container[0].scrollHeight,this.$container[0].style.height=this.refreshCols._.oldHeight,0!==this.refreshCols._.scrollHeight)if(this.settings.cols?this.refreshCols._.totalCols=this.settings.cols:(this.refreshCols._.totalCols=Math.floor(this.$container.width()/this.settings.minColWidth),null!==this.totalCols&&this.refreshCols._.totalCols>this.totalCols&&(this.refreshCols._.totalCols=Math.floor((this.$container.width()-20)/this.settings.minColWidth)),this.settings.maxCols&&this.refreshCols._.totalCols>this.settings.maxCols&&(this.refreshCols._.totalCols=this.settings.maxCols)),0===this.refreshCols._.totalCols&&(this.refreshCols._.totalCols=1),!0===t||this.totalCols!==this.refreshCols._.totalCols){if(this.totalCols=this.refreshCols._.totalCols,this.colGutterDrop=this.settings.gutter*(this.totalCols-1)/this.totalCols,this.removeListener(this.$container,"resize"),"grid"===this.settings.fillMode)for(this.refreshCols._.itemIndex=0;this.refreshCols._.itemIndex<this.items.length;){for(this.refreshCols._.tallestItemHeight=-1,this.refreshCols._.colIndex=0,this.refreshCols._.i=this.refreshCols._.itemIndex;this.refreshCols._.i<this.refreshCols._.itemIndex+this.totalCols&&this.refreshCols._.i<this.items.length;this.refreshCols._.i++)this.refreshCols._.itemHeight=this.items[this.refreshCols._.i].height("auto").height(),this.refreshCols._.itemHeight>this.refreshCols._.tallestItemHeight&&(this.refreshCols._.tallestItemHeight=this.refreshCols._.itemHeight),this.refreshCols._.colIndex++;for(this.settings.snapToGrid&&(this.refreshCols._.remainder=this.refreshCols._.tallestItemHeight%this.settings.snapToGrid,this.refreshCols._.remainder&&(this.refreshCols._.tallestItemHeight+=this.settings.snapToGrid-this.refreshCols._.remainder)),this.refreshCols._.i=this.refreshCols._.itemIndex;this.refreshCols._.i<this.refreshCols._.itemIndex+this.totalCols&&this.refreshCols._.i<this.items.length;this.refreshCols._.i++)this.items[this.refreshCols._.i].height(this.refreshCols._.tallestItemHeight);this.refreshCols._.itemIndex+=this.totalCols}else if(this.removeListener(this.$items,"resize"),1===this.totalCols)this.$container.height("auto"),this.$items.show().css({position:"relative",width:"auto",top:0}).css(Craft.left,0);else{for(this.$items.css("position","absolute"),this.colPctWidth=100/this.totalCols,this.layouts=[],this.itemPositions=[],this.itemColspansByPosition=[],this.possibleItemColspans=[],this.possibleItemPositionsByColspan=[],this.itemHeightsByColspan=[],this.refreshCols._.item=0;this.refreshCols._.item<this.items.length;this.refreshCols._.item++)for(this.possibleItemColspans[this.refreshCols._.item]=[],this.possibleItemPositionsByColspan[this.refreshCols._.item]={},this.itemHeightsByColspan[this.refreshCols._.item]={},this.refreshCols._.$item=this.items[this.refreshCols._.item].show(),this.refreshCols._.positionRight="right"===this.refreshCols._.$item.data("position"),this.refreshCols._.positionLeft="left"===this.refreshCols._.$item.data("position"),this.refreshCols._.minColspan=this.refreshCols._.$item.data("colspan")?this.refreshCols._.$item.data("colspan"):this.refreshCols._.$item.data("min-colspan")?this.refreshCols._.$item.data("min-colspan"):1,this.refreshCols._.maxColspan=this.refreshCols._.$item.data("colspan")?this.refreshCols._.$item.data("colspan"):this.refreshCols._.$item.data("max-colspan")?this.refreshCols._.$item.data("max-colspan"):this.totalCols,this.refreshCols._.minColspan>this.totalCols&&(this.refreshCols._.minColspan=this.totalCols),this.refreshCols._.maxColspan>this.totalCols&&(this.refreshCols._.maxColspan=this.totalCols),this.refreshCols._.colspan=this.refreshCols._.minColspan;this.refreshCols._.colspan<=this.refreshCols._.maxColspan;this.refreshCols._.colspan++)for(this.refreshCols._.$item.css("width",this.getItemWidthCss(this.refreshCols._.colspan)),this.itemHeightsByColspan[this.refreshCols._.item][this.refreshCols._.colspan]=this.refreshCols._.$item.outerHeight(),this.possibleItemColspans[this.refreshCols._.item].push(this.refreshCols._.colspan),this.possibleItemPositionsByColspan[this.refreshCols._.item][this.refreshCols._.colspan]=[],this.refreshCols._.positionLeft?(this.refreshCols._.minPosition=0,this.refreshCols._.maxPosition=0):this.refreshCols._.positionRight?(this.refreshCols._.minPosition=this.totalCols-this.refreshCols._.colspan,this.refreshCols._.maxPosition=this.refreshCols._.minPosition):(this.refreshCols._.minPosition=0,this.refreshCols._.maxPosition=this.totalCols-this.refreshCols._.colspan),this.refreshCols._.position=this.refreshCols._.minPosition;this.refreshCols._.position<=this.refreshCols._.maxPosition;this.refreshCols._.position++)this.possibleItemPositionsByColspan[this.refreshCols._.item][this.refreshCols._.colspan].push(this.refreshCols._.position);for(this.refreshCols._.colHeights=[],this.refreshCols._.i=0;this.refreshCols._.i<this.totalCols;this.refreshCols._.i++)this.refreshCols._.colHeights.push(0);for(this.createLayouts(0,[],[],this.refreshCols._.colHeights,0),this.refreshCols._.layoutTotalCols=[],this.refreshCols._.i=0;this.refreshCols._.i<this.layouts.length;this.refreshCols._.i++)for(this.refreshCols._.layoutTotalCols[this.refreshCols._.i]=0,this.refreshCols._.j=0;this.refreshCols._.j<this.totalCols;this.refreshCols._.j++)this.layouts[this.refreshCols._.i].colHeights[this.refreshCols._.j]&&this.refreshCols._.layoutTotalCols[this.refreshCols._.i]++;for(this.refreshCols._.highestTotalCols=Math.max.apply(null,this.refreshCols._.layoutTotalCols),this.refreshCols._.i=this.layouts.length-1;this.refreshCols._.i>=0;this.refreshCols._.i--)this.refreshCols._.layoutTotalCols[this.refreshCols._.i]!==this.refreshCols._.highestTotalCols&&this.layouts.splice(this.refreshCols._.i,1);for(this.refreshCols._.layoutHeights=[],this.refreshCols._.i=0;this.refreshCols._.i<this.layouts.length;this.refreshCols._.i++)this.refreshCols._.layoutHeights.push(Math.max.apply(null,this.layouts[this.refreshCols._.i].colHeights));for(this.refreshCols._.shortestHeight=Math.min.apply(null,this.refreshCols._.layoutHeights),this.refreshCols._.shortestLayouts=[],this.refreshCols._.emptySpaces=[],this.refreshCols._.i=0;this.refreshCols._.i<this.refreshCols._.layoutHeights.length;this.refreshCols._.i++)if(this.refreshCols._.layoutHeights[this.refreshCols._.i]===this.refreshCols._.shortestHeight){for(this.refreshCols._.shortestLayouts.push(this.layouts[this.refreshCols._.i]),this.refreshCols._.emptySpace=this.layouts[this.refreshCols._.i].emptySpace,this.refreshCols._.j=0;this.refreshCols._.j<this.totalCols;this.refreshCols._.j++)this.refreshCols._.emptySpace+=this.refreshCols._.shortestHeight-this.layouts[this.refreshCols._.i].colHeights[this.refreshCols._.j];this.refreshCols._.emptySpaces.push(this.refreshCols._.emptySpace)}for(this.layout=this.refreshCols._.shortestLayouts[$.inArray(Math.min.apply(null,this.refreshCols._.emptySpaces),this.refreshCols._.emptySpaces)],this.refreshCols._.i=0;this.refreshCols._.i<this.items.length;this.refreshCols._.i++)this.refreshCols._.css={width:this.getItemWidthCss(this.layout.colspans[this.refreshCols._.i])},this.refreshCols._.css[Craft.left]=this.getItemLeftPosCss(this.layout.positions[this.refreshCols._.i]),this.items[this.refreshCols._.i].css(this.refreshCols._.css);this.isSimpleLayout()?(this.$container.height("auto"),this.$items.css({position:"relative",top:0,"margin-bottom":this.settings.gutter+"px"})):(this.$items.css("position","absolute"),this.positionItems(),this.addListener(this.$items,"resize","onItemResize"))}this.completeRefreshCols(),this.addListener(this.$container,"resize",this.handleContainerHeightProxy),this.onRefreshCols()}else this.completeRefreshCols();else this.completeRefreshCols();else this.completeRefreshCols()},completeRefreshCols:function(){var t=this;if(void 0!==this.refreshCols._&&delete this.refreshCols._,this._refreshingCols=!1,this._refreshColsAfterRefresh){var e=this._forceRefreshColsAfterRefresh;this._refreshColsAfterRefresh=!1,this._forceRefreshColsAfterRefresh=!1,Garnish.requestAnimationFrame((function(){t.refreshCols(e)}))}},getItemWidth:function(t){return this.colPctWidth*t},getItemWidthCss:function(t){return"calc("+this.getItemWidth(t)+"% - "+this.colGutterDrop+"px)"},getItemWidthInPx:function(t){return this.getItemWidth(t)/100*this.$container.width()-this.colGutterDrop},getItemLeftPosCss:function(t){return"calc(("+this.getItemWidth(1)+"% + "+(this.settings.gutter-this.colGutterDrop)+"px) * "+t+")"},getItemLeftPosInPx:function(t){return(this.getItemWidth(1)/100*this.$container.width()+(this.settings.gutter-this.colGutterDrop))*t},createLayouts:function(t,e,i,s,a){new Craft.Grid.LayoutGenerator(this).createLayouts(t,e,i,s,a)},isSimpleLayout:function(){for(this.isSimpleLayout._={},this.isSimpleLayout._.i=0;this.isSimpleLayout._.i<this.layout.positions.length;this.isSimpleLayout._.i++)if(0!==this.layout.positions[this.isSimpleLayout._.i])return delete this.isSimpleLayout._,!1;return delete this.isSimpleLayout._,!0},positionItems:function(){for(this.positionItems._={},this.positionItems._.colHeights=[],this.positionItems._.i=0;this.positionItems._.i<this.totalCols;this.positionItems._.i++)this.positionItems._.colHeights.push(0);for(this.positionItems._.i=0;this.positionItems._.i<this.items.length;this.positionItems._.i++){for(this.positionItems._.endingCol=this.layout.positions[this.positionItems._.i]+this.layout.colspans[this.positionItems._.i]-1,this.positionItems._.affectedColHeights=[],this.positionItems._.col=this.layout.positions[this.positionItems._.i];this.positionItems._.col<=this.positionItems._.endingCol;this.positionItems._.col++)this.positionItems._.affectedColHeights.push(this.positionItems._.colHeights[this.positionItems._.col]);for(this.positionItems._.top=Math.max.apply(null,this.positionItems._.affectedColHeights),this.positionItems._.top>0&&(this.positionItems._.top+=this.settings.gutter),this.items[this.positionItems._.i].css("top",this.positionItems._.top),this.positionItems._.col=this.layout.positions[this.positionItems._.i];this.positionItems._.col<=this.positionItems._.endingCol;this.positionItems._.col++)this.positionItems._.colHeights[this.positionItems._.col]=this.positionItems._.top+this.itemHeightsByColspan[this.positionItems._.i][this.layout.colspans[this.positionItems._.i]]}this.$container.height(Math.max.apply(null,this.positionItems._.colHeights)),delete this.positionItems._},onItemResize:function(t){this.onItemResize._={},t.stopPropagation(),this.onItemResize._.item=$.inArray(t.currentTarget,this.$items),-1!==this.onItemResize._.item&&(this.onItemResize._.newHeight=this.items[this.onItemResize._.item].outerHeight(),this.onItemResize._.newHeight!==this.itemHeightsByColspan[this.onItemResize._.item][this.layout.colspans[this.onItemResize._.item]]&&(this.itemHeightsByColspan[this.onItemResize._.item][this.layout.colspans[this.onItemResize._.item]]=this.onItemResize._.newHeight,this.positionItems(!1))),delete this.onItemResize._},onRefreshCols:function(){this.trigger("refreshCols"),this.settings.onRefreshCols()},destroy:function(){this.$container.removeData("grid"),this.base()}},{defaults:{itemSelector:".item",cols:null,maxCols:null,minColWidth:320,gutter:14,fillMode:"top",colClass:"col",snapToGrid:null,onRefreshCols:$.noop}}),Craft.Grid.LayoutGenerator=Garnish.Base.extend({grid:null,_:null,init:function(t){this.grid=t},createLayouts:function(t,e,i,s,a){for(this._={},this._.c=0;this._.c<this.grid.possibleItemColspans[t].length;this._.c++){for(this._.colspan=this.grid.possibleItemColspans[t][this._.c],this._.tallestColHeightsByPosition=[],this._.p=0;this._.p<this.grid.possibleItemPositionsByColspan[t][this._.colspan].length;this._.p++){for(this._.position=this.grid.possibleItemPositionsByColspan[t][this._.colspan][this._.p],this._.colHeightsForPosition=[],this._.endingCol=this._.position+this._.colspan-1,this._.col=this._.position;this._.col<=this._.endingCol;this._.col++)this._.colHeightsForPosition.push(s[this._.col]);this._.tallestColHeightsByPosition[this._.p]=Math.max.apply(null,this._.colHeightsForPosition)}for(this._.p=$.inArray(Math.min.apply(null,this._.tallestColHeightsByPosition),this._.tallestColHeightsByPosition),this._.position=this.grid.possibleItemPositionsByColspan[t][this._.colspan][this._.p],this._.positions=e.slice(0),this._.colspans=i.slice(0),this._.colHeights=s.slice(0),this._.emptySpace=a,this._.positions.push(this._.position),this._.colspans.push(this._.colspan),this._.tallestColHeight=this._.tallestColHeightsByPosition[this._.p],this._.endingCol=this._.position+this._.colspan-1,this._.col=this._.position;this._.col<=this._.endingCol;this._.col++)this._.emptySpace+=this._.tallestColHeight-this._.colHeights[this._.col],this._.colHeights[this._.col]=this._.tallestColHeight+this.grid.itemHeightsByColspan[t][this._.colspan];t===this.grid.items.length-1?this.grid.layouts.push({positions:this._.positions,colspans:this._.colspans,colHeights:this._.colHeights,emptySpace:this._.emptySpace}):this.grid.createLayouts(t+1,this._.positions,this._.colspans,this._.colHeights,this._.emptySpace)}delete this._}})},2387:function(){Craft.HandleGenerator=Craft.BaseInputGenerator.extend({generateTargetValue:function(t){var e=t.replace("/<(.*?)>/g","");e=(e=e.replace(/['"‘’“”\[\]\(\)\{\}:]/g,"")).toLowerCase(),e=Craft.asciiString(e),this.settings.allowNonAlphaStart||(e=e.replace(/^[^a-z]+/,""));var i=Craft.filterArray(e.split(/[^a-z0-9]+/));if(e="","snake"===Craft.handleCasing)return i.join("_");for(var s=0;s<i.length;s++)"pascal"!==Craft.handleCasing&&0===s?e+=i[s]:e+=i[s].charAt(0).toUpperCase()+i[s].substring(1);return e}})},7966:function(){Craft.ImageUpload=Garnish.Base.extend({$container:null,progressBar:null,uploader:null,init:function(t){this.setSettings(t,Craft.ImageUpload.defaults),this.initImageUpload()},initImageUpload:function(){this.$container=$(this.settings.containerSelector),this.progressBar=new Craft.ProgressBar($('<div class="progress-shade"></div>').appendTo(this.$container));var t={url:Craft.getActionUrl(this.settings.uploadAction),formData:this.settings.postParameters,fileInput:this.$container.find(this.settings.fileInputSelector),paramName:this.settings.uploadParamName};void 0!==Craft.csrfTokenName&&void 0!==Craft.csrfTokenValue&&(t.formData[Craft.csrfTokenName]=Craft.csrfTokenValue),t.events={},t.events.fileuploadstart=this._onUploadStart.bind(this),t.events.fileuploadprogressall=this._onUploadProgress.bind(this),t.events.fileuploaddone=this._onUploadComplete.bind(this),t.events.fileuploadfail=this._onUploadFailure.bind(this),this.uploader=new Craft.Uploader(this.$container,t),this.initButtons()},initButtons:function(){var t=this;this.$container.find(this.settings.uploadButtonSelector).on("click",(function(e){t.$container.find(t.settings.fileInputSelector).trigger("click")})),this.$container.find(this.settings.deleteButtonSelector).on("click",(function(e){confirm(Craft.t("app","Are you sure you want to delete this image?"))&&($(e.currentTarget).parent().append('<div class="blocking-modal"></div>'),Craft.sendActionRequest("POST",t.settings.deleteAction,{data:t.settings.postParameters}).then((function(e){var i=e.data;t.refreshImage(i)})))}))},refreshImage:function(t){$(this.settings.containerSelector).replaceWith(t.html),this.settings.onAfterRefreshImage(t),this.initImageUpload()},_onUploadStart:function(t){this.progressBar.$progressBar.css({top:Math.round(this.$container.outerHeight()/2)-6}),this.$container.addClass("uploading"),this.progressBar.resetProgressBar(),this.progressBar.showProgressBar()},_onUploadProgress:function(t,e){var i=parseInt(e.loaded/e.total*100,10);this.progressBar.setProgressPercentage(i)},_onUploadComplete:function(t,e){e.result.error?alert(e.result.error):($(e.result.html),this.refreshImage(e.result)),this.uploader.isLastUpload()&&(this.progressBar.hideProgressBar(),this.$container.removeClass("uploading"))},_onUploadFailure:function(t,e){var i,s=e.response(),a=(null==s||null===(i=s.jqXHR)||void 0===i?void 0:i.responseJSON)||{},n=a.message,r=a.filename;n||(n=r?Craft.t("app","Upload failed for “{filename}”.",{filename:r}):Craft.t("app","Upload failed.")),alert(n),this.progressBar.hideProgressBar(),this.$container.removeClass("uploading")}},{defaults:{postParameters:{},uploadAction:"",deleteAction:"",fileInputSelector:"",onAfterRefreshImage:$.noop,containerSelector:null,uploadButtonSelector:null,deleteButtonSelector:null,uploadParamName:"files"}})},657:function(){Craft.InfoIcon=Garnish.Base.extend({$container:null,$icon:null,$liveRegion:null,content:null,hud:null,init:function(t){var e=this;if(this.$icon=$(t),this.$liveRegion=$("<span/>",{role:"status",class:"visually-hidden"}),this.$icon.data("infoicon")?(console.warn("Double-instantiating an info icon on an element"),this.content=this.$icon.data("infoicon").content,this.$icon.data("infoicon").destroy()):(this.content=this.$icon.html(),this.$icon.html("").attr({tabindex:0,role:"button",type:"button","aria-label":Craft.t("app","More info")}).wrap($("<span/>",{class:"infoicon-container"})),this.$container=this.$icon.parent(),this.$container.append(this.$liveRegion)),this.$icon.data("infoicon",this),this.$icon[0].previousSibling&&this.$icon[0].previousSibling.nodeType===Node.TEXT_NODE&&!this.$icon.parent().hasClass("nowrap")){var i=this.$icon[0].previousSibling.nodeValue.match(/[^\s\-]+\s*$/);i&&(this.$icon[0].previousSibling.nodeValue=this.$icon[0].previousSibling.nodeValue.substring(0,i.index),$("<span/>",{class:"nowrap",html:i[0].replace(/\s+$/,"")+" "}).insertAfter(this.$icon[0].previousSibling).append(this.$icon))}this.addListener(this.$icon,"click",(function(t){t.preventDefault(),t.stopPropagation(),e.showHud()})),this.addListener(this.$icon,"keydown",(function(t){e.hud&&e.hud.showing||![Garnish.SPACE_KEY,Garnish.RETURN_KEY].includes(t.keyCode)||(t.preventDefault(),t.stopPropagation(),e.showHud())}))},showHud:function(t){var e=this;this.hud?this.hud.show():(this.hud=new Garnish.HUD(this.$icon,this.content,{hudClass:"hud info-hud",closeOtherHUDs:!1,onShow:function(){Garnish.uiLayerManager.registerShortcut(Garnish.SPACE_KEY,(function(){e.hud.hide()})),e.$liveRegion.html(""),setTimeout((function(){e.$liveRegion.html(e.content)}),200)},onHide:function(){e.$liveRegion.html("")}}),Craft.initUiElements(this.hud.$body))},destroy:function(){this.$icon.removeData("infoicon"),this.base()}})},4487:function(){Craft.LightSwitch=Garnish.Base.extend({settings:null,$outerContainer:null,$innerContainer:null,$input:null,small:!1,on:!1,indeterminate:!1,dragger:null,dragStartMargin:null,init:function(t,e){if(this.$outerContainer=$(t),this.$outerContainer.data("lightswitch")&&(console.warn("Double-instantiating a lightswitch on an element"),this.$outerContainer.data("lightswitch").destroy()),this.$outerContainer.data("lightswitch",this),this.small=this.$outerContainer.hasClass("small"),this.setSettings(e,Craft.LightSwitch.defaults),this.$innerContainer=this.$outerContainer.find(".lightswitch-container:first"),this.$input=this.$outerContainer.find("input:first"),!this.$input.prop("disabled")){this.on=this.$outerContainer.hasClass("on"),this.indeterminate=this.$outerContainer.hasClass("indeterminate"),this.addListener(this.$outerContainer,"mousedown","_onMouseDown"),this.addListener(this.$outerContainer,"keydown","_onKeyDown"),this.dragger=new Garnish.BaseDrag(this.$outerContainer,{axis:Garnish.X_AXIS,ignoreHandleSelector:null,onDragStart:this._onDragStart.bind(this),onDrag:this._onDrag.bind(this),onDragStop:this._onDragStop.bind(this)});var i=this.$outerContainer.parent(".lightswitch-inner-container");i.length&&(this.addListener(i.children('span[data-toggle="off"]'),"click",this.turnOff),this.addListener(i.children('span[data-toggle="on"]'),"click",this.turnOn))}},turnOn:function(t){var e=!this.on;if(this.on=!0,this.indeterminate=!1,this.$outerContainer.addClass("dragging"),Garnish.prefersReducedMotion())this.$innerContainer.css("margin-"+Craft.left,0);else{var i={};i["margin-"+Craft.left]=0,this.$innerContainer.velocity("stop").velocity(i,Craft.LightSwitch.animationDuration,this._onSettle.bind(this))}this.$input.val(this.settings.value),this.$outerContainer.addClass("on"),this.$outerContainer.removeClass("indeterminate"),this.$outerContainer.attr("aria-checked","true"),e&&!0!==t&&this.onChange()},turnOff:function(t){var e=this.on||this.indeterminate;if(this.on=!1,this.indeterminate=!1,this.$outerContainer.addClass("dragging"),Garnish.prefersReducedMotion())this.$innerContainer.css("margin-"+Craft.left,this._getOffMargin());else{var i={};i["margin-"+Craft.left]=this._getOffMargin(),this.$innerContainer.velocity("stop").velocity(i,Craft.LightSwitch.animationDuration,this._onSettle.bind(this))}this.$input.val(""),this.$outerContainer.removeClass("on"),this.$outerContainer.removeClass("indeterminate"),this.$outerContainer.attr("aria-checked","false"),e&&!0!==t&&this.onChange()},turnIndeterminate:function(t){var e=!this.indeterminate;this.on=!1,this.indeterminate=!0,this.$outerContainer.addClass("dragging");var i={};i["margin-"+Craft.left]=this._getOffMargin()/2,this.$innerContainer.velocity("stop").velocity(i,Craft.LightSwitch.animationDuration,this._onSettle.bind(this)),this.$input.val(this.settings.indeterminateValue),this.$outerContainer.removeClass("on"),this.$outerContainer.addClass("indeterminate"),this.$outerContainer.attr("aria-checked","mixed"),e&&!0!==t&&this.onChange()},toggle:function(){this.indeterminate||!this.on?this.turnOn():this.turnOff()},onChange:function(){this.trigger("change"),this.settings.onChange(this.on),this.$outerContainer.trigger("change")},_onMouseDown:function(){this.addListener(Garnish.$doc,"mouseup","_onMouseUp")},_onMouseUp:function(){this.removeListener(Garnish.$doc,"mouseup"),this.dragger.dragging||this.toggle()},_onKeyDown:function(t){switch(t.keyCode){case Garnish.SPACE_KEY:this.toggle(),t.preventDefault();break;case Garnish.RIGHT_KEY:"ltr"===Craft.orientation?this.turnOn():this.turnOff(),t.preventDefault();break;case Garnish.LEFT_KEY:"ltr"===Craft.orientation?this.turnOff():this.turnOn(),t.preventDefault()}},_getMargin:function(){return parseInt(this.$innerContainer.css("margin-"+Craft.left))},_onDragStart:function(){this.$outerContainer.addClass("dragging"),this.dragStartMargin=this._getMargin()},_onDrag:function(){var t;(t="ltr"===Craft.orientation?this.dragStartMargin+this.dragger.mouseDistX:this.dragStartMargin-this.dragger.mouseDistX)<this._getOffMargin()?t=this._getOffMargin():t>0&&(t=0),this.$innerContainer.css("margin-"+Craft.left,t)},_onDragStop:function(){this._getMargin()>this._getOffMargin()/2?this.turnOn():this.turnOff()},_onSettle:function(){this.$outerContainer.removeClass("dragging")},destroy:function(){this.$outerContainer.removeData("lightswitch"),this.base(),this.dragger.destroy()},_getOffMargin:function(){return this.small?-10:-12}},{animationDuration:100,defaults:{value:"1",indeterminateValue:"-",onChange:$.noop}})},6966:function(){Craft.Listbox=Garnish.Base.extend({$container:null,$options:null,$selectedOption:null,selectedOptionIndex:null,init:function(t,e){var i=this;this.$container=$(t),this.setSettings(e,Craft.Listbox.defaults),this.$container.data("listbox")&&(console.warn("Double-instantiating a listbox on an element"),this.$container.data("listbox").destroy()),this.$container.data("listbox",this),this.$options=this.$container.find("button,[role=option]"),this.$selectedOption=this.$options.filter("[aria-pressed=true],[aria-selected=true]").removeAttr("aria-selected").attr("aria-pressed","true"),this.$selectedOption.length?this.selectedOptionIndex=this.$options.index(this.$selectedOption):this.$selectedOption=null,this.addListener(this.$options,"click",(function(t){i.select(i.$options.index($(t.currentTarget))),t.preventDefault()}))},select:function(t){t<0||t>=this.$options.length||t===this.selectedOptionIndex||(this.$selectedOption&&this.$selectedOption.removeClass(this.settings.selectedClass).attr("aria-pressed","false"),this.$selectedOption=this.$options.eq(t).addClass(this.settings.selectedClass).attr("aria-pressed","true"),this.selectedOptionIndex=t,this.settings.onChange(this.$selectedOption,t),this.trigger("change",{$selectedOption:this.$selectedOption,selectedOptionIndex:t}))},disable:function(){this.base(),this.$container.attr("aria-disabled","true")},enable:function(){this.base(),this.$container.removeAttr("aria-disabled")},destroy:function(){this.$container.removeData("listbox"),this.base()}},{defaults:{selectedClass:"active",focusClass:"focus",onChange:$.noop}})},5080:function(){Craft.LivePreview=Garnish.Base.extend({$extraFields:null,$trigger:null,$shade:null,$editorContainer:null,$editor:null,$dragHandle:null,$previewContainer:null,$iframeContainer:null,$iframe:null,$fieldPlaceholder:null,previewUrl:null,token:null,basePostData:null,inPreviewMode:!1,fields:null,lastPostData:null,updateIframeInterval:null,loading:!1,checkAgain:!1,dragger:null,dragStartEditorWidth:null,_slideInOnIframeLoad:!1,_scrollX:null,_scrollY:null,_editorWidth:null,_editorWidthInPx:null,init:function(t){var e=this;this.setSettings(t,Craft.LivePreview.defaults),this.settings.previewUrl?this.previewUrl=this.settings.previewUrl:this.previewUrl=Craft.baseSiteUrl.replace(/\/+$/,"")+"/","https:"===document.location.protocol&&(this.previewUrl=this.previewUrl.replace(/^http:/,"https:")),this.basePostData=$.extend({},this.settings.previewParams),this.$extraFields=$(this.settings.extraFields),this.$trigger=$(this.settings.trigger),this.$fieldPlaceholder=$("<div/>"),this.editorWidth=Craft.getLocalStorage("LivePreview.editorWidth",Craft.LivePreview.defaultEditorWidth),this.addListener(this.$trigger,"activate","toggle"),Craft.cp.on("beforeSaveShortcut",(function(){e.inPreviewMode&&e.moveFieldsBack()})),Craft.Preview.instances.push(this)},get editorWidth(){return this._editorWidth},get editorWidthInPx(){return this._editorWidthInPx},set editorWidth(t){var e;t>=1?(e=t,t/=Garnish.$win.width()):e=Math.round(t*Garnish.$win.width()),e<Craft.LivePreview.minEditorWidthInPx&&(t=(e=Craft.LivePreview.minEditorWidthInPx)/Garnish.$win.width()),this._editorWidth=t,this._editorWidthInPx=e},toggle:function(){this.inPreviewMode?this.exit():this.enter()},enter:function(){var t=this;if(!this.inPreviewMode)if(this.token){if(this.trigger("beforeEnter"),$(document.activeElement).trigger("blur"),!this.$editor){this.$shade=$("<div/>",{class:"modal-shade dark"}).appendTo(Garnish.$bod),this.$previewContainer=$("<div/>",{class:"lp-preview-container"}).appendTo(Garnish.$bod),this.$iframeContainer=$("<div/>",{class:"lp-iframe-container"}).appendTo(this.$previewContainer),this.$editorContainer=$("<div/>",{class:"lp-editor-container"}).appendTo(Garnish.$bod);var e=$("<header/>",{class:"flex"}).appendTo(this.$editorContainer);this.$editor=$("<form/>",{class:"lp-editor"}).appendTo(this.$editorContainer),this.$dragHandle=$("<div/>",{class:"lp-draghandle"}).appendTo(this.$editorContainer);var i=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Close Preview")}).appendTo(e);$("<div/>",{class:"flex-grow"}).appendTo(e);var s=$("<button/>",{type:"button",class:"btn submit",text:Craft.t("app","Save")}).appendTo(e);this.dragger=new Garnish.BaseDrag(this.$dragHandle,{axis:Garnish.X_AXIS,onDragStart:this._onDragStart.bind(this),onDrag:this._onDrag.bind(this),onDragStop:this._onDragStop.bind(this)}),this.addListener(i,"click","exit"),this.addListener(s,"click","save")}this.handleWindowResize(),this.addListener(Garnish.$win,"resize","handleWindowResize"),this.$editorContainer.css(Craft.left,-this.editorWidthInPx+"px"),this.$previewContainer.css(Craft.right,-this.getIframeWidth()),this.fields=[];for(var a=$(this.settings.fields),n=0;n<a.length;n++){var r=$(a[n]),o=this._getClone(r);this.$fieldPlaceholder.insertAfter(r),r.detach(),this.$fieldPlaceholder.replaceWith(o),r.appendTo(this.$editor),this.fields.push({$field:r,$clone:o})}this.updateIframe()?this._slideInOnIframeLoad=!0:this.slideIn(),Craft.ElementThumbLoader.retryAll(),Garnish.uiLayerManager.addLayer(this.$sidebar),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.exit()})),this.inPreviewMode=!0,this.trigger("enter")}else this.createToken()},createToken:function(){var t=this,e={previewAction:this.settings.previewAction};Craft.sendActionRequest("POST","live-preview/create-token",{data:e}).then((function(e){t.token=e.data.token,t.enter()}))},save:function(){Craft.cp.submitPrimaryForm()},handleWindowResize:function(){this.editorWidth=this.editorWidth,this.updateWidths()},slideIn:function(){var t=this;$("html").addClass("noscroll"),this.$shade.velocity("fadeIn"),this.$editorContainer.show().velocity("stop").animateLeft(0,"slow",(function(){t.trigger("slideIn"),Garnish.$win.trigger("resize")})),this.$previewContainer.show().velocity("stop").animateRight(0,"slow",(function(){t.updateIframeInterval=setInterval(t.updateIframe.bind(t),1e3)}))},exit:function(){var t=this;this.inPreviewMode&&(this.trigger("beforeExit"),$("html").removeClass("noscroll"),this.removeListener(Garnish.$win,"resize"),Garnish.uiLayerManager.removeLayer(),this.updateIframeInterval&&clearInterval(this.updateIframeInterval),this.moveFieldsBack(),this.$shade.delay(200).velocity("fadeOut"),this.$editorContainer.velocity("stop").animateLeft(-this.editorWidthInPx,"slow",(function(){for(var e=0;e<t.fields.length;e++)t.fields[e].$newClone.remove();t.$editorContainer.hide(),t.trigger("slideOut")})),this.$previewContainer.velocity("stop").animateRight(-this.getIframeWidth(),"slow",(function(){t.$previewContainer.hide()})),Craft.ElementThumbLoader.retryAll(),this.inPreviewMode=!1,this.trigger("exit"))},moveFieldsBack:function(){for(var t=0;t<this.fields.length;t++){var e=this.fields[t];e.$newClone=this._getClone(e.$field),this.$fieldPlaceholder.insertAfter(e.$field),e.$field.detach(),this.$fieldPlaceholder.replaceWith(e.$newClone),e.$clone.replaceWith(e.$field)}Garnish.$win.trigger("resize")},getIframeWidth:function(){return Garnish.$win.width()-this.editorWidthInPx},updateWidths:function(){this.$editorContainer.css("width",this.editorWidthInPx+"px"),this.$previewContainer.width(this.getIframeWidth())},updateIframe:function(t){if(t&&(this.lastPostData=null),!this.inPreviewMode)return!1;if(this.loading)return this.checkAgain=!0,!1;var e=$.extend(Garnish.getPostData(this.$editor),Garnish.getPostData(this.$extraFields));if(this.lastPostData&&Craft.compare(e,this.lastPostData,!1))return!1;this.lastPostData=e,this.loading=!0;var i=this.$iframe?$(this.$iframe[0].contentWindow.document):null;return this._scrollX=i?i.scrollLeft():0,this._scrollY=i?i.scrollTop():0,$.ajax({url:this.previewUrl+(-1!==this.previewUrl.indexOf("?")?"&":"?")+Craft.tokenParam+"="+this.token,method:"POST",data:$.extend({},e,this.basePostData),headers:{"X-Craft-Token":this.token},xhrFields:{withCredentials:!0},crossDomain:!0,success:this.handleSuccess.bind(this),error:this.handleError.bind(this)}),!0},forceUpdateIframe:function(){return this.updateIframe(!0)},handleSuccess:function(t){var e=this,i=t+'<script type="text/javascript">window.scrollTo('+this._scrollX+", "+this._scrollY+");<\/script>",s=$('<iframe class="lp-preview" frameborder="0"/>');this.$iframe?s.insertBefore(this.$iframe):s.appendTo(this.$iframeContainer),this.addListener(s,"load",(function(){this.$iframe&&this.$iframe.remove(),this.$iframe=s,this._slideInOnIframeLoad&&(this.slideIn(),this._slideInOnIframeLoad=!1),this.removeListener(s,"load")})),Garnish.requestAnimationFrame((function(){s[0].contentWindow.document.open(),s[0].contentWindow.document.write(i),s[0].contentWindow.document.close(),e.onResponse()}))},handleError:function(){this.onResponse()},onResponse:function(){this.loading=!1,this.checkAgain&&(this.checkAgain=!1,this.updateIframe())},_getClone:function(t){var e=t.clone();return Garnish.copyInputValues(t,e),e.attr("id",""),e.find("[id]").attr("id",""),e},_onDragStart:function(){this.dragStartEditorWidth=this.editorWidthInPx,this.$previewContainer.addClass("dragging")},_onDrag:function(){"ltr"===Craft.orientation?this.editorWidth=this.dragStartEditorWidth+this.dragger.mouseDistX:this.editorWidth=this.dragStartEditorWidth-this.dragger.mouseDistX,this.updateWidths()},_onDragStop:function(){this.$previewContainer.removeClass("dragging"),Craft.setLocalStorage("LivePreview.editorWidth",this.editorWidth)},destroy:function(){var t=this;Craft.Preview.instances=Craft.Preview.instances.filter((function(e){return e!==t})),this.base()}},{defaultEditorWidth:.33,minEditorWidthInPx:320,instances:[],defaults:{trigger:".livepreviewbtn",fields:null,extraFields:null,previewUrl:null,previewAction:null,previewParams:{}}}),Craft.LivePreview.init=function(t){Craft.livePreview=new Craft.LivePreview(t)}},7439:function(){Craft.PasswordInput=Garnish.Base.extend({$passwordWrapper:null,$passwordInput:null,$textInput:null,$currentInput:null,$showPasswordToggle:null,showingPassword:null,init:function(t,e){this.$passwordInput=$(t),this.$passwordWrapper=this.$passwordInput.parent(".passwordwrapper"),this.settings=$.extend({},Craft.PasswordInput.defaults,e),this.$passwordInput.data("passwordInput")&&(console.warn("Double-instantiating a password input on an element"),this.$passwordInput.data("passwordInput").destroy()),this.$passwordInput.data("passwordInput",this),this.$showPasswordToggle=$('<button type="button" class="invisible" />'),this.$showPasswordToggle.addClass("password-toggle"),this.$showPasswordToggle.insertAfter(this.$passwordInput),this.initInputFocusEvents(this.$passwordInput),this.addListener(this.$showPasswordToggle,"click","onClick"),this.hidePassword(),this.addListener(this.$passwordWrapper.closest("form"),"submit","hidePassword")},setCurrentInput:function(t){this.$currentInput&&(t.insertAfter(this.$currentInput),this.$currentInput.detach(),t.trigger("focus"),t.val(this.$currentInput.val())),this.$currentInput=t,this.addListener(this.$currentInput,"keypress,keyup,change,blur","onInputChange")},updateToggleLabel:function(t){this.$showPasswordToggle.text(t)},initInputFocusEvents:function(t){this.addListener(t,"focus",(function(){this.$passwordWrapper.addClass("focus")})),this.addListener(t,"blur",(function(){this.$passwordWrapper.removeClass("focus")}))},showPassword:function(){this.showingPassword||(this.$textInput||(this.$textInput=this.$passwordInput.clone(!0),this.$textInput.attr({type:"text",autocapitalize:"off"}),this.initInputFocusEvents(this.$textInput)),this.setCurrentInput(this.$textInput),this.updateToggleLabel(Craft.t("app","Hide")),this.showingPassword=!0)},hidePassword:function(){!1!==this.showingPassword&&(this.setCurrentInput(this.$passwordInput),this.updateToggleLabel(Craft.t("app","Show")),this.showingPassword=!1)},togglePassword:function(){this.showingPassword?this.hidePassword():this.showPassword(),this.settings.onToggleInput(this.$currentInput)},onInputChange:function(){this.$currentInput.val()?this.$showPasswordToggle.removeClass("invisible"):this.$showPasswordToggle.addClass("invisible")},onClick:function(t){if(this.$currentInput[0].setSelectionRange){var e=this.$currentInput[0].selectionStart,i=this.$currentInput[0].selectionEnd;this.togglePassword(),this.$currentInput[0].setSelectionRange(e,i)}else this.togglePassword()},destroy:function(){this.$passwordInput.removeData("passwordInput"),this.base()}},{defaults:{onToggleInput:$.noop}})},5328:function(){function t(t,i){var s="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!s){if(Array.isArray(t)||(s=function(t,i){if(t){if("string"==typeof t)return e(t,i);var s=Object.prototype.toString.call(t).slice(8,-1);return"Object"===s&&t.constructor&&(s=t.constructor.name),"Map"===s||"Set"===s?Array.from(t):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?e(t,i):void 0}}(t))||i&&t&&"number"==typeof t.length){s&&(t=s);var a=0,n=function(){};return{s:n,n:function(){return a>=t.length?{done:!0}:{done:!1,value:t[a++]}},e:function(t){throw t},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){s=s.call(t)},n:function(){var t=s.next();return o=t.done,t},e:function(t){l=!0,r=t},f:function(){try{o||null==s.return||s.return()}finally{if(l)throw r}}}}function e(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}function i(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);e&&(s=s.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,s)}return i}function s(t){for(var e=1;e<arguments.length;e++){var s=null!=arguments[e]?arguments[e]:{};e%2?i(Object(s),!0).forEach((function(e){a(t,e,s[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(s)):i(Object(s)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(s,e))}))}return t}function a(t,e,i){return e in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function n(t){return n="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},n(t)}Craft.Preview=Garnish.Base.extend({elementEditor:null,$shade:null,$editorContainer:null,$editor:null,$spinner:null,$statusIcon:null,$dragHandle:null,$previewWrapper:null,$previewContainer:null,$previewSkipLink:null,$bumperLink:null,$notifier:null,$iframeContainer:null,$previewHeader:null,$targetBtn:null,$targetMenu:null,$deviceTypeContainer:null,$orientationBtn:null,$refreshBtn:null,$deviceMask:null,$devicePreviewContainer:null,$iframe:null,iframeLoaded:!1,$tempInput:null,$fieldPlaceholder:null,isActive:!1,isVisible:!1,activeTarget:0,animationDuration:"slow",currentDeviceType:"desktop",deviceOrientation:null,deviceWidth:"",deviceHeight:"",deviceMaskDimensions:{phone:{width:375,height:753},tablet:{width:768,height:1110}},draftId:null,url:null,fields:null,iframeHeight:null,scrollTop:null,dragger:null,dragStartEditorWidth:null,_updateIframeProxy:null,_editorWidth:null,_editorWidthInPx:null,init:function(t){this.elementEditor=t,this._updateIframeProxy=this.updateIframe.bind(this),this.$tempInput=$("<input/>",{type:"hidden",name:"__PREVIEW_FIELDS__",value:"1"}),this.$fieldPlaceholder=$("<div/>"),this.editorWidth=Craft.getLocalStorage("LivePreview.editorWidth",Craft.Preview.defaultEditorWidth),Craft.Preview.instances.push(this)},get editorWidth(){return this._editorWidth},get editorWidthInPx(){return this._editorWidthInPx},set editorWidth(t){var e;t>=1?(e=t,t/=Garnish.$win.width()):e=Math.round(t*Garnish.$win.width()),e<Craft.Preview.minEditorWidthInPx&&(t=(e=Craft.Preview.minEditorWidthInPx)/Garnish.$win.width()),this._editorWidth=t,this._editorWidthInPx=e},open:function(){var t=this;if(!this.isActive){if(this.isActive=!0,this.trigger("beforeOpen"),$(document.activeElement).trigger("blur"),!this.$editor){var e=Craft.t("app","Skip to {title}",{title:Craft.t("app","Top of preview")});this.$shade=$("<div/>",{class:"modal-shade dark"}).appendTo(Garnish.$bod),this.$previewWrapper=$("<div/>",{role:"dialog","aria-modal":"true","aria-labelledby":"lp-preview-heading"}).appendTo(Garnish.$bod),this.$modalLabel=$("<h2/>",{id:"lp-preview-heading",class:"visually-hidden",html:Craft.t("app","Preview")}).appendTo(this.$previewWrapper),this.$editorContainer=$("<div/>",{class:"lp-editor-container"}).appendTo(this.$previewWrapper),this.$previewContainer=$("<div/>",{class:"lp-preview-container",id:"lp-preview-container"}).appendTo(this.$previewWrapper),this.$notifier=$("<span/>",{class:"visually-hidden","aria-live":"assertive"}).appendTo(this.$previewContainer);var i=$("<header/>",{class:"flex"}).appendTo(this.$editorContainer);this.$editor=$("<form/>",{class:"lp-editor"}).appendTo(this.$editorContainer),this.$dragHandle=$("<div/>",{class:"lp-draghandle"}).appendTo(this.$editorContainer);var s=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Close Preview")}).appendTo(i);if($("<div/>",{class:"flex-grow"}).appendTo(i),this.$spinner=$("<div/>",{class:"spinner hidden",title:Craft.t("app","Saving")}).appendTo(i),this.$statusIcon=$("<div/>",{class:"invisible"}).appendTo(i),this.$statusMessage=$("<span/>",{class:"visually-hidden","aria-live":"polite"}).appendTo(i),this.$previewSkipLink=$("<a/>",{class:"skip-link btn",href:"#lp-preview-container",html:e}).appendTo(i),Craft.Pro){if(this.$previewHeader=$("<header/>",{class:"lp-preview-header"}).appendTo(this.$previewContainer),this.elementEditor.settings.previewTargets.length>1){this.$targetBtn=$("<button/>",{type:"button",class:"btn menubtn",text:this.elementEditor.settings.previewTargets[0].label}).appendTo(this.$previewHeader),this.$targetMenu=$("<div/>",{class:"menu lp-target-menu"}).insertAfter(this.$targetBtn);for(var a,n=$("<ul/>",{class:"padded"}).appendTo(this.$targetMenu),r=0;r<this.elementEditor.settings.previewTargets.length;r++)a=$("<li/>").appendTo(n),$("<a/>",{data:{target:r},text:this.elementEditor.settings.previewTargets[r].label,class:0===r?"sel":null}).appendTo(a);new Garnish.MenuBtn(this.$targetBtn,{onOptionSelect:function(e){t.switchTarget($(e).data("target"))}}),$('<div class="flex-grow"/>').appendTo(this.$previewHeader)}this._buildDeviceTypeFieldset(),$('<div class="flex-grow"/>').appendTo(this.$previewHeader);var o=$('<div class="buttons"/>').appendTo(this.$previewHeader);this.$orientationBtn=$("<button/>",{type:"button",class:"btn disabled","data-icon":"rotate","aria-disabled":"true",text:Craft.t("app","Rotate"),"aria-label":Craft.t("app","Rotate")}).appendTo(o),this.addListener(this.$orientationBtn,"click","switchOrientation"),this.$refreshBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Refresh"),"data-icon":"refresh"}).appendTo(o),this.addListener(this.$refreshBtn,"click",(function(){t.updateIframe(!1,!0)})),this.deviceOrientation=Craft.getLocalStorage("LivePreview.orientation")}this.$iframeContainer=$("<div/>",{class:"lp-iframe-container"}).appendTo(this.$previewContainer),this.$devicePreviewContainer=$("<div/>",{class:"lp-device-preview-container"}).appendTo(this.$iframeContainer),this.$deviceMask=$("<div/>",{class:"lp-device-mask"}).appendTo(this.$iframeContainer),this.$bumperLink=$("<a/>",{class:"skip-link btn lp-preview-container__bumper-link",html:e,href:"#lp-preview-container"}),this.$bumperLink.appendTo(this.$previewContainer),this.dragger=new Garnish.BaseDrag(this.$dragHandle,{axis:Garnish.X_AXIS,onDragStart:this._onDragStart.bind(this),onDrag:this._onDrag.bind(this),onDragStop:this._onDragStop.bind(this)}),this.addListener(s,"click","close"),this.addListener(this.$statusIcon,"click",(function(){t.elementEditor.showStatusHud(t.$statusIcon)}))}this.handleWindowResize(),this.addListener(Garnish.$win,"resize","handleWindowResize"),this.$editorContainer.css(Craft.left,-this.editorWidthInPx+"px"),this.$previewContainer.css(Craft.right,-this.getIframeWidth()),this.fields=[];var l=$("#content .field").not($("#content .field .field"));if(l.length){this.$tempInput.insertBefore(l.get(0));for(var h=0;h<l.length;h++){var d=$(l[h]),c=this._getClone(d);this.$fieldPlaceholder.insertAfter(d),d.detach(),this.$fieldPlaceholder.replaceWith(c),d.appendTo(this.$editor),this.fields.push({$field:d,$clone:c})}}this.updateIframe(),this.elementEditor.on("update",this._updateIframeProxy),Craft.ElementThumbLoader.retryAll(),this.trigger("open")}},_getDeviceTypeTranslation:function(t){var e;switch(t){case"phone":e=Craft.t("app","Mobile");break;case"tablet":e=Craft.t("app","Tablet");break;default:e=Craft.t("app","Desktop")}return e},_getDeviceOrientationTranslation:function(t){return"portrait"===t?Craft.t("app","Portrait"):Craft.t("app","Landscape")},_buildDeviceTypeFieldset:function(){var t=this;this.$deviceTypeContainer=$("<section/>",{class:"btngroup lp-device-type","aria-label":Craft.t("app","Device type")}).appendTo(this.$previewHeader),$("<button/>",{type:"button",class:"btn lp-device-type-btn--desktop active",title:Craft.t("app","Desktop"),"aria-label":Craft.t("app","Desktop"),"aria-pressed":"true",data:{width:"",height:"",deviceType:"desktop"}}).appendTo(this.$deviceTypeContainer),$("<button/>",{type:"button",class:"btn lp-device-type-btn--tablet",title:Craft.t("app","Tablet"),"aria-label":Craft.t("app","Tablet"),"aria-pressed":"false",data:{width:768,height:1024,deviceType:"tablet"}}).appendTo(this.$deviceTypeContainer),$("<button/>",{type:"button",class:"btn lp-device-type-btn--phone",title:Craft.t("app","Mobile"),"aria-label":Craft.t("app","Mobile"),"aria-pressed":"false",data:{width:375,height:667,deviceType:"phone"}}).appendTo(this.$deviceTypeContainer),this.deviceBtnGroup=new Craft.Listbox(this.$deviceTypeContainer,{onChange:function(e){t.switchDeviceType(e)}})},_activeTarget:function(){return this.elementEditor.settings.previewTargets[this.activeTarget]},_autoRefresh:function(){var t=this._activeTarget();return void 0===n(t.refresh)||!!t.refresh},switchTarget:function(t){this.activeTarget=t,this.$targetBtn.text(this.elementEditor.settings.previewTargets[t].label),this.$targetMenu.find("a.sel").removeClass("sel"),this.$targetMenu.find("a").eq(t).addClass("sel"),this.updateIframe(!0),this.trigger("switchTarget",{previewTarget:this.elementEditor.settings.previewTargets[t]})},handleWindowResize:function(){this.editorWidth=this.editorWidth,this.updateWidths()},slideIn:function(){var t=this;this.isActive&&!this.isVisible&&($("html").addClass("noscroll"),this.$shade.velocity("fadeIn"),this.$editorContainer.show().velocity("stop").animateLeft(0,Garnish.getUserPreferredAnimationDuration(this.animationDuration),(function(){t.trigger("slideIn"),Garnish.$win.trigger("resize")})),this.$previewContainer.show().velocity("stop").animateRight(0,Garnish.getUserPreferredAnimationDuration(this.animationDuration)),this.isVisible=!0,Garnish.uiLayerManager.addLayer(this.$previewWrapper),Garnish.hideModalBackgroundLayers(),Craft.setFocusWithin(this.$previewWrapper),Craft.trapFocusWithin(this.$previewWrapper),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.close()})))},close:function(){var t=this;this.isActive&&this.isVisible&&(this.trigger("beforeClose"),$("html").removeClass("noscroll"),this.removeListener(Garnish.$win,"resize"),Garnish.uiLayerManager.removeLayer(),Garnish.resetModalBackgroundLayerVisibility(),this.$tempInput.detach(),this.moveFieldsBack(),Garnish.prefersReducedMotion()?this.$shade.velocity("fadeOut"):this.$shade.delay(200).velocity("fadeOut"),this.$editorContainer.velocity("stop").animateLeft(-this.editorWidthInPx,Garnish.getUserPreferredAnimationDuration(this.animationDuration),(function(){for(var e=0;e<t.fields.length;e++)t.fields[e].$newClone.remove();t.$editorContainer.hide(),t.trigger("slideOut")})),this.$previewContainer.velocity("stop").animateRight(-this.getIframeWidth(),Garnish.getUserPreferredAnimationDuration(this.animationDuration),(function(){t.$iframeContainer.removeClass("lp-iframe-container--rotating"),t.$previewContainer.hide()})),this.elementEditor.off("update",this._updateIframeProxy),Craft.ElementThumbLoader.retryAll(),this.elementEditor.$previewBtn&&this.elementEditor.$previewBtn.focus(),this.isActive=!1,this.isVisible=!1,this.trigger("close"))},moveFieldsBack:function(){for(var t=0;t<this.fields.length;t++){var e=this.fields[t];e.$newClone=this._getClone(e.$field),this.$fieldPlaceholder.insertAfter(e.$field),e.$field.detach(),this.$fieldPlaceholder.replaceWith(e.$newClone),e.$clone.replaceWith(e.$field)}Garnish.$win.trigger("resize"),Garnish.$doc.trigger("scroll")},getIframeWidth:function(){return Garnish.$win.width()-this.editorWidthInPx},updateWidths:function(){this.$editorContainer.css("width",this.editorWidthInPx+"px"),this.$previewContainer.width(this.getIframeWidth()),this._devicePreviewIsActive()&&this.updateDevicePreview()},_useIframeResizer:function(){return!1!==Craft.previewIframeResizerOptions},updateIframe:function(t,e){var i=this;if(!this.isActive)return!1;t=!0===t,this.draftId===(this.draftId=this.elementEditor.settings.draftId)&&this.$iframe||(e=!0);var s=this._activeTarget();void 0===e&&(e=t||this._autoRefresh()),this.trigger("beforeUpdateIframe",{previewTarget:s,resetScroll:t,refresh:e}),e?this.elementEditor.getTokenizedPreviewUrl(s.url,"x-craft-live-preview").then((function(e){var s;t?i.scrollTop=null:i.iframeLoaded&&i.$iframe&&(i._useIframeResizer()?(i.iframeHeight=i.$iframe.height(),i.scrollTop=i.$iframeContainer.scrollTop()):(s=Craft.isSameHost(e))&&i.$iframe[0].contentWindow&&(i.scrollTop=$(i.$iframe[0].contentWindow.document).scrollTop())),i.iframeLoaded=!1;var a=$("<iframe/>",{class:"lp-preview",frameborder:0,src:e,title:Craft.t("app","Preview")});i.$iframe?i.$iframe.replaceWith(a):a.appendTo(i.$devicePreviewContainer),i._useIframeResizer()?(t||null===i.iframeHeight||(a.height(i.iframeHeight),i.$iframeContainer.scrollTop(i.scrollTop)),iFrameResize($.extend({checkOrigin:!1,scrolling:!0,onInit:function(t){i.iframeLoaded=!0,i.iframeHeight=null,i.scrollTop=null,t.scrolling="no"}},Craft.previewIframeResizerOptions||{}),a[0])):a.on("load",(function(){i.iframeLoaded=!0,!t&&s&&null!==i.scrollTop&&$(a[0].contentWindow.document).scrollTop(i.scrollTop)})),i.url=e,i.$iframe=a,i._devicePreviewIsActive()&&i.updateDevicePreview(),i.trigger("afterUpdateIframe",{previewTarget:i.elementEditor.settings.previewTargets[i.activeTarget],$iframe:i.$iframe}),i.slideIn()})):this.slideIn()},_devicePreviewIsActive:function(){return"desktop"!==this.currentDeviceType},_updateNotifier:function(){var t=this;this.$notifier.html="";var e="desktop"===this.currentDeviceType?"Previewing {type} device":"Previewing {type} device in {orientation}",i={type:this._getDeviceTypeTranslation(this.currentDeviceType)};"desktop"!==this.currentDeviceType&&(i=s(s({},i),{orientation:this._getDeviceOrientationTranslation(this.deviceOrientation)}));var a=Craft.t("app",e,i);setTimeout((function(){t.$notifier.text(a)}),200)},switchDeviceType:function(t){this.$iframeContainer.removeClass("lp-iframe-container--rotating");var e=t.data("deviceType");if(e===this.currentDeviceType)return!1;this.currentDeviceType=e,this.deviceWidth=t.data("width"),this.deviceHeight=t.data("height"),"desktop"===this.currentDeviceType?(this.$orientationBtn.addClass("disabled").attr("aria-disabled","true"),this.$iframeContainer.removeClass("lp-iframe-container--has-device-preview")):(this.$orientationBtn.removeClass("disabled").removeAttr("aria-disabled"),this.$iframeContainer.addClass("lp-iframe-container--has-device-preview")),"tablet"===this.currentDeviceType?this.$iframeContainer.addClass("lp-iframe-container--tablet"):this.$iframeContainer.removeClass("lp-iframe-container--tablet"),this._updateNotifier(),"desktop"!==this.currentDeviceType&&this.updateDevicePreview()},switchOrientation:function(){var t=this;if(!this._devicePreviewIsActive())return!1;this.deviceOrientation&&"portrait"!==this.deviceOrientation?this.deviceOrientation="portrait":this.deviceOrientation="landscape",Craft.setLocalStorage("LivePreview.orientation",this.deviceOrientation),this.$iframeContainer.addClass("lp-iframe-container--rotating"),this.updateDevicePreview(),this._updateNotifier(),setTimeout((function(){t.$iframeContainer.removeClass("lp-iframe-container--rotating")}),300)},updateDevicePreview:function(){var t=1,e=1,i=1,s=this.$previewContainer.height()-50-48,a=this.$previewContainer.width()-48,n=this.deviceMaskDimensions[this.currentDeviceType].height,r=this.deviceMaskDimensions[this.currentDeviceType].width;"landscape"===this.deviceOrientation?(a<n&&(t=a/n),s<r&&(e=s/r)):(s<n&&(t=s/n),a<r&&(e=a/r)),i=t,e<t&&(i=e);var o=-100/i/2,l="landscape"===this.deviceOrientation?"-90deg":"0deg";this.$deviceMask.css({width:this.deviceMaskDimensions[this.currentDeviceType].width+"px",height:this.deviceMaskDimensions[this.currentDeviceType].height+"px",transform:"scale("+i+") translate("+o+"%, "+o+"%) rotate("+l+")"}),"landscape"===this.deviceOrientation?this.$devicePreviewContainer.css({width:this.deviceHeight+"px",height:this.deviceWidth+"px",transform:"scale("+i+") translate("+o+"%, "+o+"%)",marginTop:0,marginLeft:"-"+12*i+"px"}):this.$devicePreviewContainer.css({width:this.deviceWidth+"px",height:this.deviceHeight+"px",transform:"scale("+i+") translate("+o+"%, "+o+"%)",marginTop:"-"+12*i+"px",marginLeft:0})},_getClone:function(t){var e=t.clone();return Garnish.copyInputValues(t,e),e.attr("id",""),e.find("[id]").attr("id",""),e.find("[name]").prop("disabled",!0),e},_onDragStart:function(){this.dragStartEditorWidth=this.editorWidthInPx,this.$previewContainer.addClass("dragging")},_onDrag:function(){"ltr"===Craft.orientation?this.editorWidth=this.dragStartEditorWidth+this.dragger.mouseDistX:this.editorWidth=this.dragStartEditorWidth-this.dragger.mouseDistX,this.updateWidths()},_onDragStop:function(){this.$previewContainer.removeClass("dragging"),Craft.setLocalStorage("LivePreview.editorWidth",this.editorWidth)},destroy:function(){var t=this;Craft.Preview.instances=Craft.Preview.instances.filter((function(e){return e!==t})),this.base()}},{defaultEditorWidth:.33,minEditorWidthInPx:320,instances:[],refresh:function(){var e,i=t(Craft.Preview.instances);try{for(i.s();!(e=i.n()).done;)preview=e.value,preview.updateIframe()}catch(t){i.e(t)}finally{i.f()}var s,a=t(Craft.LivePreview.instances);try{for(a.s();!(s=a.n()).done;)preview=s.value,preview.forceUpdateIframe()}catch(t){a.e(t)}finally{a.f()}}})},6419:function(){Craft.PreviewFileModal=Garnish.Modal.extend({assetId:null,$spinner:null,$triggerElement:null,$bumperButtonStart:null,$bumperButtonEnd:null,elementSelect:null,type:null,loaded:null,requestId:0,init:function(t,e,i){var s=this;if(i=$.extend(this.defaultSettings,i),this.$triggerElement=Garnish.getFocusedElement(),i.onHide=this._onHide.bind(this),Craft.PreviewFileModal.openInstance){var a=Craft.PreviewFileModal.openInstance;return a.assetId!==t&&(a.loadAsset(t,i.startingWidth,i.startingHeight),a.elementSelect=e),this.destroy()}Craft.PreviewFileModal.openInstance=this,this.elementSelect=e,this.$container=$('<div class="modal previewmodal loading"/>').appendTo(Garnish.$bod),this.base(this.$container,$.extend({resizable:!0},i)),this.$container&&(this.$container.velocity("stop"),this.$container.show().css("opacity",1),this.$shade.velocity("stop"),this.$shade.show().css("opacity",1),Garnish.setFocusWithin(this.$container)),this.$bumperButtonStart=Craft.ui.createButton({html:Craft.t("app","Close Preview"),class:"skip-link"}),this.addListener(this.$bumperButtonStart,"click",(function(){s.hide()})),this.$bumperButtonEnd=this.$bumperButtonStart.clone(!0),this.loadAsset(t,i.startingWidth,i.startingHeight)},_onHide:function(){return Craft.PreviewFileModal.openInstance=null,this.elementSelect?this.elementSelect.focusItem(this.elementSelect.$focusedItem):this.$triggerElement&&this.$triggerElement.length&&this.$triggerElement.trigger("focus"),this.$shade.remove(),this.destroy()},_addBumperButtons:function(){this.$container.prepend(this.$bumperButtonStart).append(this.$bumperButtonEnd)},_addModalName:function(){var t="preview-heading";this.$container.prepend($("h1").attr({class:"visually-hidden",id:t}).text(Craft.t("app","Preview file"))).attr("aria-labelledby",t)},selfDestruct:function(){var t=Craft.PreviewFileModal.openInstance;return t.hide(),t.$shade.remove(),t.destroy(),Craft.PreviewFileModal.openInstance=null,Craft.focalPoint.destruct(),Craft.focalPoint=null,!0},loadAsset:function(t,e,i){var s=this;this.assetId=t,this.$container.empty(),this.loaded=!1,this.desiredHeight=null,this.desiredWidth=null;var a=.66*Garnish.$win.height(),n=Math.min(a/3*4,Garnish.$win.width()-2*this.settings.minGutter);if(a=n/4*3,e&&i){var r=e/i;n=Math.min(e,Garnish.$win.width()-2*this.settings.minGutter),(n=(a=Math.min(n/r,Garnish.$win.height()-2*this.settings.minGutter))*r)>Math.min(e,Garnish.$win.width()-2*this.settings.minGutter)&&(a=(n=Math.min(e,Garnish.$win.width()-2*this.settings.minGutter))/r)}this._resizeContainer(n,a),this.$spinner=$('<div class="spinner centeralign"></div>').appendTo(this.$container);var o=this.$container.height()/2-this.$spinner.height()/2+"px",l=this.$container.width()/2-this.$spinner.width()/2+"px";this.$spinner.css({left:l,top:o,position:"absolute"}),this.requestId++;var h={assetId:t,requestId:this.requestId},d=function(){s.$container.removeClass("loading"),s.$spinner.remove(),s.loaded=!0};Craft.sendActionRequest("POST","assets/preview-file",{data:h}).then((function(t){if(d(),t.data.requestId==s.requestId){if(!t.data.previewHtml)return s.$container.addClass("zilch"),s.$container.append($("<p/>",{text:Craft.t("app","No preview available.")})),void s._addBumperButtons();s.$container.removeClass("zilch"),s.$container.attr("data-asset-id",s.assetId),s.$container.append(t.data.previewHtml),s._addBumperButtons(),s._addModalName(),Craft.appendHeadHtml(t.data.headHtml),Craft.appendBodyHtml(t.data.bodyHtml)}})).catch((function(t){var e=t.response;d(),alert(e.data.message),s.hide()}))},_resizeContainer:function(t,e){this.$container.css({width:t,"min-width":t,"max-width":t,height:e,"min-height":e,"max-height":e,top:(Garnish.$win.height()-e)/2,left:(Garnish.$win.width()-t)/2})}},{defaultSettings:{startingWidth:null,startingHeight:null}})},872:function(){Craft.ProgressBar=Garnish.Base.extend({$progressBar:null,$innerProgressBar:null,$progressBarStatus:null,_itemCount:0,_processedItemCount:0,_displaySteps:!1,init:function(t,e){e&&(this._displaySteps=!0),this.$progressBar=$('<div class="progressbar pending hidden"/>').appendTo(t),this.$innerProgressBar=$('<div class="progressbar-inner"/>').appendTo(this.$progressBar),this.$progressBarStatus=$('<div class="progressbar-status hidden" />').insertAfter(this.$progressBar),this.resetProgressBar()},resetProgressBar:function(){this.setProgressPercentage(100),this.$progressBar.addClass("pending"),this.setItemCount(1),this.setProcessedItemCount(0),this.$progressBarStatus.html(""),this._displaySteps&&this.$progressBar.addClass("has-status")},hideProgressBar:function(){var t=this;this.$progressBar.fadeTo("fast",.01,(function(){t.$progressBar.addClass("hidden").fadeTo(1,1,$.noop)})),this.$progressBarStatus.fadeTo("fast",.01,(function(){t.$progressBarStatus.addClass("hidden").fadeTo(1,1,$.noop)}))},showProgressBar:function(){this.$progressBar.removeClass("hidden"),this.$progressBarStatus.removeClass("hidden")},setItemCount:function(t){this._itemCount=t},incrementItemCount:function(t){this._itemCount+=t},setProcessedItemCount:function(t){this._processedItemCount=t},incrementProcessedItemCount:function(t){this._processedItemCount+=t},updateProgressBar:function(){this._itemCount=Math.max(this._itemCount,1);var t=Math.min(100,Math.round(100*this._processedItemCount/this._itemCount));this.setProgressPercentage(t),this._displaySteps&&this.$progressBarStatus.html(this._processedItemCount+" / "+this._itemCount)},setProgressPercentage:function(t,e){0===t?this.$progressBar.addClass("pending"):(this.$progressBar.removeClass("pending"),e?this.$innerProgressBar.velocity("stop").velocity({width:t+"%"},"fast"):this.$innerProgressBar.velocity("stop").width(t+"%"))}})},1396:function(){Craft.PromptHandler=Garnish.Base.extend({modal:null,$modalContainerDiv:null,$prompt:null,$promptApplyToRemainingContainer:null,$promptApplyToRemainingCheckbox:null,$promptApplyToRemainingLabel:null,$pomptChoices:null,_prompts:[],_promptBatchCallback:$.noop,_promptBatchReturnData:[],_promptBatchNum:0,resetPrompts:function(){this._prompts=[],this._promptBatchCallback=$.noop,this._promptBatchReturnData=[],this._promptBatchNum=0},addPrompt:function(t){this._prompts.push(t)},getPromptCount:function(){return this._prompts.length},showBatchPrompts:function(t){this._promptBatchCallback=t,this._promptBatchReturnData=[],this._promptBatchNum=0,this._showNextPromptInBatch()},_showNextPromptInBatch:function(){var t=this._prompts[this._promptBatchNum].prompt,e=this._prompts.length-(this._promptBatchNum+1);this._showPrompt(t.message,t.choices,this._handleBatchPromptSelection.bind(this),e)},_handleBatchPromptSelection:function(t,e){var i=this._prompts[this._promptBatchNum],s=this._prompts.length-(this._promptBatchNum+1),a=$.extend(i,{choice:t});this._promptBatchReturnData.push(a),s?(this._promptBatchNum++,e?this._handleBatchPromptSelection(t,!0):this._showNextPromptInBatch()):"function"==typeof this._promptBatchCallback&&this._promptBatchCallback(this._promptBatchReturnData)},_showPrompt:function(t,e,i,s){this._promptCallback=i,null===this.modal&&(this.modal=new Garnish.Modal({closeOtherModals:!1})),null===this.$modalContainerDiv&&(this.$modalContainerDiv=$('<div class="modal fitted prompt-modal"></div>').addClass().appendTo(Garnish.$bod)),this.$prompt=$('<div class="body"></div>').appendTo(this.$modalContainerDiv.empty()),this.$promptMessage=$('<p class="prompt-msg"/>').appendTo(this.$prompt),this.$promptChoices=$('<div class="options"></div>').appendTo(this.$prompt),this.$promptApplyToRemainingContainer=$('<label class="assets-applytoremaining"/>').appendTo(this.$prompt).hide(),this.$promptApplyToRemainingCheckbox=$('<input type="checkbox"/>').appendTo(this.$promptApplyToRemainingContainer),this.$promptApplyToRemainingLabel=$("<span/>").appendTo(this.$promptApplyToRemainingContainer),this.$promptButtons=$('<div class="buttons right"/>').appendTo(this.$prompt),this.modal.setContainer(this.$modalContainerDiv),this.$promptMessage.html(t);for(var a=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(this.$promptButtons),n=$("<button/>",{type:"submit",class:"btn submit disabled",text:Craft.t("app","OK")}).appendTo(this.$promptButtons),r=0;r<e.length;r++){var o=$('<div><label><input type="radio" name="promptAction" value="'+e[r].value+'"/> '+e[r].title+"</label></div>").appendTo(this.$promptChoices).find("input");this.addListener(o,"click",(function(){n.removeClass("disabled")}))}this.addListener(n,"activate",(function(t){var e=$(t.currentTarget).parents(".modal").find("input[name=promptAction]:checked").val(),i=this.$promptApplyToRemainingCheckbox.prop("checked");this._selectPromptChoice(e,i)})),this.addListener(a,"activate",(function(){var t=this.$promptApplyToRemainingCheckbox.prop("checked");this._selectPromptChoice("cancel",t)})),s&&(this.$promptApplyToRemainingContainer.show(),this.$promptApplyToRemainingLabel.html(" "+Craft.t("app","Apply this to the {number} remaining conflicts?",{number:s}))),this.modal.show(),this.modal.removeListener(Garnish.Modal.$shade,"click"),this.addListener(Garnish.Modal.$shade,"click","_cancelPrompt")},_selectPromptChoice:function(t,e){var i=this;this.$prompt.fadeOut("fast",(function(){i.modal.hide(),i._promptCallback(t,e)}))},_cancelPrompt:function(){this._selectPromptChoice("cancel",!0)}})},8960:function(){Craft.Queue=Garnish.Base.extend({running:!1,paused:!1,pausedForVisibility:!1,jobs:null,get length(){return this.jobs.length},get isPaused(){return this.paused||this.pausedForVisibility},init:function(){var t=this;this.jobs=[],Garnish.$doc.on("visibilitychange",(function(){t.pausedForVisibility&&Craft.isVisible()&&(t.pausedForVisibility=!1,t._resume())}))},push:function(t){return this._add(t,"push")},unshift:function(t){return this._add(t,"unshift")},pause:function(){this.paused||(this.paused=!0,this.pausedForVisibility||this.trigger("pause"))},resume:function(){this.paused&&(this.paused=!1,this._resume())},_add:function(t,e){var i=this;return new Promise((function(s,a){i.jobs[e]((function(){return new Promise((function(e,i){t().then((function(t){s(t),e()})).catch((function(t){a(t),i()}))}))})),i.running||(i.trigger("beforeRun"),i.running=!0,i._exec())}))},clear:function(){this.jobs.length=0},_exec:function(){var t=this;if(!this.jobs.length)return this.running=!1,void this.trigger("afterRun");this.pausedForVisibility||Craft.isVisible()||(this.pausedForVisibility=!0,this.paused||this.trigger("pause")),this.paused||this.pausedForVisibility||(this.trigger("beforeExec"),this.jobs.shift()().finally((function(){t.trigger("afterExec"),t._exec()})))},_resume:function(){this.isPaused||(this.trigger("resume"),this._exec())}}),Craft.queue=new Craft.Queue},4070:function(){!function(t){Craft.SlidePicker=Garnish.Base.extend({min:null,max:null,totalSteps:null,value:null,label:null,describedBy:null,$container:null,$buttons:null,init:function(e,i){var s=this;this.setSettings(i,Craft.SlidePicker.defaults),this.$container=t("<div/>",{class:"slide-picker",role:"slider",tabindex:0}),this.refresh(),this.setValue(e,!1),this.addListener(this.$container,"keydown",(function(t){switch(t.keyCode){case Garnish.UP_KEY:s.setValue(s.value+s.settings.step),t.preventDefault();break;case Garnish.DOWN_KEY:s.setValue(s.value-s.settings.step),t.preventDefault();break;case Garnish.RIGHT_KEY:"ltr"===Craft.orientation?s.setValue(s.value+s.settings.step):s.setValue(s.value-s.settings.step),t.preventDefault();break;case Garnish.LEFT_KEY:"ltr"===Craft.orientation?s.setValue(s.value-s.settings.step):s.setValue(s.value+s.settings.step),t.preventDefault();break;case Garnish.HOME_KEY:s.setValue(s.min),t.preventDefault();break;case Garnish.END_KEY:s.setValue(s.max),t.preventDefault()}}))},refresh:function(){var e=this;if(this.min=this._min(),this.max=this._max(),this.totalSteps=(this.max-this.min)/this.settings.step,this.label=this.settings.label,this.describedBy=this.settings.describedBy,!Number.isInteger(this.totalSteps))throw"Invalid SlidePicker config";this.$buttons&&this.$buttons.remove(),this.$container.attr("aria-valuemin",this.min),this.$container.attr("aria-valuemax",this.max),this.label&&this.$container.attr("aria-label",this.label),this.describedBy&&this.$container.attr("aria-describedby",this.describedBy),this.$buttons=t();for(var i=this.min;i<=this.max;i+=this.settings.step)this.$buttons=this.$buttons.add(t("<a/>",{title:this.settings.valueLabel(i),data:{value:i}}));if(this.$buttons.appendTo(this.$container),null!==this.value){var s=this.value;this.value=null,this.setValue(s,!1)}this.addListener(this.$buttons,"mouseover",(function(i){e.$buttons.removeClass("active-hover last-active-hover"),t(i.currentTarget).addClass("active-hover last-active-hover").prevAll().addClass("active-hover")})),this.addListener(this.$buttons,"mouseout",(function(){e.$buttons.removeClass("active-hover")})),this.addListener(this.$buttons,"click",(function(i){e.setValue(t.data(i.currentTarget,"value")),i.stopPropagation(),e.$container.focus()}))},setValue:function(t,e){if(t=Math.max(Math.min(t,this.max),this.min),this.value!==(this.value=t)){this.$container.attr({"aria-valuenow":this.value,"aria-valuetext":this.settings.valueLabel(this.value)}),this.$buttons.removeClass("last-active active");var i=this.$buttons.eq((this.value-this.min)/this.settings.step);i.add(i.prevAll()).addClass("active"),i.addClass("last-active"),!1!==e&&this.settings.onChange(t)}},_min:function(){return"function"==typeof this.settings.min?this.settings.min():this.settings.min},_max:function(){return"function"==typeof this.settings.max?this.settings.max():this.settings.max}},{defaults:{min:0,max:100,step:10,valueLabel:null,onChange:t.noop}})}(jQuery)},5763:function(){Craft.SlideRuleInput=Garnish.Base.extend({$container:null,$options:null,$selectedOption:null,$input:null,value:null,startPositionX:null,init:function(t,e){var i=this;this.setSettings(e,Craft.SlideRuleInput.defaultSettings),this.value=0,this.graduationsMin=-70,this.graduationsMax=70,this.slideMin=-45,this.slideMax=45,this.$container=$("#"+t),this.$overlay=$('<div class="overlay"></div>').appendTo(this.$container),this.$cursor=$('<div class="cursor"></div>').appendTo(this.$container),this.$graduations=$('<div class="graduations"></div>').appendTo(this.$container),this.$graduationsUl=$("<ul></ul>").appendTo(this.$graduations),this.$container.attr({role:"slider",tabindex:"0","aria-valuemin":this.slideMin,"aria-valuemax":this.slideMax,"aria-valuenow":"0","aria-valuetext":Craft.t("app","{num, number} {num, plural, =1{degree} other{degrees}}",{num:0})});for(var s=this.graduationsMin;s<=this.graduationsMax;s++){var a=$('<li class="graduation" data-graduation="'+s+'"><div class="label">'+s+"</div></li>").appendTo(this.$graduationsUl);s%5==0&&a.addClass("main-graduation"),0===s&&a.addClass("selected")}this.$options=this.$container.find(".graduation"),this.addListener(this.$container,"resize",this._handleResize.bind(this)),this.addListener(this.$container,"tapstart",this._handleTapStart.bind(this)),this.addListener(Garnish.$bod,"tapmove",this._handleTapMove.bind(this)),this.addListener(Garnish.$bod,"tapend",this._handleTapEnd.bind(this)),this.addListener(this.$container,"keydown",this._handleKeypress.bind(this)),setTimeout((function(){i.graduationsCalculatedWidth=10*(i.$options.length-1),i.$graduationsUl.css("left",-i.graduationsCalculatedWidth/2+i.$container.width()/2)}),50)},_handleResize:function(){var t=this.valueToPosition(this.value);this.$graduationsUl.css("left",t)},_handleKeypress:function(t){var e=parseInt(this.$container.attr("aria-valuenow"),10);switch(t.keyCode){case Garnish.UP_KEY:case Garnish.RIGHT_KEY:this.setValue(e+1);break;case Garnish.DOWN_KEY:case Garnish.LEFT_KEY:this.setValue(e-1);break;case Garnish.PAGE_UP_KEY:this.setValue(e+10);break;case Garnish.PAGE_DOWN_KEY:this.setValue(e-10);break;case Garnish.HOME_KEY:this.setValue(this.slideMin);break;case Garnish.END_KEY:this.setValue(this.slideMax)}this.onChange()},_handleTapStart:function(t,e){t.preventDefault(),this.startPositionX=e.position.x,this.startLeft=this.$graduationsUl.position().left,this.dragging=!0,this.onStart()},_handleTapMove:function(t,e){if(this.dragging){t.preventDefault();var i=this.startPositionX-e.position.x,s=this.startLeft-i,a=this.positionToValue(s);this.setValue(a),this.onChange()}},setValue:function(t){var e=this.valueToPosition(t);t<this.slideMin?(t=this.slideMin,e=this.valueToPosition(t)):t>this.slideMax&&(t=this.slideMax,e=this.valueToPosition(t)),this.$graduationsUl.css("left",e),t>=this.slideMin&&t<=this.slideMax&&(this.$options.removeClass("selected"),$.each(this.$options,(function(e,i){$(i).data("graduation")>0&&$(i).data("graduation")<=t&&$(i).addClass("selected"),$(i).data("graduation")<0&&$(i).data("graduation")>=t&&$(i).addClass("selected"),0==$(i).data("graduation")&&$(i).addClass("selected")}))),this.$container.attr({"aria-valuenow":t,"aria-valuetext":Craft.t("app","{num, number} {num, plural, =1{degree} other{degrees}}",{num:parseInt(t,10)})}),this.value=t},_handleTapEnd:function(t){this.dragging&&(t.preventDefault(),this.dragging=!1,this.onEnd())},positionToValue:function(t){var e=-1*this.graduationsMin,i=-1*(this.graduationsMin-this.graduationsMax);return(this.$graduations.width()/2+-1*t)/this.graduationsCalculatedWidth*i-e},valueToPosition:function(t){var e=-1*this.graduationsMin,i=-1*(this.graduationsMin-this.graduationsMax);return-((t+e)*this.graduationsCalculatedWidth/i-this.$graduations.width()/2)},onStart:function(){"function"==typeof this.settings.onChange&&this.settings.onStart(this)},onChange:function(){"function"==typeof this.settings.onChange&&this.settings.onChange(this)},onEnd:function(){"function"==typeof this.settings.onChange&&this.settings.onEnd(this)},defaultSettings:{onStart:$.noop,onChange:$.noop,onEnd:$.noop}})},5759:function(){!function(t){Craft.Slideout=Garnish.Base.extend({$outerContainer:null,$container:null,$shade:null,isOpen:!1,init:function(e,i){var s=this;this.setSettings(i,Craft.Slideout.defaults),Craft.useMobileStyles()||(this.$shade=t('<div class="slideout-shade"/>').appendTo(Garnish.$bod),this.settings.closeOnShadeClick&&this.addListener(this.$shade,"click",(function(t){t.stopPropagation(),s.close()}))),this.$outerContainer=t("<div/>",{class:"slideout-container hidden"}),this.$container=t("<".concat(this.settings.containerElement,"/>"),this.settings.containerAttributes).attr("data-slideout","").addClass("slideout").append(e).data("slideout",this).appendTo(this.$outerContainer),Garnish.addModalAttributes(this.$outerContainer),Craft.useMobileStyles()&&this.$container.addClass("so-mobile"),Craft.trapFocusWithin(this.$container),this.settings.autoOpen&&this.open()},open:function(){var t=this;this.isOpen||(this.setTriggerElement(document.activeElement),this._cancelTransitionListeners(),this.$shade&&this.$shade.appendTo(Garnish.$bod).show(),this.$outerContainer.appendTo(Garnish.$bod).removeClass("hidden"),Craft.useMobileStyles()?this.$container.css("top","100vh"):this.$container.css(Garnish.ltr?"left":"right","100vw"),this.$container.one("transitionend.slideout",(function(){Craft.setFocusWithin(t.$container)})),this.$shade&&(this.$shade[0].offsetWidth,this.$shade.addClass("so-visible")),this.$container[0].offsetWidth,Craft.Slideout.addPanel(this),this.enable(),Garnish.uiLayerManager.addLayer(this.$outerContainer),Garnish.hideModalBackgroundLayers(),this.settings.closeOnEsc&&Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.close()})),this.isOpen=!0,this.trigger("open"))},setTriggerElement:function(t){this.settings.triggerElement=t},close:function(){var t=this;this.isOpen&&(this.trigger("beforeClose"),this.disable(),this.isOpen=!1,this._cancelTransitionListeners(),this.$shade&&this.$shade.removeClass("so-visible").one("transitionend.slideout",(function(){t.$shade.hide()})),Craft.Slideout.removePanel(this),Garnish.uiLayerManager.removeLayer(),Garnish.resetModalBackgroundLayerVisibility(),this.$container.one("transitionend.slideout",(function(){t.$outerContainer.addClass("hidden"),t.trigger("close")})),this.settings.triggerElement&&this.settings.triggerElement.focus())},_cancelTransitionListeners:function(){this.$shade&&this.$shade.off("transitionend.slideout"),this.$container.off("transitionend.slideout")},destroy:function(){this.$shade&&(this.$shade.remove(),this.$shade=null),this.$outerContainer.remove(),this.$outerContainer=null,this.$container=null,this.base()}},{defaults:{containerElement:"div",containerAttributes:{},autoOpen:!0,closeOnEsc:!0,closeOnShadeClick:!0,triggerElement:null},openPanels:[],addPanel:function(t){Craft.Slideout.openPanels.unshift(t),Craft.useMobileStyles()?t.$container.css("top",0):Craft.Slideout.updateStyles()},removePanel:function(t){Craft.Slideout.openPanels=Craft.Slideout.openPanels.filter((function(e){return e!==t})),Craft.useMobileStyles()?t.$container.css("top","100vh"):(t.$container.css(Garnish.ltr?"left":"right","100vw"),Craft.Slideout.updateStyles())},updateStyles:function(){var t=Craft.Slideout.openPanels.length;Craft.Slideout.openPanels.forEach((function(e,i){e.$container.css(Garnish.ltr?"left":"right","".concat((t-i)/t*50,"vw"))})),0!==t?Garnish.$bod.addClass("no-scroll"):Garnish.$bod.removeClass("no-scroll")}})}(jQuery)},5185:function(){Craft.SlugGenerator=Craft.BaseInputGenerator.extend({generateTargetValue:function(t){t=(t=t.replace(/<(.*?)>/g,"")).replace(/['"‘’“”\[\]\(\)\{\}:]/g,""),Craft.allowUppercaseInSlug||(t=t.toLowerCase()),Craft.limitAutoSlugsToAscii&&(t=Craft.asciiString(t,this.settings.charMap));var e=Craft.filterArray(XRegExp.matchChain(t,[XRegExp("[\\p{L}\\p{N}\\p{M}]+")]));return e.length?e.join(Craft.slugWordSeparator):""}})},8030:function(){Craft.Structure=Garnish.Base.extend({id:null,$container:null,state:null,structureDrag:null,init:function(t,e,i){this.id=t,this.$container=$(e),this.setSettings(i,Craft.Structure.defaults),this.$container.data("structure")&&(console.warn("Double-instantiating a structure on an element"),this.$container.data("structure").destroy()),this.$container.data("structure",this),this.state={},this.settings.storageKey&&$.extend(this.state,Craft.getLocalStorage(this.settings.storageKey,{})),void 0===this.state.collapsedElementIds&&(this.state.collapsedElementIds=[]);for(var s=this.$container.find("ul").prev(".row"),a=0;a<s.length;a++){var n=$(s[a]),r=n.parent(),o=$('<div class="toggle" title="'+Craft.t("app","Show/hide children")+'"/>').prependTo(n);-1!==$.inArray(n.children(".element").data("id"),this.state.collapsedElementIds)&&r.addClass("collapsed"),this.initToggle(o)}this.settings.sortable&&(this.structureDrag=new Craft.StructureDrag(this,this.settings.maxLevels)),this.settings.newChildUrl&&this.initNewChildMenus(this.$container.find(".add"))},initToggle:function(t){var e=this;t.on("click",(function(t){var i=$(t.currentTarget).closest("li"),s=i.children(".row").find(".element:first").data("id"),a=$.inArray(s,e.state.collapsedElementIds);i.hasClass("collapsed")?(i.removeClass("collapsed"),-1!==a&&e.state.collapsedElementIds.splice(a,1)):(i.addClass("collapsed"),-1===a&&e.state.collapsedElementIds.push(s)),e.settings.storageKey&&Craft.setLocalStorage(e.settings.storageKey,e.state)}))},initNewChildMenus:function(t){this.addListener(t,"click","onNewChildMenuClick")},onNewChildMenuClick:function(t){var e=$(t.currentTarget);if(!e.data("menubtn")){var i=e.parent().children(".element").data("id"),s=Craft.getUrl(this.settings.newChildUrl,"parentId="+i);$('<div class="menu"><ul><li><a href="'+s+'">'+Craft.t("app","New child")+"</a></li></ul></div>").insertAfter(e),new Garnish.MenuBtn(e).showMenu()}},getIndent:function(t){return Craft.Structure.baseIndent+(t-1)*Craft.Structure.nestedIndent},addElement:function(t){var e=$('<li data-level="1"/>').appendTo(this.$container),i=$('<div class="row" style="margin-'+Craft.left+": -"+Craft.Structure.baseIndent+"px; padding-"+Craft.left+": "+Craft.Structure.baseIndent+'px;">').appendTo(e);if(i.append(t),this.settings.sortable&&(i.append('<a class="move icon" title="'+Craft.t("app","Move")+'"></a>'),this.structureDrag.addItems(e)),this.settings.newChildUrl){var s=$('<a class="add icon" title="'+Craft.t("app","New child")+'"></a>').appendTo(i);this.initNewChildMenus(s)}i.css("margin-bottom",-30),i.velocity({"margin-bottom":0},"fast")},removeElement:function(t){var e,i=this,s=t.parent().parent();this.settings.sortable&&this.structureDrag.removeItems(s),s.siblings().length||(e=s.parent()),s.css("visibility","hidden").velocity({marginBottom:-s.height()},"fast",(function(){s.remove(),void 0!==e&&i._removeUl(e)}))},_removeUl:function(t){t.siblings(".row").children(".toggle").remove(),t.remove()},destroy:function(){this.$container.removeData("structure"),this.base()}},{baseIndent:8,nestedIndent:35,defaults:{storageKey:null,sortable:!1,newChildUrl:null,maxLevels:null}})},3096:function(){Craft.StructureDrag=Garnish.Drag.extend({structure:null,maxLevels:null,draggeeLevel:null,$helperLi:null,$targets:null,draggeeHeight:null,init:function(t,e){this.structure=t,this.maxLevels=e,this.$insertion=$('<li class="draginsertion"/>');var i=this.structure.$container.find("li");this.base(i,{handle:".element:first, .move:first",helper:this.getHelper.bind(this)})},getHelper:function(t){this.$helperLi=t;var e=$('<ul class="structure draghelper"/>').append(t);return t.css("padding-"+Craft.left,this.$draggee.css("padding-"+Craft.left)),t.find(".move").removeAttr("title"),e},onDragStart:function(){var t=this;this.$targets=$(),this.findTargets(this.structure.$container),this.draggeeLevel=0;var e=this.$draggee;do{this.draggeeLevel++,e=e.find("> ul > li")}while(e.length);this.draggeeHeight=this.$draggee.height(),this.$draggee.velocity({height:0},"fast",(function(){t.$draggee.addClass("hidden")})),this.base(),this.addListener(Garnish.$doc,"keydown",(function(t){t.keyCode===Garnish.ESC_KEY&&this.cancelDrag()}))},findTargets:function(t){for(var e=t.children().not(this.$draggee),i=0;i<e.length;i++){var s=$(e[i]);this.$targets=this.$targets.add(s.children(".row")),s.hasClass("collapsed")||this.findTargets(s.children("ul"))}},onDrag:function(){for(this._.$closestTarget&&(this._.$closestTarget.removeClass("draghover"),this.$insertion.remove()),this._.$closestTarget=null,this._.closestTargetPos=null,this._.closestTargetYDiff=null,this._.closestTargetOffset=null,this._.closestTargetHeight=null,this._.i=0;this._.i<this.$targets.length&&(this._.$target=$(this.$targets[this._.i]),this._.targetOffset=this._.$target.offset(),this._.targetHeight=this._.$target.outerHeight(),this._.targetYMidpoint=this._.targetOffset.top+this._.targetHeight/2,this._.targetYDiff=Math.abs(this.mouseY-this._.targetYMidpoint),0===this._.i||this.mouseY>=this._.targetOffset.top+5&&this._.targetYDiff<this._.closestTargetYDiff);this._.i++)this._.$closestTarget=this._.$target,this._.closestTargetPos=this._.i,this._.closestTargetYDiff=this._.targetYDiff,this._.closestTargetOffset=this._.targetOffset,this._.closestTargetHeight=this._.targetHeight;if(this._.$closestTarget)if(0===this._.closestTargetPos&&this.mouseY<this._.closestTargetOffset.top+5)this.$insertion.prependTo(this.structure.$container);else if(this._.$closestTargetLi=this._.$closestTarget.parent(),this._.closestTargetLevel=this._.$closestTargetLi.data("level"),this._.closestTargetPos<this.$targets.length-1?(this._.$nextTargetLi=$(this.$targets[this._.closestTargetPos+1]).parent(),this._.nextTargetLevel=this._.$nextTargetLi.data("level")):(this._.$nextTargetLi=null,this._.nextTargetLevel=null),this._.hoveringBetweenRows=this.mouseY>=this._.closestTargetOffset.top+this._.closestTargetHeight-5,this._.$nextTargetLi&&this._.nextTargetLevel==this._.closestTargetLevel)this._.hoveringBetweenRows?(!this.maxLevels||this.maxLevels>=this._.closestTargetLevel+this.draggeeLevel-1)&&this.$insertion.insertAfter(this._.$closestTargetLi):(!this.maxLevels||this.maxLevels>=this._.closestTargetLevel+this.draggeeLevel)&&this._.$closestTarget.addClass("draghover");else if(this._.$nextTargetLi&&this._.nextTargetLevel>this._.closestTargetLevel)(!this.maxLevels||this.maxLevels>=this._.nextTargetLevel+this.draggeeLevel-1)&&(this._.hoveringBetweenRows?this.$insertion.insertBefore(this._.$nextTargetLi):(this._.$closestTarget.addClass("draghover"),this.$insertion.appendTo(this._.$closestTargetLi.children("ul"))));else if(this._.hoveringBetweenRows){for(this._.draggeeX=this.mouseX-this.targetItemMouseDiffX,"rtl"===Craft.orientation&&(this._.draggeeX+=this.$helperLi.width()),this._.$parentLis=this._.$closestTarget.parentsUntil(this.structure.$container,"li"),this._.$closestParentLi=null,this._.closestParentLiXDiff=null,this._.closestParentLevel=null,this._.i=0;this._.i<this._.$parentLis.length;this._.i++)this._.$parentLi=$(this._.$parentLis[this._.i]),this._.parentLiX=this._.$parentLi.offset().left,"rtl"===Craft.orientation&&(this._.parentLiX+=this._.$parentLi.width()),this._.parentLiXDiff=Math.abs(this._.parentLiX-this._.draggeeX),this._.parentLevel=this._.$parentLi.data("level"),(!this.maxLevels||this.maxLevels>=this._.parentLevel+this.draggeeLevel-1)&&(!this._.$closestParentLi||this._.parentLiXDiff<this._.closestParentLiXDiff&&(!this._.$nextTargetLi||this._.parentLevel>=this._.nextTargetLevel))&&(this._.$closestParentLi=this._.$parentLi,this._.closestParentLiXDiff=this._.parentLiXDiff,this._.closestParentLevel=this._.parentLevel);this._.$closestParentLi&&this.$insertion.insertAfter(this._.$closestParentLi)}else(!this.maxLevels||this.maxLevels>=this._.closestTargetLevel+this.draggeeLevel)&&this._.$closestTarget.addClass("draghover")},cancelDrag:function(){this.$insertion.remove(),this._.$closestTarget&&this._.$closestTarget.removeClass("draghover"),this.onMouseUp()},onDragStop:function(){var t=this;if(this._.$closestTarget&&(this.$insertion.parent().length||this._.$closestTarget.hasClass("draghover"))){var e,i;if(this.$draggee.siblings().length||(e=this.$draggee.parent()),this.$insertion.parent().length){var s=this.$insertion.next().add(this.$insertion.prev());-1===$.inArray(this.$draggee[0],s)?(this.$insertion.replaceWith(this.$draggee),i=!0):(this.$insertion.remove(),i=!1)}else{var a=this._.$closestTargetLi.children("ul");if(e&&a.length&&a[0]===e[0])i=!1;else{if(a.length)this._.$closestTargetLi.hasClass("collapsed")&&this._.$closestTarget.children(".toggle").trigger("click");else{var n=$('<div class="toggle" title="'+Craft.t("app","Show/hide children")+'"/>').prependTo(this._.$closestTarget);this.structure.initToggle(n),a=$("<ul>").appendTo(this._.$closestTargetLi)}this.$draggee.appendTo(a),i=!0}}if(this._.$closestTarget.removeClass("draghover"),i){e&&this.structure._removeUl(e);var r,o=this.$draggee.parentsUntil(this.structure.$container,"li").length+1;o!=this.$draggee.data("level")&&(1==this.$draggee.data("level")?((r={})["padding-"+Craft.left]=38,this.$helperLi.velocity(r,"fast")):1==o&&((r={})["padding-"+Craft.left]=Craft.Structure.baseIndent,this.$helperLi.velocity(r,"fast")),this.setLevel(this.$draggee,o));var l=this.$draggee.children(".row").children(".element"),h={structureId:this.structure.id,elementId:l.data("id"),siteId:l.data("site-id"),prevId:this.$draggee.prev().children(".row").children(".element").data("id"),parentId:this.$draggee.parent("ul").parent("li").children(".row").children(".element").data("id")};Craft.sendActionRequest("POST","structures/move-element",{data:h}).then((function(t){Craft.cp.displaySuccess(Craft.t("app","New order saved."))}))}}this.$draggee.velocity("stop").removeClass("hidden").velocity({height:this.draggeeHeight},"fast",(function(){t.$draggee.css("height","auto")})),this.returnHelpersToDraggees(),this.base()},setLevel:function(t,e){t.data("level",e);var i=this.structure.getIndent(e),s={};s["margin-"+Craft.left]="-"+i+"px",s["padding-"+Craft.left]=i+"px",this.$draggee.children(".row").css(s);for(var a=t.children("ul").children(),n=0;n<a.length;n++)this.setLevel($(a[n]),e+1)}})},3331:function(){Craft.StructureTableSorter=Garnish.DragSort.extend({tableView:null,structureId:null,maxLevels:null,_basePadding:null,_helperMargin:null,_$firstRowCells:null,_$titleHelperCell:null,_titleHelperCellOuterWidth:null,_ancestors:null,_updateAncestorsFrame:null,_draggeeLevel:null,_draggeeLevelDelta:null,draggingLastElements:null,_loadingDraggeeLevelDelta:!1,_targetLevel:null,_targetLevelBounds:null,_positionChanged:null,init:function(t,e,i){this.tableView=t,this.structureId=this.tableView.$table.data("structure-id"),this.maxLevels=parseInt(this.tableView.$table.attr("data-max-levels")),this._basePadding=14+(this.tableView.elementIndex.actions?34:24),this._helperMargin=this.tableView.elementIndex.actions?54:0,i=$.extend({},Craft.StructureTableSorter.defaults,i,{handle:".move",collapseDraggees:!0,singleHelper:!0,helperSpacingY:2,magnetStrength:4,helper:this.getHelper.bind(this),helperLagBase:1.5,axis:Garnish.Y_AXIS}),this.base(e,i)},findDraggee:function(){var t=this;this._draggeeLevel=this._targetLevel=this.$targetItem.data("level"),this._draggeeLevelDelta=0;for(var e=$(this.$targetItem),i=this.$targetItem.next();i.length;){var s=i.data("level");if(s<=this._draggeeLevel)break;var a=s-this._draggeeLevel;a>this._draggeeLevelDelta&&(this._draggeeLevelDelta=a),e=e.add(i),i=i.next()}if(this.draggingLastElements=!i.length,this.maxLevels&&this.draggingLastElements&&this.tableView.getMorePending()){this._loadingDraggeeLevelDelta=!0;var n=this._getAjaxBaseData(this.$targetItem);Craft.sendActionRequest("POST","structures/get-element-level-delta",{data:n}).then((function(e){t._loadingDraggeeLevelDelta=!1,t.dragging&&(t._draggeeLevelDelta=e.data.delta,t.drag(!1))}))}return e},getHelper:function(t){var e=$('<div class="elements datatablesorthelper"/>').appendTo(Garnish.$bod),i=$('<div class="tableview"/>').appendTo(e),s=$('<table class="data"/>').appendTo(i),a=$("<tbody/>").appendTo(s);t.appendTo(a),this._$firstRowCells=this.tableView.$elementContainer.children("tr:first").children();for(var n=t.children(),r=0;r<n.length;r++){var o=$(n[r]);if(o.hasClass("checkbox-cell"))o.remove();else{var l=$(this._$firstRowCells[r]),h=l[0].getBoundingClientRect().width;l.css("width",h+"px"),o.css("width",h+"px"),Garnish.hasAttr(l,"data-titlecell")&&(this._$titleHelperCell=o,parseInt(l.css("padding-"+Craft.left)),this._titleHelperCellOuterWidth=h,o.css("padding-"+Craft.left,this._basePadding))}}return e},canInsertBefore:function(t){return!this._loadingDraggeeLevelDelta&&!1!==this._getLevelBounds(t.prev(),t)},canInsertAfter:function(t){return!this._loadingDraggeeLevelDelta&&!1!==this._getLevelBounds(t,t.next())},onDragStart:function(){this._ancestors=this._getAncestors(this.$targetItem,this.$targetItem.data("level")),this._setTargetLevelBounds(),this.tableView.maybeLoadMore(),this.base()},onDrag:function(){this.base(),this._updateIndent()},onInsertionPointChange:function(){this._setTargetLevelBounds(),this._updateAncestorsBeforeRepaint(),this.base()},onDragStop:function(){var t=this;if(this._positionChanged=!1,this.base(),this._targetLevel!=this._draggeeLevel){for(var e=this._targetLevel-this._draggeeLevel,i=0;i<this.$draggee.length;i++){var s=$(this.$draggee[i]),a=s.data("level")+e,n=this._basePadding+this._getLevelIndent(a);s.data("level",a),s.find(".element").data("level",a),s.children("[data-titlecell]:first").css("padding-"+Craft.left,n)}this._positionChanged=!0}if(this._positionChanged){for(var r=this._getAjaxBaseData(this.$draggee),o=this.$draggee.first().prev();o.length;){var l=o.data("level");if(l==this._targetLevel){r.prevId=o.data("id");break}if(l<this._targetLevel){r.parentId=o.data("id");var h=o.find("> th > .toggle");if(!h.hasClass("expanded")){h.addClass("expanded");var d=this.tableView._createSpinnerRowAfter(o);this.tableView.elementSelect&&this.tableView.elementSelect.removeItems(this.$targetItem),this.removeItems(this.$targetItem),this.$targetItem.remove(),this.tableView._totalVisible--}break}o=o.prev()}Craft.sendActionRequest("POST","structures/move-element",{data:r}).then((function(e){Craft.cp.displaySuccess(Craft.t("app","New position saved.")),t.onPositionChange(),d&&d.parent().length&&(d.remove(),t.tableView._expandElement(h,!0)),Craft.cp.runQueue()})).catch((function(e){e.response,Craft.cp.displayError(Craft.t("app","A server error occurred.")),t.tableView.elementIndex.updateElements()}))}},onSortChange:function(){this.tableView.elementSelect&&this.tableView.elementSelect.resetItemOrder(),this._positionChanged=!0,this.base()},onPositionChange:function(){var t=this;Garnish.requestAnimationFrame((function(){t.trigger("positionChange"),t.settings.onPositionChange()}))},onReturnHelpersToDraggees:function(){if(this._$firstRowCells.css("width",""),this.draggingLastElements&&this.tableView.getMorePending()){this.tableView._totalVisible+=this.newDraggeeIndexes[0]-this.oldDraggeeIndexes[0];var t=this.$draggee.last().nextAll();t.length&&(this.removeItems(t),t.remove(),this.tableView.maybeLoadMore())}this.base()},_getLevelBounds:function(t,e){if(e&&e.length?this._getLevelBounds._minLevel=e.data("level"):this._getLevelBounds._minLevel=1,t&&t.length?this._getLevelBounds._maxLevel=t.data("level")+1:this._getLevelBounds._maxLevel=1,this.maxLevels){if(1!=this._getLevelBounds._minLevel&&this._getLevelBounds._minLevel+this._draggeeLevelDelta>this.maxLevels)return!1;this._getLevelBounds._maxLevel+this._draggeeLevelDelta>this.maxLevels&&(this._getLevelBounds._maxLevel=this.maxLevels-this._draggeeLevelDelta,this._getLevelBounds._maxLevel<this._getLevelBounds._minLevel&&(this._getLevelBounds._maxLevel=this._getLevelBounds._minLevel))}return{min:this._getLevelBounds._minLevel,max:this._getLevelBounds._maxLevel}},_setTargetLevelBounds:function(){this._targetLevelBounds=this._getLevelBounds(this.$draggee.first().prev(),this.$draggee.last().next())},_updateIndent:function(t){this._updateIndent._mouseDist=this.realMouseX-this.mousedownX,"rtl"===Craft.orientation&&(this._updateIndent._mouseDist*=-1),this._updateIndent._indentationDist=Math.round(this._updateIndent._mouseDist/Craft.StructureTableSorter.LEVEL_INDENT),this._updateIndent._targetLevel=this._draggeeLevel+this._updateIndent._indentationDist,this._updateIndent._targetLevel<this._targetLevelBounds.min?(this._updateIndent._indentationDist+=this._targetLevelBounds.min-this._updateIndent._targetLevel,this._updateIndent._targetLevel=this._targetLevelBounds.min):this._updateIndent._targetLevel>this._targetLevelBounds.max&&(this._updateIndent._indentationDist-=this._updateIndent._targetLevel-this._targetLevelBounds.max,this._updateIndent._targetLevel=this._targetLevelBounds.max),this._targetLevel!==(this._targetLevel=this._updateIndent._targetLevel)&&this._updateAncestorsBeforeRepaint(),this._updateIndent._targetLevelMouseDiff=this._updateIndent._mouseDist-this._updateIndent._indentationDist*Craft.StructureTableSorter.LEVEL_INDENT,this._updateIndent._magnetImpact=Math.round(this._updateIndent._targetLevelMouseDiff/15),Math.abs(this._updateIndent._magnetImpact)>Craft.StructureTableSorter.MAX_GIVE&&(this._updateIndent._magnetImpact=(this._updateIndent._magnetImpact>0?1:-1)*Craft.StructureTableSorter.MAX_GIVE),this._updateIndent._closestLevelMagnetIndent=this._getLevelIndent(this._targetLevel)+this._updateIndent._magnetImpact,this.helpers[0].css("margin-"+Craft.left,this._updateIndent._closestLevelMagnetIndent+this._helperMargin),this._$titleHelperCell.css("width",this._titleHelperCellOuterWidth-this._updateIndent._closestLevelMagnetIndent)},_getLevelIndent:function(t){return(t-1)*Craft.StructureTableSorter.LEVEL_INDENT},_getAjaxBaseData:function(t){return{structureId:this.structureId,elementId:t.data("id"),siteId:t.find(".element:first").data("site-id")}},_getAncestors:function(t,e){if(this._getAncestors._ancestors=[],0!=e)for(this._getAncestors._level=e,this._getAncestors._$prevRow=t.prev();this._getAncestors._$prevRow.length&&!(this._getAncestors._$prevRow.data("level")<this._getAncestors._level&&(this._getAncestors._ancestors.unshift(this._getAncestors._$prevRow),this._getAncestors._level=this._getAncestors._$prevRow.data("level"),0==this._getAncestors._level));)this._getAncestors._$prevRow=this._getAncestors._$prevRow.prev();return this._getAncestors._ancestors},_updateAncestorsBeforeRepaint:function(){this._updateAncestorsFrame&&Garnish.cancelAnimationFrame(this._updateAncestorsFrame),this._updateAncestorsFrame=Garnish.requestAnimationFrame(this._updateAncestors.bind(this))},_updateAncestors:function(){for(this._updateAncestorsFrame=null,this._updateAncestors._i=0;this._updateAncestors._i<this._ancestors.length;this._updateAncestors._i++)this._updateAncestors._$ancestor=this._ancestors[this._updateAncestors._i],this._updateAncestors._$ancestor.data("descendants",this._updateAncestors._$ancestor.data("descendants")-1),0==this._updateAncestors._$ancestor.data("descendants")&&this._updateAncestors._$ancestor.find("> th > .toggle:first").remove();for(this._updateAncestors._newAncestors=this._getAncestors(this.$targetItem,this._targetLevel),this._updateAncestors._i=0;this._updateAncestors._i<this._updateAncestors._newAncestors.length;this._updateAncestors._i++)if(this._updateAncestors._$ancestor=this._updateAncestors._newAncestors[this._updateAncestors._i],this._updateAncestors._$ancestor.data("descendants",this._updateAncestors._$ancestor.data("descendants")+1),1==this._updateAncestors._$ancestor.data("descendants")){var t=this._updateAncestors._$ancestor.data("title");$('<button class="toggle expanded" type="button" aria-expanded="true" title="'+Craft.t("app","Show/hide children")+'" aria-label="'+Craft.t("app","Show {title} children",{title:t})+'"></button>').insertAfter(this._updateAncestors._$ancestor.find("> th .move:first"))}this._ancestors=this._updateAncestors._newAncestors,delete this._updateAncestors._i,delete this._updateAncestors._$ancestor,delete this._updateAncestors._newAncestors}},{HELPER_MARGIN:0,LEVEL_INDENT:44,MAX_GIVE:22,defaults:{onPositionChange:$.noop}})},53:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.TableElementIndexView=Craft.BaseElementIndexView.extend({$table:null,$tableCaption:null,$selectedSortHeader:null,$statusMessage:null,structureTableSort:null,_totalVisiblePostStructureTableDraggee:null,_morePendingPostStructureTableDraggee:!1,_broadcastListener:null,getElementContainer:function(){return this.$table=this.$container.find("table:first"),this.$table.children("tbody:first")},afterInit:function(){var t=this;this.$tableCaption=this.$table.find("caption"),this.$statusMessage=this.$table.parent().find("[data-status-message]"),this.initTableHeaders(),this.elementIndex.on("updateElements",(function(){t._updateScreenReaderStatus()})),"index"===this.elementIndex.settings.context&&"structure"===this.elementIndex.getSelectedSortAttribute()&&Garnish.hasAttr(this.$table,"data-structure-id")?this.structureTableSort=new Craft.StructureTableSorter(this,this.getAllElements()):this.structureTableSort=null,"structure"===this.elementIndex.getSelectedSortAttribute()&&this.addListener(this.$elementContainer,"click",(function(t){var e=$(t.target);e.hasClass("toggle")&&!1===this._collapseElement(e)&&this._expandElement(e)})),Craft.messageReceiver&&(this._broadcastListener=function(e){if("saveElement"===e.data.event){var i=t.$table.find('> tbody > tr[data-id="'.concat(e.data.id,'"]'));if(i.length){var s={elementType:t.elementIndex.elementType,source:t.elementIndex.sourceKey,id:e.data.id,siteId:t.elementIndex.siteId};Craft.sendActionRequest("POST","element-indexes/element-table-html",{data:s}).then((function(t){for(var e=t.data,s=0;s<i.length;s++){var a=i.eq(s);for(var n in a.find("> th[data-titlecell] .element").replaceWith(e.elementHtml),e.attributeHtml)e.attributeHtml.hasOwnProperty(n)&&a.find('> td[data-attr="'.concat(n,'"]')).html(e.attributeHtml[n])}(new Craft.ElementThumbLoader).load(i)}))}}},Craft.messageReceiver.addEventListener("message",this._broadcastListener))},initTableHeaders:function(){for(var e=function(e,i){return function(t){if(Array.isArray(t))return t}(e)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(e,i)||function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(e,i)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(this.elementIndex.getSortAttributeAndDirection(),1)[0],i=this.$table.children("thead").children().children("[data-attribute]"),s=0;s<i.length;s++){var a=i.eq(s),n=a.attr("data-attribute"),r="none";if(n===e){this.$selectedSortHeader=a;var o=this.elementIndex.getSelectedSortDirection();r="asc"===o?"ascending":"descending",a.addClass("ordered "+o),this.makeColumnSortable(a,!0)}else this.elementIndex.getSortOption(n)&&this.makeColumnSortable(a);a.attr("aria-sort",r)}},makeColumnSortable:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];t.addClass("orderable");var i=t.html(),s=this.$tableCaption.find("[data-sort-instructions]"),a=$("<button/>",{id:"".concat(this.elementIndex.idPrefix,"-").concat(t.attr("data-attribute")),type:"button","aria-pressed":"false"}).html(i);s.length&&a.attr("aria-describedby",s.attr("id")),e?(a.attr("aria-pressed","true"),a.on("click",this._handleSelectedSortHeaderClick.bind(this))):a.on("click",this._handleUnselectedSortHeaderClick.bind(this)),t.empty().append(a)},isVerticalList:function(){return!0},getTotalVisible:function(){return this._isStructureTableDraggingLastElements()?this._totalVisiblePostStructureTableDraggee:this._totalVisible},setTotalVisible:function(t){this._isStructureTableDraggingLastElements()?this._totalVisiblePostStructureTableDraggee=t:this._totalVisible=t},getMorePending:function(){return this._isStructureTableDraggingLastElements()?this._morePendingPostStructureTableDraggee:this._morePending},setMorePending:function(t){this._isStructureTableDraggingLastElements()?this._morePendingPostStructureTableDraggee=t:this._morePending=this._morePendingPostStructureTableDraggee=t},getLoadMoreParams:function(){var t=this.base();return this._isStructureTableDraggingLastElements()&&(t.criteria.positionedAfter=this.structureTableSort.$targetItem.data("id")),t},appendElements:function(t){this.base(t),this.structureTableSort&&this.structureTableSort.addItems(t),Craft.cp.updateResponsiveTables()},_collapseElement:function(t,e){if(!e&&!t.hasClass("expanded"))return!1;t.removeClass("expanded"),t.attr("aria-expanded","false");for(var i=t.parent().parent(),s=i.data("id"),a=i.data("level"),n=i.next();n.length;){if(!Garnish.hasAttr(n,"data-spinnerrow")){if(n.data("level")<=a)break;this.elementSelect&&this.elementSelect.removeItems(n),this.structureTableSort&&this.structureTableSort.removeItems(n),this._totalVisible--}var r=n.next();n.remove(),n=r}this.elementIndex.instanceState.collapsedElementIds||(this.elementIndex.instanceState.collapsedElementIds=[]),this.elementIndex.instanceState.collapsedElementIds.push(s),this.elementIndex.setInstanceState("collapsedElementIds",this.elementIndex.instanceState.collapsedElementIds),this.maybeLoadMore()},_expandElement:function(t,e){var i=this;if(!e&&t.hasClass("expanded"))return!1;if(t.addClass("expanded"),t.attr("aria-expanded","true"),this.elementIndex.instanceState.collapsedElementIds){var s=t.parent().parent(),a=s.data("id"),n=$.inArray(a,this.elementIndex.instanceState.collapsedElementIds);if(-1!==n){this.elementIndex.instanceState.collapsedElementIds.splice(n,1),this.elementIndex.setInstanceState("collapsedElementIds",this.elementIndex.instanceState.collapsedElementIds);var r=this._createSpinnerRowAfter(s),o=$.extend(!0,{},this.settings.params);o.criteria.descendantOf=a,Craft.sendActionRequest("POST",this.settings.loadMoreElementsAction,{data:o}).then((function(t){if(r.parent().length){var e=$(t.data.html),s=i._totalVisible+e.length,a=i.settings.batchSize&&e.length===i.settings.batchSize;if(a){var n=r.nextAll();i.elementSelect&&i.elementSelect.removeItems(n),i.structureTableSort&&i.structureTableSort.removeItems(n),n.remove(),s-=n.length}else a=i._morePending;r.replaceWith(e),i.thumbLoader.load(e),(i.elementIndex.actions||i.settings.selectable)&&(i.elementSelect.addItems(e.filter(":not(.disabled)")),i.elementIndex.updateActionTriggers()),i.structureTableSort&&i.structureTableSort.addItems(e),Craft.appendHeadHtml(t.data.headHtml),Craft.appendBodyHtml(t.data.bodyHtml),Craft.cp.updateResponsiveTables(),i.setTotalVisible(s),i.setMorePending(a),i.maybeLoadMore()}})).catch((function(t){Craft.cp.displayError(),r.parent().length}))}}},_createSpinnerRowAfter:function(t){return $('<tr data-spinnerrow><td class="centeralign" colspan="'+t.children().length+'"><div class="spinner"/></td></tr>').insertAfter(t)},_isStructureTableDraggingLastElements:function(){return this.structureTableSort&&this.structureTableSort.dragging&&this.structureTableSort.draggingLastElements},_handleSelectedSortHeaderClick:function(t){var e=$(t.currentTarget).closest("th");if(!e.hasClass("loading")){var i="asc"===this.elementIndex.getSelectedSortDirection()?"desc":"asc";this.elementIndex.setSelectedSortDirection(i),this._handleSortHeaderClick(t,e)}},_handleUnselectedSortHeaderClick:function(t){var e=$(t.currentTarget).closest("th");if(!e.hasClass("loading")){var i=e.attr("data-attribute");this.elementIndex.setSelectedSortAttribute(i),this._handleSortHeaderClick(t,e)}},_handleSortHeaderClick:function(t,e){this.$selectedSortHeader&&this.$selectedSortHeader.removeClass("ordered asc desc"),e.addClass("ordered loading"),this.elementIndex.updateElements(),this.elementIndex.setIndexAvailable()},_updateScreenReaderStatus:function(){var t=this.elementIndex.getSelectedSortAttribute(),e="asc"===this.elementIndex.getSelectedSortDirection()?Craft.t("app","Ascending"):Craft.t("app","Descending"),i=this.elementIndex.getSortLabel(t);if(t||e||i){var s=Craft.t("app","Table {name} sorted by {attribute}, {direction}",{name:this.$table.attr("data-name"),attribute:i,direction:e});this.$statusMessage.empty(),this.$statusMessage.text(s)}},_updateTableAttributes:function(t,e){var i=t.closest("tr");for(var s in e)e.hasOwnProperty(s)&&i.children('[data-attr="'+s+'"]:first').html(e[s])},destroy:function(){this._broadcastListener&&(Craft.messageReceiver.removeEventListener("message",this._broadcastListener),delete this._broadcastListener),this.base()}})},7745:function(){Craft.Tabs=Garnish.Base.extend({$container:null,$tablist:null,$menuBtn:null,$tabs:null,$firstTab:null,$lastTab:null,$selectedTab:null,$focusableTab:null,menu:null,init:function(t){var e=this;this.$container=$(t),this.$tablist=this.$container.find('> [role="tablist"]:first'),this.$tabs=this.$tablist.find('> [role="tab"]'),this.$firstTab=this.$tabs.first(),this.$lastTab=this.$tabs.last(),this.$selectedTab=this.$tabs.filter(".sel:first"),this.$focusableTab=this.$tabs.filter("[tabindex=0]:first"),this.$menuBtn=this.$container.find("> .menubtn:first").menubtn(),this.menu=this.$menuBtn.data("menubtn").menu,this.$container.data("tabs")&&(console.warn("Double-instantiating a tab manager on an element"),this.$container.data("tabs").destroy()),this.$container.data("tabs",this);for(var i=0;i<this.$tabs.length;i++){var s=this.$tabs.eq(i),a=s.attr("href");a&&"#"===a.charAt(0)&&(this.addListener(s,"keydown",(function(t){[Garnish.SPACE_KEY,Garnish.RETURN_KEY].includes(t.keyCode)&&(t.preventDefault(),e.selectTab(t.currentTarget))})),this.addListener(s,"click",(function(t){t.preventDefault(),e.selectTab(t.currentTarget)}))),this.addListener(s,"keydown",(function(t){var i;[Garnish.LEFT_KEY,Garnish.RIGHT_KEY].includes(t.keyCode)&&$.contains(e.$tablist[0],t.currentTarget)?i=t.keyCode===("ltr"===Craft.orientation?Garnish.LEFT_KEY:Garnish.RIGHT_KEY)?(i=$(t.currentTarget).prevAll('[role="tab"]:not(.hidden):first')).length?i:e.$lastTab:(i=$(t.currentTarget).nextAll('[role="tab"]:not(.hidden):first')).length?i:e.$firstTab:t.keyCode!==Garnish.HOME_KEY&&t.keyCode!==Garnish.END_KEY||(i=t.keyCode===Garnish.HOME_KEY?e.$firstTab:e.$lastTab),i&&(t.preventDefault(),e.makeTabFocusable(i),i.focus(),e.scrollToTab(i))}))}this.updateMenuBtn(),Garnish.$win.on("resize",(function(){e.updateMenuBtn()})),this.menu.$options.on("click",(function(t){var e=$(t.currentTarget).attr("href");e&&"#"===e.charAt(0)&&t.preventDefault()})),this.menu.on("optionselect",(function(t){e.selectTab($(t.selectedOption).data("id"))}))},selectTab:function(t){var e=this._getTab(t);e[0]!==this.$selectedTab[0]&&(this.deselectTab(),this.$selectedTab=e.addClass("sel").attr("aria-selected","true"),this.makeTabFocusable(e),e.focus(),this.scrollToTab(e),this.menu.$options.removeClass("sel"),this.menu.$options.filter('[data-id="'.concat(e.data("id"),'"]')).addClass("sel"),this.trigger("selectTab",{$tab:e}),$("#content").trigger("scroll"))},deselectTab:function(){var t=this.$selectedTab.removeClass("sel").attr("aria-selected","false");this.$selectedTab=null,this.trigger("deselectTab",{$tab:t})},makeTabFocusable:function(t){var e=this._getTab(t);e[0]!==this.$focusableTab[0]&&(this.$focusableTab.attr("tabindex","-1"),this.$focusableTab=e.attr("tabindex","0"))},scrollToTab:function(t){var e=this._getTab(t),i=this.$tablist.scrollLeft(),s=e.offset().left-this.$tablist.offset().left,a=!1;if(s<0)a=i+s-24;else{var n=e.outerWidth(),r=this.$tablist.prop("clientWidth");s+n>r&&(a=i+(s-(r-n))+24)}!1!==a&&this.$tablist.scrollLeft(a)},updateMenuBtn:function(){Math.floor(this.$tablist.prop("scrollWidth")-48)>this.$container.prop("clientWidth")?(this.$tablist.addClass("scrollable"),this.$menuBtn.removeClass("hidden")):(this.$tablist.removeClass("scrollable"),this.$menuBtn.addClass("hidden"))},_getTab:function(t){if(t instanceof jQuery)return t;if(t instanceof HTMLElement)return $(t);if("string"!=typeof t)throw"Invalid tab ID";var e=this.$tabs.filter('[data-id="'.concat(t,'"]'));if(!e.length)throw"Invalid tab ID: ".concat(t);return e},destroy:function(){this.$container.removeData("tabs"),this.base()}})},5074:function(){Craft.TagSelectInput=Craft.BaseElementSelectInput.extend({searchTimeout:null,searchMenu:null,$container:null,$elementsContainer:null,$elements:null,$addTagInput:null,$spinner:null,_ignoreBlur:!1,init:function(t){var e=this;if(!$.isPlainObject(t)){for(var i={},s=["id","name","tagGroupId","sourceElementId"],a=0;a<s.length&&void 0!==arguments[a];a++)i[s[a]]=arguments[a];t=i}this.base($.extend({},Craft.TagSelectInput.defaults,t)),this.$addTagInput=this.$container.children(".add").children(".text"),this.$spinner=this.$addTagInput.next(),this.addListener(this.$addTagInput,"input",(function(){e.searchTimeout&&clearTimeout(e.searchTimeout),e.searchTimeout=setTimeout(e.searchForTags.bind(e),500)})),this.addListener(this.$addTagInput,"keydown",(function(t){switch(t.keyCode===Garnish.RETURN_KEY&&t.preventDefault(),t.keyCode){case Garnish.RETURN_KEY:return t.preventDefault(),void(this.searchMenu&&this.selectTag(this.searchMenu.$options.filter(".hover")));case Garnish.DOWN_KEY:if(t.preventDefault(),this.searchMenu){var e=this.searchMenu.$options.filter(".hover");if(e.length){var i=e.parent().nextAll().find("a:not(.disabled)").first();i.length&&this.focusOption(i)}else this.focusOption(this.searchMenu.$options.eq(0))}return;case Garnish.UP_KEY:if(t.preventDefault(),this.searchMenu){var s=this.searchMenu.$options.filter(".hover");if(s.length){var a=s.parent().prevAll().find("a:not(.disabled)").last();a.length&&this.focusOption(a)}else this.focusOption(this.searchMenu.$options.eq(this.searchMenu.$options.length-1))}return}})),this.addListener(this.$addTagInput,"focus",(function(){this.searchMenu&&this.searchMenu.show()})),this.addListener(this.$addTagInput,"blur",(function(){var t=this;this._ignoreBlur?this._ignoreBlur=!1:setTimeout((function(){t.searchMenu&&t.searchMenu.hide()}),1)}))},focusOption:function(t){this.searchMenu.$options.removeClass("hover"),t.addClass("hover"),this.searchMenu.$menuList.attr("aria-activedescendant",t.attr("id"))},getAddElementsBtn:$.noop,getElementSortAxis:function(){return null},searchForTags:function(){var t=this;if(this.searchMenu&&this.killSearchMenu(),this.$addTagInput.val()){this.$spinner.removeClass("hidden");for(var e=[],i=0;i<this.$elements.length;i++){var s=$(this.$elements[i]).data("id");s&&e.push(s)}this.settings.sourceElementId&&e.push(this.settings.sourceElementId);var a={search:this.$addTagInput.val(),tagGroupId:this.settings.tagGroupId,excludeIds:e};Craft.sendActionRequest("POST","tags/search-for-tags",{data:a}).then((function(e){t.searchMenu&&t.killSearchMenu(),t.$spinner.addClass("hidden");for(var i,s=$('<div class="menu tagmenu"/>').appendTo(Garnish.$bod),n=$("<ul/>").appendTo(s),r=0;r<e.data.tags.length;r++)i=$("<li/>").appendTo(n),$('<a data-icon="tag"/>').appendTo(i).text(e.data.tags[r].title).data("id",e.data.tags[r].id).addClass(e.data.tags[r].exclude?"disabled":"");e.data.exactMatch||(i=$("<li/>").appendTo(n),$('<a data-icon="plus"/>').appendTo(i).text(a.search)),n.find("a:not(.disabled):first").addClass("hover"),t.searchMenu=new Garnish.Menu(s,{attachToElement:t.$addTagInput,onOptionSelect:t.selectTag.bind(t)}),t.addListener(s,"mousedown",(function(){t._ignoreBlur=!0})),t.searchMenu.show()})).catch((function(e){e.response,t.searchMenu&&t.killSearchMenu(),t.$spinner.addClass("hidden")}))}else this.$spinner.addClass("hidden")},selectTag:function(t){var e=this,i=$(t);if(!i.hasClass("disabled")){var s=i.data("id"),a=i.text(),n=$("<div/>",{class:"element small removable","data-id":s,"data-site-id":this.settings.targetSiteId,"data-label":a,"data-editable":"1"}).appendTo(this.$elementsContainer),r=$("<input/>",{type:"hidden",name:this.settings.name+"[]",value:s}).appendTo(n);$("<button/>",{class:"delete icon",title:Craft.t("app","Remove"),type:"button","aria-label":Craft.t("app","Remove {label}",{label:a})}).appendTo(n);var o=$("<div/>",{class:"label"}).appendTo(n);$("<span/>",{class:"title",text:a}).appendTo(o);var l=-(n.outerWidth()+10);this.$addTagInput.css("margin-"+Craft.left,l+"px");var h={};if(h["margin-"+Craft.left]=0,this.$addTagInput.velocity(h,"fast"),this.$elements=this.$elements.add(n),this.addElements(n),this.killSearchMenu(),this.$addTagInput.val(""),this.$addTagInput.trigger("focus"),!s){n.addClass("loading disabled");var d={groupId:this.settings.tagGroupId,title:a};Craft.sendActionRequest("POST","tags/create-tag",{data:d}).then((function(t){n.attr("data-id",t.data.id),r.val(t.data.id),n.removeClass("loading disabled")})).catch((function(t){t.response,e.removeElement(n),Craft.cp.displayError(Craft.t("app","A server error occurred."))}))}}},killSearchMenu:function(){this.searchMenu.hide(),this.searchMenu.destroy(),this.searchMenu=null}},{defaults:{tagGroupId:null}})},3958:function(){Craft.ThumbsElementIndexView=Craft.BaseElementIndexView.extend({getElementContainer:function(){return this.$container.children("ul")}})},1592:function(){Craft.ui={createButton:function(t){var e=$("<button/>",{type:t.type||"button",class:"btn"});return t.id&&e.attr("id",t.id),t.class&&e.addClass(t.class),t.ariaLabel&&e.attr("aria-label",t.ariaLabel),t.role&&e.attr("role",t.role),t.html?e.html(t.html):t.label?e.append($('<div class="label"/>').text(t.label)):e.addClass("btn-empty"),t.toggle&&e.attr("aria-expanded","false"),t.controls&&e.attr("aria-controls",t.controls),t.spinner&&e.append($('<div class="spinner spinner-absolute"/>')),e},createSubmitButton:function(t){var e=this.createButton(Object.assign({},t,{type:"submit",label:t.label||Craft.t("app","Submit")}));return e.addClass("submit"),e},createTextInput:function(t){t=$.extend({autocomplete:!1},t);var e=$("<input/>",{attr:{class:"text",type:t.type||"text",inputmode:t.inputmode,id:t.id,size:t.size,name:t.name,value:t.value,maxlength:t.maxlength,autofocus:this.getAutofocusValue(t.autofocus),autocomplete:"boolean"==typeof t.autocomplete?t.autocomplete?"on":"off":t.autocomplete,disabled:this.getDisabledValue(t.disabled),readonly:t.readonly,title:t.title,placeholder:t.placeholder,step:t.step,min:t.min,max:t.max}});return t.class&&e.addClass(t.class),t.placeholder&&e.addClass("nicetext"),"password"===t.type&&e.addClass("password"),t.disabled&&e.addClass("disabled"),t.size||e.addClass("fullwidth"),t.showCharsLeft&&t.maxlength&&e.attr("data-show-chars-left").css("padding-"+("ltr"===Craft.orientation?"right":"left"),7.2*t.maxlength.toString().length+14+"px"),(t.placeholder||t.showCharsLeft)&&new Garnish.NiceText(e),"password"===t.type?$('<div class="passwordwrapper"/>').append(e):e},createTextField:function(t){return t.id||(t.id="text"+Math.floor(1e9*Math.random())),this.createField(this.createTextInput(t),t)},createCopyTextInput:function(t){var e=t.id||"copytext"+Math.floor(1e9*Math.random()),i=t.buttonId||"".concat(e,"-btn"),s=$("<div/>",{class:"copytext"}),a=this.createTextInput($.extend({},t,{readonly:!0})).appendTo(s);return $("<button/>",{type:"button",id:i,class:"btn","data-icon":"clipboard",title:Craft.t("app","Copy to clipboard"),"aria-label":Craft.t("app","Copy to clipboard")}).appendTo(s).on("click",(function(){a[0].select(),document.execCommand("copy"),Craft.cp.displayNotice(Craft.t("app","Copied to clipboard.")),s.trigger("copy"),a[0].setSelectionRange(0,0)})),s},createCopyTextBtn:function(t){var e=t.id||"copytext"+Math.floor(1e9*Math.random()),i=t.value,s=$("<div/>",{id:e,class:"copytextbtn",role:"button",title:Craft.t("app","Copy to clipboard"),"aria-label":Craft.t("app","Copy to clipboard"),tabindex:"0"});t.class&&s.addClass(t.class);var a=$("<input/>",{value:i,readonly:!0,size:i.length,tabindex:"-1"}).appendTo(s),n=($("<span/>",{"data-icon":"clipboard","aria-hidden":"true"}).appendTo(s),function(){a[0].select(),document.execCommand("copy"),Craft.cp.displayNotice(Craft.t("app","Copied to clipboard.")),s.trigger("copy"),a[0].setSelectionRange(0,0),s.focus()});return s.on("click",(function(){n()})),s.on("keydown",(function(t){t.keyCode===Garnish.SPACE_KEY&&(n(),t.preventDefault())})),s},createCopyTextField:function(t){return t.id||(t.id="copytext"+Math.floor(1e9*Math.random())),this.createField(this.createCopyTextInput(t),t)},createCopyTextPrompt:function(t){var e=$("<div/>",{class:"modal fitted"}),i=$("<div/>",{class:"body"}).appendTo(e);this.createCopyTextField($.extend({size:Math.max(Math.min(t.value.length,50),25)},t)).appendTo(i);var s=i.find("label");s.length>0&&s.attr("id")&&e.attr("aria-labelledby",s.attr("id"));var a=new Garnish.Modal(e,{closeOtherModals:!1});return e.on("copy",(function(){a.hide()})),e},createTextarea:function(t){var e=$("<textarea/>",{class:"text",rows:t.rows||2,cols:t.cols||50,id:t.id,name:t.name,maxlength:t.maxlength,autofocus:t.autofocus&&!Garnish.isMobileBrowser(!0),disabled:!!t.disabled,placeholder:t.placeholder,html:t.value});return t.showCharsLeft&&e.attr("data-show-chars-left",""),t.class&&e.addClass(t.class),t.size||e.addClass("fullwidth"),e},createTextareaField:function(t){return t.id||(t.id="textarea"+Math.floor(1e9*Math.random())),this.createField(this.createTextarea(t),t)},createSelect:function(t){var e=$("<div/>",{class:"select"});t.class&&e.addClass(t.class);var i=$("<select/>",{id:t.id,name:t.name,autofocus:t.autofocus&&Garnish.isMobileBrowser(!0),disabled:t.disabled,"data-target-prefix":t.targetPrefix,"aria-labelledby":t.labelledBy}).appendTo(e);if($.isPlainObject(t.options)){var s=[];for(var a in t.options)if(t.options.hasOwnProperty(a)){var n=t.options[a];$.isPlainObject(n)?void 0!==n.optgroup?s.push(n):s.push({label:n.label,value:void 0!==n.value?n.value:a,disabled:void 0!==n.disabled&&n.disabled}):s.push({label:n,value:a})}t.options=s}for(var r=null,o=0;o<t.options.length;o++){var l=t.options[o];void 0!==l.optgroup?r=$("<optgroup/>",{label:l.label}).appendTo(i):$("<option/>",{value:l.value,selected:l.value==t.value,disabled:void 0!==l.disabled&&l.disabled,html:l.label}).appendTo(r||i)}return t.toggle&&(i.addClass("fieldtoggle"),new Craft.FieldToggle(i)),e},createSelectField:function(t){return t.id||(t.id="select"+Math.floor(1e9*Math.random())),this.createField(this.createSelect(t),t)},createCheckbox:function(t){var e=t.id||"checkbox"+Math.floor(1e9*Math.random()),i=$("<input/>",{type:"checkbox",value:void 0!==t.value?t.value:"1",id:e,class:"checkbox",name:t.name,checked:t.checked?"checked":null,autofocus:this.getAutofocusValue(t.autofocus),disabled:this.getDisabledValue(t.disabled),"data-target":t.toggle,"data-reverse-target":t.reverseToggle});t.class&&i.addClass(t.class),(t.toggle||t.reverseToggle)&&(i.addClass("fieldtoggle"),new Craft.FieldToggle(i));var s=$("<label/>",{for:e,html:t.label});return t.name&&(t.name.length<3||"[]"!==t.name.slice(-2))?$([$("<input/>",{type:"hidden",name:t.name,value:""})[0],i[0],s[0]]):$([i[0],s[0]])},createCheckboxField:function(t){t.id||(t.id="checkbox"+Math.floor(1e9*Math.random()));var e=$('<div class="field checkboxfield"/>',{id:"".concat(t.id,"-field")});return t.first&&e.addClass("first"),t.instructions&&e.addClass("has-instructions"),this.createCheckbox(t).appendTo(e),t.instructions&&$('<div class="instructions"/>').text(t.instructions).appendTo(e),e},createCheckboxSelect:function(t){var e,i,s=$('<fieldset class="checkbox-select"/>');t.class&&s.addClass(t.class),t.showAllOption?(e=t.allValue||"*",i=t.values==e,$("<div/>").appendTo(s).append(this.createCheckbox({id:t.id,class:"all",label:"<b>"+(t.allLabel||Craft.t("app","All"))+"</b>",name:t.name,value:e,checked:i,autofocus:t.autofocus}))):i=!1;for(var a=0;a<t.options.length;a++){var n=t.options[a];n.value!=e&&$("<div/>").appendTo(s).append(this.createCheckbox({label:n.label,name:t.name?t.name+"[]":null,value:n.value,checked:i||(t.values||[]).includes(n.value),disabled:i}))}return new Garnish.CheckboxSelect(s),s},createCheckboxSelectField:function(t){return t.fieldset=!0,t.id||(t.id="checkboxselect"+Math.floor(1e9*Math.random())),this.createField(this.createCheckboxSelect(t),t)},createLightswitch:function(t){var e=t.value||"1",i=t.indeterminateValue||"-",s=$("<button/>",{type:"button",class:"lightswitch","data-value":e,"data-indeterminate-value":i,id:t.id,role:"switch","aria-checked":t.on?"true":t.indeterminate?"mixed":"false","aria-labelledby":t.labelId,"data-target":t.toggle,"data-reverse-target":t.reverseToggle});return t.on?s.addClass("on"):t.indeterminate&&s.addClass("indeterminate"),t.small&&s.addClass("small"),t.disabled&&s.addClass("disabled"),$('<div class="lightswitch-container"><div class="handle"></div></div>').appendTo(s),t.name&&$("<input/>",{type:"hidden",name:t.name,value:t.on?e:t.indeterminate?i:"",disabled:t.disabled}).appendTo(s),(t.toggle||t.reverseToggle)&&(s.addClass("fieldtoggle"),new Craft.FieldToggle(s)),new Craft.LightSwitch(s,{onChange:t.onChange||$.noop}),s},createLightswitchField:function(t){return t.id||(t.id="lightswitch"+Math.floor(1e9*Math.random())),t.labelId||(t.labelId="".concat(t.id,"-label")),this.createField(this.createLightswitch(t),t).addClass("lightswitch-field")},createColorInput:function(t){var e=t.id||"color"+Math.floor(1e9*Math.random()),i=t.containerId||e+"-container",s=t.name||null,a=t.value||null,n=t.small||!1,r=t.autofocus&&Garnish.isMobileBrowser(!0),o=t.disabled||!1,l=$("<div/>",{id:i,class:"flex color-container"}),h=$("<div/>",{class:"color static"+(n?" small":"")}).appendTo(l),d=($("<div/>",{class:"color-preview",style:t.value?{backgroundColor:t.value}:null}).appendTo(h),$("<div/>",{class:"color-input-container"}).append($("<div/>",{class:"color-hex-indicator light code","aria-hidden":"true",text:"#"})).appendTo(l));return this.createTextInput({id:e,name:s,value:Craft.ltrim(a,"#"),size:10,class:"color-input",autofocus:r,disabled:o,"aria-label":Craft.t("app","Color hex value")}).appendTo(d),new Craft.ColorInput(l),l},createColorField:function(t){return t.fieldset=!0,o,t.id||(t.id="color"+Math.floor(1e9*Math.random())),this.createField(this.createColorInput(t),t)},createDateInput:function(t){var e=Garnish.isMobileBrowser(),i=(t.id||"date"+Math.floor(1e9*Math.random()))+"-date",s=t.name||null,a=s?s+"[date]":null,n=t.value&&"function"==typeof t.value.getMonth?t.value:null,r=t.autofocus&&Garnish.isMobileBrowser(!0),o=t.disabled||!1,l=$("<div/>",{class:"datewrapper"}),h=this.createTextInput({id:i,type:e?"date":"text",class:!(!e||n)&&"empty-value",name:a,value:n?e?n.toISOString().split("T")[0]:Craft.formatDate(n):"",placeholder:" ",autocomplete:!1,autofocus:r,disabled:o}).appendTo(l);return $('<div data-icon="date"></div>').appendTo(l),s&&$("<input/>",{type:"hidden",name:s+"[timezone]",val:Craft.timezone}).appendTo(l),e?h.datetimeinput():h.datepicker($.extend({defaultDate:n||new Date},Craft.datepickerOptions)),t.hasOuterContainer?l:$('<div class="datetimewrapper"/>').append(l).datetime()},createDateField:function(t){return t.id||(t.id="date"+Math.floor(1e9*Math.random())),this.createField(this.createDateInput(t),t)},createDateRangePicker:function(t){var e=new Date,i=new Date(e.getFullYear(),e.getMonth(),e.getDate());t=$.extend({class:"",options:["today","thisWeek","thisMonth","thisYear","past7Days","past30Days","past90Days","pastYear"],onChange:$.noop,selected:null,startDate:null,endDate:null},t);var s,a,n=$("<div/>",{class:"menu"}),r=$("<ul/>",{class:"padded"}).appendTo(n),o=$("<a/>").addClass("sel").text(Craft.t("app","All")).data("handle","all");$("<li/>").append(o).appendTo(r);for(var l=0;l<t.options.length;l++){var h=t.options[l];switch(h){case"today":s={label:Craft.t("app","Today"),startDate:i,endDate:i};break;case"thisWeek":var d=e.getDay()-Craft.datepickerOptions.firstDay;d<0&&(d+=7),s={label:Craft.t("app","This week"),startDate:new Date(e.getFullYear(),e.getMonth(),e.getDate()-d),endDate:i};break;case"thisMonth":s={label:Craft.t("app","This month"),startDate:new Date(e.getFullYear(),e.getMonth()),endDate:i};break;case"thisYear":s={label:Craft.t("app","This year"),startDate:new Date(e.getFullYear(),0),endDate:i};break;case"past7Days":s={label:Craft.t("app","Past {num} days",{num:7}),startDate:new Date(e.getFullYear(),e.getMonth(),e.getDate()-7),endDate:i};break;case"past30Days":s={label:Craft.t("app","Past {num} days",{num:30}),startDate:new Date(e.getFullYear(),e.getMonth(),e.getDate()-30),endDate:i};break;case"past90Days":s={label:Craft.t("app","Past {num} days",{num:90}),startDate:new Date(e.getFullYear(),e.getMonth(),e.getDate()-90),endDate:i};break;case"pastYear":s={label:Craft.t("app","Past year"),startDate:new Date(e.getFullYear(),e.getMonth(),e.getDate()-365),endDate:i}}var c=$("<li/>"),u=$("<a/>",{text:s.label}).data("handle",h).data("startDate",s.startDate).data("endDate",s.endDate).data("startTime",s.startDate?s.startDate.getTime():null).data("endTime",s.endDate?s.endDate.getTime():null);t.selected&&h==t.selected&&(a=u[0]),c.append(u),c.appendTo(r)}$("<hr/>").appendTo(n);var p=$("<div/>",{class:"flex flex-nowrap padded"}).appendTo(n),f=this.createDateField({label:Craft.t("app","From")}).appendTo(p).find("input"),g=this.createDateField({label:Craft.t("app","To")}).appendTo(p).find("input"),m=f.add(g);m.on("keyup",(function(t){t.keyCode===Garnish.ESC_KEY&&$(this).data("datepicker")&&$(this).data("datepicker").dpDiv.is(":visible")&&t.stopPropagation()})),f.data("datepicker")&&f.data("datepicker").dpDiv.on("mousedown",(function(t){t.stopPropagation()})),g.data("datepicker")&&g.data("datepicker").dpDiv.on("mousedown",(function(t){t.stopPropagation()}));var v=new Garnish.Menu(n,{onOptionSelect:function(e){var i=$(e);C.text(i.text()),v.setPositionRelativeToAnchor(),n.find(".sel").removeClass("sel"),i.addClass("sel"),f.datepicker("setDate",i.data("startDate")),g.datepicker("setDate",i.data("endDate")),t.onChange(i.data("startDate")||null,i.data("endDate")||null,i.data("handle"))}});m.on("change",(function(){for(var e,i=f.datepicker("getDate"),s=g.datepicker("getDate"),a=i?i.getTime():null,o=s?s.getTime():null,l=r.find("a"),h=!1,d=0;d<l.length;d++)if(a===((e=l.eq(d)).data("startTime")||null)&&o===(e.data("endTime")||null)){v.selectOption(e[0]),h=!0,t.onChange(null,null,e.data("handle"));break}h||(n.find(".sel").removeClass("sel"),p.addClass("sel"),a||o?a&&o?C.text(f.val()+" - "+g.val()):a?C.text(Craft.t("app","From {date}",{date:f.val()})):C.text(Craft.t("app","To {date}",{date:g.val()})):C.text(Craft.t("app","All")),v.setPositionRelativeToAnchor(),t.onChange(i,s,"custom"))})),v.on("hide",(function(){f.datepicker("hide"),g.datepicker("hide")}));var b="btn menubtn";t.class&&(b=b+" "+t.class);var C=$("<button/>",{type:"button",class:b,"data-icon":"date",text:Craft.t("app","All")});return new Garnish.MenuBtn(C,v),a&&v.selectOption(a),t.startDate&&f.datepicker("setDate",t.startDate),t.endDate&&g.datepicker("setDate",t.endDate),(t.startDate||t.endDate)&&m.trigger("change"),C},createTimeInput:function(t){var e=Garnish.isMobileBrowser(),i=(t.id||"time"+Math.floor(1e9*Math.random()))+"-time",s=t.name||null,a=s?s+"[time]":null,n=t.value&&"function"==typeof t.value.getMonth?t.value:null,r=t.autofocus&&Garnish.isMobileBrowser(!0),o=t.disabled||!1,l=$("<div/>",{class:"timewrapper"}),h=this.createTextInput({id:i,type:e?"time":"text",class:!(!e||n)&&"empty-value",name:a,placeholder:" ",autocomplete:!1,autofocus:r,disabled:o}).appendTo(l);return $('<div data-icon="time"></div>').appendTo(l),s&&$("<input/>",{type:"hidden",name:s+"[timezone]",val:Craft.timezone}).appendTo(l),e?(n&&h.val(n.toISOString().split("T")[1]),h.datetimeinput()):(h.timepicker(Craft.timepickerOptions),n&&h.timepicker("setTime",3600*n.getHours()+60*n.getMinutes()+n.getSeconds())),t.hasOuterContainer?l:$('<div class="datetimewrapper"/>').append(l).datetime()},createTimeField:function(t){return t.id||(t.id="time"+Math.floor(1e9*Math.random())),this.createField(this.createTimeInput(t),t)},createField:function(t,e){var i=e.label&&"__blank__"!==e.label?e.label:null,s=$(e.fieldset?"<fieldset/>":"<div/>",{class:"field",id:e.fieldId||(e.id?e.id+"-field":null)});if(e.first&&s.addClass("first"),e.fieldClass&&s.addClass(e.fieldClass),i&&e.fieldset&&$("<legend/>",{text:i,class:"visually-hidden","data-label":i}).appendTo(s),i){var a=$('<div class="heading"/>').appendTo(s);$(e.fieldset?"<legend/>":"<label/>",{id:e.labelId||(e.id?"".concat(e.id,"-").concat(e.fieldset?"legend":"label"):null),class:e.required?"required":null,for:!e.fieldset&&e.id||null,text:i}).appendTo(a)}if(e.instructions&&$('<div class="instructions"/>').text(e.instructions).appendTo(s),$('<div class="input"/>').append(t).appendTo(s),e.tip){var n=$('<p class="notice has-icon"/>');$('<span class="icon" aria-hidden="true"/>').appendTo(n),$('<span class="visually-hidden"/>').text(Craft.t("app","Tip")+": ").appendTo(n),$("<span/>").text(e.tip).appendTo(n),n.appendTo(s)}if(e.warning){var r=$('<p class="warning has-icon"/>');$('<span class="icon" aria-hidden="true"/>').appendTo(r),$('<span class="visually-hidden"/>').text(Craft.t("app","Warning")+": ").appendTo(r),$("<span/>").text(e.warning).appendTo(r),r.appendTo(s)}return e.errors&&this.addErrorsToField(s,e.errors),s},createErrorList:function(t){var e=$('<ul class="errors"/>');return t&&this.addErrorsToList(e,t),e},addErrorsToList:function(t,e){for(var i=0;i<e.length;i++)$("<li/>").text(e[i]).appendTo(t)},addErrorsToField:function(t,e){if(e){t.addClass("has-errors"),t.children(".input").addClass("errors");var i=t.children("ul.errors");i.length||(i=this.createErrorList().appendTo(t)),this.addErrorsToList(i,e)}},clearErrorsFromField:function(t){t.removeClass("has-errors"),t.children(".input").removeClass("errors"),t.children("ul.errors").remove()},getAutofocusValue:function(t){return t&&!Garnish.isMobileBrowser(!0)?"autofocus":null},getDisabledValue:function(t){return t?"disabled":null}}},1752:function(){Craft.Uploader=Garnish.Base.extend({uploader:null,allowedKinds:null,$element:null,settings:null,_rejectedFiles:{},_extensionList:null,_totalFileCounter:0,_validFileCounter:0,init:function(t,e){this._rejectedFiles={size:[],type:[],limit:[]},this.$element=t,this.allowedKinds=null,this._extensionList=null,this._totalFileCounter=0,this._validFileCounter=0;var i=(e=$.extend({},Craft.Uploader.defaults,e)).events;for(var s in delete e.events,e.allowedKinds&&e.allowedKinds.length&&("string"==typeof e.allowedKinds&&(e.allowedKinds=[e.allowedKinds]),this.allowedKinds=e.allowedKinds,delete e.allowedKinds),e.autoUpload=!1,this.uploader=this.$element.fileupload(e),i)i.hasOwnProperty(s)&&this.uploader.on(s,i[s]);this.settings=e,this.uploader.on("fileuploadadd",this.onFileAdd.bind(this))},setParams:function(t){void 0!==Craft.csrfTokenName&&void 0!==Craft.csrfTokenValue&&(t[Craft.csrfTokenName]=Craft.csrfTokenValue),this.uploader.fileupload("option",{formData:t})},getInProgress:function(){return this.uploader.fileupload("active")},isLastUpload:function(){return this.getInProgress()<2},onFileAdd:function(t,e){var i=this;t.stopPropagation();var s=!1;return this.allowedKinds&&(this._extensionList||this._createExtensionList(),s=!0),e.process().done((function(){var t=e.files[0],a=!0;if(s){var n=t.name.match(/\.([a-z0-4_]+)$/i)[1];-1===$.inArray(n.toLowerCase(),i._extensionList)&&(a=!1,i._rejectedFiles.type.push("“"+t.name+"”"))}t.size>i.settings.maxFileSize&&(i._rejectedFiles.size.push("“"+t.name+"”"),a=!1),a&&"function"==typeof i.settings.canAddMoreFiles&&!i.settings.canAddMoreFiles(i._validFileCounter)&&(i._rejectedFiles.limit.push("“"+t.name+"”"),a=!1),a&&(i._validFileCounter++,e.submit()),++i._totalFileCounter===e.originalFiles.length&&(i._totalFileCounter=0,i._validFileCounter=0,i.processErrorMessages())})),!0},processErrorMessages:function(){var t;this._rejectedFiles.type.length&&(t=1===this._rejectedFiles.type.length?"The file {files} could not be uploaded. The allowed file kinds are: {kinds}.":"The files {files} could not be uploaded. The allowed file kinds are: {kinds}.",t=Craft.t("app",t,{files:this._rejectedFiles.type.join(", "),kinds:this.allowedKinds.join(", ")}),this._rejectedFiles.type=[],alert(t)),this._rejectedFiles.size.length&&(t=1===this._rejectedFiles.size.length?"The file {files} could not be uploaded, because it exceeds the maximum upload size of {size}.":"The files {files} could not be uploaded, because they exceeded the maximum upload size of {size}.",t=Craft.t("app",t,{files:this._rejectedFiles.size.join(", "),size:this.humanFileSize(Craft.maxUploadSize)}),this._rejectedFiles.size=[],alert(t)),this._rejectedFiles.limit.length&&(t=1===this._rejectedFiles.limit.length?"The file {files} could not be uploaded, because the field limit has been reached.":"The files {files} could not be uploaded, because the field limit has been reached.",t=Craft.t("app",t,{files:this._rejectedFiles.limit.join(", ")}),this._rejectedFiles.limit=[],alert(t))},humanFileSize:function(t){var e=1024;if(t<e)return t+" B";var i=-1;do{t/=e,++i}while(t>=e);return t.toFixed(1)+" "+["kB","MB","GB","TB","PB","EB","ZB","YB"][i]},_createExtensionList:function(){this._extensionList=[];for(var t=0;t<this.allowedKinds.length;t++){var e=this.allowedKinds[t];if(void 0!==Craft.fileKinds[e])for(var i=0;i<Craft.fileKinds[e].extensions.length;i++){var s=Craft.fileKinds[e].extensions[i];this._extensionList.push(s)}}},destroy:function(){this.$element.fileupload("destroy"),this.base()}},{defaults:{dropZone:null,pasteZone:null,fileInput:null,sequentialUploads:!0,maxFileSize:Craft.maxUploadSize,allowedKinds:null,events:{},canAddMoreFiles:null,headers:{Accept:"application/json;q=0.9,*/*;q=0.8"},paramName:"assets-upload"}})},7e3:function(){Craft.UriFormatGenerator=Craft.BaseInputGenerator.extend({generateTargetValue:function(t){t=(t=t.replace("/<(.*?)>/g","")).toLowerCase(),t=(t=(t=Craft.asciiString(t)).replace(/^[^a-z]+/,"")).replace(/[^a-z0-9]+$/,"");var e=Craft.filterArray(t.split(/[^a-z0-9]+/)).join(Craft.slugWordSeparator);return e&&this.settings.suffix&&(e+=this.settings.suffix),e}})},8654:function(){Craft.UserIndex=Craft.BaseElementIndex.extend({init:function(t,e,i){this.on("selectSource",this.updateUrl.bind(this)),this.base(t,e,i)},getDefaultSourceKey:function(){if("index"===this.settings.context&&"undefined"!=typeof defaultSourceSlug)for(var t=0;t<this.$sources.length;t++){var e=$(this.$sources[t]);if(e.data("slug")===defaultSourceSlug)return e.data("key")}return this.base()},updateUrl:function(){if("index"===this.settings.context){var t="users",e=this.$source.data("slug");e&&(t+="/".concat(e)),Craft.setPath(t)}}}),Craft.registerElementIndexClass("craft\\elements\\User",Craft.UserIndex)},5537:function(){},9383:function(){},6558:function(t,e,i){var s=i(5537);s.__esModule&&(s=s.default),"string"==typeof s&&(s=[[t.id,s,""]]),s.locals&&(t.exports=s.locals),(0,i(9673).Z)("3790022a",s,!0,{})},2179:function(t,e,i){var s=i(9383);s.__esModule&&(s=s.default),"string"==typeof s&&(s=[[t.id,s,""]]),s.locals&&(t.exports=s.locals),(0,i(9673).Z)("80058a3c",s,!0,{})},9673:function(t,e,i){"use strict";function s(t,e){for(var i=[],s={},a=0;a<e.length;a++){var n=e[a],r=n[0],o={id:t+":"+a,css:n[1],media:n[2],sourceMap:n[3]};s[r]?s[r].parts.push(o):i.push(s[r]={id:r,parts:[o]})}return i}i.d(e,{Z:function(){return f}});var a="undefined"!=typeof document;if("undefined"!=typeof DEBUG&&DEBUG&&!a)throw new Error("vue-style-loader cannot be used in a non-browser environment. Use { target: 'node' } in your Webpack config to indicate a server-rendering environment.");var n={},r=a&&(document.head||document.getElementsByTagName("head")[0]),o=null,l=0,h=!1,d=function(){},c=null,u="data-vue-ssr-id",p="undefined"!=typeof navigator&&/msie [6-9]\b/.test(navigator.userAgent.toLowerCase());function f(t,e,i,a){h=i,c=a||{};var r=s(t,e);return g(r),function(e){for(var i=[],a=0;a<r.length;a++){var o=r[a];(l=n[o.id]).refs--,i.push(l)}for(e?g(r=s(t,e)):r=[],a=0;a<i.length;a++){var l;if(0===(l=i[a]).refs){for(var h=0;h<l.parts.length;h++)l.parts[h]();delete n[l.id]}}}}function g(t){for(var e=0;e<t.length;e++){var i=t[e],s=n[i.id];if(s){s.refs++;for(var a=0;a<s.parts.length;a++)s.parts[a](i.parts[a]);for(;a<i.parts.length;a++)s.parts.push(v(i.parts[a]));s.parts.length>i.parts.length&&(s.parts.length=i.parts.length)}else{var r=[];for(a=0;a<i.parts.length;a++)r.push(v(i.parts[a]));n[i.id]={id:i.id,refs:1,parts:r}}}}function m(){var t=document.createElement("style");return t.type="text/css",r.appendChild(t),t}function v(t){var e,i,s=document.querySelector("style["+u+'~="'+t.id+'"]');if(s){if(h)return d;s.parentNode.removeChild(s)}if(p){var a=l++;s=o||(o=m()),e=C.bind(null,s,a,!1),i=C.bind(null,s,a,!0)}else s=m(),e=_.bind(null,s),i=function(){s.parentNode.removeChild(s)};return e(t),function(s){if(s){if(s.css===t.css&&s.media===t.media&&s.sourceMap===t.sourceMap)return;e(t=s)}else i()}}var b,$=(b=[],function(t,e){return b[t]=e,b.filter(Boolean).join("\n")});function C(t,e,i,s){var a=i?"":s.css;if(t.styleSheet)t.styleSheet.cssText=$(e,a);else{var n=document.createTextNode(a),r=t.childNodes;r[e]&&t.removeChild(r[e]),r.length?t.insertBefore(n,r[e]):t.appendChild(n)}}function _(t,e){var i=e.css,s=e.media,a=e.sourceMap;if(s&&t.setAttribute("media",s),c.ssrId&&t.setAttribute(u,e.id),a&&(i+="\n/*# sourceURL="+a.sources[0]+" */",i+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(a))))+" */"),t.styleSheet)t.styleSheet.cssText=i;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(i))}}}},__webpack_module_cache__={};function __webpack_require__(t){var e=__webpack_module_cache__[t];if(void 0!==e)return e.exports;var i=__webpack_module_cache__[t]={id:t,exports:{}};return __webpack_modules__[t](i,i.exports,__webpack_require__),i.exports}__webpack_require__.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return __webpack_require__.d(e,{a:e}),e},__webpack_require__.d=function(t,e){for(var i in e)__webpack_require__.o(e,i)&&!__webpack_require__.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})},__webpack_require__.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)};var __webpack_exports__={};!function(){"use strict";__webpack_require__(2179),__webpack_require__(6558),__webpack_require__(587),__webpack_require__(8960),__webpack_require__(5774),__webpack_require__(8495),__webpack_require__(5970),__webpack_require__(4993),__webpack_require__(8843),__webpack_require__(5759),__webpack_require__(8167),__webpack_require__(4211),__webpack_require__(7745),__webpack_require__(463),__webpack_require__(3839),__webpack_require__(7452),__webpack_require__(6872),__webpack_require__(2495),__webpack_require__(5077),__webpack_require__(4606),__webpack_require__(9222);var t=jQuery,e=__webpack_require__.n(t);function i(t){return i="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},i(t)}function s(t,e){if(t){if("string"==typeof t)return a(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?a(t,e):void 0}}function a(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.CP=Garnish.Base.extend({authManager:null,$nav:null,$navToggle:null,$globalSidebar:null,$globalContainer:null,$mainContainer:null,$alerts:null,$crumbs:null,$breadcrumbList:null,$breadcrumbItems:null,$notificationContainer:null,$main:null,$primaryForm:null,$headerContainer:null,$header:null,$mainContent:null,$details:null,$sidebarContainer:null,$sidebarToggle:null,$sidebar:null,$contentContainer:null,$edition:null,$confirmUnloadForms:null,$deltaForms:null,$collapsibleTables:null,isMobile:null,fixedHeader:!1,breadcrumbListWidth:0,breadcrumbDisclosureItem:'<li class="breadcrumb-toggle-wrapper" data-disclosure-item><button data-disclosure-trigger aria-controls="breadcrumb-disclosure" aria-haspopup="true">'.concat(Craft.t("app","More…"),'</button><div id="breadcrumb-disclosure" class="menu menu--disclosure" data-disclosure-menu><ul></ul></div></li>'),tabManager:null,enableQueue:!0,totalJobs:0,jobInfo:null,displayedJobInfo:null,displayedJobInfoUnchanged:1,trackJobProgressTimeout:null,jobProgressIcon:null,checkingForUpdates:!1,forcingRefreshOnUpdatesCheck:!1,includingDetailsOnUpdatesCheck:!1,checkForUpdatesCallbacks:null,resizeTimeout:null,init:function(){var t=this;0!==Craft.remainingSessionTime&&(this.authManager=new Craft.AuthManager),this.$nav=e()("#nav"),this.$navToggle=e()("#primary-nav-toggle"),this.$globalSidebar=e()("#global-sidebar"),this.$globalContainer=e()("#global-container"),this.$mainContainer=e()("#main-container"),this.$alerts=e()("#alerts"),this.$crumbs=e()("#crumbs"),this.$breadcrumbList=e()(".breadcrumb-list"),this.$breadcrumbItems=e()(".breadcrumb-list li"),this.$notificationContainer=e()("#notifications"),this.$main=e()("#main"),this.$primaryForm=e()("#main-form"),this.$headerContainer=e()("#header-container"),this.$header=e()("#header"),this.$mainContent=e()("#main-content"),this.$details=e()("#details"),this.$sidebarContainer=e()("#sidebar-container"),this.$sidebarToggle=e()("#sidebar-toggle"),this.$sidebar=e()("#sidebar"),this.$contentContainer=e()("#content-container"),this.$collapsibleTables=e()("table.collapsible"),this.isMobile=Garnish.isMobileBrowser(),this.updateContentHeading();for(var i=this.$details.find(".meta > .field > .instructions"),a=0;a<i.length;a++){var n=i.eq(a),r=n.siblings(".heading").children("label");e()("<span/>",{class:"info",html:n.children().html()}).appendTo(r),n.remove()}if(!this.isMobile&&this.$header.length&&(this.addListener(Garnish.$win,"scroll","updateFixedHeader"),this.updateFixedHeader()),Garnish.$doc.ready((function(){t.addListener(Garnish.$win,"resize",(function(e){if(e.target===window){t.handleWindowResize(),clearTimeout(t.resizeTimeout);var i=t;t.resizeTimeout=setTimeout((function(){i.setSidebarNavAttributes()}),100)}})),t.handleWindowResize(),t.setSidebarNavAttributes(),Garnish.requestAnimationFrame(t.initSpecialForms.bind(t))})),this.$alerts.length&&this.initAlerts(),this.addListener(this.$navToggle,"click","toggleNav"),this.addListener(this.$sidebarToggle,"click","toggleSidebar"),this.$primaryForm.length||(this.$primaryForm=e()("form[data-saveshortcut]:first")),this.$primaryForm.length&&Garnish.hasAttr(this.$primaryForm,"data-saveshortcut")&&function(){var e=[],i=t.$primaryForm.data("actions");if(void 0===i)e.push([{keyCode:Garnish.S_KEY,ctrl:!0},{redirect:t.$primaryForm.data("saveshortcut-redirect"),retainScroll:Garnish.hasAttr(t.$primaryForm,"saveshortcut-scroll")}]);else for(var s=0;s<i.length;s++){var a=i[s];a.shortcut&&e.push([{keyCode:Garnish.S_KEY,ctrl:!0,shift:!!a.shift},{action:a.action,redirect:a.redirect,confirm:a.confirm,params:a.params,data:a.data,retainScroll:a.retainScroll}])}for(var n=function(i){Garnish.uiLayerManager.registerShortcut(e[i][0],(function(){t.submitPrimaryForm(e[i][1])}))},r=0;r<e.length;r++)n(r)}(),this.initTabs(),this.tabManager&&window.LOCATION_HASH){var o=this.tabManager.$tabs.filter('[href="#'.concat(window.LOCATION_HASH,'"]'));o.length&&this.tabManager.selectTab(o)}var l=Craft.getLocalStorage("scrollY");if(void 0!==l&&(Craft.removeLocalStorage("scrollY"),Garnish.$doc.ready((function(){Garnish.requestAnimationFrame((function(){window.scrollTo(0,l)}))}))),e().isTouchCapable()&&(this.$mainContainer.on("focus","input, textarea, .focusable-input",this._handleInputFocus.bind(this)),this.$mainContainer.on("blur","input, textarea, .focusable-input",this._handleInputBlur.bind(this))),Craft.announcements.length){var h,d,c=e()("#announcements-btn").removeClass("hidden"),u=Craft.announcements.some((function(t){return t.unread}));u&&(h=e()("<span/>",{class:"visually-hidden",html:Craft.t("app","Unread messages")}),c.addClass("unread").append(h)),this.addListener(c,"click",(function(){if(d)d.show();else{var t="";Craft.announcements.forEach((function(e){t+='<div class="announcement '.concat(e.unread?"unread":"",'" role="listitem">')+'<div class="announcement__header">'+'<h3 class="announcement__heading h2">'.concat(e.heading,"</h3>")+'<div class="announcement-label-container">'+'<div class="announcement-icon" aria-hidden="true">'.concat(e.icon,"</div>")+'<div class="announcement-label">'.concat(e.label,"</div>")+"</div></div>"+"<p>".concat(e.body,"</p>")+"</div>"})),d=new Garnish.HUD(c,'<h2 class="visually-hidden">'.concat(Craft.t("app","Announcements"),'</h2><div id="announcements" role="list">').concat(t,"</div>"),{onShow:function(){c.addClass("active")},onHide:function(){c.removeClass("active")}}),e()("a",d.$main).each((function(){this.hostname.length&&this.hostname!==location.hostname&&void 0===e()(this).attr("target")&&e()(this).attr("rel","noopener").attr("target","_blank")})),u&&(c.removeClass("unread"),h.remove(),Craft.sendActionRequest("POST","users/mark-announcements-as-read",{data:{ids:Craft.announcements.map((function(t){return t.id}))}}))}}))}var p=document.getElementById("footer");p&&new IntersectionObserver((function(t){var e=function(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(t,e)||s(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(t,1)[0];e.target.classList.toggle("stuck",e.intersectionRatio<1)}),{rootMargin:"0px 0px -1px 0px",threshold:[1]}).observe(p)},get $contentHeader(){var t=e()("#content-header");return t.length?t:e()("<header/>",{id:"content-header",class:"pane-header"}).prependTo(e()("#content"))},get $noticeContainer(){var t=e()("#content-notice");return t.length?t:e()('<div id="content-notice"/>').attr("role","status").prependTo(this.$contentHeader)},initSpecialForms:function(){var t=this;if(this.$confirmUnloadForms=e()("form[data-confirm-unload]"),this.$deltaForms=e()("form[data-delta]"),this.$confirmUnloadForms.length){for(var i=this.$confirmUnloadForms.add(this.$deltaForms),s=function(e){var s=i.eq(e),a=void 0;s.data("initialSerializedValue")||(a="function"==typeof s.data("serializer")?s.data("serializer")():s.serialize(),s.data("initialSerializedValue",a)),t.addListener(s,"submit",(function(t){if(Garnish.hasAttr(s,"data-confirm-unload")&&this.removeListener(Garnish.$win,"beforeunload"),Garnish.hasAttr(s,"data-delta")){var e;t.preventDefault(),e="function"==typeof s.data("serializer")?s.data("serializer")():s.serialize();var i=Craft.findDeltaData(s.data("initialSerializedValue"),e,s.data("delta-names"),null,s.data("initial-delta-values"),s.data("modified-delta-names"));Craft.createForm(i).appendTo(Garnish.$bod).submit()}}))},a=0;a<i.length;a++)s(a);this.addListener(Garnish.$win,"beforeunload",(function(t){var e=!1;if(void 0!==Craft.livePreview&&Craft.livePreview.inPreviewMode)e=!0;else for(var i=0;i<this.$confirmUnloadForms.length;i++){var s,a=this.$confirmUnloadForms.eq(i);if(s="function"==typeof a.data("serializer")?a.data("serializer")():a.serialize(),a.data("initialSerializedValue")!==s){e=!0;break}}if(e){var n=Craft.t("app","Any changes will be lost if you leave this page.");return t?t.originalEvent.returnValue=n:window.event.returnValue=n,n}}))}},_handleInputFocus:function(){this.updateFixedHeader()},_handleInputBlur:function(){this.updateFixedHeader()},submitPrimaryForm:function(t){this.trigger("beforeSaveShortcut"),"object"===i(t)&&e().isPlainObject(t)||(t={}),t.redirect||(t.redirect=this.$primaryForm.data("saveshortcut-redirect")),t.data||(t.data={}),t.data.saveShortcut=!0,Craft.submitForm(this.$primaryForm,t)},updateSidebarMenuLabel:function(){this.updateContentHeading()},updateContentHeading:function(){var t=this.$sidebar.find("a.sel:first"),i=t.children(".label");e()("#content-heading").text(i.length?i.text():t.text()),Garnish.$bod.removeClass("showing-sidebar")},toggleNav:function(){var t=this.navIsExpanded();null!==t&&(t?(this.disableGlobalSidebarLinks(),this.$navToggle.focus(),this.$navToggle.attr("aria-expanded","false"),Garnish.$bod.removeClass("showing-nav")):(this.enableGlobalSidebarLinks(),this.$globalSidebar.find(":focusable")[0].focus(),this.$navToggle.attr("aria-expanded","true"),Garnish.$bod.addClass("showing-nav")))},enableGlobalSidebarLinks:function(){var t=this.$globalSidebar.find(":focusable");e()(t).each((function(){e()(this).attr("tabindex","0")}))},disableGlobalSidebarLinks:function(){var t=this.$globalSidebar.find(":focusable");e()(t).each((function(){e()(this).attr("tabindex","-1")}))},setSidebarNavAttributes:function(){var t=this.navIsExpanded();null!==t&&(t?this.enableGlobalSidebarLinks():this.disableGlobalSidebarLinks())},navIsExpanded:function(){if(!this.$globalSidebar[0])return null;var t=getComputedStyle(this.$globalSidebar[0]).getPropertyValue("--is-always-visible").trim();return"true"===this.$navToggle.attr("aria-expanded")||"true"===t},toggleSidebar:function(){var t="true"===this.$sidebarToggle.attr("aria-expanded")?"false":"true";this.$sidebarToggle.attr("aria-expanded",t),Garnish.$bod.toggleClass("showing-sidebar")},initTabs:function(){this.tabManager&&(this.tabManager.destroy(),this.tabManager=null);var t=e()("#tabs");t.length&&(this.tabManager=new Craft.Tabs(t),this.tabManager.on("selectTab",(function(t){var i=t.$tab.attr("href");if(i&&"#"===i.charAt(0)&&e()(i).removeClass("hidden"),Garnish.$win.trigger("resize"),Garnish.$doc.trigger("scroll"),i&&"#"===i.charAt(0)){var s=e()("#context-btn").menubtn().data("menubtn");if(s)for(var a=0;a<s.menu.$options.length;a++){var n=s.menu.$options[a];n.href&&(n.href=n.href.match(/^[^#]*/)[0]+i)}}"undefined"!=typeof history&&Garnish.requestAnimationFrame((function(){history.replaceState(void 0,void 0,i)}))})),this.tabManager.on("deselectTab",(function(t){var i=t.$tab.attr("href");i&&"#"===i.charAt(0)&&e()(t.$tab.attr("href")).addClass("hidden")})))},updateTabs:function(t){if(t){var i=e()(t).attr("id","tabs");this.tabManager?this.tabManager.$container.replaceWith(i):i.appendTo(this.$contentHeader),this.initTabs()}else this.tabManager&&(this.tabManager.$container.siblings().length?this.tabManager.$container.remove():this.tabManager.$container.parent().remove(),this.tabManager.destroy(),this.tabManager=null)},get $tabsContainer(){return this.tabManager?this.tabManager.$container:void 0},get $tabsList(){return this.tabManager?this.tabManager.$tablist:void 0},get $tabs(){return this.tabManager?this.tabManager.$tablist.find("> a"):void 0},get $selectedTab(){return this.tabManager?this.tabManager.$selectedTab:void 0},get selectedTabIndex(){return this.tabManager?this.tabManager.$tabs.index(this.tabManager.$selectedTab):void 0},get $focusableTab(){return this.tabManager?this.tabManager.$focusableTab:void 0},selectTab:function(t){this.tabManager&&this.tabManager.selectTab(t)},deselectTab:function(){this.tabManager&&this.tabManager.deselectTab()},handleWindowResize:function(){this.updateResponsiveTables(),this.handleBreadcrumbVisibility()},breadcrumbItemsWrap:function(){if(this.$breadcrumbItems[0]){this.$breadcrumbList.css("ltr"===Craft.orientation?"margin-right":"margin-left","");for(var t=this.$breadcrumbList[0].getBoundingClientRect().width,e=0,i=this.$breadcrumbList.find("li"),s=0;s<i.length;s++)e+=i.get(s).getBoundingClientRect().width;return this.breadcrumbListWidth=t,!(e<=t||e<t+1&&(this.$breadcrumbList.css("ltr"===Craft.orientation?"margin-right":"margin-left","-1px"),1))}},handleBreadcrumbVisibility:function(){if(this.breadcrumbItemsWrap()){0===this.$breadcrumbList.find("[data-disclosure-item]").length&&this.$breadcrumbList.append(this.breadcrumbDisclosureItem);var t,e=this.$breadcrumbList.find("[data-disclosure-item]")[0].offsetWidth,i=this.breadcrumbListWidth;this.$breadcrumbItems.each((function(s){if(!(e+this.offsetWidth<i))return!1;t=s,e+=this.offsetWidth}));var s=this.$breadcrumbItems.slice(0,t+1),a=this.$breadcrumbItems.slice(t+1);this.$breadcrumbList.html(""),this.$breadcrumbList.append(s),this.$breadcrumbList.append(this.breadcrumbDisclosureItem),this.$breadcrumbList.find("[data-disclosure-menu] ul").append(a),this.$breadcrumbList.find("[data-disclosure-trigger]").disclosureMenu()}},updateResponsiveTables:function(){for(this.updateResponsiveTables._i=0;this.updateResponsiveTables._i<this.$collapsibleTables.length;this.updateResponsiveTables._i++)this.updateResponsiveTables._$table=this.$collapsibleTables.eq(this.updateResponsiveTables._i),this.updateResponsiveTables._containerWidth=this.updateResponsiveTables._$table.parent().width(),this.updateResponsiveTables._check=!1,this.updateResponsiveTables._containerWidth>0&&(void 0===this.updateResponsiveTables._$table.data("lastContainerWidth")?this.updateResponsiveTables._check=!0:(this.updateResponsiveTables._isCollapsed=this.updateResponsiveTables._$table.hasClass("collapsed"),this.updateResponsiveTables._containerWidth>this.updateResponsiveTables._$table.data("lastContainerWidth")?this.updateResponsiveTables._isCollapsed&&(this.updateResponsiveTables._$table.removeClass("collapsed"),this.updateResponsiveTables._check=!0):this.updateResponsiveTables._isCollapsed||(this.updateResponsiveTables._check=!0)),this.updateResponsiveTables._check&&this.updateResponsiveTables._$table.width()-30>this.updateResponsiveTables._containerWidth&&this.updateResponsiveTables._$table.addClass("collapsed"),this.updateResponsiveTables._$table.data("lastContainerWidth",this.updateResponsiveTables._containerWidth))},updateFixedHeader:function(){if(!this.isMobile)if(this.$main.length&&this.$headerContainer[0].getBoundingClientRect().top<0){if(!this.fixedHeader){var t=this.$headerContainer.height();this.$contentContainer.css("min-height","calc(100vh - "+(t+14+48-1)+"px)"),this.$headerContainer.height(t),Garnish.$bod.addClass("fixed-header"),this.$contentContainer.outerHeight(),this.$details.outerHeight();var e={top:t+"px","max-height":"calc(100vh - "+t+"px)"};this.$sidebar.addClass("fixed").css(e),this.$details.addClass("fixed").css(e),this.fixedHeader=!0}}else this.fixedHeader&&(this.$headerContainer.height("auto"),Garnish.$bod.removeClass("fixed-header"),this.$contentContainer.css("min-height",""),this.$sidebar.removeClass("fixed").css({top:"","max-height":""}),this.$details.removeClass("fixed").css({top:"","max-height":""}),this.fixedHeader=!1)},displayNotification:function(t,e,i){var s=new Craft.CP.Notification(t,e,i);return this.trigger("displayNotification",{notificationType:t,message:e,notification:s}),s},displayNotice:function(t,e){return this.displayNotification("notice",t,Object.assign({icon:"info",iconLabel:Craft.t("app","Notice")},e))},displaySuccess:function(t,e){return this.displayNotification("success",t,Object.assign({icon:"check",iconLabel:Craft.t("app","Success")},e))},displayError:function(t,e){return t&&"object"!==i(t)||(e=t,t=Craft.t("app","A server error occurred.")),this.displayNotification("error",t,Object.assign({icon:"alert",iconLabel:Craft.t("app","Error")},e))},fetchAlerts:function(){return Craft.queue.push((function(){return new Promise((function(t,e){var i={path:Craft.path};Craft.sendActionRequest("POST","app/get-cp-alerts",{data:i}).then((function(e){var i=e.data;t(i.alerts)})).catch(e)}))}))},displayAlerts:function(t){if(this.$alerts.remove(),Garnish.isArray(t)&&t.length){this.$alerts=e()('<ul id="alerts"/>').prependTo(e()("#page-container"));for(var i=0;i<t.length;i++)e()('<li><span data-icon="alert" aria-label="'.concat(Craft.t("app","Error"),'"></span> ').concat(t[i],"</li>")).appendTo(this.$alerts);var s=this.$alerts.outerHeight();this.$alerts.css("margin-top",-s).velocity({"margin-top":0},"fast"),this.initAlerts()}},initAlerts:function(){for(var t=this,i=this.$alerts.find('a[class^="shun:"]'),s=0;s<i.length;s++)this.addListener(i[s],"click",(function(i){i.preventDefault(),Craft.queue.push((function(){return new Promise((function(s,a){var n=e()(i.currentTarget),r={message:n.prop("className").substring(5)};Craft.sendActionRequest("POST","app/shun-cp-alert",{data:r}).then((function(){n.parent().remove(),s()})).catch((function(e){var i=e.response;t.displayError(i.data.message),a()}))}))}))}))},checkForUpdates:function(t,e,i){var s=this;if("function"==typeof e&&(i=e,e=!1),this.checkingForUpdates&&(!0===t&&!this.forcingRefreshOnUpdatesCheck||!0===e&&!this.includingDetailsOnUpdatesCheck)){var a=i;i=function(){s.checkForUpdates(t,e,a)}}"function"==typeof i&&(Garnish.isArray(this.checkForUpdatesCallbacks)||(this.checkForUpdatesCallbacks=[]),this.checkForUpdatesCallbacks.push(i)),this.checkingForUpdates||(this.checkingForUpdates=!0,this.forcingRefreshOnUpdatesCheck=!0===t,this.includingDetailsOnUpdatesCheck=!0===e,this._checkForUpdates(t,e).then((function(t){if(s.updateUtilitiesBadge(),s.checkingForUpdates=!1,Garnish.isArray(s.checkForUpdatesCallbacks)){var e=s.checkForUpdatesCallbacks;s.checkForUpdatesCallbacks=null;for(var i=0;i<e.length;i++)e[i](t)}s.trigger("checkForUpdates",{updateInfo:t})})))},_checkForUpdates:function(t,e){var i=this;return new Promise((function(s,a){t?i._getUpdates(e).then(s).catch(a):i._checkForCachedUpdates(e).then((function(t){t.cached?s(t):i._getUpdates(e).then((function(t){s(t)}))})).catch(a)}))},_checkForCachedUpdates:function(t){return new Promise((function(e,i){var s={onlyIfCached:!0,includeDetails:t};Craft.sendActionRequest("POST","app/check-for-updates",{data:s}).then((function(t){var i=t.data;e(i)})).catch((function(){e({cached:!1})}))}))},_getUpdates:function(t){var e=this;return new Promise((function(i,s){Craft.sendApiRequest("GET","updates").then((function(s){e._cacheUpdates(s,t).then((function(t){i(t)}))})).catch(s)}))},_cacheUpdates:function(t,e){return new Promise((function(i,s){var a={updates:t,includeDetails:e};Craft.sendActionRequest("POST","app/cache-updates",{data:a}).then((function(t){var e=t.data;i(e)})).catch(s)}))},updateUtilitiesBadge:function(){var t=e()("#nav-utilities").find("> a:not(.sel)");t.length&&Craft.queue.push((function(){return new Promise((function(i,s){Craft.sendActionRequest("POST","app/get-utilities-badge-count").then((function(s){var a=s.data,n=t.children(".badge"),r=t.children("[data-notification]");a.badgeCount?(n.length||(n=e()('<span class="badge" aria-hidden="true"/>').appendTo(t)),r.length||(r=e()('<span class="visually-hidden" data-notification/>').appendTo(t)),n.text(a.badgeCount),r.text(Craft.t("app","{num, number} {num, plural, =1{notification} other{notifications}}",{num:a.badgeCount}))):n.length&&r.length&&(n.remove(),r.remove()),i()})).catch(s)}))}))},runQueue:function(){var t=this;this.enableQueue&&(Craft.runQueueAutomatically?Craft.queue.push((function(){return new Promise((function(e,i){Craft.sendActionRequest("POST","queue/run").then((function(){t.trackJobProgress(!1,!0),e()})).catch(i)}))})):this.trackJobProgress(!1,!0))},trackJobProgress:function(t,e){if(e&&this.trackJobProgressTimeout&&(clearTimeout(this.trackJobProgressTimeout),this.trackJobProgressTimeout=null),!this.trackJobProgressTimeout&&this.enableQueue)if(!0===t){var i=Math.min(6e4,500*this.displayedJobInfoUnchanged);this.trackJobProgressTimeout=setTimeout(this._trackJobProgressInternal.bind(this),i)}else this._trackJobProgressInternal()},_trackJobProgressInternal:function(){var t=this;Craft.queue.push((function(){return new Promise((function(e,i){Craft.sendActionRequest("POST","queue/get-job-info?limit=50&dontExtendSession=1").then((function(i){var s=i.data;t.trackJobProgressTimeout=null,t.totalJobs=s.total,t.setJobInfo(s.jobs),t.jobInfo.length&&t.trackJobProgress(!0),e()})).catch(i)}))}))},setJobInfo:function(t){if(this.enableQueue){this.jobInfo=t;var e=this.displayedJobInfo;this.displayedJobInfo=this.getDisplayedJobInfo(),e&&this.displayedJobInfo&&e.id===this.displayedJobInfo.id&&e.progress===this.displayedJobInfo.progress&&e.progressLabel===this.displayedJobInfo.progressLabel&&e.status===this.displayedJobInfo.status?this.displayedJobInfoUnchanged++:this.displayedJobInfoUnchanged=1,this.updateJobIcon(),this.trigger("setJobInfo")}},getDisplayedJobInfo:function(){if(!this.enableQueue)return null;for(var t=[Craft.CP.JOB_STATUS_RESERVED,Craft.CP.JOB_STATUS_FAILED,Craft.CP.JOB_STATUS_WAITING],e=0;e<t.length;e++)for(var i=0;i<this.jobInfo.length;i++)if(this.jobInfo[i].status===t[e]&&(t[e]!==Craft.CP.JOB_STATUS_WAITING||!this.jobInfo[i].delay))return this.jobInfo[i];return null},updateJobIcon:function(){this.enableQueue&&this.$nav.length&&(this.displayedJobInfo?(this.jobProgressIcon||(this.jobProgressIcon=new n),this.displayedJobInfo.status===Craft.CP.JOB_STATUS_RESERVED||this.displayedJobInfo.status===Craft.CP.JOB_STATUS_WAITING?(this.jobProgressIcon.hideFailMode(),this.jobProgressIcon.setDescription(this.displayedJobInfo.description,this.displayedJobInfo.progressLabel),this.jobProgressIcon.setProgress(this.displayedJobInfo.progress)):this.displayedJobInfo.status===Craft.CP.JOB_STATUS_FAILED&&this.jobProgressIcon.showFailMode(Craft.t("app","Failed"))):this.jobProgressIcon&&(this.jobProgressIcon.hideFailMode(),this.jobProgressIcon.complete(),delete this.jobProgressIcon))},getSiteId:function(){var t=Craft.getLocalStorage("BaseElementIndex.siteId");if(void 0!==t){Craft.removeLocalStorage("BaseElementIndex.siteId");try{this.setSiteId(t)}catch(t){}}return Craft.siteId},setSiteId:function(t){var i=Craft.sites.find((function(e){return e.id===t}));if(!i)throw"Invalid site ID: ".concat(t);Craft.siteId=t,Craft.actionUrl=Craft.getUrl(Craft.actionUrl,{site:i.handle}),Craft.baseCpUrl=Craft.getUrl(Craft.baseCpUrl,{site:i.handle}),Craft.baseUrl=Craft.getUrl(Craft.baseUrl,{site:i.handle});var a=Craft.getUrl(document.location.href,{site:i.handle});history.replaceState({},"",a);var n,r=function(t,e){var i="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!i){if(Array.isArray(t)||(i=s(t))){i&&(t=i);var a=0,n=function(){};return{s:n,n:function(){return a>=t.length?{done:!0}:{done:!1,value:t[a++]}},e:function(t){throw t},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){i=i.call(t)},n:function(){var t=i.next();return o=t.done,t},e:function(t){l=!0,r=t},f:function(){try{o||null==i.return||i.return()}finally{if(l)throw r}}}}(document.body.classList);try{for(r.s();!(n=r.n()).done;){var o=n.value;o.match(/^site--/)&&document.body.classList.remove(o)}}catch(t){r.e(t)}finally{r.f()}document.body.classList.add("site--".concat(i.handle)),e()("a").each((function(){this.hostname.length&&this.hostname===location.hostname&&-1!==this.href.indexOf(Craft.cpTrigger)&&(this.href=Craft.getUrl(this.href,{site:i.handle}))}))}},{notificationDuration:5e3,JOB_STATUS_WAITING:1,JOB_STATUS_RESERVED:2,JOB_STATUS_DONE:3,JOB_STATUS_FAILED:4}),Craft.CP.Notification=Garnish.Base.extend({type:null,message:null,settings:null,closing:!1,closeTimeout:null,_preventDelayedClose:!1,$container:null,$closeBtn:null,originalActiveElement:null,init:function(t,i,s){var a=this;this.type=t,this.message=i,this.settings=s||{},this.$container=e()("<div/>",{class:"notification","data-type":this.type}).appendTo(Craft.cp.$notificationContainer);var n=e()('<div class="notification-body"/>').appendTo(this.$container).attr("role","status");if(this.settings.icon){var r=e()("<span/>",{class:"notification-icon","data-icon":this.settings.icon}).appendTo(n);this.settings.iconLabel?r.attr({"aria-label":this.settings.iconLabel,role:"img"}):r.attr("aria-hidden","true")}var o=e()('<div class="notification-main"/>').appendTo(n);e()("<div/>",{class:"notification-message",text:this.message}).appendTo(o);var l=e()("<div/>").appendTo(this.$container);this.$closeBtn=e()("<button/>",{type:"button",class:"notification-close-btn","aria-label":Craft.t("app","Close"),"data-icon":"remove"}).appendTo(l),this.settings.details&&e()('<div class="notification-details"/>').append(this.settings.details).appendTo(o).find("button,input").length&&(Garnish.uiLayerManager.addLayer(this.$container),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){a.close()})),this.originalActiveElement=document.activeElement,this.$container.attr("tabindex","-1").focus(),this.$container.on("keydown",(function(t){t.keyCode===Garnish.ESC_KEY&&(t.stopPropagation(),a.close())}))),this.$container.css({opacity:0,"margin-bottom":this._negMargin()}).velocity({opacity:1,"margin-bottom":0},{duration:"fast"}),Craft.initUiElements(this.$container),this.addListener(this.$closeBtn,"click","close"),Craft.notificationDuration&&this._initDelayedClose()},_initDelayedClose:function(){var t=this;this._preventDelayedClose||(Craft.isVisible()?(this.delayedClose(),this.$container.on("keypress keyup change focus blur click mousedown mouseup",(function(e){e.target!=t.$closeBtn[0]&&(t.$container.off("keypress keyup change focus blur click mousedown mouseup"),t.preventDelayedClose())}))):Garnish.$doc.one("visibilitychange",(function(){t._initDelayedClose()})))},_negMargin:function(){return"-".concat(this.$container.outerHeight()+12,"px")},close:function(){var t=this;this.closing||(this.closeTimeout&&(clearTimeout(this.closeTimeout),this.closeTimeout=null),this.closing=!0,this.originalActiveElement&&document.activeElement&&(document.activeElement===this.$container[0]||e().contains(this.$container[0],document.activeElement))&&e()(this.originalActiveElement).focus(),this.$container.velocity({opacity:0,"margin-bottom":this._negMargin()},{duration:"fast",complete:function(){t.$container.remove()}}))},delayedClose:function(){var t=this;this.closeTimeout=setTimeout((function(){t.close()}),Craft.notificationDuration),this.$container.one("mouseover",(function(){clearTimeout(t.closeTimeout),t.closeTimeout=null,t.$container.on("mouseout",(function(e){e.target==t.$container[0]&&(t.$container.off("mouseout"),t.delayedClose())}))}))},preventDelayedClose:function(){this._preventDelayedClose=!0,this.closeTimeout&&(clearTimeout(this.closeTimeout),this.closeTimeout=null),this.$container.off("mouseover mouseout")}}),Garnish.$scrollContainer=Garnish.$win,Craft.cp=new Craft.CP;var n=Garnish.Base.extend({$li:null,$a:null,$label:null,$progressLabel:null,progress:null,failMode:!1,_$bgCanvas:null,_$staticCanvas:null,_$hoverCanvas:null,_$failCanvas:null,_staticCtx:null,_hoverCtx:null,_canvasSize:null,_arcPos:null,_arcRadius:null,_lineWidth:null,_arcStartPos:0,_arcEndPos:0,_arcStartStepSize:null,_arcEndStepSize:null,_arcStep:null,_arcStepTimeout:null,_arcAnimateCallback:null,_progressBar:null,init:function(){this.$li=e()("<li/>").appendTo(Craft.cp.$nav.children("ul")),this.$a=e()("<a/>",{id:"job-icon",href:Craft.canAccessQueueManager?Craft.getUrl("utilities/queue-manager"):null}).appendTo(this.$li),this.$canvasContainer=e()('<span class="icon"/>').appendTo(this.$a);var t=e()('<span class="label"/>').appendTo(this.$a);this.$label=e()("<span/>").appendTo(t),this.$progressLabel=e()('<span class="progress-label"/>').appendTo(t).hide();var i=window.devicePixelRatio>1?2:1;this._canvasSize=18*i,this._arcPos=this._canvasSize/2,this._arcRadius=7*i,this._lineWidth=3*i,this._$bgCanvas=this._createCanvas("bg","#61666b"),this._$staticCanvas=this._createCanvas("static","#d7d9db"),this._$hoverCanvas=this._createCanvas("hover","#fff"),this._$failCanvas=this._createCanvas("fail","#da5a47").hide(),this._staticCtx=this._$staticCanvas[0].getContext("2d"),this._hoverCtx=this._$hoverCanvas[0].getContext("2d"),this._drawArc(this._$bgCanvas[0].getContext("2d"),0,1),this._drawArc(this._$failCanvas[0].getContext("2d"),0,1)},setDescription:function(t,e){this.$a.attr("title",t),this.$label.text(t),e?this.$progressLabel.text(e).show():this.$progressLabel.hide()},setProgress:function(t){0==t?(this._$staticCanvas.hide(),this._$hoverCanvas.hide()):(this._$staticCanvas.show(),this._$hoverCanvas.show(),this.progress&&t>this.progress?this._animateArc(0,t/100):this._setArc(0,t/100)),this.progress=t},complete:function(){var t=this;this._animateArc(0,1,(function(){t._$bgCanvas.velocity("fadeOut"),t._animateArc(1,1,(function(){t.$a.remove(),t.destroy()}))}))},showFailMode:function(t){this.failMode||(this.failMode=!0,this.progress=null,this._$bgCanvas.hide(),this._$staticCanvas.hide(),this._$hoverCanvas.hide(),this._$failCanvas.show(),this.setDescription(t))},hideFailMode:function(){this.failMode&&(this.failMode=!1,this._$bgCanvas.show(),this._$staticCanvas.show(),this._$hoverCanvas.show(),this._$failCanvas.hide())},_createCanvas:function(t,i){var s=e()('<canvas id="job-icon-'+t+'" width="'+this._canvasSize+'" height="'+this._canvasSize+'"/>').appendTo(this.$canvasContainer),a=s[0].getContext("2d");return a.strokeStyle=i,a.lineWidth=this._lineWidth,a.lineCap="round",s},_setArc:function(t,e){this._arcStartPos=t,this._arcEndPos=e,this._drawArc(this._staticCtx,t,e),this._drawArc(this._hoverCtx,t,e)},_drawArc:function(t,e,i){t.clearRect(0,0,this._canvasSize,this._canvasSize),t.beginPath(),t.arc(this._arcPos,this._arcPos,this._arcRadius,(1.5+2*e)*Math.PI,(1.5+2*i)*Math.PI),t.stroke(),t.closePath()},_animateArc:function(t,e,i){this._arcStepTimeout&&clearTimeout(this._arcStepTimeout),this._arcStep=0,this._arcStartStepSize=(t-this._arcStartPos)/10,this._arcEndStepSize=(e-this._arcEndPos)/10,this._arcAnimateCallback=i,this._takeNextArcStep()},_takeNextArcStep:function(){this._setArc(this._arcStartPos+this._arcStartStepSize,this._arcEndPos+this._arcEndStepSize),this._arcStep++,this._arcStep<10?this._arcStepTimeout=setTimeout(this._takeNextArcStep.bind(this),50):this._arcAnimateCallback&&this._arcAnimateCallback()}});__webpack_require__(3778),__webpack_require__(6617),__webpack_require__(9482),__webpack_require__(3352),__webpack_require__(691),__webpack_require__(1519),__webpack_require__(501),__webpack_require__(2318),__webpack_require__(4755),__webpack_require__(8468),__webpack_require__(5049),__webpack_require__(7998),__webpack_require__(8895),__webpack_require__(4233),__webpack_require__(9699),__webpack_require__(1402),__webpack_require__(8201),__webpack_require__(3347),__webpack_require__(9478),__webpack_require__(2387),__webpack_require__(7966),__webpack_require__(657),__webpack_require__(4487),__webpack_require__(6966),__webpack_require__(5080),__webpack_require__(7439),__webpack_require__(5328),__webpack_require__(6419),__webpack_require__(872),__webpack_require__(1396),__webpack_require__(4070),__webpack_require__(5763),__webpack_require__(5185),__webpack_require__(8030),__webpack_require__(3096),__webpack_require__(3331),__webpack_require__(53),__webpack_require__(5074),__webpack_require__(3958),__webpack_require__(1592),__webpack_require__(1752),__webpack_require__(7e3),__webpack_require__(8654)}()})(); +(function(){var __webpack_modules__={463:function(){Craft.Accordion=Garnish.Base.extend({$trigger:null,targetSelector:null,_$target:null,init:function(t){var e=this;this.$trigger=$(t),this.$trigger.data("accordion")&&(console.warn("Double-instantiating an accordion trigger on an element"),this.$trigger.data("accordion").destroy()),this.$trigger.data("accordion",this),this.targetSelector=this.$trigger.attr("aria-controls")?"#".concat(this.$trigger.attr("aria-controls")):null,this.targetSelector&&(this._$target=$(this.targetSelector)),this.addListener(this.$trigger,"click","onTriggerClick"),this.addListener(this.$trigger,"keypress",(function(t){var i=t.keyCode;i!==Garnish.SPACE_KEY&&i!==Garnish.RETURN_KEY||(t.preventDefault(),e.onTriggerClick())}))},onTriggerClick:function(){"true"===this.$trigger.attr("aria-expanded")?this.hideTarget(this._$target):this.showTarget(this._$target)},showTarget:function(t){var e=this;if(t&&t.length){this.showTarget._currentHeight=t.height(),t.removeClass("hidden"),this.$trigger.removeClass("collapsed").addClass("expanded").attr("aria-expanded","true");for(var i=0;i<t.length;i++)!function(t){"SPAN"!==t.prop("nodeName")&&(t.height("auto"),e.showTarget._targetHeight=t.height(),t.css({height:e.showTarget._currentHeight,overflow:"hidden"}),t.velocity("stop"),t.velocity({height:e.showTarget._targetHeight},Garnish.getUserPreferredAnimationDuration("fast"),(function(){t.css({height:"",overflow:""})})))}(t.eq(i));delete this.showTarget._targetHeight,delete this.showTarget._currentHeight,Garnish.$win.trigger("resize")}},hideTarget:function(t){if(t&&t.length){this.$trigger.removeClass("expanded").addClass("collapsed").attr("aria-expanded","false");for(var e=0;e<t.length;e++)!function(t){t.hasClass("hidden")||("SPAN"===t.prop("nodeName")?t.addClass("hidden"):(t.css("overflow","hidden"),t.velocity("stop"),t.velocity({height:0},Garnish.getUserPreferredAnimationDuration("fast"),(function(){t.addClass("hidden")}))))}(t.eq(e))}},destroy:function(){this.$trigger.removeData("accordion"),this.base()}})},3839:function(){Craft.AddressesInput=Garnish.Base.extend({$container:null,$addBtn:null,$addBtnItem:null,$cards:null,init:function(t,e){var i=this;this.$container=$(t),this.setSettings(e,Craft.AddressesInput.defaults),this.$container.data("addresses")&&(console.warn("Double-instantiating an address input on an element"),this.$container.data("addresses").destroy()),this.$container.data("addresses",this),this.$addBtn=this.$container.find(".address-cards__add-btn"),this.$addBtnItem=this.$addBtn.closest("li"),this.$cards=this.$container.find("> .address-card");for(var s=0;s<this.$cards.length;s++)this.initCard(this.$cards.eq(s));this.updateAddButton(),this.addListener(this.$addBtn,"click",(function(){i.createAddress()}))},initCard:function(t){var e=this;this.addListener(t,"click",(function(i){$(i.target).closest(".menubtn").length||e.editAddress(t)}));var i=t.find(".menubtn").disclosureMenu();if(i.length){var s=i.data("trigger"),a=s.$container,n=a.find('[data-action="edit"]');this.addListener(n,"click",(function(i){i.stopPropagation(),e.editAddress(t)}));var r=a.find('[data-action="delete"]');this.addListener(r,"click",(function(i){if(i.preventDefault(),i.stopPropagation(),confirm(Craft.t("app","Are you sure you want to delete this address?"))){e.$addBtn.addClass("loading");var n=t.data("id"),r=t.data("draft-id");Craft.sendActionRequest("POST","elements/delete",{data:{elementId:n,draftId:r}}).then((function(){t.remove(),a.remove(),s.destroy(),e.$cards=e.$cards.not(t),e.updateAddButton(),e.trigger("deleteAddress",{addressId:n,draftId:r})})).finally((function(){e.$addBtn.removeClass("loading")}))}}))}},editAddress:function(t,e){var i=this;Craft.createElementEditor("craft\\elements\\Address",t,e).on("submit",(function(e){i.trigger("saveAddress",{data:e.data}),Craft.sendActionRequest("POST","addresses/card-html",{data:{addressId:e.data.id}}).then((function(e){var s=$(e.data.html);t?(t.replaceWith(s),i.$cards=i.$cards.not(t)):s.insertBefore(i.$addBtnItem),Craft.initUiElements(s),i.initCard(s),i.$cards=i.$cards.add(s),i.updateAddButton()}))}))},updateAddButton:function(){this.canCreateAddress()?this.$addBtn.removeClass("hidden"):this.$addBtn.addClass("hidden")},canCreateAddress:function(){return!this.settings.maxAddresses||this.$cards.length<this.settings.maxAddresses},createAddress:function(){var t=this;if(!this.canCreateAddress())throw"No more addresses can be created.";this.$addBtn.addClass("loading"),Craft.sendActionRequest("POST","elements/create",{data:{elementType:"craft\\elements\\Address",ownerId:this.settings.ownerId}}).then((function(e){t.editAddress(null,{elementId:e.data.element.id,draftId:e.data.element.draftId})})).finally((function(){t.$addBtn.removeClass("loading")}))},destroy:function(){this.$container.removeData("addresses"),this.base()}},{ownerId:null,defaults:{maxAddresses:null}})},7452:function(){Craft.AdminTable=Garnish.Base.extend({settings:null,totalItems:null,sorter:null,$noItems:null,$table:null,$tbody:null,$deleteBtns:null,init:function(t){var e=this;this.setSettings(t,Craft.AdminTable.defaults),this.settings.allowDeleteAll||(this.settings.minItems=1),this.$noItems=$(this.settings.noItemsSelector),this.$table=$(this.settings.tableSelector),this.$tbody=this.$table.children("tbody"),this.totalItems=this.$tbody.children().length,this.settings.sortable&&(this.sorter=new Craft.DataTableSorter(this.$table,{onSortChange:this.reorderItems.bind(this)})),this.$deleteBtns=this.$table.find(".delete:not(.disabled)"),this.addListener(this.$deleteBtns,"click","handleDeleteBtnClick"),this.addListener(this.$deleteBtns,"keydown",(function(t){t.keyCode!==Garnish.SPACE_KEY&&t.keyCode!==Garnish.RETURN_KEY||(t.preventDefault(),e.handleDeleteBtnClick(t))})),this.updateUI()},addRow:function(t){if(!(this.settings.maxItems&&this.totalItems>=this.settings.maxItems)){var e=$(t).appendTo(this.$tbody),i=e.find(".delete");this.settings.sortable&&this.sorter.addItems(e),this.$deleteBtns=this.$deleteBtns.add(i),this.addListener(i,"click","handleDeleteBtnClick"),this.totalItems++,this.updateUI()}},reorderItems:function(){var t=this;if(this.settings.sortable){for(var e=[],i=0;i<this.sorter.$items.length;i++){var s=$(this.sorter.$items[i]).attr(this.settings.idAttribute);e.push(s)}var a={ids:JSON.stringify(e)};Craft.sendActionRequest("POST",this.settings.reorderAction,{data:a}).then((function(i){t.onReorderItems(e),Craft.cp.displaySuccess(Craft.t("app",t.settings.reorderSuccessMessage))})).catch((function(e){e.response,Craft.cp.displayError(Craft.t("app",t.settings.reorderFailMessage))}))}},handleDeleteBtnClick:function(t){if(!(this.settings.minItems&&this.totalItems<=this.settings.minItems)){var e=$(t.target).closest("tr");this.confirmDeleteItem(e)&&this.deleteItem(e)}},confirmDeleteItem:function(t){if(!this.settings.confirmDeleteMessage)return!0;var e=this.getItemName(t);return confirm(Craft.t("app",this.settings.confirmDeleteMessage,{name:e}))},deleteItem:function(t){var e=this,i={id:this.getItemId(t)};Craft.sendActionRequest("POST",this.settings.deleteAction,{data:i}).then((function(i){return e.handleDeleteItemSuccess(i.data,t)})).catch((function(i){var s=i.response;return e.handleDeleteItemFailure(s.data,t)}))},handleDeleteItemFailure:function(t,e){this.getItemId(e);var i=this.getItemName(e);Craft.cp.displayError(Craft.t("app",this.settings.deleteFailMessage,{name:i}))},handleDeleteItemSuccess:function(t,e){var i=this.getItemId(e),s=this.getItemName(e);this.sorter&&this.sorter.removeItems(e),e.remove(),this.totalItems--,this.updateUI(),this.onDeleteItem(i),this.settings.deleteSuccessMessage&&Craft.cp.displaySuccess(Craft.t("app",this.settings.deleteSuccessMessage,{name:s}))},onReorderItems:function(t){this.settings.onReorderItems(t)},onDeleteItem:function(t){this.settings.onDeleteItem(t)},getItemId:function(t){return t.attr(this.settings.idAttribute)},getItemName:function(t){return Craft.escapeHtml(t.attr(this.settings.nameAttribute))},updateUI:function(){if(0===this.totalItems?(this.$table.hide(),this.$noItems.removeClass("hidden")):(this.$table.show(),this.$noItems.addClass("hidden")),this.settings.sortable){var t=this.$table.find(".move");1===this.totalItems?t.addClass("disabled"):t.removeClass("disabled")}this.settings.minItems&&this.totalItems<=this.settings.minItems?this.$deleteBtns.addClass("disabled"):this.$deleteBtns.removeClass("disabled"),this.settings.newItemBtnSelector&&(this.settings.maxItems&&this.totalItems>=this.settings.maxItems?$(this.settings.newItemBtnSelector).addClass("hidden"):$(this.settings.newItemBtnSelector).removeClass("hidden"))}},{defaults:{tableSelector:null,noItemsSelector:null,newItemBtnSelector:null,idAttribute:"data-id",nameAttribute:"data-name",sortable:!1,allowDeleteAll:!0,minItems:0,maxItems:null,reorderAction:null,deleteAction:null,reorderSuccessMessage:Craft.t("app","New order saved."),reorderFailMessage:Craft.t("app","Couldn’t save new order."),confirmDeleteMessage:Craft.t("app","Are you sure you want to delete “{name}”?"),deleteSuccessMessage:Craft.t("app","“{name}” deleted."),deleteFailMessage:Craft.t("app","Couldn’t delete “{name}”."),onReorderItems:$.noop,onDeleteItem:$.noop}})},6872:function(){Craft.AssetImageEditor=Garnish.Modal.extend({$body:null,$footer:null,$imageTools:null,$buttons:null,$cancelBtn:null,$replaceBtn:null,$saveBtn:null,$focalPointBtn:null,$editorContainer:null,$straighten:null,$croppingCanvas:null,$spinner:null,$constraintContainer:null,$constraintRadioInputs:null,$customConstraints:null,canvas:null,image:null,viewport:null,focalPoint:null,grid:null,croppingCanvas:null,clipper:null,croppingRectangle:null,cropperHandles:null,cropperGrid:null,croppingShade:null,imageStraightenAngle:0,viewportRotation:0,originalWidth:0,originalHeight:0,imageVerticeCoords:null,zoomRatio:1,animationInProgress:!1,currentView:"",assetId:null,cacheBust:null,draggingCropper:!1,scalingCropper:!1,draggingFocal:!1,previousMouseX:0,previousMouseY:0,shiftKeyHeld:!1,editorHeight:0,editorWidth:0,cropperState:!1,scaleFactor:1,flipData:{},focalPointState:!1,maxImageSize:null,lastLoadedDimensions:null,imageIsLoading:!1,mouseMoveEvent:null,croppingConstraint:!1,constraintOrientation:"landscape",showingCustomConstraint:!1,saving:!1,renderImage:null,renderCropper:null,_queue:null,init:function(t,e){var i=this;this._queue=new Craft.Queue,this.cacheBust=Date.now(),this.setSettings(e,Craft.AssetImageEditor.defaults),null===this.settings.allowDegreeFractions&&(this.settings.allowDegreeFractions=Craft.isImagick),Garnish.prefersReducedMotion()&&(this.settings.animationDuration=1),this.assetId=t,this.flipData={x:0,y:0},this.$container=$('<form class="modal fitted imageeditor"></form>').appendTo(Garnish.$bod),this.$body=$('<div class="body"></div>').appendTo(this.$container),this.$footer=$('<div class="footer"/>').appendTo(this.$container),this.base(this.$container,this.settings),this.$buttons=$('<div class="buttons right"/>').appendTo(this.$footer),this.$cancelBtn=$("<button/>",{type:"button",class:"btn cancel",text:Craft.t("app","Cancel")}).appendTo(this.$buttons),this.settings.allowSavingAsNew&&(this.$saveBtn=Craft.ui.createButton({class:"save copy",label:Craft.t("app","Save as a new asset"),spinner:!0}).appendTo(this.$buttons),this.addListener(this.$saveBtn,"activate",this.saveImage)),this.$replaceBtn=Craft.ui.createSubmitButton({class:"save replace",label:Craft.t("app","Save"),spinner:!0}).appendTo(this.$buttons),this.addListener(this.$replaceBtn,"activate",this.saveImage),this.addListener(this.$cancelBtn,"activate",this.hide),this.removeListener(this.$shade,"click"),this.maxImageSize=this.getMaxImageSize(),Craft.sendActionRequest("POST","assets/image-editor",{data:{assetId:t}}).then((function(t){return i.loadEditor(t.data)}))},getMaxImageSize:function(){var t=Garnish.$doc.get(0).documentElement.clientWidth,e=Garnish.$doc.get(0).documentElement.clientHeight;return Math.max(e,t)*(window.devicePixelRatio>1?2:1)},loadEditor:function(t){var e=this;t.html||alert(Craft.t("app","Could not load the image editor.")),this.$body.html(t.html),this.$tabs=$(".tabs li",this.$body),this.$viewsContainer=$(".views",this.$body),this.$views=$("> div",this.$viewsContainer),this.$imageTools=$(".image-container .image-tools",this.$body),this.$editorContainer=$(".image-container .image",this.$body),this.$constraintContainer=$(".constraint-group",this.$body),this.$constraintRadioInputs=$('[name="constraint"]',this.$constraintContainer),this.$focalPointBtn=$(".focal-point",this.$body),this.editorHeight=this.$editorContainer.innerHeight(),this.editorWidth=this.$editorContainer.innerWidth(),this._showSpinner(),this.updateSizeAndPosition(),$customConstraintWrapper=this.$constraintRadioInputs.filter('[value="custom"]').parent(),this.$customConstraints=$("<div/>",{class:"constraint custom hidden","data-constraint":"custom"}).append($("<input/>",{type:"text",class:"custom-constraint-w",size:3,value:1,"aria-label":Craft.t("app","Width unit")})).append($("<span/>",{class:"custom-constraint-spacer",text:"x","aria-hidden":"true"})).append($("<input/>",{type:"text",class:"custom-constraint-h",size:3,value:1,"aria-label":Craft.t("app","Height unit")})).appendTo($customConstraintWrapper),this.$constraintRadioInputs.filter((function(){var t=$(this).val();return/^\d*\.\d+$/.test(t)})).addClass("flip"),this.canvas=new fabric.StaticCanvas("image-canvas"),this.$croppingCanvas=$("#cropping-canvas",this.$editorContainer),this.$croppingCanvas.width(this.editorWidth),this.$croppingCanvas.height(this.editorHeight),this.canvas.enableRetinaScaling=!0,this.renderImage=function(){Garnish.requestAnimationFrame(e.canvas.renderAll.bind(e.canvas))};var i=Craft.getActionUrl("assets/edit-image",{assetId:this.assetId,size:this.maxImageSize,cacheBust:this.cacheBust});fabric.Image.fromURL(i,(function(i){e.image=i,e.image.set({originX:"center",originY:"center",left:e.editorWidth/2,top:e.editorHeight/2}),e.canvas.add(e.image),e.originalHeight=e.image.getHeight(),e.originalWidth=e.image.getWidth(),e.zoomRatio=1,e.lastLoadedDimensions=e.getScaledImageDimensions(),e._setFittedImageVerticeCoordinates(),e._repositionEditorElements();var s={imageDimensions:e.getScaledImageDimensions(),offsetX:0,offsetY:0},a=!1;if(t.focalPoint){var n=t.focalPoint,r=s.imageDimensions.width*n.x,o=s.imageDimensions.height*n.y;s.offsetX=r-s.imageDimensions.width/2,s.offsetY=o-s.imageDimensions.height/2,a=!0}e.storeFocalPointState(s),a&&e._createFocalPoint(),e._createViewport(),e.storeCropperState(),e._addControlListeners(),e.addListener(e.$croppingCanvas,"mousemove,touchmove",e._handleMouseMove),e.addListener(e.$croppingCanvas,"mousedown,touchstart",e._handleMouseDown),e.addListener(e.$croppingCanvas,"mouseup,touchend",e._handleMouseUp),e.addListener(e.$croppingCanvas,"mouseout,touchcancel",e._handleMouseOut),e._hideSpinner(),e.renderImage(),e.$tabs.first().trigger("click")}))},_reloadImage:function(){var t=this;if(!this.imageIsLoading){this.imageIsLoading=!0,this.maxImageSize=this.getMaxImageSize();var e=Craft.getActionUrl("assets/edit-image",{assetId:this.assetId,size:this.maxImageSize,cacheBust:this.cacheBust});this.image.setSrc(e,(function(e){t.originalHeight=e.getHeight(),t.originalWidth=e.getWidth(),t.lastLoadedDimensions={width:t.originalHeight,height:t.originalWidth},t.updateSizeAndPosition(),t.renderImage(),t.imageIsLoading=!1}))}},updateSizeAndPosition:function(){if(this.$container){var t=window.innerWidth,e=window.innerHeight;this.$container.css({width:t,"min-width":t,left:0,height:e,"min-height":e,top:0}),this.$body.css({height:e-(this.$footer.outerHeight()-1)}),t<e?this.$container.addClass("vertical"):this.$container.removeClass("vertical"),this.$editorContainer&&this.image&&this._repositionEditorElements()}},_repositionEditorElements:function(){var t={width:this.editorWidth,height:this.editorHeight};this.editorHeight=this.$editorContainer.innerHeight(),this.editorWidth=this.$editorContainer.innerWidth(),this.canvas.setDimensions({width:this.editorWidth,height:this.editorHeight});var e=this.getScaledImageDimensions();if("crop"===this.currentView){this.zoomRatio=this.getZoomToFitRatio(this.getScaledImageDimensions());var i=this._getBoundingRectangle(this.imageVerticeCoords);this._setFittedImageVerticeCoordinates(),this._repositionCropper(i)}else this.zoomRatio=this.getZoomToCoverRatio(this.getScaledImageDimensions())*this.scaleFactor;this._repositionImage(t),this._repositionViewport(),this._repositionFocalPoint(t),this._zoomImage(),this.renderImage(),(e.width/this.lastLoadedDimensions.width>1.5||e.height/this.lastLoadedDimensions.height>1.5)&&this._reloadImage()},_repositionImage:function(t){this.image.set({left:this.image.left-(t.width-this.editorWidth)/2,top:this.image.top-(t.height-this.editorHeight)/2})},_createViewport:function(){this.viewport=new fabric.Rect({width:this.image.width,height:this.image.height,fill:"rgba(127,0,0,1)",originX:"center",originY:"center",globalCompositeOperation:"destination-in",left:this.image.left,top:this.image.top}),this.canvas.add(this.viewport),this.renderImage()},_createFocalPoint:function(){var t=this.focalPointState,e=this.getScaledImageDimensions().width/t.imageDimensions.width,i=t.offsetX*e*this.zoomRatio*this.scaleFactor,s=t.offsetY*e*this.zoomRatio*this.scaleFactor;i+=this.image.left,s+=this.image.top;var a=0,n=0;this.viewport&&0===t.offsetX&&0===t.offsetY&&("crop"!==this.currentView?(a=this.viewport.left-this.image.left,n=this.viewport.top-this.image.top):(a=this.clipper.left-this.image.left,n=this.clipper.top-this.image.top),i+=a,s+=n,t.offsetX+=a/(e*this.zoomRatio*this.scaleFactor),t.offsetY+=n/(e*this.zoomRatio*this.scaleFactor)),this.focalPoint=new fabric.Group([new fabric.Circle({radius:8,fill:"rgba(0,0,0,0.5)",strokeWidth:2,stroke:"rgba(255,255,255,0.8)",left:0,top:0,originX:"center",originY:"center"}),new fabric.Circle({radius:1,fill:"rgba(255,255,255,0)",strokeWidth:2,stroke:"rgba(255,255,255,0.8)",left:0,top:0,originX:"center",originY:"center"})],{originX:"center",originY:"center",left:i,top:s}),this.storeFocalPointState(t),this.canvas.add(this.focalPoint)},toggleFocalPoint:function(){this.focalPoint?(this.canvas.remove(this.focalPoint),this.focalPoint=null,this.$focalPointBtn.attr("aria-pressed","false")):(this._createFocalPoint(),this.$focalPointBtn.attr("aria-pressed","true")),this.renderImage()},_repositionViewport:function(){if(this.viewport){var t={left:this.editorWidth/2,top:this.editorHeight/2};if("crop"===this.currentView)t.width=this.editorWidth,t.height=this.editorHeight;else if(this.cropperState){var e=this.cropperState,i=this.getScaledImageDimensions().width/e.imageDimensions.width;t.width=e.width*i*this.zoomRatio,t.height=e.height*i*this.zoomRatio,this.image.set({left:this.editorWidth/2-e.offsetX*i,top:this.editorHeight/2-e.offsetY*i})}else $.extend(t,this.getScaledImageDimensions());this.viewport.set(t)}},_repositionFocalPoint:function(t){if(this.focalPoint){var e=this.focalPoint.left-this.editorWidth/2,i=this.focalPoint.top-this.editorHeight/2,s=this.image.width,a=this.getScaledImageDimensions().width*this.zoomRatio/s/this.scaleFactor;e-=(t.width-this.editorWidth)/2,i-=(t.height-this.editorHeight)/2,e*=a,i*=a,this.focalPoint.set({left:this.editorWidth/2+e,top:this.editorHeight/2+i})}},hasOrientationChanged:function(){return this.viewportRotation%180!=0},getScaledImageDimensions:function(){return void 0===this.getScaledImageDimensions._&&(this.getScaledImageDimensions._={}),this.getScaledImageDimensions._.imageRatio=this.originalHeight/this.originalWidth,this.getScaledImageDimensions._.editorRatio=this.editorHeight/this.editorWidth,this.getScaledImageDimensions._.dimensions={},this.getScaledImageDimensions._.imageRatio>this.getScaledImageDimensions._.editorRatio?(this.getScaledImageDimensions._.dimensions.height=Math.min(this.editorHeight,this.originalHeight),this.getScaledImageDimensions._.dimensions.width=Math.round(this.originalWidth/(this.originalHeight/this.getScaledImageDimensions._.dimensions.height))):(this.getScaledImageDimensions._.dimensions.width=Math.min(this.editorWidth,this.originalWidth),this.getScaledImageDimensions._.dimensions.height=Math.round(this.originalHeight*(this.getScaledImageDimensions._.dimensions.width/this.originalWidth))),this.getScaledImageDimensions._.dimensions},_zoomImage:function(){void 0===this._zoomImage._&&(this._zoomImage._={}),this._zoomImage._.imageDimensions=this.getScaledImageDimensions(),this.image.set({width:this._zoomImage._.imageDimensions.width*this.zoomRatio,height:this._zoomImage._.imageDimensions.height*this.zoomRatio})},_getPrevTab:function(){var t,e=this._getActiveTabIndex();if(!(e<0))return t=e>0?e-1:this.$tabs.length-1,this.$tabs.eq(t)},_getNextTab:function(){var t,e=this._getActiveTabIndex();if(!(e<0))return t=e<this.$tabs.length-1?e+1:0,this.$tabs.eq(t)},_getActiveTab:function(){return this.$tabs.filter('[aria-selected="true"]')},_getActiveTabIndex:function(){var t=this._getActiveTab();if(t.length)return t.index()},_addControlListeners:function(){var t=this;this.addListener(this.$tabs,"click",this._handleTabClick),this.addListener(this.$tabs,"keydown",(function(e){switch(e.keyCode){case Garnish.LEFT_KEY:case Garnish.UP_KEY:e.preventDefault();var i=t._getPrevTab();t.activateTab(i);break;case Garnish.RIGHT_KEY:case Garnish.DOWN_KEY:e.preventDefault();var s=t._getNextTab();t.activateTab(s)}})),this.addListener(this.$focalPointBtn,"click",this.toggleFocalPoint),this.addListener($(".rotate-left"),"click",(function(){this.rotateImage(-90)})),this.addListener($(".rotate-right"),"click",(function(){this.rotateImage(90)})),this.addListener($(".flip-vertical"),"click",(function(){this.flipImage("y")})),this.addListener($(".flip-horizontal"),"click",(function(){this.flipImage("x")})),this.straighteningInput=new Craft.SlideRuleInput("slide-rule",{onStart:function(){t._showGrid()},onChange:function(e){t.straighten(e)},onEnd:function(){t._hideGrid(),t._cleanupFocalPointAfterStraighten()}}),this.addListener(Garnish.$doc,"keydown",(function(t){t.keyCode===Garnish.SHIFT_KEY&&(this.shiftKeyHeld=!0)})),this.addListener(Garnish.$doc,"keyup",(function(t){t.keyCode===Garnish.SHIFT_KEY&&(this.shiftKeyHeld=!1)})),this.addListener(this.$constraintRadioInputs,"change",this._handleConstraintChange),this.addListener($(".orientation input",this.$container),"click",this._handleOrientationClick),this.addListener($(".constraint-group .custom input",this.$container),"keyup",this._applyCustomConstraint)},_handleConstraintClick:function(t){var e=$(t.currentTarget).data("constraint"),i=$(t.currentTarget);if(i.siblings().removeClass("active"),i.addClass("active"),"custom"==e)return this._showCustomConstraint(),void this._applyCustomConstraint();this._hideCustomConstraint(),this.setCroppingConstraint(e),this.enforceCroppingConstraint()},_handleConstraintChange:function(t){var e=$(t.target).val();if("custom"==e)return this._showCustomConstraint(),void this._applyCustomConstraint();this._hideCustomConstraint(),this.setCroppingConstraint(e),this.enforceCroppingConstraint()},_handleOrientationClick:function(t){if(t.currentTarget.value!==this.constraintOrientation){this.constraintOrientation=t.currentTarget.value;for(var e=$(".flip",this.$constraintContainer),i=0;i<e.length;i++){var s=$(e[i]),a='label[for="'+s.attr("id")+'"]',n=$(a,this.$constraintContainer);s.val(1/s.val()),n.html(n.text().split(":").reverse().join(":").replace(/\s/g,""))}e.filter(":checked").trigger("change")}},_applyCustomConstraint:function(){var t=this._getCustomConstraint();t.w>0&&t.h>0&&(this.setCroppingConstraint(t.w/t.h),this.enforceCroppingConstraint())},_getCustomConstraint:function(){var t=parseFloat($(".custom-constraint-w").val()),e=parseFloat($(".custom-constraint-h").val());return{w:isNaN(t)?0:t,h:isNaN(e)?0:e}},_setCustomConstraint:function(t,e){$(".custom-constraint-w").val(parseFloat(t)),$(".custom-constraint-h").val(parseFloat(e))},_hideCustomConstraint:function(){this.showingCustomConstraint=!1,this.$customConstraints.addClass("hidden"),$(".orientation",this.$container).removeClass("hidden")},_showCustomConstraint:function(){this.showingCustomConstraint||(this.showingCustomConstraint=!0,this.$customConstraints.removeClass("hidden"),$(".orientation",this.$container).addClass("hidden"))},_handleTabClick:function(t){if(!this.animationInProgress){var e=$(t.currentTarget);this.activateTab(e)}},activateTab:function(t){var e=$(t).data("view");this.$tabs.removeClass("selected").attr({"aria-selected":"false",tabindex:"-1"}),$(t).addClass("selected").attr({"aria-selected":"true",tabindex:"0"}).trigger("focus"),this.showView(e)},showView:function(t){var e=this;this.currentView!==t&&(this.$views.addClass("hidden"),this.$views.filter('[data-view="'+t+'"]').removeClass("hidden"),"rotate"===t?this.enableSlider():this.disableSlider(),this.updateSizeAndPosition(),"crop"===this.currentView&&"crop"!==t?this._queue.push((function(){return new Promise((function(t,i){e.disableCropMode(),t()}))})):"crop"!==this.currentView&&"crop"===t&&this._queue.push((function(){return new Promise((function(t,i){e.enableCropMode(),t()}))})),this.currentView=t)},storeCropperState:function(t){void 0===this.storeCropperState._&&(this.storeCropperState._={}),t?this.cropperState=t:this.clipper?(this.storeCropperState._.zoomFactor=1/this.zoomRatio,this.cropperState={offsetX:(this.clipper.left-this.image.left)*this.storeCropperState._.zoomFactor,offsetY:(this.clipper.top-this.image.top)*this.storeCropperState._.zoomFactor,height:this.clipper.height*this.storeCropperState._.zoomFactor,width:this.clipper.width*this.storeCropperState._.zoomFactor,imageDimensions:this.getScaledImageDimensions()}):(this.storeCropperState._.dimensions=this.getScaledImageDimensions(),this.cropperState={offsetX:0,offsetY:0,height:this.storeCropperState._.dimensions.height,width:this.storeCropperState._.dimensions.width,imageDimensions:this.storeCropperState._.dimensions})},storeFocalPointState:function(t){void 0===this.storeFocalPointState._&&(this.storeFocalPointState._={}),t?this.focalPointState=t:this.focalPoint&&(this.storeFocalPointState._.zoomFactor=1/this.zoomRatio,this.focalPointState={offsetX:(this.focalPoint.left-this.image.left)*this.storeFocalPointState._.zoomFactor/this.scaleFactor,offsetY:(this.focalPoint.top-this.image.top)*this.storeFocalPointState._.zoomFactor/this.scaleFactor,imageDimensions:this.getScaledImageDimensions()})},rotateImage:function(t){var e=this;if(!this.animationInProgress){if(90!==t&&-90!==t)return!1;this.animationInProgress=!0,this.viewportRotation+=t,this.viewportRotation=parseInt((this.viewportRotation+360)%360,10);var i,s=this.image.angle+t,a=this.getScaledImageDimensions();i=this.hasOrientationChanged()?this.getZoomToCoverRatio({height:a.width,width:a.height}):this.getZoomToCoverRatio(a),this.zoomRatio>i&&(i=this.zoomRatio);var n={angle:90===t?"+=90":"-=90"},r={angle:s,width:a.width*i,height:a.height*i},o=1;this.scaleFactor<1?(o=1/this.scaleFactor,this.scaleFactor=1):(this.viewport.width>this.editorHeight?o=this.editorHeight/this.viewport.width:this.viewport.height>this.editorWidth&&(o=this.editorWidth/this.viewport.height),this.scaleFactor=o),o<1&&(r.width*=o,r.height*=o);var l=this.cropperState,h=l.offsetX,d=l.offsetY,c=t*(Math.PI/180),u=h*Math.cos(c)-d*Math.sin(c),p=h*Math.sin(c)+d*Math.cos(c),f=a.width/l.imageDimensions.width,g=u*f*this.zoomRatio*this.scaleFactor,m=p*f*this.zoomRatio*this.scaleFactor;r.left=this.editorWidth/2-g,r.top=this.editorHeight/2-m,l.offsetX=u,l.offsetY=p;var v=l.width;l.width=l.height,l.height=v,this.storeCropperState(l),this.focalPoint&&this.canvas.remove(this.focalPoint),this.viewport.animate(n,{duration:this.settings.animationDuration,onComplete:function(){var t=e.viewport.height*o;e.viewport.height=e.viewport.width*o,e.viewport.width=t,e.viewport.set({angle:0})}}),this.image.animate(r,{onChange:this.canvas.renderAll.bind(this.canvas),duration:this.settings.animationDuration,onComplete:function(){var i=parseFloat((e.image.angle+360)%360);e.image.set({angle:i}),e.animationInProgress=!1,e.focalPoint?(e._adjustFocalPointByAngle(t),e.straighten(e.straighteningInput),e.canvas.add(e.focalPoint)):e._resetFocalPointPosition()}})}},flipImage:function(t){var e=this;if(!this.animationInProgress){this.animationInProgress=!0,this.hasOrientationChanged()&&(t="y"===t?"x":"y"),this.focalPoint?this.canvas.remove(this.focalPoint):this._resetFocalPointPosition();var i={x:this.editorWidth/2,y:this.editorHeight/2};this.straighteningInput.setValue(-this.imageStraightenAngle),this.imageStraightenAngle=-this.imageStraightenAngle;var s,a,n={angle:this.viewportRotation+this.imageStraightenAngle},r=this.cropperState,o=this.focalPointState;"y"===t&&this.hasOrientationChanged()||"y"!==t&&!this.hasOrientationChanged()?(r.offsetX=-r.offsetX,o.offsetX=-o.offsetX,a=this.image.left-i.x,n.left=i.x-a):(r.offsetY=-r.offsetY,o.offsetY=-o.offsetY,s=this.image.top-i.y,n.top=i.y-s),"y"===t?(n.scaleY=-1*this.image.scaleY,this.flipData.y=1-this.flipData.y):(n.scaleX=-1*this.image.scaleX,this.flipData.x=1-this.flipData.x),this.storeCropperState(r),this.storeFocalPointState(o),this.image.animate(n,{onChange:this.canvas.renderAll.bind(this.canvas),duration:this.settings.animationDuration,onComplete:function(){e.animationInProgress=!1,e.focalPoint&&(e._adjustFocalPointByAngle(0),e.canvas.add(e.focalPoint))}})}},straighten:function(t){if(!this.animationInProgress){this.animationInProgress=!0;var e=this.image.angle;this.imageStraightenAngle=(this.settings.allowDegreeFractions?parseFloat(t.value):Math.round(parseFloat(t.value)))%360,this.image.set({angle:this.viewportRotation+this.imageStraightenAngle}),this.zoomRatio=this.getZoomToCoverRatio(this.getScaledImageDimensions())*this.scaleFactor,this._zoomImage(),this.cropperState&&this._adjustEditorElementsOnStraighten(e),this.renderImage(),this.animationInProgress=!1}},_adjustEditorElementsOnStraighten:function(t){var e,i,s,a,n,r=this.getScaledImageDimensions(),o=this.image.angle-t,l=this.cropperState,h=this.zoomRatio,d=1;do{var c=l.offsetX,u=l.offsetY,p=o*(Math.PI/180);s=c*Math.cos(p)-u*Math.sin(p),a=c*Math.sin(p)+u*Math.cos(p),e=s*h*(n=r.width/l.imageDimensions.width),i=a*h*n;var f=this.getImageVerticeCoords(h),g={width:this.viewport.width,height:this.viewport.height,left:this.editorWidth/2-this.viewport.width/2+e,top:this.editorHeight/2-this.viewport.height/2+i};h*=d=this._getZoomRatioToFitRectangle(g,f)}while(1!==d);this.image.set({left:this.editorWidth/2-e,top:this.editorHeight/2-i}),l.offsetX=s,l.offsetY=a,l.width=this.viewport.width/h/n,l.height=this.viewport.height/h/n,this.storeCropperState(l),this.zoomRatio=h,this.focalPoint?(this._adjustFocalPointByAngle(o),this._isCenterInside(this.focalPoint,this.viewport)?this.focalPoint.set({opacity:1}):this.focalPoint.set({opacity:0})):0!==o&&this._resetFocalPointPosition(),this._zoomImage()},_cleanupFocalPointAfterStraighten:function(){if(this.focalPoint&&!this._isCenterInside(this.focalPoint,this.viewport)){this.focalPoint.set({opacity:1});var t=this.focalPointState;t.offsetX=0,t.offsetY=0,this.storeFocalPointState(t),this.toggleFocalPoint()}},_resetFocalPointPosition:function(){var t=this.focalPointState;t.offsetX=0,t.offsetY=0,this.storeFocalPointState(t)},_isCenterInside:function(t,e){return t.left>e.left-e.width/2&&t.top>e.top-e.height/2&&t.left<e.left+e.width/2&&t.top<e.top+e.height/2},_adjustFocalPointByAngle:function(t){var e=t*(Math.PI/180),i=this.focalPointState,s=i.offsetX,a=i.offsetY,n=s*Math.cos(e)-a*Math.sin(e),r=s*Math.sin(e)+a*Math.cos(e),o=this.getScaledImageDimensions().width/i.imageDimensions.width,l=n*o*this.zoomRatio,h=r*o*this.zoomRatio;this.focalPoint.left=this.image.left+l,this.focalPoint.top=this.image.top+h,i.offsetX=n,i.offsetY=r,this.storeFocalPointState(i)},_getZoomRatioToFitRectangle:function(t,e){for(var i,s,a=this._getRectangleVertices(t),n=0;n<a.length&&(i=a[n],this.arePointsInsideRectangle([i],e));n++)i=!1;if(i){var r=this._getEdgeCrossed(e,i),o={x:t.left+t.width/2,y:t.top+t.height/2},l=Math.abs((r[1].y-r[0].y)*i.x-(r[1].x-r[0].x)*i.y+r[1].x*r[0].y-r[1].y*r[0].x)/Math.sqrt(Math.pow(r[1].y-r[0].y,2)+Math.pow(r[1].x-r[0].x,2)),h=Math.abs((r[1].y-r[0].y)*o.x-(r[1].x-r[0].x)*o.y+r[1].x*r[0].y-r[1].y*r[0].x)/Math.sqrt(Math.pow(r[1].y-r[0].y,2)+Math.pow(r[1].x-r[0].x,2));s=(l+h)/h}else s=1;return s},saveImage:function(t){var e=this,i=$(t.currentTarget);if(this.saving)return!1;this.saving=!0,i.addClass("loading");var s=i.hasClass("replace"),a={assetId:this.assetId,viewportRotation:this.viewportRotation,imageRotation:this.imageStraightenAngle,replace:s?1:0};if(this.cropperState){var n={};n.height=this.cropperState.height,n.width=this.cropperState.width,n.offsetX=this.cropperState.offsetX,n.offsetY=this.cropperState.offsetY,a.imageDimensions=this.cropperState.imageDimensions,a.cropData=n}else a.imageDimensions=this.getScaledImageDimensions();this.focalPoint&&(a.focalPoint=this.focalPointState),a.flipData=this.flipData,a.zoom=this.zoomRatio,Craft.sendActionRequest("POST","assets/save-image",{data:a}).then((function(t){var i=t.data;e.onSave(i),s&&Craft.broadcaster&&Craft.broadcaster.postMessage({event:"saveElement",id:e.assetId}),e.hide(),Craft.cp.runQueue(),Craft.Preview.refresh()})).catch((function(t){var e=t.response;alert(e.data.message)})).finally((function(){e.$buttons.find(".btn").removeClass("loading"),e.saving=!1}))},getZoomToCoverRatio:function(t){var e=Math.abs(this.imageStraightenAngle)*(Math.PI/180),i=Math.sin(e)*t.height+Math.cos(e)*t.width,s=Math.sin(e)*t.width+Math.cos(e)*t.height;return Math.max(i/t.width,s/t.height)},getZoomToFitRatio:function(t){var e=this._getImageBoundingBox(t),i=1;if(e.height>this.editorHeight||e.width>this.editorWidth){var s=this.editorHeight/e.height,a=this.editorWidth/e.width;i=Math.min(a,s)}return i},getCombinedZoomRatio:function(t){return this.getZoomToCoverRatio(t)/this.getZoomToFitRatio(t)},_showGrid:function(){if(!this.grid){var t,e={strokeWidth:1,stroke:"rgba(255,255,255,0.5)"},i=this.viewport.width,s=this.viewport.height,a=i/9,n=s/9,r=[new fabric.Rect({strokeWidth:2,stroke:"rgba(255,255,255,1)",originX:"center",originY:"center",width:i,height:s,left:i/2,top:s/2,fill:"rgba(255,255,255,0)"})];for(t=1;t<=8;t++)r.push(new fabric.Line([t*a,0,t*a,s],e));for(t=1;t<=8;t++)r.push(new fabric.Line([0,t*n,i,t*n],e));this.grid=new fabric.Group(r,{left:this.editorWidth/2,top:this.editorHeight/2,originX:"center",originY:"center",angle:this.viewport.angle}),this.canvas.add(this.grid),this.renderImage()}},_hideGrid:function(){this.canvas.remove(this.grid),this.grid=null,this.renderImage()},onFadeOut:function(){this.destroy()},show:function(){this.base(),Garnish.$bod.addClass("no-scroll")},hide:function(){this.removeAllListeners(),this.straighteningInput.removeAllListeners(),Garnish.$bod.removeClass("no-scroll"),this.base()},onSave:function(t){this.settings.onSave(t),this.trigger("save")},enableSlider:function(){this.$imageTools.removeClass("hidden")},disableSlider:function(){this.$imageTools.addClass("hidden")},enableCropMode:function(){var t=this,e=this.getScaledImageDimensions();this.zoomRatio=this.getZoomToFitRatio(e);var i={width:this.editorWidth,height:this.editorHeight},s={width:e.width*this.zoomRatio,height:e.height*this.zoomRatio,left:this.editorWidth/2,top:this.editorHeight/2};this._editorModeTransition((function(){t._setFittedImageVerticeCoordinates();var e=t.cropperState,i=t.getScaledImageDimensions(),s=i.width/e.imageDimensions.width,a={left:t.image.left+e.offsetX*s*t.zoomRatio,top:t.image.top+e.offsetY*s*t.zoomRatio,width:e.width*s*t.zoomRatio,height:e.height*s*t.zoomRatio};t._showCropper(a),t.focalPoint&&(s=i.width/t.focalPointState.imageDimensions.width,t.focalPoint.left=t.image.left+t.focalPointState.offsetX*s*t.zoomRatio,t.focalPoint.top=t.image.top+t.focalPointState.offsetY*s*t.zoomRatio,t.canvas.add(t.focalPoint))}),s,i)},disableCropMode:function(){var t=this,e={};this._hideCropper();var i=this.getScaledImageDimensions(),s=this.getZoomToCoverRatio(i)*this.scaleFactor,a=s/this.zoomRatio;this.zoomRatio=s;var n={width:i.width*this.zoomRatio,height:i.height*this.zoomRatio,left:this.editorWidth/2,top:this.editorHeight/2},r=(this.clipper.left-this.image.left)*a,o=(this.clipper.top-this.image.top)*a;n.left=this.editorWidth/2-r,n.top=this.editorHeight/2-o,e.height=this.clipper.height*a,e.width=this.clipper.width*a,(!this.focalPoint||this.focalPoint&&!this._isCenterInside(this.focalPoint,this.clipper))&&(this.focalPoint&&this.toggleFocalPoint(),this._resetFocalPointPosition()),this._editorModeTransition((function(){if(t.focalPoint){var e=t.getScaledImageDimensions().width/t.focalPointState.imageDimensions.width;t.focalPoint.left=t.image.left+t.focalPointState.offsetX*e*t.zoomRatio,t.focalPoint.top=t.image.top+t.focalPointState.offsetY*e*t.zoomRatio,t.canvas.add(t.focalPoint)}}),n,e)},_editorModeTransition:function(t,e,i){var s=this;this._queue.pause(),this.animationInProgress||(this.animationInProgress=!0,this.focalPoint&&(this.canvas.remove(this.focalPoint),this.renderImage()),this.image.animate(e,{onChange:this.canvas.renderAll.bind(this.canvas),duration:this.settings.animationDuration,onComplete:function(){t(),s.animationInProgress=!1,s.renderImage(),s._queue.resume()}}),this.viewport.animate(i,{duration:this.settings.animationDuration}))},_showSpinner:function(){this.$spinner||(this.$spinner=$('<div class="spinner big spinner-absolute"/>')),this.$spinner.appendTo(this.$container.find(".image"))},_hideSpinner:function(){this.$spinner.remove()},_showCropper:function(t){this._setupCropperLayer(t),this._redrawCropperElements(),this.renderCropper()},_hideCropper:function(){this.clipper&&(this.croppingCanvas.remove(this.clipper),this.croppingCanvas.remove(this.croppingShade),this.croppingCanvas.remove(this.cropperHandles),this.croppingCanvas.remove(this.cropperGrid),this.croppingCanvas.remove(this.croppingRectangle),this.croppingCanvas=null,this.renderCropper=null)},_setupCropperLayer:function(t){var e=this;this.croppingCanvas=new fabric.StaticCanvas("cropping-canvas",{backgroundColor:"rgba(0,0,0,0)",hoverCursor:"default",selection:!1}),this.croppingCanvas.setDimensions({width:this.editorWidth,height:this.editorHeight}),this.renderCropper=function(){return Garnish.requestAnimationFrame(e.croppingCanvas.renderAll.bind(e.croppingCanvas))},$("#cropping-canvas",this.$editorContainer).css({position:"absolute",top:0,left:0}),this.croppingShade=new fabric.Rect({left:this.editorWidth/2,top:this.editorHeight/2,originX:"center",originY:"center",width:this.editorWidth,height:this.editorHeight,fill:"rgba(0,0,0,0.7)"});var i=this.getScaledImageDimensions(),s=0===this.imageStraightenAngle?1:1.2*this.getCombinedZoomRatio(i),a=i.width/s,n=i.height/s;if(this.hasOrientationChanged()){var r=n;n=a,a=r}this.clipper=new fabric.Rect({left:this.editorWidth/2,top:this.editorHeight/2,originX:"center",originY:"center",width:a,height:n,stroke:"black",fill:"rgba(128,0,0,1)",strokeWidth:0}),t&&this.clipper.set(t),this.clipper.globalCompositeOperation="destination-out",this.croppingCanvas.add(this.croppingShade),this.croppingCanvas.add(this.clipper)},_redrawCropperElements:function(){void 0===this._redrawCropperElements._&&(this._redrawCropperElements._={}),this.cropperHandles&&(this.croppingCanvas.remove(this.cropperHandles),this.croppingCanvas.remove(this.cropperGrid),this.croppingCanvas.remove(this.croppingRectangle)),this._redrawCropperElements._.lineOptions={strokeWidth:4,stroke:"rgb(255,255,255)",fill:!1},this._redrawCropperElements._.gridOptions={strokeWidth:2,stroke:"rgba(255,255,255,0.5)"},this._redrawCropperElements._.pathGroup=[new fabric.Path("M 0,10 L 0,0 L 10,0",this._redrawCropperElements._.lineOptions),new fabric.Path("M "+(this.clipper.width-8)+",0 L "+(this.clipper.width+4)+",0 L "+(this.clipper.width+4)+",10",this._redrawCropperElements._.lineOptions),new fabric.Path("M "+(this.clipper.width+4)+","+(this.clipper.height-8)+" L"+(this.clipper.width+4)+","+(this.clipper.height+4)+" L "+(this.clipper.width-8)+","+(this.clipper.height+4),this._redrawCropperElements._.lineOptions),new fabric.Path("M 10,"+(this.clipper.height+4)+" L 0,"+(this.clipper.height+4)+" L 0,"+(this.clipper.height-8),this._redrawCropperElements._.lineOptions)],this.cropperHandles=new fabric.Group(this._redrawCropperElements._.pathGroup,{left:this.clipper.left,top:this.clipper.top,originX:"center",originY:"center"}),this.croppingRectangle=new fabric.Rect({left:this.clipper.left,top:this.clipper.top,width:this.clipper.width,height:this.clipper.height,fill:"rgba(0,0,0,0)",stroke:"rgba(255,255,255,0.8)",strokeWidth:2,originX:"center",originY:"center"}),this.cropperGrid=new fabric.Group([new fabric.Line([.33*this.clipper.width,0,.33*this.clipper.width,this.clipper.height],this._redrawCropperElements._.gridOptions),new fabric.Line([.66*this.clipper.width,0,.66*this.clipper.width,this.clipper.height],this._redrawCropperElements._.gridOptions),new fabric.Line([0,.33*this.clipper.height,this.clipper.width,.33*this.clipper.height],this._redrawCropperElements._.gridOptions),new fabric.Line([0,.66*this.clipper.height,this.clipper.width,.66*this.clipper.height],this._redrawCropperElements._.gridOptions)],{left:this.clipper.left,top:this.clipper.top,originX:"center",originY:"center"}),this._redrawCropperElements._.cropTextTop=this.croppingRectangle.top+this.clipper.height/2+12,this._redrawCropperElements._.cropTextBackgroundColor="rgba(0,0,0,0)",this._redrawCropperElements._.cropTextTop+12>this.editorHeight-2&&(this._redrawCropperElements._.cropTextTop-=24,this._redrawCropperElements._.cropTextBackgroundColor="rgba(0,0,0,0.5)"),this.croppingCanvas.add(this.cropperHandles),this.croppingCanvas.add(this.cropperGrid),this.croppingCanvas.add(this.croppingRectangle)},_repositionCropper:function(t){if(this.croppingCanvas){var e=this.clipper.left-this.croppingCanvas.width/2,i=this.clipper.top-this.croppingCanvas.height/2;this.croppingCanvas.setDimensions({width:this.editorWidth,height:this.editorHeight});var s=this._getBoundingRectangle(this.imageVerticeCoords).width/t.width;this.clipper.width=Math.round(this.clipper.width*s),this.clipper.height=Math.round(this.clipper.height*s),this.clipper.left=this.editorWidth/2+e*s,this.clipper.top=this.editorHeight/2+i*s,this.croppingShade.set({width:this.editorWidth,height:this.editorHeight,left:this.editorWidth/2,top:this.editorHeight/2}),this._redrawCropperElements(),this.renderCropper()}},_getBoundingRectangle:function(t){return{width:Math.max(t.a.x,t.b.x,t.c.x,t.d.x)-Math.min(t.a.x,t.b.x,t.c.x,t.d.x),height:Math.max(t.a.y,t.b.y,t.c.y,t.d.y)-Math.min(t.a.y,t.b.y,t.c.y,t.d.y)}},_handleMouseDown:function(t){var e=this.focalPoint&&this._isMouseOver(t,this.focalPoint),i=this.croppingCanvas&&this._isMouseOver(t,this.clipper),s=this.croppingCanvas&&this._cropperHandleHitTest(t);(s||i||e)&&(this.previousMouseX=t.pageX,this.previousMouseY=t.pageY,e?this.draggingFocal=!0:s?this.scalingCropper=s:i&&(this.draggingCropper=!0))},_handleMouseMove:function(t){null!==this.mouseMoveEvent&&Garnish.requestAnimationFrame(this._handleMouseMoveInternal.bind(this)),this.mouseMoveEvent=t},_handleMouseMoveInternal:function(){null!==this.mouseMoveEvent&&(this.focalPoint&&this.draggingFocal?(this._handleFocalDrag(this.mouseMoveEvent),this.storeFocalPointState(),this.renderImage()):this.draggingCropper||this.scalingCropper?(this.draggingCropper?this._handleCropperDrag(this.mouseMoveEvent):this._handleCropperResize(this.mouseMoveEvent),this._redrawCropperElements(),this.storeCropperState(),this.renderCropper()):this._setMouseCursor(this.mouseMoveEvent),this.previousMouseX=this.mouseMoveEvent.pageX,this.previousMouseY=this.mouseMoveEvent.pageY,this.mouseMoveEvent=null)},_handleMouseUp:function(){this.draggingCropper=!1,this.scalingCropper=!1,this.draggingFocal=!1},_handleMouseOut:function(t){this._handleMouseUp(t),this.mouseMoveEvent=t,this._handleMouseMoveInternal()},_handleCropperDrag:function(t){if(void 0===this._handleCropperDrag._&&(this._handleCropperDrag._={}),this._handleCropperDrag._.deltaX=t.pageX-this.previousMouseX,this._handleCropperDrag._.deltaY=t.pageY-this.previousMouseY,0===this._handleCropperDrag._.deltaX&&0===this._handleCropperDrag._.deltaY)return!1;if(this._handleCropperDrag._.rectangle={left:this.clipper.left-this.clipper.width/2,top:this.clipper.top-this.clipper.height/2,width:this.clipper.width,height:this.clipper.height},this._handleCropperDrag._.vertices=this._getRectangleVertices(this._handleCropperDrag._.rectangle,this._handleCropperDrag._.deltaX,this._handleCropperDrag._.deltaY),!this.arePointsInsideRectangle(this._handleCropperDrag._.vertices,this.imageVerticeCoords)){for(this._handleCropperDrag._.dxi=0,this._handleCropperDrag._.dyi=0,this._handleCropperDrag._.xStep=this._handleCropperDrag._.deltaX>0?-1:1,this._handleCropperDrag._.yStep=this._handleCropperDrag._.deltaY>0?-1:1,this._handleCropperDrag._.furthest=0,this._handleCropperDrag._.furthestDeltas={},this._handleCropperDrag._.dxi=Math.min(Math.abs(this._handleCropperDrag._.deltaX),10);this._handleCropperDrag._.dxi>=0;this._handleCropperDrag._.dxi--)for(this._handleCropperDrag._.dyi=Math.min(Math.abs(this._handleCropperDrag._.deltaY),10);this._handleCropperDrag._.dyi>=0;this._handleCropperDrag._.dyi--)this._handleCropperDrag._.vertices=this._getRectangleVertices(this._handleCropperDrag._.rectangle,this._handleCropperDrag._.dxi*(this._handleCropperDrag._.deltaX>0?1:-1),this._handleCropperDrag._.dyi*(this._handleCropperDrag._.deltaY>0?1:-1)),this.arePointsInsideRectangle(this._handleCropperDrag._.vertices,this.imageVerticeCoords)&&this._handleCropperDrag._.dxi+this._handleCropperDrag._.dyi>this._handleCropperDrag._.furthest&&(this._handleCropperDrag._.furthest=this._handleCropperDrag._.dxi+this._handleCropperDrag._.dyi,this._handleCropperDrag._.furthestDeltas={x:this._handleCropperDrag._.dxi*(this._handleCropperDrag._.deltaX>0?1:-1),y:this._handleCropperDrag._.dyi*(this._handleCropperDrag._.deltaY>0?1:-1)});if(0==this._handleCropperDrag._.furthest)return;this._handleCropperDrag._.deltaX=this._handleCropperDrag._.furthestDeltas.x,this._handleCropperDrag._.deltaY=this._handleCropperDrag._.furthestDeltas.y}this.clipper.set({left:this.clipper.left+this._handleCropperDrag._.deltaX,top:this.clipper.top+this._handleCropperDrag._.deltaY})},_handleFocalDrag:function(t){if(void 0===this._handleFocalDrag._&&(this._handleFocalDrag._={}),this.focalPoint){if(this._handleFocalDrag._.deltaX=t.pageX-this.previousMouseX,this._handleFocalDrag._.deltaY=t.pageY-this.previousMouseY,0===this._handleFocalDrag._.deltaX&&0===this._handleFocalDrag._.deltaY)return;if(this._handleFocalDrag._.newX=this.focalPoint.left+this._handleFocalDrag._.deltaX,this._handleFocalDrag._.newY=this.focalPoint.top+this._handleFocalDrag._.deltaY,"crop"===this.currentView){if(!this.arePointsInsideRectangle([{x:this._handleFocalDrag._.newX,y:this._handleFocalDrag._.newY}],this.imageVerticeCoords))return}else if(!(this.viewport.left-this.viewport.width/2-this._handleFocalDrag._.newX<0&&this.viewport.left+this.viewport.width/2-this._handleFocalDrag._.newX>0&&this.viewport.top-this.viewport.height/2-this._handleFocalDrag._.newY<0&&this.viewport.top+this.viewport.height/2-this._handleFocalDrag._.newY>0))return;this.focalPoint.set({left:this.focalPoint.left+this._handleFocalDrag._.deltaX,top:this.focalPoint.top+this._handleFocalDrag._.deltaY})}},setCroppingConstraint:function(t){switch(this.updateSizeAndPosition(),t){case"none":this.croppingConstraint=!1;break;case"original":this.croppingConstraint=this.originalWidth/this.originalHeight;break;case"current":this.croppingConstraint=this.clipper.width/this.clipper.height;break;case"custom":break;default:this.croppingConstraint=parseFloat(t)}},enforceCroppingConstraint:function(){var t=this;void 0===this.enforceCroppingConstraint._&&(this.enforceCroppingConstraint._={}),!this.animationInProgress&&this.croppingConstraint&&(this.animationInProgress=!0,this.enforceCroppingConstraint._.rectangle={left:this.clipper.left-this.clipper.width/2,top:this.clipper.top-this.clipper.height/2,width:this.clipper.width,height:this.clipper.height},this.clipper.width>this.clipper.height*this.croppingConstraint?(this.enforceCroppingConstraint._.previousHeight=this.enforceCroppingConstraint._.rectangle.height,this.enforceCroppingConstraint._.rectangle.height=this.clipper.width/this.croppingConstraint,this.enforceCroppingConstraint._.rectangle.top-=(this.enforceCroppingConstraint._.rectangle.height-this.enforceCroppingConstraint._.previousHeight)/2,this.arePointsInsideRectangle(this._getRectangleVertices(this.enforceCroppingConstraint._.rectangle),this.imageVerticeCoords)||(this.enforceCroppingConstraint._.rectangle.width=this.clipper.height*this.croppingConstraint,this.enforceCroppingConstraint._.rectangle.height=this.enforceCroppingConstraint._.rectangle.width/this.croppingConstraint)):(this.enforceCroppingConstraint._.previousWidth=this.enforceCroppingConstraint._.rectangle.width,this.enforceCroppingConstraint._.rectangle.width=this.clipper.height*this.croppingConstraint,this.enforceCroppingConstraint._.rectangle.left-=(this.enforceCroppingConstraint._.rectangle.width-this.enforceCroppingConstraint._.previousWidth)/2,this.arePointsInsideRectangle(this._getRectangleVertices(this.enforceCroppingConstraint._.rectangle),this.imageVerticeCoords)||(this.enforceCroppingConstraint._.rectangle.height=this.clipper.width/this.croppingConstraint,this.enforceCroppingConstraint._.rectangle.width=this.enforceCroppingConstraint._.rectangle.height*this.croppingConstraint)),this.enforceCroppingConstraint._.properties={height:this.enforceCroppingConstraint._.rectangle.height,width:this.enforceCroppingConstraint._.rectangle.width},this.clipper.animate(this.enforceCroppingConstraint._.properties,{onChange:function(){t._redrawCropperElements(),t.croppingCanvas.renderAll()},duration:this.settings.animationDuration,onComplete:function(){t._redrawCropperElements(),t.animationInProgress=!1,t.renderCropper(),t.storeCropperState()}}))},_handleCropperResize:function(t){void 0===this._handleCropperResize._&&(this._handleCropperResize._={}),this._handleCropperResize._.deltaX=t.pageX-this.previousMouseX,this._handleCropperResize._.deltaY=t.pageY-this.previousMouseY,"b"!==this.scalingCropper&&"t"!==this.scalingCropper||(this._handleCropperResize._.deltaX=0),"l"!==this.scalingCropper&&"r"!==this.scalingCropper||(this._handleCropperResize._.deltaY=0),0===this._handleCropperResize._.deltaX&&0===this._handleCropperResize._.deltaY||(this._handleCropperResize._.startingRectangle={left:this.clipper.left-this.clipper.width/2,top:this.clipper.top-this.clipper.height/2,width:this.clipper.width,height:this.clipper.height},this._handleCropperResize._.rectangle=this._calculateNewCropperSizeByDeltas(this._handleCropperResize._.startingRectangle,this._handleCropperResize._.deltaX,this._handleCropperResize._.deltaY,this.scalingCropper),this._handleCropperResize._.rectangle.height<30||this._handleCropperResize._.rectangle.width<30||this.arePointsInsideRectangle(this._getRectangleVertices(this._handleCropperResize._.rectangle),this.imageVerticeCoords)&&(this.clipper.set({top:this._handleCropperResize._.rectangle.top+this._handleCropperResize._.rectangle.height/2,left:this._handleCropperResize._.rectangle.left+this._handleCropperResize._.rectangle.width/2,width:this._handleCropperResize._.rectangle.width,height:this._handleCropperResize._.rectangle.height}),this._redrawCropperElements()))},_calculateNewCropperSizeByDeltas:function(t,e,i,s){if(void 0===this._calculateNewCropperSizeByDeltas._&&(this._calculateNewCropperSizeByDeltas._={}),this._calculateNewCropperSizeByDeltas._.topDelta=0,this._calculateNewCropperSizeByDeltas._.leftDelta=0,this._calculateNewCropperSizeByDeltas._.rectangle=t,this._calculateNewCropperSizeByDeltas._.deltaX=e,this._calculateNewCropperSizeByDeltas._.deltaY=i,this.croppingConstraint){switch(this._calculateNewCropperSizeByDeltas._.change=0,s){case"t":this._calculateNewCropperSizeByDeltas._.change=-this._calculateNewCropperSizeByDeltas._.deltaY;break;case"b":this._calculateNewCropperSizeByDeltas._.change=this._calculateNewCropperSizeByDeltas._.deltaY;break;case"r":this._calculateNewCropperSizeByDeltas._.change=this._calculateNewCropperSizeByDeltas._.deltaX;break;case"l":this._calculateNewCropperSizeByDeltas._.change=-this._calculateNewCropperSizeByDeltas._.deltaX;break;case"tr":this._calculateNewCropperSizeByDeltas._.change=Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY)>Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)?-this._calculateNewCropperSizeByDeltas._.deltaY:this._calculateNewCropperSizeByDeltas._.deltaX;break;case"tl":this._calculateNewCropperSizeByDeltas._.change=Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY)>Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)?-this._calculateNewCropperSizeByDeltas._.deltaY:-this._calculateNewCropperSizeByDeltas._.deltaX;break;case"br":this._calculateNewCropperSizeByDeltas._.change=Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY)>Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)?this._calculateNewCropperSizeByDeltas._.deltaY:this._calculateNewCropperSizeByDeltas._.deltaX;break;case"bl":this._calculateNewCropperSizeByDeltas._.change=Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY)>Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)?this._calculateNewCropperSizeByDeltas._.deltaY:-this._calculateNewCropperSizeByDeltas._.deltaX}switch(this.croppingConstraint>1?(this._calculateNewCropperSizeByDeltas._.deltaX=this._calculateNewCropperSizeByDeltas._.change,this._calculateNewCropperSizeByDeltas._.deltaY=this._calculateNewCropperSizeByDeltas._.deltaX/this.croppingConstraint):(this._calculateNewCropperSizeByDeltas._.deltaY=this._calculateNewCropperSizeByDeltas._.change,this._calculateNewCropperSizeByDeltas._.deltaX=this._calculateNewCropperSizeByDeltas._.deltaY*this.croppingConstraint),this._calculateNewCropperSizeByDeltas._.rectangle.height+=this._calculateNewCropperSizeByDeltas._.deltaY,this._calculateNewCropperSizeByDeltas._.rectangle.width+=this._calculateNewCropperSizeByDeltas._.deltaX,s){case"t":this._calculateNewCropperSizeByDeltas._.rectangle.top-=this._calculateNewCropperSizeByDeltas._.deltaY,this._calculateNewCropperSizeByDeltas._.rectangle.left-=this._calculateNewCropperSizeByDeltas._.deltaX/2;break;case"b":this._calculateNewCropperSizeByDeltas._.rectangle.left+=-this._calculateNewCropperSizeByDeltas._.deltaX/2;break;case"r":this._calculateNewCropperSizeByDeltas._.rectangle.top+=-this._calculateNewCropperSizeByDeltas._.deltaY/2;break;case"l":this._calculateNewCropperSizeByDeltas._.rectangle.top-=this._calculateNewCropperSizeByDeltas._.deltaY/2,this._calculateNewCropperSizeByDeltas._.rectangle.left-=this._calculateNewCropperSizeByDeltas._.deltaX;break;case"tr":this._calculateNewCropperSizeByDeltas._.rectangle.top-=this._calculateNewCropperSizeByDeltas._.deltaY;break;case"tl":this._calculateNewCropperSizeByDeltas._.rectangle.top-=this._calculateNewCropperSizeByDeltas._.deltaY,this._calculateNewCropperSizeByDeltas._.rectangle.left-=this._calculateNewCropperSizeByDeltas._.deltaX;break;case"bl":this._calculateNewCropperSizeByDeltas._.rectangle.left-=this._calculateNewCropperSizeByDeltas._.deltaX}}else!this.shiftKeyHeld||"tl"!==s&&"tr"!==s&&"bl"!==s&&"br"!==s||(this._calculateNewCropperSizeByDeltas._.ratio,Math.abs(e)>Math.abs(i)?(this._calculateNewCropperSizeByDeltas._.ratio=t.width/t.height,this._calculateNewCropperSizeByDeltas._.deltaY=this._calculateNewCropperSizeByDeltas._.deltaX/this._calculateNewCropperSizeByDeltas._.ratio,this._calculateNewCropperSizeByDeltas._.deltaY*="tr"===s||"bl"===s?-1:1):(this._calculateNewCropperSizeByDeltas._.ratio=t.width/t.height,this._calculateNewCropperSizeByDeltas._.deltaX=this._calculateNewCropperSizeByDeltas._.deltaY*this._calculateNewCropperSizeByDeltas._.ratio,this._calculateNewCropperSizeByDeltas._.deltaX*="tr"===s||"bl"===s?-1:1)),s.match(/t/)&&(this._calculateNewCropperSizeByDeltas._.rectangle.top+=this._calculateNewCropperSizeByDeltas._.deltaY,this._calculateNewCropperSizeByDeltas._.rectangle.height-=this._calculateNewCropperSizeByDeltas._.deltaY),s.match(/b/)&&(this._calculateNewCropperSizeByDeltas._.rectangle.height+=this._calculateNewCropperSizeByDeltas._.deltaY),s.match(/r/)&&(this._calculateNewCropperSizeByDeltas._.rectangle.width+=this._calculateNewCropperSizeByDeltas._.deltaX),s.match(/l/)&&(this._calculateNewCropperSizeByDeltas._.rectangle.left+=this._calculateNewCropperSizeByDeltas._.deltaX,this._calculateNewCropperSizeByDeltas._.rectangle.width-=this._calculateNewCropperSizeByDeltas._.deltaX);return this._calculateNewCropperSizeByDeltas._.rectangle.top=this._calculateNewCropperSizeByDeltas._.rectangle.top,this._calculateNewCropperSizeByDeltas._.rectangle.left=this._calculateNewCropperSizeByDeltas._.rectangle.left,this._calculateNewCropperSizeByDeltas._.rectangle.width=this._calculateNewCropperSizeByDeltas._.rectangle.width,this._calculateNewCropperSizeByDeltas._.rectangle.height=this._calculateNewCropperSizeByDeltas._.rectangle.height,this._calculateNewCropperSizeByDeltas._.rectangle},_setMouseCursor:function(t){void 0===this._setMouseCursor._&&(this._setMouseCursor._={}),Garnish.isMobileBrowser(!0)||(this._setMouseCursor._.cursor="default",this._setMouseCursor._.handle=this.croppingCanvas&&this._cropperHandleHitTest(t),this.focalPoint&&this._isMouseOver(t,this.focalPoint)?this._setMouseCursor._.cursor="pointer":this._setMouseCursor._.handle?"t"===this._setMouseCursor._.handle||"b"===this._setMouseCursor._.handle?this._setMouseCursor._.cursor="ns-resize":"l"===this._setMouseCursor._.handle||"r"===this._setMouseCursor._.handle?this._setMouseCursor._.cursor="ew-resize":"tl"===this._setMouseCursor._.handle||"br"===this._setMouseCursor._.handle?this._setMouseCursor._.cursor="nwse-resize":"bl"!==this._setMouseCursor._.handle&&"tr"!==this._setMouseCursor._.handle||(this._setMouseCursor._.cursor="nesw-resize"):this.croppingCanvas&&this._isMouseOver(t,this.clipper)&&(this._setMouseCursor._.cursor="move"),$(".body").css("cursor",this._setMouseCursor._.cursor))},_cropperHandleHitTest:function(t){if(void 0===this._cropperHandleHitTest._&&(this._cropperHandleHitTest._={}),this._cropperHandleHitTest._.parentOffset=this.$croppingCanvas.offset(),this._cropperHandleHitTest._.mouseX=t.pageX-this._cropperHandleHitTest._.parentOffset.left,this._cropperHandleHitTest._.mouseY=t.pageY-this._cropperHandleHitTest._.parentOffset.top,this._cropperHandleHitTest._.lb=this.clipper.left-this.clipper.width/2,this._cropperHandleHitTest._.rb=this._cropperHandleHitTest._.lb+this.clipper.width,this._cropperHandleHitTest._.tb=this.clipper.top-this.clipper.height/2,this._cropperHandleHitTest._.bb=this._cropperHandleHitTest._.tb+this.clipper.height,this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.lb+10&&this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.lb-3){if(this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.tb+10&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.tb-3)return"tl";if(this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.bb+3&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.bb-10)return"bl"}if(this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.rb-13&&this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.rb+3){if(this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.tb+10&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.tb-3)return"tr";if(this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.bb+2&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.bb-10)return"br"}return this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.lb+3&&this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.lb-3&&this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.bb-10&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.tb+10?"l":this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.rb+1&&this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.rb-5&&this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.bb-10&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.tb+10?"r":this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.tb+4&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.tb-2&&this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.lb+10&&this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.rb-10?"t":this._cropperHandleHitTest._.mouseY<this._cropperHandleHitTest._.bb+2&&this._cropperHandleHitTest._.mouseY>this._cropperHandleHitTest._.bb-4&&this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.lb+10&&this._cropperHandleHitTest._.mouseX<this._cropperHandleHitTest._.rb-10&&"b"},_isMouseOver:function(t,e){return void 0===this._isMouseOver._&&(this._isMouseOver._={}),this._isMouseOver._.parentOffset=this.$croppingCanvas.offset(),this._isMouseOver._.mouseX=t.pageX-this._isMouseOver._.parentOffset.left,this._isMouseOver._.mouseY=t.pageY-this._isMouseOver._.parentOffset.top,this._isMouseOver._.lb=e.left-e.width/2,this._isMouseOver._.rb=this._isMouseOver._.lb+e.width,this._isMouseOver._.tb=e.top-e.height/2,this._isMouseOver._.bb=this._isMouseOver._.tb+e.height,this._isMouseOver._.mouseX>=this._isMouseOver._.lb&&this._isMouseOver._.mouseX<=this._isMouseOver._.rb&&this._isMouseOver._.mouseY>=this._isMouseOver._.tb&&this._isMouseOver._.mouseY<=this._isMouseOver._.bb},_getRectangleVertices:function(t,e,i){return void 0===this._getRectangleVertices._&&(this._getRectangleVertices._={}),void 0===e&&(e=0),void 0===i&&(i=0),this._getRectangleVertices._.topLeft={x:t.left+e,y:t.top+i},this._getRectangleVertices._.topRight={x:this._getRectangleVertices._.topLeft.x+t.width,y:this._getRectangleVertices._.topLeft.y},this._getRectangleVertices._.bottomRight={x:this._getRectangleVertices._.topRight.x,y:this._getRectangleVertices._.topRight.y+t.height},this._getRectangleVertices._.bottomLeft={x:this._getRectangleVertices._.topLeft.x,y:this._getRectangleVertices._.bottomRight.y},[this._getRectangleVertices._.topLeft,this._getRectangleVertices._.topRight,this._getRectangleVertices._.bottomRight,this._getRectangleVertices._.bottomLeft]},_setFittedImageVerticeCoordinates:function(){this.imageVerticeCoords=this.getImageVerticeCoords("fit")},getImageVerticeCoords:function(t){var e,i=-1*((this.hasOrientationChanged()?90:0)+this.imageStraightenAngle)*(Math.PI/180),s=this.getScaledImageDimensions();e="number"==typeof t?t:"cover"===t?this.getZoomToCoverRatio(s):this.getZoomToFitRatio(s);var a=s.height*e,n=s.width*e,r=Math.cos(i)*a,o=Math.sin(i)*n,l=Math.cos(i)*n,h=Math.sin(i)*a,d=(this.editorHeight-(r+o))/2,c=(this.editorWidth-(h+l))/2;return{a:{x:c+l,y:d},b:{x:this.editorWidth-c,y:d+r},c:{x:c+h,y:this.editorHeight-d},d:{x:c,y:d+o}}},_debug:function(t){this.canvas.remove(this.debugger),this.debugger=t,this.canvas.add(this.debugger)},arePointsInsideRectangle:function(t,e){for(void 0===this.arePointsInsideRectangle._&&(this.arePointsInsideRectangle._={}),this.arePointsInsideRectangle._.ab=this._getVector(e.a,e.b),this.arePointsInsideRectangle._.bc=this._getVector(e.b,e.c),this.arePointsInsideRectangle._.scalarAbAb=this._getScalarProduct(this.arePointsInsideRectangle._.ab,this.arePointsInsideRectangle._.ab),this.arePointsInsideRectangle._.scalarBcBc=this._getScalarProduct(this.arePointsInsideRectangle._.bc,this.arePointsInsideRectangle._.bc),this.arePointsInsideRectangle._.i=0;this.arePointsInsideRectangle._.i<t.length;this.arePointsInsideRectangle._.i++)if(this.arePointsInsideRectangle._.point=t[this.arePointsInsideRectangle._.i],this.arePointsInsideRectangle._.ap=this._getVector(e.a,this.arePointsInsideRectangle._.point),this.arePointsInsideRectangle._.bp=this._getVector(e.b,this.arePointsInsideRectangle._.point),this.arePointsInsideRectangle._.scalarAbAp=this._getScalarProduct(this.arePointsInsideRectangle._.ab,this.arePointsInsideRectangle._.ap),this.arePointsInsideRectangle._.scalarBcBp=this._getScalarProduct(this.arePointsInsideRectangle._.bc,this.arePointsInsideRectangle._.bp),this.arePointsInsideRectangle._.projectsOnAB=0<=this.arePointsInsideRectangle._.scalarAbAp&&this.arePointsInsideRectangle._.scalarAbAp<=this.arePointsInsideRectangle._.scalarAbAb,this.arePointsInsideRectangle._.projectsOnBC=0<=this.arePointsInsideRectangle._.scalarBcBp&&this.arePointsInsideRectangle._.scalarBcBp<=this.arePointsInsideRectangle._.scalarBcBc,!this.arePointsInsideRectangle._.projectsOnAB||!this.arePointsInsideRectangle._.projectsOnBC)return!1;return!0},_getVector:function(t,e){return{x:e.x-t.x,y:e.y-t.y}},_getScalarProduct:function(t,e){return t.x*e.x+t.y*e.y},_getVectorMagnitude:function(t){return Math.sqrt(t.x*t.x+t.y*t.y)},_getAngleBetweenVectors:function(t,e){return Math.round(180*Math.acos(Math.min(1,this._getScalarProduct(t,e)/(this._getVectorMagnitude(t)*this._getVectorMagnitude(e))))/Math.PI*100)/100},_getEdgeCrossed:function(t,e){for(var i=[[t.a,t.b],[t.b,t.c],[t.c,t.d],[t.d,t.a]],s={x:this.editorWidth/2,y:this.editorHeight/2},a=180,n=null,r=0;r<i.length;r++){var o=i[r],l=this._getVector(o[0],s),h=this._getVector(o[0],o[1]),d=this._getVector(o[0],e),c=Math.abs(this._getAngleBetweenVectors(l,d)-(this._getAngleBetweenVectors(l,h)+this._getAngleBetweenVectors(h,d)));c<a&&(a=c,n=o)}return n},_getImageBoundingBox:function(t){var e={},i=Math.abs(this.imageStraightenAngle)*(Math.PI/180),s=t.height/t.width;if(e.height=t.width*(Math.sin(i)+Math.cos(i)*s),e.width=t.width*(Math.cos(i)+Math.sin(i)*s),this.hasOrientationChanged()){var a=e.width;e.width=e.height,e.height=a}return e}},{defaults:{animationDuration:100,allowSavingAsNew:!0,onSave:$.noop,allowDegreeFractions:null}})},2495:function(){function t(e){return t="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(e)}Craft.AssetIndex=Craft.BaseElementIndex.extend({$includeSubfoldersContainer:null,$includeSubfoldersCheckbox:null,showingIncludeSubfoldersCheckbox:!1,$uploadButton:null,$uploadInput:null,$progressBar:null,$folders:null,uploader:null,promptHandler:null,progressBar:null,_uploadTotalFiles:0,_uploadFileProgress:{},_currentUploaderSettings:{},_assetDrag:null,_folderDrag:null,_expandDropTargetFolderTimeout:null,_tempExpandedFolders:[],_fileConflictTemplate:{choices:[{value:"keepBoth",title:Craft.t("app","Keep both")},{value:"replace",title:Craft.t("app","Replace it")}]},_folderConflictTemplate:{choices:[{value:"replace",title:Craft.t("app","Replace the folder (all existing files will be deleted)")},{value:"merge",title:Craft.t("app","Merge the folder (any conflicting files will be replaced)")}]},init:function(t,e,i){this.base(t,e,i),"index"===this.settings.context?(this._folderDrag||this._initIndexPageMode(),this.addListener(Garnish.$win,"resize,scroll","_positionProgressBar")):(this.addListener(this.$main,"scroll","_positionProgressBar"),this.settings.modal&&this.settings.modal.on("updateSizeAndPosition",this._positionProgressBar.bind(this)))},initSources:function(){return"index"!==this.settings.context||this._folderDrag||this._initIndexPageMode(),this.base()},initSource:function(t){this.base(t),this._createFolderContextMenu(t),"index"===this.settings.context&&(this._folderDrag&&this.getSourceLevel(t)>1&&t.data("folder-id")&&this._folderDrag.addItems(t.parent()),this._assetDrag&&this._assetDrag.updateDropTargets())},deinitSource:function(t){this.base(t);var e=t.data("contextmenu");e&&e.destroy(),"index"===this.settings.context&&(this._folderDrag&&this.getSourceLevel(t)>1&&this._folderDrag.removeItems(t.parent()),this._assetDrag&&this._assetDrag.updateDropTargets())},_initIndexPageMode:function(){var t=this;this._folderDrag||(this.settings.selectable=!0,this.settings.multiSelect=!0,this._assetDrag=new Garnish.DragDrop({activeDropTargetClass:"sel",helperOpacity:.75,filter:function(){return t.view.getSelectedElements().has("div.element[data-movable]")},helper:function(e){return t._getFileDragHelper(e)},dropTargets:function(){var e;e=t._assetDrag.$draggee&&t._assetDrag.$draggee.has(".element[data-peer-file]").length?"data-can-move-peer-files-to":"data-can-move-to";for(var i=[],s=0;s<t.$sources.length;s++){var a=t.$sources.eq(s);Garnish.hasAttr(a,e)&&i.push(a)}return i},onDragStart:this._onDragStart.bind(this),onDropTargetChange:this._onDropTargetChange.bind(this),onDragStop:this._onFileDragStop.bind(this),helperBaseZindex:800}),this._folderDrag=new Garnish.DragDrop({activeDropTargetClass:"sel",helperOpacity:.75,helper:function(e){var i=$('<div class="sidebar drag-helper"/>'),s=$("<nav/>").appendTo(i),a=$("<ul/>").appendTo(s);return e.appendTo(a).removeClass("expanded"),e.children("a").addClass("sel"),e.css({"padding-top":t._folderDrag.$draggee.css("padding-top"),"padding-right":t._folderDrag.$draggee.css("padding-right"),"padding-bottom":t._folderDrag.$draggee.css("padding-bottom"),"padding-left":t._folderDrag.$draggee.css("padding-left")}),i},dropTargets:function(){var e=[],i=[];t._folderDrag.$draggee.find("a[data-key]").each((function(){i.push($(this).data("key"))}));for(var s=0;s<t.$sources.length;s++){var a=t.$sources.eq(s),n=a.data("key");t._getVolumeOrFolderUidFromSourceKey(n)&&(Craft.inArray(n,i)||e.push(a))}return e},onDragStart:this._onDragStart.bind(this),onDropTargetChange:this._onDropTargetChange.bind(this),onDragStop:this._onFolderDragStop.bind(this)}))},_onFileDragStop:function(){var t=this;if(this._assetDrag.$activeDropTarget&&this._assetDrag.$activeDropTarget[0]!==this.$source[0]){for(var e=this.$source,i=this._assetDrag.$activeDropTarget.data("folder-id"),s=[],a=0;a<this._assetDrag.$draggee.length;a++){var n=Craft.getElementInfo(this._assetDrag.$draggee[a]).id;s.push(n)}if(s.length){this.setIndexBusy(),this._positionProgressBar(),this.progressBar.resetProgressBar(),this.progressBar.setItemCount(s.length),this.progressBar.showProgressBar();var r=[];for(a=0;a<s.length;a++)r.push({action:"assets/move-asset",params:{assetId:s[a],folderId:i}});return void this._performBatchRequests(r,(function a(n){t.promptHandler.resetPrompts();for(var r=0;r<n.length;r++){var o=n[r];o.conflict&&t.promptHandler.addPrompt({assetId:o.assetId,suggestedFilename:o.suggestedFilename,prompt:{message:o.conflict,choices:t._fileConflictTemplate.choices}}),o.error&&alert(o.error)}t.setIndexAvailable(),t.progressBar.hideProgressBar();var l=!1,h=function(){this.sourceSelect.selectItem(e),this._totalVisible-=this._assetDrag.$draggee.length;for(var t=0;t<s.length;t++)$("[data-id="+s[t]+"]").remove();this.view.deselectAllElements(),this._collapseExtraExpandedFolders(i),l&&this.updateElements()};t.promptHandler.getPromptCount()?(t._assetDrag.fadeOutHelpers(),t.promptHandler.showBatchPrompts((function(e){for(var s=[],n=0;n<e.length;n++)"cancel"!==e[n].choice?("keepBoth"===e[n].choice&&s.push({action:"assets/move-asset",params:{folderId:i,assetId:e[n].assetId,filename:e[n].suggestedFilename}}),"replace"===e[n].choice&&s.push({action:"assets/move-asset",params:{folderId:i,assetId:e[n].assetId,force:!0}})):l=!0;0===s.length?h.apply(t):(t.setIndexBusy(),t.progressBar.resetProgressBar(),t.progressBar.setItemCount(t.promptHandler.getPromptCount()),t.progressBar.showProgressBar(),t._performBatchRequests(s,a))}))):(h.apply(t),t._assetDrag.fadeOutHelpers())}))}}else this.$source.addClass("sel"),this._collapseExtraExpandedFolders();this._assetDrag.returnHelpersToDraggees()},_onFolderDragStop:function(){var t=this;if(this._folderDrag.$activeDropTarget&&0===this._folderDrag.$activeDropTarget.siblings("ul").children("li").filter(this._folderDrag.$draggee).length){var e=this._folderDrag.$activeDropTarget.data("folder-id");this._collapseExtraExpandedFolders(e);for(var i=[],s=0;s<this._folderDrag.$draggee.length;s++){var a=this._folderDrag.$draggee.eq(s).children("a").data("folder-id");if(a!=e){i.push(a);break}}if(i.length){i.sort(),i.reverse(),this.setIndexBusy(),this._positionProgressBar(),this.progressBar.resetProgressBar(),this.progressBar.setItemCount(i.length),this.progressBar.showProgressBar();var n=[];for(s=0;s<i.length;s++)n.push({action:"assets/move-folder",params:{folderId:i[s],parentId:e}});this.requestId++;var r=[],o="";return void this._performBatchRequests(n,(function e(s){t.promptHandler.resetPrompts();for(var a=0;a<s.length;a++){var n=s[a];n.success&&(n.transferList&&(r=n.transferList),n.newFolderId&&(o=t._folderDrag.$activeDropTarget.data("key")+"/folder:"+n.newFolderUid)),n.conflict&&(n.prompt={message:n.conflict,choices:t._folderConflictTemplate.choices},t.promptHandler.addPrompt(n)),n.error&&alert(n.error)}t.promptHandler.getPromptCount()?(t.promptHandler.showBatchPrompts((function(s){t.promptHandler.resetPrompts();for(var a=[],l={},h=0;h<s.length;h++)"cancel"!==s[h].choice&&("replace"===s[h].choice&&(l.force=!0),"merge"===s[h].choice&&(l.merge=!0),l.folderId=n.folderId,l.parentId=n.parentId,a.push({action:"assets/move-folder",params:l}));0===a.length?t._performActualFolderMove(r,i,o):(t.setIndexBusy(),t.progressBar.resetProgressBar(),t.progressBar.setItemCount(t.promptHandler.getPromptCount()),t.progressBar.showProgressBar(),t._performBatchRequests(a,e))})),t.setIndexAvailable(),t.progressBar.hideProgressBar()):t._performActualFolderMove(r,i,o)}))}}else this.$source.addClass("sel"),this._collapseExtraExpandedFolders();this._folderDrag.returnHelpersToDraggees()},_performActualFolderMove:function(t,e,i){var s=this;this.setIndexBusy(),this.progressBar.resetProgressBar(),this.progressBar.setItemCount(1),this.progressBar.showProgressBar();var a=function(t){for(var e=0,a=t.length,n=0;n<t.length;n++){var r={folderId:t[n]};Craft.sendActionRequest("POST","assets/delete-folder",{data:r}).then((function(t){++e===a&&(s.setIndexAvailable(),s.progressBar.hideProgressBar(),s._folderDrag.returnHelpersToDraggees(),s.setInstanceState("selectedSource",i),s.refreshSources())}))}};if(t.length>0){for(var n=[],r=0;r<t.length;r++)n.push({action:"assets/move-asset",params:t[r]});this._performBatchRequests(n,(function(){a(e)}))}else a(e)},_selectSourceByFolderId:function(t){for(var e=this._getSourceByKey(t),i=e.parent().parents("li"),s=0;s<i.length;s++){var a=$(i[s]);a.hasClass("expanded")||a.children(".toggle").trigger("click")}this.selectSource(e),this.updateElements()},afterInit:function(){var t=this;this.$uploadButton||(this.$uploadButton=$("<button/>",{type:"button",class:"btn submit","data-icon":"upload",style:"position: relative; overflow: hidden;",text:Craft.t("app","Upload files")}),this.addButton(this.$uploadButton),this.$uploadInput=$('<input type="file" multiple="multiple" name="assets-upload" />').hide().insertBefore(this.$uploadButton)),this.promptHandler=new Craft.PromptHandler,this.progressBar=new Craft.ProgressBar(this.$main,!0);var e={url:Craft.getActionUrl("assets/upload"),fileInput:this.$uploadInput,dropZone:this.$container};e.events={fileuploadstart:this._onUploadStart.bind(this),fileuploadprogressall:this._onUploadProgress.bind(this),fileuploaddone:this._onUploadSuccess.bind(this),fileuploadalways:this._onUploadAlways.bind(this),fileuploadfail:this._onUploadFailure.bind(this)},this.settings.criteria&&void 0!==this.settings.criteria.kind&&(e.allowedKinds=this.settings.criteria.kind),this._currentUploaderSettings=e,this.uploader=new Craft.Uploader(this.$uploadButton,e),this.$uploadButton.on("click",(function(){t.$uploadButton.hasClass("disabled")||t.isIndexBusy||t.$uploadButton.parent().find("input[name=assets-upload]").trigger("click")})),this.base()},getDefaultSourceKey:function(){var e=this;if("index"===this.settings.context&&void 0!==window.defaultSource){var i=function(){var t=window.defaultSource.split("/"),i=e.$sources.toArray().find((function(e){return $(e).data("volume-handle")===t[0]}));if(i){for(var s=$(i),a=function(i){var a=e._getChildSources(s).toArray().find((function(e){return $("> .label",e).text()===t[i]}));if(!a)return"break";e._expandSource(s),s=$(a)},n=1;n<t.length&&"break"!==a(n);n++);return{v:s.data("key")}}}();if("object"===t(i))return i.v}return this.base()},onSelectSource:function(){var t=this._getSourceByKey(this.sourceKey);t.data("folder-id")&&Garnish.hasAttr(this.$source,"data-can-upload")?(this.uploader.setParams({folderId:this.$source.attr("data-folder-id")}),this.$uploadButton.removeClass("disabled")):this.$uploadButton.addClass("disabled"),t.length&&"index"===this.settings.context&&this._updateUrl(t),this.base()},_updateUrl:function(t){for(var e,i=[],s=t;(e=this.getParentSource(s))&&e.length;)i.unshift(s),s=e;var a="assets";s.data("volume-handle")&&(a+="/"+s.data("volume-handle"),i.forEach((function(t){a+="/"+t.children(".label").text()}))),Craft.setPath(a)},_getVolumeOrFolderUidFromSourceKey:function(t){var e=t.match(/\b(?:folder|volume):([0-9a-f\-]+)$/);return e?e[1]:null},startSearching:function(){if(!this.settings.hideSidebar&&this.$source.siblings("ul").length){if(null===this.$includeSubfoldersContainer){var t="includeSubfolders-"+Math.floor(1e9*Math.random());this.$includeSubfoldersContainer=$('<div style="margin-bottom: -25px; opacity: 0;"/>').insertAfter(this.$search);var e=$('<div style="padding-top: 5px;"/>').appendTo(this.$includeSubfoldersContainer);this.$includeSubfoldersCheckbox=$('<input type="checkbox" id="'+t+'" class="checkbox"/>').appendTo(e),$('<label class="light smalltext" for="'+t+'"/>').text(" "+Craft.t("app","Search in subfolders")).appendTo(e),this.addListener(this.$includeSubfoldersCheckbox,"change",(function(){this.setSelecetedSourceState("includeSubfolders",this.$includeSubfoldersCheckbox.prop("checked")),this.updateElements()}))}else this.$includeSubfoldersContainer.velocity("stop").removeClass("hidden");var i=this.getSelectedSourceState("includeSubfolders",!1);this.$includeSubfoldersCheckbox.prop("checked",i),this.$includeSubfoldersContainer.velocity({marginBottom:0,opacity:1},"fast"),this.showingIncludeSubfoldersCheckbox=!0}this.base()},stopSearching:function(){var t=this;this.showingIncludeSubfoldersCheckbox&&(this.$includeSubfoldersContainer.velocity("stop"),this.$includeSubfoldersContainer.velocity({marginBottom:-25,opacity:0},{duration:"fast",complete:function(){t.$includeSubfoldersContainer.addClass("hidden")}}),this.showingIncludeSubfoldersCheckbox=!1),this.base()},getViewParams:function(){var t=this.base();return this.showingIncludeSubfoldersCheckbox&&this.$includeSubfoldersCheckbox.prop("checked")&&(t.criteria.includeSubfolders=!0),t},_onUploadStart:function(){this.setIndexBusy(),this._positionProgressBar(),this.progressBar.resetProgressBar(),this.progressBar.showProgressBar(),this.promptHandler.resetPrompts()},_onUploadProgress:function(t,e){var i=parseInt(e.loaded/e.total*100,10);this.progressBar.setProgressPercentage(i)},_onUploadSuccess:function(t,e){var i=e.result;this.selectElementAfterUpdate(i.assetId),i.conflict&&(i.prompt={message:Craft.t("app",i.conflict,{file:i.filename}),choices:this._fileConflictTemplate.choices},this.promptHandler.addPrompt(i)),Craft.cp.runQueue()},_onUploadAlways:function(){this.uploader.isLastUpload()&&(this.progressBar.hideProgressBar(),this.setIndexAvailable(),this.promptHandler.getPromptCount()?this.promptHandler.showBatchPrompts(this._uploadFollowup.bind(this)):this._updateAfterUpload())},_onUploadFailure:function(t,e){var i,s=e.response(),a=(null==s||null===(i=s.jqXHR)||void 0===i?void 0:i.responseJSON)||{},n=a.message,r=a.filename;n||(n=r?Craft.t("app","Upload failed for “{filename}”.",{filename:r}):Craft.t("app","Upload failed.")),alert(n)},_updateAfterUpload:function(){"index"!==this.settings.context&&(this.clearSearch(),this.setSelectedSortAttribute("dateCreated","desc")),this.updateElements()},_uploadFollowup:function(t){var e=this;this.setIndexBusy(),this.progressBar.resetProgressBar(),this.promptHandler.resetPrompts(),this.progressBar.setItemCount(t.length),this.progressBar.showProgressBar(),function t(i,s,a){var n={},r=null,o=function(){s++,e.progressBar.incrementProcessedItemCount(1),e.progressBar.updateProgressBar(),s===i.length?a():t(i,s,a)},l=function(t){t.assetId&&e.selectElementAfterUpdate(t.assetId),o()};"replace"===i[s].choice?(r="assets/replace-file",n.sourceAssetId=i[s].assetId,i[s].conflictingAssetId?n.assetId=i[s].conflictingAssetId:n.targetFilename=i[s].filename):"cancel"===i[s].choice&&(r="assets/delete-asset",n.assetId=i[s].assetId),r?Craft.sendActionRequest("POST",r,{data:n}).then((function(t){return l(t.data)})).catch((function(t){return function(t){alert(t.message),o()}(t.response.data)})):l({assetId:i[s].assetId})}(t,0,(function(){e.progressBar.hideProgressBar(),e.setIndexAvailable(),e._updateAfterUpload()}))},onUpdateElements:function(){var t=this;this._onUpdateElements(!1,this.view.getAllElements()),this.view.on("appendElements",(function(e){t._onUpdateElements(!0,e.newElements)})),this.base()},_onUpdateElements:function(t,e){"index"===this.settings.context&&(t||this._assetDrag.removeAllItems(),this._assetDrag.addItems(e.has("div.element[data-movable]"))),this.base(t,e),this.removeListener(this.$elements,"keydown"),this.addListener(this.$elements,"keydown",this._onKeyDown.bind(this)),this.view.elementSelect.on("focusItem",this._onElementFocus.bind(this))},_onKeyDown:function(t){if(t.keyCode===Garnish.SPACE_KEY&&t.shiftKey){if(Craft.PreviewFileModal.openInstance)Craft.PreviewFileModal.openInstance.selfDestruct();else{var e=this.view.elementSelect.$focusedItem.find(".element");e.length&&this._loadPreview(e)}return t.stopPropagation(),!1}},_onElementFocus:function(t){var e=$(t.item).find(".element");Craft.PreviewFileModal.openInstance&&e.length&&this._loadPreview(e)},_loadPreview:function(t){var e={};t.data("image-width")&&(e.startingWidth=t.data("image-width"),e.startingHeight=t.data("image-height")),new Craft.PreviewFileModal(t.data("id"),this.view.elementSelect,e)},_onDragStart:function(){this._tempExpandedFolders=[]},_getFileDragHelper:function(t){var e,i;switch(this.getSelectedSourceState("mode")){case"table":e=$('<div class="elements datatablesorthelper"/>').appendTo(Garnish.$bod),i=$('<div class="tableview"/>').appendTo(e);var s=$('<table class="data"/>').appendTo(i),a=$("<tbody/>").appendTo(s);t.appendTo(a),this._$firstRowCells=this.view.$table.children("tbody").children("tr:first").children();for(var n=t.children(),r=0;r<n.length;r++){var o=$(n[r]);if(o.hasClass("checkbox-cell"))o.remove(),e.css("margin-"+Craft.left,19);else{var l=$(this._$firstRowCells[r]),h=l.width();l.width(h),o.width(h)}}return e;case"thumbs":return e=$('<div class="elements thumbviewhelper"/>').appendTo(Garnish.$bod),i=$('<ul class="thumbsview"/>').appendTo(e),t.appendTo(i),e}return $()},_onDropTargetChange:function(t){if(clearTimeout(this._expandDropTargetFolderTimeout),t){var e=t.data("folder-id");e?(this.dropTargetFolder=this._getSourceByKey(e),this._hasSubfolders(this.dropTargetFolder)&&!this._isExpanded(this.dropTargetFolder)&&(this._expandDropTargetFolderTimeout=setTimeout(this._expandFolder.bind(this),500))):this.dropTargetFolder=null}t&&t[0]!==this.$source[0]?this.$source.removeClass("sel"):this.$source.addClass("sel")},_collapseExtraExpandedFolders:function(t){var e;clearTimeout(this._expandDropTargetFolderTimeout),t&&(e=this._getSourceByKey(t).parents("li").children("a"));for(var i=this._tempExpandedFolders.length-1;i>=0;i--){var s=this._tempExpandedFolders[i];void 0!==e&&0!==e.filter('[data-key="'+s.data("key")+'"]').length||(this._collapseFolder(s),this._tempExpandedFolders.splice(i,1))}},_getSourceByKey:function(t){return this.$sources.filter('[data-key$="'+t+'"]')},_hasSubfolders:function(t){return t.siblings("ul").find("li").length},_isExpanded:function(t){return t.parent("li").hasClass("expanded")},_expandFolder:function(){this._collapseExtraExpandedFolders(this.dropTargetFolder.data("folder-id")),this.dropTargetFolder.siblings(".toggle").trigger("click"),this._tempExpandedFolders.push(this.dropTargetFolder)},_collapseFolder:function(t){t.parent().hasClass("expanded")&&t.siblings(".toggle").trigger("click")},getSourceActions:function(){var t=this,e=this.base();return this._getVolumeOrFolderUidFromSourceKey(this.sourceKey)&&(e.push({label:Craft.t("app","New subfolder"),onSelect:function(){t._createSubfolder(t.$source)}}),this.getSourceLevel(this.$source)>1&&(e.push({label:Craft.t("app","Rename folder"),onSelect:function(){t._renameFolder(t.$source)}}),e.push({label:Craft.t("app","Delete folder"),destructive:!0,onSelect:function(){t._deleteFolder(t.$source)}}))),e},_createFolderContextMenu:function(t){var e=this;if(this._getVolumeOrFolderUidFromSourceKey(t.data("key"))){var i=[{label:Craft.t("app","New subfolder"),onClick:function(){e._createSubfolder(t)}}];"index"===this.settings.context&&this.getSourceLevel(t)>1&&(i.push({label:Craft.t("app","Rename folder"),onClick:function(){e._renameFolder(t)}}),i.push({label:Craft.t("app","Delete folder"),onClick:function(){e._deleteFolder(t)}})),new Garnish.ContextMenu(t,i,{menuClass:"menu"})}},_createSubfolder:function(t){var e=this,i=prompt(Craft.t("app","Enter the name of the folder"));if(i){var s={parentId:t.data("folder-id"),folderName:i};this.setIndexBusy(),Craft.sendActionRequest("POST","assets/create-folder",{data:s}).then((function(i){var s=i.data;e.setIndexAvailable(),e._prepareParentForChildren(t);var a=$("<li>"+'<a data-key="'.concat(t.data("key"),"/folder:").concat(s.folderUid,'" data-default-sort="').concat(t.data("default-sort"),'"')+(Garnish.hasAttr(t,"data-has-thumbs")?" data-has-thumbs":"")+' data-folder-id="'.concat(s.folderId,'"')+(Garnish.hasAttr(t,"data-can-upload")?" data-can-upload":"")+(Garnish.hasAttr(t,"data-can-move-to")?" data-can-move-to":"")+(Garnish.hasAttr(t,"data-can-move-peer-files-to")?" data-can-move-peer-files-to":"")+">"+'<span class="label">'.concat(s.folderName,"</span>")+"</a></li>"),n=a.children("a:first");e._appendSubfolder(t,a),e.initSource(n),Craft.cp.displayNotice(Craft.t("app","Folder created."))})).catch((function(t){var i=t.response;e.setIndexAvailable(),alert(i.data.message)}))}},_deleteFolder:function(t){var e=this;if(confirm(Craft.t("app","Really delete folder “{folder}”?",{folder:$.trim(t.text())}))){var i={folderId:t.data("folder-id")};this.setIndexBusy(),Craft.sendActionRequest("POST","assets/delete-folder",{data:i}).then((function(i){e.setIndexAvailable();var s=e.getParentSource(t);e.deinitSource(t),t.parent().remove(),e._cleanUpTree(s),Craft.cp.displayNotice(Craft.t("app","Folder deleted."))})).catch((function(t){var i=t.response;e.setIndexAvailable(),alert(i.data.message)}))}},_renameFolder:function(t){var e=this,i=t.children(".label"),s=Craft.trim(i.text()),a=prompt(Craft.t("app","Rename folder"),s);a&&a!==s&&(this.setIndexBusy(),Craft.sendActionRequest("POST","assets/rename-folder",{data:{folderId:t.data("folder-id"),newName:a}}).then((function(s){i.text(s.data.newName),t.data("key")===e.$source.data("key")&&(e.updateElements(),Craft.cp.displayNotice(Craft.t("app","Folder renamed.")),"index"===e.settings.context&&e._updateUrl(t))})).catch((function(t){var i=t.response;e.setIndexAvailable(),alert(i.data.message)})))},_prepareParentForChildren:function(t){this._hasSubfolders(t)||(t.parent().addClass("expanded").append('<div class="toggle"></div><ul class="nested"></ul>'),this.initSourceToggle(t))},_appendSubfolder:function(t,e){for(var i=t.siblings("ul").children("li"),s=$.trim(e.children("a:first").text()),a=!1,n=0;n<i.length;n++){var r=$(i[n]);if($.trim(r.children("a:first").text())>s){r.before(e),a=!0;break}}a||t.siblings("ul").append(e)},_cleanUpTree:function(t){null!==t&&0===t.siblings("ul").children("li").length&&(this.deinitSourceToggle(t),t.siblings("ul").remove(),t.siblings(".toggle").remove(),t.parent().removeClass("expanded"))},_positionProgressBar:function(){this.progressBar||(this.progressBar=new Craft.ProgressBar(this.$main,!0));var t=$(),e=0,i=0;"index"===this.settings.context?(t=this.progressBar.$progressBar.closest("#content"),e=Garnish.$win.scrollTop()):(t=this.progressBar.$progressBar.closest(".main"),e=this.$main.scrollTop());var s=e-t.offset().top,a=Garnish.$win.height();i=t.height()>a?a/2-6+s:t.height()/2-6,"index"!==this.settings.context&&(i=e+(t.height()/2-6)),this.progressBar.$progressBar.css({top:i})},_performBatchRequests:function(t,e){for(var i=this,s=[],a=t.length;t.length;){var n=t.shift();Craft.sendActionRequest("POST",n.action,{data:n.params}).then((function(t){s.push(t.data)})).finally((function(){i.progressBar.incrementProcessedItemCount(1),i.progressBar.updateProgressBar(),0==--a&&(Craft.cp.runQueue(),e(s))}))}}}),Craft.registerElementIndexClass("craft\\elements\\Asset",Craft.AssetIndex)},5077:function(){Craft.AssetSelectInput=Craft.BaseElementSelectInput.extend({requestId:0,hud:null,$uploadBtn:null,uploader:null,progressBar:null,openPreviewTimeout:null,init:function(){this.base.apply(this,arguments),this.settings.canUpload&&this._attachUploader(),this.updateAddElementsBtn(),this.addListener(this.$elementsContainer,"keydown",this._onKeyDown.bind(this)),this.elementSelect.on("focusItem",this._onElementFocus.bind(this))},_onKeyDown:function(t){if(t.keyCode===Garnish.SPACE_KEY&&t.shiftKey)return this.openPreview(),t.stopPropagation(),!1},onAddElements:function(){var t=this;this.$elements.find(".elementthumb").addClass("open-preview").on("click",(function(e){t.clearOpenPreviewTimeout(),t.openPreviewTimeout=setTimeout((function(){t.openPreview(),t.openPreviewTimeout=null}),500)})).on("dblclick",(function(e){t.clearOpenPreviewTimeout()})),this.base()},clearOpenPreviewTimeout:function(){this.openPreviewTimeout&&(clearTimeout(this.openPreviewTimeout),this.openPreviewTimeout=null)},openPreview:function(){if(Craft.PreviewFileModal.openInstance)Craft.PreviewFileModal.openInstance.selfDestruct();else{var t=this.elementSelect.$focusedItem;t.length&&this._loadPreview(t)}},_onElementFocus:function(t){var e=$(t.item);Craft.PreviewFileModal.openInstance&&e.length&&this._loadPreview(e)},_loadPreview:function(t){var e={minGutter:50};t.data("image-width")&&(e.startingWidth=t.data("image-width"),e.startingHeight=t.data("image-height")),new Craft.PreviewFileModal(t.data("id"),this.elementSelect,e)},_attachUploader:function(){var t=this;this.progressBar=new Craft.ProgressBar($('<div class="progress-shade"></div>').appendTo(this.$container));var e={url:Craft.getActionUrl("assets/upload"),dropZone:this.$container,formData:{fieldId:this.settings.fieldId}};this.settings.sourceElementId&&(e.formData.elementId=this.settings.sourceElementId),this.settings.criteria.siteId&&(e.formData.siteId=this.settings.criteria.siteId),this.$addElementBtn&&(this.$uploadBtn=$("<button/>",{type:"button",class:"btn dashed","data-icon":"upload","aria-label":1==this.settings.limit?Craft.t("app","Upload a file"):Craft.t("app","Upload files"),"aria-describedby":this.settings.describedBy,text:1==this.settings.limit?Craft.t("app","Upload a file"):Craft.t("app","Upload files")}).insertAfter(this.$addElementBtn),e.fileInput=$("<input/>",{type:"file",class:"hidden",multiple:1!=this.settings.limit}).insertAfter(this.$uploadBtn),Garnish.$win.trigger("resize")),void 0!==Craft.csrfTokenName&&void 0!==Craft.csrfTokenValue&&(e.formData[Craft.csrfTokenName]=Craft.csrfTokenValue),void 0!==this.settings.criteria.kind&&(e.allowedKinds=this.settings.criteria.kind),e.canAddMoreFiles=this.canAddMoreFiles.bind(this),e.events={},e.events.fileuploadstart=this._onUploadStart.bind(this),e.events.fileuploadprogressall=this._onUploadProgress.bind(this),e.events.fileuploaddone=this._onUploadComplete.bind(this),e.events.fileuploadfail=this._onUploadFailure.bind(this),this.uploader=new Craft.Uploader(this.$container,e),this.$uploadBtn&&this.$uploadBtn.on("click",(function(e){t.$uploadBtn.next("input[type=file]").trigger("click")}))},enableAddElementsBtn:function(){this.$uploadBtn&&this.$uploadBtn.removeClass("hidden"),this.base()},disableAddElementsBtn:function(){this.$uploadBtn&&this.$uploadBtn.addClass("hidden"),this.base()},selectUploadedFile:function(t){if(this.canAddMoreElements()){var e=t.$element;e.addClass("removable"),e.prepend('<input type="hidden" name="'+this.settings.name+'[]" value="'+t.id+'"><a class="delete icon" title="'+Craft.t("app","Remove")+'"></a>'),e.appendTo(this.$elementsContainer);var i=-(e.outerWidth()+10);this.$addElementBtn.css("margin-"+Craft.left,i+"px");var s={};s["margin-"+Craft.left]=0,this.$addElementBtn.velocity(s,"fast"),this.addElements(e),delete this.modal}},_onUploadStart:function(){this.progressBar.$progressBar.css({top:Math.round(this.$container.outerHeight()/2)-6}),this.$container.addClass("uploading"),this.progressBar.resetProgressBar(),this.progressBar.showProgressBar()},_onUploadProgress:function(t,e){var i=parseInt(e.loaded/e.total*100,10);this.progressBar.setProgressPercentage(i)},_onUploadComplete:function(t,e){var i=this;if(e.result.error)alert(e.result.error),this.progressBar.hideProgressBar(),this.$container.removeClass("uploading");else{var s={elementId:e.result.assetId,siteId:this.settings.criteria.siteId,thumbSize:this.settings.viewMode};Craft.sendActionRequest("POST","elements/get-element-html",{data:s}).then((function(t){var e=$(t.data.html);Craft.appendHeadHtml(t.data.headHtml),i.selectUploadedFile(Craft.getElementInfo(e)),i.uploader.isLastUpload()&&(i.progressBar.hideProgressBar(),i.$container.removeClass("uploading"),i.$container.trigger("change"))})).catch((function(t){var e=t.response;alert(e.data.message)})),Craft.cp.runQueue()}},_onUploadFailure:function(t,e){var i,s=e.response(),a=(null==s||null===(i=s.jqXHR)||void 0===i?void 0:i.responseJSON)||{},n=a.message,r=a.filename;n||(n=r?Craft.t("app","Upload failed for “{filename}”.",{filename:r}):Craft.t("app","Upload failed.")),alert(n),this.progressBar.hideProgressBar(),this.$container.removeClass("uploading")},canAddMoreFiles:function(t){return!this.settings.limit||this.$elements.length+t<this.settings.limit}})},4606:function(){Craft.AssetSelectorModal=Craft.BaseElementSelectorModal.extend({$selectTransformBtn:null,_selectedTransform:null,init:function(t,e){e=$.extend({},Craft.AssetSelectorModal.defaults,e),this.base(t,e),e.transforms.length&&this.createSelectTransformButton(e.transforms)},createSelectTransformButton:function(t){if(t&&t.length){var e=$('<div class="btngroup"/>').appendTo(this.$primaryButtons);this.$selectBtn.appendTo(e),this.$selectTransformBtn=$("<button/>",{type:"button",class:"btn menubtn disabled",text:Craft.t("app","Select transform")}).appendTo(e);for(var i=$('<div class="menu" data-align="right"></div>').insertAfter(this.$selectTransformBtn),s=$("<ul></ul>").appendTo(i),a=0;a<t.length;a++)$('<li><a data-transform="'+t[a].handle+'">'+t[a].name+"</a></li>").appendTo(s);var n=new Garnish.MenuBtn(this.$selectTransformBtn,{onOptionSelect:this.onSelectTransform.bind(this)});n.disable(),this.$selectTransformBtn.data("menuButton",n)}},onSelectionChange:function(t){var e=this.elementIndex.getSelectedElements(),i=!1;if(e.length&&this.settings.transforms.length){i=!0;for(var s=0;s<e.length&&$(".element.hasthumb:first",e[s]).length;s++);}var a=null;this.$selectTransformBtn&&(a=this.$selectTransformBtn.data("menuButton")),i?(a&&a.enable(),this.$selectTransformBtn.removeClass("disabled")):this.$selectTransformBtn&&(a&&a.disable(),this.$selectTransformBtn.addClass("disabled")),this.base()},onSelectTransform:function(t){var e=$(t).data("transform");this.selectImagesWithTransform(e)},selectImagesWithTransform:function(t){var e=this;void 0===Craft.AssetSelectorModal.transformUrls[t]&&(Craft.AssetSelectorModal.transformUrls[t]={});for(var i=this.elementIndex.getSelectedElements(),s=[],a=0;a<i.length;a++){var n=$(i[a]),r=Craft.getElementInfo(n).id;void 0===Craft.AssetSelectorModal.transformUrls[t][r]&&s.push(r)}s.length?(this.showFooterSpinner(),this.fetchMissingTransformUrls(s,t,(function(){e.hideFooterSpinner(),e.selectImagesWithTransform(t)}))):(this._selectedTransform=t,this.selectElements(),this._selectedTransform=null)},fetchMissingTransformUrls:function(t,e,i){var s=this,a=t.pop(),n={assetId:a,handle:e};Craft.sendActionRequest("POST","assets/generate-transform",{data:n}).then((function(t){Craft.AssetSelectorModal.transformUrls[e][a]=!1,t.data.url&&(Craft.AssetSelectorModal.transformUrls[e][a]=t.data.url)})).catch((function(n){n.response,Craft.AssetSelectorModal.transformUrls[e][a]=!1,t.length?s.fetchMissingTransformUrls(t,e,i):i()}))},getElementInfo:function(t){var e=this.base(t);if(this._selectedTransform)for(var i=0;i<e.length;i++){var s=e[i].id;void 0!==Craft.AssetSelectorModal.transformUrls[this._selectedTransform][s]&&!1!==Craft.AssetSelectorModal.transformUrls[this._selectedTransform][s]&&(e[i].url=Craft.AssetSelectorModal.transformUrls[this._selectedTransform][s])}return e},onSelect:function(t){this.settings.onSelect(t,this._selectedTransform)}},{defaults:{canSelectImageTransforms:!1,transforms:[]},transformUrls:{}}),Craft.registerElementSelectorModalClass("craft\\elements\\Asset",Craft.AssetSelectorModal)},9222:function(){Craft.AuthManager=Garnish.Base.extend({remainingSessionTime:null,checkRemainingSessionTimer:null,showLoginModalTimer:null,decrementLogoutWarningInterval:null,showingLogoutWarningModal:!1,showingLoginModal:!1,logoutWarningModal:null,loginModal:null,$logoutWarningPara:null,$passwordInput:null,$loginBtn:null,$loginErrorPara:null,submitLoginIfLoggedOut:!1,init:function(){Craft.username&&this.updateRemainingSessionTime(Craft.remainingSessionTime)},setCheckRemainingSessionTimer:function(t){this.checkRemainingSessionTimer&&clearTimeout(this.checkRemainingSessionTimer),this.checkRemainingSessionTimer=setTimeout(this.checkRemainingSessionTime.bind(this),1e3*t)},checkRemainingSessionTime:function(t){var e=this;$.ajax({url:Craft.getActionUrl("users/session-info",t?null:"dontExtendSession=1"),type:"GET",dataType:"json",complete:function(t,i){"success"===i?(void 0!==t.responseJSON.csrfTokenValue&&void 0!==Craft.csrfTokenValue&&(Craft.csrfTokenValue=t.responseJSON.csrfTokenValue),e.updateRemainingSessionTime(t.responseJSON.timeout),e.submitLoginIfLoggedOut=!1):e.updateRemainingSessionTime(-1)}})},updateRemainingSessionTime:function(t){this.remainingSessionTime=parseInt(t),-1!==this.remainingSessionTime&&this.remainingSessionTime<Craft.AuthManager.minSafeSessionTime?(this.remainingSessionTime?(this.showingLogoutWarningModal||this.showLogoutWarningModal(),this.remainingSessionTime<Craft.AuthManager.checkInterval&&(this.showLoginModalTimer&&clearTimeout(this.showLoginModalTimer),this.showLoginModalTimer=setTimeout(this.showLoginModal.bind(this),1e3*this.remainingSessionTime))):this.showingLoginModal?this.submitLoginIfLoggedOut&&this.submitLogin():this.showLoginModal(),this.setCheckRemainingSessionTimer(Craft.AuthManager.checkInterval)):(this.hideLogoutWarningModal(),this.hideLoginModal(),-1!==this.remainingSessionTime&&this.remainingSessionTime<Craft.AuthManager.minSafeSessionTime+Craft.AuthManager.checkInterval?this.setCheckRemainingSessionTimer(this.remainingSessionTime-Craft.AuthManager.minSafeSessionTime+1):this.setCheckRemainingSessionTimer(Craft.AuthManager.checkInterval))},showLogoutWarningModal:function(){var t;if(this.showingLoginModal?(this.hideLoginModal(!0),t=!0):t=!1,this.showingLogoutWarningModal=!0,!this.logoutWarningModal){var e=$('<form id="logoutwarningmodal" class="modal alert fitted"/>'),i=$('<div class="body"/>').appendTo(e),s=$('<div class="buttons right"/>').appendTo(i),a=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Sign out now")}).appendTo(s),n=$("<button/>",{type:"submit",class:"btn submit",text:Craft.t("app","Keep me signed in")}).appendTo(s);this.$logoutWarningPara=$("<p/>").prependTo(i),this.logoutWarningModal=new Garnish.Modal(e,{autoShow:!1,closeOtherModals:!1,hideOnEsc:!1,hideOnShadeClick:!1,shadeClass:"modal-shade dark logoutwarningmodalshade",onFadeIn:function(){Garnish.isMobileBrowser(!0)||setTimeout((function(){n.trigger("focus")}),100)}}),this.addListener(a,"activate","logout"),this.addListener(e,"submit","renewSession")}t?this.logoutWarningModal.quickShow():this.logoutWarningModal.show(),this.updateLogoutWarningMessage(),this.decrementLogoutWarningInterval=setInterval(this.decrementLogoutWarning.bind(this),1e3)},updateLogoutWarningMessage:function(){this.$logoutWarningPara.text(Craft.t("app","Your session will expire in {time}.",{time:Craft.secondsToHumanTimeDuration(this.remainingSessionTime)})),this.logoutWarningModal.updateSizeAndPosition()},decrementLogoutWarning:function(){this.remainingSessionTime>0&&(this.remainingSessionTime--,this.updateLogoutWarningMessage()),0===this.remainingSessionTime&&clearInterval(this.decrementLogoutWarningInterval)},hideLogoutWarningModal:function(t){this.showingLogoutWarningModal=!1,this.logoutWarningModal&&(t?this.logoutWarningModal.quickHide():this.logoutWarningModal.hide(),this.decrementLogoutWarningInterval&&clearInterval(this.decrementLogoutWarningInterval))},showLoginModal:function(){var t,e=this;if(this.showingLogoutWarningModal?(this.hideLogoutWarningModal(!0),t=!0):t=!1,this.showingLoginModal=!0,!this.loginModal){var i=$('<form id="loginmodal" class="modal alert fitted"/>'),s=$('<div class="body"><h2>'+Craft.t("app","Your session has ended.")+"</h2><p>"+Craft.t("app","Enter your password to log back in.")+"</p></div>").appendTo(i),a=$('<div class="inputcontainer">').appendTo(s),n=$('<div class="flex"/>').appendTo(a),r=$('<div class="flex-grow"/>').appendTo(n),o=$("<div/>").appendTo(n),l=$('<div class="passwordwrapper"/>').appendTo(r);this.$passwordInput=$('<input type="password" class="text password fullwidth" autocomplete="current-password" placeholder="'+Craft.t("app","Password")+'"/>').appendTo(l),this.$loginBtn=Craft.ui.createSubmitButton({class:"disabled",label:Craft.t("app","Sign in"),spinner:!0}).attr("aria-disabled","true").appendTo(o),this.$loginErrorPara=$('<p class="error"/>').appendTo(s),this.loginModal=new Garnish.Modal(i,{autoShow:!1,closeOtherModals:!1,hideOnEsc:!1,hideOnShadeClick:!1,shadeClass:"modal-shade dark loginmodalshade",onFadeIn:function(){Garnish.isMobileBrowser(!0)||setTimeout((function(){e.$passwordInput.trigger("focus")}),100)},onFadeOut:function(){e.$passwordInput.val("")}}),new Craft.PasswordInput(this.$passwordInput,{onToggleInput:function(t){e.$passwordInput=t}}),this.addListener(this.$passwordInput,"input","validatePassword"),this.addListener(i,"submit","login")}t?this.loginModal.quickShow():this.loginModal.show()},hideLoginModal:function(t){this.showingLoginModal=!1,this.loginModal&&(t?this.loginModal.quickHide():this.loginModal.hide())},logout:function(){$.get({url:Craft.getActionUrl("users/logout"),dataType:"json",success:function(){Craft.redirectTo("")}})},renewSession:function(t){t&&t.preventDefault(),this.hideLogoutWarningModal(),this.checkRemainingSessionTime(!0)},validatePassword:function(){return this.$passwordInput.val().length>=6?(this.$loginBtn.removeClass("disabled"),this.$loginBtn.removeAttr("aria-disabled"),!0):(this.$loginBtn.addClass("disabled"),this.$loginBtn.attr("aria-disabled","true"),!1)},login:function(t){t&&t.preventDefault(),this.validatePassword()&&(this.$loginBtn.addClass("loading"),this.clearLoginError(),void 0!==Craft.csrfTokenValue?(this.submitLoginIfLoggedOut=!0,this.checkRemainingSessionTime()):this.submitLogin())},submitLogin:function(){var t=this,e={loginName:Craft.username,password:this.$passwordInput.val()};Craft.sendActionRequest("POST","users/login",{data:e}).then((function(e){t.$loginBtn.removeClass("loading"),t.hideLoginModal(),t.checkRemainingSessionTime()})).catch((function(e){var i=e.response;t.$loginBtn.removeClass("loading"),t.showLoginError(i.data.message||null),Garnish.shake(t.loginModal.$container),Garnish.isMobileBrowser(!0)||t.$passwordInput.trigger("focus")}))},showLoginError:function(t){null==t&&(t=Craft.t("app","A server error occurred.")),this.$loginErrorPara.text(t),this.loginModal.updateSizeAndPosition()},clearLoginError:function(){this.showLoginError("")}},{checkInterval:60,minSafeSessionTime:120})},5774:function(){function t(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);e&&(s=s.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,s)}return i}function e(e){for(var s=1;s<arguments.length;s++){var a=null!=arguments[s]?arguments[s]:{};s%2?t(Object(a),!0).forEach((function(t){i(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):t(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(t,e,i){return e in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function s(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(t,e)||function(t,e){if(t){if("string"==typeof t)return a(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?a(t,e):void 0}}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}function n(t){return n="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},n(t)}Craft.BaseElementIndex=Garnish.Base.extend({initialized:!1,elementType:null,idPrefix:null,instanceState:null,sourceStates:null,sourceStatesStorageKey:null,searchTimeout:null,sourceSelect:null,$container:null,$main:null,isIndexBusy:!1,$sidebar:null,showingSidebar:null,sourceKey:null,rootSourceKey:null,sourceViewModes:null,$source:null,$rootSource:null,sourcesByKey:null,$visibleSources:null,$sourceActionsContainer:null,$sourceActionsBtn:null,$toolbar:null,toolbarOffset:null,$searchContainer:null,$search:null,$filterBtn:null,searching:!1,searchText:null,sortByScore:null,trashed:!1,drafts:!1,$clearSearchBtn:null,$statusMenuBtn:null,$statusMenuContainer:null,statusMenu:null,status:null,$siteMenuBtn:null,siteMenu:null,siteId:null,$elements:null,$updateSpinner:null,$viewModeBtnContainer:null,viewModeBtns:null,viewMode:null,view:null,_autoSelectElements:null,$countSpinner:null,$countContainer:null,$actionsContainer:null,page:1,resultSet:null,totalResults:null,$exportBtn:null,actions:null,actionsHeadHtml:null,actionsBodyHtml:null,$selectAllContainer:null,$selectAllCheckbox:null,showingActionTriggers:!1,exporters:null,exportersByType:null,_$triggers:null,_ignoreFailedRequest:!1,_cancelToken:null,viewMenus:null,activeViewMenu:null,filterHuds:null,init:function(t,e,i){var s=this;if(this.elementType=t,this.$container=e,this.setSettings(i,Craft.BaseElementIndex.defaults),this.idPrefix=Craft.randomString(10),this.instanceState=this.getDefaultInstanceState(),this.sourceStates={},this.settings.storageKey&&$.extend(this.instanceState,Craft.getLocalStorage(this.settings.storageKey),{}),this.sourceStatesStorageKey="BaseElementIndex."+this.elementType+"."+this.settings.context,$.extend(this.sourceStates,Craft.getLocalStorage(this.sourceStatesStorageKey,{})),this.$main=this.$container.find(".main"),this.$toolbar=this.$container.find(this.settings.toolbarSelector),this.$statusMenuBtn=this.$toolbar.find(".statusmenubtn:first"),this.$statusMenuContainer=this.$statusMenuBtn.parent(),this.$siteMenuBtn=this.$container.find(".sitemenubtn:first"),this.$searchContainer=this.$toolbar.find(".search:first"),this.$search=this.$searchContainer.children("input:first"),this.$filterBtn=this.$searchContainer.children(".filter-btn:first"),this.$clearSearchBtn=this.$searchContainer.children(".clear-btn:first"),this.$sidebar=this.$container.find(".sidebar:first"),this.$sourceActionsContainer=this.$sidebar.find("#source-actions"),this.$elements=this.$container.find(".elements:first"),this.$updateSpinner=this.$elements.find(".spinner"),this.$updateSpinner.length||(this.$updateSpinner=$("<div/>",{class:"update-spinner spinner spinner-absolute"}).appendTo(this.$elements)),this.$countSpinner=this.$container.find("#count-spinner"),this.$countContainer=this.$container.find("#count-container"),this.$actionsContainer=this.$container.find("#actions-container"),this.$exportBtn=this.$container.find("#export-btn"),this.settings.hideSidebar&&(this.$sidebar.hide(),$(".body, .content",this.$container).removeClass("has-sidebar")),this.initSources()){if(this.$statusMenuBtn.length&&(this.statusMenu=this.$statusMenuBtn.menubtn().data("menubtn").menu,this.statusMenu.on("optionselect",this._handleStatusChange.bind(this))),this.$siteMenuBtn.length){this.siteMenu=this.$siteMenuBtn.menubtn().data("menubtn").menu;var a=this.siteMenu.$options.filter(".sel:first");if(a.length||(a=this.siteMenu.$options.first()),a.length?this._setSite(a.data("site-id")):this.settings.criteria={id:"0"},this.siteMenu.on("optionselect",this._handleSiteChange.bind(this)),this.siteId){var n=this.settings.defaultSiteId||Craft.cp.getSiteId();if(n&&n!=this.siteId){var r=this.siteMenu.$options.filter('[data-site-id="'+n+'"]:first');r.length&&r.trigger("click")}}}else this.settings.criteria&&this.settings.criteria.siteId&&"*"!==this.settings.criteria.siteId?this._setSite(this.settings.criteria.siteId):this._setSite(Craft.siteId);this.settings.criteria&&this.settings.criteria.siteId&&delete this.settings.criteria.siteId,this.addListener(this.$search,"input",(function(){!s.searching&&s.$search.val()?s.startSearching():s.searching&&!s.$search.val()&&s.stopSearching(),s.searchTimeout&&clearTimeout(s.searchTimeout),s.searchTimeout=setTimeout(s.updateElementsIfSearchTextChanged.bind(s),500)})),this.addListener(this.$search,"keypress",(function(t){t.keyCode===Garnish.RETURN_KEY&&(t.preventDefault(),s.searchTimeout&&clearTimeout(s.searchTimeout),s.updateElementsIfSearchTextChanged())})),this.addListener(this.$clearSearchBtn,"click",(function(){s.clearSearch(!0),Garnish.isMobileBrowser(!0)||s.$search.trigger("focus")})),Garnish.isMobileBrowser(!0)||this.$search.trigger("focus"),this.viewMenus={},this.filterHuds={},this.addListener(this.$filterBtn,"click","showFilterHud");var o=Craft.getQueryParams();if(o.status){var l;switch(o.status){case"trashed":l="[data-trashed]";break;case"drafts":l="[data-drafts]";break;default:l='[data-status="'.concat(o.status,'"]')}var h=this.statusMenu.$options.filter(l);h.length?this.statusMenu.selectOption(h[0]):this.setQueryParam("status",null)}if(this.addListener(this.$exportBtn,"click","_showExportHud"),this.initialized=!0,this.afterInit(),this.selectDefaultSource(),o.sort){var d=o.sort.lastIndexOf("-");if(-1!==d){var c=o.sort.substring(0,d),u=o.sort.substring(d+1);this.setSelectedSortAttribute(c,u)}}this.setPage(Craft.pageNum),this.updateElements(!0)}},afterInit:function(){this.onAfterInit()},_createCancelToken:function(){return this._cancelToken=axios.CancelToken.source(),this._cancelToken.token},_cancelRequests:function(){var t=this;this._cancelToken&&(this._ignoreFailedRequest=!0,this._cancelToken.cancel(),Garnish.requestAnimationFrame((function(){t._ignoreFailedRequest=!1})))},getSourceContainer:function(){return this.$sidebar.find("nav > ul")},get $sources(){if(this.sourceSelect)return this.sourceSelect.$items},getSite:function(){var t=this;if(this.siteId)return Craft.sites.find((function(e){return e.id==t.siteId}))},initSources:function(){var t=this._getSourcesInList(this.getSourceContainer(),!0);if(0===t.length)return!1;this.sourceSelect||(this.sourceSelect=new Garnish.Select(this.$sidebar.find("nav"),{multi:!1,allowEmpty:!1,vertical:!0,onSelectionChange:this._handleSourceSelectionChange.bind(this)})),this.sourcesByKey={};for(var e=0;e<t.length;e++)this.initSource($(t[e]));return!0},selectDefaultSource:function(){var t,e;return"index"===this.settings.context&&(t=Craft.getQueryParam("source")),t||(t=this.getDefaultSourceKey()),t&&(e=this.getSourceByKey(t),-1===this.$visibleSources.index(e)&&(e=null)),t&&e||(e=this.$visibleSources.first()),this.selectSource(e)},refreshSources:function(){var t=this;this.sourceSelect.removeAllItems(),this.setIndexBusy(),Craft.sendActionRequest("POST",this.settings.refreshSourcesAction,{data:{context:this.settings.context,elementType:this.elementType}}).then((function(e){t.setIndexAvailable(),t.getSourceContainer().replaceWith(e.data.html),t.initSources(),t.selectDefaultSource()})).catch((function(){t.setIndexAvailable(),t._ignoreFailedRequest||Craft.cp.displayError(Craft.t("app","A server error occurred."))}))},initSource:function(t){this.sourceSelect.addItems(t),this.initSourceToggle(t),this.sourcesByKey[t.data("key")]=t,t.data("hasNestedSources")&&-1!==this.instanceState.expandedSources.indexOf(t.data("key"))&&this._expandSource(t)},initSourceToggle:function(t){this.deinitSourceToggle(t);var e=this._getSourceToggle(t);e.length?(this.addListener(t,"dblclick","_handleSourceDblClick"),this.addListener(e,"click","_handleSourceToggleClick"),t.data("hasNestedSources",!0)):t.data("hasNestedSources",!1)},deinitSource:function(t){this.sourceSelect.removeItems(t),this.deinitSourceToggle(t),delete this.sourcesByKey[t.data("key")]},deinitSourceToggle:function(t){t.data("hasNestedSources")&&(this.removeListener(t,"dblclick"),this.removeListener(this._getSourceToggle(t),"click")),t.removeData("hasNestedSources")},getDefaultInstanceState:function(){return{selectedSource:null,expandedSources:[]}},getDefaultSourceKey:function(){if(this.settings.defaultSource){for(var t=this.settings.defaultSource.split("/"),e="",i=0;i<t.length;i++){e+=t[i];var s=this.getSourceByKey(e);if(!s)return this.instanceState.selectedSource;this._expandSource(s),e+="/"}return this._setSite(this.siteId),this.settings.defaultSource}return this.instanceState.selectedSource},getDefaultExpandedSources:function(){return this.instanceState.expandedSources},startSearching:function(){this.$clearSearchBtn.removeClass("hidden"),this.searching=!0,this.sortByScore=!0,this.activeViewMenu&&this.activeViewMenu.updateSortField()},clearSearch:function(t){this.searching&&(this.$search.val(""),this.searchTimeout&&clearTimeout(this.searchTimeout),this.stopSearching(),t?this.updateElementsIfSearchTextChanged():this.searchText=null)},stopSearching:function(){this.$clearSearchBtn.addClass("hidden"),this.searching=!1,this.sortByScore=!1,this.activeViewMenu&&this.activeViewMenu.updateSortField()},setInstanceState:function(t,e){"object"===n(t)?$.extend(this.instanceState,t):this.instanceState[t]=e,this.storeInstanceState()},storeInstanceState:function(){this.settings.storageKey&&Craft.setLocalStorage(this.settings.storageKey,this.instanceState)},getSourceState:function(t,e,i){return t=t.replace(/\/.*/,""),void 0===this.sourceStates[t]&&(this.sourceStates[t]={}),void 0===e?this.sourceStates[t]:void 0!==this.sourceStates[t][e]?this.sourceStates[t][e]:void 0!==i?i:null},getSelectedSourceState:function(t,e){return this.getSourceState(this.instanceState.selectedSource,t,e)},setSelecetedSourceState:function(t,e){var i=this.getSelectedSourceState();if("object"===n(t))for(var s in t)t.hasOwnProperty(s)&&(null!==t[s]?i[s]=t[s]:delete i[s]);else null!==e?i[t]=e:delete i[t];var a=this.instanceState.selectedSource.replace(/\/.*/,"");for(var r in this.sourceStates[a]=i,this.sourceStates)this.sourceStates.hasOwnProperty(r)&&r.includes("/")&&delete this.sourceStates[r];Craft.setLocalStorage(this.sourceStatesStorageKey,this.sourceStates)},storeSortAttributeAndDirection:function(){},setPage:function(t){if("index"===this.settings.context){t=Math.max(t,1),this.page=t;var e=Craft.getPageUrl(this.page);history.replaceState({},"",e)}},_resetCount:function(){this.resultSet=null,this.totalResults=null},updateSourceMenu:function(){var t=this;if(this.$sourceActionsContainer.length){this.$sourceActionsBtn&&(this.$sourceActionsBtn.data("trigger").destroy(),this.$sourceActionsContainer.empty(),$("#source-actions-menu").remove(),this.$sourceActionsBtn=null);var e=this.getSourceActions();if(e.length){var i=[e.filter((function(t){return!t.destructive&&!t.administrative})),e.filter((function(t){return t.destructive&&!t.administrative})),e.filter((function(t){return t.administrative}))].filter((function(t){return t.length}));this.$sourceActionsBtn=$("<button/>",{type:"button",class:"btn settings icon menubtn",title:Craft.t("app","Source settings"),"aria-label":Craft.t("app","Source settings"),"aria-controls":"source-actions-menu"}).appendTo(this.$sourceActionsContainer);var s=$("<div/>",{id:"source-actions-menu",class:"menu menu--disclosure"}).appendTo(this.$sourceActionsContainer);i.forEach((function(e,i){0!==i&&$("<hr/>").appendTo(s),t._buildActionList(e).appendTo(s)})),this.$sourceActionsBtn.disclosureMenu()}}},_buildActionList:function(t){var e=this,i=$("<ul/>");return t.forEach((function(t){var s=$("<button/>",{type:"button",class:"menu-option",text:t.label}).on("click",(function(){e.$sourceActionsBtn.data("trigger").hide(),t.onSelect&&t.onSelect()}));t.destructive&&s.addClass("error"),$("<li/>").append(s).appendTo(i)})),i},getSourceActions:function(){var t=this,e=[];return Craft.userIsAdmin&&Craft.allowAdminChanges&&e.push({label:Craft.t("app","Customize sources"),administrative:!0,onSelect:function(){t.createCustomizeSourcesModal()}}),e},updateViewMenu:function(){this.activeViewMenu&&this.activeViewMenu===this.viewMenus[this.rootSourceKey]||(this.activeViewMenu&&this.activeViewMenu.hideTrigger(),this.viewMenus[this.rootSourceKey]||(this.viewMenus[this.rootSourceKey]=new r(this,this.$rootSource)),this.activeViewMenu=this.viewMenus[this.rootSourceKey],this.activeViewMenu.showTrigger())},getViewParams:function(){var t={siteId:this.siteId,search:this.searchText,offset:this.settings.batchSize*(this.page-1),limit:this.settings.batchSize};this.settings.canHaveDrafts&&(this.drafts||"index"===this.settings.context&&!this.status)&&(t.drafts=this.drafts||null,t.savedDraftsOnly=!0,this.drafts||(t.draftOf=!1)),this.trashed&&(t.trashed=!0),Garnish.hasAttr(this.$source,"data-override-status")||(t.status=this.status),$.extend(t,this.settings.criteria);var e={context:this.settings.context,elementType:this.elementType,source:this.instanceState.selectedSource,condition:this.settings.condition,criteria:t,disabledElementIds:this.settings.disabledElementIds,viewState:$.extend({},this.getSelectedSourceState()),paginated:this._isViewPaginated()?1:0},i=s(this.getSortAttributeAndDirection(),2),a=i[0],n=i[1];return e.viewState.order=a,e.viewState.sort=n,"structure"===a&&(void 0===this.instanceState.collapsedElementIds&&(this.instanceState.collapsedElementIds=[]),e.collapsedElementIds=this.instanceState.collapsedElementIds),this.filterHuds[this.siteId]&&this.filterHuds[this.siteId][this.sourceKey]&&this.filterHuds[this.siteId][this.sourceKey].serialized&&(e.filters=this.filterHuds[this.siteId][this.sourceKey].serialized),this.trigger("registerViewParams",{params:e}),e},updateElements:function(t,e){var i=this;if(this.initialized){this._cancelRequests(),this.setIndexBusy(),this.view&&(this.view.destroy(),delete this.view),!0!==t&&(this.setPage(1),this._resetCount());var s=this.getViewParams();Craft.sendActionRequest("POST",this.settings.updateElementsAction,{data:s,cancelToken:this._createCancelToken()}).then((function(t){if(i.setIndexAvailable(),("index"===i.settings.context?Garnish.$scrollContainer:i.$main).scrollTop(0),i._updateView(s,t.data),e){var a=i.view.getElementContainer();Garnish.firstFocusableElement(a).trigger("focus")}})).catch((function(t){i.setIndexAvailable(),i._ignoreFailedRequest||Craft.cp.displayError(Craft.t("app","A server error occurred."))}))}},updateElementsIfSearchTextChanged:function(){this.searchText!==(this.searchText=this.searching?this.$search.val():null)&&this.updateElements()},showActionTriggers:function(){this.showingActionTriggers||(this._$triggers?this._$triggers.appendTo(this.$actionsContainer):this._createTriggers(),this.showingActionTriggers=!0)},submitAction:function(t,e){var i=this,s=this.view.getSelectedElementIds();if(0!==s.length&&("string"==typeof t&&(t=this._findAction(t)),!t.confirm||confirm(t.confirm))){this._cancelRequests();var a=this.getViewParams();e=e?Craft.expandPostArray(e):{};var n=$.extend(a,t.settings||{},e,{elementAction:t.type,elementIds:s});this.setIndexBusy(),this._autoSelectElements=s,t.download?(Craft.csrfTokenName&&(n[Craft.csrfTokenName]=Craft.csrfTokenValue),Craft.downloadFromUrl("POST",Craft.getActionUrl(this.settings.submitActionsAction),n).then((function(t){i.setIndexAvailable()})).catch((function(t){i.setIndexAvailable()}))):Craft.sendActionRequest("POST",this.settings.submitActionsAction,{data:n,cancelToken:this._createCancelToken()}).then((function(e){i._resetCount(),i._updateView(a,e.data),void 0!==e.data.badgeCounts&&i._updateBadgeCounts(e.data.badgeCounts),e.data.message&&Craft.cp.displaySuccess(e.data.message),i.afterAction(t,n)})).catch((function(t){var e=t.response;Craft.cp.displayError(e.data.message)})).finally((function(){i.setIndexAvailable()}))}},_findAction:function(t){for(var e=0;e<this.actions.length;e++)if(this.actions[e].type===t)return this.actions[e];throw"Invalid element action: ".concat(t)},afterAction:function(t,e){Craft.cp.runQueue(),this.onAfterAction(t,e)},hideActionTriggers:function(){this.showingActionTriggers&&(this._$triggers.detach(),this.showingActionTriggers=!1)},updateActionTriggers:function(){if(this.actions){var t=this.view.getSelectedElements().length;0!==t?(t===this.view.getEnabledElements().length?(this.$selectAllCheckbox.removeClass("indeterminate"),this.$selectAllCheckbox.addClass("checked"),this.$selectAllCheckbox.attr("aria-checked","true")):(this.$selectAllCheckbox.addClass("indeterminate"),this.$selectAllCheckbox.removeClass("checked"),this.$selectAllCheckbox.attr("aria-checked","mixed")),this.showActionTriggers()):(this.$selectAllCheckbox.removeClass("indeterminate checked"),this.$selectAllCheckbox.attr("aria-checked","false"),this.hideActionTriggers())}},getSelectedElements:function(){return this.view?this.view.getSelectedElements():$()},getSelectedElementIds:function(){return this.view?this.view.getSelectedElementIds():[]},setStatus:function(t){var e=this.statusMenu.$options.filter('a[data-status="'+t+'"]:first');e.length&&this.statusMenu.selectOption(e[0])},getSelectedSortAttribute:function(t){if(t=t||this.$source){var e=this.getSourceState(t.data("key"),"order");if(this.getSortOption(e,t))return e}return this.getDefaultSort()[0]},getSelectedSortDirection:function(t){if(t=t||this.$source){var e=this.getSourceState(t.data("key"),"sort");if(["asc","desc"].includes(e))return e}return this.getDefaultSort()[1]},setSortAttribute:function(t){this.setSelectedSortAttribute(t)},setSelectedSortAttribute:function(t,e){if("score"===t)return this.sortByScore=!0,void(this.activeViewMenu&&this.activeViewMenu.updateSortField());this.sortByScore=!1;var i=this.getSortOption(t);if(i){e="structure"===t?"asc":e||i.defaultDir;var a=[],n=[t],r=this.getSelectedSourceState("order");r&&r!==t&&(a.push([r,this.getSelectedSourceState("sort")]),n.push(r));for(var o=this.getSelectedSourceState("orderHistory",[]),l=0;l<o.length;l++){var h=s(o[l],1)[0];if(!h||n.includes(h))break;a.push(o[l]),n.push(h)}this.setSelecetedSourceState({order:t,sort:e,orderHistory:a}),this.activeViewMenu&&this.activeViewMenu.updateSortField(),Craft.setQueryParam("sort","".concat(t,"-").concat(e))}else console.warn("Invalid sort option: ".concat(t))},setSortDirection:function(t){this.setSelectedSortDirection(t)},setSelectedSortDirection:function(t){this.setSelectedSortAttribute(this.getSelectedSortAttribute(),t)},canSortByStructure:function(){return!(this.trashed||this.drafts||this.searching||this.sortByScore)},getSortAttributeAndDirection:function(){if(this.searching&&this.sortByScore)return["score","desc"];var t=this.getSelectedSortAttribute(),e=this.getSelectedSortDirection();if("structure"===t)if(this.canSortByStructure())e="asc";else{var i=this.getSortOptions().find((function(t){return"structure"!==t.attr}));t=i.attr,e=i.defaultDir}return[t,e]},getSortLabel:function(t){var e=this.getSortOption(t);return e?e.label:null},getSelectedViewMode:function(){return this.getSelectedSourceState("mode")||"table"},getSourceLevel:function(t){return t.parentsUntil("nav","ul.nested").length+1},getParentSource:function(t){var e=t.parent().parent().siblings("a");return e.length?e:null},getRootSource:function(t){for(var e;e=this.getParentSource(t);)t=e;return t},getSourceByKey:function(t){return this.sourcesByKey[t]||null},selectSource:function(t){var e=$(t);if(!this.sourcesByKey||!Object.keys(this.sourcesByKey).length)return!1;if(this.$source&&this.$source[0]&&this.$source[0]===e[0]&&e.data("key")===this.sourceKey)return!1;if(this.hideActionTriggers(),this.$source=e,this.$rootSource=this.getRootSource(e),this.sourceKey=e.data("key"),this.rootSourceKey=this.$rootSource.data("key"),this.setInstanceState("selectedSource",this.sourceKey),this.sourceSelect.selectItem(e),Craft.cp.updateContentHeading(),this.searching&&(this.searchText=null,this.$search.val(""),this.stopSearching()),this.$statusMenuBtn.length&&(Garnish.hasAttr(this.$source,"data-override-status")?this.$statusMenuContainer.addClass("hidden"):this.$statusMenuContainer.removeClass("hidden"),this.trashed)){var i=this.statusMenu.$options.first();this.setStatus(i.data("status"))}if(this.$viewModeBtnContainer&&this.$viewModeBtnContainer.remove(),this.viewModeBtns={},this.viewMode=null,this.sourceViewModes=this.getViewModesForSource(),this.sourceViewModes.length>1){this.$viewModeBtnContainer=$('<section class="btngroup btngroup--exclusive"/>').attr("aria-label",Craft.t("app","View")),this.activeViewMenu?this.$viewModeBtnContainer.insertBefore(this.activeViewMenu.$trigger):this.$viewModeBtnContainer.appendTo(this.$toolbar);for(var s=0;s<this.sourceViewModes.length;s++){var a=this.sourceViewModes[s],n=$("<button/>",{type:"button",class:"btn"+(void 0!==a.className?" ".concat(a.className):""),"data-view":a.mode,"data-icon":a.icon,"aria-label":a.title,"aria-pressed":"false",title:a.title}).appendTo(this.$viewModeBtnContainer);this.viewModeBtns[a.mode]=n,this.addListener(n,"click",{mode:a.mode},(function(t){this.selectViewMode(t.data.mode),this.updateElements()}))}}var r=this.getSelectedViewMode();if(r&&this.doesSourceHaveViewMode(r)||(r=this.viewMode&&this.doesSourceHaveViewMode(this.viewMode)?this.viewMode:this.sourceViewModes[0].mode),this.selectViewMode(r),this.updateSourceMenu(),this.updateViewMenu(),this.updateFilterBtn(),this.onSelectSource(),"index"===this.settings.context){var o=Craft.getQueryParams();o.source=this.sourceKey,Craft.setUrl(Craft.getUrl(Craft.path,o))}return!0},selectSourceByKey:function(t){var e=this.getSourceByKey(t);return!!e&&this.selectSource(e)},getSortOptions:function(t){var e=((t=t||this.$rootSource)?t.data("sort-opts"):null)||[];return e.find((function(t){return"structure"!==t.attr}))||e.push({label:Craft.t("app","Title"),attr:"title",defaultDir:"asc"}),e},getSortOption:function(t,e){return this.getSortOptions(e).find((function(e){return e.attr===t}))||null},getDefaultSort:function(t){if(t=t||this.$rootSource){var e=t.data("default-sort");if(e){"string"==typeof e&&(e=[e]);var i=this.getSortOption(e[0],t);if(i)return e[1]||(e[1]=i.defaultDir),e}}var s=this.getSortOptions(t);return[s[0].attr,s[0].defaultDir]},getTableColumnOptions:function(t){return((t=t||this.$rootSource)?t.data("table-col-opts"):null)||[]},getTableColumnOption:function(t,e){return this.getTableColumnOptions(e).find((function(e){return e.attr===t}))||null},getDefaultTableColumns:function(t){return((t=t||this.$rootSource)?t.data("default-table-cols"):null)||[]},getSelectedTableColumns:function(t){var e=this;if(t=t||this.$rootSource){var i=this.getSourceState(t.data("key"),"tableColumns");if(i)return i.filter((function(i){return!!e.getTableColumnOption(i,t)}))}return this.getDefaultTableColumns(t)},setSelectedTableColumns:function(t){this.setSelecetedSourceState({tableColumns:t}),this.activeViewMenu&&this.activeViewMenu.updateTableColumnField()},getViewModesForSource:function(){var t=[{mode:"table",title:Craft.t("app","Display in a table"),icon:"list"}];return this.$source&&Garnish.hasAttr(this.$source,"data-has-thumbs")&&t.push({mode:"thumbs",title:Craft.t("app","Display as thumbnails"),icon:"grid"}),t},doesSourceHaveViewMode:function(t){for(var e=0;e<this.sourceViewModes.length;e++)if(this.sourceViewModes[e].mode===t)return!0;return!1},selectViewMode:function(t,e){e||this.doesSourceHaveViewMode(t)||(t=this.sourceViewModes[0].mode),t!==this.viewMode&&(this.viewMode&&void 0!==this.viewModeBtns[this.viewMode]&&this.viewModeBtns[this.viewMode].removeClass("active").attr("aria-pressed","false"),this.viewMode=t,this.setSelecetedSourceState("mode",this.viewMode),void 0!==this.viewModeBtns[this.viewMode]&&this.viewModeBtns[this.viewMode].addClass("active").attr("aria-pressed","true"))},createView:function(t,e){return new(this.getViewClass(t))(this,this.$elements,e)},getViewClass:function(t){switch(t){case"table":return Craft.TableElementIndexView;case"thumbs":return Craft.ThumbsElementIndexView;default:throw'View mode "'.concat(t,'" not supported.')}},rememberDisabledElementId:function(t){-1===$.inArray(t,this.settings.disabledElementIds)&&this.settings.disabledElementIds.push(t)},forgetDisabledElementId:function(t){var e=$.inArray(t,this.settings.disabledElementIds);-1!==e&&this.settings.disabledElementIds.splice(e,1)},enableElements:function(t){t.removeClass("disabled").parents(".disabled").removeClass("disabled");for(var e=0;e<t.length;e++){var i=$(t[e]).data("id");this.forgetDisabledElementId(i)}this.onEnableElements(t)},disableElements:function(t){t.removeClass("sel").addClass("disabled");for(var e=0;e<t.length;e++){var i=$(t[e]).data("id");this.rememberDisabledElementId(i)}this.onDisableElements(t)},getElementById:function(t){return this.view.getElementById(t)},enableElementsById:function(t){t=$.makeArray(t);for(var e=0;e<t.length;e++){var i=t[e],s=this.getElementById(i);s&&s.length?this.enableElements(s):this.forgetDisabledElementId(i)}},disableElementsById:function(t){t=$.makeArray(t);for(var e=0;e<t.length;e++){var i=t[e],s=this.getElementById(i);s&&s.length?this.disableElements(s):this.rememberDisabledElementId(i)}},selectElementAfterUpdate:function(t){null===this._autoSelectElements&&(this._autoSelectElements=[]),this._autoSelectElements.push(t)},addButton:function(t){this.getButtonContainer().append(t)},isShowingSidebar:function(){return null===this.showingSidebar&&(this.showingSidebar=this.$sidebar.length&&!this.$sidebar.hasClass("hidden")),this.showingSidebar},getButtonContainer:function(){if(this.settings.buttonContainer)return $(this.settings.buttonContainer);var t=$("#action-buttons");return t.length||(t=$('<div id="action-buttons"/>').appendTo($("#header"))),t},setIndexBusy:function(){this.$elements.addClass("busy"),this.$updateSpinner.appendTo(this.$elements),this.isIndexBusy=!0},setIndexAvailable:function(){this.$elements.removeClass("busy"),this.$updateSpinner.remove(),this.isIndexBusy=!1},createCustomizeSourcesModal:function(){var t=new Craft.CustomizeSourcesModal(this,{onHide:function(){t.destroy()}});return t},disable:function(){this.sourceSelect&&this.sourceSelect.disable(),this.view&&this.view.disable(),this.base()},enable:function(){this.sourceSelect&&this.sourceSelect.enable(),this.view&&this.view.enable(),this.base()},onAfterInit:function(){this.settings.onAfterInit(),this.trigger("afterInit")},onSelectSource:function(){this.settings.onSelectSource(this.sourceKey),this.trigger("selectSource",{sourceKey:this.sourceKey})},onSelectSite:function(){this.settings.onSelectSite(this.siteId),this.trigger("selectSite",{siteId:this.siteId})},onUpdateElements:function(){this.settings.onUpdateElements(),this.trigger("updateElements")},onSelectionChange:function(){this.settings.onSelectionChange(),this.trigger("selectionChange")},onEnableElements:function(t){this.settings.onEnableElements(t),this.trigger("enableElements",{elements:t})},onDisableElements:function(t){this.settings.onDisableElements(t),this.trigger("disableElements",{elements:t})},onAfterAction:function(t,e){this.settings.onAfterAction(t,e),this.trigger("afterAction",{action:t,params:e})},_handleSourceSelectionChange:function(){this.sourceSelect.totalSelected?this.selectSource(this.sourceSelect.$selectedItems)&&this.updateElements():this.sourceSelect.selectItem(this.$visibleSources.first())},_handleActionTriggerSubmit:function(t){t.preventDefault();var e=$(t.currentTarget);e.hasClass("disabled")||e.data("custom-handler")||this.submitAction(e.data("action"),Garnish.getPostData(e))},_handleMenuActionTriggerSubmit:function(t){var e=$(t.option);e.hasClass("disabled")||e.data("custom-handler")||this.submitAction(e.data("action"))},_handleStatusChange:function(t){this.statusMenu.$options.removeClass("sel");var e=$(t.selectedOption).addClass("sel");this.$statusMenuBtn.html(e.html()),this.trashed=!1,this.drafts=!1,this.status=null;var i=null;Garnish.hasAttr(e,"data-trashed")?(this.trashed=!0,i="trashed"):Garnish.hasAttr(e,"data-drafts")?(this.drafts=!0,i="drafts"):this.status=i=e.data("status")||null,this.activeViewMenu&&this.activeViewMenu.updateSortField(),Craft.setQueryParam("status",i),this.updateElements()},_handleSiteChange:function(t){this.siteMenu.$options.removeClass("sel");var e=$(t.selectedOption).addClass("sel");this.$siteMenuBtn.html(e.html()),this._setSite(e.data("site-id")),this.onSelectSite()},_setSite:function(t){var e=null===this.siteId;this.siteId=t,this.updateSourceVisibility(),!this.initialized||e||this.$source&&this.$source.length||!this.$visibleSources.length||this.selectSource(this.$visibleSources[0]);for(var i,s=this.getSourceContainer().children(".heading"),a=0;a<s.length;a++)0!==(i=s.eq(a)).has("> ul > li:not(.hidden)").length?i.removeClass("hidden"):i.addClass("hidden");this.initialized&&("index"===this.settings.context&&Craft.cp.setSiteId(t),this.updateElements(),this.updateFilterBtn())},updateSourceVisibility:function(){this.$visibleSources=$();for(var t=0;t<this.$sources.length;t++){var e=this.$sources.eq(t);Garnish.hasAttr(e,"data-disabled")||void 0!==e.data("sites")&&-1===e.data("sites").toString().split(",").indexOf(this.siteId.toString())?(e.parent().addClass("hidden"),this.$source&&this.$source.get(0)===e.get(0)&&(this.$source=null,this.$rootSource=null,this.sourceKey=null,this.rootSourceKey=null)):(e.parent().removeClass("hidden"),this.$visibleSources=this.$visibleSources.add(e))}},_handleSelectionChange:function(){this.updateActionTriggers(),this.onSelectionChange()},_handleSourceDblClick:function(t){this._toggleSource($(t.currentTarget)),t.stopPropagation()},_handleSourceToggleClick:function(t){this._toggleSource($(t.currentTarget).prev("a")),t.stopPropagation()},_getSourcesInList:function(t,e){var i=t.find("> li:not(.heading) > a");return e&&(i=i.add(t.find("> li.heading > ul > li > a"))),i},_getChildSources:function(t){var e=t.siblings("ul");return this._getSourcesInList(e)},_getSourceToggle:function(t){return t.siblings(".toggle")},_toggleSource:function(t){t.parent("li").hasClass("expanded")?this._collapseSource(t):this._expandSource(t)},_expandSource:function(t){t.next(".toggle").attr({"aria-expanded":"true","aria-label":Craft.t("app","Hide nested sources")}),t.parent("li").addClass("expanded");for(var e=this._getChildSources(t),i=0;i<e.length;i++)this.initSource($(e[i])),this.$visibleSources&&(this.$visibleSources=this.$visibleSources.add(e[i]));var s=t.data("key");-1===this.instanceState.expandedSources.indexOf(s)&&(this.instanceState.expandedSources.push(s),this.storeInstanceState())},_collapseSource:function(t){t.next(".toggle").attr({"aria-expanded":"false","aria-label":Craft.t("app","Show nested sources")}),t.parent("li").removeClass("expanded");for(var e=this._getChildSources(t),i=0;i<e.length;i++)this.deinitSource($(e[i])),this.$visibleSources=this.$visibleSources.not(e[i]);var s=this.instanceState.expandedSources.indexOf(t.data("key"));-1!==s&&(this.instanceState.expandedSources.splice(s,1),this.storeInstanceState())},_isViewPaginated:function(){return"index"===this.settings.context&&"structure"!==this.getSortAttributeAndDirection()[0]},_updateView:function(t,e){var i=this;this.actions&&(this.hideActionTriggers(),this.actions=this.actionsHeadHtml=this.actionsBodyHtml=this._$triggers=null);var s=document.activeElement;this.$countContainer.length&&(this.$countSpinner.removeClass("hidden"),this.$countContainer.html(""),this._countResults().then((function(t){i.$countSpinner.addClass("hidden");var e=Craft.elementTypeNames[i.elementType]?Craft.elementTypeNames[i.elementType][2]:i.settings.elementTypeName.toLowerCase(),s=Craft.elementTypeNames[i.elementType]?Craft.elementTypeNames[i.elementType][3]:i.settings.elementTypePluralName.toLowerCase();if(i._isViewPaginated()){var a=Math.min(i.settings.batchSize*(i.page-1)+1,t),n=Math.min(a+(i.settings.batchSize-1),t),r=Craft.t("app","{first, number}-{last, number} of {total, number} {total, plural, =1{{item}} other{{items}}}",{first:a,last:n,total:t,item:e,items:s}),o=$('<div class="flex pagination"/>').appendTo(i.$countContainer),l=Math.max(Math.ceil(t/i.settings.batchSize),1),h=$("<nav/>",{class:"flex","aria-label":Craft.t("app","{element} pagination",{element:e})}).appendTo(o),d=$("<button/>",{role:"button",class:"page-link prev-page"+(i.page>1?"":" disabled"),disabled:1===i.page,title:Craft.t("app","Previous Page")}).appendTo(h),c=$("<button/>",{role:"button",class:"page-link next-page"+(i.page<l?"":" disabled"),disabled:i.page===l,title:Craft.t("app","Next Page")}).appendTo(h);$("<div/>",{class:"page-info",text:r}).appendTo(o),i.page>1&&i.addListener(d,"click",(function(){this.removeListener(d,"click"),this.removeListener(c,"click"),this.setPage(this.page-1),this.updateElements(!0,!0)})),i.page<l&&i.addListener(c,"click",(function(){this.removeListener(d,"click"),this.removeListener(c,"click"),this.setPage(this.page+1),this.updateElements(!0,!0)}))}else{var u=Craft.t("app","{total, number} {total, plural, =1{{item}} other{{items}}}",{total:t,item:e,items:s});i.$countContainer.text(u)}})).catch((function(){i.$countSpinner.addClass("hidden")}))),this.$elements.html(e.html),Craft.appendHeadHtml(e.headHtml),Craft.appendBodyHtml(e.bodyHtml),this.$selectAllContainer=this.$elements.find(".selectallcontainer:first"),e.actions&&e.actions.length?this.$selectAllContainer.length&&(this.actions=e.actions,this.actionsHeadHtml=e.actionsHeadHtml,this.actionsBodyHtml=e.actionsBodyHtml,this.$selectAllCheckbox=$('<div class="checkbox"/>').prependTo(this.$selectAllContainer).attr({role:"checkbox",tabindex:"0","aria-checked":"false","aria-label":Craft.t("app","Select all")}),this.addListener(this.$selectAllCheckbox,"click",(function(){0===this.view.getSelectedElements().length?this.view.selectAllElements():this.view.deselectAllElements()})),this.addListener(this.$selectAllCheckbox,"keydown",(function(t){t.keyCode===Garnish.SPACE_KEY&&(t.preventDefault(),$(t.currentTarget).trigger("click"))}))):(this.$selectAllContainer.siblings().length||this.$selectAllContainer.parent(".header").remove(),this.$selectAllContainer.remove()),this.exporters=e.exporters,this.exportersByType=Craft.index(this.exporters||[],(function(t){return t.type})),this.exporters&&this.exporters.length?this.$exportBtn.removeClass("hidden"):this.$exportBtn.addClass("hidden");var a=this.actions||this.settings.selectable;if(this.view=this.createView(this.getSelectedViewMode(),{context:this.settings.context,batchSize:"index"!==this.settings.context||"structure"===this.getSortAttributeAndDirection()[0]?this.settings.batchSize:null,params:t,selectable:a,multiSelect:this.actions||this.settings.multiSelect,checkboxMode:!!this.actions,onSelectionChange:this._handleSelectionChange.bind(this)}),s&&s.id&&!document.body.contains(s)&&$("#".concat(s.id)).focus(),this._autoSelectElements){if(a)for(var n=0;n<this._autoSelectElements.length;n++)this.view.selectElementById(this._autoSelectElements[n]);this._autoSelectElements=null}this.onUpdateElements()},_updateBadgeCounts:function(t){for(var e in t)if(t.hasOwnProperty(e)){var i=this.getSourceByKey(e);if(i){var s=i.children(".badge");null!==t[e]?(s.length||(s=$('<span class="badge"/>').appendTo(i)),s.text(t[e])):s&&s.remove()}}},_countResults:function(){var t=this;return new Promise((function(e,i){if(null!==t.totalResults)e(t.totalResults);else{var s=t.getViewParams();delete s.criteria.offset,delete s.criteria.limit,null===t.resultSet&&(t.resultSet=Math.floor(1e8*Math.random())),s.resultSet=t.resultSet,Craft.sendActionRequest("POST",t.settings.countElementsAction,{data:s,cancelToken:t._createCancelToken()}).then((function(s){s.data.resultSet==t.resultSet?(t.totalResults=s.data.count,e(s.data.count)):i()})).catch(i)}}))},_createTriggers:function(){var t,e,i=[],s=[],a=[];for(t=0;t<this.actions.length;t++){var n=this.actions[t];if(n.trigger){var r=$('<form id="'+Craft.formatInputId(n.type)+'-actiontrigger"/>').data("action",n).append(n.trigger);this.addListener(r,"submit","_handleActionTriggerSubmit"),i.push(r)}else n.destructive?a.push(n):s.push(n)}if(s.length||a.length){var o=$("<form/>");e=$("<button/>",{type:"button",class:"btn menubtn","data-icon":"settings",title:Craft.t("app","Actions")}).appendTo(o);var l=$('<ul class="menu"/>').appendTo(o),h=this._createMenuTriggerList(s,!1),d=this._createMenuTriggerList(a,!0);h&&h.appendTo(l),h&&d&&$("<hr/>").appendTo(l),d&&d.appendTo(l),i.push(o)}for(this._$triggers=$(),t=0;t<i.length;t++){var c=$("<div/>").append(i[t]);this._$triggers=this._$triggers.add(c)}this._$triggers.appendTo(this.$actionsContainer),Craft.appendHeadHtml(this.actionsHeadHtml),Craft.appendBodyHtml(this.actionsBodyHtml),Craft.initUiElements(this._$triggers),e&&e.data("menubtn").on("optionSelect",this._handleMenuActionTriggerSubmit.bind(this))},_showExportHud:function(){var t=this;this.$exportBtn.addClass("active"),this.$exportBtn.attr("aria-expanded","true");for(var e=$("<form/>",{class:"export-form"}),i=[],s=0;s<this.exporters.length;s++)i.push({label:this.exporters[s].name,value:this.exporters[s].type});var a=Craft.ui.createSelectField({label:Craft.t("app","Export Type"),options:i,class:"fullwidth"}).appendTo(e),n=Craft.ui.createSelectField({label:Craft.t("app","Format"),options:[{label:"CSV",value:"csv"},{label:"JSON",value:"json"},{label:"XML",value:"xml"}],class:"fullwidth"}).appendTo(e),r=a.find("select");this.addListener(r,"change",(function(){var e=r.val();t.exportersByType[e].formattable?n.removeClass("hidden"):n.addClass("hidden")})),r.trigger("change");var o=this.view.getSelectedElementIds();if(!o.length)var l=Craft.ui.createTextField({label:Craft.t("app","Limit"),placeholder:Craft.t("app","No limit"),type:"number",min:1}).appendTo(e);var h=Craft.ui.createSubmitButton({class:"fullwidth",label:Craft.t("app","Export"),spinner:!0}).appendTo(e);new Garnish.HUD(this.$exportBtn,e).on("hide",(function(){t.$exportBtn.removeClass("active"),t.$exportBtn.attr("aria-expanded","false")}));var d=!1;this.addListener(e,"submit",(function(t){var e=this;if(t.preventDefault(),!d){d=!0,h.addClass("loading");var i=this.getViewParams();if(delete i.criteria.offset,delete i.criteria.limit,delete i.collapsedElementIds,i.type=a.find("select").val(),i.format=n.find("select").val(),o.length)i.criteria.id=o;else{var s=parseInt(l.find("input").val());s&&!isNaN(s)&&(i.criteria.limit=s)}Craft.csrfTokenValue&&(i[Craft.csrfTokenName]=Craft.csrfTokenValue),Craft.downloadFromUrl("POST",Craft.getActionUrl("element-indexes/export"),i).catch((function(){e._ignoreFailedRequest||Craft.cp.displayError(Craft.t("app","A server error occurred."))})).finally((function(){d=!1,h.removeClass("loading")}))}}))},_createMenuTriggerList:function(t,e){if(t&&t.length){for(var i=$("<ul/>"),s=0;s<t.length;s++)$("<li/>").append($("<a/>",{id:Craft.formatInputId(t[s].type)+"-actiontrigger",class:e?"error":null,data:{action:t[s]},text:t[s].name})).appendTo(i);return i}},showFilterHud:function(){this.filterHuds[this.siteId]||(this.filterHuds[this.siteId]={}),this.filterHuds[this.siteId][this.sourceKey]?this.filterHuds[this.siteId][this.sourceKey].show():(this.filterHuds[this.siteId][this.sourceKey]=new o(this,this.sourceKey,this.siteId),this.updateFilterBtn())},updateFilterBtn:function(){this.$filterBtn.removeClass("active"),this.filterHuds[this.siteId]&&this.filterHuds[this.siteId][this.sourceKey]?(this.$filterBtn.attr("aria-controls",this.filterHuds[this.siteId][this.sourceKey].id).attr("aria-expanded",this.filterHuds[this.siteId][this.sourceKey].showing?"true":"false"),(this.filterHuds[this.siteId][this.sourceKey].showing||this.filterHuds[this.siteId][this.sourceKey].hasRules())&&this.$filterBtn.addClass("active")):this.$filterBtn.attr("aria-controls",null)}},{defaults:{context:"index",modal:null,storageKey:null,condition:null,criteria:null,batchSize:100,disabledElementIds:[],selectable:!1,multiSelect:!1,buttonContainer:null,hideSidebar:!1,toolbarSelector:".toolbar:first",refreshSourcesAction:"element-indexes/get-source-tree-html",updateElementsAction:"element-indexes/get-elements",countElementsAction:"element-indexes/count-elements",submitActionsAction:"element-indexes/perform-action",defaultSiteId:null,defaultSource:null,canHaveDrafts:!1,elementTypeName:Craft.t("app","Element"),elementTypePluralName:Craft.t("app","Elements"),onAfterInit:$.noop,onSelectSource:$.noop,onSelectSite:$.noop,onUpdateElements:$.noop,onSelectionChange:$.noop,onEnableElements:$.noop,onDisableElements:$.noop,onAfterAction:$.noop}});var r=Garnish.Base.extend({elementIndex:null,$source:null,sourceKey:null,menu:null,id:null,$trigger:null,$container:null,$sortAttributeSelect:null,$sortDirectionPicker:null,sortDirectionListbox:null,$tableColumnsContainer:null,$revertContainer:null,$revertBtn:null,$closeBtn:null,init:function(t,e){var i=this;this.elementIndex=t,this.$source=e,this.sourceKey=e.data("key"),this.id="view-menu-".concat(Math.floor(1e9*Math.random())),this.$trigger=$("<button/>",{type:"button",class:"btn menubtn hidden",text:Craft.t("app","View"),"aria-label":Craft.t("app","View settings"),"aria-controls":this.id,"data-icon":"sliders"}).appendTo(this.elementIndex.$toolbar),this.$container=$("<div/>",{id:this.id,class:"menu menu--disclosure element-index-view-menu","data-align":"right"}).appendTo(Garnish.$bod),this._buildMenu(),this.addListener(this.$container,"mousedown",(function(t){t.stopPropagation()})),this.menu=new Garnish.DisclosureMenu(this.$trigger),this.menu.on("show",(function(){i.$trigger.addClass("active")})),this.menu.on("hide",(function(){i.$trigger.removeClass("active"),setTimeout((function(){i.tidyTableColumnField()}),Garnish.FX_DURATION)}))},showTrigger:function(){this.$trigger.removeClass("hidden")},hideTrigger:function(){this.$trigger.data("trigger").hide(),this.$trigger.addClass("hidden"),this.menu.hide()},updateSortField:function(){var t=s(this.elementIndex.getSortAttributeAndDirection(),2),e=t[0],i=t[1],a=this.$sortAttributeSelect.children('option[value="score"]');this.elementIndex.searching?a.length||this.$sortAttributeSelect.prepend($("<option/>",{value:"score",text:Craft.t("app","Score")})):a.length&&a.remove(),this.$sortAttributeSelect.val(e),this.sortDirectionListbox.select("asc"===i?0:1),["structure","score"].includes(e)?(this.sortDirectionListbox.disable(),this.$sortDirectionPicker.addClass("disabled")):(this.sortDirectionListbox.enable(),this.$sortDirectionPicker.removeClass("disabled")),this.elementIndex.canSortByStructure()?this.$sortAttributeSelect.children('option[value="structure"]').removeAttr("disabled"):this.$sortAttributeSelect.children('option[value="structure"]').attr("disabled","disabled")},updateTableColumnField:function(){var t,e,i=this,s=this.elementIndex.getSelectedTableColumns();s.forEach((function(s){var a=i.$tableColumnsContainer.find('input[value="'.concat(s,'"]'));a.prop("checked")||a.prop("checked",!0);var n=a.parent();t&&n.index()<e&&n.insertAfter(t),t=n,e=n.index()}));for(var a=this._getTableColumnCheckboxes(),n=0;n<a.length;n++){var r=a.eq(n);r.prop("checked")&&!s.includes(r.val())&&r.prop("checked",!1)}},tidyTableColumnField:function(){var t=this.elementIndex.getTableColumnOptions(this.$source).map((function(t){return t.attr})).reduce((function(t,s,a){return e(e({},t),{},i({},s,a))}),{});this.$tableColumnsContainer.children().sort((function(e,i){var s=$(e).children('input[type="checkbox"]')[0],a=$(i).children('input[type="checkbox"]')[0];return s.checked&&a.checked?0:s.checked||a.checked?s.checked?-1:1:t[s.value]<t[a.value]?-1:1})).appendTo(this.$tableColumnsContainer)},revert:function(){this.elementIndex.setSelecetedSourceState({order:null,sort:null,tableColumns:null}),this.updateSortField(),this.updateTableColumnField(),this.tidyTableColumnField(),this.$revertBtn.remove(),this.$revertBtn=null,this.$closeBtn.focus(),this.elementIndex.updateElements()},_buildMenu:function(){var t=this,e=$('<div class="meta"/>').appendTo(this.$container);this._createSortField().appendTo(e),this._createTableColumnsField().appendTo(e),this.$sortAttributeSelect.focus();var i=$("<div/>",{class:"flex menu-footer"}).appendTo(this.$container);this.$revertContainer=$("<div/>",{class:"flex-grow"}).appendTo(i),(this.elementIndex.getSelectedSourceState("order")||this.elementIndex.getSelectedSourceState("sort")||this.elementIndex.getSelectedSourceState("tableColumns"))&&this._createRevertBtn(),this.$closeBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Close")}).appendTo(i).on("click",(function(){t.menu.hide()}))},_createSortField:function(){var t=this,e=$('<div class="flex"/>'),i=Craft.ui.createSelect({options:this.elementIndex.getSortOptions(this.$source).map((function(t){return{label:t.label,value:t.attr}}))}).addClass("fullwidth").appendTo($('<div class="flex-grow"/>').appendTo(e));this.$sortAttributeSelect=i.children("select").attr({"aria-label":Craft.t("app","Sort attribute")}),this.$sortDirectionPicker=$("<section/>",{class:"btngroup btngroup--exclusive","aria-label":Craft.t("app","Sort direction")}).append($("<button/>",{type:"button",class:"btn",title:Craft.t("app","Sort ascending"),"aria-label":Craft.t("app","Sort ascending"),"aria-pressed":"false","data-icon":"asc","data-dir":"asc"})).append($("<button/>",{type:"button",class:"btn",title:Craft.t("app","Sort descending"),"aria-label":Craft.t("app","Sort descending"),"aria-pressed":"false","data-icon":"desc","data-dir":"desc"})).appendTo(e),this.sortDirectionListbox=new Craft.Listbox(this.$sortDirectionPicker,{onChange:function(e){e.data("dir")!==t.elementIndex.getSelectedSortDirection()&&(t.elementIndex.setSelectedSortAttribute(t.$sortAttributeSelect.val(),e.data("dir")),t.elementIndex.updateElements(),t._createRevertBtn())}}),this.$sortAttributeSelect.on("change",(function(){t.elementIndex.setSelectedSortAttribute(t.$sortAttributeSelect.val(),null,!1),t.elementIndex.updateElements(),t._createRevertBtn()})),this.updateSortField();var s=Craft.ui.createField(e,{label:Craft.t("app","Sort by"),fieldset:!0});return s.addClass("sort-field"),s},_getTableColumnCheckboxes:function(){return this.$tableColumnsContainer.find('input[type="checkbox"]')},_createTableColumnsField:function(){var t=this,e=this.elementIndex.getTableColumnOptions(this.$source);if(!e.length)return $();this.$tableColumnsContainer=$("<div/>"),e.forEach((function(e){$('<div class="element-index-view-menu-table-column"/>').append('<div class="icon move"/>').append(Craft.ui.createCheckbox({label:Craft.escapeHtml(e.label),value:e.attr})).appendTo(t.$tableColumnsContainer)})),this.updateTableColumnField(),this.tidyTableColumnField(),new Garnish.DragSort(this.$tableColumnsContainer.children(),{handle:".move",axis:"y",onSortChange:function(){t._onTableColumnChange()}}),this._getTableColumnCheckboxes().on("change",(function(e){t._onTableColumnChange()}));var i=Craft.ui.createField(this.$tableColumnsContainer,{label:Craft.t("app","Table Columns"),fieldset:!0});return i.addClass("table-columns-field"),i},_onTableColumnChange:function(){for(var t=[],e=this._getTableColumnCheckboxes().filter(":checked"),i=0;i<e.length;i++)t.push(e.eq(i).val());Craft.compare(t,this.elementIndex.getSelectedTableColumns(this.$source))||(this.elementIndex.setSelectedTableColumns(t,!1),this.elementIndex.updateElements(),this._createRevertBtn())},_createRevertBtn:function(){var t=this;this.$revertBtn||(this.$revertBtn=$("<button/>",{type:"button",class:"light",text:Craft.t("app","Use defaults")}).appendTo(this.$revertContainer).on("click",(function(){t.revert()})))},destroy:function(){this.menu.destroy(),delete this.menu,this.base()}}),o=Garnish.HUD.extend({elementIndex:null,sourceKey:null,siteId:null,id:null,loading:!0,serialized:null,$clearBtn:null,cleared:!1,init:function(t,e,i){var s=this;this.elementIndex=t,this.sourceKey=e,this.siteId=i,this.id="filter-".concat(Math.floor(1e9*Math.random()));var a=$("<div/>").append($("<div/>",{class:"spinner"})).append($("<div/>",{text:Craft.t("app","Loading"),class:"visually-hidden","aria-role":"alert"}));this.base(this.elementIndex.$filterBtn,a,{hudClass:"hud element-filter-hud loading"}),this.$hud.attr({id:this.id,"aria-live":"polite","aria-busy":"false"}),this.$tip.remove(),this.$tip=null,this.$body.on("submit",(function(t){t.preventDefault(),s.hide()})),Craft.sendActionRequest("POST","element-indexes/filter-hud",{data:{elementType:this.elementIndex.elementType,source:this.sourceKey,condition:this.elementIndex.settings.condition,id:"".concat(this.id,"-filters")}}).then((function(t){s.loading=!1,s.$hud.removeClass("loading"),a.remove(),s.$main.append(t.data.hudHtml),Craft.appendHeadHtml(t.data.headHtml),Craft.appendBodyHtml(t.data.bodyHtml);var e=$("<div/>",{class:"flex flex-nowrap"}).appendTo(s.$main);$("<div/>",{class:"flex-grow"}).appendTo(e),s.$clearBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(e),$("<button/>",{type:"submit",class:"btn secondary",text:Craft.t("app","Apply")}).appendTo(e),s.$clearBtn.on("click",(function(){s.clear()})),s.$hud.find(".condition-container").on("htmx:beforeRequest",(function(){s.setBusy()})),s.$hud.find(".condition-container").on("htmx:load",(function(){s.setReady()})),s.setFocus()})).catch((function(){Craft.cp.displayError(Craft.t("app","A server error occurred."))})),this.$hud.css("position","fixed"),this.addListener(Garnish.$win,"scroll,resize",(function(){s.updateSizeAndPosition(!0)}))},addListener:function(t,e,i,s){t===this.$main&&"resize"===e||this.base(t,e,i,s)},setBusy:function(){this.$hud.attr("aria-busy","true"),$("<div/>",{class:"visually-hidden",text:Craft.t("app","Loading")}).insertAfter(this.$main.find(".htmx-indicator"))},setReady:function(){this.$hud.attr("aria-busy","false")},setFocus:function(){Garnish.setFocusWithin(this.$main)},clear:function(){this.cleared=!0,this.hide()},updateSizeAndPositionInternal:function(){var t=this.elementIndex.$searchContainer[0].getBoundingClientRect();this.$hud.css({width:this.elementIndex.$searchContainer.outerWidth()-2,top:t.top+this.elementIndex.$searchContainer.outerHeight(),left:t.left+1})},onShow:function(){this.base(),this.$clearBtn&&this.$clearBtn.text(Craft.t("app","Clear")),this.elementIndex.updateFilterBtn(),this.setFocus()},onHide:function(){this.base(),this.serialized!==(this.serialized=this.serialize())&&this.elementIndex.updateElements(),this.cleared?this.destroy():(this.$hud.detach(),this.$shade.detach()),this.elementIndex.updateFilterBtn(),this.elementIndex.$filterBtn.focus()},hasRules:function(){return 0!==this.$main.has(".condition-rule").length},serialize:function(){return!this.cleared&&this.hasRules()?this.$body.serialize():null},destroy:function(){this.base(),delete this.elementIndex.filterHuds[this.siteId][this.sourceKey]}})},8495:function(){Craft.BaseElementIndexView=Garnish.Base.extend({$container:null,$loadingMoreSpinner:null,$elementContainer:null,$scroller:null,elementIndex:null,thumbLoader:null,elementSelect:null,loadingMore:!1,_totalVisible:null,_morePending:null,_handleEnableElements:null,_handleDisableElements:null,init:function(t,e,i){var s=this;this.elementIndex=t,this.$container=$(e),this.setSettings(i,Craft.BaseElementIndexView.defaults),this.$loadingMoreSpinner=$('<div class="centeralign hidden"><div class="spinner loadingmore"></div></div>').insertAfter(this.$container),this.$elementContainer=this.getElementContainer();var a=this.$elementContainer.children();this.setTotalVisible(a.length),this.setMorePending(this.settings.batchSize&&a.length==this.settings.batchSize),this.thumbLoader=new Craft.ElementThumbLoader,this.thumbLoader.load(a),this.settings.selectable&&(this.elementSelect=new Garnish.Select(this.$elementContainer,a.filter(":not(.disabled)"),{multi:this.settings.multiSelect,vertical:this.isVerticalList(),handle:"index"===this.settings.context?".checkbox, .element:first":null,filter:":not(a):not(.toggle)",checkboxMode:this.settings.checkboxMode,onSelectionChange:this.onSelectionChange.bind(this)}),this._handleEnableElements=function(t){s.elementSelect.addItems(t.elements)},this._handleDisableElements=function(t){s.elementSelect.removeItems(t.elements)},this.elementIndex.on("enableElements",this._handleEnableElements),this.elementIndex.on("disableElements",this._handleDisableElements)),"index"===this.settings.context&&(this._handleElementEditing=function(t){var e=$(t.target);if("A"!==e.prop("nodeName")){var i;if(e.hasClass("element"))i=e;else if(!(i=e.closest(".element")).length)return;Garnish.hasAttr(i,"data-editable")&&Craft.createElementEditor(i.data("type"),i)}},this.elementIndex.trashed||(this.addListener(this.$elementContainer,"dblclick",this._handleElementEditing),$.isTouchCapable()&&this.addListener(this.$elementContainer,"taphold",this._handleElementEditing))),this.afterInit(),this.settings.batchSize&&("index"===this.settings.context?this.$scroller=Garnish.$scrollContainer:this.$scroller=this.elementIndex.$main,this.$scroller.scrollTop(0),this.addListener(this.$scroller,"scroll","maybeLoadMore"),this.maybeLoadMore())},getElementContainer:function(){throw"Classes that extend Craft.BaseElementIndexView must supply a getElementContainer() method."},afterInit:function(){},getAllElements:function(){return this.$elementContainer.children()},getEnabledElements:function(){return this.$elementContainer.children(":not(.disabled)")},getElementById:function(t){var e=this.$elementContainer.children('[data-id="'+t+'"]:first');return e.length?e:null},getSelectedElements:function(){if(!this.elementSelect)throw"This view is not selectable.";return this.elementSelect.$selectedItems},getSelectedElementIds:function(){var t;try{t=this.getSelectedElements()}catch(t){}var e=[];if(t)for(var i=0;i<t.length;i++)e.push(t.eq(i).data("id"));return e},selectElement:function(t){if(!this.elementSelect)throw"This view is not selectable.";return this.elementSelect.selectItem(t,!0),!0},selectElementById:function(t){if(!this.elementSelect)throw"This view is not selectable.";var e=this.getElementById(t);return!!e&&(this.elementSelect.selectItem(e,!0),!0)},selectAllElements:function(){this.elementSelect.selectAll()},deselectAllElements:function(){this.elementSelect.deselectAll()},isVerticalList:function(){return!1},getTotalVisible:function(){return this._totalVisible},setTotalVisible:function(t){this._totalVisible=t},getMorePending:function(){return this._morePending},setMorePending:function(t){this._morePending=t},maybeLoadMore:function(){this.canLoadMore()&&this.loadMore()},canLoadMore:function(){return!(!this.getMorePending()||!this.settings.batchSize)&&(this.$scroller[0]===Garnish.$win[0]?Garnish.$win.innerHeight()+Garnish.$win.scrollTop()>=this.$container.offset().top+this.$container.height():this.$scroller.prop("scrollHeight")-this.$scroller.scrollTop()<=this.$scroller.outerHeight()+15)},loadMore:function(){var t=this;this.getMorePending()&&!this.loadingMore&&this.settings.batchSize&&(this.loadingMore=!0,this.$loadingMoreSpinner.removeClass("hidden"),this.removeListener(this.$scroller,"scroll"),Craft.sendActionRequest("POST",this.settings.loadMoreElementsAction,{data:this.getLoadMoreParams()}).then((function(e){t.loadingMore=!1,t.$loadingMoreSpinner.addClass("hidden");var i=$(e.data.html);t.appendElements(i),Craft.appendHeadHtml(e.data.headHtml),Craft.appendBodyHtml(e.data.bodyHtml),t.elementSelect&&(t.elementSelect.addItems(i.filter(":not(.disabled)")),t.elementIndex.updateActionTriggers()),t.setTotalVisible(t.getTotalVisible()+i.length),t.setMorePending(i.length==t.settings.batchSize),t.addListener(t.$scroller,"scroll","maybeLoadMore"),t.maybeLoadMore()})).catch((function(e){t.loadingMore=!1,t.$loadingMoreSpinner.addClass("hidden")})))},getLoadMoreParams:function(){var t=$.extend(!0,{},this.settings.params);return t.criteria.offset=this.getTotalVisible(),t},appendElements:function(t){t.appendTo(this.$elementContainer),this.thumbLoader.load(t),this.onAppendElements(t)},onAppendElements:function(t){this.settings.onAppendElements(t),this.trigger("appendElements",{newElements:t})},onSelectionChange:function(){this.settings.onSelectionChange(),this.trigger("selectionChange")},disable:function(){this.elementSelect&&this.elementSelect.disable()},enable:function(){this.elementSelect&&this.elementSelect.enable()},destroy:function(){this.$loadingMoreSpinner.remove(),this.thumbLoader.destroy(),delete this.thumbLoader,this.elementSelect&&(this.elementIndex.off("enableElements",this._handleEnableElements),this.elementIndex.off("disableElements",this._handleDisableElements),this.elementSelect.destroy(),delete this.elementSelect),this.base()}},{defaults:{context:"index",batchSize:null,params:null,selectable:!1,multiSelect:!1,checkboxMode:!1,loadMoreElementsAction:"element-indexes/get-more-elements",onAppendElements:$.noop,onSelectionChange:$.noop}})},5970:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.BaseElementSelectInput=Garnish.Base.extend({thumbLoader:null,elementSelect:null,elementSort:null,modal:null,elementEditor:null,fieldLabel:null,$container:null,$form:null,$elementsContainer:null,$elements:null,$addElementBtn:null,$spinner:null,_initialized:!1,init:function(t){var e=this;if(!$.isPlainObject(t)){for(var i={},s=["id","name","elementType","sources","criteria","sourceElementId","limit","modalStorageKey","fieldId"],a=0;a<s.length&&void 0!==arguments[a];a++)i[s[a]]=arguments[a];t=i}this.setSettings(t,Craft.BaseElementSelectInput.defaults),this.settings.modalStorageKey&&(this.modalStorageKey="BaseElementSelectInput."+this.settings.modalStorageKey),(1==this.settings.limit||this.settings.maintainHierarchy)&&(this.settings.sortable=!1),this.$container=this.getContainer(),this.$form=this.$container.closest("form"),this.fieldLabel=this.getFieldLabel(),this.$container.data("elementSelect",this),this.$elementsContainer=this.getElementsContainer(),this.$addElementBtn=this.getAddElementsBtn(),this.$spinner=this.getSpinner(),this.thumbLoader=new Craft.ElementThumbLoader,this.initElementSelect(),this.initElementSort(),this.resetElements(),this.$addElementBtn&&this.addListener(this.$addElementBtn,"activate","showModal"),Garnish.requestAnimationFrame((function(){e._initialized=!0}))},get totalSelected(){return this.$elements.length},getContainer:function(){return $("#"+this.settings.id)},getFieldLabel:function(){if(this.$container)return this.$container.closest("fieldset").find("legend").first().data("label")},getElementsContainer:function(){return this.$container.children(".elements")},getElements:function(){return this.$elementsContainer.find(".element")},getAddElementsBtn:function(){return this.$container.find(".btn.add:first")},getSpinner:function(){return this.$container.find(".spinner")},initElementSelect:function(){this.settings.selectable&&(this.elementSelect=new Garnish.Select({multi:this.settings.sortable,filter:":not(.delete)"}))},initElementSort:function(){var t=this;this.settings.sortable&&(this.elementSort=new Garnish.DragSort({container:this.$elementsContainer,filter:this.settings.selectable?function(){return t.elementSort.$targetItem.hasClass("sel")?t.elementSelect.getSelectedItems():t.elementSort.$targetItem}:null,ignoreHandleSelector:".delete",axis:this.getElementSortAxis(),collapseDraggees:!0,magnetStrength:4,helperLagBase:1.5,onSortChange:this.settings.selectable?function(){t.elementSelect.resetItemOrder()}:null}))},getElementSortAxis:function(){return"list"===this.settings.viewMode?"y":null},canAddMoreElements:function(){return!this.settings.limit||this.$elements.length<this.settings.limit},updateAddElementsBtn:function(){this.canAddMoreElements()?this.enableAddElementsBtn():this.disableAddElementsBtn()},enableAddElementsBtn:function(){this.$addElementBtn&&this.$addElementBtn.removeClass("hidden"),this.updateButtonContainer()},disableAddElementsBtn:function(){this.$addElementBtn&&this.$addElementBtn.addClass("hidden"),this.updateButtonContainer()},showSpinner:function(){this.$spinner&&this.$spinner.removeClass("hidden"),this.updateButtonContainer()},hideSpinner:function(){this.$spinner&&this.$spinner.addClass("hidden"),this.updateButtonContainer()},updateButtonContainer:function(){var t=this.$addElementBtn&&this.$addElementBtn.parent(".flex");t&&t.length&&(t.children(":not(.hidden)").length?t.removeClass("hidden"):t.addClass("hidden"))},focusNextLogicalElement:function(){if(this.canAddMoreElements()){var t=this.$addElementBtn;t&&t.get(0).focus()}else this.focusLastRemoveBtn()},focusLastRemoveBtn:function(){var t=this.$container.find(".delete");t.length&&t.last()[0].focus()},resetElements:function(){null!==this.$elements?this.removeElements(this.$elements):this.$elements=$(),this.addElements(this.getElements())},addElements:function(t){var e=this;this.thumbLoader.load(t),this.settings.selectable&&this.elementSelect.addItems(t),this.settings.sortable&&this.elementSort.addItems(t),this.settings.editable&&(this._handleShowElementEditor=function(t){var i=$(t.currentTarget);!Garnish.hasAttr(i,"data-editable")||i.hasClass("disabled")||i.hasClass("loading")||(e.elementEditor=e.createElementEditor(i))},this.addListener(t,"dblclick",this._handleShowElementEditor),$.isTouchCapable()&&this.addListener(t,"taphold",this._handleShowElementEditor)),t.find(".delete").on("click dblclick",(function(t){e.removeElement($(t.currentTarget).closest(".element")),t.stopPropagation()})),t.on("keydown",(function(t){if([Garnish.BACKSPACE_KEY,Garnish.DELETE_KEY].includes(t.keyCode)){t.stopPropagation(),t.preventDefault();for(var i=e.elementSelect.getSelectedItems(),s=0;s<i.length;s++)e.removeElement(i.eq(s))}})),this.$elements=this.$elements.add(t),this.updateAddElementsBtn(),this.onAddElements()},createElementEditor:function(t,e){return e=Object.assign({elementSelectInput:this,prevalidate:this.settings.prevalidate},e),Craft.createElementEditor(this.settings.elementType,t,e)},replaceElement:function(t,e){var i=this;return new Promise((function(s,a){var n=i.$elements.filter('[data-id="'.concat(t,'"]'));if(n.length){i.showSpinner();var r={elementId:e,siteId:i.settings.criteria.siteId,thumbSize:i.settings.viewMode};Craft.sendActionRequest("POST","elements/get-element-html",{data:r}).then((function(t){i.removeElement(n);var e=Craft.getElementInfo(t.data.html);i.selectElements([e]),s()})).catch((function(t){var e=t.response;e&&e.data&&e.data.message?alert(e.data.message):Craft.cp.displayError(),a(e.data.message)})).finally((function(){i.hideSpinner()}))}else a("No element selected with an ID of ".concat(t,"."))}))},removeElements:function(t){if(this.settings.selectable&&this.elementSelect.removeItems(t),this.modal){for(var e=[],i=0;i<t.length;i++){var s=t.eq(i).data("id");s&&e.push(s)}e.length&&this.modal.elementIndex.enableElementsById(e)}var a;if(t.children("input").prop("disabled",!0),this.settings.selectable){var n=this.$elements.index(t.last());a=this.$elements.eq(n+1).find(".delete")}a.length?a.focus():this.focusNextLogicalElement(),this.$elements=this.$elements.not(t),this.updateAddElementsBtn(),this.onRemoveElements()},removeElement:function(t){if(this.settings.maintainHierarchy){var e=t.add(t.parent().siblings("ul").find(".element"));$("[name]",e).removeAttr("name"),this.removeElements(e);for(var i=0;i<e.length;i++)this._animateStructureElementAway(e,i)}else $("[name]",t).removeAttr("name"),this.removeElements(t),this.animateElementAway(t,(function(){t.remove()}))},animateElementAway:function(t,e){t.css("z-index",0);var i={opacity:-1};i["margin-"+Craft.left]=-(t.outerWidth()+parseInt(t.css("margin-"+Craft.right))),"list"!==this.settings.viewMode&&0!==this.$elements.length||(i["margin-bottom"]=-(t.outerHeight()+parseInt(t.css("margin-bottom")))),t.velocity(i,Craft.BaseElementSelectInput.REMOVE_FX_DURATION,(function(){e&&e()}))},showModal:function(){this.canAddMoreElements()&&(this.modal?this.modal.show():this.modal=this.createModal())},createModal:function(){return Craft.createElementSelectorModal(this.settings.elementType,this.getModalSettings())},getModalSettings:function(){return $.extend({closeOtherModals:!1,storageKey:this.modalStorageKey,sources:this.settings.sources,condition:this.settings.condition,criteria:this.settings.criteria,multiSelect:1!=this.settings.limit,hideOnSelect:!this.settings.maintainHierarchy,showSiteMenu:this.settings.showSiteMenu,disabledElementIds:this.getDisabledElementIds(),onSelect:this.onModalSelect.bind(this),onHide:this.onModalHide.bind(this),triggerElement:this.$addElementBtn,modalTitle:Craft.t("app","Select {element}",{element:this.fieldLabel})},this.settings.modalSettings)},getSelectedElementIds:function(){for(var t=[],e=0;e<this.$elements.length;e++)t.push(this.$elements.eq(e).data("id"));return t},getDisabledElementIds:function(){var e,i=this.getSelectedElementIds();return!this.settings.allowSelfRelations&&this.settings.sourceElementId&&i.push(this.settings.sourceElementId),this.settings.disabledElementIds&&i.push.apply(i,function(e){if(Array.isArray(e))return t(e)}(e=this.settings.disabledElementIds)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(e)||function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),i},onModalSelect:function(t){if(this.settings.maintainHierarchy)this.selectStructuredElements(t);else{if(this.settings.limit){var e=this.settings.limit-this.$elements.length;t.length>e&&(t=t.slice(0,e))}this.selectElements(t),this.updateDisabledElementsInModal()}},onModalHide:function(){var t=this;this.canAddMoreElements()||setTimeout((function(){t.focusNextLogicalElement()}),200)},selectElements:function(t){for(var e=0;e<t.length;e++){var i=t[e],s=this.createNewElement(i);this.appendElement(s),this.addElements(s),this.animateElementIntoPlace(i.$element,s),i.$element=s}this.onSelectElements(t)},selectStructuredElements:function(t){var e=this;this.modal.disable(),this.modal.disableCancelBtn(),this.modal.disableSelectBtn(),this.modal.showFooterSpinner();for(var i=this.getSelectedElementIds(),s=0;s<t.length;s++)i.push(t[s].id);var a={elementIds:i,siteId:t[0].siteId,containerId:this.settings.id,name:this.settings.name,branchLimit:this.settings.branchLimit,selectionLabel:this.settings.selectionLabel,elementType:this.settings.elementType},n=function(){e.modal.enable(),e.modal.enableCancelBtn(),e.modal.enableSelectBtn(),e.modal.hideFooterSpinner()};Craft.sendActionRequest("POST","relational-fields/structured-input-html",{data:a}).then((function(i){n();var s=$(i.data.html).children(".elements");e.$elementsContainer.replaceWith(s),e.$elementsContainer=s,e.resetElements();for(var a=[],r=0;r<t.length;r++){var o=t[r],l=e.getElementById(o.id);l&&(e.animateElementIntoPlace(o.$element,l),a.push(o))}e.updateDisabledElementsInModal(),e.modal.hide(),e.onSelectElements(a)})).catch((function(t){t.response,n()}))},createNewElement:function(t){var e=t.$element.clone(),i=Craft.t("app","Remove {label}",{label:Craft.escapeHtml(t.label)});return Craft.setElementSize(e,"large"===this.settings.viewMode?"large":"small"),e.addClass("removable").prepend($("<input/>",{type:"hidden",name:this.settings.name+(this.settings.single?"":"[]"),value:t.id})).prepend($("<button/>",{type:"button",class:"delete icon",title:Craft.t("app","Remove"),"aria-label":i})),e},appendElement:function(t){t.appendTo(this.$elementsContainer)},animateElementIntoPlace:function(t,e){var i=t.offset(),s=e.offset(),a=e.clone().appendTo(Garnish.$bod);e.css("visibility","hidden"),a.css({position:"absolute",zIndex:1e4,top:i.top,left:i.left});var n={top:s.top,left:s.left};a.velocity(n,Craft.BaseElementSelectInput.ADD_FX_DURATION,(function(){a.remove(),e.css("visibility","visible")}))},updateDisabledElementsInModal:function(){this.modal.elementIndex&&this.modal.elementIndex.disableElementsById(this.getDisabledElementIds())},getElementById:function(t){for(var e=0;e<this.$elements.length;e++){var i=this.$elements.eq(e);if(i.data("id")==t)return i}},onSelectElements:function(t){this.trigger("selectElements",{elements:t}),this.settings.onSelectElements(t),this.$container.trigger("change")},onAddElements:function(){this.trigger("addElements"),this.settings.onAddElements(),this.$container.trigger("change")},onRemoveElements:function(){this.trigger("removeElements"),this.settings.onRemoveElements(),this.$container.trigger("change")},_animateStructureElementAway:function(t,e){var i,s=this;e===t.length-1&&(i=function(){var e=t.first().parent().parent(),i=e.parent();i[0]===s.$elementsContainer[0]||e.siblings().length?e.remove():i.remove()});var a=function(){s.animateElementAway(t.eq(e),i)};0===e?a():setTimeout(a,100*e)}},{ADD_FX_DURATION:200,REMOVE_FX_DURATION:200,defaults:{id:null,name:null,fieldId:null,elementType:null,sources:null,condition:null,criteria:{},allowSelfRelations:!1,sourceElementId:null,disabledElementIds:null,viewMode:"list",single:!1,maintainHierarchy:!1,branchLimit:null,limit:null,showSiteMenu:!1,modalStorageKey:null,modalSettings:{},onAddElements:$.noop,onSelectElements:$.noop,onRemoveElements:$.noop,sortable:!0,selectable:!0,editable:!0,prevalidate:!1,editorSettings:{}}})},4993:function(){Craft.BaseElementSelectorModal=Garnish.Modal.extend({elementType:null,elementIndex:null,supportSidebarToggleView:!1,$body:null,$content:null,$footer:null,$selectBtn:null,$sidebar:null,$sources:null,$sourceToggles:null,$sidebarToggleBtn:null,$sidebarCloseBtn:null,$mainHeading:null,$main:null,$search:null,$elements:null,$tbody:null,$primaryButtons:null,$secondaryButtons:null,$cancelBtn:null,init:function(t,e){this.elementType=t,this.setSettings(e,Craft.BaseElementSelectorModal.defaults);var i="elementSelectorModalHeading-"+Date.now(),s=$('<div class="modal elementselectormodal" aria-labelledby="'+i+'"></div>').appendTo(Garnish.$bod),a=($('<h1 id="'+i+'" class="visually-hidden">'+this.settings.modalTitle+"</h1>").appendTo(s),$('<div class="body"><div class="spinner big"></div></div>').appendTo(s));this.$footer=$('<div class="footer"/>').appendTo(s),this.settings.fullscreen&&(s.addClass("fullscreen"),this.settings.minGutter=0),this.base(s,this.settings),this.$secondaryButtons=$('<div class="buttons left secondary-buttons"/>').appendTo(this.$footer),this.$primaryButtons=$('<div class="buttons right"/>').appendTo(this.$footer),this.$cancelBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(this.$primaryButtons),this.$selectBtn=Craft.ui.createSubmitButton({class:"disabled",label:Craft.t("app","Select"),spinner:!0}).attr("aria-disabled","true").appendTo(this.$primaryButtons),this.$body=a,this.addListener(this.$cancelBtn,"activate","cancel"),this.addListener(this.$selectBtn,"activate","selectElements")},updateModalBottomPadding:function(){var t=this.$footer.outerHeight();t!==parseInt(this.$container.css("padding-bottom"))&&this.$container.css("padding-bottom",t)},updateSidebarView:function(){this.supportSidebarToggleView&&(this.sidebarShouldBeHidden()?this.$sidebarToggleBtn||this.buildSidebarToggleView():this.$sidebarToggleBtn&&this.resetView())},sidebarShouldBeHidden:function(){return this.$container.outerWidth()<550},resetView:function(){this.$mainHeader&&this.$mainHeader.remove(),this.$sidebarHeader&&this.$sidebarHeader.remove(),this.$sidebarToggleBtn=null,this.$body.addClass("has-sidebar"),this.$content.addClass("has-sidebar"),this.$sidebar.removeClass("hidden")},buildSidebarToggleView:function(){var t=this;!this.$sidebarToggleBtn&&this.sidebarShouldBeHidden()&&(this.$sidebarHeader=$('<div class="sidebar-header"/>').prependTo(this.$sidebar),this.$sidebarCloseBtn=Craft.ui.createButton({class:"nav-close close-btn"}).attr("aria-label",Craft.t("app","Close")).removeClass("btn").appendTo(this.$sidebarHeader),this.$mainHeader=$('<div class="main-header"/>').prependTo(this.$main),this.$mainHeading=$('<h2 class="main-heading">'.concat(this.getActiveSourceName(),"</h2>")).appendTo(this.$mainHeader),this.$sidebarToggleBtn=Craft.ui.createButton({toggle:!0,controls:"modal-sidebar",class:"nav-toggle"}).removeClass("btn").attr("aria-label",Craft.t("app","Show sidebar")).appendTo(this.$mainHeader),this.$sidebar.attr("id","modal-sidebar"),this.closeSidebar(),this.addListener(this.$sidebarToggleBtn,"click",(function(){t.toggleSidebar()})),this.addListener(this.$sidebarCloseBtn,"click",(function(){t.toggleSidebar()})))},sidebarIsOpen:function(){return"true"===this.$sidebarToggleBtn.attr("aria-expanded")},toggleSidebar:function(){this.sidebarIsOpen()?this.closeSidebar():this.openSidebar()},openSidebar:function(){var t=this;this.$body.addClass("has-sidebar"),this.$content.addClass("has-sidebar"),this.$sidebar.removeClass("hidden"),this.$sidebarToggleBtn.attr("aria-expanded","true"),this.$sidebar.find(":focusable").first().focus(),Garnish.uiLayerManager.addLayer(this.$sidebar),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.closeSidebar();var e=Garnish.getFocusedElement();$.contains(t.$sidebar.get(0),e.get(0))&&t.$sidebarToggleBtn.focus()}))},closeSidebar:function(){this.$sidebarToggleBtn&&(this.sidebarIsOpen()&&(Garnish.uiLayerManager.removeLayer(),this.$sidebar.addClass("hidden"),this.$sidebarToggleBtn.attr("aria-expanded","false")),this.$body.removeClass("has-sidebar"),this.$content.removeClass("has-sidebar"))},getActiveSourceName:function(){return this.$sidebar.find(".sel").text()},onFadeIn:function(){this.elementIndex?Garnish.isMobileBrowser(!0)||this.elementIndex.$search.trigger("focus"):this._createElementIndex(),this.base()},onSelectionChange:function(){this.updateSelectBtnState()},onSelectSource:function(){this.updateHeading(),this.updateModalBottomPadding()},updateHeading:function(){this.$mainHeading&&this.$mainHeading.text(this.getActiveSourceName())},updateSelectBtnState:function(){this.$selectBtn&&(this.elementIndex.getSelectedElements().length?this.enableSelectBtn():this.disableSelectBtn())},enableSelectBtn:function(){this.$selectBtn.removeClass("disabled").attr("aria-disabled","false")},disableSelectBtn:function(){this.$selectBtn.addClass("disabled").attr("aria-disabled","true")},enableCancelBtn:function(){this.$cancelBtn.removeClass("disabled")},disableCancelBtn:function(){this.$cancelBtn.addClass("disabled")},showFooterSpinner:function(){this.$selectBtn.addClass("loading")},hideFooterSpinner:function(){this.$selectBtn.removeClass("loading")},cancel:function(){this.$cancelBtn.hasClass("disabled")||this.hide()},selectElements:function(){if(this.elementIndex&&this.elementIndex.getSelectedElements().length){this.elementIndex.view.elementSelect.clearMouseUpTimeout();var t=this.elementIndex.getSelectedElements(),e=this.getElementInfo(t);this.onSelect(e),this.settings.disableElementsOnSelect&&this.elementIndex.disableElements(this.elementIndex.getSelectedElements()),this.settings.hideOnSelect&&this.hide()}},getElementInfo:function(t){for(var e=[],i=0;i<t.length;i++){var s=$(t[i]),a=Craft.getElementInfo(s);e.push(a)}return e},onShow:function(){this.updateSelectBtnState(),this.addListener(Garnish.$win,"resize",this.updateSidebarView),this.addListener(Garnish.$win,"resize",this.updateModalBottomPadding),this.updateModalBottomPadding(),this.updateSidebarView(),this.base()},onHide:function(){this.closeSidebar(),this.base()},onSelect:function(t){this.settings.onSelect(t)},disable:function(){this.elementIndex&&this.elementIndex.disable(),this.base()},enable:function(){this.elementIndex&&this.elementIndex.enable(),this.base()},_createElementIndex:function(){var t=this,e={context:"modal",elementType:this.elementType,sources:this.settings.sources};null!==this.settings.showSiteMenu&&"auto"!==this.settings.showSiteMenu&&(e.showSiteMenu=this.settings.showSiteMenu?"1":"0"),Craft.sendActionRequest("POST",this.settings.bodyAction,{data:e}).then((function(e){t.$body.html(e.data.html),t.$body.has(".sidebar:not(.hidden)").length&&(t.$body.addClass("has-sidebar"),t.supportSidebarToggleView=!0),t.elementIndex=Craft.createElementIndex(t.elementType,t.$body,Object.assign({context:"modal",modal:t,storageKey:t.settings.storageKey,condition:t.settings.condition,criteria:t.settings.criteria,disabledElementIds:t.settings.disabledElementIds,selectable:!0,multiSelect:t.settings.multiSelect,buttonContainer:t.$secondaryButtons,onSelectionChange:t.onSelectionChange.bind(t),onSelectSource:t.onSelectSource.bind(t),hideSidebar:t.settings.hideSidebar,defaultSiteId:t.settings.defaultSiteId,defaultSource:t.settings.defaultSource},t.settings.indexSettings)),t.$main=t.elementIndex.$main,t.$sidebar=t.elementIndex.$sidebar,t.$content=t.$body.find(".content"),t.updateSidebarView(),t.updateModalBottomPadding(),t.addListener(t.elementIndex.$elements,"doubletap",(function(t,e){e.firstTap.target===e.secondTap.target&&this.selectElements()}))}))}},{defaults:{fullscreen:!1,resizable:!0,storageKey:null,sources:null,condition:null,criteria:null,multiSelect:!1,showSiteMenu:null,disabledElementIds:[],disableElementsOnSelect:!1,hideOnSelect:!0,modalTitle:Craft.t("app","Select element"),onCancel:$.noop,onSelect:$.noop,hideSidebar:!1,defaultSiteId:null,defaultSource:null,bodyAction:"element-selector-modals/body",indexSettings:{}}})},8843:function(){Craft.BaseInputGenerator=Garnish.Base.extend({$source:null,$target:null,$form:null,settings:null,listening:null,timeout:null,init:function(t,e,i){this.$source=$(t),this.$target=$(e),this.$form=this.$source.closest("form"),this.setSettings(i),this.startListening()},setNewSource:function(t){var e=this.listening;this.stopListening(),this.$source=$(t),e&&this.startListening()},startListening:function(){this.listening||(this.listening=!0,this.addListener(this.$source,"input","onSourceTextChange"),this.addListener(this.$target,"input","onTargetTextChange"),this.addListener(this.$form,"submit","onFormSubmit"))},stopListening:function(){this.listening&&(this.listening=!1,this.timeout&&clearTimeout(this.timeout),this.removeAllListeners(this.$source),this.removeAllListeners(this.$target),this.removeAllListeners(this.$form))},onSourceTextChange:function(){this.timeout&&clearTimeout(this.timeout),this.timeout=setTimeout(this.updateTarget.bind(this),250)},onTargetTextChange:function(){this.$target.get(0)===document.activeElement&&this.stopListening()},onFormSubmit:function(){this.timeout&&clearTimeout(this.timeout),this.updateTarget()},updateTarget:function(){if(this.$target.is(":visible")){var t=this.$source.val();if(void 0!==t){var e=this.generateTargetValue(t);this.$target.val(e);for(var i=0;i<this.$target.length;i++)this.$target[i].dispatchEvent(new InputEvent("input",{inputType:"insertText"})),this.$target[i].dispatchEvent(new Event("input"));this.$target.is(":focus")&&Craft.selectFullValue(this.$target)}}},generateTargetValue:function(t){return t}})},3778:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.CategoryIndex=Craft.BaseElementIndex.extend({editableGroups:null,$newCategoryBtnGroup:null,$newCategoryBtn:null,init:function(t,e,i){this.editableGroups=[],this.on("selectSource",this.updateButton.bind(this)),this.on("selectSite",this.updateButton.bind(this)),this.base(t,e,i)},afterInit:function(){var t=this;this.editableGroups=Craft.editableCategoryGroups.filter((function(e){return!!t.getSourceByKey("group:".concat(e.uid))})),this.base()},getDefaultSourceKey:function(){if("index"===this.settings.context&&"undefined"!=typeof defaultGroupHandle)for(var t=0;t<this.$sources.length;t++){var e=$(this.$sources[t]);if(e.data("handle")===defaultGroupHandle)return e.data("key")}return this.base()},updateButton:function(){var e=this;if(this.$source){var i=this.$source.data("handle");if(this.editableGroups.length&&function(){e.$newCategoryBtnGroup&&e.$newCategoryBtnGroup.remove();var s,a=e.editableGroups.find((function(t){return t.handle===i}));e.$newCategoryBtnGroup=$('<div class="btngroup submit" data-wrapper/>');var n="new-category-menu-"+Craft.randomString(10);if(a){var r="index"===e.settings.context?Craft.t("app","New category"):Craft.t("app","New {group} category",{group:a.name}),o="index"===e.settings.context?Craft.t("app","New category in the {group} category group",{group:a.name}):r,l="index"===e.settings.context?"link":null;e.$newCategoryBtn=Craft.ui.createButton({label:r,ariaLabel:o,spinner:!0,role:l}).addClass("submit add icon").appendTo(e.$newCategoryBtnGroup),e.addListener(e.$newCategoryBtn,"click mousedown",(function(t){"index"===e.settings.context&&("click"===t.type&&Garnish.isCtrlKeyPressed(t)||"mousedown"===t.type&&1===t.originalEvent.button)?window.open(Craft.getUrl("categories/".concat(a.handle,"/new"))):"click"===t.type&&e._createCategory(a.id)})),e.editableGroups.length>1&&(s=$("<button/>",{type:"button",class:"btn submit menubtn btngroup-btn-last","aria-controls":n,"data-disclosure-trigger":"","aria-label":Craft.t("app","New category, choose a category group")}).appendTo(e.$newCategoryBtnGroup))}else e.$newCategoryBtn=s=Craft.ui.createButton({label:Craft.t("app","New category"),ariaLabel:Craft.t("app","New category, choose a category group"),spinner:!0}).addClass("submit add icon menubtn btngroup-btn-last").attr("aria-controls",n).attr("data-disclosure-trigger","").appendTo(e.$newCategoryBtnGroup);if(e.addButton(e.$newCategoryBtnGroup),s){var h,d=$("<div/>",{id:n,class:"menu menu--disclosure"}).appendTo(e.$newCategoryBtnGroup),c=$("<ul/>").appendTo(d),u=function(e,i){var s="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!s){if(Array.isArray(e)||(s=function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(e))||i&&e&&"number"==typeof e.length){s&&(e=s);var a=0,n=function(){};return{s:n,n:function(){return a>=e.length?{done:!0}:{done:!1,value:e[a++]}},e:function(t){throw t},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){s=s.call(e)},n:function(){var t=s.next();return o=t.done,t},e:function(t){l=!0,r=t},f:function(){try{o||null==s.return||s.return()}finally{if(l)throw r}}}}(e.editableGroups);try{var p=function(){var t=h.value,i="index"===e.settings.context?"link":"button";if("index"===e.settings.context||t!==a){var n=$("<li/>").appendTo(c),r=$("<a/>",{role:"button"===i?"button":null,href:"#",type:"button"===i?"button":null,text:Craft.t("app","New {group} category",{group:t.name})}).appendTo(n);e.addListener(r,"click",(function(){s.data("trigger").hide(),e._createCategory(t.id)})),"button"===i&&e.addListener(r,"keydown",(function(i){i.keyCode===Garnish.SPACE_KEY&&(i.preventDefault(),s.data("trigger").hide(),e._createCategory(t.id))}))}};for(u.s();!(h=u.n()).done;)p()}catch(t){u.e(t)}finally{u.f()}new Garnish.DisclosureMenu(s)}}(),"index"===this.settings.context){var s="categories";i&&(s+="/"+i),Craft.setPath(s)}}},_createCategory:function(t){var e=this;if(this.$newCategoryBtn.hasClass("loading"))console.warn("New category creation already in progress.");else{var i=this.editableGroups.find((function(e){return e.id===t}));if(!i)throw"Invalid category group ID: ".concat(t);this.$newCategoryBtn.addClass("loading"),Craft.sendActionRequest("POST","elements/create",{data:{elementType:this.elementType,siteId:this.siteId,groupId:t}}).then((function(t){"index"===e.settings.context?document.location.href=Craft.getUrl(t.data.cpEditUrl,{fresh:1}):Craft.createElementEditor(e.elementType,{siteId:e.siteId,elementId:t.data.element.id,draftId:t.data.element.draftId,params:{fresh:1}}).on("submit",(function(){var s="group:".concat(i.uid);e.sourceKey!==s&&e.selectSourceByKey(s),e.clearSearch(),e.selectElementAfterUpdate(t.data.element.id),e.updateElements()}))})).finally((function(){e.$newCategoryBtn.removeClass("loading")}))}}}),Craft.registerElementIndexClass("craft\\elements\\Category",Craft.CategoryIndex)},6617:function(){Craft.CategorySelectInput=Craft.BaseElementSelectInput.extend({setSettings:function(){this.base.apply(this,arguments),this.settings.sortable=!1},getModalSettings:function(){var t=this.base();return t.hideOnSelect=!1,t},getElements:function(){return this.$elementsContainer.find(".element")},onModalSelect:function(t){var e=this;this.modal.disable(),this.modal.disableCancelBtn(),this.modal.disableSelectBtn(),this.modal.showFooterSpinner();for(var i=this.getSelectedElementIds(),s=0;s<t.length;s++)i.push(t[s].id);var a={categoryIds:i,siteId:t[0].siteId,id:this.settings.id,name:this.settings.name,branchLimit:this.settings.branchLimit,selectionLabel:this.settings.selectionLabel},n=function(){e.modal.enable(),e.modal.enableCancelBtn(),e.modal.enableSelectBtn(),e.modal.hideFooterSpinner()};Craft.sendActionRequest("POST","categories/input-html",{data:a}).then((function(i){n();var s=$(i.data.html).children(".elements");e.$elementsContainer.replaceWith(s),e.$elementsContainer=s,e.resetElements();for(var a=[],r=0;r<t.length;r++){var o=t[r],l=e.getElementById(o.id);l&&(e.animateElementIntoPlace(o.$element,l),a.push(o))}e.updateDisabledElementsInModal(),e.modal.hide(),e.onSelectElements(a)})).catch((function(t){t.response,n()}))},removeElement:function(t){var e=t.add(t.parent().siblings("ul").find(".element"));this.removeElements(e);for(var i=0;i<e.length;i++)this._animateCategoryAway(e,i)},_animateCategoryAway:function(t,e){var i,s=this;e===t.length-1&&(i=function(){var e=t.first().parent().parent(),i=e.parent();i[0]===s.$elementsContainer[0]||e.siblings().length?e.remove():i.remove()});var a=function(){s.animateElementAway(t.eq(e),i)};0===e?a():setTimeout(a,100*e)}})},9482:function(){Craft.charts={},Craft.charts.DataTable=Garnish.Base.extend({columns:null,rows:null,init:function(t){var e=t.columns,i=t.rows;i.forEach((function(t){$.each(t,(function(i){var s;switch(e[i].type){case"date":s=d3.timeParse("%Y-%m-%d"),t[i]=s(t[i]);break;case"datetime":s=d3.timeParse("%Y-%m-%d %H:00:00"),t[i]=s(t[i]);break;case"percent":t[i]=t[i]/100;break;case"number":t[i]=+t[i]}}))})),this.columns=e,this.rows=i}}),Craft.charts.Tip=Garnish.Base.extend({$container:null,$tip:null,init:function(t){this.$container=t,this.$tip=$('<div class="tooltip"></div>').appendTo(this.$container),this.hide()},setContent:function(t){this.$tip.html(t)},setPosition:function(t){this.$tip.css("left","".concat(t.left,"px")),this.$tip.css("top","".concat(t.top,"px"))},show:function(){this.$tip.css("display","block")},hide:function(){this.$tip.css("display","none")}}),Craft.charts.BaseChart=Garnish.Base.extend({$container:null,$chart:null,chartBaseClass:"cp-chart",dataTable:null,formatLocale:null,timeFormatLocale:null,orientation:null,svg:null,width:null,height:null,init:function(t,e){var i=this;this.$container=t,this.setSettings(Craft.charts.BaseChart.defaults),this.setSettings(e);var s={formats:window.d3Formats,formatLocaleDefinition:window.d3FormatLocaleDefinition,timeFormatLocaleDefinition:window.d3TimeFormatLocaleDefinition};this.setSettings(s),d3.select(window).on("resize",(function(){i.resize()}))},setSettings:function(t,e){var i=void 0===this.settings?{}:this.settings;this.settings=$.extend(!0,{},i,e,t)},draw:function(t,e){this.setSettings(e),this.dataTable=t,this.formatLocale=d3.formatLocale(this.settings.formatLocaleDefinition),this.timeFormatLocale=d3.timeFormatLocale(this.settings.timeFormatLocaleDefinition),this.orientation=this.settings.orientation,this.$chart&&this.$chart.remove();var i=this.chartBaseClass;this.settings.chartClass&&(i+=" "+this.settings.chartClass),this.$chart=$('<div class="'.concat(i,'" />')).appendTo(this.$container)},resize:function(){this.draw(this.dataTable,this.settings)},onAfterDrawTicks:function(){$(".tick",this.$chart).each((function(t,e){var i=$("text",e);i.clone().appendTo(e),i.attr("stroke","#ffffff"),i.attr("stroke-width",3)}))}},{defaults:{formatLocaleDefinition:null,timeFormatLocaleDefinition:null,formats:{numberFormat:",.2f",percentFormat:",.2%",currencyFormat:"$,.2f",shortDateFormats:{day:"%-m/%-d",month:"%-m/%y",year:"%Y"}},margin:{top:0,right:0,bottom:0,left:0},chartClass:null,colors:["#0594D1","#DE3800","#FF9A00","#009802","#9B009B"]}}),Craft.charts.Area=Craft.charts.BaseChart.extend({tip:null,drawingArea:null,init:function(t,e){this.base(t,Craft.charts.Area.defaults),this.setSettings(e)},draw:function(t,e){this.base(t,e),this.tip&&(this.tip=null);var i=this.getChartMargin();this.width=this.$chart.width()-i.left-i.right,this.height=this.$chart.height()-i.top-i.bottom;var s={width:this.width+(i.left+i.right),height:this.height+(i.top+i.bottom),translateX:"rtl"!==this.orientation?i.left:i.right,translateY:i.top};this.svg=d3.select(this.$chart.get(0)).append("svg").attr("width",s.width).attr("height",s.height),this.drawingArea=this.svg.append("g").attr("transform","translate(".concat(s.translateX,",").concat(s.translateY,")")),this.drawTicks(),this.drawAxes(),this.drawChart(),this.drawTipTriggers()},drawTicks:function(){var t=this.getX(!0),e=d3.axisBottom(t).tickFormat(this.getXFormatter()).ticks(3);this.drawingArea.append("g").attr("class","x ticks-axis").attr("transform","translate(0, ".concat(this.height,")")).call(e);var i,s=this.getY();"rtl"!==this.orientation?(i=d3.axisLeft(s).tickFormat(this.getYFormatter()).tickValues(this.getYTickValues()).ticks(2),this.drawingArea.append("g").attr("class","y ticks-axis").call(i)):(i=d3.axisRight(s).tickFormat(this.getYFormatter()).tickValues(this.getYTickValues()).ticks(2),this.drawingArea.append("g").attr("class","y ticks-axis").attr("transform","translate(".concat(this.width,",0)")).call(i)),this.onAfterDrawTicks()},drawAxes:function(){if(this.settings.xAxis.showAxis){var t=this.getX(),e=d3.axisBottom(t).ticks(0).tickSizeOuter(0);this.drawingArea.append("g").attr("class","x axis").attr("transform","translate(0, ".concat(this.height,")")).call(e)}if(this.settings.yAxis.showAxis){var i,s=this.getY();"rtl"===this.orientation?(i=d3.axisLeft(s).ticks(0),this.drawingArea.append("g").attr("class","y axis").attr("transform","translate(".concat(this.width-0,", 0)")).call(i)):(i=d3.axisRight(s).ticks(0),this.drawingArea.append("g").attr("class","y axis").attr("transform","translate(".concat(0,", 0)")).call(i))}},drawChart:function(){var t=this.getX(!0),e=this.getY();if(this.settings.xAxis.gridlines){var i=d3.axisBottom(t);this.drawingArea.append("g").attr("class","x grid-line").attr("transform","translate(0,".concat(this.height,")")).call(i.tickSize(-this.height,0,0).tickFormat(""))}if(this.settings.yAxis.gridlines){var s=d3.axisLeft(e);this.drawingArea.append("g").attr("class","y grid-line").attr("transform","translate(0 , 0)").call(s.tickSize(-this.width,0).tickFormat("").tickValues(this.getYTickValues()).ticks(2))}var a=d3.line().x((function(e){return t(e[0])})).y((function(t){return e(t[1])}));this.drawingArea.append("g").attr("class","chart-line").append("path").datum(this.dataTable.rows).style("fill","none").style("stroke",this.settings.colors[0]).style("stroke-width","3px").attr("d",a);var n=d3.area().x((function(e){return t(e[0])})).y0(this.height).y1((function(t){return e(t[1])}));this.drawingArea.append("g").attr("class","chart-area").append("path").datum(this.dataTable.rows).style("fill",this.settings.colors[0]).style("fill-opacity","0.3").attr("d",n),this.settings.plots&&this.drawingArea.append("g").attr("class","plots").selectAll("circle").data(this.dataTable.rows).enter().append("circle").style("fill",this.settings.colors[0]).attr("class",(function(t,e){return"plot plot-".concat(e)})).attr("r",4).attr("cx",(function(e){return t(e[0])})).attr("cy",(function(t){return e(t[1])}))},drawTipTriggers:function(){var t=this;if(this.settings.tips){this.tip||(this.tip=new Craft.charts.Tip(this.$chart));var e=this.getChartMargin(),i=(this.drawingArea.select(".x path.domain").node().getTotalLength()-e.left-e.right-12)/(this.dataTable.rows.length-1),s=Math.max(0,i),a=this.getX(!0),n=this.getY();this.drawingArea.append("g").attr("class","tip-triggers").selectAll("rect").data(this.dataTable.rows).enter().append("rect").attr("class","tip-trigger").style("fill","transparent").style("fill-opacity","1").attr("width",s).attr("height",this.height).attr("x",(function(t){return a(t[0])-s/2})).on("mouseover",(function(e,i){t.drawingArea.select(".plot-"+i).attr("r",5);var s=$("<div />"),r=$('<div class="x-value" />').appendTo(s),o=$('<div class="y-value" />').appendTo(s);r.html(t.getXFormatter()(e[0])),o.html(t.getYFormatter()(e[1]));var l=s.get(0);t.tip.setContent(l);var h,d=t.getChartMargin(),c=24,u=n(e[1])+c;"rtl"!==t.orientation?(h=a(e[0])+d.left+c,t.$chart.offset().left+h+t.tip.$tip.width()>t.$chart.offset().left+t.$chart.width()-c&&(h=a(e[0])-(t.tip.$tip.width()+c))):h=a(e[0])-(t.tip.$tip.width()+d.left+c),h<0&&(h=a(e[0])+d.left+c);var p={top:u,left:h};t.tip.setPosition(p),t.tip.show()})).on("mouseout",(function(e,i){t.drawingArea.select(".plot-"+i).attr("r",4),t.tip.hide()}))}},getChartMargin:function(){var t=this,e=this.settings.margin,i=this.getYTickValues(),s=0;return $.each(i,(function(e,i){var a=8*t.getYFormatter()(i).length;a>s&&(s=a)})),s+=10,e.left=s,e},getX:function(t){var e=d3.min(this.dataTable.rows,(function(t){return t[0]})),i=d3.max(this.dataTable.rows,(function(t){return t[0]})),s=[e,i];"rtl"===this.orientation&&(s=[i,e]);var a=0,n=0;t&&(a=0,n=0);var r=d3.scaleTime().range([a,this.width-n]);return r.domain(s),r},getY:function(){var t=[0,this.getYMaxValue()],e=d3.scaleLinear().range([this.height,0]);return e.domain(t),e},getXFormatter:function(){return this.settings.xAxis.formatter!==$.noop?this.settings.xAxis.formatter(this):Craft.charts.utils.getTimeFormatter(this.timeFormatLocale,this.settings)},getYFormatter:function(){return this.settings.yAxis.formatter!==$.noop?this.settings.yAxis.formatter(this):Craft.charts.utils.getNumberFormatter(this.formatLocale,this.dataTable.columns[1].type,this.settings)},getYMaxValue:function(){return d3.max(this.dataTable.rows,(function(t){return t[1]}))},getYTickValues:function(){var t=this.getYMaxValue();return t>1?[t/2,t]:[0,t]}},{defaults:{chartClass:"area",margin:{top:25,right:5,bottom:25,left:0},plots:!0,tips:!0,xAxis:{gridlines:!1,showAxis:!0,formatter:$.noop},yAxis:{gridlines:!0,showAxis:!1,formatter:$.noop}}}),Craft.charts.utils={getDuration:function(t){var e=parseInt(t,10),i={hours:Math.floor(e/3600),minutes:Math.floor((e-3600*i.hours)/60),seconds:e-3600*i.hours-60*i.minutes};return i.hours<10&&(i.hours="0".concat(i.hours)),i.minutes<10&&(i.minutes="0".concat(i.minutes)),i.seconds<10&&(i.seconds="0".concat(i.seconds)),"".concat(i.hours,":").concat(i.minutes,":").concat(i.seconds)},getTimeFormatter:function(t,e){switch(e.dataScale){case"year":return t.format("%Y");case"month":return t.format(e.formats.shortDateFormats.month);case"hour":return t.format("".concat(e.formats.shortDateFormats.day," %H:00:00"));default:return t.format(e.formats.shortDateFormats.day)}},getNumberFormatter:function(t,e,i){switch(e){case"currency":return t.format(i.formats.currencyFormat);case"percent":return t.format(i.formats.percentFormat);case"time":return Craft.charts.utils.getDuration;case"number":return t.format(i.formats.numberFormat)}}}},3352:function(){Craft.ColorInput=Garnish.Base.extend({$container:null,$input:null,$colorContainer:null,$colorPreview:null,$colorInput:null,init:function(t){this.$container=$(t),this.$input=this.$container.find(".color-input"),this.$colorContainer=this.$container.children(".color"),this.$colorPreview=this.$colorContainer.children(".color-preview"),this.createColorInput(),this.handleTextChange(),this.addListener(this.$input,"input","handleTextChange")},createColorInput:function(){var t=document.createElement("input");t.setAttribute("type","color"),"color"===t.type&&(this.$colorContainer.removeClass("static"),this.$colorInput=$(t).addClass("color-preview-input").attr({"aria-controls":this.$input.attr("id"),"aria-label":Craft.t("app","Color picker")}).appendTo(this.$colorPreview),this.addListener(this.$colorInput,"click",(function(t){t.stopPropagation()})),this.addListener(this.$colorContainer,"click",(function(){this.$colorInput.trigger("click")})),this.addListener(this.$colorInput,"input","updateColor"))},updateColor:function(){this.$input.val(this.$colorInput.val()),this.handleTextChange()},handleTextChange:function(){var t=this.$input.val();t!==(t=Craft.trim(t))&&this.$input.val(t),t.length&&"#"===t[0]&&(t=t.substring(1),this.$input.val(t)),t.length?(3===t.length&&(t=t[0].repeat(2)+t[1].repeat(2)+t[2].repeat(2)),t.match(/^[0-9a-f]{6}$/i)?(this.$colorPreview.css("background-color","#".concat(t)),this.$colorInput&&this.$colorInput.val("#".concat(t))):this.$colorPreview.css("background-color","")):this.$colorPreview.css("background-color","")}},{_browserSupportsColorInputs:null,doesBrowserSupportColorInputs:function(){return Craft.ColorInput._browserSupportsColorInputs,Craft.ColorInput._browserSupportsColorInputs}})},8167:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}function e(t,e,i){return e in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}Craft.CpScreenSlideout=Craft.Slideout.extend({action:null,namespace:null,showingLoadSpinner:!1,hasTabs:!1,hasCpLink:!1,hasSidebar:!1,$header:null,$toolbar:null,$tabContainer:null,$loadSpinner:null,$editLink:null,$sidebarBtn:null,$body:null,$content:null,$sidebar:null,$footer:null,$noticeContainer:null,$cancelBtn:null,$saveBtn:null,tabManager:null,showingSidebar:!1,cancelToken:null,ignoreFailedRequest:!1,fieldsWithErrors:null,init:function(t,e){var i=this;this.action=t,this.setSettings(e,Craft.CpScreenSlideout.defaults),this.fieldsWithErrors=[],this.$header=$("<header/>",{class:"pane-header"}),this.$toolbar=$("<div/>",{class:"so-toolbar"}).appendTo(this.$header),this.$tabContainer=$("<div/>",{class:"pane-tabs"}).appendTo(this.$toolbar),this.$loadSpinner=$("<div/>",{class:"spinner",title:Craft.t("app","Loading"),"aria-label":Craft.t("app","Loading")}).appendTo(this.$toolbar),this.$editLink=$("<a/>",{target:"_blank",class:"btn header-btn hidden",title:Craft.t("app","Open the full edit page in a new tab"),"aria-label":Craft.t("app","Open the full edit page in a new tab"),"data-icon":"external"}).appendTo(this.$toolbar),this.$sidebarBtn=$("<button/>",{type:"button",class:"btn header-btn hidden sidebar-btn",title:Craft.t("app","Show sidebar"),"aria-label":Craft.t("app","Show sidebar"),"data-icon":"sidebar-".concat(Garnish.ltr?"right":"left"),"aria-expanded":"false"}).appendTo(this.$toolbar),this.addListener(this.$sidebarBtn,"click",(function(t){t.preventDefault(),i.showingSidebar?i.hideSidebar():i.showSidebar()})),this.$body=$("<div/>",{class:"so-body"}),this.$content=$("<div/>",{class:"so-content"}).appendTo(this.$body),this.$sidebar=$("<div/>",{class:"so-sidebar details hidden"}).appendTo(this.$body),this.$footer=$("<div/>",{class:"so-footer hidden"}),this.$noticeContainer=$("<div/>",{class:"so-notice"}).appendTo(this.$footer),$("<div/>",{class:"flex-grow"}).appendTo(this.$footer);var s=$("<div/>",{class:"flex flex-nowrap"}).appendTo(this.$footer);this.$cancelBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(s),this.$saveBtn=Craft.ui.createSubmitButton({label:Craft.t("app","Save"),spinner:!0}).appendTo(s);var a=this.$header.add(this.$body).add(this.$footer);this.base(a,{containerElement:"form",containerAttributes:{id:"cp-screen-".concat(Math.floor(1e8*Math.random())),action:"",method:"post",novalidate:"",class:"cp-screen"},closeOnEsc:!1,closeOnShadeClick:!1}),this.$container.data("cpScreen",this),this.on("beforeClose",(function(){i.hideSidebar()})),Garnish.uiLayerManager.registerShortcut({keyCode:Garnish.S_KEY,ctrl:!0},(function(t){i.handleSubmit(t)})),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){i.closeMeMaybe()})),this.addListener(this.$cancelBtn,"click",(function(){i.closeMeMaybe()})),this.addListener(this.$shade,"click",(function(){i.closeMeMaybe()})),this.addListener(this.$container,"click",(function(t){var e=$(event.target);!i.showingSidebar||e.closest(i.$sidebarBtn).length||e.closest(i.$sidebar).length||i.hideSidebar()})),this.addListener(this.$container,"submit","handleSubmit"),this.load()},load:function(t,e){var i=this;return new Promise((function(t,s){i.trigger("beforeLoad"),i.showLoadSpinner(),i.cancelToken&&(i.ignoreFailedRequest=!0,i.cancelToken.cancel()),i.cancelToken=axios.CancelToken.source(),Craft.sendActionRequest("GET",i.action,$.extend({params:Object.assign({},i.getParams(),i.settings.params),cancelToken:i.cancelToken.token,headers:{"X-Craft-Container-Id":i.$container.attr("id")}},i.settings.requestOptions)).then((function(a){i.update(a.data).then((function(){!1!==e&&(i.$container.data("delta-names",a.data.deltaNames),i.$container.data("initial-delta-values",a.data.initialDeltaValues),i.$container.data("initialSerializedValue",i.$container.serialize())),t()})).catch((function(t){s(t)}))})).catch((function(t){i.ignoreFailedRequest||(Craft.cp.displayError(),s(t)),i.ignoreFailedRequest=!1})).finally((function(){i.hideLoadSpinner(),i.cancelToken=null}))}))},getParams:function(){return{}},updateHeaderVisibility:function(){var t=this.settings.showHeader||this.hasTabs||this.hasCpLink||this.showingLoadSpinner;t||this.hasSidebar?this.$header.removeClass("hidden"):this.$header.addClass("hidden"),t?this.$header.addClass("so-visible"):this.$header.removeClass("so-visible")},showLoadSpinner:function(){this.$loadSpinner.removeClass("hidden"),this.showingLoadSpinner=!0,this.updateHeaderVisibility()},hideLoadSpinner:function(){this.$loadSpinner.addClass("hidden"),this.showingLoadSpinner=!1,this.updateHeaderVisibility()},update:function(t){var e=this;return new Promise((function(i){e.namespace=t.namespace,e.$content.html(t.content),t.submitButtonLabel&&e.$saveBtn.text(t.submitButtonLabel),e.updateTabs(t.tabs),t.formAttributes&&Craft.setElementAttributes(e.$container,t.formAttributes),t.editUrl?(e.$editLink.removeClass("hidden").attr("href",t.editUrl),e.hasCpLink=!0):(e.$editLink.addClass("hidden"),e.hasCpLink=!1),t.sidebar?(e.$container.addClass("has-sidebar"),e.$sidebarBtn.removeClass("hidden"),e.$sidebar.html(t.sidebar),e.$sidebar.find("a").each((function(){this.hostname.length&&void 0===$(this).attr("target")&&$(this).attr("target","_blank")})),e.hasSidebar=!0):(e.$container.removeClass("has-sidebar"),e.$sidebarBtn.addClass("hidden"),e.$sidebar.addClass("hidden").html(""),e.hasSidebar=!1),t.notice?e.$noticeContainer.html(t.notice):e.$noticeContainer.empty(),e.updateHeaderVisibility(),e.$footer.removeClass("hidden"),Garnish.requestAnimationFrame((function(){Craft.appendHeadHtml(t.headHtml),Craft.appendBodyHtml(t.bodyHtml),Craft.initUiElements(e.$content),(new Craft.ElementThumbLoader).load($(e.$content)),t.sidebar&&(Craft.initUiElements(e.$sidebar),(new Craft.ElementThumbLoader).load(e.$sidebar)),Garnish.isMobileBrowser()||Craft.setFocusWithin(e.$content),i(),e.trigger("load")}))}))},updateTabs:function(t){var e=this;if(this.tabManager&&(this.tabManager.destroy(),this.tabManager=null,this.$tabContainer.html("")),this.hasTabs=!!t,this.hasTabs){var i=$(t);this.$tabContainer.replaceWith(i),this.$tabContainer=i,this.tabManager=new Craft.Tabs(this.$tabContainer),this.tabManager.on("deselectTab",(function(t){$(t.$tab.attr("href")).addClass("hidden")})),this.tabManager.on("selectTab",(function(t){$(t.$tab.attr("href")).removeClass("hidden"),Garnish.$win.trigger("resize"),e.$body.trigger("scroll")}))}},showSidebar:function(){var t=this;this.showingSidebar||(this.$body.scrollTop(0).addClass("no-scroll"),this.$sidebar.off("transitionend.so").css(this._closedSidebarStyles()).removeClass("hidden"),this.$sidebar[0].offsetWidth,this.$sidebar.css(this._openedSidebarStyles()),Garnish.isMobileBrowser()||this.$sidebar.one("transitionend.so",(function(){Craft.setFocusWithin(t.$sidebar)})),Craft.trapFocusWithin(this.$sidebar),this.$sidebarBtn.addClass("active").attr({"aria-expanded":"true"}),Garnish.$win.trigger("resize"),this.$sidebar.trigger("scroll"),Garnish.uiLayerManager.addLayer(),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.hideSidebar()})),this.showingSidebar=!0)},hideSidebar:function(){var t=this;this.showingSidebar&&(this.$body.removeClass("no-scroll"),this.$sidebar.off("transitionend.so").css(this._closedSidebarStyles()).one("transitionend.so",(function(){t.$sidebar.addClass("hidden"),t.$sidebarBtn.focus()})),this.$sidebarBtn.removeClass("active").attr({"aria-expanded":"false"}),Garnish.uiLayerManager.removeLayer(),this.showingSidebar=!1)},_openedSidebarStyles:function(){return e({},Garnish.ltr?"right":"left","0")},_closedSidebarStyles:function(){return e({},Garnish.ltr?"right":"left","-350px")},showSubmitSpinner:function(){this.$saveBtn.addClass("loading")},hideSubmitSpinner:function(){this.$saveBtn.removeClass("loading")},handleSubmit:function(t){t.preventDefault(),this.submit()},submit:function(){var t=this;this.showSubmitSpinner();var e=Craft.findDeltaData(this.$container.data("initialSerializedValue"),this.$container.serialize(),this.$container.data("delta-names"),null,this.$container.data("initial-delta-values"));Craft.sendActionRequest("POST",null,{data:e,headers:{"X-Craft-Namespace":this.namespace}}).then((function(e){t.handleSubmitResponse(e)})).catch((function(e){t.handleSubmitError(e)})).finally((function(){t.hideSubmitSpinner()}))},handleSubmitResponse:function(t){this.clearErrors();var e=t.data||{};e.message&&Craft.cp.displaySuccess(e.message,e.notificationSettings),this.trigger("submit",{response:t,data:e.modelName&&e[e.modelName]||{}}),this.settings.closeOnSubmit&&this.close()},handleSubmitError:function(t){if(!t.isAxiosError||!t.response||400===!t.response.status)throw Craft.cp.displayError(),t;var e=t.response.data||{};Craft.cp.displayError(e.message),e.errors&&this.showErrors(e.errors)},showErrors:function(e){var i=this;this.clearErrors(),Object.entries(e).forEach((function(e){var s,a,n=(a=2,function(t){if(Array.isArray(t))return t}(s=e)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(s,a)||function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(s,a)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),r=n[0],o=n[1],l=i.$container.find('[data-attribute="'.concat(r,'"]'));l&&(Craft.ui.addErrorsToField(l,o),i.fieldsWithErrors.push(l))}))},clearErrors:function(){this.fieldsWithErrors.forEach((function(t){Craft.ui.clearErrorsFromField(t)}))},isDirty:function(){return void 0!==this.$container.data("initialSerializedValue")&&this.$container.serialize()!==this.$container.data("initialSerializedValue")},closeMeMaybe:function(){this.isOpen&&(this.isDirty()&&!confirm(Craft.t("app","Are you sure you want to close this screen? Any changes will be lost."))||this.close())},close:function(){this.base(),this.cancelToken&&(this.ignoreFailedRequest=!0,this.cancelToken.cancel())}},{defaults:{params:{},requestOptions:{},showHeader:null,closeOnSubmit:!0}})},587:function(){function t(t,e){var i="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!i){if(Array.isArray(t)||(i=s(t))||e&&t&&"number"==typeof t.length){i&&(t=i);var a=0,n=function(){};return{s:n,n:function(){return a>=t.length?{done:!0}:{done:!1,value:t[a++]}},e:function(t){function e(e){return t.apply(this,arguments)}return e.toString=function(){return t.toString()},e}((function(t){throw t})),f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){i=i.call(t)},n:function(){var t=i.next();return o=t.done,t},e:function(t){function e(e){return t.apply(this,arguments)}return e.toString=function(){return t.toString()},e}((function(t){l=!0,r=t})),f:function(){try{o||null==i.return||i.return()}finally{if(l)throw r}}}}function i(t){return function(t){if(Array.isArray(t))return a(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||s(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function s(t,e){if(t){if("string"==typeof t)return a(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?a(t,e):void 0}}function a(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}function n(t){return n="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},n(t)}var r=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi;if(jQuery.htmlPrefilter=function(t){return t.replace(r,"<$1></$2>")},$.extend(Craft,{navHeight:48,index:function(t,e){if(!$.isArray(t))throw"The first argument passed to Craft.index() must be an array.";return t.reduce((function(t,i,s){return t["string"==typeof e?i[e]:e(i,s)]=i,t}),{})},group:function(t,e){if(!$.isArray(t))throw"The first argument passed to Craft.group() must be an array.";var i={};return t.reduce((function(t,s,a){var n="string"==typeof e?s[e]:e(s,a);return i.hasOwnProperty(n)||(i[n]=[[],n],t.push(i[n])),i[n][0].push(s),t}),[])},t:function(t,e,i){return void 0!==Craft.translations[t]&&void 0!==Craft.translations[t][e]&&(e=Craft.translations[t][e]),i?this.formatMessage(e,i):e},formatMessage:function(t,e){var i;if(!1===(i=this._tokenizePattern(t)))throw"Message pattern is invalid.";for(var s=0;s<i.length;s++){var a=i[s];if("object"===n(a)&&!1===(i[s]=this._parseToken(a,e)))throw"Message pattern is invalid."}return i.join("")},_tokenizePattern:function(t){var e,s,a=1,n=i(t);if(-1===(e=s=n.indexOf("{")))return[t];for(var r=[n.slice(0,s).join("")];;){var o=n.indexOf("{",s+1),l=n.indexOf("}",s+1);if(-1===o&&(o=!1),-1===l&&(l=!1),!1===o&&!1===l)break;if(!1===o&&(o=n.length),l>o?(a++,s=o):(a--,s=l),0===a&&(r.push(n.slice(e+1,s).join("").split(",",3)),e=s+1,r.push(n.slice(e,o).join("")),e=o),0!==a&&(!1===o||!1===l))break}return 0===a&&r},_parseToken:function(t,e){var s=this,a=Craft.trim(t[0]);if(void 0===e[a])return"{".concat(t.join(","),"}");var r=e[a],o=void 0!==t[1]?Craft.trim(t[1]):"none";switch(o){case"number":return function(){var e=void 0!==t[2]?Craft.trim(t[2]):null;if(null!==e&&"integer"!==e)throw"Message format 'number' is only supported for integer values.";var i,s=Craft.formatNumber(r);return null===e&&-1!==(i="".concat(r).indexOf("."))&&(s+=".".concat(r.substring(i+1))),s}();case"none":return r;case"select":return function(){if(void 0===t[2])return!1;for(var i=s._tokenizePattern(t[2]),a=i.length,n=!1,o=0;o+1<a;o++){if(Garnish.isArray(i[o])||!Garnish.isArray(i[o+1]))return!1;var l=Craft.trim(i[o++]);(!1===n&&"other"===l||l==r)&&(n=i[o].join(","))}return!1!==n&&s.formatMessage(n,e)}();case"plural":return function(){if(void 0===t[2])return!1;for(var a=s._tokenizePattern(t[2]),o=a.length,l=!1,h=0,d=0;d+1<o;d++){if("object"===n(a[d])||"object"!==n(a[d+1]))return!1;var c=Craft.trim(a[d++]),u=i(c);if(1===d&&"offset:"===c.substring(0,7)){var p=i(c.replace(/[\n\r\t]/g," ")).indexOf(" ",7);if(-1===p)throw"Message pattern is invalid.";h=parseInt(Craft.trim(u.slice(7,p).join(""))),c=Craft.trim(u.slice(p+1,p+1+u.length).join(""))}(!1===l&&"other"===c||"="===c[0]&&parseInt(u.slice(1,1+u.length).join(""))===r||"one"===c&&r-h==1)&&(l=("string"==typeof a[d]?[a[d]]:a[d]).map((function(t){return t.replace("#",r-h)})).join(","))}return!1!==l&&s.formatMessage(l,e)}();default:throw"Message format '".concat(o,"' is not supported.")}},formatDate:function(t){return"object"!==n(t)&&(t=new Date(t)),$.datepicker.formatDate(Craft.datepickerOptions.dateFormat,t)},formatNumber:function(t,e){return void 0===e&&(e=",.0f"),d3.formatLocale(d3FormatLocaleDefinition).format(e)(t)},shortcutText:function(t,e,i){return"Mac"===Craft.clientOs?(i?"⌥":"")+(e?"⇧":"")+"⌘"+t:"Ctrl+"+(i?"Alt+":"")+(e?"Shift+":"")+t},escapeHtml:function(t){return $("<div/>").text(t).html()},escapeRegex:function(t){return t.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},getText:function(t){return $("<div/>").html(t).text()},encodeUriComponent:function(t){t=encodeURIComponent(t);var e={"!":"%21","*":"%2A","'":"%27","(":"%28",")":"%29"};for(var i in e){var s=new RegExp("\\"+i,"g");t=t.replace(s,e[i])}return t},selectFullValue:function(t){var e=$(t),i=e.val();if(void 0!==e[0].setSelectionRange){var s=2*i.length;e[0].setSelectionRange(0,s)}else e.val(i)},formatInputId:function(t){return this.rtrim(t.replace(/[^\w\-]+/g,"-"),"-")},getUrl:function(t,e,i){"string"!=typeof t&&(t="");var s=null;if($.isPlainObject(e))void 0!==e["#"]&&(s=e["#"],delete e["#"]);else if("string"==typeof e){var a=e.indexOf("#");-1!==a&&(s=e.substring(a+1),e=e.substring(0,a)),e=Object.fromEntries(new URLSearchParams(e).entries())}else e={};var n=t.indexOf("#");-1!==n&&(s||(s=t.substring(n+1)),t=t.substring(0,n));var r,o=t.indexOf("?");if(-1!==o&&(e=$.extend(Object.fromEntries(new URLSearchParams(t.substring(o+1)).entries()),e),t=t.substring(0,o)),-1!==t.search("://")||"/"===t[0])return t+($.isEmptyObject(e)?"":"?".concat($.param(e)))+(s?"#".concat(s):"");if(t=Craft.trim(t,"/"),i){if(r=i,t&&Craft.pathParam){var l=r.match(new RegExp("[&?]"+Craft.escapeRegex(Craft.pathParam)+"=[^&]+"));l&&(r=r.replace(l[0],Craft.rtrim(l[0],"/")+"/"+t),t="")}}else r=Craft.baseUrl;return-1!==(o=r.indexOf("?"))&&(e=$.extend(Object.fromEntries(new URLSearchParams(r.substring(o+1)).entries()),e),r=r.substring(0,o)),!Craft.omitScriptNameInUrls&&t&&(Craft.usePathInfo||!Craft.pathParam?-1===r.search(Craft.scriptName)&&(r=Craft.rtrim(r,"/")+"/"+Craft.scriptName):(void 0!==e[Craft.pathParam]&&(t=Craft.rtrim(e[Craft.pathParam])+(t?"/"+t:"")),e[Craft.pathParam]=t,t=null)),t&&(r=Craft.rtrim(r,"/")+"/"+t),$.isEmptyObject(e)||(r+="?".concat($.param(e))),s&&(r+="#".concat(s)),r},getCpUrl:function(t,e){return this.getUrl(t,e,Craft.baseCpUrl)},getSiteUrl:function(t,e){return this.getUrl(t,e,Craft.baseSiteUrl)},getActionUrl:function(t,e){return Craft.getUrl(t,e,Craft.actionUrl)},redirectTo:function(t){document.location.href=this.getUrl(t)},setUrl:function(t){"undefined"!=typeof history&&(t.match(/#/)||(t+=document.location.hash),history.replaceState({},"",t))},setPath:function(t){this.path=t,this.setUrl(Craft.getUrl(t,document.location.search))},setQueryParam:function(t,e){var i=document.location.origin+document.location.pathname,s=this.getQueryParams();null!=e&&!1!==e?s[t]=e:delete s[t],this.setUrl(Craft.getUrl(i,s))},getPageUrl:function(t){var e=document.location.origin+document.location.pathname;e=Craft.rtrim(e,"/");var i=document.location.search?document.location.search.substring(1):"";if("?"===Craft.pageTrigger[0]){var s=Craft.pageTrigger.substring(1);if(document.location.search){var a=Object.fromEntries(new URLSearchParams(i).entries());delete a[s],i=$.param(a)}1!==t&&(i+=(""!==i?"&":"")+"".concat(s,"=").concat(t))}else e=e.replace(new RegExp("/"+Craft.escapeRegex(Craft.pageTrigger)+"\\d+$"),""),1!==t&&(e+="/".concat(Craft.pageTrigger).concat(t));return e+(i?"?".concat(i):"")+document.location.hash},getCsrfInput:function(){return Craft.csrfTokenName?'<input type="hidden" name="'+Craft.csrfTokenName+'" value="'+Craft.csrfTokenValue+'"/>':""},postActionRequest:function(t,e,i,s){"function"==typeof e&&(s=i,i=e,e={}),(s=s||{}).contentType&&s.contentType.match(/\bjson\b/)&&("object"===n(e)&&(e=JSON.stringify(e)),s.contentType="application/json; charset=utf-8");var a=$.ajax($.extend({url:Craft.getActionUrl(t),type:"POST",dataType:"json",headers:this._actionHeaders(),data:e,success:i,error:function(t,e,s){4===t.readyState&&(400!==t.status&&(void 0!==Craft.cp?Craft.cp.displayError():alert(Craft.t("app","A server error occurred."))),i&&i(400===t.status?t.responseJSON:null,e,t))}},s));return"function"==typeof s.send&&s.send(a),a},_actionHeaders:function(){var t={"X-Registered-Asset-Bundles":Object.keys(Craft.registeredAssetBundles).join(","),"X-Registered-Js-Files":Object.keys(Craft.registeredJsFiles).join(",")};return Craft.csrfTokenValue&&(t["X-CSRF-Token"]=Craft.csrfTokenValue),t},sendActionRequest:function(t,e){var i=this,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if($.isPlainObject(e)&&(s=e,e=null),"POST"===t.toUpperCase()&&e&&s.data)if("string"==typeof s.data){var a=s&&s.headers&&s.headers["X-Craft-Namespace"],n=this.namespaceInputName("action",a);s.data+="&".concat(n,"=").concat(e)}else delete s.data.action;return new Promise((function(a,n){(s=s?$.extend({},s):{}).method=t,s.url=e?Craft.getActionUrl(e):Craft.getCpUrl(),s.headers=$.extend({"X-Requested-With":"XMLHttpRequest"},s.headers||{},i._actionHeaders()),s.params=$.extend({},s.params||{},{v:(new Date).getTime()}),axios.request(s).then(a).catch(n)}))},sendApiRequest:function(t,e,i){var s=this;return new Promise((function(a,n){var r=(i=i?$.extend({},i):{}).cancelToken||null;s._getApiHeaders(r).then((function(o){i.method=t,i.baseURL=Craft.baseApiUrl,i.url=e,i.headers=$.extend(o,i.headers||{}),i.params=$.extend(Craft.apiParams||{},i.params||{},{v:(new Date).getTime()}),s._apiHeaders||(i.params.processCraftHeaders=1),Craft.httpProxy&&(i.proxy=Craft.httpProxy),axios.request(i).then((function(t){s._processApiHeaders(t.headers,r).then((function(){a(t.data)})).catch(n)})).catch(n)})).catch(n)}))},_loadingApiHeaders:!1,_apiHeaders:null,_apiHeaderWaitlist:[],_getApiHeaders:function(t){var i=this;return new Promise((function(s,a){i._loadingApiHeaders?i._apiHeaderWaitlist.push([s,a]):i._apiHeaders?s(i._apiHeaders):(i._loadingApiHeaders=!0,i.sendActionRequest("POST","app/api-headers",{cancelToken:t}).then((function(t){i._loadingApiHeaders?s(t.data):a(e)})).catch((function(t){i._rejectApiRequests(a,t)})))}))},_processApiHeaders:function(t,i){var s=this;return new Promise((function(a,n){s._apiHeaders?a():s.sendActionRequest("POST","app/process-api-response-headers",{data:{headers:t},cancelToken:i}).then((function(t){if(s._loadingApiHeaders)for(s._apiHeaders=t.data,s._loadingApiHeaders=!1,a();s._apiHeaderWaitlist.length;)s._apiHeaderWaitlist.shift()[0](s._apiHeaders);else n(e)})).catch((function(t){s._rejectApiRequests(n,t)}))}))},_rejectApiRequests:function(t,e){for(this._loadingApiHeaders=!1,t(e);this._apiHeaderWaitlist.length;)this._apiHeaderWaitlist.shift()[1](e)},clearCachedApiHeaders:function(){for(this._apiHeaders=null,this._loadingApiHeaders=!1;this._apiHeaderWaitlist.length;)this._apiHeaderWaitlist.shift()[1]()},downloadFromUrl:function(t,e,i){return new Promise((function(s,a){var r=new XMLHttpRequest;r.open(t,e,!0),"object"===n(i)?(r.setRequestHeader("Content-Type","application/json; charset=UTF-8"),i=JSON.stringify(i)):r.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"),r.responseType="blob",r.onload=function(){if(200===r.status){var t=r.getResponseHeader("content-disposition"),e=/"([^"]*)"/.exec(t),i=null!=e&&e[1]?e[1]:"Download",n=r.getResponseHeader("content-type"),o=new Blob([r.response],{type:n}),l=document.createElement("a");l.href=window.URL.createObjectURL(o),l.download=i,document.body.appendChild(l),l.click(),document.body.removeChild(l),s()}else a()},r.send(i)}))},stringToArray:function(t){if("string"!=typeof t)return t;for(var e=t.split(","),i=0;i<e.length;i++)e[i]=$.trim(e[i]);return e},findDeltaData:function(t,e,i,s,a,r){t="string"==typeof t?t:"",e="string"==typeof e?e:"",i=$.isArray(i)?i:[],a=$.isPlainObject(a)?a:{},r=$.isArray(r)?r:[],i.sort((function(t,e){return t.length===e.length?0:t.length>e.length?1:-1}));for(var o=this._groupParamsByDeltaNames(t.split("&"),i,!1,a),l=this._groupParamsByDeltaNames(e.split("&"),i,!0,!1),h=l.__root__,d=0;d<i.length;d++)(Craft.inArray(i[d],r)||"object"===n(l[i[d]])&&("object"!==n(o[i[d]])||JSON.stringify(o[i[d]])!==JSON.stringify(l[i[d]])))&&((h=h.concat(l[i[d]])).push("modifiedDeltaNames[]="+i[d]),s&&s(i[d],l[i[d]]));return h.join("&")},_groupParamsByDeltaNames:function(t,e,i,s){var a={};i&&(a.__root__=[]);var n=function(t){return encodeURIComponent(t).replace("%3D","=")};t=t.map((function(t){return decodeURIComponent(t)}));t:for(var r=0;r<t.length;r++){for(var o=e.length-1;o>=0;o--){var l=t[r].substring(0,e[o].length+1);if(l===e[o]+"="||l===e[o]+"["){void 0===a[e[o]]&&(a[e[o]]=[]),a[e[o]].push(n(t[r]));continue t}}i&&a.__root__.push(n(t[r]))}if(s){var h=function(t,e){return $.isArray(e)||$.isPlainObject(e)?e=$.param(e):"string"==typeof e?e=encodeURIComponent(e):null===e&&(e=""),"".concat(encodeURIComponent(t),"=").concat(e)};for(var d in s)if(s.hasOwnProperty(d))if($.isPlainObject(s[d]))for(var c in a[d]=[],s[d])s[d].hasOwnProperty(c)&&a[d].push(h("".concat(d,"[").concat(c,"]"),s[d][c]));else a[d]=[h(d,s[d])]}return a},expandPostArray:function(t){var e,i={};for(var s in t)if(t.hasOwnProperty(s)){var a,r=t[s],o=s.match(/^(\w+)(\[.*)?/);if(o[2])for(a=o[2].match(/\[[^\[\]]*\]/g),e=0;e<a.length;e++)a[e]=a[e].substring(1,a[e].length-1);else a=[];a.unshift(o[1]);var l=i;for(e=0;e<a.length;e++)e<a.length-1?("object"!==n(l[a[e]])&&(a[e+1]&&parseInt(a[e+1])!=a[e+1]?l[a[e]]={}:l[a[e]]=[]),l=l[a[e]]):(a[e]||(a[e]=l.length),l[a[e]]=r)}return i},createForm:function(t){var e=$("<form/>",{attr:{method:"post",action:"","accept-charset":"UTF-8"}});if("string"==typeof t)for(var i,s=t.split("&"),a=0;a<s.length;a++)i=s[a].split("=",2),$("<input/>",{type:"hidden",name:decodeURIComponent(i[0]),value:decodeURIComponent(i[1]||"")}).appendTo(e);return e},compare:function(t,e,i){if(n(t)!==n(e))return!1;if("object"===n(t)){if(t.length!==e.length)return!1;if(t instanceof Array!=e instanceof Array)return!1;if(!(t instanceof Array))if(void 0===i||!0===i){if(!Craft.compare(Craft.getObjectKeys(t).sort(),Craft.getObjectKeys(e).sort()))return!1}else if(!Craft.compare(Craft.getObjectKeys(t),Craft.getObjectKeys(e)))return!1;for(var s in t)if(t.hasOwnProperty(s)&&!Craft.compare(t[s],e[s]))return!1;return!0}return t===e},getObjectKeys:function(t){var e=[];for(var i in t)t.hasOwnProperty(i)&&e.push(i);return e},escapeChars:function(t){Garnish.isArray(t)||(t=t.split());for(var e="",i=0;i<t.length;i++)e+="\\"+t[i];return e},ltrim:function(t,e){if(!t)return t;void 0===e&&(e=" \t\n\r\0\v");var i=new RegExp("^["+Craft.escapeChars(e)+"]+");return t.replace(i,"")},rtrim:function(t,e){if(!t)return t;void 0===e&&(e=" \t\n\r\0\v");var i=new RegExp("["+Craft.escapeChars(e)+"]+$");return t.replace(i,"")},trim:function(t,e){return t=Craft.ltrim(t,e),Craft.rtrim(t,e)},startsWith:function(t,e){return t.substring(0,e.length)===e},filterArray:function(t,e){for(var i=[],s=0;s<t.length;s++)("function"==typeof e?e(t[s],s):t[s])&&i.push(t[s]);return i},inArray:function(t,e){return $.isPlainObject(e)&&(e=Object.values(e)),e.includes(t)},removeFromArray:function(t,e){var i=$.inArray(t,e);return-1!==i&&(e.splice(i,1),!0)},getLast:function(t){return t.length?t[t.length-1]:null},uppercaseFirst:function(t){return t.charAt(0).toUpperCase()+t.slice(1)},lowercaseFirst:function(t){return t.charAt(0).toLowerCase()+t.slice(1)},parseUrl:function(t){var e=t.match(/^(?:(https?):\/\/|\/\/)([^\/\:]*)(?:\:(\d+))?(\/[^\?]*)?(?:\?([^#]*))?(#.*)?/);return e?{scheme:e[1],host:e[2]+(e[3]?":"+e[3]:""),hostname:e[2],port:e[3]||null,path:e[4]||"/",query:e[5]||null,hash:e[6]||null}:{}},getQueryParams:function(){return Object.fromEntries(new URLSearchParams(window.location.search).entries())},getQueryParam:function(t){return new Proxy(new URLSearchParams(window.location.search),{get:function(t,e){return t.get(e)}})[t]},isSameHost:function(t){var e=this.parseUrl(document.location.href);if(!e)return!1;var i=this.parseUrl(t);return!!i&&e.host===i.host},secondsToHumanTimeDuration:function(t,e){void 0===e&&(e=!0);var i=604800,s=Math.floor(t/i);t%=i;var a=Math.floor(t/86400);t%=86400;var n,r=Math.floor(t/3600);t%=3600,e?(n=Math.floor(t/60),t%=60):(n=Math.round(t/60),t=0);var o=[];return s&&o.push(s+" "+(1===s?Craft.t("app","week"):Craft.t("app","weeks"))),a&&o.push(a+" "+(1===a?Craft.t("app","day"):Craft.t("app","days"))),r&&o.push(r+" "+(1===r?Craft.t("app","hour"):Craft.t("app","hours"))),!n&&(e||s||a||r)||o.push(n+" "+(1===n?Craft.t("app","minute"):Craft.t("app","minutes"))),!t&&(!e||s||a||r||n)||o.push(t+" "+(1===t?Craft.t("app","second"):Craft.t("app","seconds"))),o.join(", ")},asciiString:function(t,e){t=t.normalize("NFC");for(var i,s="",a=0;a<t.length;a++)i=t.charAt(a),s+="string"==typeof(e||Craft.asciiCharMap)[i]?(e||Craft.asciiCharMap)[i]:i;return s},uuid:function(){return"function"==typeof crypto.randomUUID?crypto.randomUUID():([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,(function(t){return(t^crypto.getRandomValues(new Uint8Array(1))[0]&15>>t/4).toString(16)}))},namespaceInputName:function(t,e){return e?t.replace(/([^'"\[\]]+)([^'"]*)/,"".concat(e,"[$1]$2")):t},namespaceId:function(t,e){return Craft.formatInputId(e?"".concat(e,"-").concat(t):t)},randomString:function(t){for(var e="",i=0;i<t;i++)e+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".charAt(Math.floor(62*Math.random()));return e},createErrorList:function(t){for(var e=$(document.createElement("ul")).addClass("errors"),i=0;i<t.length;i++){var s=$(document.createElement("li"));s.appendTo(e),s.html(t[i])}return e},appendHeadHtml:function(t){if(t){var e=$("link[href]");if(e.length){for(var i,s=[],a=0;a<e.length;a++)i=e.eq(a).attr("href").replace(/&/g,"&"),s.push(Craft.escapeRegex(i));var n=new RegExp('<link\\s[^>]*href="(?:'+s.join("|")+')".*?></link>',"g");t=t.replace(n,"")}$("head").append(t)}},appendBodyHtml:function(t){if(t){var e=$("script[src]");if(e.length){for(var i,s=[],a=0;a<e.length;a++)i=e.eq(a).attr("src").replace(/&/g,"&"),s.push(Craft.escapeRegex(i));var n=new RegExp('<script\\s[^>]*src="(?:'+s.join("|")+')".*?><\/script>',"g");t=t.replace(n,"")}Garnish.$bod.append(t)}},appendFootHtml:function(t){console.warn("Craft.appendFootHtml() is deprecated. Craft.appendBodyHtml() should be used instead."),this.appendBodyHtml(t)},initUiElements:function(t){$(".grid",t).grid(),$(".info",t).infoicon(),$(".checkbox-select",t).checkboxselect(),$(".fieldtoggle",t).fieldtoggle(),$(".lightswitch",t).lightswitch(),$(".nicetext",t).nicetext(),$(".formsubmit",t).formsubmit(),$(".menubtn:not([data-disclosure-trigger])",t).menubtn(),$("[data-disclosure-trigger]",t).disclosureMenu(),$(".datetimewrapper",t).datetime(),$('.datewrapper > input[type="date"], .timewrapper > input[type="time"]',t).datetimeinput(),$("a",t).each((function(){this.hostname.length&&this.hostname!==location.hostname&&void 0===$(this).attr("target")&&$(this).attr("rel","noopener").attr("target","_blank")}))},_elementIndexClasses:{},_elementSelectorModalClasses:{},_elementEditorClasses:{},registerElementIndexClass:function(t,e){if(void 0!==this._elementIndexClasses[t])throw"An element index class has already been registered for the element type “"+t+"”.";this._elementIndexClasses[t]=e},registerElementSelectorModalClass:function(t,e){if(void 0!==this._elementSelectorModalClasses[t])throw"An element selector modal class has already been registered for the element type “"+t+"”.";this._elementSelectorModalClasses[t]=e},registerElementEditorClass:function(t,e){if(void 0!==this._elementEditorClasses[t])throw"An element editor class has already been registered for the element type “"+t+"”.";this._elementEditorClasses[t]=e},createElementIndex:function(t,e,i){return new(void 0!==this._elementIndexClasses[t]?this._elementIndexClasses[t]:Craft.BaseElementIndex)(t,e,i)},createElementSelectorModal:function(t,e){return new(void 0!==this._elementSelectorModalClasses[t]?this._elementSelectorModalClasses[t]:Craft.BaseElementSelectorModal)(t,e)},createElementEditor:function(t,e,i){return void 0===i&&$.isPlainObject(e)?(i=e,e=null):"object"!==n(i)&&(i={}),i.elementType||(i.elementType=t),new Craft.ElementEditorSlideout(e,i)},getLocalStorage:function(t,e){return t="Craft-"+Craft.systemUid+"."+t,"undefined"!=typeof localStorage&&void 0!==localStorage[t]?JSON.parse(localStorage[t]):e},setLocalStorage:function(t,e){if("undefined"!=typeof localStorage){t="Craft-"+Craft.systemUid+"."+t;try{localStorage[t]=JSON.stringify(e)}catch(t){}}},removeLocalStorage:function(t){"undefined"!=typeof localStorage&&localStorage.removeItem("Craft-".concat(Craft.systemUid,".").concat(t))},getCookie:function(t){return document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)Craft-".concat(Craft.systemUid,":").concat(t,"\\s*\\=\\s*([^;]*).*$)|^.*$")),"$1")},setCookie:function(t,e,i){i=$.extend({},this.defaultCookieOptions,i);var s="Craft-".concat(Craft.systemUid,":").concat(t,"=").concat(encodeURIComponent(e));i.path&&(s+=";path=".concat(i.path)),i.domain&&(s+=";domain=".concat(i.domain)),i.maxAge?s+=";max-age-in-seconds=".concat(i.maxAge):i.expires&&(s+=";expires=".concat(i.expires.toUTCString())),i.secure&&(s+=";secure"),document.cookie=s},removeCookie:function(t){this.setCookie(t,"",new Date("1970-01-01T00:00:00"))},getElementInfo:function(t){var e=$(t);return e.hasClass("element")||(e=e.find(".element:first")),{id:e.data("id"),siteId:e.data("site-id"),label:e.data("label"),status:e.data("status"),url:e.data("url"),hasThumb:e.hasClass("hasthumb"),$element:e}},setElementSize:function(t,e){var i=$(t);if("small"!==e&&"large"!==e&&(e="small"),!i.hasClass(e)){var s="small"===e?"large":"small";if(i.addClass(e).removeClass(s),i.hasClass("hasthumb")){var a=i.find("> .elementthumb > img"),n=$("<img/>",{sizes:("small"===e?"30":"100")+"px",srcset:a.attr("srcset")||a.attr("data-pfsrcset")});a.replaceWith(n),picturefill({elements:[n[0]]})}}},submitForm:function(t,e){if(void 0===e&&(e={}),!e.confirm||confirm(e.confirm)){if(e.action&&$("<input/>",{type:"hidden",name:"action",val:e.action}).appendTo(t),e.redirect&&$("<input/>",{type:"hidden",name:"redirect",val:e.redirect}).appendTo(t),e.params)for(var i in e.params){var s=e.params[i];$("<input/>",{type:"hidden",name:i,val:s}).appendTo(t)}e.retainScroll&&this.setLocalStorage("scrollY",window.scrollY),t.trigger($.extend({type:"submit"},e.data))}},trapFocusWithin:function(t){Garnish.trapFocusWithin(t)},setFocusWithin:function(t){Garnish.setFocusWithin(t)},filterInputVal:function(t,e){for(var i=$(t),s=i.val(),a=i[0].selectionStart,n="",r=0;r<s.length;r++)s[r].match(e)?n+=s[r]:r<a&&a--;n!==s&&(i.val(n),i[0].setSelectionRange(a,a))},filterNumberInputVal:function(t){this.filterInputVal(t,/[0-9.,\-]/)},setElementAttributes:function(e,i){var s=$(e);for(var a in i)if(i.hasOwnProperty(a)){var n=i[a];if(null===n||!1===n)s.removeAttr(a);else if(!0===n)s.attr(a,"");else if($.isArray(n)||$.isPlainObject(n))if(Craft.dataAttributes.includes(a)){for(var r in n=Object.assign({},n))if(n.hasOwnProperty(r)){var o=n[r];null!==o&&!1!==o&&(o=$.isPlainObject(o)||$.isArray(o)?JSON.stringify(o):!0===o?"":this.escapeHtml(o),s.attr("".concat(a,"-").concat(r),o))}}else if("class"===a){$.isPlainObject(n)&&(n=Object.values(n));var l,h=t(n);try{for(h.s();!(l=h.n()).done;){var d=l.value;s.addClass(d)}}catch(t){h.e(t)}finally{h.f()}}else"style"===a?s.css(n):s.attr(a,JSON.stringify(n));else s.attr(a,this.escapeHtml(n))}},isVisible:function(){return void 0===document.visibilityState||"visible"===document.visibilityState},useMobileStyles:function(){return Garnish.isMobileBrowser()||document.body.clientWidth<600}}),Craft.pageId=Craft.uuid(),"undefined"!=typeof BroadcastChannel){var o="CraftCMS:".concat(Craft.appId);Craft.broadcaster=new BroadcastChannel(o),Craft.messageReceiver=new BroadcastChannel(o),Craft.messageReceiver.addEventListener("message",(function(e){if("saveElement"===e.data.event){var i=$('div.element[data-id="'.concat(e.data.id,'"][data-settings]'));if(!i.length)return;for(var s={type:i.data("type"),id:e.data.id,instances:[]},a=0;a<i.length;a++){var n=i.eq(a);s.instances.push(Object.assign({siteId:n.data("site-id")},n.data("settings")))}Craft.sendActionRequest("POST","app/render-element",{data:s}).then((function(e){for(var s=e.data,a=0;a<i.length;a++){var n=i.eq(a);if(s.elementHtml[a]){var r,o=$(s.elementHtml[a]),l=t(o[0].attributes);try{for(l.s();!(r=l.n()).done;){var h=r.value;"class"===h.name?n.addClass(h.value):n.attr(h.name,h.value)}}catch(t){l.e(t)}finally{l.f()}var d=n.find("input,button").detach();n.html(o.html()),d.length&&d.prependTo(n)}}(new Craft.ElementThumbLoader).load(i)}))}}))}$.extend($.fn,{animateLeft:function(t,e,i,s){return"ltr"===Craft.orientation?this.velocity({left:t},e,i,s):this.velocity({right:t},e,i,s)},animateRight:function(t,e,i,s){return"ltr"===Craft.orientation?this.velocity({right:t},e,i,s):this.velocity({left:t},e,i,s)},disable:function(){return this.each((function(){var t=$(this);t.addClass("disabled"),t.data("activatable")&&t.removeAttr("tabindex")}))},enable:function(){return this.each((function(){var t=$(this);t.removeClass("disabled"),t.data("activatable")&&t.attr("tabindex","0")}))},grid:function(){return this.each((function(){var t=$(this),e={};t.data("item-selector")&&(e.itemSelector=t.data("item-selector")),t.data("cols")&&(e.cols=parseInt(t.data("cols"))),t.data("max-cols")&&(e.maxCols=parseInt(t.data("max-cols"))),t.data("min-col-width")&&(e.minColWidth=parseInt(t.data("min-col-width"))),t.data("mode")&&(e.mode=t.data("mode")),t.data("fill-mode")&&(e.fillMode=t.data("fill-mode")),t.data("col-class")&&(e.colClass=t.data("col-class")),t.data("snap-to-grid")&&(e.snapToGrid=!!t.data("snap-to-grid")),new Craft.Grid(this,e)}))},infoicon:function(){return this.each((function(){new Craft.InfoIcon(this)}))},checkboxselect:function(){return this.each((function(){$.data(this,"checkboxselect")||new Garnish.CheckboxSelect(this)}))},fieldtoggle:function(){return this.each((function(){$.data(this,"fieldtoggle")||new Craft.FieldToggle(this)}))},lightswitch:function(t,e,i){return"settings"===t?("string"==typeof e?(t={})[e]=i:t=e,this.each((function(){var e=$.data(this,"lightswitch");e&&e.setSettings(t)}))):($.isPlainObject(t)||(t={}),this.each((function(){var e=$.extend({},t);Garnish.hasAttr(this,"data-value")&&(e.value=$(this).attr("data-value")),Garnish.hasAttr(this,"data-indeterminate-value")&&(e.indeterminateValue=$(this).attr("data-indeterminate-value")),$.data(this,"lightswitch")||new Craft.LightSwitch(this,e)})))},nicetext:function(){return this.each((function(){$.data(this,"nicetext")||new Garnish.NiceText(this)}))},formsubmit:function(){return this.on("click",(function(t){var e=$(t.currentTarget),i=e.data("params")||{};e.data("param")&&(i[e.data("param")]=e.data("value"));var s=e.data("menu")?e.data("menu").$anchor:e,a=s.attr("data-form")?$("#"+s.attr("data-form")):s.closest("form");Craft.submitForm(a,{confirm:e.data("confirm"),action:e.data("action"),redirect:e.data("redirect"),params:i,data:$.extend({customTrigger:e},e.data("event-data"))})}))},menubtn:function(){return this.each((function(){var t=$(this);if(!t.data("menubtn")&&t.next().hasClass("menu")){var e={};t.data("menu-anchor")&&(e.menuAnchor=t.data("menu-anchor")),new Garnish.MenuBtn(t,e)}}))},disclosureMenu:function(){return this.each((function(){var t=$(this);!t.data("trigger")&&t.attr("aria-controls")&&new Garnish.DisclosureMenu(t)}))},datetime:function(){return this.each((function(){var t=$(this),e=t.find('input:not([name$="[timezone]"])'),i=function(){for(var i=!1,s=0;s<e.length;s++)if(e.eq(s).val()){i=!0;break}if(i){if(!t.children(".clear-btn").length)var a=$("<button/>",{type:"button",class:"clear-btn",title:Craft.t("app","Clear"),"aria-label":Craft.t("app","Clear")}).appendTo(t).on("click",(function(){for(var t=0;t<e.length;t++)e.eq(t).val("").trigger("input").trigger("change");a.remove(),e.first().filter('[type="text"]').focus()}))}else t.children(".clear-btn").remove()};e.on("change",i),i()}))},datetimeinput:function(){return this.each((function(){var t=$(this),e=function(){""===t.val()?t.addClass("empty-value"):t.removeClass("empty-value")};t.on("input",e),e()}))}}),Garnish.NiceText.charsLeftHtml=function(t){return Craft.t("app",'<span class="visually-hidden">Characters left:</span> {chars, number}',{chars:t})},Garnish.$doc.ready((function(){Craft.initUiElements()}))},691:function(){function t(t){return function(t){if(Array.isArray(t))return s(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||i(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function e(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(t,e)||i(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function i(t,e){if(t){if("string"==typeof t)return s(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?s(t,e):void 0}}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.CustomizeSourcesModal=Garnish.Modal.extend({elementIndex:null,$elementIndexSourcesContainer:null,$sidebar:null,$sidebarToggleBtn:null,$sourcesContainer:null,$sourcesHeader:null,$sourcesHeading:null,$sourceSettingsContainer:null,$sourceSettingsHeader:null,$addSourceMenu:null,addSourceMenu:null,$footer:null,$footerBtnContainer:null,$saveBtn:null,$cancelBtn:null,$loadingSpinner:null,sourceSort:null,sources:null,selectedSource:null,elementTypeName:null,baseSortOptions:null,availableTableAttributes:null,customFieldAttributes:null,conditionBuilderHtml:null,conditionBuilderJs:null,userGroups:null,init:function(t,e){var i=this;this.base(),this.setSettings(e,{resizable:!0}),this.elementIndex=t,this.$elementIndexSourcesContainer=this.elementIndex.$sidebar.children("nav").children("ul");var s=$('<form class="modal customize-sources-modal"/>').appendTo(Garnish.$bod);this.$sidebar=$('<div class="cs-sidebar block-types"/>').appendTo(s).attr({role:"navigation","aria-label":Craft.t("app","Source")}),this.$sourcesContainer=$('<div class="sources">').appendTo(this.$sidebar),this.$sourceSettingsContainer=$('<div class="source-settings">').appendTo(s),this.$footer=$('<div class="footer"/>').appendTo(s),this.$footerBtnContainer=$('<div class="buttons right"/>').appendTo(this.$footer),this.$cancelBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(this.$footerBtnContainer),this.$saveBtn=Craft.ui.createSubmitButton({class:"disabled",label:Craft.t("app","Save"),spinner:!0}).appendTo(this.$footerBtnContainer),this.$loadingSpinner=$('<div class="spinner"/>').appendTo(this.$sourceSettingsContainer),this.setContainer(s),this.show(),Craft.sendActionRequest("POST","element-index-settings/get-customize-sources-modal-data",{data:{elementType:this.elementIndex.elementType}}).then((function(t){i.$saveBtn.removeClass("disabled"),i.buildModal(t.data)})).finally((function(){i.$loadingSpinner.remove(),Garnish.setFocusWithin(i.$sidebar)})),this.addListener(this.$cancelBtn,"click","hide"),this.addListener(this.$saveBtn,"click","save"),this.addListener(this.$container,"submit","save")},buildModal:function(t){var e=this;this.baseSortOptions=t.baseSortOptions,this.defaultSortOptions=t.defaultSortOptions,this.availableTableAttributes=t.availableTableAttributes,this.customFieldAttributes=t.customFieldAttributes,this.elementTypeName=t.elementTypeName,this.conditionBuilderHtml=t.conditionBuilderHtml,this.conditionBuilderJs=t.conditionBuilderJs,this.userGroups=t.userGroups,t.headHtml&&Craft.appendHeadHtml(t.headHtml),t.bodyHtml&&Craft.appendBodyHtml(t.bodyHtml),this.sourceSort=new Garnish.DragSort({handle:".move",axis:"y"}),this.sources=[];for(var i=0;i<t.sources.length;i++)this.sources.push(this.addSource(t.sources[i]));this.selectedSource||void 0===this.sources[0]||this.sources[0].select();var s=$('<div class="buttons left" data-wrapper/>').appendTo(this.$footer),a=$("<button/>",{type:"button",class:"btn menubtn add icon","aria-label":Craft.t("app","Add…"),"aria-controls":"add-source-menu",title:Craft.t("app","Add…"),"data-disclosure-trigger":""}).appendTo(s);this.$addSourceMenu=$("<div/>",{id:"add-source-menu",class:"menu menu--disclosure"}).appendTo(s);var n=function(t){var i=e.addSource(t,!0);Garnish.scrollContainerToElement(e.$sidebar,i.$item),i.select(),e.addSourceMenu.hide()},r=$("<button/>",{type:"button",class:"menu-option",text:Craft.t("app","New heading")}).on("click",(function(){n({type:"heading"}),e.focusLabelInput()})),o=$("<button/>",{type:"button",class:"menu-option",text:Craft.t("app","New custom source"),"data-type":"custom"}).on("click",(function(){var t=e.baseSortOptions.slice(0);t.push(e.defaultSortOptions),n({type:"custom",key:"custom:".concat(Craft.uuid()),sortOptions:t,defaultSort:[t[0].attr,t[1].defaultDir],tableAttributes:[],availableTableAttributes:[]}),e.focusLabelInput()})),l=$("<ul/>").append($("<li/>").append(r)).appendTo(this.$addSourceMenu);t.conditionBuilderHtml&&$("<li/>").append(o).appendTo(l),Craft.useMobileStyles()&&this.buildSidebarToggleView(),this.addListener(Garnish.$win,"resize",this.updateSidebarView),this.addSourceMenu=new Garnish.DisclosureMenu(a)},focusLabelInput:function(){this.selectedSource.$labelInput.trigger("focus")},getSourceName:function(){return this.selectedSource?this.selectedSource.sourceData.label:this.sources[0].sourceData.label},updateSidebarView:function(){Craft.useMobileStyles()?this.$sidebarToggleBtn||this.buildSidebarToggleView():this.$sidebarToggleBtn&&this.resetView()},resetView:function(){this.$sourceSettingsHeader&&this.$sourceSettingsHeader.remove(),this.$sourcesHeader&&this.$sourcesHeader.remove(),this.$sidebarToggleBtn=null,this.$container.removeClass("sidebar-hidden")},updateHeading:function(){this.$sourcesHeading&&this.$sourcesHeading.text(this.getSourceName())},buildSidebarToggleView:function(){var t=this;this.$sourcesHeader=$('<div class="sources-header"/>').addClass("sidebar-header").prependTo(this.$sourcesContainer),this.$sidebarCloseBtn=Craft.ui.createButton({class:"nav-close close-btn"}).attr("aria-label",Craft.t("app","Close")).removeClass("btn").appendTo(this.$sourcesHeader),this.$sourcesHeading=$('<h1 class="main-heading"/>').text(this.getSourceName()),this.$sourceSettingsHeader=$('<div class="source-settings-header"/>').addClass("main-header").append(this.$sourcesHeading).prependTo(this.$sourceSettingsContainer),this.$sidebarToggleBtn=Craft.ui.createButton({toggle:!0,controls:"modal-sidebar",class:"nav-toggle"}).removeClass("btn").attr("aria-label",Craft.t("app","Show sidebar")).appendTo(this.$sourceSettingsHeader),this.closeSidebar(),this.addListener(this.$sidebarToggleBtn,"click",(function(){t.toggleSidebar()})),this.addListener(this.$sidebarCloseBtn,"click",(function(){t.toggleSidebar(),t.$sidebarToggleBtn.trigger("focus")}))},toggleSidebar:function(){this.sidebarIsOpen()?this.closeSidebar():this.openSidebar()},openSidebar:function(){var t=this;this.$container.removeClass("sidebar-hidden"),this.$sidebarToggleBtn.attr("aria-expanded","true"),this.$sidebar.find(":focusable").first().focus(),Garnish.uiLayerManager.addLayer(this.$sidebar),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.closeSidebar(),Garnish.focusIsInside(t.$sidebar)&&t.$sidebarToggleBtn.focus()}))},closeSidebar:function(){this.$container.addClass("sidebar-hidden"),this.$sidebarToggleBtn&&this.$sidebarToggleBtn.attr("aria-expanded","false"),Garnish.uiLayerManager.currentLayer.$container.hasClass("cs-sidebar")&&Garnish.uiLayerManager.removeLayer()},sidebarIsOpen:function(){return"true"===this.$sidebarToggleBtn.attr("aria-expanded")},addSource:function(t,e){var i,s=$('<div class="customize-sources-item"/>').appendTo(this.$sourcesContainer),a=$('<div class="label customize-sources-item__btn"/>').attr({tabindex:"0",role:"button"}).appendTo(s),n=$('<input type="hidden"/>').appendTo(s);return $('<a class="move icon customize-sources-item__move" title="'.concat(Craft.t("app","Reorder"),'" role="button"></a>')).appendTo(s),"heading"===t.type?(s.addClass("heading"),n.attr("name","sourceOrder[][heading]"),(i=new Craft.CustomizeSourcesModal.Heading(this,s,a,n,t,e)).updateItemLabel(t.heading)):(n.attr("name","sourceOrder[][key]").val(t.key),(i="native"===t.type?new Craft.CustomizeSourcesModal.Source(this,s,a,n,t,e):new Craft.CustomizeSourcesModal.CustomSource(this,s,a,n,t,e)).updateItemLabel(t.label),t.key===this.elementIndex.rootSourceKey&&i.select()),this.sourceSort.addItems(s),i},save:function(t){var e=this;t&&t.preventDefault(),this.$saveBtn.hasClass("disabled")||this.$saveBtn.hasClass("loading")||(this.$saveBtn.addClass("loading"),Craft.sendActionRequest("POST","element-index-settings/save-customize-sources-modal-settings",{data:this.$container.serialize()+"&elementType=".concat(this.elementIndex.elementType)}).then((function(t){var i=t.data,s=null;e.selectedSource&&e.selectedSource.sourceData.key&&!i.disabledSourceKeys.includes(e.selectedSource.sourceData.key)?s=e.selectedSource.sourceData.key:e.elementIndex.sourceKey||(s=e.elementIndex.$visibleSources.first().data("key")),s&&e.elementIndex.selectSourceByKey(s),window.location.reload()})).catch((function(){Craft.cp.displayError(Craft.t("app","A server error occurred."))})).finally((function(){e.$saveBtn.removeClass("loading")})))},appendIndexSourceItem:function(t,e){if(e){var i=t.hasClass("heading");if(e.hasClass("heading")&&!i)t.appendTo(e.children("ul"));else{if(i){var s=e.parentsUntil(this.$elementIndexSourcesContainer,"li").last();s.length&&(e=s)}t.insertAfter(e)}}else t.prependTo(this.$elementIndexSourcesContainer)},destroy:function(){for(var t=0;t<this.sources.length;t++)this.sources[t].destroy();this.addSourceMenu&&(this.addSourceMenu.destroy(),this.$addSourceMenu.remove()),delete this.sources,this.base()}}),Craft.CustomizeSourcesModal.BaseSource=Garnish.Base.extend({modal:null,$item:null,$itemLabel:null,$itemInput:null,$settingsContainer:null,sourceData:null,isNew:null,init:function(t,e,i,s,a,n){var r=this;this.modal=t,this.$item=e,this.$itemLabel=i,this.$itemInput=s,this.sourceData=a,this.isNew=n,this.$item.data("source",this),this.addListener(this.$itemLabel,"click","select"),this.addListener(this.$itemLabel,"keypress",(function(t){return Garnish.handleActivatingKeypress(t,r.select.bind(r))}))},isHeading:function(){return!1},isNative:function(){return!1},isSelected:function(){return this.modal.selectedSource===this},select:function(){this.isSelected()||(this.modal.selectedSource&&this.modal.selectedSource.deselect(),this.$item.addClass("sel"),this.$itemLabel.attr({"aria-current":"true"}),this.modal.selectedSource=this,this.modal.updateHeading(),this.$settingsContainer?this.$settingsContainer.removeClass("hidden"):(this.$settingsContainer=$("<div/>").appendTo(this.modal.$sourceSettingsContainer),this.createSettings(this.$settingsContainer)),this.modal.$sourceSettingsContainer.scrollTop(0))},createSettings:function(){},getIndexSourceItem:function(){},deselect:function(){this.$item.removeClass("sel"),this.$itemLabel.attr({"aria-current":"false"}),this.modal.selectedSource=null,this.$settingsContainer.addClass("hidden")},updateItemLabel:function(t){t?this.$itemLabel.text(t):this.$itemLabel.html(" ")},destroy:function(){this.modal.sourceSort.removeItems(this.$item),this.modal.sources.splice($.inArray(this,this.modal.sources),1),this.isSelected()&&(this.deselect(),this.modal.sources.length&&this.modal.sources[0].select(),Garnish.setFocusWithin(this.modal.$sourceSettingsContainer)),this.$item.data("source",null),this.$item.remove(),this.$settingsContainer&&this.$settingsContainer.remove(),this.base()}}),Craft.CustomizeSourcesModal.Source=Craft.CustomizeSourcesModal.BaseSource.extend({$sortAttributeSelect:null,$sortDirectionPicker:null,$sortDirectionInput:null,sortDirectionListbox:null,isNative:function(){return!0},createSettings:function(t){Craft.ui.createLightswitchField({label:Craft.t("app","Enabled"),name:"sources[".concat(this.sourceData.key,"][enabled]"),on:!this.sourceData.disabled}).appendTo(t),this.createSortField(t),this.createTableAttributesField(t)},createSortField:function(t){var e=this,i=$('<div class="flex"/>'),s=Craft.ui.createSelect({name:"sources[".concat(this.sourceData.key,"][defaultSort][0]"),options:this.sourceData.sortOptions.map((function(t){return{label:t.label,value:t.attr}})),value:this.sourceData.defaultSort[0]}).addClass("fullwidth").appendTo($("<div/>").appendTo(i));this.$sortAttributeSelect=s.children("select").attr("aria-label",Craft.t("app","Sort attribute")),this.$sortDirectionPicker=$("<section/>",{class:"btngroup btngroup--exclusive","aria-label":Craft.t("app","Sort direction")}).append($("<button/>",{type:"button",class:"btn",title:Craft.t("app","Sort ascending"),"aria-label":Craft.t("app","Sort ascending"),"aria-pressed":"false","data-icon":"asc","data-dir":"asc"})).append($("<button/>",{type:"button",class:"btn",title:Craft.t("app","Sort descending"),"aria-label":Craft.t("app","Sort descending"),"aria-pressed":"false","data-icon":"desc","data-dir":"desc"})).appendTo(i),this.$sortDirectionInput=$("<input/>",{type:"hidden",name:"sources[".concat(this.sourceData.key,"][defaultSort][1]")}).appendTo(i),this.sortDirectionListbox=new Craft.Listbox(this.$sortDirectionPicker,{onChange:function(t){e.$sortDirectionInput.val(t.data("dir"))}}),this.$sortAttributeSelect.on("change",(function(){e.handleSortAttributeChange()})),this.handleSortAttributeChange(!0),Craft.ui.createField(i,{label:Craft.t("app","Default Sort"),fieldset:!0}).appendTo(t).addClass("sort-field")},handleSortAttributeChange:function(t){var e=this.$sortAttributeSelect.val();if("structure"===e)this.sortDirectionListbox.select(0),this.sortDirectionListbox.disable(),this.$sortDirectionPicker.addClass("disabled");else{this.sortDirectionListbox.enable(),this.$sortDirectionPicker.removeClass("disabled");var i=t?this.sourceData.defaultSort[1]:this.sourceData.sortOptions.find((function(t){return t.attr===e})).defaultDir;this.sortDirectionListbox.select("asc"===i?0:1)}},createTableAttributesField:function(t){var i=this.availableTableAttributes();if(this.sourceData.tableAttributes.length||i.length){var s=$("<div/>"),a=[];$('<input type="hidden" name="sources['.concat(this.sourceData.key,'][tableAttributes][]" value=""/>')).appendTo(s);for(var n=0;n<this.sourceData.tableAttributes.length;n++){var r=e(this.sourceData.tableAttributes[n],2),o=r[0],l=r[1];s.append(this.createTableColumnOption(o,l,!0)),a.push(o)}for(var h=0;h<i.length;h++){var d=e(i[h],2),c=d[0],u=d[1];Craft.inArray(c,a)||s.append(this.createTableColumnOption(c,u,!1))}new Garnish.DragSort(s.children(),{handle:".move",axis:"y"}),Craft.ui.createField(s,{label:Craft.t("app","Default Table Columns"),instructions:Craft.t("app","Choose which table columns should be visible for this source by default.")}).appendTo(t)}},availableTableAttributes:function(){var e=this.modal.availableTableAttributes.slice(0);return e.push.apply(e,t(this.sourceData.availableTableAttributes)),e},createTableColumnOption:function(t,e,i){return $('<div class="customize-sources-table-column"/>').append('<div class="icon move"/>').append(Craft.ui.createCheckbox({label:Craft.escapeHtml(e),name:"sources[".concat(this.sourceData.key,"][tableAttributes][]"),value:t,checked:i}))},getIndexSourceItem:function(){var t=this.modal.elementIndex.getSourceByKey(this.sourceData.key);if(t)return t.closest("li")}}),Craft.CustomizeSourcesModal.CustomSource=Craft.CustomizeSourcesModal.Source.extend({$labelInput:null,createSettings:function(t){var e=this,i=Craft.ui.createTextField({label:Craft.t("app","Label"),name:"sources[".concat(this.sourceData.key,"][label]"),value:this.sourceData.label}).appendTo(t);this.$labelInput=i.find(".text");var s="condition".concat(Math.floor(1e6*Math.random())),a=function(t){return t.replace(/__ID__/g,s).replace(/__SOURCE_KEY__(?=-)/g,Craft.formatInputId(e.sourceData.key)).replace(/__SOURCE_KEY__/g,e.sourceData.key)},n=this.sourceData.conditionBuilderHtml||a(this.modal.conditionBuilderHtml),r=this.sourceData.conditionBuilderJs||a(this.modal.conditionBuilderJs);Craft.ui.createField($("<div/>").append(n),{id:"criteria",label:Craft.t("app","{type} Criteria",{type:this.modal.elementTypeName})}).appendTo(t),Craft.appendBodyHtml(r),this.createSortField(t),this.createTableAttributesField(t),this.modal.userGroups.length&&Craft.ui.createCheckboxSelectField({label:Craft.t("app","User Groups"),instructions:Craft.t("app","Choose which user groups should have access to this source."),name:"sources[".concat(this.sourceData.key,"][userGroups]"),options:this.modal.userGroups,values:this.sourceData.userGroups||"*",showAllOption:!0}).appendTo(t),t.append("<hr/>"),this.$deleteBtn=$('<a class="error delete"/>').attr({role:"button",tabindex:"0"}).text(Craft.t("app","Delete custom source")).appendTo(t),this.addListener(this.$labelInput,"input","handleLabelInputChange"),this.addListener(this.$deleteBtn,"click","destroy"),this.addListener(this.$deleteBtn,"keypress",(function(t){Garnish.handleActivatingKeypress(t,e.destroy.bind(e))}))},availableTableAttributes:function(){var e=this.base();return this.isNew&&e.push.apply(e,t(this.modal.customFieldAttributes)),e},handleLabelInputChange:function(){this.updateItemLabel(this.$labelInput.val())},getIndexSourceItem:function(){var t,e=this.base();if(e?t=e.find(".label"):(t=$("<span/>",{class:"label"}),e=$("<li/>").append($("<a/>",{"data-key":this.sourceData.key}).append(t))),this.$labelInput){var i=Craft.trim(this.$labelInput.val());""===i&&(i=Craft.t("app","(blank)")),t.text(i)}return e}}),Craft.CustomizeSourcesModal.Heading=Craft.CustomizeSourcesModal.BaseSource.extend({$labelInput:null,$deleteBtn:null,isHeading:function(){return!0},createSettings:function(t){var e=this,i=Craft.ui.createTextField({label:Craft.t("app","Heading"),instructions:Craft.t("app","This can be left blank if you just want an unlabeled separator."),value:this.sourceData.heading||""}).appendTo(t);this.$labelInput=i.find(".text"),t.append("<hr/>"),this.$deleteBtn=$('<a class="error delete"/>').text(Craft.t("app","Delete heading")).attr({role:"button",tabindex:"0"}).appendTo(t),this.addListener(this.$labelInput,"input","handleLabelInputChange"),this.addListener(this.$deleteBtn,"click","destroy"),this.addListener(this.$deleteBtn,"keypress",(function(t){Garnish.handleActivatingKeypress(t,e.destroy.bind(e))}))},handleLabelInputChange:function(){this.updateItemLabel(this.$labelInput.val())},updateItemLabel:function(t){this.$itemLabel.html((t?Craft.escapeHtml(t):"<em>".concat(Craft.t("app","(blank)"),"</em>"))+" "),this.$itemInput.val(t)},getIndexSourceItem:function(){var t=(this.$labelInput?this.$labelInput.val():null)||this.sourceData.heading||"";return $('<li class="heading"/>').append($("<span/>").text(t)).append("<ul/>")}})},1519:function(){Craft.DataTableSorter=Garnish.DragSort.extend({$table:null,init:function(t,e){this.$table=$(t);var i=this.$table.children("tbody").children(":not(.filler)");(e=$.extend({},Craft.DataTableSorter.defaults,e)).container=this.$table.children("tbody"),e.helper=this.getHelper.bind(this),e.caboose="<tr/>",e.axis=Garnish.Y_AXIS,e.magnetStrength=4,e.helperLagBase=1.5,this.base(i,e)},getHelper:function(t){var e=$('<div class="'+this.settings.helperClass+'"/>').appendTo(Garnish.$bod),i=$("<table/>").appendTo(e),s=$("<tbody/>").appendTo(i);t.appendTo(s),i.width(this.$table.width()),i.prop("className",this.$table.prop("className"));for(var a=this.$table.find("tr:first").children(),n=t.children(),r=0;r<n.length;r++)$(n[r]).width($(a[r]).width());return e}},{defaults:{handle:".move",helperClass:"datatablesorthelper"}})},501:function(){Craft.DeleteUserModal=Garnish.Modal.extend({id:null,userId:null,$deleteActionRadios:null,$deleteSubmitBtn:null,userSelect:null,_deleting:!1,init:function(t,e){var i=this;this.id=Math.floor(1e9*Math.random()),this.userId=t,e=$.extend(Craft.DeleteUserModal.defaults,e);var s,a=$('<form class="modal fitted deleteusermodal" method="post" accept-charset="UTF-8">'+Craft.getCsrfInput()+'<input type="hidden" name="action" value="users/delete-user"/>'+(Garnish.isArray(this.userId)?"":'<input type="hidden" name="userId" value="'+this.userId+'"/>')+(e.redirect?'<input type="hidden" name="redirect" value="'+e.redirect+'"/>':"")+"</form>").appendTo(Garnish.$bod),n=$('<div class="body"><div class="content-summary"><p>'+Craft.t("app","What do you want to do with their content?")+'</p><ul class="bullets"></ul></div><div class="options"><label><input type="radio" name="contentAction" value="transfer"/> '+Craft.t("app","Transfer it to:")+'</label><div id="transferselect'+this.id+'" class="elementselect"><div class="elements"></div><button type="button" class="btn add icon dashed">'+Craft.t("app","Choose a user")+'</button></div></div><div><label class="error"><input type="radio" name="contentAction" value="delete"/> '+Craft.t("app","Delete their content")+"</label></div></div>").appendTo(a),r=$('<div class="buttons right"/>').appendTo(n),o=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(r);if(e.contentSummary.length)for(var l=0;l<e.contentSummary.length;l++)n.find("ul").append($("<li/>",{text:e.contentSummary[l]}));else n.find("ul").remove();if(this.$deleteActionRadios=n.find("input[type=radio]"),this.$deleteSubmitBtn=Craft.ui.createSubmitButton({class:"disabled",label:this._submitBtnLabel(!1),spinner:!0}).appendTo(r),Garnish.isArray(this.userId)){s=["and"];for(var h=0;h<this.userId.length;h++)s.push("not "+this.userId[h])}else s="not "+this.userId;this.userSelect=new Craft.BaseElementSelectInput({id:"transferselect"+this.id,name:"transferContentTo",elementType:"craft\\elements\\User",criteria:{id:s},limit:1,modalSettings:{closeOtherModals:!1},onSelectElements:function(){i.updateSizeAndPosition(),i.$deleteActionRadios.first().prop("checked")?i.validateDeleteInputs():i.$deleteActionRadios.first().trigger("click")},onRemoveElements:this.validateDeleteInputs.bind(this),selectable:!1,editable:!1}),this.addListener(o,"click","hide"),this.addListener(this.$deleteActionRadios,"change","validateDeleteInputs"),this.addListener(a,"submit","handleSubmit"),this.base(a,e)},_submitBtnLabel:function(t){var e=t?"Delete {num, plural, =1{user} other{users}} and content":"Delete {num, plural, =1{user} other{users}}";return Craft.t("app",e,{num:Garnish.isArray(this.userId)?this.userId.length:1})},validateDeleteInputs:function(){var t=!1;return this.$deleteActionRadios.eq(1).prop("checked")?(t=!0,this.$deleteSubmitBtn.find(".label").text(this._submitBtnLabel(!0))):(this.$deleteSubmitBtn.find(".label").text(this._submitBtnLabel(!1)),this.$deleteActionRadios.eq(0).prop("checked")&&(t=!!this.userSelect.totalSelected)),this.updateSizeAndPosition(),t?this.$deleteSubmitBtn.removeClass("disabled"):this.$deleteSubmitBtn.addClass("disabled"),t},handleSubmit:function(t){if(!this._deleting&&this.validateDeleteInputs()){this.$deleteSubmitBtn.addClass("loading"),this.disable(),this.userSelect.disable(),this._deleting=!0;try{!1===this.settings.onSubmit()&&t.preventDefault()}catch(e){throw t.preventDefault(),this.$deleteSubmitBtn.removeClass("loading"),e}}else t.preventDefault()},onFadeIn:function(){Garnish.isMobileBrowser(!0)||this.$deleteActionRadios.first().trigger("focus"),this.base()}},{defaults:{contentSummary:[],onSubmit:$.noop,redirect:null}})},2318:function(){Craft.DynamicGenerator=Craft.BaseInputGenerator.extend({callback:$.noop,init:function(t,e,i){this.callback=i,this.base(t,e)},generateTargetValue:function(t){return this.callback(t)}})},4755:function(){Craft.EditableTable=Garnish.Base.extend({initialized:!1,id:null,baseName:null,columns:null,sorter:null,biggestId:-1,$table:null,$tbody:null,$addRowBtn:null,$tableParent:null,$statusMessage:null,rowCount:0,hasMaxRows:!1,hasMinRows:!1,radioCheckboxes:null,init:function(t,e,i,s){var a=this;if(this.id=t,this.baseName=e,this.columns=i,this.setSettings(s,Craft.EditableTable.defaults),this.radioCheckboxes={},this.$table=$("#"+t),this.$tbody=this.$table.children("tbody"),this.$tableParent=this.$table.parent(),this.$statusMessage=this.$tableParent.find("[data-status-message]"),this.rowCount=this.$tbody.find("tr").length,this.$table.data("editable-table")&&(console.warn("Double-instantiating an editable table on an element"),this.$table.data("editable-table").destroy()),this.$table.data("editable-table",this),this.sorter=new Craft.DataTableSorter(this.$table,{helperClass:"editabletablesorthelper",copyDraggeeInputValuesToHelper:!0,onSortChange:function(){a.updateAllRows()}}),this.isVisible()?this.initialize():window.setTimeout(this.initializeIfVisible.bind(this),500),this.settings.minRows&&this.rowCount<this.settings.minRows)for(var n=this.rowCount;n<this.settings.minRows;n++)this.addRow()},isVisible:function(){return this.$table.parent().height()>0},initialize:function(){if(this.initialized)return!1;this.initialized=!0,this.removeListener(Garnish.$win,"resize");for(var t=this.$tbody.children(),e=0;e<t.length;e++)this.createRowObj(t[e]);var i=this.$table.parent(".input");return i.length&&this.$table.width()>i.width()&&i.css("overflow-x","auto"),this.$addRowBtn=this.$table.next(".add"),this.updateAddRowButton(),this.addListener(this.$addRowBtn,"activate","addRow"),!0},initializeIfVisible:function(){this.removeListener(Garnish.$win,"resize"),this.isVisible()?this.initialize():this.addListener(Garnish.$win,"resize","initializeIfVisible")},updateAddRowButton:function(){this.canAddRow()?(this.$addRowBtn.css("opacity","1"),this.$addRowBtn.css("pointer-events","auto"),this.$addRowBtn.attr("aria-disabled","false")):(this.$addRowBtn.css("opacity","0.2"),this.$addRowBtn.css("pointer-events","none"),this.$addRowBtn.attr("aria-disabled","true"))},updateAllRows:function(){if(!this.settings.staticRows)for(var t=this.$table.find("> tbody > tr"),e=0;e<t.length;e++)this.updateRow(t.eq(e))},updateRow:function(t){if(!this.settings.staticRows){var e=t.find("button.delete");e.length&&(e.attr("aria-label",Craft.t("app","Delete row {index}",{index:t.index()+1})),this.canDeleteRow()?e.removeAttr("disabled").removeClass("disabled"):e.attr("disabled","disabled").addClass("disabled"))}},updateDeleteRowButton:function(t){this.updateRow(this.$table.find('tr[data-id="'.concat(t,'"]')))},updateStatusMessage:function(){var t,e=this;this.$statusMessage.empty(),t=this.canAddRow()?Craft.t("app","Row could not be deleted. Minimum number of rows reached."):Craft.t("app","Row could not be added. Maximum number of rows reached."),setTimeout((function(){e.$statusMessage.text(t)}),250)},canDeleteRow:function(){return!!this.settings.allowDelete&&this.rowCount>this.settings.minRows},deleteRow:function(t){this.canDeleteRow()?(this.sorter.removeItems(t.$tr),t.$tr.remove(),this.rowCount--,this.updateAllRows(),this.updateAddRowButton(),0===this.rowCount?(this.$table.addClass("hidden"),this.$addRowBtn.trigger("focus")):this.$tbody.find(":focusable").last().trigger("focus"),this.settings.onDeleteRow(t.$tr),t.destroy()):this.updateStatusMessage()},canAddRow:function(){return!!this.settings.allowAdd&&(!this.settings.maxRows||this.rowCount<this.settings.maxRows)},addRow:function(t,e){if(this.canAddRow()){var i=this.settings.rowIdPrefix+(this.biggestId+1),s=this.createRow(i,this.columns,this.baseName,$.extend({},this.settings.defaultValues));e?s.prependTo(this.$tbody):s.appendTo(this.$tbody);var a=this.createRowObj(s);return this.sorter.addItems(s),!1!==t&&s.find("input:visible,textarea:visible,select:visible").first().trigger("focus"),this.rowCount++,this.updateAllRows(),this.updateAddRowButton(),this.$table.removeClass("hidden"),this.settings.onAddRow(s),a}this.updateStatusMessage()},createRow:function(t,e,i,s){return Craft.EditableTable.createRow(t,e,i,s,this.settings.allowReorder,this.settings.allowDelete)},createRowObj:function(t){return new Craft.EditableTable.Row(this,t)},focusOnPrevRow:function(t,e,i){var s,a=t.prev("tr");if((s=a.length?a.data("editable-table-row"):this.addRow(!1,!0))&&s.$tds[e])if($(s.$tds[e]).hasClass("disabled"))a&&this.focusOnPrevRow(a,e,i);else{var n=$("textarea,input.text",s.$tds[e]);n.length&&($(i).trigger("blur"),n.trigger("focus"))}},focusOnNextRow:function(t,e,i){var s,a=t.next("tr");if((s=a.length?a.data("editable-table-row"):this.addRow(!1))&&s.$tds[e])if($(s.$tds[e]).hasClass("disabled"))a&&this.focusOnNextRow(a,e,i);else{var n=$("textarea,input.text",s.$tds[e]);n.length&&($(i).trigger("blur"),n.trigger("focus"))}},importData:function(t,e,i){for(var s=t.split(/\r?\n|\r/),a=0;a<s.length;a++){for(var n=s[a].split("\t"),r=0;r<n.length;r++){var o=n[r];e.$tds.eq(i+r).find("textarea,input[type!=hidden]").val(o).trigger("input")}var l=e.$tr.next("tr");e=l.length?l.data("editable-table-row"):this.addRow(!1)}},destroy:function(){this.$table.removeData("editable-table"),this.base()}},{textualColTypes:["autosuggest","color","date","email","multiline","number","singleline","template","time","url"],defaults:{rowIdPrefix:"",defaultValues:{},allowAdd:!1,allowReorder:!1,allowDelete:!1,minRows:null,maxRows:null,onAddRow:$.noop,onDeleteRow:$.noop},createRow:function(t,e,i,s,a,n){var r=$("<tr/>",{"data-id":t});for(var o in e)if(e.hasOwnProperty(o)){var l,h=e[o],d=void 0!==s[o]?s[o]:"";if("heading"===h.type)l=$("<th/>",{scope:"row",class:h.class,html:d});else{var c=i+"["+t+"]["+o+"]";switch(l=$("<td/>",{class:"".concat(h.class," ").concat(h.type,"-cell"),width:h.width}),Craft.inArray(h.type,Craft.EditableTable.textualColTypes)&&l.addClass("textual"),h.code&&l.addClass("code"),h.type){case"checkbox":$('<div class="checkbox-wrapper"/>').append(Craft.ui.createCheckbox({name:c,value:h.value||"1",checked:!!d})).appendTo(l);break;case"color":Craft.ui.createColorInput({name:c,value:d,small:!0}).appendTo(l);break;case"date":Craft.ui.createDateInput({name:c,value:d}).appendTo(l);break;case"lightswitch":Craft.ui.createLightswitch({name:c,value:h.value||"1",on:!!d,small:!0}).appendTo(l);break;case"select":Craft.ui.createSelect({name:c,options:h.options,value:d||function(){for(var t in h.options)if(h.options.hasOwnProperty(t)&&h.options[t].default)return void 0!==h.options[t].value?h.options[t].value:t;return null}(),class:"small"}).appendTo(l);break;case"time":Craft.ui.createTimeInput({name:c,value:d}).appendTo(l);break;case"email":case"url":Craft.ui.createTextInput({name:c,value:d,type:h.type,placeholder:h.placeholder||null}).appendTo(l);break;default:$("<textarea/>",{name:c,rows:h.rows||1,val:d,placeholder:h.placeholder}).appendTo(l)}}l.appendTo(r)}return a&&$("<td/>",{class:"thin action"}).append($("<a/>",{class:"move icon",title:Craft.t("app","Reorder"),role:"button",type:"button"})).appendTo(r),n&&$("<td/>",{class:"thin action"}).append($("<button/>",{class:"delete icon",title:Craft.t("app","Delete"),type:"button"})).appendTo(r),r}}),Craft.EditableTable.Row=Garnish.Base.extend({table:null,id:null,niceTexts:null,$tr:null,$tds:null,tds:null,$textareas:null,$deleteBtn:null,init:function(t,e){this.table=t,this.$tr=$(e),this.$tds=this.$tr.children(),this.tds=[],this.id=this.$tr.attr("data-id"),this.$tr.data("editable-table-row",this);var i=parseInt(this.id.substring(this.table.settings.rowIdPrefix.length));i>this.table.biggestId&&(this.table.biggestId=i),this.$textareas=$(),this.niceTexts=[];var s,a,n,r,o,l={},h=0;for(s in this.table.columns)this.table.columns.hasOwnProperty(s)&&(a=this.table.columns[s],n=this.tds[s]=this.$tds[h],Craft.inArray(a.type,Craft.EditableTable.textualColTypes)?(r=$("textarea",n),this.$textareas=this.$textareas.add(r),this.addListener(r,"focus","onTextareaFocus"),this.addListener(r,"mousedown","ignoreNextTextareaFocus"),this.niceTexts.push(new Garnish.NiceText(r,{onHeightChange:this.onTextareaHeightChange.bind(this)})),this.addListener(r,"keypress",{tdIndex:h,type:a.type},"handleKeypress"),this.addListener(r,"input",{type:a.type},"validateValue"),r.trigger("input"),"multiline"!==a.type&&this.addListener(r,"paste",{tdIndex:h,type:a.type},"handlePaste"),l[s]=r):"checkbox"===a.type&&(o=$('input[type="checkbox"]',n),a.radioMode&&(void 0===this.table.radioCheckboxes[s]&&(this.table.radioCheckboxes[s]=[]),this.table.radioCheckboxes[s].push(o[0]),this.addListener(o,"change",{colId:s},"onRadioCheckboxChange")),a.toggle&&this.addListener(o,"change",{colId:s},(function(t){this.applyToggleCheckbox(t.data.colId)}))),$(n).hasClass("disabled")||this.addListener(n,"click",{td:n},(function(t){t.target===t.data.td&&$(t.data.td).find("textarea,input,select,.lightswitch").focus()})),h++);for(s in this.onTextareaHeightChange(),this.table.columns)this.table.columns.hasOwnProperty(s)&&"checkbox"===(a=this.table.columns[s]).type&&a.toggle&&this.applyToggleCheckbox(s);for(s in this.table.columns)this.table.columns.hasOwnProperty(s)&&(a=this.table.columns[s]).autopopulate&&void 0!==l[a.autopopulate]&&!l[s].val()&&new Craft.HandleGenerator(l[s],l[a.autopopulate],{allowNonAlphaStart:!0});var d=this.$tr.children().last().find(".delete");this.addListener(d,"click","deleteRow");var c=this.$tr.find("input,textarea,select,.lightswitch");this.addListener(c,"focus",(function(t){$(t.currentTarget).closest("td:not(.disabled)").addClass("focus")})),this.addListener(c,"blur",(function(t){$(t.currentTarget).closest("td").removeClass("focus")}))},onTextareaFocus:function(t){this.onTextareaHeightChange();var e=$(t.currentTarget);e.data("ignoreNextFocus")?e.data("ignoreNextFocus",!1):window.setTimeout((function(){Craft.selectFullValue(e)}),0)},onRadioCheckboxChange:function(t){if(t.currentTarget.checked)for(var e=0;e<this.table.radioCheckboxes[t.data.colId].length;e++){var i=this.table.radioCheckboxes[t.data.colId][e];i.checked=i===t.currentTarget}},applyToggleCheckbox:function(t){for(var e,i,s=this.table.columns[t],a=$('input[type="checkbox"]',this.tds[t]).prop("checked"),n=0;n<s.toggle.length;n++)e=s.toggle[n],this.table.colum,(i="!"===e[0])&&(e=e.substring(1)),a&&!i||!a&&i?$(this.tds[e]).removeClass("disabled").find("textarea, input").prop("disabled",!1):$(this.tds[e]).addClass("disabled").find("textarea, input").prop("disabled",!0)},ignoreNextTextareaFocus:function(t){$.data(t.currentTarget,"ignoreNextFocus",!0)},handleKeypress:function(t){var e=t.keyCode?t.keyCode:t.charCode,i=Garnish.isCtrlKeyPressed(t);if(e===Garnish.RETURN_KEY&&("multiline"!==t.data.type||i))return t.preventDefault(),void(t.shiftKey?this.table.focusOnPrevRow(this.$tr,t.data.tdIndex,t.currentTarget):this.table.focusOnNextRow(this.$tr,t.data.tdIndex,t.currentTarget))},handlePaste:function(t){var e=Craft.trim(t.originalEvent.clipboardData.getData("Text")," \n\r");e.match(/[\t\r\n]/)&&(t.preventDefault(),this.table.importData(e,this,t.data.tdIndex))},validateValue:function(t){if("multiline"!==t.data.type)if("number"!==t.data.type){var e=t.currentTarget.value.replace(/[\r\n]/g,"");e!==t.currentTarget.value&&(t.currentTarget.value=e)}else Craft.filterNumberInputVal(t.currentTarget)},onTextareaHeightChange:function(){for(var t=-1,e=0;e<this.niceTexts.length;e++)this.niceTexts[e].height>t&&(t=this.niceTexts[e].height);this.$textareas.css("min-height",t);var i=this.$textareas.filter(":visible").first().parent().height();i>t&&this.$textareas.css("min-height",i)},deleteRow:function(){this.table.deleteRow(this)}},{numericKeyCodes:[9,8,37,38,39,40,45,91,46,190,48,49,50,51,52,53,54,55,56,57]})},8468:function(){Craft.ElementActionTrigger=Garnish.Base.extend({maxLevels:null,newChildUrl:null,$trigger:null,$selectedItems:null,triggerEnabled:!0,init:function(t){$.isPlainObject(t)||(t={}),void 0!==t.batch&&(t.bulk=t.batch,delete t.batch),Object.defineProperty(t,"batch",{get:function(){return this.bulk},set:function(t){this.bulk=t}}),this.setSettings(t,Craft.ElementActionTrigger.defaults),this.$trigger=$("#"+t.type.replace(/[\[\]\\]+/g,"-")+"-actiontrigger"),this.settings.activate&&(this.$trigger.data("custom-handler",!0),"FORM"===this.$trigger.prop("nodeName")?this.addListener(this.$trigger,"submit","handleTriggerActivation"):this.addListener(this.$trigger,"click","handleTriggerActivation")),this.updateTrigger(),Craft.elementIndex.on("selectionChange",this.updateTrigger.bind(this))},updateTrigger:function(){0!==Craft.elementIndex.getSelectedElements().length&&(this.validateSelection()?this.enableTrigger():this.disableTrigger())},validateSelection:function(){var t=!0;return this.$selectedItems=Craft.elementIndex.getSelectedElements(),!this.settings.bulk&&this.$selectedItems.length>1?t=!1:"function"==typeof this.settings.validateSelection&&(t=this.settings.validateSelection(this.$selectedItems)),t},enableTrigger:function(){this.triggerEnabled||(this.$trigger.removeClass("disabled"),this.triggerEnabled=!0)},disableTrigger:function(){this.triggerEnabled&&(this.$trigger.addClass("disabled"),this.triggerEnabled=!1)},handleTriggerActivation:function(t){t.preventDefault(),t.stopPropagation(),this.triggerEnabled&&this.settings.activate(this.$selectedItems)}},{defaults:{type:null,bulk:!0,validateSelection:null,activate:null}})},5049:function(){function t(t,i){if(t){if("string"==typeof t)return e(t,i);var s=Object.prototype.toString.call(t).slice(8,-1);return"Object"===s&&t.constructor&&(s=t.constructor.name),"Map"===s||"Set"===s?Array.from(t):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?e(t,i):void 0}}function e(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.ElementEditor=Garnish.Base.extend({isFullPage:null,$container:null,$tabContainer:null,$contentContainer:null,$revisionBtn:null,$revisionLabel:null,$spinner:null,$expandSiteStatusesBtn:null,$statusIcon:null,$previewBtn:null,$editMetaBtn:null,metaHud:null,$nameTextInput:null,$saveMetaBtn:null,$siteStatusPane:null,$globalLightswitch:null,$siteLightswitches:null,$additionalSiteField:null,siteIds:null,newSiteIds:null,enableAutosave:null,lastSerializedValue:null,listeningForChanges:!1,pauseLevel:0,timeout:null,cancelToken:null,ignoreFailedRequest:!1,queue:null,submittingForm:!1,duplicatedElements:null,failed:!1,httpStatus:null,httpError:null,openingPreview:!1,preview:null,activatedPreviewToken:!1,previewTokenQueue:null,previewLinks:null,scrollY:null,hiddenTipsStorageKey:"Craft-"+Craft.systemUid+".TipField.hiddenTips",get tipDismissBtn(){return this.$container.find(".tip-dismiss-btn")},get slideout(){return this.$container.data("slideout")},init:function(e,i){var s=this;if(this.$container=$(e),"FORM"!==this.$container.prop("tagName"))throw"Element editors may only be used with forms.";this.$container.data("elementEditor")&&(console.warn("Double-instantiating an element editor on an element."),this.$container.data("elementEditor").destroy()),this.$container.data("elementEditor",this),this.$container.attr("data-element-editor",""),this.setSettings(i,Craft.ElementEditor.defaults),this.isFullPage=this.$container[0]===Craft.cp.$primaryForm[0],this.isFullPage?(this.$tabContainer=$("#tabs"),this.$contentContainer=$("#content")):(this.$tabContainer=this.slideout.$tabContainer,this.$contentContainer=this.slideout.$content),this.queue=this._createQueue(),this.previewTokenQueue=this._createQueue(),this.duplicatedElements={},this.enableAutosave=Craft.autosaveDrafts,this.previewLinks=[],this.siteIds=Object.keys(this.settings.siteStatuses).map((function(t){return parseInt(t)})),this.$revisionBtn=this.$container.find(".context-btn"),this.$revisionLabel=this.$container.find(".revision-label"),this.$previewBtn=this.$container.find(".preview-btn");var a,n,r=this.isFullPage?$("#page-title"):this.slideout.$toolbar;if(this.$spinner=$("<div/>",{class:"revision-spinner spinner hidden",title:Craft.t("app","Saving")}).appendTo(r),this.$statusIcon=$("<div/>",{class:"revision-status ".concat(this.isFullPage?"invisible":"hidden")}).appendTo(r),this.$statusMessage=$("<div/>",{class:"revision-status-message visually-hidden","aria-live":"polite"}).appendTo(r),this.$expandSiteStatusesBtn=$(".expand-status-btn"),this.settings.canEditMultipleSites&&this.addListener(this.$expandSiteStatusesBtn,"click","expandSiteStatuses"),this.settings.previewTargets.length&&this.isFullPage){this.settings.enablePreview&&this.addListener(this.$previewBtn,"click","openPreview");var o=this.$container.find(".preview-btn-container");if(1===this.settings.previewTargets.length){var l=(a=this.settings.previewTargets,n=1,function(t){if(Array.isArray(t))return t}(a)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(a,n)||t(a,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];this.createPreviewLink(l).addClass("view-btn btn").attr("aria-label",Craft.t("app","View")).appendTo(o)}else this.createShareMenu(o)}this.settings.revisionId||(this.$container.data("serializer",(function(){return s.serializeForm(!0)})),this.$container.data("initialSerializedValue",this.serializeForm(!0)),this.isFullPage&&this.addListener(this.$container,"submit","handleSubmit"),this.settings.isProvisionalDraft?this.initForProvisionalDraft():this.settings.draftId&&!this.settings.isUnpublishedDraft?this.initForDraft():this.settings.canSaveCanonical||this.addListener(this.$container,"submit.saveShortcut",(function(t){t.saveShortcut&&(t.preventDefault(),s.createDraft(),s.removeListener(s.$container,"submit.saveShortcut"))})),this.listenForChanges(),this.addListener(this.$statusIcon,"click",(function(){s.showStatusHud(s.$statusIcon)})),this.handleDismissibleTips(),this.isFullPage&&Craft.messageReceiver&&Craft.broadcaster.addEventListener("message",(function(t){if("saveDraft"===t.data.event&&t.data.canonicalId===s.settings.canonicalId&&(t.data.draftId===s.settings.draftId||t.data.isProvisionalDraft&&!s.settings.draftId)||"saveElement"===t.data.event&&t.data.id===s.settings.canonicalId&&!s.settings.draftId)Craft.setLocalStorage("scrollY",window.scrollY),window.location.reload();else if("deleteDraft"===t.data.event&&t.data.canonicalId===s.settings.canonicalId&&t.data.draftId===s.settings.draftId){var e=new URL(window.location.href);e.searchParams.delete("draftId"),e.href!==document.location.href?window.location.href=e:(Craft.setLocalStorage("scrollY",window.scrollY),window.location.reload())}})))},_createQueue:function(){var t=this,e=new Craft.Queue;return e.on("beforeRun",(function(){t.showSpinner()})),e.on("afterRun",(function(){t.hideSpinner()})),e},get namespace(){return this.isFullPage?null:this.slideout.namespace},namespaceInputName:function(t){return Craft.namespaceInputName(t,this.namespace)},namespaceId:function(t){return Craft.namespaceId(t,this.namespace)},listenForChanges:function(){var t=this;if(!(this.listeningForChanges||this.pauseLevel>0)&&this.enableAutosave&&this.settings.canCreateDrafts){this.listeningForChanges=!0;var e=this.isFullPage?Garnish.$bod:this.$container;this.addListener(e,"keypress,keyup,change,focus,blur,click,mousedown,mouseup",(function(e){$(e.target).is(t.statusIcons())||(clearTimeout(t.timeout),["keypress","keyup","change"].includes(e.type)?t.timeout=setTimeout(t.checkForm.bind(t),500):t.checkForm())}))}},stopListeningForChanges:function(){this.listeningForChanges&&(this.removeListener(Garnish.$bod,"keypress,keyup,change,focus,blur,click,mousedown,mouseup"),clearTimeout(this.timeout),this.listeningForChanges=!1)},pause:function(){this.pauseLevel++,this.stopListeningForChanges()},resume:function(){if(0===this.pauseLevel)throw"Craft.ElementEditor::resume() should only be called after pause().";this.pauseLevel--,0===this.pauseLevel&&this.enableAutosave&&(this.checkForm(),this.listenForChanges())},initForProvisionalDraft:function(){var t=this,e=this.$container.find(".discard-changes-btn");if(!e.length){var i,s,a;this.isFullPage?(i=$("#content").height(),s=Garnish.$win.scrollTop(),a=Craft.cp.$noticeContainer):a=this.$container.find(".so-notice");var n=$("<div/>",{class:"draft-notice"}).append($("<div/>",{class:"draft-icon","aria-hidden":"true","data-icon":"edit"})).append($("<p/>",{text:Craft.t("app","Showing your unsaved changes.")})).appendTo(a);if(e=$("<button/>",{type:"button",class:"discard-changes-btn btn",text:Craft.t("app","Discard")}).appendTo(n),this.isFullPage){var r=$("#content").height()-i;if(Garnish.$win.scrollTop(s+r),Garnish.$win.scrollTop()===s){Craft.cp.$contentContainer.css("pointer-events","none"),$("#content-header").css("min-height","auto");var o=a.height();a.css({height:o-r,overflow:"hidden"}).velocity({height:o},"fast",(function(){$("#content-header").css("min-height",""),a.css({height:"",overflow:""}),setTimeout((function(){Craft.cp.$contentContainer.css("pointer-events","")}),300)}))}}}this.addListener(e,"keypress,keyup,change,focus,blur,click,mousedown,mouseup",(function(t){t.stopPropagation()})),this.addListener(e,"click",(function(){confirm(Craft.t("app","Are you sure you want to discard your changes?"))&&t.queue.unshift((function(){return new Promise((function(e,i){t.isFullPage?Craft.submitForm(t.$container,{action:"elements/delete-draft",redirect:t.settings.hashedCpEditUrl,params:{draftId:t.settings.draftId,provisional:1}}):Craft.sendActionRequest("POST","elements/delete-draft",{data:{elementId:t.settings.canonicalId,draftId:t.settings.draftId,provisional:1}}).then((function(e){Craft.cp.displaySuccess(e.data.message),t.slideout.close()})).catch(i)}))}))}))},initForDraft:function(){var t=this;this.createEditMetaBtn(),this.settings.canSaveCanonical&&Garnish.uiLayerManager.registerShortcut({keyCode:Garnish.S_KEY,ctrl:!0,alt:!0},(function(){Craft.submitForm(t.$container,{action:"elements/apply-draft",redirect:t.settings.hashedCpEditUrl})}),0)},expandSiteStatuses:function(){var t=this;this.removeListener(this.$expandSiteStatusesBtn,"click"),this.$expandSiteStatusesBtn.velocity({opacity:0},"fast",(function(){t.$expandSiteStatusesBtn.remove()}));var e=this.$container.find(".enabled-for-site-".concat(this.settings.siteId,"-field"));if(this.$siteStatusPane=e.parent(),this.settings.revisionId)this._getOtherSupportedSites().forEach((function(e){return t._createSiteStatusField(e)}));else{e.addClass("nested");var i=Craft.ui.createLightswitchField({label:Craft.t("app","Enabled for all sites"),name:this.namespaceInputName("enabled")}).insertBefore(e);i.find("label").css("font-weight","bold"),this.$globalLightswitch=i.find(".lightswitch"),this.settings.revisionId||this._showField(i);var s=Object.values(this.settings.siteStatuses),a=s.includes(!0),n=s.includes(!1),r=a&&n?"-":a?"1":"",o=encodeURIComponent(this.namespaceInputName("enabledForSite[".concat(this.settings.siteId,"]")))+"="+(this.settings.enabledForSite?"1":"");this.$siteLightswitches=e.find(".lightswitch").on("change",this._updateGlobalStatus.bind(this)),this._getOtherSupportedSites().forEach((function(e){return t._createSiteStatusField(e)}));for(var l=encodeURIComponent(this.namespaceInputName("enabled"))+"=".concat(r),h=0;h<this.$siteLightswitches.length;h++){var d=this.$siteLightswitches.eq(h).data("lightswitch").$input;l+="&"+encodeURIComponent(d.attr("name"))+"="+d.val()}this.$container.data("initialSerializedValue",this.$container.data("initialSerializedValue").replace(o,l)),this.lastSerializedValue&&(this.lastSerializedValue=this.lastSerializedValue.replace(o,l)),this.settings.additionalSites&&this.settings.additionalSites.length&&this.isFullPage&&this._createAddlSiteField(),this.$globalLightswitch.focus(),this.$globalLightswitch.on("change",this._updateSiteStatuses.bind(this)),this._updateGlobalStatus()}},_getOtherSupportedSites:function(){var t=this;return Craft.sites.filter((function(e){return e.id!=t.settings.siteId&&t.siteIds.includes(e.id)}))},_showField:function(t){var e=t.height();t.css({overflow:"hidden","min-height":"auto"}).height(0).velocity({height:e},"fast",(function(){t.css({overflow:"",height:"","min-height":""})}))},_removeField:function(t){t.css({overflow:"hidden","min-height":"auto"}).velocity({height:0},"fast",(function(){t.remove()}))},_updateGlobalStatus:function(){var t=!0,e=!0;this.$siteLightswitches.each((function(){if($(this).data("lightswitch").on?e=!1:t=!1,!t&&!e)return!1})),t?this.$globalLightswitch.data("lightswitch").turnOn(!0):e?this.$globalLightswitch.data("lightswitch").turnOff(!0):this.$globalLightswitch.data("lightswitch").turnIndeterminate(!0)},_updateSiteStatuses:function(){var t=this.$globalLightswitch.data("lightswitch").on;this.$siteLightswitches.each((function(){t?$(this).data("lightswitch").turnOn(!0):$(this).data("lightswitch").turnOff(!0)}))},_createSiteStatusField:function(t,e){var i=Craft.ui.createLightswitchField({fieldClass:"enabled-for-site-".concat(t.id,"-field"),label:t.name,name:this.namespaceInputName("enabledForSite[".concat(t.id,"]")),on:void 0!==e?e:!this.settings.siteStatuses.hasOwnProperty(t.id)||this.settings.siteStatuses[t.id],disabled:!!this.settings.revisionId});if(this.$additionalSiteField?i.insertBefore(this.$additionalSiteField):i.appendTo(this.$siteStatusPane),!this.settings.revisionId){i.addClass("nested");var s=i.find(".lightswitch").on("change",this._updateGlobalStatus.bind(this));this.$siteLightswitches=this.$siteLightswitches.add(s)}return this._showField(i),i},_createAddlSiteField:function(){var i,s=this,a=Craft.sites.filter((function(t){return!s.siteIds.includes(t.id)&&s.settings.additionalSites.some((function(e){return e.siteId==t.id}))}));if(a.length){var n="add-site-label",r=$("<span/>",{text:Craft.t("app","Add a site..."),class:"visually-hidden",id:n}),o=Craft.ui.createSelect({options:[{label:Craft.t("app","Add a site…")}].concat((i=a.map((function(t){return{label:t.name,value:t.id}})),function(t){if(Array.isArray(t))return e(t)}(i)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(i)||t(i)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())),labelledBy:n}).addClass("fullwidth");this.$additionalSiteField=Craft.ui.createField(o,{}).addClass("nested add").appendTo(this.$siteStatusPane),r.prependTo(this.$additionalSiteField);var l=o.find("select");l.on("change",(function(){var t=parseInt(l.val()),e=Craft.sites.find((function(e){return e.id===t}));if(e){var i=s.settings.additionalSites.find((function(t){return t.siteId==e.id}));s._createSiteStatusField(e,i.enabledByDefault),s._updateGlobalStatus(),l.val("").find('option[value="'.concat(t,'"]')).remove(),null===s.newSiteIds&&(s.newSiteIds=[]),s.siteIds.push(t),s.newSiteIds.push(t),1===l.find("option").length&&s._removeField(s.$additionalSiteField)}})),this._showField(this.$additionalSiteField)}},showStatusHud:function(t){var e;this.failed?(e='<p class="error"><strong>'.concat(this._saveFailMessage(),"</strong></p>"),this.httpError&&(e+='<p class="http-error code">'.concat(Craft.escapeHtml(this.httpError),"</p>")),400===this.httpStatus&&(e+='<button class="btn refresh-btn">'.concat(Craft.t("app","Refresh"),"</button>"))):e="<p>".concat(this._saveSuccessMessage(),"</p>");var i=new Garnish.HUD(t,e,{hudClass:"hud revision-status-hud",onHide:function(){i.destroy()}});i.$mainContainer.find(".refresh-btn").on("click",(function(){window.location.reload()}))},_saveSuccessMessage:function(){return this.settings.isProvisionalDraft||this.settings.isUnpublishedDraft?Craft.t("app","Your changes have been stored."):Craft.t("app","The draft has been saved.")},_saveFailMessage:function(){return this.settings.isProvisionalDraft||this.settings.isUnpublishedDraft?Craft.t("app","Your changes could not be stored."):Craft.t("app","The draft could not be saved.")},spinners:function(){return this.preview?this.$spinner.add(this.preview.$spinner):this.$spinner},showSpinner:function(){this.spinners().removeClass("hidden")},hideSpinner:function(){this.spinners().addClass("hidden")},statusIcons:function(){return this.preview?this.$statusIcon.add(this.preview.$statusIcon):this.$statusIcon},statusMessage:function(){return this.preview?this.$statusMessage.add(this.preview.$statusMessage):this.$statusMessage},createEditMetaBtn:function(){var t=this.$container.find(".context-btngroup");this.$editMetaBtn=$("<button/>",{type:"button",class:"btn edit icon","aria-expanded":"false","aria-label":Craft.t("app","Edit draft settings"),title:Craft.t("app","Edit draft settings")}).appendTo(t),t.find(".btngroup-btn-last").removeClass("btngroup-btn-last"),this.addListener(this.$editMetaBtn,"click","showMetaHud")},createPreviewLink:function(t,e){var i=this,s=$("<a/>",{href:this.getTokenizedPreviewUrl(t.url,null,!1),text:e||Craft.t("app","View"),target:"_blank",data:{targetUrl:t.url,targetLabel:t.label}});return this.addListener(s,"click",(function(){setTimeout((function(){i.activatePreviewToken()}),1)})),this.previewLinks.push(s),s},updatePreviewLinks:function(){var t=this;this.previewLinks.forEach((function(e){t.updatePreviewLinkHref(e),t.activatedPreviewToken&&t.removeListener(e,"click")}))},updatePreviewLinkHref:function(t){t.attr("href",this.getTokenizedPreviewUrl(t.data("targetUrl"),null,!1))},activatePreviewToken:function(){this.settings.isLive||(this.activatedPreviewToken=!0,this.updatePreviewLinks())},createShareMenu:function(t){var e=this,i=$("<button/>",{type:"button",class:"view-btn btn menubtn",text:Craft.t("app","View")}).appendTo(t),s=$("<div/>",{class:"menu"}).appendTo(t),a=$("<ul/>").appendTo(s);this.settings.previewTargets.forEach((function(t){$("<li/>").append(e.createPreviewLink(t,t.label)).appendTo(a)})),new Garnish.MenuBtn(i)},getPreviewTokenParams:function(){var t={elementType:this.settings.elementType,canonicalId:this.settings.canonicalId,siteId:this.settings.siteId,revisionId:this.settings.revisionId,previewToken:this.settings.previewToken};return this.settings.draftId&&!this.settings.isProvisionalDraft&&(t.draftId=this.settings.draftId),t},getPreviewToken:function(){var t=this;return this.previewTokenQueue.push((function(){return new Promise((function(e,i){t.activatedPreviewToken?e(t.settings.previewToken):Craft.sendActionRequest("POST","preview/create-token",{data:t.getPreviewTokenParams()}).then((function(){t.activatePreviewToken(),e(t.settings.previewToken)})).catch(i)}))}))},getTokenizedPreviewUrl:function(t,e,i){var s=this;void 0===i&&(i=!0);var a={};if(!e&&this.settings.isLive||(a[e||"x-craft-preview"]=Craft.randomString(10)),this.settings.siteToken&&(a[Craft.siteToken]=this.settings.siteToken),this.settings.isLive){var n=Craft.getUrl(t,a);return i?new Promise((function(t){t(n)})):n}if(!this.settings.previewToken)throw"Missing preview token";a[Craft.tokenParam]=this.settings.previewToken;var r=Craft.getUrl(t,a);if(this.activatedPreviewToken)return i?new Promise((function(t){t(r)})):r;if(i)return new Promise((function(t,e){s.getPreviewToken().then((function(){t(r)})).catch(e)}));var o=this.getPreviewTokenParams();return o.redirect=r,Craft.getActionUrl("preview/create-token",o)},getPreview:function(){var t=this;return this.preview||(this.preview=new Craft.Preview(this),this.enableAutosave||(this.preview.on("open",(function(){t.enableAutosave=!0,t.listenForChanges()})),this.preview.on("close",(function(){t.enableAutosave=!1,t.stopListeningForChanges();var e=t.statusIcons();e.hasClass("checkmark-icon")&&e.addClass("hidden")}))),this.preview.on("close",(function(){t.scrollY&&(window.scrollTo(0,t.scrollY),t.scrollY=null)}))),this.preview},openPreview:function(){var t=this;Garnish.hasAttr(this.$previewBtn,"aria-disabled")||(this.$previewBtn.attr("aria-disabled",!0),this.$previewBtn.addClass("loading"),this.queue.push((function(){return new Promise((function(e,i){t.openingPreview=!0,t.ensureIsDraftOrRevision(!0).then((function(){t.scrollY=window.scrollY,t.$previewBtn.removeAttr("aria-disabled"),t.$previewBtn.removeClass("loading"),t.getPreview().open(),t.openingPreview=!1,e()})).catch(i)}))})))},ensureIsDraftOrRevision:function(t){var e=this;return new Promise((function(i,s){if(e.settings.draftId||e.settings.revisionId)i();else{if(t&&e.serializeForm(!0)===e.$container.data("initialSerializedValue"))return void i();e.createDraft().then(i).catch(s)}}))},serializeForm:function(t){var e=this.$container.serialize();if(this.isPreviewActive()&&(e=e.replace("__PREVIEW_FIELDS__=1",this.preview.$editor.serialize())),t&&!this.settings.isUnpublishedDraft){var i=this.namespaceInputName("action"),s=this.namespaceInputName("redirect");e=(e=e.replace(new RegExp("&".concat(Craft.escapeRegex(i),"=[^&]*")),"")).replace(new RegExp("&".concat(Craft.escapeRegex(s),"=[^&]*")),"")}return e},checkForm:function(t){var e=this;return this.queue.push((function(){return new Promise((function(i,s){if(e.settings.revisionId||e.pauseLevel>0||!e.enableAutosave||!e.settings.canCreateDrafts)i();else if(clearTimeout(e.timeout),e.timeout=null,void 0!==e.$container.data("initialSerializedValue")){var a=e.serializeForm(!0);t||a!==(e.lastSerializedValue||e.$container.data("initialSerializedValue"))?e.saveDraft(a).then(i).catch((function(t){console.warn("Couldn’t save draft:",t),s(t)})):i()}else e.timeout=setTimeout(e.checkForm.bind(e),500)}))}))},isPreviewActive:function(){return this.preview&&this.preview.isActive},createDraft:function(){var t=this;return this.queue.push((function(){return new Promise((function(e,i){t.saveDraft(t.serializeForm(!0)).then(e).catch(i)}))}))},saveDraft:function(t){var e=this;return new Promise((function(i,s){if(e.submittingForm)s("Form already being submitted.");else{e.lastSerializedValue=t,e.failed=!1,e.httpStatus=null,e.httpError=null,e.cancelToken=axios.CancelToken.source(),e.statusIcons().velocity("stop").css("opacity","").removeClass("hidden invisible checkmark-icon alert-icon fade-out").addClass("hidden"),e.statusMessage().empty(),e.$saveMetaBtn&&e.$saveMetaBtn.addClass("active");var a,n,r,o=[],l=e.prepareData(t,e.settings.isUnpublishedDraft?null:function(t,e){e.length&&o.push(decodeURIComponent(e[0].split("=")[0]))}),h=(a={},n=e.namespaceInputName("visibleLayoutElements"),r=e.settings.visibleLayoutElements,n in a?Object.defineProperty(a,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):a[n]=r,a);!e.settings.isProvisionalDraft&&e.settings.draftId||(h[e.namespaceInputName("provisional")]=1);var d=e.$contentContainer.children("[data-layout-tab]:not(.hidden)").data("id");d&&(h[e.namespaceInputName("selectedTab")]=d),l+="&".concat($.param(h)),Craft.sendActionRequest("POST","elements/save-draft",{cancelToken:e.cancelToken.token,headers:e._saveHeaders,data:l}).then((function(s){e._afterSaveDraft();var a=!e.settings.draftId;a&&(e.settings.isProvisionalDraft=!0,e.$revisionLabel.append($("<span/>",{text:" — ".concat(Craft.t("app","Edited"))}))),e.isFullPage&&(s.data.title&&e.$container.find(".screen-title").text(s.data.title),s.data.docTitle&&(document.title=s.data.docTitle)),e.settings.isProvisionalDraft||(e.$revisionLabel.text(s.data.draftName),e.settings.draftName=s.data.draftName);var n=e.$revisionBtn.data("menubtn")?e.$revisionBtn.data("menubtn").menu:null;for(var r in e.newSiteIds&&(n||(e.$revisionBtn.removeClass("disabled").addClass("menubtn"),new Garnish.MenuBtn(e.$revisionBtn),(n=e.$revisionBtn.data("menubtn").menu).$container.removeClass("hidden")),e.newSiteIds.forEach((function(t){var i=n.$options.filter("[data-site-id=".concat(t,"]")),s=e.settings.additionalSites.find((function(e){return e.siteId==t}));s&&void 0!==s.enabledByDefault&&!s.enabledByDefault||i.find(".status").removeClass("disabled").addClass("enabled"),i.parent().removeClass("hidden").closest(".site-group").removeClass("hidden")})),n.$container.find(".revision-hr").removeClass("hidden"),e.newSiteIds=null),e.settings.isProvisionalDraft?a&&(e.$container.find("input.action-input").attr("value","elements/apply-draft"),e.settings.draftId=s.data.draftId,e.settings.isLive=!1,e.previewToken=null,e.initForProvisionalDraft()):n&&(n.$options.filter(".sel").find(".draft-name").text(s.data.draftName),n.$options.filter(".sel").find(".draft-meta").text(s.data.creator?Craft.t("app","Saved {timestamp} by {creator}",{timestamp:s.data.timestamp,creator:s.data.creator}):Craft.t("app","Saved {timestamp}",{timestamp:s.data.timestamp}))),s.data.previewTargets&&JSON.stringify(s.data.previewTargets)!==JSON.stringify(e.settings.previewTargets)&&e.updatePreviewTargets(s.data.previewTargets),a&&(e.updatePreviewLinks(),e.trigger("createProvisionalDraft")),e.$nameTextInput&&e.checkMetaValues(),s.data.duplicatedElements)r!=e.settings.canonicalId&&s.data.duplicatedElements.hasOwnProperty(r)&&(e.duplicatedElements[r]=s.data.duplicatedElements[r]);for(var l=s.data.modifiedAttributes.map((function(t){return t=e.namespaceInputName(t),'[name="'.concat(t,'"],[name^="').concat(t,'["]')})).concat(o.map((function(t){return'[name="'.concat(t,'"]')}))),h=$(l.join(",")).parents().filter(".field:not(:has(> .status-badge))"),c=0;c<h.length;c++)h.eq(c).prepend($("<div/>",{class:"status-badge modified",title:Craft.t("app","This field has been modified.")}).append($("<span/>",{class:"visually-hidden",html:Craft.t("app","This field has been modified.")})));for(var u=e.serializeForm(!0)===t,p=$(),f={},g=!1,m=0;m<s.data.missingElements.length;m++){var v=s.data.missingElements[m],b=e.$contentContainer.children('[data-layout-tab="'.concat(v.uid,'"]'));b.length||(b=$("<div/>",{id:e.namespaceId(v.id),class:"flex-fields","data-id":v.id,"data-layout-tab":v.uid}),v.id!==d&&b.addClass("hidden"),b.appendTo(e.$contentContainer)),p=p.add(b);for(var C=0;C<v.elements.length;C++){var _=v.elements[C];if(!1!==_.html){if(f[v.uid]||(f[v.uid]=[]),f[v.uid].push(_.uid),"string"==typeof _.html){var w=b.children('[data-layout-element="'.concat(_.uid,'"]')),S=$(_.html);w.length?w.replaceWith(S):S.appendTo(b),Craft.initUiElements(S),g=!0}}else{var y=b.children('[data-layout-element="'.concat(_.uid,'"]'));if(!y.length||!Garnish.hasAttr(y,"data-layout-element-placeholder")){var T=$("<div/>",{class:"hidden","data-layout-element":_.uid,"data-layout-element-placeholder":""});y.length?y.replaceWith(T):T.appendTo(b),g=!0}}}}var I=e.$contentContainer.children("[data-layout-tab]").not(p).not('[data-layout-tab=""]');I.length&&(I.remove(),g=!0),p.filter(":not(.hidden)").length||p.first().removeClass("hidden"),e.settings.visibleLayoutElements=f,e.isFullPage?Craft.cp.updateTabs(s.data.tabs):e.slideout.updateTabs(s.data.tabs),Craft.appendHeadHtml(s.data.headHtml),Craft.appendBodyHtml(s.data.bodyHtml),g&&(s.data.initialDeltaValues&&Object.assign(e.$container.data("initial-delta-values"),s.data.initialDeltaValues),u&&(e.lastSerializedValue=e.serializeForm(!0))),e.handleDismissibleTips(),e.afterUpdate(t),Craft.broadcaster&&Craft.broadcaster.postMessage({pageId:Craft.pageId,event:"saveDraft",canonicalId:e.settings.canonicalId,draftId:e.settings.draftId,isProvisionalDraft:e.settings.isProvisionalDraft}),i()})).catch((function(t){e._afterSaveDraft(),e.ignoreFailedRequest||(e.failed=!0,t&&t.response&&(e.httpStatus=t.response.status,e.httpError=t.response.data?t.response.data.message:null),e._showFailStatus(),s(t)),e.ignoreFailedRequest=!1}))}}))},_afterSaveDraft:function(){this.$saveMetaBtn&&this.$saveMetaBtn.removeClass("active")},_showFailStatus:function(){this.statusIcons().velocity("stop").css("opacity","").removeClass("hidden checkmark-icon").addClass("alert-icon"),this.setStatusMessage(this._saveFailMessage())},prepareData:function(t,e){t=Craft.findDeltaData(this.$container.data("initialSerializedValue"),t,this.$container.data("delta-names"),e,this.$container.data("initial-delta-values"),this.$container.data("modified-delta-names")),t=this.swapDuplicatedElementIds(t);var i={};return this.settings.draftId&&(i[this.namespaceInputName("draftId")]=this.settings.draftId,this.settings.isProvisionalDraft&&(i[this.namespaceInputName("provisional")]=1)),null!==this.settings.draftName&&(i[this.namespaceInputName("draftName")]=this.settings.draftName),$.isEmptyObject(i)||(t+="&".concat($.param(i))),t},get _saveHeaders(){var t={"content-type":"application/x-www-form-urlencoded"};return this.namespace&&(t["X-Craft-Namespace"]=this.namespace),t},swapDuplicatedElementIds:function(t){var e=this,i=Object.keys(this.duplicatedElements).join("|");if(""===i)return t;var s=encodeURIComponent("["),a=encodeURIComponent("]"),n=this.namespaceInputName("fields");for(n=this.isFullPage?Craft.escapeRegex(n):encodeURIComponent(n);t!==(t=t.replace(new RegExp("(&".concat(n).concat(s,"[^=]+").concat(a).concat(s,")(").concat(i,")(").concat(a,")"),"g"),(function(t,i,s,a){return e._filterFieldInputName(i)?i+e.duplicatedElements[s]+a:t})).replace(new RegExp("&(".concat(n).concat(s,"[^=]+)=(").concat(i,")\\b"),"g"),(function(t,i,n){return!e._filterFieldInputName(i)||i.match(new RegExp("".concat(s,"(enabled|sortOrder|type|typeId)").concat(a,"$")))?t:"&".concat(i,"=").concat(e.duplicatedElements[n])}))););return t},_filterFieldInputName:function(t){var e=encodeURIComponent("["),i=encodeURIComponent("]"),s=t.match(new RegExp("(\\bfields|".concat(e,"fields").concat(i,")").concat(e,".+?").concat(i),"g"));if(!s)throw"Unexpected input name: ".concat(t);var a=s[s.length-1].match(new RegExp("(?:\\bfields|".concat(e,"fields").concat(i,")").concat(e,"(.+?)").concat(i)))[1];return Craft.fieldsWithoutContent.includes(a)},updatePreviewTargets:function(t){var e=this;t.forEach((function(t){var i=e.settings.previewTargets.find((function(e){return e.label===t.label}));i&&(i.url=t.url);var s=e.previewLinks.find((function(e){return e.data("targetLabel")===t.label}));s&&(s.data("targetUrl",t.url),e.updatePreviewLinkHref(s))}))},afterUpdate:function(t){this.$container.data("initialSerializedValue",t),this.$container.data("initial-delta-values",{});var e=this.statusIcons().velocity("stop").css("opacity","").removeClass("hidden").addClass("checkmark-icon");this.setStatusMessage(this._saveSuccessMessage()),Craft.autosaveDrafts||e.velocity("stop").velocity({opacity:0},{delay:2e3,complete:function(){e.addClass("hidden")}}),this.trigger("update")},setStatusMessage:function(t){this.statusIcons().attr("title",t),this.statusMessage().empty().append($("<span/>",{class:"visually-hidden",text:t}))},showMetaHud:function(){this.metaHud?this.metaHud.show():(this.createMetaHud(),this.onMetaHudShow()),Garnish.isMobileBrowser(!0)||this.$nameTextInput.trigger("focus")},createMetaHud:function(){var t=$("<div/>"),e=$('<div class="field"><div class="heading"><label for="draft-name">'+Craft.t("app","Draft Name")+"</label></div></div>").appendTo(t),i=$('<div class="input"/>').appendTo(e);this.$nameTextInput=$('<input type="text" class="text fullwidth" id="draft-name"/>').appendTo(i).val(this.settings.draftName);var s=$('<div class="hud-footer flex flex-center"/>').appendTo(t);$('<div class="flex-grow"></div>').appendTo(s),this.$saveMetaBtn=$("<button/>",{type:"submit",class:"btn submit disabled","aria-disabled":"true",text:Craft.t("app","Save")}).appendTo(s),this.metaHud=new Garnish.HUD(this.$editMetaBtn,t,{onSubmit:this.saveMeta.bind(this)}),this.addListener(this.$nameTextInput,"input","checkMetaValues"),this.metaHud.on("show",this.onMetaHudShow.bind(this)),this.metaHud.on("hide",this.onMetaHudHide.bind(this)),this.metaHud.on("escape",this.onMetaHudEscape.bind(this))},onMetaHudShow:function(){this.$editMetaBtn.addClass("active"),this.$editMetaBtn.attr("aria-expanded","true")},onMetaHudHide:function(){this.$editMetaBtn.removeClass("active"),this.$editMetaBtn.attr("aria-expanded","false"),Garnish.focusIsInside(this.metaHud.$body)&&this.$editMetaBtn.trigger("focus")},onMetaHudEscape:function(){this.$nameTextInput.val(this.settings.draftName)},checkMetaValues:function(){return this.$nameTextInput.val()&&this.$nameTextInput.val()!==this.settings.draftName?(this.$saveMetaBtn.removeClass("disabled"),this.$saveMetaBtn.removeAttr("aria-disabled"),!0):(this.$saveMetaBtn.addClass("disabled"),this.$saveMetaBtn.attr("aria-disabled","true"),!1)},shakeMetaHud:function(){Garnish.shake(this.metaHud.$hud)},saveMeta:function(){var t=this;return new Promise((function(e,i){if(!t.checkMetaValues())return t.shakeMetaHud(),void i();t.settings.draftName=t.$nameTextInput.val(),t.metaHud.hide(),t.checkForm(!0).then(e).catch(i)}))},handleSubmit:function(t){var e=this;if(t.preventDefault(),t.stopPropagation(),!this.submittingForm)if(!this.settings.draftId||this.settings.isUnpublishedDraft||this.settings.isProvisionalDraft||void 0!==t.autosave&&!t.autosave||!(t.saveShortcut||t.customTrigger&&"elements/save-draft"===t.customTrigger.data("action"))||!this.enableAutosave){this.submittingForm=!0,Craft.cp.$confirmUnloadForms=Craft.cp.$confirmUnloadForms.not(this.$container),this.cancelToken&&(this.ignoreFailedRequest=!0,this.cancelToken.cancel()),this.trigger("beforeSubmit");var i=this.prepareData(this.serializeForm(!1));if(this.isFullPage){this.stopListeningForChanges();var s=Craft.createForm(i);s.appendTo(Garnish.$bod),s.submit()}else this.slideout.showSubmitSpinner(),Craft.sendActionRequest("POST",null,{headers:this._saveHeaders,data:i}).then((function(t){e.slideout.handleSubmitResponse(t)})).catch((function(t){e.slideout.handleSubmitError(t)})).finally((function(){e.submittingForm=!1,e.slideout.hideSubmitSpinner()}))}else this.checkForm(!0)},handleDismissibleTips:function(){var t=this;this.addListener(this.tipDismissBtn,"click",(function(e){t.hideTip(e)}))},getHiddenTipsUids:function(){return Craft.getLocalStorage("dismissedTips",[])},setHiddenTipsUids:function(t){Craft.setLocalStorage("dismissedTips",t)},hideTip:function(t){var e=t.target;if(e){var i=$(e).closest(".readable");if(i.length){var s=i.data("layout-element");if(i.remove(),"undefined"!=typeof Storage){var a=this.getHiddenTipsUids();a.includes(s)||(a.push(s),this.setHiddenTipsUids(a))}}}}},{defaults:{additionalSites:[],canCreateDrafts:!1,canEditMultipleSites:!1,canSaveCanonical:!1,canonicalId:null,draftId:null,draftName:null,elementType:null,enablePreview:!1,enabled:!1,enabledForSite:!1,hashedCpEditUrl:null,isLive:!1,isProvisionalDraft:!1,isUnpublishedDraft:!1,previewTargets:[],previewToken:null,revisionId:null,siteId:null,siteStatuses:null,siteToken:null,visibleLayoutElements:{}}})},4211:function(){Craft.ElementEditorSlideout=Craft.CpScreenSlideout.extend({$element:null,init:function(t,e){var i=this;this.$element=$(t),e=Object.assign({},Craft.ElementEditorSlideout.defaults,e,{showHeader:!0}),this.base("elements/edit",e),this.on("load",(function(){var t=i.$container.data("elementEditor");t&&t.on("beforeSubmit",(function(){Object.keys(i.settings.saveParams).forEach((function(e){$("<input/>",{class:"hidden",name:t.namespaceInputName(e),value:i.settings.saveParams[e]}).appendTo(i.$container)}))}))})),this.on("submit",(function(t){if(Craft.broadcaster&&Craft.broadcaster.postMessage({event:"saveElement",id:t.response.data.element.id}),i.settings.onSaveElement){var e=Object.assign({},t.response.data,t.response.data.element);delete e.element,delete e.modelName,delete e.message,i.settings.onSaveElement(e)}Craft.Preview.refresh()}))},getParams:function(){var t={};return this.settings.elementType&&(t.elementType=this.settings.elementType),this.settings.elementId?t.elementId=this.settings.elementId:this.$element&&this.$element.data("id")&&(t.elementId=this.$element.data("id")),this.settings.draftId?t.draftId=this.settings.draftId:this.$element&&this.$element.data("draft-id")?t.draftId=this.$element.data("draft-id"):this.settings.revisionId?t.revisionId=this.settings.revisionId:this.$element&&this.$element.data("revision-id")&&(t.revisionId=this.$element.data("revision-id")),this.settings.siteId?t.siteId=this.settings.siteId:this.$element&&this.$element.data("site-id")&&(t.siteId=this.$element.data("site-id")),this.settings.prevalidate&&(t.prevalidate=1),t},handleSubmit:function(t){this.$container.data("elementEditor").handleSubmit(t)}},{defaults:{elementId:null,draftId:null,revisionId:null,elementType:null,siteId:null,prevalidate:!1,saveParams:{},onSaveElement:null,validators:[]}})},7998:function(){Craft.ElementFieldSettings=Garnish.Base.extend({allowMultipleSources:null,$maintainHierarchyField:null,$maintainHierarchyInput:null,$sourcesField:null,$sourceSelect:null,$branchLimitField:null,$maxRelationsField:null,$minRelationsField:null,init:function(t,e,i,s,a,n){this.allowMultipleSources=t,this.$maintainHierarchyField=$("#".concat(e)),this.$maintainHierarchyInput=this.$maintainHierarchyField.find('input[type="checkbox"]'),this.$sourcesField=$("#".concat(i)),this.allowMultipleSources||(this.$sourceSelect=this.$sourcesField.find("select")),this.$branchLimitField=$("#".concat(s)),this.$minRelationsField=$("#".concat(a)),this.$maxRelationsField=$("#".concat(n)),this.updateLimitFields(),this.addListener(this.$maintainHierarchyInput,"change","updateLimitFields"),this.allowMultipleSources?this.$sourcesField.find("[type=checkbox]").each(function(t,e){this.addListener($(e),"change","updateMaintainHierarchyField")}.bind(this)):this.addListener(this.$sourceSelect,"change","updateMaintainHierarchyField"),this.updateMaintainHierarchyField()},updateLimitFields:function(){!this.$maintainHierarchyField.hasClass("hidden")&&this.$maintainHierarchyInput.is(":checked")?(this.$minRelationsField.addClass("hidden"),this.$maxRelationsField.addClass("hidden"),this.$branchLimitField.removeClass("hidden")):(this.$branchLimitField.addClass("hidden"),this.$minRelationsField.removeClass("hidden"),this.$maxRelationsField.removeClass("hidden"))},updateMaintainHierarchyField:function(){var t;if(this.allowMultipleSources){var e=this.$sourcesField.find('[type="checkbox"]:checked');t=1===e.length&&e.data("structure-id")}else t=this.$sourceSelect.children("option:selected").data("structure-id");t?this.$maintainHierarchyField.removeClass("hidden"):this.$maintainHierarchyField.addClass("hidden"),this.updateLimitFields()}})},8895:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.ElementThumbLoader=Garnish.Base.extend({queue:null,workers:[],init:function(){this.queue=[];for(var t=0;t<3;t++)this.workers.push(new Craft.ElementThumbLoader.Worker(this))},load:function(t){for(var e=this,i=t.find(".elementthumb"),s=function(t){var s=i.eq(t),a=s.scrollParent();if("FIELDSET"===a.prop("nodeName")&&(a=a.scrollParent()),a[0]===document.body&&(a=Garnish.$doc),e.isVisible(s,a))e.addToQueue(s[0]);else{var n="thumb"+Math.floor(1e6*Math.random());Craft.ElementThumbLoader.invisibleThumbs[n]=[e,s,a],a.on("scroll.".concat(n),{$thumb:s,$scrollParent:a,key:n},(function(t){e.isVisible(t.data.$thumb,t.data.$scrollParent)&&(delete Craft.ElementThumbLoader.invisibleThumbs[t.data.key],a.off("scroll.".concat(t.data.key)),e.addToQueue(t.data.$thumb[0]))}))}},a=0;a<i.length;a++)s(a)},addToQueue:function(t){this.queue.push(t);for(var e=0;e<this.workers.length;e++)this.workers[e].active||this.workers[e].loadNext()},isVisible:function(t,e){var i,s,a=t.offset().top;return e[0]===document?(i=e.scrollTop(),s=Garnish.$win.height()):(i=e.offset().top,s=e.height()),a>i&&a<i+s+1e3},destroy:function(){for(var t=0;t<this.workers.length;t++)this.workers[t].destroy();this.base()}},{invisibleThumbs:{},retryAll:function(){for(var e in Craft.ElementThumbLoader.invisibleThumbs){var i=(r=Craft.ElementThumbLoader.invisibleThumbs[e],o=3,function(t){if(Array.isArray(t))return t}(r)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(r,o)||function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(r,o)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=i[0],a=i[1],n=i[2];delete Craft.ElementThumbLoader.invisibleThumbs[e],n.off("scroll.".concat(e)),s.load(a.parent())}var r,o}}),Craft.ElementThumbLoader.Worker=Garnish.Base.extend({loader:null,active:!1,init:function(t){this.loader=t},loadNext:function(){var t=this.loader.queue.shift();if(void 0!==t){this.active=!0;var e=$(t);if(e.find("img").length)this.loadNext();else{var i=$("<img/>",{sizes:e.attr("data-sizes"),srcset:e.attr("data-srcset"),alt:e.attr("data-alt")||""});this.addListener(i,"load,error","loadNext"),i.appendTo(e),picturefill({elements:[i[0]]})}}else this.active=!1}})},4233:function(){Craft.ElevatedSessionForm=Garnish.Base.extend({$form:null,inputs:null,init:function(t,e){if(this.$form=$(t),void 0!==e){this.inputs=[],e=$.makeArray(e);for(var i=0;i<e.length;i++)for(var s=$(e[i]),a=0;a<s.length;a++){var n=s.eq(a);this.inputs.push({input:n,val:Garnish.getInputPostVal(n)})}}this.addListener(this.$form,"submit","handleFormSubmit")},handleFormSubmit:function(t){if(Craft.elevatedSessionManager.fetchingTimeout)return t.preventDefault(),void t.stopImmediatePropagation();if(this.inputs){for(var e,i=!1,s=0;s<this.inputs.length;s++)if((e=this.inputs[s].input).data("passwordInput")&&(e=e.data("passwordInput").$currentInput),Garnish.getInputPostVal(e)!==this.inputs[s].val){i=!0;break}if(!i)return}t.preventDefault(),t.stopImmediatePropagation(),Craft.elevatedSessionManager.requireElevatedSession(this.submitForm.bind(this))},submitForm:function(){this.disable(),this.$form.trigger("submit"),this.enable()}})},9699:function(){Craft.ElevatedSessionManager=Garnish.Base.extend({fetchingTimeout:!1,passwordModal:null,$passwordInput:null,$submitBtn:null,$errorPara:null,callback:null,requireElevatedSession:function(t){var e=this;this.callback=t,this.fetchingTimeout=!0,Craft.sendActionRequest("POST","users/get-elevated-session-timeout").then((function(t){e.fetchingTimeout=!1,!1===t.data.timeout||t.data.timeout>=Craft.ElevatedSessionManager.minSafeElevatedSessionTimeout?e.callback():e.showPasswordModal()})).catch((function(){e.fetchingTimeout=!1}))},showPasswordModal:function(){var t=this;if(this.passwordModal)this.passwordModal.show();else{var e=$('<form id="elevatedsessionmodal" class="modal secure fitted"/>'),i=$('<div class="body"><p>'+Craft.t("app","Enter your password to continue.")+"</p></div>").appendTo(e),s=$('<div class="inputcontainer">').appendTo(i),a=$('<div class="flex"/>').appendTo(s),n=$('<div class="flex-grow"/>').appendTo(a),r=$("<td/>").appendTo(a),o=$('<div class="passwordwrapper"/>').appendTo(n);this.$passwordInput=$('<input type="password" class="text password fullwidth" placeholder="'+Craft.t("app","Password")+'" autocomplete="current-password"/>').appendTo(o),this.$submitBtn=Craft.ui.createSubmitButton({class:"disabled",label:Craft.t("app","Submit"),spinner:!0}).appendTo(r),this.$errorPara=$('<p class="error"/>').appendTo(i),this.passwordModal=new Garnish.Modal(e,{closeOtherModals:!1,onFadeIn:function(){setTimeout(t.focusPasswordInput.bind(t),100)},onFadeOut:function(){t.$passwordInput.val("")}}),new Craft.PasswordInput(this.$passwordInput,{onToggleInput:function(e){t.$passwordInput=e}}),this.addListener(this.$passwordInput,"input","validatePassword"),this.addListener(e,"submit","submitPassword")}},focusPasswordInput:function(){Garnish.isMobileBrowser(!0)||this.$passwordInput.trigger("focus")},validatePassword:function(){return this.$passwordInput.val().length>=6?(this.$submitBtn.removeClass("disabled"),!0):(this.$submitBtn.addClass("disabled"),!1)},submitPassword:function(t){var e=this;if(t&&t.preventDefault(),this.validatePassword()){this.$submitBtn.addClass("loading"),this.clearLoginError();var i={currentPassword:this.$passwordInput.val()};Craft.sendActionRequest("POST","users/start-elevated-session",{data:i}).then((function(t){e.$submitBtn.removeClass("loading"),e.passwordModal.hide(),e.callback()})).catch((function(t){var i=t.response;e.$submitBtn.removeClass("loading"),e.showPasswordError(i.data.message||Craft.t("app","Incorrect password.")),Garnish.shake(e.passwordModal.$container),e.focusPasswordInput()}))}},showPasswordError:function(t){null==t&&(t=Craft.t("app","A server error occurred.")),this.$errorPara.text(t),this.passwordModal.updateSizeAndPosition()},clearLoginError:function(){this.showPasswordError("")}},{minSafeElevatedSessionTimeout:5}),Craft.elevatedSessionManager=new Craft.ElevatedSessionManager},1402:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.EntryIndex=Craft.BaseElementIndex.extend({publishableSections:null,$newEntryBtnGroup:null,$newEntryBtn:null,init:function(t,e,i){this.publishableSections=[],this.on("selectSource",this.updateButton.bind(this)),this.on("selectSite",this.updateButton.bind(this)),this.base(t,e,i)},afterInit:function(){var t=this;this.publishableSections=Craft.publishableSections.filter((function(e){return!!t.getSourceByKey("section:".concat(e.uid))})),this.base()},getDefaultSourceKey:function(){if("index"===this.settings.context&&"undefined"!=typeof defaultSectionHandle){if("singles"===defaultSectionHandle)return"singles";for(var t=0;t<this.$sources.length;t++){var e=$(this.$sources[t]);if(e.data("handle")===defaultSectionHandle)return e.data("key")}}return this.base()},updateButton:function(){var e,i=this;if(this.$source&&(e="singles"===this.$source.data("key")?"singles":this.$source.data("handle"),this.publishableSections.length&&function(){i.$newEntryBtnGroup&&i.$newEntryBtnGroup.remove();var s,a=i.publishableSections.find((function(t){return t.handle===e}));i.$newEntryBtnGroup=$('<div class="btngroup submit" data-wrapper/>');var n="new-entry-menu-"+Craft.randomString(10);if(a){var r="index"===i.settings.context?Craft.t("app","New entry"):Craft.t("app","New {section} entry",{section:a.name}),o="index"===i.settings.context?Craft.t("app","New entry in the {section} section",{section:a.name}):r,l="index"===i.settings.context?"link":null;i.$newEntryBtn=Craft.ui.createButton({label:r,ariaLabel:o,spinner:!0,role:l}).addClass("submit add icon").appendTo(i.$newEntryBtnGroup),i.addListener(i.$newEntryBtn,"click mousedown",(function(t){"index"===i.settings.context&&("click"===t.type&&Garnish.isCtrlKeyPressed(t)||"mousedown"===t.type&&1===t.originalEvent.button)?window.open(Craft.getUrl("entries/".concat(a.handle,"/new"))):"click"===t.type&&i._createEntry(a.id)})),i.publishableSections.length>1&&(s=$("<button/>",{type:"button",class:"btn submit menubtn btngroup-btn-last","aria-controls":n,"data-disclosure-trigger":"","aria-label":Craft.t("app","New entry, choose a section")}).appendTo(i.$newEntryBtnGroup))}else i.$newEntryBtn=s=Craft.ui.createButton({label:Craft.t("app","New entry"),ariaLabel:Craft.t("app","New entry, choose a section"),spinner:!0}).addClass("submit add icon menubtn btngroup-btn-last").attr("aria-controls",n).attr("data-disclosure-trigger","").appendTo(i.$newEntryBtnGroup);if(i.addButton(i.$newEntryBtnGroup),s){var h,d=$("<div/>",{id:n,class:"menu menu--disclosure"}).appendTo(i.$newEntryBtnGroup),c=$("<ul/>").appendTo(d),u=function(e,i){var s="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!s){if(Array.isArray(e)||(s=function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(e))||i&&e&&"number"==typeof e.length){s&&(e=s);var a=0,n=function(){};return{s:n,n:function(){return a>=e.length?{done:!0}:{done:!1,value:e[a++]}},e:function(t){throw t},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){s=s.call(e)},n:function(){var t=s.next();return o=t.done,t},e:function(t){l=!0,r=t},f:function(){try{o||null==s.return||s.return()}finally{if(l)throw r}}}}(i.publishableSections);try{var p=function(){var t=h.value,e="index"===i.settings.context?"link":"button";if("index"===i.settings.context&&-1!==$.inArray(i.siteId,t.sites)||"index"!==i.settings.context&&t!==a){var n=$("<li/>").appendTo(c),r=$("<a/>",{role:"button"===e?"button":null,href:"#",type:"button"===e?"button":null,text:Craft.t("app","New {section} entry",{section:t.name})}).appendTo(n);i.addListener(r,"click",(function(){s.data("trigger").hide(),i._createEntry(t.id)})),"button"===e&&i.addListener(r,"keydown",(function(e){e.keyCode===Garnish.SPACE_KEY&&(e.preventDefault(),s.data("trigger").hide(),i._createEntry(t.id))}))}};for(u.s();!(h=u.n()).done;)p()}catch(t){u.e(t)}finally{u.f()}new Garnish.DisclosureMenu(s)}}(),"index"===this.settings.context)){var s="entries";e&&(s+="/"+e),Craft.setPath(s)}},_createEntry:function(t){var e=this;if(this.$newEntryBtn.hasClass("loading"))console.warn("New entry creation already in progress.");else{var i=this.publishableSections.find((function(e){return e.id===t}));if(!i)throw"Invalid section ID: ".concat(t);this.$newEntryBtn.addClass("loading"),Craft.sendActionRequest("POST","entries/create",{data:{siteId:this.siteId,section:i.handle}}).then((function(t){var s=t.data;"index"===e.settings.context?document.location.href=Craft.getUrl(s.cpEditUrl,{fresh:1}):Craft.createElementEditor(e.elementType,{siteId:e.siteId,elementId:s.entry.id,draftId:s.entry.draftId,params:{fresh:1}}).on("submit",(function(){var t="section:".concat(i.uid);e.sourceKey!==t&&e.selectSourceByKey(t),e.clearSearch(),e.setSelectedSortAttribute("dateCreated","desc"),e.selectElementAfterUpdate(s.entry.id),e.updateElements()}))})).finally((function(){e.$newEntryBtn.removeClass("loading")}))}}}),Craft.registerElementIndexClass("craft\\elements\\Entry",Craft.EntryIndex)},8201:function(){Craft.FieldLayoutDesigner=Garnish.Base.extend({$container:null,$configInput:null,$tabContainer:null,$newTabBtn:null,$sidebar:null,$libraryToggle:null,$selectedLibrary:null,$fieldLibrary:null,$uiLibrary:null,$uiLibraryElements:null,$fieldSearch:null,$clearFieldSearchBtn:null,$fieldGroups:null,$fields:null,tabGrid:null,elementDrag:null,_config:null,init:function(t,e){var i=this;this.$container=$(t),this.setSettings(e,Craft.FieldLayoutDesigner.defaults),this.$configInput=this.$container.children("input[data-config-input]"),this._config=JSON.parse(this.$configInput.val()),this._config.tabs||(this._config.tabs=[]);var s=this.$container.children(".fld-workspace");this.$tabContainer=s.children(".fld-tabs"),this.$newTabBtn=s.children(".fld-new-tab-btn"),this.$sidebar=this.$container.children(".fld-sidebar"),this.$fieldLibrary=this.$selectedLibrary=this.$sidebar.children(".fld-field-library");var a=this.$fieldLibrary.children(".search");this.$fieldSearch=a.children("input"),this.$clearFieldSearchBtn=a.children(".clear"),this.$fieldGroups=this.$sidebar.find(".fld-field-group"),this.$fields=this.$fieldGroups.children(".fld-element"),this.$uiLibrary=this.$sidebar.children(".fld-ui-library"),this.$uiLibraryElements=this.$uiLibrary.children(),this.tabGrid=new Craft.Grid(this.$tabContainer,{itemSelector:".fld-tab",minColWidth:264,fillMode:"grid",snapToGrid:24});for(var n=this.$tabContainer.children(),r=0;r<n.length;r++)this.initTab($(n[r]));if(this.elementDrag=new Craft.FieldLayoutDesigner.ElementDrag(this),this.settings.customizableTabs&&(this.tabDrag=new Craft.FieldLayoutDesigner.TabDrag(this),this.addListener(this.$newTabBtn,"activate","addTab")),this.settings.customizableUi){var o=this.$sidebar.children(".btngroup");new Craft.Listbox(o,{onChange:function(t){i.$selectedLibrary.addClass("hidden"),i.$selectedLibrary=i["$".concat(t.data("library"),"Library")].removeClass("hidden")}})}this.addListener(this.$fieldSearch,"input",(function(){var t=i.$fieldSearch.val().toLowerCase().replace(/['"]/g,"");if(!t)return i.$fieldLibrary.find(".filtered").removeClass("filtered"),void i.$clearFieldSearchBtn.addClass("hidden");i.$clearFieldSearchBtn.removeClass("hidden");var e=i.$fields.filter('[data-keywords*="'.concat(t,'"]')).add(i.$fieldGroups.filter('[data-name*="'.concat(t,'"]')).children(".fld-element")).removeClass("filtered");i.$fields.not(e).addClass("filtered");for(var s=0;s<i.$fieldGroups.length;s++){var a=i.$fieldGroups.eq(s);a.find(".fld-element:not(.hidden):not(.filtered)").length?a.removeClass("filtered"):a.addClass("filtered")}})),this.addListener(this.$fieldSearch,"keydown",(function(t){switch(t.keyCode){case Garnish.ESC_KEY:i.$fieldSearch.val("").trigger("input");break;case Garnish.RETURN_KEY:t.preventDefault()}})),this.addListener(this.$clearFieldSearchBtn,"click",(function(){i.$fieldSearch.val("").trigger("input")}))},initTab:function(t){return new Craft.FieldLayoutDesigner.Tab(this,t)},removeFieldByHandle:function(t){this.$fields.filter('[data-attribute="'.concat(t,'"]:first')).removeClass("hidden").closest(".fld-field-group").removeClass("hidden")},addTab:function(){if(this.settings.customizableTabs){var t=Craft.escapeHtml(prompt(Craft.t("app","Give your tab a name.")));if(t){var e=$('\n<div class="fld-tab">\n <div class="tabs">\n <div class="tab sel draggable">\n <span>'.concat(t,'</span>\n <a class="settings icon" title="').concat(Craft.t("app","Settings"),'"></a>\n </div>\n </div>\n <div class="fld-tabcontent"></div>\n</div>\n')).appendTo(this.$tabContainer);this.tabGrid.addItems(e),this.tabDrag.addItems(e),this.initTab(e).updatePositionInConfig()}}},get config(){return this._config},set config(t){this._config=t,this.$configInput.val(JSON.stringify(t))},updateConfig:function(t){var e=t(this.config);!1!==e&&(this.config=e)}},{defaults:{customizableTabs:!0,customizableUi:!0},createSlideout:function createSlideout(contents,js){var $body=$("<div/>",{class:"fld-element-settings-body"});$("<div/>",{class:"fields",html:contents}).appendTo($body);var $footer=$("<div/>",{class:"fld-element-settings-footer"});$("<div/>",{class:"flex-grow"}).appendTo($footer);var $cancelBtn=Craft.ui.createButton({label:Craft.t("app","Close"),spinner:!0}).appendTo($footer);Craft.ui.createSubmitButton({class:"secondary",label:Craft.t("app","Apply"),spinner:!0}).appendTo($footer);var $contents=$body.add($footer),slideout=new Craft.Slideout($contents,{containerElement:"form",containerAttributes:{action:"",method:"post",novalidate:"",class:"fld-element-settings"}});return slideout.on("open",(function(){Garnish.requestAnimationFrame((function(){slideout.$container.find(".text:first").trigger("focus")}))})),$cancelBtn.on("click",(function(){slideout.close()})),js&&eval(js),Craft.initUiElements(slideout.$container),slideout}}),Craft.FieldLayoutDesigner.Tab=Garnish.Base.extend({designer:null,uid:null,$container:null,slideout:null,destroyed:!1,init:function(t,e){this.designer=t,this.$container=e,this.$container.data("fld-tab",this),this.uid=this.$container.data("uid"),this.uid||(this.uid=Craft.uuid(),this.config={uid:this.uid,name:this.$container.find(".tabs .tab span").text(),elements:[]},this.$container.data("settings-namespace",this.designer.$container.data("new-tab-settings-namespace").replace(/\bTAB_UID\b/g,this.uid)),this.$container.data("settings-html",this.designer.$container.data("new-tab-settings-html").replace(/\bTAB_UID\b/g,this.uid).replace(/\bTAB_NAME\b/g,this.config.name)),this.$container.data("settings-js",this.designer.$container.data("new-tab-settings-js").replace(/\bTAB_UID\b/g,this.uid))),this.designer.settings.customizableTabs&&(this.settingsNamespace=this.$container.data("settings-namespace"),this.createMenu());for(var i=this.$container.children(".fld-tabcontent").children(),s=0;s<i.length;s++)this.initElement($(i[s]))},createMenu:function(){var t=this,e=this.$container.find(".tabs .settings");$('<div class="menu" data-align="center"/>').insertAfter(e).append($("<ul/>").append($("<li/>").append($("<a/>",{"data-action":"settings",text:Craft.t("app","Settings")}))).append($("<li/>").append($("<a/>",{"data-action":"remove",text:Craft.t("app","Remove")})))).append($("<hr/>")).append($("<ul/>").append($("<li/>").append($("<a/>",{"data-action":"moveLeft",text:Craft.t("app","Move to the left")}))).append($("<li/>").append($("<a/>",{"data-action":"moveRight",text:Craft.t("app","Move to the right")}))));var i=new Garnish.MenuBtn(e,{onOptionSelect:this.onTabOptionSelect.bind(this)});i.menu.on("show",(function(){t.$container.prev(".fld-tab").length?i.menu.$container.find("[data-action=moveLeft]").removeClass("disabled"):i.menu.$container.find("[data-action=moveLeft]").addClass("disabled"),t.$container.next(".fld-tab").length?i.menu.$container.find("[data-action=moveRight]").removeClass("disabled"):i.menu.$container.find("[data-action=moveRight]").addClass("disabled")}))},onTabOptionSelect:function(t){if(this.designer.settings.customizableTabs)switch($(t).data("action")){case"settings":this.slideout?this.slideout.open():this.createSettings();break;case"remove":this.destroy();break;case"moveLeft":var e=this.$container.prev(".fld-tab");e.length&&(this.$container.insertBefore(e),this.updatePositionInConfig());break;case"moveRight":var i=this.$container.next(".fld-tab");i.length&&(this.$container.insertAfter(i),this.updatePositionInConfig())}},createSettings:function(){var t=this,e=this.$container.data("settings-html"),i=this.$container.data("settings-js");this.slideout=Craft.FieldLayoutDesigner.createSlideout(e,i),this.slideout.$container.on("submit",(function(e){e.preventDefault(),t.applySettings()}))},applySettings:function(){var t=this;if(this.slideout.$container.find('[name$="[name]"]').val()){var e=this.slideout.$container.find("button[type=submit]").addClass("loading"),i=$.extend({},this.config);delete i.elements,Craft.sendActionRequest("POST","fields/apply-layout-tab-settings",{data:{config:i,settingsNamespace:this.settingsNamespace,settings:this.slideout.$container.serialize()}}).then((function(e){t.updateConfig((function(t){return $.extend(e.data.config,{elements:t.elements})}));var i=t.$container.find(".tabs .tab span"),s=i.children(".fld-indicator");e.data.hasConditions?s.length||i.append($("<div/>",{class:"fld-indicator",title:Craft.t("app","This tab is conditional"),"aria-label":Craft.t("app","This tab is conditional"),"data-icon":"condition"})):s.length&&s.remove(),t.slideout.close()})).catch((function(t){Craft.cp.displayError(),console.error(t)})).finally((function(){e.removeClass("loading"),t.slideout.close()}))}else alert(Craft.t("app","You must specify a tab name."))},initElement:function(t){return new Craft.FieldLayoutDesigner.Element(this,t)},get index(){var t=this;return this.designer.config.tabs.findIndex((function(e){return e.uid===t.uid}))},get config(){var t=this;if(!this.uid)throw"Tab is missing its UID";var e=this.designer.config.tabs.find((function(e){return e.uid===t.uid}));return e||(e={uid:this.uid,elements:[]},this.config=e),e},set config(t){if(!this.destroyed){t.name&&t.name!==this.config.name&&this.$container.find(".tabs .tab span").text(t.name);var e=this.designer.config,i=this.index;if(-1!==i)e.tabs[i]=t;else{var s=$.inArray(this.$container[0],this.$container.parent().children(".fld-tab"));e.tabs.splice(s,0,t)}this.designer.config=e}},updateConfig:function(t){if(!this.destroyed){var e=t(this.config);!1!==e&&(this.config=e)}},updatePositionInConfig:function(){var t=this;this.destroyed||this.designer.updateConfig((function(e){var i=t.config,s=t.index,a=$.inArray(t.$container[0],t.$container.parent().children(".fld-tab"));return-1!==s&&e.tabs.splice(s,1),e.tabs.splice(a,0,i),e}))},destroy:function(){var t=this;if(!this.destroyed){this.destroyed=!0,this.designer.updateConfig((function(e){var i=t.index;return-1!==i&&(e.tabs.splice(i,1),e)}));for(var e=this.$container.find(".fld-element"),i=0;i<e.length;i++)e.eq(i).data("fld-element").destroy();this.designer.tabGrid.removeItems(this.$container),this.designer.tabDrag.removeItems(this.$container),this.$container.remove(),this.base()}}}),Craft.FieldLayoutDesigner.Element=Garnish.Base.extend({tab:null,$container:null,$settingsContainer:null,$editBtn:null,uid:null,isField:!1,attribute:null,requirable:!1,hasCustomWidth:!1,hasSettings:!1,settingsNamespace:null,slideout:null,init:function(t,e){var i=this;this.tab=t,this.$container=e,this.$container.data("fld-element",this),this.uid=this.$container.data("uid"),this.uid||(this.uid=Craft.uuid(),this.config=$.extend(this.$container.data("config"),{uid:this.uid})),this.isField=this.$container.hasClass("fld-field"),this.requirable=this.isField&&Garnish.hasAttr(this.$container,"data-requirable"),this.isField&&(this.attribute=this.$container.data("attribute")),this.settingsNamespace=this.$container.data("settings-namespace").replace(/\bELEMENT_UID\b/g,this.uid);var s=(this.$container.data("settings-html")||"").replace(/\bELEMENT_UID\b/g,this.uid),a=this.requirable&&this.$container.hasClass("fld-required");if(this.hasCustomWidth=this.tab.designer.settings.customizableUi&&Garnish.hasAttr(this.$container,"data-has-custom-width"),this.hasSettings=s||this.requirable,this.hasSettings){this.$settingsContainer=$("<div/>",{class:"hidden"}),this.$editBtn=$("<a/>",{role:"button",tabindex:0,class:"settings icon",title:Craft.t("app","Edit")});var n=function(){i.slideout?i.slideout.open():i.createSettings(s,a)};this.$editBtn.on("click",n),this.$container.on("dblclick",n)}this.initUi(),this.$container.attr("data-keywords",null),this.$container.attr("data-settings-html",null)},initUi:function(){var t=this;this.hasCustomWidth&&new Craft.SlidePicker(this.config.width||100,{min:25,max:100,step:25,valueLabel:function(t){return Craft.t("app","{pct} width",{pct:"".concat(t,"%")})},onChange:function(e){t.updateConfig((function(t){return t.width=e,t}))}}).$container.appendTo(this.$container),this.hasSettings&&this.$editBtn.appendTo(this.$container)},createSettings:function(t,e){var i=this,s=(this.$container.data("settings-js")||"").replace(/\bELEMENT_UID\b/g,this.uid);if(this.slideout=Craft.FieldLayoutDesigner.createSlideout(t,s),this.slideout.$container.on("submit",(function(t){t.preventDefault(),i.applySettings()})),this.requirable){var a=this.slideout.$container.find(".fields:first");Craft.ui.createLightswitchField({label:Craft.t("app","Required"),name:"".concat(this.settingsNamespace,"[required]"),on:e}).prependTo(a)}this.trigger("createSettings")},applySettings:function(){var t=this,e=this.slideout.$container.find("button[type=submit]").addClass("loading");Craft.sendActionRequest("POST","fields/apply-layout-element-settings",{data:{config:this.config,settingsNamespace:this.settingsNamespace,settings:this.slideout.$container.serialize()}}).then((function(e){t.config=e.data.config,t.$editBtn.detach(),t.$container.html($(e.data.selectorHtml).html()),t.initUi()})).catch((function(t){Craft.cp.displayError(),console.error(t)})).finally((function(){e.removeClass("loading"),t.updateRequiredClass(),t.slideout.close()}))},updateRequiredClass:function(){this.requirable&&(this.config.required?this.$container.addClass("fld-required"):this.$container.removeClass("fld-required"))},get index(){var t=this,e=this.tab.config;return void 0===e?-1:e.elements.findIndex((function(e){return e.uid===t.uid}))},get config(){var t=this;if(!this.uid)throw"Tab is missing its UID";var e=this.tab.config.elements.find((function(e){return e.uid===t.uid}));return e||(e={uid:this.uid},this.config=e),e},set config(t){var e=this.tab.config,i=this.index;if(-1!==i)e.elements[i]=t;else{var s=$.inArray(this.$container[0],this.$container.parent().children(".fld-element"));e.elements.splice(s,0,t)}this.tab.config=e},updateConfig:function(t){var e=t(this.config);!1!==e&&(this.config=e)},updatePositionInConfig:function(){var t=this;this.tab.updateConfig((function(e){var i=t.config,s=t.index,a=$.inArray(t.$container[0],t.$container.parent().children(".fld-element"));return-1!==s&&e.elements.splice(s,1),e.elements.splice(a,0,i),e}))},destroy:function(){var t=this;this.tab.updateConfig((function(e){var i=t.index;return-1!==i&&(e.elements.splice(i,1),e)})),this.tab.designer.elementDrag.removeItems(this.$container),this.$container.remove(),this.isField&&this.tab.designer.removeFieldByHandle(this.attribute),this.base()}}),Craft.FieldLayoutDesigner.BaseDrag=Garnish.Drag.extend({designer:null,$insertion:null,showingInsertion:!1,$caboose:null,init:function(t,e){this.designer=t,this.base(this.findItems(),e)},onDragStart:function(){this.base(),this.$insertion=this.createInsertion(),this.$caboose=this.createCaboose(),this.$items=$().add(this.$items.add(this.$caboose)),Garnish.$bod.addClass("dragging")},removeCaboose:function(){this.$items=this.$items.not(this.$caboose),this.$caboose.remove()},swapDraggeeWithInsertion:function(){this.$insertion.insertBefore(this.$draggee),this.$draggee.detach(),this.$items=$().add(this.$items.not(this.$draggee).add(this.$insertion)),this.showingInsertion=!0},swapInsertionWithDraggee:function(){this.$insertion.replaceWith(this.$draggee),this.$items=$().add(this.$items.not(this.$insertion).add(this.$draggee)),this.showingInsertion=!1},setMidpoints:function(){for(var t=0;t<this.$items.length;t++){var e=$(this.$items[t]),i=e.offset();e.hasClass("unused")||e.data("midpoint",{left:i.left+e.outerWidth()/2,top:i.top+e.outerHeight()/2})}},getClosestItem:function(){for(this.getClosestItem._closestItem=null,this.getClosestItem._closestItemMouseDiff=null,this.getClosestItem._i=0;this.getClosestItem._i<this.$items.length;this.getClosestItem._i++)this.getClosestItem._$item=$(this.$items[this.getClosestItem._i]),this.getClosestItem._midpoint=this.getClosestItem._$item.data("midpoint"),this.getClosestItem._midpoint&&(this.getClosestItem._mouseDiff=Garnish.getDist(this.getClosestItem._midpoint.left,this.getClosestItem._midpoint.top,this.mouseX,this.mouseY),(null===this.getClosestItem._closestItem||this.getClosestItem._mouseDiff<this.getClosestItem._closestItemMouseDiff)&&(this.getClosestItem._closestItem=this.getClosestItem._$item[0],this.getClosestItem._closestItemMouseDiff=this.getClosestItem._mouseDiff));return this.getClosestItem._closestItem},checkForNewClosestItem:function(){this.checkForNewClosestItem._closestItem=this.getClosestItem(),this.checkForNewClosestItem._closestItem!==this.$insertion[0]&&(this.showingInsertion&&$.inArray(this.$insertion[0],this.$items)<$.inArray(this.checkForNewClosestItem._closestItem,this.$items)&&-1===$.inArray(this.checkForNewClosestItem._closestItem,this.$caboose)?this.$insertion.insertAfter(this.checkForNewClosestItem._closestItem):this.$insertion.insertBefore(this.checkForNewClosestItem._closestItem),this.$items=$().add(this.$items.add(this.$insertion)),this.showingInsertion=!0,this.designer.tabGrid.refreshCols(!0),this.setMidpoints())},onDragStop:function(){var t=this;this.showingInsertion&&this.swapInsertionWithDraggee(),this.removeCaboose(),this.designer.tabGrid.refreshCols(!0);var e=this.$draggee.offset();!e||0===e.top&&0===e.left?(this.$draggee.css({display:this.draggeeDisplay,visibility:"visible",opacity:0}).velocity({opacity:1},Garnish.FX_DURATION),this.helpers[0].velocity({opacity:0},Garnish.FX_DURATION,(function(){t._showDraggee()}))):this.returnHelpersToDraggees(),this.base(),Garnish.$bod.removeClass("dragging")}}),Craft.FieldLayoutDesigner.TabDrag=Craft.FieldLayoutDesigner.BaseDrag.extend({init:function(t){this.base(t,{handle:".tab"})},findItems:function(){return this.designer.$tabContainer.find("> div.fld-tab")},onDragStart:function(){this.base(),this.swapDraggeeWithInsertion(),this.setMidpoints()},swapDraggeeWithInsertion:function(){this.base(),this.designer.tabGrid.removeItems(this.$draggee),this.designer.tabGrid.addItems(this.$insertion)},swapInsertionWithDraggee:function(){this.base(),this.designer.tabGrid.removeItems(this.$insertion),this.designer.tabGrid.addItems(this.$draggee)},onDrag:function(){this.checkForNewClosestItem(),this.base()},onDragStop:function(){this.base(),this.$draggee.css({display:this.draggeeDisplay,visibility:"hidden"}),this.$draggee.data("fld-tab").updatePositionInConfig()},createCaboose:function(){var t=$('<div class="fld-tab fld-tab-caboose"/>').appendTo(this.designer.$tabContainer);return this.designer.tabGrid.addItems(t),t},removeCaboose:function(){this.base(),this.designer.tabGrid.removeItems(this.$caboose)},createInsertion:function(){var t=this.$draggee.find(".tab");return $('\n<div class="fld-tab fld-insertion" style="height: '.concat(this.$draggee.height(),'px;">\n <div class="tabs"><div class="tab sel draggable" style="width: ').concat(t.width(),"px; height: ").concat(t.height(),'px;"></div></div>\n <div class="fld-tabcontent" style="height: ').concat(this.$draggee.find(".fld-tabcontent").height(),'px;"></div>\n</div>\n'))}}),Craft.FieldLayoutDesigner.ElementDrag=Craft.FieldLayoutDesigner.BaseDrag.extend({draggingLibraryElement:!1,draggingField:!1,originalTab:null,onDragStart:function(){this.base(),this.draggingLibraryElement=this.$draggee.hasClass("unused"),this.draggingField=this.$draggee.hasClass("fld-field"),this.draggingLibraryElement&&!this.draggingField&&this.$draggee.css({display:this.draggeeDisplay,visibility:"visible"}),this.draggingLibraryElement?this.originalTab=null:(this.originalTab=this.$draggee.closest(".fld-tab").data("fld-tab"),this.swapDraggeeWithInsertion()),this.setMidpoints()},onDrag:function(){this.isDraggeeMandatory()||this.isHoveringOverTab()?this.checkForNewClosestItem():this.showingInsertion&&(this.$insertion.remove(),this.$items=$().add(this.$items.not(this.$insertion)),this.showingInsertion=!1,this.designer.tabGrid.refreshCols(!0),this.setMidpoints()),this.base()},isDraggeeMandatory:function(){return Garnish.hasAttr(this.$draggee,"data-mandatory")},isHoveringOverTab:function(){for(var t=0;t<this.designer.tabGrid.$items.length;t++)if(Garnish.hitTest(this.mouseX,this.mouseY,this.designer.tabGrid.$items.eq(t)))return!0;return!1},findItems:function(){return this.designer.$tabContainer.find(".fld-element").add(this.designer.$sidebar.find(".fld-element"))},createCaboose:function(){for(var t=$(),e=this.designer.$tabContainer.find("> .fld-tab > .fld-tabcontent"),i=0;i<e.length;i++)t=t.add($("<div/>").appendTo(e[i]));return t},createInsertion:function(){return $('<div class="fld-element fld-insertion" style="height: '.concat(this.$draggee.outerHeight(),'px;"/>'))},onDragStop:function(){var t=this.showingInsertion;if(t){if(this.draggingLibraryElement){var e=this.$draggee.clone().removeClass("unused");this.draggingField&&(this.$draggee.css({visibility:"inherit",display:"field"}).addClass("hidden"),0===this.$draggee.siblings(".fld-field:not(.hidden)").length&&this.$draggee.closest(".fld-field-group").addClass("hidden")),this.$draggee=e,this.addItems(e)}}else if(!this.draggingLibraryElement){var i=this.draggingField?this.designer.$fields.filter('[data-attribute="'.concat(this.$draggee.data("attribute"),'"]:first')):this.designer.$uiLibraryElements.filter('[data-type="'.concat(this.$draggee.data("type"),'"]:first'));this.draggingField&&(i.removeClass("hidden"),i.closest(".fld-field-group").removeClass("hidden")),this.$draggee.data("fld-element").destroy(),this.$draggee=i}if(this.base(),this.$draggee.css({display:this.draggeeDisplay,visibility:this.draggingField||t?"hidden":"visible"}),t){var s,a=this.$draggee.closest(".fld-tab").data("fld-tab");if(this.draggingLibraryElement)s=a.initElement(this.$draggee);else if(s=this.$draggee.data("fld-element"),a!==this.originalTab){var n=s.config;this.originalTab.updateConfig((function(t){var e=s.index;return-1!==e&&(t.elements.splice(e,1),t)})),this.$draggee.data("fld-element").tab=a,s.config=n}s.updatePositionInConfig()}}})},3347:function(){Craft.FieldToggle=Garnish.Base.extend({$toggle:null,targetPrefix:null,targetSelector:null,reverseTargetSelector:null,_$target:null,_$reverseTarget:null,type:null,init:function(t){switch(this.$toggle=$(t),this.$toggle.data("fieldtoggle")&&(console.warn("Double-instantiating a field toggle on an element"),this.$toggle.data("fieldtoggle").destroy()),this.$toggle.data("fieldtoggle",this),this.type=this.getType(),"select"===this.type||"fieldset"===this.type?this.targetPrefix=this.$toggle.attr("data-target-prefix")||"":(this.targetSelector=this.normalizeTargetSelector(this.$toggle.data("target")),this.reverseTargetSelector=this.normalizeTargetSelector(this.$toggle.data("reverse-target"))),this.findTargets(),this.type){case"link":this.addListener(this.$toggle,"click","onToggleChange");break;case"fieldset":this.addListener(this.$toggle.find("input"),"change","onToggleChange");break;default:this.addListener(this.$toggle,"change","onToggleChange"),this.onToggleChange()}},normalizeTargetSelector:function(t){return t&&!t.match(/^[#\.]/)&&(t="#"+t),t},getType:function(){var t=this.$toggle.prop("nodeName");if("INPUT"===t&&"checkbox"===this.$toggle.attr("type")||"checkbox"===this.$toggle.attr("role")||"switch"===this.$toggle.attr("role"))return"checkbox";switch(t){case"SELECT":return Garnish.hasAttr(this.$toggle,"data-boolean-menu")?"booleanMenu":"select";case"A":return"link";default:return"fieldset"}},findTargets:function(){"select"===this.type||"fieldset"===this.type?(this.getToggleVal(),this._$target=$(this.normalizeTargetSelector(this.targetPrefix+this.getToggleVal()))):(this.targetSelector&&(this._$target=$(this.targetSelector)),this.reverseTargetSelector&&(this._$reverseTarget=$(this.reverseTargetSelector)))},getToggleVal:function(){switch(this.type){case"checkbox":return void 0!==this.$toggle.prop("checked")?this.$toggle.prop("checked"):"true"===this.$toggle.attr("aria-checked");case"booleanMenu":var t=this.$toggle.data("boolean");if(void 0!==t)return t;var e=this.$toggle.val();return e&&"0"!==e;default:var i;return null==(i="fieldset"===this.type?this.$toggle.find("input:checked:first").val():Garnish.getInputPostVal(this.$toggle))?null:i.replace(/[^\w]+/g,"-")}},onToggleChange:function(){"select"===this.type||"fieldset"===this.type?(this.hideTarget(this._$target),this.findTargets(),this.showTarget(this._$target)):(this.findTargets(),"link"===this.type?this.onToggleChange._show=this.$toggle.hasClass("collapsed")||!this.$toggle.hasClass("expanded"):this.onToggleChange._show=!!this.getToggleVal(),this.onToggleChange._show?(this.showTarget(this._$target),this.hideTarget(this._$reverseTarget)):(this.hideTarget(this._$target),this.showTarget(this._$reverseTarget)),delete this.onToggleChange._show)},showTarget:function(t){var e=this;if(t&&t.length){if(this.showTarget._currentHeight=t.height(),t.removeClass("hidden"),"select"!==this.type&&"fieldset"!==this.type){"link"===this.type&&(this.$toggle.removeClass("collapsed"),this.$toggle.addClass("expanded"));for(var i=0;i<t.length;i++)!function(t){"SPAN"!==t.prop("nodeName")&&(t.height("auto"),e.showTarget._targetHeight=t.height(),t.css({height:e.showTarget._currentHeight,overflow:"hidden"}),t.velocity("stop"),t.velocity({height:e.showTarget._targetHeight},"fast",(function(){t.css({height:"",overflow:""})})))}(t.eq(i));delete this.showTarget._targetHeight}delete this.showTarget._currentHeight,Garnish.$win.trigger("resize")}},hideTarget:function(t){if(t&&t.length)if("select"===this.type||"fieldset"===this.type)t.addClass("hidden");else{"link"===this.type&&(this.$toggle.removeClass("expanded"),this.$toggle.addClass("collapsed"));for(var e=0;e<t.length;e++)!function(t){t.hasClass("hidden")||("SPAN"===t.prop("nodeName")?t.addClass("hidden"):(t.css("overflow","hidden"),t.velocity("stop"),t.velocity({height:0},"fast",(function(){t.addClass("hidden")}))))}(t.eq(e))}},destroy:function(){this.$toggle.removeData("fieldtoggle"),this.base()}})},9478:function(){Craft.Grid=Garnish.Base.extend({$container:null,$items:null,items:null,totalCols:null,colGutterDrop:null,colPctWidth:null,possibleItemColspans:null,possibleItemPositionsByColspan:null,itemPositions:null,itemColspansByPosition:null,layouts:null,layout:null,itemHeights:null,leftPadding:null,_refreshingCols:!1,_refreshColsAfterRefresh:!1,_forceRefreshColsAfterRefresh:!1,init:function(t,e){var i=this;this.$container=$(t),this.$container.data("grid")&&(console.warn("Double-instantiating a grid on an element"),this.$container.data("grid").destroy()),this.$container.data("grid",this),this.setSettings(e,Craft.Grid.defaults),this.handleContainerHeightProxy=function(){i.refreshCols(!1,!0)},this.$items=this.$container.children(this.settings.itemSelector),this.setItems(),this.refreshCols(!0,!1),Garnish.$doc.ready((function(){i.refreshCols(!1,!1)}))},addItems:function(t){this.$items=$().add(this.$items.add(t)),this.setItems(),this.refreshCols(!0,!0)},removeItems:function(t){this.$items=$().add(this.$items.not(t)),this.setItems(),this.refreshCols(!0,!0)},resetItemOrder:function(){this.$items=$().add(this.$items),this.setItems(),this.refreshCols(!0,!0)},setItems:function(){for(this.setItems._={},this.items=[],this.setItems._.i=0;this.setItems._.i<this.$items.length;this.setItems._.i++)this.items.push($(this.$items[this.setItems._.i]));delete this.setItems._},refreshCols:function(t){if(this._refreshingCols)return this._refreshColsAfterRefresh=!0,void(t&&(this._forceRefreshColsAfterRefresh=!0));if(this._refreshingCols=!0,this.items.length)if(this.refreshCols._={},this.refreshCols._.oldHeight=this.$container[0].style.height,this.$container[0].style.height=1,this.refreshCols._.scrollHeight=this.$container[0].scrollHeight,this.$container[0].style.height=this.refreshCols._.oldHeight,0!==this.refreshCols._.scrollHeight)if(this.settings.cols?this.refreshCols._.totalCols=this.settings.cols:(this.refreshCols._.totalCols=Math.floor(this.$container.width()/this.settings.minColWidth),null!==this.totalCols&&this.refreshCols._.totalCols>this.totalCols&&(this.refreshCols._.totalCols=Math.floor((this.$container.width()-20)/this.settings.minColWidth)),this.settings.maxCols&&this.refreshCols._.totalCols>this.settings.maxCols&&(this.refreshCols._.totalCols=this.settings.maxCols)),0===this.refreshCols._.totalCols&&(this.refreshCols._.totalCols=1),!0===t||this.totalCols!==this.refreshCols._.totalCols){if(this.totalCols=this.refreshCols._.totalCols,this.colGutterDrop=this.settings.gutter*(this.totalCols-1)/this.totalCols,this.removeListener(this.$container,"resize"),"grid"===this.settings.fillMode)for(this.refreshCols._.itemIndex=0;this.refreshCols._.itemIndex<this.items.length;){for(this.refreshCols._.tallestItemHeight=-1,this.refreshCols._.colIndex=0,this.refreshCols._.i=this.refreshCols._.itemIndex;this.refreshCols._.i<this.refreshCols._.itemIndex+this.totalCols&&this.refreshCols._.i<this.items.length;this.refreshCols._.i++)this.refreshCols._.itemHeight=this.items[this.refreshCols._.i].height("auto").height(),this.refreshCols._.itemHeight>this.refreshCols._.tallestItemHeight&&(this.refreshCols._.tallestItemHeight=this.refreshCols._.itemHeight),this.refreshCols._.colIndex++;for(this.settings.snapToGrid&&(this.refreshCols._.remainder=this.refreshCols._.tallestItemHeight%this.settings.snapToGrid,this.refreshCols._.remainder&&(this.refreshCols._.tallestItemHeight+=this.settings.snapToGrid-this.refreshCols._.remainder)),this.refreshCols._.i=this.refreshCols._.itemIndex;this.refreshCols._.i<this.refreshCols._.itemIndex+this.totalCols&&this.refreshCols._.i<this.items.length;this.refreshCols._.i++)this.items[this.refreshCols._.i].height(this.refreshCols._.tallestItemHeight);this.refreshCols._.itemIndex+=this.totalCols}else if(this.removeListener(this.$items,"resize"),1===this.totalCols)this.$container.height("auto"),this.$items.show().css({position:"relative",width:"auto",top:0}).css(Craft.left,0);else{for(this.$items.css("position","absolute"),this.colPctWidth=100/this.totalCols,this.layouts=[],this.itemPositions=[],this.itemColspansByPosition=[],this.possibleItemColspans=[],this.possibleItemPositionsByColspan=[],this.itemHeightsByColspan=[],this.refreshCols._.item=0;this.refreshCols._.item<this.items.length;this.refreshCols._.item++)for(this.possibleItemColspans[this.refreshCols._.item]=[],this.possibleItemPositionsByColspan[this.refreshCols._.item]={},this.itemHeightsByColspan[this.refreshCols._.item]={},this.refreshCols._.$item=this.items[this.refreshCols._.item].show(),this.refreshCols._.positionRight="right"===this.refreshCols._.$item.data("position"),this.refreshCols._.positionLeft="left"===this.refreshCols._.$item.data("position"),this.refreshCols._.minColspan=this.refreshCols._.$item.data("colspan")?this.refreshCols._.$item.data("colspan"):this.refreshCols._.$item.data("min-colspan")?this.refreshCols._.$item.data("min-colspan"):1,this.refreshCols._.maxColspan=this.refreshCols._.$item.data("colspan")?this.refreshCols._.$item.data("colspan"):this.refreshCols._.$item.data("max-colspan")?this.refreshCols._.$item.data("max-colspan"):this.totalCols,this.refreshCols._.minColspan>this.totalCols&&(this.refreshCols._.minColspan=this.totalCols),this.refreshCols._.maxColspan>this.totalCols&&(this.refreshCols._.maxColspan=this.totalCols),this.refreshCols._.colspan=this.refreshCols._.minColspan;this.refreshCols._.colspan<=this.refreshCols._.maxColspan;this.refreshCols._.colspan++)for(this.refreshCols._.$item.css("width",this.getItemWidthCss(this.refreshCols._.colspan)),this.itemHeightsByColspan[this.refreshCols._.item][this.refreshCols._.colspan]=this.refreshCols._.$item.outerHeight(),this.possibleItemColspans[this.refreshCols._.item].push(this.refreshCols._.colspan),this.possibleItemPositionsByColspan[this.refreshCols._.item][this.refreshCols._.colspan]=[],this.refreshCols._.positionLeft?(this.refreshCols._.minPosition=0,this.refreshCols._.maxPosition=0):this.refreshCols._.positionRight?(this.refreshCols._.minPosition=this.totalCols-this.refreshCols._.colspan,this.refreshCols._.maxPosition=this.refreshCols._.minPosition):(this.refreshCols._.minPosition=0,this.refreshCols._.maxPosition=this.totalCols-this.refreshCols._.colspan),this.refreshCols._.position=this.refreshCols._.minPosition;this.refreshCols._.position<=this.refreshCols._.maxPosition;this.refreshCols._.position++)this.possibleItemPositionsByColspan[this.refreshCols._.item][this.refreshCols._.colspan].push(this.refreshCols._.position);for(this.refreshCols._.colHeights=[],this.refreshCols._.i=0;this.refreshCols._.i<this.totalCols;this.refreshCols._.i++)this.refreshCols._.colHeights.push(0);for(this.createLayouts(0,[],[],this.refreshCols._.colHeights,0),this.refreshCols._.layoutTotalCols=[],this.refreshCols._.i=0;this.refreshCols._.i<this.layouts.length;this.refreshCols._.i++)for(this.refreshCols._.layoutTotalCols[this.refreshCols._.i]=0,this.refreshCols._.j=0;this.refreshCols._.j<this.totalCols;this.refreshCols._.j++)this.layouts[this.refreshCols._.i].colHeights[this.refreshCols._.j]&&this.refreshCols._.layoutTotalCols[this.refreshCols._.i]++;for(this.refreshCols._.highestTotalCols=Math.max.apply(null,this.refreshCols._.layoutTotalCols),this.refreshCols._.i=this.layouts.length-1;this.refreshCols._.i>=0;this.refreshCols._.i--)this.refreshCols._.layoutTotalCols[this.refreshCols._.i]!==this.refreshCols._.highestTotalCols&&this.layouts.splice(this.refreshCols._.i,1);for(this.refreshCols._.layoutHeights=[],this.refreshCols._.i=0;this.refreshCols._.i<this.layouts.length;this.refreshCols._.i++)this.refreshCols._.layoutHeights.push(Math.max.apply(null,this.layouts[this.refreshCols._.i].colHeights));for(this.refreshCols._.shortestHeight=Math.min.apply(null,this.refreshCols._.layoutHeights),this.refreshCols._.shortestLayouts=[],this.refreshCols._.emptySpaces=[],this.refreshCols._.i=0;this.refreshCols._.i<this.refreshCols._.layoutHeights.length;this.refreshCols._.i++)if(this.refreshCols._.layoutHeights[this.refreshCols._.i]===this.refreshCols._.shortestHeight){for(this.refreshCols._.shortestLayouts.push(this.layouts[this.refreshCols._.i]),this.refreshCols._.emptySpace=this.layouts[this.refreshCols._.i].emptySpace,this.refreshCols._.j=0;this.refreshCols._.j<this.totalCols;this.refreshCols._.j++)this.refreshCols._.emptySpace+=this.refreshCols._.shortestHeight-this.layouts[this.refreshCols._.i].colHeights[this.refreshCols._.j];this.refreshCols._.emptySpaces.push(this.refreshCols._.emptySpace)}for(this.layout=this.refreshCols._.shortestLayouts[$.inArray(Math.min.apply(null,this.refreshCols._.emptySpaces),this.refreshCols._.emptySpaces)],this.refreshCols._.i=0;this.refreshCols._.i<this.items.length;this.refreshCols._.i++)this.refreshCols._.css={width:this.getItemWidthCss(this.layout.colspans[this.refreshCols._.i])},this.refreshCols._.css[Craft.left]=this.getItemLeftPosCss(this.layout.positions[this.refreshCols._.i]),this.items[this.refreshCols._.i].css(this.refreshCols._.css);this.isSimpleLayout()?(this.$container.height("auto"),this.$items.css({position:"relative",top:0,"margin-bottom":this.settings.gutter+"px"})):(this.$items.css("position","absolute"),this.positionItems(),this.addListener(this.$items,"resize","onItemResize"))}this.completeRefreshCols(),this.addListener(this.$container,"resize",this.handleContainerHeightProxy),this.onRefreshCols()}else this.completeRefreshCols();else this.completeRefreshCols();else this.completeRefreshCols()},completeRefreshCols:function(){var t=this;if(void 0!==this.refreshCols._&&delete this.refreshCols._,this._refreshingCols=!1,this._refreshColsAfterRefresh){var e=this._forceRefreshColsAfterRefresh;this._refreshColsAfterRefresh=!1,this._forceRefreshColsAfterRefresh=!1,Garnish.requestAnimationFrame((function(){t.refreshCols(e)}))}},getItemWidth:function(t){return this.colPctWidth*t},getItemWidthCss:function(t){return"calc("+this.getItemWidth(t)+"% - "+this.colGutterDrop+"px)"},getItemWidthInPx:function(t){return this.getItemWidth(t)/100*this.$container.width()-this.colGutterDrop},getItemLeftPosCss:function(t){return"calc(("+this.getItemWidth(1)+"% + "+(this.settings.gutter-this.colGutterDrop)+"px) * "+t+")"},getItemLeftPosInPx:function(t){return(this.getItemWidth(1)/100*this.$container.width()+(this.settings.gutter-this.colGutterDrop))*t},createLayouts:function(t,e,i,s,a){new Craft.Grid.LayoutGenerator(this).createLayouts(t,e,i,s,a)},isSimpleLayout:function(){for(this.isSimpleLayout._={},this.isSimpleLayout._.i=0;this.isSimpleLayout._.i<this.layout.positions.length;this.isSimpleLayout._.i++)if(0!==this.layout.positions[this.isSimpleLayout._.i])return delete this.isSimpleLayout._,!1;return delete this.isSimpleLayout._,!0},positionItems:function(){for(this.positionItems._={},this.positionItems._.colHeights=[],this.positionItems._.i=0;this.positionItems._.i<this.totalCols;this.positionItems._.i++)this.positionItems._.colHeights.push(0);for(this.positionItems._.i=0;this.positionItems._.i<this.items.length;this.positionItems._.i++){for(this.positionItems._.endingCol=this.layout.positions[this.positionItems._.i]+this.layout.colspans[this.positionItems._.i]-1,this.positionItems._.affectedColHeights=[],this.positionItems._.col=this.layout.positions[this.positionItems._.i];this.positionItems._.col<=this.positionItems._.endingCol;this.positionItems._.col++)this.positionItems._.affectedColHeights.push(this.positionItems._.colHeights[this.positionItems._.col]);for(this.positionItems._.top=Math.max.apply(null,this.positionItems._.affectedColHeights),this.positionItems._.top>0&&(this.positionItems._.top+=this.settings.gutter),this.items[this.positionItems._.i].css("top",this.positionItems._.top),this.positionItems._.col=this.layout.positions[this.positionItems._.i];this.positionItems._.col<=this.positionItems._.endingCol;this.positionItems._.col++)this.positionItems._.colHeights[this.positionItems._.col]=this.positionItems._.top+this.itemHeightsByColspan[this.positionItems._.i][this.layout.colspans[this.positionItems._.i]]}this.$container.height(Math.max.apply(null,this.positionItems._.colHeights)),delete this.positionItems._},onItemResize:function(t){this.onItemResize._={},t.stopPropagation(),this.onItemResize._.item=$.inArray(t.currentTarget,this.$items),-1!==this.onItemResize._.item&&(this.onItemResize._.newHeight=this.items[this.onItemResize._.item].outerHeight(),this.onItemResize._.newHeight!==this.itemHeightsByColspan[this.onItemResize._.item][this.layout.colspans[this.onItemResize._.item]]&&(this.itemHeightsByColspan[this.onItemResize._.item][this.layout.colspans[this.onItemResize._.item]]=this.onItemResize._.newHeight,this.positionItems(!1))),delete this.onItemResize._},onRefreshCols:function(){this.trigger("refreshCols"),this.settings.onRefreshCols()},destroy:function(){this.$container.removeData("grid"),this.base()}},{defaults:{itemSelector:".item",cols:null,maxCols:null,minColWidth:320,gutter:14,fillMode:"top",colClass:"col",snapToGrid:null,onRefreshCols:$.noop}}),Craft.Grid.LayoutGenerator=Garnish.Base.extend({grid:null,_:null,init:function(t){this.grid=t},createLayouts:function(t,e,i,s,a){for(this._={},this._.c=0;this._.c<this.grid.possibleItemColspans[t].length;this._.c++){for(this._.colspan=this.grid.possibleItemColspans[t][this._.c],this._.tallestColHeightsByPosition=[],this._.p=0;this._.p<this.grid.possibleItemPositionsByColspan[t][this._.colspan].length;this._.p++){for(this._.position=this.grid.possibleItemPositionsByColspan[t][this._.colspan][this._.p],this._.colHeightsForPosition=[],this._.endingCol=this._.position+this._.colspan-1,this._.col=this._.position;this._.col<=this._.endingCol;this._.col++)this._.colHeightsForPosition.push(s[this._.col]);this._.tallestColHeightsByPosition[this._.p]=Math.max.apply(null,this._.colHeightsForPosition)}for(this._.p=$.inArray(Math.min.apply(null,this._.tallestColHeightsByPosition),this._.tallestColHeightsByPosition),this._.position=this.grid.possibleItemPositionsByColspan[t][this._.colspan][this._.p],this._.positions=e.slice(0),this._.colspans=i.slice(0),this._.colHeights=s.slice(0),this._.emptySpace=a,this._.positions.push(this._.position),this._.colspans.push(this._.colspan),this._.tallestColHeight=this._.tallestColHeightsByPosition[this._.p],this._.endingCol=this._.position+this._.colspan-1,this._.col=this._.position;this._.col<=this._.endingCol;this._.col++)this._.emptySpace+=this._.tallestColHeight-this._.colHeights[this._.col],this._.colHeights[this._.col]=this._.tallestColHeight+this.grid.itemHeightsByColspan[t][this._.colspan];t===this.grid.items.length-1?this.grid.layouts.push({positions:this._.positions,colspans:this._.colspans,colHeights:this._.colHeights,emptySpace:this._.emptySpace}):this.grid.createLayouts(t+1,this._.positions,this._.colspans,this._.colHeights,this._.emptySpace)}delete this._}})},2387:function(){Craft.HandleGenerator=Craft.BaseInputGenerator.extend({generateTargetValue:function(t){var e=t.replace("/<(.*?)>/g","");e=(e=e.replace(/['"‘’“”\[\]\(\)\{\}:]/g,"")).toLowerCase(),e=Craft.asciiString(e),this.settings.allowNonAlphaStart||(e=e.replace(/^[^a-z]+/,""));var i=Craft.filterArray(e.split(/[^a-z0-9]+/));if(e="","snake"===Craft.handleCasing)return i.join("_");for(var s=0;s<i.length;s++)"pascal"!==Craft.handleCasing&&0===s?e+=i[s]:e+=i[s].charAt(0).toUpperCase()+i[s].substring(1);return e}})},7966:function(){Craft.ImageUpload=Garnish.Base.extend({$container:null,progressBar:null,uploader:null,init:function(t){this.setSettings(t,Craft.ImageUpload.defaults),this.initImageUpload()},initImageUpload:function(){this.$container=$(this.settings.containerSelector),this.progressBar=new Craft.ProgressBar($('<div class="progress-shade"></div>').appendTo(this.$container));var t={url:Craft.getActionUrl(this.settings.uploadAction),formData:this.settings.postParameters,fileInput:this.$container.find(this.settings.fileInputSelector),paramName:this.settings.uploadParamName};void 0!==Craft.csrfTokenName&&void 0!==Craft.csrfTokenValue&&(t.formData[Craft.csrfTokenName]=Craft.csrfTokenValue),t.events={},t.events.fileuploadstart=this._onUploadStart.bind(this),t.events.fileuploadprogressall=this._onUploadProgress.bind(this),t.events.fileuploaddone=this._onUploadComplete.bind(this),t.events.fileuploadfail=this._onUploadFailure.bind(this),this.uploader=new Craft.Uploader(this.$container,t),this.initButtons()},initButtons:function(){var t=this;this.$container.find(this.settings.uploadButtonSelector).on("click",(function(e){t.$container.find(t.settings.fileInputSelector).trigger("click")})),this.$container.find(this.settings.deleteButtonSelector).on("click",(function(e){confirm(Craft.t("app","Are you sure you want to delete this image?"))&&($(e.currentTarget).parent().append('<div class="blocking-modal"></div>'),Craft.sendActionRequest("POST",t.settings.deleteAction,{data:t.settings.postParameters}).then((function(e){var i=e.data;t.refreshImage(i)})))}))},refreshImage:function(t){$(this.settings.containerSelector).replaceWith(t.html),this.settings.onAfterRefreshImage(t),this.initImageUpload()},_onUploadStart:function(t){this.progressBar.$progressBar.css({top:Math.round(this.$container.outerHeight()/2)-6}),this.$container.addClass("uploading"),this.progressBar.resetProgressBar(),this.progressBar.showProgressBar()},_onUploadProgress:function(t,e){var i=parseInt(e.loaded/e.total*100,10);this.progressBar.setProgressPercentage(i)},_onUploadComplete:function(t,e){e.result.error?alert(e.result.error):($(e.result.html),this.refreshImage(e.result)),this.uploader.isLastUpload()&&(this.progressBar.hideProgressBar(),this.$container.removeClass("uploading"))},_onUploadFailure:function(t,e){var i,s=e.response(),a=(null==s||null===(i=s.jqXHR)||void 0===i?void 0:i.responseJSON)||{},n=a.message,r=a.filename;n||(n=r?Craft.t("app","Upload failed for “{filename}”.",{filename:r}):Craft.t("app","Upload failed.")),alert(n),this.progressBar.hideProgressBar(),this.$container.removeClass("uploading")}},{defaults:{postParameters:{},uploadAction:"",deleteAction:"",fileInputSelector:"",onAfterRefreshImage:$.noop,containerSelector:null,uploadButtonSelector:null,deleteButtonSelector:null,uploadParamName:"files"}})},657:function(){Craft.InfoIcon=Garnish.Base.extend({$container:null,$icon:null,$liveRegion:null,content:null,hud:null,init:function(t){var e=this;if(this.$icon=$(t),this.$liveRegion=$("<span/>",{role:"status",class:"visually-hidden"}),this.$icon.data("infoicon")?(console.warn("Double-instantiating an info icon on an element"),this.content=this.$icon.data("infoicon").content,this.$icon.data("infoicon").destroy()):(this.content=this.$icon.html(),this.$icon.html("").attr({tabindex:0,role:"button",type:"button","aria-label":Craft.t("app","More info")}).wrap($("<span/>",{class:"infoicon-container"})),this.$container=this.$icon.parent(),this.$container.append(this.$liveRegion)),this.$icon.data("infoicon",this),this.$icon[0].previousSibling&&this.$icon[0].previousSibling.nodeType===Node.TEXT_NODE&&!this.$icon.parent().hasClass("nowrap")){var i=this.$icon[0].previousSibling.nodeValue.match(/[^\s\-]+\s*$/);i&&(this.$icon[0].previousSibling.nodeValue=this.$icon[0].previousSibling.nodeValue.substring(0,i.index),$("<span/>",{class:"nowrap",html:i[0].replace(/\s+$/,"")+" "}).insertAfter(this.$icon[0].previousSibling).append(this.$icon))}this.addListener(this.$icon,"click",(function(t){t.preventDefault(),t.stopPropagation(),e.showHud()})),this.addListener(this.$icon,"keydown",(function(t){e.hud&&e.hud.showing||![Garnish.SPACE_KEY,Garnish.RETURN_KEY].includes(t.keyCode)||(t.preventDefault(),t.stopPropagation(),e.showHud())}))},showHud:function(t){var e=this;this.hud?this.hud.show():(this.hud=new Garnish.HUD(this.$icon,this.content,{hudClass:"hud info-hud",closeOtherHUDs:!1,onShow:function(){Garnish.uiLayerManager.registerShortcut(Garnish.SPACE_KEY,(function(){e.hud.hide()})),e.$liveRegion.html(""),setTimeout((function(){e.$liveRegion.html(e.content)}),200)},onHide:function(){e.$liveRegion.html("")}}),Craft.initUiElements(this.hud.$body))},destroy:function(){this.$icon.removeData("infoicon"),this.base()}})},4487:function(){Craft.LightSwitch=Garnish.Base.extend({settings:null,$outerContainer:null,$innerContainer:null,$input:null,small:!1,on:!1,indeterminate:!1,dragger:null,dragStartMargin:null,init:function(t,e){if(this.$outerContainer=$(t),this.$outerContainer.data("lightswitch")&&(console.warn("Double-instantiating a lightswitch on an element"),this.$outerContainer.data("lightswitch").destroy()),this.$outerContainer.data("lightswitch",this),this.small=this.$outerContainer.hasClass("small"),this.setSettings(e,Craft.LightSwitch.defaults),this.$innerContainer=this.$outerContainer.find(".lightswitch-container:first"),this.$input=this.$outerContainer.find("input:first"),!this.$input.prop("disabled")){this.on=this.$outerContainer.hasClass("on"),this.indeterminate=this.$outerContainer.hasClass("indeterminate"),this.addListener(this.$outerContainer,"mousedown","_onMouseDown"),this.addListener(this.$outerContainer,"keydown","_onKeyDown"),this.dragger=new Garnish.BaseDrag(this.$outerContainer,{axis:Garnish.X_AXIS,ignoreHandleSelector:null,onDragStart:this._onDragStart.bind(this),onDrag:this._onDrag.bind(this),onDragStop:this._onDragStop.bind(this)});var i=this.$outerContainer.parent(".lightswitch-inner-container");i.length&&(this.addListener(i.children('span[data-toggle="off"]'),"click",this.turnOff),this.addListener(i.children('span[data-toggle="on"]'),"click",this.turnOn))}},turnOn:function(t){var e=!this.on;if(this.on=!0,this.indeterminate=!1,this.$outerContainer.addClass("dragging"),Garnish.prefersReducedMotion())this.$innerContainer.css("margin-"+Craft.left,0);else{var i={};i["margin-"+Craft.left]=0,this.$innerContainer.velocity("stop").velocity(i,Craft.LightSwitch.animationDuration,this._onSettle.bind(this))}this.$input.val(this.settings.value),this.$outerContainer.addClass("on"),this.$outerContainer.removeClass("indeterminate"),this.$outerContainer.attr("aria-checked","true"),e&&!0!==t&&this.onChange()},turnOff:function(t){var e=this.on||this.indeterminate;if(this.on=!1,this.indeterminate=!1,this.$outerContainer.addClass("dragging"),Garnish.prefersReducedMotion())this.$innerContainer.css("margin-"+Craft.left,this._getOffMargin());else{var i={};i["margin-"+Craft.left]=this._getOffMargin(),this.$innerContainer.velocity("stop").velocity(i,Craft.LightSwitch.animationDuration,this._onSettle.bind(this))}this.$input.val(""),this.$outerContainer.removeClass("on"),this.$outerContainer.removeClass("indeterminate"),this.$outerContainer.attr("aria-checked","false"),e&&!0!==t&&this.onChange()},turnIndeterminate:function(t){var e=!this.indeterminate;this.on=!1,this.indeterminate=!0,this.$outerContainer.addClass("dragging");var i={};i["margin-"+Craft.left]=this._getOffMargin()/2,this.$innerContainer.velocity("stop").velocity(i,Craft.LightSwitch.animationDuration,this._onSettle.bind(this)),this.$input.val(this.settings.indeterminateValue),this.$outerContainer.removeClass("on"),this.$outerContainer.addClass("indeterminate"),this.$outerContainer.attr("aria-checked","mixed"),e&&!0!==t&&this.onChange()},toggle:function(){this.indeterminate||!this.on?this.turnOn():this.turnOff()},onChange:function(){this.trigger("change"),this.settings.onChange(this.on),this.$outerContainer.trigger("change")},_onMouseDown:function(){this.addListener(Garnish.$doc,"mouseup","_onMouseUp")},_onMouseUp:function(){this.removeListener(Garnish.$doc,"mouseup"),this.dragger.dragging||this.toggle()},_onKeyDown:function(t){switch(t.keyCode){case Garnish.SPACE_KEY:this.toggle(),t.preventDefault();break;case Garnish.RIGHT_KEY:"ltr"===Craft.orientation?this.turnOn():this.turnOff(),t.preventDefault();break;case Garnish.LEFT_KEY:"ltr"===Craft.orientation?this.turnOff():this.turnOn(),t.preventDefault()}},_getMargin:function(){return parseInt(this.$innerContainer.css("margin-"+Craft.left))},_onDragStart:function(){this.$outerContainer.addClass("dragging"),this.dragStartMargin=this._getMargin()},_onDrag:function(){var t;(t="ltr"===Craft.orientation?this.dragStartMargin+this.dragger.mouseDistX:this.dragStartMargin-this.dragger.mouseDistX)<this._getOffMargin()?t=this._getOffMargin():t>0&&(t=0),this.$innerContainer.css("margin-"+Craft.left,t)},_onDragStop:function(){this._getMargin()>this._getOffMargin()/2?this.turnOn():this.turnOff()},_onSettle:function(){this.$outerContainer.removeClass("dragging")},destroy:function(){this.$outerContainer.removeData("lightswitch"),this.base(),this.dragger.destroy()},_getOffMargin:function(){return this.small?-10:-12}},{animationDuration:100,defaults:{value:"1",indeterminateValue:"-",onChange:$.noop}})},6966:function(){Craft.Listbox=Garnish.Base.extend({$container:null,$options:null,$selectedOption:null,selectedOptionIndex:null,init:function(t,e){var i=this;this.$container=$(t),this.setSettings(e,Craft.Listbox.defaults),this.$container.data("listbox")&&(console.warn("Double-instantiating a listbox on an element"),this.$container.data("listbox").destroy()),this.$container.data("listbox",this),this.$options=this.$container.find("button,[role=option]"),this.$selectedOption=this.$options.filter("[aria-pressed=true],[aria-selected=true]").removeAttr("aria-selected").attr("aria-pressed","true"),this.$selectedOption.length?this.selectedOptionIndex=this.$options.index(this.$selectedOption):this.$selectedOption=null,this.addListener(this.$options,"click",(function(t){i.select(i.$options.index($(t.currentTarget))),t.preventDefault()}))},select:function(t){t<0||t>=this.$options.length||t===this.selectedOptionIndex||(this.$selectedOption&&this.$selectedOption.removeClass(this.settings.selectedClass).attr("aria-pressed","false"),this.$selectedOption=this.$options.eq(t).addClass(this.settings.selectedClass).attr("aria-pressed","true"),this.selectedOptionIndex=t,this.settings.onChange(this.$selectedOption,t),this.trigger("change",{$selectedOption:this.$selectedOption,selectedOptionIndex:t}))},disable:function(){this.base(),this.$container.attr("aria-disabled","true")},enable:function(){this.base(),this.$container.removeAttr("aria-disabled")},destroy:function(){this.$container.removeData("listbox"),this.base()}},{defaults:{selectedClass:"active",focusClass:"focus",onChange:$.noop}})},5080:function(){Craft.LivePreview=Garnish.Base.extend({$extraFields:null,$trigger:null,$shade:null,$editorContainer:null,$editor:null,$dragHandle:null,$previewContainer:null,$iframeContainer:null,$iframe:null,$fieldPlaceholder:null,previewUrl:null,token:null,basePostData:null,inPreviewMode:!1,fields:null,lastPostData:null,updateIframeInterval:null,loading:!1,checkAgain:!1,dragger:null,dragStartEditorWidth:null,_slideInOnIframeLoad:!1,_scrollX:null,_scrollY:null,_editorWidth:null,_editorWidthInPx:null,init:function(t){var e=this;this.setSettings(t,Craft.LivePreview.defaults),this.settings.previewUrl?this.previewUrl=this.settings.previewUrl:this.previewUrl=Craft.baseSiteUrl.replace(/\/+$/,"")+"/","https:"===document.location.protocol&&(this.previewUrl=this.previewUrl.replace(/^http:/,"https:")),this.basePostData=$.extend({},this.settings.previewParams),this.$extraFields=$(this.settings.extraFields),this.$trigger=$(this.settings.trigger),this.$fieldPlaceholder=$("<div/>"),this.editorWidth=Craft.getLocalStorage("LivePreview.editorWidth",Craft.LivePreview.defaultEditorWidth),this.addListener(this.$trigger,"activate","toggle"),Craft.cp.on("beforeSaveShortcut",(function(){e.inPreviewMode&&e.moveFieldsBack()})),Craft.Preview.instances.push(this)},get editorWidth(){return this._editorWidth},get editorWidthInPx(){return this._editorWidthInPx},set editorWidth(t){var e;t>=1?(e=t,t/=Garnish.$win.width()):e=Math.round(t*Garnish.$win.width()),e<Craft.LivePreview.minEditorWidthInPx&&(t=(e=Craft.LivePreview.minEditorWidthInPx)/Garnish.$win.width()),this._editorWidth=t,this._editorWidthInPx=e},toggle:function(){this.inPreviewMode?this.exit():this.enter()},enter:function(){var t=this;if(!this.inPreviewMode)if(this.token){if(this.trigger("beforeEnter"),$(document.activeElement).trigger("blur"),!this.$editor){this.$shade=$("<div/>",{class:"modal-shade dark"}).appendTo(Garnish.$bod),this.$previewContainer=$("<div/>",{class:"lp-preview-container"}).appendTo(Garnish.$bod),this.$iframeContainer=$("<div/>",{class:"lp-iframe-container"}).appendTo(this.$previewContainer),this.$editorContainer=$("<div/>",{class:"lp-editor-container"}).appendTo(Garnish.$bod);var e=$("<header/>",{class:"flex"}).appendTo(this.$editorContainer);this.$editor=$("<form/>",{class:"lp-editor"}).appendTo(this.$editorContainer),this.$dragHandle=$("<div/>",{class:"lp-draghandle"}).appendTo(this.$editorContainer);var i=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Close Preview")}).appendTo(e);$("<div/>",{class:"flex-grow"}).appendTo(e);var s=$("<button/>",{type:"button",class:"btn submit",text:Craft.t("app","Save")}).appendTo(e);this.dragger=new Garnish.BaseDrag(this.$dragHandle,{axis:Garnish.X_AXIS,onDragStart:this._onDragStart.bind(this),onDrag:this._onDrag.bind(this),onDragStop:this._onDragStop.bind(this)}),this.addListener(i,"click","exit"),this.addListener(s,"click","save")}this.handleWindowResize(),this.addListener(Garnish.$win,"resize","handleWindowResize"),this.$editorContainer.css(Craft.left,-this.editorWidthInPx+"px"),this.$previewContainer.css(Craft.right,-this.getIframeWidth()),this.fields=[];for(var a=$(this.settings.fields),n=0;n<a.length;n++){var r=$(a[n]),o=this._getClone(r);this.$fieldPlaceholder.insertAfter(r),r.detach(),this.$fieldPlaceholder.replaceWith(o),r.appendTo(this.$editor),this.fields.push({$field:r,$clone:o})}this.updateIframe()?this._slideInOnIframeLoad=!0:this.slideIn(),Craft.ElementThumbLoader.retryAll(),Garnish.uiLayerManager.addLayer(this.$sidebar),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.exit()})),this.inPreviewMode=!0,this.trigger("enter")}else this.createToken()},createToken:function(){var t=this,e={previewAction:this.settings.previewAction};Craft.sendActionRequest("POST","live-preview/create-token",{data:e}).then((function(e){t.token=e.data.token,t.enter()}))},save:function(){Craft.cp.submitPrimaryForm()},handleWindowResize:function(){this.editorWidth=this.editorWidth,this.updateWidths()},slideIn:function(){var t=this;$("html").addClass("noscroll"),this.$shade.velocity("fadeIn"),this.$editorContainer.show().velocity("stop").animateLeft(0,"slow",(function(){t.trigger("slideIn"),Garnish.$win.trigger("resize")})),this.$previewContainer.show().velocity("stop").animateRight(0,"slow",(function(){t.updateIframeInterval=setInterval(t.updateIframe.bind(t),1e3)}))},exit:function(){var t=this;this.inPreviewMode&&(this.trigger("beforeExit"),$("html").removeClass("noscroll"),this.removeListener(Garnish.$win,"resize"),Garnish.uiLayerManager.removeLayer(),this.updateIframeInterval&&clearInterval(this.updateIframeInterval),this.moveFieldsBack(),this.$shade.delay(200).velocity("fadeOut"),this.$editorContainer.velocity("stop").animateLeft(-this.editorWidthInPx,"slow",(function(){for(var e=0;e<t.fields.length;e++)t.fields[e].$newClone.remove();t.$editorContainer.hide(),t.trigger("slideOut")})),this.$previewContainer.velocity("stop").animateRight(-this.getIframeWidth(),"slow",(function(){t.$previewContainer.hide()})),Craft.ElementThumbLoader.retryAll(),this.inPreviewMode=!1,this.trigger("exit"))},moveFieldsBack:function(){for(var t=0;t<this.fields.length;t++){var e=this.fields[t];e.$newClone=this._getClone(e.$field),this.$fieldPlaceholder.insertAfter(e.$field),e.$field.detach(),this.$fieldPlaceholder.replaceWith(e.$newClone),e.$clone.replaceWith(e.$field)}Garnish.$win.trigger("resize")},getIframeWidth:function(){return Garnish.$win.width()-this.editorWidthInPx},updateWidths:function(){this.$editorContainer.css("width",this.editorWidthInPx+"px"),this.$previewContainer.width(this.getIframeWidth())},updateIframe:function(t){if(t&&(this.lastPostData=null),!this.inPreviewMode)return!1;if(this.loading)return this.checkAgain=!0,!1;var e=$.extend(Garnish.getPostData(this.$editor),Garnish.getPostData(this.$extraFields));if(this.lastPostData&&Craft.compare(e,this.lastPostData,!1))return!1;this.lastPostData=e,this.loading=!0;var i=this.$iframe?$(this.$iframe[0].contentWindow.document):null;return this._scrollX=i?i.scrollLeft():0,this._scrollY=i?i.scrollTop():0,$.ajax({url:this.previewUrl+(-1!==this.previewUrl.indexOf("?")?"&":"?")+Craft.tokenParam+"="+this.token,method:"POST",data:$.extend({},e,this.basePostData),headers:{"X-Craft-Token":this.token},xhrFields:{withCredentials:!0},crossDomain:!0,success:this.handleSuccess.bind(this),error:this.handleError.bind(this)}),!0},forceUpdateIframe:function(){return this.updateIframe(!0)},handleSuccess:function(t){var e=this,i=t+'<script type="text/javascript">window.scrollTo('+this._scrollX+", "+this._scrollY+");<\/script>",s=$('<iframe class="lp-preview" frameborder="0"/>');this.$iframe?s.insertBefore(this.$iframe):s.appendTo(this.$iframeContainer),this.addListener(s,"load",(function(){this.$iframe&&this.$iframe.remove(),this.$iframe=s,this._slideInOnIframeLoad&&(this.slideIn(),this._slideInOnIframeLoad=!1),this.removeListener(s,"load")})),Garnish.requestAnimationFrame((function(){s[0].contentWindow.document.open(),s[0].contentWindow.document.write(i),s[0].contentWindow.document.close(),e.onResponse()}))},handleError:function(){this.onResponse()},onResponse:function(){this.loading=!1,this.checkAgain&&(this.checkAgain=!1,this.updateIframe())},_getClone:function(t){var e=t.clone();return Garnish.copyInputValues(t,e),e.attr("id",""),e.find("[id]").attr("id",""),e},_onDragStart:function(){this.dragStartEditorWidth=this.editorWidthInPx,this.$previewContainer.addClass("dragging")},_onDrag:function(){"ltr"===Craft.orientation?this.editorWidth=this.dragStartEditorWidth+this.dragger.mouseDistX:this.editorWidth=this.dragStartEditorWidth-this.dragger.mouseDistX,this.updateWidths()},_onDragStop:function(){this.$previewContainer.removeClass("dragging"),Craft.setLocalStorage("LivePreview.editorWidth",this.editorWidth)},destroy:function(){var t=this;Craft.Preview.instances=Craft.Preview.instances.filter((function(e){return e!==t})),this.base()}},{defaultEditorWidth:.33,minEditorWidthInPx:320,instances:[],defaults:{trigger:".livepreviewbtn",fields:null,extraFields:null,previewUrl:null,previewAction:null,previewParams:{}}}),Craft.LivePreview.init=function(t){Craft.livePreview=new Craft.LivePreview(t)}},7439:function(){Craft.PasswordInput=Garnish.Base.extend({$passwordWrapper:null,$passwordInput:null,$textInput:null,$currentInput:null,$showPasswordToggle:null,showingPassword:null,init:function(t,e){this.$passwordInput=$(t),this.$passwordWrapper=this.$passwordInput.parent(".passwordwrapper"),this.settings=$.extend({},Craft.PasswordInput.defaults,e),this.$passwordInput.data("passwordInput")&&(console.warn("Double-instantiating a password input on an element"),this.$passwordInput.data("passwordInput").destroy()),this.$passwordInput.data("passwordInput",this),this.$showPasswordToggle=$('<button type="button" class="invisible" />'),this.$showPasswordToggle.addClass("password-toggle"),this.$showPasswordToggle.insertAfter(this.$passwordInput),this.initInputFocusEvents(this.$passwordInput),this.addListener(this.$showPasswordToggle,"click","onClick"),this.hidePassword(),this.addListener(this.$passwordWrapper.closest("form"),"submit","hidePassword")},setCurrentInput:function(t){this.$currentInput&&(t.insertAfter(this.$currentInput),this.$currentInput.detach(),t.trigger("focus"),t.val(this.$currentInput.val())),this.$currentInput=t,this.addListener(this.$currentInput,"keypress,keyup,change,blur","onInputChange")},updateToggleLabel:function(t){this.$showPasswordToggle.text(t)},initInputFocusEvents:function(t){this.addListener(t,"focus",(function(){this.$passwordWrapper.addClass("focus")})),this.addListener(t,"blur",(function(){this.$passwordWrapper.removeClass("focus")}))},showPassword:function(){this.showingPassword||(this.$textInput||(this.$textInput=this.$passwordInput.clone(!0),this.$textInput.attr({type:"text",autocapitalize:"off"}),this.initInputFocusEvents(this.$textInput)),this.setCurrentInput(this.$textInput),this.updateToggleLabel(Craft.t("app","Hide")),this.showingPassword=!0)},hidePassword:function(){!1!==this.showingPassword&&(this.setCurrentInput(this.$passwordInput),this.updateToggleLabel(Craft.t("app","Show")),this.showingPassword=!1)},togglePassword:function(){this.showingPassword?this.hidePassword():this.showPassword(),this.settings.onToggleInput(this.$currentInput)},onInputChange:function(){this.$currentInput.val()?this.$showPasswordToggle.removeClass("invisible"):this.$showPasswordToggle.addClass("invisible")},onClick:function(t){if(this.$currentInput[0].setSelectionRange){var e=this.$currentInput[0].selectionStart,i=this.$currentInput[0].selectionEnd;this.togglePassword(),this.$currentInput[0].setSelectionRange(e,i)}else this.togglePassword()},destroy:function(){this.$passwordInput.removeData("passwordInput"),this.base()}},{defaults:{onToggleInput:$.noop}})},5328:function(){function t(t,i){var s="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!s){if(Array.isArray(t)||(s=function(t,i){if(t){if("string"==typeof t)return e(t,i);var s=Object.prototype.toString.call(t).slice(8,-1);return"Object"===s&&t.constructor&&(s=t.constructor.name),"Map"===s||"Set"===s?Array.from(t):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?e(t,i):void 0}}(t))||i&&t&&"number"==typeof t.length){s&&(t=s);var a=0,n=function(){};return{s:n,n:function(){return a>=t.length?{done:!0}:{done:!1,value:t[a++]}},e:function(t){throw t},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){s=s.call(t)},n:function(){var t=s.next();return o=t.done,t},e:function(t){l=!0,r=t},f:function(){try{o||null==s.return||s.return()}finally{if(l)throw r}}}}function e(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}function i(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);e&&(s=s.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,s)}return i}function s(t){for(var e=1;e<arguments.length;e++){var s=null!=arguments[e]?arguments[e]:{};e%2?i(Object(s),!0).forEach((function(e){a(t,e,s[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(s)):i(Object(s)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(s,e))}))}return t}function a(t,e,i){return e in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function n(t){return n="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},n(t)}Craft.Preview=Garnish.Base.extend({elementEditor:null,$shade:null,$editorContainer:null,$editor:null,$spinner:null,$statusIcon:null,$dragHandle:null,$previewWrapper:null,$previewContainer:null,$previewSkipLink:null,$bumperLink:null,$notifier:null,$iframeContainer:null,$previewHeader:null,$targetBtn:null,$targetMenu:null,$deviceTypeContainer:null,$orientationBtn:null,$refreshBtn:null,$deviceMask:null,$devicePreviewContainer:null,$iframe:null,iframeLoaded:!1,$tempInput:null,$fieldPlaceholder:null,isActive:!1,isVisible:!1,activeTarget:0,animationDuration:"slow",currentDeviceType:"desktop",deviceOrientation:null,deviceWidth:"",deviceHeight:"",deviceMaskDimensions:{phone:{width:375,height:753},tablet:{width:768,height:1110}},draftId:null,url:null,fields:null,iframeHeight:null,scrollTop:null,dragger:null,dragStartEditorWidth:null,_updateIframeProxy:null,_editorWidth:null,_editorWidthInPx:null,init:function(t){this.elementEditor=t,this._updateIframeProxy=this.updateIframe.bind(this),this.$tempInput=$("<input/>",{type:"hidden",name:"__PREVIEW_FIELDS__",value:"1"}),this.$fieldPlaceholder=$("<div/>"),this.editorWidth=Craft.getLocalStorage("LivePreview.editorWidth",Craft.Preview.defaultEditorWidth),Craft.Preview.instances.push(this)},get editorWidth(){return this._editorWidth},get editorWidthInPx(){return this._editorWidthInPx},set editorWidth(t){var e;t>=1?(e=t,t/=Garnish.$win.width()):e=Math.round(t*Garnish.$win.width()),e<Craft.Preview.minEditorWidthInPx&&(t=(e=Craft.Preview.minEditorWidthInPx)/Garnish.$win.width()),this._editorWidth=t,this._editorWidthInPx=e},open:function(){var t=this;if(!this.isActive){if(this.isActive=!0,this.trigger("beforeOpen"),$(document.activeElement).trigger("blur"),!this.$editor){var e=Craft.t("app","Skip to {title}",{title:Craft.t("app","Top of preview")});this.$shade=$("<div/>",{class:"modal-shade dark"}).appendTo(Garnish.$bod),this.$previewWrapper=$("<div/>",{role:"dialog","aria-modal":"true","aria-labelledby":"lp-preview-heading"}).appendTo(Garnish.$bod),this.$modalLabel=$("<h2/>",{id:"lp-preview-heading",class:"visually-hidden",html:Craft.t("app","Preview")}).appendTo(this.$previewWrapper),this.$editorContainer=$("<div/>",{class:"lp-editor-container"}).appendTo(this.$previewWrapper),this.$previewContainer=$("<div/>",{class:"lp-preview-container",id:"lp-preview-container"}).appendTo(this.$previewWrapper),this.$notifier=$("<span/>",{class:"visually-hidden","aria-live":"assertive"}).appendTo(this.$previewContainer);var i=$("<header/>",{class:"flex"}).appendTo(this.$editorContainer);this.$editor=$("<form/>",{class:"lp-editor"}).appendTo(this.$editorContainer),this.$dragHandle=$("<div/>",{class:"lp-draghandle"}).appendTo(this.$editorContainer);var s=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Close Preview")}).appendTo(i);if($("<div/>",{class:"flex-grow"}).appendTo(i),this.$spinner=$("<div/>",{class:"spinner hidden",title:Craft.t("app","Saving")}).appendTo(i),this.$statusIcon=$("<div/>",{class:"invisible"}).appendTo(i),this.$statusMessage=$("<span/>",{class:"visually-hidden","aria-live":"polite"}).appendTo(i),this.$previewSkipLink=$("<a/>",{class:"skip-link btn",href:"#lp-preview-container",html:e}).appendTo(i),Craft.Pro){if(this.$previewHeader=$("<header/>",{class:"lp-preview-header"}).appendTo(this.$previewContainer),this.elementEditor.settings.previewTargets.length>1){this.$targetBtn=$("<button/>",{type:"button",class:"btn menubtn",text:this.elementEditor.settings.previewTargets[0].label}).appendTo(this.$previewHeader),this.$targetMenu=$("<div/>",{class:"menu lp-target-menu"}).insertAfter(this.$targetBtn);for(var a,n=$("<ul/>",{class:"padded"}).appendTo(this.$targetMenu),r=0;r<this.elementEditor.settings.previewTargets.length;r++)a=$("<li/>").appendTo(n),$("<a/>",{data:{target:r},text:this.elementEditor.settings.previewTargets[r].label,class:0===r?"sel":null}).appendTo(a);new Garnish.MenuBtn(this.$targetBtn,{onOptionSelect:function(e){t.switchTarget($(e).data("target"))}}),$('<div class="flex-grow"/>').appendTo(this.$previewHeader)}this._buildDeviceTypeFieldset(),$('<div class="flex-grow"/>').appendTo(this.$previewHeader);var o=$('<div class="buttons"/>').appendTo(this.$previewHeader);this.$orientationBtn=$("<button/>",{type:"button",class:"btn disabled","data-icon":"rotate","aria-disabled":"true",text:Craft.t("app","Rotate"),"aria-label":Craft.t("app","Rotate")}).appendTo(o),this.addListener(this.$orientationBtn,"click","switchOrientation"),this.$refreshBtn=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Refresh"),"data-icon":"refresh"}).appendTo(o),this.addListener(this.$refreshBtn,"click",(function(){t.updateIframe(!1,!0)})),this.deviceOrientation=Craft.getLocalStorage("LivePreview.orientation")}this.$iframeContainer=$("<div/>",{class:"lp-iframe-container"}).appendTo(this.$previewContainer),this.$devicePreviewContainer=$("<div/>",{class:"lp-device-preview-container"}).appendTo(this.$iframeContainer),this.$deviceMask=$("<div/>",{class:"lp-device-mask"}).appendTo(this.$iframeContainer),this.$bumperLink=$("<a/>",{class:"skip-link btn lp-preview-container__bumper-link",html:e,href:"#lp-preview-container"}),this.$bumperLink.appendTo(this.$previewContainer),this.dragger=new Garnish.BaseDrag(this.$dragHandle,{axis:Garnish.X_AXIS,onDragStart:this._onDragStart.bind(this),onDrag:this._onDrag.bind(this),onDragStop:this._onDragStop.bind(this)}),this.addListener(s,"click","close"),this.addListener(this.$statusIcon,"click",(function(){t.elementEditor.showStatusHud(t.$statusIcon)}))}this.handleWindowResize(),this.addListener(Garnish.$win,"resize","handleWindowResize"),this.$editorContainer.css(Craft.left,-this.editorWidthInPx+"px"),this.$previewContainer.css(Craft.right,-this.getIframeWidth()),this.fields=[];var l=$("#content .field").not($("#content .field .field"));if(l.length){this.$tempInput.insertBefore(l.get(0));for(var h=0;h<l.length;h++){var d=$(l[h]),c=this._getClone(d);this.$fieldPlaceholder.insertAfter(d),d.detach(),this.$fieldPlaceholder.replaceWith(c),d.appendTo(this.$editor),this.fields.push({$field:d,$clone:c})}}this.updateIframe(),this.elementEditor.on("update",this._updateIframeProxy),Craft.ElementThumbLoader.retryAll(),this.trigger("open")}},_getDeviceTypeTranslation:function(t){var e;switch(t){case"phone":e=Craft.t("app","Mobile");break;case"tablet":e=Craft.t("app","Tablet");break;default:e=Craft.t("app","Desktop")}return e},_getDeviceOrientationTranslation:function(t){return"portrait"===t?Craft.t("app","Portrait"):Craft.t("app","Landscape")},_buildDeviceTypeFieldset:function(){var t=this;this.$deviceTypeContainer=$("<section/>",{class:"btngroup lp-device-type","aria-label":Craft.t("app","Device type")}).appendTo(this.$previewHeader),$("<button/>",{type:"button",class:"btn lp-device-type-btn--desktop active",title:Craft.t("app","Desktop"),"aria-label":Craft.t("app","Desktop"),"aria-pressed":"true",data:{width:"",height:"",deviceType:"desktop"}}).appendTo(this.$deviceTypeContainer),$("<button/>",{type:"button",class:"btn lp-device-type-btn--tablet",title:Craft.t("app","Tablet"),"aria-label":Craft.t("app","Tablet"),"aria-pressed":"false",data:{width:768,height:1024,deviceType:"tablet"}}).appendTo(this.$deviceTypeContainer),$("<button/>",{type:"button",class:"btn lp-device-type-btn--phone",title:Craft.t("app","Mobile"),"aria-label":Craft.t("app","Mobile"),"aria-pressed":"false",data:{width:375,height:667,deviceType:"phone"}}).appendTo(this.$deviceTypeContainer),this.deviceBtnGroup=new Craft.Listbox(this.$deviceTypeContainer,{onChange:function(e){t.switchDeviceType(e)}})},_activeTarget:function(){return this.elementEditor.settings.previewTargets[this.activeTarget]},_autoRefresh:function(){var t=this._activeTarget();return void 0===n(t.refresh)||!!t.refresh},switchTarget:function(t){this.activeTarget=t,this.$targetBtn.text(this.elementEditor.settings.previewTargets[t].label),this.$targetMenu.find("a.sel").removeClass("sel"),this.$targetMenu.find("a").eq(t).addClass("sel"),this.updateIframe(!0),this.trigger("switchTarget",{previewTarget:this.elementEditor.settings.previewTargets[t]})},handleWindowResize:function(){this.editorWidth=this.editorWidth,this.updateWidths()},slideIn:function(){var t=this;this.isActive&&!this.isVisible&&($("html").addClass("noscroll"),this.$shade.velocity("fadeIn"),this.$editorContainer.show().velocity("stop").animateLeft(0,Garnish.getUserPreferredAnimationDuration(this.animationDuration),(function(){t.trigger("slideIn"),Garnish.$win.trigger("resize")})),this.$previewContainer.show().velocity("stop").animateRight(0,Garnish.getUserPreferredAnimationDuration(this.animationDuration)),this.isVisible=!0,Garnish.uiLayerManager.addLayer(this.$previewWrapper),Garnish.hideModalBackgroundLayers(),Craft.setFocusWithin(this.$previewWrapper),Craft.trapFocusWithin(this.$previewWrapper),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.close()})))},close:function(){var t=this;this.isActive&&this.isVisible&&(this.trigger("beforeClose"),$("html").removeClass("noscroll"),this.removeListener(Garnish.$win,"resize"),Garnish.uiLayerManager.removeLayer(),Garnish.resetModalBackgroundLayerVisibility(),this.$tempInput.detach(),this.moveFieldsBack(),Garnish.prefersReducedMotion()?this.$shade.velocity("fadeOut"):this.$shade.delay(200).velocity("fadeOut"),this.$editorContainer.velocity("stop").animateLeft(-this.editorWidthInPx,Garnish.getUserPreferredAnimationDuration(this.animationDuration),(function(){for(var e=0;e<t.fields.length;e++)t.fields[e].$newClone.remove();t.$editorContainer.hide(),t.trigger("slideOut")})),this.$previewContainer.velocity("stop").animateRight(-this.getIframeWidth(),Garnish.getUserPreferredAnimationDuration(this.animationDuration),(function(){t.$iframeContainer.removeClass("lp-iframe-container--rotating"),t.$previewContainer.hide()})),this.elementEditor.off("update",this._updateIframeProxy),Craft.ElementThumbLoader.retryAll(),this.elementEditor.$previewBtn&&this.elementEditor.$previewBtn.focus(),this.isActive=!1,this.isVisible=!1,this.trigger("close"))},moveFieldsBack:function(){for(var t=0;t<this.fields.length;t++){var e=this.fields[t];e.$newClone=this._getClone(e.$field),this.$fieldPlaceholder.insertAfter(e.$field),e.$field.detach(),this.$fieldPlaceholder.replaceWith(e.$newClone),e.$clone.replaceWith(e.$field)}Garnish.$win.trigger("resize"),Garnish.$doc.trigger("scroll")},getIframeWidth:function(){return Garnish.$win.width()-this.editorWidthInPx},updateWidths:function(){this.$editorContainer.css("width",this.editorWidthInPx+"px"),this.$previewContainer.width(this.getIframeWidth()),this._devicePreviewIsActive()&&this.updateDevicePreview()},_useIframeResizer:function(){return!1!==Craft.previewIframeResizerOptions},updateIframe:function(t,e){var i=this;if(!this.isActive)return!1;t=!0===t,this.draftId===(this.draftId=this.elementEditor.settings.draftId)&&this.$iframe||(e=!0);var s=this._activeTarget();void 0===e&&(e=t||this._autoRefresh()),this.trigger("beforeUpdateIframe",{previewTarget:s,resetScroll:t,refresh:e}),e?this.elementEditor.getTokenizedPreviewUrl(s.url,"x-craft-live-preview").then((function(e){var s;t?i.scrollTop=null:i.iframeLoaded&&i.$iframe&&(i._useIframeResizer()?(i.iframeHeight=i.$iframe.height(),i.scrollTop=i.$iframeContainer.scrollTop()):(s=Craft.isSameHost(e))&&i.$iframe[0].contentWindow&&(i.scrollTop=$(i.$iframe[0].contentWindow.document).scrollTop())),i.iframeLoaded=!1;var a=$("<iframe/>",{class:"lp-preview",frameborder:0,src:e,title:Craft.t("app","Preview")});i.$iframe?i.$iframe.replaceWith(a):a.appendTo(i.$devicePreviewContainer),i._useIframeResizer()?(t||null===i.iframeHeight||(a.height(i.iframeHeight),i.$iframeContainer.scrollTop(i.scrollTop)),iFrameResize($.extend({checkOrigin:!1,scrolling:!0,onInit:function(t){i.iframeLoaded=!0,i.iframeHeight=null,i.scrollTop=null,t.scrolling="no"}},Craft.previewIframeResizerOptions||{}),a[0])):a.on("load",(function(){i.iframeLoaded=!0,!t&&s&&null!==i.scrollTop&&$(a[0].contentWindow.document).scrollTop(i.scrollTop)})),i.url=e,i.$iframe=a,i._devicePreviewIsActive()&&i.updateDevicePreview(),i.trigger("afterUpdateIframe",{previewTarget:i.elementEditor.settings.previewTargets[i.activeTarget],$iframe:i.$iframe}),i.slideIn()})):this.slideIn()},_devicePreviewIsActive:function(){return"desktop"!==this.currentDeviceType},_updateNotifier:function(){var t=this;this.$notifier.html="";var e="desktop"===this.currentDeviceType?"Previewing {type} device":"Previewing {type} device in {orientation}",i={type:this._getDeviceTypeTranslation(this.currentDeviceType)};"desktop"!==this.currentDeviceType&&(i=s(s({},i),{orientation:this._getDeviceOrientationTranslation(this.deviceOrientation)}));var a=Craft.t("app",e,i);setTimeout((function(){t.$notifier.text(a)}),200)},switchDeviceType:function(t){this.$iframeContainer.removeClass("lp-iframe-container--rotating");var e=t.data("deviceType");if(e===this.currentDeviceType)return!1;this.currentDeviceType=e,this.deviceWidth=t.data("width"),this.deviceHeight=t.data("height"),"desktop"===this.currentDeviceType?(this.$orientationBtn.addClass("disabled").attr("aria-disabled","true"),this.$iframeContainer.removeClass("lp-iframe-container--has-device-preview")):(this.$orientationBtn.removeClass("disabled").removeAttr("aria-disabled"),this.$iframeContainer.addClass("lp-iframe-container--has-device-preview")),"tablet"===this.currentDeviceType?this.$iframeContainer.addClass("lp-iframe-container--tablet"):this.$iframeContainer.removeClass("lp-iframe-container--tablet"),this._updateNotifier(),"desktop"!==this.currentDeviceType&&this.updateDevicePreview()},switchOrientation:function(){var t=this;if(!this._devicePreviewIsActive())return!1;this.deviceOrientation&&"portrait"!==this.deviceOrientation?this.deviceOrientation="portrait":this.deviceOrientation="landscape",Craft.setLocalStorage("LivePreview.orientation",this.deviceOrientation),this.$iframeContainer.addClass("lp-iframe-container--rotating"),this.updateDevicePreview(),this._updateNotifier(),setTimeout((function(){t.$iframeContainer.removeClass("lp-iframe-container--rotating")}),300)},updateDevicePreview:function(){var t=1,e=1,i=1,s=this.$previewContainer.height()-50-48,a=this.$previewContainer.width()-48,n=this.deviceMaskDimensions[this.currentDeviceType].height,r=this.deviceMaskDimensions[this.currentDeviceType].width;"landscape"===this.deviceOrientation?(a<n&&(t=a/n),s<r&&(e=s/r)):(s<n&&(t=s/n),a<r&&(e=a/r)),i=t,e<t&&(i=e);var o=-100/i/2,l="landscape"===this.deviceOrientation?"-90deg":"0deg";this.$deviceMask.css({width:this.deviceMaskDimensions[this.currentDeviceType].width+"px",height:this.deviceMaskDimensions[this.currentDeviceType].height+"px",transform:"scale("+i+") translate("+o+"%, "+o+"%) rotate("+l+")"}),"landscape"===this.deviceOrientation?this.$devicePreviewContainer.css({width:this.deviceHeight+"px",height:this.deviceWidth+"px",transform:"scale("+i+") translate("+o+"%, "+o+"%)",marginTop:0,marginLeft:"-"+12*i+"px"}):this.$devicePreviewContainer.css({width:this.deviceWidth+"px",height:this.deviceHeight+"px",transform:"scale("+i+") translate("+o+"%, "+o+"%)",marginTop:"-"+12*i+"px",marginLeft:0})},_getClone:function(t){var e=t.clone();return Garnish.copyInputValues(t,e),e.attr("id",""),e.find("[id]").attr("id",""),e.find("[name]").prop("disabled",!0),e},_onDragStart:function(){this.dragStartEditorWidth=this.editorWidthInPx,this.$previewContainer.addClass("dragging")},_onDrag:function(){"ltr"===Craft.orientation?this.editorWidth=this.dragStartEditorWidth+this.dragger.mouseDistX:this.editorWidth=this.dragStartEditorWidth-this.dragger.mouseDistX,this.updateWidths()},_onDragStop:function(){this.$previewContainer.removeClass("dragging"),Craft.setLocalStorage("LivePreview.editorWidth",this.editorWidth)},destroy:function(){var t=this;Craft.Preview.instances=Craft.Preview.instances.filter((function(e){return e!==t})),this.base()}},{defaultEditorWidth:.33,minEditorWidthInPx:320,instances:[],refresh:function(){var e,i=t(Craft.Preview.instances);try{for(i.s();!(e=i.n()).done;)preview=e.value,preview.updateIframe()}catch(t){i.e(t)}finally{i.f()}var s,a=t(Craft.LivePreview.instances);try{for(a.s();!(s=a.n()).done;)preview=s.value,preview.forceUpdateIframe()}catch(t){a.e(t)}finally{a.f()}}})},6419:function(){Craft.PreviewFileModal=Garnish.Modal.extend({assetId:null,$spinner:null,$triggerElement:null,$bumperButtonStart:null,$bumperButtonEnd:null,elementSelect:null,type:null,loaded:null,requestId:0,init:function(t,e,i){var s=this;if(i=$.extend(this.defaultSettings,i),this.$triggerElement=Garnish.getFocusedElement(),i.onHide=this._onHide.bind(this),Craft.PreviewFileModal.openInstance){var a=Craft.PreviewFileModal.openInstance;return a.assetId!==t&&(a.loadAsset(t,i.startingWidth,i.startingHeight),a.elementSelect=e),this.destroy()}Craft.PreviewFileModal.openInstance=this,this.elementSelect=e,this.$container=$('<div class="modal previewmodal loading"/>').appendTo(Garnish.$bod),this.base(this.$container,$.extend({resizable:!0},i)),this.$container&&(this.$container.velocity("stop"),this.$container.show().css("opacity",1),this.$shade.velocity("stop"),this.$shade.show().css("opacity",1),Garnish.setFocusWithin(this.$container)),this.$bumperButtonStart=Craft.ui.createButton({html:Craft.t("app","Close Preview"),class:"skip-link"}),this.addListener(this.$bumperButtonStart,"click",(function(){s.hide()})),this.$bumperButtonEnd=this.$bumperButtonStart.clone(!0),this.loadAsset(t,i.startingWidth,i.startingHeight)},_onHide:function(){return Craft.PreviewFileModal.openInstance=null,this.elementSelect?this.elementSelect.focusItem(this.elementSelect.$focusedItem):this.$triggerElement&&this.$triggerElement.length&&this.$triggerElement.trigger("focus"),this.$shade.remove(),this.destroy()},_addBumperButtons:function(){this.$container.prepend(this.$bumperButtonStart).append(this.$bumperButtonEnd)},_addModalName:function(){var t="preview-heading";this.$container.prepend($("h1").attr({class:"visually-hidden",id:t}).text(Craft.t("app","Preview file"))).attr("aria-labelledby",t)},selfDestruct:function(){var t=Craft.PreviewFileModal.openInstance;return t.hide(),t.$shade.remove(),t.destroy(),Craft.PreviewFileModal.openInstance=null,Craft.focalPoint.destruct(),Craft.focalPoint=null,!0},loadAsset:function(t,e,i){var s=this;this.assetId=t,this.$container.empty(),this.loaded=!1,this.desiredHeight=null,this.desiredWidth=null;var a=.66*Garnish.$win.height(),n=Math.min(a/3*4,Garnish.$win.width()-2*this.settings.minGutter);if(a=n/4*3,e&&i){var r=e/i;n=Math.min(e,Garnish.$win.width()-2*this.settings.minGutter),(n=(a=Math.min(n/r,Garnish.$win.height()-2*this.settings.minGutter))*r)>Math.min(e,Garnish.$win.width()-2*this.settings.minGutter)&&(a=(n=Math.min(e,Garnish.$win.width()-2*this.settings.minGutter))/r)}this._resizeContainer(n,a),this.$spinner=$('<div class="spinner centeralign"></div>').appendTo(this.$container);var o=this.$container.height()/2-this.$spinner.height()/2+"px",l=this.$container.width()/2-this.$spinner.width()/2+"px";this.$spinner.css({left:l,top:o,position:"absolute"}),this.requestId++;var h={assetId:t,requestId:this.requestId},d=function(){s.$container.removeClass("loading"),s.$spinner.remove(),s.loaded=!0};Craft.sendActionRequest("POST","assets/preview-file",{data:h}).then((function(t){if(d(),t.data.requestId==s.requestId){if(!t.data.previewHtml)return s.$container.addClass("zilch"),s.$container.append($("<p/>",{text:Craft.t("app","No preview available.")})),void s._addBumperButtons();s.$container.removeClass("zilch"),s.$container.attr("data-asset-id",s.assetId),s.$container.append(t.data.previewHtml),s._addBumperButtons(),s._addModalName(),Craft.appendHeadHtml(t.data.headHtml),Craft.appendBodyHtml(t.data.bodyHtml)}})).catch((function(t){var e=t.response;d(),alert(e.data.message),s.hide()}))},_resizeContainer:function(t,e){this.$container.css({width:t,"min-width":t,"max-width":t,height:e,"min-height":e,"max-height":e,top:(Garnish.$win.height()-e)/2,left:(Garnish.$win.width()-t)/2})}},{defaultSettings:{startingWidth:null,startingHeight:null}})},872:function(){Craft.ProgressBar=Garnish.Base.extend({$progressBar:null,$innerProgressBar:null,$progressBarStatus:null,_itemCount:0,_processedItemCount:0,_displaySteps:!1,init:function(t,e){e&&(this._displaySteps=!0),this.$progressBar=$('<div class="progressbar pending hidden"/>').appendTo(t),this.$innerProgressBar=$('<div class="progressbar-inner"/>').appendTo(this.$progressBar),this.$progressBarStatus=$('<div class="progressbar-status hidden" />').insertAfter(this.$progressBar),this.resetProgressBar()},resetProgressBar:function(){this.setProgressPercentage(100),this.$progressBar.addClass("pending"),this.setItemCount(1),this.setProcessedItemCount(0),this.$progressBarStatus.html(""),this._displaySteps&&this.$progressBar.addClass("has-status")},hideProgressBar:function(){var t=this;this.$progressBar.fadeTo("fast",.01,(function(){t.$progressBar.addClass("hidden").fadeTo(1,1,$.noop)})),this.$progressBarStatus.fadeTo("fast",.01,(function(){t.$progressBarStatus.addClass("hidden").fadeTo(1,1,$.noop)}))},showProgressBar:function(){this.$progressBar.removeClass("hidden"),this.$progressBarStatus.removeClass("hidden")},setItemCount:function(t){this._itemCount=t},incrementItemCount:function(t){this._itemCount+=t},setProcessedItemCount:function(t){this._processedItemCount=t},incrementProcessedItemCount:function(t){this._processedItemCount+=t},updateProgressBar:function(){this._itemCount=Math.max(this._itemCount,1);var t=Math.min(100,Math.round(100*this._processedItemCount/this._itemCount));this.setProgressPercentage(t),this._displaySteps&&this.$progressBarStatus.html(this._processedItemCount+" / "+this._itemCount)},setProgressPercentage:function(t,e){0===t?this.$progressBar.addClass("pending"):(this.$progressBar.removeClass("pending"),e?this.$innerProgressBar.velocity("stop").velocity({width:t+"%"},"fast"):this.$innerProgressBar.velocity("stop").width(t+"%"))}})},1396:function(){Craft.PromptHandler=Garnish.Base.extend({modal:null,$modalContainerDiv:null,$prompt:null,$promptApplyToRemainingContainer:null,$promptApplyToRemainingCheckbox:null,$promptApplyToRemainingLabel:null,$pomptChoices:null,_prompts:[],_promptBatchCallback:$.noop,_promptBatchReturnData:[],_promptBatchNum:0,resetPrompts:function(){this._prompts=[],this._promptBatchCallback=$.noop,this._promptBatchReturnData=[],this._promptBatchNum=0},addPrompt:function(t){this._prompts.push(t)},getPromptCount:function(){return this._prompts.length},showBatchPrompts:function(t){this._promptBatchCallback=t,this._promptBatchReturnData=[],this._promptBatchNum=0,this._showNextPromptInBatch()},_showNextPromptInBatch:function(){var t=this._prompts[this._promptBatchNum].prompt,e=this._prompts.length-(this._promptBatchNum+1);this._showPrompt(t.message,t.choices,this._handleBatchPromptSelection.bind(this),e)},_handleBatchPromptSelection:function(t,e){var i=this._prompts[this._promptBatchNum],s=this._prompts.length-(this._promptBatchNum+1),a=$.extend(i,{choice:t});this._promptBatchReturnData.push(a),s?(this._promptBatchNum++,e?this._handleBatchPromptSelection(t,!0):this._showNextPromptInBatch()):"function"==typeof this._promptBatchCallback&&this._promptBatchCallback(this._promptBatchReturnData)},_showPrompt:function(t,e,i,s){this._promptCallback=i,null===this.modal&&(this.modal=new Garnish.Modal({closeOtherModals:!1})),null===this.$modalContainerDiv&&(this.$modalContainerDiv=$('<div class="modal fitted prompt-modal"></div>').addClass().appendTo(Garnish.$bod)),this.$prompt=$('<div class="body"></div>').appendTo(this.$modalContainerDiv.empty()),this.$promptMessage=$('<p class="prompt-msg"/>').appendTo(this.$prompt),this.$promptChoices=$('<div class="options"></div>').appendTo(this.$prompt),this.$promptApplyToRemainingContainer=$('<label class="assets-applytoremaining"/>').appendTo(this.$prompt).hide(),this.$promptApplyToRemainingCheckbox=$('<input type="checkbox"/>').appendTo(this.$promptApplyToRemainingContainer),this.$promptApplyToRemainingLabel=$("<span/>").appendTo(this.$promptApplyToRemainingContainer),this.$promptButtons=$('<div class="buttons right"/>').appendTo(this.$prompt),this.modal.setContainer(this.$modalContainerDiv),this.$promptMessage.html(t);for(var a=$("<button/>",{type:"button",class:"btn",text:Craft.t("app","Cancel")}).appendTo(this.$promptButtons),n=$("<button/>",{type:"submit",class:"btn submit disabled",text:Craft.t("app","OK")}).appendTo(this.$promptButtons),r=0;r<e.length;r++){var o=$('<div><label><input type="radio" name="promptAction" value="'+e[r].value+'"/> '+e[r].title+"</label></div>").appendTo(this.$promptChoices).find("input");this.addListener(o,"click",(function(){n.removeClass("disabled")}))}this.addListener(n,"activate",(function(t){var e=$(t.currentTarget).parents(".modal").find("input[name=promptAction]:checked").val(),i=this.$promptApplyToRemainingCheckbox.prop("checked");this._selectPromptChoice(e,i)})),this.addListener(a,"activate",(function(){var t=this.$promptApplyToRemainingCheckbox.prop("checked");this._selectPromptChoice("cancel",t)})),s&&(this.$promptApplyToRemainingContainer.show(),this.$promptApplyToRemainingLabel.html(" "+Craft.t("app","Apply this to the {number} remaining conflicts?",{number:s}))),this.modal.show(),this.modal.removeListener(Garnish.Modal.$shade,"click"),this.addListener(Garnish.Modal.$shade,"click","_cancelPrompt")},_selectPromptChoice:function(t,e){var i=this;this.$prompt.fadeOut("fast",(function(){i.modal.hide(),i._promptCallback(t,e)}))},_cancelPrompt:function(){this._selectPromptChoice("cancel",!0)}})},8960:function(){Craft.Queue=Garnish.Base.extend({running:!1,paused:!1,pausedForVisibility:!1,jobs:null,get length(){return this.jobs.length},get isPaused(){return this.paused||this.pausedForVisibility},init:function(){var t=this;this.jobs=[],Garnish.$doc.on("visibilitychange",(function(){t.pausedForVisibility&&Craft.isVisible()&&(t.pausedForVisibility=!1,t._resume())}))},push:function(t){return this._add(t,"push")},unshift:function(t){return this._add(t,"unshift")},pause:function(){this.paused||(this.paused=!0,this.pausedForVisibility||this.trigger("pause"))},resume:function(){this.paused&&(this.paused=!1,this._resume())},_add:function(t,e){var i=this;return new Promise((function(s,a){i.jobs[e]((function(){return new Promise((function(e,i){t().then((function(t){s(t),e()})).catch((function(t){a(t),i()}))}))})),i.running||(i.trigger("beforeRun"),i.running=!0,i._exec())}))},clear:function(){this.jobs.length=0},_exec:function(){var t=this;if(!this.jobs.length)return this.running=!1,void this.trigger("afterRun");this.pausedForVisibility||Craft.isVisible()||(this.pausedForVisibility=!0,this.paused||this.trigger("pause")),this.paused||this.pausedForVisibility||(this.trigger("beforeExec"),this.jobs.shift()().finally((function(){t.trigger("afterExec"),t._exec()})))},_resume:function(){this.isPaused||(this.trigger("resume"),this._exec())}}),Craft.queue=new Craft.Queue},4070:function(){!function(t){Craft.SlidePicker=Garnish.Base.extend({min:null,max:null,totalSteps:null,value:null,label:null,describedBy:null,$container:null,$buttons:null,init:function(e,i){var s=this;this.setSettings(i,Craft.SlidePicker.defaults),this.$container=t("<div/>",{class:"slide-picker",role:"slider",tabindex:0}),this.refresh(),this.setValue(e,!1),this.addListener(this.$container,"keydown",(function(t){switch(t.keyCode){case Garnish.UP_KEY:s.setValue(s.value+s.settings.step),t.preventDefault();break;case Garnish.DOWN_KEY:s.setValue(s.value-s.settings.step),t.preventDefault();break;case Garnish.RIGHT_KEY:"ltr"===Craft.orientation?s.setValue(s.value+s.settings.step):s.setValue(s.value-s.settings.step),t.preventDefault();break;case Garnish.LEFT_KEY:"ltr"===Craft.orientation?s.setValue(s.value-s.settings.step):s.setValue(s.value+s.settings.step),t.preventDefault();break;case Garnish.HOME_KEY:s.setValue(s.min),t.preventDefault();break;case Garnish.END_KEY:s.setValue(s.max),t.preventDefault()}}))},refresh:function(){var e=this;if(this.min=this._min(),this.max=this._max(),this.totalSteps=(this.max-this.min)/this.settings.step,this.label=this.settings.label,this.describedBy=this.settings.describedBy,!Number.isInteger(this.totalSteps))throw"Invalid SlidePicker config";this.$buttons&&this.$buttons.remove(),this.$container.attr("aria-valuemin",this.min),this.$container.attr("aria-valuemax",this.max),this.label&&this.$container.attr("aria-label",this.label),this.describedBy&&this.$container.attr("aria-describedby",this.describedBy),this.$buttons=t();for(var i=this.min;i<=this.max;i+=this.settings.step)this.$buttons=this.$buttons.add(t("<a/>",{title:this.settings.valueLabel(i),data:{value:i}}));if(this.$buttons.appendTo(this.$container),null!==this.value){var s=this.value;this.value=null,this.setValue(s,!1)}this.addListener(this.$buttons,"mouseover",(function(i){e.$buttons.removeClass("active-hover last-active-hover"),t(i.currentTarget).addClass("active-hover last-active-hover").prevAll().addClass("active-hover")})),this.addListener(this.$buttons,"mouseout",(function(){e.$buttons.removeClass("active-hover")})),this.addListener(this.$buttons,"click",(function(i){e.setValue(t.data(i.currentTarget,"value")),i.stopPropagation(),e.$container.focus()}))},setValue:function(t,e){if(t=Math.max(Math.min(t,this.max),this.min),this.value!==(this.value=t)){this.$container.attr({"aria-valuenow":this.value,"aria-valuetext":this.settings.valueLabel(this.value)}),this.$buttons.removeClass("last-active active");var i=this.$buttons.eq((this.value-this.min)/this.settings.step);i.add(i.prevAll()).addClass("active"),i.addClass("last-active"),!1!==e&&this.settings.onChange(t)}},_min:function(){return"function"==typeof this.settings.min?this.settings.min():this.settings.min},_max:function(){return"function"==typeof this.settings.max?this.settings.max():this.settings.max}},{defaults:{min:0,max:100,step:10,valueLabel:null,onChange:t.noop}})}(jQuery)},5763:function(){Craft.SlideRuleInput=Garnish.Base.extend({$container:null,$options:null,$selectedOption:null,$input:null,value:null,startPositionX:null,init:function(t,e){var i=this;this.setSettings(e,Craft.SlideRuleInput.defaultSettings),this.value=0,this.graduationsMin=-70,this.graduationsMax=70,this.slideMin=-45,this.slideMax=45,this.$container=$("#"+t),this.$overlay=$('<div class="overlay"></div>').appendTo(this.$container),this.$cursor=$('<div class="cursor"></div>').appendTo(this.$container),this.$graduations=$('<div class="graduations"></div>').appendTo(this.$container),this.$graduationsUl=$("<ul></ul>").appendTo(this.$graduations),this.$container.attr({role:"slider",tabindex:"0","aria-valuemin":this.slideMin,"aria-valuemax":this.slideMax,"aria-valuenow":"0","aria-valuetext":Craft.t("app","{num, number} {num, plural, =1{degree} other{degrees}}",{num:0})});for(var s=this.graduationsMin;s<=this.graduationsMax;s++){var a=$('<li class="graduation" data-graduation="'+s+'"><div class="label">'+s+"</div></li>").appendTo(this.$graduationsUl);s%5==0&&a.addClass("main-graduation"),0===s&&a.addClass("selected")}this.$options=this.$container.find(".graduation"),this.addListener(this.$container,"resize",this._handleResize.bind(this)),this.addListener(this.$container,"tapstart",this._handleTapStart.bind(this)),this.addListener(Garnish.$bod,"tapmove",this._handleTapMove.bind(this)),this.addListener(Garnish.$bod,"tapend",this._handleTapEnd.bind(this)),this.addListener(this.$container,"keydown",this._handleKeypress.bind(this)),setTimeout((function(){i.graduationsCalculatedWidth=10*(i.$options.length-1),i.$graduationsUl.css("left",-i.graduationsCalculatedWidth/2+i.$container.width()/2)}),50)},_handleResize:function(){var t=this.valueToPosition(this.value);this.$graduationsUl.css("left",t)},_handleKeypress:function(t){var e=parseInt(this.$container.attr("aria-valuenow"),10);switch(t.keyCode){case Garnish.UP_KEY:case Garnish.RIGHT_KEY:this.setValue(e+1);break;case Garnish.DOWN_KEY:case Garnish.LEFT_KEY:this.setValue(e-1);break;case Garnish.PAGE_UP_KEY:this.setValue(e+10);break;case Garnish.PAGE_DOWN_KEY:this.setValue(e-10);break;case Garnish.HOME_KEY:this.setValue(this.slideMin);break;case Garnish.END_KEY:this.setValue(this.slideMax)}this.onChange()},_handleTapStart:function(t,e){t.preventDefault(),this.startPositionX=e.position.x,this.startLeft=this.$graduationsUl.position().left,this.dragging=!0,this.onStart()},_handleTapMove:function(t,e){if(this.dragging){t.preventDefault();var i=this.startPositionX-e.position.x,s=this.startLeft-i,a=this.positionToValue(s);this.setValue(a),this.onChange()}},setValue:function(t){var e=this.valueToPosition(t);t<this.slideMin?(t=this.slideMin,e=this.valueToPosition(t)):t>this.slideMax&&(t=this.slideMax,e=this.valueToPosition(t)),this.$graduationsUl.css("left",e),t>=this.slideMin&&t<=this.slideMax&&(this.$options.removeClass("selected"),$.each(this.$options,(function(e,i){$(i).data("graduation")>0&&$(i).data("graduation")<=t&&$(i).addClass("selected"),$(i).data("graduation")<0&&$(i).data("graduation")>=t&&$(i).addClass("selected"),0==$(i).data("graduation")&&$(i).addClass("selected")}))),this.$container.attr({"aria-valuenow":t,"aria-valuetext":Craft.t("app","{num, number} {num, plural, =1{degree} other{degrees}}",{num:parseInt(t,10)})}),this.value=t},_handleTapEnd:function(t){this.dragging&&(t.preventDefault(),this.dragging=!1,this.onEnd())},positionToValue:function(t){var e=-1*this.graduationsMin,i=-1*(this.graduationsMin-this.graduationsMax);return(this.$graduations.width()/2+-1*t)/this.graduationsCalculatedWidth*i-e},valueToPosition:function(t){var e=-1*this.graduationsMin,i=-1*(this.graduationsMin-this.graduationsMax);return-((t+e)*this.graduationsCalculatedWidth/i-this.$graduations.width()/2)},onStart:function(){"function"==typeof this.settings.onChange&&this.settings.onStart(this)},onChange:function(){"function"==typeof this.settings.onChange&&this.settings.onChange(this)},onEnd:function(){"function"==typeof this.settings.onChange&&this.settings.onEnd(this)},defaultSettings:{onStart:$.noop,onChange:$.noop,onEnd:$.noop}})},5759:function(){!function(t){Craft.Slideout=Garnish.Base.extend({$outerContainer:null,$container:null,$shade:null,isOpen:!1,init:function(e,i){var s=this;this.setSettings(i,Craft.Slideout.defaults),Craft.useMobileStyles()||(this.$shade=t('<div class="slideout-shade"/>').appendTo(Garnish.$bod),this.settings.closeOnShadeClick&&this.addListener(this.$shade,"click",(function(t){t.stopPropagation(),s.close()}))),this.$outerContainer=t("<div/>",{class:"slideout-container hidden"}),this.$container=t("<".concat(this.settings.containerElement,"/>"),this.settings.containerAttributes).attr("data-slideout","").addClass("slideout").append(e).data("slideout",this).appendTo(this.$outerContainer),Garnish.addModalAttributes(this.$outerContainer),Craft.useMobileStyles()&&this.$container.addClass("so-mobile"),Craft.trapFocusWithin(this.$container),this.settings.autoOpen&&this.open()},open:function(){var t=this;this.isOpen||(this.setTriggerElement(document.activeElement),this._cancelTransitionListeners(),this.$shade&&this.$shade.appendTo(Garnish.$bod).show(),this.$outerContainer.appendTo(Garnish.$bod).removeClass("hidden"),Craft.useMobileStyles()?this.$container.css("top","100vh"):this.$container.css(Garnish.ltr?"left":"right","100vw"),this.$container.one("transitionend.slideout",(function(){Craft.setFocusWithin(t.$container)})),this.$shade&&(this.$shade[0].offsetWidth,this.$shade.addClass("so-visible")),this.$container[0].offsetWidth,Craft.Slideout.addPanel(this),this.enable(),Garnish.uiLayerManager.addLayer(this.$outerContainer),Garnish.hideModalBackgroundLayers(),this.settings.closeOnEsc&&Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){t.close()})),this.isOpen=!0,this.trigger("open"))},setTriggerElement:function(t){this.settings.triggerElement=t},close:function(){var t=this;this.isOpen&&(this.trigger("beforeClose"),this.disable(),this.isOpen=!1,this._cancelTransitionListeners(),this.$shade&&this.$shade.removeClass("so-visible").one("transitionend.slideout",(function(){t.$shade.hide()})),Craft.Slideout.removePanel(this),Garnish.uiLayerManager.removeLayer(),Garnish.resetModalBackgroundLayerVisibility(),this.$container.one("transitionend.slideout",(function(){t.$outerContainer.addClass("hidden"),t.trigger("close")})),this.settings.triggerElement&&this.settings.triggerElement.focus())},_cancelTransitionListeners:function(){this.$shade&&this.$shade.off("transitionend.slideout"),this.$container.off("transitionend.slideout")},destroy:function(){this.$shade&&(this.$shade.remove(),this.$shade=null),this.$outerContainer.remove(),this.$outerContainer=null,this.$container=null,this.base()}},{defaults:{containerElement:"div",containerAttributes:{},autoOpen:!0,closeOnEsc:!0,closeOnShadeClick:!0,triggerElement:null},openPanels:[],addPanel:function(t){Craft.Slideout.openPanels.unshift(t),Craft.useMobileStyles()?t.$container.css("top",0):Craft.Slideout.updateStyles()},removePanel:function(t){Craft.Slideout.openPanels=Craft.Slideout.openPanels.filter((function(e){return e!==t})),Craft.useMobileStyles()?t.$container.css("top","100vh"):(t.$container.css(Garnish.ltr?"left":"right","100vw"),Craft.Slideout.updateStyles())},updateStyles:function(){var t=Craft.Slideout.openPanels.length;Craft.Slideout.openPanels.forEach((function(e,i){e.$container.css(Garnish.ltr?"left":"right","".concat((t-i)/t*50,"vw"))})),0!==t?Garnish.$bod.addClass("no-scroll"):Garnish.$bod.removeClass("no-scroll")}})}(jQuery)},5185:function(){Craft.SlugGenerator=Craft.BaseInputGenerator.extend({generateTargetValue:function(t){t=(t=t.replace(/<(.*?)>/g,"")).replace(/['"‘’“”\[\]\(\)\{\}:]/g,""),Craft.allowUppercaseInSlug||(t=t.toLowerCase()),Craft.limitAutoSlugsToAscii&&(t=Craft.asciiString(t,this.settings.charMap));var e=Craft.filterArray(XRegExp.matchChain(t,[XRegExp("[\\p{L}\\p{N}\\p{M}]+")]));return e.length?e.join(Craft.slugWordSeparator):""}})},8030:function(){Craft.Structure=Garnish.Base.extend({id:null,$container:null,state:null,structureDrag:null,init:function(t,e,i){this.id=t,this.$container=$(e),this.setSettings(i,Craft.Structure.defaults),this.$container.data("structure")&&(console.warn("Double-instantiating a structure on an element"),this.$container.data("structure").destroy()),this.$container.data("structure",this),this.state={},this.settings.storageKey&&$.extend(this.state,Craft.getLocalStorage(this.settings.storageKey,{})),void 0===this.state.collapsedElementIds&&(this.state.collapsedElementIds=[]);for(var s=this.$container.find("ul").prev(".row"),a=0;a<s.length;a++){var n=$(s[a]),r=n.parent(),o=$('<div class="toggle" title="'+Craft.t("app","Show/hide children")+'"/>').prependTo(n);-1!==$.inArray(n.children(".element").data("id"),this.state.collapsedElementIds)&&r.addClass("collapsed"),this.initToggle(o)}this.settings.sortable&&(this.structureDrag=new Craft.StructureDrag(this,this.settings.maxLevels)),this.settings.newChildUrl&&this.initNewChildMenus(this.$container.find(".add"))},initToggle:function(t){var e=this;t.on("click",(function(t){var i=$(t.currentTarget).closest("li"),s=i.children(".row").find(".element:first").data("id"),a=$.inArray(s,e.state.collapsedElementIds);i.hasClass("collapsed")?(i.removeClass("collapsed"),-1!==a&&e.state.collapsedElementIds.splice(a,1)):(i.addClass("collapsed"),-1===a&&e.state.collapsedElementIds.push(s)),e.settings.storageKey&&Craft.setLocalStorage(e.settings.storageKey,e.state)}))},initNewChildMenus:function(t){this.addListener(t,"click","onNewChildMenuClick")},onNewChildMenuClick:function(t){var e=$(t.currentTarget);if(!e.data("menubtn")){var i=e.parent().children(".element").data("id"),s=Craft.getUrl(this.settings.newChildUrl,"parentId="+i);$('<div class="menu"><ul><li><a href="'+s+'">'+Craft.t("app","New child")+"</a></li></ul></div>").insertAfter(e),new Garnish.MenuBtn(e).showMenu()}},getIndent:function(t){return Craft.Structure.baseIndent+(t-1)*Craft.Structure.nestedIndent},addElement:function(t){var e=$('<li data-level="1"/>').appendTo(this.$container),i=$('<div class="row" style="margin-'+Craft.left+": -"+Craft.Structure.baseIndent+"px; padding-"+Craft.left+": "+Craft.Structure.baseIndent+'px;">').appendTo(e);if(i.append(t),this.settings.sortable&&(i.append('<a class="move icon" title="'+Craft.t("app","Move")+'"></a>'),this.structureDrag.addItems(e)),this.settings.newChildUrl){var s=$('<a class="add icon" title="'+Craft.t("app","New child")+'"></a>').appendTo(i);this.initNewChildMenus(s)}i.css("margin-bottom",-30),i.velocity({"margin-bottom":0},"fast")},removeElement:function(t){var e,i=this,s=t.parent().parent();this.settings.sortable&&this.structureDrag.removeItems(s),s.siblings().length||(e=s.parent()),s.css("visibility","hidden").velocity({marginBottom:-s.height()},"fast",(function(){s.remove(),void 0!==e&&i._removeUl(e)}))},_removeUl:function(t){t.siblings(".row").children(".toggle").remove(),t.remove()},destroy:function(){this.$container.removeData("structure"),this.base()}},{baseIndent:8,nestedIndent:35,defaults:{storageKey:null,sortable:!1,newChildUrl:null,maxLevels:null}})},3096:function(){Craft.StructureDrag=Garnish.Drag.extend({structure:null,maxLevels:null,draggeeLevel:null,$helperLi:null,$targets:null,draggeeHeight:null,init:function(t,e){this.structure=t,this.maxLevels=e,this.$insertion=$('<li class="draginsertion"/>');var i=this.structure.$container.find("li");this.base(i,{handle:".element:first, .move:first",helper:this.getHelper.bind(this)})},getHelper:function(t){this.$helperLi=t;var e=$('<ul class="structure draghelper"/>').append(t);return t.css("padding-"+Craft.left,this.$draggee.css("padding-"+Craft.left)),t.find(".move").removeAttr("title"),e},onDragStart:function(){var t=this;this.$targets=$(),this.findTargets(this.structure.$container),this.draggeeLevel=0;var e=this.$draggee;do{this.draggeeLevel++,e=e.find("> ul > li")}while(e.length);this.draggeeHeight=this.$draggee.height(),this.$draggee.velocity({height:0},"fast",(function(){t.$draggee.addClass("hidden")})),this.base(),this.addListener(Garnish.$doc,"keydown",(function(t){t.keyCode===Garnish.ESC_KEY&&this.cancelDrag()}))},findTargets:function(t){for(var e=t.children().not(this.$draggee),i=0;i<e.length;i++){var s=$(e[i]);this.$targets=this.$targets.add(s.children(".row")),s.hasClass("collapsed")||this.findTargets(s.children("ul"))}},onDrag:function(){for(this._.$closestTarget&&(this._.$closestTarget.removeClass("draghover"),this.$insertion.remove()),this._.$closestTarget=null,this._.closestTargetPos=null,this._.closestTargetYDiff=null,this._.closestTargetOffset=null,this._.closestTargetHeight=null,this._.i=0;this._.i<this.$targets.length&&(this._.$target=$(this.$targets[this._.i]),this._.targetOffset=this._.$target.offset(),this._.targetHeight=this._.$target.outerHeight(),this._.targetYMidpoint=this._.targetOffset.top+this._.targetHeight/2,this._.targetYDiff=Math.abs(this.mouseY-this._.targetYMidpoint),0===this._.i||this.mouseY>=this._.targetOffset.top+5&&this._.targetYDiff<this._.closestTargetYDiff);this._.i++)this._.$closestTarget=this._.$target,this._.closestTargetPos=this._.i,this._.closestTargetYDiff=this._.targetYDiff,this._.closestTargetOffset=this._.targetOffset,this._.closestTargetHeight=this._.targetHeight;if(this._.$closestTarget)if(0===this._.closestTargetPos&&this.mouseY<this._.closestTargetOffset.top+5)this.$insertion.prependTo(this.structure.$container);else if(this._.$closestTargetLi=this._.$closestTarget.parent(),this._.closestTargetLevel=this._.$closestTargetLi.data("level"),this._.closestTargetPos<this.$targets.length-1?(this._.$nextTargetLi=$(this.$targets[this._.closestTargetPos+1]).parent(),this._.nextTargetLevel=this._.$nextTargetLi.data("level")):(this._.$nextTargetLi=null,this._.nextTargetLevel=null),this._.hoveringBetweenRows=this.mouseY>=this._.closestTargetOffset.top+this._.closestTargetHeight-5,this._.$nextTargetLi&&this._.nextTargetLevel==this._.closestTargetLevel)this._.hoveringBetweenRows?(!this.maxLevels||this.maxLevels>=this._.closestTargetLevel+this.draggeeLevel-1)&&this.$insertion.insertAfter(this._.$closestTargetLi):(!this.maxLevels||this.maxLevels>=this._.closestTargetLevel+this.draggeeLevel)&&this._.$closestTarget.addClass("draghover");else if(this._.$nextTargetLi&&this._.nextTargetLevel>this._.closestTargetLevel)(!this.maxLevels||this.maxLevels>=this._.nextTargetLevel+this.draggeeLevel-1)&&(this._.hoveringBetweenRows?this.$insertion.insertBefore(this._.$nextTargetLi):(this._.$closestTarget.addClass("draghover"),this.$insertion.appendTo(this._.$closestTargetLi.children("ul"))));else if(this._.hoveringBetweenRows){for(this._.draggeeX=this.mouseX-this.targetItemMouseDiffX,"rtl"===Craft.orientation&&(this._.draggeeX+=this.$helperLi.width()),this._.$parentLis=this._.$closestTarget.parentsUntil(this.structure.$container,"li"),this._.$closestParentLi=null,this._.closestParentLiXDiff=null,this._.closestParentLevel=null,this._.i=0;this._.i<this._.$parentLis.length;this._.i++)this._.$parentLi=$(this._.$parentLis[this._.i]),this._.parentLiX=this._.$parentLi.offset().left,"rtl"===Craft.orientation&&(this._.parentLiX+=this._.$parentLi.width()),this._.parentLiXDiff=Math.abs(this._.parentLiX-this._.draggeeX),this._.parentLevel=this._.$parentLi.data("level"),(!this.maxLevels||this.maxLevels>=this._.parentLevel+this.draggeeLevel-1)&&(!this._.$closestParentLi||this._.parentLiXDiff<this._.closestParentLiXDiff&&(!this._.$nextTargetLi||this._.parentLevel>=this._.nextTargetLevel))&&(this._.$closestParentLi=this._.$parentLi,this._.closestParentLiXDiff=this._.parentLiXDiff,this._.closestParentLevel=this._.parentLevel);this._.$closestParentLi&&this.$insertion.insertAfter(this._.$closestParentLi)}else(!this.maxLevels||this.maxLevels>=this._.closestTargetLevel+this.draggeeLevel)&&this._.$closestTarget.addClass("draghover")},cancelDrag:function(){this.$insertion.remove(),this._.$closestTarget&&this._.$closestTarget.removeClass("draghover"),this.onMouseUp()},onDragStop:function(){var t=this;if(this._.$closestTarget&&(this.$insertion.parent().length||this._.$closestTarget.hasClass("draghover"))){var e,i;if(this.$draggee.siblings().length||(e=this.$draggee.parent()),this.$insertion.parent().length){var s=this.$insertion.next().add(this.$insertion.prev());-1===$.inArray(this.$draggee[0],s)?(this.$insertion.replaceWith(this.$draggee),i=!0):(this.$insertion.remove(),i=!1)}else{var a=this._.$closestTargetLi.children("ul");if(e&&a.length&&a[0]===e[0])i=!1;else{if(a.length)this._.$closestTargetLi.hasClass("collapsed")&&this._.$closestTarget.children(".toggle").trigger("click");else{var n=$('<div class="toggle" title="'+Craft.t("app","Show/hide children")+'"/>').prependTo(this._.$closestTarget);this.structure.initToggle(n),a=$("<ul>").appendTo(this._.$closestTargetLi)}this.$draggee.appendTo(a),i=!0}}if(this._.$closestTarget.removeClass("draghover"),i){e&&this.structure._removeUl(e);var r,o=this.$draggee.parentsUntil(this.structure.$container,"li").length+1;o!=this.$draggee.data("level")&&(1==this.$draggee.data("level")?((r={})["padding-"+Craft.left]=38,this.$helperLi.velocity(r,"fast")):1==o&&((r={})["padding-"+Craft.left]=Craft.Structure.baseIndent,this.$helperLi.velocity(r,"fast")),this.setLevel(this.$draggee,o));var l=this.$draggee.children(".row").children(".element"),h={structureId:this.structure.id,elementId:l.data("id"),siteId:l.data("site-id"),prevId:this.$draggee.prev().children(".row").children(".element").data("id"),parentId:this.$draggee.parent("ul").parent("li").children(".row").children(".element").data("id")};Craft.sendActionRequest("POST","structures/move-element",{data:h}).then((function(t){Craft.cp.displaySuccess(Craft.t("app","New order saved."))}))}}this.$draggee.velocity("stop").removeClass("hidden").velocity({height:this.draggeeHeight},"fast",(function(){t.$draggee.css("height","auto")})),this.returnHelpersToDraggees(),this.base()},setLevel:function(t,e){t.data("level",e);var i=this.structure.getIndent(e),s={};s["margin-"+Craft.left]="-"+i+"px",s["padding-"+Craft.left]=i+"px",this.$draggee.children(".row").css(s);for(var a=t.children("ul").children(),n=0;n<a.length;n++)this.setLevel($(a[n]),e+1)}})},3331:function(){Craft.StructureTableSorter=Garnish.DragSort.extend({tableView:null,structureId:null,maxLevels:null,_basePadding:null,_helperMargin:null,_$firstRowCells:null,_$titleHelperCell:null,_titleHelperCellOuterWidth:null,_ancestors:null,_updateAncestorsFrame:null,_draggeeLevel:null,_draggeeLevelDelta:null,draggingLastElements:null,_loadingDraggeeLevelDelta:!1,_targetLevel:null,_targetLevelBounds:null,_positionChanged:null,init:function(t,e,i){this.tableView=t,this.structureId=this.tableView.$table.data("structure-id"),this.maxLevels=parseInt(this.tableView.$table.attr("data-max-levels")),this._basePadding=14+(this.tableView.elementIndex.actions?34:24),this._helperMargin=this.tableView.elementIndex.actions?54:0,i=$.extend({},Craft.StructureTableSorter.defaults,i,{handle:".move",collapseDraggees:!0,singleHelper:!0,helperSpacingY:2,magnetStrength:4,helper:this.getHelper.bind(this),helperLagBase:1.5,axis:Garnish.Y_AXIS}),this.base(e,i)},findDraggee:function(){var t=this;this._draggeeLevel=this._targetLevel=this.$targetItem.data("level"),this._draggeeLevelDelta=0;for(var e=$(this.$targetItem),i=this.$targetItem.next();i.length;){var s=i.data("level");if(s<=this._draggeeLevel)break;var a=s-this._draggeeLevel;a>this._draggeeLevelDelta&&(this._draggeeLevelDelta=a),e=e.add(i),i=i.next()}if(this.draggingLastElements=!i.length,this.maxLevels&&this.draggingLastElements&&this.tableView.getMorePending()){this._loadingDraggeeLevelDelta=!0;var n=this._getAjaxBaseData(this.$targetItem);Craft.sendActionRequest("POST","structures/get-element-level-delta",{data:n}).then((function(e){t._loadingDraggeeLevelDelta=!1,t.dragging&&(t._draggeeLevelDelta=e.data.delta,t.drag(!1))}))}return e},getHelper:function(t){var e=$('<div class="elements datatablesorthelper"/>').appendTo(Garnish.$bod),i=$('<div class="tableview"/>').appendTo(e),s=$('<table class="data"/>').appendTo(i),a=$("<tbody/>").appendTo(s);t.appendTo(a),this._$firstRowCells=this.tableView.$elementContainer.children("tr:first").children();for(var n=t.children(),r=0;r<n.length;r++){var o=$(n[r]);if(o.hasClass("checkbox-cell"))o.remove();else{var l=$(this._$firstRowCells[r]),h=l[0].getBoundingClientRect().width;l.css("width",h+"px"),o.css("width",h+"px"),Garnish.hasAttr(l,"data-titlecell")&&(this._$titleHelperCell=o,parseInt(l.css("padding-"+Craft.left)),this._titleHelperCellOuterWidth=h,o.css("padding-"+Craft.left,this._basePadding))}}return e},canInsertBefore:function(t){return!this._loadingDraggeeLevelDelta&&!1!==this._getLevelBounds(t.prev(),t)},canInsertAfter:function(t){return!this._loadingDraggeeLevelDelta&&!1!==this._getLevelBounds(t,t.next())},onDragStart:function(){this._ancestors=this._getAncestors(this.$targetItem,this.$targetItem.data("level")),this._setTargetLevelBounds(),this.tableView.maybeLoadMore(),this.base()},onDrag:function(){this.base(),this._updateIndent()},onInsertionPointChange:function(){this._setTargetLevelBounds(),this._updateAncestorsBeforeRepaint(),this.base()},onDragStop:function(){var t=this;if(this._positionChanged=!1,this.base(),this._targetLevel!=this._draggeeLevel){for(var e=this._targetLevel-this._draggeeLevel,i=0;i<this.$draggee.length;i++){var s=$(this.$draggee[i]),a=s.data("level")+e,n=this._basePadding+this._getLevelIndent(a);s.data("level",a),s.find(".element").data("level",a),s.children("[data-titlecell]:first").css("padding-"+Craft.left,n)}this._positionChanged=!0}if(this._positionChanged){for(var r=this._getAjaxBaseData(this.$draggee),o=this.$draggee.first().prev();o.length;){var l=o.data("level");if(l==this._targetLevel){r.prevId=o.data("id");break}if(l<this._targetLevel){r.parentId=o.data("id");var h=o.find("> th > .toggle");if(!h.hasClass("expanded")){h.addClass("expanded");var d=this.tableView._createSpinnerRowAfter(o);this.tableView.elementSelect&&this.tableView.elementSelect.removeItems(this.$targetItem),this.removeItems(this.$targetItem),this.$targetItem.remove(),this.tableView._totalVisible--}break}o=o.prev()}Craft.sendActionRequest("POST","structures/move-element",{data:r}).then((function(e){Craft.cp.displaySuccess(Craft.t("app","New position saved.")),t.onPositionChange(),d&&d.parent().length&&(d.remove(),t.tableView._expandElement(h,!0)),Craft.cp.runQueue()})).catch((function(e){e.response,Craft.cp.displayError(Craft.t("app","A server error occurred.")),t.tableView.elementIndex.updateElements()}))}},onSortChange:function(){this.tableView.elementSelect&&this.tableView.elementSelect.resetItemOrder(),this._positionChanged=!0,this.base()},onPositionChange:function(){var t=this;Garnish.requestAnimationFrame((function(){t.trigger("positionChange"),t.settings.onPositionChange()}))},onReturnHelpersToDraggees:function(){if(this._$firstRowCells.css("width",""),this.draggingLastElements&&this.tableView.getMorePending()){this.tableView._totalVisible+=this.newDraggeeIndexes[0]-this.oldDraggeeIndexes[0];var t=this.$draggee.last().nextAll();t.length&&(this.removeItems(t),t.remove(),this.tableView.maybeLoadMore())}this.base()},_getLevelBounds:function(t,e){if(e&&e.length?this._getLevelBounds._minLevel=e.data("level"):this._getLevelBounds._minLevel=1,t&&t.length?this._getLevelBounds._maxLevel=t.data("level")+1:this._getLevelBounds._maxLevel=1,this.maxLevels){if(1!=this._getLevelBounds._minLevel&&this._getLevelBounds._minLevel+this._draggeeLevelDelta>this.maxLevels)return!1;this._getLevelBounds._maxLevel+this._draggeeLevelDelta>this.maxLevels&&(this._getLevelBounds._maxLevel=this.maxLevels-this._draggeeLevelDelta,this._getLevelBounds._maxLevel<this._getLevelBounds._minLevel&&(this._getLevelBounds._maxLevel=this._getLevelBounds._minLevel))}return{min:this._getLevelBounds._minLevel,max:this._getLevelBounds._maxLevel}},_setTargetLevelBounds:function(){this._targetLevelBounds=this._getLevelBounds(this.$draggee.first().prev(),this.$draggee.last().next())},_updateIndent:function(t){this._updateIndent._mouseDist=this.realMouseX-this.mousedownX,"rtl"===Craft.orientation&&(this._updateIndent._mouseDist*=-1),this._updateIndent._indentationDist=Math.round(this._updateIndent._mouseDist/Craft.StructureTableSorter.LEVEL_INDENT),this._updateIndent._targetLevel=this._draggeeLevel+this._updateIndent._indentationDist,this._updateIndent._targetLevel<this._targetLevelBounds.min?(this._updateIndent._indentationDist+=this._targetLevelBounds.min-this._updateIndent._targetLevel,this._updateIndent._targetLevel=this._targetLevelBounds.min):this._updateIndent._targetLevel>this._targetLevelBounds.max&&(this._updateIndent._indentationDist-=this._updateIndent._targetLevel-this._targetLevelBounds.max,this._updateIndent._targetLevel=this._targetLevelBounds.max),this._targetLevel!==(this._targetLevel=this._updateIndent._targetLevel)&&this._updateAncestorsBeforeRepaint(),this._updateIndent._targetLevelMouseDiff=this._updateIndent._mouseDist-this._updateIndent._indentationDist*Craft.StructureTableSorter.LEVEL_INDENT,this._updateIndent._magnetImpact=Math.round(this._updateIndent._targetLevelMouseDiff/15),Math.abs(this._updateIndent._magnetImpact)>Craft.StructureTableSorter.MAX_GIVE&&(this._updateIndent._magnetImpact=(this._updateIndent._magnetImpact>0?1:-1)*Craft.StructureTableSorter.MAX_GIVE),this._updateIndent._closestLevelMagnetIndent=this._getLevelIndent(this._targetLevel)+this._updateIndent._magnetImpact,this.helpers[0].css("margin-"+Craft.left,this._updateIndent._closestLevelMagnetIndent+this._helperMargin),this._$titleHelperCell.css("width",this._titleHelperCellOuterWidth-this._updateIndent._closestLevelMagnetIndent)},_getLevelIndent:function(t){return(t-1)*Craft.StructureTableSorter.LEVEL_INDENT},_getAjaxBaseData:function(t){return{structureId:this.structureId,elementId:t.data("id"),siteId:t.find(".element:first").data("site-id")}},_getAncestors:function(t,e){if(this._getAncestors._ancestors=[],0!=e)for(this._getAncestors._level=e,this._getAncestors._$prevRow=t.prev();this._getAncestors._$prevRow.length&&!(this._getAncestors._$prevRow.data("level")<this._getAncestors._level&&(this._getAncestors._ancestors.unshift(this._getAncestors._$prevRow),this._getAncestors._level=this._getAncestors._$prevRow.data("level"),0==this._getAncestors._level));)this._getAncestors._$prevRow=this._getAncestors._$prevRow.prev();return this._getAncestors._ancestors},_updateAncestorsBeforeRepaint:function(){this._updateAncestorsFrame&&Garnish.cancelAnimationFrame(this._updateAncestorsFrame),this._updateAncestorsFrame=Garnish.requestAnimationFrame(this._updateAncestors.bind(this))},_updateAncestors:function(){for(this._updateAncestorsFrame=null,this._updateAncestors._i=0;this._updateAncestors._i<this._ancestors.length;this._updateAncestors._i++)this._updateAncestors._$ancestor=this._ancestors[this._updateAncestors._i],this._updateAncestors._$ancestor.data("descendants",this._updateAncestors._$ancestor.data("descendants")-1),0==this._updateAncestors._$ancestor.data("descendants")&&this._updateAncestors._$ancestor.find("> th > .toggle:first").remove();for(this._updateAncestors._newAncestors=this._getAncestors(this.$targetItem,this._targetLevel),this._updateAncestors._i=0;this._updateAncestors._i<this._updateAncestors._newAncestors.length;this._updateAncestors._i++)if(this._updateAncestors._$ancestor=this._updateAncestors._newAncestors[this._updateAncestors._i],this._updateAncestors._$ancestor.data("descendants",this._updateAncestors._$ancestor.data("descendants")+1),1==this._updateAncestors._$ancestor.data("descendants")){var t=this._updateAncestors._$ancestor.data("title");$('<button class="toggle expanded" type="button" aria-expanded="true" title="'+Craft.t("app","Show/hide children")+'" aria-label="'+Craft.t("app","Show {title} children",{title:t})+'"></button>').insertAfter(this._updateAncestors._$ancestor.find("> th .move:first"))}this._ancestors=this._updateAncestors._newAncestors,delete this._updateAncestors._i,delete this._updateAncestors._$ancestor,delete this._updateAncestors._newAncestors}},{HELPER_MARGIN:0,LEVEL_INDENT:44,MAX_GIVE:22,defaults:{onPositionChange:$.noop}})},53:function(){function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.TableElementIndexView=Craft.BaseElementIndexView.extend({$table:null,$tableCaption:null,$selectedSortHeader:null,$statusMessage:null,structureTableSort:null,_totalVisiblePostStructureTableDraggee:null,_morePendingPostStructureTableDraggee:!1,_broadcastListener:null,getElementContainer:function(){return this.$table=this.$container.find("table:first"),this.$table.children("tbody:first")},afterInit:function(){var t=this;this.$tableCaption=this.$table.find("caption"),this.$statusMessage=this.$table.parent().find("[data-status-message]"),this.initTableHeaders(),this.elementIndex.on("updateElements",(function(){t._updateScreenReaderStatus()})),"index"===this.elementIndex.settings.context&&"structure"===this.elementIndex.getSelectedSortAttribute()&&Garnish.hasAttr(this.$table,"data-structure-id")?this.structureTableSort=new Craft.StructureTableSorter(this,this.getAllElements()):this.structureTableSort=null,"structure"===this.elementIndex.getSelectedSortAttribute()&&this.addListener(this.$elementContainer,"click",(function(t){var e=$(t.target);e.hasClass("toggle")&&!1===this._collapseElement(e)&&this._expandElement(e)})),Craft.messageReceiver&&(this._broadcastListener=function(e){if("saveElement"===e.data.event){var i=t.$table.find('> tbody > tr[data-id="'.concat(e.data.id,'"]'));if(i.length){var s={elementType:t.elementIndex.elementType,source:t.elementIndex.sourceKey,id:e.data.id,siteId:t.elementIndex.siteId};Craft.sendActionRequest("POST","element-indexes/element-table-html",{data:s}).then((function(t){for(var e=t.data,s=0;s<i.length;s++){var a=i.eq(s);for(var n in a.find("> th[data-titlecell] .element").replaceWith(e.elementHtml),e.attributeHtml)e.attributeHtml.hasOwnProperty(n)&&a.find('> td[data-attr="'.concat(n,'"]')).html(e.attributeHtml[n])}(new Craft.ElementThumbLoader).load(i)}))}}},Craft.messageReceiver.addEventListener("message",this._broadcastListener))},initTableHeaders:function(){for(var e=function(e,i){return function(t){if(Array.isArray(t))return t}(e)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(e,i)||function(e,i){if(e){if("string"==typeof e)return t(e,i);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?t(e,i):void 0}}(e,i)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(this.elementIndex.getSortAttributeAndDirection(),1)[0],i=this.$table.children("thead").children().children("[data-attribute]"),s=0;s<i.length;s++){var a=i.eq(s),n=a.attr("data-attribute"),r="none";if(n===e){this.$selectedSortHeader=a;var o=this.elementIndex.getSelectedSortDirection();r="asc"===o?"ascending":"descending",a.addClass("ordered "+o),this.makeColumnSortable(a,!0)}else this.elementIndex.getSortOption(n)&&this.makeColumnSortable(a);a.attr("aria-sort",r)}},makeColumnSortable:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];t.addClass("orderable");var i=t.html(),s=this.$tableCaption.find("[data-sort-instructions]"),a=$("<button/>",{id:"".concat(this.elementIndex.idPrefix,"-").concat(t.attr("data-attribute")),type:"button","aria-pressed":"false"}).html(i);s.length&&a.attr("aria-describedby",s.attr("id")),e?(a.attr("aria-pressed","true"),a.on("click",this._handleSelectedSortHeaderClick.bind(this))):a.on("click",this._handleUnselectedSortHeaderClick.bind(this)),t.empty().append(a)},isVerticalList:function(){return!0},getTotalVisible:function(){return this._isStructureTableDraggingLastElements()?this._totalVisiblePostStructureTableDraggee:this._totalVisible},setTotalVisible:function(t){this._isStructureTableDraggingLastElements()?this._totalVisiblePostStructureTableDraggee=t:this._totalVisible=t},getMorePending:function(){return this._isStructureTableDraggingLastElements()?this._morePendingPostStructureTableDraggee:this._morePending},setMorePending:function(t){this._isStructureTableDraggingLastElements()?this._morePendingPostStructureTableDraggee=t:this._morePending=this._morePendingPostStructureTableDraggee=t},getLoadMoreParams:function(){var t=this.base();return this._isStructureTableDraggingLastElements()&&(t.criteria.positionedAfter=this.structureTableSort.$targetItem.data("id")),t},appendElements:function(t){this.base(t),this.structureTableSort&&this.structureTableSort.addItems(t),Craft.cp.updateResponsiveTables()},_collapseElement:function(t,e){if(!e&&!t.hasClass("expanded"))return!1;t.removeClass("expanded"),t.attr("aria-expanded","false");for(var i=t.parent().parent(),s=i.data("id"),a=i.data("level"),n=i.next();n.length;){if(!Garnish.hasAttr(n,"data-spinnerrow")){if(n.data("level")<=a)break;this.elementSelect&&this.elementSelect.removeItems(n),this.structureTableSort&&this.structureTableSort.removeItems(n),this._totalVisible--}var r=n.next();n.remove(),n=r}this.elementIndex.instanceState.collapsedElementIds||(this.elementIndex.instanceState.collapsedElementIds=[]),this.elementIndex.instanceState.collapsedElementIds.push(s),this.elementIndex.setInstanceState("collapsedElementIds",this.elementIndex.instanceState.collapsedElementIds),this.maybeLoadMore()},_expandElement:function(t,e){var i=this;if(!e&&t.hasClass("expanded"))return!1;if(t.addClass("expanded"),t.attr("aria-expanded","true"),this.elementIndex.instanceState.collapsedElementIds){var s=t.parent().parent(),a=s.data("id"),n=$.inArray(a,this.elementIndex.instanceState.collapsedElementIds);if(-1!==n){this.elementIndex.instanceState.collapsedElementIds.splice(n,1),this.elementIndex.setInstanceState("collapsedElementIds",this.elementIndex.instanceState.collapsedElementIds);var r=this._createSpinnerRowAfter(s),o=$.extend(!0,{},this.settings.params);o.criteria.descendantOf=a,Craft.sendActionRequest("POST",this.settings.loadMoreElementsAction,{data:o}).then((function(t){if(r.parent().length){var e=$(t.data.html),s=i._totalVisible+e.length,a=i.settings.batchSize&&e.length===i.settings.batchSize;if(a){var n=r.nextAll();i.elementSelect&&i.elementSelect.removeItems(n),i.structureTableSort&&i.structureTableSort.removeItems(n),n.remove(),s-=n.length}else a=i._morePending;r.replaceWith(e),i.thumbLoader.load(e),(i.elementIndex.actions||i.settings.selectable)&&(i.elementSelect.addItems(e.filter(":not(.disabled)")),i.elementIndex.updateActionTriggers()),i.structureTableSort&&i.structureTableSort.addItems(e),Craft.appendHeadHtml(t.data.headHtml),Craft.appendBodyHtml(t.data.bodyHtml),Craft.cp.updateResponsiveTables(),i.setTotalVisible(s),i.setMorePending(a),i.maybeLoadMore()}})).catch((function(t){Craft.cp.displayError(),r.parent().length}))}}},_createSpinnerRowAfter:function(t){return $('<tr data-spinnerrow><td class="centeralign" colspan="'+t.children().length+'"><div class="spinner"/></td></tr>').insertAfter(t)},_isStructureTableDraggingLastElements:function(){return this.structureTableSort&&this.structureTableSort.dragging&&this.structureTableSort.draggingLastElements},_handleSelectedSortHeaderClick:function(t){var e=$(t.currentTarget).closest("th");if(!e.hasClass("loading")){var i="asc"===this.elementIndex.getSelectedSortDirection()?"desc":"asc";this.elementIndex.setSelectedSortDirection(i),this._handleSortHeaderClick(t,e)}},_handleUnselectedSortHeaderClick:function(t){var e=$(t.currentTarget).closest("th");if(!e.hasClass("loading")){var i=e.attr("data-attribute");this.elementIndex.setSelectedSortAttribute(i),this._handleSortHeaderClick(t,e)}},_handleSortHeaderClick:function(t,e){this.$selectedSortHeader&&this.$selectedSortHeader.removeClass("ordered asc desc"),e.addClass("ordered loading"),this.elementIndex.updateElements(),this.elementIndex.setIndexAvailable()},_updateScreenReaderStatus:function(){var t=this.elementIndex.getSelectedSortAttribute(),e="asc"===this.elementIndex.getSelectedSortDirection()?Craft.t("app","Ascending"):Craft.t("app","Descending"),i=this.elementIndex.getSortLabel(t);if(t||e||i){var s=Craft.t("app","Table {name} sorted by {attribute}, {direction}",{name:this.$table.attr("data-name"),attribute:i,direction:e});this.$statusMessage.empty(),this.$statusMessage.text(s)}},_updateTableAttributes:function(t,e){var i=t.closest("tr");for(var s in e)e.hasOwnProperty(s)&&i.children('[data-attr="'+s+'"]:first').html(e[s])},destroy:function(){this._broadcastListener&&(Craft.messageReceiver.removeEventListener("message",this._broadcastListener),delete this._broadcastListener),this.base()}})},7745:function(){Craft.Tabs=Garnish.Base.extend({$container:null,$tablist:null,$menuBtn:null,$tabs:null,$firstTab:null,$lastTab:null,$selectedTab:null,$focusableTab:null,menu:null,init:function(t){var e=this;this.$container=$(t),this.$tablist=this.$container.find('> [role="tablist"]:first'),this.$tabs=this.$tablist.find('> [role="tab"]'),this.$firstTab=this.$tabs.first(),this.$lastTab=this.$tabs.last(),this.$selectedTab=this.$tabs.filter(".sel:first"),this.$focusableTab=this.$tabs.filter("[tabindex=0]:first"),this.$menuBtn=this.$container.find("> .menubtn:first").menubtn(),this.menu=this.$menuBtn.data("menubtn").menu,this.$container.data("tabs")&&(console.warn("Double-instantiating a tab manager on an element"),this.$container.data("tabs").destroy()),this.$container.data("tabs",this);for(var i=0;i<this.$tabs.length;i++){var s=this.$tabs.eq(i),a=s.attr("href");a&&"#"===a.charAt(0)&&(this.addListener(s,"keydown",(function(t){[Garnish.SPACE_KEY,Garnish.RETURN_KEY].includes(t.keyCode)&&(t.preventDefault(),e.selectTab(t.currentTarget))})),this.addListener(s,"click",(function(t){t.preventDefault(),e.selectTab(t.currentTarget)}))),this.addListener(s,"keydown",(function(t){var i;[Garnish.LEFT_KEY,Garnish.RIGHT_KEY].includes(t.keyCode)&&$.contains(e.$tablist[0],t.currentTarget)?i=t.keyCode===("ltr"===Craft.orientation?Garnish.LEFT_KEY:Garnish.RIGHT_KEY)?(i=$(t.currentTarget).prevAll('[role="tab"]:not(.hidden):first')).length?i:e.$lastTab:(i=$(t.currentTarget).nextAll('[role="tab"]:not(.hidden):first')).length?i:e.$firstTab:t.keyCode!==Garnish.HOME_KEY&&t.keyCode!==Garnish.END_KEY||(i=t.keyCode===Garnish.HOME_KEY?e.$firstTab:e.$lastTab),i&&(t.preventDefault(),e.makeTabFocusable(i),i.focus(),e.scrollToTab(i))}))}this.updateMenuBtn(),Garnish.$win.on("resize",(function(){e.updateMenuBtn()})),this.menu.$options.on("click",(function(t){var e=$(t.currentTarget).attr("href");e&&"#"===e.charAt(0)&&t.preventDefault()})),this.menu.on("optionselect",(function(t){e.selectTab($(t.selectedOption).data("id"))}))},selectTab:function(t){var e=this._getTab(t);e[0]!==this.$selectedTab[0]&&(this.deselectTab(),this.$selectedTab=e.addClass("sel").attr("aria-selected","true"),this.makeTabFocusable(e),e.focus(),this.scrollToTab(e),this.menu.$options.removeClass("sel"),this.menu.$options.filter('[data-id="'.concat(e.data("id"),'"]')).addClass("sel"),this.trigger("selectTab",{$tab:e}),$("#content").trigger("scroll"))},deselectTab:function(){var t=this.$selectedTab.removeClass("sel").attr("aria-selected","false");this.$selectedTab=null,this.trigger("deselectTab",{$tab:t})},makeTabFocusable:function(t){var e=this._getTab(t);e[0]!==this.$focusableTab[0]&&(this.$focusableTab.attr("tabindex","-1"),this.$focusableTab=e.attr("tabindex","0"))},scrollToTab:function(t){var e=this._getTab(t),i=this.$tablist.scrollLeft(),s=e.offset().left-this.$tablist.offset().left,a=!1;if(s<0)a=i+s-24;else{var n=e.outerWidth(),r=this.$tablist.prop("clientWidth");s+n>r&&(a=i+(s-(r-n))+24)}!1!==a&&this.$tablist.scrollLeft(a)},updateMenuBtn:function(){Math.floor(this.$tablist.prop("scrollWidth")-48)>this.$container.prop("clientWidth")?(this.$tablist.addClass("scrollable"),this.$menuBtn.removeClass("hidden")):(this.$tablist.removeClass("scrollable"),this.$menuBtn.addClass("hidden"))},_getTab:function(t){if(t instanceof jQuery)return t;if(t instanceof HTMLElement)return $(t);if("string"!=typeof t)throw"Invalid tab ID";var e=this.$tabs.filter('[data-id="'.concat(t,'"]'));if(!e.length)throw"Invalid tab ID: ".concat(t);return e},destroy:function(){this.$container.removeData("tabs"),this.base()}})},5074:function(){Craft.TagSelectInput=Craft.BaseElementSelectInput.extend({searchTimeout:null,searchMenu:null,$container:null,$elementsContainer:null,$elements:null,$addTagInput:null,$spinner:null,_ignoreBlur:!1,init:function(t){var e=this;if(!$.isPlainObject(t)){for(var i={},s=["id","name","tagGroupId","sourceElementId"],a=0;a<s.length&&void 0!==arguments[a];a++)i[s[a]]=arguments[a];t=i}this.base($.extend({},Craft.TagSelectInput.defaults,t)),this.$addTagInput=this.$container.children(".add").children(".text"),this.$spinner=this.$addTagInput.next(),this.addListener(this.$addTagInput,"input",(function(){e.searchTimeout&&clearTimeout(e.searchTimeout),e.searchTimeout=setTimeout(e.searchForTags.bind(e),500)})),this.addListener(this.$addTagInput,"keydown",(function(t){switch(t.keyCode===Garnish.RETURN_KEY&&t.preventDefault(),t.keyCode){case Garnish.RETURN_KEY:return t.preventDefault(),void(this.searchMenu&&this.selectTag(this.searchMenu.$options.filter(".hover")));case Garnish.DOWN_KEY:if(t.preventDefault(),this.searchMenu){var e=this.searchMenu.$options.filter(".hover");if(e.length){var i=e.parent().nextAll().find("a:not(.disabled)").first();i.length&&this.focusOption(i)}else this.focusOption(this.searchMenu.$options.eq(0))}return;case Garnish.UP_KEY:if(t.preventDefault(),this.searchMenu){var s=this.searchMenu.$options.filter(".hover");if(s.length){var a=s.parent().prevAll().find("a:not(.disabled)").last();a.length&&this.focusOption(a)}else this.focusOption(this.searchMenu.$options.eq(this.searchMenu.$options.length-1))}return}})),this.addListener(this.$addTagInput,"focus",(function(){this.searchMenu&&this.searchMenu.show()})),this.addListener(this.$addTagInput,"blur",(function(){var t=this;this._ignoreBlur?this._ignoreBlur=!1:setTimeout((function(){t.searchMenu&&t.searchMenu.hide()}),1)}))},focusOption:function(t){this.searchMenu.$options.removeClass("hover"),t.addClass("hover"),this.searchMenu.$menuList.attr("aria-activedescendant",t.attr("id"))},getAddElementsBtn:$.noop,getElementSortAxis:function(){return null},searchForTags:function(){var t=this;if(this.searchMenu&&this.killSearchMenu(),this.$addTagInput.val()){this.$spinner.removeClass("hidden");for(var e=[],i=0;i<this.$elements.length;i++){var s=$(this.$elements[i]).data("id");s&&e.push(s)}this.settings.sourceElementId&&e.push(this.settings.sourceElementId);var a={search:this.$addTagInput.val(),tagGroupId:this.settings.tagGroupId,excludeIds:e};Craft.sendActionRequest("POST","tags/search-for-tags",{data:a}).then((function(e){t.searchMenu&&t.killSearchMenu(),t.$spinner.addClass("hidden");for(var i,s=$('<div class="menu tagmenu"/>').appendTo(Garnish.$bod),n=$("<ul/>").appendTo(s),r=0;r<e.data.tags.length;r++)i=$("<li/>").appendTo(n),$('<a data-icon="tag"/>').appendTo(i).text(e.data.tags[r].title).data("id",e.data.tags[r].id).addClass(e.data.tags[r].exclude?"disabled":"");e.data.exactMatch||(i=$("<li/>").appendTo(n),$('<a data-icon="plus"/>').appendTo(i).text(a.search)),n.find("a:not(.disabled):first").addClass("hover"),t.searchMenu=new Garnish.Menu(s,{attachToElement:t.$addTagInput,onOptionSelect:t.selectTag.bind(t)}),t.addListener(s,"mousedown",(function(){t._ignoreBlur=!0})),t.searchMenu.show()})).catch((function(e){e.response,t.searchMenu&&t.killSearchMenu(),t.$spinner.addClass("hidden")}))}else this.$spinner.addClass("hidden")},selectTag:function(t){var e=this,i=$(t);if(!i.hasClass("disabled")){var s=i.data("id"),a=i.text(),n=$("<div/>",{class:"element small removable","data-id":s,"data-site-id":this.settings.targetSiteId,"data-label":a,"data-editable":"1"}).appendTo(this.$elementsContainer),r=$("<input/>",{type:"hidden",name:this.settings.name+"[]",value:s}).appendTo(n);$("<button/>",{class:"delete icon",title:Craft.t("app","Remove"),type:"button","aria-label":Craft.t("app","Remove {label}",{label:a})}).appendTo(n);var o=$("<div/>",{class:"label"}).appendTo(n);$("<span/>",{class:"title",text:a}).appendTo(o);var l=-(n.outerWidth()+10);this.$addTagInput.css("margin-"+Craft.left,l+"px");var h={};if(h["margin-"+Craft.left]=0,this.$addTagInput.velocity(h,"fast"),this.$elements=this.$elements.add(n),this.addElements(n),this.killSearchMenu(),this.$addTagInput.val(""),this.$addTagInput.trigger("focus"),!s){n.addClass("loading disabled");var d={groupId:this.settings.tagGroupId,title:a};Craft.sendActionRequest("POST","tags/create-tag",{data:d}).then((function(t){n.attr("data-id",t.data.id),r.val(t.data.id),n.removeClass("loading disabled")})).catch((function(t){t.response,e.removeElement(n),Craft.cp.displayError(Craft.t("app","A server error occurred."))}))}}},killSearchMenu:function(){this.searchMenu.hide(),this.searchMenu.destroy(),this.searchMenu=null}},{defaults:{tagGroupId:null}})},3958:function(){Craft.ThumbsElementIndexView=Craft.BaseElementIndexView.extend({getElementContainer:function(){return this.$container.children("ul")}})},1592:function(){Craft.ui={createButton:function(t){var e=$("<button/>",{type:t.type||"button",class:"btn"});return t.id&&e.attr("id",t.id),t.class&&e.addClass(t.class),t.ariaLabel&&e.attr("aria-label",t.ariaLabel),t.role&&e.attr("role",t.role),t.html?e.html(t.html):t.label?e.append($('<div class="label"/>').text(t.label)):e.addClass("btn-empty"),t.toggle&&e.attr("aria-expanded","false"),t.controls&&e.attr("aria-controls",t.controls),t.spinner&&e.append($('<div class="spinner spinner-absolute"/>')),e},createSubmitButton:function(t){var e=this.createButton(Object.assign({},t,{type:"submit",label:t.label||Craft.t("app","Submit")}));return e.addClass("submit"),e},createTextInput:function(t){t=$.extend({autocomplete:!1},t);var e=$("<input/>",{attr:{class:"text",type:t.type||"text",inputmode:t.inputmode,id:t.id,size:t.size,name:t.name,value:t.value,maxlength:t.maxlength,autofocus:this.getAutofocusValue(t.autofocus),autocomplete:"boolean"==typeof t.autocomplete?t.autocomplete?"on":"off":t.autocomplete,disabled:this.getDisabledValue(t.disabled),readonly:t.readonly,title:t.title,placeholder:t.placeholder,step:t.step,min:t.min,max:t.max}});return t.class&&e.addClass(t.class),t.placeholder&&e.addClass("nicetext"),"password"===t.type&&e.addClass("password"),t.disabled&&e.addClass("disabled"),t.size||e.addClass("fullwidth"),t.showCharsLeft&&t.maxlength&&e.attr("data-show-chars-left").css("padding-"+("ltr"===Craft.orientation?"right":"left"),7.2*t.maxlength.toString().length+14+"px"),(t.placeholder||t.showCharsLeft)&&new Garnish.NiceText(e),"password"===t.type?$('<div class="passwordwrapper"/>').append(e):e},createTextField:function(t){return t.id||(t.id="text"+Math.floor(1e9*Math.random())),this.createField(this.createTextInput(t),t)},createCopyTextInput:function(t){var e=t.id||"copytext"+Math.floor(1e9*Math.random()),i=t.buttonId||"".concat(e,"-btn"),s=$("<div/>",{class:"copytext"}),a=this.createTextInput($.extend({},t,{readonly:!0})).appendTo(s);return $("<button/>",{type:"button",id:i,class:"btn","data-icon":"clipboard",title:Craft.t("app","Copy to clipboard"),"aria-label":Craft.t("app","Copy to clipboard")}).appendTo(s).on("click",(function(){a[0].select(),document.execCommand("copy"),Craft.cp.displayNotice(Craft.t("app","Copied to clipboard.")),s.trigger("copy"),a[0].setSelectionRange(0,0)})),s},createCopyTextBtn:function(t){var e=t.id||"copytext"+Math.floor(1e9*Math.random()),i=t.value,s=$("<div/>",{id:e,class:"copytextbtn",role:"button",title:Craft.t("app","Copy to clipboard"),"aria-label":Craft.t("app","Copy to clipboard"),tabindex:"0"});t.class&&s.addClass(t.class);var a=$("<input/>",{value:i,readonly:!0,size:i.length,tabindex:"-1"}).appendTo(s),n=($("<span/>",{"data-icon":"clipboard","aria-hidden":"true"}).appendTo(s),function(){a[0].select(),document.execCommand("copy"),Craft.cp.displayNotice(Craft.t("app","Copied to clipboard.")),s.trigger("copy"),a[0].setSelectionRange(0,0),s.focus()});return s.on("click",(function(){n()})),s.on("keydown",(function(t){t.keyCode===Garnish.SPACE_KEY&&(n(),t.preventDefault())})),s},createCopyTextField:function(t){return t.id||(t.id="copytext"+Math.floor(1e9*Math.random())),this.createField(this.createCopyTextInput(t),t)},createCopyTextPrompt:function(t){var e=$("<div/>",{class:"modal fitted"}),i=$("<div/>",{class:"body"}).appendTo(e);this.createCopyTextField($.extend({size:Math.max(Math.min(t.value.length,50),25)},t)).appendTo(i);var s=i.find("label");s.length>0&&s.attr("id")&&e.attr("aria-labelledby",s.attr("id"));var a=new Garnish.Modal(e,{closeOtherModals:!1});return e.on("copy",(function(){a.hide()})),e},createTextarea:function(t){var e=$("<textarea/>",{class:"text",rows:t.rows||2,cols:t.cols||50,id:t.id,name:t.name,maxlength:t.maxlength,autofocus:t.autofocus&&!Garnish.isMobileBrowser(!0),disabled:!!t.disabled,placeholder:t.placeholder,html:t.value});return t.showCharsLeft&&e.attr("data-show-chars-left",""),t.class&&e.addClass(t.class),t.size||e.addClass("fullwidth"),e},createTextareaField:function(t){return t.id||(t.id="textarea"+Math.floor(1e9*Math.random())),this.createField(this.createTextarea(t),t)},createSelect:function(t){var e=$("<div/>",{class:"select"});t.class&&e.addClass(t.class);var i=$("<select/>",{id:t.id,name:t.name,autofocus:t.autofocus&&Garnish.isMobileBrowser(!0),disabled:t.disabled,"data-target-prefix":t.targetPrefix,"aria-labelledby":t.labelledBy}).appendTo(e);if($.isPlainObject(t.options)){var s=[];for(var a in t.options)if(t.options.hasOwnProperty(a)){var n=t.options[a];$.isPlainObject(n)?void 0!==n.optgroup?s.push(n):s.push({label:n.label,value:void 0!==n.value?n.value:a,disabled:void 0!==n.disabled&&n.disabled}):s.push({label:n,value:a})}t.options=s}for(var r=null,o=0;o<t.options.length;o++){var l=t.options[o];void 0!==l.optgroup?r=$("<optgroup/>",{label:l.label}).appendTo(i):$("<option/>",{value:l.value,selected:l.value==t.value,disabled:void 0!==l.disabled&&l.disabled,html:l.label}).appendTo(r||i)}return t.toggle&&(i.addClass("fieldtoggle"),new Craft.FieldToggle(i)),e},createSelectField:function(t){return t.id||(t.id="select"+Math.floor(1e9*Math.random())),this.createField(this.createSelect(t),t)},createCheckbox:function(t){var e=t.id||"checkbox"+Math.floor(1e9*Math.random()),i=$("<input/>",{type:"checkbox",value:void 0!==t.value?t.value:"1",id:e,class:"checkbox",name:t.name,checked:t.checked?"checked":null,autofocus:this.getAutofocusValue(t.autofocus),disabled:this.getDisabledValue(t.disabled),"data-target":t.toggle,"data-reverse-target":t.reverseToggle});t.class&&i.addClass(t.class),(t.toggle||t.reverseToggle)&&(i.addClass("fieldtoggle"),new Craft.FieldToggle(i));var s=$("<label/>",{for:e,html:t.label});return t.name&&(t.name.length<3||"[]"!==t.name.slice(-2))?$([$("<input/>",{type:"hidden",name:t.name,value:""})[0],i[0],s[0]]):$([i[0],s[0]])},createCheckboxField:function(t){t.id||(t.id="checkbox"+Math.floor(1e9*Math.random()));var e=$('<div class="field checkboxfield"/>',{id:"".concat(t.id,"-field")});return t.first&&e.addClass("first"),t.instructions&&e.addClass("has-instructions"),this.createCheckbox(t).appendTo(e),t.instructions&&$('<div class="instructions"/>').text(t.instructions).appendTo(e),e},createCheckboxSelect:function(t){var e,i,s=$('<fieldset class="checkbox-select"/>');t.class&&s.addClass(t.class),t.showAllOption?(e=t.allValue||"*",i=t.values==e,$("<div/>").appendTo(s).append(this.createCheckbox({id:t.id,class:"all",label:"<b>"+(t.allLabel||Craft.t("app","All"))+"</b>",name:t.name,value:e,checked:i,autofocus:t.autofocus}))):i=!1;for(var a=0;a<t.options.length;a++){var n=t.options[a];n.value!=e&&$("<div/>").appendTo(s).append(this.createCheckbox({label:n.label,name:t.name?t.name+"[]":null,value:n.value,checked:i||(t.values||[]).includes(n.value),disabled:i}))}return new Garnish.CheckboxSelect(s),s},createCheckboxSelectField:function(t){return t.fieldset=!0,t.id||(t.id="checkboxselect"+Math.floor(1e9*Math.random())),this.createField(this.createCheckboxSelect(t),t)},createLightswitch:function(t){var e=t.value||"1",i=t.indeterminateValue||"-",s=$("<button/>",{type:"button",class:"lightswitch","data-value":e,"data-indeterminate-value":i,id:t.id,role:"switch","aria-checked":t.on?"true":t.indeterminate?"mixed":"false","aria-labelledby":t.labelId,"data-target":t.toggle,"data-reverse-target":t.reverseToggle});return t.on?s.addClass("on"):t.indeterminate&&s.addClass("indeterminate"),t.small&&s.addClass("small"),t.disabled&&s.addClass("disabled"),$('<div class="lightswitch-container"><div class="handle"></div></div>').appendTo(s),t.name&&$("<input/>",{type:"hidden",name:t.name,value:t.on?e:t.indeterminate?i:"",disabled:t.disabled}).appendTo(s),(t.toggle||t.reverseToggle)&&(s.addClass("fieldtoggle"),new Craft.FieldToggle(s)),new Craft.LightSwitch(s,{onChange:t.onChange||$.noop}),s},createLightswitchField:function(t){return t.id||(t.id="lightswitch"+Math.floor(1e9*Math.random())),t.labelId||(t.labelId="".concat(t.id,"-label")),this.createField(this.createLightswitch(t),t).addClass("lightswitch-field")},createColorInput:function(t){var e=t.id||"color"+Math.floor(1e9*Math.random()),i=t.containerId||e+"-container",s=t.name||null,a=t.value||null,n=t.small||!1,r=t.autofocus&&Garnish.isMobileBrowser(!0),o=t.disabled||!1,l=$("<div/>",{id:i,class:"flex color-container"}),h=$("<div/>",{class:"color static"+(n?" small":"")}).appendTo(l),d=($("<div/>",{class:"color-preview",style:t.value?{backgroundColor:t.value}:null}).appendTo(h),$("<div/>",{class:"color-input-container"}).append($("<div/>",{class:"color-hex-indicator light code","aria-hidden":"true",text:"#"})).appendTo(l));return this.createTextInput({id:e,name:s,value:Craft.ltrim(a,"#"),size:10,class:"color-input",autofocus:r,disabled:o,"aria-label":Craft.t("app","Color hex value")}).appendTo(d),new Craft.ColorInput(l),l},createColorField:function(t){return t.fieldset=!0,o,t.id||(t.id="color"+Math.floor(1e9*Math.random())),this.createField(this.createColorInput(t),t)},createDateInput:function(t){var e=Garnish.isMobileBrowser(),i=(t.id||"date"+Math.floor(1e9*Math.random()))+"-date",s=t.name||null,a=s?s+"[date]":null,n=t.value&&"function"==typeof t.value.getMonth?t.value:null,r=t.autofocus&&Garnish.isMobileBrowser(!0),o=t.disabled||!1,l=$("<div/>",{class:"datewrapper"}),h=this.createTextInput({id:i,type:e?"date":"text",class:!(!e||n)&&"empty-value",name:a,value:n?e?n.toISOString().split("T")[0]:Craft.formatDate(n):"",placeholder:" ",autocomplete:!1,autofocus:r,disabled:o}).appendTo(l);return $('<div data-icon="date"></div>').appendTo(l),s&&$("<input/>",{type:"hidden",name:s+"[timezone]",val:Craft.timezone}).appendTo(l),e?h.datetimeinput():h.datepicker($.extend({defaultDate:n||new Date},Craft.datepickerOptions)),t.hasOuterContainer?l:$('<div class="datetimewrapper"/>').append(l).datetime()},createDateField:function(t){return t.id||(t.id="date"+Math.floor(1e9*Math.random())),this.createField(this.createDateInput(t),t)},createDateRangePicker:function(t){var e=new Date,i=new Date(e.getFullYear(),e.getMonth(),e.getDate());t=$.extend({class:"",options:["today","thisWeek","thisMonth","thisYear","past7Days","past30Days","past90Days","pastYear"],onChange:$.noop,selected:null,startDate:null,endDate:null},t);var s,a,n=$("<div/>",{class:"menu"}),r=$("<ul/>",{class:"padded"}).appendTo(n),o=$("<a/>").addClass("sel").text(Craft.t("app","All")).data("handle","all");$("<li/>").append(o).appendTo(r);for(var l=0;l<t.options.length;l++){var h=t.options[l];switch(h){case"today":s={label:Craft.t("app","Today"),startDate:i,endDate:i};break;case"thisWeek":var d=e.getDay()-Craft.datepickerOptions.firstDay;d<0&&(d+=7),s={label:Craft.t("app","This week"),startDate:new Date(e.getFullYear(),e.getMonth(),e.getDate()-d),endDate:i};break;case"thisMonth":s={label:Craft.t("app","This month"),startDate:new Date(e.getFullYear(),e.getMonth()),endDate:i};break;case"thisYear":s={label:Craft.t("app","This year"),startDate:new Date(e.getFullYear(),0),endDate:i};break;case"past7Days":s={label:Craft.t("app","Past {num} days",{num:7}),startDate:new Date(e.getFullYear(),e.getMonth(),e.getDate()-7),endDate:i};break;case"past30Days":s={label:Craft.t("app","Past {num} days",{num:30}),startDate:new Date(e.getFullYear(),e.getMonth(),e.getDate()-30),endDate:i};break;case"past90Days":s={label:Craft.t("app","Past {num} days",{num:90}),startDate:new Date(e.getFullYear(),e.getMonth(),e.getDate()-90),endDate:i};break;case"pastYear":s={label:Craft.t("app","Past year"),startDate:new Date(e.getFullYear(),e.getMonth(),e.getDate()-365),endDate:i}}var c=$("<li/>"),u=$("<a/>",{text:s.label}).data("handle",h).data("startDate",s.startDate).data("endDate",s.endDate).data("startTime",s.startDate?s.startDate.getTime():null).data("endTime",s.endDate?s.endDate.getTime():null);t.selected&&h==t.selected&&(a=u[0]),c.append(u),c.appendTo(r)}$("<hr/>").appendTo(n);var p=$("<div/>",{class:"flex flex-nowrap padded"}).appendTo(n),f=this.createDateField({label:Craft.t("app","From")}).appendTo(p).find("input"),g=this.createDateField({label:Craft.t("app","To")}).appendTo(p).find("input"),m=f.add(g);m.on("keyup",(function(t){t.keyCode===Garnish.ESC_KEY&&$(this).data("datepicker")&&$(this).data("datepicker").dpDiv.is(":visible")&&t.stopPropagation()})),f.data("datepicker")&&f.data("datepicker").dpDiv.on("mousedown",(function(t){t.stopPropagation()})),g.data("datepicker")&&g.data("datepicker").dpDiv.on("mousedown",(function(t){t.stopPropagation()}));var v=new Garnish.Menu(n,{onOptionSelect:function(e){var i=$(e);C.text(i.text()),v.setPositionRelativeToAnchor(),n.find(".sel").removeClass("sel"),i.addClass("sel"),f.datepicker("setDate",i.data("startDate")),g.datepicker("setDate",i.data("endDate")),t.onChange(i.data("startDate")||null,i.data("endDate")||null,i.data("handle"))}});m.on("change",(function(){for(var e,i=f.datepicker("getDate"),s=g.datepicker("getDate"),a=i?i.getTime():null,o=s?s.getTime():null,l=r.find("a"),h=!1,d=0;d<l.length;d++)if(a===((e=l.eq(d)).data("startTime")||null)&&o===(e.data("endTime")||null)){v.selectOption(e[0]),h=!0,t.onChange(null,null,e.data("handle"));break}h||(n.find(".sel").removeClass("sel"),p.addClass("sel"),a||o?a&&o?C.text(f.val()+" - "+g.val()):a?C.text(Craft.t("app","From {date}",{date:f.val()})):C.text(Craft.t("app","To {date}",{date:g.val()})):C.text(Craft.t("app","All")),v.setPositionRelativeToAnchor(),t.onChange(i,s,"custom"))})),v.on("hide",(function(){f.datepicker("hide"),g.datepicker("hide")}));var b="btn menubtn";t.class&&(b=b+" "+t.class);var C=$("<button/>",{type:"button",class:b,"data-icon":"date",text:Craft.t("app","All")});return new Garnish.MenuBtn(C,v),a&&v.selectOption(a),t.startDate&&f.datepicker("setDate",t.startDate),t.endDate&&g.datepicker("setDate",t.endDate),(t.startDate||t.endDate)&&m.trigger("change"),C},createTimeInput:function(t){var e=Garnish.isMobileBrowser(),i=(t.id||"time"+Math.floor(1e9*Math.random()))+"-time",s=t.name||null,a=s?s+"[time]":null,n=t.value&&"function"==typeof t.value.getMonth?t.value:null,r=t.autofocus&&Garnish.isMobileBrowser(!0),o=t.disabled||!1,l=$("<div/>",{class:"timewrapper"}),h=this.createTextInput({id:i,type:e?"time":"text",class:!(!e||n)&&"empty-value",name:a,placeholder:" ",autocomplete:!1,autofocus:r,disabled:o}).appendTo(l);return $('<div data-icon="time"></div>').appendTo(l),s&&$("<input/>",{type:"hidden",name:s+"[timezone]",val:Craft.timezone}).appendTo(l),e?(n&&h.val(n.toISOString().split("T")[1]),h.datetimeinput()):(h.timepicker(Craft.timepickerOptions),n&&h.timepicker("setTime",3600*n.getHours()+60*n.getMinutes()+n.getSeconds())),t.hasOuterContainer?l:$('<div class="datetimewrapper"/>').append(l).datetime()},createTimeField:function(t){return t.id||(t.id="time"+Math.floor(1e9*Math.random())),this.createField(this.createTimeInput(t),t)},createField:function(t,e){var i=e.label&&"__blank__"!==e.label?e.label:null,s=$(e.fieldset?"<fieldset/>":"<div/>",{class:"field",id:e.fieldId||(e.id?e.id+"-field":null)});if(e.first&&s.addClass("first"),e.fieldClass&&s.addClass(e.fieldClass),i&&e.fieldset&&$("<legend/>",{text:i,class:"visually-hidden","data-label":i}).appendTo(s),i){var a=$('<div class="heading"/>').appendTo(s);$(e.fieldset?"<legend/>":"<label/>",{id:e.labelId||(e.id?"".concat(e.id,"-").concat(e.fieldset?"legend":"label"):null),class:e.required?"required":null,for:!e.fieldset&&e.id||null,text:i}).appendTo(a)}if(e.instructions&&$('<div class="instructions"/>').text(e.instructions).appendTo(s),$('<div class="input"/>').append(t).appendTo(s),e.tip){var n=$('<p class="notice has-icon"/>');$('<span class="icon" aria-hidden="true"/>').appendTo(n),$('<span class="visually-hidden"/>').text(Craft.t("app","Tip")+": ").appendTo(n),$("<span/>").text(e.tip).appendTo(n),n.appendTo(s)}if(e.warning){var r=$('<p class="warning has-icon"/>');$('<span class="icon" aria-hidden="true"/>').appendTo(r),$('<span class="visually-hidden"/>').text(Craft.t("app","Warning")+": ").appendTo(r),$("<span/>").text(e.warning).appendTo(r),r.appendTo(s)}return e.errors&&this.addErrorsToField(s,e.errors),s},createErrorList:function(t){var e=$('<ul class="errors"/>');return t&&this.addErrorsToList(e,t),e},addErrorsToList:function(t,e){for(var i=0;i<e.length;i++)$("<li/>").text(e[i]).appendTo(t)},addErrorsToField:function(t,e){if(e){t.addClass("has-errors"),t.children(".input").addClass("errors");var i=t.children("ul.errors");i.length||(i=this.createErrorList().appendTo(t)),this.addErrorsToList(i,e)}},clearErrorsFromField:function(t){t.removeClass("has-errors"),t.children(".input").removeClass("errors"),t.children("ul.errors").remove()},getAutofocusValue:function(t){return t&&!Garnish.isMobileBrowser(!0)?"autofocus":null},getDisabledValue:function(t){return t?"disabled":null}}},1752:function(){Craft.Uploader=Garnish.Base.extend({uploader:null,allowedKinds:null,$element:null,settings:null,_rejectedFiles:{},_extensionList:null,_totalFileCounter:0,_validFileCounter:0,init:function(t,e){this._rejectedFiles={size:[],type:[],limit:[]},this.$element=t,this.allowedKinds=null,this._extensionList=null,this._totalFileCounter=0,this._validFileCounter=0;var i=(e=$.extend({},Craft.Uploader.defaults,e)).events;for(var s in delete e.events,e.allowedKinds&&e.allowedKinds.length&&("string"==typeof e.allowedKinds&&(e.allowedKinds=[e.allowedKinds]),this.allowedKinds=e.allowedKinds,delete e.allowedKinds),e.autoUpload=!1,this.uploader=this.$element.fileupload(e),i)i.hasOwnProperty(s)&&this.uploader.on(s,i[s]);this.settings=e,this.uploader.on("fileuploadadd",this.onFileAdd.bind(this))},setParams:function(t){void 0!==Craft.csrfTokenName&&void 0!==Craft.csrfTokenValue&&(t[Craft.csrfTokenName]=Craft.csrfTokenValue),this.uploader.fileupload("option",{formData:t})},getInProgress:function(){return this.uploader.fileupload("active")},isLastUpload:function(){return this.getInProgress()<2},onFileAdd:function(t,e){var i=this;t.stopPropagation();var s=!1;return this.allowedKinds&&(this._extensionList||this._createExtensionList(),s=!0),e.process().done((function(){var t=e.files[0],a=!0;if(s){var n=t.name.match(/\.([a-z0-4_]+)$/i)[1];-1===$.inArray(n.toLowerCase(),i._extensionList)&&(a=!1,i._rejectedFiles.type.push("“"+t.name+"”"))}t.size>i.settings.maxFileSize&&(i._rejectedFiles.size.push("“"+t.name+"”"),a=!1),a&&"function"==typeof i.settings.canAddMoreFiles&&!i.settings.canAddMoreFiles(i._validFileCounter)&&(i._rejectedFiles.limit.push("“"+t.name+"”"),a=!1),a&&(i._validFileCounter++,e.submit()),++i._totalFileCounter===e.originalFiles.length&&(i._totalFileCounter=0,i._validFileCounter=0,i.processErrorMessages())})),!0},processErrorMessages:function(){var t;this._rejectedFiles.type.length&&(t=1===this._rejectedFiles.type.length?"The file {files} could not be uploaded. The allowed file kinds are: {kinds}.":"The files {files} could not be uploaded. The allowed file kinds are: {kinds}.",t=Craft.t("app",t,{files:this._rejectedFiles.type.join(", "),kinds:this.allowedKinds.join(", ")}),this._rejectedFiles.type=[],alert(t)),this._rejectedFiles.size.length&&(t=1===this._rejectedFiles.size.length?"The file {files} could not be uploaded, because it exceeds the maximum upload size of {size}.":"The files {files} could not be uploaded, because they exceeded the maximum upload size of {size}.",t=Craft.t("app",t,{files:this._rejectedFiles.size.join(", "),size:this.humanFileSize(Craft.maxUploadSize)}),this._rejectedFiles.size=[],alert(t)),this._rejectedFiles.limit.length&&(t=1===this._rejectedFiles.limit.length?"The file {files} could not be uploaded, because the field limit has been reached.":"The files {files} could not be uploaded, because the field limit has been reached.",t=Craft.t("app",t,{files:this._rejectedFiles.limit.join(", ")}),this._rejectedFiles.limit=[],alert(t))},humanFileSize:function(t){var e=1024;if(t<e)return t+" B";var i=-1;do{t/=e,++i}while(t>=e);return t.toFixed(1)+" "+["kB","MB","GB","TB","PB","EB","ZB","YB"][i]},_createExtensionList:function(){this._extensionList=[];for(var t=0;t<this.allowedKinds.length;t++){var e=this.allowedKinds[t];if(void 0!==Craft.fileKinds[e])for(var i=0;i<Craft.fileKinds[e].extensions.length;i++){var s=Craft.fileKinds[e].extensions[i];this._extensionList.push(s)}}},destroy:function(){this.$element.fileupload("destroy"),this.base()}},{defaults:{dropZone:null,pasteZone:null,fileInput:null,sequentialUploads:!0,maxFileSize:Craft.maxUploadSize,allowedKinds:null,events:{},canAddMoreFiles:null,headers:{Accept:"application/json;q=0.9,*/*;q=0.8"},paramName:"assets-upload"}})},7e3:function(){Craft.UriFormatGenerator=Craft.BaseInputGenerator.extend({generateTargetValue:function(t){t=(t=t.replace("/<(.*?)>/g","")).toLowerCase(),t=(t=(t=Craft.asciiString(t)).replace(/^[^a-z]+/,"")).replace(/[^a-z0-9]+$/,"");var e=Craft.filterArray(t.split(/[^a-z0-9]+/)).join(Craft.slugWordSeparator);return e&&this.settings.suffix&&(e+=this.settings.suffix),e}})},8654:function(){Craft.UserIndex=Craft.BaseElementIndex.extend({init:function(t,e,i){this.on("selectSource",this.updateUrl.bind(this)),this.base(t,e,i)},getDefaultSourceKey:function(){if("index"===this.settings.context&&"undefined"!=typeof defaultSourceSlug)for(var t=0;t<this.$sources.length;t++){var e=$(this.$sources[t]);if(e.data("slug")===defaultSourceSlug)return e.data("key")}return this.base()},updateUrl:function(){if("index"===this.settings.context){var t="users",e=this.$source.data("slug");e&&(t+="/".concat(e)),Craft.setPath(t)}}}),Craft.registerElementIndexClass("craft\\elements\\User",Craft.UserIndex)},5537:function(){},9383:function(){},6558:function(t,e,i){var s=i(5537);s.__esModule&&(s=s.default),"string"==typeof s&&(s=[[t.id,s,""]]),s.locals&&(t.exports=s.locals),(0,i(9673).Z)("3790022a",s,!0,{})},2179:function(t,e,i){var s=i(9383);s.__esModule&&(s=s.default),"string"==typeof s&&(s=[[t.id,s,""]]),s.locals&&(t.exports=s.locals),(0,i(9673).Z)("80058a3c",s,!0,{})},9673:function(t,e,i){"use strict";function s(t,e){for(var i=[],s={},a=0;a<e.length;a++){var n=e[a],r=n[0],o={id:t+":"+a,css:n[1],media:n[2],sourceMap:n[3]};s[r]?s[r].parts.push(o):i.push(s[r]={id:r,parts:[o]})}return i}i.d(e,{Z:function(){return f}});var a="undefined"!=typeof document;if("undefined"!=typeof DEBUG&&DEBUG&&!a)throw new Error("vue-style-loader cannot be used in a non-browser environment. Use { target: 'node' } in your Webpack config to indicate a server-rendering environment.");var n={},r=a&&(document.head||document.getElementsByTagName("head")[0]),o=null,l=0,h=!1,d=function(){},c=null,u="data-vue-ssr-id",p="undefined"!=typeof navigator&&/msie [6-9]\b/.test(navigator.userAgent.toLowerCase());function f(t,e,i,a){h=i,c=a||{};var r=s(t,e);return g(r),function(e){for(var i=[],a=0;a<r.length;a++){var o=r[a];(l=n[o.id]).refs--,i.push(l)}for(e?g(r=s(t,e)):r=[],a=0;a<i.length;a++){var l;if(0===(l=i[a]).refs){for(var h=0;h<l.parts.length;h++)l.parts[h]();delete n[l.id]}}}}function g(t){for(var e=0;e<t.length;e++){var i=t[e],s=n[i.id];if(s){s.refs++;for(var a=0;a<s.parts.length;a++)s.parts[a](i.parts[a]);for(;a<i.parts.length;a++)s.parts.push(v(i.parts[a]));s.parts.length>i.parts.length&&(s.parts.length=i.parts.length)}else{var r=[];for(a=0;a<i.parts.length;a++)r.push(v(i.parts[a]));n[i.id]={id:i.id,refs:1,parts:r}}}}function m(){var t=document.createElement("style");return t.type="text/css",r.appendChild(t),t}function v(t){var e,i,s=document.querySelector("style["+u+'~="'+t.id+'"]');if(s){if(h)return d;s.parentNode.removeChild(s)}if(p){var a=l++;s=o||(o=m()),e=C.bind(null,s,a,!1),i=C.bind(null,s,a,!0)}else s=m(),e=_.bind(null,s),i=function(){s.parentNode.removeChild(s)};return e(t),function(s){if(s){if(s.css===t.css&&s.media===t.media&&s.sourceMap===t.sourceMap)return;e(t=s)}else i()}}var b,$=(b=[],function(t,e){return b[t]=e,b.filter(Boolean).join("\n")});function C(t,e,i,s){var a=i?"":s.css;if(t.styleSheet)t.styleSheet.cssText=$(e,a);else{var n=document.createTextNode(a),r=t.childNodes;r[e]&&t.removeChild(r[e]),r.length?t.insertBefore(n,r[e]):t.appendChild(n)}}function _(t,e){var i=e.css,s=e.media,a=e.sourceMap;if(s&&t.setAttribute("media",s),c.ssrId&&t.setAttribute(u,e.id),a&&(i+="\n/*# sourceURL="+a.sources[0]+" */",i+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(a))))+" */"),t.styleSheet)t.styleSheet.cssText=i;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(i))}}}},__webpack_module_cache__={};function __webpack_require__(t){var e=__webpack_module_cache__[t];if(void 0!==e)return e.exports;var i=__webpack_module_cache__[t]={id:t,exports:{}};return __webpack_modules__[t](i,i.exports,__webpack_require__),i.exports}__webpack_require__.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return __webpack_require__.d(e,{a:e}),e},__webpack_require__.d=function(t,e){for(var i in e)__webpack_require__.o(e,i)&&!__webpack_require__.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})},__webpack_require__.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)};var __webpack_exports__={};!function(){"use strict";__webpack_require__(2179),__webpack_require__(6558),__webpack_require__(587),__webpack_require__(8960),__webpack_require__(5774),__webpack_require__(8495),__webpack_require__(5970),__webpack_require__(4993),__webpack_require__(8843),__webpack_require__(5759),__webpack_require__(8167),__webpack_require__(4211),__webpack_require__(7745),__webpack_require__(463),__webpack_require__(3839),__webpack_require__(7452),__webpack_require__(6872),__webpack_require__(2495),__webpack_require__(5077),__webpack_require__(4606),__webpack_require__(9222);var t=jQuery,e=__webpack_require__.n(t);function i(t){return i="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},i(t)}function s(t,e){if(t){if("string"==typeof t)return a(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?a(t,e):void 0}}function a(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=new Array(e);i<e;i++)s[i]=t[i];return s}Craft.CP=Garnish.Base.extend({authManager:null,$nav:null,$navToggle:null,$globalSidebar:null,$globalContainer:null,$mainContainer:null,$alerts:null,$crumbs:null,$breadcrumbList:null,$breadcrumbItems:null,$notificationContainer:null,$main:null,$primaryForm:null,$headerContainer:null,$header:null,$mainContent:null,$details:null,$sidebarContainer:null,$sidebarToggle:null,$sidebar:null,$contentContainer:null,$edition:null,$confirmUnloadForms:null,$deltaForms:null,$collapsibleTables:null,isMobile:null,fixedHeader:!1,breadcrumbListWidth:0,breadcrumbDisclosureItem:'<li class="breadcrumb-toggle-wrapper" data-disclosure-item><button data-disclosure-trigger aria-controls="breadcrumb-disclosure" aria-haspopup="true">'.concat(Craft.t("app","More…"),'</button><div id="breadcrumb-disclosure" class="menu menu--disclosure" data-disclosure-menu><ul></ul></div></li>'),tabManager:null,enableQueue:!0,totalJobs:0,jobInfo:null,displayedJobInfo:null,displayedJobInfoUnchanged:1,trackJobProgressTimeout:null,jobProgressIcon:null,checkingForUpdates:!1,forcingRefreshOnUpdatesCheck:!1,includingDetailsOnUpdatesCheck:!1,checkForUpdatesCallbacks:null,resizeTimeout:null,init:function(){var t=this;0!==Craft.remainingSessionTime&&(this.authManager=new Craft.AuthManager),this.$nav=e()("#nav"),this.$navToggle=e()("#primary-nav-toggle"),this.$globalSidebar=e()("#global-sidebar"),this.$globalContainer=e()("#global-container"),this.$mainContainer=e()("#main-container"),this.$alerts=e()("#alerts"),this.$crumbs=e()("#crumbs"),this.$breadcrumbList=e()(".breadcrumb-list"),this.$breadcrumbItems=e()(".breadcrumb-list li"),this.$notificationContainer=e()("#notifications"),this.$main=e()("#main"),this.$primaryForm=e()("#main-form"),this.$headerContainer=e()("#header-container"),this.$header=e()("#header"),this.$mainContent=e()("#main-content"),this.$details=e()("#details"),this.$sidebarContainer=e()("#sidebar-container"),this.$sidebarToggle=e()("#sidebar-toggle"),this.$sidebar=e()("#sidebar"),this.$contentContainer=e()("#content-container"),this.$collapsibleTables=e()("table.collapsible"),this.isMobile=Garnish.isMobileBrowser(),this.updateContentHeading();for(var i=this.$details.find(".meta > .field > .instructions"),a=0;a<i.length;a++){var n=i.eq(a),r=n.siblings(".heading").children("label");e()("<span/>",{class:"info",html:n.children().html()}).appendTo(r),n.remove()}if(!this.isMobile&&this.$header.length&&(this.addListener(Garnish.$win,"scroll","updateFixedHeader"),this.updateFixedHeader()),Garnish.$doc.ready((function(){t.addListener(Garnish.$win,"resize",(function(e){if(e.target===window){t.handleWindowResize(),clearTimeout(t.resizeTimeout);var i=t;t.resizeTimeout=setTimeout((function(){i.setSidebarNavAttributes()}),100)}})),t.handleWindowResize(),t.setSidebarNavAttributes(),Garnish.requestAnimationFrame(t.initSpecialForms.bind(t))})),this.$alerts.length&&this.initAlerts(),this.addListener(this.$navToggle,"click","toggleNav"),this.addListener(this.$sidebarToggle,"click","toggleSidebar"),this.$primaryForm.length||(this.$primaryForm=e()("form[data-saveshortcut]:first")),this.$primaryForm.length&&Garnish.hasAttr(this.$primaryForm,"data-saveshortcut")&&function(){var e=[],i=t.$primaryForm.data("actions");if(void 0===i)e.push([{keyCode:Garnish.S_KEY,ctrl:!0},{redirect:t.$primaryForm.data("saveshortcut-redirect"),retainScroll:Garnish.hasAttr(t.$primaryForm,"saveshortcut-scroll")}]);else for(var s=0;s<i.length;s++){var a=i[s];a.shortcut&&e.push([{keyCode:Garnish.S_KEY,ctrl:!0,shift:!!a.shift},{action:a.action,redirect:a.redirect,confirm:a.confirm,params:a.params,data:a.data,retainScroll:a.retainScroll}])}for(var n=function(i){Garnish.uiLayerManager.registerShortcut(e[i][0],(function(){t.submitPrimaryForm(e[i][1])}))},r=0;r<e.length;r++)n(r)}(),this.initTabs(),this.tabManager&&window.LOCATION_HASH){var o=this.tabManager.$tabs.filter('[href="#'.concat(window.LOCATION_HASH,'"]'));o.length&&this.tabManager.selectTab(o)}var l=Craft.getLocalStorage("scrollY");if(void 0!==l&&(Craft.removeLocalStorage("scrollY"),Garnish.$doc.ready((function(){Garnish.requestAnimationFrame((function(){window.scrollTo(0,l)}))}))),e().isTouchCapable()&&(this.$mainContainer.on("focus","input, textarea, .focusable-input",this._handleInputFocus.bind(this)),this.$mainContainer.on("blur","input, textarea, .focusable-input",this._handleInputBlur.bind(this))),Craft.announcements.length){var h,d,c=e()("#announcements-btn").removeClass("hidden"),u=Craft.announcements.some((function(t){return t.unread}));u&&(h=e()("<span/>",{class:"visually-hidden",html:Craft.t("app","Unread messages")}),c.addClass("unread").append(h)),this.addListener(c,"click",(function(){if(d)d.show();else{var t="";Craft.announcements.forEach((function(e){t+='<div class="announcement '.concat(e.unread?"unread":"",'" role="listitem">')+'<div class="announcement__header">'+'<h3 class="announcement__heading h2">'.concat(e.heading,"</h3>")+'<div class="announcement-label-container">'+'<div class="announcement-icon" aria-hidden="true">'.concat(e.icon,"</div>")+'<div class="announcement-label">'.concat(e.label,"</div>")+"</div></div>"+"<p>".concat(e.body,"</p>")+"</div>"})),d=new Garnish.HUD(c,'<h2 class="visually-hidden">'.concat(Craft.t("app","Announcements"),'</h2><div id="announcements" role="list">').concat(t,"</div>"),{onShow:function(){c.addClass("active")},onHide:function(){c.removeClass("active")}}),e()("a",d.$main).each((function(){this.hostname.length&&this.hostname!==location.hostname&&void 0===e()(this).attr("target")&&e()(this).attr("rel","noopener").attr("target","_blank")})),u&&(c.removeClass("unread"),h.remove(),Craft.sendActionRequest("POST","users/mark-announcements-as-read",{data:{ids:Craft.announcements.map((function(t){return t.id}))}}))}}))}var p=document.getElementById("footer");p&&new IntersectionObserver((function(t){var e=function(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var s,a,n=[],r=!0,o=!1;try{for(i=i.call(t);!(r=(s=i.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){o=!0,a=t}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n}}(t,e)||s(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(t,1)[0];e.target.classList.toggle("stuck",e.intersectionRatio<1)}),{rootMargin:"0px 0px -1px 0px",threshold:[1]}).observe(p)},get $contentHeader(){var t=e()("#content-header");return t.length?t:e()("<header/>",{id:"content-header",class:"pane-header"}).prependTo(e()("#content"))},get $noticeContainer(){var t=e()("#content-notice");return t.length?t:e()('<div id="content-notice"/>').attr("role","status").prependTo(this.$contentHeader)},initSpecialForms:function(){var t=this;if(this.$confirmUnloadForms=e()("form[data-confirm-unload]"),this.$deltaForms=e()("form[data-delta]"),this.$confirmUnloadForms.length){for(var i=this.$confirmUnloadForms.add(this.$deltaForms),s=function(e){var s=i.eq(e),a=void 0;s.data("initialSerializedValue")||(a="function"==typeof s.data("serializer")?s.data("serializer")():s.serialize(),s.data("initialSerializedValue",a)),t.addListener(s,"submit",(function(t){if(Garnish.hasAttr(s,"data-confirm-unload")&&this.removeListener(Garnish.$win,"beforeunload"),Garnish.hasAttr(s,"data-delta")){var e;t.preventDefault(),e="function"==typeof s.data("serializer")?s.data("serializer")():s.serialize();var i=Craft.findDeltaData(s.data("initialSerializedValue"),e,s.data("delta-names"),null,s.data("initial-delta-values"),s.data("modified-delta-names"));Craft.createForm(i).appendTo(Garnish.$bod).submit()}}))},a=0;a<i.length;a++)s(a);this.addListener(Garnish.$win,"beforeunload",(function(t){var e=!1;if(void 0!==Craft.livePreview&&Craft.livePreview.inPreviewMode)e=!0;else for(var i=0;i<this.$confirmUnloadForms.length;i++){var s,a=this.$confirmUnloadForms.eq(i);if(s="function"==typeof a.data("serializer")?a.data("serializer")():a.serialize(),a.data("initialSerializedValue")!==s){e=!0;break}}if(e){var n=Craft.t("app","Any changes will be lost if you leave this page.");return t?t.originalEvent.returnValue=n:window.event.returnValue=n,n}}))}},_handleInputFocus:function(){this.updateFixedHeader()},_handleInputBlur:function(){this.updateFixedHeader()},submitPrimaryForm:function(t){this.trigger("beforeSaveShortcut"),"object"===i(t)&&e().isPlainObject(t)||(t={}),t.redirect||(t.redirect=this.$primaryForm.data("saveshortcut-redirect")),t.data||(t.data={}),t.data.saveShortcut=!0,Craft.submitForm(this.$primaryForm,t)},updateSidebarMenuLabel:function(){this.updateContentHeading()},updateContentHeading:function(){var t=this.$sidebar.find("a.sel:first"),i=t.children(".label");e()("#content-heading").text(i.length?i.text():t.text()),Garnish.$bod.removeClass("showing-sidebar")},toggleNav:function(){var t=this.navIsExpanded();null!==t&&(t?(this.disableGlobalSidebarLinks(),this.$navToggle.focus(),this.$navToggle.attr("aria-expanded","false"),Garnish.$bod.removeClass("showing-nav")):(this.enableGlobalSidebarLinks(),this.$globalSidebar.find(":focusable")[0].focus(),this.$navToggle.attr("aria-expanded","true"),Garnish.$bod.addClass("showing-nav")))},enableGlobalSidebarLinks:function(){var t=this.$globalSidebar.find(":focusable");e()(t).each((function(){e()(this).attr("tabindex","0")}))},disableGlobalSidebarLinks:function(){var t=this.$globalSidebar.find(":focusable");e()(t).each((function(){e()(this).attr("tabindex","-1")}))},setSidebarNavAttributes:function(){var t=this.navIsExpanded();null!==t&&(t?this.enableGlobalSidebarLinks():this.disableGlobalSidebarLinks())},navIsExpanded:function(){if(!this.$globalSidebar[0])return null;var t=getComputedStyle(this.$globalSidebar[0]).getPropertyValue("--is-always-visible").trim();return"true"===this.$navToggle.attr("aria-expanded")||"true"===t},toggleSidebar:function(){var t="true"===this.$sidebarToggle.attr("aria-expanded")?"false":"true";this.$sidebarToggle.attr("aria-expanded",t),Garnish.$bod.toggleClass("showing-sidebar")},initTabs:function(){this.tabManager&&(this.tabManager.destroy(),this.tabManager=null);var t=e()("#tabs");t.length&&(this.tabManager=new Craft.Tabs(t),this.tabManager.on("selectTab",(function(t){var i=t.$tab.attr("href");if(i&&"#"===i.charAt(0)&&e()(i).removeClass("hidden"),Garnish.$win.trigger("resize"),Garnish.$doc.trigger("scroll"),i&&"#"===i.charAt(0)){var s=e()("#context-btn").menubtn().data("menubtn");if(s)for(var a=0;a<s.menu.$options.length;a++){var n=s.menu.$options[a];n.href&&(n.href=n.href.match(/^[^#]*/)[0]+i)}}"undefined"!=typeof history&&Garnish.requestAnimationFrame((function(){history.replaceState(void 0,void 0,i)}))})),this.tabManager.on("deselectTab",(function(t){var i=t.$tab.attr("href");i&&"#"===i.charAt(0)&&e()(t.$tab.attr("href")).addClass("hidden")})))},updateTabs:function(t){if(t){var i=e()(t).attr("id","tabs");this.tabManager?this.tabManager.$container.replaceWith(i):i.appendTo(this.$contentHeader),this.initTabs()}else this.tabManager&&(this.tabManager.$container.siblings().length?this.tabManager.$container.remove():this.tabManager.$container.parent().remove(),this.tabManager.destroy(),this.tabManager=null)},get $tabsContainer(){return this.tabManager?this.tabManager.$container:void 0},get $tabsList(){return this.tabManager?this.tabManager.$tablist:void 0},get $tabs(){return this.tabManager?this.tabManager.$tablist.find("> a"):void 0},get $selectedTab(){return this.tabManager?this.tabManager.$selectedTab:void 0},get selectedTabIndex(){return this.tabManager?this.tabManager.$tabs.index(this.tabManager.$selectedTab):void 0},get $focusableTab(){return this.tabManager?this.tabManager.$focusableTab:void 0},selectTab:function(t){this.tabManager&&this.tabManager.selectTab(t)},deselectTab:function(){this.tabManager&&this.tabManager.deselectTab()},handleWindowResize:function(){this.updateResponsiveTables(),this.handleBreadcrumbVisibility()},breadcrumbItemsWrap:function(){if(this.$breadcrumbItems[0]){this.$breadcrumbList.css("ltr"===Craft.orientation?"margin-right":"margin-left","");for(var t=this.$breadcrumbList[0].getBoundingClientRect().width,e=0,i=this.$breadcrumbList.find("li"),s=0;s<i.length;s++)e+=i.get(s).getBoundingClientRect().width;return this.breadcrumbListWidth=t,!(e<=t||e<t+1&&(this.$breadcrumbList.css("ltr"===Craft.orientation?"margin-right":"margin-left","-1px"),1))}},handleBreadcrumbVisibility:function(){if(this.breadcrumbItemsWrap()){0===this.$breadcrumbList.find("[data-disclosure-item]").length&&this.$breadcrumbList.append(this.breadcrumbDisclosureItem);var t,e=this.$breadcrumbList.find("[data-disclosure-item]")[0].offsetWidth,i=this.breadcrumbListWidth;this.$breadcrumbItems.each((function(s){if(!(e+this.offsetWidth<i))return!1;t=s,e+=this.offsetWidth}));var s=this.$breadcrumbItems.slice(0,t+1),a=this.$breadcrumbItems.slice(t+1);this.$breadcrumbList.html(""),this.$breadcrumbList.append(s),this.$breadcrumbList.append(this.breadcrumbDisclosureItem),this.$breadcrumbList.find("[data-disclosure-menu] ul").append(a),this.$breadcrumbList.find("[data-disclosure-trigger]").disclosureMenu()}},updateResponsiveTables:function(){for(this.updateResponsiveTables._i=0;this.updateResponsiveTables._i<this.$collapsibleTables.length;this.updateResponsiveTables._i++)this.updateResponsiveTables._$table=this.$collapsibleTables.eq(this.updateResponsiveTables._i),this.updateResponsiveTables._containerWidth=this.updateResponsiveTables._$table.parent().width(),this.updateResponsiveTables._check=!1,this.updateResponsiveTables._containerWidth>0&&(void 0===this.updateResponsiveTables._$table.data("lastContainerWidth")?this.updateResponsiveTables._check=!0:(this.updateResponsiveTables._isCollapsed=this.updateResponsiveTables._$table.hasClass("collapsed"),this.updateResponsiveTables._containerWidth>this.updateResponsiveTables._$table.data("lastContainerWidth")?this.updateResponsiveTables._isCollapsed&&(this.updateResponsiveTables._$table.removeClass("collapsed"),this.updateResponsiveTables._check=!0):this.updateResponsiveTables._isCollapsed||(this.updateResponsiveTables._check=!0)),this.updateResponsiveTables._check&&this.updateResponsiveTables._$table.width()-30>this.updateResponsiveTables._containerWidth&&this.updateResponsiveTables._$table.addClass("collapsed"),this.updateResponsiveTables._$table.data("lastContainerWidth",this.updateResponsiveTables._containerWidth))},updateFixedHeader:function(){if(!this.isMobile)if(this.$main.length&&this.$headerContainer[0].getBoundingClientRect().top<0){if(!this.fixedHeader){var t=this.$headerContainer.height();this.$contentContainer.css("min-height","calc(100vh - "+(t+14+48-1)+"px)"),this.$headerContainer.height(t),Garnish.$bod.addClass("fixed-header"),this.$contentContainer.outerHeight(),this.$details.outerHeight();var e={top:t+"px","max-height":"calc(100vh - "+t+"px)"};this.$sidebar.addClass("fixed").css(e),this.$details.addClass("fixed").css(e),this.fixedHeader=!0}}else this.fixedHeader&&(this.$headerContainer.height("auto"),Garnish.$bod.removeClass("fixed-header"),this.$contentContainer.css("min-height",""),this.$sidebar.removeClass("fixed").css({top:"","max-height":""}),this.$details.removeClass("fixed").css({top:"","max-height":""}),this.fixedHeader=!1)},displayNotification:function(t,e,i){var s=new Craft.CP.Notification(t,e,i);return this.trigger("displayNotification",{notificationType:t,message:e,notification:s}),s},displayNotice:function(t,e){return this.displayNotification("notice",t,Object.assign({icon:"info",iconLabel:Craft.t("app","Notice")},e))},displaySuccess:function(t,e){return this.displayNotification("success",t,Object.assign({icon:"check",iconLabel:Craft.t("app","Success")},e))},displayError:function(t,e){return t&&"object"!==i(t)||(e=t,t=Craft.t("app","A server error occurred.")),this.displayNotification("error",t,Object.assign({icon:"alert",iconLabel:Craft.t("app","Error")},e))},fetchAlerts:function(){return Craft.queue.push((function(){return new Promise((function(t,e){var i={path:Craft.path};Craft.sendActionRequest("POST","app/get-cp-alerts",{data:i}).then((function(e){var i=e.data;t(i.alerts)})).catch(e)}))}))},displayAlerts:function(t){if(this.$alerts.remove(),Garnish.isArray(t)&&t.length){this.$alerts=e()('<ul id="alerts"/>').prependTo(e()("#page-container"));for(var i=0;i<t.length;i++)e()('<li><span data-icon="alert" aria-label="'.concat(Craft.t("app","Error"),'"></span> ').concat(t[i],"</li>")).appendTo(this.$alerts);var s=this.$alerts.outerHeight();this.$alerts.css("margin-top",-s).velocity({"margin-top":0},"fast"),this.initAlerts()}},initAlerts:function(){for(var t=this,i=this.$alerts.find('a[class^="shun:"]'),s=0;s<i.length;s++)this.addListener(i[s],"click",(function(i){i.preventDefault(),Craft.queue.push((function(){return new Promise((function(s,a){var n=e()(i.currentTarget),r={message:n.prop("className").substring(5)};Craft.sendActionRequest("POST","app/shun-cp-alert",{data:r}).then((function(){n.parent().remove(),s()})).catch((function(e){var i=e.response;t.displayError(i.data.message),a()}))}))}))}))},checkForUpdates:function(t,e,i){var s=this;if("function"==typeof e&&(i=e,e=!1),this.checkingForUpdates&&(!0===t&&!this.forcingRefreshOnUpdatesCheck||!0===e&&!this.includingDetailsOnUpdatesCheck)){var a=i;i=function(){s.checkForUpdates(t,e,a)}}"function"==typeof i&&(Garnish.isArray(this.checkForUpdatesCallbacks)||(this.checkForUpdatesCallbacks=[]),this.checkForUpdatesCallbacks.push(i)),this.checkingForUpdates||(this.checkingForUpdates=!0,this.forcingRefreshOnUpdatesCheck=!0===t,this.includingDetailsOnUpdatesCheck=!0===e,this._checkForUpdates(t,e).then((function(t){if(s.updateUtilitiesBadge(),s.checkingForUpdates=!1,Garnish.isArray(s.checkForUpdatesCallbacks)){var e=s.checkForUpdatesCallbacks;s.checkForUpdatesCallbacks=null;for(var i=0;i<e.length;i++)e[i](t)}s.trigger("checkForUpdates",{updateInfo:t})})))},_checkForUpdates:function(t,e){var i=this;return new Promise((function(s,a){t?i._getUpdates(e).then(s).catch(a):i._checkForCachedUpdates(e).then((function(t){t.cached?s(t):i._getUpdates(e).then((function(t){s(t)}))})).catch(a)}))},_checkForCachedUpdates:function(t){return new Promise((function(e,i){var s={onlyIfCached:!0,includeDetails:t};Craft.sendActionRequest("POST","app/check-for-updates",{data:s}).then((function(t){var i=t.data;e(i)})).catch((function(){e({cached:!1})}))}))},_getUpdates:function(t){var e=this;return new Promise((function(i,s){Craft.sendApiRequest("GET","updates").then((function(s){e._cacheUpdates(s,t).then((function(t){i(t)}))})).catch(s)}))},_cacheUpdates:function(t,e){return new Promise((function(i,s){var a={updates:t,includeDetails:e};Craft.sendActionRequest("POST","app/cache-updates",{data:a}).then((function(t){var e=t.data;i(e)})).catch(s)}))},updateUtilitiesBadge:function(){var t=e()("#nav-utilities").find("> a:not(.sel)");t.length&&Craft.queue.push((function(){return new Promise((function(i,s){Craft.sendActionRequest("POST","app/get-utilities-badge-count").then((function(s){var a=s.data,n=t.children(".badge"),r=t.children("[data-notification]");a.badgeCount?(n.length||(n=e()('<span class="badge" aria-hidden="true"/>').appendTo(t)),r.length||(r=e()('<span class="visually-hidden" data-notification/>').appendTo(t)),n.text(a.badgeCount),r.text(Craft.t("app","{num, number} {num, plural, =1{notification} other{notifications}}",{num:a.badgeCount}))):n.length&&r.length&&(n.remove(),r.remove()),i()})).catch(s)}))}))},runQueue:function(){var t=this;this.enableQueue&&(Craft.runQueueAutomatically?Craft.queue.push((function(){return new Promise((function(e,i){Craft.sendActionRequest("POST","queue/run").then((function(){t.trackJobProgress(!1,!0),e()})).catch(i)}))})):this.trackJobProgress(!1,!0))},trackJobProgress:function(t,e){if(e&&this.trackJobProgressTimeout&&(clearTimeout(this.trackJobProgressTimeout),this.trackJobProgressTimeout=null),!this.trackJobProgressTimeout&&this.enableQueue)if(!0===t){var i=Math.min(6e4,500*this.displayedJobInfoUnchanged);this.trackJobProgressTimeout=setTimeout(this._trackJobProgressInternal.bind(this),i)}else this._trackJobProgressInternal()},_trackJobProgressInternal:function(){var t=this;Craft.queue.push((function(){return new Promise((function(e,i){Craft.sendActionRequest("POST","queue/get-job-info?limit=50&dontExtendSession=1").then((function(i){var s=i.data;t.trackJobProgressTimeout=null,t.totalJobs=s.total,t.setJobInfo(s.jobs),t.jobInfo.length&&t.trackJobProgress(!0),e()})).catch(i)}))}))},setJobInfo:function(t){if(this.enableQueue){this.jobInfo=t;var e=this.displayedJobInfo;this.displayedJobInfo=this.getDisplayedJobInfo(),e&&this.displayedJobInfo&&e.id===this.displayedJobInfo.id&&e.progress===this.displayedJobInfo.progress&&e.progressLabel===this.displayedJobInfo.progressLabel&&e.status===this.displayedJobInfo.status?this.displayedJobInfoUnchanged++:this.displayedJobInfoUnchanged=1,this.updateJobIcon(),this.trigger("setJobInfo")}},getDisplayedJobInfo:function(){if(!this.enableQueue)return null;for(var t=[Craft.CP.JOB_STATUS_RESERVED,Craft.CP.JOB_STATUS_FAILED,Craft.CP.JOB_STATUS_WAITING],e=0;e<t.length;e++)for(var i=0;i<this.jobInfo.length;i++)if(this.jobInfo[i].status===t[e]&&(t[e]!==Craft.CP.JOB_STATUS_WAITING||!this.jobInfo[i].delay))return this.jobInfo[i];return null},updateJobIcon:function(){this.enableQueue&&this.$nav.length&&(this.displayedJobInfo?(this.jobProgressIcon||(this.jobProgressIcon=new n),this.displayedJobInfo.status===Craft.CP.JOB_STATUS_RESERVED||this.displayedJobInfo.status===Craft.CP.JOB_STATUS_WAITING?(this.jobProgressIcon.hideFailMode(),this.jobProgressIcon.setDescription(this.displayedJobInfo.description,this.displayedJobInfo.progressLabel),this.jobProgressIcon.setProgress(this.displayedJobInfo.progress)):this.displayedJobInfo.status===Craft.CP.JOB_STATUS_FAILED&&this.jobProgressIcon.showFailMode(Craft.t("app","Failed"))):this.jobProgressIcon&&(this.jobProgressIcon.hideFailMode(),this.jobProgressIcon.complete(),delete this.jobProgressIcon))},getSiteId:function(){var t=Craft.getLocalStorage("BaseElementIndex.siteId");if(void 0!==t){Craft.removeLocalStorage("BaseElementIndex.siteId");try{this.setSiteId(t)}catch(t){}}return Craft.siteId},setSiteId:function(t){var i=Craft.sites.find((function(e){return e.id===t}));if(!i)throw"Invalid site ID: ".concat(t);Craft.siteId=t,Craft.actionUrl=Craft.getUrl(Craft.actionUrl,{site:i.handle}),Craft.baseCpUrl=Craft.getUrl(Craft.baseCpUrl,{site:i.handle}),Craft.baseUrl=Craft.getUrl(Craft.baseUrl,{site:i.handle});var a=Craft.getUrl(document.location.href,{site:i.handle});history.replaceState({},"",a);var n,r=function(t,e){var i="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!i){if(Array.isArray(t)||(i=s(t))){i&&(t=i);var a=0,n=function(){};return{s:n,n:function(){return a>=t.length?{done:!0}:{done:!1,value:t[a++]}},e:function(t){throw t},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){i=i.call(t)},n:function(){var t=i.next();return o=t.done,t},e:function(t){l=!0,r=t},f:function(){try{o||null==i.return||i.return()}finally{if(l)throw r}}}}(document.body.classList);try{for(r.s();!(n=r.n()).done;){var o=n.value;o.match(/^site--/)&&document.body.classList.remove(o)}}catch(t){r.e(t)}finally{r.f()}document.body.classList.add("site--".concat(i.handle)),e()("a").each((function(){this.hostname.length&&this.hostname===location.hostname&&-1!==this.href.indexOf(Craft.cpTrigger)&&(this.href=Craft.getUrl(this.href,{site:i.handle}))}))}},{notificationDuration:5e3,JOB_STATUS_WAITING:1,JOB_STATUS_RESERVED:2,JOB_STATUS_DONE:3,JOB_STATUS_FAILED:4}),Craft.CP.Notification=Garnish.Base.extend({type:null,message:null,settings:null,closing:!1,closeTimeout:null,_preventDelayedClose:!1,$container:null,$closeBtn:null,originalActiveElement:null,init:function(t,i,s){var a=this;this.type=t,this.message=i,this.settings=s||{},this.$container=e()("<div/>",{class:"notification","data-type":this.type}).appendTo(Craft.cp.$notificationContainer);var n=e()('<div class="notification-body"/>').appendTo(this.$container).attr("role","status");if(this.settings.icon){var r=e()("<span/>",{class:"notification-icon","data-icon":this.settings.icon}).appendTo(n);this.settings.iconLabel?r.attr({"aria-label":this.settings.iconLabel,role:"img"}):r.attr("aria-hidden","true")}var o=e()('<div class="notification-main"/>').appendTo(n);e()("<div/>",{class:"notification-message",text:this.message}).appendTo(o);var l=e()("<div/>").appendTo(this.$container);this.$closeBtn=e()("<button/>",{type:"button",class:"notification-close-btn","aria-label":Craft.t("app","Close"),"data-icon":"remove"}).appendTo(l),this.settings.details&&e()('<div class="notification-details"/>').append(this.settings.details).appendTo(o).find("button,input").length&&(Garnish.uiLayerManager.addLayer(this.$container),Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY,(function(){a.close()})),this.originalActiveElement=document.activeElement,this.$container.attr("tabindex","-1").focus(),this.$container.on("keydown",(function(t){t.keyCode===Garnish.ESC_KEY&&(t.stopPropagation(),a.close())}))),this.$container.css({opacity:0,"margin-bottom":this._negMargin()}).velocity({opacity:1,"margin-bottom":0},{duration:"fast"}),Craft.initUiElements(this.$container),this.addListener(this.$closeBtn,"click","close"),Craft.notificationDuration&&this._initDelayedClose()},_initDelayedClose:function(){var t=this;this._preventDelayedClose||(Craft.isVisible()?(this.delayedClose(),this.$container.on("keypress keyup change focus blur click mousedown mouseup",(function(e){e.target!=t.$closeBtn[0]&&(t.$container.off("keypress keyup change focus blur click mousedown mouseup"),t.preventDelayedClose())}))):Garnish.$doc.one("visibilitychange",(function(){t._initDelayedClose()})))},_negMargin:function(){return"-".concat(this.$container.outerHeight()+12,"px")},close:function(){var t=this;this.closing||(this.closeTimeout&&(clearTimeout(this.closeTimeout),this.closeTimeout=null),this.closing=!0,this.originalActiveElement&&document.activeElement&&(document.activeElement===this.$container[0]||e().contains(this.$container[0],document.activeElement))&&e()(this.originalActiveElement).focus(),this.$container.velocity({opacity:0,"margin-bottom":this._negMargin()},{duration:"fast",complete:function(){t.$container.remove()}}))},delayedClose:function(){var t=this;this.closeTimeout=setTimeout((function(){t.close()}),Craft.notificationDuration),this.$container.one("mouseover",(function(){clearTimeout(t.closeTimeout),t.closeTimeout=null,t.$container.on("mouseout",(function(e){e.target==t.$container[0]&&(t.$container.off("mouseout"),t.delayedClose())}))}))},preventDelayedClose:function(){this._preventDelayedClose=!0,this.closeTimeout&&(clearTimeout(this.closeTimeout),this.closeTimeout=null),this.$container.off("mouseover mouseout")}}),Garnish.$scrollContainer=Garnish.$win,Craft.cp=new Craft.CP;var n=Garnish.Base.extend({$li:null,$a:null,$label:null,$progressLabel:null,progress:null,failMode:!1,_$bgCanvas:null,_$staticCanvas:null,_$hoverCanvas:null,_$failCanvas:null,_staticCtx:null,_hoverCtx:null,_canvasSize:null,_arcPos:null,_arcRadius:null,_lineWidth:null,_arcStartPos:0,_arcEndPos:0,_arcStartStepSize:null,_arcEndStepSize:null,_arcStep:null,_arcStepTimeout:null,_arcAnimateCallback:null,_progressBar:null,init:function(){this.$li=e()("<li/>").appendTo(Craft.cp.$nav.children("ul")),this.$a=e()("<a/>",{id:"job-icon",href:Craft.canAccessQueueManager?Craft.getUrl("utilities/queue-manager"):null}).appendTo(this.$li),this.$canvasContainer=e()('<span class="icon"/>').appendTo(this.$a);var t=e()('<span class="label"/>').appendTo(this.$a);this.$label=e()("<span/>").appendTo(t),this.$progressLabel=e()('<span class="progress-label"/>').appendTo(t).hide();var i=window.devicePixelRatio>1?2:1;this._canvasSize=18*i,this._arcPos=this._canvasSize/2,this._arcRadius=7*i,this._lineWidth=3*i,this._$bgCanvas=this._createCanvas("bg","#61666b"),this._$staticCanvas=this._createCanvas("static","#d7d9db"),this._$hoverCanvas=this._createCanvas("hover","#fff"),this._$failCanvas=this._createCanvas("fail","#da5a47").hide(),this._staticCtx=this._$staticCanvas[0].getContext("2d"),this._hoverCtx=this._$hoverCanvas[0].getContext("2d"),this._drawArc(this._$bgCanvas[0].getContext("2d"),0,1),this._drawArc(this._$failCanvas[0].getContext("2d"),0,1)},setDescription:function(t,e){this.$a.attr("title",t),this.$label.text(t),e?this.$progressLabel.text(e).show():this.$progressLabel.hide()},setProgress:function(t){0==t?(this._$staticCanvas.hide(),this._$hoverCanvas.hide()):(this._$staticCanvas.show(),this._$hoverCanvas.show(),this.progress&&t>this.progress?this._animateArc(0,t/100):this._setArc(0,t/100)),this.progress=t},complete:function(){var t=this;this._animateArc(0,1,(function(){t._$bgCanvas.velocity("fadeOut"),t._animateArc(1,1,(function(){t.$a.remove(),t.destroy()}))}))},showFailMode:function(t){this.failMode||(this.failMode=!0,this.progress=null,this._$bgCanvas.hide(),this._$staticCanvas.hide(),this._$hoverCanvas.hide(),this._$failCanvas.show(),this.setDescription(t))},hideFailMode:function(){this.failMode&&(this.failMode=!1,this._$bgCanvas.show(),this._$staticCanvas.show(),this._$hoverCanvas.show(),this._$failCanvas.hide())},_createCanvas:function(t,i){var s=e()('<canvas id="job-icon-'+t+'" width="'+this._canvasSize+'" height="'+this._canvasSize+'"/>').appendTo(this.$canvasContainer),a=s[0].getContext("2d");return a.strokeStyle=i,a.lineWidth=this._lineWidth,a.lineCap="round",s},_setArc:function(t,e){this._arcStartPos=t,this._arcEndPos=e,this._drawArc(this._staticCtx,t,e),this._drawArc(this._hoverCtx,t,e)},_drawArc:function(t,e,i){t.clearRect(0,0,this._canvasSize,this._canvasSize),t.beginPath(),t.arc(this._arcPos,this._arcPos,this._arcRadius,(1.5+2*e)*Math.PI,(1.5+2*i)*Math.PI),t.stroke(),t.closePath()},_animateArc:function(t,e,i){this._arcStepTimeout&&clearTimeout(this._arcStepTimeout),this._arcStep=0,this._arcStartStepSize=(t-this._arcStartPos)/10,this._arcEndStepSize=(e-this._arcEndPos)/10,this._arcAnimateCallback=i,this._takeNextArcStep()},_takeNextArcStep:function(){this._setArc(this._arcStartPos+this._arcStartStepSize,this._arcEndPos+this._arcEndStepSize),this._arcStep++,this._arcStep<10?this._arcStepTimeout=setTimeout(this._takeNextArcStep.bind(this),50):this._arcAnimateCallback&&this._arcAnimateCallback()}});__webpack_require__(3778),__webpack_require__(6617),__webpack_require__(9482),__webpack_require__(3352),__webpack_require__(691),__webpack_require__(1519),__webpack_require__(501),__webpack_require__(2318),__webpack_require__(4755),__webpack_require__(8468),__webpack_require__(5049),__webpack_require__(7998),__webpack_require__(8895),__webpack_require__(4233),__webpack_require__(9699),__webpack_require__(1402),__webpack_require__(8201),__webpack_require__(3347),__webpack_require__(9478),__webpack_require__(2387),__webpack_require__(7966),__webpack_require__(657),__webpack_require__(4487),__webpack_require__(6966),__webpack_require__(5080),__webpack_require__(7439),__webpack_require__(5328),__webpack_require__(6419),__webpack_require__(872),__webpack_require__(1396),__webpack_require__(4070),__webpack_require__(5763),__webpack_require__(5185),__webpack_require__(8030),__webpack_require__(3096),__webpack_require__(3331),__webpack_require__(53),__webpack_require__(5074),__webpack_require__(3958),__webpack_require__(1592),__webpack_require__(1752),__webpack_require__(7e3),__webpack_require__(8654)}()})(); //# sourceMappingURL=cp.js.map \ No newline at end of file diff --git a/src/web/assets/cp/dist/cp.js.map b/src/web/assets/cp/dist/cp.js.map index 36e56d4de0e..115f71ccb4b 100644 --- a/src/web/assets/cp/dist/cp.js.map +++ b/src/web/assets/cp/dist/cp.js.map @@ -1 +1 @@ -{"version":3,"file":"cp.js","mappings":"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","sources":["webpack:///./js/Accordion.js","webpack:///./js/AddressesInput.js","webpack:///./js/AdminTable.js","webpack:///./js/AssetImageEditor.js","webpack:///./js/AssetIndex.js","webpack:///./js/AssetSelectInput.js","webpack:///./js/AssetSelectorModal.js","webpack:///./js/AuthManager.js","webpack:///./js/BaseElementIndex.js","webpack:///./js/BaseElementIndexView.js","webpack:///./js/BaseElementSelectInput.js","webpack:///./js/BaseElementSelectorModal.js","webpack:///./js/BaseInputGenerator.js","webpack:///./js/CategoryIndex.js","webpack:///./js/CategorySelectInput.js","webpack:///./js/Chart.js","webpack:///./js/ColorInput.js","webpack:///./js/CpScreenSlideout.js","webpack:///./js/Craft.js","webpack:///./js/CustomizeSourcesModal.js","webpack:///./js/DataTableSorter.js","webpack:///./js/DeleteUserModal.js","webpack:///./js/DynamicGenerator.js","webpack:///./js/EditableTable.js","webpack:///./js/ElementActionTrigger.js","webpack:///./js/ElementEditor.js","webpack:///./js/ElementEditorSlideout.js","webpack:///./js/ElementFieldSettings.js","webpack:///./js/ElementThumbLoader.js","webpack:///./js/ElevatedSessionForm.js","webpack:///./js/ElevatedSessionManager.js","webpack:///./js/EntryIndex.js","webpack:///./js/FieldLayoutDesigner.js","webpack:///./js/FieldToggle.js","webpack:///./js/Grid.js","webpack:///./js/HandleGenerator.js","webpack:///./js/ImageUpload.js","webpack:///./js/InfoIcon.js","webpack:///./js/LightSwitch.js","webpack:///./js/Listbox.js","webpack:///./js/LivePreview.js","webpack:///./js/PasswordInput.js","webpack:///./js/Preview.js","webpack:///./js/PreviewFileModal.js","webpack:///./js/ProgressBar.js","webpack:///./js/PromptHandler.js","webpack:///./js/Queue.js","webpack:///./js/SlidePicker.js","webpack:///./js/SlideRuleInput.js","webpack:///./js/Slideout.js","webpack:///./js/SlugGenerator.js","webpack:///./js/Structure.js","webpack:///./js/StructureDrag.js","webpack:///./js/StructureTableSorter.js","webpack:///./js/TableElementIndexView.js","webpack:///./js/Tabs.js","webpack:///./js/TagSelectInput.js","webpack:///./js/ThumbsElementIndexView.js","webpack:///./js/UI.js","webpack:///./js/Uploader.js","webpack:///./js/UriFormatGenerator.js","webpack:///./js/UserIndex.js","webpack:///./css/charts.scss?4afb","webpack:///./css/craft.scss?1b58","webpack:///../../../../../node_modules/vue-style-loader/lib/listToStyles.js","webpack:///../../../../../node_modules/vue-style-loader/lib/addStylesClient.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///external var \"jQuery\"","webpack:///./js/CP.js"],"sourcesContent":["/** global: Craft */\n/** global: Garnish */\n/**\n * Accordion\n */\nCraft.Accordion = Garnish.Base.extend({\n $trigger: null,\n targetSelector: null,\n\n _$target: null,\n\n init: function (trigger) {\n this.$trigger = $(trigger);\n\n // Is this already an accordion trigger?\n if (this.$trigger.data('accordion')) {\n console.warn('Double-instantiating an accordion trigger on an element');\n this.$trigger.data('accordion').destroy();\n }\n\n this.$trigger.data('accordion', this);\n this.targetSelector = this.$trigger.attr('aria-controls')\n ? `#${this.$trigger.attr('aria-controls')}`\n : null;\n\n if (this.targetSelector) {\n this._$target = $(this.targetSelector);\n }\n\n this.addListener(this.$trigger, 'click', 'onTriggerClick');\n this.addListener(this.$trigger, 'keypress', (event) => {\n const key = event.keyCode;\n\n if (key === Garnish.SPACE_KEY || key === Garnish.RETURN_KEY) {\n event.preventDefault();\n this.onTriggerClick();\n }\n });\n },\n\n onTriggerClick: function () {\n const isOpen = this.$trigger.attr('aria-expanded') === 'true';\n\n if (isOpen) {\n this.hideTarget(this._$target);\n } else {\n this.showTarget(this._$target);\n }\n },\n\n showTarget: function ($target) {\n if ($target && $target.length) {\n this.showTarget._currentHeight = $target.height();\n\n $target.removeClass('hidden');\n\n this.$trigger\n .removeClass('collapsed')\n .addClass('expanded')\n .attr('aria-expanded', 'true');\n\n for (let i = 0; i < $target.length; i++) {\n (($t) => {\n if ($t.prop('nodeName') !== 'SPAN') {\n $t.height('auto');\n this.showTarget._targetHeight = $t.height();\n $t.css({\n height: this.showTarget._currentHeight,\n overflow: 'hidden',\n });\n\n $t.velocity('stop');\n\n $t.velocity(\n {height: this.showTarget._targetHeight},\n Garnish.getUserPreferredAnimationDuration('fast'),\n function () {\n $t.css({\n height: '',\n overflow: '',\n });\n }\n );\n }\n })($target.eq(i));\n }\n\n delete this.showTarget._targetHeight;\n delete this.showTarget._currentHeight;\n\n // Trigger a resize event in case there are any grids in the target that need to initialize\n Garnish.$win.trigger('resize');\n }\n },\n\n hideTarget: function ($target) {\n if ($target && $target.length) {\n this.$trigger\n .removeClass('expanded')\n .addClass('collapsed')\n .attr('aria-expanded', 'false');\n\n for (let i = 0; i < $target.length; i++) {\n (($t) => {\n if ($t.hasClass('hidden')) {\n return;\n }\n if ($t.prop('nodeName') === 'SPAN') {\n $t.addClass('hidden');\n } else {\n $t.css('overflow', 'hidden');\n $t.velocity('stop');\n $t.velocity(\n {height: 0},\n Garnish.getUserPreferredAnimationDuration('fast'),\n function () {\n $t.addClass('hidden');\n }\n );\n }\n })($target.eq(i));\n }\n }\n },\n\n destroy: function () {\n this.$trigger.removeData('accordion');\n this.base();\n },\n});\n","/** global: Craft */\n\n/**\n * AddressInput class\n */\nCraft.AddressesInput = Garnish.Base.extend(\n {\n $container: null,\n $addBtn: null,\n $addBtnItem: null,\n $cards: null,\n\n init: function (container, settings) {\n this.$container = $(container);\n this.setSettings(settings, Craft.AddressesInput.defaults);\n\n // Is this already an address input?\n if (this.$container.data('addresses')) {\n console.warn('Double-instantiating an address input on an element');\n this.$container.data('addresses').destroy();\n }\n\n this.$container.data('addresses', this);\n\n this.$addBtn = this.$container.find('.address-cards__add-btn');\n this.$addBtnItem = this.$addBtn.closest('li');\n this.$cards = this.$container.find('> .address-card');\n\n for (let i = 0; i < this.$cards.length; i++) {\n this.initCard(this.$cards.eq(i));\n }\n\n this.updateAddButton();\n\n this.addListener(this.$addBtn, 'click', () => {\n this.createAddress();\n });\n },\n\n initCard: function ($card) {\n this.addListener($card, 'click', (ev) => {\n if (!$(ev.target).closest('.menubtn').length) {\n this.editAddress($card);\n }\n });\n\n const $actionBtn = $card.find('.menubtn').disclosureMenu();\n if ($actionBtn.length) {\n const menu = $actionBtn.data('trigger');\n const $menu = menu.$container;\n\n // Activate edit button\n const $editBtn = $menu.find('[data-action=\"edit\"]');\n this.addListener($editBtn, 'click', (ev) => {\n ev.stopPropagation();\n this.editAddress($card);\n });\n\n // Activate delete button\n const $deleteBtn = $menu.find('[data-action=\"delete\"]');\n this.addListener($deleteBtn, 'click', (ev) => {\n ev.preventDefault();\n ev.stopPropagation();\n if (\n confirm(\n Craft.t('app', 'Are you sure you want to delete this address?')\n )\n ) {\n this.$addBtn.addClass('loading');\n const addressId = $card.data('id');\n const draftId = $card.data('draft-id');\n Craft.sendActionRequest('POST', 'elements/delete', {\n data: {\n elementId: addressId,\n draftId: draftId,\n },\n })\n .then(() => {\n $card.remove();\n $menu.remove();\n menu.destroy();\n this.$cards = this.$cards.not($card);\n this.updateAddButton();\n\n this.trigger('deleteAddress', {\n addressId,\n draftId,\n });\n })\n .finally(() => {\n this.$addBtn.removeClass('loading');\n });\n }\n });\n }\n },\n\n editAddress: function ($card, settings) {\n const slideout = Craft.createElementEditor(\n 'craft\\\\elements\\\\Address',\n $card,\n settings\n );\n\n slideout.on('submit', (ev) => {\n this.trigger('saveAddress', {\n data: ev.data,\n });\n\n Craft.sendActionRequest('POST', 'addresses/card-html', {\n data: {\n addressId: ev.data.id,\n },\n }).then((response) => {\n const $newCard = $(response.data.html);\n if ($card) {\n $card.replaceWith($newCard);\n this.$cards = this.$cards.not($card);\n } else {\n $newCard.insertBefore(this.$addBtnItem);\n }\n Craft.initUiElements($newCard);\n this.initCard($newCard);\n this.$cards = this.$cards.add($newCard);\n this.updateAddButton();\n });\n });\n },\n\n updateAddButton: function () {\n if (this.canCreateAddress()) {\n this.$addBtn.removeClass('hidden');\n } else {\n this.$addBtn.addClass('hidden');\n }\n },\n\n canCreateAddress: function () {\n return (\n !this.settings.maxAddresses ||\n this.$cards.length < this.settings.maxAddresses\n );\n },\n\n createAddress: function () {\n if (!this.canCreateAddress()) {\n throw 'No more addresses can be created.';\n }\n\n this.$addBtn.addClass('loading');\n\n Craft.sendActionRequest('POST', 'elements/create', {\n data: {\n elementType: 'craft\\\\elements\\\\Address',\n ownerId: this.settings.ownerId,\n },\n })\n .then((ev) => {\n this.editAddress(null, {\n elementId: ev.data.element.id,\n draftId: ev.data.element.draftId,\n });\n })\n .finally(() => {\n this.$addBtn.removeClass('loading');\n });\n },\n\n destroy: function () {\n this.$container.removeData('addresses');\n this.base();\n },\n },\n {\n ownerId: null,\n defaults: {\n maxAddresses: null,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Admin table class\n */\nCraft.AdminTable = Garnish.Base.extend(\n {\n settings: null,\n totalItems: null,\n sorter: null,\n\n $noItems: null,\n $table: null,\n $tbody: null,\n $deleteBtns: null,\n\n init: function (settings) {\n this.setSettings(settings, Craft.AdminTable.defaults);\n\n if (!this.settings.allowDeleteAll) {\n this.settings.minItems = 1;\n }\n\n this.$noItems = $(this.settings.noItemsSelector);\n this.$table = $(this.settings.tableSelector);\n this.$tbody = this.$table.children('tbody');\n this.totalItems = this.$tbody.children().length;\n\n if (this.settings.sortable) {\n this.sorter = new Craft.DataTableSorter(this.$table, {\n onSortChange: this.reorderItems.bind(this),\n });\n }\n\n this.$deleteBtns = this.$table.find('.delete:not(.disabled)');\n this.addListener(this.$deleteBtns, 'click', 'handleDeleteBtnClick');\n this.addListener(this.$deleteBtns, 'keydown', (event) => {\n if (\n event.keyCode === Garnish.SPACE_KEY ||\n event.keyCode === Garnish.RETURN_KEY\n ) {\n event.preventDefault();\n this.handleDeleteBtnClick(event);\n }\n });\n\n this.updateUI();\n },\n\n addRow: function (row) {\n if (this.settings.maxItems && this.totalItems >= this.settings.maxItems) {\n // Sorry pal.\n return;\n }\n\n var $row = $(row).appendTo(this.$tbody),\n $deleteBtn = $row.find('.delete');\n\n if (this.settings.sortable) {\n this.sorter.addItems($row);\n }\n\n this.$deleteBtns = this.$deleteBtns.add($deleteBtn);\n\n this.addListener($deleteBtn, 'click', 'handleDeleteBtnClick');\n this.totalItems++;\n\n this.updateUI();\n },\n\n reorderItems: function () {\n if (!this.settings.sortable) {\n return;\n }\n\n // Get the new field order\n var ids = [];\n\n for (var i = 0; i < this.sorter.$items.length; i++) {\n var id = $(this.sorter.$items[i]).attr(this.settings.idAttribute);\n ids.push(id);\n }\n\n // Send it to the server\n var data = {\n ids: JSON.stringify(ids),\n };\n\n Craft.sendActionRequest('POST', this.settings.reorderAction, {data})\n .then((response) => {\n this.onReorderItems(ids);\n Craft.cp.displaySuccess(\n Craft.t('app', this.settings.reorderSuccessMessage)\n );\n })\n .catch(({response}) => {\n Craft.cp.displayError(\n Craft.t('app', this.settings.reorderFailMessage)\n );\n });\n },\n\n handleDeleteBtnClick: function (event) {\n if (this.settings.minItems && this.totalItems <= this.settings.minItems) {\n // Sorry pal.\n return;\n }\n\n var $row = $(event.target).closest('tr');\n\n if (this.confirmDeleteItem($row)) {\n this.deleteItem($row);\n }\n },\n\n confirmDeleteItem: function ($row) {\n if (!this.settings.confirmDeleteMessage) {\n return true;\n }\n\n var name = this.getItemName($row);\n return confirm(\n Craft.t('app', this.settings.confirmDeleteMessage, {name})\n );\n },\n\n deleteItem: function ($row) {\n var data = {\n id: this.getItemId($row),\n };\n\n Craft.sendActionRequest('POST', this.settings.deleteAction, {data})\n .then((response) => this.handleDeleteItemSuccess(response.data, $row))\n .catch(({response}) =>\n this.handleDeleteItemFailure(response.data, $row)\n );\n },\n\n handleDeleteItemFailure: function (data, $row) {\n var id = this.getItemId($row),\n name = this.getItemName($row);\n\n Craft.cp.displayError(\n Craft.t('app', this.settings.deleteFailMessage, {name})\n );\n },\n\n handleDeleteItemSuccess: function (data, $row) {\n var id = this.getItemId($row),\n name = this.getItemName($row);\n\n if (this.sorter) {\n this.sorter.removeItems($row);\n }\n\n $row.remove();\n this.totalItems--;\n this.updateUI();\n this.onDeleteItem(id);\n\n if (this.settings.deleteSuccessMessage) {\n Craft.cp.displaySuccess(\n Craft.t('app', this.settings.deleteSuccessMessage, {name})\n );\n }\n },\n\n onReorderItems: function (ids) {\n this.settings.onReorderItems(ids);\n },\n\n onDeleteItem: function (id) {\n this.settings.onDeleteItem(id);\n },\n\n getItemId: function ($row) {\n return $row.attr(this.settings.idAttribute);\n },\n\n getItemName: function ($row) {\n return Craft.escapeHtml($row.attr(this.settings.nameAttribute));\n },\n\n updateUI: function () {\n // Show the \"No Whatever Exists\" message if there aren't any\n if (this.totalItems === 0) {\n this.$table.hide();\n this.$noItems.removeClass('hidden');\n } else {\n this.$table.show();\n this.$noItems.addClass('hidden');\n }\n\n // Disable the sort buttons if there's only one row\n if (this.settings.sortable) {\n var $moveButtons = this.$table.find('.move');\n\n if (this.totalItems === 1) {\n $moveButtons.addClass('disabled');\n } else {\n $moveButtons.removeClass('disabled');\n }\n }\n\n // Disable the delete buttons if we've reached the minimum items\n if (this.settings.minItems && this.totalItems <= this.settings.minItems) {\n this.$deleteBtns.addClass('disabled');\n } else {\n this.$deleteBtns.removeClass('disabled');\n }\n\n // Hide the New Whatever button if we've reached the maximum items\n if (this.settings.newItemBtnSelector) {\n if (\n this.settings.maxItems &&\n this.totalItems >= this.settings.maxItems\n ) {\n $(this.settings.newItemBtnSelector).addClass('hidden');\n } else {\n $(this.settings.newItemBtnSelector).removeClass('hidden');\n }\n }\n },\n },\n {\n defaults: {\n tableSelector: null,\n noItemsSelector: null,\n newItemBtnSelector: null,\n idAttribute: 'data-id',\n nameAttribute: 'data-name',\n sortable: false,\n allowDeleteAll: true,\n minItems: 0,\n maxItems: null,\n reorderAction: null,\n deleteAction: null,\n reorderSuccessMessage: Craft.t('app', 'New order saved.'),\n reorderFailMessage: Craft.t('app', 'Couldn’t save new order.'),\n confirmDeleteMessage: Craft.t(\n 'app',\n 'Are you sure you want to delete “{name}”?'\n ),\n deleteSuccessMessage: Craft.t('app', '“{name}” deleted.'),\n deleteFailMessage: Craft.t('app', 'Couldn’t delete “{name}”.'),\n onReorderItems: $.noop,\n onDeleteItem: $.noop,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n\n/**\n * Asset image editor class\n */\n\nCraft.AssetImageEditor = Garnish.Modal.extend(\n {\n // jQuery objects\n $body: null,\n $footer: null,\n $imageTools: null,\n $buttons: null,\n $cancelBtn: null,\n $replaceBtn: null,\n $saveBtn: null,\n $focalPointBtn: null,\n $editorContainer: null,\n $straighten: null,\n $croppingCanvas: null,\n $spinner: null,\n $constraintContainer: null,\n $constraintRadioInputs: null,\n $customConstraints: null,\n\n // FabricJS objects\n canvas: null,\n image: null,\n viewport: null,\n focalPoint: null,\n grid: null,\n croppingCanvas: null,\n clipper: null,\n croppingRectangle: null,\n cropperHandles: null,\n cropperGrid: null,\n croppingShade: null,\n\n // Image state attributes\n imageStraightenAngle: 0,\n viewportRotation: 0,\n originalWidth: 0,\n originalHeight: 0,\n imageVerticeCoords: null,\n zoomRatio: 1,\n\n // Editor state attributes\n animationInProgress: false,\n currentView: '',\n assetId: null,\n cacheBust: null,\n draggingCropper: false,\n scalingCropper: false,\n draggingFocal: false,\n previousMouseX: 0,\n previousMouseY: 0,\n shiftKeyHeld: false,\n editorHeight: 0,\n editorWidth: 0,\n cropperState: false,\n scaleFactor: 1,\n flipData: {},\n focalPointState: false,\n maxImageSize: null,\n lastLoadedDimensions: null,\n imageIsLoading: false,\n mouseMoveEvent: null,\n croppingConstraint: false,\n constraintOrientation: 'landscape',\n showingCustomConstraint: false,\n saving: false,\n\n // Rendering proxy functions\n renderImage: null,\n renderCropper: null,\n\n _queue: null,\n\n init: function (assetId, settings) {\n this._queue = new Craft.Queue();\n\n this.cacheBust = Date.now();\n\n this.setSettings(settings, Craft.AssetImageEditor.defaults);\n\n if (this.settings.allowDegreeFractions === null) {\n this.settings.allowDegreeFractions = Craft.isImagick;\n }\n\n if (Garnish.prefersReducedMotion()) {\n this.settings.animationDuration = 1;\n }\n\n this.assetId = assetId;\n this.flipData = {x: 0, y: 0};\n\n // Build the modal\n this.$container = $(\n '<form class=\"modal fitted imageeditor\"></form>'\n ).appendTo(Garnish.$bod);\n this.$body = $('<div class=\"body\"></div>').appendTo(this.$container);\n this.$footer = $('<div class=\"footer\"/>').appendTo(this.$container);\n\n this.base(this.$container, this.settings);\n\n this.$buttons = $('<div class=\"buttons right\"/>').appendTo(this.$footer);\n this.$cancelBtn = $('<button/>', {\n type: 'button',\n class: 'btn cancel',\n text: Craft.t('app', 'Cancel'),\n }).appendTo(this.$buttons);\n\n if (this.settings.allowSavingAsNew) {\n this.$saveBtn = Craft.ui\n .createButton({\n class: 'save copy',\n label: Craft.t('app', 'Save as a new asset'),\n spinner: true,\n })\n .appendTo(this.$buttons);\n this.addListener(this.$saveBtn, 'activate', this.saveImage);\n }\n\n this.$replaceBtn = Craft.ui\n .createSubmitButton({\n class: 'save replace',\n label: Craft.t('app', 'Save'),\n spinner: true,\n })\n .appendTo(this.$buttons);\n\n this.addListener(this.$replaceBtn, 'activate', this.saveImage);\n this.addListener(this.$cancelBtn, 'activate', this.hide);\n this.removeListener(this.$shade, 'click');\n\n this.maxImageSize = this.getMaxImageSize();\n Craft.sendActionRequest('POST', 'assets/image-editor', {\n data: {assetId},\n }).then((response) => this.loadEditor(response.data));\n },\n\n /**\n * Get the max image size that is viewable in the editor currently\n */\n getMaxImageSize: function () {\n var browserViewportWidth =\n Garnish.$doc.get(0).documentElement.clientWidth;\n var browserViewportHeight =\n Garnish.$doc.get(0).documentElement.clientHeight;\n\n return (\n Math.max(browserViewportHeight, browserViewportWidth) *\n (window.devicePixelRatio > 1 ? 2 : 1)\n );\n },\n\n /**\n * Load the editor markup and start loading components and the image.\n *\n * @param {Object} data\n */\n loadEditor: function (data) {\n if (!data.html) {\n alert(Craft.t('app', 'Could not load the image editor.'));\n }\n\n this.$body.html(data.html);\n this.$tabs = $('.tabs li', this.$body);\n this.$viewsContainer = $('.views', this.$body);\n this.$views = $('> div', this.$viewsContainer);\n this.$imageTools = $('.image-container .image-tools', this.$body);\n this.$editorContainer = $('.image-container .image', this.$body);\n this.$constraintContainer = $('.constraint-group', this.$body);\n this.$constraintRadioInputs = $(\n '[name=\"constraint\"]',\n this.$constraintContainer\n );\n this.$focalPointBtn = $('.focal-point', this.$body);\n this.editorHeight = this.$editorContainer.innerHeight();\n this.editorWidth = this.$editorContainer.innerWidth();\n\n this._showSpinner();\n\n this.updateSizeAndPosition();\n\n $customConstraintWrapper = this.$constraintRadioInputs\n .filter('[value=\"custom\"]')\n .parent();\n\n // Add custom constraint inputs to fieldset\n this.$customConstraints = $('<div/>', {\n class: 'constraint custom hidden',\n 'data-constraint': 'custom',\n })\n .append(\n $('<input/>', {\n type: 'text',\n class: 'custom-constraint-w',\n size: 3,\n value: 1,\n 'aria-label': Craft.t('app', 'Width unit'),\n })\n )\n .append(\n $('<span/>', {\n class: 'custom-constraint-spacer',\n text: 'x',\n 'aria-hidden': 'true',\n })\n )\n .append(\n $('<input/>', {\n type: 'text',\n class: 'custom-constraint-h',\n size: 3,\n value: 1,\n 'aria-label': Craft.t('app', 'Height unit'),\n })\n )\n .appendTo($customConstraintWrapper);\n\n // Specify which get flipped on orientation change\n this.$constraintRadioInputs\n .filter(function () {\n const regex = /^\\d*\\.\\d+$/;\n const value = $(this).val();\n return regex.test(value);\n })\n .addClass('flip');\n\n // Load the canvas on which we'll host our image and set up the proxy render function\n this.canvas = new fabric.StaticCanvas('image-canvas');\n\n // Set up the cropping canvas jquery element for tracking all the nice events\n this.$croppingCanvas = $('#cropping-canvas', this.$editorContainer);\n this.$croppingCanvas.width(this.editorWidth);\n this.$croppingCanvas.height(this.editorHeight);\n\n this.canvas.enableRetinaScaling = true;\n this.renderImage = () => {\n Garnish.requestAnimationFrame(this.canvas.renderAll.bind(this.canvas));\n };\n\n // Load the image from URL\n var imageUrl = Craft.getActionUrl('assets/edit-image', {\n assetId: this.assetId,\n size: this.maxImageSize,\n cacheBust: this.cacheBust,\n });\n\n // Load image and set up the initial properties\n fabric.Image.fromURL(imageUrl, (imageObject) => {\n this.image = imageObject;\n this.image.set({\n originX: 'center',\n originY: 'center',\n left: this.editorWidth / 2,\n top: this.editorHeight / 2,\n });\n this.canvas.add(this.image);\n\n this.originalHeight = this.image.getHeight();\n this.originalWidth = this.image.getWidth();\n this.zoomRatio = 1;\n\n this.lastLoadedDimensions = this.getScaledImageDimensions();\n\n // Set up the image bounding box, viewport and position everything\n this._setFittedImageVerticeCoordinates();\n this._repositionEditorElements();\n\n // Set up the focal point\n var focalState = {\n imageDimensions: this.getScaledImageDimensions(),\n offsetX: 0,\n offsetY: 0,\n };\n\n var focal = false;\n if (data.focalPoint) {\n // Transform the focal point coordinates from relative to absolute\n var focalData = data.focalPoint;\n\n // Resolve for the current image dimensions.\n var adjustedX = focalState.imageDimensions.width * focalData.x;\n var adjustedY = focalState.imageDimensions.height * focalData.y;\n\n focalState.offsetX = adjustedX - focalState.imageDimensions.width / 2;\n focalState.offsetY =\n adjustedY - focalState.imageDimensions.height / 2;\n\n focal = true;\n }\n\n this.storeFocalPointState(focalState);\n\n if (focal) {\n this._createFocalPoint();\n }\n\n this._createViewport();\n this.storeCropperState();\n\n // Add listeners to buttons\n this._addControlListeners();\n\n // Add mouse event listeners\n this.addListener(\n this.$croppingCanvas,\n 'mousemove,touchmove',\n this._handleMouseMove\n );\n this.addListener(\n this.$croppingCanvas,\n 'mousedown,touchstart',\n this._handleMouseDown\n );\n this.addListener(\n this.$croppingCanvas,\n 'mouseup,touchend',\n this._handleMouseUp\n );\n this.addListener(\n this.$croppingCanvas,\n 'mouseout,touchcancel',\n this._handleMouseOut\n );\n\n this._hideSpinner();\n\n // Render it, finally\n this.renderImage();\n\n // Make sure verything gets fired for the first tab\n this.$tabs.first().trigger('click');\n });\n },\n\n /**\n * Reload the image to better fit the current available image editor viewport.\n */\n _reloadImage: function () {\n if (this.imageIsLoading) {\n return;\n }\n\n this.imageIsLoading = true;\n this.maxImageSize = this.getMaxImageSize();\n\n // Load the image from URL\n var imageUrl = Craft.getActionUrl('assets/edit-image', {\n assetId: this.assetId,\n size: this.maxImageSize,\n cacheBust: this.cacheBust,\n });\n\n this.image.setSrc(imageUrl, (imageObject) => {\n this.originalHeight = imageObject.getHeight();\n this.originalWidth = imageObject.getWidth();\n this.lastLoadedDimensions = {\n width: this.originalHeight,\n height: this.originalWidth,\n };\n this.updateSizeAndPosition();\n this.renderImage();\n this.imageIsLoading = false;\n });\n },\n\n /**\n * Update the modal size and position on browser resize\n */\n updateSizeAndPosition: function () {\n if (!this.$container) {\n return;\n }\n\n // Fullscreen modal\n var innerWidth = window.innerWidth;\n var innerHeight = window.innerHeight;\n\n this.$container.css({\n width: innerWidth,\n 'min-width': innerWidth,\n left: 0,\n\n height: innerHeight,\n 'min-height': innerHeight,\n top: 0,\n });\n\n this.$body.css({\n height: innerHeight - (this.$footer.outerHeight() - 1),\n });\n\n if (innerWidth < innerHeight) {\n this.$container.addClass('vertical');\n } else {\n this.$container.removeClass('vertical');\n }\n\n // If image is already loaded, make sure it looks pretty.\n if (this.$editorContainer && this.image) {\n this._repositionEditorElements();\n }\n },\n\n /**\n * Reposition the editor elements to accurately reflect the editor state with current dimensions\n */\n _repositionEditorElements: function () {\n // Remember what the dimensions were before the resize took place\n var previousEditorDimensions = {\n width: this.editorWidth,\n height: this.editorHeight,\n };\n\n this.editorHeight = this.$editorContainer.innerHeight();\n this.editorWidth = this.$editorContainer.innerWidth();\n\n this.canvas.setDimensions({\n width: this.editorWidth,\n height: this.editorHeight,\n });\n\n var currentScaledDimensions = this.getScaledImageDimensions();\n\n // If we're cropping now, we have to reposition the cropper correctly in case\n // the area for image changes, forcing the image size to change as well.\n if (this.currentView === 'crop') {\n this.zoomRatio = this.getZoomToFitRatio(\n this.getScaledImageDimensions()\n );\n var previouslyOccupiedArea = this._getBoundingRectangle(\n this.imageVerticeCoords\n );\n this._setFittedImageVerticeCoordinates();\n this._repositionCropper(previouslyOccupiedArea);\n } else {\n // Otherwise just recalculate the image zoom ratio\n this.zoomRatio =\n this.getZoomToCoverRatio(this.getScaledImageDimensions()) *\n this.scaleFactor;\n }\n\n // Reposition the image relatively to the previous editor dimensions.\n this._repositionImage(previousEditorDimensions);\n this._repositionViewport();\n this._repositionFocalPoint(previousEditorDimensions);\n this._zoomImage();\n\n this.renderImage();\n\n if (\n currentScaledDimensions.width / this.lastLoadedDimensions.width > 1.5 ||\n currentScaledDimensions.height / this.lastLoadedDimensions.height > 1.5\n ) {\n this._reloadImage();\n }\n },\n\n /**\n * Reposition image based on how the editor dimensions have changed.\n * This ensures keeping the image center offset, if there is any.\n *\n * @param {Object} previousEditorDimensions\n */\n _repositionImage: function (previousEditorDimensions) {\n this.image.set({\n left:\n this.image.left -\n (previousEditorDimensions.width - this.editorWidth) / 2,\n top:\n this.image.top -\n (previousEditorDimensions.height - this.editorHeight) / 2,\n });\n },\n\n /**\n * Create the viewport for image editor.\n */\n _createViewport: function () {\n this.viewport = new fabric.Rect({\n width: this.image.width,\n height: this.image.height,\n fill: 'rgba(127,0,0,1)',\n originX: 'center',\n originY: 'center',\n globalCompositeOperation: 'destination-in', // This clips everything outside of the viewport\n left: this.image.left,\n top: this.image.top,\n });\n this.canvas.add(this.viewport);\n this.renderImage();\n },\n\n /**\n * Create the focal point.\n */\n _createFocalPoint: function () {\n var focalPointState = this.focalPointState;\n var sizeFactor =\n this.getScaledImageDimensions().width /\n focalPointState.imageDimensions.width;\n\n var focalX =\n focalPointState.offsetX *\n sizeFactor *\n this.zoomRatio *\n this.scaleFactor;\n var focalY =\n focalPointState.offsetY *\n sizeFactor *\n this.zoomRatio *\n this.scaleFactor;\n\n // Adjust by image margins\n focalX += this.image.left;\n focalY += this.image.top;\n\n var deltaX = 0;\n var deltaY = 0;\n\n // When creating a fresh focal point, drop it dead in the center of the viewport, not the image.\n if (\n this.viewport &&\n focalPointState.offsetX === 0 &&\n focalPointState.offsetY === 0\n ) {\n if (this.currentView !== 'crop') {\n deltaX = this.viewport.left - this.image.left;\n deltaY = this.viewport.top - this.image.top;\n } else {\n // Unless we have a cropper showing, in which case drop it in the middle of the cropper\n deltaX = this.clipper.left - this.image.left;\n deltaY = this.clipper.top - this.image.top;\n }\n\n // Bump focal to middle of viewport\n focalX += deltaX;\n focalY += deltaY;\n\n // Reflect changes in saved state\n focalPointState.offsetX +=\n deltaX / (sizeFactor * this.zoomRatio * this.scaleFactor);\n focalPointState.offsetY +=\n deltaY / (sizeFactor * this.zoomRatio * this.scaleFactor);\n }\n\n this.focalPoint = new fabric.Group(\n [\n new fabric.Circle({\n radius: 8,\n fill: 'rgba(0,0,0,0.5)',\n strokeWidth: 2,\n stroke: 'rgba(255,255,255,0.8)',\n left: 0,\n top: 0,\n originX: 'center',\n originY: 'center',\n }),\n new fabric.Circle({\n radius: 1,\n fill: 'rgba(255,255,255,0)',\n strokeWidth: 2,\n stroke: 'rgba(255,255,255,0.8)',\n left: 0,\n top: 0,\n originX: 'center',\n originY: 'center',\n }),\n ],\n {\n originX: 'center',\n originY: 'center',\n left: focalX,\n top: focalY,\n }\n );\n\n this.storeFocalPointState(focalPointState);\n this.canvas.add(this.focalPoint);\n },\n\n /**\n * Toggle focal point\n */\n toggleFocalPoint: function () {\n if (!this.focalPoint) {\n this._createFocalPoint();\n this.$focalPointBtn.attr('aria-pressed', 'true');\n } else {\n this.canvas.remove(this.focalPoint);\n this.focalPoint = null;\n this.$focalPointBtn.attr('aria-pressed', 'false');\n }\n\n this.renderImage();\n },\n\n /**\n * Reposition the viewport to handle editor resizing.\n */\n _repositionViewport: function () {\n if (this.viewport) {\n var dimensions = {\n left: this.editorWidth / 2,\n top: this.editorHeight / 2,\n };\n\n // If we're cropping, nothing exciting happens for the viewport\n if (this.currentView === 'crop') {\n dimensions.width = this.editorWidth;\n dimensions.height = this.editorHeight;\n } else {\n // If this is the first initial reposition, no cropper state yet\n if (this.cropperState) {\n // Recall the state\n var state = this.cropperState;\n\n var scaledImageDimensions = this.getScaledImageDimensions();\n // Make sure we have the correct current image size\n var sizeFactor =\n scaledImageDimensions.width / state.imageDimensions.width;\n\n // Set the viewport dimensions\n dimensions.width = state.width * sizeFactor * this.zoomRatio;\n dimensions.height = state.height * sizeFactor * this.zoomRatio;\n\n // Adjust the image position to show the correct part of the image in the viewport\n this.image.set({\n left: this.editorWidth / 2 - state.offsetX * sizeFactor,\n top: this.editorHeight / 2 - state.offsetY * sizeFactor,\n });\n } else {\n $.extend(dimensions, this.getScaledImageDimensions());\n }\n }\n this.viewport.set(dimensions);\n }\n },\n\n _repositionFocalPoint: function (previousEditorDimensions) {\n if (this.focalPoint) {\n var offsetX = this.focalPoint.left - this.editorWidth / 2;\n var offsetY = this.focalPoint.top - this.editorHeight / 2;\n\n var currentWidth = this.image.width;\n var newWidth = this.getScaledImageDimensions().width * this.zoomRatio;\n var ratio = newWidth / currentWidth / this.scaleFactor;\n\n offsetX -= (previousEditorDimensions.width - this.editorWidth) / 2;\n offsetY -= (previousEditorDimensions.height - this.editorHeight) / 2;\n\n offsetX *= ratio;\n offsetY *= ratio;\n\n this.focalPoint.set({\n left: this.editorWidth / 2 + offsetX,\n top: this.editorHeight / 2 + offsetY,\n });\n }\n },\n\n /**\n * Return true if the image orientation has changed\n */\n hasOrientationChanged: function () {\n return this.viewportRotation % 180 !== 0;\n },\n\n /**\n * Return the current image dimensions that would be used in the current image area with no straightening or rotation applied.\n */\n getScaledImageDimensions: function () {\n if (typeof this.getScaledImageDimensions._ === 'undefined') {\n this.getScaledImageDimensions._ = {};\n }\n\n this.getScaledImageDimensions._.imageRatio =\n this.originalHeight / this.originalWidth;\n this.getScaledImageDimensions._.editorRatio =\n this.editorHeight / this.editorWidth;\n\n this.getScaledImageDimensions._.dimensions = {};\n if (\n this.getScaledImageDimensions._.imageRatio >\n this.getScaledImageDimensions._.editorRatio\n ) {\n this.getScaledImageDimensions._.dimensions.height = Math.min(\n this.editorHeight,\n this.originalHeight\n );\n this.getScaledImageDimensions._.dimensions.width = Math.round(\n this.originalWidth /\n (this.originalHeight /\n this.getScaledImageDimensions._.dimensions.height)\n );\n } else {\n this.getScaledImageDimensions._.dimensions.width = Math.min(\n this.editorWidth,\n this.originalWidth\n );\n this.getScaledImageDimensions._.dimensions.height = Math.round(\n this.originalHeight *\n (this.getScaledImageDimensions._.dimensions.width /\n this.originalWidth)\n );\n }\n\n return this.getScaledImageDimensions._.dimensions;\n },\n\n /**\n * Set the image dimensions to reflect the current zoom ratio.\n */\n _zoomImage: function () {\n if (typeof this._zoomImage._ === 'undefined') {\n this._zoomImage._ = {};\n }\n\n this._zoomImage._.imageDimensions = this.getScaledImageDimensions();\n this.image.set({\n width: this._zoomImage._.imageDimensions.width * this.zoomRatio,\n height: this._zoomImage._.imageDimensions.height * this.zoomRatio,\n });\n },\n\n /**\n * Gets previous tab element from currently-active.\n */\n _getPrevTab: function () {\n const activeTabIndex = this._getActiveTabIndex();\n\n if (activeTabIndex < 0) return;\n\n let newTabIndex;\n\n if (activeTabIndex > 0) {\n newTabIndex = activeTabIndex - 1;\n } else {\n newTabIndex = this.$tabs.length - 1;\n }\n\n return this.$tabs.eq(newTabIndex);\n },\n\n /**\n * Gets next tab element from currently-active.\n */\n _getNextTab: function () {\n const activeTabIndex = this._getActiveTabIndex();\n\n if (activeTabIndex < 0) return;\n\n let newTabIndex;\n\n if (activeTabIndex < this.$tabs.length - 1) {\n newTabIndex = activeTabIndex + 1;\n } else {\n newTabIndex = 0;\n }\n\n return this.$tabs.eq(newTabIndex);\n },\n\n /**\n * Gets active tab element\n */\n _getActiveTab: function () {\n return this.$tabs.filter('[aria-selected=\"true\"]');\n },\n\n /**\n * Gets index of active tab among sibling tabs\n */\n _getActiveTabIndex: function () {\n const $activeTab = this._getActiveTab();\n\n if (!$activeTab.length) return;\n\n return $activeTab.index();\n },\n\n /**\n * Set up listeners for the controls.\n */\n _addControlListeners: function () {\n // Tabs\n this.addListener(this.$tabs, 'click', this._handleTabClick);\n this.addListener(this.$tabs, 'keydown', (event) => {\n switch (event.keyCode) {\n case Garnish.LEFT_KEY:\n case Garnish.UP_KEY:\n event.preventDefault();\n const $prevTab = this._getPrevTab();\n this.activateTab($prevTab);\n break;\n case Garnish.RIGHT_KEY:\n case Garnish.DOWN_KEY:\n event.preventDefault();\n const $nextTab = this._getNextTab();\n this.activateTab($nextTab);\n break;\n }\n });\n\n // Focal point\n this.addListener(this.$focalPointBtn, 'click', this.toggleFocalPoint);\n\n // Rotate controls\n this.addListener($('.rotate-left'), 'click', function () {\n this.rotateImage(-90);\n });\n this.addListener($('.rotate-right'), 'click', function () {\n this.rotateImage(90);\n });\n this.addListener($('.flip-vertical'), 'click', function () {\n this.flipImage('y');\n });\n this.addListener($('.flip-horizontal'), 'click', function () {\n this.flipImage('x');\n });\n\n // Straighten slider\n this.straighteningInput = new Craft.SlideRuleInput('slide-rule', {\n onStart: () => {\n this._showGrid();\n },\n onChange: (slider) => {\n this.straighten(slider);\n },\n onEnd: () => {\n this._hideGrid();\n this._cleanupFocalPointAfterStraighten();\n },\n });\n\n // Cropper scale modifier key\n this.addListener(Garnish.$doc, 'keydown', function (ev) {\n if (ev.keyCode === Garnish.SHIFT_KEY) {\n this.shiftKeyHeld = true;\n }\n });\n this.addListener(Garnish.$doc, 'keyup', function (ev) {\n if (ev.keyCode === Garnish.SHIFT_KEY) {\n this.shiftKeyHeld = false;\n }\n });\n\n this.addListener(\n this.$constraintRadioInputs,\n 'change',\n this._handleConstraintChange\n );\n this.addListener(\n $('.orientation input', this.$container),\n 'click',\n this._handleOrientationClick\n );\n this.addListener(\n $('.constraint-group .custom input', this.$container),\n 'keyup',\n this._applyCustomConstraint\n );\n },\n\n /**\n * Handle a constraint button click.\n *\n * @param {Object} ev\n */\n _handleConstraintClick: function (ev) {\n var constraint = $(ev.currentTarget).data('constraint');\n var $target = $(ev.currentTarget);\n $target.siblings().removeClass('active');\n $target.addClass('active');\n\n if (constraint == 'custom') {\n this._showCustomConstraint();\n this._applyCustomConstraint();\n return;\n }\n\n this._hideCustomConstraint();\n\n this.setCroppingConstraint(constraint);\n this.enforceCroppingConstraint();\n },\n\n /**\n * Handle a constraint change.\n *\n * @param {Object} ev\n */\n _handleConstraintChange: function (ev) {\n const constraint = $(ev.target).val();\n\n if (constraint == 'custom') {\n this._showCustomConstraint();\n this._applyCustomConstraint();\n return;\n }\n\n this._hideCustomConstraint();\n\n this.setCroppingConstraint(constraint);\n this.enforceCroppingConstraint();\n },\n\n /**\n * Handle an orientation switch click.\n *\n * @param {Object} ev\n */\n _handleOrientationClick: function (ev) {\n if (ev.currentTarget.value === this.constraintOrientation) {\n return;\n }\n this.constraintOrientation = ev.currentTarget.value;\n\n const $constraints = $('.flip', this.$constraintContainer);\n\n for (var i = 0; i < $constraints.length; i++) {\n var $constraint = $($constraints[i]);\n const labelSelector = 'label[for=\"' + $constraint.attr('id') + '\"]';\n const $label = $(labelSelector, this.$constraintContainer);\n $constraint.val(1 / $constraint.val());\n $label.html(\n $label.text().split(':').reverse().join(':').replace(/\\s/g, '')\n );\n }\n\n $constraints.filter(':checked').trigger('change');\n },\n\n /**\n * Apply the custom ratio set in the inputs\n */\n _applyCustomConstraint: function () {\n var constraint = this._getCustomConstraint();\n\n if (constraint.w > 0 && constraint.h > 0) {\n this.setCroppingConstraint(constraint.w / constraint.h);\n this.enforceCroppingConstraint();\n }\n },\n\n /**\n * Get the custom constraint.\n *\n * @returns {{w: *, h: *}}\n */\n _getCustomConstraint: function () {\n var w = parseFloat($('.custom-constraint-w').val());\n var h = parseFloat($('.custom-constraint-h').val());\n return {\n w: isNaN(w) ? 0 : w,\n h: isNaN(h) ? 0 : h,\n };\n },\n\n /**\n * Set the custom constraint.\n *\n * @param {number} w\n * @param {number} h\n */\n _setCustomConstraint: function (w, h) {\n $('.custom-constraint-w').val(parseFloat(w));\n $('.custom-constraint-h').val(parseFloat(h));\n },\n\n /**\n * Hide the custom constraint inputs.\n */\n _hideCustomConstraint: function () {\n this.showingCustomConstraint = false;\n this.$customConstraints.addClass('hidden');\n $('.orientation', this.$container).removeClass('hidden');\n },\n\n /**\n * Show the custom constraint inputs.\n */\n _showCustomConstraint: function () {\n if (this.showingCustomConstraint) {\n return;\n }\n\n this.showingCustomConstraint = true;\n this.$customConstraints.removeClass('hidden');\n $('.orientation', this.$container).addClass('hidden');\n },\n\n /**\n * Handle tab click.\n *\n * @param {Object} ev\n */\n _handleTabClick: function (ev) {\n if (!this.animationInProgress) {\n var $tab = $(ev.currentTarget);\n this.activateTab($tab);\n }\n },\n\n /**\n * Activate a tab.\n *\n * @param {(jQuery|HTMLElement|string)} tab\n */\n\n activateTab: function (tab) {\n const view = $(tab).data('view');\n this.$tabs.removeClass('selected').attr({\n 'aria-selected': 'false',\n tabindex: '-1',\n });\n $(tab)\n .addClass('selected')\n .attr({\n 'aria-selected': 'true',\n tabindex: '0',\n })\n .trigger('focus');\n this.showView(view);\n },\n\n /**\n * Show a view.\n *\n * @param {string} view\n */\n showView: function (view) {\n if (this.currentView === view) {\n return;\n }\n\n this.$views.addClass('hidden');\n var $view = this.$views.filter('[data-view=\"' + view + '\"]');\n $view.removeClass('hidden');\n\n if (view === 'rotate') {\n this.enableSlider();\n } else {\n this.disableSlider();\n }\n\n // Now that most likely our editor dimensions have changed, time to reposition stuff\n this.updateSizeAndPosition();\n\n // See if we have to enable or disable crop mode as we transition between tabs\n if (this.currentView === 'crop' && view !== 'crop') {\n this._queue.push(\n () =>\n new Promise((resolve, reject) => {\n this.disableCropMode();\n resolve();\n })\n );\n } else if (this.currentView !== 'crop' && view === 'crop') {\n this._queue.push(\n () =>\n new Promise((resolve, reject) => {\n this.enableCropMode();\n resolve();\n })\n );\n }\n\n // Mark the current view\n this.currentView = view;\n },\n\n /**\n * Store the current cropper state.\n *\n * Cropper state is always assumed to be saved at a zoom ratio of 1 to be used\n * as the basis for recalculating the cropper position and dimensions.\n *\n * @param {Object} [state]\n */\n storeCropperState: function (state) {\n if (typeof this.storeCropperState._ === 'undefined') {\n this.storeCropperState._ = {};\n }\n\n // If we're asked to store a specific state.\n if (state) {\n this.cropperState = state;\n } else if (this.clipper) {\n this.storeCropperState._.zoomFactor = 1 / this.zoomRatio;\n\n this.cropperState = {\n offsetX:\n (this.clipper.left - this.image.left) *\n this.storeCropperState._.zoomFactor,\n offsetY:\n (this.clipper.top - this.image.top) *\n this.storeCropperState._.zoomFactor,\n height: this.clipper.height * this.storeCropperState._.zoomFactor,\n width: this.clipper.width * this.storeCropperState._.zoomFactor,\n imageDimensions: this.getScaledImageDimensions(),\n };\n } else {\n this.storeCropperState._.dimensions = this.getScaledImageDimensions();\n this.cropperState = {\n offsetX: 0,\n offsetY: 0,\n height: this.storeCropperState._.dimensions.height,\n width: this.storeCropperState._.dimensions.width,\n imageDimensions: this.storeCropperState._.dimensions,\n };\n }\n },\n\n /**\n * Store focal point coordinates in a manner that is not tied to zoom ratio and rotation.\n */\n storeFocalPointState: function (state) {\n if (typeof this.storeFocalPointState._ === 'undefined') {\n this.storeFocalPointState._ = {};\n }\n\n // If we're asked to store a specific state.\n if (state) {\n this.focalPointState = state;\n } else if (this.focalPoint) {\n this.storeFocalPointState._.zoomFactor = 1 / this.zoomRatio;\n this.focalPointState = {\n offsetX:\n ((this.focalPoint.left - this.image.left) *\n this.storeFocalPointState._.zoomFactor) /\n this.scaleFactor,\n offsetY:\n ((this.focalPoint.top - this.image.top) *\n this.storeFocalPointState._.zoomFactor) /\n this.scaleFactor,\n imageDimensions: this.getScaledImageDimensions(),\n };\n }\n },\n\n /**\n * Rotate the image along with the viewport.\n *\n * @param {number} degrees\n */\n rotateImage: function (degrees) {\n if (!this.animationInProgress) {\n // We're not that kind of an establishment, sir.\n if (degrees !== 90 && degrees !== -90) {\n return false;\n }\n\n this.animationInProgress = true;\n this.viewportRotation += degrees;\n\n // Normalize the viewport rotation angle so it's between 0 and 359\n this.viewportRotation = parseInt(\n (this.viewportRotation + 360) % 360,\n 10\n );\n\n var newAngle = this.image.angle + degrees;\n var scaledImageDimensions = this.getScaledImageDimensions();\n var imageZoomRatio;\n\n if (this.hasOrientationChanged()) {\n imageZoomRatio = this.getZoomToCoverRatio({\n height: scaledImageDimensions.width,\n width: scaledImageDimensions.height,\n });\n } else {\n imageZoomRatio = this.getZoomToCoverRatio(scaledImageDimensions);\n }\n\n // In cases when for some reason we've already zoomed in on the image,\n // use existing zoom.\n if (this.zoomRatio > imageZoomRatio) {\n imageZoomRatio = this.zoomRatio;\n }\n\n var viewportProperties = {\n angle: degrees === 90 ? '+=90' : '-=90',\n };\n\n var imageProperties = {\n angle: newAngle,\n width: scaledImageDimensions.width * imageZoomRatio,\n height: scaledImageDimensions.height * imageZoomRatio,\n };\n\n var scaleFactor = 1;\n if (this.scaleFactor < 1) {\n scaleFactor = 1 / this.scaleFactor;\n this.scaleFactor = 1;\n } else {\n if (this.viewport.width > this.editorHeight) {\n scaleFactor = this.editorHeight / this.viewport.width;\n } else if (this.viewport.height > this.editorWidth) {\n scaleFactor = this.editorWidth / this.viewport.height;\n }\n this.scaleFactor = scaleFactor;\n }\n\n if (scaleFactor < 1) {\n imageProperties.width *= scaleFactor;\n imageProperties.height *= scaleFactor;\n }\n\n var state = this.cropperState;\n\n // Make sure we reposition the image as well to focus on the same image area\n var deltaX = state.offsetX;\n var deltaY = state.offsetY;\n var angleInRadians = degrees * (Math.PI / 180);\n\n // Calculate how the cropper would need to move in a circle to maintain\n // the focus on the same region if the image was rotated with zoom intact.\n var newDeltaX =\n deltaX * Math.cos(angleInRadians) - deltaY * Math.sin(angleInRadians);\n var newDeltaY =\n deltaX * Math.sin(angleInRadians) + deltaY * Math.cos(angleInRadians);\n\n var sizeFactor =\n scaledImageDimensions.width / state.imageDimensions.width;\n\n var modifiedDeltaX =\n newDeltaX * sizeFactor * this.zoomRatio * this.scaleFactor;\n var modifiedDeltaY =\n newDeltaY * sizeFactor * this.zoomRatio * this.scaleFactor;\n\n imageProperties.left = this.editorWidth / 2 - modifiedDeltaX;\n imageProperties.top = this.editorHeight / 2 - modifiedDeltaY;\n\n state.offsetX = newDeltaX;\n state.offsetY = newDeltaY;\n\n var temp = state.width;\n state.width = state.height;\n state.height = temp;\n\n this.storeCropperState(state);\n\n if (this.focalPoint) {\n this.canvas.remove(this.focalPoint);\n }\n\n this.viewport.animate(viewportProperties, {\n duration: this.settings.animationDuration,\n onComplete: () => {\n // If we're zooming the image in or out, better do the same to viewport\n var temp = this.viewport.height * scaleFactor;\n this.viewport.height = this.viewport.width * scaleFactor;\n this.viewport.width = temp;\n this.viewport.set({angle: 0});\n },\n });\n\n // Animate the rotation and dimension change\n this.image.animate(imageProperties, {\n onChange: this.canvas.renderAll.bind(this.canvas),\n duration: this.settings.animationDuration,\n onComplete: () => {\n var cleanAngle = parseFloat((this.image.angle + 360) % 360);\n this.image.set({angle: cleanAngle});\n this.animationInProgress = false;\n if (this.focalPoint) {\n this._adjustFocalPointByAngle(degrees);\n this.straighten(this.straighteningInput);\n this.canvas.add(this.focalPoint);\n } else {\n this._resetFocalPointPosition();\n }\n },\n });\n }\n },\n\n /**\n * Flip an image along an axis.\n *\n * @param {string} axis\n */\n flipImage: function (axis) {\n if (!this.animationInProgress) {\n this.animationInProgress = true;\n\n if (this.hasOrientationChanged()) {\n axis = axis === 'y' ? 'x' : 'y';\n }\n\n if (this.focalPoint) {\n this.canvas.remove(this.focalPoint);\n } else {\n this._resetFocalPointPosition();\n }\n\n var editorCenter = {x: this.editorWidth / 2, y: this.editorHeight / 2};\n this.straighteningInput.setValue(-this.imageStraightenAngle);\n this.imageStraightenAngle = -this.imageStraightenAngle;\n var properties = {\n angle: this.viewportRotation + this.imageStraightenAngle,\n };\n\n var deltaY, deltaX;\n var cropperState = this.cropperState;\n var focalPointState = this.focalPointState;\n\n // Reposition the image, viewport, and stored cropper and focal point states.\n if (\n (axis === 'y' && this.hasOrientationChanged()) ||\n (axis !== 'y' && !this.hasOrientationChanged())\n ) {\n cropperState.offsetX = -cropperState.offsetX;\n focalPointState.offsetX = -focalPointState.offsetX;\n deltaX = this.image.left - editorCenter.x;\n properties.left = editorCenter.x - deltaX;\n } else {\n cropperState.offsetY = -cropperState.offsetY;\n focalPointState.offsetY = -focalPointState.offsetY;\n deltaY = this.image.top - editorCenter.y;\n properties.top = editorCenter.y - deltaY;\n }\n\n if (axis === 'y') {\n properties.scaleY = this.image.scaleY * -1;\n this.flipData.y = 1 - this.flipData.y;\n } else {\n properties.scaleX = this.image.scaleX * -1;\n this.flipData.x = 1 - this.flipData.x;\n }\n\n this.storeCropperState(cropperState);\n this.storeFocalPointState(focalPointState);\n\n this.image.animate(properties, {\n onChange: this.canvas.renderAll.bind(this.canvas),\n duration: this.settings.animationDuration,\n onComplete: () => {\n this.animationInProgress = false;\n if (this.focalPoint) {\n // Well this is handy\n this._adjustFocalPointByAngle(0);\n this.canvas.add(this.focalPoint);\n }\n },\n });\n }\n },\n\n /**\n * Perform the straightening with input slider.\n *\n * @param {Craft.SlideRuleInput} slider\n */\n straighten: function (slider) {\n if (!this.animationInProgress) {\n this.animationInProgress = true;\n\n var previousAngle = this.image.angle;\n\n this.imageStraightenAngle =\n (this.settings.allowDegreeFractions\n ? parseFloat(slider.value)\n : Math.round(parseFloat(slider.value))) % 360;\n\n // Straighten the image\n this.image.set({\n angle: this.viewportRotation + this.imageStraightenAngle,\n });\n\n // Set the new zoom ratio\n this.zoomRatio =\n this.getZoomToCoverRatio(this.getScaledImageDimensions()) *\n this.scaleFactor;\n this._zoomImage();\n\n if (this.cropperState) {\n this._adjustEditorElementsOnStraighten(previousAngle);\n }\n\n this.renderImage();\n\n this.animationInProgress = false;\n }\n },\n\n /**\n * Adjust the cropped viewport when straightening the image to correct for\n * bumping into edges, keeping focus on the cropped area center and to\n * maintain the illusion that the image is being straightened relative to the viewport center.\n *\n * @param {integer} previousAngle integer the previous image angle before straightening\n */\n _adjustEditorElementsOnStraighten: function (previousAngle) {\n var scaledImageDimensions = this.getScaledImageDimensions();\n var angleDelta = this.image.angle - previousAngle;\n var state = this.cropperState;\n\n var currentZoomRatio = this.zoomRatio;\n var adjustmentRatio = 1;\n\n var deltaX, deltaY, newCenterX, newCenterY, sizeFactor;\n\n do {\n // Get the cropper center coordinates\n var cropperCenterX = state.offsetX;\n var cropperCenterY = state.offsetY;\n var angleInRadians = angleDelta * (Math.PI / 180);\n\n // Calculate how the cropper would need to move in a circle to maintain\n // the focus on the same region if the image was rotated with zoom intact.\n newCenterX =\n cropperCenterX * Math.cos(angleInRadians) -\n cropperCenterY * Math.sin(angleInRadians);\n newCenterY =\n cropperCenterX * Math.sin(angleInRadians) +\n cropperCenterY * Math.cos(angleInRadians);\n\n sizeFactor = scaledImageDimensions.width / state.imageDimensions.width;\n\n // Figure out the final image offset to keep the viewport focused where we need it\n deltaX = newCenterX * currentZoomRatio * sizeFactor;\n deltaY = newCenterY * currentZoomRatio * sizeFactor;\n\n // If the image would creep in the viewport, figure out how to math around it.\n var imageVertices = this.getImageVerticeCoords(currentZoomRatio);\n var rectangle = {\n width: this.viewport.width,\n height: this.viewport.height,\n left: this.editorWidth / 2 - this.viewport.width / 2 + deltaX,\n top: this.editorHeight / 2 - this.viewport.height / 2 + deltaY,\n };\n adjustmentRatio = this._getZoomRatioToFitRectangle(\n rectangle,\n imageVertices\n );\n currentZoomRatio = currentZoomRatio * adjustmentRatio;\n\n // If we had to make adjustments, do the calculations again\n } while (adjustmentRatio !== 1);\n\n // Reposition the image correctly\n this.image.set({\n left: this.editorWidth / 2 - deltaX,\n top: this.editorHeight / 2 - deltaY,\n });\n\n // Finally, store the new cropper state to reflect the rotation change.\n state.offsetX = newCenterX;\n state.offsetY = newCenterY;\n state.width = this.viewport.width / currentZoomRatio / sizeFactor;\n state.height = this.viewport.height / currentZoomRatio / sizeFactor;\n\n this.storeCropperState(state);\n\n // Zoom the image in and we're done.\n this.zoomRatio = currentZoomRatio;\n\n if (this.focalPoint) {\n this._adjustFocalPointByAngle(angleDelta);\n\n if (!this._isCenterInside(this.focalPoint, this.viewport)) {\n this.focalPoint.set({opacity: 0});\n } else {\n this.focalPoint.set({opacity: 1});\n }\n } else if (angleDelta !== 0) {\n this._resetFocalPointPosition();\n }\n\n this._zoomImage();\n },\n\n /**\n * If focal point is active and outside of viewport after straightening, reset it.\n */\n _cleanupFocalPointAfterStraighten: function () {\n if (\n this.focalPoint &&\n !this._isCenterInside(this.focalPoint, this.viewport)\n ) {\n this.focalPoint.set({opacity: 1});\n var state = this.focalPointState;\n state.offsetX = 0;\n state.offsetY = 0;\n this.storeFocalPointState(state);\n this.toggleFocalPoint();\n }\n },\n\n /**\n * Reset focal point to the middle of image.\n */\n _resetFocalPointPosition: function () {\n var state = this.focalPointState;\n state.offsetX = 0;\n state.offsetY = 0;\n this.storeFocalPointState(state);\n },\n\n /**\n * Returns true if a center of an object is inside another rectangle shaped object that is not rotated.\n *\n * @param {Object} object\n * @param {Object} containingObject\n * @returns {boolean}\n */\n _isCenterInside: function (object, containingObject) {\n return (\n object.left > containingObject.left - containingObject.width / 2 &&\n object.top > containingObject.top - containingObject.height / 2 &&\n object.left < containingObject.left + containingObject.width / 2 &&\n object.top < containingObject.top + containingObject.height / 2\n );\n },\n\n /**\n * Adjust the focal point by an angle in degrees.\n * @param {number} angle\n */\n _adjustFocalPointByAngle: function (angle) {\n var angleInRadians = angle * (Math.PI / 180);\n var state = this.focalPointState;\n\n var focalX = state.offsetX;\n var focalY = state.offsetY;\n\n // Calculate how the focal point would need to move in a circle to keep on the same spot\n // on the image if it was rotated with zoom intact.\n var newFocalX =\n focalX * Math.cos(angleInRadians) - focalY * Math.sin(angleInRadians);\n var newFocalY =\n focalX * Math.sin(angleInRadians) + focalY * Math.cos(angleInRadians);\n var sizeFactor =\n this.getScaledImageDimensions().width / state.imageDimensions.width;\n\n var adjustedFocalX = newFocalX * sizeFactor * this.zoomRatio;\n var adjustedFocalY = newFocalY * sizeFactor * this.zoomRatio;\n\n this.focalPoint.left = this.image.left + adjustedFocalX;\n this.focalPoint.top = this.image.top + adjustedFocalY;\n\n state.offsetX = newFocalX;\n state.offsetY = newFocalY;\n this.storeFocalPointState(state);\n },\n\n /**\n * Get the zoom ratio required to fit a rectangle within another rectangle, that is defined by vertices.\n * If the rectangle fits, 1 will be returned.\n *\n * @param {Object} rectangle\n * @param {Object} containingVertices\n */\n _getZoomRatioToFitRectangle: function (rectangle, containingVertices) {\n var rectangleVertices = this._getRectangleVertices(rectangle);\n var vertex;\n\n // Check if any of the viewport vertices end up out of bounds\n for (\n var verticeIndex = 0;\n verticeIndex < rectangleVertices.length;\n verticeIndex++\n ) {\n vertex = rectangleVertices[verticeIndex];\n\n if (!this.arePointsInsideRectangle([vertex], containingVertices)) {\n break;\n }\n\n vertex = false;\n }\n\n // If there's no vertex set after loop, it means that all of them are inside the image rectangle\n var adjustmentRatio;\n\n if (!vertex) {\n adjustmentRatio = 1;\n } else {\n // Find out which edge got crossed by the vertex\n var edge = this._getEdgeCrossed(containingVertices, vertex);\n\n var rectangleCenter = {\n x: rectangle.left + rectangle.width / 2,\n y: rectangle.top + rectangle.height / 2,\n };\n\n // Calculate how much further that edge needs to be.\n // https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line#Line_defined_by_two_points\n var distanceFromVertexToEdge =\n Math.abs(\n (edge[1].y - edge[0].y) * vertex.x -\n (edge[1].x - edge[0].x) * vertex.y +\n edge[1].x * edge[0].y -\n edge[1].y * edge[0].x\n ) /\n Math.sqrt(\n Math.pow(edge[1].y - edge[0].y, 2) +\n Math.pow(edge[1].x - edge[0].x, 2)\n );\n var distanceFromCenterToEdge =\n Math.abs(\n (edge[1].y - edge[0].y) * rectangleCenter.x -\n (edge[1].x - edge[0].x) * rectangleCenter.y +\n edge[1].x * edge[0].y -\n edge[1].y * edge[0].x\n ) /\n Math.sqrt(\n Math.pow(edge[1].y - edge[0].y, 2) +\n Math.pow(edge[1].x - edge[0].x, 2)\n );\n\n // Adjust the zoom ratio\n adjustmentRatio =\n (distanceFromVertexToEdge + distanceFromCenterToEdge) /\n distanceFromCenterToEdge;\n }\n\n return adjustmentRatio;\n },\n\n /**\n * Save the image.\n *\n * @param {Object} ev\n */\n saveImage: function (ev) {\n var $button = $(ev.currentTarget);\n if (this.saving) {\n return false;\n }\n\n this.saving = true;\n $button.addClass('loading');\n const replace = $button.hasClass('replace');\n\n var postData = {\n assetId: this.assetId,\n viewportRotation: this.viewportRotation,\n imageRotation: this.imageStraightenAngle,\n replace: replace ? 1 : 0,\n };\n\n if (this.cropperState) {\n var cropData = {};\n\n cropData.height = this.cropperState.height;\n cropData.width = this.cropperState.width;\n cropData.offsetX = this.cropperState.offsetX;\n cropData.offsetY = this.cropperState.offsetY;\n\n postData.imageDimensions = this.cropperState.imageDimensions;\n\n postData.cropData = cropData;\n } else {\n postData.imageDimensions = this.getScaledImageDimensions();\n }\n\n if (this.focalPoint) {\n postData.focalPoint = this.focalPointState;\n }\n\n postData.flipData = this.flipData;\n postData.zoom = this.zoomRatio;\n\n Craft.sendActionRequest('POST', 'assets/save-image', {data: postData})\n .then(({data}) => {\n this.onSave(data);\n if (replace && Craft.broadcaster) {\n Craft.broadcaster.postMessage({\n event: 'saveElement',\n id: this.assetId,\n });\n }\n this.hide();\n Craft.cp.runQueue();\n\n // Refresh Live Preview\n Craft.Preview.refresh();\n })\n .catch(({response}) => {\n alert(response.data.message);\n })\n .finally(() => {\n this.$buttons.find('.btn').removeClass('loading');\n this.saving = false;\n });\n },\n\n /**\n * Return image zoom ratio depending on the straighten angle to cover a viewport by given dimensions.\n *\n * @param {Object} dimensions\n */\n getZoomToCoverRatio: function (dimensions) {\n // Convert the angle to radians\n var angleInRadians =\n Math.abs(this.imageStraightenAngle) * (Math.PI / 180);\n\n // Calculate the dimensions of the scaled image using the magic of math\n var scaledWidth =\n Math.sin(angleInRadians) * dimensions.height +\n Math.cos(angleInRadians) * dimensions.width;\n var scaledHeight =\n Math.sin(angleInRadians) * dimensions.width +\n Math.cos(angleInRadians) * dimensions.height;\n\n // Calculate the ratio\n return Math.max(\n scaledWidth / dimensions.width,\n scaledHeight / dimensions.height\n );\n },\n\n /**\n * Return image zoom ratio depending on the straighten angle to fit inside a viewport by given dimensions.\n *\n * @param {Object} dimensions\n */\n getZoomToFitRatio: function (dimensions) {\n // Get the bounding box for a rotated image\n var boundingBox = this._getImageBoundingBox(dimensions);\n\n // Scale the bounding box to fit\n var scale = 1;\n if (\n boundingBox.height > this.editorHeight ||\n boundingBox.width > this.editorWidth\n ) {\n var vertScale = this.editorHeight / boundingBox.height;\n var horiScale = this.editorWidth / boundingBox.width;\n scale = Math.min(horiScale, vertScale);\n }\n\n return scale;\n },\n\n /**\n * Return the combined zoom ratio to fit a rectangle inside image that's been zoomed to fit.\n */\n getCombinedZoomRatio: function (dimensions) {\n return (\n this.getZoomToCoverRatio(dimensions) /\n this.getZoomToFitRatio(dimensions)\n );\n },\n\n /**\n * Draw the grid.\n *\n * @private\n */\n _showGrid: function () {\n if (!this.grid) {\n var strokeOptions = {\n strokeWidth: 1,\n stroke: 'rgba(255,255,255,0.5)',\n };\n\n var lineCount = 8;\n var gridWidth = this.viewport.width;\n var gridHeight = this.viewport.height;\n var xStep = gridWidth / (lineCount + 1);\n var yStep = gridHeight / (lineCount + 1);\n\n var grid = [\n new fabric.Rect({\n strokeWidth: 2,\n stroke: 'rgba(255,255,255,1)',\n originX: 'center',\n originY: 'center',\n width: gridWidth,\n height: gridHeight,\n left: gridWidth / 2,\n top: gridHeight / 2,\n fill: 'rgba(255,255,255,0)',\n }),\n ];\n\n var i;\n for (i = 1; i <= lineCount; i++) {\n grid.push(\n new fabric.Line(\n [i * xStep, 0, i * xStep, gridHeight],\n strokeOptions\n )\n );\n }\n for (i = 1; i <= lineCount; i++) {\n grid.push(\n new fabric.Line([0, i * yStep, gridWidth, i * yStep], strokeOptions)\n );\n }\n\n this.grid = new fabric.Group(grid, {\n left: this.editorWidth / 2,\n top: this.editorHeight / 2,\n originX: 'center',\n originY: 'center',\n angle: this.viewport.angle,\n });\n\n this.canvas.add(this.grid);\n this.renderImage();\n }\n },\n\n /**\n * Hide the grid\n */\n _hideGrid: function () {\n this.canvas.remove(this.grid);\n this.grid = null;\n this.renderImage();\n },\n\n /**\n * Remove all the events when hiding the editor.\n */\n onFadeOut: function () {\n this.destroy();\n },\n\n /**\n * Make sure underlying content is not scrolled by accident.\n */\n show: function () {\n this.base();\n Garnish.$bod.addClass('no-scroll');\n },\n\n /**\n * Allow the content to scroll.\n */\n hide: function () {\n this.removeAllListeners();\n this.straighteningInput.removeAllListeners();\n Garnish.$bod.removeClass('no-scroll');\n this.base();\n },\n\n /**\n * onSave callback.\n */\n onSave: function (data) {\n this.settings.onSave(data);\n this.trigger('save');\n },\n\n /**\n * Enable the rotation slider.\n */\n enableSlider: function () {\n this.$imageTools.removeClass('hidden');\n },\n\n /**\n * Disable the rotation slider.\n */\n disableSlider: function () {\n this.$imageTools.addClass('hidden');\n },\n\n /**\n * Switch to crop mode.\n */\n enableCropMode: function () {\n var imageDimensions = this.getScaledImageDimensions();\n this.zoomRatio = this.getZoomToFitRatio(imageDimensions);\n\n var viewportProperties = {\n width: this.editorWidth,\n height: this.editorHeight,\n };\n\n var imageProperties = {\n width: imageDimensions.width * this.zoomRatio,\n height: imageDimensions.height * this.zoomRatio,\n left: this.editorWidth / 2,\n top: this.editorHeight / 2,\n };\n\n var callback = () => {\n this._setFittedImageVerticeCoordinates();\n\n // Restore cropper\n var state = this.cropperState;\n var scaledImageDimensions = this.getScaledImageDimensions();\n var sizeFactor =\n scaledImageDimensions.width / state.imageDimensions.width;\n\n // Restore based on the stored information\n var cropperData = {\n left: this.image.left + state.offsetX * sizeFactor * this.zoomRatio,\n top: this.image.top + state.offsetY * sizeFactor * this.zoomRatio,\n width: state.width * sizeFactor * this.zoomRatio,\n height: state.height * sizeFactor * this.zoomRatio,\n };\n\n this._showCropper(cropperData);\n\n if (this.focalPoint) {\n sizeFactor =\n scaledImageDimensions.width /\n this.focalPointState.imageDimensions.width;\n this.focalPoint.left =\n this.image.left +\n this.focalPointState.offsetX * sizeFactor * this.zoomRatio;\n this.focalPoint.top =\n this.image.top +\n this.focalPointState.offsetY * sizeFactor * this.zoomRatio;\n this.canvas.add(this.focalPoint);\n }\n };\n\n this._editorModeTransition(callback, imageProperties, viewportProperties);\n },\n\n /**\n * Switch out of crop mode.\n */\n disableCropMode: function () {\n var viewportProperties = {};\n\n this._hideCropper();\n var imageDimensions = this.getScaledImageDimensions();\n var targetZoom =\n this.getZoomToCoverRatio(imageDimensions) * this.scaleFactor;\n var inverseZoomFactor = targetZoom / this.zoomRatio;\n this.zoomRatio = targetZoom;\n\n var imageProperties = {\n width: imageDimensions.width * this.zoomRatio,\n height: imageDimensions.height * this.zoomRatio,\n left: this.editorWidth / 2,\n top: this.editorHeight / 2,\n };\n\n var offsetX = this.clipper.left - this.image.left;\n var offsetY = this.clipper.top - this.image.top;\n\n var imageOffsetX = offsetX * inverseZoomFactor;\n var imageOffsetY = offsetY * inverseZoomFactor;\n imageProperties.left = this.editorWidth / 2 - imageOffsetX;\n imageProperties.top = this.editorHeight / 2 - imageOffsetY;\n\n // Calculate the cropper dimensions after all the zooming\n viewportProperties.height = this.clipper.height * inverseZoomFactor;\n viewportProperties.width = this.clipper.width * inverseZoomFactor;\n\n if (\n !this.focalPoint ||\n (this.focalPoint &&\n !this._isCenterInside(this.focalPoint, this.clipper))\n ) {\n if (this.focalPoint) {\n this.toggleFocalPoint();\n }\n\n this._resetFocalPointPosition();\n }\n\n var callback = () => {\n // Reposition focal point correctly\n if (this.focalPoint) {\n var sizeFactor =\n this.getScaledImageDimensions().width /\n this.focalPointState.imageDimensions.width;\n this.focalPoint.left =\n this.image.left +\n this.focalPointState.offsetX * sizeFactor * this.zoomRatio;\n this.focalPoint.top =\n this.image.top +\n this.focalPointState.offsetY * sizeFactor * this.zoomRatio;\n this.canvas.add(this.focalPoint);\n }\n };\n\n this._editorModeTransition(callback, imageProperties, viewportProperties);\n },\n\n /**\n * @callback editorModeTransitionCallback\n */\n /**\n * Transition between cropping end editor modes\n *\n * @param {editorModeTransitionCallback}\n * @param {Object} imageProperties\n * @param {Object} viewportProperties\n * @private\n */\n _editorModeTransition: function (\n callback,\n imageProperties,\n viewportProperties\n ) {\n this._queue.pause();\n\n if (!this.animationInProgress) {\n this.animationInProgress = true;\n\n // Without this it looks semi-broken during animation\n if (this.focalPoint) {\n this.canvas.remove(this.focalPoint);\n this.renderImage();\n }\n\n this.image.animate(imageProperties, {\n onChange: this.canvas.renderAll.bind(this.canvas),\n duration: this.settings.animationDuration,\n onComplete: () => {\n callback();\n this.animationInProgress = false;\n this.renderImage();\n this._queue.resume();\n },\n });\n\n this.viewport.animate(viewportProperties, {\n duration: this.settings.animationDuration,\n });\n }\n },\n\n _showSpinner: function () {\n if (!this.$spinner) {\n this.$spinner = $('<div class=\"spinner big spinner-absolute\"/>');\n }\n this.$spinner.appendTo(this.$container.find('.image'));\n },\n\n _hideSpinner: function () {\n this.$spinner.remove();\n },\n\n /**\n * Show the cropper.\n *\n * @param {Object} clipperData\n */\n _showCropper: function (clipperData) {\n this._setupCropperLayer(clipperData);\n this._redrawCropperElements();\n this.renderCropper();\n },\n\n /**\n * Hide the cropper.\n */\n _hideCropper: function () {\n if (this.clipper) {\n this.croppingCanvas.remove(this.clipper);\n this.croppingCanvas.remove(this.croppingShade);\n this.croppingCanvas.remove(this.cropperHandles);\n this.croppingCanvas.remove(this.cropperGrid);\n this.croppingCanvas.remove(this.croppingRectangle);\n\n this.croppingCanvas = null;\n this.renderCropper = null;\n }\n },\n\n /**\n * Draw the cropper.\n *\n * @param {Object} clipperData\n */\n _setupCropperLayer: function (clipperData) {\n // Set up the canvas for cropper\n this.croppingCanvas = new fabric.StaticCanvas('cropping-canvas', {\n backgroundColor: 'rgba(0,0,0,0)',\n hoverCursor: 'default',\n selection: false,\n });\n\n this.croppingCanvas.setDimensions({\n width: this.editorWidth,\n height: this.editorHeight,\n });\n\n this.renderCropper = () =>\n Garnish.requestAnimationFrame(\n this.croppingCanvas.renderAll.bind(this.croppingCanvas)\n );\n\n $('#cropping-canvas', this.$editorContainer).css({\n position: 'absolute',\n top: 0,\n left: 0,\n });\n\n this.croppingShade = new fabric.Rect({\n left: this.editorWidth / 2,\n top: this.editorHeight / 2,\n originX: 'center',\n originY: 'center',\n width: this.editorWidth,\n height: this.editorHeight,\n fill: 'rgba(0,0,0,0.7)',\n });\n\n // Calculate the cropping rectangle size\n var imageDimensions = this.getScaledImageDimensions();\n var rectangleRatio =\n this.imageStraightenAngle === 0\n ? 1\n : this.getCombinedZoomRatio(imageDimensions) * 1.2;\n var rectWidth = imageDimensions.width / rectangleRatio;\n var rectHeight = imageDimensions.height / rectangleRatio;\n\n if (this.hasOrientationChanged()) {\n var temp = rectHeight;\n rectHeight = rectWidth;\n rectWidth = temp;\n }\n\n // Set up the cropping viewport rectangle\n this.clipper = new fabric.Rect({\n left: this.editorWidth / 2,\n top: this.editorHeight / 2,\n originX: 'center',\n originY: 'center',\n width: rectWidth,\n height: rectHeight,\n stroke: 'black',\n fill: 'rgba(128,0,0,1)',\n strokeWidth: 0,\n });\n\n // Set from clipper data\n if (clipperData) {\n this.clipper.set(clipperData);\n }\n\n this.clipper.globalCompositeOperation = 'destination-out';\n this.croppingCanvas.add(this.croppingShade);\n this.croppingCanvas.add(this.clipper);\n },\n\n /**\n * Redraw the cropper boundaries\n */\n _redrawCropperElements: function () {\n if (typeof this._redrawCropperElements._ === 'undefined') {\n this._redrawCropperElements._ = {};\n }\n\n if (this.cropperHandles) {\n this.croppingCanvas.remove(this.cropperHandles);\n this.croppingCanvas.remove(this.cropperGrid);\n this.croppingCanvas.remove(this.croppingRectangle);\n }\n this._redrawCropperElements._.lineOptions = {\n strokeWidth: 4,\n stroke: 'rgb(255,255,255)',\n fill: false,\n };\n\n this._redrawCropperElements._.gridOptions = {\n strokeWidth: 2,\n stroke: 'rgba(255,255,255,0.5)',\n };\n\n // Draw the handles\n this._redrawCropperElements._.pathGroup = [\n new fabric.Path(\n 'M 0,10 L 0,0 L 10,0',\n this._redrawCropperElements._.lineOptions\n ),\n new fabric.Path(\n 'M ' +\n (this.clipper.width - 8) +\n ',0 L ' +\n (this.clipper.width + 4) +\n ',0 L ' +\n (this.clipper.width + 4) +\n ',10',\n this._redrawCropperElements._.lineOptions\n ),\n new fabric.Path(\n 'M ' +\n (this.clipper.width + 4) +\n ',' +\n (this.clipper.height - 8) +\n ' L' +\n (this.clipper.width + 4) +\n ',' +\n (this.clipper.height + 4) +\n ' L ' +\n (this.clipper.width - 8) +\n ',' +\n (this.clipper.height + 4),\n this._redrawCropperElements._.lineOptions\n ),\n new fabric.Path(\n 'M 10,' +\n (this.clipper.height + 4) +\n ' L 0,' +\n (this.clipper.height + 4) +\n ' L 0,' +\n (this.clipper.height - 8),\n this._redrawCropperElements._.lineOptions\n ),\n ];\n\n this.cropperHandles = new fabric.Group(\n this._redrawCropperElements._.pathGroup,\n {\n left: this.clipper.left,\n top: this.clipper.top,\n originX: 'center',\n originY: 'center',\n }\n );\n\n // Don't forget the rectangle\n this.croppingRectangle = new fabric.Rect({\n left: this.clipper.left,\n top: this.clipper.top,\n width: this.clipper.width,\n height: this.clipper.height,\n fill: 'rgba(0,0,0,0)',\n stroke: 'rgba(255,255,255,0.8)',\n strokeWidth: 2,\n originX: 'center',\n originY: 'center',\n });\n\n this.cropperGrid = new fabric.Group(\n [\n new fabric.Line(\n [\n this.clipper.width * 0.33,\n 0,\n this.clipper.width * 0.33,\n this.clipper.height,\n ],\n this._redrawCropperElements._.gridOptions\n ),\n new fabric.Line(\n [\n this.clipper.width * 0.66,\n 0,\n this.clipper.width * 0.66,\n this.clipper.height,\n ],\n this._redrawCropperElements._.gridOptions\n ),\n new fabric.Line(\n [\n 0,\n this.clipper.height * 0.33,\n this.clipper.width,\n this.clipper.height * 0.33,\n ],\n this._redrawCropperElements._.gridOptions\n ),\n new fabric.Line(\n [\n 0,\n this.clipper.height * 0.66,\n this.clipper.width,\n this.clipper.height * 0.66,\n ],\n this._redrawCropperElements._.gridOptions\n ),\n ],\n {\n left: this.clipper.left,\n top: this.clipper.top,\n originX: 'center',\n originY: 'center',\n }\n );\n\n this._redrawCropperElements._.cropTextTop =\n this.croppingRectangle.top + this.clipper.height / 2 + 12;\n this._redrawCropperElements._.cropTextBackgroundColor = 'rgba(0,0,0,0)';\n\n if (\n this._redrawCropperElements._.cropTextTop + 12 >\n this.editorHeight - 2\n ) {\n this._redrawCropperElements._.cropTextTop -= 24;\n this._redrawCropperElements._.cropTextBackgroundColor =\n 'rgba(0,0,0,0.5)';\n }\n\n this.croppingCanvas.add(this.cropperHandles);\n this.croppingCanvas.add(this.cropperGrid);\n this.croppingCanvas.add(this.croppingRectangle);\n },\n\n /**\n * Reposition the cropper when the image editor dimensions change.\n *\n * @param {Object} previousImageArea\n */\n _repositionCropper: function (previousImageArea) {\n if (!this.croppingCanvas) {\n return;\n }\n\n // Get the current clipper offset relative to center\n var currentOffset = {\n x: this.clipper.left - this.croppingCanvas.width / 2,\n y: this.clipper.top - this.croppingCanvas.height / 2,\n };\n\n // Resize the cropping canvas\n this.croppingCanvas.setDimensions({\n width: this.editorWidth,\n height: this.editorHeight,\n });\n\n // Check by what factor will the new final bounding box be different\n var currentArea = this._getBoundingRectangle(this.imageVerticeCoords);\n var areaFactor = currentArea.width / previousImageArea.width;\n\n // Adjust the cropper size to scale along with the bounding box\n this.clipper.width = Math.round(this.clipper.width * areaFactor);\n this.clipper.height = Math.round(this.clipper.height * areaFactor);\n\n // Adjust the coordinates: re-position clipper in relation to the new center to adjust\n // for editor size changes and then multiply by the size factor to adjust for image size changes\n this.clipper.left = this.editorWidth / 2 + currentOffset.x * areaFactor;\n this.clipper.top = this.editorHeight / 2 + currentOffset.y * areaFactor;\n\n // Resize the cropping shade\n this.croppingShade.set({\n width: this.editorWidth,\n height: this.editorHeight,\n left: this.editorWidth / 2,\n top: this.editorHeight / 2,\n });\n\n this._redrawCropperElements();\n this.renderCropper();\n },\n\n /**\n * Get the dimensions of a bounding rectangle by a set of four coordinates.\n *\n * @param {Object} coordinateSet\n */\n _getBoundingRectangle: function (coordinateSet) {\n return {\n width:\n Math.max(\n coordinateSet.a.x,\n coordinateSet.b.x,\n coordinateSet.c.x,\n coordinateSet.d.x\n ) -\n Math.min(\n coordinateSet.a.x,\n coordinateSet.b.x,\n coordinateSet.c.x,\n coordinateSet.d.x\n ),\n height:\n Math.max(\n coordinateSet.a.y,\n coordinateSet.b.y,\n coordinateSet.c.y,\n coordinateSet.d.y\n ) -\n Math.min(\n coordinateSet.a.y,\n coordinateSet.b.y,\n coordinateSet.c.y,\n coordinateSet.d.y\n ),\n };\n },\n\n /**\n * Handle the mouse being clicked.\n *\n * @param {Object} ev\n */\n _handleMouseDown: function (ev) {\n // Focal before resize before dragging\n var focal = this.focalPoint && this._isMouseOver(ev, this.focalPoint);\n var move = this.croppingCanvas && this._isMouseOver(ev, this.clipper);\n var handle = this.croppingCanvas && this._cropperHandleHitTest(ev);\n\n if (handle || move || focal) {\n this.previousMouseX = ev.pageX;\n this.previousMouseY = ev.pageY;\n\n if (focal) {\n this.draggingFocal = true;\n } else if (handle) {\n this.scalingCropper = handle;\n } else if (move) {\n this.draggingCropper = true;\n }\n }\n },\n\n /**\n * Handle the mouse being moved.\n *\n * @param {Object} ev\n */\n _handleMouseMove: function (ev) {\n if (this.mouseMoveEvent !== null) {\n Garnish.requestAnimationFrame(this._handleMouseMoveInternal.bind(this));\n }\n this.mouseMoveEvent = ev;\n },\n\n _handleMouseMoveInternal: function () {\n if (this.mouseMoveEvent === null) {\n return;\n }\n\n if (this.focalPoint && this.draggingFocal) {\n this._handleFocalDrag(this.mouseMoveEvent);\n this.storeFocalPointState();\n this.renderImage();\n } else if (this.draggingCropper || this.scalingCropper) {\n if (this.draggingCropper) {\n this._handleCropperDrag(this.mouseMoveEvent);\n } else {\n this._handleCropperResize(this.mouseMoveEvent);\n }\n\n this._redrawCropperElements();\n\n this.storeCropperState();\n this.renderCropper();\n } else {\n this._setMouseCursor(this.mouseMoveEvent);\n }\n\n this.previousMouseX = this.mouseMoveEvent.pageX;\n this.previousMouseY = this.mouseMoveEvent.pageY;\n\n this.mouseMoveEvent = null;\n },\n\n /**\n * Handle mouse being released.\n */\n _handleMouseUp: function () {\n this.draggingCropper = false;\n this.scalingCropper = false;\n this.draggingFocal = false;\n },\n\n /**\n * Handle mouse out\n *\n * @param {Object} ev\n */\n _handleMouseOut: function (ev) {\n this._handleMouseUp(ev);\n this.mouseMoveEvent = ev;\n this._handleMouseMoveInternal();\n },\n\n /**\n * Handle cropper being dragged.\n *\n * @param {Object} ev\n */\n _handleCropperDrag: function (ev) {\n if (typeof this._handleCropperDrag._ === 'undefined') {\n this._handleCropperDrag._ = {};\n }\n\n this._handleCropperDrag._.deltaX = ev.pageX - this.previousMouseX;\n this._handleCropperDrag._.deltaY = ev.pageY - this.previousMouseY;\n\n if (\n this._handleCropperDrag._.deltaX === 0 &&\n this._handleCropperDrag._.deltaY === 0\n ) {\n return false;\n }\n\n this._handleCropperDrag._.rectangle = {\n left: this.clipper.left - this.clipper.width / 2,\n top: this.clipper.top - this.clipper.height / 2,\n width: this.clipper.width,\n height: this.clipper.height,\n };\n\n this._handleCropperDrag._.vertices = this._getRectangleVertices(\n this._handleCropperDrag._.rectangle,\n this._handleCropperDrag._.deltaX,\n this._handleCropperDrag._.deltaY\n );\n\n // If this would drag it outside of the image\n if (\n !this.arePointsInsideRectangle(\n this._handleCropperDrag._.vertices,\n this.imageVerticeCoords\n )\n ) {\n // Try to find the furthest point in the same general direction where we can drag it\n\n // Delta iterator setup\n this._handleCropperDrag._.dxi = 0;\n this._handleCropperDrag._.dyi = 0;\n this._handleCropperDrag._.xStep =\n this._handleCropperDrag._.deltaX > 0 ? -1 : 1;\n this._handleCropperDrag._.yStep =\n this._handleCropperDrag._.deltaY > 0 ? -1 : 1;\n\n // The furthest we can move\n this._handleCropperDrag._.furthest = 0;\n this._handleCropperDrag._.furthestDeltas = {};\n\n // Loop through every combination of dragging it not so far\n for (\n this._handleCropperDrag._.dxi = Math.min(\n Math.abs(this._handleCropperDrag._.deltaX),\n 10\n );\n this._handleCropperDrag._.dxi >= 0;\n this._handleCropperDrag._.dxi--\n ) {\n for (\n this._handleCropperDrag._.dyi = Math.min(\n Math.abs(this._handleCropperDrag._.deltaY),\n 10\n );\n this._handleCropperDrag._.dyi >= 0;\n this._handleCropperDrag._.dyi--\n ) {\n this._handleCropperDrag._.vertices = this._getRectangleVertices(\n this._handleCropperDrag._.rectangle,\n this._handleCropperDrag._.dxi *\n (this._handleCropperDrag._.deltaX > 0 ? 1 : -1),\n this._handleCropperDrag._.dyi *\n (this._handleCropperDrag._.deltaY > 0 ? 1 : -1)\n );\n\n if (\n this.arePointsInsideRectangle(\n this._handleCropperDrag._.vertices,\n this.imageVerticeCoords\n )\n ) {\n if (\n this._handleCropperDrag._.dxi + this._handleCropperDrag._.dyi >\n this._handleCropperDrag._.furthest\n ) {\n this._handleCropperDrag._.furthest =\n this._handleCropperDrag._.dxi + this._handleCropperDrag._.dyi;\n this._handleCropperDrag._.furthestDeltas = {\n x:\n this._handleCropperDrag._.dxi *\n (this._handleCropperDrag._.deltaX > 0 ? 1 : -1),\n y:\n this._handleCropperDrag._.dyi *\n (this._handleCropperDrag._.deltaY > 0 ? 1 : -1),\n };\n }\n }\n }\n }\n\n // REALLY can't drag along the cursor movement\n if (this._handleCropperDrag._.furthest == 0) {\n return;\n } else {\n this._handleCropperDrag._.deltaX =\n this._handleCropperDrag._.furthestDeltas.x;\n this._handleCropperDrag._.deltaY =\n this._handleCropperDrag._.furthestDeltas.y;\n }\n }\n\n this.clipper.set({\n left: this.clipper.left + this._handleCropperDrag._.deltaX,\n top: this.clipper.top + this._handleCropperDrag._.deltaY,\n });\n },\n\n /**\n * Handle focal point being dragged.\n *\n * @param {Object} ev\n */\n _handleFocalDrag: function (ev) {\n if (typeof this._handleFocalDrag._ === 'undefined') {\n this._handleFocalDrag._ = {};\n }\n\n if (this.focalPoint) {\n this._handleFocalDrag._.deltaX = ev.pageX - this.previousMouseX;\n this._handleFocalDrag._.deltaY = ev.pageY - this.previousMouseY;\n\n if (\n this._handleFocalDrag._.deltaX === 0 &&\n this._handleFocalDrag._.deltaY === 0\n ) {\n return;\n }\n\n this._handleFocalDrag._.newX =\n this.focalPoint.left + this._handleFocalDrag._.deltaX;\n this._handleFocalDrag._.newY =\n this.focalPoint.top + this._handleFocalDrag._.deltaY;\n\n // Just make sure that the focal point stays inside the image\n if (this.currentView === 'crop') {\n if (\n !this.arePointsInsideRectangle(\n [\n {\n x: this._handleFocalDrag._.newX,\n y: this._handleFocalDrag._.newY,\n },\n ],\n this.imageVerticeCoords\n )\n ) {\n return;\n }\n } else {\n if (\n !(\n this.viewport.left -\n this.viewport.width / 2 -\n this._handleFocalDrag._.newX <\n 0 &&\n this.viewport.left +\n this.viewport.width / 2 -\n this._handleFocalDrag._.newX >\n 0 &&\n this.viewport.top -\n this.viewport.height / 2 -\n this._handleFocalDrag._.newY <\n 0 &&\n this.viewport.top +\n this.viewport.height / 2 -\n this._handleFocalDrag._.newY >\n 0\n )\n ) {\n return;\n }\n }\n\n this.focalPoint.set({\n left: this.focalPoint.left + this._handleFocalDrag._.deltaX,\n top: this.focalPoint.top + this._handleFocalDrag._.deltaY,\n });\n }\n },\n\n /**\n * Set the cropping constraint\n * @param {string} constraint\n */\n setCroppingConstraint: function (constraint) {\n // In case this caused the sidebar width to change.\n this.updateSizeAndPosition();\n\n switch (constraint) {\n case 'none':\n this.croppingConstraint = false;\n break;\n\n case 'original':\n this.croppingConstraint = this.originalWidth / this.originalHeight;\n break;\n\n case 'current':\n this.croppingConstraint = this.clipper.width / this.clipper.height;\n break;\n\n case 'custom':\n break;\n default:\n this.croppingConstraint = parseFloat(constraint);\n\n break;\n }\n },\n\n /**\n * Enforce the cropping constraint\n */\n enforceCroppingConstraint: function () {\n if (typeof this.enforceCroppingConstraint._ === 'undefined') {\n this.enforceCroppingConstraint._ = {};\n }\n\n if (this.animationInProgress || !this.croppingConstraint) {\n return;\n }\n\n this.animationInProgress = true;\n\n // Mock the clipping rectangle for collision tests\n this.enforceCroppingConstraint._.rectangle = {\n left: this.clipper.left - this.clipper.width / 2,\n top: this.clipper.top - this.clipper.height / 2,\n width: this.clipper.width,\n height: this.clipper.height,\n };\n\n // If wider than it should be\n if (this.clipper.width > this.clipper.height * this.croppingConstraint) {\n this.enforceCroppingConstraint._.previousHeight =\n this.enforceCroppingConstraint._.rectangle.height;\n\n // Make it taller!\n this.enforceCroppingConstraint._.rectangle.height =\n this.clipper.width / this.croppingConstraint;\n\n // Getting really awkward having to convert between 0;0 being center or top-left corner.\n this.enforceCroppingConstraint._.rectangle.top -=\n (this.enforceCroppingConstraint._.rectangle.height -\n this.enforceCroppingConstraint._.previousHeight) /\n 2;\n\n // If the clipper would end up out of bounds, make it narrower instead.\n if (\n !this.arePointsInsideRectangle(\n this._getRectangleVertices(\n this.enforceCroppingConstraint._.rectangle\n ),\n this.imageVerticeCoords\n )\n ) {\n this.enforceCroppingConstraint._.rectangle.width =\n this.clipper.height * this.croppingConstraint;\n this.enforceCroppingConstraint._.rectangle.height =\n this.enforceCroppingConstraint._.rectangle.width /\n this.croppingConstraint;\n }\n } else {\n // Follow the same pattern, if taller than it should be.\n this.enforceCroppingConstraint._.previousWidth =\n this.enforceCroppingConstraint._.rectangle.width;\n this.enforceCroppingConstraint._.rectangle.width =\n this.clipper.height * this.croppingConstraint;\n this.enforceCroppingConstraint._.rectangle.left -=\n (this.enforceCroppingConstraint._.rectangle.width -\n this.enforceCroppingConstraint._.previousWidth) /\n 2;\n\n if (\n !this.arePointsInsideRectangle(\n this._getRectangleVertices(\n this.enforceCroppingConstraint._.rectangle\n ),\n this.imageVerticeCoords\n )\n ) {\n this.enforceCroppingConstraint._.rectangle.height =\n this.clipper.width / this.croppingConstraint;\n this.enforceCroppingConstraint._.rectangle.width =\n this.enforceCroppingConstraint._.rectangle.height *\n this.croppingConstraint;\n }\n }\n\n this.enforceCroppingConstraint._.properties = {\n height: this.enforceCroppingConstraint._.rectangle.height,\n width: this.enforceCroppingConstraint._.rectangle.width,\n };\n\n // Make sure to redraw cropper handles and gridlines when resizing\n this.clipper.animate(this.enforceCroppingConstraint._.properties, {\n onChange: () => {\n this._redrawCropperElements();\n this.croppingCanvas.renderAll();\n },\n duration: this.settings.animationDuration,\n onComplete: () => {\n this._redrawCropperElements();\n this.animationInProgress = false;\n this.renderCropper();\n this.storeCropperState();\n },\n });\n },\n\n /**\n * Handle cropper being resized.\n *\n * @param {Object} ev\n */\n _handleCropperResize: function (ev) {\n if (typeof this._handleCropperResize._ === 'undefined') {\n this._handleCropperResize._ = {};\n }\n\n // Size deltas\n this._handleCropperResize._.deltaX = ev.pageX - this.previousMouseX;\n this._handleCropperResize._.deltaY = ev.pageY - this.previousMouseY;\n\n if (this.scalingCropper === 'b' || this.scalingCropper === 't') {\n this._handleCropperResize._.deltaX = 0;\n }\n\n if (this.scalingCropper === 'l' || this.scalingCropper === 'r') {\n this._handleCropperResize._.deltaY = 0;\n }\n\n if (\n this._handleCropperResize._.deltaX === 0 &&\n this._handleCropperResize._.deltaY === 0\n ) {\n return;\n }\n\n // Translate from center-center origin to absolute coords\n this._handleCropperResize._.startingRectangle = {\n left: this.clipper.left - this.clipper.width / 2,\n top: this.clipper.top - this.clipper.height / 2,\n width: this.clipper.width,\n height: this.clipper.height,\n };\n\n this._handleCropperResize._.rectangle =\n this._calculateNewCropperSizeByDeltas(\n this._handleCropperResize._.startingRectangle,\n this._handleCropperResize._.deltaX,\n this._handleCropperResize._.deltaY,\n this.scalingCropper\n );\n\n if (\n this._handleCropperResize._.rectangle.height < 30 ||\n this._handleCropperResize._.rectangle.width < 30\n ) {\n return;\n }\n\n if (\n !this.arePointsInsideRectangle(\n this._getRectangleVertices(this._handleCropperResize._.rectangle),\n this.imageVerticeCoords\n )\n ) {\n return;\n }\n\n // Translate back to center-center origin.\n this.clipper.set({\n top:\n this._handleCropperResize._.rectangle.top +\n this._handleCropperResize._.rectangle.height / 2,\n left:\n this._handleCropperResize._.rectangle.left +\n this._handleCropperResize._.rectangle.width / 2,\n width: this._handleCropperResize._.rectangle.width,\n height: this._handleCropperResize._.rectangle.height,\n });\n\n this._redrawCropperElements();\n },\n\n _calculateNewCropperSizeByDeltas: function (\n startingRectangle,\n deltaX,\n deltaY,\n cropperDirection\n ) {\n if (typeof this._calculateNewCropperSizeByDeltas._ === 'undefined') {\n this._calculateNewCropperSizeByDeltas._ = {};\n }\n\n // Center deltas\n this._calculateNewCropperSizeByDeltas._.topDelta = 0;\n this._calculateNewCropperSizeByDeltas._.leftDelta = 0;\n\n this._calculateNewCropperSizeByDeltas._.rectangle = startingRectangle;\n this._calculateNewCropperSizeByDeltas._.deltaX = deltaX;\n this._calculateNewCropperSizeByDeltas._.deltaY = deltaY;\n\n // Lock the aspect ratio if needed\n if (this.croppingConstraint) {\n this._calculateNewCropperSizeByDeltas._.change = 0;\n\n // Take into account the mouse direction and figure out the \"real\" change in cropper size\n switch (cropperDirection) {\n case 't':\n this._calculateNewCropperSizeByDeltas._.change =\n -this._calculateNewCropperSizeByDeltas._.deltaY;\n break;\n case 'b':\n this._calculateNewCropperSizeByDeltas._.change =\n this._calculateNewCropperSizeByDeltas._.deltaY;\n break;\n case 'r':\n this._calculateNewCropperSizeByDeltas._.change =\n this._calculateNewCropperSizeByDeltas._.deltaX;\n break;\n case 'l':\n this._calculateNewCropperSizeByDeltas._.change =\n -this._calculateNewCropperSizeByDeltas._.deltaX;\n break;\n case 'tr':\n this._calculateNewCropperSizeByDeltas._.change =\n Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY) >\n Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)\n ? -this._calculateNewCropperSizeByDeltas._.deltaY\n : this._calculateNewCropperSizeByDeltas._.deltaX;\n break;\n case 'tl':\n this._calculateNewCropperSizeByDeltas._.change =\n Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY) >\n Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)\n ? -this._calculateNewCropperSizeByDeltas._.deltaY\n : -this._calculateNewCropperSizeByDeltas._.deltaX;\n break;\n case 'br':\n this._calculateNewCropperSizeByDeltas._.change =\n Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY) >\n Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)\n ? this._calculateNewCropperSizeByDeltas._.deltaY\n : this._calculateNewCropperSizeByDeltas._.deltaX;\n break;\n case 'bl':\n this._calculateNewCropperSizeByDeltas._.change =\n Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY) >\n Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)\n ? this._calculateNewCropperSizeByDeltas._.deltaY\n : -this._calculateNewCropperSizeByDeltas._.deltaX;\n break;\n }\n\n if (this.croppingConstraint > 1) {\n this._calculateNewCropperSizeByDeltas._.deltaX =\n this._calculateNewCropperSizeByDeltas._.change;\n this._calculateNewCropperSizeByDeltas._.deltaY =\n this._calculateNewCropperSizeByDeltas._.deltaX /\n this.croppingConstraint;\n } else {\n this._calculateNewCropperSizeByDeltas._.deltaY =\n this._calculateNewCropperSizeByDeltas._.change;\n this._calculateNewCropperSizeByDeltas._.deltaX =\n this._calculateNewCropperSizeByDeltas._.deltaY *\n this.croppingConstraint;\n }\n\n this._calculateNewCropperSizeByDeltas._.rectangle.height +=\n this._calculateNewCropperSizeByDeltas._.deltaY;\n this._calculateNewCropperSizeByDeltas._.rectangle.width +=\n this._calculateNewCropperSizeByDeltas._.deltaX;\n\n // Make the cropper compress/expand relative to the correct edge to make it feel \"right\"\n switch (cropperDirection) {\n case 't':\n this._calculateNewCropperSizeByDeltas._.rectangle.top -=\n this._calculateNewCropperSizeByDeltas._.deltaY;\n this._calculateNewCropperSizeByDeltas._.rectangle.left -=\n this._calculateNewCropperSizeByDeltas._.deltaX / 2;\n break;\n case 'b':\n this._calculateNewCropperSizeByDeltas._.rectangle.left +=\n -this._calculateNewCropperSizeByDeltas._.deltaX / 2;\n break;\n case 'r':\n this._calculateNewCropperSizeByDeltas._.rectangle.top +=\n -this._calculateNewCropperSizeByDeltas._.deltaY / 2;\n break;\n case 'l':\n this._calculateNewCropperSizeByDeltas._.rectangle.top -=\n this._calculateNewCropperSizeByDeltas._.deltaY / 2;\n this._calculateNewCropperSizeByDeltas._.rectangle.left -=\n this._calculateNewCropperSizeByDeltas._.deltaX;\n break;\n case 'tr':\n this._calculateNewCropperSizeByDeltas._.rectangle.top -=\n this._calculateNewCropperSizeByDeltas._.deltaY;\n break;\n case 'tl':\n this._calculateNewCropperSizeByDeltas._.rectangle.top -=\n this._calculateNewCropperSizeByDeltas._.deltaY;\n this._calculateNewCropperSizeByDeltas._.rectangle.left -=\n this._calculateNewCropperSizeByDeltas._.deltaX;\n break;\n case 'bl':\n this._calculateNewCropperSizeByDeltas._.rectangle.left -=\n this._calculateNewCropperSizeByDeltas._.deltaX;\n break;\n }\n } else {\n // Lock the aspect ratio\n if (\n this.shiftKeyHeld &&\n (cropperDirection === 'tl' ||\n cropperDirection === 'tr' ||\n cropperDirection === 'bl' ||\n cropperDirection === 'br')\n ) {\n this._calculateNewCropperSizeByDeltas._.ratio;\n if (Math.abs(deltaX) > Math.abs(deltaY)) {\n this._calculateNewCropperSizeByDeltas._.ratio =\n startingRectangle.width / startingRectangle.height;\n this._calculateNewCropperSizeByDeltas._.deltaY =\n this._calculateNewCropperSizeByDeltas._.deltaX /\n this._calculateNewCropperSizeByDeltas._.ratio;\n this._calculateNewCropperSizeByDeltas._.deltaY *=\n cropperDirection === 'tr' || cropperDirection === 'bl' ? -1 : 1;\n } else {\n this._calculateNewCropperSizeByDeltas._.ratio =\n startingRectangle.width / startingRectangle.height;\n this._calculateNewCropperSizeByDeltas._.deltaX =\n this._calculateNewCropperSizeByDeltas._.deltaY *\n this._calculateNewCropperSizeByDeltas._.ratio;\n this._calculateNewCropperSizeByDeltas._.deltaX *=\n cropperDirection === 'tr' || cropperDirection === 'bl' ? -1 : 1;\n }\n }\n\n if (cropperDirection.match(/t/)) {\n this._calculateNewCropperSizeByDeltas._.rectangle.top +=\n this._calculateNewCropperSizeByDeltas._.deltaY;\n this._calculateNewCropperSizeByDeltas._.rectangle.height -=\n this._calculateNewCropperSizeByDeltas._.deltaY;\n }\n if (cropperDirection.match(/b/)) {\n this._calculateNewCropperSizeByDeltas._.rectangle.height +=\n this._calculateNewCropperSizeByDeltas._.deltaY;\n }\n if (cropperDirection.match(/r/)) {\n this._calculateNewCropperSizeByDeltas._.rectangle.width +=\n this._calculateNewCropperSizeByDeltas._.deltaX;\n }\n if (cropperDirection.match(/l/)) {\n this._calculateNewCropperSizeByDeltas._.rectangle.left +=\n this._calculateNewCropperSizeByDeltas._.deltaX;\n this._calculateNewCropperSizeByDeltas._.rectangle.width -=\n this._calculateNewCropperSizeByDeltas._.deltaX;\n }\n }\n\n this._calculateNewCropperSizeByDeltas._.rectangle.top =\n this._calculateNewCropperSizeByDeltas._.rectangle.top;\n this._calculateNewCropperSizeByDeltas._.rectangle.left =\n this._calculateNewCropperSizeByDeltas._.rectangle.left;\n this._calculateNewCropperSizeByDeltas._.rectangle.width =\n this._calculateNewCropperSizeByDeltas._.rectangle.width;\n this._calculateNewCropperSizeByDeltas._.rectangle.height =\n this._calculateNewCropperSizeByDeltas._.rectangle.height;\n\n return this._calculateNewCropperSizeByDeltas._.rectangle;\n },\n\n /**\n * Set mouse cursor by it's position over cropper.\n *\n * @param {Object} ev\n */\n _setMouseCursor: function (ev) {\n if (typeof this._setMouseCursor._ === 'undefined') {\n this._setMouseCursor._ = {};\n }\n\n if (Garnish.isMobileBrowser(true)) {\n return;\n }\n this._setMouseCursor._.cursor = 'default';\n this._setMouseCursor._.handle =\n this.croppingCanvas && this._cropperHandleHitTest(ev);\n if (this.focalPoint && this._isMouseOver(ev, this.focalPoint)) {\n this._setMouseCursor._.cursor = 'pointer';\n } else if (this._setMouseCursor._.handle) {\n if (\n this._setMouseCursor._.handle === 't' ||\n this._setMouseCursor._.handle === 'b'\n ) {\n this._setMouseCursor._.cursor = 'ns-resize';\n } else if (\n this._setMouseCursor._.handle === 'l' ||\n this._setMouseCursor._.handle === 'r'\n ) {\n this._setMouseCursor._.cursor = 'ew-resize';\n } else if (\n this._setMouseCursor._.handle === 'tl' ||\n this._setMouseCursor._.handle === 'br'\n ) {\n this._setMouseCursor._.cursor = 'nwse-resize';\n } else if (\n this._setMouseCursor._.handle === 'bl' ||\n this._setMouseCursor._.handle === 'tr'\n ) {\n this._setMouseCursor._.cursor = 'nesw-resize';\n }\n } else if (this.croppingCanvas && this._isMouseOver(ev, this.clipper)) {\n this._setMouseCursor._.cursor = 'move';\n }\n\n $('.body').css('cursor', this._setMouseCursor._.cursor);\n },\n\n /**\n * Test whether the mouse cursor is on any cropper handles.\n *\n * @param {Object} ev\n */\n _cropperHandleHitTest: function (ev) {\n if (typeof this._cropperHandleHitTest._ === 'undefined') {\n this._cropperHandleHitTest._ = {};\n }\n\n this._cropperHandleHitTest._.parentOffset = this.$croppingCanvas.offset();\n this._cropperHandleHitTest._.mouseX =\n ev.pageX - this._cropperHandleHitTest._.parentOffset.left;\n this._cropperHandleHitTest._.mouseY =\n ev.pageY - this._cropperHandleHitTest._.parentOffset.top;\n\n // Compensate for center origin coordinate-wise\n this._cropperHandleHitTest._.lb =\n this.clipper.left - this.clipper.width / 2;\n this._cropperHandleHitTest._.rb =\n this._cropperHandleHitTest._.lb + this.clipper.width;\n this._cropperHandleHitTest._.tb =\n this.clipper.top - this.clipper.height / 2;\n this._cropperHandleHitTest._.bb =\n this._cropperHandleHitTest._.tb + this.clipper.height;\n\n // Left side top/bottom\n if (\n this._cropperHandleHitTest._.mouseX <\n this._cropperHandleHitTest._.lb + 10 &&\n this._cropperHandleHitTest._.mouseX >\n this._cropperHandleHitTest._.lb - 3\n ) {\n if (\n this._cropperHandleHitTest._.mouseY <\n this._cropperHandleHitTest._.tb + 10 &&\n this._cropperHandleHitTest._.mouseY >\n this._cropperHandleHitTest._.tb - 3\n ) {\n return 'tl';\n } else if (\n this._cropperHandleHitTest._.mouseY <\n this._cropperHandleHitTest._.bb + 3 &&\n this._cropperHandleHitTest._.mouseY >\n this._cropperHandleHitTest._.bb - 10\n ) {\n return 'bl';\n }\n }\n // Right side top/bottom\n if (\n this._cropperHandleHitTest._.mouseX >\n this._cropperHandleHitTest._.rb - 13 &&\n this._cropperHandleHitTest._.mouseX <\n this._cropperHandleHitTest._.rb + 3\n ) {\n if (\n this._cropperHandleHitTest._.mouseY <\n this._cropperHandleHitTest._.tb + 10 &&\n this._cropperHandleHitTest._.mouseY >\n this._cropperHandleHitTest._.tb - 3\n ) {\n return 'tr';\n } else if (\n this._cropperHandleHitTest._.mouseY <\n this._cropperHandleHitTest._.bb + 2 &&\n this._cropperHandleHitTest._.mouseY >\n this._cropperHandleHitTest._.bb - 10\n ) {\n return 'br';\n }\n }\n\n // Left or right\n if (\n this._cropperHandleHitTest._.mouseX <\n this._cropperHandleHitTest._.lb + 3 &&\n this._cropperHandleHitTest._.mouseX >\n this._cropperHandleHitTest._.lb - 3 &&\n this._cropperHandleHitTest._.mouseY <\n this._cropperHandleHitTest._.bb - 10 &&\n this._cropperHandleHitTest._.mouseY >\n this._cropperHandleHitTest._.tb + 10\n ) {\n return 'l';\n }\n if (\n this._cropperHandleHitTest._.mouseX <\n this._cropperHandleHitTest._.rb + 1 &&\n this._cropperHandleHitTest._.mouseX >\n this._cropperHandleHitTest._.rb - 5 &&\n this._cropperHandleHitTest._.mouseY <\n this._cropperHandleHitTest._.bb - 10 &&\n this._cropperHandleHitTest._.mouseY >\n this._cropperHandleHitTest._.tb + 10\n ) {\n return 'r';\n }\n\n // Top or bottom\n if (\n this._cropperHandleHitTest._.mouseY <\n this._cropperHandleHitTest._.tb + 4 &&\n this._cropperHandleHitTest._.mouseY >\n this._cropperHandleHitTest._.tb - 2 &&\n this._cropperHandleHitTest._.mouseX >\n this._cropperHandleHitTest._.lb + 10 &&\n this._cropperHandleHitTest._.mouseX <\n this._cropperHandleHitTest._.rb - 10\n ) {\n return 't';\n }\n if (\n this._cropperHandleHitTest._.mouseY <\n this._cropperHandleHitTest._.bb + 2 &&\n this._cropperHandleHitTest._.mouseY >\n this._cropperHandleHitTest._.bb - 4 &&\n this._cropperHandleHitTest._.mouseX >\n this._cropperHandleHitTest._.lb + 10 &&\n this._cropperHandleHitTest._.mouseX <\n this._cropperHandleHitTest._.rb - 10\n ) {\n return 'b';\n }\n\n return false;\n },\n\n /**\n * Test whether the mouse cursor is on a fabricJS object.\n *\n * @param {Object} event\n * @param {Object} object\n * @returns {boolean}\n */\n _isMouseOver: function (event, object) {\n if (typeof this._isMouseOver._ === 'undefined') {\n this._isMouseOver._ = {};\n }\n\n this._isMouseOver._.parentOffset = this.$croppingCanvas.offset();\n this._isMouseOver._.mouseX =\n event.pageX - this._isMouseOver._.parentOffset.left;\n this._isMouseOver._.mouseY =\n event.pageY - this._isMouseOver._.parentOffset.top;\n\n // Compensate for center origin coordinate-wise\n this._isMouseOver._.lb = object.left - object.width / 2;\n this._isMouseOver._.rb = this._isMouseOver._.lb + object.width;\n this._isMouseOver._.tb = object.top - object.height / 2;\n this._isMouseOver._.bb = this._isMouseOver._.tb + object.height;\n\n return (\n this._isMouseOver._.mouseX >= this._isMouseOver._.lb &&\n this._isMouseOver._.mouseX <= this._isMouseOver._.rb &&\n this._isMouseOver._.mouseY >= this._isMouseOver._.tb &&\n this._isMouseOver._.mouseY <= this._isMouseOver._.bb\n );\n },\n\n /**\n * Get vertices of a rectangle defined by left,top,height and width properties.\n * Optionally it's possible to provide offsetX and offsetY values.\n * Left and top properties of rectangle reference the top-left corner.\n *\n * @param {Object} rectangle\n * @param {number} [offsetX]\n * @param {number} [offsetY]\n */\n _getRectangleVertices: function (rectangle, offsetX, offsetY) {\n if (typeof this._getRectangleVertices._ === 'undefined') {\n this._getRectangleVertices._ = {};\n }\n\n if (typeof offsetX === 'undefined') {\n offsetX = 0;\n }\n if (typeof offsetY === 'undefined') {\n offsetY = 0;\n }\n\n this._getRectangleVertices._.topLeft = {\n x: rectangle.left + offsetX,\n y: rectangle.top + offsetY,\n };\n\n this._getRectangleVertices._.topRight = {\n x: this._getRectangleVertices._.topLeft.x + rectangle.width,\n y: this._getRectangleVertices._.topLeft.y,\n };\n this._getRectangleVertices._.bottomRight = {\n x: this._getRectangleVertices._.topRight.x,\n y: this._getRectangleVertices._.topRight.y + rectangle.height,\n };\n this._getRectangleVertices._.bottomLeft = {\n x: this._getRectangleVertices._.topLeft.x,\n y: this._getRectangleVertices._.bottomRight.y,\n };\n\n return [\n this._getRectangleVertices._.topLeft,\n this._getRectangleVertices._.topRight,\n this._getRectangleVertices._.bottomRight,\n this._getRectangleVertices._.bottomLeft,\n ];\n },\n\n /**\n * Set image vertice coordinates for an image that's been zoomed to fit.\n */\n _setFittedImageVerticeCoordinates: function () {\n this.imageVerticeCoords = this.getImageVerticeCoords('fit');\n },\n\n /**\n * Get image vertice coords by a zoom mode and taking into account the straightening angle.\n * The zoomMode can be either \"cover\", \"fit\" or a discrete float value.\n *\n * @param {string} zoomMode\n */\n getImageVerticeCoords: function (zoomMode) {\n var angleInRadians =\n -1 *\n ((this.hasOrientationChanged() ? 90 : 0) + this.imageStraightenAngle) *\n (Math.PI / 180);\n\n var imageDimensions = this.getScaledImageDimensions();\n\n var ratio;\n\n if (typeof zoomMode === 'number') {\n ratio = zoomMode;\n } else if (zoomMode === 'cover') {\n ratio = this.getZoomToCoverRatio(imageDimensions);\n } else {\n ratio = this.getZoomToFitRatio(imageDimensions);\n }\n\n // Get the dimensions of the scaled image\n var scaledHeight = imageDimensions.height * ratio;\n var scaledWidth = imageDimensions.width * ratio;\n\n // Calculate the segments of the containing box for the image.\n // When referring to top/bottom or right/left segments, these are on the\n // right-side and bottom projection of the containing box for the zoomed out image.\n var topVerticalSegment = Math.cos(angleInRadians) * scaledHeight;\n var bottomVerticalSegment = Math.sin(angleInRadians) * scaledWidth;\n var rightHorizontalSegment = Math.cos(angleInRadians) * scaledWidth;\n var leftHorizontalSegment = Math.sin(angleInRadians) * scaledHeight;\n\n // Calculate the offsets from editor box for the image-containing box\n var verticalOffset =\n (this.editorHeight - (topVerticalSegment + bottomVerticalSegment)) / 2;\n var horizontalOffset =\n (this.editorWidth - (leftHorizontalSegment + rightHorizontalSegment)) /\n 2;\n\n // Finally, calculate the image vertice coordinates\n return {\n a: {\n x: horizontalOffset + rightHorizontalSegment,\n y: verticalOffset,\n },\n b: {\n x: this.editorWidth - horizontalOffset,\n y: verticalOffset + topVerticalSegment,\n },\n c: {\n x: horizontalOffset + leftHorizontalSegment,\n y: this.editorHeight - verticalOffset,\n },\n d: {\n x: horizontalOffset,\n y: verticalOffset + bottomVerticalSegment,\n },\n };\n },\n\n /**\n * Debug stuff by continuously rendering a fabric object on canvas.\n *\n * @param {Object} fabricObj\n */\n _debug: function (fabricObj) {\n this.canvas.remove(this.debugger);\n this.debugger = fabricObj;\n this.canvas.add(this.debugger);\n },\n\n /**\n * Given an array of points in the form of {x: int, y:int} and a rectangle in the form of\n * {a:{x:int, y:int}, b:{x:int, y:int}, c:{x:int, y:int}} (the fourth vertice is unnecessary)\n * return true if the point is in the rectangle.\n *\n * Adapted from: http://stackoverflow.com/a/2763387/2040791\n *\n * @param {Object} points\n * @param {Object} rectangle\n */\n arePointsInsideRectangle: function (points, rectangle) {\n if (typeof this.arePointsInsideRectangle._ === 'undefined') {\n this.arePointsInsideRectangle._ = {};\n }\n\n // Pre-calculate the vectors and scalar products for two rectangle edges\n this.arePointsInsideRectangle._.ab = this._getVector(\n rectangle.a,\n rectangle.b\n );\n this.arePointsInsideRectangle._.bc = this._getVector(\n rectangle.b,\n rectangle.c\n );\n this.arePointsInsideRectangle._.scalarAbAb = this._getScalarProduct(\n this.arePointsInsideRectangle._.ab,\n this.arePointsInsideRectangle._.ab\n );\n this.arePointsInsideRectangle._.scalarBcBc = this._getScalarProduct(\n this.arePointsInsideRectangle._.bc,\n this.arePointsInsideRectangle._.bc\n );\n\n for (\n this.arePointsInsideRectangle._.i = 0;\n this.arePointsInsideRectangle._.i < points.length;\n this.arePointsInsideRectangle._.i++\n ) {\n this.arePointsInsideRectangle._.point =\n points[this.arePointsInsideRectangle._.i];\n\n // Calculate the vectors for two rectangle sides and for\n // the vector from vertices a and b to the point P\n this.arePointsInsideRectangle._.ap = this._getVector(\n rectangle.a,\n this.arePointsInsideRectangle._.point\n );\n this.arePointsInsideRectangle._.bp = this._getVector(\n rectangle.b,\n this.arePointsInsideRectangle._.point\n );\n\n // Calculate scalar or dot products for some vector combinations\n this.arePointsInsideRectangle._.scalarAbAp = this._getScalarProduct(\n this.arePointsInsideRectangle._.ab,\n this.arePointsInsideRectangle._.ap\n );\n this.arePointsInsideRectangle._.scalarBcBp = this._getScalarProduct(\n this.arePointsInsideRectangle._.bc,\n this.arePointsInsideRectangle._.bp\n );\n\n this.arePointsInsideRectangle._.projectsOnAB =\n 0 <= this.arePointsInsideRectangle._.scalarAbAp &&\n this.arePointsInsideRectangle._.scalarAbAp <=\n this.arePointsInsideRectangle._.scalarAbAb;\n this.arePointsInsideRectangle._.projectsOnBC =\n 0 <= this.arePointsInsideRectangle._.scalarBcBp &&\n this.arePointsInsideRectangle._.scalarBcBp <=\n this.arePointsInsideRectangle._.scalarBcBc;\n\n if (\n !(\n this.arePointsInsideRectangle._.projectsOnAB &&\n this.arePointsInsideRectangle._.projectsOnBC\n )\n ) {\n return false;\n }\n }\n\n return true;\n },\n\n /**\n * Returns an object representing the vector between points a and b.\n *\n * @param {Object} a\n * @param {Object} b\n */\n _getVector: function (a, b) {\n return {x: b.x - a.x, y: b.y - a.y};\n },\n\n /**\n * Returns the scalar product of two vectors\n *\n * @param {Object} a\n * @param {Object} b\n */\n _getScalarProduct: function (a, b) {\n return a.x * b.x + a.y * b.y;\n },\n\n /**\n * Returns the magnitude of a vector_redrawCropperElements\n * .\n *\n * @param {Object} vector\n */\n _getVectorMagnitude: function (vector) {\n return Math.sqrt(vector.x * vector.x + vector.y * vector.y);\n },\n\n /**\n * Returns the angle between two vectors in degrees with two decimal points\n *\n * @param {Object} a\n * @param {Object} b\n */\n _getAngleBetweenVectors: function (a, b) {\n return (\n Math.round(\n ((Math.acos(\n Math.min(\n 1,\n this._getScalarProduct(a, b) /\n (this._getVectorMagnitude(a) * this._getVectorMagnitude(b))\n )\n ) *\n 180) /\n Math.PI) *\n 100\n ) / 100\n );\n },\n\n /**\n * Return the rectangle edge crossed by an imaginary line drawn from editor center to a vertex\n *\n * @param {Object} rectangle\n * @param {Object} vertex\n *\n * @returns {*}\n */\n _getEdgeCrossed: function (rectangle, vertex) {\n // Determine over which edge the vertex is\n var edgePoints = [\n [rectangle.a, rectangle.b],\n [rectangle.b, rectangle.c],\n [rectangle.c, rectangle.d],\n [rectangle.d, rectangle.a],\n ];\n\n var centerPoint = {x: this.editorWidth / 2, y: this.editorHeight / 2};\n var smallestDiff = 180;\n var edgeCrossed = null;\n\n // Test each edge\n for (var edgeIndex = 0; edgeIndex < edgePoints.length; edgeIndex++) {\n var edge = edgePoints[edgeIndex];\n var toCenter = this._getVector(edge[0], centerPoint);\n var edgeVector = this._getVector(edge[0], edge[1]);\n var toVertex = this._getVector(edge[0], vertex);\n\n // If the angle between toCenter/toVertex is the sum of\n // angles between edgeVector/toCenter and edgeVector/toVertex, it means that\n // the edgeVector is between the other two meaning that this is the offending vertex.\n // To avoid the rounding errors, we'll take the closest match\n var diff = Math.abs(\n this._getAngleBetweenVectors(toCenter, toVertex) -\n (this._getAngleBetweenVectors(toCenter, edgeVector) +\n this._getAngleBetweenVectors(edgeVector, toVertex))\n );\n\n if (diff < smallestDiff) {\n smallestDiff = diff;\n edgeCrossed = edge;\n }\n }\n\n return edgeCrossed;\n },\n\n /**\n * Get the image bounding box by image scaled dimensions, taking ingo account the straightening angle.\n *\n * @param {Object} dimensions\n */\n _getImageBoundingBox: function (dimensions) {\n var box = {};\n\n var angleInRadians =\n Math.abs(this.imageStraightenAngle) * (Math.PI / 180);\n\n var proportion = dimensions.height / dimensions.width;\n box.height =\n dimensions.width *\n (Math.sin(angleInRadians) + Math.cos(angleInRadians) * proportion);\n box.width =\n dimensions.width *\n (Math.cos(angleInRadians) + Math.sin(angleInRadians) * proportion);\n\n if (this.hasOrientationChanged()) {\n var temp = box.width;\n box.width = box.height;\n box.height = temp;\n }\n\n return box;\n },\n },\n {\n defaults: {\n animationDuration: 100,\n allowSavingAsNew: true,\n onSave: $.noop,\n allowDegreeFractions: null,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Asset index class\n */\nCraft.AssetIndex = Craft.BaseElementIndex.extend({\n $includeSubfoldersContainer: null,\n $includeSubfoldersCheckbox: null,\n showingIncludeSubfoldersCheckbox: false,\n\n $uploadButton: null,\n $uploadInput: null,\n $progressBar: null,\n $folders: null,\n\n uploader: null,\n promptHandler: null,\n progressBar: null,\n\n _uploadTotalFiles: 0,\n _uploadFileProgress: {},\n _currentUploaderSettings: {},\n\n _assetDrag: null,\n _folderDrag: null,\n _expandDropTargetFolderTimeout: null,\n _tempExpandedFolders: [],\n\n _fileConflictTemplate: {\n choices: [\n {value: 'keepBoth', title: Craft.t('app', 'Keep both')},\n {value: 'replace', title: Craft.t('app', 'Replace it')},\n ],\n },\n _folderConflictTemplate: {\n choices: [\n {\n value: 'replace',\n title: Craft.t(\n 'app',\n 'Replace the folder (all existing files will be deleted)'\n ),\n },\n {\n value: 'merge',\n title: Craft.t(\n 'app',\n 'Merge the folder (any conflicting files will be replaced)'\n ),\n },\n ],\n },\n\n init: function (elementType, $container, settings) {\n this.base(elementType, $container, settings);\n\n if (this.settings.context === 'index') {\n if (!this._folderDrag) {\n this._initIndexPageMode();\n }\n\n this.addListener(Garnish.$win, 'resize,scroll', '_positionProgressBar');\n } else {\n this.addListener(this.$main, 'scroll', '_positionProgressBar');\n\n if (this.settings.modal) {\n this.settings.modal.on(\n 'updateSizeAndPosition',\n this._positionProgressBar.bind(this)\n );\n }\n }\n },\n\n initSources: function () {\n if (this.settings.context === 'index' && !this._folderDrag) {\n this._initIndexPageMode();\n }\n\n return this.base();\n },\n\n initSource: function ($source) {\n this.base($source);\n\n this._createFolderContextMenu($source);\n\n if (this.settings.context === 'index') {\n if (this._folderDrag && this.getSourceLevel($source) > 1) {\n if ($source.data('folder-id')) {\n this._folderDrag.addItems($source.parent());\n }\n }\n\n if (this._assetDrag) {\n this._assetDrag.updateDropTargets();\n }\n }\n },\n\n deinitSource: function ($source) {\n this.base($source);\n\n // Does this source have a context menu?\n var contextMenu = $source.data('contextmenu');\n\n if (contextMenu) {\n contextMenu.destroy();\n }\n\n if (this.settings.context === 'index') {\n if (this._folderDrag && this.getSourceLevel($source) > 1) {\n this._folderDrag.removeItems($source.parent());\n }\n\n if (this._assetDrag) {\n this._assetDrag.updateDropTargets();\n }\n }\n },\n\n /**\n * Initialize the index page-specific features\n */\n _initIndexPageMode: function () {\n if (this._folderDrag) {\n return;\n }\n\n // Make the elements selectable\n this.settings.selectable = true;\n this.settings.multiSelect = true;\n\n // Asset dragging\n // ---------------------------------------------------------------------\n\n this._assetDrag = new Garnish.DragDrop({\n activeDropTargetClass: 'sel',\n helperOpacity: 0.75,\n filter: () =>\n this.view.getSelectedElements().has('div.element[data-movable]'),\n helper: ($file) => this._getFileDragHelper($file),\n dropTargets: () => {\n // Which data attribute should we be checking?\n var attr;\n if (\n this._assetDrag.$draggee &&\n this._assetDrag.$draggee.has('.element[data-peer-file]').length\n ) {\n attr = 'data-can-move-peer-files-to';\n } else {\n attr = 'data-can-move-to';\n }\n\n var targets = [];\n\n for (var i = 0; i < this.$sources.length; i++) {\n // Make sure it's a volume folder\n var $source = this.$sources.eq(i);\n if (Garnish.hasAttr($source, attr)) {\n targets.push($source);\n }\n }\n\n return targets;\n },\n\n onDragStart: this._onDragStart.bind(this),\n onDropTargetChange: this._onDropTargetChange.bind(this),\n onDragStop: this._onFileDragStop.bind(this),\n helperBaseZindex: 800,\n });\n\n // Folder dragging\n // ---------------------------------------------------------------------\n\n this._folderDrag = new Garnish.DragDrop({\n activeDropTargetClass: 'sel',\n helperOpacity: 0.75,\n\n helper: ($draggeeHelper) => {\n var $helperSidebar = $('<div class=\"sidebar drag-helper\"/>'),\n $helperNav = $('<nav/>').appendTo($helperSidebar),\n $helperUl = $('<ul/>').appendTo($helperNav);\n\n $draggeeHelper.appendTo($helperUl).removeClass('expanded');\n $draggeeHelper.children('a').addClass('sel');\n\n // Match the style\n $draggeeHelper.css({\n 'padding-top': this._folderDrag.$draggee.css('padding-top'),\n 'padding-right': this._folderDrag.$draggee.css('padding-right'),\n 'padding-bottom': this._folderDrag.$draggee.css('padding-bottom'),\n 'padding-left': this._folderDrag.$draggee.css('padding-left'),\n });\n\n return $helperSidebar;\n },\n\n dropTargets: () => {\n var targets = [];\n\n // Tag the dragged folder and it's subfolders\n var draggedSourceIds = [];\n this._folderDrag.$draggee.find('a[data-key]').each(function () {\n draggedSourceIds.push($(this).data('key'));\n });\n\n for (var i = 0; i < this.$sources.length; i++) {\n // Make sure it's a volume folder and not one of the dragged folders\n var $source = this.$sources.eq(i),\n key = $source.data('key');\n\n if (!this._getVolumeOrFolderUidFromSourceKey(key)) {\n continue;\n }\n\n if (!Craft.inArray(key, draggedSourceIds)) {\n targets.push($source);\n }\n }\n\n return targets;\n },\n\n onDragStart: this._onDragStart.bind(this),\n onDropTargetChange: this._onDropTargetChange.bind(this),\n onDragStop: this._onFolderDragStop.bind(this),\n });\n },\n\n /**\n * On file drag stop\n */\n _onFileDragStop: function () {\n if (\n this._assetDrag.$activeDropTarget &&\n this._assetDrag.$activeDropTarget[0] !== this.$source[0]\n ) {\n // Keep it selected\n var originatingSource = this.$source;\n\n var targetFolderId = this._assetDrag.$activeDropTarget.data('folder-id'),\n originalAssetIds = [];\n\n // For each file, prepare array data.\n for (var i = 0; i < this._assetDrag.$draggee.length; i++) {\n var originalAssetId = Craft.getElementInfo(\n this._assetDrag.$draggee[i]\n ).id;\n\n originalAssetIds.push(originalAssetId);\n }\n\n // Are any files actually getting moved?\n if (originalAssetIds.length) {\n this.setIndexBusy();\n\n this._positionProgressBar();\n this.progressBar.resetProgressBar();\n this.progressBar.setItemCount(originalAssetIds.length);\n this.progressBar.showProgressBar();\n\n // For each file to move a separate request\n var parameterArray = [];\n for (i = 0; i < originalAssetIds.length; i++) {\n parameterArray.push({\n action: 'assets/move-asset',\n params: {\n assetId: originalAssetIds[i],\n folderId: targetFolderId,\n },\n });\n }\n\n // Define the callback for when all file moves are complete\n var onMoveFinish = (responseArray) => {\n this.promptHandler.resetPrompts();\n\n // Loop trough all the responses\n for (var i = 0; i < responseArray.length; i++) {\n var response = responseArray[i];\n\n // Push prompt into prompt array\n if (response.conflict) {\n this.promptHandler.addPrompt({\n assetId: response.assetId,\n suggestedFilename: response.suggestedFilename,\n prompt: {\n message: response.conflict,\n choices: this._fileConflictTemplate.choices,\n },\n });\n }\n\n if (response.error) {\n alert(response.error);\n }\n }\n\n this.setIndexAvailable();\n this.progressBar.hideProgressBar();\n var reloadIndex = false;\n\n var performAfterMoveActions = function () {\n // Select original source\n this.sourceSelect.selectItem(originatingSource);\n\n // Make sure we use the correct offset when fetching the next page\n this._totalVisible -= this._assetDrag.$draggee.length;\n\n // And remove the elements that have been moved away\n for (var i = 0; i < originalAssetIds.length; i++) {\n $('[data-id=' + originalAssetIds[i] + ']').remove();\n }\n\n this.view.deselectAllElements();\n this._collapseExtraExpandedFolders(targetFolderId);\n\n if (reloadIndex) {\n this.updateElements();\n }\n };\n\n if (this.promptHandler.getPromptCount()) {\n // Define callback for completing all prompts\n var promptCallback = (returnData) => {\n var newParameterArray = [];\n\n // Loop trough all returned data and prepare a new request array\n for (var i = 0; i < returnData.length; i++) {\n if (returnData[i].choice === 'cancel') {\n reloadIndex = true;\n continue;\n }\n\n if (returnData[i].choice === 'keepBoth') {\n newParameterArray.push({\n action: 'assets/move-asset',\n params: {\n folderId: targetFolderId,\n assetId: returnData[i].assetId,\n filename: returnData[i].suggestedFilename,\n },\n });\n }\n\n if (returnData[i].choice === 'replace') {\n newParameterArray.push({\n action: 'assets/move-asset',\n params: {\n folderId: targetFolderId,\n assetId: returnData[i].assetId,\n force: true,\n },\n });\n }\n }\n\n // Nothing to do, carry on\n if (newParameterArray.length === 0) {\n performAfterMoveActions.apply(this);\n } else {\n // Start working\n this.setIndexBusy();\n this.progressBar.resetProgressBar();\n this.progressBar.setItemCount(\n this.promptHandler.getPromptCount()\n );\n this.progressBar.showProgressBar();\n\n // Move conflicting files again with resolutions now\n this._performBatchRequests(newParameterArray, onMoveFinish);\n }\n };\n\n this._assetDrag.fadeOutHelpers();\n this.promptHandler.showBatchPrompts(promptCallback);\n } else {\n performAfterMoveActions.apply(this);\n this._assetDrag.fadeOutHelpers();\n }\n };\n\n // Initiate the file move with the built array, index of 0 and callback to use when done\n this._performBatchRequests(parameterArray, onMoveFinish);\n\n // Skip returning dragees\n return;\n }\n } else {\n // Add the .sel class back on the selected source\n this.$source.addClass('sel');\n\n this._collapseExtraExpandedFolders();\n }\n\n this._assetDrag.returnHelpersToDraggees();\n },\n\n /**\n * On folder drag stop\n */\n _onFolderDragStop: function () {\n // Only move if we have a valid target and we're not trying to move into our direct parent\n if (\n this._folderDrag.$activeDropTarget &&\n this._folderDrag.$activeDropTarget\n .siblings('ul')\n .children('li')\n .filter(this._folderDrag.$draggee).length === 0\n ) {\n var targetFolderId = this._folderDrag.$activeDropTarget.data('folder-id');\n\n this._collapseExtraExpandedFolders(targetFolderId);\n\n // Get the old folder IDs, and sort them so that we're moving the most-nested folders first\n var folderIds = [];\n\n for (var i = 0; i < this._folderDrag.$draggee.length; i++) {\n var $a = this._folderDrag.$draggee.eq(i).children('a'),\n folderId = $a.data('folder-id');\n\n // Make sure it’s not already in the target folder and use this single folder Id.\n if (folderId != targetFolderId) {\n folderIds.push(folderId);\n break;\n }\n }\n\n if (folderIds.length) {\n folderIds.sort();\n folderIds.reverse();\n\n this.setIndexBusy();\n this._positionProgressBar();\n this.progressBar.resetProgressBar();\n this.progressBar.setItemCount(folderIds.length);\n this.progressBar.showProgressBar();\n\n var parameterArray = [];\n\n for (i = 0; i < folderIds.length; i++) {\n parameterArray.push({\n action: 'assets/move-folder',\n params: {\n folderId: folderIds[i],\n parentId: targetFolderId,\n },\n });\n }\n\n // Increment, so to avoid displaying folder files that are being moved\n this.requestId++;\n\n /*\n Here's the rundown:\n 1) Send all the folders being moved\n 2) Get results:\n a) For all conflicting, receive prompts and resolve them to get:\n b) For all valid move operations: by now server has created the needed folders\n in target destination. Server returns an array of file move operations\n c) server also returns a list of all the folder id changes\n d) and the data-id of node to be removed, in case of conflict\n e) and a list of folders to delete after the move\n 3) From data in 2) build a large file move operation array\n 4) Create a request loop based on this, so we can display progress bar\n 5) when done, delete all the folders and perform other maintenance\n 6) Champagne\n */\n\n // This will hold the final list of files to move\n var fileMoveList = [];\n\n var newSourceKey = '';\n\n var onMoveFinish = (responseArray) => {\n this.promptHandler.resetPrompts();\n\n // Loop trough all the responses\n for (var i = 0; i < responseArray.length; i++) {\n var data = responseArray[i];\n\n // If successful and have data, then update\n if (data.success) {\n if (data.transferList) {\n fileMoveList = data.transferList;\n }\n\n if (data.newFolderId) {\n newSourceKey =\n this._folderDrag.$activeDropTarget.data('key') +\n '/folder:' +\n data.newFolderUid;\n }\n }\n\n // Push prompt into prompt array\n if (data.conflict) {\n data.prompt = {\n message: data.conflict,\n choices: this._folderConflictTemplate.choices,\n };\n\n this.promptHandler.addPrompt(data);\n }\n\n if (data.error) {\n alert(data.error);\n }\n }\n\n if (this.promptHandler.getPromptCount()) {\n // Define callback for completing all prompts\n var promptCallback = (returnData) => {\n this.promptHandler.resetPrompts();\n\n var newParameterArray = [];\n\n var params = {};\n // Loop trough all returned data and prepare a new request array\n for (var i = 0; i < returnData.length; i++) {\n if (returnData[i].choice === 'cancel') {\n continue;\n }\n\n if (returnData[i].choice === 'replace') {\n params.force = true;\n }\n\n if (returnData[i].choice === 'merge') {\n params.merge = true;\n }\n\n params.folderId = data.folderId;\n params.parentId = data.parentId;\n\n newParameterArray.push({\n action: 'assets/move-folder',\n params: params,\n });\n }\n\n // Start working on them lists, baby\n if (newParameterArray.length === 0) {\n this._performActualFolderMove(\n fileMoveList,\n folderIds,\n newSourceKey\n );\n } else {\n // Start working\n this.setIndexBusy();\n this.progressBar.resetProgressBar();\n this.progressBar.setItemCount(\n this.promptHandler.getPromptCount()\n );\n this.progressBar.showProgressBar();\n\n this._performBatchRequests(newParameterArray, onMoveFinish);\n }\n };\n\n this.promptHandler.showBatchPrompts(promptCallback);\n\n this.setIndexAvailable();\n this.progressBar.hideProgressBar();\n } else {\n this._performActualFolderMove(\n fileMoveList,\n folderIds,\n newSourceKey\n );\n }\n };\n\n // Initiate the folder move with the built array, index of 0 and callback to use when done\n this._performBatchRequests(parameterArray, onMoveFinish);\n\n // Skip returning dragees until we get the Ajax response\n return;\n }\n } else {\n // Add the .sel class back on the selected source\n this.$source.addClass('sel');\n\n this._collapseExtraExpandedFolders();\n }\n\n this._folderDrag.returnHelpersToDraggees();\n },\n\n /**\n * Really move the folder. Like really. For real.\n */\n _performActualFolderMove: function (\n fileMoveList,\n folderDeleteList,\n newSourceKey\n ) {\n this.setIndexBusy();\n this.progressBar.resetProgressBar();\n this.progressBar.setItemCount(1);\n this.progressBar.showProgressBar();\n\n var moveCallback = (folderDeleteList) => {\n // Delete the old folders\n var counter = 0;\n var limit = folderDeleteList.length;\n for (var i = 0; i < folderDeleteList.length; i++) {\n let data = {folderId: folderDeleteList[i]};\n\n // When all folders are deleted, reload the sources.\n Craft.sendActionRequest('POST', 'assets/delete-folder', {data}).then(\n (response) => {\n if (++counter === limit) {\n this.setIndexAvailable();\n this.progressBar.hideProgressBar();\n this._folderDrag.returnHelpersToDraggees();\n this.setInstanceState('selectedSource', newSourceKey);\n this.refreshSources();\n }\n }\n );\n }\n };\n\n if (fileMoveList.length > 0) {\n var parameterArray = [];\n\n for (var i = 0; i < fileMoveList.length; i++) {\n parameterArray.push({\n action: 'assets/move-asset',\n params: fileMoveList[i],\n });\n }\n this._performBatchRequests(parameterArray, function () {\n moveCallback(folderDeleteList);\n });\n } else {\n moveCallback(folderDeleteList);\n }\n },\n\n _selectSourceByFolderId: function (targetFolderId) {\n var $targetSource = this._getSourceByKey(targetFolderId);\n\n // Make sure that all the parent sources are expanded and this source is visible.\n var $parentSources = $targetSource.parent().parents('li');\n\n for (var i = 0; i < $parentSources.length; i++) {\n var $parentSource = $($parentSources[i]);\n\n if (!$parentSource.hasClass('expanded')) {\n $parentSource.children('.toggle').trigger('click');\n }\n }\n\n this.selectSource($targetSource);\n this.updateElements();\n },\n\n /**\n * Initialize the uploader.\n *\n * @private\n */\n afterInit: function () {\n if (!this.$uploadButton) {\n this.$uploadButton = $('<button/>', {\n type: 'button',\n class: 'btn submit',\n 'data-icon': 'upload',\n style: 'position: relative; overflow: hidden;',\n text: Craft.t('app', 'Upload files'),\n });\n this.addButton(this.$uploadButton);\n\n this.$uploadInput = $(\n '<input type=\"file\" multiple=\"multiple\" name=\"assets-upload\" />'\n )\n .hide()\n .insertBefore(this.$uploadButton);\n }\n\n this.promptHandler = new Craft.PromptHandler();\n this.progressBar = new Craft.ProgressBar(this.$main, true);\n\n var options = {\n url: Craft.getActionUrl('assets/upload'),\n fileInput: this.$uploadInput,\n dropZone: this.$container,\n };\n\n options.events = {\n fileuploadstart: this._onUploadStart.bind(this),\n fileuploadprogressall: this._onUploadProgress.bind(this),\n fileuploaddone: this._onUploadSuccess.bind(this),\n fileuploadalways: this._onUploadAlways.bind(this),\n fileuploadfail: this._onUploadFailure.bind(this),\n };\n\n if (\n this.settings.criteria &&\n typeof this.settings.criteria.kind !== 'undefined'\n ) {\n options.allowedKinds = this.settings.criteria.kind;\n }\n\n this._currentUploaderSettings = options;\n\n this.uploader = new Craft.Uploader(this.$uploadButton, options);\n\n this.$uploadButton.on('click', () => {\n if (this.$uploadButton.hasClass('disabled')) {\n return;\n }\n if (!this.isIndexBusy) {\n this.$uploadButton\n .parent()\n .find('input[name=assets-upload]')\n .trigger('click');\n }\n });\n\n this.base();\n },\n\n getDefaultSourceKey: function () {\n // Did they request a specific volume in the URL?\n if (\n this.settings.context === 'index' &&\n typeof window.defaultSource !== 'undefined'\n ) {\n let defaultSourceParts = window.defaultSource.split('/');\n let volumeSource = this.$sources.toArray().find((s) => {\n return $(s).data('volume-handle') === defaultSourceParts[0];\n });\n if (volumeSource) {\n let $source = $(volumeSource);\n\n for (let i = 1; i < defaultSourceParts.length; i++) {\n // does $source have a subfolder with this path name?\n let subfolderSource = this._getChildSources($source)\n .toArray()\n .find((s) => {\n return $('> .label', s).text() === defaultSourceParts[i];\n });\n if (!subfolderSource) {\n break;\n }\n this._expandSource($source);\n $source = $(subfolderSource);\n }\n\n return $source.data('key');\n }\n }\n\n return this.base();\n },\n\n onSelectSource: function () {\n var $source = this._getSourceByKey(this.sourceKey);\n var folderId = $source.data('folder-id');\n\n if (folderId && Garnish.hasAttr(this.$source, 'data-can-upload')) {\n this.uploader.setParams({\n folderId: this.$source.attr('data-folder-id'),\n });\n this.$uploadButton.removeClass('disabled');\n } else {\n this.$uploadButton.addClass('disabled');\n }\n\n // Update the URL if we're on the Assets index\n if ($source.length && this.settings.context === 'index') {\n this._updateUrl($source);\n }\n\n this.base();\n },\n\n _updateUrl: function ($source) {\n // Find all the subfolder sources. At the end, $thisSource will be the root volume source\n let nestedSources = [];\n let $thisSource = $source;\n let $parent;\n while (($parent = this.getParentSource($thisSource)) && $parent.length) {\n nestedSources.unshift($thisSource);\n $thisSource = $parent;\n }\n\n let uri = 'assets';\n if ($thisSource.data('volume-handle')) {\n uri += '/' + $thisSource.data('volume-handle');\n nestedSources.forEach(($s) => {\n uri += '/' + $s.children('.label').text();\n });\n }\n\n Craft.setPath(uri);\n },\n\n _getVolumeOrFolderUidFromSourceKey: function (sourceKey) {\n var m = sourceKey.match(/\\b(?:folder|volume):([0-9a-f\\-]+)$/);\n\n return m ? m[1] : null;\n },\n\n startSearching: function () {\n // Does this source have subfolders?\n if (!this.settings.hideSidebar && this.$source.siblings('ul').length) {\n if (this.$includeSubfoldersContainer === null) {\n var id = 'includeSubfolders-' + Math.floor(Math.random() * 1000000000);\n\n this.$includeSubfoldersContainer = $(\n '<div style=\"margin-bottom: -25px; opacity: 0;\"/>'\n ).insertAfter(this.$search);\n var $subContainer = $('<div style=\"padding-top: 5px;\"/>').appendTo(\n this.$includeSubfoldersContainer\n );\n this.$includeSubfoldersCheckbox = $(\n '<input type=\"checkbox\" id=\"' + id + '\" class=\"checkbox\"/>'\n ).appendTo($subContainer);\n $('<label class=\"light smalltext\" for=\"' + id + '\"/>')\n .text(' ' + Craft.t('app', 'Search in subfolders'))\n .appendTo($subContainer);\n\n this.addListener(\n this.$includeSubfoldersCheckbox,\n 'change',\n function () {\n this.setSelecetedSourceState(\n 'includeSubfolders',\n this.$includeSubfoldersCheckbox.prop('checked')\n );\n this.updateElements();\n }\n );\n } else {\n this.$includeSubfoldersContainer.velocity('stop').removeClass('hidden');\n }\n\n var checked = this.getSelectedSourceState('includeSubfolders', false);\n this.$includeSubfoldersCheckbox.prop('checked', checked);\n\n this.$includeSubfoldersContainer.velocity(\n {\n marginBottom: 0,\n opacity: 1,\n },\n 'fast'\n );\n\n this.showingIncludeSubfoldersCheckbox = true;\n }\n\n this.base();\n },\n\n stopSearching: function () {\n if (this.showingIncludeSubfoldersCheckbox) {\n this.$includeSubfoldersContainer.velocity('stop');\n\n this.$includeSubfoldersContainer.velocity(\n {\n marginBottom: -25,\n opacity: 0,\n },\n {\n duration: 'fast',\n complete: () => {\n this.$includeSubfoldersContainer.addClass('hidden');\n },\n }\n );\n\n this.showingIncludeSubfoldersCheckbox = false;\n }\n\n this.base();\n },\n\n getViewParams: function () {\n var data = this.base();\n\n if (\n this.showingIncludeSubfoldersCheckbox &&\n this.$includeSubfoldersCheckbox.prop('checked')\n ) {\n data.criteria.includeSubfolders = true;\n }\n\n return data;\n },\n\n /**\n * React on upload submit.\n *\n * @private\n */\n _onUploadStart: function () {\n this.setIndexBusy();\n\n // Initial values\n this._positionProgressBar();\n this.progressBar.resetProgressBar();\n this.progressBar.showProgressBar();\n\n this.promptHandler.resetPrompts();\n },\n\n /**\n * Update uploaded byte count.\n */\n _onUploadProgress: function (event, data) {\n var progress = parseInt((data.loaded / data.total) * 100, 10);\n this.progressBar.setProgressPercentage(progress);\n },\n\n /**\n * On upload success.\n *\n * @param {Object} event\n * @param {Object} data\n * @private\n */\n _onUploadSuccess: function (event, data) {\n const {result} = data;\n\n // Add the uploaded file to the selected ones, if appropriate\n this.selectElementAfterUpdate(result.assetId);\n\n // If there is a prompt, add it to the queue\n if (result.conflict) {\n result.prompt = {\n message: Craft.t('app', result.conflict, {file: result.filename}),\n choices: this._fileConflictTemplate.choices,\n };\n\n this.promptHandler.addPrompt(result);\n }\n\n Craft.cp.runQueue();\n },\n\n /**\n * On upload complete no matter what (success, fail, or abort).\n */\n _onUploadAlways: function () {\n if (this.uploader.isLastUpload()) {\n this.progressBar.hideProgressBar();\n this.setIndexAvailable();\n\n if (this.promptHandler.getPromptCount()) {\n this.promptHandler.showBatchPrompts(this._uploadFollowup.bind(this));\n } else {\n this._updateAfterUpload();\n }\n }\n },\n\n /**\n * On Upload Failure.\n */\n _onUploadFailure: function (event, data) {\n const response = data.response();\n let {message, filename} = response?.jqXHR?.responseJSON || {};\n\n if (!message) {\n message = filename\n ? Craft.t('app', 'Upload failed for “{filename}”.', {filename})\n : Craft.t('app', 'Upload failed.');\n }\n\n alert(message);\n },\n\n /**\n * Update the elements after an upload, setting sort to dateModified descending, if not using index.\n *\n * @private\n */\n _updateAfterUpload: function () {\n if (this.settings.context !== 'index') {\n this.clearSearch();\n this.setSelectedSortAttribute('dateCreated', 'desc');\n }\n this.updateElements();\n },\n\n /**\n * Follow up to an upload that triggered at least one conflict resolution prompt.\n *\n * @param {Object} returnData\n * @private\n */\n _uploadFollowup: function (returnData) {\n this.setIndexBusy();\n this.progressBar.resetProgressBar();\n\n this.promptHandler.resetPrompts();\n\n var finalCallback = () => {\n this.progressBar.hideProgressBar();\n this.setIndexAvailable();\n this._updateAfterUpload();\n };\n\n this.progressBar.setItemCount(returnData.length);\n\n var doFollowup = (parameterArray, parameterIndex, callback) => {\n var data = {};\n var action = null;\n\n const followupAlways = () => {\n parameterIndex++;\n this.progressBar.incrementProcessedItemCount(1);\n this.progressBar.updateProgressBar();\n\n if (parameterIndex === parameterArray.length) {\n callback();\n } else {\n doFollowup(parameterArray, parameterIndex, callback);\n }\n };\n const followupSuccess = (data) => {\n if (data.assetId) {\n this.selectElementAfterUpdate(data.assetId);\n }\n\n followupAlways();\n };\n const followupFailure = (data) => {\n alert(data.message);\n followupAlways();\n };\n\n if (parameterArray[parameterIndex].choice === 'replace') {\n action = 'assets/replace-file';\n data.sourceAssetId = parameterArray[parameterIndex].assetId;\n\n if (parameterArray[parameterIndex].conflictingAssetId) {\n data.assetId = parameterArray[parameterIndex].conflictingAssetId;\n } else {\n data.targetFilename = parameterArray[parameterIndex].filename;\n }\n } else if (parameterArray[parameterIndex].choice === 'cancel') {\n action = 'assets/delete-asset';\n data.assetId = parameterArray[parameterIndex].assetId;\n }\n\n if (!action) {\n // We don't really need to do another request, so let's pretend that already happened\n followupSuccess({\n assetId: parameterArray[parameterIndex].assetId,\n });\n } else {\n Craft.sendActionRequest('POST', action, {data})\n .then((response) => followupSuccess(response.data))\n .catch(({response}) => followupFailure(response.data));\n }\n };\n\n this.progressBar.showProgressBar();\n doFollowup(returnData, 0, finalCallback);\n },\n\n /**\n * Perform actions after updating elements\n * @private\n */\n onUpdateElements: function () {\n this._onUpdateElements(false, this.view.getAllElements());\n this.view.on('appendElements', (ev) => {\n this._onUpdateElements(true, ev.newElements);\n });\n\n this.base();\n },\n\n /**\n * Do the after-update initializations\n * @private\n */\n _onUpdateElements: function (append, $newElements) {\n if (this.settings.context === 'index') {\n if (!append) {\n this._assetDrag.removeAllItems();\n }\n\n this._assetDrag.addItems($newElements.has('div.element[data-movable]'));\n }\n\n this.base(append, $newElements);\n\n this.removeListener(this.$elements, 'keydown');\n this.addListener(this.$elements, 'keydown', this._onKeyDown.bind(this));\n this.view.elementSelect.on('focusItem', this._onElementFocus.bind(this));\n },\n\n /**\n * Handle a keypress\n * @private\n */\n _onKeyDown: function (ev) {\n if (ev.keyCode === Garnish.SPACE_KEY && ev.shiftKey) {\n if (Craft.PreviewFileModal.openInstance) {\n Craft.PreviewFileModal.openInstance.selfDestruct();\n } else {\n var $element = this.view.elementSelect.$focusedItem.find('.element');\n\n if ($element.length) {\n this._loadPreview($element);\n }\n }\n\n ev.stopPropagation();\n return false;\n }\n },\n\n /**\n * Handle element being focused\n * @private\n */\n _onElementFocus: function (ev) {\n var $element = $(ev.item).find('.element');\n\n if (Craft.PreviewFileModal.openInstance && $element.length) {\n this._loadPreview($element);\n }\n },\n\n /**\n * Load the preview for an Asset element\n * @private\n */\n _loadPreview: function ($element) {\n var settings = {};\n\n if ($element.data('image-width')) {\n settings.startingWidth = $element.data('image-width');\n settings.startingHeight = $element.data('image-height');\n }\n\n new Craft.PreviewFileModal(\n $element.data('id'),\n this.view.elementSelect,\n settings\n );\n },\n\n /**\n * On Drag Start\n */\n _onDragStart: function () {\n this._tempExpandedFolders = [];\n },\n\n /**\n * Get File Drag Helper\n */\n _getFileDragHelper: function ($element) {\n var currentView = this.getSelectedSourceState('mode');\n var $outerContainer;\n var $innerContainer;\n\n switch (currentView) {\n case 'table': {\n $outerContainer = $(\n '<div class=\"elements datatablesorthelper\"/>'\n ).appendTo(Garnish.$bod);\n $innerContainer = $('<div class=\"tableview\"/>').appendTo(\n $outerContainer\n );\n var $table = $('<table class=\"data\"/>').appendTo($innerContainer);\n var $tbody = $('<tbody/>').appendTo($table);\n\n $element.appendTo($tbody);\n\n // Copy the column widths\n this._$firstRowCells = this.view.$table\n .children('tbody')\n .children('tr:first')\n .children();\n var $helperCells = $element.children();\n\n for (var i = 0; i < $helperCells.length; i++) {\n // Hard-set the cell widths\n var $helperCell = $($helperCells[i]);\n\n // Skip the checkbox cell\n if ($helperCell.hasClass('checkbox-cell')) {\n $helperCell.remove();\n $outerContainer.css('margin-' + Craft.left, 19); // 26 - 7\n continue;\n }\n\n var $firstRowCell = $(this._$firstRowCells[i]),\n width = $firstRowCell.width();\n\n $firstRowCell.width(width);\n $helperCell.width(width);\n }\n\n return $outerContainer;\n }\n case 'thumbs': {\n $outerContainer = $('<div class=\"elements thumbviewhelper\"/>').appendTo(\n Garnish.$bod\n );\n $innerContainer = $('<ul class=\"thumbsview\"/>').appendTo(\n $outerContainer\n );\n\n $element.appendTo($innerContainer);\n\n return $outerContainer;\n }\n }\n\n return $();\n },\n\n /**\n * On Drop Target Change\n */\n _onDropTargetChange: function ($dropTarget) {\n clearTimeout(this._expandDropTargetFolderTimeout);\n\n if ($dropTarget) {\n var folderId = $dropTarget.data('folder-id');\n\n if (folderId) {\n this.dropTargetFolder = this._getSourceByKey(folderId);\n\n if (\n this._hasSubfolders(this.dropTargetFolder) &&\n !this._isExpanded(this.dropTargetFolder)\n ) {\n this._expandDropTargetFolderTimeout = setTimeout(\n this._expandFolder.bind(this),\n 500\n );\n }\n } else {\n this.dropTargetFolder = null;\n }\n }\n\n if ($dropTarget && $dropTarget[0] !== this.$source[0]) {\n // Temporarily remove the .sel class on the active source\n this.$source.removeClass('sel');\n } else {\n this.$source.addClass('sel');\n }\n },\n\n /**\n * Collapse Extra Expanded Folders\n */\n _collapseExtraExpandedFolders: function (dropTargetFolderId) {\n clearTimeout(this._expandDropTargetFolderTimeout);\n\n // If a source ID is passed in, exclude its parents\n var $excludedSources;\n\n if (dropTargetFolderId) {\n $excludedSources = this._getSourceByKey(dropTargetFolderId)\n .parents('li')\n .children('a');\n }\n\n for (var i = this._tempExpandedFolders.length - 1; i >= 0; i--) {\n var $source = this._tempExpandedFolders[i];\n\n // Check the parent list, if a source id is passed in\n if (\n typeof $excludedSources === 'undefined' ||\n $excludedSources.filter('[data-key=\"' + $source.data('key') + '\"]')\n .length === 0\n ) {\n this._collapseFolder($source);\n this._tempExpandedFolders.splice(i, 1);\n }\n }\n },\n\n _getSourceByKey: function (key) {\n return this.$sources.filter('[data-key$=\"' + key + '\"]');\n },\n\n _hasSubfolders: function ($source) {\n return $source.siblings('ul').find('li').length;\n },\n\n _isExpanded: function ($source) {\n return $source.parent('li').hasClass('expanded');\n },\n\n _expandFolder: function () {\n // Collapse any temp-expanded drop targets that aren't parents of this one\n this._collapseExtraExpandedFolders(this.dropTargetFolder.data('folder-id'));\n\n this.dropTargetFolder.siblings('.toggle').trigger('click');\n\n // Keep a record of that\n this._tempExpandedFolders.push(this.dropTargetFolder);\n },\n\n _collapseFolder: function ($source) {\n if ($source.parent().hasClass('expanded')) {\n $source.siblings('.toggle').trigger('click');\n }\n },\n\n getSourceActions: function () {\n const actions = this.base();\n\n // Make sure it's a volume folder\n if (this._getVolumeOrFolderUidFromSourceKey(this.sourceKey)) {\n actions.push({\n label: Craft.t('app', 'New subfolder'),\n onSelect: () => {\n this._createSubfolder(this.$source);\n },\n });\n\n // For all folders that are not top folders\n if (this.getSourceLevel(this.$source) > 1) {\n actions.push({\n label: Craft.t('app', 'Rename folder'),\n onSelect: () => {\n this._renameFolder(this.$source);\n },\n });\n actions.push({\n label: Craft.t('app', 'Delete folder'),\n destructive: true,\n onSelect: () => {\n this._deleteFolder(this.$source);\n },\n });\n }\n }\n\n return actions;\n },\n\n _createFolderContextMenu: function ($source) {\n // Make sure it's a volume folder\n if (!this._getVolumeOrFolderUidFromSourceKey($source.data('key'))) {\n return;\n }\n\n var menuOptions = [\n {\n label: Craft.t('app', 'New subfolder'),\n onClick: () => {\n this._createSubfolder($source);\n },\n },\n ];\n\n // For all folders that are not top folders\n if (this.settings.context === 'index' && this.getSourceLevel($source) > 1) {\n menuOptions.push({\n label: Craft.t('app', 'Rename folder'),\n onClick: () => {\n this._renameFolder($source);\n },\n });\n menuOptions.push({\n label: Craft.t('app', 'Delete folder'),\n onClick: () => {\n this._deleteFolder($source);\n },\n });\n }\n\n new Garnish.ContextMenu($source, menuOptions, {menuClass: 'menu'});\n },\n\n _createSubfolder: function ($parentFolder) {\n var subfolderName = prompt(Craft.t('app', 'Enter the name of the folder'));\n\n if (subfolderName) {\n var data = {\n parentId: $parentFolder.data('folder-id'),\n folderName: subfolderName,\n };\n\n this.setIndexBusy();\n\n Craft.sendActionRequest('POST', 'assets/create-folder', {data})\n .then((response) => {\n const data = response.data;\n this.setIndexAvailable();\n this._prepareParentForChildren($parentFolder);\n var $subfolder = $(\n '<li>' +\n `<a data-key=\"${$parentFolder.data('key')}/folder:${\n data.folderUid\n }\" data-default-sort=\"${$parentFolder.data('default-sort')}\"` +\n (Garnish.hasAttr($parentFolder, 'data-has-thumbs')\n ? ' data-has-thumbs'\n : '') +\n ` data-folder-id=\"${data.folderId}\"` +\n (Garnish.hasAttr($parentFolder, 'data-can-upload')\n ? ' data-can-upload'\n : '') +\n (Garnish.hasAttr($parentFolder, 'data-can-move-to')\n ? ' data-can-move-to'\n : '') +\n (Garnish.hasAttr($parentFolder, 'data-can-move-peer-files-to')\n ? ' data-can-move-peer-files-to'\n : '') +\n '>' +\n `<span class=\"label\">${data.folderName}</span>` +\n '</a>' +\n '</li>'\n );\n\n var $a = $subfolder.children('a:first');\n this._appendSubfolder($parentFolder, $subfolder);\n this.initSource($a);\n\n Craft.cp.displayNotice(Craft.t('app', 'Folder created.'));\n })\n .catch(({response}) => {\n this.setIndexAvailable();\n alert(response.data.message);\n });\n }\n },\n\n _deleteFolder: function ($targetFolder) {\n if (\n confirm(\n Craft.t('app', 'Really delete folder “{folder}”?', {\n folder: $.trim($targetFolder.text()),\n })\n )\n ) {\n var data = {\n folderId: $targetFolder.data('folder-id'),\n };\n\n this.setIndexBusy();\n\n Craft.sendActionRequest('POST', 'assets/delete-folder', {data})\n .then((response) => {\n this.setIndexAvailable();\n var $parentFolder = this.getParentSource($targetFolder);\n\n // Remove folder and any trace from its parent, if needed\n this.deinitSource($targetFolder);\n\n $targetFolder.parent().remove();\n this._cleanUpTree($parentFolder);\n\n Craft.cp.displayNotice(Craft.t('app', 'Folder deleted.'));\n })\n .catch(({response}) => {\n this.setIndexAvailable();\n alert(response.data.message);\n });\n }\n },\n\n /**\n * Rename\n */\n _renameFolder: function ($source) {\n const $label = $source.children('.label');\n const oldName = Craft.trim($label.text());\n const newName = prompt(Craft.t('app', 'Rename folder'), oldName);\n\n if (!newName || newName === oldName) {\n return;\n }\n\n this.setIndexBusy();\n\n Craft.sendActionRequest('POST', 'assets/rename-folder', {\n data: {\n folderId: $source.data('folder-id'),\n newName: newName,\n },\n })\n .then((response) => {\n $label.text(response.data.newName);\n\n // Is this the selected source?\n if ($source.data('key') === this.$source.data('key')) {\n this.updateElements();\n\n Craft.cp.displayNotice(Craft.t('app', 'Folder renamed.'));\n\n // Update the URL if we're on the Assets index\n if (this.settings.context === 'index') {\n this._updateUrl($source);\n }\n }\n })\n .catch(({response}) => {\n this.setIndexAvailable();\n alert(response.data.message);\n });\n },\n\n /**\n * Prepare a source folder for children folder.\n *\n * @param {jQuery} $parentFolder\n * @private\n */\n _prepareParentForChildren: function ($parentFolder) {\n if (!this._hasSubfolders($parentFolder)) {\n $parentFolder\n .parent()\n .addClass('expanded')\n .append('<div class=\"toggle\"></div><ul class=\"nested\"></ul>');\n this.initSourceToggle($parentFolder);\n }\n },\n\n /**\n * Appends a subfolder to the parent folder at the correct spot.\n *\n * @param {jQuery} $parentFolder\n * @param {jQuery} $subfolder\n * @private\n */\n _appendSubfolder: function ($parentFolder, $subfolder) {\n var $subfolderList = $parentFolder.siblings('ul'),\n $existingChildren = $subfolderList.children('li'),\n subfolderLabel = $.trim($subfolder.children('a:first').text()),\n folderInserted = false;\n\n for (var i = 0; i < $existingChildren.length; i++) {\n var $existingChild = $($existingChildren[i]);\n\n if ($.trim($existingChild.children('a:first').text()) > subfolderLabel) {\n $existingChild.before($subfolder);\n folderInserted = true;\n break;\n }\n }\n\n if (!folderInserted) {\n $parentFolder.siblings('ul').append($subfolder);\n }\n },\n\n _cleanUpTree: function ($parentFolder) {\n if (\n $parentFolder !== null &&\n $parentFolder.siblings('ul').children('li').length === 0\n ) {\n this.deinitSourceToggle($parentFolder);\n $parentFolder.siblings('ul').remove();\n $parentFolder.siblings('.toggle').remove();\n $parentFolder.parent().removeClass('expanded');\n }\n },\n\n _positionProgressBar: function () {\n if (!this.progressBar) {\n this.progressBar = new Craft.ProgressBar(this.$main, true);\n }\n\n var $container = $(),\n scrollTop = 0,\n offset = 0;\n\n if (this.settings.context === 'index') {\n $container = this.progressBar.$progressBar.closest('#content');\n scrollTop = Garnish.$win.scrollTop();\n } else {\n $container = this.progressBar.$progressBar.closest('.main');\n scrollTop = this.$main.scrollTop();\n }\n\n var containerTop = $container.offset().top;\n var diff = scrollTop - containerTop;\n var windowHeight = Garnish.$win.height();\n\n if ($container.height() > windowHeight) {\n offset = windowHeight / 2 - 6 + diff;\n } else {\n offset = $container.height() / 2 - 6;\n }\n\n if (this.settings.context !== 'index') {\n offset = scrollTop + ($container.height() / 2 - 6);\n }\n\n this.progressBar.$progressBar.css({\n top: offset,\n });\n },\n\n _performBatchRequests: function (parameterArray, finalCallback) {\n const responseArray = [];\n let activeRequests = parameterArray.length;\n\n while (parameterArray.length) {\n const parameters = parameterArray.shift();\n Craft.sendActionRequest('POST', parameters.action, {\n data: parameters.params,\n })\n .then((response) => {\n responseArray.push(response.data);\n })\n .finally(() => {\n this.progressBar.incrementProcessedItemCount(1);\n this.progressBar.updateProgressBar();\n\n // Was that the last one?\n if (--activeRequests === 0) {\n // If assets were just merged we should get the reference tags updated right away\n Craft.cp.runQueue();\n finalCallback(responseArray);\n }\n });\n }\n },\n});\n\n// Register it!\nCraft.registerElementIndexClass('craft\\\\elements\\\\Asset', Craft.AssetIndex);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Asset Select input\n */\nCraft.AssetSelectInput = Craft.BaseElementSelectInput.extend({\n requestId: 0,\n hud: null,\n $uploadBtn: null,\n uploader: null,\n progressBar: null,\n openPreviewTimeout: null,\n\n init: function () {\n this.base.apply(this, arguments);\n\n if (this.settings.canUpload) {\n this._attachUploader();\n }\n\n this.updateAddElementsBtn();\n\n this.addListener(\n this.$elementsContainer,\n 'keydown',\n this._onKeyDown.bind(this)\n );\n this.elementSelect.on('focusItem', this._onElementFocus.bind(this));\n },\n\n /**\n * Handle a keypress\n * @private\n */\n _onKeyDown: function (ev) {\n if (ev.keyCode === Garnish.SPACE_KEY && ev.shiftKey) {\n this.openPreview();\n ev.stopPropagation();\n return false;\n }\n },\n\n onAddElements: function () {\n this.$elements\n .find('.elementthumb')\n .addClass('open-preview')\n .on('click', (ev) => {\n this.clearOpenPreviewTimeout();\n this.openPreviewTimeout = setTimeout(() => {\n this.openPreview();\n this.openPreviewTimeout = null;\n }, 500);\n })\n .on('dblclick', (ev) => {\n this.clearOpenPreviewTimeout();\n });\n this.base();\n },\n\n clearOpenPreviewTimeout: function () {\n if (this.openPreviewTimeout) {\n clearTimeout(this.openPreviewTimeout);\n this.openPreviewTimeout = null;\n }\n },\n\n openPreview: function () {\n if (Craft.PreviewFileModal.openInstance) {\n Craft.PreviewFileModal.openInstance.selfDestruct();\n } else {\n var $element = this.elementSelect.$focusedItem;\n\n if ($element.length) {\n this._loadPreview($element);\n }\n }\n },\n\n /**\n * Handle element being focused\n * @private\n */\n _onElementFocus: function (ev) {\n var $element = $(ev.item);\n\n if (Craft.PreviewFileModal.openInstance && $element.length) {\n this._loadPreview($element);\n }\n },\n\n /**\n * Load the preview for an Asset element\n * @private\n */\n _loadPreview: function ($element) {\n var settings = {\n minGutter: 50,\n };\n\n if ($element.data('image-width')) {\n settings.startingWidth = $element.data('image-width');\n settings.startingHeight = $element.data('image-height');\n }\n\n new Craft.PreviewFileModal(\n $element.data('id'),\n this.elementSelect,\n settings\n );\n },\n\n /**\n * Attach the uploader with drag event handler\n */\n _attachUploader: function () {\n this.progressBar = new Craft.ProgressBar(\n $('<div class=\"progress-shade\"></div>').appendTo(this.$container)\n );\n\n var options = {\n url: Craft.getActionUrl('assets/upload'),\n dropZone: this.$container,\n formData: {\n fieldId: this.settings.fieldId,\n },\n };\n\n if (this.settings.sourceElementId) {\n options.formData.elementId = this.settings.sourceElementId;\n }\n\n if (this.settings.criteria.siteId) {\n options.formData.siteId = this.settings.criteria.siteId;\n }\n\n if (this.$addElementBtn) {\n this.$uploadBtn = $('<button/>', {\n type: 'button',\n class: 'btn dashed',\n 'data-icon': 'upload',\n 'aria-label':\n this.settings.limit == 1\n ? Craft.t('app', 'Upload a file')\n : Craft.t('app', 'Upload files'),\n 'aria-describedby': this.settings.describedBy,\n text:\n this.settings.limit == 1\n ? Craft.t('app', 'Upload a file')\n : Craft.t('app', 'Upload files'),\n }).insertAfter(this.$addElementBtn);\n options.fileInput = $('<input/>', {\n type: 'file',\n class: 'hidden',\n multiple: this.settings.limit != 1,\n }).insertAfter(this.$uploadBtn);\n\n // Trigger a window resize in case the field is inside an element editor HUD\n Garnish.$win.trigger('resize');\n }\n\n // If CSRF protection isn't enabled, these won't be defined.\n if (\n typeof Craft.csrfTokenName !== 'undefined' &&\n typeof Craft.csrfTokenValue !== 'undefined'\n ) {\n // Add the CSRF token\n options.formData[Craft.csrfTokenName] = Craft.csrfTokenValue;\n }\n\n if (typeof this.settings.criteria.kind !== 'undefined') {\n options.allowedKinds = this.settings.criteria.kind;\n }\n\n options.canAddMoreFiles = this.canAddMoreFiles.bind(this);\n\n options.events = {};\n options.events.fileuploadstart = this._onUploadStart.bind(this);\n options.events.fileuploadprogressall = this._onUploadProgress.bind(this);\n options.events.fileuploaddone = this._onUploadComplete.bind(this);\n options.events.fileuploadfail = this._onUploadFailure.bind(this);\n\n this.uploader = new Craft.Uploader(this.$container, options);\n\n if (this.$uploadBtn) {\n this.$uploadBtn.on('click', (ev) => {\n // We can't store a reference to the file input, because it gets replaced with a new input\n // each time a new file is uploaded - see https://stackoverflow.com/a/25034721/1688568\n this.$uploadBtn.next('input[type=file]').trigger('click');\n });\n }\n },\n\n enableAddElementsBtn: function () {\n if (this.$uploadBtn) {\n this.$uploadBtn.removeClass('hidden');\n }\n\n this.base();\n },\n\n disableAddElementsBtn: function () {\n if (this.$uploadBtn) {\n this.$uploadBtn.addClass('hidden');\n }\n\n this.base();\n },\n\n /**\n * Add the freshly uploaded file to the input field.\n */\n selectUploadedFile: function (element) {\n // Check if we're able to add new elements\n if (!this.canAddMoreElements()) {\n return;\n }\n\n var $newElement = element.$element;\n\n // Make a couple tweaks\n $newElement.addClass('removable');\n $newElement.prepend(\n '<input type=\"hidden\" name=\"' +\n this.settings.name +\n '[]\" value=\"' +\n element.id +\n '\">' +\n '<a class=\"delete icon\" title=\"' +\n Craft.t('app', 'Remove') +\n '\"></a>'\n );\n\n $newElement.appendTo(this.$elementsContainer);\n\n var margin = -($newElement.outerWidth() + 10);\n\n this.$addElementBtn.css('margin-' + Craft.left, margin + 'px');\n\n var animateCss = {};\n animateCss['margin-' + Craft.left] = 0;\n this.$addElementBtn.velocity(animateCss, 'fast');\n\n this.addElements($newElement);\n\n delete this.modal;\n },\n\n /**\n * On upload start.\n */\n _onUploadStart: function () {\n this.progressBar.$progressBar.css({\n top: Math.round(this.$container.outerHeight() / 2) - 6,\n });\n\n this.$container.addClass('uploading');\n this.progressBar.resetProgressBar();\n this.progressBar.showProgressBar();\n },\n\n /**\n * On upload progress.\n */\n _onUploadProgress: function (event, data) {\n var progress = parseInt((data.loaded / data.total) * 100, 10);\n this.progressBar.setProgressPercentage(progress);\n },\n\n /**\n * On a file being uploaded.\n */\n _onUploadComplete: function (event, data) {\n if (data.result.error) {\n alert(data.result.error);\n this.progressBar.hideProgressBar();\n this.$container.removeClass('uploading');\n } else {\n var parameters = {\n elementId: data.result.assetId,\n siteId: this.settings.criteria.siteId,\n thumbSize: this.settings.viewMode,\n };\n\n Craft.sendActionRequest('POST', 'elements/get-element-html', {\n data: parameters,\n })\n .then((response) => {\n var html = $(response.data.html);\n Craft.appendHeadHtml(response.data.headHtml);\n this.selectUploadedFile(Craft.getElementInfo(html));\n\n // Last file\n if (this.uploader.isLastUpload()) {\n this.progressBar.hideProgressBar();\n this.$container.removeClass('uploading');\n this.$container.trigger('change');\n }\n })\n .catch(({response}) => {\n alert(response.data.message);\n });\n\n Craft.cp.runQueue();\n }\n },\n\n /**\n * On Upload Failure.\n */\n _onUploadFailure: function (event, data) {\n const response = data.response();\n let {message, filename} = response?.jqXHR?.responseJSON || {};\n\n if (!message) {\n message = filename\n ? Craft.t('app', 'Upload failed for “{filename}”.', {filename})\n : Craft.t('app', 'Upload failed.');\n }\n\n alert(message);\n this.progressBar.hideProgressBar();\n this.$container.removeClass('uploading');\n },\n\n /**\n * We have to take into account files about to be added as well\n */\n canAddMoreFiles: function (slotsTaken) {\n return (\n !this.settings.limit ||\n this.$elements.length + slotsTaken < this.settings.limit\n );\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Asset selector modal class\n */\nCraft.AssetSelectorModal = Craft.BaseElementSelectorModal.extend(\n {\n $selectTransformBtn: null,\n _selectedTransform: null,\n\n init: function (elementType, settings) {\n settings = $.extend({}, Craft.AssetSelectorModal.defaults, settings);\n\n this.base(elementType, settings);\n\n if (settings.transforms.length) {\n this.createSelectTransformButton(settings.transforms);\n }\n },\n\n createSelectTransformButton: function (transforms) {\n if (!transforms || !transforms.length) {\n return;\n }\n\n var $btnGroup = $('<div class=\"btngroup\"/>').appendTo(\n this.$primaryButtons\n );\n this.$selectBtn.appendTo($btnGroup);\n\n this.$selectTransformBtn = $('<button/>', {\n type: 'button',\n class: 'btn menubtn disabled',\n text: Craft.t('app', 'Select transform'),\n }).appendTo($btnGroup);\n\n var $menu = $('<div class=\"menu\" data-align=\"right\"></div>').insertAfter(\n this.$selectTransformBtn\n ),\n $menuList = $('<ul></ul>').appendTo($menu);\n\n for (var i = 0; i < transforms.length; i++) {\n $(\n '<li><a data-transform=\"' +\n transforms[i].handle +\n '\">' +\n transforms[i].name +\n '</a></li>'\n ).appendTo($menuList);\n }\n\n var MenuButton = new Garnish.MenuBtn(this.$selectTransformBtn, {\n onOptionSelect: this.onSelectTransform.bind(this),\n });\n MenuButton.disable();\n\n this.$selectTransformBtn.data('menuButton', MenuButton);\n },\n\n onSelectionChange: function (ev) {\n var $selectedElements = this.elementIndex.getSelectedElements(),\n allowTransforms = false;\n\n if ($selectedElements.length && this.settings.transforms.length) {\n allowTransforms = true;\n\n for (var i = 0; i < $selectedElements.length; i++) {\n if (!$('.element.hasthumb:first', $selectedElements[i]).length) {\n break;\n }\n }\n }\n\n var MenuBtn = null;\n\n if (this.$selectTransformBtn) {\n MenuBtn = this.$selectTransformBtn.data('menuButton');\n }\n\n if (allowTransforms) {\n if (MenuBtn) {\n MenuBtn.enable();\n }\n\n this.$selectTransformBtn.removeClass('disabled');\n } else if (this.$selectTransformBtn) {\n if (MenuBtn) {\n MenuBtn.disable();\n }\n\n this.$selectTransformBtn.addClass('disabled');\n }\n\n this.base();\n },\n\n onSelectTransform: function (option) {\n var transform = $(option).data('transform');\n this.selectImagesWithTransform(transform);\n },\n\n selectImagesWithTransform: function (transform) {\n // First we must get any missing transform URLs\n if (\n typeof Craft.AssetSelectorModal.transformUrls[transform] === 'undefined'\n ) {\n Craft.AssetSelectorModal.transformUrls[transform] = {};\n }\n\n var $selectedElements = this.elementIndex.getSelectedElements(),\n imageIdsWithMissingUrls = [];\n\n for (var i = 0; i < $selectedElements.length; i++) {\n var $item = $($selectedElements[i]),\n elementId = Craft.getElementInfo($item).id;\n\n if (\n typeof Craft.AssetSelectorModal.transformUrls[transform][\n elementId\n ] === 'undefined'\n ) {\n imageIdsWithMissingUrls.push(elementId);\n }\n }\n\n if (imageIdsWithMissingUrls.length) {\n this.showFooterSpinner();\n\n this.fetchMissingTransformUrls(\n imageIdsWithMissingUrls,\n transform,\n () => {\n this.hideFooterSpinner();\n this.selectImagesWithTransform(transform);\n }\n );\n } else {\n this._selectedTransform = transform;\n this.selectElements();\n this._selectedTransform = null;\n }\n },\n\n fetchMissingTransformUrls: function (\n imageIdsWithMissingUrls,\n transform,\n callback\n ) {\n var elementId = imageIdsWithMissingUrls.pop();\n\n var data = {\n assetId: elementId,\n handle: transform,\n };\n\n Craft.sendActionRequest('POST', 'assets/generate-transform', {data})\n .then((response) => {\n Craft.AssetSelectorModal.transformUrls[transform][elementId] = false;\n if (response.data.url) {\n Craft.AssetSelectorModal.transformUrls[transform][elementId] =\n response.data.url;\n }\n })\n .catch(({response}) => {\n Craft.AssetSelectorModal.transformUrls[transform][elementId] = false;\n\n // More to load?\n if (imageIdsWithMissingUrls.length) {\n this.fetchMissingTransformUrls(\n imageIdsWithMissingUrls,\n transform,\n callback\n );\n } else {\n callback();\n }\n });\n },\n\n getElementInfo: function ($selectedElements) {\n var info = this.base($selectedElements);\n\n if (this._selectedTransform) {\n for (var i = 0; i < info.length; i++) {\n var elementId = info[i].id;\n\n if (\n typeof Craft.AssetSelectorModal.transformUrls[\n this._selectedTransform\n ][elementId] !== 'undefined' &&\n Craft.AssetSelectorModal.transformUrls[this._selectedTransform][\n elementId\n ] !== false\n ) {\n info[i].url =\n Craft.AssetSelectorModal.transformUrls[this._selectedTransform][\n elementId\n ];\n }\n }\n }\n\n return info;\n },\n\n onSelect: function (elementInfo) {\n this.settings.onSelect(elementInfo, this._selectedTransform);\n },\n },\n {\n defaults: {\n canSelectImageTransforms: false,\n transforms: [],\n },\n\n transformUrls: {},\n }\n);\n\n// Register it!\nCraft.registerElementSelectorModalClass(\n 'craft\\\\elements\\\\Asset',\n Craft.AssetSelectorModal\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * AuthManager class\n */\nCraft.AuthManager = Garnish.Base.extend(\n {\n remainingSessionTime: null,\n checkRemainingSessionTimer: null,\n showLoginModalTimer: null,\n decrementLogoutWarningInterval: null,\n\n showingLogoutWarningModal: false,\n showingLoginModal: false,\n\n logoutWarningModal: null,\n loginModal: null,\n\n $logoutWarningPara: null,\n $passwordInput: null,\n $loginBtn: null,\n $loginErrorPara: null,\n\n submitLoginIfLoggedOut: false,\n\n /**\n * Init\n */\n init: function () {\n if (Craft.username) {\n this.updateRemainingSessionTime(Craft.remainingSessionTime);\n }\n },\n\n /**\n * Sets a timer for the next time to check the auth timeout.\n */\n setCheckRemainingSessionTimer: function (seconds) {\n if (this.checkRemainingSessionTimer) {\n clearTimeout(this.checkRemainingSessionTimer);\n }\n\n this.checkRemainingSessionTimer = setTimeout(\n this.checkRemainingSessionTime.bind(this),\n seconds * 1000\n );\n },\n\n /**\n * Pings the server to see how many seconds are left on the current user session, and handles the response.\n */\n checkRemainingSessionTime: function (extendSession) {\n $.ajax({\n url: Craft.getActionUrl(\n 'users/session-info',\n extendSession ? null : 'dontExtendSession=1'\n ),\n type: 'GET',\n dataType: 'json',\n complete: (jqXHR, textStatus) => {\n if (textStatus === 'success') {\n if (\n typeof jqXHR.responseJSON.csrfTokenValue !== 'undefined' &&\n typeof Craft.csrfTokenValue !== 'undefined'\n ) {\n Craft.csrfTokenValue = jqXHR.responseJSON.csrfTokenValue;\n }\n\n this.updateRemainingSessionTime(jqXHR.responseJSON.timeout);\n this.submitLoginIfLoggedOut = false;\n } else {\n this.updateRemainingSessionTime(-1);\n }\n },\n });\n },\n\n /**\n * Updates our record of the auth timeout, and handles it.\n */\n updateRemainingSessionTime: function (remainingSessionTime) {\n this.remainingSessionTime = parseInt(remainingSessionTime);\n\n // Are we within the warning window?\n if (\n this.remainingSessionTime !== -1 &&\n this.remainingSessionTime < Craft.AuthManager.minSafeSessionTime\n ) {\n // Is there still time to renew the session?\n if (this.remainingSessionTime) {\n if (!this.showingLogoutWarningModal) {\n // Show the warning modal\n this.showLogoutWarningModal();\n }\n\n // Will the session expire before the next checkup?\n if (this.remainingSessionTime < Craft.AuthManager.checkInterval) {\n if (this.showLoginModalTimer) {\n clearTimeout(this.showLoginModalTimer);\n }\n\n this.showLoginModalTimer = setTimeout(\n this.showLoginModal.bind(this),\n this.remainingSessionTime * 1000\n );\n }\n } else {\n if (this.showingLoginModal) {\n if (this.submitLoginIfLoggedOut) {\n this.submitLogin();\n }\n } else {\n // Show the login modal\n this.showLoginModal();\n }\n }\n\n this.setCheckRemainingSessionTimer(Craft.AuthManager.checkInterval);\n } else {\n // Everything's good!\n this.hideLogoutWarningModal();\n this.hideLoginModal();\n\n // Will be be within the minSafeSessionTime before the next update?\n if (\n this.remainingSessionTime !== -1 &&\n this.remainingSessionTime <\n Craft.AuthManager.minSafeSessionTime +\n Craft.AuthManager.checkInterval\n ) {\n this.setCheckRemainingSessionTimer(\n this.remainingSessionTime - Craft.AuthManager.minSafeSessionTime + 1\n );\n } else {\n this.setCheckRemainingSessionTimer(Craft.AuthManager.checkInterval);\n }\n }\n },\n\n /**\n * Shows the logout warning modal.\n */\n showLogoutWarningModal: function () {\n var quickShow;\n\n if (this.showingLoginModal) {\n this.hideLoginModal(true);\n quickShow = true;\n } else {\n quickShow = false;\n }\n\n this.showingLogoutWarningModal = true;\n\n if (!this.logoutWarningModal) {\n let $form = $(\n '<form id=\"logoutwarningmodal\" class=\"modal alert fitted\"/>'\n );\n let $body = $('<div class=\"body\"/>').appendTo($form);\n let $buttons = $('<div class=\"buttons right\"/>').appendTo($body);\n let $logoutBtn = $('<button/>', {\n type: 'button',\n class: 'btn',\n text: Craft.t('app', 'Sign out now'),\n }).appendTo($buttons);\n let $renewSessionBtn = $('<button/>', {\n type: 'submit',\n class: 'btn submit',\n text: Craft.t('app', 'Keep me signed in'),\n }).appendTo($buttons);\n\n this.$logoutWarningPara = $('<p/>').prependTo($body);\n\n this.logoutWarningModal = new Garnish.Modal($form, {\n autoShow: false,\n closeOtherModals: false,\n hideOnEsc: false,\n hideOnShadeClick: false,\n shadeClass: 'modal-shade dark logoutwarningmodalshade',\n onFadeIn: function () {\n if (!Garnish.isMobileBrowser(true)) {\n // Auto-focus the renew button\n setTimeout(function () {\n $renewSessionBtn.trigger('focus');\n }, 100);\n }\n },\n });\n\n this.addListener($logoutBtn, 'activate', 'logout');\n this.addListener($form, 'submit', 'renewSession');\n }\n\n if (quickShow) {\n this.logoutWarningModal.quickShow();\n } else {\n this.logoutWarningModal.show();\n }\n\n this.updateLogoutWarningMessage();\n\n this.decrementLogoutWarningInterval = setInterval(\n this.decrementLogoutWarning.bind(this),\n 1000\n );\n },\n\n /**\n * Updates the logout warning message indicating that the session is about to expire.\n */\n updateLogoutWarningMessage: function () {\n this.$logoutWarningPara.text(\n Craft.t('app', 'Your session will expire in {time}.', {\n time: Craft.secondsToHumanTimeDuration(this.remainingSessionTime),\n })\n );\n\n this.logoutWarningModal.updateSizeAndPosition();\n },\n\n decrementLogoutWarning: function () {\n if (this.remainingSessionTime > 0) {\n this.remainingSessionTime--;\n this.updateLogoutWarningMessage();\n }\n\n if (this.remainingSessionTime === 0) {\n clearInterval(this.decrementLogoutWarningInterval);\n }\n },\n\n /**\n * Hides the logout warning modal.\n */\n hideLogoutWarningModal: function (quick) {\n this.showingLogoutWarningModal = false;\n\n if (this.logoutWarningModal) {\n if (quick) {\n this.logoutWarningModal.quickHide();\n } else {\n this.logoutWarningModal.hide();\n }\n\n if (this.decrementLogoutWarningInterval) {\n clearInterval(this.decrementLogoutWarningInterval);\n }\n }\n },\n\n /**\n * Shows the login modal.\n */\n showLoginModal: function () {\n var quickShow;\n\n if (this.showingLogoutWarningModal) {\n this.hideLogoutWarningModal(true);\n quickShow = true;\n } else {\n quickShow = false;\n }\n\n this.showingLoginModal = true;\n\n if (!this.loginModal) {\n var $form = $('<form id=\"loginmodal\" class=\"modal alert fitted\"/>'),\n $body = $(\n '<div class=\"body\"><h2>' +\n Craft.t('app', 'Your session has ended.') +\n '</h2><p>' +\n Craft.t('app', 'Enter your password to log back in.') +\n '</p></div>'\n ).appendTo($form),\n $inputContainer = $('<div class=\"inputcontainer\">').appendTo($body),\n $inputsFlexContainer = $('<div class=\"flex\"/>').appendTo(\n $inputContainer\n ),\n $passwordContainer = $('<div class=\"flex-grow\"/>').appendTo(\n $inputsFlexContainer\n ),\n $buttonContainer = $('<div/>').appendTo($inputsFlexContainer),\n $passwordWrapper = $('<div class=\"passwordwrapper\"/>').appendTo(\n $passwordContainer\n );\n\n this.$passwordInput = $(\n '<input type=\"password\" class=\"text password fullwidth\" autocomplete=\"current-password\" placeholder=\"' +\n Craft.t('app', 'Password') +\n '\"/>'\n ).appendTo($passwordWrapper);\n this.$loginBtn = Craft.ui\n .createSubmitButton({\n class: 'disabled',\n label: Craft.t('app', 'Sign in'),\n spinner: true,\n })\n .attr('aria-disabled', 'true')\n .appendTo($buttonContainer);\n this.$loginErrorPara = $('<p class=\"error\"/>').appendTo($body);\n\n this.loginModal = new Garnish.Modal($form, {\n autoShow: false,\n closeOtherModals: false,\n hideOnEsc: false,\n hideOnShadeClick: false,\n shadeClass: 'modal-shade dark loginmodalshade',\n onFadeIn: () => {\n if (!Garnish.isMobileBrowser(true)) {\n // Auto-focus the password input\n setTimeout(() => {\n this.$passwordInput.trigger('focus');\n }, 100);\n }\n },\n onFadeOut: () => {\n this.$passwordInput.val('');\n },\n });\n\n new Craft.PasswordInput(this.$passwordInput, {\n onToggleInput: ($newPasswordInput) => {\n this.$passwordInput = $newPasswordInput;\n },\n });\n\n this.addListener(this.$passwordInput, 'input', 'validatePassword');\n this.addListener($form, 'submit', 'login');\n }\n\n if (quickShow) {\n this.loginModal.quickShow();\n } else {\n this.loginModal.show();\n }\n },\n\n /**\n * Hides the login modal.\n */\n hideLoginModal: function (quick) {\n this.showingLoginModal = false;\n\n if (this.loginModal) {\n if (quick) {\n this.loginModal.quickHide();\n } else {\n this.loginModal.hide();\n }\n }\n },\n\n logout: function () {\n $.get({\n url: Craft.getActionUrl('users/logout'),\n dataType: 'json',\n success: () => {\n Craft.redirectTo('');\n },\n });\n },\n\n renewSession: function (ev) {\n if (ev) {\n ev.preventDefault();\n }\n\n this.hideLogoutWarningModal();\n this.checkRemainingSessionTime(true);\n },\n\n validatePassword: function () {\n if (this.$passwordInput.val().length >= 6) {\n this.$loginBtn.removeClass('disabled');\n this.$loginBtn.removeAttr('aria-disabled');\n return true;\n } else {\n this.$loginBtn.addClass('disabled');\n this.$loginBtn.attr('aria-disabled', 'true');\n return false;\n }\n },\n\n login: function (ev) {\n if (ev) {\n ev.preventDefault();\n }\n\n if (this.validatePassword()) {\n this.$loginBtn.addClass('loading');\n this.clearLoginError();\n\n if (typeof Craft.csrfTokenValue !== 'undefined') {\n // Check the auth status one last time before sending this off,\n // in case the user has already logged back in from another window/tab\n this.submitLoginIfLoggedOut = true;\n this.checkRemainingSessionTime();\n } else {\n this.submitLogin();\n }\n }\n },\n\n submitLogin: function () {\n var data = {\n loginName: Craft.username,\n password: this.$passwordInput.val(),\n };\n\n Craft.sendActionRequest('POST', 'users/login', {data})\n .then((response) => {\n this.$loginBtn.removeClass('loading');\n this.hideLoginModal();\n this.checkRemainingSessionTime();\n })\n .catch(({response}) => {\n this.$loginBtn.removeClass('loading');\n this.showLoginError(response.data.message || null);\n Garnish.shake(this.loginModal.$container);\n\n if (!Garnish.isMobileBrowser(true)) {\n this.$passwordInput.trigger('focus');\n }\n });\n },\n\n showLoginError: function (error) {\n if (error === null || typeof error === 'undefined') {\n error = Craft.t('app', 'A server error occurred.');\n }\n\n this.$loginErrorPara.text(error);\n this.loginModal.updateSizeAndPosition();\n },\n\n clearLoginError: function () {\n this.showLoginError('');\n },\n },\n {\n checkInterval: 60,\n minSafeSessionTime: 120,\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n\n/**\n * Element index class\n */\nCraft.BaseElementIndex = Garnish.Base.extend(\n {\n initialized: false,\n elementType: null,\n idPrefix: null,\n\n instanceState: null,\n sourceStates: null,\n sourceStatesStorageKey: null,\n\n searchTimeout: null,\n sourceSelect: null,\n\n $container: null,\n $main: null,\n isIndexBusy: false,\n\n $sidebar: null,\n showingSidebar: null,\n sourceKey: null,\n rootSourceKey: null,\n sourceViewModes: null,\n $source: null,\n $rootSource: null,\n sourcesByKey: null,\n $visibleSources: null,\n\n $sourceActionsContainer: null,\n $sourceActionsBtn: null,\n\n $toolbar: null,\n toolbarOffset: null,\n\n $searchContainer: null,\n $search: null,\n $filterBtn: null,\n searching: false,\n searchText: null,\n sortByScore: null,\n trashed: false,\n drafts: false,\n $clearSearchBtn: null,\n\n $statusMenuBtn: null,\n $statusMenuContainer: null,\n statusMenu: null,\n status: null,\n\n $siteMenuBtn: null,\n siteMenu: null,\n siteId: null,\n\n $elements: null,\n $updateSpinner: null,\n $viewModeBtnContainer: null,\n viewModeBtns: null,\n viewMode: null,\n view: null,\n _autoSelectElements: null,\n $countSpinner: null,\n $countContainer: null,\n $actionsContainer: null,\n page: 1,\n resultSet: null,\n totalResults: null,\n $exportBtn: null,\n\n actions: null,\n actionsHeadHtml: null,\n actionsBodyHtml: null,\n $selectAllContainer: null,\n $selectAllCheckbox: null,\n showingActionTriggers: false,\n exporters: null,\n exportersByType: null,\n _$triggers: null,\n\n _ignoreFailedRequest: false,\n _cancelToken: null,\n\n viewMenus: null,\n activeViewMenu: null,\n filterHuds: null,\n\n /**\n * Constructor\n */\n init: function (elementType, $container, settings) {\n this.elementType = elementType;\n this.$container = $container;\n this.setSettings(settings, Craft.BaseElementIndex.defaults);\n\n // Define an ID prefix that can be used for dynamically created elements\n // ---------------------------------------------------------------------\n\n this.idPrefix = Craft.randomString(10);\n\n // Set the state objects\n // ---------------------------------------------------------------------\n\n this.instanceState = this.getDefaultInstanceState();\n\n this.sourceStates = {};\n\n // Instance states (selected source) are stored by a custom storage key defined in the settings\n if (this.settings.storageKey) {\n $.extend(\n this.instanceState,\n Craft.getLocalStorage(this.settings.storageKey),\n {}\n );\n }\n\n // Source states (view mode, etc.) are stored by the element type and context\n this.sourceStatesStorageKey =\n 'BaseElementIndex.' + this.elementType + '.' + this.settings.context;\n $.extend(\n this.sourceStates,\n Craft.getLocalStorage(this.sourceStatesStorageKey, {})\n );\n\n // Find the DOM elements\n // ---------------------------------------------------------------------\n\n this.$main = this.$container.find('.main');\n this.$toolbar = this.$container.find(this.settings.toolbarSelector);\n this.$statusMenuBtn = this.$toolbar.find('.statusmenubtn:first');\n this.$statusMenuContainer = this.$statusMenuBtn.parent();\n this.$siteMenuBtn = this.$container.find('.sitemenubtn:first');\n\n this.$searchContainer = this.$toolbar.find('.search:first');\n this.$search = this.$searchContainer.children('input:first');\n this.$filterBtn = this.$searchContainer.children('.filter-btn:first');\n this.$clearSearchBtn = this.$searchContainer.children('.clear-btn:first');\n\n this.$sidebar = this.$container.find('.sidebar:first');\n this.$sourceActionsContainer = this.$sidebar.find('#source-actions');\n\n this.$elements = this.$container.find('.elements:first');\n this.$updateSpinner = this.$elements.find('.spinner');\n\n if (!this.$updateSpinner.length) {\n this.$updateSpinner = $('<div/>', {\n class: 'update-spinner spinner spinner-absolute',\n }).appendTo(this.$elements);\n }\n\n this.$countSpinner = this.$container.find('#count-spinner');\n this.$countContainer = this.$container.find('#count-container');\n this.$actionsContainer = this.$container.find('#actions-container');\n this.$exportBtn = this.$container.find('#export-btn');\n\n // Hide sidebar if needed\n if (this.settings.hideSidebar) {\n this.$sidebar.hide();\n $('.body, .content', this.$container).removeClass('has-sidebar');\n }\n\n // Initialize the sources\n // ---------------------------------------------------------------------\n\n if (!this.initSources()) {\n return;\n }\n\n // Initialize the status menu\n // ---------------------------------------------------------------------\n\n if (this.$statusMenuBtn.length) {\n this.statusMenu = this.$statusMenuBtn.menubtn().data('menubtn').menu;\n this.statusMenu.on('optionselect', this._handleStatusChange.bind(this));\n }\n\n // Initialize the site menu\n // ---------------------------------------------------------------------\n\n // Is there a site menu?\n if (this.$siteMenuBtn.length) {\n this.siteMenu = this.$siteMenuBtn.menubtn().data('menubtn').menu;\n\n // Figure out the initial site\n var $option = this.siteMenu.$options.filter('.sel:first');\n\n if (!$option.length) {\n $option = this.siteMenu.$options.first();\n }\n\n if ($option.length) {\n this._setSite($option.data('site-id'));\n } else {\n // No site options -- they must not have any site permissions\n this.settings.criteria = {id: '0'};\n }\n\n this.siteMenu.on('optionselect', this._handleSiteChange.bind(this));\n\n if (this.siteId) {\n // Should we be using a different default site?\n var defaultSiteId =\n this.settings.defaultSiteId || Craft.cp.getSiteId();\n\n if (defaultSiteId && defaultSiteId != this.siteId) {\n // Is that one available here?\n var $storedSiteOption = this.siteMenu.$options.filter(\n '[data-site-id=\"' + defaultSiteId + '\"]:first'\n );\n\n if ($storedSiteOption.length) {\n // Todo: switch this to siteMenu.selectOption($storedSiteOption) once Menu is updated to support that\n $storedSiteOption.trigger('click');\n }\n }\n }\n } else if (\n this.settings.criteria &&\n this.settings.criteria.siteId &&\n this.settings.criteria.siteId !== '*'\n ) {\n this._setSite(this.settings.criteria.siteId);\n } else {\n this._setSite(Craft.siteId);\n }\n\n // Don't let the criteria override the selected site\n if (this.settings.criteria && this.settings.criteria.siteId) {\n delete this.settings.criteria.siteId;\n }\n\n // Initialize the search input\n // ---------------------------------------------------------------------\n\n // Automatically update the elements after new search text has been sitting for a 1/2 second\n this.addListener(this.$search, 'input', () => {\n if (!this.searching && this.$search.val()) {\n this.startSearching();\n } else if (this.searching && !this.$search.val()) {\n this.stopSearching();\n }\n\n if (this.searchTimeout) {\n clearTimeout(this.searchTimeout);\n }\n\n this.searchTimeout = setTimeout(\n this.updateElementsIfSearchTextChanged.bind(this),\n 500\n );\n });\n\n // Update the elements when the Return key is pressed\n this.addListener(this.$search, 'keypress', (ev) => {\n if (ev.keyCode === Garnish.RETURN_KEY) {\n ev.preventDefault();\n\n if (this.searchTimeout) {\n clearTimeout(this.searchTimeout);\n }\n\n this.updateElementsIfSearchTextChanged();\n }\n });\n\n // Clear the search when the X button is clicked\n this.addListener(this.$clearSearchBtn, 'click', () => {\n this.clearSearch(true);\n\n if (!Garnish.isMobileBrowser(true)) {\n this.$search.trigger('focus');\n }\n });\n\n // Auto-focus the Search box\n if (!Garnish.isMobileBrowser(true)) {\n this.$search.trigger('focus');\n }\n\n // View menus\n this.viewMenus = {};\n\n // Filter HUDs\n this.filterHuds = {};\n this.addListener(this.$filterBtn, 'click', 'showFilterHud');\n\n // Set the default status\n // ---------------------------------------------------------------------\n\n const queryParams = Craft.getQueryParams();\n\n if (queryParams.status) {\n let selector;\n switch (queryParams.status) {\n case 'trashed':\n selector = '[data-trashed]';\n break;\n case 'drafts':\n selector = '[data-drafts]';\n break;\n default:\n selector = `[data-status=\"${queryParams.status}\"]`;\n }\n\n const $option = this.statusMenu.$options.filter(selector);\n if ($option.length) {\n this.statusMenu.selectOption($option[0]);\n } else {\n this.setQueryParam('status', null);\n }\n }\n\n // Initialize the Export button\n // ---------------------------------------------------------------------\n\n this.addListener(this.$exportBtn, 'click', '_showExportHud');\n\n // Let everyone know that the UI is initialized\n // ---------------------------------------------------------------------\n\n this.initialized = true;\n this.afterInit();\n\n // Select the initial source\n // ---------------------------------------------------------------------\n\n this.selectDefaultSource();\n\n // Select the default sort attribute/direction\n // ---------------------------------------------------------------------\n\n if (queryParams.sort) {\n const lastDashPos = queryParams.sort.lastIndexOf('-');\n if (lastDashPos !== -1) {\n const attr = queryParams.sort.substring(0, lastDashPos);\n const dir = queryParams.sort.substring(lastDashPos + 1);\n this.setSelectedSortAttribute(attr, dir);\n }\n }\n\n // Load the first batch of elements!\n // ---------------------------------------------------------------------\n\n // Default to whatever page is in the URL\n this.setPage(Craft.pageNum);\n\n this.updateElements(true);\n },\n\n afterInit: function () {\n this.onAfterInit();\n },\n\n _createCancelToken: function () {\n this._cancelToken = axios.CancelToken.source();\n return this._cancelToken.token;\n },\n\n _cancelRequests: function () {\n if (this._cancelToken) {\n this._ignoreFailedRequest = true;\n this._cancelToken.cancel();\n Garnish.requestAnimationFrame(() => {\n this._ignoreFailedRequest = false;\n });\n }\n },\n\n getSourceContainer: function () {\n return this.$sidebar.find('nav > ul');\n },\n\n get $sources() {\n if (!this.sourceSelect) {\n return undefined;\n }\n\n return this.sourceSelect.$items;\n },\n\n getSite: function () {\n if (!this.siteId) {\n return undefined;\n }\n return Craft.sites.find((s) => s.id == this.siteId);\n },\n\n initSources: function () {\n var $sources = this._getSourcesInList(this.getSourceContainer(), true);\n\n // No source, no party.\n if ($sources.length === 0) {\n return false;\n }\n\n // The source selector\n if (!this.sourceSelect) {\n this.sourceSelect = new Garnish.Select(this.$sidebar.find('nav'), {\n multi: false,\n allowEmpty: false,\n vertical: true,\n onSelectionChange: this._handleSourceSelectionChange.bind(this),\n });\n }\n\n this.sourcesByKey = {};\n\n for (let i = 0; i < $sources.length; i++) {\n this.initSource($($sources[i]));\n }\n\n return true;\n },\n\n selectDefaultSource: function () {\n // The `source` query param should always take precedence\n let sourceKey;\n if (this.settings.context === 'index') {\n sourceKey = Craft.getQueryParam('source');\n }\n\n if (!sourceKey) {\n sourceKey = this.getDefaultSourceKey();\n }\n\n let $source;\n\n if (sourceKey) {\n $source = this.getSourceByKey(sourceKey);\n\n // Make sure it's visible\n if (this.$visibleSources.index($source) === -1) {\n $source = null;\n }\n }\n\n if (!sourceKey || !$source) {\n // Select the first source by default\n $source = this.$visibleSources.first();\n }\n\n return this.selectSource($source);\n },\n\n refreshSources: function () {\n this.sourceSelect.removeAllItems();\n\n this.setIndexBusy();\n\n Craft.sendActionRequest('POST', this.settings.refreshSourcesAction, {\n data: {\n context: this.settings.context,\n elementType: this.elementType,\n },\n })\n .then((response) => {\n this.setIndexAvailable();\n this.getSourceContainer().replaceWith(response.data.html);\n this.initSources();\n this.selectDefaultSource();\n })\n .catch(() => {\n this.setIndexAvailable();\n if (!this._ignoreFailedRequest) {\n Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n }\n });\n },\n\n initSource: function ($source) {\n this.sourceSelect.addItems($source);\n this.initSourceToggle($source);\n this.sourcesByKey[$source.data('key')] = $source;\n\n if (\n $source.data('hasNestedSources') &&\n this.instanceState.expandedSources.indexOf($source.data('key')) !== -1\n ) {\n this._expandSource($source);\n }\n },\n\n initSourceToggle: function ($source) {\n // Remove handlers for the same thing. Just in case.\n this.deinitSourceToggle($source);\n\n var $toggle = this._getSourceToggle($source);\n\n if ($toggle.length) {\n this.addListener($source, 'dblclick', '_handleSourceDblClick');\n this.addListener($toggle, 'click', '_handleSourceToggleClick');\n $source.data('hasNestedSources', true);\n } else {\n $source.data('hasNestedSources', false);\n }\n },\n\n deinitSource: function ($source) {\n this.sourceSelect.removeItems($source);\n this.deinitSourceToggle($source);\n delete this.sourcesByKey[$source.data('key')];\n },\n\n deinitSourceToggle: function ($source) {\n if ($source.data('hasNestedSources')) {\n this.removeListener($source, 'dblclick');\n this.removeListener(this._getSourceToggle($source), 'click');\n }\n\n $source.removeData('hasNestedSources');\n },\n\n getDefaultInstanceState: function () {\n return {\n selectedSource: null,\n expandedSources: [],\n };\n },\n\n getDefaultSourceKey: function () {\n if (this.settings.defaultSource) {\n const paths = this.settings.defaultSource.split('/');\n let path = '';\n\n // Expand the tree\n for (let i = 0; i < paths.length; i++) {\n path += paths[i];\n const $source = this.getSourceByKey(path);\n\n // If the folder can't be found, then just go to the stored instance source.\n if (!$source) {\n return this.instanceState.selectedSource;\n }\n\n this._expandSource($source);\n path += '/';\n }\n\n // Just make sure that the modal is aware of the newly expanded sources, too.\n this._setSite(this.siteId);\n\n return this.settings.defaultSource;\n }\n\n return this.instanceState.selectedSource;\n },\n\n getDefaultExpandedSources: function () {\n return this.instanceState.expandedSources;\n },\n\n startSearching: function () {\n // Show the clear button\n this.$clearSearchBtn.removeClass('hidden');\n this.searching = true;\n this.sortByScore = true;\n\n if (this.activeViewMenu) {\n this.activeViewMenu.updateSortField();\n }\n },\n\n clearSearch: function (updateElements) {\n if (!this.searching) {\n return;\n }\n\n this.$search.val('');\n\n if (this.searchTimeout) {\n clearTimeout(this.searchTimeout);\n }\n\n this.stopSearching();\n\n if (updateElements) {\n this.updateElementsIfSearchTextChanged();\n } else {\n this.searchText = null;\n }\n },\n\n stopSearching: function () {\n // Hide the clear button\n this.$clearSearchBtn.addClass('hidden');\n this.searching = false;\n this.sortByScore = false;\n\n if (this.activeViewMenu) {\n this.activeViewMenu.updateSortField();\n }\n },\n\n setInstanceState: function (key, value) {\n if (typeof key === 'object') {\n $.extend(this.instanceState, key);\n } else {\n this.instanceState[key] = value;\n }\n\n this.storeInstanceState();\n },\n\n storeInstanceState: function () {\n if (this.settings.storageKey) {\n Craft.setLocalStorage(this.settings.storageKey, this.instanceState);\n }\n },\n\n getSourceState: function (sourceKey, key, defaultValue) {\n sourceKey = sourceKey.replace(/\\/.*/, '');\n\n if (typeof this.sourceStates[sourceKey] === 'undefined') {\n // Set it now so any modifications to it by whoever's calling this will be stored.\n this.sourceStates[sourceKey] = {};\n }\n\n if (typeof key === 'undefined') {\n return this.sourceStates[sourceKey];\n } else if (typeof this.sourceStates[sourceKey][key] !== 'undefined') {\n return this.sourceStates[sourceKey][key];\n } else {\n return typeof defaultValue !== 'undefined' ? defaultValue : null;\n }\n },\n\n getSelectedSourceState: function (key, defaultValue) {\n return this.getSourceState(\n this.instanceState.selectedSource,\n key,\n defaultValue\n );\n },\n\n setSelecetedSourceState: function (key, value) {\n var viewState = this.getSelectedSourceState();\n\n if (typeof key === 'object') {\n for (let k in key) {\n if (key.hasOwnProperty(k)) {\n if (key[k] !== null) {\n viewState[k] = key[k];\n } else {\n delete viewState[k];\n }\n }\n }\n } else if (value !== null) {\n viewState[key] = value;\n } else {\n delete viewState[key];\n }\n\n const sourceKey = this.instanceState.selectedSource.replace(/\\/.*/, '');\n\n this.sourceStates[sourceKey] = viewState;\n\n // Clean up sourceStates while we're at it\n for (let i in this.sourceStates) {\n if (this.sourceStates.hasOwnProperty(i) && i.includes('/')) {\n delete this.sourceStates[i];\n }\n }\n\n // Store it in localStorage too\n Craft.setLocalStorage(this.sourceStatesStorageKey, this.sourceStates);\n },\n\n /**\n * @deprecated in 4.3.0.\n */\n storeSortAttributeAndDirection: function () {},\n\n /**\n * Sets the page number.\n */\n setPage: function (page) {\n if (this.settings.context !== 'index') {\n return;\n }\n\n page = Math.max(page, 1);\n this.page = page;\n\n const url = Craft.getPageUrl(this.page);\n history.replaceState({}, '', url);\n },\n\n _resetCount: function () {\n this.resultSet = null;\n this.totalResults = null;\n },\n\n updateSourceMenu: function () {\n if (!this.$sourceActionsContainer.length) {\n return;\n }\n\n if (this.$sourceActionsBtn) {\n this.$sourceActionsBtn.data('trigger').destroy();\n this.$sourceActionsContainer.empty();\n $('#source-actions-menu').remove();\n this.$sourceActionsBtn = null;\n }\n\n const actions = this.getSourceActions();\n if (!actions.length) {\n return;\n }\n\n const groupedActions = [\n actions.filter((a) => !a.destructive && !a.administrative),\n actions.filter((a) => a.destructive && !a.administrative),\n actions.filter((a) => a.administrative),\n ].filter((group) => group.length);\n\n this.$sourceActionsBtn = $('<button/>', {\n type: 'button',\n class: 'btn settings icon menubtn',\n title: Craft.t('app', 'Source settings'),\n 'aria-label': Craft.t('app', 'Source settings'),\n 'aria-controls': 'source-actions-menu',\n }).appendTo(this.$sourceActionsContainer);\n\n const $menu = $('<div/>', {\n id: 'source-actions-menu',\n class: 'menu menu--disclosure',\n }).appendTo(this.$sourceActionsContainer);\n\n groupedActions.forEach((group, index) => {\n if (index !== 0) {\n $('<hr/>').appendTo($menu);\n }\n\n this._buildActionList(group).appendTo($menu);\n });\n\n this.$sourceActionsBtn.disclosureMenu();\n },\n\n _buildActionList: function (actions) {\n const $ul = $('<ul/>');\n\n actions.forEach((action) => {\n const $button = $('<button/>', {\n type: 'button',\n class: 'menu-option',\n text: action.label,\n }).on('click', () => {\n this.$sourceActionsBtn.data('trigger').hide();\n if (action.onSelect) {\n action.onSelect();\n }\n });\n\n if (action.destructive) {\n $button.addClass('error');\n }\n\n $('<li/>').append($button).appendTo($ul);\n });\n\n return $ul;\n },\n\n getSourceActions: function () {\n let actions = [];\n\n if (Craft.userIsAdmin && Craft.allowAdminChanges) {\n actions.push({\n label: Craft.t('app', 'Customize sources'),\n administrative: true,\n onSelect: () => {\n this.createCustomizeSourcesModal();\n },\n });\n }\n\n return actions;\n },\n\n updateViewMenu: function () {\n if (\n !this.activeViewMenu ||\n this.activeViewMenu !== this.viewMenus[this.rootSourceKey]\n ) {\n if (this.activeViewMenu) {\n this.activeViewMenu.hideTrigger();\n }\n if (!this.viewMenus[this.rootSourceKey]) {\n this.viewMenus[this.rootSourceKey] = new ViewMenu(\n this,\n this.$rootSource\n );\n }\n this.activeViewMenu = this.viewMenus[this.rootSourceKey];\n this.activeViewMenu.showTrigger();\n }\n },\n\n /**\n * Returns the data that should be passed to the elementIndex/getElements controller action\n * when loading elements.\n */\n getViewParams: function () {\n var criteria = {\n siteId: this.siteId,\n search: this.searchText,\n offset: this.settings.batchSize * (this.page - 1),\n limit: this.settings.batchSize,\n };\n\n // Only set drafts/draftOf/trashed params when needed, so we don't potentially override a source's criteria\n if (\n this.settings.canHaveDrafts &&\n (this.drafts || (this.settings.context === 'index' && !this.status))\n ) {\n criteria.drafts = this.drafts || null;\n criteria.savedDraftsOnly = true;\n if (!this.drafts) {\n criteria.draftOf = false;\n }\n }\n if (this.trashed) {\n criteria.trashed = true;\n }\n\n if (!Garnish.hasAttr(this.$source, 'data-override-status')) {\n criteria.status = this.status;\n }\n\n $.extend(criteria, this.settings.criteria);\n\n var params = {\n context: this.settings.context,\n elementType: this.elementType,\n source: this.instanceState.selectedSource,\n condition: this.settings.condition,\n criteria: criteria,\n disabledElementIds: this.settings.disabledElementIds,\n viewState: $.extend({}, this.getSelectedSourceState()),\n paginated: this._isViewPaginated() ? 1 : 0,\n };\n\n // Possible that the order/sort isn't entirely accurate if we're sorting by Score\n const [sortAttribute, sortDirection] =\n this.getSortAttributeAndDirection();\n params.viewState.order = sortAttribute;\n params.viewState.sort = sortDirection;\n\n if (sortAttribute === 'structure') {\n if (typeof this.instanceState.collapsedElementIds === 'undefined') {\n this.instanceState.collapsedElementIds = [];\n }\n params.collapsedElementIds = this.instanceState.collapsedElementIds;\n }\n\n if (\n this.filterHuds[this.siteId] &&\n this.filterHuds[this.siteId][this.sourceKey] &&\n this.filterHuds[this.siteId][this.sourceKey].serialized\n ) {\n params.filters =\n this.filterHuds[this.siteId][this.sourceKey].serialized;\n }\n\n // Give plugins a chance to hook in here\n this.trigger('registerViewParams', {\n params: params,\n });\n\n return params;\n },\n\n updateElements: function (preservePagination, pageChanged) {\n // Ignore if we're not fully initialized yet\n if (!this.initialized) {\n return;\n }\n\n // Cancel any ongoing requests\n this._cancelRequests();\n\n this.setIndexBusy();\n\n // Kill the old view class\n if (this.view) {\n this.view.destroy();\n delete this.view;\n }\n\n if (preservePagination !== true) {\n this.setPage(1);\n this._resetCount();\n }\n\n var params = this.getViewParams();\n\n Craft.sendActionRequest('POST', this.settings.updateElementsAction, {\n data: params,\n cancelToken: this._createCancelToken(),\n })\n .then((response) => {\n this.setIndexAvailable();\n (this.settings.context === 'index'\n ? Garnish.$scrollContainer\n : this.$main\n ).scrollTop(0);\n this._updateView(params, response.data);\n\n if (pageChanged) {\n const $elementContainer = this.view.getElementContainer();\n Garnish.firstFocusableElement($elementContainer).trigger('focus');\n }\n })\n .catch((e) => {\n this.setIndexAvailable();\n if (!this._ignoreFailedRequest) {\n Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n }\n });\n },\n\n updateElementsIfSearchTextChanged: function () {\n if (\n this.searchText !==\n (this.searchText = this.searching ? this.$search.val() : null)\n ) {\n this.updateElements();\n }\n },\n\n showActionTriggers: function () {\n // Ignore if they're already shown\n if (this.showingActionTriggers) {\n return;\n }\n\n if (!this._$triggers) {\n this._createTriggers();\n } else {\n this._$triggers.appendTo(this.$actionsContainer);\n }\n\n this.showingActionTriggers = true;\n },\n\n submitAction: function (action, actionParams) {\n // Make sure something's selected\n var selectedElementIds = this.view.getSelectedElementIds(),\n totalSelected = selectedElementIds.length;\n\n if (totalSelected === 0) {\n return;\n }\n\n if (typeof action === 'string') {\n action = this._findAction(action);\n }\n\n if (action.confirm && !confirm(action.confirm)) {\n return;\n }\n\n // Cancel any ongoing requests\n this._cancelRequests();\n\n // Get ready to submit\n var viewParams = this.getViewParams();\n\n actionParams = actionParams ? Craft.expandPostArray(actionParams) : {};\n var params = $.extend(viewParams, action.settings || {}, actionParams, {\n elementAction: action.type,\n elementIds: selectedElementIds,\n });\n\n // Do it\n this.setIndexBusy();\n this._autoSelectElements = selectedElementIds;\n\n if (action.download) {\n if (Craft.csrfTokenName) {\n params[Craft.csrfTokenName] = Craft.csrfTokenValue;\n }\n Craft.downloadFromUrl(\n 'POST',\n Craft.getActionUrl(this.settings.submitActionsAction),\n params\n )\n .then((response) => {\n this.setIndexAvailable();\n })\n .catch((e) => {\n this.setIndexAvailable();\n });\n } else {\n Craft.sendActionRequest('POST', this.settings.submitActionsAction, {\n data: params,\n cancelToken: this._createCancelToken(),\n })\n .then((response) => {\n // Update the count text too\n this._resetCount();\n this._updateView(viewParams, response.data);\n\n if (typeof response.data.badgeCounts !== 'undefined') {\n this._updateBadgeCounts(response.data.badgeCounts);\n }\n\n if (response.data.message) {\n Craft.cp.displaySuccess(response.data.message);\n }\n\n this.afterAction(action, params);\n })\n .catch(({response}) => {\n Craft.cp.displayError(response.data.message);\n })\n .finally(() => {\n this.setIndexAvailable();\n });\n }\n },\n\n _findAction: function (actionClass) {\n for (var i = 0; i < this.actions.length; i++) {\n if (this.actions[i].type === actionClass) {\n return this.actions[i];\n }\n }\n throw `Invalid element action: ${actionClass}`;\n },\n\n afterAction: function (action, params) {\n // There may be a new background job that needs to be run\n Craft.cp.runQueue();\n\n this.onAfterAction(action, params);\n },\n\n hideActionTriggers: function () {\n // Ignore if there aren't any\n if (!this.showingActionTriggers) {\n return;\n }\n\n this._$triggers.detach();\n\n this.showingActionTriggers = false;\n },\n\n updateActionTriggers: function () {\n // Do we have an action UI to update?\n if (this.actions) {\n var totalSelected = this.view.getSelectedElements().length;\n\n if (totalSelected !== 0) {\n if (totalSelected === this.view.getEnabledElements().length) {\n this.$selectAllCheckbox.removeClass('indeterminate');\n this.$selectAllCheckbox.addClass('checked');\n this.$selectAllCheckbox.attr('aria-checked', 'true');\n } else {\n this.$selectAllCheckbox.addClass('indeterminate');\n this.$selectAllCheckbox.removeClass('checked');\n this.$selectAllCheckbox.attr('aria-checked', 'mixed');\n }\n\n this.showActionTriggers();\n } else {\n this.$selectAllCheckbox.removeClass('indeterminate checked');\n this.$selectAllCheckbox.attr('aria-checked', 'false');\n this.hideActionTriggers();\n }\n }\n },\n\n getSelectedElements: function () {\n return this.view ? this.view.getSelectedElements() : $();\n },\n\n getSelectedElementIds: function () {\n return this.view ? this.view.getSelectedElementIds() : [];\n },\n\n setStatus: function (status) {\n // Find the option (and make sure it actually exists)\n var $option = this.statusMenu.$options.filter(\n 'a[data-status=\"' + status + '\"]:first'\n );\n\n if ($option.length) {\n this.statusMenu.selectOption($option[0]);\n }\n },\n\n /**\n * Returns the selected sort attribute for a source\n * @param {jQuery} [$source]\n * @returns {string}\n */\n getSelectedSortAttribute: function ($source) {\n $source = $source || this.$source;\n if ($source) {\n const attribute = this.getSourceState($source.data('key'), 'order');\n\n // Make sure it's valid\n if (this.getSortOption(attribute, $source)) {\n return attribute;\n }\n }\n\n return this.getDefaultSort()[0];\n },\n\n /**\n * Returns the selected sort direction for a source\n * @param {jQuery} [$source]\n * @returns {string}\n */\n getSelectedSortDirection: function ($source) {\n $source = $source || this.$source;\n if ($source) {\n const direction = this.getSourceState($source.data('key'), 'sort');\n\n // Make sure it's valid\n if (['asc', 'desc'].includes(direction)) {\n return direction;\n }\n }\n\n return this.getDefaultSort()[1];\n },\n\n /**\n * @deprecated in 4.3.0. Use setSelectedSortAttribute() instead.\n */\n setSortAttribute: function (attr) {\n this.setSelectedSortAttribute(attr);\n },\n\n /**\n * Sets the selected sort attribute and direction.\n *\n * If direction isn’t provided, the attribute’s default direction will be used.\n *\n * @param {string} attr\n * @param {string} [dir]\n */\n setSelectedSortAttribute: function (attr, dir) {\n // If score, keep track of that separately\n if (attr === 'score') {\n this.sortByScore = true;\n if (this.activeViewMenu) {\n this.activeViewMenu.updateSortField();\n }\n return;\n }\n\n this.sortByScore = false;\n\n // Make sure it's valid\n const sortOption = this.getSortOption(attr);\n if (!sortOption) {\n console.warn(`Invalid sort option: ${attr}`);\n return;\n }\n\n if (attr === 'structure') {\n dir = 'asc';\n } else {\n dir = dir || sortOption.defaultDir;\n }\n\n const history = [];\n\n // Remember the previous choices\n const attributes = [attr];\n\n // Only include the last attribute if it changed\n const lastAttr = this.getSelectedSourceState('order');\n if (lastAttr && lastAttr !== attr) {\n history.push([lastAttr, this.getSelectedSourceState('sort')]);\n attributes.push(lastAttr);\n }\n\n const oldHistory = this.getSelectedSourceState('orderHistory', []);\n for (let i = 0; i < oldHistory.length; i++) {\n const [a] = oldHistory[i];\n if (a && !attributes.includes(a)) {\n history.push(oldHistory[i]);\n attributes.push(a);\n } else {\n break;\n }\n }\n\n this.setSelecetedSourceState({\n order: attr,\n sort: dir,\n orderHistory: history,\n });\n\n // Update the view menu\n if (this.activeViewMenu) {\n this.activeViewMenu.updateSortField();\n }\n\n // Update the query string\n Craft.setQueryParam('sort', `${attr}-${dir}`);\n },\n\n /**\n * @deprecated in 4.3.0. Use setSelectedSortAttribute() or setSelectedSortDirection() instead.\n */\n setSortDirection: function (dir) {\n this.setSelectedSortDirection(dir);\n },\n\n /**\n * Sets the selected sort direction, maintaining the current sort attribute.\n * @param {string} dir\n */\n setSelectedSortDirection: function (dir) {\n this.setSelectedSortAttribute(this.getSelectedSortAttribute(), dir);\n },\n\n /**\n * Returns whether sorting by a structure is permitted for the current state.\n * @returns {boolean}\n */\n canSortByStructure: function () {\n return (\n !this.trashed && !this.drafts && !this.searching && !this.sortByScore\n );\n },\n\n /**\n * Returns the actual sort attribute, which may be different from what's selected.\n * @returns {string[]}\n */\n getSortAttributeAndDirection: function () {\n if (this.searching && this.sortByScore) {\n return ['score', 'desc'];\n }\n\n let attribute = this.getSelectedSortAttribute();\n let direction = this.getSelectedSortDirection();\n\n if (attribute === 'structure') {\n if (!this.canSortByStructure()) {\n const alt = this.getSortOptions().find((a) => a.attr !== 'structure');\n attribute = alt.attr;\n direction = alt.defaultDir;\n } else {\n direction = 'asc';\n }\n }\n\n return [attribute, direction];\n },\n\n getSortLabel: function (attr) {\n const sortOption = this.getSortOption(attr);\n return sortOption ? sortOption.label : null;\n },\n\n getSelectedViewMode: function () {\n return this.getSelectedSourceState('mode') || 'table';\n },\n\n /**\n * Returns the nesting level for a given source, where 1 = the root level\n * @param {jQuery} $source\n * @returns {number}\n */\n getSourceLevel: function ($source) {\n return $source.parentsUntil('nav', 'ul.nested').length + 1;\n },\n\n /**\n * Returns a source’s parent, or null if it’s the root source\n * @param {jQuery} $source\n * @returns {?jQuery}\n */\n getParentSource: function ($source) {\n const $parent = $source.parent().parent().siblings('a');\n return $parent.length ? $parent : null;\n },\n\n /**\n * Returns the root level source for a given source.\n * @param {jQuery} $source\n * @returns {jQuery}\n */\n getRootSource: function ($source) {\n let $parent;\n while (($parent = this.getParentSource($source))) {\n $source = $parent;\n }\n return $source;\n },\n\n getSourceByKey: function (key) {\n return this.sourcesByKey[key] || null;\n },\n\n selectSource: function (source) {\n const $source = $(source);\n\n // return false if there truly are no sources;\n // don't attempt to check only default/visible sources\n if (!this.sourcesByKey || !Object.keys(this.sourcesByKey).length) {\n return false;\n }\n\n if (\n this.$source &&\n this.$source[0] &&\n this.$source[0] === $source[0] &&\n $source.data('key') === this.sourceKey\n ) {\n return false;\n }\n\n // Hide action triggers if they're currently being shown\n this.hideActionTriggers();\n\n this.$source = $source;\n this.$rootSource = this.getRootSource($source);\n this.sourceKey = $source.data('key');\n this.rootSourceKey = this.$rootSource.data('key');\n this.setInstanceState('selectedSource', this.sourceKey);\n this.sourceSelect.selectItem($source);\n\n Craft.cp.updateContentHeading();\n\n if (this.searching) {\n // Clear the search value without causing it to update elements\n this.searchText = null;\n this.$search.val('');\n this.stopSearching();\n }\n\n // Status menu\n // ----------------------------------------------------------------------\n\n if (this.$statusMenuBtn.length) {\n if (Garnish.hasAttr(this.$source, 'data-override-status')) {\n this.$statusMenuContainer.addClass('hidden');\n } else {\n this.$statusMenuContainer.removeClass('hidden');\n }\n\n if (this.trashed) {\n // Swap to the initial status\n var $firstOption = this.statusMenu.$options.first();\n this.setStatus($firstOption.data('status'));\n }\n }\n\n // View mode buttons\n // ----------------------------------------------------------------------\n\n // Clear out any previous view mode data\n if (this.$viewModeBtnContainer) {\n this.$viewModeBtnContainer.remove();\n }\n\n this.viewModeBtns = {};\n this.viewMode = null;\n\n // Get the new list of view modes\n this.sourceViewModes = this.getViewModesForSource();\n\n // Create the buttons if there's more than one mode available to this source\n if (this.sourceViewModes.length > 1) {\n this.$viewModeBtnContainer = $(\n '<section class=\"btngroup btngroup--exclusive\"/>'\n ).attr('aria-label', Craft.t('app', 'View'));\n\n if (this.activeViewMenu) {\n this.$viewModeBtnContainer.insertBefore(this.activeViewMenu.$trigger);\n } else {\n this.$viewModeBtnContainer.appendTo(this.$toolbar);\n }\n\n for (var i = 0; i < this.sourceViewModes.length; i++) {\n let sourceViewMode = this.sourceViewModes[i];\n\n let $viewModeBtn = $('<button/>', {\n type: 'button',\n class:\n 'btn' +\n (typeof sourceViewMode.className !== 'undefined'\n ? ` ${sourceViewMode.className}`\n : ''),\n 'data-view': sourceViewMode.mode,\n 'data-icon': sourceViewMode.icon,\n 'aria-label': sourceViewMode.title,\n 'aria-pressed': 'false',\n title: sourceViewMode.title,\n }).appendTo(this.$viewModeBtnContainer);\n\n this.viewModeBtns[sourceViewMode.mode] = $viewModeBtn;\n\n this.addListener(\n $viewModeBtn,\n 'click',\n {mode: sourceViewMode.mode},\n function (ev) {\n this.selectViewMode(ev.data.mode);\n this.updateElements();\n }\n );\n }\n }\n\n // Figure out which mode we should start with\n var viewMode = this.getSelectedViewMode();\n\n if (!viewMode || !this.doesSourceHaveViewMode(viewMode)) {\n // Try to keep using the current view mode\n if (this.viewMode && this.doesSourceHaveViewMode(this.viewMode)) {\n viewMode = this.viewMode;\n }\n // Just use the first one\n else {\n viewMode = this.sourceViewModes[0].mode;\n }\n }\n\n this.selectViewMode(viewMode);\n\n this.updateSourceMenu();\n this.updateViewMenu();\n this.updateFilterBtn();\n\n this.onSelectSource();\n\n if (this.settings.context === 'index') {\n const urlParams = Craft.getQueryParams();\n urlParams.source = this.sourceKey;\n Craft.setUrl(Craft.getUrl(Craft.path, urlParams));\n }\n\n return true;\n },\n\n selectSourceByKey: function (key) {\n var $source = this.getSourceByKey(key);\n\n if ($source) {\n return this.selectSource($source);\n } else {\n return false;\n }\n },\n\n /**\n * Returns the available sort attributes for a source (or the selected root source)\n * @param {jQuery} [$source]\n * @returns {Object[]}\n */\n getSortOptions: function ($source) {\n $source = $source || this.$rootSource;\n const sortOptions = ($source ? $source.data('sort-opts') : null) || [];\n\n // Make sure there's at least one non-structure attribute\n if (!sortOptions.find((a) => a.attr !== 'structure')) {\n sortOptions.push({\n label: Craft.t('app', 'Title'),\n attr: 'title',\n defaultDir: 'asc',\n });\n }\n\n return sortOptions;\n },\n\n /**\n * Returns info about a sort attribute.\n * @param {string} attribute\n * @param {jQuery} [$source]\n * @returns {?Object}\n */\n getSortOption: function (attribute, $source) {\n return (\n this.getSortOptions($source).find((o) => o.attr === attribute) || null\n );\n },\n\n /**\n * Returns the default sort attribute and direction for a source.\n * @param {jQuery} [$source]\n * @returns {string[]}\n */\n getDefaultSort: function ($source) {\n $source = $source || this.$rootSource;\n if ($source) {\n let defaultSort = $source.data('default-sort');\n if (defaultSort) {\n if (typeof defaultSort === 'string') {\n defaultSort = [defaultSort];\n }\n\n // Make sure it's valid\n const sortOption = this.getSortOption(defaultSort[0], $source);\n if (sortOption) {\n // Fill in the default direction if it's not specified\n if (!defaultSort[1]) {\n defaultSort[1] = sortOption.defaultDir;\n }\n\n return defaultSort;\n }\n }\n }\n\n // Default to the first sort option\n const sortOptions = this.getSortOptions($source);\n return [sortOptions[0].attr, sortOptions[0].defaultDir];\n },\n\n /**\n * Returns the available table columns for a source (or the selected root source)\n * @param {jQuery} [$source]\n * @returns {Object[]}\n */\n getTableColumnOptions: function ($source) {\n $source = $source || this.$rootSource;\n return ($source ? $source.data('table-col-opts') : null) || [];\n },\n\n /**\n * Returns info about a table column.\n * @param {string} attribute\n * @param {jQuery} [$source]\n * @returns {?Object}\n */\n getTableColumnOption: function (attribute, $source) {\n return (\n this.getTableColumnOptions($source).find((o) => o.attr === attribute) ||\n null\n );\n },\n\n /**\n * Returns the default table columns for a source (or the selected root source)\n * @param {jQuery} [$source]\n * @returns {string[]}\n */\n getDefaultTableColumns: function ($source) {\n $source = $source || this.$rootSource;\n return ($source ? $source.data('default-table-cols') : null) || [];\n },\n\n /**\n * Returns the selected sort attribute for a source\n * @param {jQuery} [$source]\n * @returns {string[]}\n */\n getSelectedTableColumns: function ($source) {\n $source = $source || this.$rootSource;\n if ($source) {\n const attributes = this.getSourceState(\n $source.data('key'),\n 'tableColumns'\n );\n\n if (attributes) {\n // Only return the valid ones\n return attributes.filter(\n (a) => !!this.getTableColumnOption(a, $source)\n );\n }\n }\n\n return this.getDefaultTableColumns($source);\n },\n\n setSelectedTableColumns: function (attributes) {\n this.setSelecetedSourceState({\n tableColumns: attributes,\n });\n\n // Update the view menu\n if (this.activeViewMenu) {\n this.activeViewMenu.updateTableColumnField();\n }\n },\n\n getViewModesForSource: function () {\n var viewModes = [\n {\n mode: 'table',\n title: Craft.t('app', 'Display in a table'),\n icon: 'list',\n },\n ];\n\n if (this.$source && Garnish.hasAttr(this.$source, 'data-has-thumbs')) {\n viewModes.push({\n mode: 'thumbs',\n title: Craft.t('app', 'Display as thumbnails'),\n icon: 'grid',\n });\n }\n\n return viewModes;\n },\n\n doesSourceHaveViewMode: function (viewMode) {\n for (var i = 0; i < this.sourceViewModes.length; i++) {\n if (this.sourceViewModes[i].mode === viewMode) {\n return true;\n }\n }\n\n return false;\n },\n\n selectViewMode: function (viewMode, force) {\n // Make sure that the current source supports it\n if (!force && !this.doesSourceHaveViewMode(viewMode)) {\n viewMode = this.sourceViewModes[0].mode;\n }\n\n // Has anything changed?\n if (viewMode === this.viewMode) {\n return;\n }\n\n // Deselect the previous view mode\n if (\n this.viewMode &&\n typeof this.viewModeBtns[this.viewMode] !== 'undefined'\n ) {\n this.viewModeBtns[this.viewMode]\n .removeClass('active')\n .attr('aria-pressed', 'false');\n }\n\n this.viewMode = viewMode;\n this.setSelecetedSourceState('mode', this.viewMode);\n\n if (typeof this.viewModeBtns[this.viewMode] !== 'undefined') {\n this.viewModeBtns[this.viewMode]\n .addClass('active')\n .attr('aria-pressed', 'true');\n }\n },\n\n createView: function (mode, settings) {\n var viewClass = this.getViewClass(mode);\n return new viewClass(this, this.$elements, settings);\n },\n\n getViewClass: function (mode) {\n switch (mode) {\n case 'table':\n return Craft.TableElementIndexView;\n case 'thumbs':\n return Craft.ThumbsElementIndexView;\n default:\n throw `View mode \"${mode}\" not supported.`;\n }\n },\n\n rememberDisabledElementId: function (id) {\n var index = $.inArray(id, this.settings.disabledElementIds);\n\n if (index === -1) {\n this.settings.disabledElementIds.push(id);\n }\n },\n\n forgetDisabledElementId: function (id) {\n var index = $.inArray(id, this.settings.disabledElementIds);\n\n if (index !== -1) {\n this.settings.disabledElementIds.splice(index, 1);\n }\n },\n\n enableElements: function ($elements) {\n $elements\n .removeClass('disabled')\n .parents('.disabled')\n .removeClass('disabled');\n\n for (var i = 0; i < $elements.length; i++) {\n var id = $($elements[i]).data('id');\n this.forgetDisabledElementId(id);\n }\n\n this.onEnableElements($elements);\n },\n\n disableElements: function ($elements) {\n $elements.removeClass('sel').addClass('disabled');\n\n for (var i = 0; i < $elements.length; i++) {\n var id = $($elements[i]).data('id');\n this.rememberDisabledElementId(id);\n }\n\n this.onDisableElements($elements);\n },\n\n getElementById: function (id) {\n return this.view.getElementById(id);\n },\n\n enableElementsById: function (ids) {\n ids = $.makeArray(ids);\n\n for (var i = 0; i < ids.length; i++) {\n var id = ids[i],\n $element = this.getElementById(id);\n\n if ($element && $element.length) {\n this.enableElements($element);\n } else {\n this.forgetDisabledElementId(id);\n }\n }\n },\n\n disableElementsById: function (ids) {\n ids = $.makeArray(ids);\n\n for (var i = 0; i < ids.length; i++) {\n var id = ids[i],\n $element = this.getElementById(id);\n\n if ($element && $element.length) {\n this.disableElements($element);\n } else {\n this.rememberDisabledElementId(id);\n }\n }\n },\n\n selectElementAfterUpdate: function (id) {\n if (this._autoSelectElements === null) {\n this._autoSelectElements = [];\n }\n\n this._autoSelectElements.push(id);\n },\n\n addButton: function ($button) {\n this.getButtonContainer().append($button);\n },\n\n isShowingSidebar: function () {\n if (this.showingSidebar === null) {\n this.showingSidebar =\n this.$sidebar.length && !this.$sidebar.hasClass('hidden');\n }\n\n return this.showingSidebar;\n },\n\n getButtonContainer: function () {\n // Is there a predesignated place where buttons should go?\n if (this.settings.buttonContainer) {\n return $(this.settings.buttonContainer);\n } else {\n var $container = $('#action-buttons');\n\n if (!$container.length) {\n $container = $('<div id=\"action-buttons\"/>').appendTo($('#header'));\n }\n\n return $container;\n }\n },\n\n setIndexBusy: function () {\n this.$elements.addClass('busy');\n this.$updateSpinner.appendTo(this.$elements);\n this.isIndexBusy = true;\n },\n\n setIndexAvailable: function () {\n this.$elements.removeClass('busy');\n this.$updateSpinner.remove();\n this.isIndexBusy = false;\n },\n\n createCustomizeSourcesModal: function () {\n // Recreate it each time\n var modal = new Craft.CustomizeSourcesModal(this, {\n onHide: function () {\n modal.destroy();\n },\n });\n\n return modal;\n },\n\n disable: function () {\n if (this.sourceSelect) {\n this.sourceSelect.disable();\n }\n\n if (this.view) {\n this.view.disable();\n }\n\n this.base();\n },\n\n enable: function () {\n if (this.sourceSelect) {\n this.sourceSelect.enable();\n }\n\n if (this.view) {\n this.view.enable();\n }\n\n this.base();\n },\n\n onAfterInit: function () {\n this.settings.onAfterInit();\n this.trigger('afterInit');\n },\n\n onSelectSource: function () {\n this.settings.onSelectSource(this.sourceKey);\n this.trigger('selectSource', {sourceKey: this.sourceKey});\n },\n\n onSelectSite: function () {\n this.settings.onSelectSite(this.siteId);\n this.trigger('selectSite', {siteId: this.siteId});\n },\n\n onUpdateElements: function () {\n this.settings.onUpdateElements();\n this.trigger('updateElements');\n },\n\n onSelectionChange: function () {\n this.settings.onSelectionChange();\n this.trigger('selectionChange');\n },\n\n onEnableElements: function ($elements) {\n this.settings.onEnableElements($elements);\n this.trigger('enableElements', {elements: $elements});\n },\n\n onDisableElements: function ($elements) {\n this.settings.onDisableElements($elements);\n this.trigger('disableElements', {elements: $elements});\n },\n\n onAfterAction: function (action, params) {\n this.settings.onAfterAction(action, params);\n this.trigger('afterAction', {action: action, params: params});\n },\n\n // UI state handlers\n // -------------------------------------------------------------------------\n\n _handleSourceSelectionChange: function () {\n // If the selected source was just removed (maybe because its parent was collapsed),\n // there won't be a selected source\n if (!this.sourceSelect.totalSelected) {\n this.sourceSelect.selectItem(this.$visibleSources.first());\n return;\n }\n\n if (this.selectSource(this.sourceSelect.$selectedItems)) {\n this.updateElements();\n }\n },\n\n _handleActionTriggerSubmit: function (ev) {\n ev.preventDefault();\n\n var $form = $(ev.currentTarget);\n\n // Make sure Craft.ElementActionTrigger isn't overriding this\n if ($form.hasClass('disabled') || $form.data('custom-handler')) {\n return;\n }\n\n this.submitAction($form.data('action'), Garnish.getPostData($form));\n },\n\n _handleMenuActionTriggerSubmit: function (ev) {\n var $option = $(ev.option);\n\n // Make sure Craft.ElementActionTrigger isn't overriding this\n if ($option.hasClass('disabled') || $option.data('custom-handler')) {\n return;\n }\n\n this.submitAction($option.data('action'));\n },\n\n _handleStatusChange: function (ev) {\n this.statusMenu.$options.removeClass('sel');\n var $option = $(ev.selectedOption).addClass('sel');\n this.$statusMenuBtn.html($option.html());\n\n this.trashed = false;\n this.drafts = false;\n this.status = null;\n let queryParam = null;\n\n if (Garnish.hasAttr($option, 'data-trashed')) {\n this.trashed = true;\n queryParam = 'trashed';\n } else if (Garnish.hasAttr($option, 'data-drafts')) {\n this.drafts = true;\n queryParam = 'drafts';\n } else {\n this.status = queryParam = $option.data('status') || null;\n }\n\n if (this.activeViewMenu) {\n this.activeViewMenu.updateSortField();\n }\n\n Craft.setQueryParam('status', queryParam);\n this.updateElements();\n },\n\n _handleSiteChange: function (ev) {\n this.siteMenu.$options.removeClass('sel');\n var $option = $(ev.selectedOption).addClass('sel');\n this.$siteMenuBtn.html($option.html());\n this._setSite($option.data('site-id'));\n this.onSelectSite();\n },\n\n _setSite: function (siteId) {\n let firstSite = this.siteId === null;\n this.siteId = siteId;\n\n this.updateSourceVisibility();\n\n if (\n this.initialized &&\n !firstSite &&\n (!this.$source || !this.$source.length) &&\n this.$visibleSources.length\n ) {\n this.selectSource(this.$visibleSources[0]);\n }\n\n // Hide any empty-nester headings\n var $headings = this.getSourceContainer().children('.heading');\n var $heading;\n\n for (let i = 0; i < $headings.length; i++) {\n $heading = $headings.eq(i);\n if ($heading.has('> ul > li:not(.hidden)').length !== 0) {\n $heading.removeClass('hidden');\n } else {\n $heading.addClass('hidden');\n }\n }\n\n if (this.initialized) {\n if (this.settings.context === 'index') {\n // Remember this site for later\n Craft.cp.setSiteId(siteId);\n }\n\n // Update the elements\n this.updateElements();\n this.updateFilterBtn();\n }\n },\n\n updateSourceVisibility: function () {\n this.$visibleSources = $();\n\n for (let i = 0; i < this.$sources.length; i++) {\n const $source = this.$sources.eq(i);\n\n if (\n !Garnish.hasAttr($source, 'data-disabled') &&\n (typeof $source.data('sites') === 'undefined' ||\n $source\n .data('sites')\n .toString()\n .split(',')\n .indexOf(this.siteId.toString()) !== -1)\n ) {\n $source.parent().removeClass('hidden');\n this.$visibleSources = this.$visibleSources.add($source);\n } else {\n $source.parent().addClass('hidden');\n\n // Is this the currently selected source?\n if (this.$source && this.$source.get(0) === $source.get(0)) {\n this.$source = null;\n this.$rootSource = null;\n this.sourceKey = null;\n this.rootSourceKey = null;\n }\n }\n }\n },\n\n _handleSelectionChange: function () {\n this.updateActionTriggers();\n this.onSelectionChange();\n },\n\n _handleSourceDblClick: function (ev) {\n this._toggleSource($(ev.currentTarget));\n ev.stopPropagation();\n },\n\n _handleSourceToggleClick: function (ev) {\n this._toggleSource($(ev.currentTarget).prev('a'));\n ev.stopPropagation();\n },\n\n // Source managemnet\n // -------------------------------------------------------------------------\n\n _getSourcesInList: function ($list, topLevel) {\n let $sources = $list.find('> li:not(.heading) > a');\n if (topLevel) {\n $sources = $sources.add($list.find('> li.heading > ul > li > a'));\n }\n return $sources;\n },\n\n _getChildSources: function ($source) {\n var $list = $source.siblings('ul');\n return this._getSourcesInList($list);\n },\n\n _getSourceToggle: function ($source) {\n return $source.siblings('.toggle');\n },\n\n _toggleSource: function ($source) {\n if ($source.parent('li').hasClass('expanded')) {\n this._collapseSource($source);\n } else {\n this._expandSource($source);\n }\n },\n\n _expandSource: function ($source) {\n $source.next('.toggle').attr({\n 'aria-expanded': 'true',\n 'aria-label': Craft.t('app', 'Hide nested sources'),\n });\n $source.parent('li').addClass('expanded');\n\n var $childSources = this._getChildSources($source);\n for (let i = 0; i < $childSources.length; i++) {\n this.initSource($($childSources[i]));\n if (this.$visibleSources) {\n this.$visibleSources = this.$visibleSources.add($childSources[i]);\n }\n }\n\n var key = $source.data('key');\n if (this.instanceState.expandedSources.indexOf(key) === -1) {\n this.instanceState.expandedSources.push(key);\n this.storeInstanceState();\n }\n },\n\n _collapseSource: function ($source) {\n $source.next('.toggle').attr({\n 'aria-expanded': 'false',\n 'aria-label': Craft.t('app', 'Show nested sources'),\n });\n $source.parent('li').removeClass('expanded');\n\n var $childSources = this._getChildSources($source);\n for (let i = 0; i < $childSources.length; i++) {\n this.deinitSource($($childSources[i]));\n this.$visibleSources = this.$visibleSources.not($childSources[i]);\n }\n\n var i = this.instanceState.expandedSources.indexOf($source.data('key'));\n if (i !== -1) {\n this.instanceState.expandedSources.splice(i, 1);\n this.storeInstanceState();\n }\n },\n\n // View\n // -------------------------------------------------------------------------\n\n _isViewPaginated: function () {\n return (\n this.settings.context === 'index' &&\n this.getSortAttributeAndDirection()[0] !== 'structure'\n );\n },\n\n _updateView: function (params, response) {\n // Cleanup\n // -------------------------------------------------------------\n\n // Get rid of the old action triggers regardless of whether the new batch has actions or not\n if (this.actions) {\n this.hideActionTriggers();\n this.actions =\n this.actionsHeadHtml =\n this.actionsBodyHtml =\n this._$triggers =\n null;\n }\n\n // Capture the focused element, in case it's about to get removed from the DOM\n const activeElement = document.activeElement;\n\n // Update the count text\n // -------------------------------------------------------------\n\n if (this.$countContainer.length) {\n this.$countSpinner.removeClass('hidden');\n this.$countContainer.html('');\n\n this._countResults()\n .then((total) => {\n this.$countSpinner.addClass('hidden');\n\n let itemLabel = Craft.elementTypeNames[this.elementType]\n ? Craft.elementTypeNames[this.elementType][2]\n : this.settings.elementTypeName.toLowerCase();\n let itemsLabel = Craft.elementTypeNames[this.elementType]\n ? Craft.elementTypeNames[this.elementType][3]\n : this.settings.elementTypePluralName.toLowerCase();\n\n if (!this._isViewPaginated()) {\n let countLabel = Craft.t(\n 'app',\n '{total, number} {total, plural, =1{{item}} other{{items}}}',\n {\n total: total,\n item: itemLabel,\n items: itemsLabel,\n }\n );\n this.$countContainer.text(countLabel);\n } else {\n let first = Math.min(\n this.settings.batchSize * (this.page - 1) + 1,\n total\n );\n let last = Math.min(first + (this.settings.batchSize - 1), total);\n let countLabel = Craft.t(\n 'app',\n '{first, number}-{last, number} of {total, number} {total, plural, =1{{item}} other{{items}}}',\n {\n first: first,\n last: last,\n total: total,\n item: itemLabel,\n items: itemsLabel,\n }\n );\n\n let $paginationContainer = $(\n '<div class=\"flex pagination\"/>'\n ).appendTo(this.$countContainer);\n let totalPages = Math.max(\n Math.ceil(total / this.settings.batchSize),\n 1\n );\n\n const $paginationNav = $('<nav/>', {\n class: 'flex',\n 'aria-label': Craft.t('app', '{element} pagination', {\n element: itemLabel,\n }),\n }).appendTo($paginationContainer);\n\n let $prevBtn = $('<button/>', {\n role: 'button',\n class:\n 'page-link prev-page' + (this.page > 1 ? '' : ' disabled'),\n disabled: this.page === 1,\n title: Craft.t('app', 'Previous Page'),\n }).appendTo($paginationNav);\n let $nextBtn = $('<button/>', {\n role: 'button',\n class:\n 'page-link next-page' +\n (this.page < totalPages ? '' : ' disabled'),\n disabled: this.page === totalPages,\n title: Craft.t('app', 'Next Page'),\n }).appendTo($paginationNav);\n\n $('<div/>', {\n class: 'page-info',\n text: countLabel,\n }).appendTo($paginationContainer);\n\n if (this.page > 1) {\n this.addListener($prevBtn, 'click', function () {\n this.removeListener($prevBtn, 'click');\n this.removeListener($nextBtn, 'click');\n this.setPage(this.page - 1);\n this.updateElements(true, true);\n });\n }\n\n if (this.page < totalPages) {\n this.addListener($nextBtn, 'click', function () {\n this.removeListener($prevBtn, 'click');\n this.removeListener($nextBtn, 'click');\n this.setPage(this.page + 1);\n this.updateElements(true, true);\n });\n }\n }\n })\n .catch(() => {\n this.$countSpinner.addClass('hidden');\n });\n }\n\n // Update the view with the new container + elements HTML\n // -------------------------------------------------------------\n\n this.$elements.html(response.html);\n Craft.appendHeadHtml(response.headHtml);\n Craft.appendBodyHtml(response.bodyHtml);\n\n // Batch actions setup\n // -------------------------------------------------------------\n\n this.$selectAllContainer = this.$elements.find(\n '.selectallcontainer:first'\n );\n\n if (response.actions && response.actions.length) {\n if (this.$selectAllContainer.length) {\n this.actions = response.actions;\n this.actionsHeadHtml = response.actionsHeadHtml;\n this.actionsBodyHtml = response.actionsBodyHtml;\n\n // Create the select all checkbox\n this.$selectAllCheckbox = $('<div class=\"checkbox\"/>')\n .prependTo(this.$selectAllContainer)\n .attr({\n role: 'checkbox',\n tabindex: '0',\n 'aria-checked': 'false',\n 'aria-label': Craft.t('app', 'Select all'),\n });\n\n this.addListener(this.$selectAllCheckbox, 'click', function () {\n if (this.view.getSelectedElements().length === 0) {\n this.view.selectAllElements();\n } else {\n this.view.deselectAllElements();\n }\n });\n\n this.addListener(this.$selectAllCheckbox, 'keydown', function (ev) {\n if (ev.keyCode === Garnish.SPACE_KEY) {\n ev.preventDefault();\n\n $(ev.currentTarget).trigger('click');\n }\n });\n }\n } else {\n if (!this.$selectAllContainer.siblings().length) {\n this.$selectAllContainer.parent('.header').remove();\n }\n this.$selectAllContainer.remove();\n }\n\n // Exporters setup\n // -------------------------------------------------------------\n\n this.exporters = response.exporters;\n this.exportersByType = Craft.index(this.exporters || [], (e) => e.type);\n\n if (this.exporters && this.exporters.length) {\n this.$exportBtn.removeClass('hidden');\n } else {\n this.$exportBtn.addClass('hidden');\n }\n\n // Create the view\n // -------------------------------------------------------------\n\n // Should we make the view selectable?\n var selectable = this.actions || this.settings.selectable;\n\n this.view = this.createView(this.getSelectedViewMode(), {\n context: this.settings.context,\n batchSize:\n this.settings.context !== 'index' ||\n this.getSortAttributeAndDirection()[0] === 'structure'\n ? this.settings.batchSize\n : null,\n params: params,\n selectable: selectable,\n multiSelect: this.actions || this.settings.multiSelect,\n checkboxMode: !!this.actions,\n onSelectionChange: this._handleSelectionChange.bind(this),\n });\n\n // Refocus the previously-focused element\n // -------------------------------------------------------------\n\n if (\n activeElement &&\n activeElement.id &&\n !document.body.contains(activeElement)\n ) {\n $(`#${activeElement.id}`).focus();\n }\n\n // Auto-select elements\n // -------------------------------------------------------------\n\n if (this._autoSelectElements) {\n if (selectable) {\n for (var i = 0; i < this._autoSelectElements.length; i++) {\n this.view.selectElementById(this._autoSelectElements[i]);\n }\n }\n\n this._autoSelectElements = null;\n }\n\n // Trigger the event\n // -------------------------------------------------------------\n\n this.onUpdateElements();\n },\n\n _updateBadgeCounts: function (badgeCounts) {\n for (let sourceKey in badgeCounts) {\n if (badgeCounts.hasOwnProperty(sourceKey)) {\n const $source = this.getSourceByKey(sourceKey);\n if ($source) {\n let $badge = $source.children('.badge');\n if (badgeCounts[sourceKey] !== null) {\n if (!$badge.length) {\n $badge = $('<span class=\"badge\"/>').appendTo($source);\n }\n $badge.text(badgeCounts[sourceKey]);\n } else if ($badge) {\n $badge.remove();\n }\n }\n }\n }\n },\n\n _countResults: function () {\n return new Promise((resolve, reject) => {\n if (this.totalResults !== null) {\n resolve(this.totalResults);\n } else {\n var params = this.getViewParams();\n delete params.criteria.offset;\n delete params.criteria.limit;\n\n // Make sure we've got an active result set ID\n if (this.resultSet === null) {\n this.resultSet = Math.floor(Math.random() * 100000000);\n }\n params.resultSet = this.resultSet;\n\n Craft.sendActionRequest('POST', this.settings.countElementsAction, {\n data: params,\n cancelToken: this._createCancelToken(),\n })\n .then((response) => {\n if (response.data.resultSet == this.resultSet) {\n this.totalResults = response.data.count;\n resolve(response.data.count);\n } else {\n reject();\n }\n })\n .catch(reject);\n }\n });\n },\n\n _createTriggers: function () {\n var triggers = [],\n safeMenuActions = [],\n destructiveMenuActions = [];\n\n var i;\n\n for (i = 0; i < this.actions.length; i++) {\n var action = this.actions[i];\n\n if (action.trigger) {\n var $form = $(\n '<form id=\"' +\n Craft.formatInputId(action.type) +\n '-actiontrigger\"/>'\n )\n .data('action', action)\n .append(action.trigger);\n\n this.addListener($form, 'submit', '_handleActionTriggerSubmit');\n triggers.push($form);\n } else {\n if (!action.destructive) {\n safeMenuActions.push(action);\n } else {\n destructiveMenuActions.push(action);\n }\n }\n }\n\n var $btn;\n\n if (safeMenuActions.length || destructiveMenuActions.length) {\n var $menuTrigger = $('<form/>');\n\n $btn = $('<button/>', {\n type: 'button',\n class: 'btn menubtn',\n 'data-icon': 'settings',\n title: Craft.t('app', 'Actions'),\n }).appendTo($menuTrigger);\n\n var $menu = $('<ul class=\"menu\"/>').appendTo($menuTrigger),\n $safeList = this._createMenuTriggerList(safeMenuActions, false),\n $destructiveList = this._createMenuTriggerList(\n destructiveMenuActions,\n true\n );\n\n if ($safeList) {\n $safeList.appendTo($menu);\n }\n\n if ($safeList && $destructiveList) {\n $('<hr/>').appendTo($menu);\n }\n\n if ($destructiveList) {\n $destructiveList.appendTo($menu);\n }\n\n triggers.push($menuTrigger);\n }\n\n this._$triggers = $();\n\n for (i = 0; i < triggers.length; i++) {\n var $div = $('<div/>').append(triggers[i]);\n this._$triggers = this._$triggers.add($div);\n }\n\n this._$triggers.appendTo(this.$actionsContainer);\n Craft.appendHeadHtml(this.actionsHeadHtml);\n Craft.appendBodyHtml(this.actionsBodyHtml);\n\n Craft.initUiElements(this._$triggers);\n\n if ($btn) {\n $btn\n .data('menubtn')\n .on('optionSelect', this._handleMenuActionTriggerSubmit.bind(this));\n }\n },\n\n _showExportHud: function () {\n this.$exportBtn.addClass('active');\n this.$exportBtn.attr('aria-expanded', 'true');\n\n var $form = $('<form/>', {\n class: 'export-form',\n });\n\n var typeOptions = [];\n for (var i = 0; i < this.exporters.length; i++) {\n typeOptions.push({\n label: this.exporters[i].name,\n value: this.exporters[i].type,\n });\n }\n var $typeField = Craft.ui\n .createSelectField({\n label: Craft.t('app', 'Export Type'),\n options: typeOptions,\n class: 'fullwidth',\n })\n .appendTo($form);\n\n var $formatField = Craft.ui\n .createSelectField({\n label: Craft.t('app', 'Format'),\n options: [\n {label: 'CSV', value: 'csv'},\n {label: 'JSON', value: 'json'},\n {label: 'XML', value: 'xml'},\n ],\n class: 'fullwidth',\n })\n .appendTo($form);\n\n let $typeSelect = $typeField.find('select');\n this.addListener($typeSelect, 'change', () => {\n let type = $typeSelect.val();\n if (this.exportersByType[type].formattable) {\n $formatField.removeClass('hidden');\n } else {\n $formatField.addClass('hidden');\n }\n });\n $typeSelect.trigger('change');\n\n // Only show the Limit field if there aren't any selected elements\n var selectedElementIds = this.view.getSelectedElementIds();\n\n if (!selectedElementIds.length) {\n var $limitField = Craft.ui\n .createTextField({\n label: Craft.t('app', 'Limit'),\n placeholder: Craft.t('app', 'No limit'),\n type: 'number',\n min: 1,\n })\n .appendTo($form);\n }\n\n const $submitBtn = Craft.ui\n .createSubmitButton({\n class: 'fullwidth',\n label: Craft.t('app', 'Export'),\n spinner: true,\n })\n .appendTo($form);\n\n var hud = new Garnish.HUD(this.$exportBtn, $form);\n\n hud.on('hide', () => {\n this.$exportBtn.removeClass('active');\n this.$exportBtn.attr('aria-expanded', 'false');\n });\n\n var submitting = false;\n\n this.addListener($form, 'submit', function (ev) {\n ev.preventDefault();\n if (submitting) {\n return;\n }\n\n submitting = true;\n $submitBtn.addClass('loading');\n\n var params = this.getViewParams();\n delete params.criteria.offset;\n delete params.criteria.limit;\n delete params.collapsedElementIds;\n\n params.type = $typeField.find('select').val();\n params.format = $formatField.find('select').val();\n\n if (selectedElementIds.length) {\n params.criteria.id = selectedElementIds;\n } else {\n var limit = parseInt($limitField.find('input').val());\n if (limit && !isNaN(limit)) {\n params.criteria.limit = limit;\n }\n }\n\n if (Craft.csrfTokenValue) {\n params[Craft.csrfTokenName] = Craft.csrfTokenValue;\n }\n\n Craft.downloadFromUrl(\n 'POST',\n Craft.getActionUrl('element-indexes/export'),\n params\n )\n .catch(() => {\n if (!this._ignoreFailedRequest) {\n Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n }\n })\n .finally(() => {\n submitting = false;\n $submitBtn.removeClass('loading');\n });\n });\n },\n\n _createMenuTriggerList: function (actions, destructive) {\n if (actions && actions.length) {\n var $ul = $('<ul/>');\n\n for (var i = 0; i < actions.length; i++) {\n $('<li/>')\n .append(\n $('<a/>', {\n id: Craft.formatInputId(actions[i].type) + '-actiontrigger',\n class: destructive ? 'error' : null,\n data: {\n action: actions[i],\n },\n text: actions[i].name,\n })\n )\n .appendTo($ul);\n }\n\n return $ul;\n }\n },\n\n showFilterHud: function () {\n if (!this.filterHuds[this.siteId]) {\n this.filterHuds[this.siteId] = {};\n }\n if (!this.filterHuds[this.siteId][this.sourceKey]) {\n this.filterHuds[this.siteId][this.sourceKey] = new FilterHud(\n this,\n this.sourceKey,\n this.siteId\n );\n this.updateFilterBtn();\n } else {\n this.filterHuds[this.siteId][this.sourceKey].show();\n }\n },\n\n updateFilterBtn: function () {\n this.$filterBtn.removeClass('active');\n\n if (\n this.filterHuds[this.siteId] &&\n this.filterHuds[this.siteId][this.sourceKey]\n ) {\n this.$filterBtn\n .attr(\n 'aria-controls',\n this.filterHuds[this.siteId][this.sourceKey].id\n )\n .attr(\n 'aria-expanded',\n this.filterHuds[this.siteId][this.sourceKey].showing\n ? 'true'\n : 'false'\n );\n\n if (\n this.filterHuds[this.siteId][this.sourceKey].showing ||\n this.filterHuds[this.siteId][this.sourceKey].hasRules()\n ) {\n this.$filterBtn.addClass('active');\n }\n } else {\n this.$filterBtn.attr('aria-controls', null);\n }\n },\n },\n {\n defaults: {\n context: 'index',\n modal: null,\n storageKey: null,\n condition: null,\n criteria: null,\n batchSize: 100,\n disabledElementIds: [],\n selectable: false,\n multiSelect: false,\n buttonContainer: null,\n hideSidebar: false,\n toolbarSelector: '.toolbar:first',\n refreshSourcesAction: 'element-indexes/get-source-tree-html',\n updateElementsAction: 'element-indexes/get-elements',\n countElementsAction: 'element-indexes/count-elements',\n submitActionsAction: 'element-indexes/perform-action',\n defaultSiteId: null,\n defaultSource: null,\n canHaveDrafts: false,\n\n elementTypeName: Craft.t('app', 'Element'),\n elementTypePluralName: Craft.t('app', 'Elements'),\n\n onAfterInit: $.noop,\n onSelectSource: $.noop,\n onSelectSite: $.noop,\n onUpdateElements: $.noop,\n onSelectionChange: $.noop,\n onEnableElements: $.noop,\n onDisableElements: $.noop,\n onAfterAction: $.noop,\n },\n }\n);\n\nconst ViewMenu = Garnish.Base.extend({\n elementIndex: null,\n $source: null,\n sourceKey: null,\n menu: null,\n id: null,\n\n $trigger: null,\n $container: null,\n $sortAttributeSelect: null,\n $sortDirectionPicker: null,\n sortDirectionListbox: null,\n $tableColumnsContainer: null,\n $revertContainer: null,\n $revertBtn: null,\n $closeBtn: null,\n\n init: function (elementIndex, $source) {\n this.elementIndex = elementIndex;\n this.$source = $source;\n this.sourceKey = $source.data('key');\n this.id = `view-menu-${Math.floor(Math.random() * 1000000000)}`;\n\n this.$trigger = $('<button/>', {\n type: 'button',\n class: 'btn menubtn hidden',\n text: Craft.t('app', 'View'),\n 'aria-label': Craft.t('app', 'View settings'),\n 'aria-controls': this.id,\n 'data-icon': 'sliders',\n }).appendTo(this.elementIndex.$toolbar);\n\n this.$container = $('<div/>', {\n id: this.id,\n class: 'menu menu--disclosure element-index-view-menu',\n 'data-align': 'right',\n }).appendTo(Garnish.$bod);\n\n this._buildMenu();\n\n this.addListener(this.$container, 'mousedown', (ev) => {\n ev.stopPropagation();\n });\n\n this.menu = new Garnish.DisclosureMenu(this.$trigger);\n\n this.menu.on('show', () => {\n this.$trigger.addClass('active');\n });\n\n this.menu.on('hide', () => {\n this.$trigger.removeClass('active');\n\n // Move all checked table column checkboxes to the top once it's fully faded out\n setTimeout(() => {\n this.tidyTableColumnField();\n }, Garnish.FX_DURATION);\n });\n },\n\n showTrigger: function () {\n this.$trigger.removeClass('hidden');\n },\n\n hideTrigger: function () {\n this.$trigger.data('trigger').hide();\n this.$trigger.addClass('hidden');\n this.menu.hide();\n },\n\n updateSortField: function () {\n let [attribute, direction] =\n this.elementIndex.getSortAttributeAndDirection();\n\n // Add/remove a score option\n const $scoreOption = this.$sortAttributeSelect.children(\n 'option[value=\"score\"]'\n );\n\n // If searching by score, just keep showing the actual selection\n if (this.elementIndex.searching) {\n if (!$scoreOption.length) {\n this.$sortAttributeSelect.prepend(\n $('<option/>', {\n value: 'score',\n text: Craft.t('app', 'Score'),\n })\n );\n }\n } else if ($scoreOption.length) {\n $scoreOption.remove();\n }\n\n this.$sortAttributeSelect.val(attribute);\n this.sortDirectionListbox.select(direction === 'asc' ? 0 : 1);\n\n if (['structure', 'score'].includes(attribute)) {\n this.sortDirectionListbox.disable();\n this.$sortDirectionPicker.addClass('disabled');\n } else {\n this.sortDirectionListbox.enable();\n this.$sortDirectionPicker.removeClass('disabled');\n }\n\n if (!this.elementIndex.canSortByStructure()) {\n this.$sortAttributeSelect\n .children('option[value=\"structure\"]')\n .attr('disabled', 'disabled');\n } else {\n this.$sortAttributeSelect\n .children('option[value=\"structure\"]')\n .removeAttr('disabled');\n }\n },\n\n updateTableColumnField: function () {\n const attributes = this.elementIndex.getSelectedTableColumns();\n let $lastContainer, lastIndex;\n\n attributes.forEach((attribute) => {\n const $checkbox = this.$tableColumnsContainer.find(\n `input[value=\"${attribute}\"]`\n );\n if (!$checkbox.prop('checked')) {\n $checkbox.prop('checked', true);\n }\n const $container = $checkbox.parent();\n\n // Do we need to move it up?\n if ($lastContainer && $container.index() < lastIndex) {\n $container.insertAfter($lastContainer);\n }\n\n $lastContainer = $container;\n lastIndex = $container.index();\n });\n\n // See if we need to uncheck any checkboxes\n const $checkboxes = this._getTableColumnCheckboxes();\n for (let i = 0; i < $checkboxes.length; i++) {\n const $checkbox = $checkboxes.eq(i);\n if ($checkbox.prop('checked') && !attributes.includes($checkbox.val())) {\n $checkbox.prop('checked', false);\n }\n }\n },\n\n tidyTableColumnField: function () {\n const defaultOrder = this.elementIndex\n .getTableColumnOptions(this.$source)\n .map((column) => column.attr)\n .reduce((obj, attr, index) => {\n return {...obj, [attr]: index};\n }, {});\n\n this.$tableColumnsContainer\n .children()\n .sort((a, b) => {\n const checkboxA = $(a).children('input[type=\"checkbox\"]')[0];\n const checkboxB = $(b).children('input[type=\"checkbox\"]')[0];\n if (checkboxA.checked && checkboxB.checked) {\n return 0;\n }\n if (checkboxA.checked || checkboxB.checked) {\n return checkboxA.checked ? -1 : 1;\n }\n return defaultOrder[checkboxA.value] < defaultOrder[checkboxB.value]\n ? -1\n : 1;\n })\n .appendTo(this.$tableColumnsContainer);\n },\n\n revert: function () {\n this.elementIndex.setSelecetedSourceState({\n order: null,\n sort: null,\n tableColumns: null,\n });\n\n this.updateSortField();\n this.updateTableColumnField();\n this.tidyTableColumnField();\n\n this.$revertBtn.remove();\n this.$revertBtn = null;\n\n this.$closeBtn.focus();\n this.elementIndex.updateElements();\n },\n\n _buildMenu: function () {\n const $metaContainer = $('<div class=\"meta\"/>').appendTo(this.$container);\n this._createSortField().appendTo($metaContainer);\n this._createTableColumnsField().appendTo($metaContainer);\n\n this.$sortAttributeSelect.focus();\n\n const $footerContainer = $('<div/>', {\n class: 'flex menu-footer',\n }).appendTo(this.$container);\n\n this.$revertContainer = $('<div/>', {\n class: 'flex-grow',\n }).appendTo($footerContainer);\n\n // Only create the revert button if there's a custom view state\n if (\n this.elementIndex.getSelectedSourceState('order') ||\n this.elementIndex.getSelectedSourceState('sort') ||\n this.elementIndex.getSelectedSourceState('tableColumns')\n ) {\n this._createRevertBtn();\n }\n\n this.$closeBtn = $('<button/>', {\n type: 'button',\n class: 'btn',\n text: Craft.t('app', 'Close'),\n })\n .appendTo($footerContainer)\n .on('click', () => {\n this.menu.hide();\n });\n },\n\n _createSortField: function () {\n const $container = $('<div class=\"flex\"/>');\n\n const $sortAttributeSelectContainer = Craft.ui\n .createSelect({\n options: this.elementIndex.getSortOptions(this.$source).map((o) => {\n return {\n label: o.label,\n value: o.attr,\n };\n }),\n })\n .addClass('fullwidth')\n .appendTo($('<div class=\"flex-grow\"/>').appendTo($container));\n\n this.$sortAttributeSelect = $sortAttributeSelectContainer\n .children('select')\n .attr({\n 'aria-label': Craft.t('app', 'Sort attribute'),\n });\n\n this.$sortDirectionPicker = $('<section/>', {\n class: 'btngroup btngroup--exclusive',\n 'aria-label': Craft.t('app', 'Sort direction'),\n })\n .append(\n $('<button/>', {\n type: 'button',\n class: 'btn',\n title: Craft.t('app', 'Sort ascending'),\n 'aria-label': Craft.t('app', 'Sort ascending'),\n 'aria-pressed': 'false',\n 'data-icon': 'asc',\n 'data-dir': 'asc',\n })\n )\n .append(\n $('<button/>', {\n type: 'button',\n class: 'btn',\n title: Craft.t('app', 'Sort descending'),\n 'aria-label': Craft.t('app', 'Sort descending'),\n 'aria-pressed': 'false',\n 'data-icon': 'desc',\n 'data-dir': 'desc',\n })\n )\n .appendTo($container);\n\n this.sortDirectionListbox = new Craft.Listbox(this.$sortDirectionPicker, {\n onChange: ($selectedOption) => {\n const direction = $selectedOption.data('dir');\n if (direction !== this.elementIndex.getSelectedSortDirection()) {\n this.elementIndex.setSelectedSortAttribute(\n this.$sortAttributeSelect.val(),\n $selectedOption.data('dir')\n );\n this.elementIndex.updateElements();\n this._createRevertBtn();\n }\n },\n });\n\n this.$sortAttributeSelect.on('change', () => {\n this.elementIndex.setSelectedSortAttribute(\n this.$sortAttributeSelect.val(),\n null,\n false\n );\n this.elementIndex.updateElements();\n this._createRevertBtn();\n });\n\n this.updateSortField();\n\n const $field = Craft.ui.createField($container, {\n label: Craft.t('app', 'Sort by'),\n fieldset: true,\n });\n $field.addClass('sort-field');\n return $field;\n },\n\n _getTableColumnCheckboxes: function () {\n return this.$tableColumnsContainer.find('input[type=\"checkbox\"]');\n },\n\n _createTableColumnsField: function () {\n const columns = this.elementIndex.getTableColumnOptions(this.$source);\n\n if (!columns.length) {\n return $();\n }\n\n this.$tableColumnsContainer = $('<div/>');\n\n columns.forEach((column) => {\n $('<div class=\"element-index-view-menu-table-column\"/>')\n .append('<div class=\"icon move\"/>')\n .append(\n Craft.ui.createCheckbox({\n label: Craft.escapeHtml(column.label),\n value: column.attr,\n })\n )\n .appendTo(this.$tableColumnsContainer);\n });\n\n this.updateTableColumnField();\n this.tidyTableColumnField();\n\n new Garnish.DragSort(this.$tableColumnsContainer.children(), {\n handle: '.move',\n axis: 'y',\n onSortChange: () => {\n this._onTableColumnChange();\n },\n });\n\n this._getTableColumnCheckboxes().on('change', (ev) => {\n this._onTableColumnChange();\n });\n\n const $field = Craft.ui.createField(this.$tableColumnsContainer, {\n label: Craft.t('app', 'Table Columns'),\n fieldset: true,\n });\n $field.addClass('table-columns-field');\n return $field;\n },\n\n _onTableColumnChange: function () {\n const columns = [];\n const $selectedCheckboxes =\n this._getTableColumnCheckboxes().filter(':checked');\n for (let i = 0; i < $selectedCheckboxes.length; i++) {\n columns.push($selectedCheckboxes.eq(i).val());\n }\n\n // Only commit the change if it's different from the current column selections\n // (maybe an unchecked column was dragged, etc.)\n if (\n Craft.compare(\n columns,\n this.elementIndex.getSelectedTableColumns(this.$source)\n )\n ) {\n return;\n }\n\n this.elementIndex.setSelectedTableColumns(columns, false);\n this.elementIndex.updateElements();\n this._createRevertBtn();\n },\n\n _createRevertBtn: function () {\n if (this.$revertBtn) {\n return;\n }\n\n this.$revertBtn = $('<button/>', {\n type: 'button',\n class: 'light',\n text: Craft.t('app', 'Use defaults'),\n })\n .appendTo(this.$revertContainer)\n .on('click', () => {\n this.revert();\n });\n },\n\n destroy: function () {\n this.menu.destroy();\n delete this.menu;\n this.base();\n },\n});\n\nconst FilterHud = Garnish.HUD.extend({\n elementIndex: null,\n sourceKey: null,\n siteId: null,\n id: null,\n loading: true,\n serialized: null,\n $clearBtn: null,\n cleared: false,\n\n init: function (elementIndex, sourceKey, siteId) {\n this.elementIndex = elementIndex;\n this.sourceKey = sourceKey;\n this.siteId = siteId;\n this.id = `filter-${Math.floor(Math.random() * 1000000000)}`;\n\n const $loadingContent = $('<div/>')\n .append(\n $('<div/>', {\n class: 'spinner',\n })\n )\n .append(\n $('<div/>', {\n text: Craft.t('app', 'Loading'),\n class: 'visually-hidden',\n 'aria-role': 'alert',\n })\n );\n\n this.base(this.elementIndex.$filterBtn, $loadingContent, {\n hudClass: 'hud element-filter-hud loading',\n });\n\n this.$hud.attr({\n id: this.id,\n 'aria-live': 'polite',\n 'aria-busy': 'false',\n });\n this.$tip.remove();\n this.$tip = null;\n\n this.$body.on('submit', (ev) => {\n ev.preventDefault();\n this.hide();\n });\n\n Craft.sendActionRequest('POST', 'element-indexes/filter-hud', {\n data: {\n elementType: this.elementIndex.elementType,\n source: this.sourceKey,\n condition: this.elementIndex.settings.condition,\n id: `${this.id}-filters`,\n },\n })\n .then((response) => {\n this.loading = false;\n this.$hud.removeClass('loading');\n $loadingContent.remove();\n\n this.$main.append(response.data.hudHtml);\n Craft.appendHeadHtml(response.data.headHtml);\n Craft.appendBodyHtml(response.data.bodyHtml);\n\n const $btnContainer = $('<div/>', {\n class: 'flex flex-nowrap',\n }).appendTo(this.$main);\n $('<div/>', {\n class: 'flex-grow',\n }).appendTo($btnContainer);\n this.$clearBtn = $('<button/>', {\n type: 'button',\n class: 'btn',\n text: Craft.t('app', 'Cancel'),\n }).appendTo($btnContainer);\n $('<button/>', {\n type: 'submit',\n class: 'btn secondary',\n text: Craft.t('app', 'Apply'),\n }).appendTo($btnContainer);\n this.$clearBtn.on('click', () => {\n this.clear();\n });\n\n this.$hud.find('.condition-container').on('htmx:beforeRequest', () => {\n this.setBusy();\n });\n\n this.$hud.find('.condition-container').on('htmx:load', () => {\n this.setReady();\n });\n this.setFocus();\n })\n .catch(() => {\n Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n });\n\n this.$hud.css('position', 'fixed');\n\n this.addListener(Garnish.$win, 'scroll,resize', () => {\n this.updateSizeAndPosition(true);\n });\n },\n\n addListener: function (elem, events, data, func) {\n if (elem === this.$main && events === 'resize') {\n return;\n }\n this.base(elem, events, data, func);\n },\n\n setBusy: function () {\n this.$hud.attr('aria-busy', 'true');\n\n $('<div/>', {\n class: 'visually-hidden',\n text: Craft.t('app', 'Loading'),\n }).insertAfter(this.$main.find('.htmx-indicator'));\n },\n\n setReady: function () {\n this.$hud.attr('aria-busy', 'false');\n },\n\n setFocus: function () {\n Garnish.setFocusWithin(this.$main);\n },\n\n clear: function () {\n this.cleared = true;\n this.hide();\n },\n\n updateSizeAndPositionInternal: function () {\n // const searchOffset = this.elementIndex.$searchContainer.offset();\n const searchOffset =\n this.elementIndex.$searchContainer[0].getBoundingClientRect();\n\n this.$hud.css({\n width: this.elementIndex.$searchContainer.outerWidth() - 2,\n top: searchOffset.top + this.elementIndex.$searchContainer.outerHeight(),\n left: searchOffset.left + 1,\n });\n },\n\n onShow: function () {\n this.base();\n\n // Cancel => Clear\n if (this.$clearBtn) {\n this.$clearBtn.text(Craft.t('app', 'Clear'));\n }\n\n this.elementIndex.updateFilterBtn();\n this.setFocus();\n },\n\n onHide: function () {\n this.base();\n\n // If something changed, update the elements\n if (this.serialized !== (this.serialized = this.serialize())) {\n this.elementIndex.updateElements();\n }\n\n if (this.cleared) {\n this.destroy();\n } else {\n this.$hud.detach();\n this.$shade.detach();\n }\n\n this.elementIndex.updateFilterBtn();\n this.elementIndex.$filterBtn.focus();\n },\n\n hasRules: function () {\n return this.$main.has('.condition-rule').length !== 0;\n },\n\n serialize: function () {\n return !this.cleared && this.hasRules() ? this.$body.serialize() : null;\n },\n\n destroy: function () {\n this.base();\n delete this.elementIndex.filterHuds[this.siteId][this.sourceKey];\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Base Element Index View\n */\nCraft.BaseElementIndexView = Garnish.Base.extend(\n {\n $container: null,\n $loadingMoreSpinner: null,\n $elementContainer: null,\n $scroller: null,\n\n elementIndex: null,\n thumbLoader: null,\n elementSelect: null,\n\n loadingMore: false,\n\n _totalVisible: null,\n _morePending: null,\n _handleEnableElements: null,\n _handleDisableElements: null,\n\n init: function (elementIndex, container, settings) {\n this.elementIndex = elementIndex;\n this.$container = $(container);\n this.setSettings(settings, Craft.BaseElementIndexView.defaults);\n\n // Create a \"loading-more\" spinner\n this.$loadingMoreSpinner = $(\n '<div class=\"centeralign hidden\">' +\n '<div class=\"spinner loadingmore\"></div>' +\n '</div>'\n ).insertAfter(this.$container);\n\n // Get the actual elements container and its child elements\n this.$elementContainer = this.getElementContainer();\n var $elements = this.$elementContainer.children();\n\n this.setTotalVisible($elements.length);\n this.setMorePending(\n this.settings.batchSize && $elements.length == this.settings.batchSize\n );\n\n // Instantiate the thumb loader\n this.thumbLoader = new Craft.ElementThumbLoader();\n this.thumbLoader.load($elements);\n\n if (this.settings.selectable) {\n this.elementSelect = new Garnish.Select(\n this.$elementContainer,\n $elements.filter(':not(.disabled)'),\n {\n multi: this.settings.multiSelect,\n vertical: this.isVerticalList(),\n handle:\n this.settings.context === 'index'\n ? '.checkbox, .element:first'\n : null,\n filter: ':not(a):not(.toggle)',\n checkboxMode: this.settings.checkboxMode,\n onSelectionChange: this.onSelectionChange.bind(this),\n }\n );\n\n this._handleEnableElements = (ev) => {\n this.elementSelect.addItems(ev.elements);\n };\n\n this._handleDisableElements = (ev) => {\n this.elementSelect.removeItems(ev.elements);\n };\n\n this.elementIndex.on('enableElements', this._handleEnableElements);\n this.elementIndex.on('disableElements', this._handleDisableElements);\n }\n\n // Enable inline element editing if this is an index page\n if (this.settings.context === 'index') {\n this._handleElementEditing = (ev) => {\n var $target = $(ev.target);\n\n if ($target.prop('nodeName') === 'A') {\n // Let the link do its thing\n return;\n }\n\n var $element;\n\n if ($target.hasClass('element')) {\n $element = $target;\n } else {\n $element = $target.closest('.element');\n\n if (!$element.length) {\n return;\n }\n }\n\n if (Garnish.hasAttr($element, 'data-editable')) {\n Craft.createElementEditor($element.data('type'), $element);\n }\n };\n\n if (!this.elementIndex.trashed) {\n this.addListener(\n this.$elementContainer,\n 'dblclick',\n this._handleElementEditing\n );\n if ($.isTouchCapable()) {\n this.addListener(\n this.$elementContainer,\n 'taphold',\n this._handleElementEditing\n );\n }\n }\n }\n\n // Give sub-classes a chance to do post-initialization stuff here\n this.afterInit();\n\n // Set up lazy-loading\n if (this.settings.batchSize) {\n if (this.settings.context === 'index') {\n this.$scroller = Garnish.$scrollContainer;\n } else {\n this.$scroller = this.elementIndex.$main;\n }\n\n this.$scroller.scrollTop(0);\n this.addListener(this.$scroller, 'scroll', 'maybeLoadMore');\n this.maybeLoadMore();\n }\n },\n\n getElementContainer: function () {\n throw 'Classes that extend Craft.BaseElementIndexView must supply a getElementContainer() method.';\n },\n\n afterInit: function () {},\n\n getAllElements: function () {\n return this.$elementContainer.children();\n },\n\n getEnabledElements: function () {\n return this.$elementContainer.children(':not(.disabled)');\n },\n\n getElementById: function (id) {\n var $element = this.$elementContainer.children(\n '[data-id=\"' + id + '\"]:first'\n );\n\n if ($element.length) {\n return $element;\n } else {\n return null;\n }\n },\n\n getSelectedElements: function () {\n if (!this.elementSelect) {\n throw 'This view is not selectable.';\n }\n\n return this.elementSelect.$selectedItems;\n },\n\n getSelectedElementIds: function () {\n let $selectedElements;\n try {\n $selectedElements = this.getSelectedElements();\n } catch (e) {}\n\n let ids = [];\n if ($selectedElements) {\n for (var i = 0; i < $selectedElements.length; i++) {\n ids.push($selectedElements.eq(i).data('id'));\n }\n }\n return ids;\n },\n\n selectElement: function ($element) {\n if (!this.elementSelect) {\n throw 'This view is not selectable.';\n }\n\n this.elementSelect.selectItem($element, true);\n return true;\n },\n\n selectElementById: function (id) {\n if (!this.elementSelect) {\n throw 'This view is not selectable.';\n }\n\n var $element = this.getElementById(id);\n\n if ($element) {\n this.elementSelect.selectItem($element, true);\n return true;\n } else {\n return false;\n }\n },\n\n selectAllElements: function () {\n this.elementSelect.selectAll();\n },\n\n deselectAllElements: function () {\n this.elementSelect.deselectAll();\n },\n\n isVerticalList: function () {\n return false;\n },\n\n getTotalVisible: function () {\n return this._totalVisible;\n },\n\n setTotalVisible: function (totalVisible) {\n this._totalVisible = totalVisible;\n },\n\n getMorePending: function () {\n return this._morePending;\n },\n\n setMorePending: function (morePending) {\n this._morePending = morePending;\n },\n\n /**\n * Checks if the user has reached the bottom of the scroll area, and if so, loads the next batch of elemets.\n */\n maybeLoadMore: function () {\n if (this.canLoadMore()) {\n this.loadMore();\n }\n },\n\n /**\n * Returns whether the user has reached the bottom of the scroll area.\n */\n canLoadMore: function () {\n if (!this.getMorePending() || !this.settings.batchSize) {\n return false;\n }\n\n // Check if the user has reached the bottom of the scroll area\n var containerHeight;\n\n if (this.$scroller[0] === Garnish.$win[0]) {\n var winHeight = Garnish.$win.innerHeight(),\n winScrollTop = Garnish.$win.scrollTop(),\n containerOffset = this.$container.offset().top;\n containerHeight = this.$container.height();\n\n return winHeight + winScrollTop >= containerOffset + containerHeight;\n } else {\n var containerScrollHeight = this.$scroller.prop('scrollHeight'),\n containerScrollTop = this.$scroller.scrollTop();\n containerHeight = this.$scroller.outerHeight();\n\n return (\n containerScrollHeight - containerScrollTop <= containerHeight + 15\n );\n }\n },\n\n /**\n * Loads the next batch of elements.\n */\n loadMore: function () {\n if (\n !this.getMorePending() ||\n this.loadingMore ||\n !this.settings.batchSize\n ) {\n return;\n }\n\n this.loadingMore = true;\n this.$loadingMoreSpinner.removeClass('hidden');\n this.removeListener(this.$scroller, 'scroll');\n\n Craft.sendActionRequest('POST', this.settings.loadMoreElementsAction, {\n data: this.getLoadMoreParams(),\n })\n .then((response) => {\n this.loadingMore = false;\n this.$loadingMoreSpinner.addClass('hidden');\n\n let $newElements = $(response.data.html);\n\n this.appendElements($newElements);\n Craft.appendHeadHtml(response.data.headHtml);\n Craft.appendBodyHtml(response.data.bodyHtml);\n\n if (this.elementSelect) {\n this.elementSelect.addItems($newElements.filter(':not(.disabled)'));\n this.elementIndex.updateActionTriggers();\n }\n\n this.setTotalVisible(this.getTotalVisible() + $newElements.length);\n this.setMorePending($newElements.length == this.settings.batchSize);\n\n // Is there room to load more right now?\n this.addListener(this.$scroller, 'scroll', 'maybeLoadMore');\n this.maybeLoadMore();\n })\n .catch((e) => {\n this.loadingMore = false;\n this.$loadingMoreSpinner.addClass('hidden');\n });\n },\n\n getLoadMoreParams: function () {\n // Use the same params that were passed when initializing this view\n var params = $.extend(true, {}, this.settings.params);\n params.criteria.offset = this.getTotalVisible();\n return params;\n },\n\n appendElements: function ($newElements) {\n $newElements.appendTo(this.$elementContainer);\n this.thumbLoader.load($newElements);\n this.onAppendElements($newElements);\n },\n\n onAppendElements: function ($newElements) {\n this.settings.onAppendElements($newElements);\n this.trigger('appendElements', {\n newElements: $newElements,\n });\n },\n\n onSelectionChange: function () {\n this.settings.onSelectionChange();\n this.trigger('selectionChange');\n },\n\n disable: function () {\n if (this.elementSelect) {\n this.elementSelect.disable();\n }\n },\n\n enable: function () {\n if (this.elementSelect) {\n this.elementSelect.enable();\n }\n },\n\n destroy: function () {\n // Remove the \"loading-more\" spinner, since we added that outside of the view container\n this.$loadingMoreSpinner.remove();\n\n // Kill the thumb loader\n this.thumbLoader.destroy();\n delete this.thumbLoader;\n\n // Delete the element select\n if (this.elementSelect) {\n this.elementIndex.off('enableElements', this._handleEnableElements);\n this.elementIndex.off('disableElements', this._handleDisableElements);\n\n this.elementSelect.destroy();\n delete this.elementSelect;\n }\n\n this.base();\n },\n },\n {\n defaults: {\n context: 'index',\n batchSize: null,\n params: null,\n selectable: false,\n multiSelect: false,\n checkboxMode: false,\n loadMoreElementsAction: 'element-indexes/get-more-elements',\n onAppendElements: $.noop,\n onSelectionChange: $.noop,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Element Select input\n */\nCraft.BaseElementSelectInput = Garnish.Base.extend(\n {\n thumbLoader: null,\n elementSelect: null,\n elementSort: null,\n modal: null,\n elementEditor: null,\n\n fieldLabel: null,\n\n $container: null,\n $form: null,\n $elementsContainer: null,\n $elements: null,\n $addElementBtn: null,\n $spinner: null,\n\n _initialized: false,\n\n init: function (settings) {\n // Normalize the settings and set them\n // ---------------------------------------------------------------------\n\n // Are they still passing in a bunch of arguments?\n if (!$.isPlainObject(settings)) {\n // Loop through all of the old arguments and apply them to the settings\n var normalizedSettings = {},\n args = [\n 'id',\n 'name',\n 'elementType',\n 'sources',\n 'criteria',\n 'sourceElementId',\n 'limit',\n 'modalStorageKey',\n 'fieldId',\n ];\n\n for (var i = 0; i < args.length; i++) {\n if (typeof arguments[i] !== 'undefined') {\n normalizedSettings[args[i]] = arguments[i];\n } else {\n break;\n }\n }\n\n settings = normalizedSettings;\n }\n\n this.setSettings(settings, Craft.BaseElementSelectInput.defaults);\n\n // Apply the storage key prefix\n if (this.settings.modalStorageKey) {\n this.modalStorageKey =\n 'BaseElementSelectInput.' + this.settings.modalStorageKey;\n }\n\n // No reason for this to be sortable if we're only allowing 1 selection\n if (this.settings.limit == 1 || this.settings.maintainHierarchy) {\n this.settings.sortable = false;\n }\n\n this.$container = this.getContainer();\n this.$form = this.$container.closest('form');\n this.fieldLabel = this.getFieldLabel();\n\n // Store a reference to this class\n this.$container.data('elementSelect', this);\n\n this.$elementsContainer = this.getElementsContainer();\n this.$addElementBtn = this.getAddElementsBtn();\n this.$spinner = this.getSpinner();\n\n this.thumbLoader = new Craft.ElementThumbLoader();\n\n this.initElementSelect();\n this.initElementSort();\n this.resetElements();\n\n if (this.$addElementBtn) {\n this.addListener(this.$addElementBtn, 'activate', 'showModal');\n }\n\n Garnish.requestAnimationFrame(() => {\n this._initialized = true;\n });\n },\n\n get totalSelected() {\n return this.$elements.length;\n },\n\n getContainer: function () {\n return $('#' + this.settings.id);\n },\n\n getFieldLabel: function () {\n if (!this.$container) return;\n\n const $fieldset = this.$container.closest('fieldset');\n return $fieldset.find('legend').first().data('label');\n },\n\n getElementsContainer: function () {\n return this.$container.children('.elements');\n },\n\n getElements: function () {\n return this.$elementsContainer.find('.element');\n },\n\n getAddElementsBtn: function () {\n return this.$container.find('.btn.add:first');\n },\n\n getSpinner: function () {\n return this.$container.find('.spinner');\n },\n\n initElementSelect: function () {\n if (this.settings.selectable) {\n this.elementSelect = new Garnish.Select({\n multi: this.settings.sortable,\n filter: ':not(.delete)',\n });\n }\n },\n\n initElementSort: function () {\n if (this.settings.sortable) {\n this.elementSort = new Garnish.DragSort({\n container: this.$elementsContainer,\n filter: this.settings.selectable\n ? () => {\n // Only return all the selected items if the target item is selected\n if (this.elementSort.$targetItem.hasClass('sel')) {\n return this.elementSelect.getSelectedItems();\n } else {\n return this.elementSort.$targetItem;\n }\n }\n : null,\n ignoreHandleSelector: '.delete',\n axis: this.getElementSortAxis(),\n collapseDraggees: true,\n magnetStrength: 4,\n helperLagBase: 1.5,\n onSortChange: this.settings.selectable\n ? () => {\n this.elementSelect.resetItemOrder();\n }\n : null,\n });\n }\n },\n\n getElementSortAxis: function () {\n return this.settings.viewMode === 'list' ? 'y' : null;\n },\n\n canAddMoreElements: function () {\n return (\n !this.settings.limit || this.$elements.length < this.settings.limit\n );\n },\n\n updateAddElementsBtn: function () {\n if (this.canAddMoreElements()) {\n this.enableAddElementsBtn();\n } else {\n this.disableAddElementsBtn();\n }\n },\n\n enableAddElementsBtn: function () {\n if (this.$addElementBtn) {\n this.$addElementBtn.removeClass('hidden');\n }\n\n this.updateButtonContainer();\n },\n\n disableAddElementsBtn: function () {\n if (this.$addElementBtn) {\n this.$addElementBtn.addClass('hidden');\n }\n\n this.updateButtonContainer();\n },\n\n showSpinner: function () {\n if (this.$spinner) {\n this.$spinner.removeClass('hidden');\n }\n\n this.updateButtonContainer();\n },\n\n hideSpinner: function () {\n if (this.$spinner) {\n this.$spinner.addClass('hidden');\n }\n\n this.updateButtonContainer();\n },\n\n updateButtonContainer: function () {\n const $container =\n this.$addElementBtn && this.$addElementBtn.parent('.flex');\n if ($container && $container.length) {\n if ($container.children(':not(.hidden)').length) {\n $container.removeClass('hidden');\n } else {\n $container.addClass('hidden');\n }\n }\n },\n\n focusNextLogicalElement: function () {\n if (this.canAddMoreElements()) {\n // If can add more elements, focus ADD button\n let $btn = this.$addElementBtn;\n\n if ($btn) {\n $btn.get(0).focus();\n }\n } else {\n // If can't add more elements, focus on the final remove\n this.focusLastRemoveBtn();\n }\n },\n\n focusLastRemoveBtn: function () {\n const $removeBtns = this.$container.find('.delete');\n\n if (!$removeBtns.length) return;\n\n $removeBtns.last()[0].focus();\n },\n\n resetElements: function () {\n if (this.$elements !== null) {\n this.removeElements(this.$elements);\n } else {\n this.$elements = $();\n }\n\n this.addElements(this.getElements());\n },\n\n addElements: function ($elements) {\n this.thumbLoader.load($elements);\n\n if (this.settings.selectable) {\n this.elementSelect.addItems($elements);\n }\n\n if (this.settings.sortable) {\n this.elementSort.addItems($elements);\n }\n\n if (this.settings.editable) {\n this._handleShowElementEditor = (ev) => {\n var $element = $(ev.currentTarget);\n if (\n Garnish.hasAttr($element, 'data-editable') &&\n !$element.hasClass('disabled') &&\n !$element.hasClass('loading')\n ) {\n this.elementEditor = this.createElementEditor($element);\n }\n };\n\n this.addListener($elements, 'dblclick', this._handleShowElementEditor);\n\n if ($.isTouchCapable()) {\n this.addListener($elements, 'taphold', this._handleShowElementEditor);\n }\n }\n\n $elements.find('.delete').on('click dblclick', (ev) => {\n this.removeElement($(ev.currentTarget).closest('.element'));\n // Prevent this from acting as one of a double-click\n ev.stopPropagation();\n });\n\n $elements.on('keydown', (ev) => {\n if ([Garnish.BACKSPACE_KEY, Garnish.DELETE_KEY].includes(ev.keyCode)) {\n ev.stopPropagation();\n ev.preventDefault();\n const $elements = this.elementSelect.getSelectedItems();\n for (let i = 0; i < $elements.length; i++) {\n this.removeElement($elements.eq(i));\n }\n }\n });\n\n this.$elements = this.$elements.add($elements);\n\n this.updateAddElementsBtn();\n\n this.onAddElements();\n },\n\n createElementEditor: function ($element, settings) {\n settings = Object.assign(\n {\n elementSelectInput: this,\n prevalidate: this.settings.prevalidate,\n },\n settings\n );\n\n return Craft.createElementEditor(\n this.settings.elementType,\n $element,\n settings\n );\n },\n\n replaceElement: function (elementId, replacementId) {\n return new Promise((resolve, reject) => {\n const $existing = this.$elements.filter(`[data-id=\"${elementId}\"]`);\n\n if (!$existing.length) {\n reject(`No element selected with an ID of ${elementId}.`);\n return;\n }\n\n this.showSpinner();\n\n const data = {\n elementId: replacementId,\n siteId: this.settings.criteria.siteId,\n thumbSize: this.settings.viewMode,\n };\n\n Craft.sendActionRequest('POST', 'elements/get-element-html', {data})\n .then((response) => {\n this.removeElement($existing);\n const elementInfo = Craft.getElementInfo(response.data.html);\n this.selectElements([elementInfo]);\n resolve();\n })\n .catch(({response}) => {\n if (response && response.data && response.data.message) {\n alert(response.data.message);\n } else {\n Craft.cp.displayError();\n }\n\n reject(response.data.message);\n })\n .finally(() => {\n this.hideSpinner();\n });\n });\n },\n\n removeElements: function ($elements) {\n if (this.settings.selectable) {\n this.elementSelect.removeItems($elements);\n }\n\n if (this.modal) {\n var ids = [];\n\n for (var i = 0; i < $elements.length; i++) {\n var id = $elements.eq(i).data('id');\n\n if (id) {\n ids.push(id);\n }\n }\n\n if (ids.length) {\n this.modal.elementIndex.enableElementsById(ids);\n }\n }\n\n // Disable the hidden input in case the form is submitted before this element gets removed from the DOM\n $elements.children('input').prop('disabled', true);\n\n // Move the focus to the next element in the list, if there is one\n let $nextDeleteBtn;\n if (this.settings.selectable) {\n const lastElementIndex = this.$elements.index($elements.last());\n $nextDeleteBtn = this.$elements\n .eq(lastElementIndex + 1)\n .find('.delete');\n }\n if ($nextDeleteBtn.length) {\n $nextDeleteBtn.focus();\n } else {\n this.focusNextLogicalElement();\n }\n\n this.$elements = this.$elements.not($elements);\n this.updateAddElementsBtn();\n\n this.onRemoveElements();\n },\n\n removeElement: function ($element) {\n if (this.settings.maintainHierarchy) {\n // Find any descendants this element might have\n const $allElements = $element.add(\n $element.parent().siblings('ul').find('.element')\n );\n\n // Remove any inputs from the form data\n $('[name]', $allElements).removeAttr('name');\n\n // Remove our record of them all at once\n this.removeElements($allElements);\n\n // Animate them away one at a time\n for (let i = 0; i < $allElements.length; i++) {\n this._animateStructureElementAway($allElements, i);\n }\n } else {\n // Remove any inputs from the form data\n $('[name]', $element).removeAttr('name');\n this.removeElements($element);\n this.animateElementAway($element, () => {\n $element.remove();\n });\n }\n },\n\n animateElementAway: function ($element, callback) {\n $element.css('z-index', 0);\n\n var animateCss = {\n opacity: -1,\n };\n animateCss['margin-' + Craft.left] = -(\n $element.outerWidth() + parseInt($element.css('margin-' + Craft.right))\n );\n\n if (this.settings.viewMode === 'list' || this.$elements.length === 0) {\n animateCss['margin-bottom'] = -(\n $element.outerHeight() + parseInt($element.css('margin-bottom'))\n );\n }\n\n $element.velocity(\n animateCss,\n Craft.BaseElementSelectInput.REMOVE_FX_DURATION,\n () => {\n if (callback) {\n callback();\n }\n }\n );\n },\n\n showModal: function () {\n // Make sure we haven't reached the limit\n if (!this.canAddMoreElements()) {\n return;\n }\n\n if (!this.modal) {\n this.modal = this.createModal();\n } else {\n this.modal.show();\n }\n },\n\n createModal: function () {\n return Craft.createElementSelectorModal(\n this.settings.elementType,\n this.getModalSettings()\n );\n },\n\n getModalSettings: function () {\n return $.extend(\n {\n closeOtherModals: false,\n storageKey: this.modalStorageKey,\n sources: this.settings.sources,\n condition: this.settings.condition,\n criteria: this.settings.criteria,\n multiSelect: this.settings.limit != 1,\n hideOnSelect: !this.settings.maintainHierarchy,\n showSiteMenu: this.settings.showSiteMenu,\n disabledElementIds: this.getDisabledElementIds(),\n onSelect: this.onModalSelect.bind(this),\n onHide: this.onModalHide.bind(this),\n triggerElement: this.$addElementBtn,\n modalTitle: Craft.t('app', 'Select {element}', {\n element: this.fieldLabel,\n }),\n },\n this.settings.modalSettings\n );\n },\n\n getSelectedElementIds: function () {\n var ids = [];\n\n for (var i = 0; i < this.$elements.length; i++) {\n ids.push(this.$elements.eq(i).data('id'));\n }\n\n return ids;\n },\n\n getDisabledElementIds: function () {\n var ids = this.getSelectedElementIds();\n\n if (!this.settings.allowSelfRelations && this.settings.sourceElementId) {\n ids.push(this.settings.sourceElementId);\n }\n\n if (this.settings.disabledElementIds) {\n ids.push(...this.settings.disabledElementIds);\n }\n\n return ids;\n },\n\n onModalSelect: function (elements) {\n if (this.settings.maintainHierarchy) {\n this.selectStructuredElements(elements);\n } else {\n if (this.settings.limit) {\n // Cut off any excess elements\n var slotsLeft = this.settings.limit - this.$elements.length;\n\n if (elements.length > slotsLeft) {\n elements = elements.slice(0, slotsLeft);\n }\n }\n\n this.selectElements(elements);\n this.updateDisabledElementsInModal();\n }\n },\n\n onModalHide: function () {\n // If can add more elements, do default behavior of focus on \"Add\" button\n if (this.canAddMoreElements()) return;\n\n setTimeout(() => {\n this.focusNextLogicalElement();\n }, 200);\n },\n\n selectElements: function (elements) {\n for (let i = 0; i < elements.length; i++) {\n let elementInfo = elements[i],\n $element = this.createNewElement(elementInfo);\n\n this.appendElement($element);\n this.addElements($element);\n this.animateElementIntoPlace(elementInfo.$element, $element);\n\n // Override the element reference with the new one\n elementInfo.$element = $element;\n }\n\n this.onSelectElements(elements);\n },\n\n selectStructuredElements: function (elements) {\n // Disable the modal\n this.modal.disable();\n this.modal.disableCancelBtn();\n this.modal.disableSelectBtn();\n this.modal.showFooterSpinner();\n\n // Get the new element HTML\n var selectedElementIds = this.getSelectedElementIds();\n\n for (var i = 0; i < elements.length; i++) {\n selectedElementIds.push(elements[i].id);\n }\n\n var data = {\n elementIds: selectedElementIds,\n siteId: elements[0].siteId,\n containerId: this.settings.id,\n name: this.settings.name,\n branchLimit: this.settings.branchLimit,\n selectionLabel: this.settings.selectionLabel,\n elementType: this.settings.elementType,\n };\n\n const onResponse = () => {\n this.modal.enable();\n this.modal.enableCancelBtn();\n this.modal.enableSelectBtn();\n this.modal.hideFooterSpinner();\n };\n Craft.sendActionRequest(\n 'POST',\n 'relational-fields/structured-input-html',\n {data}\n )\n .then((response) => {\n onResponse();\n var $newInput = $(response.data.html),\n $newElementsContainer = $newInput.children('.elements');\n\n this.$elementsContainer.replaceWith($newElementsContainer);\n this.$elementsContainer = $newElementsContainer;\n this.resetElements();\n\n var filteredElements = [];\n\n for (var i = 0; i < elements.length; i++) {\n var element = elements[i],\n $element = this.getElementById(element.id);\n\n if ($element) {\n this.animateElementIntoPlace(element.$element, $element);\n filteredElements.push(element);\n }\n }\n\n this.updateDisabledElementsInModal();\n this.modal.hide();\n this.onSelectElements(filteredElements);\n })\n .catch(({response}) => {\n onResponse();\n });\n },\n\n createNewElement: function (elementInfo) {\n var $element = elementInfo.$element.clone();\n var removeText = Craft.t('app', 'Remove {label}', {\n label: Craft.escapeHtml(elementInfo.label),\n });\n // Make a couple tweaks\n Craft.setElementSize(\n $element,\n this.settings.viewMode === 'large' ? 'large' : 'small'\n );\n $element\n .addClass('removable')\n .prepend(\n $('<input/>', {\n type: 'hidden',\n name: this.settings.name + (this.settings.single ? '' : '[]'),\n value: elementInfo.id,\n })\n )\n .prepend(\n $('<button/>', {\n type: 'button',\n class: 'delete icon',\n title: Craft.t('app', 'Remove'),\n 'aria-label': removeText,\n })\n );\n\n return $element;\n },\n\n appendElement: function ($element) {\n $element.appendTo(this.$elementsContainer);\n },\n\n animateElementIntoPlace: function ($modalElement, $inputElement) {\n var origOffset = $modalElement.offset(),\n destOffset = $inputElement.offset(),\n $helper = $inputElement.clone().appendTo(Garnish.$bod);\n\n $inputElement.css('visibility', 'hidden');\n\n $helper.css({\n position: 'absolute',\n zIndex: 10000,\n top: origOffset.top,\n left: origOffset.left,\n });\n\n var animateCss = {\n top: destOffset.top,\n left: destOffset.left,\n };\n\n $helper.velocity(\n animateCss,\n Craft.BaseElementSelectInput.ADD_FX_DURATION,\n function () {\n $helper.remove();\n $inputElement.css('visibility', 'visible');\n }\n );\n },\n\n updateDisabledElementsInModal: function () {\n if (this.modal.elementIndex) {\n this.modal.elementIndex.disableElementsById(\n this.getDisabledElementIds()\n );\n }\n },\n\n getElementById: function (id) {\n for (var i = 0; i < this.$elements.length; i++) {\n var $element = this.$elements.eq(i);\n\n if ($element.data('id') == id) {\n return $element;\n }\n }\n },\n\n onSelectElements: function (elements) {\n this.trigger('selectElements', {elements});\n this.settings.onSelectElements(elements);\n this.$container.trigger('change');\n },\n\n onAddElements: function () {\n this.trigger('addElements');\n this.settings.onAddElements();\n this.$container.trigger('change');\n },\n\n onRemoveElements: function () {\n this.trigger('removeElements');\n this.settings.onRemoveElements();\n this.$container.trigger('change');\n },\n\n _animateStructureElementAway: function ($allElements, i) {\n let callback;\n\n // Is this the last one?\n if (i === $allElements.length - 1) {\n callback = () => {\n const $li = $allElements.first().parent().parent();\n const $ul = $li.parent();\n\n if ($ul[0] === this.$elementsContainer[0] || $li.siblings().length) {\n $li.remove();\n } else {\n $ul.remove();\n }\n };\n }\n\n const func = () => {\n this.animateElementAway($allElements.eq(i), callback);\n };\n\n if (i === 0) {\n func();\n } else {\n setTimeout(func, 100 * i);\n }\n },\n },\n {\n ADD_FX_DURATION: 200,\n REMOVE_FX_DURATION: 200,\n\n defaults: {\n id: null,\n name: null,\n fieldId: null,\n elementType: null,\n sources: null,\n condition: null,\n criteria: {},\n allowSelfRelations: false,\n sourceElementId: null,\n disabledElementIds: null,\n viewMode: 'list',\n single: false,\n maintainHierarchy: false,\n branchLimit: null,\n limit: null,\n showSiteMenu: false,\n modalStorageKey: null,\n modalSettings: {},\n onAddElements: $.noop,\n onSelectElements: $.noop,\n onRemoveElements: $.noop,\n sortable: true,\n selectable: true,\n editable: true,\n prevalidate: false,\n editorSettings: {},\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Element selector modal class\n */\nCraft.BaseElementSelectorModal = Garnish.Modal.extend(\n {\n elementType: null,\n elementIndex: null,\n\n supportSidebarToggleView: false,\n\n $body: null,\n $content: null,\n $footer: null,\n $selectBtn: null,\n $sidebar: null,\n $sources: null,\n $sourceToggles: null,\n $sidebarToggleBtn: null,\n $sidebarCloseBtn: null,\n $mainHeading: null,\n $main: null,\n $search: null,\n $elements: null,\n $tbody: null,\n $primaryButtons: null,\n $secondaryButtons: null,\n $cancelBtn: null,\n\n init: function (elementType, settings) {\n this.elementType = elementType;\n this.setSettings(settings, Craft.BaseElementSelectorModal.defaults);\n var $headingId = 'elementSelectorModalHeading-' + Date.now();\n\n // Build the modal\n var $container = $(\n '<div class=\"modal elementselectormodal\" aria-labelledby=\"' +\n $headingId +\n '\"></div>'\n ).appendTo(Garnish.$bod),\n $heading = $(\n '<h1 id=\"' +\n $headingId +\n '\" class=\"visually-hidden\">' +\n this.settings.modalTitle +\n '</h1>'\n ).appendTo($container),\n $body = $(\n '<div class=\"body\"><div class=\"spinner big\"></div></div>'\n ).appendTo($container);\n\n this.$footer = $('<div class=\"footer\"/>').appendTo($container);\n\n if (this.settings.fullscreen) {\n $container.addClass('fullscreen');\n this.settings.minGutter = 0;\n }\n\n this.base($container, this.settings);\n\n this.$secondaryButtons = $(\n '<div class=\"buttons left secondary-buttons\"/>'\n ).appendTo(this.$footer);\n this.$primaryButtons = $('<div class=\"buttons right\"/>').appendTo(\n this.$footer\n );\n this.$cancelBtn = $('<button/>', {\n type: 'button',\n class: 'btn',\n text: Craft.t('app', 'Cancel'),\n }).appendTo(this.$primaryButtons);\n this.$selectBtn = Craft.ui\n .createSubmitButton({\n class: 'disabled',\n label: Craft.t('app', 'Select'),\n spinner: true,\n })\n .attr('aria-disabled', 'true')\n .appendTo(this.$primaryButtons);\n\n this.$body = $body;\n\n this.addListener(this.$cancelBtn, 'activate', 'cancel');\n this.addListener(this.$selectBtn, 'activate', 'selectElements');\n },\n\n updateModalBottomPadding: function () {\n const footerHeight = this.$footer.outerHeight();\n const bottomPadding = parseInt(this.$container.css('padding-bottom'));\n\n if (footerHeight !== bottomPadding) {\n this.$container.css('padding-bottom', footerHeight);\n }\n },\n\n updateSidebarView: function () {\n if (!this.supportSidebarToggleView) return;\n\n if (this.sidebarShouldBeHidden()) {\n if (!this.$sidebarToggleBtn) this.buildSidebarToggleView();\n } else {\n if (this.$sidebarToggleBtn) this.resetView();\n }\n },\n\n sidebarShouldBeHidden: function () {\n const contentWidth = this.$container.outerWidth();\n return contentWidth < 550;\n },\n\n resetView: function () {\n if (this.$mainHeader) {\n this.$mainHeader.remove();\n }\n\n if (this.$sidebarHeader) {\n this.$sidebarHeader.remove();\n }\n\n this.$sidebarToggleBtn = null;\n this.$body.addClass('has-sidebar');\n this.$content.addClass('has-sidebar');\n this.$sidebar.removeClass('hidden');\n },\n\n buildSidebarToggleView: function () {\n if (this.$sidebarToggleBtn || !this.sidebarShouldBeHidden()) return;\n\n this.$sidebarHeader = $('<div class=\"sidebar-header\"/>').prependTo(\n this.$sidebar\n );\n\n this.$sidebarCloseBtn = Craft.ui\n .createButton({\n class: 'nav-close close-btn',\n })\n .attr('aria-label', Craft.t('app', 'Close'))\n .removeClass('btn')\n .appendTo(this.$sidebarHeader);\n\n this.$mainHeader = $('<div class=\"main-header\"/>').prependTo(this.$main);\n this.$mainHeading = $(\n `<h2 class=\"main-heading\">${this.getActiveSourceName()}</h2>`\n ).appendTo(this.$mainHeader);\n\n const buttonConfig = {\n toggle: true,\n controls: 'modal-sidebar',\n class: 'nav-toggle',\n };\n this.$sidebarToggleBtn = Craft.ui\n .createButton(buttonConfig)\n .removeClass('btn')\n .attr('aria-label', Craft.t('app', 'Show sidebar'))\n .appendTo(this.$mainHeader);\n\n this.$sidebar.attr('id', 'modal-sidebar');\n\n this.closeSidebar();\n\n this.addListener(this.$sidebarToggleBtn, 'click', () => {\n this.toggleSidebar();\n });\n\n this.addListener(this.$sidebarCloseBtn, 'click', () => {\n this.toggleSidebar();\n });\n },\n\n sidebarIsOpen: function () {\n return this.$sidebarToggleBtn.attr('aria-expanded') === 'true';\n },\n\n toggleSidebar: function () {\n if (this.sidebarIsOpen()) {\n this.closeSidebar();\n } else {\n this.openSidebar();\n }\n },\n\n openSidebar: function () {\n this.$body.addClass('has-sidebar');\n this.$content.addClass('has-sidebar');\n this.$sidebar.removeClass('hidden');\n this.$sidebarToggleBtn.attr('aria-expanded', 'true');\n this.$sidebar.find(':focusable').first().focus();\n\n Garnish.uiLayerManager.addLayer(this.$sidebar);\n Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n this.closeSidebar();\n\n // If the focus is currently inside the sidebar, refocus the toggle\n const $focusedEl = Garnish.getFocusedElement();\n if ($.contains(this.$sidebar.get(0), $focusedEl.get(0)))\n this.$sidebarToggleBtn.focus();\n });\n },\n\n closeSidebar: function () {\n if (!this.$sidebarToggleBtn) return;\n\n if (this.sidebarIsOpen()) {\n Garnish.uiLayerManager.removeLayer();\n this.$sidebar.addClass('hidden');\n this.$sidebarToggleBtn.attr('aria-expanded', 'false');\n }\n\n this.$body.removeClass('has-sidebar');\n this.$content.removeClass('has-sidebar');\n },\n\n getActiveSourceName: function () {\n return this.$sidebar.find('.sel').text();\n },\n\n onFadeIn: function () {\n if (!this.elementIndex) {\n this._createElementIndex();\n } else {\n // Auto-focus the Search box\n if (!Garnish.isMobileBrowser(true)) {\n this.elementIndex.$search.trigger('focus');\n }\n }\n\n this.base();\n },\n\n onSelectionChange: function () {\n this.updateSelectBtnState();\n },\n\n onSelectSource: function () {\n this.updateHeading();\n this.updateModalBottomPadding();\n },\n\n updateHeading: function () {\n if (!this.$mainHeading) return;\n\n this.$mainHeading.text(this.getActiveSourceName());\n },\n\n updateSelectBtnState: function () {\n if (this.$selectBtn) {\n if (this.elementIndex.getSelectedElements().length) {\n this.enableSelectBtn();\n } else {\n this.disableSelectBtn();\n }\n }\n },\n\n enableSelectBtn: function () {\n this.$selectBtn.removeClass('disabled').attr('aria-disabled', 'false');\n },\n\n disableSelectBtn: function () {\n this.$selectBtn.addClass('disabled').attr('aria-disabled', 'true');\n },\n\n enableCancelBtn: function () {\n this.$cancelBtn.removeClass('disabled');\n },\n\n disableCancelBtn: function () {\n this.$cancelBtn.addClass('disabled');\n },\n\n showFooterSpinner: function () {\n this.$selectBtn.addClass('loading');\n },\n\n hideFooterSpinner: function () {\n this.$selectBtn.removeClass('loading');\n },\n\n cancel: function () {\n if (!this.$cancelBtn.hasClass('disabled')) {\n this.hide();\n }\n },\n\n selectElements: function () {\n if (this.elementIndex && this.elementIndex.getSelectedElements().length) {\n // TODO: This code shouldn't know about views' elementSelect objects\n this.elementIndex.view.elementSelect.clearMouseUpTimeout();\n\n var $selectedElements = this.elementIndex.getSelectedElements(),\n elementInfo = this.getElementInfo($selectedElements);\n\n this.onSelect(elementInfo);\n\n if (this.settings.disableElementsOnSelect) {\n this.elementIndex.disableElements(\n this.elementIndex.getSelectedElements()\n );\n }\n\n if (this.settings.hideOnSelect) {\n this.hide();\n }\n }\n },\n\n getElementInfo: function ($selectedElements) {\n var info = [];\n\n for (var i = 0; i < $selectedElements.length; i++) {\n var $element = $($selectedElements[i]);\n var elementInfo = Craft.getElementInfo($element);\n\n info.push(elementInfo);\n }\n\n return info;\n },\n\n onShow: function () {\n this.updateSelectBtnState();\n\n // Add listeners again since they get removed during modal close\n this.addListener(Garnish.$win, 'resize', this.updateSidebarView);\n this.addListener(Garnish.$win, 'resize', this.updateModalBottomPadding);\n\n this.updateModalBottomPadding();\n this.updateSidebarView();\n this.base();\n },\n\n onHide: function () {\n this.closeSidebar();\n this.base();\n },\n\n onSelect: function (elementInfo) {\n this.settings.onSelect(elementInfo);\n },\n\n disable: function () {\n if (this.elementIndex) {\n this.elementIndex.disable();\n }\n\n this.base();\n },\n\n enable: function () {\n if (this.elementIndex) {\n this.elementIndex.enable();\n }\n\n this.base();\n },\n\n _createElementIndex: function () {\n // Get the modal body HTML based on the settings\n var data = {\n context: 'modal',\n elementType: this.elementType,\n sources: this.settings.sources,\n };\n\n if (\n this.settings.showSiteMenu !== null &&\n this.settings.showSiteMenu !== 'auto'\n ) {\n data.showSiteMenu = this.settings.showSiteMenu ? '1' : '0';\n }\n\n Craft.sendActionRequest('POST', this.settings.bodyAction, {data}).then(\n (response) => {\n this.$body.html(response.data.html);\n\n if (this.$body.has('.sidebar:not(.hidden)').length) {\n this.$body.addClass('has-sidebar');\n this.supportSidebarToggleView = true;\n }\n\n // Initialize the element index\n this.elementIndex = Craft.createElementIndex(\n this.elementType,\n this.$body,\n Object.assign(\n {\n context: 'modal',\n modal: this,\n storageKey: this.settings.storageKey,\n condition: this.settings.condition,\n criteria: this.settings.criteria,\n disabledElementIds: this.settings.disabledElementIds,\n selectable: true,\n multiSelect: this.settings.multiSelect,\n buttonContainer: this.$secondaryButtons,\n onSelectionChange: this.onSelectionChange.bind(this),\n onSelectSource: this.onSelectSource.bind(this),\n hideSidebar: this.settings.hideSidebar,\n defaultSiteId: this.settings.defaultSiteId,\n defaultSource: this.settings.defaultSource,\n },\n this.settings.indexSettings\n )\n );\n\n this.$main = this.elementIndex.$main;\n this.$sidebar = this.elementIndex.$sidebar;\n this.$content = this.$body.find('.content');\n\n this.updateSidebarView();\n this.updateModalBottomPadding();\n\n // Double-clicking or double-tapping should select the elements\n this.addListener(\n this.elementIndex.$elements,\n 'doubletap',\n function (ev, touchData) {\n // Make sure the touch targets are the same\n // (they may be different if Command/Ctrl/Shift-clicking on multiple elements quickly)\n if (touchData.firstTap.target === touchData.secondTap.target) {\n this.selectElements();\n }\n }\n );\n }\n );\n },\n },\n {\n defaults: {\n fullscreen: false,\n resizable: true,\n storageKey: null,\n sources: null,\n condition: null,\n criteria: null,\n multiSelect: false,\n showSiteMenu: null,\n disabledElementIds: [],\n disableElementsOnSelect: false,\n hideOnSelect: true,\n modalTitle: Craft.t('app', 'Select element'),\n onCancel: $.noop,\n onSelect: $.noop,\n hideSidebar: false,\n defaultSiteId: null,\n defaultSource: null,\n bodyAction: 'element-selector-modals/body',\n indexSettings: {},\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Input Generator\n */\nCraft.BaseInputGenerator = Garnish.Base.extend({\n $source: null,\n $target: null,\n $form: null,\n settings: null,\n\n listening: null,\n timeout: null,\n\n init: function (source, target, settings) {\n this.$source = $(source);\n this.$target = $(target);\n this.$form = this.$source.closest('form');\n\n this.setSettings(settings);\n\n this.startListening();\n },\n\n setNewSource: function (source) {\n var listening = this.listening;\n this.stopListening();\n\n this.$source = $(source);\n\n if (listening) {\n this.startListening();\n }\n },\n\n startListening: function () {\n if (this.listening) {\n return;\n }\n\n this.listening = true;\n\n this.addListener(this.$source, 'input', 'onSourceTextChange');\n this.addListener(this.$target, 'input', 'onTargetTextChange');\n this.addListener(this.$form, 'submit', 'onFormSubmit');\n },\n\n stopListening: function () {\n if (!this.listening) {\n return;\n }\n\n this.listening = false;\n\n if (this.timeout) {\n clearTimeout(this.timeout);\n }\n\n this.removeAllListeners(this.$source);\n this.removeAllListeners(this.$target);\n this.removeAllListeners(this.$form);\n },\n\n onSourceTextChange: function () {\n if (this.timeout) {\n clearTimeout(this.timeout);\n }\n\n this.timeout = setTimeout(this.updateTarget.bind(this), 250);\n },\n\n onTargetTextChange: function () {\n if (this.$target.get(0) === document.activeElement) {\n this.stopListening();\n }\n },\n\n onFormSubmit: function () {\n if (this.timeout) {\n clearTimeout(this.timeout);\n }\n\n this.updateTarget();\n },\n\n updateTarget: function () {\n if (!this.$target.is(':visible')) {\n return;\n }\n\n var sourceVal = this.$source.val();\n\n if (typeof sourceVal === 'undefined') {\n // The source input may not exist anymore\n return;\n }\n\n var targetVal = this.generateTargetValue(sourceVal);\n\n this.$target.val(targetVal);\n\n for (let i = 0; i < this.$target.length; i++) {\n this.$target[i].dispatchEvent(\n new InputEvent('input', {\n inputType: 'insertText',\n })\n );\n this.$target[i].dispatchEvent(new Event('input'));\n }\n\n // If the target already has focus, select its whole value to mimic\n // the behavior if the value had already been generated and they just tabbed in\n if (this.$target.is(':focus')) {\n Craft.selectFullValue(this.$target);\n }\n },\n\n generateTargetValue: function (sourceVal) {\n return sourceVal;\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Category index class\n */\nCraft.CategoryIndex = Craft.BaseElementIndex.extend({\n editableGroups: null,\n $newCategoryBtnGroup: null,\n $newCategoryBtn: null,\n\n init: function (elementType, $container, settings) {\n this.editableGroups = [];\n this.on('selectSource', this.updateButton.bind(this));\n this.on('selectSite', this.updateButton.bind(this));\n this.base(elementType, $container, settings);\n },\n\n afterInit: function () {\n // Find which of the visible groups the user has permission to create new categories in\n this.editableGroups = Craft.editableCategoryGroups.filter(\n (g) => !!this.getSourceByKey(`group:${g.uid}`)\n );\n\n this.base();\n },\n\n getDefaultSourceKey: function () {\n // Did they request a specific category group in the URL?\n if (\n this.settings.context === 'index' &&\n typeof defaultGroupHandle !== 'undefined'\n ) {\n for (let i = 0; i < this.$sources.length; i++) {\n const $source = $(this.$sources[i]);\n if ($source.data('handle') === defaultGroupHandle) {\n return $source.data('key');\n }\n }\n }\n\n return this.base();\n },\n\n updateButton: function () {\n if (!this.$source) {\n return;\n }\n\n // Get the handle of the selected source\n const selectedSourceHandle = this.$source.data('handle');\n\n // Update the New Category button\n // ---------------------------------------------------------------------\n\n if (this.editableGroups.length) {\n // Remove the old button, if there is one\n if (this.$newCategoryBtnGroup) {\n this.$newCategoryBtnGroup.remove();\n }\n\n // Determine if they are viewing a group that they have permission to create categories in\n const selectedGroup = this.editableGroups.find(\n (g) => g.handle === selectedSourceHandle\n );\n\n this.$newCategoryBtnGroup = $(\n '<div class=\"btngroup submit\" data-wrapper/>'\n );\n let $menuBtn;\n const menuId = 'new-category-menu-' + Craft.randomString(10);\n\n // If they are, show a primary \"New category\" button, and a dropdown of the other groups (if any).\n // Otherwise only show a menu button\n if (selectedGroup) {\n const visibleLabel =\n this.settings.context === 'index'\n ? Craft.t('app', 'New category')\n : Craft.t('app', 'New {group} category', {\n group: selectedGroup.name,\n });\n const ariaLabel =\n this.settings.context === 'index'\n ? Craft.t('app', 'New category in the {group} category group', {\n group: selectedGroup.name,\n })\n : visibleLabel;\n\n const role = this.settings.context === 'index' ? 'link' : null;\n\n this.$newCategoryBtn = Craft.ui\n .createButton({\n label: visibleLabel,\n ariaLabel: ariaLabel,\n spinner: true,\n role: role,\n })\n .addClass('submit add icon')\n .appendTo(this.$newCategoryBtnGroup);\n\n this.addListener(this.$newCategoryBtn, 'click mousedown', (ev) => {\n // If this is the element index, check for Ctrl+clicks and middle button clicks\n if (\n this.settings.context === 'index' &&\n ((ev.type === 'click' && Garnish.isCtrlKeyPressed(ev)) ||\n (ev.type === 'mousedown' && ev.originalEvent.button === 1))\n ) {\n window.open(Craft.getUrl(`categories/${selectedGroup.handle}/new`));\n } else if (ev.type === 'click') {\n this._createCategory(selectedGroup.id);\n }\n });\n\n if (this.editableGroups.length > 1) {\n $menuBtn = $('<button/>', {\n type: 'button',\n class: 'btn submit menubtn btngroup-btn-last',\n 'aria-controls': menuId,\n 'data-disclosure-trigger': '',\n 'aria-label': Craft.t(\n 'app',\n 'New category, choose a category group'\n ),\n }).appendTo(this.$newCategoryBtnGroup);\n }\n } else {\n this.$newCategoryBtn = $menuBtn = Craft.ui\n .createButton({\n label: Craft.t('app', 'New category'),\n ariaLabel: Craft.t('app', 'New category, choose a category group'),\n spinner: true,\n })\n .addClass('submit add icon menubtn btngroup-btn-last')\n .attr('aria-controls', menuId)\n .attr('data-disclosure-trigger', '')\n .appendTo(this.$newCategoryBtnGroup);\n }\n\n this.addButton(this.$newCategoryBtnGroup);\n\n if ($menuBtn) {\n const $menuContainer = $('<div/>', {\n id: menuId,\n class: 'menu menu--disclosure',\n }).appendTo(this.$newCategoryBtnGroup);\n const $ul = $('<ul/>').appendTo($menuContainer);\n\n for (const group of this.editableGroups) {\n const anchorRole =\n this.settings.context === 'index' ? 'link' : 'button';\n if (this.settings.context === 'index' || group !== selectedGroup) {\n const $li = $('<li/>').appendTo($ul);\n const $a = $('<a/>', {\n role: anchorRole === 'button' ? 'button' : null,\n href: '#', // Allows for click listener and tab order\n type: anchorRole === 'button' ? 'button' : null,\n text: Craft.t('app', 'New {group} category', {\n group: group.name,\n }),\n }).appendTo($li);\n this.addListener($a, 'click', () => {\n $menuBtn.data('trigger').hide();\n this._createCategory(group.id);\n });\n\n if (anchorRole === 'button') {\n this.addListener($a, 'keydown', (event) => {\n if (event.keyCode === Garnish.SPACE_KEY) {\n event.preventDefault();\n $menuBtn.data('trigger').hide();\n this._createCategory(group.id);\n }\n });\n }\n }\n }\n\n new Garnish.DisclosureMenu($menuBtn);\n }\n }\n\n // Update the URL if we're on the Categories index\n // ---------------------------------------------------------------------\n\n if (this.settings.context === 'index') {\n let uri = 'categories';\n\n if (selectedSourceHandle) {\n uri += '/' + selectedSourceHandle;\n }\n\n Craft.setPath(uri);\n }\n },\n\n _createCategory: function (groupId) {\n if (this.$newCategoryBtn.hasClass('loading')) {\n console.warn('New category creation already in progress.');\n return;\n }\n\n // Find the group\n const group = this.editableGroups.find((s) => s.id === groupId);\n\n if (!group) {\n throw `Invalid category group ID: ${groupId}`;\n }\n\n this.$newCategoryBtn.addClass('loading');\n\n Craft.sendActionRequest('POST', 'elements/create', {\n data: {\n elementType: this.elementType,\n siteId: this.siteId,\n groupId: groupId,\n },\n })\n .then((ev) => {\n if (this.settings.context === 'index') {\n document.location.href = Craft.getUrl(ev.data.cpEditUrl, {fresh: 1});\n } else {\n const slideout = Craft.createElementEditor(this.elementType, {\n siteId: this.siteId,\n elementId: ev.data.element.id,\n draftId: ev.data.element.draftId,\n params: {\n fresh: 1,\n },\n });\n slideout.on('submit', () => {\n // Make sure the right group is selected\n const groupSourceKey = `group:${group.uid}`;\n\n if (this.sourceKey !== groupSourceKey) {\n this.selectSourceByKey(groupSourceKey);\n }\n\n this.clearSearch();\n this.selectElementAfterUpdate(ev.data.element.id);\n this.updateElements();\n });\n }\n })\n .finally(() => {\n this.$newCategoryBtn.removeClass('loading');\n });\n },\n});\n\n// Register it!\nCraft.registerElementIndexClass(\n 'craft\\\\elements\\\\Category',\n Craft.CategoryIndex\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Category Select input\n * @deprecated in 4.3.0. Use Craft.BaseElementSelectInput instead.\n */\nCraft.CategorySelectInput = Craft.BaseElementSelectInput.extend({\n setSettings: function () {\n this.base.apply(this, arguments);\n this.settings.sortable = false;\n },\n\n getModalSettings: function () {\n var settings = this.base();\n settings.hideOnSelect = false;\n return settings;\n },\n\n getElements: function () {\n return this.$elementsContainer.find('.element');\n },\n\n onModalSelect: function (elements) {\n // Disable the modal\n this.modal.disable();\n this.modal.disableCancelBtn();\n this.modal.disableSelectBtn();\n this.modal.showFooterSpinner();\n\n // Get the new category HTML\n var selectedCategoryIds = this.getSelectedElementIds();\n\n for (var i = 0; i < elements.length; i++) {\n selectedCategoryIds.push(elements[i].id);\n }\n\n var data = {\n categoryIds: selectedCategoryIds,\n siteId: elements[0].siteId,\n id: this.settings.id,\n name: this.settings.name,\n branchLimit: this.settings.branchLimit,\n selectionLabel: this.settings.selectionLabel,\n };\n\n const onResponse = () => {\n this.modal.enable();\n this.modal.enableCancelBtn();\n this.modal.enableSelectBtn();\n this.modal.hideFooterSpinner();\n };\n Craft.sendActionRequest('POST', 'categories/input-html', {data})\n .then((response) => {\n onResponse();\n var $newInput = $(response.data.html),\n $newElementsContainer = $newInput.children('.elements');\n\n this.$elementsContainer.replaceWith($newElementsContainer);\n this.$elementsContainer = $newElementsContainer;\n this.resetElements();\n\n var filteredElements = [];\n\n for (var i = 0; i < elements.length; i++) {\n var element = elements[i],\n $element = this.getElementById(element.id);\n\n if ($element) {\n this.animateElementIntoPlace(element.$element, $element);\n filteredElements.push(element);\n }\n }\n\n this.updateDisabledElementsInModal();\n this.modal.hide();\n this.onSelectElements(filteredElements);\n })\n .catch(({response}) => {\n onResponse();\n });\n },\n\n removeElement: function ($element) {\n // Find any descendants this category might have\n const $allCategories = $element.add(\n $element.parent().siblings('ul').find('.element')\n );\n\n // Remove our record of them all at once\n this.removeElements($allCategories);\n\n // Animate them away one at a time\n for (let i = 0; i < $allCategories.length; i++) {\n this._animateCategoryAway($allCategories, i);\n }\n },\n\n _animateCategoryAway: function ($allCategories, i) {\n let callback;\n\n // Is this the last one?\n if (i === $allCategories.length - 1) {\n callback = () => {\n const $li = $allCategories.first().parent().parent();\n const $ul = $li.parent();\n\n if ($ul[0] === this.$elementsContainer[0] || $li.siblings().length) {\n $li.remove();\n } else {\n $ul.remove();\n }\n };\n }\n\n const func = () => {\n this.animateElementAway($allCategories.eq(i), callback);\n };\n\n if (i === 0) {\n func();\n } else {\n setTimeout(func, 100 * i);\n }\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Craft Charts\n */\n\nCraft.charts = {};\n\n// ---------------------------------------------------------------------\n\n/**\n * Class Craft.charts.DataTable\n */\nCraft.charts.DataTable = Garnish.Base.extend({\n columns: null,\n rows: null,\n\n init: function (data) {\n let columns = data.columns;\n let rows = data.rows;\n\n rows.forEach((d) => {\n $.each(d, function (cellIndex) {\n var column = columns[cellIndex];\n\n var parseTime;\n\n switch (column.type) {\n case 'date':\n parseTime = d3.timeParse('%Y-%m-%d');\n d[cellIndex] = parseTime(d[cellIndex]);\n break;\n\n case 'datetime':\n parseTime = d3.timeParse('%Y-%m-%d %H:00:00');\n d[cellIndex] = parseTime(d[cellIndex]);\n break;\n\n case 'percent':\n d[cellIndex] = d[cellIndex] / 100;\n break;\n\n case 'number':\n d[cellIndex] = +d[cellIndex];\n break;\n\n default:\n // do nothing\n }\n });\n });\n\n this.columns = columns;\n this.rows = rows;\n },\n});\n\n// ---------------------------------------------------------------------\n\n/**\n * Class Craft.charts.Tip\n */\n\nCraft.charts.Tip = Garnish.Base.extend({\n $container: null,\n $tip: null,\n\n init: function ($container) {\n this.$container = $container;\n\n this.$tip = $('<div class=\"tooltip\"></div>').appendTo(this.$container);\n\n this.hide();\n },\n\n setContent: function (html) {\n this.$tip.html(html);\n },\n\n setPosition: function (position) {\n this.$tip.css('left', `${position.left}px`);\n this.$tip.css('top', `${position.top}px`);\n },\n\n show: function () {\n this.$tip.css('display', 'block');\n },\n\n hide: function () {\n this.$tip.css('display', 'none');\n },\n});\n\n// ---------------------------------------------------------------------\n\n/**\n * Class Craft.charts.BaseChart\n */\nCraft.charts.BaseChart = Garnish.Base.extend(\n {\n $container: null,\n $chart: null,\n\n chartBaseClass: 'cp-chart',\n dataTable: null,\n\n formatLocale: null,\n timeFormatLocale: null,\n orientation: null,\n\n svg: null,\n width: null,\n height: null,\n\n init: function (container, settings) {\n this.$container = container;\n\n this.setSettings(Craft.charts.BaseChart.defaults);\n this.setSettings(settings);\n\n var globalSettings = {\n formats: window.d3Formats,\n formatLocaleDefinition: window.d3FormatLocaleDefinition,\n timeFormatLocaleDefinition: window.d3TimeFormatLocaleDefinition,\n };\n\n this.setSettings(globalSettings);\n\n d3.select(window).on('resize', () => {\n this.resize();\n });\n },\n\n setSettings: function (settings, defaults) {\n var baseSettings =\n typeof this.settings === 'undefined' ? {} : this.settings;\n this.settings = $.extend(true, {}, baseSettings, defaults, settings);\n },\n\n draw: function (dataTable, settings) {\n // Settings and chart attributes\n\n this.setSettings(settings);\n\n this.dataTable = dataTable;\n this.formatLocale = d3.formatLocale(this.settings.formatLocaleDefinition);\n this.timeFormatLocale = d3.timeFormatLocale(\n this.settings.timeFormatLocaleDefinition\n );\n this.orientation = this.settings.orientation;\n\n // Set (or reset) the chart element\n\n if (this.$chart) {\n this.$chart.remove();\n }\n\n var className = this.chartBaseClass;\n\n if (this.settings.chartClass) {\n className += ' ' + this.settings.chartClass;\n }\n\n this.$chart = $(`<div class=\"${className}\" />`).appendTo(this.$container);\n },\n\n resize: function () {\n this.draw(this.dataTable, this.settings);\n },\n\n onAfterDrawTicks: function () {\n // White border for ticks' text\n $('.tick', this.$chart).each(function (tickKey, tick) {\n var $tickText = $('text', tick);\n\n var $clone = $tickText.clone();\n $clone.appendTo(tick);\n\n $tickText.attr('stroke', '#ffffff');\n $tickText.attr('stroke-width', 3);\n });\n },\n },\n {\n defaults: {\n formatLocaleDefinition: null,\n timeFormatLocaleDefinition: null,\n formats: {\n numberFormat: ',.2f',\n percentFormat: ',.2%',\n currencyFormat: '$,.2f',\n shortDateFormats: {\n day: '%-m/%-d',\n month: '%-m/%y',\n year: '%Y',\n },\n },\n margin: {top: 0, right: 0, bottom: 0, left: 0},\n chartClass: null,\n colors: ['#0594D1', '#DE3800', '#FF9A00', '#009802', '#9B009B'],\n },\n }\n);\n\n// ---------------------------------------------------------------------\n\n/**\n * Class Craft.charts.Area\n */\nCraft.charts.Area = Craft.charts.BaseChart.extend(\n {\n tip: null,\n drawingArea: null,\n\n init: function (container, settings) {\n this.base(container, Craft.charts.Area.defaults);\n\n this.setSettings(settings);\n },\n\n draw: function (dataTable, settings) {\n this.base(dataTable, settings);\n\n if (this.tip) {\n this.tip = null;\n }\n\n var margin = this.getChartMargin();\n\n this.width = this.$chart.width() - margin.left - margin.right;\n this.height = this.$chart.height() - margin.top - margin.bottom;\n\n // Append SVG to chart element\n\n var svg = {\n width: this.width + (margin.left + margin.right),\n height: this.height + (margin.top + margin.bottom),\n translateX: this.orientation !== 'rtl' ? margin.left : margin.right,\n translateY: margin.top,\n };\n\n this.svg = d3\n .select(this.$chart.get(0))\n .append('svg')\n .attr('width', svg.width)\n .attr('height', svg.height);\n\n this.drawingArea = this.svg\n .append('g')\n .attr('transform', `translate(${svg.translateX},${svg.translateY})`);\n\n // Draw elements\n\n this.drawTicks();\n this.drawAxes();\n this.drawChart();\n this.drawTipTriggers();\n },\n\n drawTicks: function () {\n // Draw X ticks\n\n var x = this.getX(true);\n var xTicks = 3;\n var xAxis = d3\n .axisBottom(x)\n .tickFormat(this.getXFormatter())\n .ticks(xTicks);\n\n this.drawingArea\n .append('g')\n .attr('class', 'x ticks-axis')\n .attr('transform', `translate(0, ${this.height})`)\n .call(xAxis);\n\n // Draw Y ticks\n\n var y = this.getY();\n var yTicks = 2;\n var yAxis;\n\n if (this.orientation !== 'rtl') {\n yAxis = d3\n .axisLeft(y)\n .tickFormat(this.getYFormatter())\n .tickValues(this.getYTickValues())\n .ticks(yTicks);\n\n this.drawingArea.append('g').attr('class', 'y ticks-axis').call(yAxis);\n } else {\n yAxis = d3\n .axisRight(y)\n .tickFormat(this.getYFormatter())\n .tickValues(this.getYTickValues())\n .ticks(yTicks);\n\n this.drawingArea\n .append('g')\n .attr('class', 'y ticks-axis')\n .attr('transform', `translate(${this.width},0)`)\n .call(yAxis);\n }\n\n // On after draw ticks\n\n this.onAfterDrawTicks();\n },\n\n drawAxes: function () {\n if (this.settings.xAxis.showAxis) {\n var x = this.getX();\n var xAxis = d3.axisBottom(x).ticks(0).tickSizeOuter(0);\n this.drawingArea\n .append('g')\n .attr('class', 'x axis')\n .attr('transform', `translate(0, ${this.height})`)\n .call(xAxis);\n }\n\n if (this.settings.yAxis.showAxis) {\n var y = this.getY();\n var chartPadding = 0;\n var yAxis;\n\n if (this.orientation === 'rtl') {\n yAxis = d3.axisLeft(y).ticks(0);\n this.drawingArea\n .append('g')\n .attr('class', 'y axis')\n .attr('transform', `translate(${this.width - chartPadding}, 0)`)\n .call(yAxis);\n } else {\n yAxis = d3.axisRight(y).ticks(0);\n this.drawingArea\n .append('g')\n .attr('class', 'y axis')\n .attr('transform', `translate(${chartPadding}, 0)`)\n .call(yAxis);\n }\n }\n },\n\n drawChart: function () {\n var x = this.getX(true);\n var y = this.getY();\n\n // X & Y grid lines\n\n if (this.settings.xAxis.gridlines) {\n var xLineAxis = d3.axisBottom(x);\n\n this.drawingArea\n .append('g')\n .attr('class', 'x grid-line')\n .attr('transform', `translate(0,${this.height})`)\n .call(xLineAxis.tickSize(-this.height, 0, 0).tickFormat(''));\n }\n\n var yTicks = 2;\n\n if (this.settings.yAxis.gridlines) {\n var yLineAxis = d3.axisLeft(y);\n\n this.drawingArea\n .append('g')\n .attr('class', 'y grid-line')\n .attr('transform', 'translate(0 , 0)')\n .call(\n yLineAxis\n .tickSize(-this.width, 0)\n .tickFormat('')\n .tickValues(this.getYTickValues())\n .ticks(yTicks)\n );\n }\n\n // Line\n\n var line = d3\n .line()\n .x(function (d) {\n return x(d[0]);\n })\n .y(function (d) {\n return y(d[1]);\n });\n\n this.drawingArea\n .append('g')\n .attr('class', 'chart-line')\n .append('path')\n .datum(this.dataTable.rows)\n .style('fill', 'none')\n .style('stroke', this.settings.colors[0])\n .style('stroke-width', '3px')\n .attr('d', line);\n\n // Area\n\n var area = d3\n .area()\n .x(function (d) {\n return x(d[0]);\n })\n .y0(this.height)\n .y1(function (d) {\n return y(d[1]);\n });\n\n this.drawingArea\n .append('g')\n .attr('class', 'chart-area')\n .append('path')\n .datum(this.dataTable.rows)\n .style('fill', this.settings.colors[0])\n .style('fill-opacity', '0.3')\n .attr('d', area);\n\n // Plots\n\n if (this.settings.plots) {\n this.drawingArea\n .append('g')\n .attr('class', 'plots')\n .selectAll('circle')\n .data(this.dataTable.rows)\n .enter()\n .append('circle')\n .style('fill', this.settings.colors[0])\n .attr('class', (d, index) => `plot plot-${index}`)\n .attr('r', 4)\n .attr('cx', (d) => x(d[0]))\n .attr('cy', (d) => y(d[1]));\n }\n },\n\n drawTipTriggers: function () {\n if (this.settings.tips) {\n if (!this.tip) {\n this.tip = new Craft.charts.Tip(this.$chart);\n }\n\n // Define xAxisTickInterval\n\n var chartMargin = this.getChartMargin();\n var tickSizeOuter = 6;\n var length =\n this.drawingArea.select('.x path.domain').node().getTotalLength() -\n chartMargin.left -\n chartMargin.right -\n tickSizeOuter * 2;\n var xAxisTickInterval = length / (this.dataTable.rows.length - 1);\n\n // Tip trigger width\n\n var tipTriggerWidth = Math.max(0, xAxisTickInterval);\n\n // Draw triggers\n\n var x = this.getX(true);\n var y = this.getY();\n\n this.drawingArea\n .append('g')\n .attr('class', 'tip-triggers')\n .selectAll('rect')\n .data(this.dataTable.rows)\n .enter()\n .append('rect')\n .attr('class', 'tip-trigger')\n .style('fill', 'transparent')\n .style('fill-opacity', '1')\n .attr('width', tipTriggerWidth)\n .attr('height', this.height)\n .attr('x', (d) => x(d[0]) - tipTriggerWidth / 2)\n .on('mouseover', (d, index) => {\n // Expand plot\n\n this.drawingArea.select('.plot-' + index).attr('r', 5);\n\n // Set tip content\n\n var $content = $('<div />');\n var $xValue = $('<div class=\"x-value\" />').appendTo($content);\n var $yValue = $('<div class=\"y-value\" />').appendTo($content);\n\n $xValue.html(this.getXFormatter()(d[0]));\n $yValue.html(this.getYFormatter()(d[1]));\n\n var content = $content.get(0);\n\n this.tip.setContent(content);\n\n // Set tip position\n\n var margin = this.getChartMargin();\n\n var offset = 24;\n var top = y(d[1]) + offset;\n var left;\n\n if (this.orientation !== 'rtl') {\n left = x(d[0]) + margin.left + offset;\n\n var calcLeft =\n this.$chart.offset().left + left + this.tip.$tip.width();\n var maxLeft =\n this.$chart.offset().left + this.$chart.width() - offset;\n\n if (calcLeft > maxLeft) {\n left = x(d[0]) - (this.tip.$tip.width() + offset);\n }\n } else {\n left = x(d[0]) - (this.tip.$tip.width() + margin.left + offset);\n }\n\n if (left < 0) {\n left = x(d[0]) + margin.left + offset;\n }\n\n var position = {\n top: top,\n left: left,\n };\n\n this.tip.setPosition(position);\n\n // Show tip\n\n this.tip.show();\n })\n .on('mouseout', (d, index) => {\n // Unexpand Plot\n this.drawingArea.select('.plot-' + index).attr('r', 4);\n\n // Hide tip\n this.tip.hide();\n });\n }\n },\n\n getChartMargin: function () {\n var margin = this.settings.margin;\n\n // Estimate the max width of y ticks and set it as the left margin\n\n var values = this.getYTickValues();\n var yTicksMaxWidth = 0;\n\n $.each(values, (key, value) => {\n var characterWidth = 8;\n\n var formatter = this.getYFormatter();\n\n var formattedValue = formatter(value);\n var computedTickWidth = formattedValue.length * characterWidth;\n\n if (computedTickWidth > yTicksMaxWidth) {\n yTicksMaxWidth = computedTickWidth;\n }\n });\n\n yTicksMaxWidth += 10;\n\n margin.left = yTicksMaxWidth;\n\n return margin;\n },\n\n getX: function (padded) {\n var xDomainMin = d3.min(this.dataTable.rows, function (d) {\n return d[0];\n });\n\n var xDomainMax = d3.max(this.dataTable.rows, function (d) {\n return d[0];\n });\n\n var xDomain = [xDomainMin, xDomainMax];\n\n if (this.orientation === 'rtl') {\n xDomain = [xDomainMax, xDomainMin];\n }\n\n var left = 0;\n var right = 0;\n\n if (padded) {\n left = 0;\n right = 0;\n }\n\n var x = d3.scaleTime().range([left, this.width - right]);\n\n x.domain(xDomain);\n\n return x;\n },\n\n getY: function () {\n var yDomain = [0, this.getYMaxValue()];\n\n var y = d3.scaleLinear().range([this.height, 0]);\n\n y.domain(yDomain);\n\n return y;\n },\n\n getXFormatter: function () {\n var formatter;\n\n if (this.settings.xAxis.formatter !== $.noop) {\n formatter = this.settings.xAxis.formatter(this);\n } else {\n formatter = Craft.charts.utils.getTimeFormatter(\n this.timeFormatLocale,\n this.settings\n );\n }\n\n return formatter;\n },\n\n getYFormatter: function () {\n var formatter;\n\n if (this.settings.yAxis.formatter !== $.noop) {\n formatter = this.settings.yAxis.formatter(this);\n } else {\n formatter = Craft.charts.utils.getNumberFormatter(\n this.formatLocale,\n this.dataTable.columns[1].type,\n this.settings\n );\n }\n\n return formatter;\n },\n\n getYMaxValue: function () {\n return d3.max(this.dataTable.rows, function (d) {\n return d[1];\n });\n },\n\n getYTickValues: function () {\n var maxValue = this.getYMaxValue();\n\n if (maxValue > 1) {\n return [maxValue / 2, maxValue];\n } else {\n return [0, maxValue];\n }\n },\n },\n {\n defaults: {\n chartClass: 'area',\n margin: {top: 25, right: 5, bottom: 25, left: 0},\n plots: true,\n tips: true,\n xAxis: {\n gridlines: false,\n showAxis: true,\n formatter: $.noop,\n },\n yAxis: {\n gridlines: true,\n showAxis: false,\n formatter: $.noop,\n },\n },\n }\n);\n\n// ---------------------------------------------------------------------\n\n/**\n * Class Craft.charts.Utils\n */\nCraft.charts.utils = {\n getDuration: function (seconds) {\n var secondsNum = parseInt(seconds, 10);\n\n var duration = {\n hours: Math.floor(secondsNum / 3600),\n minutes: Math.floor((secondsNum - duration.hours * 3600) / 60),\n seconds: secondsNum - duration.hours * 3600 - duration.minutes * 60,\n };\n\n if (duration.hours < 10) {\n duration.hours = `0${duration.hours}`;\n }\n\n if (duration.minutes < 10) {\n duration.minutes = `0${duration.minutes}`;\n }\n\n if (duration.seconds < 10) {\n duration.seconds = `0${duration.seconds}`;\n }\n\n return `${duration.hours}:${duration.minutes}:${duration.seconds}`;\n },\n\n getTimeFormatter: function (timeFormatLocale, chartSettings) {\n switch (chartSettings.dataScale) {\n case 'year':\n return timeFormatLocale.format('%Y');\n\n case 'month':\n return timeFormatLocale.format(\n chartSettings.formats.shortDateFormats.month\n );\n\n case 'hour':\n return timeFormatLocale.format(\n `${chartSettings.formats.shortDateFormats.day} %H:00:00`\n );\n\n default:\n return timeFormatLocale.format(\n chartSettings.formats.shortDateFormats.day\n );\n }\n },\n\n getNumberFormatter: function (formatLocale, type, chartSettings) {\n switch (type) {\n case 'currency':\n return formatLocale.format(chartSettings.formats.currencyFormat);\n\n case 'percent':\n return formatLocale.format(chartSettings.formats.percentFormat);\n\n case 'time':\n return Craft.charts.utils.getDuration;\n\n case 'number':\n return formatLocale.format(chartSettings.formats.numberFormat);\n }\n },\n};\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Color input\n */\nCraft.ColorInput = Garnish.Base.extend(\n {\n $container: null,\n $input: null,\n $colorContainer: null,\n $colorPreview: null,\n $colorInput: null,\n\n init: function (container) {\n this.$container = $(container);\n this.$input = this.$container.find('.color-input');\n this.$colorContainer = this.$container.children('.color');\n this.$colorPreview = this.$colorContainer.children('.color-preview');\n\n this.createColorInput();\n this.handleTextChange();\n\n this.addListener(this.$input, 'input', 'handleTextChange');\n },\n\n createColorInput: function () {\n var input = document.createElement('input');\n input.setAttribute('type', 'color');\n\n if (input.type !== 'color') {\n // The browser doesn't support input[type=color]\n return;\n }\n\n this.$colorContainer.removeClass('static');\n this.$colorInput = $(input)\n .addClass('color-preview-input')\n .attr({\n 'aria-controls': this.$input.attr('id'),\n 'aria-label': Craft.t('app', 'Color picker'),\n })\n .appendTo(this.$colorPreview);\n\n this.addListener(this.$colorInput, 'click', function (ev) {\n ev.stopPropagation();\n });\n\n this.addListener(this.$colorContainer, 'click', function () {\n this.$colorInput.trigger('click');\n });\n\n this.addListener(this.$colorInput, 'input', 'updateColor');\n },\n\n updateColor: function () {\n this.$input.val(this.$colorInput.val());\n this.handleTextChange();\n },\n\n handleTextChange: function () {\n let val = this.$input.val();\n\n if (val !== (val = Craft.trim(val))) {\n this.$input.val(val);\n }\n\n // Chop off the #\n if (val.length && val[0] === '#') {\n val = val.substring(1);\n this.$input.val(val);\n }\n\n // If empty, set the preview to transparent\n if (!val.length) {\n this.$colorPreview.css('background-color', '');\n return;\n }\n\n // Now normalize it for the UI stuff\n if (val.length === 3) {\n val = val[0].repeat(2) + val[1].repeat(2) + val[2].repeat(2);\n }\n\n if (val.match(/^[0-9a-f]{6}$/i)) {\n this.$colorPreview.css('background-color', `#${val}`);\n if (this.$colorInput) {\n this.$colorInput.val(`#${val}`);\n }\n } else {\n this.$colorPreview.css('background-color', '');\n }\n },\n },\n {\n _browserSupportsColorInputs: null,\n\n doesBrowserSupportColorInputs: function () {\n if (Craft.ColorInput._browserSupportsColorInputs === null) {\n }\n\n return Craft.ColorInput._browserSupportsColorInputs;\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * CP Screen Slideout\n */\nCraft.CpScreenSlideout = Craft.Slideout.extend(\n {\n action: null,\n\n namespace: null,\n\n showingLoadSpinner: false,\n hasTabs: false,\n hasCpLink: false,\n hasSidebar: false,\n\n $header: null,\n $toolbar: null,\n $tabContainer: null,\n $loadSpinner: null,\n $editLink: null,\n $sidebarBtn: null,\n\n $body: null,\n $content: null,\n\n $sidebar: null,\n\n $footer: null,\n $noticeContainer: null,\n $cancelBtn: null,\n $saveBtn: null,\n\n tabManager: null,\n showingSidebar: false,\n\n cancelToken: null,\n ignoreFailedRequest: false,\n fieldsWithErrors: null,\n\n init: function (action, settings) {\n this.action = action;\n this.setSettings(settings, Craft.CpScreenSlideout.defaults);\n\n this.fieldsWithErrors = [];\n\n // Header\n this.$header = $('<header/>', {class: 'pane-header'});\n this.$toolbar = $('<div/>', {class: 'so-toolbar'}).appendTo(this.$header);\n this.$tabContainer = $('<div/>', {class: 'pane-tabs'}).appendTo(\n this.$toolbar\n );\n this.$loadSpinner = $('<div/>', {\n class: 'spinner',\n title: Craft.t('app', 'Loading'),\n 'aria-label': Craft.t('app', 'Loading'),\n }).appendTo(this.$toolbar);\n this.$editLink = $('<a/>', {\n target: '_blank',\n class: 'btn header-btn hidden',\n title: Craft.t('app', 'Open the full edit page in a new tab'),\n 'aria-label': Craft.t('app', 'Open the full edit page in a new tab'),\n 'data-icon': 'external',\n }).appendTo(this.$toolbar);\n this.$sidebarBtn = $('<button/>', {\n type: 'button',\n class: 'btn header-btn hidden sidebar-btn',\n title: Craft.t('app', 'Show sidebar'),\n 'aria-label': Craft.t('app', 'Show sidebar'),\n 'data-icon': `sidebar-${Garnish.ltr ? 'right' : 'left'}`,\n 'aria-expanded': 'false',\n }).appendTo(this.$toolbar);\n\n this.addListener(this.$sidebarBtn, 'click', (ev) => {\n ev.preventDefault();\n if (!this.showingSidebar) {\n this.showSidebar();\n } else {\n this.hideSidebar();\n }\n });\n\n // Body\n this.$body = $('<div/>', {class: 'so-body'});\n\n // Content\n this.$content = $('<div/>', {class: 'so-content'}).appendTo(this.$body);\n\n // Sidebar\n this.$sidebar = $('<div/>', {\n class: 'so-sidebar details hidden',\n }).appendTo(this.$body);\n\n // Footer\n this.$footer = $('<div/>', {class: 'so-footer hidden'});\n this.$noticeContainer = $('<div/>', {class: 'so-notice'}).appendTo(\n this.$footer\n );\n $('<div/>', {class: 'flex-grow'}).appendTo(this.$footer);\n const $btnContainer = $('<div/>', {class: 'flex flex-nowrap'}).appendTo(\n this.$footer\n );\n this.$cancelBtn = $('<button/>', {\n type: 'button',\n class: 'btn',\n text: Craft.t('app', 'Cancel'),\n }).appendTo($btnContainer);\n this.$saveBtn = Craft.ui\n .createSubmitButton({\n label: Craft.t('app', 'Save'),\n spinner: true,\n })\n .appendTo($btnContainer);\n\n let $contents = this.$header.add(this.$body).add(this.$footer);\n\n this.base($contents, {\n containerElement: 'form',\n containerAttributes: {\n id: `cp-screen-${Math.floor(Math.random() * 100000000)}`,\n action: '',\n method: 'post',\n novalidate: '',\n class: 'cp-screen',\n },\n closeOnEsc: false,\n closeOnShadeClick: false,\n });\n\n this.$container.data('cpScreen', this);\n this.on('beforeClose', () => {\n this.hideSidebar();\n });\n\n // Register shortcuts & events\n Garnish.uiLayerManager.registerShortcut(\n {\n keyCode: Garnish.S_KEY,\n ctrl: true,\n },\n (ev) => {\n this.handleSubmit(ev);\n }\n );\n Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n this.closeMeMaybe();\n });\n this.addListener(this.$cancelBtn, 'click', () => {\n this.closeMeMaybe();\n });\n this.addListener(this.$shade, 'click', () => {\n this.closeMeMaybe();\n });\n this.addListener(this.$container, 'click', (ev) => {\n const $target = $(event.target);\n\n if (\n this.showingSidebar &&\n !$target.closest(this.$sidebarBtn).length &&\n !$target.closest(this.$sidebar).length\n ) {\n this.hideSidebar();\n }\n });\n this.addListener(this.$container, 'submit', 'handleSubmit');\n\n this.load();\n },\n\n /**\n * @param {Object} [data={}]\n * @param {boolean} [refreshInitialData=true]\n * @returns {Promise}\n */\n load: function (data, refreshInitialData) {\n return new Promise((resolve, reject) => {\n this.trigger('beforeLoad');\n this.showLoadSpinner();\n\n if (this.cancelToken) {\n this.ignoreFailedRequest = true;\n this.cancelToken.cancel();\n }\n\n this.cancelToken = axios.CancelToken.source();\n\n Craft.sendActionRequest(\n 'GET',\n this.action,\n $.extend(\n {\n params: Object.assign({}, this.getParams(), this.settings.params),\n cancelToken: this.cancelToken.token,\n headers: {\n 'X-Craft-Container-Id': this.$container.attr('id'),\n },\n },\n this.settings.requestOptions\n )\n )\n .then((response) => {\n this.update(response.data)\n .then(() => {\n if (refreshInitialData !== false) {\n this.$container.data('delta-names', response.data.deltaNames);\n this.$container.data(\n 'initial-delta-values',\n response.data.initialDeltaValues\n );\n this.$container.data(\n 'initialSerializedValue',\n this.$container.serialize()\n );\n }\n resolve();\n })\n .catch((e) => {\n reject(e);\n });\n })\n .catch((e) => {\n if (!this.ignoreFailedRequest) {\n Craft.cp.displayError();\n reject(e);\n }\n this.ignoreFailedRequest = false;\n })\n .finally(() => {\n this.hideLoadSpinner();\n this.cancelToken = null;\n });\n });\n },\n\n getParams: function () {\n return {};\n },\n\n updateHeaderVisibility: function () {\n // Should the header be shown regardless of viewport size?\n const forceShow =\n this.settings.showHeader ||\n this.hasTabs ||\n this.hasCpLink ||\n this.showingLoadSpinner;\n\n if (forceShow || this.hasSidebar) {\n this.$header.removeClass('hidden');\n } else {\n this.$header.addClass('hidden');\n }\n\n if (forceShow) {\n this.$header.addClass('so-visible');\n } else {\n this.$header.removeClass('so-visible');\n }\n },\n\n showLoadSpinner: function () {\n this.$loadSpinner.removeClass('hidden');\n this.showingLoadSpinner = true;\n this.updateHeaderVisibility();\n },\n\n hideLoadSpinner: function () {\n this.$loadSpinner.addClass('hidden');\n this.showingLoadSpinner = false;\n this.updateHeaderVisibility();\n },\n\n /**\n * @param {Object} data\n * @returns {Promise}\n */\n update: function (data) {\n return new Promise((resolve) => {\n this.namespace = data.namespace;\n this.$content.html(data.content);\n\n if (data.submitButtonLabel) {\n this.$saveBtn.text(data.submitButtonLabel);\n }\n\n this.updateTabs(data.tabs);\n\n if (data.formAttributes) {\n Craft.setElementAttributes(this.$container, data.formAttributes);\n }\n\n if (data.editUrl) {\n this.$editLink.removeClass('hidden').attr('href', data.editUrl);\n this.hasCpLink = true;\n } else {\n this.$editLink.addClass('hidden');\n this.hasCpLink = false;\n }\n\n if (data.sidebar) {\n this.$container.addClass('has-sidebar');\n this.$sidebarBtn.removeClass('hidden');\n this.$sidebar.html(data.sidebar);\n\n // Open outbound links in new windows\n this.$sidebar.find('a').each(function () {\n if (\n this.hostname.length &&\n typeof $(this).attr('target') === 'undefined'\n ) {\n $(this).attr('target', '_blank');\n }\n });\n\n this.hasSidebar = true;\n } else {\n this.$container.removeClass('has-sidebar');\n this.$sidebarBtn.addClass('hidden');\n this.$sidebar.addClass('hidden').html('');\n this.hasSidebar = false;\n }\n\n if (data.notice) {\n this.$noticeContainer.html(data.notice);\n } else {\n this.$noticeContainer.empty();\n }\n\n this.updateHeaderVisibility();\n this.$footer.removeClass('hidden');\n\n Garnish.requestAnimationFrame(() => {\n Craft.appendHeadHtml(data.headHtml);\n Craft.appendBodyHtml(data.bodyHtml);\n\n Craft.initUiElements(this.$content);\n new Craft.ElementThumbLoader().load($(this.$content));\n\n if (data.sidebar) {\n Craft.initUiElements(this.$sidebar);\n new Craft.ElementThumbLoader().load(this.$sidebar);\n }\n\n if (!Garnish.isMobileBrowser()) {\n Craft.setFocusWithin(this.$content);\n }\n\n resolve();\n this.trigger('load');\n });\n });\n },\n\n updateTabs: function (tabs) {\n if (this.tabManager) {\n this.tabManager.destroy();\n this.tabManager = null;\n this.$tabContainer.html('');\n }\n\n this.hasTabs = !!tabs;\n\n if (this.hasTabs) {\n const $tabContainer = $(tabs);\n this.$tabContainer.replaceWith($tabContainer);\n this.$tabContainer = $tabContainer;\n this.tabManager = new Craft.Tabs(this.$tabContainer);\n this.tabManager.on('deselectTab', (ev) => {\n $(ev.$tab.attr('href')).addClass('hidden');\n });\n this.tabManager.on('selectTab', (ev) => {\n $(ev.$tab.attr('href')).removeClass('hidden');\n Garnish.$win.trigger('resize');\n this.$body.trigger('scroll');\n });\n }\n },\n\n showSidebar: function () {\n if (this.showingSidebar) {\n return;\n }\n\n this.$body.scrollTop(0).addClass('no-scroll');\n\n this.$sidebar\n .off('transitionend.so')\n .css(this._closedSidebarStyles())\n .removeClass('hidden');\n\n // Hack to force CSS animations\n this.$sidebar[0].offsetWidth;\n\n this.$sidebar.css(this._openedSidebarStyles());\n\n if (!Garnish.isMobileBrowser()) {\n this.$sidebar.one('transitionend.so', () => {\n Craft.setFocusWithin(this.$sidebar);\n });\n }\n\n Craft.trapFocusWithin(this.$sidebar);\n\n this.$sidebarBtn.addClass('active').attr({\n 'aria-expanded': 'true',\n });\n\n Garnish.$win.trigger('resize');\n this.$sidebar.trigger('scroll');\n\n Garnish.uiLayerManager.addLayer();\n Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n this.hideSidebar();\n });\n\n this.showingSidebar = true;\n },\n\n hideSidebar: function () {\n if (!this.showingSidebar) {\n return;\n }\n\n this.$body.removeClass('no-scroll');\n\n this.$sidebar\n .off('transitionend.so')\n .css(this._closedSidebarStyles())\n .one('transitionend.so', () => {\n this.$sidebar.addClass('hidden');\n this.$sidebarBtn.focus();\n });\n\n this.$sidebarBtn.removeClass('active').attr({\n 'aria-expanded': 'false',\n });\n\n Garnish.uiLayerManager.removeLayer();\n\n this.showingSidebar = false;\n },\n\n _openedSidebarStyles: function () {\n return {\n [Garnish.ltr ? 'right' : 'left']: '0',\n };\n },\n\n _closedSidebarStyles: function () {\n return {\n [Garnish.ltr ? 'right' : 'left']: '-350px',\n };\n },\n\n showSubmitSpinner: function () {\n this.$saveBtn.addClass('loading');\n },\n\n hideSubmitSpinner: function () {\n this.$saveBtn.removeClass('loading');\n },\n\n handleSubmit: function (ev) {\n ev.preventDefault();\n this.submit();\n },\n\n submit: function () {\n this.showSubmitSpinner();\n\n const data = Craft.findDeltaData(\n this.$container.data('initialSerializedValue'),\n this.$container.serialize(),\n this.$container.data('delta-names'),\n null,\n this.$container.data('initial-delta-values')\n );\n\n Craft.sendActionRequest('POST', null, {\n data,\n headers: {\n 'X-Craft-Namespace': this.namespace,\n },\n })\n .then((response) => {\n this.handleSubmitResponse(response);\n })\n .catch((error) => {\n this.handleSubmitError(error);\n })\n .finally(() => {\n this.hideSubmitSpinner();\n });\n },\n\n handleSubmitResponse: function (response) {\n this.clearErrors();\n const data = response.data || {};\n if (data.message) {\n Craft.cp.displaySuccess(data.message, data.notificationSettings);\n }\n this.trigger('submit', {\n response: response,\n data: (data.modelName && data[data.modelName]) || {},\n });\n if (this.settings.closeOnSubmit) {\n this.close();\n }\n },\n\n handleSubmitError: function (error) {\n if (\n !error.isAxiosError ||\n !error.response ||\n !error.response.status === 400\n ) {\n Craft.cp.displayError();\n throw error;\n }\n\n const data = error.response.data || {};\n Craft.cp.displayError(data.message);\n if (data.errors) {\n this.showErrors(data.errors);\n }\n },\n\n /**\n * @param {string[]} errors\n */\n showErrors: function (errors) {\n this.clearErrors();\n\n Object.entries(errors).forEach(([name, fieldErrors]) => {\n const $field = this.$container.find(`[data-attribute=\"${name}\"]`);\n if ($field) {\n Craft.ui.addErrorsToField($field, fieldErrors);\n this.fieldsWithErrors.push($field);\n }\n });\n },\n\n clearErrors: function () {\n this.fieldsWithErrors.forEach(($field) => {\n Craft.ui.clearErrorsFromField($field);\n });\n },\n\n isDirty: function () {\n return (\n typeof this.$container.data('initialSerializedValue') !== 'undefined' &&\n this.$container.serialize() !==\n this.$container.data('initialSerializedValue')\n );\n },\n\n closeMeMaybe: function () {\n if (!this.isOpen) {\n return;\n }\n\n if (\n !this.isDirty() ||\n confirm(\n Craft.t(\n 'app',\n 'Are you sure you want to close this screen? Any changes will be lost.'\n )\n )\n ) {\n this.close();\n }\n },\n\n close: function () {\n this.base();\n\n if (this.cancelToken) {\n this.ignoreFailedRequest = true;\n this.cancelToken.cancel();\n }\n },\n },\n {\n defaults: {\n params: {},\n requestOptions: {},\n showHeader: null,\n closeOnSubmit: true,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n\n// Use old jQuery prefilter behavior\n// see https://jquery.com/upgrade-guide/3.5/\nvar rxhtmlTag =\n /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi;\njQuery.htmlPrefilter = function (html) {\n return html.replace(rxhtmlTag, '<$1></$2>');\n};\n\n// Set all the standard Craft.* stuff\n$.extend(Craft, {\n navHeight: 48,\n\n /**\n * @callback indexKeyCallback\n * @param {Object} currentValue\n * @param {number} [index]\n * @returns {string}\n */\n /**\n * Indexes an array of objects by a specified key\n *\n * @param {Object[]} arr\n * @param {(string|indexKeyCallback)} key\n */\n index: function (arr, key) {\n if (!$.isArray(arr)) {\n throw 'The first argument passed to Craft.index() must be an array.';\n }\n\n return arr.reduce((index, obj, i) => {\n index[typeof key === 'string' ? obj[key] : key(obj, i)] = obj;\n return index;\n }, {});\n },\n\n /**\n * Groups an array of objects by a specified key\n *\n * @param {Object[]} arr\n * @param {(string|indexKeyCallback)} key\n */\n group: function (arr, key) {\n if (!$.isArray(arr)) {\n throw 'The first argument passed to Craft.group() must be an array.';\n }\n\n let index = {};\n\n return arr.reduce((grouped, obj, i) => {\n const thisKey = typeof key === 'string' ? obj[key] : key(obj, i);\n if (!index.hasOwnProperty(thisKey)) {\n index[thisKey] = [[], thisKey];\n grouped.push(index[thisKey]);\n }\n index[thisKey][0].push(obj);\n return grouped;\n }, []);\n },\n\n /**\n * Get a translated message.\n *\n * @param {string} category\n * @param {string} message\n * @param {Object} params\n * @returns {string}\n */\n t: function (category, message, params) {\n if (\n typeof Craft.translations[category] !== 'undefined' &&\n typeof Craft.translations[category][message] !== 'undefined'\n ) {\n message = Craft.translations[category][message];\n }\n\n if (params) {\n return this.formatMessage(message, params);\n }\n\n return message;\n },\n\n formatMessage: function (pattern, args) {\n let tokens;\n if ((tokens = this._tokenizePattern(pattern)) === false) {\n throw 'Message pattern is invalid.';\n }\n for (let i = 0; i < tokens.length; i++) {\n let token = tokens[i];\n if (typeof token === 'object') {\n if ((tokens[i] = this._parseToken(token, args)) === false) {\n throw 'Message pattern is invalid.';\n }\n }\n }\n return tokens.join('');\n },\n\n _tokenizePattern: function (pattern) {\n let depth = 1,\n start,\n pos;\n // Get an array of the string characters (factoring in 3+ byte chars)\n const chars = [...pattern];\n if ((start = pos = chars.indexOf('{')) === -1) {\n return [pattern];\n }\n let tokens = [chars.slice(0, pos).join('')];\n while (true) {\n let open = chars.indexOf('{', pos + 1);\n let close = chars.indexOf('}', pos + 1);\n if (open === -1) {\n open = false;\n }\n if (close === -1) {\n close = false;\n }\n if (open === false && close === false) {\n break;\n }\n if (open === false) {\n open = chars.length;\n }\n if (close > open) {\n depth++;\n pos = open;\n } else {\n depth--;\n pos = close;\n }\n if (depth === 0) {\n tokens.push(\n chars\n .slice(start + 1, pos)\n .join('')\n .split(',', 3)\n );\n start = pos + 1;\n tokens.push(chars.slice(start, open).join(''));\n start = open;\n }\n\n if (depth !== 0 && (open === false || close === false)) {\n break;\n }\n }\n if (depth !== 0) {\n return false;\n }\n\n return tokens;\n },\n\n _parseToken: function (token, args) {\n // parsing pattern based on ICU grammar:\n // http://icu-project.org/apiref/icu4c/classMessageFormat.html#details\n const param = Craft.trim(token[0]);\n if (typeof args[param] === 'undefined') {\n return `{${token.join(',')}}`;\n }\n const arg = args[param];\n const type =\n typeof token[1] !== 'undefined' ? Craft.trim(token[1]) : 'none';\n switch (type) {\n case 'number':\n return (() => {\n let format =\n typeof token[2] !== 'undefined' ? Craft.trim(token[2]) : null;\n if (format !== null && format !== 'integer') {\n throw `Message format 'number' is only supported for integer values.`;\n }\n let number = Craft.formatNumber(arg);\n let pos;\n if (format === null && (pos = `${arg}`.indexOf('.')) !== -1) {\n number += `.${arg.substring(pos + 1)}`;\n }\n return number;\n })();\n case 'none':\n return arg;\n case 'select':\n return (() => {\n /* http://icu-project.org/apiref/icu4c/classicu_1_1SelectFormat.html\n selectStyle = (selector '{' message '}')+\n */\n if (typeof token[2] === 'undefined') {\n return false;\n }\n let select = this._tokenizePattern(token[2]);\n let c = select.length;\n let message = false;\n for (let i = 0; i + 1 < c; i++) {\n if (Garnish.isArray(select[i]) || !Garnish.isArray(select[i + 1])) {\n return false;\n }\n let selector = Craft.trim(select[i++]);\n if (\n (message === false && selector === 'other') ||\n selector == arg\n ) {\n message = select[i].join(',');\n }\n }\n if (message === false) {\n return false;\n }\n return this.formatMessage(message, args);\n })();\n case 'plural':\n return (() => {\n /* http://icu-project.org/apiref/icu4c/classicu_1_1PluralFormat.html\n pluralStyle = [offsetValue] (selector '{' message '}')+\n offsetValue = \"offset:\" number\n selector = explicitValue | keyword\n explicitValue = '=' number // adjacent, no white space in between\n keyword = [^[[:Pattern_Syntax:][:Pattern_White_Space:]]]+\n message: see MessageFormat\n */\n if (typeof token[2] === 'undefined') {\n return false;\n }\n let plural = this._tokenizePattern(token[2]);\n const c = plural.length;\n let message = false;\n let offset = 0;\n for (let i = 0; i + 1 < c; i++) {\n if (\n typeof plural[i] === 'object' ||\n typeof plural[i + 1] !== 'object'\n ) {\n return false;\n }\n let selector = Craft.trim(plural[i++]);\n let selectorChars = [...selector];\n\n if (i === 1 && selector.substring(0, 7) === 'offset:') {\n let pos = [...selector.replace(/[\\n\\r\\t]/g, ' ')].indexOf(' ', 7);\n if (pos === -1) {\n throw 'Message pattern is invalid.';\n }\n offset = parseInt(\n Craft.trim(selectorChars.slice(7, pos).join(''))\n );\n selector = Craft.trim(\n selectorChars\n .slice(pos + 1, pos + 1 + selectorChars.length)\n .join('')\n );\n }\n if (\n (message === false && selector === 'other') ||\n (selector[0] === '=' &&\n parseInt(\n selectorChars.slice(1, 1 + selectorChars.length).join('')\n ) === arg) ||\n (selector === 'one' && arg - offset === 1)\n ) {\n message = (\n typeof plural[i] === 'string' ? [plural[i]] : plural[i]\n )\n .map((p) => {\n return p.replace('#', arg - offset);\n })\n .join(',');\n }\n }\n if (message === false) {\n return false;\n }\n return this.formatMessage(message, args);\n })();\n default:\n throw `Message format '${type}' is not supported.`;\n }\n },\n\n formatDate: function (date) {\n if (typeof date !== 'object') {\n date = new Date(date);\n }\n\n return $.datepicker.formatDate(Craft.datepickerOptions.dateFormat, date);\n },\n\n /**\n * Formats a number.\n *\n * @param {string} number\n * @param {string} [format] D3 format\n * @returns {string}\n */\n formatNumber: function (number, format) {\n if (typeof format == 'undefined') {\n format = ',.0f';\n }\n\n var formatter = d3.formatLocale(d3FormatLocaleDefinition).format(format);\n\n return formatter(number);\n },\n\n /**\n * @param {string} key\n * @param {boolean} shift\n * @param {boolean} alt\n */\n shortcutText: function (key, shift, alt) {\n if (Craft.clientOs === 'Mac') {\n return (alt ? '⌥' : '') + (shift ? '⇧' : '') + '⌘' + key;\n }\n return 'Ctrl+' + (alt ? 'Alt+' : '') + (shift ? 'Shift+' : '') + key;\n },\n\n /**\n * Escapes some HTML.\n *\n * @param {string} str\n * @returns {string}\n */\n escapeHtml: function (str) {\n return $('<div/>').text(str).html();\n },\n\n /**\n * Escapes special regular expression characters.\n *\n * @param {string} str\n * @returns {string}\n */\n escapeRegex: function (str) {\n // h/t https://stackoverflow.com/a/9310752\n return str.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n },\n\n /**\n * Returns the text in a string that might contain HTML tags.\n *\n * @param {string} str\n * @returns {string}\n */\n getText: function (str) {\n return $('<div/>').html(str).text();\n },\n\n /**\n * Encodes a URI copmonent. Mirrors PHP's rawurlencode().\n *\n * @param {string} str\n * @returns {string}\n * @see http://stackoverflow.com/questions/1734250/what-is-the-equivalent-of-javascripts-encodeuricomponent-in-php\n */\n encodeUriComponent: function (str) {\n str = encodeURIComponent(str);\n\n var differences = {\n '!': '%21',\n '*': '%2A',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n };\n\n for (var chr in differences) {\n var re = new RegExp('\\\\' + chr, 'g');\n str = str.replace(re, differences[chr]);\n }\n\n return str;\n },\n\n /**\n * Selects the full value of a given text input.\n *\n * @param {(jQuery|HTMLElement|string)} input\n */\n selectFullValue: function (input) {\n var $input = $(input);\n var val = $input.val();\n\n // Does the browser support setSelectionRange()?\n if (typeof $input[0].setSelectionRange !== 'undefined') {\n // Select the whole value\n var length = val.length * 2;\n $input[0].setSelectionRange(0, length);\n } else {\n // Refresh the value to get the cursor positioned at the end\n $input.val(val);\n }\n },\n\n /**\n * Formats an ID out of an input name.\n *\n * @param {string} inputName\n * @returns {string}\n */\n formatInputId: function (inputName) {\n return this.rtrim(inputName.replace(/[^\\w\\-]+/g, '-'), '-');\n },\n\n /**\n * @param {string} [path]\n * @param {(Object|string)} [params]\n * @param {string} [baseUrl]\n * @returns {string}\n */\n getUrl: function (path, params, baseUrl) {\n if (typeof path !== 'string') {\n path = '';\n }\n\n // Normalize the params\n let anchor = null;\n if ($.isPlainObject(params)) {\n if (typeof params['#'] !== 'undefined') {\n anchor = params['#'];\n delete params['#'];\n }\n } else if (typeof params === 'string') {\n let anchorPos = params.indexOf('#');\n if (anchorPos !== -1) {\n anchor = params.substring(anchorPos + 1);\n params = params.substring(0, anchorPos);\n }\n params = Object.fromEntries(new URLSearchParams(params).entries());\n } else {\n params = {};\n }\n\n // Was there already an anchor on the path?\n let anchorPos = path.indexOf('#');\n if (anchorPos !== -1) {\n // Only keep it if the params didn't specify a new anchor\n if (!anchor) {\n anchor = path.substring(anchorPos + 1);\n }\n path = path.substring(0, anchorPos);\n }\n\n // Were there already any query string params in the path?\n let qsPos = path.indexOf('?');\n if (qsPos !== -1) {\n params = $.extend(\n Object.fromEntries(\n new URLSearchParams(path.substring(qsPos + 1)).entries()\n ),\n params\n );\n path = path.substring(0, qsPos);\n }\n\n // Return path if it appears to be an absolute URL.\n if (path.search('://') !== -1 || path[0] === '/') {\n return (\n path +\n (!$.isEmptyObject(params) ? `?${$.param(params)}` : '') +\n (anchor ? `#${anchor}` : '')\n );\n }\n\n path = Craft.trim(path, '/');\n\n // Put it all together\n let url;\n\n if (baseUrl) {\n url = baseUrl;\n\n if (path && Craft.pathParam) {\n // Does baseUrl already contain a path?\n var pathMatch = url.match(\n new RegExp('[&?]' + Craft.escapeRegex(Craft.pathParam) + '=[^&]+')\n );\n if (pathMatch) {\n url = url.replace(\n pathMatch[0],\n Craft.rtrim(pathMatch[0], '/') + '/' + path\n );\n path = '';\n }\n }\n } else {\n url = Craft.baseUrl;\n }\n\n // Does the base URL already have a query string?\n qsPos = url.indexOf('?');\n if (qsPos !== -1) {\n params = $.extend(\n Object.fromEntries(\n new URLSearchParams(url.substring(qsPos + 1)).entries()\n ),\n params\n );\n url = url.substring(0, qsPos);\n }\n\n if (!Craft.omitScriptNameInUrls && path) {\n if (Craft.usePathInfo || !Craft.pathParam) {\n // Make sure that the script name is in the URL\n if (url.search(Craft.scriptName) === -1) {\n url = Craft.rtrim(url, '/') + '/' + Craft.scriptName;\n }\n } else {\n // Move the path into the query string params\n\n // Is the path param already set?\n if (typeof params[Craft.pathParam] !== 'undefined') {\n let basePath = Craft.rtrim(params[Craft.pathParam]);\n path = basePath + (path ? '/' + path : '');\n }\n\n params[Craft.pathParam] = path;\n path = null;\n }\n }\n\n if (path) {\n url = Craft.rtrim(url, '/') + '/' + path;\n }\n\n if (!$.isEmptyObject(params)) {\n url += `?${$.param(params)}`;\n }\n\n if (anchor) {\n url += `#${anchor}`;\n }\n\n return url;\n },\n\n /**\n * @param {string} [path]\n * @param {(Object|string)} [params]\n * @returns {string}\n */\n getCpUrl: function (path, params) {\n return this.getUrl(path, params, Craft.baseCpUrl);\n },\n\n /**\n * @param {string} [path]\n * @param {(Object|string)} [params]\n * @returns {string}\n */\n getSiteUrl: function (path, params) {\n return this.getUrl(path, params, Craft.baseSiteUrl);\n },\n\n /**\n * Returns an action URL.\n *\n * @param {string} action\n * @param {(Object|string)} [params]\n * @returns {string}\n */\n getActionUrl: function (action, params) {\n return Craft.getUrl(action, params, Craft.actionUrl);\n },\n\n /**\n * Redirects the window to a given URL.\n *\n * @param {string} url\n */\n redirectTo: function (url) {\n document.location.href = this.getUrl(url);\n },\n\n /**\n * Replaces the page’s current URL.\n *\n * The location hash will be left intact, unless the given URL specifies one.\n *\n * @param {string} url\n */\n setUrl: function (url) {\n if (typeof history === 'undefined') {\n return;\n }\n\n if (!url.match(/#/)) {\n url += document.location.hash;\n }\n\n history.replaceState({}, '', url);\n },\n\n /**\n * Replaces the page’s current URL based on the given path, leaving the current query string and hash intact.\n *\n * @param {string} path\n */\n setPath: function (path) {\n this.path = path;\n this.setUrl(Craft.getUrl(path, document.location.search));\n },\n\n /**\n * Replaces the page’s current URL based on the given query param name and value, leaving the current URI, other query params, and hash intact.\n *\n * @param {string} name\n * @param {*} value\n */\n setQueryParam(name, value) {\n const baseUrl = document.location.origin + document.location.pathname;\n const params = this.getQueryParams();\n\n if (typeof value !== 'undefined' && value !== null && value !== false) {\n params[name] = value;\n } else {\n delete params[name];\n }\n\n this.setUrl(Craft.getUrl(baseUrl, params));\n },\n\n /**\n * Returns the current URL with a certain page added to it.\n *\n * @param {int} page\n * @returns {string}\n */\n getPageUrl: function (page) {\n let url = document.location.origin + document.location.pathname;\n url = Craft.rtrim(url, '/');\n\n let qs = document.location.search\n ? document.location.search.substring(1)\n : '';\n\n // query string-based pagination?\n if (Craft.pageTrigger[0] === '?') {\n const pageParam = Craft.pageTrigger.substring(1);\n // remove the existing page param\n if (document.location.search) {\n const params = Object.fromEntries(new URLSearchParams(qs).entries());\n delete params[pageParam];\n qs = $.param(params);\n }\n if (page !== 1) {\n qs += (qs !== '' ? '&' : '') + `${pageParam}=${page}`;\n }\n } else {\n // Remove the existing page segment(s)\n url = url.replace(\n new RegExp('/' + Craft.escapeRegex(Craft.pageTrigger) + '\\\\d+$'),\n ''\n );\n\n if (page !== 1) {\n url += `/${Craft.pageTrigger}${page}`;\n }\n }\n\n return url + (qs ? `?${qs}` : '') + document.location.hash;\n },\n\n /**\n * Returns a hidden CSRF token input, if CSRF protection is enabled.\n *\n * @returns {string}\n */\n getCsrfInput: function () {\n if (Craft.csrfTokenName) {\n return (\n '<input type=\"hidden\" name=\"' +\n Craft.csrfTokenName +\n '\" value=\"' +\n Craft.csrfTokenValue +\n '\"/>'\n );\n } else {\n return '';\n }\n },\n\n /**\n * @callback postActionRequestCallback\n * @param {?Object} response\n * @param {string} textStatus\n * @param {Object} jqXHR\n */\n /**\n * Posts an action request to the server.\n *\n * @param {string} action\n * @param {Object} [data]\n * @param {postActionRequestCallback} [callback]\n * @param {Object} [options]\n * @returns {Object}\n * @deprecated in 3.4.6. sendActionRequest() should be used instead\n */\n postActionRequest: function (action, data, callback, options) {\n // Make 'data' optional\n if (typeof data === 'function') {\n options = callback;\n callback = data;\n data = {};\n }\n\n options = options || {};\n\n if (options.contentType && options.contentType.match(/\\bjson\\b/)) {\n if (typeof data === 'object') {\n data = JSON.stringify(data);\n }\n options.contentType = 'application/json; charset=utf-8';\n }\n\n var jqXHR = $.ajax(\n $.extend(\n {\n url: Craft.getActionUrl(action),\n type: 'POST',\n dataType: 'json',\n headers: this._actionHeaders(),\n data: data,\n success: callback,\n error: function (jqXHR, textStatus, errorThrown) {\n // Ignore incomplete requests, likely due to navigating away from the page\n // h/t https://stackoverflow.com/a/22107079/1688568\n if (jqXHR.readyState !== 4) {\n return;\n }\n\n if (jqXHR.status !== 400) {\n if (typeof Craft.cp !== 'undefined') {\n Craft.cp.displayError();\n } else {\n alert(Craft.t('app', 'A server error occurred.'));\n }\n }\n\n if (callback) {\n callback(\n jqXHR.status === 400 ? jqXHR.responseJSON : null,\n textStatus,\n jqXHR\n );\n }\n },\n },\n options\n )\n );\n\n // Call the 'send' callback\n if (typeof options.send === 'function') {\n options.send(jqXHR);\n }\n\n return jqXHR;\n },\n\n _actionHeaders: function () {\n let headers = {\n 'X-Registered-Asset-Bundles': Object.keys(\n Craft.registeredAssetBundles\n ).join(','),\n 'X-Registered-Js-Files': Object.keys(Craft.registeredJsFiles).join(','),\n };\n\n if (Craft.csrfTokenValue) {\n headers['X-CSRF-Token'] = Craft.csrfTokenValue;\n }\n\n return headers;\n },\n\n /**\n * Sends a request to a Craft/plugin action\n * @param {string} method The request action to use ('GET' or 'POST')\n * @param {?string} [action] The action to request\n * @param {Object} [options] Axios request options\n * @returns {Promise}\n * @since 3.4.6\n */\n sendActionRequest: function (method, action, options = {}) {\n if ($.isPlainObject(action)) {\n options = action;\n action = null;\n }\n\n if (method.toUpperCase() === 'POST' && action && options.data) {\n // Avoid conflicting `action` params\n if (typeof options.data === 'string') {\n const namespace =\n options && options.headers && options.headers['X-Craft-Namespace'];\n const actionName = this.namespaceInputName('action', namespace);\n options.data += `&${actionName}=${action}`;\n } else {\n delete options.data.action;\n }\n }\n\n return new Promise((resolve, reject) => {\n options = options ? $.extend({}, options) : {};\n options.method = method;\n options.url = action ? Craft.getActionUrl(action) : Craft.getCpUrl();\n options.headers = $.extend(\n {\n 'X-Requested-With': 'XMLHttpRequest',\n },\n options.headers || {},\n this._actionHeaders()\n );\n options.params = $.extend({}, options.params || {}, {\n // Force Safari to not load from cache\n v: new Date().getTime(),\n });\n axios.request(options).then(resolve).catch(reject);\n });\n },\n\n /**\n * Sends a request to the Craftnet API.\n * @param {string} method The request action to use ('GET' or 'POST')\n * @param {string} uri The API endpoint URI\n * @param {Object} options Axios request options\n * @returns {Promise}\n * @since 3.3.16\n */\n sendApiRequest: function (method, uri, options) {\n return new Promise((resolve, reject) => {\n options = options ? $.extend({}, options) : {};\n let cancelToken = options.cancelToken || null;\n\n // Get the latest headers\n this._getApiHeaders(cancelToken)\n .then((apiHeaders) => {\n // Send the API request\n options.method = method;\n options.baseURL = Craft.baseApiUrl;\n options.url = uri;\n options.headers = $.extend(apiHeaders, options.headers || {});\n options.params = $.extend(\n Craft.apiParams || {},\n options.params || {},\n {\n // Force Safari to not load from cache\n v: new Date().getTime(),\n }\n );\n\n // Force the API to process the Craft headers if this is the first API request\n if (!this._apiHeaders) {\n options.params.processCraftHeaders = 1;\n }\n\n if (Craft.httpProxy) {\n options.proxy = Craft.httpProxy;\n }\n\n axios\n .request(options)\n .then((apiResponse) => {\n // Process the response headers\n this._processApiHeaders(apiResponse.headers, cancelToken)\n .then(() => {\n // Finally return the API response data\n resolve(apiResponse.data);\n })\n .catch(reject);\n })\n .catch(reject);\n })\n .catch(reject);\n });\n },\n\n _loadingApiHeaders: false,\n _apiHeaders: null,\n _apiHeaderWaitlist: [],\n\n /**\n * Returns the headers that should be sent with API requests.\n *\n * @param {Object} [cancelToken]\n * @returns {Promise}\n */\n _getApiHeaders: function (cancelToken) {\n return new Promise((resolve, reject) => {\n // Are we already loading them?\n if (this._loadingApiHeaders) {\n this._apiHeaderWaitlist.push([resolve, reject]);\n return;\n }\n\n // Are the headers already cached?\n if (this._apiHeaders) {\n resolve(this._apiHeaders);\n return;\n }\n\n this._loadingApiHeaders = true;\n this.sendActionRequest('POST', 'app/api-headers', {\n cancelToken: cancelToken,\n })\n .then((response) => {\n // Make sure we even are waiting for these anymore\n if (!this._loadingApiHeaders) {\n reject(e);\n return;\n }\n\n resolve(response.data);\n })\n .catch((e) => {\n this._rejectApiRequests(reject, e);\n });\n });\n },\n\n _processApiHeaders: function (headers, cancelToken) {\n return new Promise((resolve, reject) => {\n // Have we already processed them?\n if (this._apiHeaders) {\n resolve();\n return;\n }\n\n this.sendActionRequest('POST', 'app/process-api-response-headers', {\n data: {\n headers: headers,\n },\n cancelToken: cancelToken,\n })\n .then((response) => {\n // Make sure we even are waiting for these anymore\n if (!this._loadingApiHeaders) {\n reject(e);\n return;\n }\n\n this._apiHeaders = response.data;\n this._loadingApiHeaders = false;\n\n resolve();\n\n // Was anything else waiting for them?\n while (this._apiHeaderWaitlist.length) {\n this._apiHeaderWaitlist.shift()[0](this._apiHeaders);\n }\n })\n .catch((e) => {\n this._rejectApiRequests(reject, e);\n });\n });\n },\n\n _rejectApiRequests: function (reject, e) {\n this._loadingApiHeaders = false;\n reject(e);\n while (this._apiHeaderWaitlist.length) {\n this._apiHeaderWaitlist.shift()[1](e);\n }\n },\n\n /**\n * Clears the cached API headers.\n */\n clearCachedApiHeaders: function () {\n this._apiHeaders = null;\n this._loadingApiHeaders = false;\n\n // Reject anything in the header waitlist\n while (this._apiHeaderWaitlist.length) {\n this._apiHeaderWaitlist.shift()[1]();\n }\n },\n\n /**\n * Requests a URL and downloads the response.\n *\n * @param {string} method the request method to use\n * @param {string} url the URL\n * @param {(string|Object)} [body] the request body, if method = POST\n * @returns {Promise}\n */\n downloadFromUrl: function (method, url, body) {\n return new Promise((resolve, reject) => {\n // h/t https://nehalist.io/downloading-files-from-post-requests/\n let request = new XMLHttpRequest();\n request.open(method, url, true);\n if (typeof body === 'object') {\n request.setRequestHeader(\n 'Content-Type',\n 'application/json; charset=UTF-8'\n );\n body = JSON.stringify(body);\n } else {\n request.setRequestHeader(\n 'Content-Type',\n 'application/x-www-form-urlencoded; charset=UTF-8'\n );\n }\n request.responseType = 'blob';\n\n request.onload = () => {\n // Only handle status code 200\n if (request.status === 200) {\n // Try to find out the filename from the content disposition `filename` value\n let disposition = request.getResponseHeader('content-disposition');\n let matches = /\"([^\"]*)\"/.exec(disposition);\n let filename =\n matches != null && matches[1] ? matches[1] : 'Download';\n\n // Encode the download into an anchor href\n let contentType = request.getResponseHeader('content-type');\n let blob = new Blob([request.response], {type: contentType});\n let link = document.createElement('a');\n link.href = window.URL.createObjectURL(blob);\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n resolve();\n } else {\n reject();\n }\n };\n\n request.send(body);\n });\n },\n\n /**\n * Converts a comma-delimited string into an array.\n *\n * @param {string} str\n * @returns array\n */\n stringToArray: function (str) {\n if (typeof str !== 'string') {\n return str;\n }\n\n var arr = str.split(',');\n for (var i = 0; i < arr.length; i++) {\n arr[i] = $.trim(arr[i]);\n }\n return arr;\n },\n\n /**\n * @callback findDeltaDataCallback\n * @param {string} deltaName\n * @param {Array} params\n */\n /**\n * Compares old and new post data, and removes any values that haven't\n * changed within the given list of delta namespaces.\n *\n * @param {string} oldData\n * @param {string} newData\n * @param {Object} deltaNames\n * @param {findDeltaDataCallback} [callback] Callback function that should be called whenever a new group of modified params has been found\n * @param {Object} [initialDeltaValues] Initial delta values. If undefined, `Craft.initialDeltaValues` will be used.\n * @param {Object} [modifiedDeltaNames} List of delta names that should be considered modified regardles of their param values\n * @returns {string}\n */\n findDeltaData: function (\n oldData,\n newData,\n deltaNames,\n callback,\n initialDeltaValues,\n modifiedDeltaNames\n ) {\n // Make sure oldData and newData are always strings. This is important because further below String.split is called.\n oldData = typeof oldData === 'string' ? oldData : '';\n newData = typeof newData === 'string' ? newData : '';\n deltaNames = $.isArray(deltaNames) ? deltaNames : [];\n initialDeltaValues = $.isPlainObject(initialDeltaValues)\n ? initialDeltaValues\n : {};\n modifiedDeltaNames = $.isArray(modifiedDeltaNames)\n ? modifiedDeltaNames\n : [];\n\n // Sort the delta namespaces from least -> most specific\n deltaNames.sort(function (a, b) {\n if (a.length === b.length) {\n return 0;\n }\n return a.length > b.length ? 1 : -1;\n });\n\n // Group all of the old & new params by namespace\n var groupedOldParams = this._groupParamsByDeltaNames(\n oldData.split('&'),\n deltaNames,\n false,\n initialDeltaValues\n );\n var groupedNewParams = this._groupParamsByDeltaNames(\n newData.split('&'),\n deltaNames,\n true,\n false\n );\n\n // Figure out which of the new params should actually be posted\n var params = groupedNewParams.__root__;\n for (var n = 0; n < deltaNames.length; n++) {\n if (\n Craft.inArray(deltaNames[n], modifiedDeltaNames) ||\n (typeof groupedNewParams[deltaNames[n]] === 'object' &&\n (typeof groupedOldParams[deltaNames[n]] !== 'object' ||\n JSON.stringify(groupedOldParams[deltaNames[n]]) !==\n JSON.stringify(groupedNewParams[deltaNames[n]])))\n ) {\n params = params.concat(groupedNewParams[deltaNames[n]]);\n params.push('modifiedDeltaNames[]=' + deltaNames[n]);\n if (callback) {\n callback(deltaNames[n], groupedNewParams[deltaNames[n]]);\n }\n }\n }\n\n return params.join('&');\n },\n\n /**\n * @param {Object} params\n * @param {Object} deltaNames\n * @param {boolean} withRoot\n * @param {(boolean|Object)} initialValues\n * @returns {Object}\n * @private\n */\n _groupParamsByDeltaNames: function (\n params,\n deltaNames,\n withRoot,\n initialValues\n ) {\n const grouped = {};\n\n if (withRoot) {\n grouped.__root__ = [];\n }\n\n const encodeURIComponentExceptEqualChar = (o) =>\n encodeURIComponent(o).replace('%3D', '=');\n\n params = params.map((p) => decodeURIComponent(p));\n\n paramLoop: for (let p = 0; p < params.length; p++) {\n // loop through the delta names from most -> least specific\n for (let n = deltaNames.length - 1; n >= 0; n--) {\n const paramName = params[p].substring(0, deltaNames[n].length + 1);\n if (\n paramName === deltaNames[n] + '=' ||\n paramName === deltaNames[n] + '['\n ) {\n if (typeof grouped[deltaNames[n]] === 'undefined') {\n grouped[deltaNames[n]] = [];\n }\n grouped[deltaNames[n]].push(\n encodeURIComponentExceptEqualChar(params[p])\n );\n continue paramLoop;\n }\n }\n\n if (withRoot) {\n grouped.__root__.push(encodeURIComponentExceptEqualChar(params[p]));\n }\n }\n\n if (initialValues) {\n const serializeParam = (name, value) => {\n if ($.isArray(value) || $.isPlainObject(value)) {\n value = $.param(value);\n } else if (typeof value === 'string') {\n value = encodeURIComponent(value);\n } else if (value === null) {\n value = '';\n }\n return `${encodeURIComponent(name)}=${value}`;\n };\n\n for (let name in initialValues) {\n if (initialValues.hasOwnProperty(name)) {\n if ($.isPlainObject(initialValues[name])) {\n grouped[name] = [];\n for (let subName in initialValues[name]) {\n if (initialValues[name].hasOwnProperty(subName)) {\n grouped[name].push(\n serializeParam(\n `${name}[${subName}]`,\n initialValues[name][subName]\n )\n );\n }\n }\n } else {\n grouped[name] = [serializeParam(name, initialValues[name])];\n }\n }\n }\n }\n\n return grouped;\n },\n\n /**\n * Expands an object of POST array-style strings into an actual array.\n *\n * @param {Object} arr\n * @returns {Array}\n */\n expandPostArray: function (arr) {\n var expanded = {};\n var i;\n\n for (var key in arr) {\n if (!arr.hasOwnProperty(key)) {\n continue;\n }\n\n var value = arr[key],\n m = key.match(/^(\\w+)(\\[.*)?/),\n keys;\n\n if (m[2]) {\n // Get all of the nested keys\n keys = m[2].match(/\\[[^\\[\\]]*\\]/g);\n\n // Chop off the brackets\n for (i = 0; i < keys.length; i++) {\n keys[i] = keys[i].substring(1, keys[i].length - 1);\n }\n } else {\n keys = [];\n }\n\n keys.unshift(m[1]);\n\n var parentElem = expanded;\n\n for (i = 0; i < keys.length; i++) {\n if (i < keys.length - 1) {\n if (typeof parentElem[keys[i]] !== 'object') {\n // Figure out what this will be by looking at the next key\n if (!keys[i + 1] || parseInt(keys[i + 1]) == keys[i + 1]) {\n parentElem[keys[i]] = [];\n } else {\n parentElem[keys[i]] = {};\n }\n }\n\n parentElem = parentElem[keys[i]];\n } else {\n // Last one. Set the value\n if (!keys[i]) {\n keys[i] = parentElem.length;\n }\n\n parentElem[keys[i]] = value;\n }\n }\n }\n\n return expanded;\n },\n\n /**\n * Creates a form element populated with hidden inputs based on a string of serialized form data.\n *\n * @param {string} data\n * @returns {(jQuery|HTMLElement)}\n */\n createForm: function (data) {\n var $form = $('<form/>', {\n attr: {\n method: 'post',\n action: '',\n 'accept-charset': 'UTF-8',\n },\n });\n\n if (typeof data === 'string') {\n var values = data.split('&');\n var chunks;\n for (var i = 0; i < values.length; i++) {\n chunks = values[i].split('=', 2);\n $('<input/>', {\n type: 'hidden',\n name: decodeURIComponent(chunks[0]),\n value: decodeURIComponent(chunks[1] || ''),\n }).appendTo($form);\n }\n }\n\n return $form;\n },\n\n /**\n * Compares two variables and returns whether they are equal in value.\n * Recursively compares array and object values.\n *\n * @param {*} obj1\n * @param {*} obj2\n * @param {boolean} [sortObjectKeys] Whether object keys should be sorted before being compared. Default is true.\n * @returns boolean\n */\n compare: function (obj1, obj2, sortObjectKeys) {\n // Compare the types\n if (typeof obj1 !== typeof obj2) {\n return false;\n }\n\n if (typeof obj1 === 'object') {\n // Compare the lengths\n if (obj1.length !== obj2.length) {\n return false;\n }\n\n // Is one of them an array but the other is not?\n if (obj1 instanceof Array !== obj2 instanceof Array) {\n return false;\n }\n\n // If they're actual objects (not arrays), compare the keys\n if (!(obj1 instanceof Array)) {\n if (typeof sortObjectKeys === 'undefined' || sortObjectKeys === true) {\n if (\n !Craft.compare(\n Craft.getObjectKeys(obj1).sort(),\n Craft.getObjectKeys(obj2).sort()\n )\n ) {\n return false;\n }\n } else {\n if (\n !Craft.compare(Craft.getObjectKeys(obj1), Craft.getObjectKeys(obj2))\n ) {\n return false;\n }\n }\n }\n\n // Compare each value\n for (var i in obj1) {\n if (!obj1.hasOwnProperty(i)) {\n continue;\n }\n\n if (!Craft.compare(obj1[i], obj2[i])) {\n return false;\n }\n }\n\n // All clear\n return true;\n } else {\n return obj1 === obj2;\n }\n },\n\n /**\n * Returns an array of an object's keys.\n *\n * @param {Object} obj\n * @returns {string[]}\n */\n getObjectKeys: function (obj) {\n var keys = [];\n\n for (var key in obj) {\n if (!obj.hasOwnProperty(key)) {\n continue;\n }\n\n keys.push(key);\n }\n\n return keys;\n },\n\n /**\n * Takes an array or string of chars, and places a backslash before each one, returning the combined string.\n *\n * Userd by ltrim() and rtrim()\n *\n * @param {(string|Object)} chars\n * @returns {string}\n */\n escapeChars: function (chars) {\n if (!Garnish.isArray(chars)) {\n chars = chars.split();\n }\n\n var escaped = '';\n\n for (var i = 0; i < chars.length; i++) {\n escaped += '\\\\' + chars[i];\n }\n\n return escaped;\n },\n\n /**\n * Trim characters off of the beginning of a string.\n *\n * @param {string} str\n * @param {(string|Object)} [chars] The characters to trim off. Defaults to a space if left blank.\n * @returns {string}\n */\n ltrim: function (str, chars) {\n if (!str) {\n return str;\n }\n if (typeof chars === 'undefined') {\n chars = ' \\t\\n\\r\\0\\x0B';\n }\n var re = new RegExp('^[' + Craft.escapeChars(chars) + ']+');\n return str.replace(re, '');\n },\n\n /**\n * Trim characters off of the end of a string.\n *\n * @param {string} str\n * @param {(string|Object)} [chars] The characters to trim off. Defaults to a space if left blank.\n * @returns {string}\n */\n rtrim: function (str, chars) {\n if (!str) {\n return str;\n }\n if (typeof chars === 'undefined') {\n chars = ' \\t\\n\\r\\0\\x0B';\n }\n var re = new RegExp('[' + Craft.escapeChars(chars) + ']+$');\n return str.replace(re, '');\n },\n\n /**\n * Trim characters off of the beginning and end of a string.\n *\n * @param {string} str\n * @param {(string|Object)} [chars] The characters to trim off. Defaults to a space if left blank.\n * @returns {string}\n */\n trim: function (str, chars) {\n str = Craft.ltrim(str, chars);\n str = Craft.rtrim(str, chars);\n return str;\n },\n\n /**\n * Returns whether a string starts with another string.\n *\n * @param {string} str\n * @param {string} substr\n * @returns {boolean}\n */\n startsWith: function (str, substr) {\n return str.substring(0, substr.length) === substr;\n },\n\n /**\n * @callback filterArrayCallback\n * @param {*} value\n * @param {number} index\n * @return {boolean}\n */\n /**\n * Filters an array.\n *\n * @param {Object} arr\n * @param {filterArrayCallback} [callback] A user-defined callback function. If null, we'll just remove any elements that equate to false.\n * @returns {Array}\n */\n filterArray: function (arr, callback) {\n var filtered = [];\n\n for (var i = 0; i < arr.length; i++) {\n var include;\n\n if (typeof callback === 'function') {\n include = callback(arr[i], i);\n } else {\n include = arr[i];\n }\n\n if (include) {\n filtered.push(arr[i]);\n }\n }\n\n return filtered;\n },\n\n /**\n * Returns whether an element is in an array (unlike jQuery.inArray(), which returns the element’s index, or -1).\n *\n * @param {*} elem\n * @param {(Object|Array)} arr\n * @returns {boolean}\n */\n inArray: function (elem, arr) {\n if ($.isPlainObject(arr)) {\n arr = Object.values(arr);\n }\n return arr.includes(elem);\n },\n\n /**\n * Removes an element from an array.\n *\n * @param {*} elem\n * @param {Array} arr\n * @returns {boolean} Whether the element could be found or not.\n */\n removeFromArray: function (elem, arr) {\n var index = $.inArray(elem, arr);\n if (index !== -1) {\n arr.splice(index, 1);\n return true;\n } else {\n return false;\n }\n },\n\n /**\n * Returns the last element in an array.\n *\n * @param {Array} arr\n * @returns {*}\n */\n getLast: function (arr) {\n if (!arr.length) {\n return null;\n } else {\n return arr[arr.length - 1];\n }\n },\n\n /**\n * Makes the first character of a string uppercase.\n *\n * @param {string} str\n * @returns {string}\n */\n uppercaseFirst: function (str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n },\n\n /**\n * Makes the first character of a string lowercase.\n *\n * @param {string} str\n * @returns {string}\n */\n lowercaseFirst: function (str) {\n return str.charAt(0).toLowerCase() + str.slice(1);\n },\n\n parseUrl: function (url) {\n var m = url.match(\n /^(?:(https?):\\/\\/|\\/\\/)([^\\/\\:]*)(?:\\:(\\d+))?(\\/[^\\?]*)?(?:\\?([^#]*))?(#.*)?/\n );\n if (!m) {\n return {};\n }\n return {\n scheme: m[1],\n host: m[2] + (m[3] ? ':' + m[3] : ''),\n hostname: m[2],\n port: m[3] || null,\n path: m[4] || '/',\n query: m[5] || null,\n hash: m[6] || null,\n };\n },\n\n getQueryParams: function () {\n return Object.fromEntries(\n new URLSearchParams(window.location.search).entries()\n );\n },\n\n getQueryParam: function (name) {\n // h/t https://stackoverflow.com/a/901144/1688568\n const params = new Proxy(new URLSearchParams(window.location.search), {\n get: (searchParams, prop) => searchParams.get(prop),\n });\n return params[name];\n },\n\n isSameHost: function (url) {\n var requestUrlInfo = this.parseUrl(document.location.href);\n if (!requestUrlInfo) {\n return false;\n }\n var urlInfo = this.parseUrl(url);\n if (!urlInfo) {\n return false;\n }\n return requestUrlInfo.host === urlInfo.host;\n },\n\n /**\n * Converts a number of seconds into a human-facing time duration.\n */\n secondsToHumanTimeDuration: function (seconds, showSeconds) {\n if (typeof showSeconds === 'undefined') {\n showSeconds = true;\n }\n\n var secondsInWeek = 604800,\n secondsInDay = 86400,\n secondsInHour = 3600,\n secondsInMinute = 60;\n\n var weeks = Math.floor(seconds / secondsInWeek);\n seconds = seconds % secondsInWeek;\n\n var days = Math.floor(seconds / secondsInDay);\n seconds = seconds % secondsInDay;\n\n var hours = Math.floor(seconds / secondsInHour);\n seconds = seconds % secondsInHour;\n\n var minutes;\n\n if (showSeconds) {\n minutes = Math.floor(seconds / secondsInMinute);\n seconds = seconds % secondsInMinute;\n } else {\n minutes = Math.round(seconds / secondsInMinute);\n seconds = 0;\n }\n\n var timeComponents = [];\n\n if (weeks) {\n timeComponents.push(\n weeks +\n ' ' +\n (weeks === 1 ? Craft.t('app', 'week') : Craft.t('app', 'weeks'))\n );\n }\n\n if (days) {\n timeComponents.push(\n days +\n ' ' +\n (days === 1 ? Craft.t('app', 'day') : Craft.t('app', 'days'))\n );\n }\n\n if (hours) {\n timeComponents.push(\n hours +\n ' ' +\n (hours === 1 ? Craft.t('app', 'hour') : Craft.t('app', 'hours'))\n );\n }\n\n if (minutes || (!showSeconds && !weeks && !days && !hours)) {\n timeComponents.push(\n minutes +\n ' ' +\n (minutes === 1 ? Craft.t('app', 'minute') : Craft.t('app', 'minutes'))\n );\n }\n\n if (seconds || (showSeconds && !weeks && !days && !hours && !minutes)) {\n timeComponents.push(\n seconds +\n ' ' +\n (seconds === 1 ? Craft.t('app', 'second') : Craft.t('app', 'seconds'))\n );\n }\n\n return timeComponents.join(', ');\n },\n\n /**\n * Converts extended ASCII characters to ASCII.\n *\n * @param {string} str\n * @param {Object} [charMap]\n * @returns {string}\n */\n asciiString: function (str, charMap) {\n // Normalize NFD chars to NFC\n str = str.normalize('NFC');\n\n var asciiStr = '';\n var char;\n\n for (var i = 0; i < str.length; i++) {\n char = str.charAt(i);\n asciiStr +=\n typeof (charMap || Craft.asciiCharMap)[char] === 'string'\n ? (charMap || Craft.asciiCharMap)[char]\n : char;\n }\n\n return asciiStr;\n },\n\n uuid: function () {\n if (typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n\n // h/t https://stackoverflow.com/a/2117523/1688568\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) =>\n (\n c ^\n (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))\n ).toString(16)\n );\n },\n\n /**\n * @param {string} name\n * @param {string} [namespace]\n * @returns {string}\n */\n namespaceInputName: function (name, namespace) {\n if (!namespace) {\n return name;\n }\n\n return name.replace(/([^'\"\\[\\]]+)([^'\"]*)/, `${namespace}[$1]$2`);\n },\n\n /**\n * @param {string} id\n * @param {string} [namespace]\n * @returns {string}\n */\n namespaceId: function (id, namespace) {\n return Craft.formatInputId(namespace ? `${namespace}-${id}` : id);\n },\n\n randomString: function (length) {\n // h/t https://stackoverflow.com/a/1349426/1688568\n var result = '';\n var characters =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n for (var i = 0; i < length; i++) {\n result += characters.charAt(Math.floor(Math.random() * 62));\n }\n return result;\n },\n\n /**\n * Creates a validation error list.\n *\n * @param {Object} errors\n * @returns {jQuery}\n */\n createErrorList: function (errors) {\n var $ul = $(document.createElement('ul')).addClass('errors');\n\n for (var i = 0; i < errors.length; i++) {\n var $li = $(document.createElement('li'));\n $li.appendTo($ul);\n $li.html(errors[i]);\n }\n\n return $ul;\n },\n\n /**\n * Appends HTML to the page `<head>`.\n *\n * @param {string} html\n */\n appendHeadHtml: function (html) {\n if (!html) {\n return;\n }\n\n // Prune out any link tags that are already included\n var $existingCss = $('link[href]');\n\n if ($existingCss.length) {\n var existingCss = [];\n var href;\n\n for (var i = 0; i < $existingCss.length; i++) {\n href = $existingCss.eq(i).attr('href').replace(/&/g, '&');\n existingCss.push(Craft.escapeRegex(href));\n }\n\n const regexp = new RegExp(\n '<link\\\\s[^>]*href=\"(?:' + existingCss.join('|') + ')\".*?></link>',\n 'g'\n );\n\n html = html.replace(regexp, '');\n }\n\n $('head').append(html);\n },\n\n /**\n * Appends HTML to the page `<body>`.\n *\n * @param {string} html\n */\n appendBodyHtml: function (html) {\n if (!html) {\n return;\n }\n\n // Prune out any script tags that are already included\n var $existingJs = $('script[src]');\n\n if ($existingJs.length) {\n var existingJs = [];\n var src;\n\n for (var i = 0; i < $existingJs.length; i++) {\n src = $existingJs.eq(i).attr('src').replace(/&/g, '&');\n existingJs.push(Craft.escapeRegex(src));\n }\n\n var regexp = new RegExp(\n '<script\\\\s[^>]*src=\"(?:' + existingJs.join('|') + ')\".*?></script>',\n 'g'\n );\n\n html = html.replace(regexp, '');\n }\n\n Garnish.$bod.append(html);\n },\n\n /**\n * Appends HTML to the page `<body>`.\n *\n * @deprecated in 4.0.0. `appendBodyHtml()` should be used instead\n */\n appendFootHtml: function (html) {\n console.warn(\n 'Craft.appendFootHtml() is deprecated. Craft.appendBodyHtml() should be used instead.'\n );\n this.appendBodyHtml(html);\n },\n\n /**\n * Initializes any common UI elements in a given container.\n *\n * @param {Object} $container\n */\n initUiElements: function ($container) {\n $('.grid', $container).grid();\n $('.info', $container).infoicon();\n $('.checkbox-select', $container).checkboxselect();\n $('.fieldtoggle', $container).fieldtoggle();\n $('.lightswitch', $container).lightswitch();\n $('.nicetext', $container).nicetext();\n $('.formsubmit', $container).formsubmit();\n $('.menubtn:not([data-disclosure-trigger])', $container).menubtn();\n $('[data-disclosure-trigger]', $container).disclosureMenu();\n $('.datetimewrapper', $container).datetime();\n $(\n '.datewrapper > input[type=\"date\"], .timewrapper > input[type=\"time\"]',\n $container\n ).datetimeinput();\n\n // Open outbound links in new windows\n // hat tip: https://stackoverflow.com/a/2911045/1688568\n $('a', $container).each(function () {\n if (\n this.hostname.length &&\n this.hostname !== location.hostname &&\n typeof $(this).attr('target') === 'undefined'\n ) {\n $(this).attr('rel', 'noopener').attr('target', '_blank');\n }\n });\n },\n\n _elementIndexClasses: {},\n _elementSelectorModalClasses: {},\n _elementEditorClasses: {},\n\n /**\n * Registers an element index class for a given element type.\n *\n * @param {string} elementType\n * @param {function} func\n */\n registerElementIndexClass: function (elementType, func) {\n if (typeof this._elementIndexClasses[elementType] !== 'undefined') {\n throw (\n 'An element index class has already been registered for the element type “' +\n elementType +\n '”.'\n );\n }\n\n this._elementIndexClasses[elementType] = func;\n },\n\n /**\n * Registers an element selector modal class for a given element type.\n *\n * @param {string} elementType\n * @param {function} func\n */\n registerElementSelectorModalClass: function (elementType, func) {\n if (typeof this._elementSelectorModalClasses[elementType] !== 'undefined') {\n throw (\n 'An element selector modal class has already been registered for the element type “' +\n elementType +\n '”.'\n );\n }\n\n this._elementSelectorModalClasses[elementType] = func;\n },\n\n /**\n * Registers an element editor class for a given element type.\n *\n * @param {string} elementType\n * @param {function} func\n */\n registerElementEditorClass: function (elementType, func) {\n if (typeof this._elementEditorClasses[elementType] !== 'undefined') {\n throw (\n 'An element editor class has already been registered for the element type “' +\n elementType +\n '”.'\n );\n }\n\n this._elementEditorClasses[elementType] = func;\n },\n\n /**\n * Creates a new element index for a given element type.\n *\n * @param {string} elementType\n * @param {jQuery} $container\n * @param {Object} settings\n * @returns {BaseElementIndex}\n */\n createElementIndex: function (elementType, $container, settings) {\n var func;\n\n if (typeof this._elementIndexClasses[elementType] !== 'undefined') {\n func = this._elementIndexClasses[elementType];\n } else {\n func = Craft.BaseElementIndex;\n }\n\n return new func(elementType, $container, settings);\n },\n\n /**\n * Creates a new element selector modal for a given element type.\n *\n * @param {string} elementType\n * @param {Object} settings\n */\n createElementSelectorModal: function (elementType, settings) {\n var func;\n\n if (typeof this._elementSelectorModalClasses[elementType] !== 'undefined') {\n func = this._elementSelectorModalClasses[elementType];\n } else {\n func = Craft.BaseElementSelectorModal;\n }\n\n return new func(elementType, settings);\n },\n\n /**\n * Creates a new element editor slideout for a given element type.\n *\n * @param {string} elementType\n * @param {(jQuery|HTMLElement|string)} element\n * @param {Object} settings\n */\n createElementEditor: function (elementType, element, settings) {\n // Param mapping\n if (typeof settings === 'undefined' && $.isPlainObject(element)) {\n // (settings)\n settings = element;\n element = null;\n } else if (typeof settings !== 'object') {\n settings = {};\n }\n\n if (!settings.elementType) {\n settings.elementType = elementType;\n }\n\n return new Craft.ElementEditorSlideout(element, settings);\n },\n\n /**\n * Retrieves a value from localStorage if it exists.\n *\n * @param {string} key\n * @param {*} defaultValue\n */\n getLocalStorage: function (key, defaultValue) {\n key = 'Craft-' + Craft.systemUid + '.' + key;\n\n if (\n typeof localStorage !== 'undefined' &&\n typeof localStorage[key] !== 'undefined'\n ) {\n return JSON.parse(localStorage[key]);\n } else {\n return defaultValue;\n }\n },\n\n /**\n * Saves a value to localStorage.\n *\n * @param {string} key\n * @param {*} value\n */\n setLocalStorage: function (key, value) {\n if (typeof localStorage !== 'undefined') {\n key = 'Craft-' + Craft.systemUid + '.' + key;\n\n // localStorage might be filled all the way up.\n // Especially likely if this is a private window in Safari 8+, where localStorage technically exists,\n // but has a max size of 0 bytes.\n try {\n localStorage[key] = JSON.stringify(value);\n } catch (e) {}\n }\n },\n\n /**\n * Removes a value from localStorage.\n * @param {string} key\n */\n removeLocalStorage: function (key) {\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(`Craft-${Craft.systemUid}.${key}`);\n }\n },\n\n /**\n * Returns a cookie value, if it exists, otherwise returns `false`\n * @returns {(string|boolean)}\n */\n getCookie: function (name) {\n // Adapted from https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie\n return document.cookie.replace(\n new RegExp(\n `(?:(?:^|.*;\\\\s*)Craft-${Craft.systemUid}:${name}\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$`\n ),\n '$1'\n );\n },\n\n /**\n * Sets a cookie value.\n * @param {string} name\n * @param {string} value\n * @param {Object} [options]\n * @param {string} [options.path] The cookie path.\n * @param {string} [options.domain] The cookie domain. Defaults to the `defaultCookieDomain` config setting.\n * @param {number} [options.maxAge] The max age of the cookie (in seconds)\n * @param {Date} [options.expires] The expiry date of the cookie. Defaults to none (session-based cookie).\n * @param {boolean} [options.secure] Whether this is a secure cookie. Defaults to the `useSecureCookies`\n * config setting.\n * @param {string} [options.sameSite] The SameSite value (`lax` or `strict`). Defaults to the\n * `sameSiteCookieValue` config setting.\n */\n setCookie: function (name, value, options) {\n options = $.extend({}, this.defaultCookieOptions, options);\n let cookie = `Craft-${Craft.systemUid}:${name}=${encodeURIComponent(\n value\n )}`;\n if (options.path) {\n cookie += `;path=${options.path}`;\n }\n if (options.domain) {\n cookie += `;domain=${options.domain}`;\n }\n if (options.maxAge) {\n cookie += `;max-age-in-seconds=${options.maxAge}`;\n } else if (options.expires) {\n cookie += `;expires=${options.expires.toUTCString()}`;\n }\n if (options.secure) {\n cookie += ';secure';\n }\n document.cookie = cookie;\n },\n\n /**\n * Removes a cookie\n * @param {string} name\n */\n removeCookie: function (name) {\n this.setCookie(name, '', new Date('1970-01-01T00:00:00'));\n },\n\n /**\n * Returns element information from its DOM element.\n *\n * @param {(jQuery|HTMLElement|string)} element\n * @returns {Object}\n */\n getElementInfo: function (element) {\n var $element = $(element);\n\n if (!$element.hasClass('element')) {\n $element = $element.find('.element:first');\n }\n\n return {\n id: $element.data('id'),\n siteId: $element.data('site-id'),\n label: $element.data('label'),\n status: $element.data('status'),\n url: $element.data('url'),\n hasThumb: $element.hasClass('hasthumb'),\n $element: $element,\n };\n },\n\n /**\n * Changes an element to the requested size.\n *\n * @param {(jQuery|HTMLElement|string))} element\n * @param {string} size\n */\n setElementSize: function (element, size) {\n var $element = $(element);\n\n if (size !== 'small' && size !== 'large') {\n size = 'small';\n }\n\n if ($element.hasClass(size)) {\n return;\n }\n\n var otherSize = size === 'small' ? 'large' : 'small';\n\n $element.addClass(size).removeClass(otherSize);\n\n if ($element.hasClass('hasthumb')) {\n var $oldImg = $element.find('> .elementthumb > img'),\n imgSize = size === 'small' ? '30' : '100',\n $newImg = $('<img/>', {\n sizes: imgSize + 'px',\n srcset: $oldImg.attr('srcset') || $oldImg.attr('data-pfsrcset'),\n });\n\n $oldImg.replaceWith($newImg);\n\n picturefill({\n elements: [$newImg[0]],\n });\n }\n },\n\n /**\n * Submits a form.\n * @param {Object} $form\n * @param {Object} [options]\n * @param {string} [options.action] The `action` param value override\n * @param {string} [options.redirect] The `redirect` param value override\n * @param {string} [options.confirm] A confirmation message that should be shown to the user before submit\n * @param {Object} [options.params] Additional params that should be added to the form, defined as name/value pairs\n * @param {Object} [options.data] Additional data to be passed to the submit event\n * @param {boolean} [options.retainScroll] Whether the scroll position should be stored and reapplied on the next page load\n */\n submitForm: function ($form, options) {\n if (typeof options === 'undefined') {\n options = {};\n }\n\n if (options.confirm && !confirm(options.confirm)) {\n return;\n }\n\n if (options.action) {\n $('<input/>', {\n type: 'hidden',\n name: 'action',\n val: options.action,\n }).appendTo($form);\n }\n\n if (options.redirect) {\n $('<input/>', {\n type: 'hidden',\n name: 'redirect',\n val: options.redirect,\n }).appendTo($form);\n }\n\n if (options.params) {\n for (let name in options.params) {\n let value = options.params[name];\n $('<input/>', {\n type: 'hidden',\n name: name,\n val: value,\n }).appendTo($form);\n }\n }\n\n if (options.retainScroll) {\n this.setLocalStorage('scrollY', window.scrollY);\n }\n\n $form.trigger($.extend({type: 'submit'}, options.data));\n },\n\n /**\n * Traps focus within a container, so when focus is tabbed out of it, it’s cycled back into it.\n * @param {Object} container\n */\n trapFocusWithin: function (container) {\n Garnish.trapFocusWithin(container);\n },\n\n /**\n * Sets focus to the first focusable element within a container.\n * @param {Object} container\n */\n setFocusWithin: function (container) {\n Garnish.setFocusWithin(container);\n },\n\n /**\n * Reduces an input’s value to characters that match the given regex pattern.\n * @param {jQuery|HTMLElement} input\n * @param {RegExp} regex\n */\n filterInputVal: function (input, regex) {\n const $input = $(input);\n const val = $input.val();\n let selectionStart = $input[0].selectionStart;\n let newVal = '';\n for (let i = 0; i < val.length; i++) {\n if (val[i].match(regex)) {\n newVal += val[i];\n } else if (i < selectionStart) {\n selectionStart--;\n }\n }\n if (newVal !== val) {\n $input.val(newVal);\n $input[0].setSelectionRange(selectionStart, selectionStart);\n }\n },\n\n /**\n * Reduces an input’s value to numeric characters.\n * @param {jQuery|HTMLElement} input\n * @param {RegExp} regex\n */\n filterNumberInputVal: function (input) {\n this.filterInputVal(input, /[0-9.,\\-]/);\n },\n\n /**\n * Sets/removes attributes on an element.\n *\n * Attributes set to `null` or `false` will be removed.\n *\n * @param {(jQuery|HTMLElement|string)} element\n * @param {Object} attributes\n */\n setElementAttributes: function (element, attributes) {\n const $element = $(element);\n\n for (let name in attributes) {\n if (!attributes.hasOwnProperty(name)) {\n continue;\n }\n\n let value = attributes[name];\n\n if (value === null || value === false) {\n $element.removeAttr(name);\n } else if (value === true) {\n $element.attr(name, '');\n } else if ($.isArray(value) || $.isPlainObject(value)) {\n if (Craft.dataAttributes.includes(name)) {\n // Make sure it's an object\n value = Object.assign({}, value);\n for (let n in value) {\n if (!value.hasOwnProperty(n)) {\n continue;\n }\n let subValue = value[n];\n if (subValue === null || subValue === false) {\n continue;\n }\n if ($.isPlainObject(subValue) || $.isArray(subValue)) {\n subValue = JSON.stringify(subValue);\n } else if (subValue === true) {\n subValue = '';\n } else {\n subValue = this.escapeHtml(subValue);\n }\n $element.attr(`${name}-${n}`, subValue);\n }\n } else if (name === 'class') {\n // Make sure it's an array\n if ($.isPlainObject(value)) {\n value = Object.values(value);\n }\n for (let c of value) {\n $element.addClass(c);\n }\n } else if (name === 'style') {\n $element.css(value);\n } else {\n $element.attr(name, JSON.stringify(value));\n }\n } else {\n $element.attr(name, this.escapeHtml(value));\n }\n }\n },\n\n isVisible: function () {\n return (\n typeof document.visibilityState === 'undefined' ||\n document.visibilityState === 'visible'\n );\n },\n\n useMobileStyles: function () {\n return Garnish.isMobileBrowser() || document.body.clientWidth < 600;\n },\n});\n\n// -------------------------------------------\n// Broadcast channel\n// -------------------------------------------\n\nCraft.pageId = Craft.uuid();\n\nif (typeof BroadcastChannel !== 'undefined') {\n const channelName = `CraftCMS:${Craft.appId}`;\n Craft.broadcaster = new BroadcastChannel(channelName);\n Craft.messageReceiver = new BroadcastChannel(channelName);\n\n Craft.messageReceiver.addEventListener('message', (ev) => {\n if (ev.data.event === 'saveElement') {\n // Are there any instances of the same element on the page?\n const $elements = $(\n `div.element[data-id=\"${ev.data.id}\"][data-settings]`\n );\n if (!$elements.length) {\n return;\n }\n const data = {\n type: $elements.data('type'),\n id: ev.data.id,\n instances: [],\n };\n for (let i = 0; i < $elements.length; i++) {\n const $element = $elements.eq(i);\n data.instances.push(\n Object.assign(\n {\n siteId: $element.data('site-id'),\n },\n $element.data('settings')\n )\n );\n }\n Craft.sendActionRequest('POST', 'app/render-element', {data}).then(\n ({data}) => {\n for (let i = 0; i < $elements.length; i++) {\n const $element = $elements.eq(i);\n if (data.elementHtml[i]) {\n const $replacement = $(data.elementHtml[i]);\n for (let attribute of $replacement[0].attributes) {\n if (attribute.name === 'class') {\n $element.addClass(attribute.value);\n } else {\n $element.attr(attribute.name, attribute.value);\n }\n }\n const $inputs = $element.find('input,button').detach();\n $element.html($replacement.html());\n if ($inputs.length) {\n $inputs.prependTo($element);\n }\n }\n }\n new Craft.ElementThumbLoader().load($elements);\n }\n );\n }\n });\n}\n\n// -------------------------------------------\n// Custom jQuery plugins\n// -------------------------------------------\n\n$.extend($.fn, {\n animateLeft: function (pos, duration, easing, complete) {\n if (Craft.orientation === 'ltr') {\n return this.velocity({left: pos}, duration, easing, complete);\n } else {\n return this.velocity({right: pos}, duration, easing, complete);\n }\n },\n\n animateRight: function (pos, duration, easing, complete) {\n if (Craft.orientation === 'ltr') {\n return this.velocity({right: pos}, duration, easing, complete);\n } else {\n return this.velocity({left: pos}, duration, easing, complete);\n }\n },\n\n /**\n * Disables elements by adding a .disabled class and preventing them from receiving focus.\n */\n disable: function () {\n return this.each(function () {\n var $elem = $(this);\n $elem.addClass('disabled');\n\n if ($elem.data('activatable')) {\n $elem.removeAttr('tabindex');\n }\n });\n },\n\n /**\n * Enables elements by removing their .disabled class and allowing them to receive focus.\n */\n enable: function () {\n return this.each(function () {\n var $elem = $(this);\n $elem.removeClass('disabled');\n\n if ($elem.data('activatable')) {\n $elem.attr('tabindex', '0');\n }\n });\n },\n\n /**\n * Sets the element as the container of a grid.\n */\n grid: function () {\n return this.each(function () {\n var $container = $(this),\n settings = {};\n\n if ($container.data('item-selector')) {\n settings.itemSelector = $container.data('item-selector');\n }\n if ($container.data('cols')) {\n settings.cols = parseInt($container.data('cols'));\n }\n if ($container.data('max-cols')) {\n settings.maxCols = parseInt($container.data('max-cols'));\n }\n if ($container.data('min-col-width')) {\n settings.minColWidth = parseInt($container.data('min-col-width'));\n }\n if ($container.data('mode')) {\n settings.mode = $container.data('mode');\n }\n if ($container.data('fill-mode')) {\n settings.fillMode = $container.data('fill-mode');\n }\n if ($container.data('col-class')) {\n settings.colClass = $container.data('col-class');\n }\n if ($container.data('snap-to-grid')) {\n settings.snapToGrid = !!$container.data('snap-to-grid');\n }\n\n new Craft.Grid(this, settings);\n });\n },\n\n infoicon: function () {\n return this.each(function () {\n new Craft.InfoIcon(this);\n });\n },\n\n /**\n * Sets the element as a container for a checkbox select.\n */\n checkboxselect: function () {\n return this.each(function () {\n if (!$.data(this, 'checkboxselect')) {\n new Garnish.CheckboxSelect(this);\n }\n });\n },\n\n /**\n * Sets the element as a field toggle trigger.\n */\n fieldtoggle: function () {\n return this.each(function () {\n if (!$.data(this, 'fieldtoggle')) {\n new Craft.FieldToggle(this);\n }\n });\n },\n\n lightswitch: function (settings, settingName, settingValue) {\n // param mapping\n if (settings === 'settings') {\n if (typeof settingName === 'string') {\n settings = {};\n settings[settingName] = settingValue;\n } else {\n settings = settingName;\n }\n\n return this.each(function () {\n var obj = $.data(this, 'lightswitch');\n if (obj) {\n obj.setSettings(settings);\n }\n });\n } else {\n if (!$.isPlainObject(settings)) {\n settings = {};\n }\n\n return this.each(function () {\n var thisSettings = $.extend({}, settings);\n\n if (Garnish.hasAttr(this, 'data-value')) {\n thisSettings.value = $(this).attr('data-value');\n }\n\n if (Garnish.hasAttr(this, 'data-indeterminate-value')) {\n thisSettings.indeterminateValue = $(this).attr(\n 'data-indeterminate-value'\n );\n }\n\n if (!$.data(this, 'lightswitch')) {\n new Craft.LightSwitch(this, thisSettings);\n }\n });\n }\n },\n\n nicetext: function () {\n return this.each(function () {\n if (!$.data(this, 'nicetext')) {\n new Garnish.NiceText(this);\n }\n });\n },\n\n formsubmit: function () {\n // Secondary form submit buttons\n return this.on('click', function (ev) {\n let $btn = $(ev.currentTarget);\n let params = $btn.data('params') || {};\n if ($btn.data('param')) {\n params[$btn.data('param')] = $btn.data('value');\n }\n\n let $anchor = $btn.data('menu') ? $btn.data('menu').$anchor : $btn;\n let $form = $anchor.attr('data-form')\n ? $('#' + $anchor.attr('data-form'))\n : $anchor.closest('form');\n\n Craft.submitForm($form, {\n confirm: $btn.data('confirm'),\n action: $btn.data('action'),\n redirect: $btn.data('redirect'),\n params: params,\n data: $.extend(\n {\n customTrigger: $btn,\n },\n $btn.data('event-data')\n ),\n });\n });\n },\n\n menubtn: function () {\n return this.each(function () {\n var $btn = $(this);\n\n if (!$btn.data('menubtn') && $btn.next().hasClass('menu')) {\n var settings = {};\n\n if ($btn.data('menu-anchor')) {\n settings.menuAnchor = $btn.data('menu-anchor');\n }\n\n new Garnish.MenuBtn($btn, settings);\n }\n });\n },\n\n disclosureMenu: function () {\n return this.each(function () {\n const $trigger = $(this);\n // Only instantiate if it's not already a disclosure trigger, and it references a disclosure content\n if (!$trigger.data('trigger') && $trigger.attr('aria-controls')) {\n new Garnish.DisclosureMenu($trigger);\n }\n });\n },\n\n datetime: function () {\n return this.each(function () {\n let $wrapper = $(this);\n let $inputs = $wrapper.find('input:not([name$=\"[timezone]\"])');\n let checkValue = () => {\n let hasValue = false;\n for (let i = 0; i < $inputs.length; i++) {\n if ($inputs.eq(i).val()) {\n hasValue = true;\n break;\n }\n }\n if (hasValue) {\n if (!$wrapper.children('.clear-btn').length) {\n let $btn = $('<button/>', {\n type: 'button',\n class: 'clear-btn',\n title: Craft.t('app', 'Clear'),\n 'aria-label': Craft.t('app', 'Clear'),\n })\n .appendTo($wrapper)\n .on('click', () => {\n for (let i = 0; i < $inputs.length; i++) {\n $inputs.eq(i).val('').trigger('input').trigger('change');\n }\n $btn.remove();\n $inputs.first().filter('[type=\"text\"]').focus();\n });\n }\n } else {\n $wrapper.children('.clear-btn').remove();\n }\n };\n $inputs.on('change', checkValue);\n checkValue();\n });\n },\n\n datetimeinput: function () {\n return this.each(function () {\n const $input = $(this);\n const checkValue = () => {\n if ($input.val() === '') {\n $input.addClass('empty-value');\n } else {\n $input.removeClass('empty-value');\n }\n };\n $input.on('input', checkValue);\n checkValue();\n });\n },\n});\n\n// Override Garnish.NiceText.charsLeftHtml() to be more accessible\nGarnish.NiceText.charsLeftHtml = (charsLeft) => {\n return Craft.t(\n 'app',\n '<span class=\"visually-hidden\">Characters left:</span> {chars, number}',\n {\n chars: charsLeft,\n }\n );\n};\n\nGarnish.$doc.ready(function () {\n Craft.initUiElements();\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Customize Sources modal\n */\nCraft.CustomizeSourcesModal = Garnish.Modal.extend({\n elementIndex: null,\n $elementIndexSourcesContainer: null,\n\n $sidebar: null,\n $sidebarToggleBtn: null,\n $sourcesContainer: null,\n $sourcesHeader: null,\n $sourcesHeading: null,\n $sourceSettingsContainer: null,\n $sourceSettingsHeader: null,\n $addSourceMenu: null,\n addSourceMenu: null,\n $footer: null,\n $footerBtnContainer: null,\n $saveBtn: null,\n $cancelBtn: null,\n $loadingSpinner: null,\n\n sourceSort: null,\n sources: null,\n selectedSource: null,\n\n elementTypeName: null,\n baseSortOptions: null,\n availableTableAttributes: null,\n customFieldAttributes: null,\n\n conditionBuilderHtml: null,\n conditionBuilderJs: null,\n userGroups: null,\n\n init: function (elementIndex, settings) {\n this.base();\n\n this.setSettings(settings, {\n resizable: true,\n });\n\n this.elementIndex = elementIndex;\n this.$elementIndexSourcesContainer = this.elementIndex.$sidebar\n .children('nav')\n .children('ul');\n\n const $container = $(\n '<form class=\"modal customize-sources-modal\"/>'\n ).appendTo(Garnish.$bod);\n\n this.$sidebar = $('<div class=\"cs-sidebar block-types\"/>')\n .appendTo($container)\n .attr({\n role: 'navigation',\n 'aria-label': Craft.t('app', 'Source'),\n });\n this.$sourcesContainer = $('<div class=\"sources\">').appendTo(this.$sidebar);\n this.$sourceSettingsContainer = $('<div class=\"source-settings\">').appendTo(\n $container\n );\n\n this.$footer = $('<div class=\"footer\"/>').appendTo($container);\n this.$footerBtnContainer = $('<div class=\"buttons right\"/>').appendTo(\n this.$footer\n );\n this.$cancelBtn = $('<button/>', {\n type: 'button',\n class: 'btn',\n text: Craft.t('app', 'Cancel'),\n }).appendTo(this.$footerBtnContainer);\n this.$saveBtn = Craft.ui\n .createSubmitButton({\n class: 'disabled',\n label: Craft.t('app', 'Save'),\n spinner: true,\n })\n .appendTo(this.$footerBtnContainer);\n\n this.$loadingSpinner = $('<div class=\"spinner\"/>').appendTo(\n this.$sourceSettingsContainer\n );\n\n this.setContainer($container);\n this.show();\n\n Craft.sendActionRequest(\n 'POST',\n 'element-index-settings/get-customize-sources-modal-data',\n {\n data: {\n elementType: this.elementIndex.elementType,\n },\n }\n )\n .then((response) => {\n this.$saveBtn.removeClass('disabled');\n this.buildModal(response.data);\n })\n .finally(() => {\n this.$loadingSpinner.remove();\n Garnish.setFocusWithin(this.$sidebar);\n });\n\n this.addListener(this.$cancelBtn, 'click', 'hide');\n this.addListener(this.$saveBtn, 'click', 'save');\n this.addListener(this.$container, 'submit', 'save');\n },\n\n buildModal: function (response) {\n this.baseSortOptions = response.baseSortOptions;\n this.defaultSortOptions = response.defaultSortOptions;\n this.availableTableAttributes = response.availableTableAttributes;\n this.customFieldAttributes = response.customFieldAttributes;\n this.elementTypeName = response.elementTypeName;\n this.conditionBuilderHtml = response.conditionBuilderHtml;\n this.conditionBuilderJs = response.conditionBuilderJs;\n this.userGroups = response.userGroups;\n\n if (response.headHtml) {\n Craft.appendHeadHtml(response.headHtml);\n }\n if (response.bodyHtml) {\n Craft.appendBodyHtml(response.bodyHtml);\n }\n\n // Create the source item sorter\n this.sourceSort = new Garnish.DragSort({\n handle: '.move',\n axis: 'y',\n });\n\n // Create the sources\n this.sources = [];\n\n for (let i = 0; i < response.sources.length; i++) {\n this.sources.push(this.addSource(response.sources[i]));\n }\n\n if (!this.selectedSource && typeof this.sources[0] !== 'undefined') {\n this.sources[0].select();\n }\n\n const $menuBtnContainer = $(\n '<div class=\"buttons left\" data-wrapper/>'\n ).appendTo(this.$footer);\n const $menuBtn = $('<button/>', {\n type: 'button',\n class: 'btn menubtn add icon',\n 'aria-label': Craft.t('app', 'Add…'),\n 'aria-controls': 'add-source-menu',\n title: Craft.t('app', 'Add…'),\n 'data-disclosure-trigger': '',\n }).appendTo($menuBtnContainer);\n\n this.$addSourceMenu = $('<div/>', {\n id: 'add-source-menu',\n class: 'menu menu--disclosure',\n }).appendTo($menuBtnContainer);\n\n const addSource = (sourceData) => {\n const source = this.addSource(sourceData, true);\n Garnish.scrollContainerToElement(this.$sidebar, source.$item);\n source.select();\n this.addSourceMenu.hide();\n };\n\n const $newHeadingBtn = $('<button/>', {\n type: 'button',\n class: 'menu-option',\n text: Craft.t('app', 'New heading'),\n }).on('click', () => {\n addSource({\n type: 'heading',\n });\n this.focusLabelInput();\n });\n\n const $newCustomSourceBtn = $('<button/>', {\n type: 'button',\n class: 'menu-option',\n text: Craft.t('app', 'New custom source'),\n 'data-type': 'custom',\n }).on('click', () => {\n const sortOptions = this.baseSortOptions.slice(0);\n sortOptions.push(this.defaultSortOptions);\n\n addSource({\n type: 'custom',\n key: `custom:${Craft.uuid()}`,\n sortOptions: sortOptions,\n defaultSort: [sortOptions[0].attr, sortOptions[1].defaultDir],\n tableAttributes: [],\n availableTableAttributes: [],\n });\n this.focusLabelInput();\n });\n\n const $ul = $('<ul/>')\n .append($('<li/>').append($newHeadingBtn))\n .appendTo(this.$addSourceMenu);\n\n if (response.conditionBuilderHtml) {\n $('<li/>').append($newCustomSourceBtn).appendTo($ul);\n }\n\n if (Craft.useMobileStyles()) {\n this.buildSidebarToggleView();\n }\n\n // Add resize listener to enable/disable sidebar toggle view\n this.addListener(Garnish.$win, 'resize', this.updateSidebarView);\n\n this.addSourceMenu = new Garnish.DisclosureMenu($menuBtn);\n },\n\n focusLabelInput: function () {\n this.selectedSource.$labelInput.trigger('focus');\n },\n\n getSourceName: function () {\n return this.selectedSource\n ? this.selectedSource.sourceData.label\n : this.sources[0].sourceData.label;\n },\n\n updateSidebarView: function () {\n if (Craft.useMobileStyles()) {\n if (!this.$sidebarToggleBtn) this.buildSidebarToggleView();\n } else {\n if (this.$sidebarToggleBtn) this.resetView();\n }\n },\n\n resetView: function () {\n if (this.$sourceSettingsHeader) {\n this.$sourceSettingsHeader.remove();\n }\n\n if (this.$sourcesHeader) {\n this.$sourcesHeader.remove();\n }\n\n this.$sidebarToggleBtn = null;\n this.$container.removeClass('sidebar-hidden');\n },\n\n updateHeading: function () {\n if (!this.$sourcesHeading) return;\n\n this.$sourcesHeading.text(this.getSourceName());\n },\n\n buildSidebarToggleView: function () {\n this.$sourcesHeader = $('<div class=\"sources-header\"/>')\n .addClass('sidebar-header')\n .prependTo(this.$sourcesContainer);\n\n this.$sidebarCloseBtn = Craft.ui\n .createButton({\n class: 'nav-close close-btn',\n })\n .attr('aria-label', Craft.t('app', 'Close'))\n .removeClass('btn')\n .appendTo(this.$sourcesHeader);\n\n this.$sourcesHeading = $('<h1 class=\"main-heading\"/>').text(\n this.getSourceName()\n );\n\n this.$sourceSettingsHeader = $('<div class=\"source-settings-header\"/>')\n .addClass('main-header')\n .append(this.$sourcesHeading)\n .prependTo(this.$sourceSettingsContainer);\n\n // Toggle sidebar button\n const buttonConfig = {\n toggle: true,\n controls: 'modal-sidebar',\n class: 'nav-toggle',\n };\n\n this.$sidebarToggleBtn = Craft.ui\n .createButton(buttonConfig)\n .removeClass('btn')\n .attr('aria-label', Craft.t('app', 'Show sidebar'))\n .appendTo(this.$sourceSettingsHeader);\n\n this.closeSidebar();\n\n // Add listeners\n this.addListener(this.$sidebarToggleBtn, 'click', () => {\n this.toggleSidebar();\n });\n\n this.addListener(this.$sidebarCloseBtn, 'click', () => {\n this.toggleSidebar();\n this.$sidebarToggleBtn.trigger('focus');\n });\n },\n\n toggleSidebar: function () {\n if (this.sidebarIsOpen()) {\n this.closeSidebar();\n } else {\n this.openSidebar();\n }\n },\n\n openSidebar: function () {\n this.$container.removeClass('sidebar-hidden');\n this.$sidebarToggleBtn.attr('aria-expanded', 'true');\n this.$sidebar.find(':focusable').first().focus();\n\n Garnish.uiLayerManager.addLayer(this.$sidebar);\n\n Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n this.closeSidebar();\n\n if (Garnish.focusIsInside(this.$sidebar)) {\n this.$sidebarToggleBtn.focus();\n }\n });\n },\n\n closeSidebar: function () {\n this.$container.addClass('sidebar-hidden');\n\n if (this.$sidebarToggleBtn) {\n this.$sidebarToggleBtn.attr('aria-expanded', 'false');\n }\n\n // if sidebar is topmost layer, remove layer\n if (Garnish.uiLayerManager.currentLayer.$container.hasClass('cs-sidebar')) {\n Garnish.uiLayerManager.removeLayer();\n }\n },\n\n sidebarIsOpen: function () {\n return this.$sidebarToggleBtn.attr('aria-expanded') === 'true';\n },\n\n addSource: function (sourceData, isNew) {\n const $item = $('<div class=\"customize-sources-item\"/>').appendTo(\n this.$sourcesContainer\n );\n const $itemLabel = $('<div class=\"label customize-sources-item__btn\"/>')\n .attr({\n tabindex: '0',\n role: 'button',\n })\n .appendTo($item);\n const $itemInput = $('<input type=\"hidden\"/>').appendTo($item);\n $(\n `<a class=\"move icon customize-sources-item__move\" title=\"${Craft.t(\n 'app',\n 'Reorder'\n )}\" role=\"button\"></a>`\n ).appendTo($item);\n\n let source;\n\n if (sourceData.type === 'heading') {\n $item.addClass('heading');\n $itemInput.attr('name', 'sourceOrder[][heading]');\n source = new Craft.CustomizeSourcesModal.Heading(\n this,\n $item,\n $itemLabel,\n $itemInput,\n sourceData,\n isNew\n );\n source.updateItemLabel(sourceData.heading);\n } else {\n $itemInput.attr('name', 'sourceOrder[][key]').val(sourceData.key);\n if (sourceData.type === 'native') {\n source = new Craft.CustomizeSourcesModal.Source(\n this,\n $item,\n $itemLabel,\n $itemInput,\n sourceData,\n isNew\n );\n } else {\n source = new Craft.CustomizeSourcesModal.CustomSource(\n this,\n $item,\n $itemLabel,\n $itemInput,\n sourceData,\n isNew\n );\n }\n source.updateItemLabel(sourceData.label);\n\n // Select this by default?\n if (sourceData.key === this.elementIndex.rootSourceKey) {\n source.select();\n }\n }\n\n this.sourceSort.addItems($item);\n return source;\n },\n\n save: function (ev) {\n if (ev) {\n ev.preventDefault();\n }\n\n if (\n this.$saveBtn.hasClass('disabled') ||\n this.$saveBtn.hasClass('loading')\n ) {\n return;\n }\n\n this.$saveBtn.addClass('loading');\n\n Craft.sendActionRequest(\n 'POST',\n 'element-index-settings/save-customize-sources-modal-settings',\n {\n data:\n this.$container.serialize() +\n `&elementType=${this.elementIndex.elementType}`,\n }\n )\n .then(({data}) => {\n // Figure out which source to select\n let sourceKey = null;\n if (\n this.selectedSource &&\n this.selectedSource.sourceData.key &&\n !data.disabledSourceKeys.includes(this.selectedSource.sourceData.key)\n ) {\n sourceKey = this.selectedSource.sourceData.key;\n } else if (!this.elementIndex.sourceKey) {\n sourceKey = this.elementIndex.$visibleSources.first().data('key');\n }\n\n if (sourceKey) {\n this.elementIndex.selectSourceByKey(sourceKey);\n }\n\n window.location.reload();\n })\n .catch(() => {\n Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n })\n .finally(() => {\n this.$saveBtn.removeClass('loading');\n });\n },\n\n appendIndexSourceItem: function ($sourceItem, $lastSourceItem) {\n if (!$lastSourceItem) {\n $sourceItem.prependTo(this.$elementIndexSourcesContainer);\n } else {\n const isHeading = $sourceItem.hasClass('heading');\n if ($lastSourceItem.hasClass('heading') && !isHeading) {\n // First source to be placed below a new heading\n $sourceItem.appendTo($lastSourceItem.children('ul'));\n } else {\n if (isHeading) {\n // New heading. Swap $lastSourceItem with the top level <li> if it's nested\n const $lastTopLevelSource = $lastSourceItem\n .parentsUntil(this.$elementIndexSourcesContainer, 'li')\n .last();\n if ($lastTopLevelSource.length) {\n $lastSourceItem = $lastTopLevelSource;\n }\n }\n $sourceItem.insertAfter($lastSourceItem);\n }\n }\n },\n\n destroy: function () {\n for (let i = 0; i < this.sources.length; i++) {\n this.sources[i].destroy();\n }\n\n if (this.addSourceMenu) {\n this.addSourceMenu.destroy();\n this.$addSourceMenu.remove();\n }\n\n delete this.sources;\n this.base();\n },\n});\n\nCraft.CustomizeSourcesModal.BaseSource = Garnish.Base.extend({\n modal: null,\n\n $item: null,\n $itemLabel: null,\n $itemInput: null,\n $settingsContainer: null,\n\n sourceData: null,\n isNew: null,\n\n init: function (modal, $item, $itemLabel, $itemInput, sourceData, isNew) {\n this.modal = modal;\n this.$item = $item;\n this.$itemLabel = $itemLabel;\n this.$itemInput = $itemInput;\n this.sourceData = sourceData;\n this.isNew = isNew;\n\n this.$item.data('source', this);\n\n this.addListener(this.$itemLabel, 'click', 'select');\n this.addListener(this.$itemLabel, 'keypress', (e) =>\n Garnish.handleActivatingKeypress(e, this.select.bind(this))\n );\n },\n\n isHeading: function () {\n return false;\n },\n\n isNative: function () {\n return false;\n },\n\n isSelected: function () {\n return this.modal.selectedSource === this;\n },\n\n select: function () {\n if (this.isSelected()) {\n return;\n }\n\n if (this.modal.selectedSource) {\n this.modal.selectedSource.deselect();\n }\n\n this.$item.addClass('sel');\n this.$itemLabel.attr({\n 'aria-current': 'true',\n });\n this.modal.selectedSource = this;\n this.modal.updateHeading();\n\n if (!this.$settingsContainer) {\n this.$settingsContainer = $('<div/>').appendTo(\n this.modal.$sourceSettingsContainer\n );\n this.createSettings(this.$settingsContainer);\n } else {\n this.$settingsContainer.removeClass('hidden');\n }\n\n this.modal.$sourceSettingsContainer.scrollTop(0);\n },\n\n createSettings: function () {},\n\n getIndexSourceItem: function () {},\n\n deselect: function () {\n this.$item.removeClass('sel');\n this.$itemLabel.attr({\n 'aria-current': 'false',\n });\n this.modal.selectedSource = null;\n this.$settingsContainer.addClass('hidden');\n },\n\n updateItemLabel: function (val) {\n if (val) {\n this.$itemLabel.text(val);\n } else {\n this.$itemLabel.html(' ');\n }\n },\n\n destroy: function () {\n this.modal.sourceSort.removeItems(this.$item);\n this.modal.sources.splice($.inArray(this, this.modal.sources), 1);\n\n if (this.isSelected()) {\n this.deselect();\n\n if (this.modal.sources.length) {\n this.modal.sources[0].select();\n }\n\n Garnish.setFocusWithin(this.modal.$sourceSettingsContainer);\n }\n\n this.$item.data('source', null);\n this.$item.remove();\n\n if (this.$settingsContainer) {\n this.$settingsContainer.remove();\n }\n\n this.base();\n },\n});\n\nCraft.CustomizeSourcesModal.Source =\n Craft.CustomizeSourcesModal.BaseSource.extend({\n $sortAttributeSelect: null,\n $sortDirectionPicker: null,\n $sortDirectionInput: null,\n sortDirectionListbox: null,\n\n isNative: function () {\n return true;\n },\n\n createSettings: function ($container) {\n Craft.ui\n .createLightswitchField({\n label: Craft.t('app', 'Enabled'),\n name: `sources[${this.sourceData.key}][enabled]`,\n on: !this.sourceData.disabled,\n })\n .appendTo($container);\n this.createSortField($container);\n this.createTableAttributesField($container);\n },\n\n createSortField: function ($container) {\n const $inputContainer = $('<div class=\"flex\"/>');\n\n const $sortAttributeSelectContainer = Craft.ui\n .createSelect({\n name: `sources[${this.sourceData.key}][defaultSort][0]`,\n options: this.sourceData.sortOptions.map((o) => {\n return {\n label: o.label,\n value: o.attr,\n };\n }),\n value: this.sourceData.defaultSort[0],\n })\n .addClass('fullwidth')\n .appendTo($('<div/>').appendTo($inputContainer));\n\n this.$sortAttributeSelect = $sortAttributeSelectContainer\n .children('select')\n .attr('aria-label', Craft.t('app', 'Sort attribute'));\n\n this.$sortDirectionPicker = $('<section/>', {\n class: 'btngroup btngroup--exclusive',\n 'aria-label': Craft.t('app', 'Sort direction'),\n })\n .append(\n $('<button/>', {\n type: 'button',\n class: 'btn',\n title: Craft.t('app', 'Sort ascending'),\n 'aria-label': Craft.t('app', 'Sort ascending'),\n 'aria-pressed': 'false',\n 'data-icon': 'asc',\n 'data-dir': 'asc',\n })\n )\n .append(\n $('<button/>', {\n type: 'button',\n class: 'btn',\n title: Craft.t('app', 'Sort descending'),\n 'aria-label': Craft.t('app', 'Sort descending'),\n 'aria-pressed': 'false',\n 'data-icon': 'desc',\n 'data-dir': 'desc',\n })\n )\n .appendTo($inputContainer);\n\n this.$sortDirectionInput = $('<input/>', {\n type: 'hidden',\n name: `sources[${this.sourceData.key}][defaultSort][1]`,\n }).appendTo($inputContainer);\n\n this.sortDirectionListbox = new Craft.Listbox(this.$sortDirectionPicker, {\n onChange: ($selectedOption) => {\n this.$sortDirectionInput.val($selectedOption.data('dir'));\n },\n });\n\n this.$sortAttributeSelect.on('change', () => {\n this.handleSortAttributeChange();\n });\n\n this.handleSortAttributeChange(true);\n\n Craft.ui\n .createField($inputContainer, {\n label: Craft.t('app', 'Default Sort'),\n fieldset: true,\n })\n .appendTo($container)\n .addClass('sort-field');\n },\n\n handleSortAttributeChange: function (useDefaultDir) {\n const attr = this.$sortAttributeSelect.val();\n\n if (attr === 'structure') {\n this.sortDirectionListbox.select(0);\n this.sortDirectionListbox.disable();\n this.$sortDirectionPicker.addClass('disabled');\n } else {\n this.sortDirectionListbox.enable();\n this.$sortDirectionPicker.removeClass('disabled');\n\n const dir = useDefaultDir\n ? this.sourceData.defaultSort[1]\n : this.sourceData.sortOptions.find((o) => o.attr === attr).defaultDir;\n this.sortDirectionListbox.select(dir === 'asc' ? 0 : 1);\n }\n },\n\n createTableAttributesField: function ($container) {\n const availableTableAttributes = this.availableTableAttributes();\n\n if (\n !this.sourceData.tableAttributes.length &&\n !availableTableAttributes.length\n ) {\n return;\n }\n\n const $columnCheckboxes = $('<div/>');\n const selectedAttributes = [];\n\n $(\n `<input type=\"hidden\" name=\"sources[${this.sourceData.key}][tableAttributes][]\" value=\"\"/>`\n ).appendTo($columnCheckboxes);\n\n // Add the selected columns, in the selected order\n for (let i = 0; i < this.sourceData.tableAttributes.length; i++) {\n let [key, label] = this.sourceData.tableAttributes[i];\n $columnCheckboxes.append(\n this.createTableColumnOption(key, label, true)\n );\n selectedAttributes.push(key);\n }\n\n // Add the rest\n for (let i = 0; i < availableTableAttributes.length; i++) {\n const [key, label] = availableTableAttributes[i];\n if (!Craft.inArray(key, selectedAttributes)) {\n $columnCheckboxes.append(\n this.createTableColumnOption(key, label, false)\n );\n }\n }\n\n new Garnish.DragSort($columnCheckboxes.children(), {\n handle: '.move',\n axis: 'y',\n });\n\n Craft.ui\n .createField($columnCheckboxes, {\n label: Craft.t('app', 'Default Table Columns'),\n instructions: Craft.t(\n 'app',\n 'Choose which table columns should be visible for this source by default.'\n ),\n })\n .appendTo($container);\n },\n\n availableTableAttributes: function () {\n const attributes = this.modal.availableTableAttributes.slice(0);\n attributes.push(...this.sourceData.availableTableAttributes);\n return attributes;\n },\n\n createTableColumnOption: function (key, label, checked) {\n return $('<div class=\"customize-sources-table-column\"/>')\n .append('<div class=\"icon move\"/>')\n .append(\n Craft.ui.createCheckbox({\n label: Craft.escapeHtml(label),\n name: `sources[${this.sourceData.key}][tableAttributes][]`,\n value: key,\n checked: checked,\n })\n );\n },\n\n getIndexSourceItem: function () {\n const $source = this.modal.elementIndex.getSourceByKey(\n this.sourceData.key\n );\n\n if ($source) {\n return $source.closest('li');\n }\n },\n });\n\nCraft.CustomizeSourcesModal.CustomSource =\n Craft.CustomizeSourcesModal.Source.extend({\n $labelInput: null,\n\n createSettings: function ($container) {\n const $labelField = Craft.ui\n .createTextField({\n label: Craft.t('app', 'Label'),\n name: `sources[${this.sourceData.key}][label]`,\n value: this.sourceData.label,\n })\n .appendTo($container);\n this.$labelInput = $labelField.find('.text');\n const defaultId = `condition${Math.floor(Math.random() * 1000000)}`;\n\n const swapPlaceholders = (str) =>\n str\n .replace(/__ID__/g, defaultId)\n .replace(\n /__SOURCE_KEY__(?=-)/g,\n Craft.formatInputId(this.sourceData.key)\n )\n .replace(/__SOURCE_KEY__/g, this.sourceData.key);\n\n const conditionBuilderHtml =\n this.sourceData.conditionBuilderHtml ||\n swapPlaceholders(this.modal.conditionBuilderHtml);\n const conditionBuilderJs =\n this.sourceData.conditionBuilderJs ||\n swapPlaceholders(this.modal.conditionBuilderJs);\n\n Craft.ui\n .createField($('<div/>').append(conditionBuilderHtml), {\n id: 'criteria',\n label: Craft.t('app', '{type} Criteria', {\n type: this.modal.elementTypeName,\n }),\n })\n .appendTo($container);\n Craft.appendBodyHtml(conditionBuilderJs);\n\n this.createSortField($container);\n this.createTableAttributesField($container);\n\n if (this.modal.userGroups.length) {\n Craft.ui\n .createCheckboxSelectField({\n label: Craft.t('app', 'User Groups'),\n instructions: Craft.t(\n 'app',\n 'Choose which user groups should have access to this source.'\n ),\n name: `sources[${this.sourceData.key}][userGroups]`,\n options: this.modal.userGroups,\n values: this.sourceData.userGroups || '*',\n showAllOption: true,\n })\n .appendTo($container);\n }\n\n $container.append('<hr/>');\n\n this.$deleteBtn = $('<a class=\"error delete\"/>')\n .attr({\n role: 'button',\n tabindex: '0',\n })\n .text(Craft.t('app', 'Delete custom source'))\n .appendTo($container);\n\n this.addListener(this.$labelInput, 'input', 'handleLabelInputChange');\n this.addListener(this.$deleteBtn, 'click', 'destroy');\n this.addListener(this.$deleteBtn, 'keypress', (e) => {\n Garnish.handleActivatingKeypress(e, this.destroy.bind(this));\n });\n },\n\n availableTableAttributes: function () {\n const attributes = this.base();\n if (this.isNew) {\n attributes.push(...this.modal.customFieldAttributes);\n }\n return attributes;\n },\n\n handleLabelInputChange: function () {\n this.updateItemLabel(this.$labelInput.val());\n },\n\n getIndexSourceItem: function () {\n let $source = this.base();\n let $label;\n\n if ($source) {\n $label = $source.find('.label');\n } else {\n $label = $('<span/>', {class: 'label'});\n $source = $('<li/>').append(\n $('<a/>', {\n 'data-key': this.sourceData.key,\n }).append($label)\n );\n }\n\n if (this.$labelInput) {\n let label = Craft.trim(this.$labelInput.val());\n if (label === '') {\n label = Craft.t('app', '(blank)');\n }\n $label.text(label);\n }\n\n return $source;\n },\n });\n\nCraft.CustomizeSourcesModal.Heading =\n Craft.CustomizeSourcesModal.BaseSource.extend({\n $labelInput: null,\n $deleteBtn: null,\n\n isHeading: function () {\n return true;\n },\n\n createSettings: function ($container) {\n const $labelField = Craft.ui\n .createTextField({\n label: Craft.t('app', 'Heading'),\n instructions: Craft.t(\n 'app',\n 'This can be left blank if you just want an unlabeled separator.'\n ),\n value: this.sourceData.heading || '',\n })\n .appendTo($container);\n this.$labelInput = $labelField.find('.text');\n\n $container.append('<hr/>');\n\n this.$deleteBtn = $('<a class=\"error delete\"/>')\n .text(Craft.t('app', 'Delete heading'))\n .attr({\n role: 'button',\n tabindex: '0',\n })\n .appendTo($container);\n\n this.addListener(this.$labelInput, 'input', 'handleLabelInputChange');\n this.addListener(this.$deleteBtn, 'click', 'destroy');\n this.addListener(this.$deleteBtn, 'keypress', (e) => {\n Garnish.handleActivatingKeypress(e, this.destroy.bind(this));\n });\n },\n\n handleLabelInputChange: function () {\n this.updateItemLabel(this.$labelInput.val());\n },\n\n updateItemLabel: function (val) {\n this.$itemLabel.html(\n (val\n ? Craft.escapeHtml(val)\n : `<em>${Craft.t('app', '(blank)')}</em>`) + ' '\n );\n this.$itemInput.val(val);\n },\n\n getIndexSourceItem: function () {\n const label =\n (this.$labelInput ? this.$labelInput.val() : null) ||\n this.sourceData.heading ||\n '';\n return $('<li class=\"heading\"/>')\n .append($('<span/>').text(label))\n .append('<ul/>');\n },\n });\n","/** global: Craft */\n/** global: Garnish */\n/**\n * DataTableSorter\n */\nCraft.DataTableSorter = Garnish.DragSort.extend(\n {\n $table: null,\n\n init: function (table, settings) {\n this.$table = $(table);\n var $rows = this.$table.children('tbody').children(':not(.filler)');\n\n settings = $.extend({}, Craft.DataTableSorter.defaults, settings);\n\n settings.container = this.$table.children('tbody');\n settings.helper = this.getHelper.bind(this);\n settings.caboose = '<tr/>';\n settings.axis = Garnish.Y_AXIS;\n settings.magnetStrength = 4;\n settings.helperLagBase = 1.5;\n\n this.base($rows, settings);\n },\n\n getHelper: function ($helperRow) {\n var $helper = $(\n '<div class=\"' + this.settings.helperClass + '\"/>'\n ).appendTo(Garnish.$bod),\n $table = $('<table/>').appendTo($helper),\n $tbody = $('<tbody/>').appendTo($table);\n\n $helperRow.appendTo($tbody);\n\n // Copy the table width and classes\n $table.width(this.$table.width());\n $table.prop('className', this.$table.prop('className'));\n\n // Copy the column widths\n var $firstRow = this.$table.find('tr:first'),\n $cells = $firstRow.children(),\n $helperCells = $helperRow.children();\n\n for (var i = 0; i < $helperCells.length; i++) {\n $($helperCells[i]).width($($cells[i]).width());\n }\n\n return $helper;\n },\n },\n {\n defaults: {\n handle: '.move',\n helperClass: 'datatablesorthelper',\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Delete User Modal\n */\nCraft.DeleteUserModal = Garnish.Modal.extend(\n {\n id: null,\n userId: null,\n\n $deleteActionRadios: null,\n $deleteSubmitBtn: null,\n\n userSelect: null,\n _deleting: false,\n\n init: function (userId, settings) {\n this.id = Math.floor(Math.random() * 1000000000);\n this.userId = userId;\n settings = $.extend(Craft.DeleteUserModal.defaults, settings);\n\n let $form = $(\n '<form class=\"modal fitted deleteusermodal\" method=\"post\" accept-charset=\"UTF-8\">' +\n Craft.getCsrfInput() +\n '<input type=\"hidden\" name=\"action\" value=\"users/delete-user\"/>' +\n (!Garnish.isArray(this.userId)\n ? '<input type=\"hidden\" name=\"userId\" value=\"' + this.userId + '\"/>'\n : '') +\n (settings.redirect\n ? '<input type=\"hidden\" name=\"redirect\" value=\"' +\n settings.redirect +\n '\"/>'\n : '') +\n '</form>'\n ).appendTo(Garnish.$bod);\n let $body = $(\n '<div class=\"body\">' +\n '<div class=\"content-summary\">' +\n '<p>' +\n Craft.t('app', 'What do you want to do with their content?') +\n '</p>' +\n '<ul class=\"bullets\"></ul>' +\n '</div>' +\n '<div class=\"options\">' +\n '<label><input type=\"radio\" name=\"contentAction\" value=\"transfer\"/> ' +\n Craft.t('app', 'Transfer it to:') +\n '</label>' +\n '<div id=\"transferselect' +\n this.id +\n '\" class=\"elementselect\">' +\n '<div class=\"elements\"></div>' +\n '<button type=\"button\" class=\"btn add icon dashed\">' +\n Craft.t('app', 'Choose a user') +\n '</button>' +\n '</div>' +\n '</div>' +\n '<div>' +\n '<label class=\"error\"><input type=\"radio\" name=\"contentAction\" value=\"delete\"/> ' +\n Craft.t('app', 'Delete their content') +\n '</label>' +\n '</div>' +\n '</div>'\n ).appendTo($form);\n let $buttons = $('<div class=\"buttons right\"/>').appendTo($body);\n let $cancelBtn = $('<button/>', {\n type: 'button',\n class: 'btn',\n text: Craft.t('app', 'Cancel'),\n }).appendTo($buttons);\n\n if (settings.contentSummary.length) {\n for (let i = 0; i < settings.contentSummary.length; i++) {\n $body\n .find('ul')\n .append($('<li/>', {text: settings.contentSummary[i]}));\n }\n } else {\n $body.find('ul').remove();\n }\n\n this.$deleteActionRadios = $body.find('input[type=radio]');\n this.$deleteSubmitBtn = Craft.ui\n .createSubmitButton({\n class: 'disabled',\n label: this._submitBtnLabel(false),\n spinner: true,\n })\n .appendTo($buttons);\n\n var idParam;\n\n if (Garnish.isArray(this.userId)) {\n idParam = ['and'];\n\n for (let i = 0; i < this.userId.length; i++) {\n idParam.push('not ' + this.userId[i]);\n }\n } else {\n idParam = 'not ' + this.userId;\n }\n\n this.userSelect = new Craft.BaseElementSelectInput({\n id: 'transferselect' + this.id,\n name: 'transferContentTo',\n elementType: 'craft\\\\elements\\\\User',\n criteria: {\n id: idParam,\n },\n limit: 1,\n modalSettings: {\n closeOtherModals: false,\n },\n onSelectElements: () => {\n this.updateSizeAndPosition();\n\n if (!this.$deleteActionRadios.first().prop('checked')) {\n this.$deleteActionRadios.first().trigger('click');\n } else {\n this.validateDeleteInputs();\n }\n },\n onRemoveElements: this.validateDeleteInputs.bind(this),\n selectable: false,\n editable: false,\n });\n\n this.addListener($cancelBtn, 'click', 'hide');\n\n this.addListener(\n this.$deleteActionRadios,\n 'change',\n 'validateDeleteInputs'\n );\n this.addListener($form, 'submit', 'handleSubmit');\n\n this.base($form, settings);\n },\n\n _submitBtnLabel: function (withContent) {\n let message = withContent\n ? 'Delete {num, plural, =1{user} other{users}} and content'\n : 'Delete {num, plural, =1{user} other{users}}';\n\n return Craft.t('app', message, {\n num: Garnish.isArray(this.userId) ? this.userId.length : 1,\n });\n },\n\n validateDeleteInputs: function () {\n var validates = false;\n\n if (this.$deleteActionRadios.eq(1).prop('checked')) {\n validates = true;\n this.$deleteSubmitBtn.find('.label').text(this._submitBtnLabel(true));\n } else {\n this.$deleteSubmitBtn.find('.label').text(this._submitBtnLabel(false));\n if (this.$deleteActionRadios.eq(0).prop('checked')) {\n validates = !!this.userSelect.totalSelected;\n }\n }\n\n this.updateSizeAndPosition();\n\n if (validates) {\n this.$deleteSubmitBtn.removeClass('disabled');\n } else {\n this.$deleteSubmitBtn.addClass('disabled');\n }\n\n return validates;\n },\n\n handleSubmit: function (ev) {\n if (this._deleting || !this.validateDeleteInputs()) {\n ev.preventDefault();\n return;\n }\n\n this.$deleteSubmitBtn.addClass('loading');\n this.disable();\n this.userSelect.disable();\n this._deleting = true;\n\n // Let the onSubmit callback prevent the form from getting submitted\n try {\n if (this.settings.onSubmit() === false) {\n ev.preventDefault();\n }\n } catch (e) {\n ev.preventDefault();\n this.$deleteSubmitBtn.removeClass('loading');\n throw e;\n }\n },\n\n onFadeIn: function () {\n // Auto-focus the first radio\n if (!Garnish.isMobileBrowser(true)) {\n this.$deleteActionRadios.first().trigger('focus');\n }\n\n this.base();\n },\n },\n {\n defaults: {\n contentSummary: [],\n onSubmit: $.noop,\n redirect: null,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Handle Generator\n */\nCraft.DynamicGenerator = Craft.BaseInputGenerator.extend({\n callback: $.noop,\n\n init: function (source, target, callback) {\n this.callback = callback;\n this.base(source, target);\n },\n\n generateTargetValue: function (sourceVal) {\n return this.callback(sourceVal);\n },\n});\n","/* jshint -W083 */\n/**\n * Editable table class\n */\nCraft.EditableTable = Garnish.Base.extend(\n {\n initialized: false,\n\n id: null,\n baseName: null,\n columns: null,\n sorter: null,\n biggestId: -1,\n\n $table: null,\n $tbody: null,\n $addRowBtn: null,\n $tableParent: null,\n $statusMessage: null,\n\n rowCount: 0,\n hasMaxRows: false,\n hasMinRows: false,\n\n radioCheckboxes: null,\n\n init: function (id, baseName, columns, settings) {\n this.id = id;\n this.baseName = baseName;\n this.columns = columns;\n this.setSettings(settings, Craft.EditableTable.defaults);\n this.radioCheckboxes = {};\n\n this.$table = $('#' + id);\n this.$tbody = this.$table.children('tbody');\n this.$tableParent = this.$table.parent();\n this.$statusMessage = this.$tableParent.find('[data-status-message]');\n this.rowCount = this.$tbody.find('tr').length;\n\n // Is this already an editable table?\n if (this.$table.data('editable-table')) {\n console.warn('Double-instantiating an editable table on an element');\n this.$table.data('editable-table').destroy();\n }\n\n this.$table.data('editable-table', this);\n\n this.sorter = new Craft.DataTableSorter(this.$table, {\n helperClass: 'editabletablesorthelper',\n copyDraggeeInputValuesToHelper: true,\n onSortChange: () => {\n this.updateAllRows();\n },\n });\n\n if (this.isVisible()) {\n this.initialize();\n } else {\n // Give everything a chance to initialize\n window.setTimeout(this.initializeIfVisible.bind(this), 500);\n }\n\n if (this.settings.minRows && this.rowCount < this.settings.minRows) {\n for (var i = this.rowCount; i < this.settings.minRows; i++) {\n this.addRow();\n }\n }\n },\n\n isVisible: function () {\n return this.$table.parent().height() > 0;\n },\n\n initialize: function () {\n if (this.initialized) {\n return false;\n }\n\n this.initialized = true;\n this.removeListener(Garnish.$win, 'resize');\n\n var $rows = this.$tbody.children();\n\n for (var i = 0; i < $rows.length; i++) {\n this.createRowObj($rows[i]);\n }\n\n const $container = this.$table.parent('.input');\n if ($container.length && this.$table.width() > $container.width()) {\n $container.css('overflow-x', 'auto');\n }\n\n this.$addRowBtn = this.$table.next('.add');\n this.updateAddRowButton();\n this.addListener(this.$addRowBtn, 'activate', 'addRow');\n return true;\n },\n initializeIfVisible: function () {\n this.removeListener(Garnish.$win, 'resize');\n\n if (this.isVisible()) {\n this.initialize();\n } else {\n this.addListener(Garnish.$win, 'resize', 'initializeIfVisible');\n }\n },\n updateAddRowButton: function () {\n if (!this.canAddRow()) {\n this.$addRowBtn.css('opacity', '0.2');\n this.$addRowBtn.css('pointer-events', 'none');\n this.$addRowBtn.attr('aria-disabled', 'true');\n } else {\n this.$addRowBtn.css('opacity', '1');\n this.$addRowBtn.css('pointer-events', 'auto');\n this.$addRowBtn.attr('aria-disabled', 'false');\n }\n },\n updateAllRows: function () {\n if (this.settings.staticRows) {\n return;\n }\n const $rows = this.$table.find('> tbody > tr');\n for (let i = 0; i < $rows.length; i++) {\n this.updateRow($rows.eq(i));\n }\n },\n updateRow: function ($row) {\n if (this.settings.staticRows) {\n return;\n }\n\n const $deleteBtn = $row.find('button.delete');\n\n if ($deleteBtn.length) {\n $deleteBtn.attr(\n 'aria-label',\n Craft.t('app', 'Delete row {index}', {\n index: $row.index() + 1,\n })\n );\n if (this.canDeleteRow()) {\n $deleteBtn.removeAttr('disabled').removeClass('disabled');\n } else {\n $deleteBtn.attr('disabled', 'disabled').addClass('disabled');\n }\n }\n },\n /**\n * @deprecated\n */\n updateDeleteRowButton: function (rowId) {\n this.updateRow(this.$table.find(`tr[data-id=\"${rowId}\"]`));\n },\n updateStatusMessage: function () {\n this.$statusMessage.empty();\n let message;\n\n if (!this.canAddRow()) {\n message = Craft.t(\n 'app',\n 'Row could not be added. Maximum number of rows reached.'\n );\n } else {\n message = Craft.t(\n 'app',\n 'Row could not be deleted. Minimum number of rows reached.'\n );\n }\n\n setTimeout(() => {\n this.$statusMessage.text(message);\n }, 250);\n },\n canDeleteRow: function () {\n if (!this.settings.allowDelete) {\n return false;\n }\n\n return this.rowCount > this.settings.minRows;\n },\n deleteRow: function (row) {\n if (!this.canDeleteRow()) {\n this.updateStatusMessage();\n return;\n }\n\n this.sorter.removeItems(row.$tr);\n row.$tr.remove();\n\n this.rowCount--;\n\n this.updateAllRows();\n this.updateAddRowButton();\n\n if (this.rowCount === 0) {\n this.$table.addClass('hidden');\n this.$addRowBtn.trigger('focus');\n } else {\n // Focus element in previous row\n this.$tbody.find(':focusable').last().trigger('focus');\n }\n\n // onDeleteRow callback\n this.settings.onDeleteRow(row.$tr);\n\n row.destroy();\n },\n canAddRow: function () {\n if (!this.settings.allowAdd) {\n return false;\n }\n\n if (this.settings.maxRows) {\n return this.rowCount < this.settings.maxRows;\n }\n\n return true;\n },\n addRow: function (focus, prepend) {\n if (!this.canAddRow()) {\n this.updateStatusMessage();\n return;\n }\n\n var rowId = this.settings.rowIdPrefix + (this.biggestId + 1),\n $tr = this.createRow(\n rowId,\n this.columns,\n this.baseName,\n $.extend({}, this.settings.defaultValues)\n );\n\n if (prepend) {\n $tr.prependTo(this.$tbody);\n } else {\n $tr.appendTo(this.$tbody);\n }\n\n var row = this.createRowObj($tr);\n this.sorter.addItems($tr);\n\n // Focus the first input in the row\n if (focus !== false) {\n $tr\n .find('input:visible,textarea:visible,select:visible')\n .first()\n .trigger('focus');\n }\n\n this.rowCount++;\n this.updateAllRows();\n this.updateAddRowButton();\n this.$table.removeClass('hidden');\n\n // onAddRow callback\n this.settings.onAddRow($tr);\n\n return row;\n },\n\n createRow: function (rowId, columns, baseName, values) {\n return Craft.EditableTable.createRow(\n rowId,\n columns,\n baseName,\n values,\n this.settings.allowReorder,\n this.settings.allowDelete\n );\n },\n\n createRowObj: function ($tr) {\n return new Craft.EditableTable.Row(this, $tr);\n },\n\n focusOnPrevRow: function ($tr, tdIndex, blurTd) {\n var $prevTr = $tr.prev('tr');\n var prevRow;\n\n if ($prevTr.length) {\n prevRow = $prevTr.data('editable-table-row');\n } else {\n prevRow = this.addRow(false, true);\n }\n\n // Focus on the same cell in the previous row\n if (!prevRow) {\n return;\n }\n\n if (!prevRow.$tds[tdIndex]) {\n return;\n }\n\n if ($(prevRow.$tds[tdIndex]).hasClass('disabled')) {\n if ($prevTr) {\n this.focusOnPrevRow($prevTr, tdIndex, blurTd);\n }\n return;\n }\n\n var $input = $('textarea,input.text', prevRow.$tds[tdIndex]);\n if ($input.length) {\n $(blurTd).trigger('blur');\n $input.trigger('focus');\n }\n },\n\n focusOnNextRow: function ($tr, tdIndex, blurTd) {\n var $nextTr = $tr.next('tr');\n var nextRow;\n\n if ($nextTr.length) {\n nextRow = $nextTr.data('editable-table-row');\n } else {\n nextRow = this.addRow(false);\n }\n\n // Focus on the same cell in the next row\n if (!nextRow) {\n return;\n }\n\n if (!nextRow.$tds[tdIndex]) {\n return;\n }\n\n if ($(nextRow.$tds[tdIndex]).hasClass('disabled')) {\n if ($nextTr) {\n this.focusOnNextRow($nextTr, tdIndex, blurTd);\n }\n return;\n }\n\n var $input = $('textarea,input.text', nextRow.$tds[tdIndex]);\n if ($input.length) {\n $(blurTd).trigger('blur');\n $input.trigger('focus');\n }\n },\n\n importData: function (data, row, tdIndex) {\n let lines = data.split(/\\r?\\n|\\r/);\n for (let i = 0; i < lines.length; i++) {\n let values = lines[i].split('\\t');\n for (let j = 0; j < values.length; j++) {\n let value = values[j];\n row.$tds\n .eq(tdIndex + j)\n .find('textarea,input[type!=hidden]')\n .val(value)\n .trigger('input');\n }\n\n // move onto the next row\n let $nextTr = row.$tr.next('tr');\n if ($nextTr.length) {\n row = $nextTr.data('editable-table-row');\n } else {\n row = this.addRow(false);\n }\n }\n },\n\n destroy: function () {\n this.$table.removeData('editable-table');\n this.base();\n },\n },\n {\n textualColTypes: [\n 'autosuggest',\n 'color',\n 'date',\n 'email',\n 'multiline',\n 'number',\n 'singleline',\n 'template',\n 'time',\n 'url',\n ],\n defaults: {\n rowIdPrefix: '',\n defaultValues: {},\n allowAdd: false,\n allowReorder: false,\n allowDelete: false,\n minRows: null,\n maxRows: null,\n onAddRow: $.noop,\n onDeleteRow: $.noop,\n },\n\n createRow: function (\n rowId,\n columns,\n baseName,\n values,\n allowReorder,\n allowDelete\n ) {\n var $tr = $('<tr/>', {\n 'data-id': rowId,\n });\n\n for (var colId in columns) {\n if (!columns.hasOwnProperty(colId)) {\n continue;\n }\n\n var col = columns[colId],\n value = typeof values[colId] !== 'undefined' ? values[colId] : '',\n $cell;\n\n if (col.type === 'heading') {\n $cell = $('<th/>', {\n scope: 'row',\n class: col['class'],\n html: value,\n });\n } else {\n var name = baseName + '[' + rowId + '][' + colId + ']';\n\n $cell = $('<td/>', {\n class: `${col.class} ${col.type}-cell`,\n width: col.width,\n });\n\n if (Craft.inArray(col.type, Craft.EditableTable.textualColTypes)) {\n $cell.addClass('textual');\n }\n\n if (col.code) {\n $cell.addClass('code');\n }\n\n switch (col.type) {\n case 'checkbox':\n $('<div class=\"checkbox-wrapper\"/>')\n .append(\n Craft.ui.createCheckbox({\n name: name,\n value: col.value || '1',\n checked: !!value,\n })\n )\n .appendTo($cell);\n break;\n\n case 'color':\n Craft.ui\n .createColorInput({\n name: name,\n value: value,\n small: true,\n })\n .appendTo($cell);\n break;\n\n case 'date':\n Craft.ui\n .createDateInput({\n name: name,\n value: value,\n })\n .appendTo($cell);\n break;\n\n case 'lightswitch':\n Craft.ui\n .createLightswitch({\n name: name,\n value: col.value || '1',\n on: !!value,\n small: true,\n })\n .appendTo($cell);\n break;\n\n case 'select':\n Craft.ui\n .createSelect({\n name: name,\n options: col.options,\n value:\n value ||\n (function () {\n for (var key in col.options) {\n if (\n col.options.hasOwnProperty(key) &&\n col.options[key].default\n ) {\n return typeof col.options[key].value !== 'undefined'\n ? col.options[key].value\n : key;\n }\n }\n return null;\n })(),\n class: 'small',\n })\n .appendTo($cell);\n break;\n\n case 'time':\n Craft.ui\n .createTimeInput({\n name: name,\n value: value,\n })\n .appendTo($cell);\n break;\n\n case 'email':\n case 'url':\n Craft.ui\n .createTextInput({\n name: name,\n value: value,\n type: col.type,\n placeholder: col.placeholder || null,\n })\n .appendTo($cell);\n break;\n\n default:\n $('<textarea/>', {\n name: name,\n rows: col.rows || 1,\n val: value,\n placeholder: col.placeholder,\n }).appendTo($cell);\n }\n }\n\n $cell.appendTo($tr);\n }\n\n if (allowReorder) {\n $('<td/>', {\n class: 'thin action',\n })\n .append(\n $('<a/>', {\n class: 'move icon',\n title: Craft.t('app', 'Reorder'),\n role: 'button',\n type: 'button',\n })\n )\n .appendTo($tr);\n }\n\n if (allowDelete) {\n $('<td/>', {\n class: 'thin action',\n })\n .append(\n $('<button/>', {\n class: 'delete icon',\n title: Craft.t('app', 'Delete'),\n type: 'button',\n })\n )\n .appendTo($tr);\n }\n\n return $tr;\n },\n }\n);\n\n/**\n * Editable table row class\n */\nCraft.EditableTable.Row = Garnish.Base.extend(\n {\n table: null,\n id: null,\n niceTexts: null,\n\n $tr: null,\n $tds: null,\n tds: null,\n $textareas: null,\n $deleteBtn: null,\n\n init: function (table, tr) {\n this.table = table;\n this.$tr = $(tr);\n this.$tds = this.$tr.children();\n this.tds = [];\n this.id = this.$tr.attr('data-id');\n\n this.$tr.data('editable-table-row', this);\n\n // Get the row ID, sans prefix\n var id = parseInt(\n this.id.substring(this.table.settings.rowIdPrefix.length)\n );\n\n if (id > this.table.biggestId) {\n this.table.biggestId = id;\n }\n\n this.$textareas = $();\n this.niceTexts = [];\n var textareasByColId = {};\n\n var i = 0;\n var colId, col, td, $textarea, $checkbox;\n\n for (colId in this.table.columns) {\n if (!this.table.columns.hasOwnProperty(colId)) {\n continue;\n }\n\n col = this.table.columns[colId];\n td = this.tds[colId] = this.$tds[i];\n\n if (Craft.inArray(col.type, Craft.EditableTable.textualColTypes)) {\n $textarea = $('textarea', td);\n this.$textareas = this.$textareas.add($textarea);\n\n this.addListener($textarea, 'focus', 'onTextareaFocus');\n this.addListener($textarea, 'mousedown', 'ignoreNextTextareaFocus');\n\n this.niceTexts.push(\n new Garnish.NiceText($textarea, {\n onHeightChange: this.onTextareaHeightChange.bind(this),\n })\n );\n\n this.addListener(\n $textarea,\n 'keypress',\n {tdIndex: i, type: col.type},\n 'handleKeypress'\n );\n this.addListener(\n $textarea,\n 'input',\n {type: col.type},\n 'validateValue'\n );\n $textarea.trigger('input');\n\n if (col.type !== 'multiline') {\n this.addListener(\n $textarea,\n 'paste',\n {tdIndex: i, type: col.type},\n 'handlePaste'\n );\n }\n\n textareasByColId[colId] = $textarea;\n } else if (col.type === 'checkbox') {\n $checkbox = $('input[type=\"checkbox\"]', td);\n\n if (col.radioMode) {\n if (typeof this.table.radioCheckboxes[colId] === 'undefined') {\n this.table.radioCheckboxes[colId] = [];\n }\n this.table.radioCheckboxes[colId].push($checkbox[0]);\n this.addListener(\n $checkbox,\n 'change',\n {colId},\n 'onRadioCheckboxChange'\n );\n }\n\n if (col.toggle) {\n this.addListener($checkbox, 'change', {colId}, function (ev) {\n this.applyToggleCheckbox(ev.data.colId);\n });\n }\n }\n\n if (!$(td).hasClass('disabled')) {\n this.addListener(td, 'click', {td}, function (ev) {\n if (ev.target === ev.data.td) {\n $(ev.data.td).find('textarea,input,select,.lightswitch').focus();\n }\n });\n }\n\n i++;\n }\n\n // Now that all of the text cells have been nice-ified, let's normalize the heights\n this.onTextareaHeightChange();\n\n // See if we need to apply any checkbox toggles now that we've indexed all the TDs\n for (colId in this.table.columns) {\n if (!this.table.columns.hasOwnProperty(colId)) {\n continue;\n }\n col = this.table.columns[colId];\n if (col.type === 'checkbox' && col.toggle) {\n this.applyToggleCheckbox(colId);\n }\n }\n\n // Now look for any autopopulate columns\n for (colId in this.table.columns) {\n if (!this.table.columns.hasOwnProperty(colId)) {\n continue;\n }\n\n col = this.table.columns[colId];\n\n if (\n col.autopopulate &&\n typeof textareasByColId[col.autopopulate] !== 'undefined' &&\n !textareasByColId[colId].val()\n ) {\n new Craft.HandleGenerator(\n textareasByColId[colId],\n textareasByColId[col.autopopulate],\n {\n allowNonAlphaStart: true,\n }\n );\n }\n }\n\n var $deleteBtn = this.$tr.children().last().find('.delete');\n this.addListener($deleteBtn, 'click', 'deleteRow');\n\n var $inputs = this.$tr.find('input,textarea,select,.lightswitch');\n this.addListener($inputs, 'focus', function (ev) {\n $(ev.currentTarget).closest('td:not(.disabled)').addClass('focus');\n });\n this.addListener($inputs, 'blur', function (ev) {\n $(ev.currentTarget).closest('td').removeClass('focus');\n });\n },\n\n onTextareaFocus: function (ev) {\n this.onTextareaHeightChange();\n\n var $textarea = $(ev.currentTarget);\n\n if ($textarea.data('ignoreNextFocus')) {\n $textarea.data('ignoreNextFocus', false);\n return;\n }\n\n window.setTimeout(function () {\n Craft.selectFullValue($textarea);\n }, 0);\n },\n\n onRadioCheckboxChange: function (ev) {\n if (ev.currentTarget.checked) {\n for (\n var i = 0;\n i < this.table.radioCheckboxes[ev.data.colId].length;\n i++\n ) {\n var checkbox = this.table.radioCheckboxes[ev.data.colId][i];\n checkbox.checked = checkbox === ev.currentTarget;\n }\n }\n },\n\n applyToggleCheckbox: function (checkboxColId) {\n var checkboxCol = this.table.columns[checkboxColId];\n var checked = $('input[type=\"checkbox\"]', this.tds[checkboxColId]).prop(\n 'checked'\n );\n var colId, colIndex, neg;\n for (var i = 0; i < checkboxCol.toggle.length; i++) {\n colId = checkboxCol.toggle[i];\n colIndex = this.table.colum;\n neg = colId[0] === '!';\n if (neg) {\n colId = colId.substring(1);\n }\n if ((checked && !neg) || (!checked && neg)) {\n $(this.tds[colId])\n .removeClass('disabled')\n .find('textarea, input')\n .prop('disabled', false);\n } else {\n $(this.tds[colId])\n .addClass('disabled')\n .find('textarea, input')\n .prop('disabled', true);\n }\n }\n },\n\n ignoreNextTextareaFocus: function (ev) {\n $.data(ev.currentTarget, 'ignoreNextFocus', true);\n },\n\n handleKeypress: function (ev) {\n var keyCode = ev.keyCode ? ev.keyCode : ev.charCode;\n var ctrl = Garnish.isCtrlKeyPressed(ev);\n\n // Going to the next/previous row?\n if (\n keyCode === Garnish.RETURN_KEY &&\n (ev.data.type !== 'multiline' || ctrl)\n ) {\n ev.preventDefault();\n if (ev.shiftKey) {\n this.table.focusOnPrevRow(\n this.$tr,\n ev.data.tdIndex,\n ev.currentTarget\n );\n } else {\n this.table.focusOnNextRow(\n this.$tr,\n ev.data.tdIndex,\n ev.currentTarget\n );\n }\n return;\n }\n },\n\n handlePaste: function (ev) {\n let data = Craft.trim(\n ev.originalEvent.clipboardData.getData('Text'),\n ' \\n\\r'\n );\n if (!data.match(/[\\t\\r\\n]/)) {\n return;\n }\n ev.preventDefault();\n this.table.importData(data, this, ev.data.tdIndex);\n },\n\n validateValue: function (ev) {\n if (ev.data.type === 'multiline') {\n return;\n }\n\n if (ev.data.type === 'number') {\n Craft.filterNumberInputVal(ev.currentTarget);\n return;\n }\n\n // Strip any newlines\n const safeValue = ev.currentTarget.value.replace(/[\\r\\n]/g, '');\n if (safeValue !== ev.currentTarget.value) {\n ev.currentTarget.value = safeValue;\n }\n },\n\n onTextareaHeightChange: function () {\n // Keep all the textareas' heights in sync\n var tallestTextareaHeight = -1;\n\n for (var i = 0; i < this.niceTexts.length; i++) {\n if (this.niceTexts[i].height > tallestTextareaHeight) {\n tallestTextareaHeight = this.niceTexts[i].height;\n }\n }\n\n this.$textareas.css('min-height', tallestTextareaHeight);\n\n // If the <td> is still taller, go with that instead\n var tdHeight = this.$textareas\n .filter(':visible')\n .first()\n .parent()\n .height();\n\n if (tdHeight > tallestTextareaHeight) {\n this.$textareas.css('min-height', tdHeight);\n }\n },\n\n deleteRow: function () {\n this.table.deleteRow(this);\n },\n },\n {\n /** @deprecated */\n numericKeyCodes: [\n 9 /* (tab) */, 8 /* (delete) */, 37, 38, 39, 40 /* (arrows) */, 45,\n 91 /* (minus) */, 46, 190 /* period */, 48, 49, 50, 51, 52, 53, 54, 55,\n 56, 57 /* (0-9) */,\n ],\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Element Action Trigger\n */\nCraft.ElementActionTrigger = Garnish.Base.extend(\n {\n maxLevels: null,\n newChildUrl: null,\n $trigger: null,\n $selectedItems: null,\n triggerEnabled: true,\n\n init: function (settings) {\n if (!$.isPlainObject(settings)) {\n settings = {};\n }\n\n // batch => bulk\n if (typeof settings.batch !== 'undefined') {\n settings.bulk = settings.batch;\n delete settings.batch;\n }\n Object.defineProperty(settings, 'batch', {\n get() {\n return this.bulk;\n },\n set(v) {\n this.bulk = v;\n },\n });\n\n this.setSettings(settings, Craft.ElementActionTrigger.defaults);\n\n this.$trigger = $(\n '#' + settings.type.replace(/[\\[\\]\\\\]+/g, '-') + '-actiontrigger'\n );\n\n // Do we have a custom handler?\n if (this.settings.activate) {\n // Prevent the element index's click handler\n this.$trigger.data('custom-handler', true);\n\n // Is this a custom trigger?\n if (this.$trigger.prop('nodeName') === 'FORM') {\n this.addListener(this.$trigger, 'submit', 'handleTriggerActivation');\n } else {\n this.addListener(this.$trigger, 'click', 'handleTriggerActivation');\n }\n }\n\n this.updateTrigger();\n Craft.elementIndex.on('selectionChange', this.updateTrigger.bind(this));\n },\n\n updateTrigger: function () {\n // Ignore if the last element was just unselected\n if (Craft.elementIndex.getSelectedElements().length === 0) {\n return;\n }\n\n if (this.validateSelection()) {\n this.enableTrigger();\n } else {\n this.disableTrigger();\n }\n },\n\n /**\n * Determines if this action can be performed on the currently selected elements.\n *\n * @returns {boolean}\n */\n validateSelection: function () {\n var valid = true;\n this.$selectedItems = Craft.elementIndex.getSelectedElements();\n\n if (!this.settings.bulk && this.$selectedItems.length > 1) {\n valid = false;\n } else if (typeof this.settings.validateSelection === 'function') {\n valid = this.settings.validateSelection(this.$selectedItems);\n }\n\n return valid;\n },\n\n enableTrigger: function () {\n if (this.triggerEnabled) {\n return;\n }\n\n this.$trigger.removeClass('disabled');\n this.triggerEnabled = true;\n },\n\n disableTrigger: function () {\n if (!this.triggerEnabled) {\n return;\n }\n\n this.$trigger.addClass('disabled');\n this.triggerEnabled = false;\n },\n\n handleTriggerActivation: function (ev) {\n ev.preventDefault();\n ev.stopPropagation();\n\n if (this.triggerEnabled) {\n this.settings.activate(this.$selectedItems);\n }\n },\n },\n {\n defaults: {\n type: null,\n bulk: true,\n validateSelection: null,\n activate: null,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n\n/**\n * Element Editor\n */\nCraft.ElementEditor = Garnish.Base.extend(\n {\n isFullPage: null,\n $container: null,\n $tabContainer: null,\n $contentContainer: null,\n $revisionBtn: null,\n $revisionLabel: null,\n $spinner: null,\n $expandSiteStatusesBtn: null,\n $statusIcon: null,\n $previewBtn: null,\n\n $editMetaBtn: null,\n metaHud: null,\n $nameTextInput: null,\n $saveMetaBtn: null,\n\n $siteStatusPane: null,\n $globalLightswitch: null,\n $siteLightswitches: null,\n $additionalSiteField: null,\n\n siteIds: null,\n newSiteIds: null,\n\n enableAutosave: null,\n lastSerializedValue: null,\n listeningForChanges: false,\n pauseLevel: 0,\n timeout: null,\n cancelToken: null,\n ignoreFailedRequest: false,\n queue: null,\n submittingForm: false,\n\n duplicatedElements: null,\n failed: false,\n httpStatus: null,\n httpError: null,\n\n openingPreview: false,\n preview: null,\n activatedPreviewToken: false,\n previewTokenQueue: null,\n previewLinks: null,\n scrollY: null,\n\n hiddenTipsStorageKey: 'Craft-' + Craft.systemUid + '.TipField.hiddenTips',\n\n get tipDismissBtn() {\n return this.$container.find('.tip-dismiss-btn');\n },\n\n get slideout() {\n return this.$container.data('slideout');\n },\n\n init: function (container, settings) {\n this.$container = $(container);\n\n if (this.$container.prop('tagName') !== 'FORM') {\n throw 'Element editors may only be used with forms.';\n }\n\n if (this.$container.data('elementEditor')) {\n console.warn('Double-instantiating an element editor on an element.');\n this.$container.data('elementEditor').destroy();\n }\n\n this.$container.data('elementEditor', this);\n this.$container.attr('data-element-editor', '');\n\n this.setSettings(settings, Craft.ElementEditor.defaults);\n\n this.isFullPage = this.$container[0] === Craft.cp.$primaryForm[0];\n\n if (this.isFullPage) {\n this.$tabContainer = $('#tabs');\n this.$contentContainer = $('#content');\n } else {\n this.$tabContainer = this.slideout.$tabContainer;\n this.$contentContainer = this.slideout.$content;\n }\n\n this.queue = this._createQueue();\n this.previewTokenQueue = this._createQueue();\n\n this.duplicatedElements = {};\n this.enableAutosave = Craft.autosaveDrafts;\n this.previewLinks = [];\n\n this.siteIds = Object.keys(this.settings.siteStatuses).map((siteId) => {\n return parseInt(siteId);\n });\n\n this.$revisionBtn = this.$container.find('.context-btn');\n this.$revisionLabel = this.$container.find('.revision-label');\n this.$previewBtn = this.$container.find('.preview-btn');\n\n const $spinnerContainer = this.isFullPage\n ? $('#page-title')\n : this.slideout.$toolbar;\n this.$spinner = $('<div/>', {\n class: 'revision-spinner spinner hidden',\n title: Craft.t('app', 'Saving'),\n }).appendTo($spinnerContainer);\n this.$statusIcon = $('<div/>', {\n class: `revision-status ${this.isFullPage ? 'invisible' : 'hidden'}`,\n }).appendTo($spinnerContainer);\n this.$statusMessage = $('<div/>', {\n class: 'revision-status-message visually-hidden',\n 'aria-live': 'polite',\n }).appendTo($spinnerContainer);\n\n this.$expandSiteStatusesBtn = $('.expand-status-btn');\n\n if (this.settings.canEditMultipleSites) {\n this.addListener(\n this.$expandSiteStatusesBtn,\n 'click',\n 'expandSiteStatuses'\n );\n }\n\n if (this.settings.previewTargets.length && this.isFullPage) {\n if (this.settings.enablePreview) {\n this.addListener(this.$previewBtn, 'click', 'openPreview');\n }\n\n const $previewBtnContainer = this.$container.find(\n '.preview-btn-container'\n );\n\n if (this.settings.previewTargets.length === 1) {\n const [target] = this.settings.previewTargets;\n this.createPreviewLink(target)\n .addClass('view-btn btn')\n .attr('aria-label', Craft.t('app', 'View'))\n .appendTo($previewBtnContainer);\n } else {\n this.createShareMenu($previewBtnContainer);\n }\n }\n\n // If this is a revision, we're done here\n if (this.settings.revisionId) {\n return;\n }\n\n // Override the serializer to use our own\n this.$container.data('serializer', () => this.serializeForm(true));\n this.$container.data('initialSerializedValue', this.serializeForm(true));\n\n if (this.isFullPage) {\n this.addListener(this.$container, 'submit', 'handleSubmit');\n }\n\n if (this.settings.isProvisionalDraft) {\n this.initForProvisionalDraft();\n } else if (this.settings.draftId && !this.settings.isUnpublishedDraft) {\n this.initForDraft();\n } else if (!this.settings.canSaveCanonical) {\n // Override the save shortcut to create a draft too\n this.addListener(this.$container, 'submit.saveShortcut', (ev) => {\n if (ev.saveShortcut) {\n ev.preventDefault();\n this.createDraft();\n this.removeListener(this.$container, 'submit.saveShortcut');\n }\n });\n }\n\n this.listenForChanges();\n\n this.addListener(this.$statusIcon, 'click', () => {\n this.showStatusHud(this.$statusIcon);\n });\n\n // handle closing tips\n this.handleDismissibleTips();\n\n if (this.isFullPage && Craft.messageReceiver) {\n // Listen on Craft.broadcaster to ignore any messages sent by this very page\n Craft.broadcaster.addEventListener('message', (ev) => {\n if (\n (ev.data.event === 'saveDraft' &&\n ev.data.canonicalId === this.settings.canonicalId &&\n (ev.data.draftId === this.settings.draftId ||\n (ev.data.isProvisionalDraft && !this.settings.draftId))) ||\n (ev.data.event === 'saveElement' &&\n ev.data.id === this.settings.canonicalId &&\n !this.settings.draftId)\n ) {\n Craft.setLocalStorage('scrollY', window.scrollY);\n window.location.reload();\n } else if (\n ev.data.event === 'deleteDraft' &&\n ev.data.canonicalId === this.settings.canonicalId &&\n ev.data.draftId === this.settings.draftId\n ) {\n const url = new URL(window.location.href);\n url.searchParams.delete('draftId');\n if (url.href !== document.location.href) {\n window.location.href = url;\n } else {\n Craft.setLocalStorage('scrollY', window.scrollY);\n window.location.reload();\n }\n }\n });\n }\n },\n\n _createQueue: function () {\n const queue = new Craft.Queue();\n queue.on('beforeRun', () => {\n this.showSpinner();\n });\n queue.on('afterRun', () => {\n this.hideSpinner();\n });\n return queue;\n },\n\n get namespace() {\n if (this.isFullPage) {\n return null;\n }\n\n return this.slideout.namespace;\n },\n\n namespaceInputName(name) {\n return Craft.namespaceInputName(name, this.namespace);\n },\n\n namespaceId(id) {\n return Craft.namespaceId(id, this.namespace);\n },\n\n listenForChanges: function () {\n if (\n this.listeningForChanges ||\n this.pauseLevel > 0 ||\n !this.enableAutosave ||\n !this.settings.canCreateDrafts\n ) {\n return;\n }\n\n this.listeningForChanges = true;\n\n // Listen for events on the body when editing a full page form, so we don’t miss events from Live Preview\n const $target = this.isFullPage ? Garnish.$bod : this.$container;\n\n this.addListener(\n $target,\n 'keypress,keyup,change,focus,blur,click,mousedown,mouseup',\n (ev) => {\n if ($(ev.target).is(this.statusIcons())) {\n return;\n }\n clearTimeout(this.timeout);\n // If they are typing, wait half a second before checking the form\n if (['keypress', 'keyup', 'change'].includes(ev.type)) {\n this.timeout = setTimeout(this.checkForm.bind(this), 500);\n } else {\n this.checkForm();\n }\n }\n );\n },\n\n stopListeningForChanges: function () {\n if (!this.listeningForChanges) {\n return;\n }\n\n this.removeListener(\n Garnish.$bod,\n 'keypress,keyup,change,focus,blur,click,mousedown,mouseup'\n );\n clearTimeout(this.timeout);\n this.listeningForChanges = false;\n },\n\n pause: function () {\n this.pauseLevel++;\n this.stopListeningForChanges();\n },\n\n resume: function () {\n if (this.pauseLevel === 0) {\n throw 'Craft.ElementEditor::resume() should only be called after pause().';\n }\n\n // Only actually resume operation if this has been called the same\n // number of times that pause() was called\n this.pauseLevel--;\n if (this.pauseLevel === 0) {\n if (this.enableAutosave) {\n this.checkForm();\n this.listenForChanges();\n }\n }\n },\n\n initForProvisionalDraft: function () {\n let $discardButton = this.$container.find('.discard-changes-btn');\n\n if (!$discardButton.length) {\n let initialHeight, scrollTop;\n\n let $noticeContainer;\n if (this.isFullPage) {\n initialHeight = $('#content').height();\n scrollTop = Garnish.$win.scrollTop();\n $noticeContainer = Craft.cp.$noticeContainer;\n } else {\n $noticeContainer = this.$container.find('.so-notice');\n }\n\n const $notice = $('<div/>', {\n class: 'draft-notice',\n })\n .append(\n $('<div/>', {\n class: 'draft-icon',\n 'aria-hidden': 'true',\n 'data-icon': 'edit',\n })\n )\n .append(\n $('<p/>', {\n text: Craft.t('app', 'Showing your unsaved changes.'),\n })\n )\n .appendTo($noticeContainer);\n\n $discardButton = $('<button/>', {\n type: 'button',\n class: 'discard-changes-btn btn',\n text: Craft.t('app', 'Discard'),\n }).appendTo($notice);\n\n if (this.isFullPage) {\n const heightDiff = $('#content').height() - initialHeight;\n Garnish.$win.scrollTop(scrollTop + heightDiff);\n\n // If there isn’t enough content to simulate the same scroll position, slide it down instead\n if (Garnish.$win.scrollTop() === scrollTop) {\n // Disable pointer events until half a second after the animation is complete\n Craft.cp.$contentContainer.css('pointer-events', 'none');\n\n $('#content-header').css('min-height', 'auto');\n const height = $noticeContainer.height();\n $noticeContainer\n .css({height: height - heightDiff, overflow: 'hidden'})\n .velocity({height: height}, 'fast', () => {\n $('#content-header').css('min-height', '');\n $noticeContainer.css({height: '', overflow: ''});\n\n setTimeout(() => {\n Craft.cp.$contentContainer.css('pointer-events', '');\n }, 300);\n });\n }\n }\n }\n\n this.addListener(\n $discardButton,\n 'keypress,keyup,change,focus,blur,click,mousedown,mouseup',\n (ev) => {\n ev.stopPropagation();\n }\n );\n\n this.addListener($discardButton, 'click', () => {\n if (\n confirm(\n Craft.t('app', 'Are you sure you want to discard your changes?')\n )\n ) {\n this.queue.unshift(\n () =>\n new Promise((resolve, reject) => {\n if (this.isFullPage) {\n Craft.submitForm(this.$container, {\n action: 'elements/delete-draft',\n redirect: this.settings.hashedCpEditUrl,\n params: {\n draftId: this.settings.draftId,\n provisional: 1,\n },\n });\n } else {\n Craft.sendActionRequest('POST', 'elements/delete-draft', {\n data: {\n elementId: this.settings.canonicalId,\n draftId: this.settings.draftId,\n provisional: 1,\n },\n })\n .then((response) => {\n Craft.cp.displaySuccess(response.data.message);\n this.slideout.close();\n })\n .catch(reject);\n }\n })\n );\n }\n });\n },\n\n initForDraft: function () {\n // Create the edit draft button\n this.createEditMetaBtn();\n\n if (this.settings.canSaveCanonical) {\n Garnish.uiLayerManager.registerShortcut(\n {\n keyCode: Garnish.S_KEY,\n ctrl: true,\n alt: true,\n },\n () => {\n Craft.submitForm(this.$container, {\n action: 'elements/apply-draft',\n redirect: this.settings.hashedCpEditUrl,\n });\n },\n 0\n );\n }\n },\n\n expandSiteStatuses: function () {\n this.removeListener(this.$expandSiteStatusesBtn, 'click');\n this.$expandSiteStatusesBtn.velocity({opacity: 0}, 'fast', () => {\n this.$expandSiteStatusesBtn.remove();\n });\n\n const $enabledForSiteField = this.$container.find(\n `.enabled-for-site-${this.settings.siteId}-field`\n );\n this.$siteStatusPane = $enabledForSiteField.parent();\n\n // If this is a revision, just show the site statuses statically and be done\n if (this.settings.revisionId) {\n this._getOtherSupportedSites().forEach((s) =>\n this._createSiteStatusField(s)\n );\n return;\n }\n\n $enabledForSiteField.addClass('nested');\n const $globalField = Craft.ui\n .createLightswitchField({\n label: Craft.t('app', 'Enabled for all sites'),\n name: this.namespaceInputName('enabled'),\n })\n .insertBefore($enabledForSiteField);\n $globalField.find('label').css('font-weight', 'bold');\n this.$globalLightswitch = $globalField.find('.lightswitch');\n\n if (!this.settings.revisionId) {\n this._showField($globalField);\n }\n\n // Figure out what the \"Enabled everywhere\" lightswitch would have been set to when the page first loaded\n const siteStatusValues = Object.values(this.settings.siteStatuses);\n const hasEnabled = siteStatusValues.includes(true);\n const hasDisabled = siteStatusValues.includes(false);\n const originalEnabledValue =\n hasEnabled && hasDisabled ? '-' : hasEnabled ? '1' : '';\n const originalSerializedStatus =\n encodeURIComponent(\n this.namespaceInputName(`enabledForSite[${this.settings.siteId}]`)\n ) +\n '=' +\n (this.settings.enabledForSite ? '1' : '');\n\n this.$siteLightswitches = $enabledForSiteField\n .find('.lightswitch')\n .on('change', this._updateGlobalStatus.bind(this));\n\n this._getOtherSupportedSites().forEach((s) =>\n this._createSiteStatusField(s)\n );\n\n let serializedStatuses =\n encodeURIComponent(this.namespaceInputName('enabled')) +\n `=${originalEnabledValue}`;\n for (let i = 0; i < this.$siteLightswitches.length; i++) {\n const $input = this.$siteLightswitches.eq(i).data('lightswitch').$input;\n serializedStatuses +=\n '&' + encodeURIComponent($input.attr('name')) + '=' + $input.val();\n }\n\n this.$container.data(\n 'initialSerializedValue',\n this.$container\n .data('initialSerializedValue')\n .replace(originalSerializedStatus, serializedStatuses)\n );\n\n if (this.lastSerializedValue) {\n this.lastSerializedValue = this.lastSerializedValue.replace(\n originalSerializedStatus,\n serializedStatuses\n );\n }\n\n // Are there additional sites that can be added?\n if (\n this.settings.additionalSites &&\n this.settings.additionalSites.length &&\n this.isFullPage\n ) {\n this._createAddlSiteField();\n }\n\n // Focus on first lightswitch\n this.$globalLightswitch.focus();\n\n this.$globalLightswitch.on('change', this._updateSiteStatuses.bind(this));\n this._updateGlobalStatus();\n },\n\n /**\n * @returns {Array}\n */\n _getOtherSupportedSites: function () {\n return Craft.sites.filter(\n (s) => s.id != this.settings.siteId && this.siteIds.includes(s.id)\n );\n },\n\n _showField: function ($field) {\n const height = $field.height();\n $field\n .css({\n overflow: 'hidden',\n 'min-height': 'auto',\n })\n .height(0)\n .velocity({height}, 'fast', () => {\n $field.css({\n overflow: '',\n height: '',\n 'min-height': '',\n });\n });\n },\n\n _removeField: function ($field) {\n $field\n .css({\n overflow: 'hidden',\n 'min-height': 'auto',\n })\n .velocity({height: 0}, 'fast', () => {\n $field.remove();\n });\n },\n\n _updateGlobalStatus: function () {\n let allEnabled = true,\n allDisabled = true;\n this.$siteLightswitches.each(function () {\n const enabled = $(this).data('lightswitch').on;\n if (enabled) {\n allDisabled = false;\n } else {\n allEnabled = false;\n }\n if (!allEnabled && !allDisabled) {\n return false;\n }\n });\n if (allEnabled) {\n this.$globalLightswitch.data('lightswitch').turnOn(true);\n } else if (allDisabled) {\n this.$globalLightswitch.data('lightswitch').turnOff(true);\n } else {\n this.$globalLightswitch.data('lightswitch').turnIndeterminate(true);\n }\n },\n\n _updateSiteStatuses: function () {\n const enabled = this.$globalLightswitch.data('lightswitch').on;\n this.$siteLightswitches.each(function () {\n if (enabled) {\n $(this).data('lightswitch').turnOn(true);\n } else {\n $(this).data('lightswitch').turnOff(true);\n }\n });\n },\n\n _createSiteStatusField: function (site, status) {\n const $field = Craft.ui.createLightswitchField({\n fieldClass: `enabled-for-site-${site.id}-field`,\n label: site.name,\n name: this.namespaceInputName(`enabledForSite[${site.id}]`),\n on:\n typeof status != 'undefined'\n ? status\n : this.settings.siteStatuses.hasOwnProperty(site.id)\n ? this.settings.siteStatuses[site.id]\n : true,\n disabled: !!this.settings.revisionId,\n });\n\n if (this.$additionalSiteField) {\n $field.insertBefore(this.$additionalSiteField);\n } else {\n $field.appendTo(this.$siteStatusPane);\n }\n\n if (!this.settings.revisionId) {\n $field.addClass('nested');\n const $lightswitch = $field\n .find('.lightswitch')\n .on('change', this._updateGlobalStatus.bind(this));\n this.$siteLightswitches = this.$siteLightswitches.add($lightswitch);\n }\n\n this._showField($field);\n\n return $field;\n },\n\n _createAddlSiteField: function () {\n const additionalSites = Craft.sites.filter((site) => {\n return (\n !this.siteIds.includes(site.id) &&\n this.settings.additionalSites.some((s) => s.siteId == site.id)\n );\n });\n\n if (!additionalSites.length) {\n return;\n }\n\n const selectLabelId = 'add-site-label';\n\n const $addlSiteSelectLabel = $('<span/>', {\n text: Craft.t('app', 'Add a site...'),\n class: 'visually-hidden',\n id: selectLabelId,\n });\n\n const $addlSiteSelectContainer = Craft.ui\n .createSelect({\n options: [\n {label: Craft.t('app', 'Add a site…')},\n ...additionalSites.map((s) => {\n return {label: s.name, value: s.id};\n }),\n ],\n labelledBy: selectLabelId,\n })\n .addClass('fullwidth');\n\n this.$additionalSiteField = Craft.ui\n .createField($addlSiteSelectContainer, {})\n .addClass('nested add')\n .appendTo(this.$siteStatusPane);\n\n $addlSiteSelectLabel.prependTo(this.$additionalSiteField);\n\n const $addlSiteSelect = $addlSiteSelectContainer.find('select');\n\n $addlSiteSelect.on('change', () => {\n const siteId = parseInt($addlSiteSelect.val());\n const site = Craft.sites.find((s) => s.id === siteId);\n\n if (!site) {\n return;\n }\n\n const addlSiteInfo = this.settings.additionalSites.find(\n (s) => s.siteId == site.id\n );\n this._createSiteStatusField(site, addlSiteInfo.enabledByDefault);\n this._updateGlobalStatus();\n\n $addlSiteSelect.val('').find(`option[value=\"${siteId}\"]`).remove();\n\n if (this.newSiteIds === null) {\n this.newSiteIds = [];\n }\n\n this.siteIds.push(siteId);\n this.newSiteIds.push(siteId);\n\n // Was that the last site?\n if ($addlSiteSelect.find('option').length === 1) {\n this._removeField(this.$additionalSiteField);\n }\n });\n\n this._showField(this.$additionalSiteField);\n },\n\n showStatusHud: function (target) {\n let bodyHtml;\n\n if (!this.failed) {\n bodyHtml = `<p>${this._saveSuccessMessage()}</p>`;\n } else {\n bodyHtml = `<p class=\"error\"><strong>${this._saveFailMessage()}</strong></p>`;\n\n if (this.httpError) {\n bodyHtml += `<p class=\"http-error code\">${Craft.escapeHtml(\n this.httpError\n )}</p>`;\n }\n\n if (this.httpStatus === 400) {\n bodyHtml += `<button class=\"btn refresh-btn\">${Craft.t(\n 'app',\n 'Refresh'\n )}</button>`;\n }\n }\n\n const hud = new Garnish.HUD(target, bodyHtml, {\n hudClass: 'hud revision-status-hud',\n onHide: function () {\n hud.destroy();\n },\n });\n\n hud.$mainContainer.find('.refresh-btn').on('click', () => {\n window.location.reload();\n });\n },\n\n /**\n * @returns {string}\n */\n _saveSuccessMessage: function () {\n return this.settings.isProvisionalDraft ||\n this.settings.isUnpublishedDraft\n ? Craft.t('app', 'Your changes have been stored.')\n : Craft.t('app', 'The draft has been saved.');\n },\n\n /**\n * @returns {string}\n */\n _saveFailMessage: function () {\n return this.settings.isProvisionalDraft ||\n this.settings.isUnpublishedDraft\n ? Craft.t('app', 'Your changes could not be stored.')\n : Craft.t('app', 'The draft could not be saved.');\n },\n\n spinners: function () {\n return this.preview\n ? this.$spinner.add(this.preview.$spinner)\n : this.$spinner;\n },\n\n showSpinner: function () {\n this.spinners().removeClass('hidden');\n },\n\n hideSpinner: function () {\n this.spinners().addClass('hidden');\n },\n\n statusIcons: function () {\n return this.preview\n ? this.$statusIcon.add(this.preview.$statusIcon)\n : this.$statusIcon;\n },\n\n statusMessage: function () {\n return this.preview\n ? this.$statusMessage.add(this.preview.$statusMessage)\n : this.$statusMessage;\n },\n\n createEditMetaBtn: function () {\n const $btnGroup = this.$container.find('.context-btngroup');\n this.$editMetaBtn = $('<button/>', {\n type: 'button',\n class: 'btn edit icon',\n 'aria-expanded': 'false',\n 'aria-label': Craft.t('app', 'Edit draft settings'),\n title: Craft.t('app', 'Edit draft settings'),\n }).appendTo($btnGroup);\n $btnGroup.find('.btngroup-btn-last').removeClass('btngroup-btn-last');\n this.addListener(this.$editMetaBtn, 'click', 'showMetaHud');\n },\n\n createPreviewLink: function (target, label) {\n const $a = $('<a/>', {\n href: this.getTokenizedPreviewUrl(target.url, null, false),\n text: label || Craft.t('app', 'View'),\n target: '_blank',\n data: {\n targetUrl: target.url,\n targetLabel: target.label,\n },\n });\n\n this.addListener($a, 'click', () => {\n setTimeout(() => {\n this.activatePreviewToken();\n }, 1);\n });\n\n this.previewLinks.push($a);\n return $a;\n },\n\n updatePreviewLinks: function () {\n this.previewLinks.forEach(($a) => {\n this.updatePreviewLinkHref($a);\n if (this.activatedPreviewToken) {\n this.removeListener($a, 'click');\n }\n });\n },\n\n updatePreviewLinkHref: function ($a) {\n $a.attr(\n 'href',\n this.getTokenizedPreviewUrl($a.data('targetUrl'), null, false)\n );\n },\n\n activatePreviewToken: function () {\n if (this.settings.isLive) {\n // don't do anything yet, but leave the event in case we need it later\n return;\n }\n\n this.activatedPreviewToken = true;\n this.updatePreviewLinks();\n },\n\n createShareMenu: function ($container) {\n const $btn = $('<button/>', {\n type: 'button',\n class: 'view-btn btn menubtn',\n text: Craft.t('app', 'View'),\n }).appendTo($container);\n\n const $menu = $('<div/>', {class: 'menu'}).appendTo($container);\n const $ul = $('<ul/>').appendTo($menu);\n\n this.settings.previewTargets.forEach((target) => {\n $('<li/>')\n .append(this.createPreviewLink(target, target.label))\n .appendTo($ul);\n });\n\n new Garnish.MenuBtn($btn);\n },\n\n getPreviewTokenParams: function () {\n const params = {\n elementType: this.settings.elementType,\n canonicalId: this.settings.canonicalId,\n siteId: this.settings.siteId,\n revisionId: this.settings.revisionId,\n previewToken: this.settings.previewToken,\n };\n\n if (this.settings.draftId && !this.settings.isProvisionalDraft) {\n params.draftId = this.settings.draftId;\n }\n\n return params;\n },\n\n getPreviewToken: function () {\n return this.previewTokenQueue.push(() => {\n return new Promise((resolve, reject) => {\n if (this.activatedPreviewToken) {\n resolve(this.settings.previewToken);\n return;\n }\n\n Craft.sendActionRequest('POST', 'preview/create-token', {\n data: this.getPreviewTokenParams(),\n })\n .then(() => {\n this.activatePreviewToken();\n resolve(this.settings.previewToken);\n })\n .catch(reject);\n });\n });\n },\n\n /**\n * @param {string} url\n * @param {?string} [randoParam]\n * @param {boolean} [asPromise=false]\n * @returns {(Promise|string)}\n */\n getTokenizedPreviewUrl: function (url, randoParam, asPromise) {\n if (typeof asPromise === 'undefined') {\n asPromise = true;\n }\n\n const params = {};\n\n if (randoParam || !this.settings.isLive) {\n // Randomize the URL so CDNs don't return cached pages\n params[randoParam || 'x-craft-preview'] = Craft.randomString(10);\n }\n\n if (this.settings.siteToken) {\n params[Craft.siteToken] = this.settings.siteToken;\n }\n\n // No need for a token if we're looking at a live element\n if (this.settings.isLive) {\n const previewUrl = Craft.getUrl(url, params);\n\n if (asPromise) {\n return new Promise((resolve) => {\n resolve(previewUrl);\n });\n }\n\n return previewUrl;\n }\n\n if (!this.settings.previewToken) {\n throw 'Missing preview token';\n }\n\n params[Craft.tokenParam] = this.settings.previewToken;\n const previewUrl = Craft.getUrl(url, params);\n\n if (this.activatedPreviewToken) {\n if (asPromise) {\n return new Promise((resolve) => {\n resolve(previewUrl);\n });\n }\n\n return previewUrl;\n }\n\n if (asPromise) {\n return new Promise((resolve, reject) => {\n this.getPreviewToken()\n .then(() => {\n resolve(previewUrl);\n })\n .catch(reject);\n });\n }\n\n const createTokenParams = this.getPreviewTokenParams();\n createTokenParams.redirect = previewUrl;\n return Craft.getActionUrl('preview/create-token', createTokenParams);\n },\n\n getPreview: function () {\n if (!this.preview) {\n this.preview = new Craft.Preview(this);\n if (!this.enableAutosave) {\n this.preview.on('open', () => {\n this.enableAutosave = true;\n this.listenForChanges();\n });\n this.preview.on('close', () => {\n this.enableAutosave = false;\n this.stopListeningForChanges();\n\n // Hide the status icon if the save was successful\n const $statusIcons = this.statusIcons();\n if ($statusIcons.hasClass('checkmark-icon')) {\n $statusIcons.addClass('hidden');\n }\n });\n }\n this.preview.on('close', () => {\n if (this.scrollY) {\n window.scrollTo(0, this.scrollY);\n this.scrollY = null;\n }\n });\n }\n return this.preview;\n },\n\n openPreview: function () {\n if (Garnish.hasAttr(this.$previewBtn, 'aria-disabled')) {\n return;\n }\n\n this.$previewBtn.attr('aria-disabled', true);\n this.$previewBtn.addClass('loading');\n\n this.queue.push(\n () =>\n new Promise((resolve, reject) => {\n this.openingPreview = true;\n this.ensureIsDraftOrRevision(true)\n .then(() => {\n this.scrollY = window.scrollY;\n this.$previewBtn.removeAttr('aria-disabled');\n this.$previewBtn.removeClass('loading');\n this.getPreview().open();\n this.openingPreview = false;\n resolve();\n })\n .catch(reject);\n })\n );\n },\n\n ensureIsDraftOrRevision: function (onlyIfChanged) {\n return new Promise((resolve, reject) => {\n if (!this.settings.draftId && !this.settings.revisionId) {\n if (\n onlyIfChanged &&\n this.serializeForm(true) ===\n this.$container.data('initialSerializedValue')\n ) {\n resolve();\n return;\n }\n\n this.createDraft().then(resolve).catch(reject);\n } else {\n resolve();\n }\n });\n },\n\n serializeForm: function (removeActionParams) {\n let data = this.$container.serialize();\n\n if (this.isPreviewActive()) {\n // Replace the temp input with the preview form data\n data = data.replace(\n '__PREVIEW_FIELDS__=1',\n this.preview.$editor.serialize()\n );\n }\n\n if (removeActionParams && !this.settings.isUnpublishedDraft) {\n // Remove action and redirect params\n const actionName = this.namespaceInputName('action');\n const redirectName = this.namespaceInputName('redirect');\n data = data.replace(\n new RegExp(`&${Craft.escapeRegex(actionName)}=[^&]*`),\n ''\n );\n data = data.replace(\n new RegExp(`&${Craft.escapeRegex(redirectName)}=[^&]*`),\n ''\n );\n }\n\n return data;\n },\n\n /**\n * @param {boolean} [force=false]\n * @returns {Promise}\n */\n checkForm: function (force) {\n return this.queue.push(\n () =>\n new Promise((resolve, reject) => {\n // If this isn't a draft and there's no active preview, then there's nothing to check\n if (\n this.settings.revisionId ||\n this.pauseLevel > 0 ||\n !this.enableAutosave ||\n !this.settings.canCreateDrafts\n ) {\n resolve();\n return;\n }\n\n clearTimeout(this.timeout);\n this.timeout = null;\n\n // If we haven't had a chance to fetch the initial data yet, try again in a bit\n if (\n typeof this.$container.data('initialSerializedValue') ===\n 'undefined'\n ) {\n this.timeout = setTimeout(this.checkForm.bind(this), 500);\n return;\n }\n\n // Has anything changed?\n const data = this.serializeForm(true);\n if (\n !force &&\n data ===\n (this.lastSerializedValue ||\n this.$container.data('initialSerializedValue'))\n ) {\n resolve();\n return;\n }\n\n this.saveDraft(data)\n .then(resolve)\n .catch((e) => {\n console.warn('Couldn’t save draft:', e);\n reject(e);\n });\n })\n );\n },\n\n isPreviewActive: function () {\n return this.preview && this.preview.isActive;\n },\n\n createDraft: function () {\n return this.queue.push(\n () =>\n new Promise((resolve, reject) => {\n this.saveDraft(this.serializeForm(true))\n .then(resolve)\n .catch(reject);\n })\n );\n },\n\n /**\n * @param {Object} data\n * @returns {Promise}\n */\n saveDraft: function (data) {\n return new Promise((resolve, reject) => {\n // Ignore if we're already submitting the main form\n if (this.submittingForm) {\n reject('Form already being submitted.');\n return;\n }\n\n this.lastSerializedValue = data;\n this.failed = false;\n this.httpStatus = null;\n this.httpError = null;\n this.cancelToken = axios.CancelToken.source();\n\n this.statusIcons()\n .velocity('stop')\n .css('opacity', '')\n .removeClass('hidden invisible checkmark-icon alert-icon fade-out')\n .addClass('hidden');\n\n // Clear previous status message\n this.statusMessage().empty();\n\n if (this.$saveMetaBtn) {\n this.$saveMetaBtn.addClass('active');\n }\n\n // Prep the data to be saved, keeping track of the first input name for each delta group\n let modifiedFieldNames = [];\n let preparedData = this.prepareData(\n data,\n !this.settings.isUnpublishedDraft\n ? (deltaName, params) => {\n if (params.length) {\n modifiedFieldNames.push(\n decodeURIComponent(params[0].split('=')[0])\n );\n }\n }\n : null\n );\n\n const extraData = {\n [this.namespaceInputName('visibleLayoutElements')]:\n this.settings.visibleLayoutElements,\n };\n\n // Are we saving a provisional draft?\n if (this.settings.isProvisionalDraft || !this.settings.draftId) {\n extraData[this.namespaceInputName('provisional')] = 1;\n }\n\n const selectedTabId = this.$contentContainer\n .children('[data-layout-tab]:not(.hidden)')\n .data('id');\n if (selectedTabId) {\n extraData[this.namespaceInputName('selectedTab')] = selectedTabId;\n }\n\n preparedData += `&${$.param(extraData)}`;\n\n Craft.sendActionRequest('POST', 'elements/save-draft', {\n cancelToken: this.cancelToken.token,\n headers: this._saveHeaders,\n data: preparedData,\n })\n .then((response) => {\n this._afterSaveDraft();\n\n const createdProvisionalDraft = !this.settings.draftId;\n\n if (createdProvisionalDraft) {\n this.settings.isProvisionalDraft = true;\n this.$revisionLabel.append(\n $('<span/>', {\n text: ` — ${Craft.t('app', 'Edited')}`,\n })\n );\n }\n\n if (this.isFullPage) {\n if (response.data.title) {\n this.$container.find('.screen-title').text(response.data.title);\n }\n\n if (response.data.docTitle) {\n document.title = response.data.docTitle;\n }\n }\n\n if (!this.settings.isProvisionalDraft) {\n this.$revisionLabel.text(response.data.draftName);\n this.settings.draftName = response.data.draftName;\n }\n\n let revisionMenu = this.$revisionBtn.data('menubtn')\n ? this.$revisionBtn.data('menubtn').menu\n : null;\n\n // Did we just add a site?\n if (this.newSiteIds) {\n // Do we need to create the revision menu?\n if (!revisionMenu) {\n this.$revisionBtn.removeClass('disabled').addClass('menubtn');\n new Garnish.MenuBtn(this.$revisionBtn);\n revisionMenu = this.$revisionBtn.data('menubtn').menu;\n revisionMenu.$container.removeClass('hidden');\n }\n this.newSiteIds.forEach((siteId) => {\n const $option = revisionMenu.$options.filter(\n `[data-site-id=${siteId}]`\n );\n const siteSettings = this.settings.additionalSites.find(\n (s) => s.siteId == siteId\n );\n if (\n !siteSettings ||\n typeof siteSettings.enabledByDefault === 'undefined' ||\n siteSettings.enabledByDefault\n ) {\n $option\n .find('.status')\n .removeClass('disabled')\n .addClass('enabled');\n }\n const $li = $option.parent().removeClass('hidden');\n $li.closest('.site-group').removeClass('hidden');\n });\n revisionMenu.$container\n .find('.revision-hr')\n .removeClass('hidden');\n this.newSiteIds = null;\n }\n\n if (this.settings.isProvisionalDraft) {\n if (createdProvisionalDraft) {\n // Replace the action\n this.$container\n .find('input.action-input')\n .attr('value', 'elements/apply-draft');\n\n // Update the editor settings\n this.settings.draftId = response.data.draftId;\n this.settings.isLive = false;\n this.previewToken = null;\n\n this.initForProvisionalDraft();\n }\n } else if (revisionMenu) {\n revisionMenu.$options\n .filter('.sel')\n .find('.draft-name')\n .text(response.data.draftName);\n revisionMenu.$options\n .filter('.sel')\n .find('.draft-meta')\n .text(\n response.data.creator\n ? Craft.t('app', 'Saved {timestamp} by {creator}', {\n timestamp: response.data.timestamp,\n creator: response.data.creator,\n })\n : Craft.t('app', 'Saved {timestamp}', {\n timestamp: response.data.timestamp,\n })\n );\n }\n\n // Did the controller send us updated preview targets?\n if (\n response.data.previewTargets &&\n JSON.stringify(response.data.previewTargets) !==\n JSON.stringify(this.settings.previewTargets)\n ) {\n this.updatePreviewTargets(response.data.previewTargets);\n }\n\n if (createdProvisionalDraft) {\n this.updatePreviewLinks();\n this.trigger('createProvisionalDraft');\n }\n\n if (this.$nameTextInput) {\n this.checkMetaValues();\n }\n\n for (const oldId in response.data.duplicatedElements) {\n if (\n oldId != this.settings.canonicalId &&\n response.data.duplicatedElements.hasOwnProperty(oldId)\n ) {\n this.duplicatedElements[oldId] =\n response.data.duplicatedElements[oldId];\n }\n }\n\n // Add missing field modified indicators\n const selectors = response.data.modifiedAttributes\n .map((attr) => {\n attr = this.namespaceInputName(attr);\n return `[name=\"${attr}\"],[name^=\"${attr}[\"]`;\n })\n .concat(modifiedFieldNames.map((name) => `[name=\"${name}\"]`));\n\n const $fields = $(selectors.join(','))\n .parents()\n .filter('.field:not(:has(> .status-badge))');\n for (let i = 0; i < $fields.length; i++) {\n $fields.eq(i).prepend(\n $('<div/>', {\n class: 'status-badge modified',\n title: Craft.t('app', 'This field has been modified.'),\n }).append(\n $('<span/>', {\n class: 'visually-hidden',\n html: Craft.t('app', 'This field has been modified.'),\n })\n )\n );\n }\n\n // Keep track of whether anything changed while we were waiting.\n // If not, we can safely update lastSerializedValue after swapping out the fields\n const noChanges = this.serializeForm(true) === data;\n\n // Update the visible elements\n let $allTabContainers = $();\n const visibleLayoutElements = {};\n let changedElements = false;\n\n for (let i = 0; i < response.data.missingElements.length; i++) {\n const tabInfo = response.data.missingElements[i];\n let $tabContainer = this.$contentContainer.children(\n `[data-layout-tab=\"${tabInfo.uid}\"]`\n );\n\n if (!$tabContainer.length) {\n $tabContainer = $('<div/>', {\n id: this.namespaceId(tabInfo.id),\n class: 'flex-fields',\n 'data-id': tabInfo.id,\n 'data-layout-tab': tabInfo.uid,\n });\n if (tabInfo.id !== selectedTabId) {\n $tabContainer.addClass('hidden');\n }\n $tabContainer.appendTo(this.$contentContainer);\n }\n\n $allTabContainers = $allTabContainers.add($tabContainer);\n\n for (let j = 0; j < tabInfo.elements.length; j++) {\n const elementInfo = tabInfo.elements[j];\n\n if (elementInfo.html !== false) {\n if (!visibleLayoutElements[tabInfo.uid]) {\n visibleLayoutElements[tabInfo.uid] = [];\n }\n visibleLayoutElements[tabInfo.uid].push(elementInfo.uid);\n\n if (typeof elementInfo.html === 'string') {\n const $oldElement = $tabContainer.children(\n `[data-layout-element=\"${elementInfo.uid}\"]`\n );\n const $newElement = $(elementInfo.html);\n if ($oldElement.length) {\n $oldElement.replaceWith($newElement);\n } else {\n $newElement.appendTo($tabContainer);\n }\n Craft.initUiElements($newElement);\n changedElements = true;\n }\n } else {\n const $oldElement = $tabContainer.children(\n `[data-layout-element=\"${elementInfo.uid}\"]`\n );\n if (\n !$oldElement.length ||\n !Garnish.hasAttr(\n $oldElement,\n 'data-layout-element-placeholder'\n )\n ) {\n const $placeholder = $('<div/>', {\n class: 'hidden',\n 'data-layout-element': elementInfo.uid,\n 'data-layout-element-placeholder': '',\n });\n\n if ($oldElement.length) {\n $oldElement.replaceWith($placeholder);\n } else {\n $placeholder.appendTo($tabContainer);\n }\n\n changedElements = true;\n }\n }\n }\n }\n\n // Remove any unused tab content containers\n // (`[data-layout-tab=\"\"]` == unconditional containers, so ignore those)\n const $unusedTabContainers = this.$contentContainer\n .children('[data-layout-tab]')\n .not($allTabContainers)\n .not('[data-layout-tab=\"\"]');\n if ($unusedTabContainers.length) {\n $unusedTabContainers.remove();\n changedElements = true;\n }\n\n // Make the first tab visible if no others are\n if (!$allTabContainers.filter(':not(.hidden)').length) {\n $allTabContainers.first().removeClass('hidden');\n }\n\n this.settings.visibleLayoutElements = visibleLayoutElements;\n\n // Update the tabs\n if (this.isFullPage) {\n Craft.cp.updateTabs(response.data.tabs);\n } else {\n this.slideout.updateTabs(response.data.tabs);\n }\n\n Craft.appendHeadHtml(response.data.headHtml);\n Craft.appendBodyHtml(response.data.bodyHtml);\n\n // Did any layout elements get added or removed?\n if (changedElements) {\n if (response.data.initialDeltaValues) {\n Object.assign(\n this.$container.data('initial-delta-values'),\n response.data.initialDeltaValues\n );\n }\n\n if (noChanges) {\n // Update our record of the last serialized value to avoid a pointless resave\n this.lastSerializedValue = this.serializeForm(true);\n }\n }\n\n // re-grab dismissible tips, re-attach listener, hide on re-load\n this.handleDismissibleTips();\n\n this.afterUpdate(data);\n\n if (Craft.broadcaster) {\n Craft.broadcaster.postMessage({\n pageId: Craft.pageId,\n event: 'saveDraft',\n canonicalId: this.settings.canonicalId,\n draftId: this.settings.draftId,\n isProvisionalDraft: this.settings.isProvisionalDraft,\n });\n }\n\n resolve();\n })\n .catch((e) => {\n this._afterSaveDraft();\n\n if (!this.ignoreFailedRequest) {\n this.failed = true;\n if (e && e.response) {\n this.httpStatus = e.response.status;\n this.httpError = e.response.data\n ? e.response.data.message\n : null;\n }\n this._showFailStatus();\n reject(e);\n }\n\n this.ignoreFailedRequest = false;\n });\n });\n },\n\n _afterSaveDraft: function () {\n if (this.$saveMetaBtn) {\n this.$saveMetaBtn.removeClass('active');\n }\n },\n\n _showFailStatus: function () {\n this.statusIcons()\n .velocity('stop')\n .css('opacity', '')\n .removeClass('hidden checkmark-icon')\n .addClass('alert-icon');\n\n this.setStatusMessage(this._saveFailMessage());\n },\n\n /**\n * @param {string} data\n * @param {findDeltaDataCallback} [deltaCallback] Callback function that should be passed to `Craft.findDeltaData()`\n * @returns {string}\n */\n prepareData: function (data, deltaCallback) {\n // Filter out anything that hasn't changed since the last time the form was submitted\n data = Craft.findDeltaData(\n this.$container.data('initialSerializedValue'),\n data,\n this.$container.data('delta-names'),\n deltaCallback,\n this.$container.data('initial-delta-values'),\n this.$container.data('modified-delta-names')\n );\n\n // Swap out element IDs with their duplicated ones\n data = this.swapDuplicatedElementIds(data);\n\n const extraData = {};\n\n // Add the draft info\n if (this.settings.draftId) {\n extraData[this.namespaceInputName('draftId')] = this.settings.draftId;\n\n if (this.settings.isProvisionalDraft) {\n extraData[this.namespaceInputName('provisional')] = 1;\n }\n }\n\n if (this.settings.draftName !== null) {\n extraData[this.namespaceInputName('draftName')] =\n this.settings.draftName;\n }\n\n if (!$.isEmptyObject(extraData)) {\n data += `&${$.param(extraData)}`;\n }\n\n return data;\n },\n\n get _saveHeaders() {\n const headers = {\n 'content-type': 'application/x-www-form-urlencoded',\n };\n\n if (this.namespace) {\n headers['X-Craft-Namespace'] = this.namespace;\n }\n\n return headers;\n },\n\n /**\n * @param {string} data\n * @returns {string}\n */\n swapDuplicatedElementIds: function (data) {\n const idsRE = Object.keys(this.duplicatedElements).join('|');\n if (idsRE === '') {\n return data;\n }\n const lb = encodeURIComponent('[');\n const rb = encodeURIComponent(']');\n let namespacedFields = this.namespaceInputName('fields');\n\n if (this.isFullPage) {\n namespacedFields = Craft.escapeRegex(namespacedFields);\n } else {\n // don't escape namespaced input names, but URI encode them (for cases like: cnuvbcxlgq[fields])\n namespacedFields = encodeURIComponent(namespacedFields);\n }\n\n // Keep replacing field IDs until data stops changing\n while (true) {\n if (\n data ===\n (data = data\n // &fields[...][X]\n .replace(\n new RegExp(\n `(&${namespacedFields}${lb}[^=]+${rb}${lb})(${idsRE})(${rb})`,\n 'g'\n ),\n (m, pre, id, post) => {\n let duplicate = false;\n try {\n duplicate = this._filterFieldInputName(pre);\n } catch (e) {\n console.warn(`Unexpected input name: ${m}`);\n }\n if (!duplicate) {\n return m;\n }\n return pre + this.duplicatedElements[id] + post;\n }\n )\n // &fields[...=X\n .replace(\n new RegExp(`&(${namespacedFields}${lb}[^=]+)=(${idsRE})\\\\b`, 'g'),\n (m, name, id) => {\n // Ignore param names that end in `[enabled]`, `[type]`, etc.\n // (`[sortOrder]` should pass here, which could be set to a specific order index, but *not* `[sortOrder][]`!)\n let duplicate = false;\n try {\n duplicate =\n this._filterFieldInputName(name) &&\n !name.match(\n new RegExp(`${lb}(enabled|sortOrder|type|typeId)${rb}$`)\n );\n } catch (e) {\n console.warn(`Unexpected input name: ${m}`);\n }\n if (!duplicate) {\n return m;\n }\n return `&${name}=${this.duplicatedElements[id]}`;\n }\n ))\n ) {\n break;\n }\n }\n return data;\n },\n\n _filterFieldInputName: function (name) {\n // Find the last referenced field handle\n const lb = encodeURIComponent('[');\n const rb = encodeURIComponent(']');\n const nestedNames = name.match(\n new RegExp(`(\\\\bfields|${lb}fields${rb})${lb}[^${rb}]+${rb}`, 'g')\n );\n if (!nestedNames) {\n throw `Unexpected input name: ${name}`;\n }\n const lastHandle = nestedNames[nestedNames.length - 1].match(\n new RegExp(`(?:\\\\bfields|${lb}fields${rb})${lb}([^${rb}]+)${rb}`)\n )[1];\n return Craft.fieldsWithoutContent.includes(lastHandle);\n },\n\n updatePreviewTargets: function (previewTargets) {\n previewTargets.forEach((newTarget) => {\n const currentTarget = this.settings.previewTargets.find(\n (t) => t.label === newTarget.label\n );\n if (currentTarget) {\n currentTarget.url = newTarget.url;\n }\n\n const $previewLink = this.previewLinks.find(\n ($a) => $a.data('targetLabel') === newTarget.label\n );\n if ($previewLink) {\n $previewLink.data('targetUrl', newTarget.url);\n this.updatePreviewLinkHref($previewLink);\n }\n });\n },\n\n afterUpdate: function (data) {\n this.$container.data('initialSerializedValue', data);\n this.$container.data('initial-delta-values', {});\n\n const $statusIcons = this.statusIcons()\n .velocity('stop')\n .css('opacity', '')\n .removeClass('hidden')\n .addClass('checkmark-icon');\n\n this.setStatusMessage(this._saveSuccessMessage());\n\n if (!Craft.autosaveDrafts) {\n // Fade the icon out after a couple seconds, since it won't be accurate as content continues to change\n $statusIcons.velocity('stop').velocity(\n {\n opacity: 0,\n },\n {\n delay: 2000,\n complete: () => {\n $statusIcons.addClass('hidden');\n },\n }\n );\n }\n\n this.trigger('update');\n },\n\n setStatusMessage: function (message) {\n this.statusIcons().attr('title', message);\n this.statusMessage()\n .empty()\n .append(\n $('<span/>', {\n class: 'visually-hidden',\n text: message,\n })\n );\n },\n\n showMetaHud: function () {\n if (!this.metaHud) {\n this.createMetaHud();\n this.onMetaHudShow();\n } else {\n this.metaHud.show();\n }\n\n if (!Garnish.isMobileBrowser(true)) {\n this.$nameTextInput.trigger('focus');\n }\n },\n\n createMetaHud: function () {\n const $hudBody = $('<div/>');\n\n // Add the Name field\n const $nameField = $(\n '<div class=\"field\"><div class=\"heading\"><label for=\"draft-name\">' +\n Craft.t('app', 'Draft Name') +\n '</label></div></div>'\n ).appendTo($hudBody);\n const $nameInputContainer = $('<div class=\"input\"/>').appendTo(\n $nameField\n );\n this.$nameTextInput = $(\n '<input type=\"text\" class=\"text fullwidth\" id=\"draft-name\"/>'\n )\n .appendTo($nameInputContainer)\n .val(this.settings.draftName);\n\n // HUD footer\n const $footer = $('<div class=\"hud-footer flex flex-center\"/>').appendTo(\n $hudBody\n );\n\n $('<div class=\"flex-grow\"></div>').appendTo($footer);\n this.$saveMetaBtn = $('<button/>', {\n type: 'submit',\n class: 'btn submit disabled',\n 'aria-disabled': 'true',\n text: Craft.t('app', 'Save'),\n }).appendTo($footer);\n\n this.metaHud = new Garnish.HUD(this.$editMetaBtn, $hudBody, {\n onSubmit: this.saveMeta.bind(this),\n });\n\n this.addListener(this.$nameTextInput, 'input', 'checkMetaValues');\n\n this.metaHud.on('show', this.onMetaHudShow.bind(this));\n this.metaHud.on('hide', this.onMetaHudHide.bind(this));\n this.metaHud.on('escape', this.onMetaHudEscape.bind(this));\n },\n\n onMetaHudShow: function () {\n this.$editMetaBtn.addClass('active');\n this.$editMetaBtn.attr('aria-expanded', 'true');\n },\n\n onMetaHudHide: function () {\n this.$editMetaBtn.removeClass('active');\n this.$editMetaBtn.attr('aria-expanded', 'false');\n\n if (Garnish.focusIsInside(this.metaHud.$body)) {\n this.$editMetaBtn.trigger('focus');\n }\n },\n\n onMetaHudEscape: function () {\n this.$nameTextInput.val(this.settings.draftName);\n },\n\n checkMetaValues: function () {\n if (\n this.$nameTextInput.val() &&\n this.$nameTextInput.val() !== this.settings.draftName\n ) {\n this.$saveMetaBtn.removeClass('disabled');\n this.$saveMetaBtn.removeAttr('aria-disabled');\n return true;\n }\n\n this.$saveMetaBtn.addClass('disabled');\n this.$saveMetaBtn.attr('aria-disabled', 'true');\n return false;\n },\n\n shakeMetaHud: function () {\n Garnish.shake(this.metaHud.$hud);\n },\n\n saveMeta: function () {\n return new Promise((resolve, reject) => {\n if (!this.checkMetaValues()) {\n this.shakeMetaHud();\n reject();\n return;\n }\n\n this.settings.draftName = this.$nameTextInput.val();\n this.metaHud.hide();\n this.checkForm(true).then(resolve).catch(reject);\n });\n },\n\n handleSubmit: function (ev) {\n ev.preventDefault();\n ev.stopPropagation();\n\n // Prevent double form submits\n if (this.submittingForm) {\n return;\n }\n\n // If this a draft and was this a normal save (either via submit button or save shortcut),\n // then trigger an autosave\n if (\n this.settings.draftId &&\n !this.settings.isUnpublishedDraft &&\n !this.settings.isProvisionalDraft &&\n (typeof ev.autosave === 'undefined' || ev.autosave) &&\n (ev.saveShortcut ||\n (ev.customTrigger &&\n ev.customTrigger.data('action') === 'elements/save-draft')) &&\n this.enableAutosave\n ) {\n this.checkForm(true);\n return;\n }\n\n this.submittingForm = true;\n\n // Prevent the normal unload confirmation dialog\n Craft.cp.$confirmUnloadForms = Craft.cp.$confirmUnloadForms.not(\n this.$container\n );\n\n // Abort the current save request if there is one\n if (this.cancelToken) {\n this.ignoreFailedRequest = true;\n this.cancelToken.cancel();\n }\n\n this.trigger('beforeSubmit');\n\n // Duplicate the form with normalized data\n const data = this.prepareData(this.serializeForm(false));\n\n if (this.isFullPage) {\n this.stopListeningForChanges();\n const $form = Craft.createForm(data);\n $form.appendTo(Garnish.$bod);\n $form.submit();\n } else {\n this.slideout.showSubmitSpinner();\n Craft.sendActionRequest('POST', null, {\n headers: this._saveHeaders,\n data,\n })\n .then((response) => {\n this.slideout.handleSubmitResponse(response);\n })\n .catch((error) => {\n this.slideout.handleSubmitError(error);\n })\n .finally(() => {\n this.submittingForm = false;\n this.slideout.hideSubmitSpinner();\n });\n }\n },\n\n handleDismissibleTips: function () {\n this.addListener(this.tipDismissBtn, 'click', (e) => {\n this.hideTip(e);\n });\n },\n\n getHiddenTipsUids: function () {\n return Craft.getLocalStorage('dismissedTips', []);\n },\n\n setHiddenTipsUids: function (uids) {\n Craft.setLocalStorage('dismissedTips', uids);\n },\n\n hideTip: function (ev) {\n const targetElement = ev.target;\n if (targetElement) {\n const $targetParent = $(targetElement).closest('.readable');\n if ($targetParent.length) {\n const layoutElementUid = $targetParent.data('layout-element');\n $targetParent.remove();\n // add info to local storage\n if (typeof Storage !== 'undefined') {\n const hiddenTips = this.getHiddenTipsUids();\n if (!hiddenTips.includes(layoutElementUid)) {\n hiddenTips.push(layoutElementUid);\n this.setHiddenTipsUids(hiddenTips);\n }\n }\n }\n }\n },\n },\n {\n defaults: {\n additionalSites: [],\n canCreateDrafts: false,\n canEditMultipleSites: false,\n canSaveCanonical: false,\n canonicalId: null,\n draftId: null,\n draftName: null,\n elementType: null,\n enablePreview: false,\n enabled: false,\n enabledForSite: false,\n hashedCpEditUrl: null,\n isLive: false,\n isProvisionalDraft: false,\n isUnpublishedDraft: false,\n previewTargets: [],\n previewToken: null,\n revisionId: null,\n siteId: null,\n siteStatuses: null,\n siteToken: null,\n visibleLayoutElements: {},\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Element Editor Slideout\n */\nCraft.ElementEditorSlideout = Craft.CpScreenSlideout.extend(\n {\n $element: null,\n\n init: function (element, settings) {\n this.$element = $(element);\n\n settings = Object.assign(\n {},\n Craft.ElementEditorSlideout.defaults,\n settings,\n {\n showHeader: true,\n }\n );\n this.base('elements/edit', settings);\n\n this.on('load', () => {\n const editor = this.$container.data('elementEditor');\n if (editor) {\n editor.on('beforeSubmit', () => {\n Object.keys(this.settings.saveParams).forEach((name) => {\n $('<input/>', {\n class: 'hidden',\n name: editor.namespaceInputName(name),\n value: this.settings.saveParams[name],\n }).appendTo(this.$container);\n });\n });\n }\n });\n\n this.on('submit', (ev) => {\n if (Craft.broadcaster) {\n Craft.broadcaster.postMessage({\n event: 'saveElement',\n id: ev.response.data.element.id,\n });\n }\n\n // Pass the response data off to onSaveElement() for backwards compatibility\n if (this.settings.onSaveElement) {\n const data = Object.assign(\n {},\n ev.response.data,\n ev.response.data.element\n );\n delete data.element;\n delete data.modelName;\n delete data.message;\n this.settings.onSaveElement(data);\n }\n\n // Refresh Live Preview\n Craft.Preview.refresh();\n });\n },\n\n getParams: function () {\n const params = {};\n\n if (this.settings.elementType) {\n params.elementType = this.settings.elementType;\n }\n\n if (this.settings.elementId) {\n params.elementId = this.settings.elementId;\n } else if (this.$element && this.$element.data('id')) {\n params.elementId = this.$element.data('id');\n }\n\n if (this.settings.draftId) {\n params.draftId = this.settings.draftId;\n } else if (this.$element && this.$element.data('draft-id')) {\n params.draftId = this.$element.data('draft-id');\n } else if (this.settings.revisionId) {\n params.revisionId = this.settings.revisionId;\n } else if (this.$element && this.$element.data('revision-id')) {\n params.revisionId = this.$element.data('revision-id');\n }\n\n if (this.settings.siteId) {\n params.siteId = this.settings.siteId;\n } else if (this.$element && this.$element.data('site-id')) {\n params.siteId = this.$element.data('site-id');\n }\n\n if (this.settings.prevalidate) {\n params.prevalidate = 1;\n }\n\n return params;\n },\n\n handleSubmit: function (ev) {\n this.$container.data('elementEditor').handleSubmit(ev);\n },\n },\n {\n defaults: {\n elementId: null,\n draftId: null,\n revisionId: null,\n elementType: null,\n siteId: null,\n prevalidate: false,\n saveParams: {},\n onSaveElement: null,\n validators: [],\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\nCraft.ElementFieldSettings = Garnish.Base.extend({\n allowMultipleSources: null,\n $maintainHierarchyField: null,\n $maintainHierarchyInput: null,\n $sourcesField: null,\n $sourceSelect: null,\n $branchLimitField: null,\n $maxRelationsField: null,\n $minRelationsField: null,\n\n init: function (\n allowMultipleSources,\n maintainHierarchyFieldId,\n sourcesFieldId,\n branchLimitFieldId,\n minRelationsFieldId,\n maxRelationsFieldId\n ) {\n debugger;\n this.allowMultipleSources = allowMultipleSources;\n this.$maintainHierarchyField = $(`#${maintainHierarchyFieldId}`);\n this.$maintainHierarchyInput = this.$maintainHierarchyField.find(\n 'input[type=\"checkbox\"]'\n );\n this.$sourcesField = $(`#${sourcesFieldId}`);\n if (!this.allowMultipleSources) {\n this.$sourceSelect = this.$sourcesField.find('select');\n }\n this.$branchLimitField = $(`#${branchLimitFieldId}`);\n this.$minRelationsField = $(`#${minRelationsFieldId}`);\n this.$maxRelationsField = $(`#${maxRelationsFieldId}`);\n\n this.updateLimitFields();\n this.addListener(\n this.$maintainHierarchyInput,\n 'change',\n 'updateLimitFields'\n );\n\n if (this.allowMultipleSources) {\n this.$sourcesField.find('[type=checkbox]').each(\n function (index, checkbox) {\n this.addListener(\n $(checkbox),\n 'change',\n 'updateMaintainHierarchyField'\n );\n }.bind(this)\n );\n } else {\n this.addListener(\n this.$sourceSelect,\n 'change',\n 'updateMaintainHierarchyField'\n );\n }\n this.updateMaintainHierarchyField();\n },\n\n updateLimitFields: function () {\n if (\n !this.$maintainHierarchyField.hasClass('hidden') &&\n this.$maintainHierarchyInput.is(':checked')\n ) {\n this.$minRelationsField.addClass('hidden');\n this.$maxRelationsField.addClass('hidden');\n this.$branchLimitField.removeClass('hidden');\n } else {\n this.$branchLimitField.addClass('hidden');\n this.$minRelationsField.removeClass('hidden');\n this.$maxRelationsField.removeClass('hidden');\n }\n },\n\n updateMaintainHierarchyField: function () {\n let showField;\n if (this.allowMultipleSources) {\n const $checkedInputs = this.$sourcesField.find(\n '[type=\"checkbox\"]:checked'\n );\n showField =\n $checkedInputs.length === 1 && $checkedInputs.data('structure-id');\n } else {\n showField = this.$sourceSelect\n .children('option:selected')\n .data('structure-id');\n }\n\n if (showField) {\n this.$maintainHierarchyField.removeClass('hidden');\n } else {\n this.$maintainHierarchyField.addClass('hidden');\n }\n\n this.updateLimitFields();\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Base Element Index View\n */\nCraft.ElementThumbLoader = Garnish.Base.extend(\n {\n queue: null,\n workers: [],\n\n init: function () {\n this.queue = [];\n\n for (var i = 0; i < 3; i++) {\n this.workers.push(new Craft.ElementThumbLoader.Worker(this));\n }\n },\n\n load: function ($elements) {\n // Only immediately load the visible images\n let $thumbs = $elements.find('.elementthumb');\n for (let i = 0; i < $thumbs.length; i++) {\n let $thumb = $thumbs.eq(i);\n let $scrollParent = $thumb.scrollParent();\n if ($scrollParent.prop('nodeName') === 'FIELDSET') {\n $scrollParent = $scrollParent.scrollParent();\n }\n if ($scrollParent[0] === document.body) {\n $scrollParent = Garnish.$doc;\n }\n if (this.isVisible($thumb, $scrollParent)) {\n this.addToQueue($thumb[0]);\n } else {\n let key = 'thumb' + Math.floor(Math.random() * 1000000);\n Craft.ElementThumbLoader.invisibleThumbs[key] = [\n this,\n $thumb,\n $scrollParent,\n ];\n $scrollParent.on(\n `scroll.${key}`,\n {\n $thumb: $thumb,\n $scrollParent: $scrollParent,\n key: key,\n },\n (ev) => {\n if (this.isVisible(ev.data.$thumb, ev.data.$scrollParent)) {\n delete Craft.ElementThumbLoader.invisibleThumbs[ev.data.key];\n $scrollParent.off(`scroll.${ev.data.key}`);\n this.addToQueue(ev.data.$thumb[0]);\n }\n }\n );\n }\n }\n },\n\n addToQueue: function (thumb) {\n this.queue.push(thumb);\n\n // See if there are any inactive workers\n for (var i = 0; i < this.workers.length; i++) {\n if (!this.workers[i].active) {\n this.workers[i].loadNext();\n }\n }\n },\n\n isVisible: function ($thumb, $scrollParent) {\n let thumbOffset = $thumb.offset().top;\n let scrollParentOffset, scrollParentHeight;\n if ($scrollParent[0] === document) {\n scrollParentOffset = $scrollParent.scrollTop();\n scrollParentHeight = Garnish.$win.height();\n } else {\n scrollParentOffset = $scrollParent.offset().top;\n scrollParentHeight = $scrollParent.height();\n }\n return (\n thumbOffset > scrollParentOffset &&\n thumbOffset < scrollParentOffset + scrollParentHeight + 1000\n );\n },\n\n destroy: function () {\n for (var i = 0; i < this.workers.length; i++) {\n this.workers[i].destroy();\n }\n\n this.base();\n },\n },\n {\n invisibleThumbs: {},\n retryAll: function () {\n for (let key in Craft.ElementThumbLoader.invisibleThumbs) {\n let [queue, $thumb, $scrollParent] =\n Craft.ElementThumbLoader.invisibleThumbs[key];\n delete Craft.ElementThumbLoader.invisibleThumbs[key];\n $scrollParent.off(`scroll.${key}`);\n queue.load($thumb.parent());\n }\n },\n }\n);\n\nCraft.ElementThumbLoader.Worker = Garnish.Base.extend({\n loader: null,\n active: false,\n\n init: function (loader) {\n this.loader = loader;\n },\n\n loadNext: function () {\n var container = this.loader.queue.shift();\n if (typeof container === 'undefined') {\n this.active = false;\n return;\n }\n\n this.active = true;\n var $container = $(container);\n if ($container.find('img').length) {\n this.loadNext();\n return;\n }\n var $img = $('<img/>', {\n sizes: $container.attr('data-sizes'),\n srcset: $container.attr('data-srcset'),\n alt: $container.attr('data-alt') || '',\n });\n this.addListener($img, 'load,error', 'loadNext');\n $img.appendTo($container);\n picturefill({\n elements: [$img[0]],\n });\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Elevated Session Form\n */\nCraft.ElevatedSessionForm = Garnish.Base.extend({\n $form: null,\n inputs: null,\n\n init: function (form, inputs) {\n this.$form = $(form);\n\n // Only check specific inputs?\n if (typeof inputs !== 'undefined') {\n this.inputs = [];\n inputs = $.makeArray(inputs);\n\n for (var i = 0; i < inputs.length; i++) {\n var $inputs = $(inputs[i]);\n\n for (var j = 0; j < $inputs.length; j++) {\n var $input = $inputs.eq(j);\n\n this.inputs.push({\n input: $input,\n val: Garnish.getInputPostVal($input),\n });\n }\n }\n }\n\n this.addListener(this.$form, 'submit', 'handleFormSubmit');\n },\n\n handleFormSubmit: function (ev) {\n // Ignore if we're in the middle of getting the elevated session timeout\n if (Craft.elevatedSessionManager.fetchingTimeout) {\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return;\n }\n\n // Are we only interested in certain inputs?\n if (this.inputs) {\n var inputsChanged = false;\n var $input;\n\n for (var i = 0; i < this.inputs.length; i++) {\n $input = this.inputs[i].input;\n // Is this a password input?\n if ($input.data('passwordInput')) {\n $input = $input.data('passwordInput').$currentInput;\n }\n\n // Has this input's value changed?\n if (Garnish.getInputPostVal($input) !== this.inputs[i].val) {\n inputsChanged = true;\n break;\n }\n }\n\n if (!inputsChanged) {\n // No need to interrupt the submit\n return;\n }\n }\n\n // Prevent the form from submitting until the user has an elevated session\n ev.preventDefault();\n ev.stopImmediatePropagation();\n Craft.elevatedSessionManager.requireElevatedSession(\n this.submitForm.bind(this)\n );\n },\n\n submitForm: function () {\n // Don't let handleFormSubmit() interrupt this time\n this.disable();\n this.$form.trigger('submit');\n this.enable();\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Elevated Session Manager\n */\nCraft.ElevatedSessionManager = Garnish.Base.extend(\n {\n fetchingTimeout: false,\n\n passwordModal: null,\n $passwordInput: null,\n $submitBtn: null,\n $errorPara: null,\n\n callback: null,\n\n /**\n * @callback requireElevatedSessionCallback\n */\n /**\n * Requires that the user has an elevated session.\n *\n * @param {requireElevatedSessionCallback} callback The callback function that should be called once the user has an elevated session\n */\n requireElevatedSession: function (callback) {\n this.callback = callback;\n\n // Check the time remaining on the user’s elevated session (if any)\n this.fetchingTimeout = true;\n\n Craft.sendActionRequest('POST', 'users/get-elevated-session-timeout')\n .then((response) => {\n this.fetchingTimeout = false;\n if (\n response.data.timeout === false ||\n response.data.timeout >=\n Craft.ElevatedSessionManager.minSafeElevatedSessionTimeout\n ) {\n this.callback();\n } else {\n // Show the password modal\n this.showPasswordModal();\n }\n })\n .catch(() => {\n this.fetchingTimeout = false;\n });\n },\n\n showPasswordModal: function () {\n if (!this.passwordModal) {\n var $passwordModal = $(\n '<form id=\"elevatedsessionmodal\" class=\"modal secure fitted\"/>'\n ),\n $body = $(\n '<div class=\"body\"><p>' +\n Craft.t('app', 'Enter your password to continue.') +\n '</p></div>'\n ).appendTo($passwordModal),\n $inputContainer = $('<div class=\"inputcontainer\">').appendTo($body),\n $inputsFlexContainer = $('<div class=\"flex\"/>').appendTo(\n $inputContainer\n ),\n $passwordContainer = $('<div class=\"flex-grow\"/>').appendTo(\n $inputsFlexContainer\n ),\n $buttonContainer = $('<td/>').appendTo($inputsFlexContainer),\n $passwordWrapper = $('<div class=\"passwordwrapper\"/>').appendTo(\n $passwordContainer\n );\n\n this.$passwordInput = $(\n '<input type=\"password\" class=\"text password fullwidth\" placeholder=\"' +\n Craft.t('app', 'Password') +\n '\" autocomplete=\"current-password\"/>'\n ).appendTo($passwordWrapper);\n this.$submitBtn = Craft.ui\n .createSubmitButton({\n class: 'disabled',\n label: Craft.t('app', 'Submit'),\n spinner: true,\n })\n .appendTo($buttonContainer);\n this.$errorPara = $('<p class=\"error\"/>').appendTo($body);\n\n this.passwordModal = new Garnish.Modal($passwordModal, {\n closeOtherModals: false,\n onFadeIn: () => {\n setTimeout(this.focusPasswordInput.bind(this), 100);\n },\n onFadeOut: () => {\n this.$passwordInput.val('');\n },\n });\n\n new Craft.PasswordInput(this.$passwordInput, {\n onToggleInput: ($newPasswordInput) => {\n this.$passwordInput = $newPasswordInput;\n },\n });\n\n this.addListener(this.$passwordInput, 'input', 'validatePassword');\n this.addListener($passwordModal, 'submit', 'submitPassword');\n } else {\n this.passwordModal.show();\n }\n },\n\n focusPasswordInput: function () {\n if (!Garnish.isMobileBrowser(true)) {\n this.$passwordInput.trigger('focus');\n }\n },\n\n validatePassword: function () {\n if (this.$passwordInput.val().length >= 6) {\n this.$submitBtn.removeClass('disabled');\n return true;\n } else {\n this.$submitBtn.addClass('disabled');\n return false;\n }\n },\n\n submitPassword: function (ev) {\n if (ev) {\n ev.preventDefault();\n }\n\n if (!this.validatePassword()) {\n return;\n }\n\n this.$submitBtn.addClass('loading');\n this.clearLoginError();\n\n var data = {\n currentPassword: this.$passwordInput.val(),\n };\n\n Craft.sendActionRequest('POST', 'users/start-elevated-session', {data})\n .then((response) => {\n this.$submitBtn.removeClass('loading');\n this.passwordModal.hide();\n this.callback();\n })\n .catch(({response}) => {\n this.$submitBtn.removeClass('loading');\n this.showPasswordError(\n response.data.message || Craft.t('app', 'Incorrect password.')\n );\n Garnish.shake(this.passwordModal.$container);\n this.focusPasswordInput();\n });\n },\n\n showPasswordError: function (error) {\n if (error === null || typeof error === 'undefined') {\n error = Craft.t('app', 'A server error occurred.');\n }\n\n this.$errorPara.text(error);\n this.passwordModal.updateSizeAndPosition();\n },\n\n clearLoginError: function () {\n this.showPasswordError('');\n },\n },\n {\n minSafeElevatedSessionTimeout: 5,\n }\n);\n\n// Instantiate it\nCraft.elevatedSessionManager = new Craft.ElevatedSessionManager();\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Entry index class\n */\nCraft.EntryIndex = Craft.BaseElementIndex.extend({\n publishableSections: null,\n $newEntryBtnGroup: null,\n $newEntryBtn: null,\n\n init: function (elementType, $container, settings) {\n this.publishableSections = [];\n this.on('selectSource', this.updateButton.bind(this));\n this.on('selectSite', this.updateButton.bind(this));\n this.base(elementType, $container, settings);\n },\n\n afterInit: function () {\n // Find which of the visible sections the user has permission to create new entries in\n this.publishableSections = Craft.publishableSections.filter(\n (s) => !!this.getSourceByKey(`section:${s.uid}`)\n );\n\n this.base();\n },\n\n getDefaultSourceKey: function () {\n // Did they request a specific section in the URL?\n if (\n this.settings.context === 'index' &&\n typeof defaultSectionHandle !== 'undefined'\n ) {\n if (defaultSectionHandle === 'singles') {\n return 'singles';\n }\n\n for (let i = 0; i < this.$sources.length; i++) {\n const $source = $(this.$sources[i]);\n if ($source.data('handle') === defaultSectionHandle) {\n return $source.data('key');\n }\n }\n }\n\n return this.base();\n },\n\n updateButton: function () {\n if (!this.$source) {\n return;\n }\n\n let handle;\n\n // Get the handle of the selected source\n if (this.$source.data('key') === 'singles') {\n handle = 'singles';\n } else {\n handle = this.$source.data('handle');\n }\n\n // Update the New Entry button\n // ---------------------------------------------------------------------\n\n if (this.publishableSections.length) {\n // Remove the old button, if there is one\n if (this.$newEntryBtnGroup) {\n this.$newEntryBtnGroup.remove();\n }\n\n // Determine if they are viewing a section that they have permission to create entries in\n const selectedSection = this.publishableSections.find(\n (s) => s.handle === handle\n );\n\n this.$newEntryBtnGroup = $('<div class=\"btngroup submit\" data-wrapper/>');\n let $menuBtn;\n const menuId = 'new-entry-menu-' + Craft.randomString(10);\n\n // If they are, show a primary \"New entry\" button, and a dropdown of the other sections (if any).\n // Otherwise only show a menu button\n if (selectedSection) {\n const visibleLabel =\n this.settings.context === 'index'\n ? Craft.t('app', 'New entry')\n : Craft.t('app', 'New {section} entry', {\n section: selectedSection.name,\n });\n\n const ariaLabel =\n this.settings.context === 'index'\n ? Craft.t('app', 'New entry in the {section} section', {\n section: selectedSection.name,\n })\n : visibleLabel;\n\n // In index contexts, the button functions as a link\n // In non-index contexts, the button triggers a slideout editor\n const role = this.settings.context === 'index' ? 'link' : null;\n\n this.$newEntryBtn = Craft.ui\n .createButton({\n label: visibleLabel,\n ariaLabel: ariaLabel,\n spinner: true,\n role: role,\n })\n .addClass('submit add icon')\n .appendTo(this.$newEntryBtnGroup);\n\n this.addListener(this.$newEntryBtn, 'click mousedown', (ev) => {\n // If this is the element index, check for Ctrl+clicks and middle button clicks\n if (\n this.settings.context === 'index' &&\n ((ev.type === 'click' && Garnish.isCtrlKeyPressed(ev)) ||\n (ev.type === 'mousedown' && ev.originalEvent.button === 1))\n ) {\n window.open(Craft.getUrl(`entries/${selectedSection.handle}/new`));\n } else if (ev.type === 'click') {\n this._createEntry(selectedSection.id);\n }\n });\n\n if (this.publishableSections.length > 1) {\n $menuBtn = $('<button/>', {\n type: 'button',\n class: 'btn submit menubtn btngroup-btn-last',\n 'aria-controls': menuId,\n 'data-disclosure-trigger': '',\n 'aria-label': Craft.t('app', 'New entry, choose a section'),\n }).appendTo(this.$newEntryBtnGroup);\n }\n } else {\n this.$newEntryBtn = $menuBtn = Craft.ui\n .createButton({\n label: Craft.t('app', 'New entry'),\n ariaLabel: Craft.t('app', 'New entry, choose a section'),\n spinner: true,\n })\n .addClass('submit add icon menubtn btngroup-btn-last')\n .attr('aria-controls', menuId)\n .attr('data-disclosure-trigger', '')\n .appendTo(this.$newEntryBtnGroup);\n }\n\n this.addButton(this.$newEntryBtnGroup);\n\n if ($menuBtn) {\n const $menuContainer = $('<div/>', {\n id: menuId,\n class: 'menu menu--disclosure',\n }).appendTo(this.$newEntryBtnGroup);\n const $ul = $('<ul/>').appendTo($menuContainer);\n\n for (const section of this.publishableSections) {\n const anchorRole =\n this.settings.context === 'index' ? 'link' : 'button';\n if (\n (this.settings.context === 'index' &&\n $.inArray(this.siteId, section.sites) !== -1) ||\n (this.settings.context !== 'index' && section !== selectedSection)\n ) {\n const $li = $('<li/>').appendTo($ul);\n const $a = $('<a/>', {\n role: anchorRole === 'button' ? 'button' : null,\n href: '#', // Allows for click listener and tab order\n type: anchorRole === 'button' ? 'button' : null,\n text: Craft.t('app', 'New {section} entry', {\n section: section.name,\n }),\n }).appendTo($li);\n this.addListener($a, 'click', () => {\n $menuBtn.data('trigger').hide();\n this._createEntry(section.id);\n });\n\n if (anchorRole === 'button') {\n this.addListener($a, 'keydown', (event) => {\n if (event.keyCode === Garnish.SPACE_KEY) {\n event.preventDefault();\n $menuBtn.data('trigger').hide();\n this._createEntry(section.id);\n }\n });\n }\n }\n }\n\n new Garnish.DisclosureMenu($menuBtn);\n }\n }\n\n // Update the URL if we're on the Entries index\n // ---------------------------------------------------------------------\n\n if (this.settings.context === 'index') {\n let uri = 'entries';\n\n if (handle) {\n uri += '/' + handle;\n }\n\n Craft.setPath(uri);\n }\n },\n\n _createEntry: function (sectionId) {\n if (this.$newEntryBtn.hasClass('loading')) {\n console.warn('New entry creation already in progress.');\n return;\n }\n\n // Find the section\n const section = this.publishableSections.find((s) => s.id === sectionId);\n\n if (!section) {\n throw `Invalid section ID: ${sectionId}`;\n }\n\n this.$newEntryBtn.addClass('loading');\n\n Craft.sendActionRequest('POST', 'entries/create', {\n data: {\n siteId: this.siteId,\n section: section.handle,\n },\n })\n .then(({data}) => {\n if (this.settings.context === 'index') {\n document.location.href = Craft.getUrl(data.cpEditUrl, {fresh: 1});\n } else {\n const slideout = Craft.createElementEditor(this.elementType, {\n siteId: this.siteId,\n elementId: data.entry.id,\n draftId: data.entry.draftId,\n params: {\n fresh: 1,\n },\n });\n slideout.on('submit', () => {\n // Make sure the right section is selected\n const sectionSourceKey = `section:${section.uid}`;\n\n if (this.sourceKey !== sectionSourceKey) {\n this.selectSourceByKey(sectionSourceKey);\n }\n\n this.clearSearch();\n this.setSelectedSortAttribute('dateCreated', 'desc');\n this.selectElementAfterUpdate(data.entry.id);\n this.updateElements();\n });\n }\n })\n .finally(() => {\n this.$newEntryBtn.removeClass('loading');\n });\n },\n});\n\n// Register it!\nCraft.registerElementIndexClass('craft\\\\elements\\\\Entry', Craft.EntryIndex);\n","/** global: Craft */\n/** global: Garnish */\nCraft.FieldLayoutDesigner = Garnish.Base.extend(\n {\n $container: null,\n $configInput: null,\n $tabContainer: null,\n $newTabBtn: null,\n $sidebar: null,\n $libraryToggle: null,\n $selectedLibrary: null,\n $fieldLibrary: null,\n $uiLibrary: null,\n $uiLibraryElements: null,\n $fieldSearch: null,\n $clearFieldSearchBtn: null,\n $fieldGroups: null,\n $fields: null,\n\n tabGrid: null,\n elementDrag: null,\n\n _config: null,\n\n init: function (container, settings) {\n this.$container = $(container);\n this.setSettings(settings, Craft.FieldLayoutDesigner.defaults);\n\n this.$configInput = this.$container.children('input[data-config-input]');\n this._config = JSON.parse(this.$configInput.val());\n if (!this._config.tabs) {\n this._config.tabs = [];\n }\n\n let $workspace = this.$container.children('.fld-workspace');\n this.$tabContainer = $workspace.children('.fld-tabs');\n this.$newTabBtn = $workspace.children('.fld-new-tab-btn');\n this.$sidebar = this.$container.children('.fld-sidebar');\n\n this.$fieldLibrary = this.$selectedLibrary =\n this.$sidebar.children('.fld-field-library');\n let $fieldSearchContainer = this.$fieldLibrary.children('.search');\n this.$fieldSearch = $fieldSearchContainer.children('input');\n this.$clearFieldSearchBtn = $fieldSearchContainer.children('.clear');\n this.$fieldGroups = this.$sidebar.find('.fld-field-group');\n this.$fields = this.$fieldGroups.children('.fld-element');\n this.$uiLibrary = this.$sidebar.children('.fld-ui-library');\n this.$uiLibraryElements = this.$uiLibrary.children();\n\n // Set up the layout grids\n this.tabGrid = new Craft.Grid(this.$tabContainer, {\n itemSelector: '.fld-tab',\n minColWidth: 24 * 11,\n fillMode: 'grid',\n snapToGrid: 24,\n });\n\n let $tabs = this.$tabContainer.children();\n for (let i = 0; i < $tabs.length; i++) {\n this.initTab($($tabs[i]));\n }\n\n this.elementDrag = new Craft.FieldLayoutDesigner.ElementDrag(this);\n\n if (this.settings.customizableTabs) {\n this.tabDrag = new Craft.FieldLayoutDesigner.TabDrag(this);\n\n this.addListener(this.$newTabBtn, 'activate', 'addTab');\n }\n\n // Set up the sidebar\n if (this.settings.customizableUi) {\n let $libraryPicker = this.$sidebar.children('.btngroup');\n new Craft.Listbox($libraryPicker, {\n onChange: ($selectedOption) => {\n this.$selectedLibrary.addClass('hidden');\n this.$selectedLibrary =\n this[`$${$selectedOption.data('library')}Library`].removeClass(\n 'hidden'\n );\n },\n });\n }\n\n this.addListener(this.$fieldSearch, 'input', () => {\n let val = this.$fieldSearch.val().toLowerCase().replace(/['\"]/g, '');\n if (!val) {\n this.$fieldLibrary.find('.filtered').removeClass('filtered');\n this.$clearFieldSearchBtn.addClass('hidden');\n return;\n }\n\n this.$clearFieldSearchBtn.removeClass('hidden');\n let $matches = this.$fields\n .filter(`[data-keywords*=\"${val}\"]`)\n .add(\n this.$fieldGroups\n .filter(`[data-name*=\"${val}\"]`)\n .children('.fld-element')\n )\n .removeClass('filtered');\n this.$fields.not($matches).addClass('filtered');\n\n // hide any groups that don't have any results\n for (let i = 0; i < this.$fieldGroups.length; i++) {\n let $group = this.$fieldGroups.eq(i);\n if ($group.find('.fld-element:not(.hidden):not(.filtered)').length) {\n $group.removeClass('filtered');\n } else {\n $group.addClass('filtered');\n }\n }\n });\n\n this.addListener(this.$fieldSearch, 'keydown', (ev) => {\n switch (ev.keyCode) {\n case Garnish.ESC_KEY:\n this.$fieldSearch.val('').trigger('input');\n break;\n case Garnish.RETURN_KEY:\n // they most likely don't want to submit the form from here\n ev.preventDefault();\n break;\n }\n });\n\n // Clear the search when the X button is clicked\n this.addListener(this.$clearFieldSearchBtn, 'click', () => {\n this.$fieldSearch.val('').trigger('input');\n });\n },\n\n initTab: function ($tab) {\n return new Craft.FieldLayoutDesigner.Tab(this, $tab);\n },\n\n removeFieldByHandle: function (attribute) {\n this.$fields\n .filter(`[data-attribute=\"${attribute}\"]:first`)\n .removeClass('hidden')\n .closest('.fld-field-group')\n .removeClass('hidden');\n },\n\n addTab: function () {\n if (!this.settings.customizableTabs) {\n return;\n }\n\n const name = Craft.escapeHtml(\n prompt(Craft.t('app', 'Give your tab a name.'))\n );\n\n if (!name) {\n return;\n }\n\n const $tab = $(`\n<div class=\"fld-tab\">\n <div class=\"tabs\">\n <div class=\"tab sel draggable\">\n <span>${name}</span>\n <a class=\"settings icon\" title=\"${Craft.t('app', 'Settings')}\"></a>\n </div>\n </div>\n <div class=\"fld-tabcontent\"></div>\n</div>\n`).appendTo(this.$tabContainer);\n\n this.tabGrid.addItems($tab);\n this.tabDrag.addItems($tab);\n\n const tab = this.initTab($tab);\n tab.updatePositionInConfig();\n },\n\n get config() {\n return this._config;\n },\n\n set config(config) {\n this._config = config;\n this.$configInput.val(JSON.stringify(config));\n },\n\n updateConfig: function (callback) {\n const config = callback(this.config);\n if (config !== false) {\n this.config = config;\n }\n },\n },\n {\n defaults: {\n customizableTabs: true,\n customizableUi: true,\n },\n\n createSlideout: function (contents, js) {\n const $body = $('<div/>', {class: 'fld-element-settings-body'});\n $('<div/>', {class: 'fields', html: contents}).appendTo($body);\n const $footer = $('<div/>', {class: 'fld-element-settings-footer'});\n $('<div/>', {class: 'flex-grow'}).appendTo($footer);\n const $cancelBtn = Craft.ui\n .createButton({\n label: Craft.t('app', 'Close'),\n spinner: true,\n })\n .appendTo($footer);\n Craft.ui\n .createSubmitButton({\n class: 'secondary',\n label: Craft.t('app', 'Apply'),\n spinner: true,\n })\n .appendTo($footer);\n const $contents = $body.add($footer);\n\n const slideout = new Craft.Slideout($contents, {\n containerElement: 'form',\n containerAttributes: {\n action: '',\n method: 'post',\n novalidate: '',\n class: 'fld-element-settings',\n },\n });\n slideout.on('open', () => {\n // Hold off a sec until it's positioned...\n Garnish.requestAnimationFrame(() => {\n // Focus on the first text input\n slideout.$container.find('.text:first').trigger('focus');\n });\n });\n\n $cancelBtn.on('click', () => {\n slideout.close();\n });\n\n if (js) {\n eval(js);\n }\n\n Craft.initUiElements(slideout.$container);\n\n return slideout;\n },\n }\n);\n\nCraft.FieldLayoutDesigner.Tab = Garnish.Base.extend({\n designer: null,\n uid: null,\n $container: null,\n slideout: null,\n destroyed: false,\n\n init: function (designer, $container) {\n this.designer = designer;\n this.$container = $container;\n this.$container.data('fld-tab', this);\n this.uid = this.$container.data('uid');\n\n // New tab?\n if (!this.uid) {\n this.uid = Craft.uuid();\n this.config = {\n uid: this.uid,\n name: this.$container.find('.tabs .tab span').text(),\n elements: [],\n };\n this.$container.data(\n 'settings-namespace',\n this.designer.$container\n .data('new-tab-settings-namespace')\n .replace(/\\bTAB_UID\\b/g, this.uid)\n );\n this.$container.data(\n 'settings-html',\n this.designer.$container\n .data('new-tab-settings-html')\n .replace(/\\bTAB_UID\\b/g, this.uid)\n .replace(/\\bTAB_NAME\\b/g, this.config.name)\n );\n this.$container.data(\n 'settings-js',\n this.designer.$container\n .data('new-tab-settings-js')\n .replace(/\\bTAB_UID\\b/g, this.uid)\n );\n }\n\n if (this.designer.settings.customizableTabs) {\n this.settingsNamespace = this.$container.data('settings-namespace');\n this.createMenu();\n }\n\n // initialize the elements\n const $elements = this.$container.children('.fld-tabcontent').children();\n\n for (let i = 0; i < $elements.length; i++) {\n this.initElement($($elements[i]));\n }\n },\n\n createMenu: function () {\n const $editBtn = this.$container.find('.tabs .settings');\n\n $('<div class=\"menu\" data-align=\"center\"/>')\n .insertAfter($editBtn)\n .append(\n $('<ul/>')\n .append(\n $('<li/>').append(\n $('<a/>', {\n 'data-action': 'settings',\n text: Craft.t('app', 'Settings'),\n })\n )\n )\n .append(\n $('<li/>').append(\n $('<a/>', {\n 'data-action': 'remove',\n text: Craft.t('app', 'Remove'),\n })\n )\n )\n )\n .append($('<hr/>'))\n .append(\n $('<ul/>')\n .append(\n $('<li/>').append(\n $('<a/>', {\n 'data-action': 'moveLeft',\n text: Craft.t('app', 'Move to the left'),\n })\n )\n )\n .append(\n $('<li/>').append(\n $('<a/>', {\n 'data-action': 'moveRight',\n text: Craft.t('app', 'Move to the right'),\n })\n )\n )\n );\n\n let menuBtn = new Garnish.MenuBtn($editBtn, {\n onOptionSelect: this.onTabOptionSelect.bind(this),\n });\n\n menuBtn.menu.on('show', () => {\n if (this.$container.prev('.fld-tab').length) {\n menuBtn.menu.$container\n .find('[data-action=moveLeft]')\n .removeClass('disabled');\n } else {\n menuBtn.menu.$container\n .find('[data-action=moveLeft]')\n .addClass('disabled');\n }\n\n if (this.$container.next('.fld-tab').length) {\n menuBtn.menu.$container\n .find('[data-action=moveRight]')\n .removeClass('disabled');\n } else {\n menuBtn.menu.$container\n .find('[data-action=moveRight]')\n .addClass('disabled');\n }\n });\n },\n\n onTabOptionSelect: function (option) {\n if (!this.designer.settings.customizableTabs) {\n return;\n }\n\n let $option = $(option);\n let action = $option.data('action');\n\n switch (action) {\n case 'settings':\n if (!this.slideout) {\n this.createSettings();\n } else {\n this.slideout.open();\n }\n break;\n case 'remove':\n this.destroy();\n break;\n case 'moveLeft':\n let $prev = this.$container.prev('.fld-tab');\n if ($prev.length) {\n this.$container.insertBefore($prev);\n this.updatePositionInConfig();\n }\n break;\n case 'moveRight':\n let $next = this.$container.next('.fld-tab');\n if ($next.length) {\n this.$container.insertAfter($next);\n this.updatePositionInConfig();\n }\n break;\n }\n },\n\n createSettings: function () {\n const settingsHtml = this.$container.data('settings-html');\n const settingsJs = this.$container.data('settings-js');\n this.slideout = Craft.FieldLayoutDesigner.createSlideout(\n settingsHtml,\n settingsJs\n );\n\n this.slideout.$container.on('submit', (ev) => {\n ev.preventDefault();\n this.applySettings();\n });\n },\n\n applySettings: function () {\n if (!this.slideout.$container.find('[name$=\"[name]\"]').val()) {\n alert(Craft.t('app', 'You must specify a tab name.'));\n return;\n }\n\n // update the UI\n let $submitBtn = this.slideout.$container\n .find('button[type=submit]')\n .addClass('loading');\n\n const config = $.extend({}, this.config);\n delete config.elements;\n\n Craft.sendActionRequest('POST', 'fields/apply-layout-tab-settings', {\n data: {\n config: config,\n settingsNamespace: this.settingsNamespace,\n settings: this.slideout.$container.serialize(),\n },\n })\n .then((response) => {\n this.updateConfig((config) =>\n $.extend(response.data.config, {elements: config.elements})\n );\n debugger;\n const $label = this.$container.find('.tabs .tab span');\n const $indicator = $label.children('.fld-indicator');\n if (response.data.hasConditions) {\n if (!$indicator.length) {\n $label.append(\n $('<div/>', {\n class: 'fld-indicator',\n title: Craft.t('app', 'This tab is conditional'),\n 'aria-label': Craft.t('app', 'This tab is conditional'),\n 'data-icon': 'condition',\n })\n );\n }\n } else if ($indicator.length) {\n $indicator.remove();\n }\n this.slideout.close();\n })\n .catch((e) => {\n Craft.cp.displayError();\n console.error(e);\n })\n .finally(() => {\n $submitBtn.removeClass('loading');\n this.slideout.close();\n });\n },\n\n initElement: function ($element) {\n return new Craft.FieldLayoutDesigner.Element(this, $element);\n },\n\n get index() {\n return this.designer.config.tabs.findIndex((c) => c.uid === this.uid);\n },\n\n get config() {\n if (!this.uid) {\n throw 'Tab is missing its UID';\n }\n let config = this.designer.config.tabs.find((c) => c.uid === this.uid);\n if (!config) {\n config = {\n uid: this.uid,\n elements: [],\n };\n this.config = config;\n }\n return config;\n },\n\n set config(config) {\n if (this.destroyed) {\n return;\n }\n\n // Is the name changing?\n if (config.name && config.name !== this.config.name) {\n this.$container.find('.tabs .tab span').text(config.name);\n }\n\n const designerConfig = this.designer.config;\n const index = this.index;\n if (index !== -1) {\n designerConfig.tabs[index] = config;\n } else {\n const newIndex = $.inArray(\n this.$container[0],\n this.$container.parent().children('.fld-tab')\n );\n designerConfig.tabs.splice(newIndex, 0, config);\n }\n this.designer.config = designerConfig;\n },\n\n updateConfig: function (callback) {\n if (this.destroyed) {\n return;\n }\n\n const config = callback(this.config);\n if (config !== false) {\n this.config = config;\n }\n },\n\n updatePositionInConfig: function () {\n if (this.destroyed) {\n return;\n }\n\n this.designer.updateConfig((config) => {\n const tabConfig = this.config;\n const oldIndex = this.index;\n const newIndex = $.inArray(\n this.$container[0],\n this.$container.parent().children('.fld-tab')\n );\n if (oldIndex !== -1) {\n config.tabs.splice(oldIndex, 1);\n }\n config.tabs.splice(newIndex, 0, tabConfig);\n return config;\n });\n },\n\n destroy: function () {\n if (this.destroyed) {\n return;\n }\n\n this.destroyed = true;\n\n this.designer.updateConfig((config) => {\n const index = this.index;\n if (index === -1) {\n return false;\n }\n config.tabs.splice(index, 1);\n return config;\n });\n\n // First destroy the tab's elements\n let $elements = this.$container.find('.fld-element');\n for (let i = 0; i < $elements.length; i++) {\n $elements.eq(i).data('fld-element').destroy();\n }\n\n this.designer.tabGrid.removeItems(this.$container);\n this.designer.tabDrag.removeItems(this.$container);\n this.$container.remove();\n\n this.base();\n },\n});\n\nCraft.FieldLayoutDesigner.Element = Garnish.Base.extend({\n tab: null,\n $container: null,\n $settingsContainer: null,\n $editBtn: null,\n\n uid: null,\n isField: false,\n attribute: null,\n requirable: false,\n hasCustomWidth: false,\n hasSettings: false,\n settingsNamespace: null,\n slideout: null,\n\n init: function (tab, $container) {\n this.tab = tab;\n this.$container = $container;\n this.$container.data('fld-element', this);\n this.uid = this.$container.data('uid');\n\n // New element?\n if (!this.uid) {\n this.uid = Craft.uuid();\n this.config = $.extend(this.$container.data('config'), {uid: this.uid});\n }\n\n this.isField = this.$container.hasClass('fld-field');\n this.requirable =\n this.isField && Garnish.hasAttr(this.$container, 'data-requirable');\n\n if (this.isField) {\n this.attribute = this.$container.data('attribute');\n }\n\n this.settingsNamespace = this.$container\n .data('settings-namespace')\n .replace(/\\bELEMENT_UID\\b/g, this.uid);\n let settingsHtml = (this.$container.data('settings-html') || '').replace(\n /\\bELEMENT_UID\\b/g,\n this.uid\n );\n let isRequired =\n this.requirable && this.$container.hasClass('fld-required');\n this.hasCustomWidth =\n this.tab.designer.settings.customizableUi &&\n Garnish.hasAttr(this.$container, 'data-has-custom-width');\n this.hasSettings = settingsHtml || this.requirable;\n\n if (this.hasSettings) {\n // create the setting container\n this.$settingsContainer = $('<div/>', {\n class: 'hidden',\n });\n\n // create the edit button\n this.$editBtn = $('<a/>', {\n role: 'button',\n tabindex: 0,\n class: 'settings icon',\n title: Craft.t('app', 'Edit'),\n });\n\n const showSettings = () => {\n if (!this.slideout) {\n this.createSettings(settingsHtml, isRequired);\n } else {\n this.slideout.open();\n }\n };\n\n this.$editBtn.on('click', showSettings);\n this.$container.on('dblclick', showSettings);\n }\n\n this.initUi();\n\n // cleanup\n this.$container.attr('data-keywords', null);\n this.$container.attr('data-settings-html', null);\n },\n\n initUi: function () {\n if (this.hasCustomWidth) {\n let widthSlider = new Craft.SlidePicker(this.config.width || 100, {\n min: 25,\n max: 100,\n step: 25,\n valueLabel: (width) => {\n return Craft.t('app', '{pct} width', {pct: `${width}%`});\n },\n onChange: (width) => {\n this.updateConfig((config) => {\n config.width = width;\n return config;\n });\n },\n });\n widthSlider.$container.appendTo(this.$container);\n }\n\n if (this.hasSettings) {\n this.$editBtn.appendTo(this.$container);\n }\n },\n\n createSettings: function (settingsHtml, isRequired) {\n const settingsJs = (this.$container.data('settings-js') || '').replace(\n /\\bELEMENT_UID\\b/g,\n this.uid\n );\n this.slideout = Craft.FieldLayoutDesigner.createSlideout(\n settingsHtml,\n settingsJs\n );\n\n this.slideout.$container.on('submit', (ev) => {\n ev.preventDefault();\n this.applySettings();\n });\n\n if (this.requirable) {\n const $fieldsContainer = this.slideout.$container.find('.fields:first');\n Craft.ui\n .createLightswitchField({\n label: Craft.t('app', 'Required'),\n name: `${this.settingsNamespace}[required]`,\n on: isRequired,\n })\n .prependTo($fieldsContainer);\n }\n\n this.trigger('createSettings');\n },\n\n applySettings: function () {\n // update the UI\n let $submitBtn = this.slideout.$container\n .find('button[type=submit]')\n .addClass('loading');\n\n Craft.sendActionRequest('POST', 'fields/apply-layout-element-settings', {\n data: {\n config: this.config,\n settingsNamespace: this.settingsNamespace,\n settings: this.slideout.$container.serialize(),\n },\n })\n .then((response) => {\n this.config = response.data.config;\n this.$editBtn.detach();\n this.$container.html($(response.data.selectorHtml).html());\n this.initUi();\n })\n .catch((e) => {\n Craft.cp.displayError();\n console.error(e);\n })\n .finally(() => {\n $submitBtn.removeClass('loading');\n this.updateRequiredClass();\n this.slideout.close();\n });\n },\n\n updateRequiredClass: function () {\n if (!this.requirable) {\n return;\n }\n\n if (this.config.required) {\n this.$container.addClass('fld-required');\n } else {\n this.$container.removeClass('fld-required');\n }\n },\n\n get index() {\n const tabConfig = this.tab.config;\n if (typeof tabConfig === 'undefined') {\n return -1;\n }\n return tabConfig.elements.findIndex((c) => c.uid === this.uid);\n },\n\n get config() {\n if (!this.uid) {\n throw 'Tab is missing its UID';\n }\n let config = this.tab.config.elements.find((c) => c.uid === this.uid);\n if (!config) {\n config = {\n uid: this.uid,\n };\n this.config = config;\n }\n return config;\n },\n\n set config(config) {\n const tabConfig = this.tab.config;\n const index = this.index;\n if (index !== -1) {\n tabConfig.elements[index] = config;\n } else {\n const newIndex = $.inArray(\n this.$container[0],\n this.$container.parent().children('.fld-element')\n );\n tabConfig.elements.splice(newIndex, 0, config);\n }\n this.tab.config = tabConfig;\n },\n\n updateConfig: function (callback) {\n const config = callback(this.config);\n if (config !== false) {\n this.config = config;\n }\n },\n\n updatePositionInConfig: function () {\n this.tab.updateConfig((config) => {\n const elementConfig = this.config;\n const oldIndex = this.index;\n const newIndex = $.inArray(\n this.$container[0],\n this.$container.parent().children('.fld-element')\n );\n if (oldIndex !== -1) {\n config.elements.splice(oldIndex, 1);\n }\n config.elements.splice(newIndex, 0, elementConfig);\n return config;\n });\n },\n\n destroy: function () {\n this.tab.updateConfig((config) => {\n const index = this.index;\n if (index === -1) {\n return false;\n }\n config.elements.splice(index, 1);\n return config;\n });\n\n this.tab.designer.elementDrag.removeItems(this.$container);\n this.$container.remove();\n\n if (this.isField) {\n this.tab.designer.removeFieldByHandle(this.attribute);\n }\n\n this.base();\n },\n});\n\nCraft.FieldLayoutDesigner.BaseDrag = Garnish.Drag.extend({\n designer: null,\n $insertion: null,\n showingInsertion: false,\n $caboose: null,\n\n /**\n * Constructor\n */\n init: function (designer, settings) {\n this.designer = designer;\n this.base(this.findItems(), settings);\n },\n\n /**\n * On Drag Start\n */\n onDragStart: function () {\n this.base();\n\n // Create the insertion\n this.$insertion = this.createInsertion();\n\n // Add the caboose\n this.$caboose = this.createCaboose();\n this.$items = $().add(this.$items.add(this.$caboose));\n\n Garnish.$bod.addClass('dragging');\n },\n\n removeCaboose: function () {\n this.$items = this.$items.not(this.$caboose);\n this.$caboose.remove();\n },\n\n swapDraggeeWithInsertion: function () {\n this.$insertion.insertBefore(this.$draggee);\n this.$draggee.detach();\n this.$items = $().add(this.$items.not(this.$draggee).add(this.$insertion));\n this.showingInsertion = true;\n },\n\n swapInsertionWithDraggee: function () {\n this.$insertion.replaceWith(this.$draggee);\n this.$items = $().add(this.$items.not(this.$insertion).add(this.$draggee));\n this.showingInsertion = false;\n },\n\n /**\n * Sets the item midpoints up front so we don't have to keep checking on every mouse move\n */\n setMidpoints: function () {\n for (let i = 0; i < this.$items.length; i++) {\n let $item = $(this.$items[i]);\n let offset = $item.offset();\n\n // Skip library elements\n if ($item.hasClass('unused')) {\n continue;\n }\n\n $item.data('midpoint', {\n left: offset.left + $item.outerWidth() / 2,\n top: offset.top + $item.outerHeight() / 2,\n });\n }\n },\n\n /**\n * Returns the closest item to the cursor.\n */\n getClosestItem: function () {\n this.getClosestItem._closestItem = null;\n this.getClosestItem._closestItemMouseDiff = null;\n\n for (\n this.getClosestItem._i = 0;\n this.getClosestItem._i < this.$items.length;\n this.getClosestItem._i++\n ) {\n this.getClosestItem._$item = $(this.$items[this.getClosestItem._i]);\n\n this.getClosestItem._midpoint =\n this.getClosestItem._$item.data('midpoint');\n if (!this.getClosestItem._midpoint) {\n continue;\n }\n\n this.getClosestItem._mouseDiff = Garnish.getDist(\n this.getClosestItem._midpoint.left,\n this.getClosestItem._midpoint.top,\n this.mouseX,\n this.mouseY\n );\n\n if (\n this.getClosestItem._closestItem === null ||\n this.getClosestItem._mouseDiff <\n this.getClosestItem._closestItemMouseDiff\n ) {\n this.getClosestItem._closestItem = this.getClosestItem._$item[0];\n this.getClosestItem._closestItemMouseDiff =\n this.getClosestItem._mouseDiff;\n }\n }\n\n return this.getClosestItem._closestItem;\n },\n\n checkForNewClosestItem: function () {\n // Is there a new closest item?\n this.checkForNewClosestItem._closestItem = this.getClosestItem();\n\n if (this.checkForNewClosestItem._closestItem === this.$insertion[0]) {\n return;\n }\n\n if (\n this.showingInsertion &&\n $.inArray(this.$insertion[0], this.$items) <\n $.inArray(this.checkForNewClosestItem._closestItem, this.$items) &&\n $.inArray(this.checkForNewClosestItem._closestItem, this.$caboose) === -1\n ) {\n this.$insertion.insertAfter(this.checkForNewClosestItem._closestItem);\n } else {\n this.$insertion.insertBefore(this.checkForNewClosestItem._closestItem);\n }\n\n this.$items = $().add(this.$items.add(this.$insertion));\n this.showingInsertion = true;\n this.designer.tabGrid.refreshCols(true);\n this.setMidpoints();\n },\n\n /**\n * On Drag Stop\n */\n onDragStop: function () {\n if (this.showingInsertion) {\n this.swapInsertionWithDraggee();\n }\n\n this.removeCaboose();\n\n this.designer.tabGrid.refreshCols(true);\n\n // return the helpers to the draggees\n let offset = this.$draggee.offset();\n if (!offset || (offset.top === 0 && offset.left === 0)) {\n this.$draggee\n .css({\n display: this.draggeeDisplay,\n visibility: 'visible',\n opacity: 0,\n })\n .velocity({opacity: 1}, Garnish.FX_DURATION);\n this.helpers[0].velocity({opacity: 0}, Garnish.FX_DURATION, () => {\n this._showDraggee();\n });\n } else {\n this.returnHelpersToDraggees();\n }\n\n this.base();\n\n Garnish.$bod.removeClass('dragging');\n },\n});\n\nCraft.FieldLayoutDesigner.TabDrag = Craft.FieldLayoutDesigner.BaseDrag.extend({\n /**\n * Constructor\n */\n init: function (designer) {\n let settings = {\n handle: '.tab',\n };\n\n this.base(designer, settings);\n },\n\n findItems: function () {\n return this.designer.$tabContainer.find('> div.fld-tab');\n },\n\n /**\n * On Drag Start\n */\n onDragStart: function () {\n this.base();\n this.swapDraggeeWithInsertion();\n this.setMidpoints();\n },\n\n swapDraggeeWithInsertion: function () {\n this.base();\n this.designer.tabGrid.removeItems(this.$draggee);\n this.designer.tabGrid.addItems(this.$insertion);\n },\n\n swapInsertionWithDraggee: function () {\n this.base();\n this.designer.tabGrid.removeItems(this.$insertion);\n this.designer.tabGrid.addItems(this.$draggee);\n },\n\n /**\n * On Drag\n */\n onDrag: function () {\n this.checkForNewClosestItem();\n this.base();\n },\n\n /**\n * On Drag Stop\n */\n onDragStop: function () {\n this.base();\n\n // \"show\" the tab, but make it invisible\n this.$draggee.css({\n display: this.draggeeDisplay,\n visibility: 'hidden',\n });\n\n this.$draggee.data('fld-tab').updatePositionInConfig();\n },\n\n /**\n * Creates the caboose\n */\n createCaboose: function () {\n let $caboose = $('<div class=\"fld-tab fld-tab-caboose\"/>').appendTo(\n this.designer.$tabContainer\n );\n this.designer.tabGrid.addItems($caboose);\n return $caboose;\n },\n\n /**\n * Removes the caboose\n */\n removeCaboose: function () {\n this.base();\n this.designer.tabGrid.removeItems(this.$caboose);\n },\n\n /**\n * Creates the insertion\n */\n createInsertion: function () {\n let $tab = this.$draggee.find('.tab');\n\n return $(`\n<div class=\"fld-tab fld-insertion\" style=\"height: ${this.$draggee.height()}px;\">\n <div class=\"tabs\"><div class=\"tab sel draggable\" style=\"width: ${$tab.width()}px; height: ${$tab.height()}px;\"></div></div>\n <div class=\"fld-tabcontent\" style=\"height: ${this.$draggee\n .find('.fld-tabcontent')\n .height()}px;\"></div>\n</div>\n`);\n },\n});\n\nCraft.FieldLayoutDesigner.ElementDrag =\n Craft.FieldLayoutDesigner.BaseDrag.extend({\n draggingLibraryElement: false,\n draggingField: false,\n originalTab: null,\n\n /**\n * On Drag Start\n */\n onDragStart: function () {\n this.base();\n\n // Are we dragging an element from the library?\n this.draggingLibraryElement = this.$draggee.hasClass('unused');\n\n // Is it a field?\n this.draggingField = this.$draggee.hasClass('fld-field');\n\n // keep UI elements visible\n if (this.draggingLibraryElement && !this.draggingField) {\n this.$draggee.css({\n display: this.draggeeDisplay,\n visibility: 'visible',\n });\n }\n\n // Swap the draggee with the insertion if dragging a selected item\n if (!this.draggingLibraryElement) {\n this.originalTab = this.$draggee.closest('.fld-tab').data('fld-tab');\n this.swapDraggeeWithInsertion();\n } else {\n this.originalTab = null;\n }\n\n this.setMidpoints();\n },\n\n /**\n * On Drag\n */\n onDrag: function () {\n if (this.isDraggeeMandatory() || this.isHoveringOverTab()) {\n this.checkForNewClosestItem();\n } else if (this.showingInsertion) {\n this.$insertion.remove();\n this.$items = $().add(this.$items.not(this.$insertion));\n this.showingInsertion = false;\n this.designer.tabGrid.refreshCols(true);\n this.setMidpoints();\n }\n\n this.base();\n },\n\n isDraggeeMandatory: function () {\n return Garnish.hasAttr(this.$draggee, 'data-mandatory');\n },\n\n isHoveringOverTab: function () {\n for (let i = 0; i < this.designer.tabGrid.$items.length; i++) {\n if (\n Garnish.hitTest(\n this.mouseX,\n this.mouseY,\n this.designer.tabGrid.$items.eq(i)\n )\n ) {\n return true;\n }\n }\n\n return false;\n },\n\n findItems: function () {\n // Return all of the used + unused fields\n return this.designer.$tabContainer\n .find('.fld-element')\n .add(this.designer.$sidebar.find('.fld-element'));\n },\n\n /**\n * Creates the caboose\n */\n createCaboose: function () {\n let $caboose = $();\n let $fieldContainers = this.designer.$tabContainer.find(\n '> .fld-tab > .fld-tabcontent'\n );\n\n for (let i = 0; i < $fieldContainers.length; i++) {\n $caboose = $caboose.add($('<div/>').appendTo($fieldContainers[i]));\n }\n\n return $caboose;\n },\n\n /**\n * Creates the insertion\n */\n createInsertion: function () {\n return $(\n `<div class=\"fld-element fld-insertion\" style=\"height: ${this.$draggee.outerHeight()}px;\"/>`\n );\n },\n\n /**\n * On Drag Stop\n */\n onDragStop: function () {\n let showingInsertion = this.showingInsertion;\n if (showingInsertion) {\n if (this.draggingLibraryElement) {\n // Create a new element based on that one\n const $element = this.$draggee.clone().removeClass('unused');\n\n if (this.draggingField) {\n // Hide the library field\n this.$draggee\n .css({visibility: 'inherit', display: 'field'})\n .addClass('hidden');\n\n // Hide the group too?\n if (\n this.$draggee.siblings('.fld-field:not(.hidden)').length === 0\n ) {\n this.$draggee.closest('.fld-field-group').addClass('hidden');\n }\n }\n\n // Set this.$draggee to the clone, as if we were dragging that all along\n this.$draggee = $element;\n\n // Remember it for later\n this.addItems($element);\n }\n } else if (!this.draggingLibraryElement) {\n let $libraryElement = this.draggingField\n ? this.designer.$fields.filter(\n `[data-attribute=\"${this.$draggee.data('attribute')}\"]:first`\n )\n : this.designer.$uiLibraryElements.filter(\n `[data-type=\"${this.$draggee.data('type')}\"]:first`\n );\n\n if (this.draggingField) {\n // show the field in the library\n $libraryElement.removeClass('hidden');\n $libraryElement.closest('.fld-field-group').removeClass('hidden');\n }\n\n // Destroy the original element\n this.$draggee.data('fld-element').destroy();\n\n // Set this.$draggee to the library element, as if we were dragging that all along\n this.$draggee = $libraryElement;\n }\n\n this.base();\n\n this.$draggee.css({\n display: this.draggeeDisplay,\n visibility:\n this.draggingField || showingInsertion ? 'hidden' : 'visible',\n });\n\n if (showingInsertion) {\n const tab = this.$draggee.closest('.fld-tab').data('fld-tab');\n let element;\n\n if (this.draggingLibraryElement) {\n element = tab.initElement(this.$draggee);\n } else {\n element = this.$draggee.data('fld-element');\n\n // New tab?\n if (tab !== this.originalTab) {\n const config = element.config;\n\n this.originalTab.updateConfig((config) => {\n const index = element.index;\n if (index === -1) {\n return false;\n }\n config.elements.splice(index, 1);\n return config;\n });\n\n this.$draggee.data('fld-element').tab = tab;\n element.config = config;\n }\n }\n\n element.updatePositionInConfig();\n }\n },\n });\n","/** global: Craft */\n/** global: Garnish */\n/**\n * FieldToggle\n */\nCraft.FieldToggle = Garnish.Base.extend({\n $toggle: null,\n targetPrefix: null,\n targetSelector: null,\n reverseTargetSelector: null,\n\n _$target: null,\n _$reverseTarget: null,\n type: null,\n\n init: function (toggle) {\n this.$toggle = $(toggle);\n\n // Is this already a field toggle?\n if (this.$toggle.data('fieldtoggle')) {\n console.warn('Double-instantiating a field toggle on an element');\n this.$toggle.data('fieldtoggle').destroy();\n }\n\n this.$toggle.data('fieldtoggle', this);\n\n this.type = this.getType();\n\n if (this.type === 'select' || this.type === 'fieldset') {\n this.targetPrefix = this.$toggle.attr('data-target-prefix') || '';\n } else {\n this.targetSelector = this.normalizeTargetSelector(\n this.$toggle.data('target')\n );\n this.reverseTargetSelector = this.normalizeTargetSelector(\n this.$toggle.data('reverse-target')\n );\n }\n\n this.findTargets();\n\n switch (this.type) {\n case 'link':\n this.addListener(this.$toggle, 'click', 'onToggleChange');\n break;\n case 'fieldset':\n this.addListener(\n this.$toggle.find('input'),\n 'change',\n 'onToggleChange'\n );\n break;\n default:\n this.addListener(this.$toggle, 'change', 'onToggleChange');\n this.onToggleChange();\n }\n },\n\n normalizeTargetSelector: function (selector) {\n if (selector && !selector.match(/^[#\\.]/)) {\n selector = '#' + selector;\n }\n\n return selector;\n },\n\n getType: function () {\n let nodeName = this.$toggle.prop('nodeName');\n if (\n (nodeName === 'INPUT' && this.$toggle.attr('type') === 'checkbox') ||\n this.$toggle.attr('role') === 'checkbox' ||\n this.$toggle.attr('role') === 'switch'\n ) {\n return 'checkbox';\n }\n\n switch (nodeName) {\n case 'SELECT':\n if (Garnish.hasAttr(this.$toggle, 'data-boolean-menu')) {\n return 'booleanMenu';\n }\n return 'select';\n case 'A':\n return 'link';\n default:\n return 'fieldset';\n }\n },\n\n findTargets: function () {\n if (this.type === 'select' || this.type === 'fieldset') {\n var toggleVal = this.getToggleVal();\n this._$target = $(\n this.normalizeTargetSelector(this.targetPrefix + this.getToggleVal())\n );\n } else {\n if (this.targetSelector) {\n this._$target = $(this.targetSelector);\n }\n\n if (this.reverseTargetSelector) {\n this._$reverseTarget = $(this.reverseTargetSelector);\n }\n }\n },\n\n getToggleVal: function () {\n switch (this.type) {\n case 'checkbox':\n if (typeof this.$toggle.prop('checked') !== 'undefined') {\n return this.$toggle.prop('checked');\n }\n return this.$toggle.attr('aria-checked') === 'true';\n\n case 'booleanMenu':\n const boolean = this.$toggle.data('boolean');\n if (typeof boolean !== 'undefined') {\n return boolean;\n }\n const val = this.$toggle.val();\n return val && val !== '0';\n\n default:\n let postVal;\n if (this.type === 'fieldset') {\n postVal = this.$toggle.find('input:checked:first').val();\n } else {\n postVal = Garnish.getInputPostVal(this.$toggle);\n }\n\n // Normalize the value\n return typeof postVal === 'undefined' || postVal === null\n ? null\n : postVal.replace(/[^\\w]+/g, '-');\n }\n },\n\n onToggleChange: function () {\n if (this.type === 'select' || this.type === 'fieldset') {\n this.hideTarget(this._$target);\n this.findTargets();\n this.showTarget(this._$target);\n } else {\n this.findTargets();\n\n if (this.type === 'link') {\n this.onToggleChange._show =\n this.$toggle.hasClass('collapsed') ||\n !this.$toggle.hasClass('expanded');\n } else {\n this.onToggleChange._show = !!this.getToggleVal();\n }\n\n if (this.onToggleChange._show) {\n this.showTarget(this._$target);\n this.hideTarget(this._$reverseTarget);\n } else {\n this.hideTarget(this._$target);\n this.showTarget(this._$reverseTarget);\n }\n\n delete this.onToggleChange._show;\n }\n },\n\n showTarget: function ($target) {\n if ($target && $target.length) {\n this.showTarget._currentHeight = $target.height();\n\n $target.removeClass('hidden');\n\n if (this.type !== 'select' && this.type !== 'fieldset') {\n if (this.type === 'link') {\n this.$toggle.removeClass('collapsed');\n this.$toggle.addClass('expanded');\n }\n\n for (let i = 0; i < $target.length; i++) {\n (($t) => {\n if ($t.prop('nodeName') !== 'SPAN') {\n $t.height('auto');\n this.showTarget._targetHeight = $t.height();\n $t.css({\n height: this.showTarget._currentHeight,\n overflow: 'hidden',\n });\n\n $t.velocity('stop');\n\n $t.velocity(\n {height: this.showTarget._targetHeight},\n 'fast',\n function () {\n $t.css({\n height: '',\n overflow: '',\n });\n }\n );\n }\n })($target.eq(i));\n }\n\n delete this.showTarget._targetHeight;\n }\n\n delete this.showTarget._currentHeight;\n\n // Trigger a resize event in case there are any grids in the target that need to initialize\n Garnish.$win.trigger('resize');\n }\n },\n\n hideTarget: function ($target) {\n if ($target && $target.length) {\n if (this.type === 'select' || this.type === 'fieldset') {\n $target.addClass('hidden');\n } else {\n if (this.type === 'link') {\n this.$toggle.removeClass('expanded');\n this.$toggle.addClass('collapsed');\n }\n\n for (let i = 0; i < $target.length; i++) {\n (($t) => {\n if ($t.hasClass('hidden')) {\n return;\n }\n if ($t.prop('nodeName') === 'SPAN') {\n $t.addClass('hidden');\n } else {\n $t.css('overflow', 'hidden');\n $t.velocity('stop');\n $t.velocity({height: 0}, 'fast', function () {\n $t.addClass('hidden');\n });\n }\n })($target.eq(i));\n }\n }\n }\n },\n\n destroy: function () {\n this.$toggle.removeData('fieldtoggle');\n this.base();\n },\n});\n","/** global: Craft */\n/** global: Garnish */\nCraft.Grid = Garnish.Base.extend(\n {\n $container: null,\n\n $items: null,\n items: null,\n totalCols: null,\n colGutterDrop: null,\n colPctWidth: null,\n\n possibleItemColspans: null,\n possibleItemPositionsByColspan: null,\n\n itemPositions: null,\n itemColspansByPosition: null,\n\n layouts: null,\n layout: null,\n itemHeights: null,\n leftPadding: null,\n\n _refreshingCols: false,\n _refreshColsAfterRefresh: false,\n _forceRefreshColsAfterRefresh: false,\n\n init: function (container, settings) {\n this.$container = $(container);\n\n // Is this already a grid?\n if (this.$container.data('grid')) {\n console.warn('Double-instantiating a grid on an element');\n this.$container.data('grid').destroy();\n }\n\n this.$container.data('grid', this);\n\n this.setSettings(settings, Craft.Grid.defaults);\n\n // Set the refreshCols() proxy that container resizes will trigger\n this.handleContainerHeightProxy = () => {\n this.refreshCols(false, true);\n };\n\n this.$items = this.$container.children(this.settings.itemSelector);\n this.setItems();\n this.refreshCols(true, false);\n\n Garnish.$doc.ready(() => {\n this.refreshCols(false, false);\n });\n },\n\n addItems: function (items) {\n this.$items = $().add(this.$items.add(items));\n this.setItems();\n this.refreshCols(true, true);\n },\n\n removeItems: function (items) {\n this.$items = $().add(this.$items.not(items));\n this.setItems();\n this.refreshCols(true, true);\n },\n\n resetItemOrder: function () {\n this.$items = $().add(this.$items);\n this.setItems();\n this.refreshCols(true, true);\n },\n\n setItems: function () {\n this.setItems._ = {};\n\n this.items = [];\n\n for (\n this.setItems._.i = 0;\n this.setItems._.i < this.$items.length;\n this.setItems._.i++\n ) {\n this.items.push($(this.$items[this.setItems._.i]));\n }\n\n delete this.setItems._;\n },\n\n refreshCols: function (force) {\n if (this._refreshingCols) {\n this._refreshColsAfterRefresh = true;\n if (force) {\n this._forceRefreshColsAfterRefresh = true;\n }\n return;\n }\n\n this._refreshingCols = true;\n\n if (!this.items.length) {\n this.completeRefreshCols();\n return;\n }\n\n this.refreshCols._ = {};\n\n // Check to see if the grid is actually visible\n this.refreshCols._.oldHeight = this.$container[0].style.height;\n this.$container[0].style.height = 1;\n this.refreshCols._.scrollHeight = this.$container[0].scrollHeight;\n this.$container[0].style.height = this.refreshCols._.oldHeight;\n\n if (this.refreshCols._.scrollHeight === 0) {\n this.completeRefreshCols();\n return;\n }\n\n if (this.settings.cols) {\n this.refreshCols._.totalCols = this.settings.cols;\n } else {\n this.refreshCols._.totalCols = Math.floor(\n this.$container.width() / this.settings.minColWidth\n );\n\n // If we're adding a new column, require an extra 20 pixels in case a scrollbar shows up\n if (\n this.totalCols !== null &&\n this.refreshCols._.totalCols > this.totalCols\n ) {\n this.refreshCols._.totalCols = Math.floor(\n (this.$container.width() - 20) / this.settings.minColWidth\n );\n }\n\n if (\n this.settings.maxCols &&\n this.refreshCols._.totalCols > this.settings.maxCols\n ) {\n this.refreshCols._.totalCols = this.settings.maxCols;\n }\n }\n\n if (this.refreshCols._.totalCols === 0) {\n this.refreshCols._.totalCols = 1;\n }\n\n // Same number of columns as before?\n if (force !== true && this.totalCols === this.refreshCols._.totalCols) {\n this.completeRefreshCols();\n return;\n }\n\n this.totalCols = this.refreshCols._.totalCols;\n this.colGutterDrop =\n (this.settings.gutter * (this.totalCols - 1)) / this.totalCols;\n\n // Temporarily stop listening to container resizes\n this.removeListener(this.$container, 'resize');\n\n if (this.settings.fillMode === 'grid') {\n this.refreshCols._.itemIndex = 0;\n\n while (this.refreshCols._.itemIndex < this.items.length) {\n // Append the next X items and figure out which one is the tallest\n this.refreshCols._.tallestItemHeight = -1;\n this.refreshCols._.colIndex = 0;\n\n for (\n this.refreshCols._.i = this.refreshCols._.itemIndex;\n this.refreshCols._.i <\n this.refreshCols._.itemIndex + this.totalCols &&\n this.refreshCols._.i < this.items.length;\n this.refreshCols._.i++\n ) {\n this.refreshCols._.itemHeight = this.items[this.refreshCols._.i]\n .height('auto')\n .height();\n\n if (\n this.refreshCols._.itemHeight >\n this.refreshCols._.tallestItemHeight\n ) {\n this.refreshCols._.tallestItemHeight =\n this.refreshCols._.itemHeight;\n }\n\n this.refreshCols._.colIndex++;\n }\n\n if (this.settings.snapToGrid) {\n this.refreshCols._.remainder =\n this.refreshCols._.tallestItemHeight % this.settings.snapToGrid;\n\n if (this.refreshCols._.remainder) {\n this.refreshCols._.tallestItemHeight +=\n this.settings.snapToGrid - this.refreshCols._.remainder;\n }\n }\n\n // Now set their heights to the tallest one\n for (\n this.refreshCols._.i = this.refreshCols._.itemIndex;\n this.refreshCols._.i <\n this.refreshCols._.itemIndex + this.totalCols &&\n this.refreshCols._.i < this.items.length;\n this.refreshCols._.i++\n ) {\n this.items[this.refreshCols._.i].height(\n this.refreshCols._.tallestItemHeight\n );\n }\n\n // set the this.refreshCols._.itemIndex pointer to the next one up\n this.refreshCols._.itemIndex += this.totalCols;\n }\n } else {\n this.removeListener(this.$items, 'resize');\n\n // If there's only one column, sneak out early\n if (this.totalCols === 1) {\n this.$container.height('auto');\n this.$items\n .show()\n .css({\n position: 'relative',\n width: 'auto',\n top: 0,\n })\n .css(Craft.left, 0);\n } else {\n this.$items.css('position', 'absolute');\n this.colPctWidth = 100 / this.totalCols;\n\n // The setup\n\n this.layouts = [];\n\n this.itemPositions = [];\n this.itemColspansByPosition = [];\n\n // Figure out all of the possible colspans for each item,\n // as well as all the possible positions for each item at each of its colspans\n\n this.possibleItemColspans = [];\n this.possibleItemPositionsByColspan = [];\n this.itemHeightsByColspan = [];\n\n for (\n this.refreshCols._.item = 0;\n this.refreshCols._.item < this.items.length;\n this.refreshCols._.item++\n ) {\n this.possibleItemColspans[this.refreshCols._.item] = [];\n this.possibleItemPositionsByColspan[this.refreshCols._.item] = {};\n this.itemHeightsByColspan[this.refreshCols._.item] = {};\n\n this.refreshCols._.$item =\n this.items[this.refreshCols._.item].show();\n this.refreshCols._.positionRight =\n this.refreshCols._.$item.data('position') === 'right';\n this.refreshCols._.positionLeft =\n this.refreshCols._.$item.data('position') === 'left';\n this.refreshCols._.minColspan = this.refreshCols._.$item.data(\n 'colspan'\n )\n ? this.refreshCols._.$item.data('colspan')\n : this.refreshCols._.$item.data('min-colspan')\n ? this.refreshCols._.$item.data('min-colspan')\n : 1;\n this.refreshCols._.maxColspan = this.refreshCols._.$item.data(\n 'colspan'\n )\n ? this.refreshCols._.$item.data('colspan')\n : this.refreshCols._.$item.data('max-colspan')\n ? this.refreshCols._.$item.data('max-colspan')\n : this.totalCols;\n\n if (this.refreshCols._.minColspan > this.totalCols) {\n this.refreshCols._.minColspan = this.totalCols;\n }\n if (this.refreshCols._.maxColspan > this.totalCols) {\n this.refreshCols._.maxColspan = this.totalCols;\n }\n\n for (\n this.refreshCols._.colspan = this.refreshCols._.minColspan;\n this.refreshCols._.colspan <= this.refreshCols._.maxColspan;\n this.refreshCols._.colspan++\n ) {\n // Get the height for this colspan\n this.refreshCols._.$item.css(\n 'width',\n this.getItemWidthCss(this.refreshCols._.colspan)\n );\n this.itemHeightsByColspan[this.refreshCols._.item][\n this.refreshCols._.colspan\n ] = this.refreshCols._.$item.outerHeight();\n\n this.possibleItemColspans[this.refreshCols._.item].push(\n this.refreshCols._.colspan\n );\n this.possibleItemPositionsByColspan[this.refreshCols._.item][\n this.refreshCols._.colspan\n ] = [];\n\n if (this.refreshCols._.positionLeft) {\n this.refreshCols._.minPosition = 0;\n this.refreshCols._.maxPosition = 0;\n } else if (this.refreshCols._.positionRight) {\n this.refreshCols._.minPosition =\n this.totalCols - this.refreshCols._.colspan;\n this.refreshCols._.maxPosition = this.refreshCols._.minPosition;\n } else {\n this.refreshCols._.minPosition = 0;\n this.refreshCols._.maxPosition =\n this.totalCols - this.refreshCols._.colspan;\n }\n\n for (\n this.refreshCols._.position = this.refreshCols._.minPosition;\n this.refreshCols._.position <= this.refreshCols._.maxPosition;\n this.refreshCols._.position++\n ) {\n this.possibleItemPositionsByColspan[this.refreshCols._.item][\n this.refreshCols._.colspan\n ].push(this.refreshCols._.position);\n }\n }\n }\n\n // Find all the possible layouts\n\n this.refreshCols._.colHeights = [];\n\n for (\n this.refreshCols._.i = 0;\n this.refreshCols._.i < this.totalCols;\n this.refreshCols._.i++\n ) {\n this.refreshCols._.colHeights.push(0);\n }\n\n this.createLayouts(0, [], [], this.refreshCols._.colHeights, 0);\n\n // Now find the layout that looks the best.\n\n // First find the layouts with the highest number of used columns\n this.refreshCols._.layoutTotalCols = [];\n\n for (\n this.refreshCols._.i = 0;\n this.refreshCols._.i < this.layouts.length;\n this.refreshCols._.i++\n ) {\n this.refreshCols._.layoutTotalCols[this.refreshCols._.i] = 0;\n\n for (\n this.refreshCols._.j = 0;\n this.refreshCols._.j < this.totalCols;\n this.refreshCols._.j++\n ) {\n if (\n this.layouts[this.refreshCols._.i].colHeights[\n this.refreshCols._.j\n ]\n ) {\n this.refreshCols._.layoutTotalCols[this.refreshCols._.i]++;\n }\n }\n }\n\n this.refreshCols._.highestTotalCols = Math.max.apply(\n null,\n this.refreshCols._.layoutTotalCols\n );\n\n // Filter out the ones that aren't using as many columns as they could be\n for (\n this.refreshCols._.i = this.layouts.length - 1;\n this.refreshCols._.i >= 0;\n this.refreshCols._.i--\n ) {\n if (\n this.refreshCols._.layoutTotalCols[this.refreshCols._.i] !==\n this.refreshCols._.highestTotalCols\n ) {\n this.layouts.splice(this.refreshCols._.i, 1);\n }\n }\n\n // Find the layout(s) with the least overall height\n this.refreshCols._.layoutHeights = [];\n\n for (\n this.refreshCols._.i = 0;\n this.refreshCols._.i < this.layouts.length;\n this.refreshCols._.i++\n ) {\n this.refreshCols._.layoutHeights.push(\n Math.max.apply(\n null,\n this.layouts[this.refreshCols._.i].colHeights\n )\n );\n }\n\n this.refreshCols._.shortestHeight = Math.min.apply(\n null,\n this.refreshCols._.layoutHeights\n );\n this.refreshCols._.shortestLayouts = [];\n this.refreshCols._.emptySpaces = [];\n\n for (\n this.refreshCols._.i = 0;\n this.refreshCols._.i < this.refreshCols._.layoutHeights.length;\n this.refreshCols._.i++\n ) {\n if (\n this.refreshCols._.layoutHeights[this.refreshCols._.i] ===\n this.refreshCols._.shortestHeight\n ) {\n this.refreshCols._.shortestLayouts.push(\n this.layouts[this.refreshCols._.i]\n );\n\n // Now get its total empty space, including any trailing empty space\n this.refreshCols._.emptySpace =\n this.layouts[this.refreshCols._.i].emptySpace;\n\n for (\n this.refreshCols._.j = 0;\n this.refreshCols._.j < this.totalCols;\n this.refreshCols._.j++\n ) {\n this.refreshCols._.emptySpace +=\n this.refreshCols._.shortestHeight -\n this.layouts[this.refreshCols._.i].colHeights[\n this.refreshCols._.j\n ];\n }\n\n this.refreshCols._.emptySpaces.push(\n this.refreshCols._.emptySpace\n );\n }\n }\n\n // And the layout with the least empty space is...\n this.layout =\n this.refreshCols._.shortestLayouts[\n $.inArray(\n Math.min.apply(null, this.refreshCols._.emptySpaces),\n this.refreshCols._.emptySpaces\n )\n ];\n\n // Set the item widths and left positions\n for (\n this.refreshCols._.i = 0;\n this.refreshCols._.i < this.items.length;\n this.refreshCols._.i++\n ) {\n this.refreshCols._.css = {\n width: this.getItemWidthCss(\n this.layout.colspans[this.refreshCols._.i]\n ),\n };\n this.refreshCols._.css[Craft.left] = this.getItemLeftPosCss(\n this.layout.positions[this.refreshCols._.i]\n );\n this.items[this.refreshCols._.i].css(this.refreshCols._.css);\n }\n\n // If every item is at position 0, then let them lay out au naturel\n if (this.isSimpleLayout()) {\n this.$container.height('auto');\n this.$items.css({\n position: 'relative',\n top: 0,\n 'margin-bottom': this.settings.gutter + 'px',\n });\n } else {\n this.$items.css('position', 'absolute');\n\n // Now position the items\n this.positionItems();\n\n // Update the positions as the items' heigthts change\n this.addListener(this.$items, 'resize', 'onItemResize');\n }\n }\n }\n\n this.completeRefreshCols();\n\n // Resume container resize listening\n this.addListener(\n this.$container,\n 'resize',\n this.handleContainerHeightProxy\n );\n\n this.onRefreshCols();\n },\n\n completeRefreshCols: function () {\n // Delete the internal variable object\n if (typeof this.refreshCols._ !== 'undefined') {\n delete this.refreshCols._;\n }\n\n this._refreshingCols = false;\n\n if (this._refreshColsAfterRefresh) {\n var force = this._forceRefreshColsAfterRefresh;\n this._refreshColsAfterRefresh = false;\n this._forceRefreshColsAfterRefresh = false;\n\n Garnish.requestAnimationFrame(() => {\n this.refreshCols(force);\n });\n }\n },\n\n getItemWidth: function (colspan) {\n return this.colPctWidth * colspan;\n },\n\n getItemWidthCss: function (colspan) {\n return (\n 'calc(' +\n this.getItemWidth(colspan) +\n '% - ' +\n this.colGutterDrop +\n 'px)'\n );\n },\n\n getItemWidthInPx: function (colspan) {\n return (\n (this.getItemWidth(colspan) / 100) * this.$container.width() -\n this.colGutterDrop\n );\n },\n\n getItemLeftPosCss: function (position) {\n return (\n 'calc(' +\n '(' +\n this.getItemWidth(1) +\n '% + ' +\n (this.settings.gutter - this.colGutterDrop) +\n 'px) * ' +\n position +\n ')'\n );\n },\n\n getItemLeftPosInPx: function (position) {\n return (\n ((this.getItemWidth(1) / 100) * this.$container.width() +\n (this.settings.gutter - this.colGutterDrop)) *\n position\n );\n },\n\n createLayouts: function (\n item,\n prevPositions,\n prevColspans,\n prevColHeights,\n prevEmptySpace\n ) {\n new Craft.Grid.LayoutGenerator(this).createLayouts(\n item,\n prevPositions,\n prevColspans,\n prevColHeights,\n prevEmptySpace\n );\n },\n\n isSimpleLayout: function () {\n this.isSimpleLayout._ = {};\n\n for (\n this.isSimpleLayout._.i = 0;\n this.isSimpleLayout._.i < this.layout.positions.length;\n this.isSimpleLayout._.i++\n ) {\n if (this.layout.positions[this.isSimpleLayout._.i] !== 0) {\n delete this.isSimpleLayout._;\n return false;\n }\n }\n\n delete this.isSimpleLayout._;\n return true;\n },\n\n positionItems: function () {\n this.positionItems._ = {};\n\n this.positionItems._.colHeights = [];\n\n for (\n this.positionItems._.i = 0;\n this.positionItems._.i < this.totalCols;\n this.positionItems._.i++\n ) {\n this.positionItems._.colHeights.push(0);\n }\n\n for (\n this.positionItems._.i = 0;\n this.positionItems._.i < this.items.length;\n this.positionItems._.i++\n ) {\n this.positionItems._.endingCol =\n this.layout.positions[this.positionItems._.i] +\n this.layout.colspans[this.positionItems._.i] -\n 1;\n this.positionItems._.affectedColHeights = [];\n\n for (\n this.positionItems._.col =\n this.layout.positions[this.positionItems._.i];\n this.positionItems._.col <= this.positionItems._.endingCol;\n this.positionItems._.col++\n ) {\n this.positionItems._.affectedColHeights.push(\n this.positionItems._.colHeights[this.positionItems._.col]\n );\n }\n\n this.positionItems._.top = Math.max.apply(\n null,\n this.positionItems._.affectedColHeights\n );\n if (this.positionItems._.top > 0) {\n this.positionItems._.top += this.settings.gutter;\n }\n\n this.items[this.positionItems._.i].css('top', this.positionItems._.top);\n\n // Now add the new heights to those columns\n for (\n this.positionItems._.col =\n this.layout.positions[this.positionItems._.i];\n this.positionItems._.col <= this.positionItems._.endingCol;\n this.positionItems._.col++\n ) {\n this.positionItems._.colHeights[this.positionItems._.col] =\n this.positionItems._.top +\n this.itemHeightsByColspan[this.positionItems._.i][\n this.layout.colspans[this.positionItems._.i]\n ];\n }\n }\n\n // Set the container height\n this.$container.height(\n Math.max.apply(null, this.positionItems._.colHeights)\n );\n\n delete this.positionItems._;\n },\n\n onItemResize: function (ev) {\n this.onItemResize._ = {};\n\n // Prevent this from bubbling up to the container, which has its own resize listener\n ev.stopPropagation();\n\n this.onItemResize._.item = $.inArray(ev.currentTarget, this.$items);\n\n if (this.onItemResize._.item !== -1) {\n // Update the height and reposition the items\n this.onItemResize._.newHeight =\n this.items[this.onItemResize._.item].outerHeight();\n\n if (\n this.onItemResize._.newHeight !==\n this.itemHeightsByColspan[this.onItemResize._.item][\n this.layout.colspans[this.onItemResize._.item]\n ]\n ) {\n this.itemHeightsByColspan[this.onItemResize._.item][\n this.layout.colspans[this.onItemResize._.item]\n ] = this.onItemResize._.newHeight;\n this.positionItems(false);\n }\n }\n\n delete this.onItemResize._;\n },\n\n onRefreshCols: function () {\n this.trigger('refreshCols');\n this.settings.onRefreshCols();\n },\n\n destroy: function () {\n this.$container.removeData('grid');\n this.base();\n },\n },\n {\n defaults: {\n itemSelector: '.item',\n cols: null,\n maxCols: null,\n minColWidth: 320,\n gutter: 14,\n fillMode: 'top',\n colClass: 'col',\n snapToGrid: null,\n\n onRefreshCols: $.noop,\n },\n }\n);\n\nCraft.Grid.LayoutGenerator = Garnish.Base.extend({\n grid: null,\n _: null,\n\n init: function (grid) {\n this.grid = grid;\n },\n\n createLayouts: function (\n item,\n prevPositions,\n prevColspans,\n prevColHeights,\n prevEmptySpace\n ) {\n this._ = {};\n\n // Loop through all possible colspans\n for (\n this._.c = 0;\n this._.c < this.grid.possibleItemColspans[item].length;\n this._.c++\n ) {\n this._.colspan = this.grid.possibleItemColspans[item][this._.c];\n\n // Loop through all the possible positions for this colspan,\n // and find the one that is closest to the top\n\n this._.tallestColHeightsByPosition = [];\n\n for (\n this._.p = 0;\n this._.p <\n this.grid.possibleItemPositionsByColspan[item][this._.colspan].length;\n this._.p++\n ) {\n this._.position =\n this.grid.possibleItemPositionsByColspan[item][this._.colspan][\n this._.p\n ];\n\n this._.colHeightsForPosition = [];\n this._.endingCol = this._.position + this._.colspan - 1;\n\n for (\n this._.col = this._.position;\n this._.col <= this._.endingCol;\n this._.col++\n ) {\n this._.colHeightsForPosition.push(prevColHeights[this._.col]);\n }\n\n this._.tallestColHeightsByPosition[this._.p] = Math.max.apply(\n null,\n this._.colHeightsForPosition\n );\n }\n\n // And the shortest position for this colspan is...\n this._.p = $.inArray(\n Math.min.apply(null, this._.tallestColHeightsByPosition),\n this._.tallestColHeightsByPosition\n );\n this._.position =\n this.grid.possibleItemPositionsByColspan[item][this._.colspan][\n this._.p\n ];\n\n // Now log the colspan/position placement\n this._.positions = prevPositions.slice(0);\n this._.colspans = prevColspans.slice(0);\n this._.colHeights = prevColHeights.slice(0);\n this._.emptySpace = prevEmptySpace;\n\n this._.positions.push(this._.position);\n this._.colspans.push(this._.colspan);\n\n // Add the new heights to those columns\n this._.tallestColHeight = this._.tallestColHeightsByPosition[this._.p];\n this._.endingCol = this._.position + this._.colspan - 1;\n\n for (\n this._.col = this._.position;\n this._.col <= this._.endingCol;\n this._.col++\n ) {\n this._.emptySpace +=\n this._.tallestColHeight - this._.colHeights[this._.col];\n this._.colHeights[this._.col] =\n this._.tallestColHeight +\n this.grid.itemHeightsByColspan[item][this._.colspan];\n }\n\n // If this is the last item, create the layout\n if (item === this.grid.items.length - 1) {\n this.grid.layouts.push({\n positions: this._.positions,\n colspans: this._.colspans,\n colHeights: this._.colHeights,\n emptySpace: this._.emptySpace,\n });\n } else {\n // Dive deeper\n this.grid.createLayouts(\n item + 1,\n this._.positions,\n this._.colspans,\n this._.colHeights,\n this._.emptySpace\n );\n }\n }\n\n delete this._;\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Handle Generator\n */\nCraft.HandleGenerator = Craft.BaseInputGenerator.extend({\n generateTargetValue: function (sourceVal) {\n // Remove HTML tags\n var handle = sourceVal.replace('/<(.*?)>/g', '');\n\n // Remove inner-word punctuation\n handle = handle.replace(/['\"‘’“”\\[\\]\\(\\)\\{\\}:]/g, '');\n\n // Make it lowercase\n handle = handle.toLowerCase();\n\n // Convert extended ASCII characters to basic ASCII\n handle = Craft.asciiString(handle);\n\n if (!this.settings.allowNonAlphaStart) {\n // Handle must start with a letter\n handle = handle.replace(/^[^a-z]+/, '');\n }\n\n // Get the \"words\"\n var words = Craft.filterArray(handle.split(/[^a-z0-9]+/));\n handle = '';\n\n if (Craft.handleCasing === 'snake') {\n return words.join('_');\n }\n\n // Make it camelCase\n for (let i = 0; i < words.length; i++) {\n if (Craft.handleCasing !== 'pascal' && i === 0) {\n handle += words[i];\n } else {\n handle += words[i].charAt(0).toUpperCase() + words[i].substring(1);\n }\n }\n\n return handle;\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n\n/**\n * Image upload class for user photos, site icon and logo.\n */\nCraft.ImageUpload = Garnish.Base.extend(\n {\n $container: null,\n progressBar: null,\n uploader: null,\n\n init: function (settings) {\n this.setSettings(settings, Craft.ImageUpload.defaults);\n this.initImageUpload();\n },\n\n initImageUpload: function () {\n this.$container = $(this.settings.containerSelector);\n this.progressBar = new Craft.ProgressBar(\n $('<div class=\"progress-shade\"></div>').appendTo(this.$container)\n );\n\n var options = {\n url: Craft.getActionUrl(this.settings.uploadAction),\n formData: this.settings.postParameters,\n fileInput: this.$container.find(this.settings.fileInputSelector),\n paramName: this.settings.uploadParamName,\n };\n\n // If CSRF protection isn't enabled, these won't be defined.\n if (\n typeof Craft.csrfTokenName !== 'undefined' &&\n typeof Craft.csrfTokenValue !== 'undefined'\n ) {\n // Add the CSRF token\n options.formData[Craft.csrfTokenName] = Craft.csrfTokenValue;\n }\n\n options.events = {};\n options.events.fileuploadstart = this._onUploadStart.bind(this);\n options.events.fileuploadprogressall = this._onUploadProgress.bind(this);\n options.events.fileuploaddone = this._onUploadComplete.bind(this);\n options.events.fileuploadfail = this._onUploadFailure.bind(this);\n\n this.uploader = new Craft.Uploader(this.$container, options);\n\n this.initButtons();\n },\n\n initButtons: function () {\n this.$container\n .find(this.settings.uploadButtonSelector)\n .on('click', (ev) => {\n this.$container\n .find(this.settings.fileInputSelector)\n .trigger('click');\n });\n\n this.$container\n .find(this.settings.deleteButtonSelector)\n .on('click', (ev) => {\n if (\n confirm(\n Craft.t('app', 'Are you sure you want to delete this image?')\n )\n ) {\n $(ev.currentTarget)\n .parent()\n .append('<div class=\"blocking-modal\"></div>');\n\n Craft.sendActionRequest('POST', this.settings.deleteAction, {\n data: this.settings.postParameters,\n }).then(({data}) => {\n this.refreshImage(data);\n });\n }\n });\n },\n\n refreshImage: function (response) {\n $(this.settings.containerSelector).replaceWith(response.html);\n this.settings.onAfterRefreshImage(response);\n this.initImageUpload();\n },\n\n /**\n * On upload start.\n */\n _onUploadStart: function (event) {\n this.progressBar.$progressBar.css({\n top: Math.round(this.$container.outerHeight() / 2) - 6,\n });\n\n this.$container.addClass('uploading');\n this.progressBar.resetProgressBar();\n this.progressBar.showProgressBar();\n },\n\n /**\n * On upload progress.\n */\n _onUploadProgress: function (event, data) {\n var progress = parseInt((data.loaded / data.total) * 100, 10);\n this.progressBar.setProgressPercentage(progress);\n },\n\n /**\n * On a file being uploaded.\n */\n _onUploadComplete: function (event, data) {\n if (data.result.error) {\n alert(data.result.error);\n } else {\n var html = $(data.result.html);\n this.refreshImage(data.result);\n }\n\n // Last file\n if (this.uploader.isLastUpload()) {\n this.progressBar.hideProgressBar();\n this.$container.removeClass('uploading');\n }\n },\n\n /**\n * On Upload Failure.\n */\n _onUploadFailure: function (event, data) {\n const response = data.response();\n let {message, filename} = response?.jqXHR?.responseJSON || {};\n\n if (!message) {\n message = filename\n ? Craft.t('app', 'Upload failed for “{filename}”.', {filename})\n : Craft.t('app', 'Upload failed.');\n }\n\n alert(message);\n this.progressBar.hideProgressBar();\n this.$container.removeClass('uploading');\n },\n },\n {\n defaults: {\n postParameters: {},\n uploadAction: '',\n deleteAction: '',\n fileInputSelector: '',\n\n onAfterRefreshImage: $.noop,\n containerSelector: null,\n\n uploadButtonSelector: null,\n deleteButtonSelector: null,\n\n uploadParamName: 'files',\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Info icon class\n */\nCraft.InfoIcon = Garnish.Base.extend({\n $container: null,\n $icon: null,\n $liveRegion: null,\n content: null,\n hud: null,\n\n init: function (icon) {\n this.$icon = $(icon);\n this.$liveRegion = $('<span/>', {\n role: 'status',\n class: 'visually-hidden',\n });\n\n if (this.$icon.data('infoicon')) {\n console.warn('Double-instantiating an info icon on an element');\n this.content = this.$icon.data('infoicon').content;\n this.$icon.data('infoicon').destroy();\n } else {\n this.content = this.$icon.html();\n this.$icon\n .html('')\n .attr({\n tabindex: 0,\n role: 'button',\n type: 'button',\n 'aria-label': Craft.t('app', 'More info'),\n })\n .wrap(\n $('<span/>', {\n class: 'infoicon-container',\n })\n );\n\n this.$container = this.$icon.parent();\n this.$container.append(this.$liveRegion);\n }\n\n this.$icon.data('infoicon', this);\n\n if (\n this.$icon[0].previousSibling &&\n this.$icon[0].previousSibling.nodeType === Node.TEXT_NODE\n ) {\n // Make sure it's in a .nowrap container\n const $parent = this.$icon.parent();\n if (!$parent.hasClass('nowrap')) {\n // Find the last word in the text\n const m = this.$icon[0].previousSibling.nodeValue.match(/[^\\s\\-]+\\s*$/);\n if (m) {\n this.$icon[0].previousSibling.nodeValue =\n this.$icon[0].previousSibling.nodeValue.substring(0, m.index);\n $('<span/>', {\n class: 'nowrap',\n html: m[0].replace(/\\s+$/, '') + ' ',\n })\n .insertAfter(this.$icon[0].previousSibling)\n .append(this.$icon);\n }\n }\n }\n\n this.addListener(this.$icon, 'click', (ev) => {\n ev.preventDefault();\n ev.stopPropagation();\n this.showHud();\n });\n\n this.addListener(this.$icon, 'keydown', (ev) => {\n if (\n !(this.hud && this.hud.showing) &&\n [Garnish.SPACE_KEY, Garnish.RETURN_KEY].includes(ev.keyCode)\n ) {\n ev.preventDefault();\n ev.stopPropagation();\n this.showHud();\n }\n });\n },\n\n showHud: function (ev) {\n if (!this.hud) {\n this.hud = new Garnish.HUD(this.$icon, this.content, {\n hudClass: 'hud info-hud',\n closeOtherHUDs: false,\n onShow: () => {\n Garnish.uiLayerManager.registerShortcut(Garnish.SPACE_KEY, () => {\n this.hud.hide();\n });\n\n this.$liveRegion.html('');\n\n setTimeout(() => {\n this.$liveRegion.html(this.content);\n }, 200);\n },\n onHide: () => {\n this.$liveRegion.html('');\n },\n });\n Craft.initUiElements(this.hud.$body);\n } else {\n this.hud.show();\n }\n },\n\n destroy: function () {\n this.$icon.removeData('infoicon');\n this.base();\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Light Switch\n */\nCraft.LightSwitch = Garnish.Base.extend(\n {\n settings: null,\n $outerContainer: null,\n $innerContainer: null,\n $input: null,\n small: false,\n on: false,\n indeterminate: false,\n dragger: null,\n\n dragStartMargin: null,\n\n init: function (outerContainer, settings) {\n this.$outerContainer = $(outerContainer);\n\n // Is this already a lightswitch?\n if (this.$outerContainer.data('lightswitch')) {\n console.warn('Double-instantiating a lightswitch on an element');\n this.$outerContainer.data('lightswitch').destroy();\n }\n\n this.$outerContainer.data('lightswitch', this);\n\n this.small = this.$outerContainer.hasClass('small');\n\n this.setSettings(settings, Craft.LightSwitch.defaults);\n\n this.$innerContainer = this.$outerContainer.find(\n '.lightswitch-container:first'\n );\n this.$input = this.$outerContainer.find('input:first');\n\n // If the input is disabled, go no further\n if (this.$input.prop('disabled')) {\n return;\n }\n\n this.on = this.$outerContainer.hasClass('on');\n this.indeterminate = this.$outerContainer.hasClass('indeterminate');\n\n this.addListener(this.$outerContainer, 'mousedown', '_onMouseDown');\n this.addListener(this.$outerContainer, 'keydown', '_onKeyDown');\n\n this.dragger = new Garnish.BaseDrag(this.$outerContainer, {\n axis: Garnish.X_AXIS,\n ignoreHandleSelector: null,\n onDragStart: this._onDragStart.bind(this),\n onDrag: this._onDrag.bind(this),\n onDragStop: this._onDragStop.bind(this),\n });\n\n // Does the input have on/off labels?\n let $wrapper = this.$outerContainer.parent(\n '.lightswitch-inner-container'\n );\n if ($wrapper.length) {\n this.addListener(\n $wrapper.children('span[data-toggle=\"off\"]'),\n 'click',\n this.turnOff\n );\n this.addListener(\n $wrapper.children('span[data-toggle=\"on\"]'),\n 'click',\n this.turnOn\n );\n }\n },\n\n turnOn: function (muteEvent) {\n var changed = !this.on;\n\n this.on = true;\n this.indeterminate = false;\n\n this.$outerContainer.addClass('dragging');\n\n if (Garnish.prefersReducedMotion()) {\n this.$innerContainer.css('margin-' + Craft.left, 0);\n } else {\n var animateCss = {};\n animateCss['margin-' + Craft.left] = 0;\n this.$innerContainer\n .velocity('stop')\n .velocity(\n animateCss,\n Craft.LightSwitch.animationDuration,\n this._onSettle.bind(this)\n );\n }\n\n this.$input.val(this.settings.value);\n this.$outerContainer.addClass('on');\n this.$outerContainer.removeClass('indeterminate');\n this.$outerContainer.attr('aria-checked', 'true');\n\n if (changed && muteEvent !== true) {\n this.onChange();\n }\n },\n\n turnOff: function (muteEvent) {\n var changed = this.on || this.indeterminate;\n\n this.on = false;\n this.indeterminate = false;\n\n this.$outerContainer.addClass('dragging');\n\n if (Garnish.prefersReducedMotion()) {\n this.$innerContainer.css('margin-' + Craft.left, this._getOffMargin());\n } else {\n var animateCss = {};\n animateCss['margin-' + Craft.left] = this._getOffMargin();\n this.$innerContainer\n .velocity('stop')\n .velocity(\n animateCss,\n Craft.LightSwitch.animationDuration,\n this._onSettle.bind(this)\n );\n }\n\n this.$input.val('');\n this.$outerContainer.removeClass('on');\n this.$outerContainer.removeClass('indeterminate');\n this.$outerContainer.attr('aria-checked', 'false');\n\n if (changed && muteEvent !== true) {\n this.onChange();\n }\n },\n\n turnIndeterminate: function (muteEvent) {\n var changed = !this.indeterminate;\n\n this.on = false;\n this.indeterminate = true;\n\n this.$outerContainer.addClass('dragging');\n var animateCss = {};\n animateCss['margin-' + Craft.left] = this._getOffMargin() / 2;\n this.$innerContainer\n .velocity('stop')\n .velocity(\n animateCss,\n Craft.LightSwitch.animationDuration,\n this._onSettle.bind(this)\n );\n\n this.$input.val(this.settings.indeterminateValue);\n this.$outerContainer.removeClass('on');\n this.$outerContainer.addClass('indeterminate');\n this.$outerContainer.attr('aria-checked', 'mixed');\n\n if (changed && muteEvent !== true) {\n this.onChange();\n }\n },\n\n toggle: function () {\n if (this.indeterminate || !this.on) {\n this.turnOn();\n } else {\n this.turnOff();\n }\n },\n\n onChange: function () {\n this.trigger('change');\n this.settings.onChange(this.on);\n this.$outerContainer.trigger('change');\n },\n\n _onMouseDown: function () {\n this.addListener(Garnish.$doc, 'mouseup', '_onMouseUp');\n },\n\n _onMouseUp: function () {\n this.removeListener(Garnish.$doc, 'mouseup');\n\n // Was this a click?\n if (!this.dragger.dragging) {\n this.toggle();\n }\n },\n\n _onKeyDown: function (event) {\n switch (event.keyCode) {\n case Garnish.SPACE_KEY: {\n this.toggle();\n event.preventDefault();\n break;\n }\n case Garnish.RIGHT_KEY: {\n if (Craft.orientation === 'ltr') {\n this.turnOn();\n } else {\n this.turnOff();\n }\n\n event.preventDefault();\n break;\n }\n case Garnish.LEFT_KEY: {\n if (Craft.orientation === 'ltr') {\n this.turnOff();\n } else {\n this.turnOn();\n }\n\n event.preventDefault();\n break;\n }\n }\n },\n\n _getMargin: function () {\n return parseInt(this.$innerContainer.css('margin-' + Craft.left));\n },\n\n _onDragStart: function () {\n this.$outerContainer.addClass('dragging');\n this.dragStartMargin = this._getMargin();\n },\n\n _onDrag: function () {\n var margin;\n\n if (Craft.orientation === 'ltr') {\n margin = this.dragStartMargin + this.dragger.mouseDistX;\n } else {\n margin = this.dragStartMargin - this.dragger.mouseDistX;\n }\n\n if (margin < this._getOffMargin()) {\n margin = this._getOffMargin();\n } else if (margin > 0) {\n margin = 0;\n }\n\n this.$innerContainer.css('margin-' + Craft.left, margin);\n },\n\n _onDragStop: function () {\n var margin = this._getMargin();\n\n if (margin > this._getOffMargin() / 2) {\n this.turnOn();\n } else {\n this.turnOff();\n }\n },\n\n _onSettle: function () {\n this.$outerContainer.removeClass('dragging');\n },\n\n destroy: function () {\n this.$outerContainer.removeData('lightswitch');\n this.base();\n this.dragger.destroy();\n },\n\n _getOffMargin: function () {\n return this.small ? -10 : -12;\n },\n },\n {\n animationDuration: 100,\n defaults: {\n value: '1',\n indeterminateValue: '-',\n onChange: $.noop,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Listbox\n */\nCraft.Listbox = Garnish.Base.extend(\n {\n $container: null,\n $options: null,\n $selectedOption: null,\n selectedOptionIndex: null,\n\n init: function (container, settings) {\n this.$container = $(container);\n this.setSettings(settings, Craft.Listbox.defaults);\n\n // Is this already a listbox?\n if (this.$container.data('listbox')) {\n console.warn('Double-instantiating a listbox on an element');\n this.$container.data('listbox').destroy();\n }\n\n this.$container.data('listbox', this);\n // todo: drop [role=option] in Craft 5\n this.$options = this.$container.find('button,[role=option]');\n\n // is there already a selected option?\n // todo: drop [aria-selected=true] & attr normalization in Craft 5\n this.$selectedOption = this.$options\n .filter('[aria-pressed=true],[aria-selected=true]')\n .removeAttr('aria-selected')\n .attr('aria-pressed', 'true');\n if (this.$selectedOption.length) {\n this.selectedOptionIndex = this.$options.index(this.$selectedOption);\n } else {\n this.$selectedOption = null;\n }\n\n this.addListener(this.$options, 'click', (ev) => {\n this.select(this.$options.index($(ev.currentTarget)));\n ev.preventDefault();\n });\n },\n\n select: function (index) {\n if (\n index < 0 ||\n index >= this.$options.length ||\n index === this.selectedOptionIndex\n ) {\n return;\n }\n\n if (this.$selectedOption) {\n this.$selectedOption\n .removeClass(this.settings.selectedClass)\n .attr('aria-pressed', 'false');\n }\n\n this.$selectedOption = this.$options\n .eq(index)\n .addClass(this.settings.selectedClass)\n .attr('aria-pressed', 'true');\n\n this.selectedOptionIndex = index;\n\n this.settings.onChange(this.$selectedOption, index);\n this.trigger('change', {\n $selectedOption: this.$selectedOption,\n selectedOptionIndex: index,\n });\n },\n\n disable: function () {\n this.base();\n this.$container.attr('aria-disabled', 'true');\n },\n\n enable: function () {\n this.base();\n this.$container.removeAttr('aria-disabled');\n },\n\n destroy: function () {\n this.$container.removeData('listbox');\n this.base();\n },\n },\n {\n defaults: {\n selectedClass: 'active',\n focusClass: 'focus',\n onChange: $.noop,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Live Preview\n */\nCraft.LivePreview = Garnish.Base.extend(\n {\n $extraFields: null,\n $trigger: null,\n $shade: null,\n $editorContainer: null,\n $editor: null,\n $dragHandle: null,\n $previewContainer: null,\n $iframeContainer: null,\n $iframe: null,\n $fieldPlaceholder: null,\n\n previewUrl: null,\n token: null,\n basePostData: null,\n inPreviewMode: false,\n fields: null,\n lastPostData: null,\n updateIframeInterval: null,\n loading: false,\n checkAgain: false,\n\n dragger: null,\n dragStartEditorWidth: null,\n\n _slideInOnIframeLoad: false,\n\n _scrollX: null,\n _scrollY: null,\n\n _editorWidth: null,\n _editorWidthInPx: null,\n\n init: function (settings) {\n this.setSettings(settings, Craft.LivePreview.defaults);\n\n // Should preview requests use a specific URL?\n // This won't affect how the request gets routed (the action param will override it),\n // but it will allow the templates to change behavior based on the request URI.\n if (this.settings.previewUrl) {\n this.previewUrl = this.settings.previewUrl;\n } else {\n this.previewUrl = Craft.baseSiteUrl.replace(/\\/+$/, '') + '/';\n }\n\n // Load the preview over SSL if the current request is\n if (document.location.protocol === 'https:') {\n this.previewUrl = this.previewUrl.replace(/^http:/, 'https:');\n }\n\n // Set the base post data\n this.basePostData = $.extend({}, this.settings.previewParams);\n\n // Find the DOM elements\n this.$extraFields = $(this.settings.extraFields);\n this.$trigger = $(this.settings.trigger);\n this.$fieldPlaceholder = $('<div/>');\n\n // Set the initial editor width\n this.editorWidth = Craft.getLocalStorage(\n 'LivePreview.editorWidth',\n Craft.LivePreview.defaultEditorWidth\n );\n\n // Event Listeners\n this.addListener(this.$trigger, 'activate', 'toggle');\n\n Craft.cp.on('beforeSaveShortcut', () => {\n if (this.inPreviewMode) {\n this.moveFieldsBack();\n }\n });\n\n Craft.Preview.instances.push(this);\n },\n\n get editorWidth() {\n return this._editorWidth;\n },\n\n get editorWidthInPx() {\n return this._editorWidthInPx;\n },\n\n set editorWidth(width) {\n var inPx;\n\n // Is this getting set in pixels?\n if (width >= 1) {\n inPx = width;\n width /= Garnish.$win.width();\n } else {\n inPx = Math.round(width * Garnish.$win.width());\n }\n\n // Make sure it's no less than the minimum\n if (inPx < Craft.LivePreview.minEditorWidthInPx) {\n inPx = Craft.LivePreview.minEditorWidthInPx;\n width = inPx / Garnish.$win.width();\n }\n\n this._editorWidth = width;\n this._editorWidthInPx = inPx;\n },\n\n toggle: function () {\n if (this.inPreviewMode) {\n this.exit();\n } else {\n this.enter();\n }\n },\n\n enter: function () {\n if (this.inPreviewMode) {\n return;\n }\n\n if (!this.token) {\n this.createToken();\n return;\n }\n\n this.trigger('beforeEnter');\n\n $(document.activeElement).trigger('blur');\n\n if (!this.$editor) {\n this.$shade = $('<div/>', {class: 'modal-shade dark'}).appendTo(\n Garnish.$bod\n );\n this.$previewContainer = $('<div/>', {\n class: 'lp-preview-container',\n }).appendTo(Garnish.$bod);\n this.$iframeContainer = $('<div/>', {\n class: 'lp-iframe-container',\n }).appendTo(this.$previewContainer);\n this.$editorContainer = $('<div/>', {\n class: 'lp-editor-container',\n }).appendTo(Garnish.$bod);\n\n var $editorHeader = $('<header/>', {class: 'flex'}).appendTo(\n this.$editorContainer\n );\n this.$editor = $('<form/>', {class: 'lp-editor'}).appendTo(\n this.$editorContainer\n );\n this.$dragHandle = $('<div/>', {class: 'lp-draghandle'}).appendTo(\n this.$editorContainer\n );\n var $closeBtn = $('<button/>', {\n type: 'button',\n class: 'btn',\n text: Craft.t('app', 'Close Preview'),\n }).appendTo($editorHeader);\n $('<div/>', {class: 'flex-grow'}).appendTo($editorHeader);\n let $saveBtn = $('<button/>', {\n type: 'button',\n class: 'btn submit',\n text: Craft.t('app', 'Save'),\n }).appendTo($editorHeader);\n\n this.dragger = new Garnish.BaseDrag(this.$dragHandle, {\n axis: Garnish.X_AXIS,\n onDragStart: this._onDragStart.bind(this),\n onDrag: this._onDrag.bind(this),\n onDragStop: this._onDragStop.bind(this),\n });\n\n this.addListener($closeBtn, 'click', 'exit');\n this.addListener($saveBtn, 'click', 'save');\n }\n\n // Set the sizes\n this.handleWindowResize();\n this.addListener(Garnish.$win, 'resize', 'handleWindowResize');\n\n this.$editorContainer.css(Craft.left, -this.editorWidthInPx + 'px');\n this.$previewContainer.css(Craft.right, -this.getIframeWidth());\n\n // Move all the fields into the editor rather than copying them\n // so any JS that's referencing the elements won't break.\n this.fields = [];\n var $fields = $(this.settings.fields);\n\n for (var i = 0; i < $fields.length; i++) {\n var $field = $($fields[i]),\n $clone = this._getClone($field);\n\n // It's important that the actual field is added to the DOM *after* the clone,\n // so any radio buttons in the field get deselected from the clone rather than the actual field.\n this.$fieldPlaceholder.insertAfter($field);\n $field.detach();\n this.$fieldPlaceholder.replaceWith($clone);\n $field.appendTo(this.$editor);\n\n this.fields.push({\n $field: $field,\n $clone: $clone,\n });\n }\n\n if (this.updateIframe()) {\n this._slideInOnIframeLoad = true;\n } else {\n this.slideIn();\n }\n\n Craft.ElementThumbLoader.retryAll();\n\n Garnish.uiLayerManager.addLayer(this.$sidebar);\n Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n this.exit();\n });\n\n this.inPreviewMode = true;\n this.trigger('enter');\n },\n\n createToken: function () {\n const data = {previewAction: this.settings.previewAction};\n Craft.sendActionRequest('POST', 'live-preview/create-token', {data}).then(\n (response) => {\n this.token = response.data.token;\n this.enter();\n }\n );\n },\n\n save: function () {\n Craft.cp.submitPrimaryForm();\n },\n\n handleWindowResize: function () {\n // Reset the width so the min width is enforced\n this.editorWidth = this.editorWidth;\n\n // Update the editor/iframe sizes\n this.updateWidths();\n },\n\n slideIn: function () {\n $('html').addClass('noscroll');\n this.$shade.velocity('fadeIn');\n\n this.$editorContainer\n .show()\n .velocity('stop')\n .animateLeft(0, 'slow', () => {\n this.trigger('slideIn');\n Garnish.$win.trigger('resize');\n });\n\n this.$previewContainer\n .show()\n .velocity('stop')\n .animateRight(0, 'slow', () => {\n this.updateIframeInterval = setInterval(\n this.updateIframe.bind(this),\n 1000\n );\n });\n },\n\n exit: function () {\n if (!this.inPreviewMode) {\n return;\n }\n\n this.trigger('beforeExit');\n\n $('html').removeClass('noscroll');\n\n this.removeListener(Garnish.$win, 'resize');\n Garnish.uiLayerManager.removeLayer();\n\n if (this.updateIframeInterval) {\n clearInterval(this.updateIframeInterval);\n }\n\n this.moveFieldsBack();\n\n this.$shade.delay(200).velocity('fadeOut');\n\n this.$editorContainer\n .velocity('stop')\n .animateLeft(-this.editorWidthInPx, 'slow', () => {\n for (var i = 0; i < this.fields.length; i++) {\n this.fields[i].$newClone.remove();\n }\n this.$editorContainer.hide();\n this.trigger('slideOut');\n });\n\n this.$previewContainer\n .velocity('stop')\n .animateRight(-this.getIframeWidth(), 'slow', () => {\n this.$previewContainer.hide();\n });\n\n Craft.ElementThumbLoader.retryAll();\n\n this.inPreviewMode = false;\n this.trigger('exit');\n },\n\n moveFieldsBack: function () {\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n field.$newClone = this._getClone(field.$field);\n\n // It's important that the actual field is added to the DOM *after* the clone,\n // so any radio buttons in the field get deselected from the clone rather than the actual field.\n this.$fieldPlaceholder.insertAfter(field.$field);\n field.$field.detach();\n this.$fieldPlaceholder.replaceWith(field.$newClone);\n field.$clone.replaceWith(field.$field);\n }\n\n Garnish.$win.trigger('resize');\n },\n\n getIframeWidth: function () {\n return Garnish.$win.width() - this.editorWidthInPx;\n },\n\n updateWidths: function () {\n this.$editorContainer.css('width', this.editorWidthInPx + 'px');\n this.$previewContainer.width(this.getIframeWidth());\n },\n\n updateIframe: function (force) {\n if (force) {\n this.lastPostData = null;\n }\n\n if (!this.inPreviewMode) {\n return false;\n }\n\n if (this.loading) {\n this.checkAgain = true;\n return false;\n }\n\n // Has the post data changed?\n var postData = $.extend(\n Garnish.getPostData(this.$editor),\n Garnish.getPostData(this.$extraFields)\n );\n\n if (\n !this.lastPostData ||\n !Craft.compare(postData, this.lastPostData, false)\n ) {\n this.lastPostData = postData;\n this.loading = true;\n\n var $doc = this.$iframe\n ? $(this.$iframe[0].contentWindow.document)\n : null;\n\n this._scrollX = $doc ? $doc.scrollLeft() : 0;\n this._scrollY = $doc ? $doc.scrollTop() : 0;\n\n $.ajax({\n url:\n this.previewUrl +\n (this.previewUrl.indexOf('?') !== -1 ? '&' : '?') +\n Craft.tokenParam +\n '=' +\n this.token,\n method: 'POST',\n data: $.extend({}, postData, this.basePostData),\n headers: {\n 'X-Craft-Token': this.token,\n },\n xhrFields: {\n withCredentials: true,\n },\n crossDomain: true,\n success: this.handleSuccess.bind(this),\n error: this.handleError.bind(this),\n });\n\n return true;\n } else {\n return false;\n }\n },\n\n forceUpdateIframe: function () {\n return this.updateIframe(true);\n },\n\n handleSuccess: function (data) {\n var html =\n data +\n '<script type=\"text/javascript\">window.scrollTo(' +\n this._scrollX +\n ', ' +\n this._scrollY +\n ');</script>';\n\n // Create a new iframe\n var $iframe = $('<iframe class=\"lp-preview\" frameborder=\"0\"/>');\n if (this.$iframe) {\n $iframe.insertBefore(this.$iframe);\n } else {\n $iframe.appendTo(this.$iframeContainer);\n }\n\n this.addListener($iframe, 'load', function () {\n if (this.$iframe) {\n this.$iframe.remove();\n }\n this.$iframe = $iframe;\n\n if (this._slideInOnIframeLoad) {\n this.slideIn();\n this._slideInOnIframeLoad = false;\n }\n\n this.removeListener($iframe, 'load');\n });\n\n Garnish.requestAnimationFrame(() => {\n $iframe[0].contentWindow.document.open();\n $iframe[0].contentWindow.document.write(html);\n $iframe[0].contentWindow.document.close();\n this.onResponse();\n });\n },\n\n handleError: function () {\n this.onResponse();\n },\n\n onResponse: function () {\n this.loading = false;\n\n if (this.checkAgain) {\n this.checkAgain = false;\n this.updateIframe();\n }\n },\n\n _getClone: function ($field) {\n var $clone = $field.clone();\n\n // clone() won't account for input values that have changed since the original HTML set them\n Garnish.copyInputValues($field, $clone);\n\n // Remove any id= attributes\n $clone.attr('id', '');\n $clone.find('[id]').attr('id', '');\n\n return $clone;\n },\n\n _onDragStart: function () {\n this.dragStartEditorWidth = this.editorWidthInPx;\n this.$previewContainer.addClass('dragging');\n },\n\n _onDrag: function () {\n if (Craft.orientation === 'ltr') {\n this.editorWidth = this.dragStartEditorWidth + this.dragger.mouseDistX;\n } else {\n this.editorWidth = this.dragStartEditorWidth - this.dragger.mouseDistX;\n }\n\n this.updateWidths();\n },\n\n _onDragStop: function () {\n this.$previewContainer.removeClass('dragging');\n Craft.setLocalStorage('LivePreview.editorWidth', this.editorWidth);\n },\n\n destroy: function () {\n Craft.Preview.instances = Craft.Preview.instances.filter(\n (o) => o !== this\n );\n this.base();\n },\n },\n {\n defaultEditorWidth: 0.33,\n minEditorWidthInPx: 320,\n instances: [],\n\n defaults: {\n trigger: '.livepreviewbtn',\n fields: null,\n extraFields: null,\n previewUrl: null,\n previewAction: null,\n previewParams: {},\n },\n }\n);\n\nCraft.LivePreview.init = function (settings) {\n Craft.livePreview = new Craft.LivePreview(settings);\n};\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Password Input\n */\nCraft.PasswordInput = Garnish.Base.extend(\n {\n $passwordWrapper: null,\n $passwordInput: null,\n $textInput: null,\n $currentInput: null,\n\n $showPasswordToggle: null,\n showingPassword: null,\n\n init: function (passwordInput, settings) {\n this.$passwordInput = $(passwordInput);\n this.$passwordWrapper = this.$passwordInput.parent('.passwordwrapper');\n this.settings = $.extend({}, Craft.PasswordInput.defaults, settings);\n\n // Is this already a password input?\n if (this.$passwordInput.data('passwordInput')) {\n console.warn('Double-instantiating a password input on an element');\n this.$passwordInput.data('passwordInput').destroy();\n }\n\n this.$passwordInput.data('passwordInput', this);\n\n this.$showPasswordToggle = $(\n '<button type=\"button\" class=\"invisible\" />'\n );\n this.$showPasswordToggle.addClass('password-toggle');\n this.$showPasswordToggle.insertAfter(this.$passwordInput);\n\n this.initInputFocusEvents(this.$passwordInput);\n this.addListener(this.$showPasswordToggle, 'click', 'onClick');\n this.hidePassword();\n\n this.addListener(\n this.$passwordWrapper.closest('form'),\n 'submit',\n 'hidePassword'\n );\n },\n\n setCurrentInput: function ($input) {\n if (this.$currentInput) {\n // Swap the inputs, while preventing the focus animation\n $input.insertAfter(this.$currentInput);\n this.$currentInput.detach();\n $input.trigger('focus');\n\n // Restore the input value\n $input.val(this.$currentInput.val());\n }\n\n this.$currentInput = $input;\n\n this.addListener(\n this.$currentInput,\n 'keypress,keyup,change,blur',\n 'onInputChange'\n );\n },\n\n updateToggleLabel: function (label) {\n this.$showPasswordToggle.text(label);\n },\n\n initInputFocusEvents: function ($input) {\n this.addListener($input, 'focus', function () {\n this.$passwordWrapper.addClass('focus');\n });\n this.addListener($input, 'blur', function () {\n this.$passwordWrapper.removeClass('focus');\n });\n },\n\n showPassword: function () {\n if (this.showingPassword) {\n return;\n }\n\n if (!this.$textInput) {\n this.$textInput = this.$passwordInput.clone(true);\n this.$textInput.attr({\n type: 'text',\n autocapitalize: 'off',\n });\n this.initInputFocusEvents(this.$textInput);\n }\n\n this.setCurrentInput(this.$textInput);\n this.updateToggleLabel(Craft.t('app', 'Hide'));\n this.showingPassword = true;\n },\n\n hidePassword: function () {\n // showingPassword could be null, which is acceptable\n if (this.showingPassword === false) {\n return;\n }\n\n this.setCurrentInput(this.$passwordInput);\n this.updateToggleLabel(Craft.t('app', 'Show'));\n this.showingPassword = false;\n },\n\n togglePassword: function () {\n if (this.showingPassword) {\n this.hidePassword();\n } else {\n this.showPassword();\n }\n\n this.settings.onToggleInput(this.$currentInput);\n },\n\n onInputChange: function () {\n if (this.$currentInput.val()) {\n this.$showPasswordToggle.removeClass('invisible');\n } else {\n this.$showPasswordToggle.addClass('invisible');\n }\n },\n\n onClick: function (ev) {\n if (this.$currentInput[0].setSelectionRange) {\n var selectionStart = this.$currentInput[0].selectionStart,\n selectionEnd = this.$currentInput[0].selectionEnd;\n\n this.togglePassword();\n this.$currentInput[0].setSelectionRange(selectionStart, selectionEnd);\n } else {\n this.togglePassword();\n }\n },\n\n destroy: function () {\n this.$passwordInput.removeData('passwordInput');\n this.base();\n },\n },\n {\n defaults: {\n onToggleInput: $.noop,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Preview\n */\nCraft.Preview = Garnish.Base.extend(\n {\n elementEditor: null,\n\n $shade: null,\n $editorContainer: null,\n $editor: null,\n $spinner: null,\n $statusIcon: null,\n $dragHandle: null,\n $previewWrapper: null,\n $previewContainer: null,\n $previewSkipLink: null,\n $bumperLink: null,\n $notifier: null,\n $iframeContainer: null,\n $previewHeader: null,\n $targetBtn: null,\n $targetMenu: null,\n $deviceTypeContainer: null,\n $orientationBtn: null,\n $refreshBtn: null,\n $deviceMask: null,\n $devicePreviewContainer: null,\n $iframe: null,\n iframeLoaded: false,\n $tempInput: null,\n $fieldPlaceholder: null,\n\n isActive: false,\n isVisible: false,\n activeTarget: 0,\n\n animationDuration: 'slow',\n\n currentDeviceType: 'desktop',\n deviceOrientation: null,\n deviceWidth: '',\n deviceHeight: '',\n deviceMaskDimensions: {\n phone: {\n width: 375,\n height: 753,\n },\n tablet: {\n width: 768,\n height: 1110,\n },\n },\n\n draftId: null,\n url: null,\n fields: null,\n\n iframeHeight: null,\n scrollTop: null,\n\n dragger: null,\n dragStartEditorWidth: null,\n\n _updateIframeProxy: null,\n\n _editorWidth: null,\n _editorWidthInPx: null,\n\n init: function (elementEditor) {\n this.elementEditor = elementEditor;\n\n this._updateIframeProxy = this.updateIframe.bind(this);\n\n this.$tempInput = $('<input/>', {\n type: 'hidden',\n name: '__PREVIEW_FIELDS__',\n value: '1',\n });\n this.$fieldPlaceholder = $('<div/>');\n\n // Set the initial editor width\n this.editorWidth = Craft.getLocalStorage(\n 'LivePreview.editorWidth',\n Craft.Preview.defaultEditorWidth\n );\n\n Craft.Preview.instances.push(this);\n },\n\n get editorWidth() {\n return this._editorWidth;\n },\n\n get editorWidthInPx() {\n return this._editorWidthInPx;\n },\n\n set editorWidth(width) {\n var inPx;\n\n // Is this getting set in pixels?\n if (width >= 1) {\n inPx = width;\n width /= Garnish.$win.width();\n } else {\n inPx = Math.round(width * Garnish.$win.width());\n }\n\n // Make sure it's no less than the minimum\n if (inPx < Craft.Preview.minEditorWidthInPx) {\n inPx = Craft.Preview.minEditorWidthInPx;\n width = inPx / Garnish.$win.width();\n }\n\n this._editorWidth = width;\n this._editorWidthInPx = inPx;\n },\n\n open: function () {\n if (this.isActive) {\n return;\n }\n\n this.isActive = true;\n this.trigger('beforeOpen');\n\n $(document.activeElement).trigger('blur');\n\n if (!this.$editor) {\n const previewSkipLinkText = Craft.t('app', 'Skip to {title}', {\n title: Craft.t('app', 'Top of preview'),\n });\n\n this.$shade = $('<div/>', {class: 'modal-shade dark'}).appendTo(\n Garnish.$bod\n );\n this.$previewWrapper = $('<div/>', {\n role: 'dialog',\n 'aria-modal': 'true',\n 'aria-labelledby': 'lp-preview-heading',\n }).appendTo(Garnish.$bod);\n this.$modalLabel = $('<h2/>', {\n id: 'lp-preview-heading',\n class: 'visually-hidden',\n html: Craft.t('app', 'Preview'),\n }).appendTo(this.$previewWrapper);\n this.$editorContainer = $('<div/>', {\n class: 'lp-editor-container',\n }).appendTo(this.$previewWrapper);\n this.$previewContainer = $('<div/>', {\n class: 'lp-preview-container',\n id: 'lp-preview-container',\n }).appendTo(this.$previewWrapper);\n this.$notifier = $('<span/>', {\n class: 'visually-hidden',\n 'aria-live': 'assertive',\n }).appendTo(this.$previewContainer);\n\n var $editorHeader = $('<header/>', {class: 'flex'}).appendTo(\n this.$editorContainer\n );\n this.$editor = $('<form/>', {class: 'lp-editor'}).appendTo(\n this.$editorContainer\n );\n this.$dragHandle = $('<div/>', {class: 'lp-draghandle'}).appendTo(\n this.$editorContainer\n );\n var $closeBtn = $('<button/>', {\n type: 'button',\n class: 'btn',\n text: Craft.t('app', 'Close Preview'),\n }).appendTo($editorHeader);\n $('<div/>', {class: 'flex-grow'}).appendTo($editorHeader);\n this.$spinner = $('<div/>', {\n class: 'spinner hidden',\n title: Craft.t('app', 'Saving'),\n }).appendTo($editorHeader);\n this.$statusIcon = $('<div/>', {class: 'invisible'}).appendTo(\n $editorHeader\n );\n this.$statusMessage = $('<span/>', {\n class: 'visually-hidden',\n 'aria-live': 'polite',\n }).appendTo($editorHeader);\n this.$previewSkipLink = $('<a/>', {\n class: 'skip-link btn',\n href: '#lp-preview-container',\n html: previewSkipLinkText,\n }).appendTo($editorHeader);\n\n if (Craft.Pro) {\n this.$previewHeader = $('<header/>', {\n class: 'lp-preview-header',\n }).appendTo(this.$previewContainer);\n\n // Preview targets\n if (this.elementEditor.settings.previewTargets.length > 1) {\n this.$targetBtn = $('<button/>', {\n type: 'button',\n class: 'btn menubtn',\n text: this.elementEditor.settings.previewTargets[0].label,\n }).appendTo(this.$previewHeader);\n this.$targetMenu = $('<div/>', {\n class: 'menu lp-target-menu',\n }).insertAfter(this.$targetBtn);\n const $ul = $('<ul/>', {class: 'padded'}).appendTo(\n this.$targetMenu\n );\n let $li, $a;\n for (\n let i = 0;\n i < this.elementEditor.settings.previewTargets.length;\n i++\n ) {\n $li = $('<li/>').appendTo($ul);\n $a = $('<a/>', {\n data: {target: i},\n text: this.elementEditor.settings.previewTargets[i].label,\n class: i === 0 ? 'sel' : null,\n }).appendTo($li);\n }\n new Garnish.MenuBtn(this.$targetBtn, {\n onOptionSelect: (option) => {\n this.switchTarget($(option).data('target'));\n },\n });\n\n $('<div class=\"flex-grow\"/>').appendTo(this.$previewHeader);\n }\n\n this._buildDeviceTypeFieldset();\n\n $('<div class=\"flex-grow\"/>').appendTo(this.$previewHeader);\n const $buttonContainer = $('<div class=\"buttons\"/>').appendTo(\n this.$previewHeader\n );\n\n // Orientation toggle\n this.$orientationBtn = $('<button/>', {\n type: 'button',\n class: 'btn disabled',\n 'data-icon': 'rotate',\n 'aria-disabled': 'true',\n text: Craft.t('app', 'Rotate'),\n 'aria-label': Craft.t('app', 'Rotate'),\n }).appendTo($buttonContainer);\n this.addListener(this.$orientationBtn, 'click', 'switchOrientation');\n\n // Refresh button\n this.$refreshBtn = $('<button/>', {\n type: 'button',\n class: 'btn',\n text: Craft.t('app', 'Refresh'),\n 'data-icon': 'refresh',\n }).appendTo($buttonContainer);\n this.addListener(this.$refreshBtn, 'click', () => {\n this.updateIframe(false, true);\n });\n\n // Get the last stored orientation\n this.deviceOrientation = Craft.getLocalStorage(\n 'LivePreview.orientation'\n );\n }\n\n this.$iframeContainer = $('<div/>', {\n class: 'lp-iframe-container',\n }).appendTo(this.$previewContainer);\n this.$devicePreviewContainer = $('<div/>', {\n class: 'lp-device-preview-container',\n }).appendTo(this.$iframeContainer);\n this.$deviceMask = $('<div/>', {\n class: 'lp-device-mask',\n }).appendTo(this.$iframeContainer);\n\n /* Prevents focus trap bug caused by iframe as last element */\n this.$bumperLink = $('<a/>', {\n class: 'skip-link btn lp-preview-container__bumper-link',\n html: previewSkipLinkText,\n href: '#lp-preview-container',\n });\n this.$bumperLink.appendTo(this.$previewContainer);\n\n this.dragger = new Garnish.BaseDrag(this.$dragHandle, {\n axis: Garnish.X_AXIS,\n onDragStart: this._onDragStart.bind(this),\n onDrag: this._onDrag.bind(this),\n onDragStop: this._onDragStop.bind(this),\n });\n\n this.addListener($closeBtn, 'click', 'close');\n this.addListener(this.$statusIcon, 'click', () => {\n this.elementEditor.showStatusHud(this.$statusIcon);\n });\n }\n\n // Set the sizes\n this.handleWindowResize();\n this.addListener(Garnish.$win, 'resize', 'handleWindowResize');\n\n this.$editorContainer.css(Craft.left, -this.editorWidthInPx + 'px');\n this.$previewContainer.css(Craft.right, -this.getIframeWidth());\n\n // Find the fields, excluding nested fields\n this.fields = [];\n var $fields = $('#content .field').not($('#content .field .field'));\n\n if ($fields.length) {\n // Insert our temporary input before the first field so we know where to swap in the serialized form values\n this.$tempInput.insertBefore($fields.get(0));\n\n // Move all the fields into the editor rather than copying them\n // so any JS that's referencing the elements won't break.\n for (let i = 0; i < $fields.length; i++) {\n let $field = $($fields[i]),\n $clone = this._getClone($field);\n\n // It's important that the actual field is added to the DOM *after* the clone,\n // so any radio buttons in the field get deselected from the clone rather than the actual field.\n this.$fieldPlaceholder.insertAfter($field);\n $field.detach();\n this.$fieldPlaceholder.replaceWith($clone);\n $field.appendTo(this.$editor);\n\n this.fields.push({\n $field: $field,\n $clone: $clone,\n });\n }\n }\n\n this.updateIframe();\n\n this.elementEditor.on('update', this._updateIframeProxy);\n\n Craft.ElementThumbLoader.retryAll();\n\n this.trigger('open');\n },\n\n _getDeviceTypeTranslation: function (type) {\n let translation;\n switch (type) {\n case 'phone':\n translation = Craft.t('app', 'Mobile');\n break;\n case 'tablet':\n translation = Craft.t('app', 'Tablet');\n break;\n default:\n translation = Craft.t('app', 'Desktop');\n break;\n }\n return translation;\n },\n\n _getDeviceOrientationTranslation: function (orientation) {\n return orientation === 'portrait'\n ? Craft.t('app', 'Portrait')\n : Craft.t('app', 'Landscape');\n },\n\n _buildDeviceTypeFieldset: function () {\n // Device type buttons\n this.$deviceTypeContainer = $('<section/>', {\n class: 'btngroup lp-device-type',\n 'aria-label': Craft.t('app', 'Device type'),\n }).appendTo(this.$previewHeader);\n $('<button/>', {\n type: 'button',\n class: 'btn lp-device-type-btn--desktop active',\n title: Craft.t('app', 'Desktop'),\n 'aria-label': Craft.t('app', 'Desktop'),\n 'aria-pressed': 'true',\n data: {\n width: '',\n height: '',\n deviceType: 'desktop',\n },\n }).appendTo(this.$deviceTypeContainer);\n $('<button/>', {\n type: 'button',\n class: 'btn lp-device-type-btn--tablet',\n title: Craft.t('app', 'Tablet'),\n 'aria-label': Craft.t('app', 'Tablet'),\n 'aria-pressed': 'false',\n data: {\n width: 768,\n height: 1024,\n deviceType: 'tablet',\n },\n }).appendTo(this.$deviceTypeContainer);\n $('<button/>', {\n type: 'button',\n class: 'btn lp-device-type-btn--phone',\n title: Craft.t('app', 'Mobile'),\n 'aria-label': Craft.t('app', 'Mobile'),\n 'aria-pressed': 'false',\n data: {\n width: 375,\n height: 667,\n deviceType: 'phone',\n },\n }).appendTo(this.$deviceTypeContainer);\n\n // Add functionality\n this.deviceBtnGroup = new Craft.Listbox(this.$deviceTypeContainer, {\n onChange: ($selectedOption) => {\n this.switchDeviceType($selectedOption);\n },\n });\n },\n\n _activeTarget: function () {\n return this.elementEditor.settings.previewTargets[this.activeTarget];\n },\n\n /**\n * @returns {boolean}\n * @private\n */\n _autoRefresh: function () {\n const target = this._activeTarget();\n return typeof typeof target.refresh === 'undefined' || !!target.refresh;\n },\n\n switchTarget: function (i) {\n this.activeTarget = i;\n this.$targetBtn.text(this.elementEditor.settings.previewTargets[i].label);\n this.$targetMenu.find('a.sel').removeClass('sel');\n this.$targetMenu.find('a').eq(i).addClass('sel');\n this.updateIframe(true);\n this.trigger('switchTarget', {\n previewTarget: this.elementEditor.settings.previewTargets[i],\n });\n },\n\n handleWindowResize: function () {\n // Reset the width so the min width is enforced\n this.editorWidth = this.editorWidth;\n\n // Update the editor/iframe sizes\n this.updateWidths();\n },\n\n slideIn: function () {\n if (!this.isActive || this.isVisible) {\n return;\n }\n\n $('html').addClass('noscroll');\n this.$shade.velocity('fadeIn');\n\n this.$editorContainer\n .show()\n .velocity('stop')\n .animateLeft(\n 0,\n Garnish.getUserPreferredAnimationDuration(this.animationDuration),\n () => {\n this.trigger('slideIn');\n Garnish.$win.trigger('resize');\n }\n );\n\n this.$previewContainer\n .show()\n .velocity('stop')\n .animateRight(\n 0,\n Garnish.getUserPreferredAnimationDuration(this.animationDuration)\n );\n\n this.isVisible = true;\n\n Garnish.uiLayerManager.addLayer(this.$previewWrapper);\n Garnish.hideModalBackgroundLayers();\n Craft.setFocusWithin(this.$previewWrapper);\n Craft.trapFocusWithin(this.$previewWrapper);\n Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n this.close();\n });\n },\n\n close: function () {\n if (!this.isActive || !this.isVisible) {\n return;\n }\n\n this.trigger('beforeClose');\n\n $('html').removeClass('noscroll');\n\n this.removeListener(Garnish.$win, 'resize');\n Garnish.uiLayerManager.removeLayer();\n Garnish.resetModalBackgroundLayerVisibility();\n\n // Remove our temporary input and move the preview fields back into place\n this.$tempInput.detach();\n this.moveFieldsBack();\n\n // Delay shade fade-out when animation is present\n if (Garnish.prefersReducedMotion()) {\n this.$shade.velocity('fadeOut');\n } else {\n this.$shade.delay(200).velocity('fadeOut');\n }\n\n this.$editorContainer\n .velocity('stop')\n .animateLeft(\n -this.editorWidthInPx,\n Garnish.getUserPreferredAnimationDuration(this.animationDuration),\n () => {\n for (var i = 0; i < this.fields.length; i++) {\n this.fields[i].$newClone.remove();\n }\n this.$editorContainer.hide();\n this.trigger('slideOut');\n }\n );\n\n this.$previewContainer\n .velocity('stop')\n .animateRight(\n -this.getIframeWidth(),\n Garnish.getUserPreferredAnimationDuration(this.animationDuration),\n () => {\n this.$iframeContainer.removeClass('lp-iframe-container--rotating');\n this.$previewContainer.hide();\n }\n );\n\n this.elementEditor.off('update', this._updateIframeProxy);\n\n Craft.ElementThumbLoader.retryAll();\n\n if (this.elementEditor.$previewBtn) {\n this.elementEditor.$previewBtn.focus();\n }\n\n this.isActive = false;\n this.isVisible = false;\n this.trigger('close');\n },\n\n moveFieldsBack: function () {\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n field.$newClone = this._getClone(field.$field);\n\n // It's important that the actual field is added to the DOM *after* the clone,\n // so any radio buttons in the field get deselected from the clone rather than the actual field.\n this.$fieldPlaceholder.insertAfter(field.$field);\n field.$field.detach();\n this.$fieldPlaceholder.replaceWith(field.$newClone);\n field.$clone.replaceWith(field.$field);\n }\n\n Garnish.$win.trigger('resize');\n Garnish.$doc.trigger('scroll');\n },\n\n getIframeWidth: function () {\n return Garnish.$win.width() - this.editorWidthInPx;\n },\n\n updateWidths: function () {\n this.$editorContainer.css('width', this.editorWidthInPx + 'px');\n this.$previewContainer.width(this.getIframeWidth());\n if (this._devicePreviewIsActive()) {\n this.updateDevicePreview();\n }\n },\n\n _useIframeResizer: function () {\n return Craft.previewIframeResizerOptions !== false;\n },\n\n /**\n * @param {boolean} [resetScroll=false]\n * @param {boolean} [refresh]\n */\n updateIframe: function (resetScroll, refresh) {\n if (!this.isActive) {\n return false;\n }\n\n // Ignore non-boolean resetScroll values\n resetScroll = resetScroll === true;\n\n // If the draft ID has changed or there's no iframe, we definitely need to refresh\n if (\n this.draftId !== (this.draftId = this.elementEditor.settings.draftId) ||\n !this.$iframe\n ) {\n refresh = true;\n }\n\n const target = this._activeTarget();\n if (typeof refresh === 'undefined') {\n refresh = resetScroll || this._autoRefresh();\n }\n\n this.trigger('beforeUpdateIframe', {\n previewTarget: target,\n resetScroll: resetScroll,\n refresh: refresh,\n });\n\n // If this is an existing preview target, make sure it wants to be refreshed automatically\n if (!refresh) {\n this.slideIn();\n return;\n }\n\n this.elementEditor\n .getTokenizedPreviewUrl(target.url, 'x-craft-live-preview')\n .then((url) => {\n // Maintain the current scroll position?\n let sameHost;\n if (resetScroll) {\n this.scrollTop = null;\n } else if (this.iframeLoaded && this.$iframe) {\n if (this._useIframeResizer()) {\n this.iframeHeight = this.$iframe.height();\n this.scrollTop = this.$iframeContainer.scrollTop();\n } else {\n sameHost = Craft.isSameHost(url);\n if (sameHost && this.$iframe[0].contentWindow) {\n this.scrollTop = $(\n this.$iframe[0].contentWindow.document\n ).scrollTop();\n }\n }\n }\n\n this.iframeLoaded = false;\n\n var $iframe = $('<iframe/>', {\n class: 'lp-preview',\n frameborder: 0,\n src: url,\n title: Craft.t('app', 'Preview'),\n });\n\n if (this.$iframe) {\n this.$iframe.replaceWith($iframe);\n } else {\n $iframe.appendTo(this.$devicePreviewContainer);\n }\n\n // Keep the iframe height consistent with its content\n if (this._useIframeResizer()) {\n if (!resetScroll && this.iframeHeight !== null) {\n $iframe.height(this.iframeHeight);\n this.$iframeContainer.scrollTop(this.scrollTop);\n }\n\n iFrameResize(\n $.extend(\n {\n checkOrigin: false,\n // Allow iframe scrolling until we've successfully initialized the resizer\n scrolling: true,\n onInit: (iframe) => {\n this.iframeLoaded = true;\n this.iframeHeight = null;\n this.scrollTop = null;\n iframe.scrolling = 'no';\n },\n },\n Craft.previewIframeResizerOptions || {}\n ),\n $iframe[0]\n );\n } else {\n $iframe.on('load', () => {\n this.iframeLoaded = true;\n if (!resetScroll && sameHost && this.scrollTop !== null) {\n $($iframe[0].contentWindow.document).scrollTop(this.scrollTop);\n }\n });\n }\n\n this.url = url;\n this.$iframe = $iframe;\n\n if (this._devicePreviewIsActive()) {\n this.updateDevicePreview();\n }\n\n this.trigger('afterUpdateIframe', {\n previewTarget:\n this.elementEditor.settings.previewTargets[this.activeTarget],\n $iframe: this.$iframe,\n });\n\n this.slideIn();\n });\n },\n\n _devicePreviewIsActive: function () {\n return this.currentDeviceType !== 'desktop';\n },\n\n _updateNotifier: function () {\n this.$notifier.html = '';\n\n const translation =\n this.currentDeviceType === 'desktop'\n ? 'Previewing {type} device'\n : 'Previewing {type} device in {orientation}';\n let params = {\n type: this._getDeviceTypeTranslation(this.currentDeviceType),\n };\n\n if (this.currentDeviceType !== 'desktop') {\n params = {\n ...params,\n ...{\n orientation: this._getDeviceOrientationTranslation(\n this.deviceOrientation\n ),\n },\n };\n }\n\n const message = Craft.t('app', translation, params);\n\n setTimeout(() => {\n this.$notifier.text(message);\n }, 200);\n },\n\n switchDeviceType: function ($option) {\n this.$iframeContainer.removeClass('lp-iframe-container--rotating');\n\n const newDeviceType = $option.data('deviceType');\n // Bail if we’re just smashing the same button\n if (newDeviceType === this.currentDeviceType) {\n return false;\n }\n\n // Store new device type data\n this.currentDeviceType = newDeviceType;\n this.deviceWidth = $option.data('width');\n this.deviceHeight = $option.data('height');\n\n if (this.currentDeviceType === 'desktop') {\n // Disable the orientation button\n this.$orientationBtn.addClass('disabled').attr('aria-disabled', 'true');\n\n this.$iframeContainer.removeClass(\n 'lp-iframe-container--has-device-preview'\n );\n } else {\n // Enable the orientation button\n this.$orientationBtn\n .removeClass('disabled')\n .removeAttr('aria-disabled');\n\n this.$iframeContainer.addClass(\n 'lp-iframe-container--has-device-preview'\n );\n }\n\n // Add the tablet class if needed\n if (this.currentDeviceType === 'tablet') {\n this.$iframeContainer.addClass('lp-iframe-container--tablet');\n } else {\n this.$iframeContainer.removeClass('lp-iframe-container--tablet');\n }\n\n this._updateNotifier();\n\n if (this.currentDeviceType !== 'desktop') {\n this.updateDevicePreview();\n }\n },\n\n switchOrientation: function () {\n if (!this._devicePreviewIsActive()) {\n return false;\n }\n\n // Switch to whichever orientation is currently not stored\n if (!this.deviceOrientation || this.deviceOrientation === 'portrait') {\n this.deviceOrientation = 'landscape';\n } else {\n this.deviceOrientation = 'portrait';\n }\n\n // Store the new one\n Craft.setLocalStorage('LivePreview.orientation', this.deviceOrientation);\n\n // Allow the animation to take place\n this.$iframeContainer.addClass('lp-iframe-container--rotating');\n\n // Update the device preview\n this.updateDevicePreview();\n this._updateNotifier();\n\n setTimeout(() => {\n this.$iframeContainer.removeClass('lp-iframe-container--rotating');\n }, 300);\n },\n\n updateDevicePreview: function () {\n // Figure out the best zoom\n let hZoom = 1;\n let wZoom = 1;\n let zoom = 1;\n let previewHeight = this.$previewContainer.height() - 50 - 48; // 50px for the header bar and 24px clearance\n let previewWidth = this.$previewContainer.width() - 48;\n let maskHeight = this.deviceMaskDimensions[this.currentDeviceType].height;\n let maskWidth = this.deviceMaskDimensions[this.currentDeviceType].width;\n\n if (this.deviceOrientation === 'landscape') {\n if (previewWidth < maskHeight) {\n hZoom = previewWidth / maskHeight;\n }\n if (previewHeight < maskWidth) {\n wZoom = previewHeight / maskWidth;\n }\n } else {\n if (previewHeight < maskHeight) {\n hZoom = previewHeight / maskHeight;\n }\n if (previewWidth < maskWidth) {\n wZoom = previewWidth / maskWidth;\n }\n }\n\n zoom = hZoom;\n if (wZoom < hZoom) {\n zoom = wZoom;\n }\n\n // Figure out the css values\n const translate = -(100 / zoom / 2);\n const rotationDeg =\n this.deviceOrientation === 'landscape' ? '-90deg' : '0deg';\n\n // Apply first to the device mask\n this.$deviceMask.css({\n width: this.deviceMaskDimensions[this.currentDeviceType].width + 'px',\n height: this.deviceMaskDimensions[this.currentDeviceType].height + 'px',\n transform:\n 'scale(' +\n zoom +\n ') translate(' +\n translate +\n '%, ' +\n translate +\n '%) rotate(' +\n rotationDeg +\n ')',\n });\n\n if (this.deviceOrientation === 'landscape') {\n this.$devicePreviewContainer.css({\n width: this.deviceHeight + 'px',\n height: this.deviceWidth + 'px',\n transform:\n 'scale(' +\n zoom +\n ') translate(' +\n translate +\n '%, ' +\n translate +\n '%)',\n marginTop: 0,\n marginLeft: '-' + 12 * zoom + 'px',\n });\n } else {\n this.$devicePreviewContainer.css({\n width: this.deviceWidth + 'px',\n height: this.deviceHeight + 'px',\n transform:\n 'scale(' +\n zoom +\n ') translate(' +\n translate +\n '%, ' +\n translate +\n '%)',\n marginTop: '-' + 12 * zoom + 'px',\n marginLeft: 0,\n });\n }\n },\n\n _getClone: function ($field) {\n var $clone = $field.clone();\n\n // clone() won't account for input values that have changed since the original HTML set them\n Garnish.copyInputValues($field, $clone);\n\n // Remove any id= attributes\n $clone.attr('id', '');\n $clone.find('[id]').attr('id', '');\n\n // Disable anything with a name attribute\n $clone.find('[name]').prop('disabled', true);\n\n return $clone;\n },\n\n _onDragStart: function () {\n this.dragStartEditorWidth = this.editorWidthInPx;\n this.$previewContainer.addClass('dragging');\n },\n\n _onDrag: function () {\n if (Craft.orientation === 'ltr') {\n this.editorWidth = this.dragStartEditorWidth + this.dragger.mouseDistX;\n } else {\n this.editorWidth = this.dragStartEditorWidth - this.dragger.mouseDistX;\n }\n\n this.updateWidths();\n },\n\n _onDragStop: function () {\n this.$previewContainer.removeClass('dragging');\n Craft.setLocalStorage('LivePreview.editorWidth', this.editorWidth);\n },\n\n destroy: function () {\n Craft.Preview.instances = Craft.Preview.instances.filter(\n (o) => o !== this\n );\n this.base();\n },\n },\n {\n defaultEditorWidth: 0.33,\n minEditorWidthInPx: 320,\n instances: [],\n\n refresh: function () {\n for (preview of Craft.Preview.instances) {\n preview.updateIframe();\n }\n for (preview of Craft.LivePreview.instances) {\n preview.forceUpdateIframe();\n }\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Preview File Modal\n */\nCraft.PreviewFileModal = Garnish.Modal.extend(\n {\n assetId: null,\n $spinner: null,\n $triggerElement: null,\n $bumperButtonStart: null,\n $bumperButtonEnd: null,\n elementSelect: null,\n type: null,\n loaded: null,\n requestId: 0,\n\n /**\n * Initialize the preview file modal.\n * @returns {*|void}\n */\n init: function (assetId, elementSelect, settings) {\n settings = $.extend(this.defaultSettings, settings);\n this.$triggerElement = Garnish.getFocusedElement();\n\n settings.onHide = this._onHide.bind(this);\n\n if (Craft.PreviewFileModal.openInstance) {\n var instance = Craft.PreviewFileModal.openInstance;\n\n if (instance.assetId !== assetId) {\n instance.loadAsset(\n assetId,\n settings.startingWidth,\n settings.startingHeight\n );\n instance.elementSelect = elementSelect;\n }\n\n return this.destroy();\n }\n\n Craft.PreviewFileModal.openInstance = this;\n this.elementSelect = elementSelect;\n\n this.$container = $('<div class=\"modal previewmodal loading\"/>').appendTo(\n Garnish.$bod\n );\n\n this.base(\n this.$container,\n $.extend(\n {\n resizable: true,\n },\n settings\n )\n );\n\n // Cut the flicker, just show the nice person the preview.\n if (this.$container) {\n this.$container.velocity('stop');\n this.$container.show().css('opacity', 1);\n\n this.$shade.velocity('stop');\n this.$shade.show().css('opacity', 1);\n\n Garnish.setFocusWithin(this.$container);\n }\n\n // Add bumper elements to maintain focus trap\n this.$bumperButtonStart = Craft.ui.createButton({\n html: Craft.t('app', 'Close Preview'),\n class: 'skip-link',\n });\n\n this.addListener(this.$bumperButtonStart, 'click', () => {\n this.hide();\n });\n this.$bumperButtonEnd = this.$bumperButtonStart.clone(true);\n\n this.loadAsset(assetId, settings.startingWidth, settings.startingHeight);\n },\n\n /**\n * When hiding, remove all traces and focus last focused element.\n * @private\n */\n _onHide: function () {\n Craft.PreviewFileModal.openInstance = null;\n if (this.elementSelect) {\n this.elementSelect.focusItem(this.elementSelect.$focusedItem);\n } else if (this.$triggerElement && this.$triggerElement.length) {\n this.$triggerElement.trigger('focus');\n }\n\n this.$shade.remove();\n\n return this.destroy();\n },\n\n _addBumperButtons: function () {\n this.$container\n .prepend(this.$bumperButtonStart)\n .append(this.$bumperButtonEnd);\n },\n\n _addModalName: function () {\n const headingId = 'preview-heading';\n\n this.$container\n .prepend(\n $('h1')\n .attr({\n class: 'visually-hidden',\n id: headingId,\n })\n .text(Craft.t('app', 'Preview file'))\n )\n .attr('aria-labelledby', headingId);\n },\n\n /**\n * Disappear immediately forever.\n * @returns {boolean}\n */\n selfDestruct: function () {\n var instance = Craft.PreviewFileModal.openInstance;\n\n instance.hide();\n instance.$shade.remove();\n instance.destroy();\n\n Craft.PreviewFileModal.openInstance = null;\n Craft.focalPoint.destruct();\n Craft.focalPoint = null;\n\n return true;\n },\n\n /**\n * Load an asset, using starting width and height, if applicable\n * @param {number} assetId\n * @param {number} [startingWidth]\n * @param {number} [startingHeight]\n */\n loadAsset: function (assetId, startingWidth, startingHeight) {\n this.assetId = assetId;\n\n this.$container.empty();\n this.loaded = false;\n\n this.desiredHeight = null;\n this.desiredWidth = null;\n\n var containerHeight = Garnish.$win.height() * 0.66;\n var containerWidth = Math.min(\n (containerHeight / 3) * 4,\n Garnish.$win.width() - this.settings.minGutter * 2\n );\n containerHeight = (containerWidth / 4) * 3;\n\n if (startingWidth && startingHeight) {\n var ratio = startingWidth / startingHeight;\n containerWidth = Math.min(\n startingWidth,\n Garnish.$win.width() - this.settings.minGutter * 2\n );\n containerHeight = Math.min(\n containerWidth / ratio,\n Garnish.$win.height() - this.settings.minGutter * 2\n );\n containerWidth = containerHeight * ratio;\n\n // This might actually have put width over the viewport limits, so doublecheck\n if (\n containerWidth >\n Math.min(\n startingWidth,\n Garnish.$win.width() - this.settings.minGutter * 2\n )\n ) {\n containerWidth = Math.min(\n startingWidth,\n Garnish.$win.width() - this.settings.minGutter * 2\n );\n containerHeight = containerWidth / ratio;\n }\n }\n\n this._resizeContainer(containerWidth, containerHeight);\n\n this.$spinner = $('<div class=\"spinner centeralign\"></div>').appendTo(\n this.$container\n );\n var top =\n this.$container.height() / 2 - this.$spinner.height() / 2 + 'px',\n left = this.$container.width() / 2 - this.$spinner.width() / 2 + 'px';\n\n this.$spinner.css({left: left, top: top, position: 'absolute'});\n this.requestId++;\n\n let data = {assetId: assetId, requestId: this.requestId};\n let onResponse = () => {\n this.$container.removeClass('loading');\n this.$spinner.remove();\n this.loaded = true;\n };\n Craft.sendActionRequest('POST', 'assets/preview-file', {data})\n .then((response) => {\n onResponse();\n\n if (response.data.requestId != this.requestId) {\n return;\n }\n\n if (!response.data.previewHtml) {\n this.$container.addClass('zilch');\n this.$container.append(\n $('<p/>', {text: Craft.t('app', 'No preview available.')})\n );\n this._addBumperButtons();\n return;\n }\n\n this.$container.removeClass('zilch');\n this.$container.attr('data-asset-id', this.assetId);\n this.$container.append(response.data.previewHtml);\n this._addBumperButtons();\n this._addModalName();\n Craft.appendHeadHtml(response.data.headHtml);\n Craft.appendBodyHtml(response.data.bodyHtml);\n })\n .catch(({response}) => {\n onResponse();\n alert(response.data.message);\n this.hide();\n });\n },\n\n /**\n * Resize the container to specified dimensions\n * @param {number} containerWidth\n * @param {number} containerHeight\n * @private\n */\n _resizeContainer: function (containerWidth, containerHeight) {\n this.$container.css({\n width: containerWidth,\n 'min-width': containerWidth,\n 'max-width': containerWidth,\n height: containerHeight,\n 'min-height': containerHeight,\n 'max-height': containerHeight,\n top: (Garnish.$win.height() - containerHeight) / 2,\n left: (Garnish.$win.width() - containerWidth) / 2,\n });\n },\n },\n {\n defaultSettings: {\n startingWidth: null,\n startingHeight: null,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * File Manager.\n */\nCraft.ProgressBar = Garnish.Base.extend({\n $progressBar: null,\n $innerProgressBar: null,\n $progressBarStatus: null,\n\n _itemCount: 0,\n _processedItemCount: 0,\n _displaySteps: false,\n\n init: function ($element, displaySteps) {\n if (displaySteps) {\n this._displaySteps = true;\n }\n\n this.$progressBar = $('<div class=\"progressbar pending hidden\"/>').appendTo(\n $element\n );\n this.$innerProgressBar = $('<div class=\"progressbar-inner\"/>').appendTo(\n this.$progressBar\n );\n this.$progressBarStatus = $(\n '<div class=\"progressbar-status hidden\" />'\n ).insertAfter(this.$progressBar);\n\n this.resetProgressBar();\n },\n\n /**\n * Reset the progress bar\n */\n resetProgressBar: function () {\n // Since setting the progress percentage implies that there is progress to be shown\n // It removes the pending class - we must add it back.\n this.setProgressPercentage(100);\n this.$progressBar.addClass('pending');\n\n // Reset all the counters\n this.setItemCount(1);\n this.setProcessedItemCount(0);\n this.$progressBarStatus.html('');\n\n if (this._displaySteps) {\n this.$progressBar.addClass('has-status');\n }\n },\n\n /**\n * Fade to invisible, hide it using a class and reset opacity to visible\n */\n hideProgressBar: function () {\n this.$progressBar.fadeTo('fast', 0.01, () => {\n this.$progressBar.addClass('hidden').fadeTo(1, 1, $.noop);\n });\n this.$progressBarStatus.fadeTo('fast', 0.01, () => {\n this.$progressBarStatus.addClass('hidden').fadeTo(1, 1, $.noop);\n });\n },\n\n showProgressBar: function () {\n this.$progressBar.removeClass('hidden');\n this.$progressBarStatus.removeClass('hidden');\n },\n\n setItemCount: function (count) {\n this._itemCount = count;\n },\n\n incrementItemCount: function (count) {\n this._itemCount += count;\n },\n\n setProcessedItemCount: function (count) {\n this._processedItemCount = count;\n },\n\n incrementProcessedItemCount: function (count) {\n this._processedItemCount += count;\n },\n\n updateProgressBar: function () {\n // Only fools would allow accidental division by zero.\n this._itemCount = Math.max(this._itemCount, 1);\n\n var width = Math.min(\n 100,\n Math.round((100 * this._processedItemCount) / this._itemCount)\n );\n\n this.setProgressPercentage(width);\n\n if (this._displaySteps) {\n this.$progressBarStatus.html(\n this._processedItemCount + ' / ' + this._itemCount\n );\n }\n },\n\n setProgressPercentage: function (percentage, animate) {\n if (percentage === 0) {\n this.$progressBar.addClass('pending');\n } else {\n this.$progressBar.removeClass('pending');\n\n if (animate) {\n this.$innerProgressBar\n .velocity('stop')\n .velocity({width: percentage + '%'}, 'fast');\n } else {\n this.$innerProgressBar.velocity('stop').width(percentage + '%');\n }\n }\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * File Manager.\n */\nCraft.PromptHandler = Garnish.Base.extend({\n modal: null,\n $modalContainerDiv: null,\n $prompt: null,\n $promptApplyToRemainingContainer: null,\n $promptApplyToRemainingCheckbox: null,\n $promptApplyToRemainingLabel: null,\n $pomptChoices: null,\n\n _prompts: [],\n _promptBatchCallback: $.noop,\n _promptBatchReturnData: [],\n _promptBatchNum: 0,\n\n resetPrompts: function () {\n this._prompts = [];\n this._promptBatchCallback = $.noop;\n this._promptBatchReturnData = [];\n this._promptBatchNum = 0;\n },\n\n addPrompt: function (prompt) {\n this._prompts.push(prompt);\n },\n\n getPromptCount: function () {\n return this._prompts.length;\n },\n\n showBatchPrompts: function (callback) {\n this._promptBatchCallback = callback;\n this._promptBatchReturnData = [];\n this._promptBatchNum = 0;\n\n this._showNextPromptInBatch();\n },\n\n _showNextPromptInBatch: function () {\n var prompt = this._prompts[this._promptBatchNum].prompt,\n remainingInBatch = this._prompts.length - (this._promptBatchNum + 1);\n\n this._showPrompt(\n prompt.message,\n prompt.choices,\n this._handleBatchPromptSelection.bind(this),\n remainingInBatch\n );\n },\n\n /**\n * Handles a prompt choice selection.\n *\n * @param {string} choice\n * @param {boolean} applyToRemaining\n * @private\n */\n _handleBatchPromptSelection: function (choice, applyToRemaining) {\n var prompt = this._prompts[this._promptBatchNum],\n remainingInBatch = this._prompts.length - (this._promptBatchNum + 1);\n\n // Record this choice\n var choiceData = $.extend(prompt, {choice});\n this._promptBatchReturnData.push(choiceData);\n\n // Are there any remaining items in the batch?\n if (remainingInBatch) {\n // Get ready to deal with the next prompt\n this._promptBatchNum++;\n\n // Apply the same choice to the remaining items?\n if (applyToRemaining) {\n this._handleBatchPromptSelection(choice, true);\n } else {\n // Show the next prompt\n this._showNextPromptInBatch();\n }\n } else {\n // All done! Call the callback\n if (typeof this._promptBatchCallback === 'function') {\n this._promptBatchCallback(this._promptBatchReturnData);\n }\n }\n },\n\n /**\n * @callback showPromptCallback\n * @param {string} choice\n * @param {boolean} applyToRemaining\n */\n /**\n * Show the user prompt with a given message and choices, plus an optional \"Apply to remaining\" checkbox.\n *\n * @param {string} message\n * @param {Array} choices\n * @param {showPromptCallback} callback\n * @param {number} itemsToGo\n */\n _showPrompt: function (message, choices, callback, itemsToGo) {\n this._promptCallback = callback;\n\n if (this.modal === null) {\n this.modal = new Garnish.Modal({closeOtherModals: false});\n }\n\n if (this.$modalContainerDiv === null) {\n this.$modalContainerDiv = $(\n '<div class=\"modal fitted prompt-modal\"></div>'\n )\n .addClass()\n .appendTo(Garnish.$bod);\n }\n\n this.$prompt = $('<div class=\"body\"></div>').appendTo(\n this.$modalContainerDiv.empty()\n );\n\n this.$promptMessage = $('<p class=\"prompt-msg\"/>').appendTo(this.$prompt);\n\n this.$promptChoices = $('<div class=\"options\"></div>').appendTo(\n this.$prompt\n );\n\n this.$promptApplyToRemainingContainer = $(\n '<label class=\"assets-applytoremaining\"/>'\n )\n .appendTo(this.$prompt)\n .hide();\n this.$promptApplyToRemainingCheckbox = $(\n '<input type=\"checkbox\"/>'\n ).appendTo(this.$promptApplyToRemainingContainer);\n this.$promptApplyToRemainingLabel = $('<span/>').appendTo(\n this.$promptApplyToRemainingContainer\n );\n\n this.$promptButtons = $('<div class=\"buttons right\"/>').appendTo(\n this.$prompt\n );\n\n this.modal.setContainer(this.$modalContainerDiv);\n\n this.$promptMessage.html(message);\n\n let $cancelBtn = $('<button/>', {\n type: 'button',\n class: 'btn',\n text: Craft.t('app', 'Cancel'),\n }).appendTo(this.$promptButtons);\n let $submitBtn = $('<button/>', {\n type: 'submit',\n class: 'btn submit disabled',\n text: Craft.t('app', 'OK'),\n }).appendTo(this.$promptButtons);\n\n for (var i = 0; i < choices.length; i++) {\n var $radioButtonHtml = $(\n '<div><label><input type=\"radio\" name=\"promptAction\" value=\"' +\n choices[i].value +\n '\"/> ' +\n choices[i].title +\n '</label></div>'\n ).appendTo(this.$promptChoices),\n $radioButton = $radioButtonHtml.find('input');\n\n this.addListener($radioButton, 'click', function () {\n $submitBtn.removeClass('disabled');\n });\n }\n\n this.addListener($submitBtn, 'activate', function (ev) {\n var choice = $(ev.currentTarget)\n .parents('.modal')\n .find('input[name=promptAction]:checked')\n .val(),\n applyToRemaining = this.$promptApplyToRemainingCheckbox.prop('checked');\n\n this._selectPromptChoice(choice, applyToRemaining);\n });\n\n this.addListener($cancelBtn, 'activate', function () {\n var choice = 'cancel',\n applyToRemaining = this.$promptApplyToRemainingCheckbox.prop('checked');\n\n this._selectPromptChoice(choice, applyToRemaining);\n });\n\n if (itemsToGo) {\n this.$promptApplyToRemainingContainer.show();\n this.$promptApplyToRemainingLabel.html(\n ' ' +\n Craft.t('app', 'Apply this to the {number} remaining conflicts?', {\n number: itemsToGo,\n })\n );\n }\n\n this.modal.show();\n this.modal.removeListener(Garnish.Modal.$shade, 'click');\n this.addListener(Garnish.Modal.$shade, 'click', '_cancelPrompt');\n },\n\n /**\n * Handles when a user selects one of the prompt choices.\n *\n * @param {string} choice\n * @param {boolean} applyToRemaining\n * @private\n */\n _selectPromptChoice: function (choice, applyToRemaining) {\n this.$prompt.fadeOut('fast', () => {\n this.modal.hide();\n this._promptCallback(choice, applyToRemaining);\n });\n },\n\n /**\n * Cancels the prompt.\n */\n _cancelPrompt: function () {\n this._selectPromptChoice('cancel', true);\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n\n/**\n * Queue\n */\nCraft.Queue = Garnish.Base.extend({\n running: false,\n paused: false,\n pausedForVisibility: false,\n jobs: null,\n\n get length() {\n return this.jobs.length;\n },\n\n get isPaused() {\n return this.paused || this.pausedForVisibility;\n },\n\n init: function () {\n this.jobs = [];\n\n Garnish.$doc.on('visibilitychange', () => {\n if (this.pausedForVisibility && Craft.isVisible()) {\n this.pausedForVisibility = false;\n this._resume();\n }\n });\n },\n\n /**\n * Adds a job to the queue.\n * @param {function} job\n * @returns {Promise}\n */\n push: function (job) {\n return this._add(job, 'push');\n },\n\n /**\n * Adds a job to the beginning of the queue.\n * @param {function} job\n * @returns {Promise}\n */\n unshift: function (job) {\n return this._add(job, 'unshift');\n },\n\n pause: function () {\n if (!this.paused) {\n this.paused = true;\n if (!this.pausedForVisibility) {\n this.trigger('pause');\n }\n }\n },\n\n resume: function () {\n if (this.paused) {\n this.paused = false;\n this._resume();\n }\n },\n\n /**\n * Adds a job to the queue.\n * @param {function} job\n * @param {string} method\n * @returns {Promise}\n * @private\n */\n _add: function (job, method) {\n return new Promise((resolve, reject) => {\n this.jobs[method](() => {\n return new Promise((qResolve, qReject) => {\n job()\n .then((value) => {\n // ...arguments doesn't work here :(\n resolve(value);\n qResolve();\n })\n .catch((value) => {\n // ...arguments doesn't work here :(\n reject(value);\n qReject();\n });\n });\n });\n\n if (!this.running) {\n this.trigger('beforeRun');\n this.running = true;\n this._exec();\n }\n });\n },\n\n clear: function () {\n this.jobs.length = 0;\n },\n\n /**\n * Runs the next job in the queue.\n * @private\n */\n _exec: function () {\n if (!this.jobs.length) {\n this.running = false;\n this.trigger('afterRun');\n return;\n }\n\n if (!this.pausedForVisibility && !Craft.isVisible()) {\n this.pausedForVisibility = true;\n if (!this.paused) {\n this.trigger('pause');\n }\n }\n\n if (this.paused || this.pausedForVisibility) {\n return;\n }\n\n this.trigger('beforeExec');\n const job = this.jobs.shift();\n job().finally(() => {\n this.trigger('afterExec');\n this._exec();\n });\n },\n\n _resume: function () {\n if (!this.isPaused) {\n this.trigger('resume');\n this._exec();\n }\n },\n});\n\nCraft.queue = new Craft.Queue();\n","(function ($) {\n /** global: Craft */\n /** global: Garnish */\n /**\n * Slide Picker\n */\n Craft.SlidePicker = Garnish.Base.extend(\n {\n min: null,\n max: null,\n totalSteps: null,\n value: null,\n label: null,\n describedBy: null,\n\n $container: null,\n $buttons: null,\n\n init: function (value, settings) {\n this.setSettings(settings, Craft.SlidePicker.defaults);\n\n this.$container = $('<div/>', {\n class: 'slide-picker',\n role: 'slider',\n tabindex: 0,\n });\n\n this.refresh();\n this.setValue(value, false);\n\n this.addListener(this.$container, 'keydown', (ev) => {\n switch (ev.keyCode) {\n case Garnish.UP_KEY:\n this.setValue(this.value + this.settings.step);\n ev.preventDefault();\n break;\n case Garnish.DOWN_KEY:\n this.setValue(this.value - this.settings.step);\n ev.preventDefault();\n break;\n case Garnish.RIGHT_KEY:\n if (Craft.orientation === 'ltr') {\n this.setValue(this.value + this.settings.step);\n } else {\n this.setValue(this.value - this.settings.step);\n }\n ev.preventDefault();\n break;\n case Garnish.LEFT_KEY:\n if (Craft.orientation === 'ltr') {\n this.setValue(this.value - this.settings.step);\n } else {\n this.setValue(this.value + this.settings.step);\n }\n ev.preventDefault();\n break;\n case Garnish.HOME_KEY:\n this.setValue(this.min);\n ev.preventDefault();\n break;\n case Garnish.END_KEY:\n this.setValue(this.max);\n ev.preventDefault();\n break;\n }\n });\n },\n\n refresh: function () {\n // Figure out what the min/max values are\n this.min = this._min();\n this.max = this._max();\n this.totalSteps = (this.max - this.min) / this.settings.step;\n\n // Set label\n this.label = this.settings.label;\n this.describedBy = this.settings.describedBy;\n\n if (!Number.isInteger(this.totalSteps)) {\n throw 'Invalid SlidePicker config';\n }\n\n if (this.$buttons) {\n this.$buttons.remove();\n }\n\n this.$container.attr('aria-valuemin', this.min);\n this.$container.attr('aria-valuemax', this.max);\n\n if (this.label) {\n this.$container.attr('aria-label', this.label);\n }\n\n if (this.describedBy) {\n this.$container.attr('aria-describedby', this.describedBy);\n }\n\n this.$buttons = $();\n\n // Create the buttons\n for (\n let value = this.min;\n value <= this.max;\n value += this.settings.step\n ) {\n this.$buttons = this.$buttons.add(\n $('<a/>', {\n title: this.settings.valueLabel(value),\n data: {value},\n })\n );\n }\n\n this.$buttons.appendTo(this.$container);\n\n if (this.value !== null) {\n let value = this.value;\n this.value = null;\n this.setValue(value, false);\n }\n\n this.addListener(this.$buttons, 'mouseover', (ev) => {\n this.$buttons.removeClass('active-hover last-active-hover');\n $(ev.currentTarget)\n .addClass('active-hover last-active-hover')\n .prevAll()\n .addClass('active-hover');\n });\n\n this.addListener(this.$buttons, 'mouseout', () => {\n this.$buttons.removeClass('active-hover');\n });\n\n this.addListener(this.$buttons, 'click', (ev) => {\n this.setValue($.data(ev.currentTarget, 'value'));\n ev.stopPropagation();\n this.$container.focus();\n });\n },\n\n setValue: function (value, triggerEvent) {\n value = Math.max(Math.min(value, this.max), this.min);\n\n if (this.value === (this.value = value)) {\n return;\n }\n\n this.$container.attr({\n 'aria-valuenow': this.value,\n 'aria-valuetext': this.settings.valueLabel(this.value),\n });\n\n this.$buttons.removeClass('last-active active');\n let $activeButton = this.$buttons.eq(\n (this.value - this.min) / this.settings.step\n );\n $activeButton.add($activeButton.prevAll()).addClass('active');\n $activeButton.addClass('last-active');\n\n if (triggerEvent !== false) {\n this.settings.onChange(value);\n }\n },\n\n _min: function () {\n if (typeof this.settings.min === 'function') {\n return this.settings.min();\n }\n return this.settings.min;\n },\n\n _max: function () {\n if (typeof this.settings.max === 'function') {\n return this.settings.max();\n }\n return this.settings.max;\n },\n },\n {\n defaults: {\n min: 0,\n max: 100,\n step: 10,\n valueLabel: null,\n onChange: $.noop,\n },\n }\n );\n})(jQuery);\n","/** global: Garnish */\n\nCraft.SlideRuleInput = Garnish.Base.extend({\n $container: null,\n $options: null,\n $selectedOption: null,\n $input: null,\n value: null,\n\n startPositionX: null,\n\n init: function (id, settings) {\n this.setSettings(settings, Craft.SlideRuleInput.defaultSettings);\n\n this.value = 0;\n this.graduationsMin = -70;\n this.graduationsMax = 70;\n this.slideMin = -45;\n this.slideMax = 45;\n\n this.$container = $('#' + id);\n this.$overlay = $('<div class=\"overlay\"></div>').appendTo(this.$container);\n this.$cursor = $('<div class=\"cursor\"></div>').appendTo(this.$container);\n this.$graduations = $('<div class=\"graduations\"></div>').appendTo(\n this.$container\n );\n this.$graduationsUl = $('<ul></ul>').appendTo(this.$graduations);\n\n this.$container.attr({\n role: 'slider',\n tabindex: '0',\n 'aria-valuemin': this.slideMin,\n 'aria-valuemax': this.slideMax,\n 'aria-valuenow': '0',\n 'aria-valuetext': Craft.t(\n 'app',\n '{num, number} {num, plural, =1{degree} other{degrees}}',\n {\n num: 0,\n }\n ),\n });\n\n for (var i = this.graduationsMin; i <= this.graduationsMax; i++) {\n var $li = $(\n '<li class=\"graduation\" data-graduation=\"' +\n i +\n '\"><div class=\"label\">' +\n i +\n '</div></li>'\n ).appendTo(this.$graduationsUl);\n\n if (i % 5 === 0) {\n $li.addClass('main-graduation');\n }\n\n if (i === 0) {\n $li.addClass('selected');\n }\n }\n\n this.$options = this.$container.find('.graduation');\n\n this.addListener(this.$container, 'resize', this._handleResize.bind(this));\n this.addListener(\n this.$container,\n 'tapstart',\n this._handleTapStart.bind(this)\n );\n this.addListener(Garnish.$bod, 'tapmove', this._handleTapMove.bind(this));\n this.addListener(Garnish.$bod, 'tapend', this._handleTapEnd.bind(this));\n this.addListener(\n this.$container,\n 'keydown',\n this._handleKeypress.bind(this)\n );\n\n // Set to zero\n\n // this.setValue(0);\n\n setTimeout(() => {\n // (n -1) options because the border is placed on the left of the 10px box\n this.graduationsCalculatedWidth = (this.$options.length - 1) * 10;\n this.$graduationsUl.css(\n 'left',\n -this.graduationsCalculatedWidth / 2 + this.$container.width() / 2\n );\n }, 50);\n },\n\n _handleResize: function () {\n var left = this.valueToPosition(this.value);\n this.$graduationsUl.css('left', left);\n },\n\n _handleKeypress: function (event) {\n const current = parseInt(this.$container.attr('aria-valuenow'), 10);\n\n switch (event.keyCode) {\n case Garnish.UP_KEY:\n case Garnish.RIGHT_KEY:\n this.setValue(current + 1);\n break;\n case Garnish.DOWN_KEY:\n case Garnish.LEFT_KEY:\n this.setValue(current - 1);\n break;\n case Garnish.PAGE_UP_KEY:\n this.setValue(current + 10);\n break;\n case Garnish.PAGE_DOWN_KEY:\n this.setValue(current - 10);\n break;\n case Garnish.HOME_KEY:\n this.setValue(this.slideMin);\n break;\n case Garnish.END_KEY:\n this.setValue(this.slideMax);\n break;\n }\n\n this.onChange();\n },\n\n _handleTapStart: function (ev, touch) {\n ev.preventDefault();\n\n this.startPositionX = touch.position.x;\n this.startLeft = this.$graduationsUl.position().left;\n\n this.dragging = true;\n this.onStart();\n },\n\n _handleTapMove: function (ev, touch) {\n if (this.dragging) {\n ev.preventDefault();\n\n var curX = this.startPositionX - touch.position.x;\n var left = this.startLeft - curX;\n var value = this.positionToValue(left);\n\n this.setValue(value);\n\n this.onChange();\n }\n },\n\n setValue: function (value) {\n var left = this.valueToPosition(value);\n if (value < this.slideMin) {\n value = this.slideMin;\n left = this.valueToPosition(value);\n } else if (value > this.slideMax) {\n value = this.slideMax;\n left = this.valueToPosition(value);\n }\n\n this.$graduationsUl.css('left', left);\n\n if (value >= this.slideMin && value <= this.slideMax) {\n this.$options.removeClass('selected');\n\n $.each(this.$options, function (key, option) {\n if ($(option).data('graduation') > 0) {\n if ($(option).data('graduation') <= value) {\n $(option).addClass('selected');\n }\n }\n if ($(option).data('graduation') < 0) {\n if ($(option).data('graduation') >= value) {\n $(option).addClass('selected');\n }\n }\n\n if ($(option).data('graduation') == 0) {\n $(option).addClass('selected');\n }\n });\n }\n\n this.$container.attr({\n 'aria-valuenow': value,\n 'aria-valuetext': Craft.t(\n 'app',\n '{num, number} {num, plural, =1{degree} other{degrees}}',\n {num: parseInt(value, 10)}\n ),\n });\n this.value = value;\n },\n\n _handleTapEnd: function (ev) {\n if (this.dragging) {\n ev.preventDefault();\n this.dragging = false;\n this.onEnd();\n }\n },\n\n positionToValue: function (position) {\n var scaleMin = this.graduationsMin * -1;\n var scaleMax = (this.graduationsMin - this.graduationsMax) * -1;\n\n return (\n ((this.$graduations.width() / 2 + position * -1) /\n this.graduationsCalculatedWidth) *\n scaleMax -\n scaleMin\n );\n },\n\n valueToPosition: function (value) {\n var scaleMin = this.graduationsMin * -1;\n var scaleMax = (this.graduationsMin - this.graduationsMax) * -1;\n\n return -(\n ((value + scaleMin) * this.graduationsCalculatedWidth) / scaleMax -\n this.$graduations.width() / 2\n );\n },\n\n onStart: function () {\n if (typeof this.settings.onChange === 'function') {\n this.settings.onStart(this);\n }\n },\n\n onChange: function () {\n if (typeof this.settings.onChange === 'function') {\n this.settings.onChange(this);\n }\n },\n\n onEnd: function () {\n if (typeof this.settings.onChange === 'function') {\n this.settings.onEnd(this);\n }\n },\n\n defaultSettings: {\n onStart: $.noop,\n onChange: $.noop,\n onEnd: $.noop,\n },\n});\n","(function ($) {\n /** global: Craft */\n /** global: Garnish */\n /**\n * Slide Picker\n */\n Craft.Slideout = Garnish.Base.extend(\n {\n $outerContainer: null,\n $container: null,\n $shade: null,\n isOpen: false,\n\n init: function (contents, settings) {\n this.setSettings(settings, Craft.Slideout.defaults);\n\n if (!Craft.useMobileStyles()) {\n this.$shade = $('<div class=\"slideout-shade\"/>').appendTo(\n Garnish.$bod\n );\n\n if (this.settings.closeOnShadeClick) {\n this.addListener(this.$shade, 'click', (ev) => {\n ev.stopPropagation();\n this.close();\n });\n }\n }\n\n this.$outerContainer = $('<div/>', {\n class: 'slideout-container hidden',\n });\n this.$container = $(\n `<${this.settings.containerElement}/>`,\n this.settings.containerAttributes\n )\n .attr('data-slideout', '')\n .addClass('slideout')\n .append(contents)\n .data('slideout', this)\n .appendTo(this.$outerContainer);\n\n Garnish.addModalAttributes(this.$outerContainer);\n\n if (Craft.useMobileStyles()) {\n this.$container.addClass('so-mobile');\n }\n\n Craft.trapFocusWithin(this.$container);\n\n if (this.settings.autoOpen) {\n this.open();\n }\n },\n\n open: function () {\n if (this.isOpen) {\n return;\n }\n\n this.setTriggerElement(document.activeElement);\n\n this._cancelTransitionListeners();\n\n // Move the shade + container to the end of <body> so they get the highest sub-z-indexes\n if (this.$shade) {\n this.$shade.appendTo(Garnish.$bod).show();\n }\n\n this.$outerContainer.appendTo(Garnish.$bod).removeClass('hidden');\n\n if (Craft.useMobileStyles()) {\n this.$container.css('top', '100vh');\n } else {\n this.$container.css(Garnish.ltr ? 'left' : 'right', '100vw');\n }\n\n this.$container.one('transitionend.slideout', () => {\n Craft.setFocusWithin(this.$container);\n });\n\n if (this.$shade) {\n this.$shade[0].offsetWidth;\n this.$shade.addClass('so-visible');\n }\n\n this.$container[0].offsetWidth;\n Craft.Slideout.addPanel(this);\n\n this.enable();\n Garnish.uiLayerManager.addLayer(this.$outerContainer);\n Garnish.hideModalBackgroundLayers();\n\n if (this.settings.closeOnEsc) {\n Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n this.close();\n });\n }\n\n this.isOpen = true;\n this.trigger('open');\n },\n\n setTriggerElement: function (trigger) {\n this.settings.triggerElement = trigger;\n },\n\n close: function () {\n if (!this.isOpen) {\n return;\n }\n\n this.trigger('beforeClose');\n this.disable();\n this.isOpen = false;\n\n this._cancelTransitionListeners();\n\n if (this.$shade) {\n this.$shade\n .removeClass('so-visible')\n .one('transitionend.slideout', () => {\n this.$shade.hide();\n });\n }\n\n Craft.Slideout.removePanel(this);\n Garnish.uiLayerManager.removeLayer();\n Garnish.resetModalBackgroundLayerVisibility();\n this.$container.one('transitionend.slideout', () => {\n this.$outerContainer.addClass('hidden');\n this.trigger('close');\n });\n\n if (this.settings.triggerElement) {\n this.settings.triggerElement.focus();\n }\n },\n\n _cancelTransitionListeners: function () {\n if (this.$shade) {\n this.$shade.off('transitionend.slideout');\n }\n\n this.$container.off('transitionend.slideout');\n },\n\n /**\n * Destroy\n */\n destroy: function () {\n if (this.$shade) {\n this.$shade.remove();\n this.$shade = null;\n }\n\n this.$outerContainer.remove();\n this.$outerContainer = null;\n this.$container = null;\n\n this.base();\n },\n },\n {\n defaults: {\n containerElement: 'div',\n containerAttributes: {},\n autoOpen: true,\n closeOnEsc: true,\n closeOnShadeClick: true,\n triggerElement: null,\n },\n openPanels: [],\n addPanel: function (panel) {\n Craft.Slideout.openPanels.unshift(panel);\n if (Craft.useMobileStyles()) {\n panel.$container.css('top', 0);\n } else {\n Craft.Slideout.updateStyles();\n }\n },\n removePanel: function (panel) {\n Craft.Slideout.openPanels = Craft.Slideout.openPanels.filter(\n (m) => m !== panel\n );\n if (Craft.useMobileStyles()) {\n panel.$container.css('top', '100vh');\n } else {\n panel.$container.css(Garnish.ltr ? 'left' : 'right', '100vw');\n Craft.Slideout.updateStyles();\n }\n },\n updateStyles: function () {\n const totalPanels = Craft.Slideout.openPanels.length;\n Craft.Slideout.openPanels.forEach((panel, i) => {\n panel.$container.css(\n Garnish.ltr ? 'left' : 'right',\n `${50 * ((totalPanels - i) / totalPanels)}vw`\n );\n });\n\n if (totalPanels !== 0) {\n Garnish.$bod.addClass('no-scroll');\n } else {\n Garnish.$bod.removeClass('no-scroll');\n }\n },\n }\n );\n})(jQuery);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Slug Generator\n */\nCraft.SlugGenerator = Craft.BaseInputGenerator.extend({\n generateTargetValue: function (sourceVal) {\n // Remove HTML tags\n sourceVal = sourceVal.replace(/<(.*?)>/g, '');\n\n // Remove inner-word punctuation\n sourceVal = sourceVal.replace(/['\"‘’“”\\[\\]\\(\\)\\{\\}:]/g, '');\n\n // Make it lowercase\n if (!Craft.allowUppercaseInSlug) {\n sourceVal = sourceVal.toLowerCase();\n }\n\n if (Craft.limitAutoSlugsToAscii) {\n // Convert extended ASCII characters to basic ASCII\n sourceVal = Craft.asciiString(sourceVal, this.settings.charMap);\n }\n\n // Get the \"words\". Split on anything that is not alphanumeric.\n // Reference: http://www.regular-expressions.info/unicode.html\n var words = Craft.filterArray(\n XRegExp.matchChain(sourceVal, [XRegExp('[\\\\p{L}\\\\p{N}\\\\p{M}]+')])\n );\n\n if (words.length) {\n return words.join(Craft.slugWordSeparator);\n } else {\n return '';\n }\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Structure class\n */\nCraft.Structure = Garnish.Base.extend(\n {\n id: null,\n\n $container: null,\n state: null,\n structureDrag: null,\n\n /**\n * Init\n */\n init: function (id, container, settings) {\n this.id = id;\n this.$container = $(container);\n this.setSettings(settings, Craft.Structure.defaults);\n\n // Is this already a structure?\n if (this.$container.data('structure')) {\n console.warn('Double-instantiating a structure on an element');\n this.$container.data('structure').destroy();\n }\n\n this.$container.data('structure', this);\n\n this.state = {};\n\n if (this.settings.storageKey) {\n $.extend(\n this.state,\n Craft.getLocalStorage(this.settings.storageKey, {})\n );\n }\n\n if (typeof this.state.collapsedElementIds === 'undefined') {\n this.state.collapsedElementIds = [];\n }\n\n var $parents = this.$container.find('ul').prev('.row');\n\n for (var i = 0; i < $parents.length; i++) {\n var $row = $($parents[i]),\n $li = $row.parent(),\n $toggle = $(\n '<div class=\"toggle\" title=\"' +\n Craft.t('app', 'Show/hide children') +\n '\"/>'\n ).prependTo($row);\n\n if (\n $.inArray(\n $row.children('.element').data('id'),\n this.state.collapsedElementIds\n ) !== -1\n ) {\n $li.addClass('collapsed');\n }\n\n this.initToggle($toggle);\n }\n\n if (this.settings.sortable) {\n this.structureDrag = new Craft.StructureDrag(\n this,\n this.settings.maxLevels\n );\n }\n\n if (this.settings.newChildUrl) {\n this.initNewChildMenus(this.$container.find('.add'));\n }\n },\n\n initToggle: function ($toggle) {\n $toggle.on('click', (ev) => {\n var $li = $(ev.currentTarget).closest('li'),\n elementId = $li.children('.row').find('.element:first').data('id'),\n viewStateKey = $.inArray(elementId, this.state.collapsedElementIds);\n\n if ($li.hasClass('collapsed')) {\n $li.removeClass('collapsed');\n\n if (viewStateKey !== -1) {\n this.state.collapsedElementIds.splice(viewStateKey, 1);\n }\n } else {\n $li.addClass('collapsed');\n\n if (viewStateKey === -1) {\n this.state.collapsedElementIds.push(elementId);\n }\n }\n\n if (this.settings.storageKey) {\n Craft.setLocalStorage(this.settings.storageKey, this.state);\n }\n });\n },\n\n initNewChildMenus: function ($addBtns) {\n this.addListener($addBtns, 'click', 'onNewChildMenuClick');\n },\n\n onNewChildMenuClick: function (ev) {\n var $btn = $(ev.currentTarget);\n\n if (!$btn.data('menubtn')) {\n var elementId = $btn.parent().children('.element').data('id'),\n newChildUrl = Craft.getUrl(\n this.settings.newChildUrl,\n 'parentId=' + elementId\n );\n\n $(\n '<div class=\"menu\"><ul><li><a href=\"' +\n newChildUrl +\n '\">' +\n Craft.t('app', 'New child') +\n '</a></li></ul></div>'\n ).insertAfter($btn);\n\n var menuBtn = new Garnish.MenuBtn($btn);\n menuBtn.showMenu();\n }\n },\n\n getIndent: function (level) {\n return (\n Craft.Structure.baseIndent + (level - 1) * Craft.Structure.nestedIndent\n );\n },\n\n addElement: function ($element) {\n var $li = $('<li data-level=\"1\"/>').appendTo(this.$container),\n $row = $(\n '<div class=\"row\" style=\"margin-' +\n Craft.left +\n ': -' +\n Craft.Structure.baseIndent +\n 'px; padding-' +\n Craft.left +\n ': ' +\n Craft.Structure.baseIndent +\n 'px;\">'\n ).appendTo($li);\n\n $row.append($element);\n\n if (this.settings.sortable) {\n $row.append(\n '<a class=\"move icon\" title=\"' + Craft.t('app', 'Move') + '\"></a>'\n );\n this.structureDrag.addItems($li);\n }\n\n if (this.settings.newChildUrl) {\n var $addBtn = $(\n '<a class=\"add icon\" title=\"' + Craft.t('app', 'New child') + '\"></a>'\n ).appendTo($row);\n this.initNewChildMenus($addBtn);\n }\n\n $row.css('margin-bottom', -30);\n $row.velocity({'margin-bottom': 0}, 'fast');\n },\n\n removeElement: function ($element) {\n var $li = $element.parent().parent();\n\n if (this.settings.sortable) {\n this.structureDrag.removeItems($li);\n }\n\n var $parentUl;\n\n if (!$li.siblings().length) {\n $parentUl = $li.parent();\n }\n\n $li\n .css('visibility', 'hidden')\n .velocity({marginBottom: -$li.height()}, 'fast', () => {\n $li.remove();\n\n if (typeof $parentUl !== 'undefined') {\n this._removeUl($parentUl);\n }\n });\n },\n\n _removeUl: function ($ul) {\n $ul.siblings('.row').children('.toggle').remove();\n $ul.remove();\n },\n\n destroy: function () {\n this.$container.removeData('structure');\n this.base();\n },\n },\n {\n baseIndent: 8,\n nestedIndent: 35,\n\n defaults: {\n storageKey: null,\n sortable: false,\n newChildUrl: null,\n maxLevels: null,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Structure drag class\n */\nCraft.StructureDrag = Garnish.Drag.extend({\n structure: null,\n maxLevels: null,\n draggeeLevel: null,\n\n $helperLi: null,\n $targets: null,\n draggeeHeight: null,\n\n init: function (structure, maxLevels) {\n this.structure = structure;\n this.maxLevels = maxLevels;\n\n this.$insertion = $('<li class=\"draginsertion\"/>');\n\n var $items = this.structure.$container.find('li');\n\n this.base($items, {\n handle: '.element:first, .move:first',\n helper: this.getHelper.bind(this),\n });\n },\n\n getHelper: function ($helper) {\n this.$helperLi = $helper;\n var $ul = $('<ul class=\"structure draghelper\"/>').append($helper);\n $helper.css(\n 'padding-' + Craft.left,\n this.$draggee.css('padding-' + Craft.left)\n );\n $helper.find('.move').removeAttr('title');\n return $ul;\n },\n\n onDragStart: function () {\n this.$targets = $();\n\n // Recursively find each of the targets, in the order they appear to be in\n this.findTargets(this.structure.$container);\n\n // How deep does the rabbit hole go?\n this.draggeeLevel = 0;\n var $level = this.$draggee;\n do {\n this.draggeeLevel++;\n $level = $level.find('> ul > li');\n } while ($level.length);\n\n // Collapse the draggee\n this.draggeeHeight = this.$draggee.height();\n this.$draggee.velocity(\n {\n height: 0,\n },\n 'fast',\n () => {\n this.$draggee.addClass('hidden');\n }\n );\n this.base();\n\n this.addListener(Garnish.$doc, 'keydown', function (ev) {\n if (ev.keyCode === Garnish.ESC_KEY) {\n this.cancelDrag();\n }\n });\n },\n\n findTargets: function ($ul) {\n var $lis = $ul.children().not(this.$draggee);\n\n for (var i = 0; i < $lis.length; i++) {\n var $li = $($lis[i]);\n this.$targets = this.$targets.add($li.children('.row'));\n\n if (!$li.hasClass('collapsed')) {\n this.findTargets($li.children('ul'));\n }\n }\n },\n\n onDrag: function () {\n if (this._.$closestTarget) {\n this._.$closestTarget.removeClass('draghover');\n this.$insertion.remove();\n }\n\n // First let's find the closest target\n this._.$closestTarget = null;\n this._.closestTargetPos = null;\n this._.closestTargetYDiff = null;\n this._.closestTargetOffset = null;\n this._.closestTargetHeight = null;\n\n for (this._.i = 0; this._.i < this.$targets.length; this._.i++) {\n this._.$target = $(this.$targets[this._.i]);\n this._.targetOffset = this._.$target.offset();\n this._.targetHeight = this._.$target.outerHeight();\n this._.targetYMidpoint =\n this._.targetOffset.top + this._.targetHeight / 2;\n this._.targetYDiff = Math.abs(this.mouseY - this._.targetYMidpoint);\n\n if (\n this._.i === 0 ||\n (this.mouseY >= this._.targetOffset.top + 5 &&\n this._.targetYDiff < this._.closestTargetYDiff)\n ) {\n this._.$closestTarget = this._.$target;\n this._.closestTargetPos = this._.i;\n this._.closestTargetYDiff = this._.targetYDiff;\n this._.closestTargetOffset = this._.targetOffset;\n this._.closestTargetHeight = this._.targetHeight;\n } else {\n // Getting colder\n break;\n }\n }\n\n if (!this._.$closestTarget) {\n return;\n }\n\n // Are we hovering above the first row?\n if (\n this._.closestTargetPos === 0 &&\n this.mouseY < this._.closestTargetOffset.top + 5\n ) {\n this.$insertion.prependTo(this.structure.$container);\n } else {\n this._.$closestTargetLi = this._.$closestTarget.parent();\n this._.closestTargetLevel = this._.$closestTargetLi.data('level');\n\n // Is there a next row?\n if (this._.closestTargetPos < this.$targets.length - 1) {\n this._.$nextTargetLi = $(\n this.$targets[this._.closestTargetPos + 1]\n ).parent();\n this._.nextTargetLevel = this._.$nextTargetLi.data('level');\n } else {\n this._.$nextTargetLi = null;\n this._.nextTargetLevel = null;\n }\n\n // Are we hovering between this row and the next one?\n this._.hoveringBetweenRows =\n this.mouseY >=\n this._.closestTargetOffset.top + this._.closestTargetHeight - 5;\n\n /**\n * Scenario 1: Both rows have the same level.\n *\n * * Row 1\n * ----------------------\n * * Row 2\n */\n\n if (\n this._.$nextTargetLi &&\n this._.nextTargetLevel == this._.closestTargetLevel\n ) {\n if (this._.hoveringBetweenRows) {\n if (\n !this.maxLevels ||\n this.maxLevels >= this._.closestTargetLevel + this.draggeeLevel - 1\n ) {\n // Position the insertion after the closest target\n this.$insertion.insertAfter(this._.$closestTargetLi);\n }\n } else {\n if (\n !this.maxLevels ||\n this.maxLevels >= this._.closestTargetLevel + this.draggeeLevel\n ) {\n this._.$closestTarget.addClass('draghover');\n }\n }\n } else if (\n /**\n * Scenario 2: Next row is a child of this one.\n *\n * * Row 1\n * ----------------------\n * * Row 2\n */\n this._.$nextTargetLi &&\n this._.nextTargetLevel > this._.closestTargetLevel\n ) {\n if (\n !this.maxLevels ||\n this.maxLevels >= this._.nextTargetLevel + this.draggeeLevel - 1\n ) {\n if (this._.hoveringBetweenRows) {\n // Position the insertion as the first child of the closest target\n this.$insertion.insertBefore(this._.$nextTargetLi);\n } else {\n this._.$closestTarget.addClass('draghover');\n this.$insertion.appendTo(this._.$closestTargetLi.children('ul'));\n }\n }\n } else {\n /**\n * Scenario 3: Next row is a child of a parent node, or there is no next row.\n *\n * * Row 1\n * ----------------------\n * * Row 2\n */\n if (this._.hoveringBetweenRows) {\n // Determine which <li> to position the insertion after\n this._.draggeeX = this.mouseX - this.targetItemMouseDiffX;\n\n if (Craft.orientation === 'rtl') {\n this._.draggeeX += this.$helperLi.width();\n }\n\n this._.$parentLis = this._.$closestTarget.parentsUntil(\n this.structure.$container,\n 'li'\n );\n this._.$closestParentLi = null;\n this._.closestParentLiXDiff = null;\n this._.closestParentLevel = null;\n\n for (this._.i = 0; this._.i < this._.$parentLis.length; this._.i++) {\n this._.$parentLi = $(this._.$parentLis[this._.i]);\n this._.parentLiX = this._.$parentLi.offset().left;\n\n if (Craft.orientation === 'rtl') {\n this._.parentLiX += this._.$parentLi.width();\n }\n\n this._.parentLiXDiff = Math.abs(this._.parentLiX - this._.draggeeX);\n this._.parentLevel = this._.$parentLi.data('level');\n\n if (\n (!this.maxLevels ||\n this.maxLevels >= this._.parentLevel + this.draggeeLevel - 1) &&\n (!this._.$closestParentLi ||\n (this._.parentLiXDiff < this._.closestParentLiXDiff &&\n (!this._.$nextTargetLi ||\n this._.parentLevel >= this._.nextTargetLevel)))\n ) {\n this._.$closestParentLi = this._.$parentLi;\n this._.closestParentLiXDiff = this._.parentLiXDiff;\n this._.closestParentLevel = this._.parentLevel;\n }\n }\n\n if (this._.$closestParentLi) {\n this.$insertion.insertAfter(this._.$closestParentLi);\n }\n } else {\n if (\n !this.maxLevels ||\n this.maxLevels >= this._.closestTargetLevel + this.draggeeLevel\n ) {\n this._.$closestTarget.addClass('draghover');\n }\n }\n }\n }\n },\n\n cancelDrag: function () {\n this.$insertion.remove();\n\n if (this._.$closestTarget) {\n this._.$closestTarget.removeClass('draghover');\n }\n\n this.onMouseUp();\n },\n\n onDragStop: function () {\n // Are we repositioning the draggee?\n if (\n this._.$closestTarget &&\n (this.$insertion.parent().length ||\n this._.$closestTarget.hasClass('draghover'))\n ) {\n var $draggeeParent, moved;\n\n // Are we about to leave the draggee's original parent childless?\n if (!this.$draggee.siblings().length) {\n $draggeeParent = this.$draggee.parent();\n }\n\n if (this.$insertion.parent().length) {\n // Make sure the insertion isn't right next to the draggee\n var $closestSiblings = this.$insertion\n .next()\n .add(this.$insertion.prev());\n\n if ($.inArray(this.$draggee[0], $closestSiblings) === -1) {\n this.$insertion.replaceWith(this.$draggee);\n moved = true;\n } else {\n this.$insertion.remove();\n moved = false;\n }\n } else {\n var $ul = this._.$closestTargetLi.children('ul');\n\n // Make sure this is a different parent than the draggee's\n if (!$draggeeParent || !$ul.length || $ul[0] !== $draggeeParent[0]) {\n if (!$ul.length) {\n var $toggle = $(\n '<div class=\"toggle\" title=\"' +\n Craft.t('app', 'Show/hide children') +\n '\"/>'\n ).prependTo(this._.$closestTarget);\n this.structure.initToggle($toggle);\n\n $ul = $('<ul>').appendTo(this._.$closestTargetLi);\n } else if (this._.$closestTargetLi.hasClass('collapsed')) {\n this._.$closestTarget.children('.toggle').trigger('click');\n }\n\n this.$draggee.appendTo($ul);\n moved = true;\n } else {\n moved = false;\n }\n }\n\n // Remove the class either way\n this._.$closestTarget.removeClass('draghover');\n\n if (moved) {\n // Now deal with the now-childless parent\n if ($draggeeParent) {\n this.structure._removeUl($draggeeParent);\n }\n\n // Has the level changed?\n var newLevel =\n this.$draggee.parentsUntil(this.structure.$container, 'li').length +\n 1;\n\n var animateCss;\n\n if (newLevel != this.$draggee.data('level')) {\n // Correct the helper's padding if moving to/from level 1\n if (this.$draggee.data('level') == 1) {\n animateCss = {};\n animateCss['padding-' + Craft.left] = 38;\n this.$helperLi.velocity(animateCss, 'fast');\n } else if (newLevel == 1) {\n animateCss = {};\n animateCss['padding-' + Craft.left] = Craft.Structure.baseIndent;\n this.$helperLi.velocity(animateCss, 'fast');\n }\n\n this.setLevel(this.$draggee, newLevel);\n }\n\n // Make it real\n var $element = this.$draggee.children('.row').children('.element');\n\n var data = {\n structureId: this.structure.id,\n elementId: $element.data('id'),\n siteId: $element.data('site-id'),\n prevId: this.$draggee\n .prev()\n .children('.row')\n .children('.element')\n .data('id'),\n parentId: this.$draggee\n .parent('ul')\n .parent('li')\n .children('.row')\n .children('.element')\n .data('id'),\n };\n\n Craft.sendActionRequest('POST', 'structures/move-element', {data}).then(\n (response) => {\n Craft.cp.displaySuccess(Craft.t('app', 'New order saved.'));\n }\n );\n }\n }\n\n // Animate things back into place\n this.$draggee\n .velocity('stop')\n .removeClass('hidden')\n .velocity(\n {\n height: this.draggeeHeight,\n },\n 'fast',\n () => {\n this.$draggee.css('height', 'auto');\n }\n );\n\n this.returnHelpersToDraggees();\n\n this.base();\n },\n\n setLevel: function ($li, level) {\n $li.data('level', level);\n\n var indent = this.structure.getIndent(level);\n\n var css = {};\n css['margin-' + Craft.left] = '-' + indent + 'px';\n css['padding-' + Craft.left] = indent + 'px';\n this.$draggee.children('.row').css(css);\n\n var $childLis = $li.children('ul').children();\n\n for (var i = 0; i < $childLis.length; i++) {\n this.setLevel($($childLis[i]), level + 1);\n }\n },\n});\n","/** global: Craft */\n/** global: Garnish */\nCraft.StructureTableSorter = Garnish.DragSort.extend(\n {\n tableView: null,\n structureId: null,\n maxLevels: null,\n\n _basePadding: null,\n _helperMargin: null,\n\n _$firstRowCells: null,\n _$titleHelperCell: null,\n\n _titleHelperCellOuterWidth: null,\n\n _ancestors: null,\n _updateAncestorsFrame: null,\n\n _draggeeLevel: null,\n _draggeeLevelDelta: null,\n draggingLastElements: null,\n _loadingDraggeeLevelDelta: false,\n\n _targetLevel: null,\n _targetLevelBounds: null,\n\n _positionChanged: null,\n\n /**\n * Constructor\n */\n init: function (tableView, $elements, settings) {\n this.tableView = tableView;\n this.structureId = this.tableView.$table.data('structure-id');\n this.maxLevels = parseInt(this.tableView.$table.attr('data-max-levels'));\n\n this._basePadding = 14 + (this.tableView.elementIndex.actions ? 34 : 24); // see _elements/tableview/elements.html\n this._helperMargin = this.tableView.elementIndex.actions ? 54 : 0;\n\n settings = $.extend({}, Craft.StructureTableSorter.defaults, settings, {\n handle: '.move',\n collapseDraggees: true,\n singleHelper: true,\n helperSpacingY: 2,\n magnetStrength: 4,\n helper: this.getHelper.bind(this),\n helperLagBase: 1.5,\n axis: Garnish.Y_AXIS,\n });\n\n this.base($elements, settings);\n },\n\n /**\n * Returns the draggee rows (including any descendent rows).\n */\n findDraggee: function () {\n this._draggeeLevel = this._targetLevel = this.$targetItem.data('level');\n this._draggeeLevelDelta = 0;\n\n var $draggee = $(this.$targetItem),\n $nextRow = this.$targetItem.next();\n\n while ($nextRow.length) {\n // See if this row is a descendant of the draggee\n var nextRowLevel = $nextRow.data('level');\n\n if (nextRowLevel <= this._draggeeLevel) {\n break;\n }\n\n // Is this the deepest descendant we've seen so far?\n var nextRowLevelDelta = nextRowLevel - this._draggeeLevel;\n\n if (nextRowLevelDelta > this._draggeeLevelDelta) {\n this._draggeeLevelDelta = nextRowLevelDelta;\n }\n\n // Add it and prep the next row\n $draggee = $draggee.add($nextRow);\n $nextRow = $nextRow.next();\n }\n\n // Are we dragging the last elements on the page?\n this.draggingLastElements = !$nextRow.length;\n\n // Do we have a maxLevels to enforce,\n // and does it look like this draggee has descendants we don't know about yet?\n if (\n this.maxLevels &&\n this.draggingLastElements &&\n this.tableView.getMorePending()\n ) {\n // Only way to know the true descendant level delta is to ask PHP\n this._loadingDraggeeLevelDelta = true;\n\n var data = this._getAjaxBaseData(this.$targetItem);\n\n Craft.sendActionRequest('POST', 'structures/get-element-level-delta', {\n data,\n }).then((response) => {\n this._loadingDraggeeLevelDelta = false;\n\n if (this.dragging) {\n this._draggeeLevelDelta = response.data.delta;\n this.drag(false);\n }\n });\n }\n\n return $draggee;\n },\n\n /**\n * Returns the drag helper.\n */\n getHelper: function ($helperRow) {\n var $outerContainer = $(\n '<div class=\"elements datatablesorthelper\"/>'\n ).appendTo(Garnish.$bod),\n $innerContainer = $('<div class=\"tableview\"/>').appendTo(\n $outerContainer\n ),\n $table = $('<table class=\"data\"/>').appendTo($innerContainer),\n $tbody = $('<tbody/>').appendTo($table);\n\n $helperRow.appendTo($tbody);\n\n // Copy the column widths\n this._$firstRowCells = this.tableView.$elementContainer\n .children('tr:first')\n .children();\n var $helperCells = $helperRow.children();\n\n for (var i = 0; i < $helperCells.length; i++) {\n var $helperCell = $($helperCells[i]);\n\n // Skip the checkbox cell\n if ($helperCell.hasClass('checkbox-cell')) {\n $helperCell.remove();\n continue;\n }\n\n // Hard-set the cell widths\n var $firstRowCell = $(this._$firstRowCells[i]);\n var width = $firstRowCell[0].getBoundingClientRect().width;\n\n $firstRowCell.css('width', width + 'px');\n $helperCell.css('width', width + 'px');\n\n // Is this the title cell?\n if (Garnish.hasAttr($firstRowCell, 'data-titlecell')) {\n this._$titleHelperCell = $helperCell;\n var padding = parseInt($firstRowCell.css('padding-' + Craft.left));\n this._titleHelperCellOuterWidth = width;\n\n $helperCell.css('padding-' + Craft.left, this._basePadding);\n }\n }\n\n return $outerContainer;\n },\n\n /**\n * Returns whether the draggee can be inserted before a given item.\n */\n canInsertBefore: function ($item) {\n if (this._loadingDraggeeLevelDelta) {\n return false;\n }\n\n return this._getLevelBounds($item.prev(), $item) !== false;\n },\n\n /**\n * Returns whether the draggee can be inserted after a given item.\n */\n canInsertAfter: function ($item) {\n if (this._loadingDraggeeLevelDelta) {\n return false;\n }\n\n return this._getLevelBounds($item, $item.next()) !== false;\n },\n\n // Events\n // -------------------------------------------------------------------------\n\n /**\n * On Drag Start\n */\n onDragStart: function () {\n // Get the initial set of ancestors, before the item gets moved\n this._ancestors = this._getAncestors(\n this.$targetItem,\n this.$targetItem.data('level')\n );\n\n // Set the initial target level bounds\n this._setTargetLevelBounds();\n\n // Check to see if we should load more elements now\n this.tableView.maybeLoadMore();\n\n this.base();\n },\n\n /**\n * On Drag\n */\n onDrag: function () {\n this.base();\n this._updateIndent();\n },\n\n /**\n * On Insertion Point Change\n */\n onInsertionPointChange: function () {\n this._setTargetLevelBounds();\n this._updateAncestorsBeforeRepaint();\n this.base();\n },\n\n /**\n * On Drag Stop\n */\n onDragStop: function () {\n this._positionChanged = false;\n this.base();\n\n // Update the draggee's padding if the position just changed\n // ---------------------------------------------------------------------\n\n if (this._targetLevel != this._draggeeLevel) {\n var levelDiff = this._targetLevel - this._draggeeLevel;\n\n for (var i = 0; i < this.$draggee.length; i++) {\n var $draggee = $(this.$draggee[i]),\n oldLevel = $draggee.data('level'),\n newLevel = oldLevel + levelDiff,\n padding = this._basePadding + this._getLevelIndent(newLevel);\n\n $draggee.data('level', newLevel);\n $draggee.find('.element').data('level', newLevel);\n $draggee\n .children('[data-titlecell]:first')\n .css('padding-' + Craft.left, padding);\n }\n\n this._positionChanged = true;\n }\n\n // Keep in mind this could have also been set by onSortChange()\n if (this._positionChanged) {\n // Tell the server about the new position\n // -----------------------------------------------------------------\n\n var data = this._getAjaxBaseData(this.$draggee);\n\n // Find the previous sibling/parent, if there is one\n var $prevRow = this.$draggee.first().prev();\n\n while ($prevRow.length) {\n var prevRowLevel = $prevRow.data('level');\n\n if (prevRowLevel == this._targetLevel) {\n data.prevId = $prevRow.data('id');\n break;\n }\n\n if (prevRowLevel < this._targetLevel) {\n data.parentId = $prevRow.data('id');\n\n // Is this row collapsed?\n var $toggle = $prevRow.find('> th > .toggle');\n\n if (!$toggle.hasClass('expanded')) {\n // Make it look expanded\n $toggle.addClass('expanded');\n\n // Add a temporary row\n var $spinnerRow = this.tableView._createSpinnerRowAfter($prevRow);\n\n // Remove the target item\n if (this.tableView.elementSelect) {\n this.tableView.elementSelect.removeItems(this.$targetItem);\n }\n\n this.removeItems(this.$targetItem);\n this.$targetItem.remove();\n this.tableView._totalVisible--;\n }\n\n break;\n }\n\n $prevRow = $prevRow.prev();\n }\n\n Craft.sendActionRequest('POST', 'structures/move-element', {data})\n .then((response) => {\n Craft.cp.displaySuccess(Craft.t('app', 'New position saved.'));\n this.onPositionChange();\n\n // Were we waiting on this to complete so we can expand the new parent?\n if ($spinnerRow && $spinnerRow.parent().length) {\n $spinnerRow.remove();\n this.tableView._expandElement($toggle, true);\n }\n\n // See if we should run any pending tasks\n Craft.cp.runQueue();\n })\n .catch(({response}) => {\n Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n this.tableView.elementIndex.updateElements();\n return;\n });\n }\n },\n\n onSortChange: function () {\n if (this.tableView.elementSelect) {\n this.tableView.elementSelect.resetItemOrder();\n }\n\n this._positionChanged = true;\n this.base();\n },\n\n onPositionChange: function () {\n Garnish.requestAnimationFrame(() => {\n this.trigger('positionChange');\n this.settings.onPositionChange();\n });\n },\n\n onReturnHelpersToDraggees: function () {\n this._$firstRowCells.css('width', '');\n\n // If we were dragging the last elements on the page and ended up loading any additional elements in,\n // there could be a gap between the last draggee item and whatever now comes after it.\n // So remove the post-draggee elements and possibly load up the next batch.\n if (this.draggingLastElements && this.tableView.getMorePending()) {\n // Update the element index's record of how many items are actually visible\n this.tableView._totalVisible +=\n this.newDraggeeIndexes[0] - this.oldDraggeeIndexes[0];\n\n var $postDraggeeItems = this.$draggee.last().nextAll();\n\n if ($postDraggeeItems.length) {\n this.removeItems($postDraggeeItems);\n $postDraggeeItems.remove();\n this.tableView.maybeLoadMore();\n }\n }\n\n this.base();\n },\n\n /**\n * Returns the min and max levels that the draggee could occupy between\n * two given rows, or false if it’s not going to work out.\n */\n _getLevelBounds: function ($prevRow, $nextRow) {\n // Can't go any lower than the next row, if there is one\n if ($nextRow && $nextRow.length) {\n this._getLevelBounds._minLevel = $nextRow.data('level');\n } else {\n this._getLevelBounds._minLevel = 1;\n }\n\n // Can't go any higher than the previous row + 1\n if ($prevRow && $prevRow.length) {\n this._getLevelBounds._maxLevel = $prevRow.data('level') + 1;\n } else {\n this._getLevelBounds._maxLevel = 1;\n }\n\n // Does this structure have a max level?\n if (this.maxLevels) {\n // Make sure it's going to fit at all here\n if (\n this._getLevelBounds._minLevel != 1 &&\n this._getLevelBounds._minLevel + this._draggeeLevelDelta >\n this.maxLevels\n ) {\n return false;\n }\n\n // Limit the max level if we have to\n if (\n this._getLevelBounds._maxLevel + this._draggeeLevelDelta >\n this.maxLevels\n ) {\n this._getLevelBounds._maxLevel =\n this.maxLevels - this._draggeeLevelDelta;\n\n if (this._getLevelBounds._maxLevel < this._getLevelBounds._minLevel) {\n this._getLevelBounds._maxLevel = this._getLevelBounds._minLevel;\n }\n }\n }\n\n return {\n min: this._getLevelBounds._minLevel,\n max: this._getLevelBounds._maxLevel,\n };\n },\n\n /**\n * Determines the min and max possible levels at the current draggee's position.\n */\n _setTargetLevelBounds: function () {\n this._targetLevelBounds = this._getLevelBounds(\n this.$draggee.first().prev(),\n this.$draggee.last().next()\n );\n },\n\n /**\n * Determines the target level based on the current mouse position.\n */\n _updateIndent: function (forcePositionChange) {\n // Figure out the target level\n // ---------------------------------------------------------------------\n\n // How far has the cursor moved?\n this._updateIndent._mouseDist = this.realMouseX - this.mousedownX;\n\n // Flip that if this is RTL\n if (Craft.orientation === 'rtl') {\n this._updateIndent._mouseDist *= -1;\n }\n\n // What is that in indentation levels?\n this._updateIndent._indentationDist = Math.round(\n this._updateIndent._mouseDist / Craft.StructureTableSorter.LEVEL_INDENT\n );\n\n // Combine with the original level to get the new target level\n this._updateIndent._targetLevel =\n this._draggeeLevel + this._updateIndent._indentationDist;\n\n // Contain it within our min/max levels\n if (this._updateIndent._targetLevel < this._targetLevelBounds.min) {\n this._updateIndent._indentationDist +=\n this._targetLevelBounds.min - this._updateIndent._targetLevel;\n this._updateIndent._targetLevel = this._targetLevelBounds.min;\n } else if (\n this._updateIndent._targetLevel > this._targetLevelBounds.max\n ) {\n this._updateIndent._indentationDist -=\n this._updateIndent._targetLevel - this._targetLevelBounds.max;\n this._updateIndent._targetLevel = this._targetLevelBounds.max;\n }\n\n // Has the target level changed?\n if (\n this._targetLevel !==\n (this._targetLevel = this._updateIndent._targetLevel)\n ) {\n // Target level is changing, so update the ancestors\n this._updateAncestorsBeforeRepaint();\n }\n\n // Update the UI\n // ---------------------------------------------------------------------\n\n // How far away is the cursor from the exact target level distance?\n this._updateIndent._targetLevelMouseDiff =\n this._updateIndent._mouseDist -\n this._updateIndent._indentationDist *\n Craft.StructureTableSorter.LEVEL_INDENT;\n\n // What's the magnet impact of that?\n this._updateIndent._magnetImpact = Math.round(\n this._updateIndent._targetLevelMouseDiff / 15\n );\n\n // Put it on a leash\n if (\n Math.abs(this._updateIndent._magnetImpact) >\n Craft.StructureTableSorter.MAX_GIVE\n ) {\n this._updateIndent._magnetImpact =\n (this._updateIndent._magnetImpact > 0 ? 1 : -1) *\n Craft.StructureTableSorter.MAX_GIVE;\n }\n\n // Apply the new margin/width\n this._updateIndent._closestLevelMagnetIndent =\n this._getLevelIndent(this._targetLevel) +\n this._updateIndent._magnetImpact;\n this.helpers[0].css(\n 'margin-' + Craft.left,\n this._updateIndent._closestLevelMagnetIndent + this._helperMargin\n );\n this._$titleHelperCell.css(\n 'width',\n this._titleHelperCellOuterWidth -\n this._updateIndent._closestLevelMagnetIndent\n );\n },\n\n /**\n * Returns the indent size for a given level\n */\n _getLevelIndent: function (level) {\n return (level - 1) * Craft.StructureTableSorter.LEVEL_INDENT;\n },\n\n /**\n * Returns the base data that should be sent with StructureController Ajax requests.\n */\n _getAjaxBaseData: function ($row) {\n return {\n structureId: this.structureId,\n elementId: $row.data('id'),\n siteId: $row.find('.element:first').data('site-id'),\n };\n },\n\n /**\n * Returns a row's ancestor rows\n */\n _getAncestors: function ($row, targetLevel) {\n this._getAncestors._ancestors = [];\n\n if (targetLevel != 0) {\n this._getAncestors._level = targetLevel;\n this._getAncestors._$prevRow = $row.prev();\n\n while (this._getAncestors._$prevRow.length) {\n if (\n this._getAncestors._$prevRow.data('level') <\n this._getAncestors._level\n ) {\n this._getAncestors._ancestors.unshift(this._getAncestors._$prevRow);\n this._getAncestors._level =\n this._getAncestors._$prevRow.data('level');\n\n // Did we just reach the top?\n if (this._getAncestors._level == 0) {\n break;\n }\n }\n\n this._getAncestors._$prevRow = this._getAncestors._$prevRow.prev();\n }\n }\n\n return this._getAncestors._ancestors;\n },\n\n /**\n * Prepares to have the ancestors updated before the screen is repainted.\n */\n _updateAncestorsBeforeRepaint: function () {\n if (this._updateAncestorsFrame) {\n Garnish.cancelAnimationFrame(this._updateAncestorsFrame);\n }\n\n this._updateAncestorsFrame = Garnish.requestAnimationFrame(\n this._updateAncestors.bind(this)\n );\n },\n\n _updateAncestors: function () {\n this._updateAncestorsFrame = null;\n\n // Update the old ancestors\n // -----------------------------------------------------------------\n\n for (\n this._updateAncestors._i = 0;\n this._updateAncestors._i < this._ancestors.length;\n this._updateAncestors._i++\n ) {\n this._updateAncestors._$ancestor =\n this._ancestors[this._updateAncestors._i];\n\n // One less descendant now\n this._updateAncestors._$ancestor.data(\n 'descendants',\n this._updateAncestors._$ancestor.data('descendants') - 1\n );\n\n // Is it now childless?\n if (this._updateAncestors._$ancestor.data('descendants') == 0) {\n // Remove its toggle\n this._updateAncestors._$ancestor\n .find('> th > .toggle:first')\n .remove();\n }\n }\n\n // Update the new ancestors\n // -----------------------------------------------------------------\n\n this._updateAncestors._newAncestors = this._getAncestors(\n this.$targetItem,\n this._targetLevel\n );\n\n for (\n this._updateAncestors._i = 0;\n this._updateAncestors._i < this._updateAncestors._newAncestors.length;\n this._updateAncestors._i++\n ) {\n this._updateAncestors._$ancestor =\n this._updateAncestors._newAncestors[this._updateAncestors._i];\n\n // One more descendant now\n this._updateAncestors._$ancestor.data(\n 'descendants',\n this._updateAncestors._$ancestor.data('descendants') + 1\n );\n\n // Is this its first child?\n if (this._updateAncestors._$ancestor.data('descendants') == 1) {\n // Create its toggle\n const ancestorTitle = this._updateAncestors._$ancestor.data('title');\n $(\n '<button class=\"toggle expanded\" type=\"button\" aria-expanded=\"true\" title=\"' +\n Craft.t('app', 'Show/hide children') +\n '\" aria-label=\"' +\n Craft.t('app', 'Show {title} children', {title: ancestorTitle}) +\n '\"></button>'\n ).insertAfter(\n this._updateAncestors._$ancestor.find('> th .move:first')\n );\n }\n }\n\n this._ancestors = this._updateAncestors._newAncestors;\n\n delete this._updateAncestors._i;\n delete this._updateAncestors._$ancestor;\n delete this._updateAncestors._newAncestors;\n },\n },\n {\n HELPER_MARGIN: 0,\n LEVEL_INDENT: 44,\n MAX_GIVE: 22,\n\n defaults: {\n onPositionChange: $.noop,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Table Element Index View\n */\nCraft.TableElementIndexView = Craft.BaseElementIndexView.extend({\n $table: null,\n $tableCaption: null,\n $selectedSortHeader: null,\n $statusMessage: null,\n\n structureTableSort: null,\n\n _totalVisiblePostStructureTableDraggee: null,\n _morePendingPostStructureTableDraggee: false,\n\n _broadcastListener: null,\n\n getElementContainer: function () {\n // Save a reference to the table\n this.$table = this.$container.find('table:first');\n return this.$table.children('tbody:first');\n },\n\n afterInit: function () {\n // Set table caption\n this.$tableCaption = this.$table.find('caption');\n\n this.$statusMessage = this.$table.parent().find('[data-status-message]');\n\n // Set the sort header\n this.initTableHeaders();\n\n // Add callback for after elements are updated\n this.elementIndex.on('updateElements', () => {\n this._updateScreenReaderStatus();\n });\n\n // Create the Structure Table Sorter\n if (\n this.elementIndex.settings.context === 'index' &&\n this.elementIndex.getSelectedSortAttribute() === 'structure' &&\n Garnish.hasAttr(this.$table, 'data-structure-id')\n ) {\n this.structureTableSort = new Craft.StructureTableSorter(\n this,\n this.getAllElements()\n );\n } else {\n this.structureTableSort = null;\n }\n\n // Handle expand/collapse toggles for Structures\n if (this.elementIndex.getSelectedSortAttribute() === 'structure') {\n this.addListener(this.$elementContainer, 'click', function (ev) {\n var $target = $(ev.target);\n\n if ($target.hasClass('toggle')) {\n if (this._collapseElement($target) === false) {\n this._expandElement($target);\n }\n }\n });\n }\n\n // Set up the broadcast listener\n if (Craft.messageReceiver) {\n this._broadcastListener = (ev) => {\n if (ev.data.event === 'saveElement') {\n const $rows = this.$table.find(\n `> tbody > tr[data-id=\"${ev.data.id}\"]`\n );\n if ($rows.length) {\n const data = {\n elementType: this.elementIndex.elementType,\n source: this.elementIndex.sourceKey,\n id: ev.data.id,\n siteId: this.elementIndex.siteId,\n };\n Craft.sendActionRequest(\n 'POST',\n 'element-indexes/element-table-html',\n {data}\n ).then(({data}) => {\n for (let i = 0; i < $rows.length; i++) {\n const $row = $rows.eq(i);\n $row\n .find('> th[data-titlecell] .element')\n .replaceWith(data.elementHtml);\n for (let attribute in data.attributeHtml) {\n if (data.attributeHtml.hasOwnProperty(attribute)) {\n $row\n .find(`> td[data-attr=\"${attribute}\"]`)\n .html(data.attributeHtml[attribute]);\n }\n }\n }\n new Craft.ElementThumbLoader().load($rows);\n });\n }\n }\n };\n\n Craft.messageReceiver.addEventListener(\n 'message',\n this._broadcastListener\n );\n }\n },\n\n initTableHeaders: function () {\n const [selectedSortAttr] = this.elementIndex.getSortAttributeAndDirection();\n const $tableHeaders = this.$table\n .children('thead')\n .children()\n .children('[data-attribute]');\n\n for (let i = 0; i < $tableHeaders.length; i++) {\n const $header = $tableHeaders.eq(i);\n const attr = $header.attr('data-attribute');\n let sortValue = 'none';\n\n // Is this the selected sort attribute?\n if (attr === selectedSortAttr) {\n this.$selectedSortHeader = $header;\n const selectedSortDir = this.elementIndex.getSelectedSortDirection();\n sortValue = selectedSortDir === 'asc' ? 'ascending' : 'descending';\n $header.addClass('ordered ' + selectedSortDir);\n this.makeColumnSortable($header, true);\n } else {\n // Is this attribute sortable?\n if (this.elementIndex.getSortOption(attr)) {\n this.makeColumnSortable($header);\n }\n }\n\n $header.attr('aria-sort', sortValue);\n }\n },\n\n makeColumnSortable: function ($header, sorted = false) {\n $header.addClass('orderable');\n\n const headerHtml = $header.html();\n const $instructions = this.$tableCaption.find('[data-sort-instructions]');\n const $headerButton = $('<button/>', {\n id: `${this.elementIndex.idPrefix}-${$header.attr('data-attribute')}`,\n type: 'button',\n 'aria-pressed': 'false',\n }).html(headerHtml);\n\n if ($instructions.length) {\n $headerButton.attr('aria-describedby', $instructions.attr('id'));\n }\n\n if (sorted) {\n $headerButton.attr('aria-pressed', 'true');\n $headerButton.on('click', this._handleSelectedSortHeaderClick.bind(this));\n } else {\n $headerButton.on(\n 'click',\n this._handleUnselectedSortHeaderClick.bind(this)\n );\n }\n\n $header.empty().append($headerButton);\n },\n\n isVerticalList: function () {\n return true;\n },\n\n getTotalVisible: function () {\n if (this._isStructureTableDraggingLastElements()) {\n return this._totalVisiblePostStructureTableDraggee;\n } else {\n return this._totalVisible;\n }\n },\n\n setTotalVisible: function (totalVisible) {\n if (this._isStructureTableDraggingLastElements()) {\n this._totalVisiblePostStructureTableDraggee = totalVisible;\n } else {\n this._totalVisible = totalVisible;\n }\n },\n\n getMorePending: function () {\n if (this._isStructureTableDraggingLastElements()) {\n return this._morePendingPostStructureTableDraggee;\n } else {\n return this._morePending;\n }\n },\n\n setMorePending: function (morePending) {\n if (this._isStructureTableDraggingLastElements()) {\n this._morePendingPostStructureTableDraggee = morePending;\n } else {\n this._morePending = this._morePendingPostStructureTableDraggee =\n morePending;\n }\n },\n\n getLoadMoreParams: function () {\n var params = this.base();\n\n // If we are dragging the last elements on the page,\n // tell the controller to only load elements positioned after the draggee.\n if (this._isStructureTableDraggingLastElements()) {\n params.criteria.positionedAfter =\n this.structureTableSort.$targetItem.data('id');\n }\n\n return params;\n },\n\n appendElements: function ($newElements) {\n this.base($newElements);\n\n if (this.structureTableSort) {\n this.structureTableSort.addItems($newElements);\n }\n\n Craft.cp.updateResponsiveTables();\n },\n\n _collapseElement: function ($toggle, force) {\n if (!force && !$toggle.hasClass('expanded')) {\n return false;\n }\n\n $toggle.removeClass('expanded');\n $toggle.attr('aria-expanded', 'false');\n\n // Find and remove the descendant rows\n var $row = $toggle.parent().parent(),\n id = $row.data('id'),\n level = $row.data('level'),\n $nextRow = $row.next();\n\n while ($nextRow.length) {\n if (!Garnish.hasAttr($nextRow, 'data-spinnerrow')) {\n if ($nextRow.data('level') <= level) {\n break;\n }\n\n if (this.elementSelect) {\n this.elementSelect.removeItems($nextRow);\n }\n\n if (this.structureTableSort) {\n this.structureTableSort.removeItems($nextRow);\n }\n\n this._totalVisible--;\n }\n\n var $nextNextRow = $nextRow.next();\n $nextRow.remove();\n $nextRow = $nextNextRow;\n }\n\n // Remember that this row should be collapsed\n if (!this.elementIndex.instanceState.collapsedElementIds) {\n this.elementIndex.instanceState.collapsedElementIds = [];\n }\n\n this.elementIndex.instanceState.collapsedElementIds.push(id);\n this.elementIndex.setInstanceState(\n 'collapsedElementIds',\n this.elementIndex.instanceState.collapsedElementIds\n );\n\n // Bottom of the index might be viewable now\n this.maybeLoadMore();\n },\n\n _expandElement: function ($toggle, force) {\n if (!force && $toggle.hasClass('expanded')) {\n return false;\n }\n\n $toggle.addClass('expanded');\n $toggle.attr('aria-expanded', 'true');\n\n // Remove this element from our list of collapsed elements\n if (this.elementIndex.instanceState.collapsedElementIds) {\n var $row = $toggle.parent().parent(),\n id = $row.data('id'),\n index = $.inArray(\n id,\n this.elementIndex.instanceState.collapsedElementIds\n );\n\n if (index !== -1) {\n this.elementIndex.instanceState.collapsedElementIds.splice(index, 1);\n this.elementIndex.setInstanceState(\n 'collapsedElementIds',\n this.elementIndex.instanceState.collapsedElementIds\n );\n\n // Add a temporary row\n var $spinnerRow = this._createSpinnerRowAfter($row);\n\n // Load the nested elements\n let data = $.extend(true, {}, this.settings.params);\n data.criteria.descendantOf = id;\n\n Craft.sendActionRequest('POST', this.settings.loadMoreElementsAction, {\n data,\n })\n .then((response) => {\n // Do we even care about this anymore?\n if (!$spinnerRow.parent().length) {\n return;\n }\n\n let $newElements = $(response.data.html);\n\n // Are there more descendants we didn't get in this batch?\n let totalVisible = this._totalVisible + $newElements.length;\n let morePending =\n this.settings.batchSize &&\n $newElements.length === this.settings.batchSize;\n\n if (morePending) {\n // Remove all the elements after it\n let $nextRows = $spinnerRow.nextAll();\n\n if (this.elementSelect) {\n this.elementSelect.removeItems($nextRows);\n }\n\n if (this.structureTableSort) {\n this.structureTableSort.removeItems($nextRows);\n }\n\n $nextRows.remove();\n totalVisible -= $nextRows.length;\n } else {\n // Maintain the current 'more' status\n morePending = this._morePending;\n }\n\n $spinnerRow.replaceWith($newElements);\n this.thumbLoader.load($newElements);\n\n if (this.elementIndex.actions || this.settings.selectable) {\n this.elementSelect.addItems(\n $newElements.filter(':not(.disabled)')\n );\n this.elementIndex.updateActionTriggers();\n }\n\n if (this.structureTableSort) {\n this.structureTableSort.addItems($newElements);\n }\n\n Craft.appendHeadHtml(response.data.headHtml);\n Craft.appendBodyHtml(response.data.bodyHtml);\n Craft.cp.updateResponsiveTables();\n\n this.setTotalVisible(totalVisible);\n this.setMorePending(morePending);\n\n // Is there room to load more right now?\n this.maybeLoadMore();\n })\n .catch((e) => {\n Craft.cp.displayError();\n if (!$spinnerRow.parent().length) {\n return;\n }\n });\n }\n }\n },\n\n _createSpinnerRowAfter: function ($row) {\n return $(\n '<tr data-spinnerrow>' +\n '<td class=\"centeralign\" colspan=\"' +\n $row.children().length +\n '\">' +\n '<div class=\"spinner\"/>' +\n '</td>' +\n '</tr>'\n ).insertAfter($row);\n },\n\n _isStructureTableDraggingLastElements: function () {\n return (\n this.structureTableSort &&\n this.structureTableSort.dragging &&\n this.structureTableSort.draggingLastElements\n );\n },\n\n _handleSelectedSortHeaderClick: function (ev) {\n var $header = $(ev.currentTarget).closest('th');\n\n if ($header.hasClass('loading')) {\n return;\n }\n\n // Reverse the sort direction\n var selectedSortDir = this.elementIndex.getSelectedSortDirection(),\n newSortDir = selectedSortDir === 'asc' ? 'desc' : 'asc';\n\n this.elementIndex.setSelectedSortDirection(newSortDir);\n this._handleSortHeaderClick(ev, $header);\n },\n\n _handleUnselectedSortHeaderClick: function (ev) {\n var $header = $(ev.currentTarget).closest('th');\n\n if ($header.hasClass('loading')) {\n return;\n }\n\n var attr = $header.attr('data-attribute');\n\n this.elementIndex.setSelectedSortAttribute(attr);\n this._handleSortHeaderClick(ev, $header);\n },\n\n _handleSortHeaderClick: function (ev, $header) {\n if (this.$selectedSortHeader) {\n this.$selectedSortHeader.removeClass('ordered asc desc');\n }\n\n $header.addClass('ordered loading');\n this.elementIndex.updateElements();\n\n // No need for two spinners\n this.elementIndex.setIndexAvailable();\n },\n\n _updateScreenReaderStatus: function () {\n const attribute = this.elementIndex.getSelectedSortAttribute();\n const direction =\n this.elementIndex.getSelectedSortDirection() === 'asc'\n ? Craft.t('app', 'Ascending')\n : Craft.t('app', 'Descending');\n const label = this.elementIndex.getSortLabel(attribute);\n\n if (!attribute && !direction && !label) return;\n\n const message = Craft.t(\n 'app',\n 'Table {name} sorted by {attribute}, {direction}',\n {\n name: this.$table.attr('data-name'),\n attribute: label,\n direction: direction,\n }\n );\n\n this.$statusMessage.empty();\n this.$statusMessage.text(message);\n },\n\n _updateTableAttributes: function ($element, tableAttributes) {\n var $tr = $element.closest('tr');\n\n for (var attr in tableAttributes) {\n if (!tableAttributes.hasOwnProperty(attr)) {\n continue;\n }\n\n $tr\n .children('[data-attr=\"' + attr + '\"]:first')\n .html(tableAttributes[attr]);\n }\n },\n\n destroy: function () {\n if (this._broadcastListener) {\n Craft.messageReceiver.removeEventListener(\n 'message',\n this._broadcastListener\n );\n delete this._broadcastListener;\n }\n\n this.base();\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Tab manager\n */\nCraft.Tabs = Garnish.Base.extend({\n $container: null,\n $tablist: null,\n $menuBtn: null,\n $tabs: null,\n $firstTab: null,\n $lastTab: null,\n $selectedTab: null,\n $focusableTab: null,\n menu: null,\n\n init: function (container) {\n this.$container = $(container);\n this.$tablist = this.$container.find('> [role=\"tablist\"]:first');\n this.$tabs = this.$tablist.find('> [role=\"tab\"]');\n this.$firstTab = this.$tabs.first();\n this.$lastTab = this.$tabs.last();\n this.$selectedTab = this.$tabs.filter('.sel:first');\n this.$focusableTab = this.$tabs.filter('[tabindex=0]:first');\n this.$menuBtn = this.$container.find('> .menubtn:first').menubtn();\n this.menu = this.$menuBtn.data('menubtn').menu;\n\n // Is there already a tab manager?\n if (this.$container.data('tabs')) {\n console.warn('Double-instantiating a tab manager on an element');\n this.$container.data('tabs').destroy();\n }\n\n this.$container.data('tabs', this);\n\n for (let i = 0; i < this.$tabs.length; i++) {\n const $a = this.$tabs.eq(i);\n\n // Does it link to an anchor?\n const href = $a.attr('href');\n if (href && href.charAt(0) === '#') {\n this.addListener($a, 'keydown', (ev) => {\n if ([Garnish.SPACE_KEY, Garnish.RETURN_KEY].includes(ev.keyCode)) {\n ev.preventDefault();\n this.selectTab(ev.currentTarget);\n }\n });\n this.addListener($a, 'click', (ev) => {\n ev.preventDefault();\n this.selectTab(ev.currentTarget);\n });\n }\n\n this.addListener($a, 'keydown', (ev) => {\n let $tab;\n if (\n [Garnish.LEFT_KEY, Garnish.RIGHT_KEY].includes(ev.keyCode) &&\n $.contains(this.$tablist[0], ev.currentTarget)\n ) {\n if (\n ev.keyCode ===\n (Craft.orientation === 'ltr' ? Garnish.LEFT_KEY : Garnish.RIGHT_KEY)\n ) {\n $tab = $(ev.currentTarget).prevAll(\n '[role=\"tab\"]:not(.hidden):first'\n );\n $tab = $tab.length ? $tab : this.$lastTab;\n } else {\n $tab = $(ev.currentTarget).nextAll(\n '[role=\"tab\"]:not(.hidden):first'\n );\n $tab = $tab.length ? $tab : this.$firstTab;\n }\n } else if (\n ev.keyCode === Garnish.HOME_KEY ||\n ev.keyCode === Garnish.END_KEY\n ) {\n $tab =\n ev.keyCode === Garnish.HOME_KEY ? this.$firstTab : this.$lastTab;\n }\n\n if ($tab) {\n ev.preventDefault();\n this.makeTabFocusable($tab);\n $tab.focus();\n this.scrollToTab($tab);\n }\n });\n }\n\n this.updateMenuBtn();\n\n Garnish.$win.on('resize', () => {\n this.updateMenuBtn();\n });\n\n // Prevent menu options from updating the URL\n this.menu.$options.on('click', (ev) => {\n const $option = $(ev.currentTarget);\n const href = $option.attr('href');\n if (href && href.charAt(0) === '#') {\n ev.preventDefault();\n }\n });\n\n this.menu.on('optionselect', (ev) => {\n this.selectTab($(ev.selectedOption).data('id'));\n });\n },\n\n selectTab: function (tab) {\n const $tab = this._getTab(tab);\n\n if ($tab[0] === this.$selectedTab[0]) {\n return;\n }\n\n this.deselectTab();\n this.$selectedTab = $tab.addClass('sel').attr('aria-selected', 'true');\n this.makeTabFocusable($tab);\n $tab.focus();\n this.scrollToTab($tab);\n\n this.menu.$options.removeClass('sel');\n this.menu.$options.filter(`[data-id=\"${$tab.data('id')}\"]`).addClass('sel');\n\n this.trigger('selectTab', {\n $tab: $tab,\n });\n\n $('#content').trigger('scroll');\n },\n\n deselectTab: function () {\n const $tab = this.$selectedTab\n .removeClass('sel')\n .attr('aria-selected', 'false');\n this.$selectedTab = null;\n\n this.trigger('deselectTab', {\n $tab: $tab,\n });\n },\n\n makeTabFocusable: function (tab) {\n const $tab = this._getTab(tab);\n\n if ($tab[0] === this.$focusableTab[0]) {\n return;\n }\n\n this.$focusableTab.attr('tabindex', '-1');\n this.$focusableTab = $tab.attr('tabindex', '0');\n },\n\n scrollToTab: function (tab) {\n const $tab = this._getTab(tab);\n const scrollLeft = this.$tablist.scrollLeft();\n const tabOffset = $tab.offset().left;\n const elemScrollOffset = tabOffset - this.$tablist.offset().left;\n let targetScrollLeft = false;\n\n // Is the tab hidden on the left?\n if (elemScrollOffset < 0) {\n targetScrollLeft = scrollLeft + elemScrollOffset - 24;\n } else {\n const tabWidth = $tab.outerWidth();\n const ulWidth = this.$tablist.prop('clientWidth');\n\n // Is it hidden to the right?\n if (elemScrollOffset + tabWidth > ulWidth) {\n targetScrollLeft =\n scrollLeft + (elemScrollOffset - (ulWidth - tabWidth)) + 24;\n }\n }\n\n if (targetScrollLeft !== false) {\n this.$tablist.scrollLeft(targetScrollLeft);\n }\n },\n\n updateMenuBtn: function () {\n if (\n Math.floor(this.$tablist.prop('scrollWidth') - 48) >\n this.$container.prop('clientWidth')\n ) {\n this.$tablist.addClass('scrollable');\n this.$menuBtn.removeClass('hidden');\n } else {\n this.$tablist.removeClass('scrollable');\n this.$menuBtn.addClass('hidden');\n }\n },\n\n _getTab: function (tab) {\n if (tab instanceof jQuery) {\n return tab;\n }\n\n if (tab instanceof HTMLElement) {\n return $(tab);\n }\n\n if (typeof tab !== 'string') {\n throw 'Invalid tab ID';\n }\n\n const $tab = this.$tabs.filter(`[data-id=\"${tab}\"]`);\n\n if (!$tab.length) {\n throw `Invalid tab ID: ${tab}`;\n }\n\n return $tab;\n },\n\n destroy: function () {\n this.$container.removeData('tabs');\n this.base();\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Tag select input\n */\nCraft.TagSelectInput = Craft.BaseElementSelectInput.extend(\n {\n searchTimeout: null,\n searchMenu: null,\n\n $container: null,\n $elementsContainer: null,\n $elements: null,\n $addTagInput: null,\n $spinner: null,\n\n _ignoreBlur: false,\n\n init: function (settings) {\n // Normalize the settings\n // ---------------------------------------------------------------------\n\n // Are they still passing in a bunch of arguments?\n if (!$.isPlainObject(settings)) {\n // Loop through all of the old arguments and apply them to the settings\n var normalizedSettings = {},\n args = ['id', 'name', 'tagGroupId', 'sourceElementId'];\n\n for (var i = 0; i < args.length; i++) {\n if (typeof arguments[i] !== 'undefined') {\n normalizedSettings[args[i]] = arguments[i];\n } else {\n break;\n }\n }\n\n settings = normalizedSettings;\n }\n\n this.base($.extend({}, Craft.TagSelectInput.defaults, settings));\n\n this.$addTagInput = this.$container.children('.add').children('.text');\n this.$spinner = this.$addTagInput.next();\n\n this.addListener(this.$addTagInput, 'input', () => {\n if (this.searchTimeout) {\n clearTimeout(this.searchTimeout);\n }\n\n this.searchTimeout = setTimeout(this.searchForTags.bind(this), 500);\n });\n\n this.addListener(this.$addTagInput, 'keydown', function (ev) {\n if (ev.keyCode === Garnish.RETURN_KEY) {\n ev.preventDefault();\n }\n\n let $option;\n\n switch (ev.keyCode) {\n case Garnish.RETURN_KEY: {\n ev.preventDefault();\n if (this.searchMenu) {\n this.selectTag(this.searchMenu.$options.filter('.hover'));\n }\n return;\n }\n\n case Garnish.DOWN_KEY: {\n ev.preventDefault();\n if (this.searchMenu) {\n let $hoverOption = this.searchMenu.$options.filter('.hover');\n if ($hoverOption.length) {\n let $nextOption = $hoverOption\n .parent()\n .nextAll()\n .find('a:not(.disabled)')\n .first();\n if ($nextOption.length) {\n this.focusOption($nextOption);\n }\n } else {\n this.focusOption(this.searchMenu.$options.eq(0));\n }\n }\n return;\n }\n\n case Garnish.UP_KEY: {\n ev.preventDefault();\n if (this.searchMenu) {\n let $hoverOption = this.searchMenu.$options.filter('.hover');\n if ($hoverOption.length) {\n let $prevOption = $hoverOption\n .parent()\n .prevAll()\n .find('a:not(.disabled)')\n .last();\n if ($prevOption.length) {\n this.focusOption($prevOption);\n }\n } else {\n this.focusOption(\n this.searchMenu.$options.eq(\n this.searchMenu.$options.length - 1\n )\n );\n }\n }\n return;\n }\n }\n });\n\n this.addListener(this.$addTagInput, 'focus', function () {\n if (this.searchMenu) {\n this.searchMenu.show();\n }\n });\n\n this.addListener(this.$addTagInput, 'blur', function () {\n if (this._ignoreBlur) {\n this._ignoreBlur = false;\n return;\n }\n\n setTimeout(() => {\n if (this.searchMenu) {\n this.searchMenu.hide();\n }\n }, 1);\n });\n },\n\n focusOption: function ($option) {\n this.searchMenu.$options.removeClass('hover');\n $option.addClass('hover');\n this.searchMenu.$menuList.attr(\n 'aria-activedescendant',\n $option.attr('id')\n );\n },\n\n // No \"add\" button\n getAddElementsBtn: $.noop,\n\n getElementSortAxis: function () {\n return null;\n },\n\n searchForTags: function () {\n if (this.searchMenu) {\n this.killSearchMenu();\n }\n\n var val = this.$addTagInput.val();\n\n if (val) {\n this.$spinner.removeClass('hidden');\n\n var excludeIds = [];\n\n for (var i = 0; i < this.$elements.length; i++) {\n var id = $(this.$elements[i]).data('id');\n\n if (id) {\n excludeIds.push(id);\n }\n }\n\n if (this.settings.sourceElementId) {\n excludeIds.push(this.settings.sourceElementId);\n }\n\n var data = {\n search: this.$addTagInput.val(),\n tagGroupId: this.settings.tagGroupId,\n excludeIds: excludeIds,\n };\n\n Craft.sendActionRequest('POST', 'tags/search-for-tags', {data})\n .then((response) => {\n if (this.searchMenu) {\n this.killSearchMenu();\n }\n this.$spinner.addClass('hidden');\n var $menu = $('<div class=\"menu tagmenu\"/>').appendTo(Garnish.$bod),\n $ul = $('<ul/>').appendTo($menu);\n\n var $li;\n\n for (var i = 0; i < response.data.tags.length; i++) {\n $li = $('<li/>').appendTo($ul);\n\n $('<a data-icon=\"tag\"/>')\n .appendTo($li)\n .text(response.data.tags[i].title)\n .data('id', response.data.tags[i].id)\n .addClass(response.data.tags[i].exclude ? 'disabled' : '');\n }\n\n if (!response.data.exactMatch) {\n $li = $('<li/>').appendTo($ul);\n $('<a data-icon=\"plus\"/>').appendTo($li).text(data.search);\n }\n\n $ul.find('a:not(.disabled):first').addClass('hover');\n\n this.searchMenu = new Garnish.Menu($menu, {\n attachToElement: this.$addTagInput,\n onOptionSelect: this.selectTag.bind(this),\n });\n\n this.addListener($menu, 'mousedown', () => {\n this._ignoreBlur = true;\n });\n\n this.searchMenu.show();\n })\n .catch(({response}) => {\n // Just in case\n if (this.searchMenu) {\n this.killSearchMenu();\n }\n\n this.$spinner.addClass('hidden');\n });\n } else {\n this.$spinner.addClass('hidden');\n }\n },\n\n selectTag: function (option) {\n var $option = $(option);\n\n if ($option.hasClass('disabled')) {\n return;\n }\n\n var id = $option.data('id');\n var title = $option.text();\n\n var $element = $('<div/>', {\n class: 'element small removable',\n 'data-id': id,\n 'data-site-id': this.settings.targetSiteId,\n 'data-label': title,\n 'data-editable': '1',\n }).appendTo(this.$elementsContainer);\n\n var $input = $('<input/>', {\n type: 'hidden',\n name: this.settings.name + '[]',\n value: id,\n }).appendTo($element);\n\n $('<button/>', {\n class: 'delete icon',\n title: Craft.t('app', 'Remove'),\n type: 'button',\n 'aria-label': Craft.t('app', 'Remove {label}', {\n label: title,\n }),\n }).appendTo($element);\n\n var $titleContainer = $('<div/>', {\n class: 'label',\n }).appendTo($element);\n\n $('<span/>', {\n class: 'title',\n text: title,\n }).appendTo($titleContainer);\n\n var margin = -($element.outerWidth() + 10);\n this.$addTagInput.css('margin-' + Craft.left, margin + 'px');\n\n var animateCss = {};\n animateCss['margin-' + Craft.left] = 0;\n this.$addTagInput.velocity(animateCss, 'fast');\n\n this.$elements = this.$elements.add($element);\n\n this.addElements($element);\n\n this.killSearchMenu();\n this.$addTagInput.val('');\n this.$addTagInput.trigger('focus');\n\n if (!id) {\n // We need to create the tag first\n $element.addClass('loading disabled');\n\n var data = {\n groupId: this.settings.tagGroupId,\n title: title,\n };\n\n Craft.sendActionRequest('POST', 'tags/create-tag', {data})\n .then((response) => {\n $element.attr('data-id', response.data.id);\n $input.val(response.data.id);\n\n $element.removeClass('loading disabled');\n })\n .catch(({response}) => {\n this.removeElement($element);\n Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n });\n }\n },\n\n killSearchMenu: function () {\n this.searchMenu.hide();\n this.searchMenu.destroy();\n this.searchMenu = null;\n },\n },\n {\n defaults: {\n tagGroupId: null,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Thumb Element Index View\n */\nCraft.ThumbsElementIndexView = Craft.BaseElementIndexView.extend({\n getElementContainer: function () {\n return this.$container.children('ul');\n },\n});\n","/** global: Craft */\n/** global: Garnish */\nCraft.ui = {\n createButton: function (config) {\n const $btn = $('<button/>', {\n type: config.type || 'button',\n class: 'btn',\n });\n if (config.id) {\n $btn.attr('id', config.id);\n }\n if (config.class) {\n $btn.addClass(config.class);\n }\n if (config.ariaLabel) {\n $btn.attr('aria-label', config.ariaLabel);\n }\n if (config.role) {\n $btn.attr('role', config.role);\n }\n if (config.html) {\n $btn.html(config.html);\n } else if (config.label) {\n $btn.append($('<div class=\"label\"/>').text(config.label));\n } else {\n $btn.addClass('btn-empty');\n }\n if (config.toggle) {\n $btn.attr('aria-expanded', 'false');\n }\n if (config.controls) {\n $btn.attr('aria-controls', config.controls);\n }\n if (config.spinner) {\n $btn.append($('<div class=\"spinner spinner-absolute\"/>'));\n }\n return $btn;\n },\n\n createSubmitButton: function (config) {\n const $btn = this.createButton(\n Object.assign({}, config, {\n type: 'submit',\n label: config.label || Craft.t('app', 'Submit'),\n })\n );\n $btn.addClass('submit');\n return $btn;\n },\n\n createTextInput: function (config) {\n config = $.extend(\n {\n autocomplete: false,\n },\n config\n );\n var $input = $('<input/>', {\n attr: {\n class: 'text',\n type: config.type || 'text',\n inputmode: config.inputmode,\n id: config.id,\n size: config.size,\n name: config.name,\n value: config.value,\n maxlength: config.maxlength,\n autofocus: this.getAutofocusValue(config.autofocus),\n autocomplete:\n typeof config.autocomplete === 'boolean'\n ? config.autocomplete\n ? 'on'\n : 'off'\n : config.autocomplete,\n disabled: this.getDisabledValue(config.disabled),\n readonly: config.readonly,\n title: config.title,\n placeholder: config.placeholder,\n step: config.step,\n min: config.min,\n max: config.max,\n },\n });\n\n if (config.class) {\n $input.addClass(config.class);\n }\n if (config.placeholder) {\n $input.addClass('nicetext');\n }\n if (config.type === 'password') {\n $input.addClass('password');\n }\n if (config.disabled) {\n $input.addClass('disabled');\n }\n if (!config.size) {\n $input.addClass('fullwidth');\n }\n\n if (config.showCharsLeft && config.maxlength) {\n $input\n .attr('data-show-chars-left')\n .css(\n 'padding-' + (Craft.orientation === 'ltr' ? 'right' : 'left'),\n 7.2 * config.maxlength.toString().length + 14 + 'px'\n );\n }\n\n if (config.placeholder || config.showCharsLeft) {\n new Garnish.NiceText($input);\n }\n\n if (config.type === 'password') {\n return $('<div class=\"passwordwrapper\"/>').append($input);\n } else {\n return $input;\n }\n },\n\n createTextField: function (config) {\n if (!config.id) {\n config.id = 'text' + Math.floor(Math.random() * 1000000000);\n }\n return this.createField(this.createTextInput(config), config);\n },\n\n createCopyTextInput: function (config) {\n let id = config.id || 'copytext' + Math.floor(Math.random() * 1000000000);\n let buttonId = config.buttonId || `${id}-btn`;\n\n let $container = $('<div/>', {\n class: 'copytext',\n });\n\n let $input = this.createTextInput(\n $.extend({}, config, {\n readonly: true,\n })\n ).appendTo($container);\n\n let $btn = $('<button/>', {\n type: 'button',\n id: buttonId,\n class: 'btn',\n 'data-icon': 'clipboard',\n title: Craft.t('app', 'Copy to clipboard'),\n 'aria-label': Craft.t('app', 'Copy to clipboard'),\n }).appendTo($container);\n\n $btn.on('click', () => {\n $input[0].select();\n document.execCommand('copy');\n Craft.cp.displayNotice(Craft.t('app', 'Copied to clipboard.'));\n $container.trigger('copy');\n $input[0].setSelectionRange(0, 0);\n });\n\n return $container;\n },\n\n createCopyTextBtn: function (config) {\n let id = config.id || 'copytext' + Math.floor(Math.random() * 1000000000);\n let value = config.value;\n\n let $btn = $('<div/>', {\n id,\n class: 'copytextbtn',\n role: 'button',\n title: Craft.t('app', 'Copy to clipboard'),\n 'aria-label': Craft.t('app', 'Copy to clipboard'),\n tabindex: '0',\n });\n\n if (config.class) {\n $btn.addClass(config.class);\n }\n\n let $input = $('<input/>', {\n value,\n readonly: true,\n size: value.length,\n tabindex: '-1',\n }).appendTo($btn);\n\n let $icon = $('<span/>', {\n 'data-icon': 'clipboard',\n 'aria-hidden': 'true',\n }).appendTo($btn);\n\n const copyValue = function () {\n $input[0].select();\n document.execCommand('copy');\n Craft.cp.displayNotice(Craft.t('app', 'Copied to clipboard.'));\n $btn.trigger('copy');\n $input[0].setSelectionRange(0, 0);\n $btn.focus();\n };\n\n $btn.on('click', () => {\n copyValue();\n });\n\n $btn.on('keydown', (ev) => {\n if (ev.keyCode === Garnish.SPACE_KEY) {\n copyValue();\n ev.preventDefault();\n }\n });\n\n return $btn;\n },\n\n createCopyTextField: function (config) {\n if (!config.id) {\n config.id = 'copytext' + Math.floor(Math.random() * 1000000000);\n }\n return this.createField(this.createCopyTextInput(config), config);\n },\n\n createCopyTextPrompt: function (config) {\n let $container = $('<div/>', {\n class: 'modal fitted',\n });\n let $body = $('<div/>', {\n class: 'body',\n }).appendTo($container);\n this.createCopyTextField(\n $.extend(\n {\n size: Math.max(Math.min(config.value.length, 50), 25),\n },\n config\n )\n ).appendTo($body);\n\n const $label = $body.find('label');\n\n // Provide accessible name for modal dialog\n if ($label.length > 0 && $label.attr('id')) {\n $container.attr('aria-labelledby', $label.attr('id'));\n }\n\n let modal = new Garnish.Modal($container, {\n closeOtherModals: false,\n });\n $container.on('copy', () => {\n modal.hide();\n });\n return $container;\n },\n\n createTextarea: function (config) {\n var $textarea = $('<textarea/>', {\n class: 'text',\n rows: config.rows || 2,\n cols: config.cols || 50,\n id: config.id,\n name: config.name,\n maxlength: config.maxlength,\n autofocus: config.autofocus && !Garnish.isMobileBrowser(true),\n disabled: !!config.disabled,\n placeholder: config.placeholder,\n html: config.value,\n });\n\n if (config.showCharsLeft) {\n $textarea.attr('data-show-chars-left', '');\n }\n\n if (config.class) {\n $textarea.addClass(config.class);\n }\n\n if (!config.size) {\n $textarea.addClass('fullwidth');\n }\n\n return $textarea;\n },\n\n createTextareaField: function (config) {\n if (!config.id) {\n config.id = 'textarea' + Math.floor(Math.random() * 1000000000);\n }\n return this.createField(this.createTextarea(config), config);\n },\n\n createSelect: function (config) {\n var $container = $('<div/>', {\n class: 'select',\n });\n\n if (config.class) {\n $container.addClass(config.class);\n }\n\n var $select = $('<select/>', {\n id: config.id,\n name: config.name,\n autofocus: config.autofocus && Garnish.isMobileBrowser(true),\n disabled: config.disabled,\n 'data-target-prefix': config.targetPrefix,\n 'aria-labelledby': config.labelledBy,\n }).appendTo($container);\n\n // Normalize the options into an array\n if ($.isPlainObject(config.options)) {\n let options = [];\n for (var key in config.options) {\n if (!config.options.hasOwnProperty(key)) {\n continue;\n }\n let option = config.options[key];\n if ($.isPlainObject(option)) {\n if (typeof option.optgroup !== 'undefined') {\n options.push(option);\n } else {\n options.push({\n label: option.label,\n value: typeof option.value !== 'undefined' ? option.value : key,\n disabled:\n typeof option.disabled !== 'undefined'\n ? option.disabled\n : false,\n });\n }\n } else {\n options.push({\n label: option,\n value: key,\n });\n }\n }\n config.options = options;\n }\n\n var $optgroup = null;\n\n for (let i = 0; i < config.options.length; i++) {\n let option = config.options[i];\n\n // Starting a new <optgroup>?\n if (typeof option.optgroup !== 'undefined') {\n $optgroup = $('<optgroup/>', {\n label: option.label,\n }).appendTo($select);\n } else {\n $('<option/>', {\n value: option.value,\n selected: option.value == config.value,\n disabled:\n typeof option.disabled !== 'undefined' ? option.disabled : false,\n html: option.label,\n }).appendTo($optgroup || $select);\n }\n }\n\n if (config.toggle) {\n $select.addClass('fieldtoggle');\n new Craft.FieldToggle($select);\n }\n\n return $container;\n },\n\n createSelectField: function (config) {\n if (!config.id) {\n config.id = 'select' + Math.floor(Math.random() * 1000000000);\n }\n return this.createField(this.createSelect(config), config);\n },\n\n createCheckbox: function (config) {\n var id = config.id || 'checkbox' + Math.floor(Math.random() * 1000000000);\n\n var $input = $('<input/>', {\n type: 'checkbox',\n value: typeof config.value !== 'undefined' ? config.value : '1',\n id: id,\n class: 'checkbox',\n name: config.name,\n checked: config.checked ? 'checked' : null,\n autofocus: this.getAutofocusValue(config.autofocus),\n disabled: this.getDisabledValue(config.disabled),\n 'data-target': config.toggle,\n 'data-reverse-target': config.reverseToggle,\n });\n\n if (config.class) {\n $input.addClass(config.class);\n }\n\n if (config.toggle || config.reverseToggle) {\n $input.addClass('fieldtoggle');\n new Craft.FieldToggle($input);\n }\n\n var $label = $('<label/>', {\n for: id,\n html: config.label,\n });\n\n // Should we include a hidden input first?\n if (\n config.name &&\n (config.name.length < 3 || config.name.slice(-2) !== '[]')\n ) {\n return $([\n $('<input/>', {\n type: 'hidden',\n name: config.name,\n value: '',\n })[0],\n $input[0],\n $label[0],\n ]);\n } else {\n return $([$input[0], $label[0]]);\n }\n },\n\n createCheckboxField: function (config) {\n if (!config.id) {\n config.id = 'checkbox' + Math.floor(Math.random() * 1000000000);\n }\n\n var $field = $('<div class=\"field checkboxfield\"/>', {\n id: `${config.id}-field`,\n });\n\n if (config.first) {\n $field.addClass('first');\n }\n if (config.instructions) {\n $field.addClass('has-instructions');\n }\n\n this.createCheckbox(config).appendTo($field);\n\n if (config.instructions) {\n $('<div class=\"instructions\"/>')\n .text(config.instructions)\n .appendTo($field);\n }\n\n return $field;\n },\n\n createCheckboxSelect: function (config) {\n var $container = $('<fieldset class=\"checkbox-select\"/>');\n\n if (config.class) {\n $container.addClass(config.class);\n }\n\n var allValue, allChecked;\n\n if (config.showAllOption) {\n allValue = config.allValue || '*';\n allChecked = config.values == allValue;\n\n // Create the \"All\" checkbox\n $('<div/>')\n .appendTo($container)\n .append(\n this.createCheckbox({\n id: config.id,\n class: 'all',\n label: '<b>' + (config.allLabel || Craft.t('app', 'All')) + '</b>',\n name: config.name,\n value: allValue,\n checked: allChecked,\n autofocus: config.autofocus,\n })\n );\n } else {\n allChecked = false;\n }\n\n // Create the actual options\n for (var i = 0; i < config.options.length; i++) {\n var option = config.options[i];\n\n if (option.value == allValue) {\n continue;\n }\n\n $('<div/>')\n .appendTo($container)\n .append(\n this.createCheckbox({\n label: option.label,\n name: config.name ? config.name + '[]' : null,\n value: option.value,\n checked: allChecked || (config.values || []).includes(option.value),\n disabled: allChecked,\n })\n );\n }\n\n new Garnish.CheckboxSelect($container);\n\n return $container;\n },\n\n createCheckboxSelectField: function (config) {\n config.fieldset = true;\n if (!config.id) {\n config.id = 'checkboxselect' + Math.floor(Math.random() * 1000000000);\n }\n return this.createField(this.createCheckboxSelect(config), config);\n },\n\n createLightswitch: function (config) {\n var value = config.value || '1';\n var indeterminateValue = config.indeterminateValue || '-';\n\n var $container = $('<button/>', {\n type: 'button',\n class: 'lightswitch',\n 'data-value': value,\n 'data-indeterminate-value': indeterminateValue,\n id: config.id,\n role: 'switch',\n 'aria-checked': config.on\n ? 'true'\n : config.indeterminate\n ? 'mixed'\n : 'false',\n 'aria-labelledby': config.labelId,\n 'data-target': config.toggle,\n 'data-reverse-target': config.reverseToggle,\n });\n\n if (config.on) {\n $container.addClass('on');\n } else if (config.indeterminate) {\n $container.addClass('indeterminate');\n }\n\n if (config.small) {\n $container.addClass('small');\n }\n\n if (config.disabled) {\n $container.addClass('disabled');\n }\n\n $(\n '<div class=\"lightswitch-container\">' +\n '<div class=\"handle\"></div>' +\n '</div>'\n ).appendTo($container);\n\n if (config.name) {\n $('<input/>', {\n type: 'hidden',\n name: config.name,\n value: config.on\n ? value\n : config.indeterminate\n ? indeterminateValue\n : '',\n disabled: config.disabled,\n }).appendTo($container);\n }\n\n if (config.toggle || config.reverseToggle) {\n $container.addClass('fieldtoggle');\n new Craft.FieldToggle($container);\n }\n\n new Craft.LightSwitch($container, {\n onChange: config.onChange || $.noop,\n });\n\n return $container;\n },\n\n createLightswitchField: function (config) {\n if (!config.id) {\n config.id = 'lightswitch' + Math.floor(Math.random() * 1000000000);\n }\n if (!config.labelId) {\n config.labelId = `${config.id}-label`;\n }\n return this.createField(this.createLightswitch(config), config).addClass(\n 'lightswitch-field'\n );\n },\n\n createColorInput: function (config) {\n const id = config.id || 'color' + Math.floor(Math.random() * 1000000000);\n const containerId = config.containerId || id + '-container';\n const name = config.name || null;\n const value = config.value || null;\n const small = config.small || false;\n const autofocus = config.autofocus && Garnish.isMobileBrowser(true);\n const disabled = config.disabled || false;\n\n const $container = $('<div/>', {\n id: containerId,\n class: 'flex color-container',\n });\n\n const $colorPreviewContainer = $('<div/>', {\n class: 'color static' + (small ? ' small' : ''),\n }).appendTo($container);\n\n const $colorPreview = $('<div/>', {\n class: 'color-preview',\n style: config.value ? {backgroundColor: config.value} : null,\n }).appendTo($colorPreviewContainer);\n\n const $inputContainer = $('<div/>', {\n class: 'color-input-container',\n })\n .append(\n $('<div/>', {\n class: 'color-hex-indicator light code',\n 'aria-hidden': 'true',\n text: '#',\n })\n )\n .appendTo($container);\n\n const $input = this.createTextInput({\n id: id,\n name: name,\n value: Craft.ltrim(value, '#'),\n size: 10,\n class: 'color-input',\n autofocus: autofocus,\n disabled: disabled,\n 'aria-label': Craft.t('app', 'Color hex value'),\n }).appendTo($inputContainer);\n\n new Craft.ColorInput($container);\n return $container;\n },\n\n createColorField: function (config) {\n config.fieldset = true;\n o;\n if (!config.id) {\n config.id = 'color' + Math.floor(Math.random() * 1000000000);\n }\n return this.createField(this.createColorInput(config), config);\n },\n\n createDateInput: function (config) {\n const isMobile = Garnish.isMobileBrowser();\n const id =\n (config.id || 'date' + Math.floor(Math.random() * 1000000000)) + '-date';\n const name = config.name || null;\n const inputName = name ? name + '[date]' : null;\n const value =\n config.value && typeof config.value.getMonth === 'function'\n ? config.value\n : null;\n const autofocus = config.autofocus && Garnish.isMobileBrowser(true);\n const disabled = config.disabled || false;\n\n const $container = $('<div/>', {\n class: 'datewrapper',\n });\n\n const $input = this.createTextInput({\n id: id,\n type: isMobile ? 'date' : 'text',\n class: isMobile && !value ? 'empty-value' : false,\n name: inputName,\n value: value\n ? isMobile\n ? value.toISOString().split('T')[0]\n : Craft.formatDate(value)\n : '',\n placeholder: ' ',\n autocomplete: false,\n autofocus: autofocus,\n disabled: disabled,\n }).appendTo($container);\n\n $('<div data-icon=\"date\"></div>').appendTo($container);\n\n if (name) {\n $('<input/>', {\n type: 'hidden',\n name: name + '[timezone]',\n val: Craft.timezone,\n }).appendTo($container);\n }\n\n if (isMobile) {\n $input.datetimeinput();\n } else {\n $input.datepicker(\n $.extend(\n {\n defaultDate: value || new Date(),\n },\n Craft.datepickerOptions\n )\n );\n }\n\n if (config.hasOuterContainer) {\n return $container;\n }\n\n return $('<div class=\"datetimewrapper\"/>').append($container).datetime();\n },\n\n createDateField: function (config) {\n if (!config.id) {\n config.id = 'date' + Math.floor(Math.random() * 1000000000);\n }\n return this.createField(this.createDateInput(config), config);\n },\n\n createDateRangePicker: function (config) {\n var now = new Date();\n var today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n config = $.extend(\n {\n class: '',\n options: [\n 'today',\n 'thisWeek',\n 'thisMonth',\n 'thisYear',\n 'past7Days',\n 'past30Days',\n 'past90Days',\n 'pastYear',\n ],\n onChange: $.noop,\n selected: null,\n startDate: null,\n endDate: null,\n },\n config\n );\n\n var $menu = $('<div/>', {class: 'menu'});\n var $ul = $('<ul/>', {class: 'padded'}).appendTo($menu);\n var $allOption = $('<a/>')\n .addClass('sel')\n .text(Craft.t('app', 'All'))\n .data('handle', 'all');\n\n $('<li/>').append($allOption).appendTo($ul);\n\n var option;\n var selectedOption;\n for (var i = 0; i < config.options.length; i++) {\n var handle = config.options[i];\n switch (handle) {\n case 'today':\n option = {\n label: Craft.t('app', 'Today'),\n startDate: today,\n endDate: today,\n };\n break;\n case 'thisWeek':\n var firstDayOffset = now.getDay() - Craft.datepickerOptions.firstDay;\n if (firstDayOffset < 0) {\n firstDayOffset += 7;\n }\n option = {\n label: Craft.t('app', 'This week'),\n startDate: new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate() - firstDayOffset\n ),\n endDate: today,\n };\n break;\n case 'thisMonth':\n option = {\n label: Craft.t('app', 'This month'),\n startDate: new Date(now.getFullYear(), now.getMonth()),\n endDate: today,\n };\n break;\n case 'thisYear':\n option = {\n label: Craft.t('app', 'This year'),\n startDate: new Date(now.getFullYear(), 0),\n endDate: today,\n };\n break;\n case 'past7Days':\n option = {\n label: Craft.t('app', 'Past {num} days', {num: 7}),\n startDate: new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate() - 7\n ),\n endDate: today,\n };\n break;\n case 'past30Days':\n option = {\n label: Craft.t('app', 'Past {num} days', {num: 30}),\n startDate: new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate() - 30\n ),\n endDate: today,\n };\n break;\n case 'past90Days':\n option = {\n label: Craft.t('app', 'Past {num} days', {num: 90}),\n startDate: new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate() - 90\n ),\n endDate: today,\n };\n break;\n case 'pastYear':\n option = {\n label: Craft.t('app', 'Past year'),\n startDate: new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate() - 365\n ),\n endDate: today,\n };\n break;\n }\n\n var $li = $('<li/>');\n var $a = $('<a/>', {text: option.label})\n .data('handle', handle)\n .data('startDate', option.startDate)\n .data('endDate', option.endDate)\n .data('startTime', option.startDate ? option.startDate.getTime() : null)\n .data('endTime', option.endDate ? option.endDate.getTime() : null);\n\n if (config.selected && handle == config.selected) {\n selectedOption = $a[0];\n }\n\n $li.append($a);\n $li.appendTo($ul);\n }\n\n $('<hr/>').appendTo($menu);\n\n var $flex = $('<div/>', {class: 'flex flex-nowrap padded'}).appendTo($menu);\n var $startDate = this.createDateField({label: Craft.t('app', 'From')})\n .appendTo($flex)\n .find('input');\n var $endDate = this.createDateField({label: Craft.t('app', 'To')})\n .appendTo($flex)\n .find('input');\n\n // prevent ESC keypresses in the date inputs from closing the menu\n var $dateInputs = $startDate.add($endDate);\n $dateInputs.on('keyup', function (ev) {\n if (\n ev.keyCode === Garnish.ESC_KEY &&\n $(this).data('datepicker') &&\n $(this).data('datepicker').dpDiv.is(':visible')\n ) {\n ev.stopPropagation();\n }\n });\n\n // prevent clicks in the datepicker divs from closing the menu\n if ($startDate.data('datepicker')) {\n $startDate.data('datepicker').dpDiv.on('mousedown', function (ev) {\n ev.stopPropagation();\n });\n }\n if ($endDate.data('datepicker')) {\n $endDate.data('datepicker').dpDiv.on('mousedown', function (ev) {\n ev.stopPropagation();\n });\n }\n\n var menu = new Garnish.Menu($menu, {\n onOptionSelect: function (option) {\n var $option = $(option);\n $btn.text($option.text());\n menu.setPositionRelativeToAnchor();\n $menu.find('.sel').removeClass('sel');\n $option.addClass('sel');\n\n // Update the start/end dates\n $startDate.datepicker('setDate', $option.data('startDate'));\n $endDate.datepicker('setDate', $option.data('endDate'));\n\n config.onChange(\n $option.data('startDate') || null,\n $option.data('endDate') || null,\n $option.data('handle')\n );\n },\n });\n\n $dateInputs.on('change', function () {\n // Do the start & end dates match one of our options?\n let startDate = $startDate.datepicker('getDate');\n let endDate = $endDate.datepicker('getDate');\n let startTime = startDate ? startDate.getTime() : null;\n let endTime = endDate ? endDate.getTime() : null;\n\n let $options = $ul.find('a');\n let $option;\n let foundOption = false;\n\n for (let i = 0; i < $options.length; i++) {\n $option = $options.eq(i);\n if (\n startTime === ($option.data('startTime') || null) &&\n endTime === ($option.data('endTime') || null)\n ) {\n menu.selectOption($option[0]);\n foundOption = true;\n config.onChange(null, null, $option.data('handle'));\n break;\n }\n }\n\n if (!foundOption) {\n $menu.find('.sel').removeClass('sel');\n $flex.addClass('sel');\n\n if (!startTime && !endTime) {\n $btn.text(Craft.t('app', 'All'));\n } else if (startTime && endTime) {\n $btn.text($startDate.val() + ' - ' + $endDate.val());\n } else if (startTime) {\n $btn.text(Craft.t('app', 'From {date}', {date: $startDate.val()}));\n } else {\n $btn.text(Craft.t('app', 'To {date}', {date: $endDate.val()}));\n }\n menu.setPositionRelativeToAnchor();\n\n config.onChange(startDate, endDate, 'custom');\n }\n });\n\n menu.on('hide', function () {\n $startDate.datepicker('hide');\n $endDate.datepicker('hide');\n });\n\n let btnClasses = 'btn menubtn';\n if (config.class) {\n btnClasses = btnClasses + ' ' + config.class;\n }\n\n let $btn = $('<button/>', {\n type: 'button',\n class: btnClasses,\n 'data-icon': 'date',\n text: Craft.t('app', 'All'),\n });\n\n new Garnish.MenuBtn($btn, menu);\n\n if (selectedOption) {\n menu.selectOption(selectedOption);\n }\n\n if (config.startDate) {\n $startDate.datepicker('setDate', config.startDate);\n }\n\n if (config.endDate) {\n $endDate.datepicker('setDate', config.endDate);\n }\n\n if (config.startDate || config.endDate) {\n $dateInputs.trigger('change');\n }\n\n return $btn;\n },\n\n createTimeInput: function (config) {\n const isMobile = Garnish.isMobileBrowser();\n const id =\n (config.id || 'time' + Math.floor(Math.random() * 1000000000)) + '-time';\n const name = config.name || null;\n const inputName = name ? name + '[time]' : null;\n const value =\n config.value && typeof config.value.getMonth === 'function'\n ? config.value\n : null;\n const autofocus = config.autofocus && Garnish.isMobileBrowser(true);\n const disabled = config.disabled || false;\n\n const $container = $('<div/>', {\n class: 'timewrapper',\n });\n\n const $input = this.createTextInput({\n id: id,\n type: isMobile ? 'time' : 'text',\n class: isMobile && !value ? 'empty-value' : false,\n name: inputName,\n placeholder: ' ',\n autocomplete: false,\n autofocus: autofocus,\n disabled: disabled,\n }).appendTo($container);\n\n $('<div data-icon=\"time\"></div>').appendTo($container);\n\n if (name) {\n $('<input/>', {\n type: 'hidden',\n name: name + '[timezone]',\n val: Craft.timezone,\n }).appendTo($container);\n }\n\n if (isMobile) {\n if (value) {\n $input.val(value.toISOString().split('T')[1]);\n }\n $input.datetimeinput();\n } else {\n $input.timepicker(Craft.timepickerOptions);\n if (value) {\n $input.timepicker(\n 'setTime',\n value.getHours() * 3600 + value.getMinutes() * 60 + value.getSeconds()\n );\n }\n }\n\n if (config.hasOuterContainer) {\n return $container;\n }\n\n return $('<div class=\"datetimewrapper\"/>').append($container).datetime();\n },\n\n createTimeField: function (config) {\n if (!config.id) {\n config.id = 'time' + Math.floor(Math.random() * 1000000000);\n }\n return this.createField(this.createTimeInput(config), config);\n },\n\n createField: function (input, config) {\n const label =\n config.label && config.label !== '__blank__' ? config.label : null;\n\n const $field = $(config.fieldset ? '<fieldset/>' : '<div/>', {\n class: 'field',\n id: config.fieldId || (config.id ? config.id + '-field' : null),\n });\n\n if (config.first) {\n $field.addClass('first');\n }\n\n if (config.fieldClass) {\n $field.addClass(config.fieldClass);\n }\n\n if (label && config.fieldset) {\n $('<legend/>', {\n text: label,\n class: 'visually-hidden',\n 'data-label': label,\n }).appendTo($field);\n }\n\n if (label) {\n const $heading = $('<div class=\"heading\"/>').appendTo($field);\n\n $(config.fieldset ? '<legend/>' : '<label/>', {\n id:\n config.labelId ||\n (config.id\n ? `${config.id}-${config.fieldset ? 'legend' : 'label'}`\n : null),\n class: config.required ? 'required' : null,\n for: (!config.fieldset && config.id) || null,\n text: label,\n }).appendTo($heading);\n }\n\n if (config.instructions) {\n $('<div class=\"instructions\"/>')\n .text(config.instructions)\n .appendTo($field);\n }\n\n $('<div class=\"input\"/>').append(input).appendTo($field);\n\n if (config.tip) {\n const $tip = $('<p class=\"notice has-icon\"/>');\n $('<span class=\"icon\" aria-hidden=\"true\"/>').appendTo($tip);\n $('<span class=\"visually-hidden\"/>')\n .text(Craft.t('app', 'Tip') + ': ')\n .appendTo($tip);\n $('<span/>').text(config.tip).appendTo($tip);\n $tip.appendTo($field);\n }\n\n if (config.warning) {\n const $warning = $('<p class=\"warning has-icon\"/>');\n $('<span class=\"icon\" aria-hidden=\"true\"/>').appendTo($warning);\n $('<span class=\"visually-hidden\"/>')\n .text(Craft.t('app', 'Warning') + ': ')\n .appendTo($warning);\n $('<span/>').text(config.warning).appendTo($warning);\n $warning.appendTo($field);\n }\n\n if (config.errors) {\n this.addErrorsToField($field, config.errors);\n }\n\n return $field;\n },\n\n createErrorList: function (errors) {\n var $list = $('<ul class=\"errors\"/>');\n\n if (errors) {\n this.addErrorsToList($list, errors);\n }\n\n return $list;\n },\n\n addErrorsToList: function ($list, errors) {\n for (var i = 0; i < errors.length; i++) {\n $('<li/>').text(errors[i]).appendTo($list);\n }\n },\n\n addErrorsToField: function ($field, errors) {\n if (!errors) {\n return;\n }\n\n $field.addClass('has-errors');\n $field.children('.input').addClass('errors');\n\n var $errors = $field.children('ul.errors');\n\n if (!$errors.length) {\n $errors = this.createErrorList().appendTo($field);\n }\n\n this.addErrorsToList($errors, errors);\n },\n\n clearErrorsFromField: function ($field) {\n $field.removeClass('has-errors');\n $field.children('.input').removeClass('errors');\n $field.children('ul.errors').remove();\n },\n\n getAutofocusValue: function (autofocus) {\n return autofocus && !Garnish.isMobileBrowser(true) ? 'autofocus' : null;\n },\n\n getDisabledValue: function (disabled) {\n return disabled ? 'disabled' : null;\n },\n};\n","/** global: Craft */\n/** global: Garnish */\n/**\n * File Manager.\n */\nCraft.Uploader = Garnish.Base.extend(\n {\n uploader: null,\n allowedKinds: null,\n $element: null,\n settings: null,\n _rejectedFiles: {},\n _extensionList: null,\n _totalFileCounter: 0,\n _validFileCounter: 0,\n\n init: function ($element, settings) {\n this._rejectedFiles = {size: [], type: [], limit: []};\n this.$element = $element;\n this.allowedKinds = null;\n this._extensionList = null;\n this._totalFileCounter = 0;\n this._validFileCounter = 0;\n\n settings = $.extend({}, Craft.Uploader.defaults, settings);\n\n var events = settings.events;\n delete settings.events;\n\n if (settings.allowedKinds && settings.allowedKinds.length) {\n if (typeof settings.allowedKinds === 'string') {\n settings.allowedKinds = [settings.allowedKinds];\n }\n\n this.allowedKinds = settings.allowedKinds;\n delete settings.allowedKinds;\n }\n\n settings.autoUpload = false;\n\n this.uploader = this.$element.fileupload(settings);\n for (var event in events) {\n if (!events.hasOwnProperty(event)) {\n continue;\n }\n\n this.uploader.on(event, events[event]);\n }\n\n this.settings = settings;\n\n this.uploader.on('fileuploadadd', this.onFileAdd.bind(this));\n },\n\n /**\n * Set uploader parameters.\n */\n setParams: function (paramObject) {\n // If CSRF protection isn't enabled, these won't be defined.\n if (\n typeof Craft.csrfTokenName !== 'undefined' &&\n typeof Craft.csrfTokenValue !== 'undefined'\n ) {\n // Add the CSRF token\n paramObject[Craft.csrfTokenName] = Craft.csrfTokenValue;\n }\n\n this.uploader.fileupload('option', {formData: paramObject});\n },\n\n /**\n * Get the number of uploads in progress.\n */\n getInProgress: function () {\n return this.uploader.fileupload('active');\n },\n\n /**\n * Return true, if this is the last upload.\n */\n isLastUpload: function () {\n // Processing the last file or not processing at all.\n return this.getInProgress() < 2;\n },\n\n /**\n * Called on file add.\n */\n onFileAdd: function (e, data) {\n e.stopPropagation();\n\n var validateExtension = false;\n\n if (this.allowedKinds) {\n if (!this._extensionList) {\n this._createExtensionList();\n }\n\n validateExtension = true;\n }\n\n // Make sure that file API is there before relying on it\n data.process().done(() => {\n var file = data.files[0];\n var pass = true;\n if (validateExtension) {\n var matches = file.name.match(/\\.([a-z0-4_]+)$/i);\n var fileExtension = matches[1];\n if (\n $.inArray(fileExtension.toLowerCase(), this._extensionList) === -1\n ) {\n pass = false;\n this._rejectedFiles.type.push('“' + file.name + '”');\n }\n }\n\n if (file.size > this.settings.maxFileSize) {\n this._rejectedFiles.size.push('“' + file.name + '”');\n pass = false;\n }\n\n // If the validation has passed for this file up to now, check if we're not hitting any limits\n if (\n pass &&\n typeof this.settings.canAddMoreFiles === 'function' &&\n !this.settings.canAddMoreFiles(this._validFileCounter)\n ) {\n this._rejectedFiles.limit.push('“' + file.name + '”');\n pass = false;\n }\n\n if (pass) {\n this._validFileCounter++;\n data.submit();\n }\n\n if (++this._totalFileCounter === data.originalFiles.length) {\n this._totalFileCounter = 0;\n this._validFileCounter = 0;\n this.processErrorMessages();\n }\n });\n\n return true;\n },\n\n /**\n * Process error messages.\n */\n processErrorMessages: function () {\n var str;\n\n if (this._rejectedFiles.type.length) {\n if (this._rejectedFiles.type.length === 1) {\n str =\n 'The file {files} could not be uploaded. The allowed file kinds are: {kinds}.';\n } else {\n str =\n 'The files {files} could not be uploaded. The allowed file kinds are: {kinds}.';\n }\n\n str = Craft.t('app', str, {\n files: this._rejectedFiles.type.join(', '),\n kinds: this.allowedKinds.join(', '),\n });\n this._rejectedFiles.type = [];\n alert(str);\n }\n\n if (this._rejectedFiles.size.length) {\n if (this._rejectedFiles.size.length === 1) {\n str =\n 'The file {files} could not be uploaded, because it exceeds the maximum upload size of {size}.';\n } else {\n str =\n 'The files {files} could not be uploaded, because they exceeded the maximum upload size of {size}.';\n }\n\n str = Craft.t('app', str, {\n files: this._rejectedFiles.size.join(', '),\n size: this.humanFileSize(Craft.maxUploadSize),\n });\n this._rejectedFiles.size = [];\n alert(str);\n }\n\n if (this._rejectedFiles.limit.length) {\n if (this._rejectedFiles.limit.length === 1) {\n str =\n 'The file {files} could not be uploaded, because the field limit has been reached.';\n } else {\n str =\n 'The files {files} could not be uploaded, because the field limit has been reached.';\n }\n\n str = Craft.t('app', str, {\n files: this._rejectedFiles.limit.join(', '),\n });\n this._rejectedFiles.limit = [];\n alert(str);\n }\n },\n\n humanFileSize: function (bytes) {\n var threshold = 1024;\n\n if (bytes < threshold) {\n return bytes + ' B';\n }\n\n var units = ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\n var u = -1;\n\n do {\n bytes = bytes / threshold;\n ++u;\n } while (bytes >= threshold);\n\n return bytes.toFixed(1) + ' ' + units[u];\n },\n\n _createExtensionList: function () {\n this._extensionList = [];\n\n for (var i = 0; i < this.allowedKinds.length; i++) {\n var allowedKind = this.allowedKinds[i];\n\n if (typeof Craft.fileKinds[allowedKind] !== 'undefined') {\n for (\n var j = 0;\n j < Craft.fileKinds[allowedKind].extensions.length;\n j++\n ) {\n var ext = Craft.fileKinds[allowedKind].extensions[j];\n this._extensionList.push(ext);\n }\n }\n }\n },\n\n destroy: function () {\n this.$element.fileupload('destroy');\n this.base();\n },\n },\n {\n defaults: {\n dropZone: null,\n pasteZone: null,\n fileInput: null,\n sequentialUploads: true,\n maxFileSize: Craft.maxUploadSize,\n allowedKinds: null,\n events: {},\n canAddMoreFiles: null,\n headers: {Accept: 'application/json;q=0.9,*/*;q=0.8'},\n paramName: 'assets-upload',\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Handle Generator\n */\nCraft.UriFormatGenerator = Craft.BaseInputGenerator.extend({\n generateTargetValue: function (sourceVal) {\n // Remove HTML tags\n sourceVal = sourceVal.replace('/<(.*?)>/g', '');\n\n // Make it lowercase\n sourceVal = sourceVal.toLowerCase();\n\n // Convert extended ASCII characters to basic ASCII\n sourceVal = Craft.asciiString(sourceVal);\n\n // Handle must start with a letter and end with a letter/number\n sourceVal = sourceVal.replace(/^[^a-z]+/, '');\n sourceVal = sourceVal.replace(/[^a-z0-9]+$/, '');\n\n // Get the \"words\"\n var words = Craft.filterArray(sourceVal.split(/[^a-z0-9]+/));\n\n var uriFormat = words.join(Craft.slugWordSeparator);\n\n if (uriFormat && this.settings.suffix) {\n uriFormat += this.settings.suffix;\n }\n\n return uriFormat;\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * User index class\n */\nCraft.UserIndex = Craft.BaseElementIndex.extend({\n init: function (elementType, $container, settings) {\n this.on('selectSource', this.updateUrl.bind(this));\n this.base(elementType, $container, settings);\n },\n\n getDefaultSourceKey: function () {\n // Did they request a specific group in the URL?\n if (\n this.settings.context === 'index' &&\n typeof defaultSourceSlug !== 'undefined'\n ) {\n for (let i = 0; i < this.$sources.length; i++) {\n const $source = $(this.$sources[i]);\n if ($source.data('slug') === defaultSourceSlug) {\n return $source.data('key');\n }\n }\n }\n\n return this.base();\n },\n\n updateUrl: function () {\n if (this.settings.context === 'index') {\n let uri = 'users';\n const slug = this.$source.data('slug');\n if (slug) {\n uri += `/${slug}`;\n }\n Craft.setPath(uri);\n }\n },\n});\n\n// Register it!\nCraft.registerElementIndexClass('craft\\\\elements\\\\User', Craft.UserIndex);\n","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ruleSet[1].rules[3].use[1]!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[3]!../../../../../../node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[4]!./charts.scss\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"3790022a\", content, true, {});","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ruleSet[1].rules[3].use[1]!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[3]!../../../../../../node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[4]!./craft.scss\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"80058a3c\", content, true, {});","/**\n * Translates the list format produced by css-loader into something\n * easier to manipulate.\n */\nexport default function listToStyles (parentId, list) {\n var styles = []\n var newStyles = {}\n for (var i = 0; i < list.length; i++) {\n var item = list[i]\n var id = item[0]\n var css = item[1]\n var media = item[2]\n var sourceMap = item[3]\n var part = {\n id: parentId + ':' + i,\n css: css,\n media: media,\n sourceMap: sourceMap\n }\n if (!newStyles[id]) {\n styles.push(newStyles[id] = { id: id, parts: [part] })\n } else {\n newStyles[id].parts.push(part)\n }\n }\n return styles\n}\n","/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n Modified by Evan You @yyx990803\n*/\n\nimport listToStyles from './listToStyles'\n\nvar hasDocument = typeof document !== 'undefined'\n\nif (typeof DEBUG !== 'undefined' && DEBUG) {\n if (!hasDocument) {\n throw new Error(\n 'vue-style-loader cannot be used in a non-browser environment. ' +\n \"Use { target: 'node' } in your Webpack config to indicate a server-rendering environment.\"\n ) }\n}\n\n/*\ntype StyleObject = {\n id: number;\n parts: Array<StyleObjectPart>\n}\n\ntype StyleObjectPart = {\n css: string;\n media: string;\n sourceMap: ?string\n}\n*/\n\nvar stylesInDom = {/*\n [id: number]: {\n id: number,\n refs: number,\n parts: Array<(obj?: StyleObjectPart) => void>\n }\n*/}\n\nvar head = hasDocument && (document.head || document.getElementsByTagName('head')[0])\nvar singletonElement = null\nvar singletonCounter = 0\nvar isProduction = false\nvar noop = function () {}\nvar options = null\nvar ssrIdKey = 'data-vue-ssr-id'\n\n// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n// tags it will allow on a page\nvar isOldIE = typeof navigator !== 'undefined' && /msie [6-9]\\b/.test(navigator.userAgent.toLowerCase())\n\nexport default function addStylesClient (parentId, list, _isProduction, _options) {\n isProduction = _isProduction\n\n options = _options || {}\n\n var styles = listToStyles(parentId, list)\n addStylesToDom(styles)\n\n return function update (newList) {\n var mayRemove = []\n for (var i = 0; i < styles.length; i++) {\n var item = styles[i]\n var domStyle = stylesInDom[item.id]\n domStyle.refs--\n mayRemove.push(domStyle)\n }\n if (newList) {\n styles = listToStyles(parentId, newList)\n addStylesToDom(styles)\n } else {\n styles = []\n }\n for (var i = 0; i < mayRemove.length; i++) {\n var domStyle = mayRemove[i]\n if (domStyle.refs === 0) {\n for (var j = 0; j < domStyle.parts.length; j++) {\n domStyle.parts[j]()\n }\n delete stylesInDom[domStyle.id]\n }\n }\n }\n}\n\nfunction addStylesToDom (styles /* Array<StyleObject> */) {\n for (var i = 0; i < styles.length; i++) {\n var item = styles[i]\n var domStyle = stylesInDom[item.id]\n if (domStyle) {\n domStyle.refs++\n for (var j = 0; j < domStyle.parts.length; j++) {\n domStyle.parts[j](item.parts[j])\n }\n for (; j < item.parts.length; j++) {\n domStyle.parts.push(addStyle(item.parts[j]))\n }\n if (domStyle.parts.length > item.parts.length) {\n domStyle.parts.length = item.parts.length\n }\n } else {\n var parts = []\n for (var j = 0; j < item.parts.length; j++) {\n parts.push(addStyle(item.parts[j]))\n }\n stylesInDom[item.id] = { id: item.id, refs: 1, parts: parts }\n }\n }\n}\n\nfunction createStyleElement () {\n var styleElement = document.createElement('style')\n styleElement.type = 'text/css'\n head.appendChild(styleElement)\n return styleElement\n}\n\nfunction addStyle (obj /* StyleObjectPart */) {\n var update, remove\n var styleElement = document.querySelector('style[' + ssrIdKey + '~=\"' + obj.id + '\"]')\n\n if (styleElement) {\n if (isProduction) {\n // has SSR styles and in production mode.\n // simply do nothing.\n return noop\n } else {\n // has SSR styles but in dev mode.\n // for some reason Chrome can't handle source map in server-rendered\n // style tags - source maps in <style> only works if the style tag is\n // created and inserted dynamically. So we remove the server rendered\n // styles and inject new ones.\n styleElement.parentNode.removeChild(styleElement)\n }\n }\n\n if (isOldIE) {\n // use singleton mode for IE9.\n var styleIndex = singletonCounter++\n styleElement = singletonElement || (singletonElement = createStyleElement())\n update = applyToSingletonTag.bind(null, styleElement, styleIndex, false)\n remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true)\n } else {\n // use multi-style-tag mode in all other cases\n styleElement = createStyleElement()\n update = applyToTag.bind(null, styleElement)\n remove = function () {\n styleElement.parentNode.removeChild(styleElement)\n }\n }\n\n update(obj)\n\n return function updateStyle (newObj /* StyleObjectPart */) {\n if (newObj) {\n if (newObj.css === obj.css &&\n newObj.media === obj.media &&\n newObj.sourceMap === obj.sourceMap) {\n return\n }\n update(obj = newObj)\n } else {\n remove()\n }\n }\n}\n\nvar replaceText = (function () {\n var textStore = []\n\n return function (index, replacement) {\n textStore[index] = replacement\n return textStore.filter(Boolean).join('\\n')\n }\n})()\n\nfunction applyToSingletonTag (styleElement, index, remove, obj) {\n var css = remove ? '' : obj.css\n\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = replaceText(index, css)\n } else {\n var cssNode = document.createTextNode(css)\n var childNodes = styleElement.childNodes\n if (childNodes[index]) styleElement.removeChild(childNodes[index])\n if (childNodes.length) {\n styleElement.insertBefore(cssNode, childNodes[index])\n } else {\n styleElement.appendChild(cssNode)\n }\n }\n}\n\nfunction applyToTag (styleElement, obj) {\n var css = obj.css\n var media = obj.media\n var sourceMap = obj.sourceMap\n\n if (media) {\n styleElement.setAttribute('media', media)\n }\n if (options.ssrId) {\n styleElement.setAttribute(ssrIdKey, obj.id)\n }\n\n if (sourceMap) {\n // https://developer.chrome.com/devtools/docs/javascript-debugging\n // this makes source maps inside style tags work properly in Chrome\n css += '\\n/*# sourceURL=' + sourceMap.sources[0] + ' */'\n // http://stackoverflow.com/a/26603875\n css += '\\n/*# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + ' */'\n }\n\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild)\n }\n styleElement.appendChild(document.createTextNode(css))\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var __WEBPACK_NAMESPACE_OBJECT__ = jQuery;","/** global: Craft */\n/** global: Garnish */\nimport $ from 'jquery';\n\n/**\n * CP class\n */\nCraft.CP = Garnish.Base.extend(\n {\n authManager: null,\n\n $nav: null,\n $navToggle: null,\n $globalSidebar: null,\n $globalContainer: null,\n $mainContainer: null,\n $alerts: null,\n $crumbs: null,\n $breadcrumbList: null,\n $breadcrumbItems: null,\n $notificationContainer: null,\n $main: null,\n $primaryForm: null,\n $headerContainer: null,\n $header: null,\n $mainContent: null,\n $details: null,\n $sidebarContainer: null,\n $sidebarToggle: null,\n $sidebar: null,\n $contentContainer: null,\n $edition: null,\n\n $confirmUnloadForms: null,\n $deltaForms: null,\n $collapsibleTables: null,\n\n isMobile: null,\n fixedHeader: false,\n\n breadcrumbListWidth: 0,\n breadcrumbDisclosureItem: `<li class=\"breadcrumb-toggle-wrapper\" data-disclosure-item><button data-disclosure-trigger aria-controls=\"breadcrumb-disclosure\" aria-haspopup=\"true\">${Craft.t(\n 'app',\n 'More…'\n )}</button><div id=\"breadcrumb-disclosure\" class=\"menu menu--disclosure\" data-disclosure-menu><ul></ul></div></li>`,\n\n tabManager: null,\n\n enableQueue: true,\n totalJobs: 0,\n jobInfo: null,\n displayedJobInfo: null,\n displayedJobInfoUnchanged: 1,\n trackJobProgressTimeout: null,\n jobProgressIcon: null,\n\n checkingForUpdates: false,\n forcingRefreshOnUpdatesCheck: false,\n includingDetailsOnUpdatesCheck: false,\n checkForUpdatesCallbacks: null,\n\n resizeTimeout: null,\n\n init: function () {\n // Is this session going to expire?\n if (Craft.remainingSessionTime !== 0) {\n this.authManager = new Craft.AuthManager();\n }\n\n // Find all the key elements\n this.$nav = $('#nav');\n this.$navToggle = $('#primary-nav-toggle');\n this.$globalSidebar = $('#global-sidebar');\n this.$globalContainer = $('#global-container');\n this.$mainContainer = $('#main-container');\n this.$alerts = $('#alerts');\n this.$crumbs = $('#crumbs');\n this.$breadcrumbList = $('.breadcrumb-list');\n this.$breadcrumbItems = $('.breadcrumb-list li');\n this.$notificationContainer = $('#notifications');\n this.$main = $('#main');\n this.$primaryForm = $('#main-form');\n this.$headerContainer = $('#header-container');\n this.$header = $('#header');\n this.$mainContent = $('#main-content');\n this.$details = $('#details');\n this.$sidebarContainer = $('#sidebar-container');\n this.$sidebarToggle = $('#sidebar-toggle');\n this.$sidebar = $('#sidebar');\n this.$contentContainer = $('#content-container');\n this.$collapsibleTables = $('table.collapsible');\n\n this.isMobile = Garnish.isMobileBrowser();\n\n this.updateContentHeading();\n\n // Swap any instruction text with info icons\n let $allInstructions = this.$details.find(\n '.meta > .field > .instructions'\n );\n\n for (let i = 0; i < $allInstructions.length; i++) {\n let $instructions = $allInstructions.eq(i);\n let $label = $instructions.siblings('.heading').children('label');\n $('<span/>', {\n class: 'info',\n html: $instructions.children().html(),\n }).appendTo($label);\n $instructions.remove();\n }\n\n if (!this.isMobile && this.$header.length) {\n this.addListener(Garnish.$win, 'scroll', 'updateFixedHeader');\n this.updateFixedHeader();\n }\n\n Garnish.$doc.ready(() => {\n // Update responsive tables on window resize\n this.addListener(Garnish.$win, 'resize', (ev) => {\n // Ignore element resizes\n if (ev.target === window) {\n this.handleWindowResize();\n\n clearTimeout(this.resizeTimeout);\n var cp = this;\n this.resizeTimeout = setTimeout(function () {\n cp.setSidebarNavAttributes();\n }, 100);\n }\n });\n this.handleWindowResize();\n this.setSidebarNavAttributes();\n\n // Wait a frame before initializing any confirm-unload forms,\n // so other JS that runs on ready() has a chance to initialize\n Garnish.requestAnimationFrame(this.initSpecialForms.bind(this));\n });\n\n // Alerts\n if (this.$alerts.length) {\n this.initAlerts();\n }\n\n // Toggles\n this.addListener(this.$navToggle, 'click', 'toggleNav');\n this.addListener(this.$sidebarToggle, 'click', 'toggleSidebar');\n\n // Does this page have a primary form?\n if (!this.$primaryForm.length) {\n this.$primaryForm = $('form[data-saveshortcut]:first');\n }\n\n // Does the primary form support the save shortcut?\n if (\n this.$primaryForm.length &&\n Garnish.hasAttr(this.$primaryForm, 'data-saveshortcut')\n ) {\n let shortcuts = [];\n let actions = this.$primaryForm.data('actions');\n if (typeof actions === 'undefined') {\n shortcuts.push([\n {\n keyCode: Garnish.S_KEY,\n ctrl: true,\n },\n {\n redirect: this.$primaryForm.data('saveshortcut-redirect'),\n retainScroll: Garnish.hasAttr(\n this.$primaryForm,\n 'saveshortcut-scroll'\n ),\n },\n ]);\n } else {\n for (let i = 0; i < actions.length; i++) {\n let action = actions[i];\n if (!action.shortcut) {\n continue;\n }\n shortcuts.push([\n {\n keyCode: Garnish.S_KEY,\n ctrl: true,\n shift: !!action.shift,\n },\n {\n action: action.action,\n redirect: action.redirect,\n confirm: action.confirm,\n params: action.params,\n data: action.data,\n retainScroll: action.retainScroll,\n },\n ]);\n }\n }\n for (let i = 0; i < shortcuts.length; i++) {\n Garnish.uiLayerManager.registerShortcut(shortcuts[i][0], () => {\n this.submitPrimaryForm(shortcuts[i][1]);\n });\n }\n }\n\n this.initTabs();\n\n if (this.tabManager) {\n if (window.LOCATION_HASH) {\n const $tab = this.tabManager.$tabs.filter(\n `[href=\"#${window.LOCATION_HASH}\"]`\n );\n if ($tab.length) {\n this.tabManager.selectTab($tab);\n }\n }\n }\n\n // Should we match the previous scroll position?\n let scrollY = Craft.getLocalStorage('scrollY');\n if (typeof scrollY !== 'undefined') {\n Craft.removeLocalStorage('scrollY');\n Garnish.$doc.ready(() => {\n Garnish.requestAnimationFrame(() => {\n window.scrollTo(0, scrollY);\n });\n });\n }\n\n if ($.isTouchCapable()) {\n this.$mainContainer.on(\n 'focus',\n 'input, textarea, .focusable-input',\n this._handleInputFocus.bind(this)\n );\n this.$mainContainer.on(\n 'blur',\n 'input, textarea, .focusable-input',\n this._handleInputBlur.bind(this)\n );\n }\n\n // Announcements HUD\n if (Craft.announcements.length) {\n let $btn = $('#announcements-btn').removeClass('hidden');\n const hasUnreads = Craft.announcements.some((a) => a.unread);\n let $unreadMessage;\n if (hasUnreads) {\n $unreadMessage = $('<span/>', {\n class: 'visually-hidden',\n html: Craft.t('app', 'Unread messages'),\n });\n $btn.addClass('unread').append($unreadMessage);\n }\n let hud;\n this.addListener($btn, 'click', () => {\n if (!hud) {\n let contents = '';\n Craft.announcements.forEach((a) => {\n contents +=\n `<div class=\"announcement ${\n a.unread ? 'unread' : ''\n }\" role=\"listitem\">` +\n '<div class=\"announcement__header\">' +\n `<h3 class=\"announcement__heading h2\">${a.heading}</h3>` +\n '<div class=\"announcement-label-container\">' +\n `<div class=\"announcement-icon\" aria-hidden=\"true\">${a.icon}</div>` +\n `<div class=\"announcement-label\">${a.label}</div>` +\n '</div>' +\n '</div>' +\n `<p>${a.body}</p>` +\n '</div>';\n });\n hud = new Garnish.HUD(\n $btn,\n `<h2 class=\"visually-hidden\">${Craft.t(\n 'app',\n 'Announcements'\n )}</h2><div id=\"announcements\" role=\"list\">${contents}</div>`,\n {\n onShow: () => {\n $btn.addClass('active');\n },\n onHide: () => {\n $btn.removeClass('active');\n },\n }\n );\n\n // Open outbound links in new windows\n $('a', hud.$main).each(function () {\n if (\n this.hostname.length &&\n this.hostname !== location.hostname &&\n typeof $(this).attr('target') === 'undefined'\n ) {\n $(this).attr('rel', 'noopener').attr('target', '_blank');\n }\n });\n\n if (hasUnreads) {\n $btn.removeClass('unread');\n $unreadMessage.remove();\n Craft.sendActionRequest(\n 'POST',\n 'users/mark-announcements-as-read',\n {\n data: {\n ids: Craft.announcements.map((a) => a.id),\n },\n }\n );\n }\n } else {\n hud.show();\n }\n });\n }\n\n // Add .stuck class to #footer when stuck\n // h/t https://stackoverflow.com/a/61115077/1688568\n const footer = document.getElementById('footer');\n if (footer) {\n const observer = new IntersectionObserver(\n ([ev]) => {\n ev.target.classList.toggle('stuck', ev.intersectionRatio < 1);\n },\n {\n rootMargin: '0px 0px -1px 0px',\n threshold: [1],\n }\n );\n observer.observe(footer);\n }\n },\n\n get $contentHeader() {\n const $contentHeader = $('#content-header');\n if ($contentHeader.length) {\n return $contentHeader;\n }\n return $('<header/>', {\n id: 'content-header',\n class: 'pane-header',\n }).prependTo($('#content'));\n },\n\n get $noticeContainer() {\n const $noticeContainer = $('#content-notice');\n if ($noticeContainer.length) {\n return $noticeContainer;\n }\n return $('<div id=\"content-notice\"/>')\n .attr('role', 'status')\n .prependTo(this.$contentHeader);\n },\n\n initSpecialForms: function () {\n // Look for forms that we should watch for changes on\n this.$confirmUnloadForms = $('form[data-confirm-unload]');\n this.$deltaForms = $('form[data-delta]');\n\n if (!this.$confirmUnloadForms.length) {\n return;\n }\n\n const $forms = this.$confirmUnloadForms.add(this.$deltaForms);\n\n for (let i = 0; i < $forms.length; i++) {\n const $form = $forms.eq(i);\n let serialized;\n if (!$form.data('initialSerializedValue')) {\n if (typeof $form.data('serializer') === 'function') {\n serialized = $form.data('serializer')();\n } else {\n serialized = $form.serialize();\n }\n $form.data('initialSerializedValue', serialized);\n }\n this.addListener($form, 'submit', function (ev) {\n if (Garnish.hasAttr($form, 'data-confirm-unload')) {\n this.removeListener(Garnish.$win, 'beforeunload');\n }\n if (Garnish.hasAttr($form, 'data-delta')) {\n ev.preventDefault();\n let serialized;\n if (typeof $form.data('serializer') === 'function') {\n serialized = $form.data('serializer')();\n } else {\n serialized = $form.serialize();\n }\n const data = Craft.findDeltaData(\n $form.data('initialSerializedValue'),\n serialized,\n $form.data('delta-names'),\n null,\n $form.data('initial-delta-values'),\n $form.data('modified-delta-names')\n );\n Craft.createForm(data).appendTo(Garnish.$bod).submit();\n }\n });\n }\n\n this.addListener(Garnish.$win, 'beforeunload', function (ev) {\n let confirmUnload = false;\n if (\n typeof Craft.livePreview !== 'undefined' &&\n Craft.livePreview.inPreviewMode\n ) {\n confirmUnload = true;\n } else {\n for (let i = 0; i < this.$confirmUnloadForms.length; i++) {\n const $form = this.$confirmUnloadForms.eq(i);\n let serialized;\n if (typeof $form.data('serializer') === 'function') {\n serialized = $form.data('serializer')();\n } else {\n serialized = $form.serialize();\n }\n if ($form.data('initialSerializedValue') !== serialized) {\n confirmUnload = true;\n break;\n }\n }\n }\n\n if (confirmUnload) {\n var message = Craft.t(\n 'app',\n 'Any changes will be lost if you leave this page.'\n );\n\n if (ev) {\n ev.originalEvent.returnValue = message;\n } else {\n window.event.returnValue = message;\n }\n\n return message;\n }\n });\n },\n\n _handleInputFocus: function () {\n this.updateFixedHeader();\n },\n\n _handleInputBlur: function () {\n this.updateFixedHeader();\n },\n\n /**\n * Submits a form.\n * @param {Object} [options]\n * @param {string} [options.action] The `action` param value override\n * @param {string} [options.redirect] The `redirect` param value override\n * @param {string} [options.confirm] A confirmation message that should be shown to the user before submit\n * @param {Object} [options.params] Additional params that should be added to the form, defined as name/value pairs\n * @param {Object} [options.data] Additional data to be passed to the submit event\n * @param {boolean} [options.retainScroll] Whether the scroll position should be stored and reapplied on the next page load\n */\n submitPrimaryForm: function (options) {\n // Give other stuff on the page a chance to prepare\n this.trigger('beforeSaveShortcut');\n\n if (typeof options !== 'object' || !$.isPlainObject(options)) {\n options = {};\n }\n\n if (!options.redirect) {\n options.redirect = this.$primaryForm.data('saveshortcut-redirect');\n }\n\n if (!options.data) {\n options.data = {};\n }\n options.data.saveShortcut = true;\n\n Craft.submitForm(this.$primaryForm, options);\n },\n\n updateSidebarMenuLabel: function () {\n this.updateContentHeading();\n },\n\n updateContentHeading: function () {\n const $item = this.$sidebar.find('a.sel:first');\n const $label = $item.children('.label');\n $('#content-heading').text($label.length ? $label.text() : $item.text());\n Garnish.$bod.removeClass('showing-sidebar');\n },\n\n toggleNav: function () {\n const isExpanded = this.navIsExpanded();\n\n if (isExpanded === null) return;\n\n if (isExpanded) {\n this.disableGlobalSidebarLinks();\n this.$navToggle.focus();\n this.$navToggle.attr('aria-expanded', 'false');\n Garnish.$bod.removeClass('showing-nav');\n } else {\n this.enableGlobalSidebarLinks();\n this.$globalSidebar.find(':focusable')[0].focus();\n this.$navToggle.attr('aria-expanded', 'true');\n Garnish.$bod.addClass('showing-nav');\n }\n },\n\n enableGlobalSidebarLinks: function () {\n const focusableItems = this.$globalSidebar.find(':focusable');\n\n $(focusableItems).each(function () {\n $(this).attr('tabindex', '0');\n });\n },\n\n disableGlobalSidebarLinks: function () {\n const focusableItems = this.$globalSidebar.find(':focusable');\n\n $(focusableItems).each(function () {\n $(this).attr('tabindex', '-1');\n });\n },\n\n setSidebarNavAttributes: function () {\n const isExpanded = this.navIsExpanded();\n\n if (isExpanded === null) return;\n\n if (!isExpanded) {\n this.disableGlobalSidebarLinks();\n } else {\n this.enableGlobalSidebarLinks();\n }\n },\n\n navIsExpanded: function () {\n if (!this.$globalSidebar[0]) return null;\n\n const isAlwaysVisible = getComputedStyle(this.$globalSidebar[0])\n .getPropertyValue('--is-always-visible')\n .trim();\n\n return (\n this.$navToggle.attr('aria-expanded') === 'true' ||\n isAlwaysVisible === 'true'\n );\n },\n\n toggleSidebar: function () {\n const expanded = this.$sidebarToggle.attr('aria-expanded') === 'true';\n const newState = expanded ? 'false' : 'true';\n this.$sidebarToggle.attr('aria-expanded', newState);\n Garnish.$bod.toggleClass('showing-sidebar');\n },\n\n initTabs: function () {\n if (this.tabManager) {\n this.tabManager.destroy();\n this.tabManager = null;\n }\n\n const $tabs = $('#tabs');\n if (!$tabs.length) {\n return;\n }\n\n this.tabManager = new Craft.Tabs($tabs);\n\n this.tabManager.on('selectTab', (ev) => {\n const href = ev.$tab.attr('href');\n\n // Show its content area\n if (href && href.charAt(0) === '#') {\n $(href).removeClass('hidden');\n }\n\n // Trigger a resize event to update any UI components that are listening for it\n Garnish.$win.trigger('resize');\n\n // Fixes Redactor fixed toolbars on previously hidden panes\n Garnish.$doc.trigger('scroll');\n\n // If there is a revision menu, set its links to this tab ID\n if (href && href.charAt(0) === '#') {\n const menuBtn = $('#context-btn').menubtn().data('menubtn');\n if (menuBtn) {\n for (let i = 0; i < menuBtn.menu.$options.length; i++) {\n let a = menuBtn.menu.$options[i];\n if (a.href) {\n a.href = a.href.match(/^[^#]*/)[0] + href;\n }\n }\n }\n }\n\n if (typeof history !== 'undefined') {\n // Delay changing the hash so it doesn't cause the browser to jump on page load\n Garnish.requestAnimationFrame(() => {\n history.replaceState(undefined, undefined, href);\n });\n }\n });\n\n this.tabManager.on('deselectTab', (ev) => {\n const href = ev.$tab.attr('href');\n if (href && href.charAt(0) === '#') {\n // Hide its content area\n $(ev.$tab.attr('href')).addClass('hidden');\n }\n });\n },\n\n updateTabs: function (tabs) {\n if (tabs) {\n const $tabContainer = $(tabs).attr('id', 'tabs');\n if (this.tabManager) {\n this.tabManager.$container.replaceWith($tabContainer);\n } else {\n $tabContainer.appendTo(this.$contentHeader);\n }\n this.initTabs();\n } else if (this.tabManager) {\n if (this.tabManager.$container.siblings().length) {\n this.tabManager.$container.remove();\n } else {\n this.tabManager.$container.parent().remove();\n }\n this.tabManager.destroy();\n this.tabManager = null;\n }\n },\n\n /**\n * @deprecated in 3.7.0\n */\n get $tabsContainer() {\n return this.tabManager ? this.tabManager.$container : undefined;\n },\n /**\n * @deprecated in 3.7.0\n */\n get $tabsList() {\n return this.tabManager ? this.tabManager.$tablist : undefined;\n },\n /**\n * @deprecated in 3.7.0\n */\n get $tabs() {\n return this.tabManager ? this.tabManager.$tablist.find('> a') : undefined;\n },\n /**\n * @deprecated in 3.7.0\n */\n get $selectedTab() {\n return this.tabManager ? this.tabManager.$selectedTab : undefined;\n },\n /**\n * @deprecated in 3.7.0\n */\n get selectedTabIndex() {\n return this.tabManager\n ? this.tabManager.$tabs.index(this.tabManager.$selectedTab)\n : undefined;\n },\n /**\n * @deprecated in 3.7.0\n */\n get $focusableTab() {\n return this.tabManager ? this.tabManager.$focusableTab : undefined;\n },\n /**\n * @param {(jQuery|HTMLElement|string)} tab\n * @deprecated in 3.7.0\n */\n selectTab: function (tab) {\n if (this.tabManager) {\n this.tabManager.selectTab(tab);\n }\n },\n /**\n * @deprecated in 3.7.0\n */\n deselectTab: function () {\n if (this.tabManager) {\n this.tabManager.deselectTab();\n }\n },\n\n handleWindowResize: function () {\n this.updateResponsiveTables();\n this.handleBreadcrumbVisibility();\n },\n\n breadcrumbItemsWrap: function () {\n if (!this.$breadcrumbItems[0]) return;\n\n this.$breadcrumbList.css(\n Craft.orientation === 'ltr' ? 'margin-right' : 'margin-left',\n ''\n );\n const listWidth = this.$breadcrumbList[0].getBoundingClientRect().width;\n let totalItemWidth = 0;\n\n // Iterate through all list items (inclusive of more button)\n const $items = this.$breadcrumbList.find('li');\n for (let i = 0; i < $items.length; i++) {\n totalItemWidth += $items.get(i).getBoundingClientRect().width;\n }\n\n this.breadcrumbListWidth = listWidth;\n\n if (totalItemWidth <= listWidth) {\n return false;\n }\n\n // If it's less than a pixel off, it's probably just a rounding error.\n // Give the container an extra pixel to be safe, though\n if (totalItemWidth < listWidth + 1) {\n this.$breadcrumbList.css(\n Craft.orientation === 'ltr' ? 'margin-right' : 'margin-left',\n '-1px'\n );\n return false;\n }\n\n return true;\n },\n\n handleBreadcrumbVisibility: function () {\n if (!this.breadcrumbItemsWrap()) return;\n\n if (this.$breadcrumbList.find('[data-disclosure-item]').length === 0) {\n this.$breadcrumbList.append(this.breadcrumbDisclosureItem);\n }\n\n const triggerWidth = this.$breadcrumbList.find(\n '[data-disclosure-item]'\n )[0].offsetWidth;\n let visibleItemWidth = triggerWidth;\n let finalIndex;\n let newWidth;\n const listWidth = this.breadcrumbListWidth;\n\n // Find breadcrumbs that should remain visible without overflowing\n this.$breadcrumbItems.each(function (index) {\n newWidth = visibleItemWidth + this.offsetWidth;\n\n if (newWidth < listWidth) {\n finalIndex = index;\n visibleItemWidth += this.offsetWidth;\n } else {\n return false;\n }\n });\n\n // Separate breadcrums that should remain visible vs. hidden\n const shownItems = this.$breadcrumbItems.slice(0, finalIndex + 1);\n const hiddenItems = this.$breadcrumbItems.slice(finalIndex + 1);\n\n // Empty list DOM and add shown items and trigger item\n this.$breadcrumbList.html('');\n this.$breadcrumbList.append(shownItems);\n this.$breadcrumbList.append(this.breadcrumbDisclosureItem);\n\n // Add hidden items to disclosure menu and initialize\n this.$breadcrumbList\n .find('[data-disclosure-menu] ul')\n .append(hiddenItems);\n this.$breadcrumbList.find('[data-disclosure-trigger]').disclosureMenu();\n },\n\n updateResponsiveTables: function () {\n for (\n this.updateResponsiveTables._i = 0;\n this.updateResponsiveTables._i < this.$collapsibleTables.length;\n this.updateResponsiveTables._i++\n ) {\n this.updateResponsiveTables._$table = this.$collapsibleTables.eq(\n this.updateResponsiveTables._i\n );\n this.updateResponsiveTables._containerWidth =\n this.updateResponsiveTables._$table.parent().width();\n this.updateResponsiveTables._check = false;\n\n if (this.updateResponsiveTables._containerWidth > 0) {\n // Is this the first time we've checked this table?\n if (\n typeof this.updateResponsiveTables._$table.data(\n 'lastContainerWidth'\n ) === 'undefined'\n ) {\n this.updateResponsiveTables._check = true;\n } else {\n this.updateResponsiveTables._isCollapsed =\n this.updateResponsiveTables._$table.hasClass('collapsed');\n\n // Getting wider?\n if (\n this.updateResponsiveTables._containerWidth >\n this.updateResponsiveTables._$table.data('lastContainerWidth')\n ) {\n if (this.updateResponsiveTables._isCollapsed) {\n this.updateResponsiveTables._$table.removeClass('collapsed');\n this.updateResponsiveTables._check = true;\n }\n } else if (!this.updateResponsiveTables._isCollapsed) {\n this.updateResponsiveTables._check = true;\n }\n }\n\n // Are we checking the table width?\n if (this.updateResponsiveTables._check) {\n if (\n this.updateResponsiveTables._$table.width() - 30 >\n this.updateResponsiveTables._containerWidth\n ) {\n this.updateResponsiveTables._$table.addClass('collapsed');\n }\n }\n\n // Remember the container width for next time\n this.updateResponsiveTables._$table.data(\n 'lastContainerWidth',\n this.updateResponsiveTables._containerWidth\n );\n }\n }\n },\n\n updateFixedHeader: function () {\n if (this.isMobile) {\n return;\n }\n\n // Have we scrolled passed the top of #main?\n if (\n this.$main.length &&\n this.$headerContainer[0].getBoundingClientRect().top < 0\n ) {\n if (!this.fixedHeader) {\n var headerHeight = this.$headerContainer.height();\n\n // Hard-set the minimum content container height\n this.$contentContainer.css(\n 'min-height',\n 'calc(100vh - ' + (headerHeight + 14 + 48 - 1) + 'px)'\n );\n\n // Hard-set the header container height\n this.$headerContainer.height(headerHeight);\n Garnish.$bod.addClass('fixed-header');\n\n // Fix the sidebar and details pane positions if they are taller than #content-container\n var contentHeight = this.$contentContainer.outerHeight();\n var $detailsHeight = this.$details.outerHeight();\n var css = {\n top: headerHeight + 'px',\n 'max-height': 'calc(100vh - ' + headerHeight + 'px)',\n };\n this.$sidebar.addClass('fixed').css(css);\n this.$details.addClass('fixed').css(css);\n this.fixedHeader = true;\n }\n } else if (this.fixedHeader) {\n this.$headerContainer.height('auto');\n Garnish.$bod.removeClass('fixed-header');\n this.$contentContainer.css('min-height', '');\n this.$sidebar.removeClass('fixed').css({\n top: '',\n 'max-height': '',\n });\n this.$details.removeClass('fixed').css({\n top: '',\n 'max-height': '',\n });\n this.fixedHeader = false;\n }\n },\n\n /**\n * Dispays a notification.\n *\n * @param {string} type `notice`, `success`, or `error`\n * @param {string} message\n * @param {Object} [settings]\n * @param {string} [settings.icon] The icon to show on the notification\n * @param {string} [settings.iconLabel] The icon’s ARIA label\n * @param {string} [settings.details] Any additional HTML that should be included below the message\n * @returns {Object} The notification\n */\n displayNotification: function (type, message, settings) {\n const notification = new Craft.CP.Notification(type, message, settings);\n\n this.trigger('displayNotification', {\n notificationType: type,\n message,\n notification,\n });\n\n return notification;\n },\n\n /**\n * Displays a notice.\n *\n * @param {string} message\n * @param {Object} [settings]\n * @param {string} [settings.icon] The icon to show on the notification\n * @param {string} [settings.iconLabel] The icon’s ARIA label\n * @param {string} [settings.details] Any additional HTML that should be included below the message\n * @returns {Object} The notification\n */\n displayNotice: function (message, settings) {\n return this.displayNotification(\n 'notice',\n message,\n Object.assign(\n {\n icon: 'info',\n iconLabel: Craft.t('app', 'Notice'),\n },\n settings\n )\n );\n },\n\n /**\n * Displays a success notification.\n *\n * @param {string} message\n * @param {Object} [settings]\n * @param {string} [settings.icon] The icon to show on the notification\n * @param {string} [settings.iconLabel] The icon’s ARIA label\n * @param {string} [settings.details] Any additional HTML that should be included below the message\n * @returns {Object} The notification\n */\n displaySuccess: function (message, settings) {\n return this.displayNotification(\n 'success',\n message,\n Object.assign(\n {\n icon: 'check',\n iconLabel: Craft.t('app', 'Success'),\n },\n settings\n )\n );\n },\n\n /**\n * Displays an error.\n *\n * @param {string} message\n * @param {Object} [settings]\n * @param {string} [settings.icon] The icon to show on the notification\n * @param {string} [settings.iconLabel] The icon’s ARIA label\n * @param {string} [settings.details] Any additional HTML that should be included below the message\n * @returns {Object} The notification\n */\n displayError: function (message, settings) {\n if (!message || typeof message === 'object') {\n settings = message;\n message = Craft.t('app', 'A server error occurred.');\n }\n\n return this.displayNotification(\n 'error',\n message,\n Object.assign(\n {\n icon: 'alert',\n iconLabel: Craft.t('app', 'Error'),\n },\n settings\n )\n );\n },\n\n fetchAlerts: function () {\n return Craft.queue.push(\n () =>\n new Promise((resolve, reject) => {\n const data = {\n path: Craft.path,\n };\n Craft.sendActionRequest('POST', 'app/get-cp-alerts', {data})\n .then(({data}) => {\n resolve(data.alerts);\n })\n .catch(reject);\n })\n );\n },\n\n displayAlerts: function (alerts) {\n this.$alerts.remove();\n\n if (Garnish.isArray(alerts) && alerts.length) {\n this.$alerts = $('<ul id=\"alerts\"/>').prependTo($('#page-container'));\n\n for (var i = 0; i < alerts.length; i++) {\n $(\n `<li><span data-icon=\"alert\" aria-label=\"${Craft.t(\n 'app',\n 'Error'\n )}\"></span> ${alerts[i]}</li>`\n ).appendTo(this.$alerts);\n }\n\n var height = this.$alerts.outerHeight();\n this.$alerts\n .css('margin-top', -height)\n .velocity({'margin-top': 0}, 'fast');\n\n this.initAlerts();\n }\n },\n\n initAlerts: function () {\n // Are there any shunnable alerts?\n var $shunnableAlerts = this.$alerts.find('a[class^=\"shun:\"]');\n\n for (var i = 0; i < $shunnableAlerts.length; i++) {\n this.addListener($shunnableAlerts[i], 'click', (ev) => {\n ev.preventDefault();\n\n Craft.queue.push(\n () =>\n new Promise((resolve, reject) => {\n const $link = $(ev.currentTarget);\n const data = {\n message: $link.prop('className').substring(5),\n };\n Craft.sendActionRequest('POST', 'app/shun-cp-alert', {data})\n .then(() => {\n $link.parent().remove();\n resolve();\n })\n .catch(({response}) => {\n this.displayError(response.data.message);\n reject();\n });\n })\n );\n });\n }\n },\n\n checkForUpdates: function (forceRefresh, includeDetails, callback) {\n // Make 'includeDetails' optional\n if (typeof includeDetails === 'function') {\n callback = includeDetails;\n includeDetails = false;\n }\n\n // If forceRefresh == true, we're currently checking for updates, and not currently forcing a refresh,\n // then just set a new callback that re-checks for updates when the current one is done.\n if (\n this.checkingForUpdates &&\n ((forceRefresh === true && !this.forcingRefreshOnUpdatesCheck) ||\n (includeDetails === true && !this.includingDetailsOnUpdatesCheck))\n ) {\n var realCallback = callback;\n callback = () => {\n this.checkForUpdates(forceRefresh, includeDetails, realCallback);\n };\n }\n\n // Callback function?\n if (typeof callback === 'function') {\n if (!Garnish.isArray(this.checkForUpdatesCallbacks)) {\n this.checkForUpdatesCallbacks = [];\n }\n\n this.checkForUpdatesCallbacks.push(callback);\n }\n\n if (!this.checkingForUpdates) {\n this.checkingForUpdates = true;\n this.forcingRefreshOnUpdatesCheck = forceRefresh === true;\n this.includingDetailsOnUpdatesCheck = includeDetails === true;\n\n this._checkForUpdates(forceRefresh, includeDetails).then((info) => {\n this.updateUtilitiesBadge();\n this.checkingForUpdates = false;\n\n if (Garnish.isArray(this.checkForUpdatesCallbacks)) {\n var callbacks = this.checkForUpdatesCallbacks;\n this.checkForUpdatesCallbacks = null;\n\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i](info);\n }\n }\n\n this.trigger('checkForUpdates', {\n updateInfo: info,\n });\n });\n }\n },\n\n _checkForUpdates: function (forceRefresh, includeDetails) {\n return new Promise((resolve, reject) => {\n if (!forceRefresh) {\n this._checkForCachedUpdates(includeDetails)\n .then((info) => {\n if (info.cached) {\n resolve(info);\n return;\n }\n\n this._getUpdates(includeDetails).then((info) => {\n resolve(info);\n });\n })\n .catch(reject);\n } else {\n this._getUpdates(includeDetails).then(resolve).catch(reject);\n }\n });\n },\n\n _checkForCachedUpdates: function (includeDetails) {\n return new Promise(function (resolve, reject) {\n var data = {\n onlyIfCached: true,\n includeDetails: includeDetails,\n };\n\n Craft.sendActionRequest('POST', 'app/check-for-updates', {data})\n .then(({data}) => {\n resolve(data);\n })\n .catch(() => {\n resolve({cached: false});\n });\n });\n },\n\n _getUpdates: function (includeDetails) {\n return new Promise((resolve, reject) => {\n Craft.sendApiRequest('GET', 'updates')\n .then((updates) => {\n this._cacheUpdates(updates, includeDetails).then((data) => {\n resolve(data);\n });\n })\n .catch(reject);\n });\n },\n\n _cacheUpdates: function (updates, includeDetails) {\n return new Promise((resolve, reject) => {\n const data = {\n updates,\n includeDetails,\n };\n\n Craft.sendActionRequest('POST', 'app/cache-updates', {data})\n .then(({data}) => {\n resolve(data);\n })\n .catch(reject);\n });\n },\n\n updateUtilitiesBadge: function () {\n var $utilitiesLink = $('#nav-utilities').find('> a:not(.sel)');\n\n // Ignore if there is no (non-selected) Utilities nav item\n if (!$utilitiesLink.length) {\n return;\n }\n\n Craft.queue.push(\n () =>\n new Promise((resolve, reject) => {\n Craft.sendActionRequest('POST', 'app/get-utilities-badge-count')\n .then(({data}) => {\n // Get the existing utility nav badge and screen reader text, if any\n let $badge = $utilitiesLink.children('.badge');\n let $screenReaderText = $utilitiesLink.children(\n '[data-notification]'\n );\n\n if (data.badgeCount) {\n if (!$badge.length) {\n $badge = $(\n '<span class=\"badge\" aria-hidden=\"true\"/>'\n ).appendTo($utilitiesLink);\n }\n\n if (!$screenReaderText.length) {\n $screenReaderText = $(\n '<span class=\"visually-hidden\" data-notification/>'\n ).appendTo($utilitiesLink);\n }\n\n $badge.text(data.badgeCount);\n $screenReaderText.text(\n Craft.t(\n 'app',\n '{num, number} {num, plural, =1{notification} other{notifications}}',\n {\n num: data.badgeCount,\n }\n )\n );\n } else if ($badge.length && $screenReaderText.length) {\n $badge.remove();\n $screenReaderText.remove();\n }\n resolve();\n })\n .catch(reject);\n })\n );\n },\n\n runQueue: function () {\n if (!this.enableQueue) {\n return;\n }\n\n if (Craft.runQueueAutomatically) {\n Craft.queue.push(\n () =>\n new Promise((resolve, reject) => {\n Craft.sendActionRequest('POST', 'queue/run')\n .then(() => {\n this.trackJobProgress(false, true);\n resolve();\n })\n .catch(reject);\n })\n );\n } else {\n this.trackJobProgress(false, true);\n }\n },\n\n trackJobProgress: function (delay, force) {\n if (force && this.trackJobProgressTimeout) {\n clearTimeout(this.trackJobProgressTimeout);\n this.trackJobProgressTimeout = null;\n }\n\n // Ignore if we're already tracking jobs, or the queue is disabled\n if (this.trackJobProgressTimeout || !this.enableQueue) {\n return;\n }\n\n if (delay === true) {\n // Determine the delay based on how long the displayed job info has remained unchanged\n var timeout = Math.min(60000, this.displayedJobInfoUnchanged * 500);\n this.trackJobProgressTimeout = setTimeout(\n this._trackJobProgressInternal.bind(this),\n timeout\n );\n } else {\n this._trackJobProgressInternal();\n }\n },\n\n _trackJobProgressInternal: function () {\n Craft.queue.push(\n () =>\n new Promise((resolve, reject) => {\n Craft.sendActionRequest(\n 'POST',\n 'queue/get-job-info?limit=50&dontExtendSession=1'\n )\n .then(({data}) => {\n this.trackJobProgressTimeout = null;\n this.totalJobs = data.total;\n this.setJobInfo(data.jobs);\n if (this.jobInfo.length) {\n // Check again after a delay\n this.trackJobProgress(true);\n }\n resolve();\n })\n .catch(reject);\n })\n );\n },\n\n setJobInfo: function (jobInfo) {\n if (!this.enableQueue) {\n return;\n }\n\n this.jobInfo = jobInfo;\n\n // Update the displayed job info\n var oldInfo = this.displayedJobInfo;\n this.displayedJobInfo = this.getDisplayedJobInfo();\n\n // Same old same old?\n if (\n oldInfo &&\n this.displayedJobInfo &&\n oldInfo.id === this.displayedJobInfo.id &&\n oldInfo.progress === this.displayedJobInfo.progress &&\n oldInfo.progressLabel === this.displayedJobInfo.progressLabel &&\n oldInfo.status === this.displayedJobInfo.status\n ) {\n this.displayedJobInfoUnchanged++;\n } else {\n // Reset the counter\n this.displayedJobInfoUnchanged = 1;\n }\n\n this.updateJobIcon();\n\n // Fire a setJobInfo event\n this.trigger('setJobInfo');\n },\n\n /**\n * Returns info for the job that should be displayed in the control panel sidebar\n */\n getDisplayedJobInfo: function () {\n if (!this.enableQueue) {\n return null;\n }\n\n // Set the status preference order\n var statuses = [\n Craft.CP.JOB_STATUS_RESERVED,\n Craft.CP.JOB_STATUS_FAILED,\n Craft.CP.JOB_STATUS_WAITING,\n ];\n\n for (var i = 0; i < statuses.length; i++) {\n for (var j = 0; j < this.jobInfo.length; j++) {\n if (\n this.jobInfo[j].status === statuses[i] &&\n (statuses[i] !== Craft.CP.JOB_STATUS_WAITING ||\n !this.jobInfo[j].delay)\n ) {\n return this.jobInfo[j];\n }\n }\n }\n\n return null;\n },\n\n updateJobIcon: function () {\n if (!this.enableQueue || !this.$nav.length) {\n return;\n }\n\n if (this.displayedJobInfo) {\n if (!this.jobProgressIcon) {\n this.jobProgressIcon = new JobProgressIcon();\n }\n\n if (\n this.displayedJobInfo.status === Craft.CP.JOB_STATUS_RESERVED ||\n this.displayedJobInfo.status === Craft.CP.JOB_STATUS_WAITING\n ) {\n this.jobProgressIcon.hideFailMode();\n this.jobProgressIcon.setDescription(\n this.displayedJobInfo.description,\n this.displayedJobInfo.progressLabel\n );\n this.jobProgressIcon.setProgress(this.displayedJobInfo.progress);\n } else if (\n this.displayedJobInfo.status === Craft.CP.JOB_STATUS_FAILED\n ) {\n this.jobProgressIcon.showFailMode(Craft.t('app', 'Failed'));\n }\n } else {\n if (this.jobProgressIcon) {\n this.jobProgressIcon.hideFailMode();\n this.jobProgressIcon.complete();\n delete this.jobProgressIcon;\n }\n }\n },\n\n /**\n * Returns the active site for the control panel\n *\n * @returns {number}\n */\n getSiteId: function () {\n // If the old BaseElementIndex.siteId value is in localStorage, go aheand and remove & return that\n let siteId = Craft.getLocalStorage('BaseElementIndex.siteId');\n if (typeof siteId !== 'undefined') {\n Craft.removeLocalStorage('BaseElementIndex.siteId');\n try {\n this.setSiteId(siteId);\n } catch (e) {}\n }\n return Craft.siteId;\n },\n\n /**\n * Sets the active site for the control panel\n * @param {number} siteId\n */\n setSiteId: function (siteId) {\n const site = Craft.sites.find((s) => s.id === siteId);\n\n if (!site) {\n throw `Invalid site ID: ${siteId}`;\n }\n\n Craft.siteId = siteId;\n\n // update the base URLs used get Craft.getUrl(), etc.\n Craft.actionUrl = Craft.getUrl(Craft.actionUrl, {site: site.handle});\n Craft.baseCpUrl = Craft.getUrl(Craft.baseCpUrl, {site: site.handle});\n Craft.baseUrl = Craft.getUrl(Craft.baseUrl, {site: site.handle});\n\n // update the current URL\n const url = Craft.getUrl(document.location.href, {site: site.handle});\n history.replaceState({}, '', url);\n\n // update the site--x body class\n for (let className of document.body.classList) {\n if (className.match(/^site--/)) {\n document.body.classList.remove(className);\n }\n }\n document.body.classList.add(`site--${site.handle}`);\n\n // update other URLs on the page\n $('a').each(function () {\n if (\n this.hostname.length &&\n this.hostname === location.hostname &&\n this.href.indexOf(Craft.cpTrigger) !== -1\n ) {\n this.href = Craft.getUrl(this.href, {site: site.handle});\n }\n });\n },\n },\n {\n //maxWidth: 1051, //1024,\n\n /**\n * @deprecated in 4.2.0. Use Craft.notificationDuration instead.\n */\n notificationDuration: 5000,\n\n JOB_STATUS_WAITING: 1,\n JOB_STATUS_RESERVED: 2,\n JOB_STATUS_DONE: 3,\n JOB_STATUS_FAILED: 4,\n }\n);\n\nCraft.CP.Notification = Garnish.Base.extend({\n type: null,\n message: null,\n settings: null,\n closing: false,\n closeTimeout: null,\n _preventDelayedClose: false,\n $container: null,\n $closeBtn: null,\n originalActiveElement: null,\n\n init: function (type, message, settings) {\n this.type = type;\n this.message = message;\n this.settings = settings || {};\n\n this.$container = $('<div/>', {\n class: 'notification',\n 'data-type': this.type,\n }).appendTo(Craft.cp.$notificationContainer);\n\n const $body = $('<div class=\"notification-body\"/>')\n .appendTo(this.$container)\n .attr('role', 'status');\n\n if (this.settings.icon) {\n const $icon = $('<span/>', {\n class: 'notification-icon',\n 'data-icon': this.settings.icon,\n }).appendTo($body);\n if (this.settings.iconLabel) {\n $icon.attr({\n 'aria-label': this.settings.iconLabel,\n role: 'img',\n });\n } else {\n $icon.attr('aria-hidden', 'true');\n }\n }\n\n const $main = $('<div class=\"notification-main\"/>').appendTo($body);\n\n $('<div/>', {\n class: 'notification-message',\n text: this.message,\n }).appendTo($main);\n\n const $closeBtnContainer = $('<div/>').appendTo(this.$container);\n this.$closeBtn = $('<button/>', {\n type: 'button',\n class: 'notification-close-btn',\n 'aria-label': Craft.t('app', 'Close'),\n 'data-icon': 'remove',\n }).appendTo($closeBtnContainer);\n\n if (this.settings.details) {\n const $detailsContainer = $('<div class=\"notification-details\"/>')\n .append(this.settings.details)\n .appendTo($main);\n\n const $focusableElement = $detailsContainer.find('button,input');\n if ($focusableElement.length) {\n Garnish.uiLayerManager.addLayer(this.$container);\n Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n this.close();\n });\n this.originalActiveElement = document.activeElement;\n this.$container.attr('tabindex', '-1').focus();\n this.$container.on('keydown', (ev) => {\n if (ev.keyCode === Garnish.ESC_KEY) {\n ev.stopPropagation();\n this.close();\n }\n });\n }\n }\n\n this.$container\n .css({\n opacity: 0,\n 'margin-bottom': this._negMargin(),\n })\n .velocity({opacity: 1, 'margin-bottom': 0}, {duration: 'fast'});\n\n Craft.initUiElements(this.$container);\n\n this.addListener(this.$closeBtn, 'click', 'close');\n\n if (Craft.notificationDuration) {\n this._initDelayedClose();\n }\n },\n\n _initDelayedClose: function () {\n if (this._preventDelayedClose) {\n return;\n }\n\n if (!Craft.isVisible()) {\n Garnish.$doc.one('visibilitychange', () => {\n this._initDelayedClose();\n });\n return;\n }\n\n this.delayedClose();\n\n this.$container.on(\n 'keypress keyup change focus blur click mousedown mouseup',\n (ev) => {\n if (ev.target != this.$closeBtn[0]) {\n this.$container.off(\n 'keypress keyup change focus blur click mousedown mouseup'\n );\n this.preventDelayedClose();\n }\n }\n );\n },\n\n _negMargin: function () {\n return `-${this.$container.outerHeight() + 12}px`;\n },\n\n close: function () {\n if (this.closing) {\n return;\n }\n\n if (this.closeTimeout) {\n clearTimeout(this.closeTimeout);\n this.closeTimeout = null;\n }\n\n this.closing = true;\n\n if (\n this.originalActiveElement &&\n document.activeElement &&\n (document.activeElement === this.$container[0] ||\n $.contains(this.$container[0], document.activeElement))\n ) {\n $(this.originalActiveElement).focus();\n }\n\n this.$container.velocity(\n {opacity: 0, 'margin-bottom': this._negMargin()},\n {\n duration: 'fast',\n complete: () => {\n this.$container.remove();\n },\n }\n );\n },\n\n delayedClose: function () {\n this.closeTimeout = setTimeout(() => {\n this.close();\n }, Craft.notificationDuration);\n\n // Hold off on closing automatically on hover\n this.$container.one('mouseover', () => {\n clearTimeout(this.closeTimeout);\n this.closeTimeout = null;\n\n this.$container.on('mouseout', (ev) => {\n if (ev.target == this.$container[0]) {\n this.$container.off('mouseout');\n this.delayedClose();\n }\n });\n });\n },\n\n preventDelayedClose: function () {\n this._preventDelayedClose = true;\n\n if (this.closeTimeout) {\n clearTimeout(this.closeTimeout);\n this.closeTimeout = null;\n }\n\n this.$container.off('mouseover mouseout');\n },\n});\n\nGarnish.$scrollContainer = Garnish.$win;\nCraft.cp = new Craft.CP();\n\n/**\n * Job progress icon class\n */\nvar JobProgressIcon = Garnish.Base.extend({\n $li: null,\n $a: null,\n $label: null,\n $progressLabel: null,\n\n progress: null,\n failMode: false,\n\n _$bgCanvas: null,\n _$staticCanvas: null,\n _$hoverCanvas: null,\n _$failCanvas: null,\n\n _staticCtx: null,\n _hoverCtx: null,\n _canvasSize: null,\n _arcPos: null,\n _arcRadius: null,\n _lineWidth: null,\n\n _arcStartPos: 0,\n _arcEndPos: 0,\n _arcStartStepSize: null,\n _arcEndStepSize: null,\n _arcStep: null,\n _arcStepTimeout: null,\n _arcAnimateCallback: null,\n\n _progressBar: null,\n\n init: function () {\n this.$li = $('<li/>').appendTo(Craft.cp.$nav.children('ul'));\n this.$a = $('<a/>', {\n id: 'job-icon',\n href: Craft.canAccessQueueManager\n ? Craft.getUrl('utilities/queue-manager')\n : null,\n }).appendTo(this.$li);\n this.$canvasContainer = $('<span class=\"icon\"/>').appendTo(this.$a);\n var $labelContainer = $('<span class=\"label\"/>').appendTo(this.$a);\n this.$label = $('<span/>').appendTo($labelContainer);\n this.$progressLabel = $('<span class=\"progress-label\"/>')\n .appendTo($labelContainer)\n .hide();\n\n let m = window.devicePixelRatio > 1 ? 2 : 1;\n this._canvasSize = 18 * m;\n this._arcPos = this._canvasSize / 2;\n this._arcRadius = 7 * m;\n this._lineWidth = 3 * m;\n\n this._$bgCanvas = this._createCanvas('bg', '#61666b');\n this._$staticCanvas = this._createCanvas('static', '#d7d9db');\n this._$hoverCanvas = this._createCanvas('hover', '#fff');\n this._$failCanvas = this._createCanvas('fail', '#da5a47').hide();\n\n this._staticCtx = this._$staticCanvas[0].getContext('2d');\n this._hoverCtx = this._$hoverCanvas[0].getContext('2d');\n\n this._drawArc(this._$bgCanvas[0].getContext('2d'), 0, 1);\n this._drawArc(this._$failCanvas[0].getContext('2d'), 0, 1);\n },\n\n setDescription: function (description, progressLabel) {\n this.$a.attr('title', description);\n this.$label.text(description);\n if (progressLabel) {\n this.$progressLabel.text(progressLabel).show();\n } else {\n this.$progressLabel.hide();\n }\n },\n\n setProgress: function (progress) {\n if (progress == 0) {\n this._$staticCanvas.hide();\n this._$hoverCanvas.hide();\n } else {\n this._$staticCanvas.show();\n this._$hoverCanvas.show();\n if (this.progress && progress > this.progress) {\n this._animateArc(0, progress / 100);\n } else {\n this._setArc(0, progress / 100);\n }\n }\n\n this.progress = progress;\n },\n\n complete: function () {\n this._animateArc(0, 1, () => {\n this._$bgCanvas.velocity('fadeOut');\n\n this._animateArc(1, 1, () => {\n this.$a.remove();\n this.destroy();\n });\n });\n },\n\n showFailMode: function (message) {\n if (this.failMode) {\n return;\n }\n\n this.failMode = true;\n this.progress = null;\n\n this._$bgCanvas.hide();\n this._$staticCanvas.hide();\n this._$hoverCanvas.hide();\n this._$failCanvas.show();\n\n this.setDescription(message);\n },\n\n hideFailMode: function () {\n if (!this.failMode) {\n return;\n }\n\n this.failMode = false;\n\n this._$bgCanvas.show();\n this._$staticCanvas.show();\n this._$hoverCanvas.show();\n this._$failCanvas.hide();\n },\n\n _createCanvas: function (id, color) {\n var $canvas = $(\n '<canvas id=\"job-icon-' +\n id +\n '\" width=\"' +\n this._canvasSize +\n '\" height=\"' +\n this._canvasSize +\n '\"/>'\n ).appendTo(this.$canvasContainer),\n ctx = $canvas[0].getContext('2d');\n\n ctx.strokeStyle = color;\n ctx.lineWidth = this._lineWidth;\n ctx.lineCap = 'round';\n return $canvas;\n },\n\n _setArc: function (startPos, endPos) {\n this._arcStartPos = startPos;\n this._arcEndPos = endPos;\n\n this._drawArc(this._staticCtx, startPos, endPos);\n this._drawArc(this._hoverCtx, startPos, endPos);\n },\n\n _drawArc: function (ctx, startPos, endPos) {\n ctx.clearRect(0, 0, this._canvasSize, this._canvasSize);\n ctx.beginPath();\n ctx.arc(\n this._arcPos,\n this._arcPos,\n this._arcRadius,\n (1.5 + startPos * 2) * Math.PI,\n (1.5 + endPos * 2) * Math.PI\n );\n ctx.stroke();\n ctx.closePath();\n },\n\n _animateArc: function (targetStartPos, targetEndPos, callback) {\n if (this._arcStepTimeout) {\n clearTimeout(this._arcStepTimeout);\n }\n\n this._arcStep = 0;\n this._arcStartStepSize = (targetStartPos - this._arcStartPos) / 10;\n this._arcEndStepSize = (targetEndPos - this._arcEndPos) / 10;\n this._arcAnimateCallback = callback;\n this._takeNextArcStep();\n },\n\n _takeNextArcStep: function () {\n this._setArc(\n this._arcStartPos + this._arcStartStepSize,\n this._arcEndPos + this._arcEndStepSize\n );\n\n this._arcStep++;\n\n if (this._arcStep < 10) {\n this._arcStepTimeout = setTimeout(this._takeNextArcStep.bind(this), 50);\n } else if (this._arcAnimateCallback) {\n this._arcAnimateCallback();\n }\n },\n});\n"],"names":["Craft","Accordion","Garnish","Base","extend","$trigger","targetSelector","_$target","init","trigger","this","$","data","console","warn","destroy","attr","addListener","event","key","keyCode","SPACE_KEY","RETURN_KEY","preventDefault","onTriggerClick","hideTarget","showTarget","$target","length","_currentHeight","height","removeClass","addClass","i","$t","prop","_targetHeight","css","overflow","velocity","getUserPreferredAnimationDuration","eq","$win","hasClass","removeData","base","AddressesInput","$container","$addBtn","$addBtnItem","$cards","container","settings","setSettings","defaults","find","closest","initCard","updateAddButton","createAddress","$card","ev","target","editAddress","$actionBtn","disclosureMenu","menu","$menu","$editBtn","stopPropagation","$deleteBtn","confirm","t","addressId","draftId","sendActionRequest","elementId","then","remove","not","createElementEditor","on","id","response","$newCard","html","replaceWith","insertBefore","initUiElements","add","canCreateAddress","maxAddresses","elementType","ownerId","element","AdminTable","totalItems","sorter","$noItems","$table","$tbody","$deleteBtns","allowDeleteAll","minItems","noItemsSelector","tableSelector","children","sortable","DataTableSorter","onSortChange","reorderItems","bind","handleDeleteBtnClick","updateUI","addRow","row","maxItems","$row","appendTo","addItems","ids","$items","idAttribute","push","JSON","stringify","reorderAction","onReorderItems","cp","displaySuccess","reorderSuccessMessage","displayError","reorderFailMessage","confirmDeleteItem","deleteItem","confirmDeleteMessage","name","getItemName","getItemId","deleteAction","handleDeleteItemSuccess","handleDeleteItemFailure","deleteFailMessage","removeItems","onDeleteItem","deleteSuccessMessage","escapeHtml","nameAttribute","hide","show","$moveButtons","newItemBtnSelector","noop","AssetImageEditor","Modal","$body","$footer","$imageTools","$buttons","$cancelBtn","$replaceBtn","$saveBtn","$focalPointBtn","$editorContainer","$straighten","$croppingCanvas","$spinner","$constraintContainer","$constraintRadioInputs","$customConstraints","canvas","image","viewport","focalPoint","grid","croppingCanvas","clipper","croppingRectangle","cropperHandles","cropperGrid","croppingShade","imageStraightenAngle","viewportRotation","originalWidth","originalHeight","imageVerticeCoords","zoomRatio","animationInProgress","currentView","assetId","cacheBust","draggingCropper","scalingCropper","draggingFocal","previousMouseX","previousMouseY","shiftKeyHeld","editorHeight","editorWidth","cropperState","scaleFactor","flipData","focalPointState","maxImageSize","lastLoadedDimensions","imageIsLoading","mouseMoveEvent","croppingConstraint","constraintOrientation","showingCustomConstraint","saving","renderImage","renderCropper","_queue","Queue","Date","now","allowDegreeFractions","isImagick","prefersReducedMotion","animationDuration","x","y","$bod","type","class","text","allowSavingAsNew","ui","createButton","label","spinner","saveImage","createSubmitButton","removeListener","$shade","getMaxImageSize","loadEditor","browserViewportWidth","$doc","get","documentElement","clientWidth","browserViewportHeight","clientHeight","Math","max","window","devicePixelRatio","alert","$tabs","$viewsContainer","$views","innerHeight","innerWidth","_showSpinner","updateSizeAndPosition","$customConstraintWrapper","filter","parent","append","size","value","val","test","fabric","StaticCanvas","width","enableRetinaScaling","requestAnimationFrame","renderAll","imageUrl","getActionUrl","Image","fromURL","imageObject","set","originX","originY","left","top","getHeight","getWidth","getScaledImageDimensions","_setFittedImageVerticeCoordinates","_repositionEditorElements","focalState","imageDimensions","offsetX","offsetY","focal","focalData","adjustedX","adjustedY","storeFocalPointState","_createFocalPoint","_createViewport","storeCropperState","_addControlListeners","_handleMouseMove","_handleMouseDown","_handleMouseUp","_handleMouseOut","_hideSpinner","first","_reloadImage","setSrc","outerHeight","previousEditorDimensions","setDimensions","currentScaledDimensions","getZoomToFitRatio","previouslyOccupiedArea","_getBoundingRectangle","_repositionCropper","getZoomToCoverRatio","_repositionImage","_repositionViewport","_repositionFocalPoint","_zoomImage","Rect","fill","globalCompositeOperation","sizeFactor","focalX","focalY","deltaX","deltaY","Group","Circle","radius","strokeWidth","stroke","toggleFocalPoint","dimensions","state","currentWidth","ratio","hasOrientationChanged","_","imageRatio","editorRatio","min","round","_getPrevTab","newTabIndex","activeTabIndex","_getActiveTabIndex","_getNextTab","_getActiveTab","$activeTab","index","_handleTabClick","LEFT_KEY","UP_KEY","$prevTab","activateTab","RIGHT_KEY","DOWN_KEY","$nextTab","rotateImage","flipImage","straighteningInput","SlideRuleInput","onStart","_showGrid","onChange","slider","straighten","onEnd","_hideGrid","_cleanupFocalPointAfterStraighten","SHIFT_KEY","_handleConstraintChange","_handleOrientationClick","_applyCustomConstraint","_handleConstraintClick","constraint","currentTarget","siblings","_showCustomConstraint","_hideCustomConstraint","setCroppingConstraint","enforceCroppingConstraint","$constraints","$constraint","labelSelector","$label","split","reverse","join","replace","_getCustomConstraint","w","h","parseFloat","isNaN","_setCustomConstraint","$tab","tab","view","tabindex","showView","enableSlider","disableSlider","Promise","resolve","reject","disableCropMode","enableCropMode","zoomFactor","degrees","parseInt","imageZoomRatio","newAngle","angle","scaledImageDimensions","viewportProperties","imageProperties","angleInRadians","PI","newDeltaX","cos","sin","newDeltaY","modifiedDeltaX","modifiedDeltaY","temp","animate","duration","onComplete","cleanAngle","_adjustFocalPointByAngle","_resetFocalPointPosition","axis","editorCenter","setValue","properties","scaleY","scaleX","previousAngle","_adjustEditorElementsOnStraighten","newCenterX","newCenterY","angleDelta","currentZoomRatio","adjustmentRatio","cropperCenterX","cropperCenterY","imageVertices","getImageVerticeCoords","rectangle","_getZoomRatioToFitRectangle","_isCenterInside","opacity","object","containingObject","newFocalX","newFocalY","adjustedFocalX","adjustedFocalY","containingVertices","vertex","rectangleVertices","_getRectangleVertices","verticeIndex","arePointsInsideRectangle","edge","_getEdgeCrossed","rectangleCenter","distanceFromVertexToEdge","abs","sqrt","pow","distanceFromCenterToEdge","$button","postData","imageRotation","cropData","zoom","onSave","broadcaster","postMessage","runQueue","Preview","refresh","message","scaledWidth","scaledHeight","boundingBox","_getImageBoundingBox","scale","vertScale","horiScale","getCombinedZoomRatio","strokeOptions","gridWidth","gridHeight","xStep","yStep","Line","onFadeOut","removeAllListeners","_editorModeTransition","cropperData","_showCropper","_hideCropper","targetZoom","inverseZoomFactor","imageOffsetX","imageOffsetY","callback","pause","resume","clipperData","_setupCropperLayer","_redrawCropperElements","backgroundColor","hoverCursor","selection","position","rectangleRatio","rectWidth","rectHeight","lineOptions","gridOptions","pathGroup","Path","cropTextTop","cropTextBackgroundColor","previousImageArea","currentOffset","areaFactor","coordinateSet","a","b","c","d","_isMouseOver","move","handle","_cropperHandleHitTest","pageX","pageY","_handleMouseMoveInternal","_handleFocalDrag","_handleCropperDrag","_handleCropperResize","_setMouseCursor","vertices","dxi","dyi","furthest","furthestDeltas","newX","newY","previousHeight","previousWidth","startingRectangle","_calculateNewCropperSizeByDeltas","cropperDirection","topDelta","leftDelta","change","match","isMobileBrowser","cursor","parentOffset","offset","mouseX","mouseY","lb","rb","tb","bb","topLeft","topRight","bottomRight","bottomLeft","zoomMode","topVerticalSegment","bottomVerticalSegment","rightHorizontalSegment","leftHorizontalSegment","verticalOffset","horizontalOffset","_debug","fabricObj","points","ab","_getVector","bc","scalarAbAb","_getScalarProduct","scalarBcBc","point","ap","bp","scalarAbAp","scalarBcBp","projectsOnAB","projectsOnBC","_getVectorMagnitude","vector","_getAngleBetweenVectors","acos","edgePoints","centerPoint","smallestDiff","edgeCrossed","edgeIndex","toCenter","edgeVector","toVertex","diff","box","proportion","AssetIndex","BaseElementIndex","$includeSubfoldersContainer","$includeSubfoldersCheckbox","showingIncludeSubfoldersCheckbox","$uploadButton","$uploadInput","$progressBar","$folders","uploader","promptHandler","progressBar","_uploadTotalFiles","_uploadFileProgress","_currentUploaderSettings","_assetDrag","_folderDrag","_expandDropTargetFolderTimeout","_tempExpandedFolders","_fileConflictTemplate","choices","title","_folderConflictTemplate","context","_initIndexPageMode","$main","modal","_positionProgressBar","initSources","initSource","$source","_createFolderContextMenu","getSourceLevel","updateDropTargets","deinitSource","contextMenu","selectable","multiSelect","DragDrop","activeDropTargetClass","helperOpacity","getSelectedElements","has","helper","$file","_getFileDragHelper","dropTargets","$draggee","targets","$sources","hasAttr","onDragStart","_onDragStart","onDropTargetChange","_onDropTargetChange","onDragStop","_onFileDragStop","helperBaseZindex","$draggeeHelper","$helperSidebar","$helperNav","$helperUl","draggedSourceIds","each","_getVolumeOrFolderUidFromSourceKey","inArray","_onFolderDragStop","$activeDropTarget","originatingSource","targetFolderId","originalAssetIds","originalAssetId","getElementInfo","setIndexBusy","resetProgressBar","setItemCount","showProgressBar","parameterArray","action","params","folderId","_performBatchRequests","onMoveFinish","responseArray","resetPrompts","conflict","addPrompt","suggestedFilename","prompt","error","setIndexAvailable","hideProgressBar","reloadIndex","performAfterMoveActions","sourceSelect","selectItem","_totalVisible","deselectAllElements","_collapseExtraExpandedFolders","updateElements","getPromptCount","fadeOutHelpers","showBatchPrompts","returnData","newParameterArray","choice","filename","force","apply","returnHelpersToDraggees","folderIds","sort","parentId","requestId","fileMoveList","newSourceKey","success","transferList","newFolderId","newFolderUid","merge","_performActualFolderMove","folderDeleteList","moveCallback","counter","limit","setInstanceState","refreshSources","_selectSourceByFolderId","$targetSource","_getSourceByKey","$parentSources","parents","$parentSource","selectSource","afterInit","style","addButton","PromptHandler","ProgressBar","options","url","fileInput","dropZone","events","fileuploadstart","_onUploadStart","fileuploadprogressall","_onUploadProgress","fileuploaddone","_onUploadSuccess","fileuploadalways","_onUploadAlways","fileuploadfail","_onUploadFailure","criteria","kind","allowedKinds","Uploader","isIndexBusy","getDefaultSourceKey","defaultSource","defaultSourceParts","volumeSource","toArray","s","subfolderSource","_getChildSources","_expandSource","onSelectSource","sourceKey","setParams","_updateUrl","$parent","nestedSources","$thisSource","getParentSource","unshift","uri","forEach","$s","setPath","m","startSearching","hideSidebar","floor","random","insertAfter","$search","$subContainer","setSelecetedSourceState","checked","getSelectedSourceState","marginBottom","stopSearching","complete","getViewParams","includeSubfolders","progress","loaded","total","setProgressPercentage","result","selectElementAfterUpdate","file","isLastUpload","_uploadFollowup","_updateAfterUpload","jqXHR","responseJSON","clearSearch","setSelectedSortAttribute","doFollowup","parameterIndex","followupAlways","incrementProcessedItemCount","updateProgressBar","followupSuccess","sourceAssetId","conflictingAssetId","targetFilename","followupFailure","onUpdateElements","_onUpdateElements","getAllElements","newElements","$newElements","removeAllItems","$elements","_onKeyDown","elementSelect","_onElementFocus","shiftKey","PreviewFileModal","openInstance","selfDestruct","$element","$focusedItem","_loadPreview","item","startingWidth","startingHeight","$outerContainer","$innerContainer","_$firstRowCells","$helperCells","$helperCell","$firstRowCell","$dropTarget","clearTimeout","dropTargetFolder","_hasSubfolders","_isExpanded","setTimeout","_expandFolder","dropTargetFolderId","$excludedSources","_collapseFolder","splice","getSourceActions","actions","onSelect","_createSubfolder","_renameFolder","destructive","_deleteFolder","menuOptions","onClick","ContextMenu","menuClass","$parentFolder","subfolderName","folderName","_prepareParentForChildren","$subfolder","folderUid","$a","_appendSubfolder","displayNotice","$targetFolder","folder","trim","_cleanUpTree","oldName","newName","initSourceToggle","$existingChildren","subfolderLabel","folderInserted","$existingChild","before","deinitSourceToggle","scrollTop","windowHeight","finalCallback","activeRequests","parameters","shift","registerElementIndexClass","AssetSelectInput","BaseElementSelectInput","hud","$uploadBtn","openPreviewTimeout","arguments","canUpload","_attachUploader","updateAddElementsBtn","$elementsContainer","openPreview","onAddElements","clearOpenPreviewTimeout","minGutter","formData","fieldId","sourceElementId","siteId","$addElementBtn","describedBy","multiple","csrfTokenName","csrfTokenValue","canAddMoreFiles","_onUploadComplete","next","enableAddElementsBtn","disableAddElementsBtn","selectUploadedFile","canAddMoreElements","$newElement","prepend","margin","outerWidth","animateCss","addElements","thumbSize","viewMode","appendHeadHtml","headHtml","slotsTaken","AssetSelectorModal","BaseElementSelectorModal","$selectTransformBtn","_selectedTransform","transforms","createSelectTransformButton","$btnGroup","$primaryButtons","$selectBtn","$menuList","MenuButton","MenuBtn","onOptionSelect","onSelectTransform","disable","onSelectionChange","$selectedElements","elementIndex","allowTransforms","enable","option","transform","selectImagesWithTransform","transformUrls","imageIdsWithMissingUrls","$item","showFooterSpinner","fetchMissingTransformUrls","hideFooterSpinner","selectElements","pop","info","elementInfo","canSelectImageTransforms","registerElementSelectorModalClass","AuthManager","remainingSessionTime","checkRemainingSessionTimer","showLoginModalTimer","decrementLogoutWarningInterval","showingLogoutWarningModal","showingLoginModal","logoutWarningModal","loginModal","$logoutWarningPara","$passwordInput","$loginBtn","$loginErrorPara","submitLoginIfLoggedOut","username","updateRemainingSessionTime","setCheckRemainingSessionTimer","seconds","checkRemainingSessionTime","extendSession","ajax","dataType","textStatus","timeout","minSafeSessionTime","showLogoutWarningModal","checkInterval","showLoginModal","submitLogin","hideLogoutWarningModal","hideLoginModal","quickShow","$form","$logoutBtn","$renewSessionBtn","prependTo","autoShow","closeOtherModals","hideOnEsc","hideOnShadeClick","shadeClass","onFadeIn","updateLogoutWarningMessage","setInterval","decrementLogoutWarning","time","secondsToHumanTimeDuration","clearInterval","quick","quickHide","$inputContainer","$inputsFlexContainer","$passwordContainer","$buttonContainer","$passwordWrapper","PasswordInput","onToggleInput","$newPasswordInput","logout","redirectTo","renewSession","validatePassword","removeAttr","login","clearLoginError","loginName","password","showLoginError","shake","initialized","idPrefix","instanceState","sourceStates","sourceStatesStorageKey","searchTimeout","$sidebar","showingSidebar","rootSourceKey","sourceViewModes","$rootSource","sourcesByKey","$visibleSources","$sourceActionsContainer","$sourceActionsBtn","$toolbar","toolbarOffset","$searchContainer","$filterBtn","searching","searchText","sortByScore","trashed","drafts","$clearSearchBtn","$statusMenuBtn","$statusMenuContainer","statusMenu","status","$siteMenuBtn","siteMenu","$updateSpinner","$viewModeBtnContainer","viewModeBtns","_autoSelectElements","$countSpinner","$countContainer","$actionsContainer","page","resultSet","totalResults","$exportBtn","actionsHeadHtml","actionsBodyHtml","$selectAllContainer","$selectAllCheckbox","showingActionTriggers","exporters","exportersByType","_$triggers","_ignoreFailedRequest","_cancelToken","viewMenus","activeViewMenu","filterHuds","randomString","getDefaultInstanceState","storageKey","getLocalStorage","toolbarSelector","menubtn","_handleStatusChange","$option","$options","_setSite","_handleSiteChange","defaultSiteId","getSiteId","$storedSiteOption","updateElementsIfSearchTextChanged","queryParams","getQueryParams","selector","selectOption","setQueryParam","selectDefaultSource","lastDashPos","lastIndexOf","substring","dir","setPage","pageNum","onAfterInit","_createCancelToken","axios","CancelToken","source","token","_cancelRequests","cancel","getSourceContainer","getSite","sites","_getSourcesInList","Select","multi","allowEmpty","vertical","_handleSourceSelectionChange","getQueryParam","getSourceByKey","refreshSourcesAction","expandedSources","indexOf","$toggle","_getSourceToggle","selectedSource","paths","path","getDefaultExpandedSources","updateSortField","storeInstanceState","setLocalStorage","getSourceState","defaultValue","viewState","k","hasOwnProperty","includes","storeSortAttributeAndDirection","getPageUrl","history","replaceState","_resetCount","updateSourceMenu","empty","groupedActions","administrative","group","_buildActionList","$ul","userIsAdmin","allowAdminChanges","createCustomizeSourcesModal","updateViewMenu","hideTrigger","ViewMenu","showTrigger","search","batchSize","canHaveDrafts","savedDraftsOnly","draftOf","condition","disabledElementIds","paginated","_isViewPaginated","getSortAttributeAndDirection","sortAttribute","sortDirection","order","collapsedElementIds","serialized","filters","preservePagination","pageChanged","updateElementsAction","cancelToken","$scrollContainer","_updateView","$elementContainer","getElementContainer","firstFocusableElement","e","showActionTriggers","_createTriggers","submitAction","actionParams","selectedElementIds","getSelectedElementIds","_findAction","viewParams","expandPostArray","elementAction","elementIds","download","downloadFromUrl","submitActionsAction","badgeCounts","_updateBadgeCounts","afterAction","actionClass","onAfterAction","hideActionTriggers","detach","updateActionTriggers","totalSelected","getEnabledElements","setStatus","getSelectedSortAttribute","attribute","getSortOption","getDefaultSort","getSelectedSortDirection","direction","setSortAttribute","sortOption","defaultDir","attributes","lastAttr","oldHistory","orderHistory","setSortDirection","setSelectedSortDirection","canSortByStructure","alt","getSortOptions","getSortLabel","getSelectedViewMode","parentsUntil","getRootSource","Object","keys","updateContentHeading","$firstOption","getViewModesForSource","sourceViewMode","$viewModeBtn","className","mode","icon","selectViewMode","doesSourceHaveViewMode","updateFilterBtn","urlParams","setUrl","getUrl","selectSourceByKey","sortOptions","o","defaultSort","getTableColumnOptions","getTableColumnOption","getDefaultTableColumns","getSelectedTableColumns","setSelectedTableColumns","tableColumns","updateTableColumnField","viewModes","createView","getViewClass","TableElementIndexView","ThumbsElementIndexView","rememberDisabledElementId","forgetDisabledElementId","enableElements","onEnableElements","disableElements","onDisableElements","getElementById","enableElementsById","makeArray","disableElementsById","getButtonContainer","isShowingSidebar","buttonContainer","CustomizeSourcesModal","onHide","onSelectSite","elements","$selectedItems","_handleActionTriggerSubmit","getPostData","_handleMenuActionTriggerSubmit","selectedOption","queryParam","firstSite","updateSourceVisibility","$heading","$headings","setSiteId","toString","_handleSelectionChange","_handleSourceDblClick","_toggleSource","_handleSourceToggleClick","prev","$list","topLevel","_collapseSource","$childSources","activeElement","document","_countResults","itemLabel","elementTypeNames","elementTypeName","toLowerCase","itemsLabel","elementTypePluralName","last","countLabel","items","$paginationContainer","totalPages","ceil","$paginationNav","$prevBtn","role","disabled","$nextBtn","appendBodyHtml","bodyHtml","selectAllElements","checkboxMode","body","contains","focus","selectElementById","$badge","countElementsAction","count","$btn","triggers","safeMenuActions","destructiveMenuActions","formatInputId","$menuTrigger","$safeList","_createMenuTriggerList","$destructiveList","$div","_showExportHud","typeOptions","$typeField","createSelectField","$formatField","$typeSelect","formattable","$limitField","createTextField","placeholder","$submitBtn","HUD","submitting","format","showFilterHud","FilterHud","showing","hasRules","$sortAttributeSelect","$sortDirectionPicker","sortDirectionListbox","$tableColumnsContainer","$revertContainer","$revertBtn","$closeBtn","_buildMenu","DisclosureMenu","tidyTableColumnField","FX_DURATION","$scoreOption","select","$lastContainer","lastIndex","$checkbox","$checkboxes","_getTableColumnCheckboxes","defaultOrder","map","column","reduce","obj","checkboxA","checkboxB","revert","$metaContainer","_createSortField","_createTableColumnsField","$footerContainer","_createRevertBtn","$sortAttributeSelectContainer","createSelect","Listbox","$selectedOption","$field","createField","fieldset","columns","createCheckbox","DragSort","_onTableColumnChange","$selectedCheckboxes","compare","loading","$clearBtn","cleared","$loadingContent","hudClass","$hud","$tip","hudHtml","$btnContainer","clear","setBusy","setReady","setFocus","elem","func","setFocusWithin","updateSizeAndPositionInternal","searchOffset","getBoundingClientRect","onShow","serialize","BaseElementIndexView","$loadingMoreSpinner","$scroller","thumbLoader","loadingMore","_morePending","_handleEnableElements","_handleDisableElements","setTotalVisible","setMorePending","ElementThumbLoader","load","isVerticalList","_handleElementEditing","isTouchCapable","maybeLoadMore","selectElement","selectAll","deselectAll","getTotalVisible","totalVisible","getMorePending","morePending","canLoadMore","loadMore","loadMoreElementsAction","getLoadMoreParams","appendElements","onAppendElements","off","elementSort","elementEditor","fieldLabel","_initialized","isPlainObject","normalizedSettings","args","modalStorageKey","maintainHierarchy","getContainer","getFieldLabel","getElementsContainer","getAddElementsBtn","getSpinner","initElementSelect","initElementSort","resetElements","getElements","$targetItem","getSelectedItems","ignoreHandleSelector","getElementSortAxis","collapseDraggees","magnetStrength","helperLagBase","resetItemOrder","updateButtonContainer","showSpinner","hideSpinner","focusNextLogicalElement","focusLastRemoveBtn","$removeBtns","removeElements","editable","_handleShowElementEditor","removeElement","BACKSPACE_KEY","DELETE_KEY","assign","elementSelectInput","prevalidate","replaceElement","replacementId","$existing","$nextDeleteBtn","lastElementIndex","onRemoveElements","$allElements","_animateStructureElementAway","animateElementAway","right","REMOVE_FX_DURATION","showModal","createModal","createElementSelectorModal","getModalSettings","sources","hideOnSelect","showSiteMenu","getDisabledElementIds","onModalSelect","onModalHide","triggerElement","modalTitle","modalSettings","allowSelfRelations","selectStructuredElements","slotsLeft","slice","updateDisabledElementsInModal","createNewElement","appendElement","animateElementIntoPlace","onSelectElements","disableCancelBtn","disableSelectBtn","containerId","branchLimit","selectionLabel","onResponse","enableCancelBtn","enableSelectBtn","$newElementsContainer","filteredElements","clone","removeText","setElementSize","single","$modalElement","$inputElement","origOffset","destOffset","$helper","zIndex","ADD_FX_DURATION","$li","editorSettings","supportSidebarToggleView","$content","$sourceToggles","$sidebarToggleBtn","$sidebarCloseBtn","$mainHeading","$secondaryButtons","$headingId","fullscreen","updateModalBottomPadding","footerHeight","updateSidebarView","sidebarShouldBeHidden","buildSidebarToggleView","resetView","$mainHeader","$sidebarHeader","getActiveSourceName","toggle","controls","closeSidebar","toggleSidebar","sidebarIsOpen","openSidebar","uiLayerManager","addLayer","registerShortcut","ESC_KEY","$focusedEl","getFocusedElement","removeLayer","_createElementIndex","updateSelectBtnState","updateHeading","clearMouseUpTimeout","disableElementsOnSelect","bodyAction","createElementIndex","indexSettings","touchData","firstTap","secondTap","resizable","onCancel","BaseInputGenerator","listening","startListening","setNewSource","stopListening","onSourceTextChange","updateTarget","onTargetTextChange","onFormSubmit","is","sourceVal","targetVal","generateTargetValue","dispatchEvent","InputEvent","inputType","Event","selectFullValue","CategoryIndex","editableGroups","$newCategoryBtnGroup","$newCategoryBtn","updateButton","editableCategoryGroups","g","uid","defaultGroupHandle","selectedSourceHandle","$menuBtn","selectedGroup","menuId","visibleLabel","ariaLabel","isCtrlKeyPressed","originalEvent","button","open","_createCategory","$menuContainer","anchorRole","href","groupId","location","cpEditUrl","fresh","groupSourceKey","CategorySelectInput","selectedCategoryIds","categoryIds","$allCategories","_animateCategoryAway","charts","DataTable","rows","cellIndex","parseTime","d3","timeParse","Tip","setContent","setPosition","BaseChart","$chart","chartBaseClass","dataTable","formatLocale","timeFormatLocale","orientation","svg","globalSettings","formats","d3Formats","formatLocaleDefinition","d3FormatLocaleDefinition","timeFormatLocaleDefinition","d3TimeFormatLocaleDefinition","resize","baseSettings","draw","chartClass","onAfterDrawTicks","tickKey","tick","$tickText","numberFormat","percentFormat","currencyFormat","shortDateFormats","day","month","year","bottom","colors","Area","tip","drawingArea","getChartMargin","translateX","translateY","drawTicks","drawAxes","drawChart","drawTipTriggers","getX","xAxis","axisBottom","tickFormat","getXFormatter","ticks","call","yAxis","getY","axisLeft","getYFormatter","tickValues","getYTickValues","axisRight","showAxis","tickSizeOuter","gridlines","xLineAxis","tickSize","yLineAxis","line","datum","area","y0","y1","plots","enter","tips","chartMargin","xAxisTickInterval","node","getTotalLength","tipTriggerWidth","$xValue","$yValue","content","values","yTicksMaxWidth","computedTickWidth","formatter","padded","xDomainMin","xDomainMax","xDomain","scaleTime","range","domain","yDomain","getYMaxValue","scaleLinear","utils","getTimeFormatter","getNumberFormatter","maxValue","getDuration","secondsNum","hours","minutes","chartSettings","dataScale","ColorInput","$input","$colorContainer","$colorPreview","$colorInput","createColorInput","handleTextChange","input","createElement","setAttribute","updateColor","repeat","_browserSupportsColorInputs","doesBrowserSupportColorInputs","CpScreenSlideout","Slideout","namespace","showingLoadSpinner","hasTabs","hasCpLink","hasSidebar","$header","$tabContainer","$loadSpinner","$editLink","$sidebarBtn","$noticeContainer","tabManager","ignoreFailedRequest","fieldsWithErrors","ltr","showSidebar","$contents","containerElement","containerAttributes","method","novalidate","closeOnEsc","closeOnShadeClick","S_KEY","ctrl","handleSubmit","closeMeMaybe","refreshInitialData","showLoadSpinner","getParams","headers","requestOptions","update","deltaNames","initialDeltaValues","hideLoadSpinner","updateHeaderVisibility","forceShow","showHeader","submitButtonLabel","updateTabs","tabs","formAttributes","setElementAttributes","editUrl","sidebar","hostname","notice","Tabs","_closedSidebarStyles","offsetWidth","_openedSidebarStyles","one","trapFocusWithin","showSubmitSpinner","hideSubmitSpinner","submit","findDeltaData","handleSubmitResponse","handleSubmitError","clearErrors","notificationSettings","modelName","closeOnSubmit","close","isAxiosError","errors","showErrors","entries","fieldErrors","addErrorsToField","clearErrorsFromField","isDirty","isOpen","rxhtmlTag","jQuery","htmlPrefilter","navHeight","arr","isArray","grouped","thisKey","category","translations","formatMessage","pattern","tokens","_tokenizePattern","_parseToken","start","pos","depth","chars","param","arg","number","formatNumber","plural","selectorChars","p","formatDate","date","datepicker","datepickerOptions","dateFormat","shortcutText","clientOs","str","escapeRegex","getText","encodeUriComponent","encodeURIComponent","differences","chr","re","RegExp","setSelectionRange","inputName","rtrim","baseUrl","anchor","anchorPos","fromEntries","URLSearchParams","qsPos","isEmptyObject","pathParam","pathMatch","omitScriptNameInUrls","usePathInfo","scriptName","getCpUrl","baseCpUrl","getSiteUrl","baseSiteUrl","actionUrl","hash","origin","pathname","qs","pageTrigger","pageParam","getCsrfInput","postActionRequest","contentType","_actionHeaders","errorThrown","readyState","send","registeredAssetBundles","registeredJsFiles","toUpperCase","actionName","namespaceInputName","v","getTime","request","sendApiRequest","_getApiHeaders","apiHeaders","baseURL","baseApiUrl","apiParams","_apiHeaders","processCraftHeaders","httpProxy","proxy","apiResponse","_processApiHeaders","_loadingApiHeaders","_apiHeaderWaitlist","_rejectApiRequests","clearCachedApiHeaders","XMLHttpRequest","setRequestHeader","responseType","onload","disposition","getResponseHeader","matches","exec","blob","Blob","link","URL","createObjectURL","appendChild","click","removeChild","stringToArray","oldData","newData","modifiedDeltaNames","groupedOldParams","_groupParamsByDeltaNames","groupedNewParams","__root__","n","concat","withRoot","initialValues","encodeURIComponentExceptEqualChar","decodeURIComponent","paramLoop","paramName","serializeParam","subName","expanded","parentElem","createForm","chunks","obj1","obj2","sortObjectKeys","Array","getObjectKeys","escapeChars","escaped","ltrim","startsWith","substr","filterArray","filtered","removeFromArray","getLast","uppercaseFirst","charAt","lowercaseFirst","parseUrl","scheme","host","port","query","Proxy","searchParams","isSameHost","requestUrlInfo","urlInfo","showSeconds","secondsInWeek","weeks","days","timeComponents","asciiString","charMap","normalize","char","asciiStr","asciiCharMap","uuid","crypto","randomUUID","getRandomValues","Uint8Array","namespaceId","createErrorList","$existingCss","existingCss","regexp","$existingJs","src","existingJs","appendFootHtml","infoicon","checkboxselect","fieldtoggle","lightswitch","nicetext","formsubmit","datetime","datetimeinput","_elementIndexClasses","_elementSelectorModalClasses","_elementEditorClasses","registerElementEditorClass","ElementEditorSlideout","systemUid","localStorage","parse","removeLocalStorage","removeItem","getCookie","cookie","setCookie","defaultCookieOptions","maxAge","expires","toUTCString","secure","removeCookie","hasThumb","otherSize","$oldImg","$newImg","sizes","srcset","picturefill","submitForm","redirect","retainScroll","scrollY","filterInputVal","regex","selectionStart","newVal","filterNumberInputVal","dataAttributes","subValue","isVisible","visibilityState","useMobileStyles","pageId","BroadcastChannel","channelName","appId","messageReceiver","addEventListener","instances","elementHtml","$replacement","$inputs","fn","animateLeft","easing","animateRight","$elem","itemSelector","cols","maxCols","minColWidth","fillMode","colClass","snapToGrid","Grid","InfoIcon","CheckboxSelect","FieldToggle","settingName","settingValue","thisSettings","indeterminateValue","LightSwitch","NiceText","$anchor","customTrigger","menuAnchor","$wrapper","checkValue","hasValue","charsLeftHtml","charsLeft","ready","$elementIndexSourcesContainer","$sourcesContainer","$sourcesHeader","$sourcesHeading","$sourceSettingsContainer","$sourceSettingsHeader","$addSourceMenu","addSourceMenu","$footerBtnContainer","$loadingSpinner","sourceSort","baseSortOptions","availableTableAttributes","customFieldAttributes","conditionBuilderHtml","conditionBuilderJs","userGroups","setContainer","buildModal","defaultSortOptions","addSource","$menuBtnContainer","sourceData","scrollContainerToElement","$newHeadingBtn","focusLabelInput","$newCustomSourceBtn","tableAttributes","$labelInput","getSourceName","focusIsInside","currentLayer","isNew","$itemLabel","$itemInput","Heading","updateItemLabel","heading","Source","CustomSource","save","disabledSourceKeys","reload","appendIndexSourceItem","$sourceItem","$lastSourceItem","isHeading","$lastTopLevelSource","BaseSource","$settingsContainer","handleActivatingKeypress","isNative","isSelected","deselect","createSettings","getIndexSourceItem","$sortDirectionInput","createLightswitchField","createSortField","createTableAttributesField","handleSortAttributeChange","useDefaultDir","$columnCheckboxes","selectedAttributes","createTableColumnOption","instructions","$labelField","defaultId","swapPlaceholders","createCheckboxSelectField","showAllOption","handleLabelInputChange","table","$rows","getHelper","caboose","Y_AXIS","$helperRow","helperClass","$cells","DeleteUserModal","userId","$deleteActionRadios","$deleteSubmitBtn","userSelect","_deleting","idParam","contentSummary","_submitBtnLabel","validateDeleteInputs","withContent","num","validates","onSubmit","DynamicGenerator","EditableTable","baseName","biggestId","$addRowBtn","$tableParent","$statusMessage","rowCount","hasMaxRows","hasMinRows","radioCheckboxes","copyDraggeeInputValuesToHelper","updateAllRows","initialize","initializeIfVisible","minRows","createRowObj","updateAddRowButton","canAddRow","staticRows","updateRow","canDeleteRow","updateDeleteRowButton","rowId","updateStatusMessage","allowDelete","deleteRow","$tr","onDeleteRow","allowAdd","maxRows","rowIdPrefix","createRow","defaultValues","onAddRow","allowReorder","Row","focusOnPrevRow","tdIndex","blurTd","prevRow","$prevTr","$tds","focusOnNextRow","nextRow","$nextTr","importData","lines","j","textualColTypes","colId","$cell","col","scope","code","small","createDateInput","createLightswitch","createTimeInput","createTextInput","niceTexts","tds","$textareas","tr","td","$textarea","textareasByColId","onHeightChange","onTextareaHeightChange","radioMode","applyToggleCheckbox","autopopulate","HandleGenerator","allowNonAlphaStart","onTextareaFocus","onRadioCheckboxChange","checkbox","checkboxColId","neg","checkboxCol","colum","ignoreNextTextareaFocus","handleKeypress","charCode","handlePaste","clipboardData","getData","validateValue","safeValue","tallestTextareaHeight","tdHeight","numericKeyCodes","ElementActionTrigger","maxLevels","newChildUrl","triggerEnabled","batch","bulk","defineProperty","activate","updateTrigger","validateSelection","enableTrigger","disableTrigger","valid","handleTriggerActivation","ElementEditor","isFullPage","$contentContainer","$revisionBtn","$revisionLabel","$expandSiteStatusesBtn","$statusIcon","$previewBtn","$editMetaBtn","metaHud","$nameTextInput","$saveMetaBtn","$siteStatusPane","$globalLightswitch","$siteLightswitches","$additionalSiteField","siteIds","newSiteIds","enableAutosave","lastSerializedValue","listeningForChanges","pauseLevel","queue","submittingForm","duplicatedElements","failed","httpStatus","httpError","openingPreview","preview","activatedPreviewToken","previewTokenQueue","previewLinks","hiddenTipsStorageKey","tipDismissBtn","slideout","$primaryForm","_createQueue","autosaveDrafts","siteStatuses","$spinnerContainer","canEditMultipleSites","previewTargets","enablePreview","$previewBtnContainer","createPreviewLink","createShareMenu","revisionId","serializeForm","isProvisionalDraft","initForProvisionalDraft","isUnpublishedDraft","initForDraft","canSaveCanonical","saveShortcut","createDraft","listenForChanges","showStatusHud","handleDismissibleTips","canonicalId","canCreateDrafts","statusIcons","checkForm","stopListeningForChanges","$discardButton","initialHeight","$notice","heightDiff","hashedCpEditUrl","provisional","createEditMetaBtn","expandSiteStatuses","$enabledForSiteField","_getOtherSupportedSites","_createSiteStatusField","$globalField","_showField","siteStatusValues","hasEnabled","hasDisabled","originalEnabledValue","originalSerializedStatus","enabledForSite","_updateGlobalStatus","serializedStatuses","additionalSites","_createAddlSiteField","_updateSiteStatuses","_removeField","allEnabled","allDisabled","turnOn","turnOff","turnIndeterminate","enabled","site","fieldClass","$lightswitch","some","selectLabelId","$addlSiteSelectLabel","$addlSiteSelectContainer","labelledBy","$addlSiteSelect","addlSiteInfo","enabledByDefault","_saveFailMessage","_saveSuccessMessage","$mainContainer","spinners","statusMessage","getTokenizedPreviewUrl","targetUrl","targetLabel","activatePreviewToken","updatePreviewLinks","updatePreviewLinkHref","isLive","getPreviewTokenParams","previewToken","getPreviewToken","randoParam","asPromise","siteToken","previewUrl","tokenParam","createTokenParams","getPreview","$statusIcons","scrollTo","ensureIsDraftOrRevision","onlyIfChanged","removeActionParams","isPreviewActive","$editor","redirectName","saveDraft","isActive","modifiedFieldNames","preparedData","prepareData","deltaName","extraData","visibleLayoutElements","selectedTabId","_saveHeaders","_afterSaveDraft","createdProvisionalDraft","docTitle","draftName","revisionMenu","oldId","siteSettings","creator","timestamp","updatePreviewTargets","checkMetaValues","selectors","modifiedAttributes","$fields","noChanges","$allTabContainers","changedElements","missingElements","tabInfo","$oldElement","$placeholder","$unusedTabContainers","afterUpdate","_showFailStatus","setStatusMessage","deltaCallback","swapDuplicatedElementIds","idsRE","namespacedFields","pre","post","duplicate","_filterFieldInputName","nestedNames","lastHandle","fieldsWithoutContent","newTarget","$previewLink","delay","showMetaHud","createMetaHud","onMetaHudShow","$hudBody","$nameField","$nameInputContainer","saveMeta","onMetaHudHide","onMetaHudEscape","shakeMetaHud","autosave","$confirmUnloadForms","hideTip","getHiddenTipsUids","setHiddenTipsUids","uids","targetElement","$targetParent","layoutElementUid","Storage","hiddenTips","editor","saveParams","onSaveElement","validators","ElementFieldSettings","allowMultipleSources","$maintainHierarchyField","$maintainHierarchyInput","$sourcesField","$sourceSelect","$branchLimitField","$maxRelationsField","$minRelationsField","maintainHierarchyFieldId","sourcesFieldId","branchLimitFieldId","minRelationsFieldId","maxRelationsFieldId","updateLimitFields","updateMaintainHierarchyField","showField","$checkedInputs","workers","Worker","$thumbs","$thumb","$scrollParent","scrollParent","addToQueue","invisibleThumbs","thumb","active","loadNext","scrollParentOffset","scrollParentHeight","thumbOffset","retryAll","loader","$img","ElevatedSessionForm","inputs","form","getInputPostVal","handleFormSubmit","elevatedSessionManager","fetchingTimeout","stopImmediatePropagation","inputsChanged","$currentInput","requireElevatedSession","ElevatedSessionManager","passwordModal","$errorPara","minSafeElevatedSessionTimeout","showPasswordModal","$passwordModal","focusPasswordInput","submitPassword","currentPassword","showPasswordError","EntryIndex","publishableSections","$newEntryBtnGroup","$newEntryBtn","defaultSectionHandle","selectedSection","section","_createEntry","sectionId","entry","sectionSourceKey","FieldLayoutDesigner","$configInput","$newTabBtn","$libraryToggle","$selectedLibrary","$fieldLibrary","$uiLibrary","$uiLibraryElements","$fieldSearch","$clearFieldSearchBtn","$fieldGroups","tabGrid","elementDrag","_config","$workspace","$fieldSearchContainer","initTab","ElementDrag","customizableTabs","tabDrag","TabDrag","customizableUi","$libraryPicker","$matches","$group","Tab","removeFieldByHandle","addTab","updatePositionInConfig","config","updateConfig","createSlideout","contents","js","eval","designer","destroyed","settingsNamespace","createMenu","initElement","menuBtn","onTabOptionSelect","$prev","$next","settingsHtml","settingsJs","applySettings","$indicator","hasConditions","Element","findIndex","designerConfig","newIndex","tabConfig","oldIndex","isField","requirable","hasCustomWidth","hasSettings","isRequired","showSettings","initUi","SlidePicker","step","valueLabel","pct","$fieldsContainer","selectorHtml","updateRequiredClass","required","elementConfig","BaseDrag","Drag","$insertion","showingInsertion","$caboose","findItems","createInsertion","createCaboose","removeCaboose","swapDraggeeWithInsertion","swapInsertionWithDraggee","setMidpoints","getClosestItem","_closestItem","_closestItemMouseDiff","_i","_$item","_midpoint","_mouseDiff","getDist","checkForNewClosestItem","refreshCols","display","draggeeDisplay","visibility","helpers","_showDraggee","onDrag","draggingLibraryElement","draggingField","originalTab","isDraggeeMandatory","isHoveringOverTab","hitTest","$fieldContainers","$libraryElement","targetPrefix","reverseTargetSelector","_$reverseTarget","getType","normalizeTargetSelector","findTargets","onToggleChange","nodeName","getToggleVal","boolean","postVal","_show","totalCols","colGutterDrop","colPctWidth","possibleItemColspans","possibleItemPositionsByColspan","itemPositions","itemColspansByPosition","layouts","layout","itemHeights","leftPadding","_refreshingCols","_refreshColsAfterRefresh","_forceRefreshColsAfterRefresh","handleContainerHeightProxy","setItems","oldHeight","scrollHeight","gutter","itemIndex","tallestItemHeight","colIndex","itemHeight","remainder","itemHeightsByColspan","positionRight","positionLeft","minColspan","maxColspan","colspan","getItemWidthCss","minPosition","maxPosition","colHeights","createLayouts","layoutTotalCols","highestTotalCols","layoutHeights","shortestHeight","shortestLayouts","emptySpaces","emptySpace","colspans","getItemLeftPosCss","positions","isSimpleLayout","positionItems","completeRefreshCols","onRefreshCols","getItemWidth","getItemWidthInPx","getItemLeftPosInPx","prevPositions","prevColspans","prevColHeights","prevEmptySpace","LayoutGenerator","endingCol","affectedColHeights","onItemResize","newHeight","tallestColHeightsByPosition","colHeightsForPosition","tallestColHeight","words","handleCasing","ImageUpload","initImageUpload","containerSelector","uploadAction","postParameters","fileInputSelector","uploadParamName","initButtons","uploadButtonSelector","deleteButtonSelector","refreshImage","onAfterRefreshImage","$icon","$liveRegion","wrap","previousSibling","nodeType","Node","TEXT_NODE","nodeValue","showHud","closeOtherHUDs","indeterminate","dragger","dragStartMargin","outerContainer","X_AXIS","_onDrag","_onDragStop","muteEvent","changed","_onSettle","_getOffMargin","_onMouseDown","_onMouseUp","dragging","_getMargin","mouseDistX","selectedOptionIndex","selectedClass","focusClass","LivePreview","$extraFields","$dragHandle","$previewContainer","$iframeContainer","$iframe","$fieldPlaceholder","basePostData","inPreviewMode","fields","lastPostData","updateIframeInterval","checkAgain","dragStartEditorWidth","_slideInOnIframeLoad","_scrollX","_scrollY","_editorWidth","_editorWidthInPx","protocol","previewParams","extraFields","defaultEditorWidth","moveFieldsBack","editorWidthInPx","inPx","minEditorWidthInPx","exit","$editorHeader","handleWindowResize","getIframeWidth","$clone","_getClone","updateIframe","slideIn","createToken","previewAction","submitPrimaryForm","updateWidths","$newClone","field","contentWindow","scrollLeft","xhrFields","withCredentials","crossDomain","handleSuccess","handleError","forceUpdateIframe","write","copyInputValues","livePreview","$textInput","$showPasswordToggle","showingPassword","passwordInput","initInputFocusEvents","hidePassword","setCurrentInput","updateToggleLabel","showPassword","autocapitalize","togglePassword","onInputChange","selectionEnd","$previewWrapper","$previewSkipLink","$bumperLink","$notifier","$previewHeader","$targetBtn","$targetMenu","$deviceTypeContainer","$orientationBtn","$refreshBtn","$deviceMask","$devicePreviewContainer","iframeLoaded","$tempInput","activeTarget","currentDeviceType","deviceOrientation","deviceWidth","deviceHeight","deviceMaskDimensions","phone","tablet","iframeHeight","_updateIframeProxy","previewSkipLinkText","$modalLabel","Pro","switchTarget","_buildDeviceTypeFieldset","_getDeviceTypeTranslation","translation","_getDeviceOrientationTranslation","deviceType","deviceBtnGroup","switchDeviceType","_activeTarget","_autoRefresh","previewTarget","hideModalBackgroundLayers","resetModalBackgroundLayerVisibility","_devicePreviewIsActive","updateDevicePreview","_useIframeResizer","previewIframeResizerOptions","resetScroll","sameHost","frameborder","iFrameResize","checkOrigin","scrolling","onInit","iframe","_updateNotifier","newDeviceType","switchOrientation","hZoom","wZoom","previewHeight","previewWidth","maskHeight","maskWidth","translate","rotationDeg","marginTop","marginLeft","$triggerElement","$bumperButtonStart","$bumperButtonEnd","defaultSettings","_onHide","instance","loadAsset","focusItem","_addBumperButtons","_addModalName","headingId","destruct","desiredHeight","desiredWidth","containerHeight","containerWidth","_resizeContainer","previewHtml","$innerProgressBar","$progressBarStatus","_itemCount","_processedItemCount","_displaySteps","displaySteps","setProcessedItemCount","fadeTo","incrementItemCount","percentage","$modalContainerDiv","$prompt","$promptApplyToRemainingContainer","$promptApplyToRemainingCheckbox","$promptApplyToRemainingLabel","$pomptChoices","_prompts","_promptBatchCallback","_promptBatchReturnData","_promptBatchNum","_showNextPromptInBatch","remainingInBatch","_showPrompt","_handleBatchPromptSelection","applyToRemaining","choiceData","itemsToGo","_promptCallback","$promptMessage","$promptChoices","$promptButtons","$radioButton","_selectPromptChoice","fadeOut","_cancelPrompt","running","paused","pausedForVisibility","jobs","isPaused","_resume","job","_add","qResolve","qReject","_exec","totalSteps","HOME_KEY","END_KEY","_min","_max","Number","isInteger","prevAll","triggerEvent","$activeButton","startPositionX","graduationsMin","graduationsMax","slideMin","slideMax","$overlay","$cursor","$graduations","$graduationsUl","_handleResize","_handleTapStart","_handleTapMove","_handleTapEnd","_handleKeypress","graduationsCalculatedWidth","valueToPosition","current","PAGE_UP_KEY","PAGE_DOWN_KEY","touch","startLeft","curX","positionToValue","scaleMin","scaleMax","addModalAttributes","autoOpen","setTriggerElement","_cancelTransitionListeners","addPanel","removePanel","openPanels","panel","updateStyles","totalPanels","SlugGenerator","allowUppercaseInSlug","limitAutoSlugsToAscii","XRegExp","matchChain","slugWordSeparator","Structure","structureDrag","$parents","initToggle","StructureDrag","initNewChildMenus","viewStateKey","$addBtns","onNewChildMenuClick","showMenu","getIndent","level","baseIndent","nestedIndent","addElement","$parentUl","_removeUl","structure","draggeeLevel","$helperLi","$targets","draggeeHeight","$level","cancelDrag","$lis","$closestTarget","closestTargetPos","closestTargetYDiff","closestTargetOffset","closestTargetHeight","targetOffset","targetHeight","targetYMidpoint","targetYDiff","$closestTargetLi","closestTargetLevel","$nextTargetLi","nextTargetLevel","hoveringBetweenRows","draggeeX","targetItemMouseDiffX","$parentLis","$closestParentLi","closestParentLiXDiff","closestParentLevel","$parentLi","parentLiX","parentLiXDiff","parentLevel","onMouseUp","$draggeeParent","moved","$closestSiblings","newLevel","setLevel","structureId","prevId","indent","$childLis","StructureTableSorter","tableView","_basePadding","_helperMargin","_$titleHelperCell","_titleHelperCellOuterWidth","_ancestors","_updateAncestorsFrame","_draggeeLevel","_draggeeLevelDelta","draggingLastElements","_loadingDraggeeLevelDelta","_targetLevel","_targetLevelBounds","_positionChanged","singleHelper","helperSpacingY","findDraggee","$nextRow","nextRowLevel","nextRowLevelDelta","_getAjaxBaseData","delta","drag","canInsertBefore","_getLevelBounds","canInsertAfter","_getAncestors","_setTargetLevelBounds","_updateIndent","onInsertionPointChange","_updateAncestorsBeforeRepaint","levelDiff","padding","_getLevelIndent","$prevRow","prevRowLevel","$spinnerRow","_createSpinnerRowAfter","onPositionChange","_expandElement","onReturnHelpersToDraggees","newDraggeeIndexes","oldDraggeeIndexes","$postDraggeeItems","nextAll","_minLevel","_maxLevel","forcePositionChange","_mouseDist","realMouseX","mousedownX","_indentationDist","LEVEL_INDENT","_targetLevelMouseDiff","_magnetImpact","MAX_GIVE","_closestLevelMagnetIndent","targetLevel","_level","_$prevRow","cancelAnimationFrame","_updateAncestors","_$ancestor","_newAncestors","ancestorTitle","HELPER_MARGIN","$tableCaption","$selectedSortHeader","structureTableSort","_totalVisiblePostStructureTableDraggee","_morePendingPostStructureTableDraggee","_broadcastListener","initTableHeaders","_updateScreenReaderStatus","_collapseElement","attributeHtml","selectedSortAttr","$tableHeaders","sortValue","selectedSortDir","makeColumnSortable","sorted","headerHtml","$instructions","$headerButton","_handleSelectedSortHeaderClick","_handleUnselectedSortHeaderClick","_isStructureTableDraggingLastElements","positionedAfter","updateResponsiveTables","$nextNextRow","descendantOf","$nextRows","newSortDir","_handleSortHeaderClick","_updateTableAttributes","removeEventListener","$tablist","$firstTab","$lastTab","$selectedTab","$focusableTab","selectTab","makeTabFocusable","scrollToTab","updateMenuBtn","_getTab","deselectTab","elemScrollOffset","targetScrollLeft","tabWidth","ulWidth","HTMLElement","TagSelectInput","searchMenu","$addTagInput","_ignoreBlur","searchForTags","selectTag","$hoverOption","$nextOption","focusOption","$prevOption","killSearchMenu","excludeIds","tagGroupId","tags","exclude","exactMatch","Menu","attachToElement","targetSiteId","$titleContainer","autocomplete","inputmode","maxlength","autofocus","getAutofocusValue","getDisabledValue","readonly","showCharsLeft","createCopyTextInput","buttonId","execCommand","createCopyTextBtn","copyValue","createCopyTextField","createCopyTextPrompt","createTextarea","createTextareaField","$select","optgroup","$optgroup","selected","reverseToggle","for","createCheckboxField","createCheckboxSelect","allValue","allChecked","allLabel","labelId","$colorPreviewContainer","createColorField","isMobile","getMonth","toISOString","timezone","defaultDate","hasOuterContainer","createDateField","createDateRangePicker","today","getFullYear","getDate","startDate","endDate","$allOption","firstDayOffset","getDay","firstDay","$flex","$startDate","$endDate","$dateInputs","dpDiv","setPositionRelativeToAnchor","startTime","endTime","foundOption","btnClasses","timepicker","timepickerOptions","getHours","getMinutes","getSeconds","createTimeField","warning","$warning","addErrorsToList","$errors","_rejectedFiles","_extensionList","_totalFileCounter","_validFileCounter","autoUpload","fileupload","onFileAdd","paramObject","getInProgress","validateExtension","_createExtensionList","process","done","files","pass","fileExtension","maxFileSize","originalFiles","processErrorMessages","kinds","humanFileSize","maxUploadSize","bytes","threshold","u","toFixed","allowedKind","fileKinds","extensions","ext","pasteZone","sequentialUploads","Accept","UriFormatGenerator","uriFormat","suffix","UserIndex","updateUrl","defaultSourceSlug","slug","__esModule","default","module","locals","exports","listToStyles","list","styles","newStyles","part","media","sourceMap","parts","hasDocument","DEBUG","Error","stylesInDom","head","getElementsByTagName","singletonElement","singletonCounter","isProduction","ssrIdKey","isOldIE","navigator","userAgent","addStylesClient","_isProduction","_options","addStylesToDom","newList","mayRemove","domStyle","refs","addStyle","createStyleElement","styleElement","querySelector","parentNode","styleIndex","applyToSingletonTag","applyToTag","newObj","textStore","replaceText","replacement","Boolean","styleSheet","cssText","cssNode","createTextNode","childNodes","ssrId","btoa","unescape","firstChild","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","getter","definition","enumerable","prototype","CP","authManager","$nav","$navToggle","$globalSidebar","$globalContainer","$alerts","$crumbs","$breadcrumbList","$breadcrumbItems","$notificationContainer","$headerContainer","$mainContent","$details","$sidebarContainer","$sidebarToggle","$edition","$deltaForms","$collapsibleTables","fixedHeader","breadcrumbListWidth","breadcrumbDisclosureItem","enableQueue","totalJobs","jobInfo","displayedJobInfo","displayedJobInfoUnchanged","trackJobProgressTimeout","jobProgressIcon","checkingForUpdates","forcingRefreshOnUpdatesCheck","includingDetailsOnUpdatesCheck","checkForUpdatesCallbacks","resizeTimeout","$allInstructions","updateFixedHeader","setSidebarNavAttributes","initSpecialForms","initAlerts","shortcuts","shortcut","initTabs","LOCATION_HASH","_handleInputFocus","_handleInputBlur","announcements","$unreadMessage","hasUnreads","unread","footer","IntersectionObserver","classList","intersectionRatio","rootMargin","observe","$contentHeader","$forms","confirmUnload","returnValue","updateSidebarMenuLabel","toggleNav","isExpanded","navIsExpanded","disableGlobalSidebarLinks","enableGlobalSidebarLinks","focusableItems","isAlwaysVisible","getComputedStyle","getPropertyValue","newState","toggleClass","$tabsContainer","$tabsList","selectedTabIndex","handleBreadcrumbVisibility","breadcrumbItemsWrap","listWidth","totalItemWidth","finalIndex","visibleItemWidth","shownItems","hiddenItems","_$table","_containerWidth","_check","_isCollapsed","headerHeight","displayNotification","notification","Notification","notificationType","iconLabel","fetchAlerts","alerts","displayAlerts","$shunnableAlerts","$link","checkForUpdates","forceRefresh","includeDetails","realCallback","_checkForUpdates","updateUtilitiesBadge","callbacks","updateInfo","_getUpdates","_checkForCachedUpdates","cached","onlyIfCached","updates","_cacheUpdates","$utilitiesLink","$screenReaderText","badgeCount","runQueueAutomatically","trackJobProgress","_trackJobProgressInternal","setJobInfo","oldInfo","getDisplayedJobInfo","progressLabel","updateJobIcon","statuses","JOB_STATUS_RESERVED","JOB_STATUS_FAILED","JOB_STATUS_WAITING","JobProgressIcon","hideFailMode","setDescription","description","setProgress","showFailMode","cpTrigger","notificationDuration","JOB_STATUS_DONE","closing","closeTimeout","_preventDelayedClose","originalActiveElement","$closeBtnContainer","details","_negMargin","_initDelayedClose","delayedClose","preventDelayedClose","$progressLabel","failMode","_$bgCanvas","_$staticCanvas","_$hoverCanvas","_$failCanvas","_staticCtx","_hoverCtx","_canvasSize","_arcPos","_arcRadius","_lineWidth","_arcStartPos","_arcEndPos","_arcStartStepSize","_arcEndStepSize","_arcStep","_arcStepTimeout","_arcAnimateCallback","_progressBar","canAccessQueueManager","$canvasContainer","$labelContainer","_createCanvas","getContext","_drawArc","_animateArc","_setArc","color","$canvas","ctx","strokeStyle","lineWidth","lineCap","startPos","endPos","clearRect","beginPath","arc","closePath","targetStartPos","targetEndPos","_takeNextArcStep"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"cp.js","mappings":"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","sources":["webpack:///./js/Accordion.js","webpack:///./js/AddressesInput.js","webpack:///./js/AdminTable.js","webpack:///./js/AssetImageEditor.js","webpack:///./js/AssetIndex.js","webpack:///./js/AssetSelectInput.js","webpack:///./js/AssetSelectorModal.js","webpack:///./js/AuthManager.js","webpack:///./js/BaseElementIndex.js","webpack:///./js/BaseElementIndexView.js","webpack:///./js/BaseElementSelectInput.js","webpack:///./js/BaseElementSelectorModal.js","webpack:///./js/BaseInputGenerator.js","webpack:///./js/CategoryIndex.js","webpack:///./js/CategorySelectInput.js","webpack:///./js/Chart.js","webpack:///./js/ColorInput.js","webpack:///./js/CpScreenSlideout.js","webpack:///./js/Craft.js","webpack:///./js/CustomizeSourcesModal.js","webpack:///./js/DataTableSorter.js","webpack:///./js/DeleteUserModal.js","webpack:///./js/DynamicGenerator.js","webpack:///./js/EditableTable.js","webpack:///./js/ElementActionTrigger.js","webpack:///./js/ElementEditor.js","webpack:///./js/ElementEditorSlideout.js","webpack:///./js/ElementFieldSettings.js","webpack:///./js/ElementThumbLoader.js","webpack:///./js/ElevatedSessionForm.js","webpack:///./js/ElevatedSessionManager.js","webpack:///./js/EntryIndex.js","webpack:///./js/FieldLayoutDesigner.js","webpack:///./js/FieldToggle.js","webpack:///./js/Grid.js","webpack:///./js/HandleGenerator.js","webpack:///./js/ImageUpload.js","webpack:///./js/InfoIcon.js","webpack:///./js/LightSwitch.js","webpack:///./js/Listbox.js","webpack:///./js/LivePreview.js","webpack:///./js/PasswordInput.js","webpack:///./js/Preview.js","webpack:///./js/PreviewFileModal.js","webpack:///./js/ProgressBar.js","webpack:///./js/PromptHandler.js","webpack:///./js/Queue.js","webpack:///./js/SlidePicker.js","webpack:///./js/SlideRuleInput.js","webpack:///./js/Slideout.js","webpack:///./js/SlugGenerator.js","webpack:///./js/Structure.js","webpack:///./js/StructureDrag.js","webpack:///./js/StructureTableSorter.js","webpack:///./js/TableElementIndexView.js","webpack:///./js/Tabs.js","webpack:///./js/TagSelectInput.js","webpack:///./js/ThumbsElementIndexView.js","webpack:///./js/UI.js","webpack:///./js/Uploader.js","webpack:///./js/UriFormatGenerator.js","webpack:///./js/UserIndex.js","webpack:///./css/charts.scss?4afb","webpack:///./css/craft.scss?1b58","webpack:///../../../../../node_modules/vue-style-loader/lib/listToStyles.js","webpack:///../../../../../node_modules/vue-style-loader/lib/addStylesClient.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///external var \"jQuery\"","webpack:///./js/CP.js"],"sourcesContent":["/** global: Craft */\n/** global: Garnish */\n/**\n * Accordion\n */\nCraft.Accordion = Garnish.Base.extend({\n $trigger: null,\n targetSelector: null,\n\n _$target: null,\n\n init: function (trigger) {\n this.$trigger = $(trigger);\n\n // Is this already an accordion trigger?\n if (this.$trigger.data('accordion')) {\n console.warn('Double-instantiating an accordion trigger on an element');\n this.$trigger.data('accordion').destroy();\n }\n\n this.$trigger.data('accordion', this);\n this.targetSelector = this.$trigger.attr('aria-controls')\n ? `#${this.$trigger.attr('aria-controls')}`\n : null;\n\n if (this.targetSelector) {\n this._$target = $(this.targetSelector);\n }\n\n this.addListener(this.$trigger, 'click', 'onTriggerClick');\n this.addListener(this.$trigger, 'keypress', (event) => {\n const key = event.keyCode;\n\n if (key === Garnish.SPACE_KEY || key === Garnish.RETURN_KEY) {\n event.preventDefault();\n this.onTriggerClick();\n }\n });\n },\n\n onTriggerClick: function () {\n const isOpen = this.$trigger.attr('aria-expanded') === 'true';\n\n if (isOpen) {\n this.hideTarget(this._$target);\n } else {\n this.showTarget(this._$target);\n }\n },\n\n showTarget: function ($target) {\n if ($target && $target.length) {\n this.showTarget._currentHeight = $target.height();\n\n $target.removeClass('hidden');\n\n this.$trigger\n .removeClass('collapsed')\n .addClass('expanded')\n .attr('aria-expanded', 'true');\n\n for (let i = 0; i < $target.length; i++) {\n (($t) => {\n if ($t.prop('nodeName') !== 'SPAN') {\n $t.height('auto');\n this.showTarget._targetHeight = $t.height();\n $t.css({\n height: this.showTarget._currentHeight,\n overflow: 'hidden',\n });\n\n $t.velocity('stop');\n\n $t.velocity(\n {height: this.showTarget._targetHeight},\n Garnish.getUserPreferredAnimationDuration('fast'),\n function () {\n $t.css({\n height: '',\n overflow: '',\n });\n }\n );\n }\n })($target.eq(i));\n }\n\n delete this.showTarget._targetHeight;\n delete this.showTarget._currentHeight;\n\n // Trigger a resize event in case there are any grids in the target that need to initialize\n Garnish.$win.trigger('resize');\n }\n },\n\n hideTarget: function ($target) {\n if ($target && $target.length) {\n this.$trigger\n .removeClass('expanded')\n .addClass('collapsed')\n .attr('aria-expanded', 'false');\n\n for (let i = 0; i < $target.length; i++) {\n (($t) => {\n if ($t.hasClass('hidden')) {\n return;\n }\n if ($t.prop('nodeName') === 'SPAN') {\n $t.addClass('hidden');\n } else {\n $t.css('overflow', 'hidden');\n $t.velocity('stop');\n $t.velocity(\n {height: 0},\n Garnish.getUserPreferredAnimationDuration('fast'),\n function () {\n $t.addClass('hidden');\n }\n );\n }\n })($target.eq(i));\n }\n }\n },\n\n destroy: function () {\n this.$trigger.removeData('accordion');\n this.base();\n },\n});\n","/** global: Craft */\n\n/**\n * AddressInput class\n */\nCraft.AddressesInput = Garnish.Base.extend(\n {\n $container: null,\n $addBtn: null,\n $addBtnItem: null,\n $cards: null,\n\n init: function (container, settings) {\n this.$container = $(container);\n this.setSettings(settings, Craft.AddressesInput.defaults);\n\n // Is this already an address input?\n if (this.$container.data('addresses')) {\n console.warn('Double-instantiating an address input on an element');\n this.$container.data('addresses').destroy();\n }\n\n this.$container.data('addresses', this);\n\n this.$addBtn = this.$container.find('.address-cards__add-btn');\n this.$addBtnItem = this.$addBtn.closest('li');\n this.$cards = this.$container.find('> .address-card');\n\n for (let i = 0; i < this.$cards.length; i++) {\n this.initCard(this.$cards.eq(i));\n }\n\n this.updateAddButton();\n\n this.addListener(this.$addBtn, 'click', () => {\n this.createAddress();\n });\n },\n\n initCard: function ($card) {\n this.addListener($card, 'click', (ev) => {\n if (!$(ev.target).closest('.menubtn').length) {\n this.editAddress($card);\n }\n });\n\n const $actionBtn = $card.find('.menubtn').disclosureMenu();\n if ($actionBtn.length) {\n const menu = $actionBtn.data('trigger');\n const $menu = menu.$container;\n\n // Activate edit button\n const $editBtn = $menu.find('[data-action=\"edit\"]');\n this.addListener($editBtn, 'click', (ev) => {\n ev.stopPropagation();\n this.editAddress($card);\n });\n\n // Activate delete button\n const $deleteBtn = $menu.find('[data-action=\"delete\"]');\n this.addListener($deleteBtn, 'click', (ev) => {\n ev.preventDefault();\n ev.stopPropagation();\n if (\n confirm(\n Craft.t('app', 'Are you sure you want to delete this address?')\n )\n ) {\n this.$addBtn.addClass('loading');\n const addressId = $card.data('id');\n const draftId = $card.data('draft-id');\n Craft.sendActionRequest('POST', 'elements/delete', {\n data: {\n elementId: addressId,\n draftId: draftId,\n },\n })\n .then(() => {\n $card.remove();\n $menu.remove();\n menu.destroy();\n this.$cards = this.$cards.not($card);\n this.updateAddButton();\n\n this.trigger('deleteAddress', {\n addressId,\n draftId,\n });\n })\n .finally(() => {\n this.$addBtn.removeClass('loading');\n });\n }\n });\n }\n },\n\n editAddress: function ($card, settings) {\n const slideout = Craft.createElementEditor(\n 'craft\\\\elements\\\\Address',\n $card,\n settings\n );\n\n slideout.on('submit', (ev) => {\n this.trigger('saveAddress', {\n data: ev.data,\n });\n\n Craft.sendActionRequest('POST', 'addresses/card-html', {\n data: {\n addressId: ev.data.id,\n },\n }).then((response) => {\n const $newCard = $(response.data.html);\n if ($card) {\n $card.replaceWith($newCard);\n this.$cards = this.$cards.not($card);\n } else {\n $newCard.insertBefore(this.$addBtnItem);\n }\n Craft.initUiElements($newCard);\n this.initCard($newCard);\n this.$cards = this.$cards.add($newCard);\n this.updateAddButton();\n });\n });\n },\n\n updateAddButton: function () {\n if (this.canCreateAddress()) {\n this.$addBtn.removeClass('hidden');\n } else {\n this.$addBtn.addClass('hidden');\n }\n },\n\n canCreateAddress: function () {\n return (\n !this.settings.maxAddresses ||\n this.$cards.length < this.settings.maxAddresses\n );\n },\n\n createAddress: function () {\n if (!this.canCreateAddress()) {\n throw 'No more addresses can be created.';\n }\n\n this.$addBtn.addClass('loading');\n\n Craft.sendActionRequest('POST', 'elements/create', {\n data: {\n elementType: 'craft\\\\elements\\\\Address',\n ownerId: this.settings.ownerId,\n },\n })\n .then((ev) => {\n this.editAddress(null, {\n elementId: ev.data.element.id,\n draftId: ev.data.element.draftId,\n });\n })\n .finally(() => {\n this.$addBtn.removeClass('loading');\n });\n },\n\n destroy: function () {\n this.$container.removeData('addresses');\n this.base();\n },\n },\n {\n ownerId: null,\n defaults: {\n maxAddresses: null,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Admin table class\n */\nCraft.AdminTable = Garnish.Base.extend(\n {\n settings: null,\n totalItems: null,\n sorter: null,\n\n $noItems: null,\n $table: null,\n $tbody: null,\n $deleteBtns: null,\n\n init: function (settings) {\n this.setSettings(settings, Craft.AdminTable.defaults);\n\n if (!this.settings.allowDeleteAll) {\n this.settings.minItems = 1;\n }\n\n this.$noItems = $(this.settings.noItemsSelector);\n this.$table = $(this.settings.tableSelector);\n this.$tbody = this.$table.children('tbody');\n this.totalItems = this.$tbody.children().length;\n\n if (this.settings.sortable) {\n this.sorter = new Craft.DataTableSorter(this.$table, {\n onSortChange: this.reorderItems.bind(this),\n });\n }\n\n this.$deleteBtns = this.$table.find('.delete:not(.disabled)');\n this.addListener(this.$deleteBtns, 'click', 'handleDeleteBtnClick');\n this.addListener(this.$deleteBtns, 'keydown', (event) => {\n if (\n event.keyCode === Garnish.SPACE_KEY ||\n event.keyCode === Garnish.RETURN_KEY\n ) {\n event.preventDefault();\n this.handleDeleteBtnClick(event);\n }\n });\n\n this.updateUI();\n },\n\n addRow: function (row) {\n if (this.settings.maxItems && this.totalItems >= this.settings.maxItems) {\n // Sorry pal.\n return;\n }\n\n var $row = $(row).appendTo(this.$tbody),\n $deleteBtn = $row.find('.delete');\n\n if (this.settings.sortable) {\n this.sorter.addItems($row);\n }\n\n this.$deleteBtns = this.$deleteBtns.add($deleteBtn);\n\n this.addListener($deleteBtn, 'click', 'handleDeleteBtnClick');\n this.totalItems++;\n\n this.updateUI();\n },\n\n reorderItems: function () {\n if (!this.settings.sortable) {\n return;\n }\n\n // Get the new field order\n var ids = [];\n\n for (var i = 0; i < this.sorter.$items.length; i++) {\n var id = $(this.sorter.$items[i]).attr(this.settings.idAttribute);\n ids.push(id);\n }\n\n // Send it to the server\n var data = {\n ids: JSON.stringify(ids),\n };\n\n Craft.sendActionRequest('POST', this.settings.reorderAction, {data})\n .then((response) => {\n this.onReorderItems(ids);\n Craft.cp.displaySuccess(\n Craft.t('app', this.settings.reorderSuccessMessage)\n );\n })\n .catch(({response}) => {\n Craft.cp.displayError(\n Craft.t('app', this.settings.reorderFailMessage)\n );\n });\n },\n\n handleDeleteBtnClick: function (event) {\n if (this.settings.minItems && this.totalItems <= this.settings.minItems) {\n // Sorry pal.\n return;\n }\n\n var $row = $(event.target).closest('tr');\n\n if (this.confirmDeleteItem($row)) {\n this.deleteItem($row);\n }\n },\n\n confirmDeleteItem: function ($row) {\n if (!this.settings.confirmDeleteMessage) {\n return true;\n }\n\n var name = this.getItemName($row);\n return confirm(\n Craft.t('app', this.settings.confirmDeleteMessage, {name})\n );\n },\n\n deleteItem: function ($row) {\n var data = {\n id: this.getItemId($row),\n };\n\n Craft.sendActionRequest('POST', this.settings.deleteAction, {data})\n .then((response) => this.handleDeleteItemSuccess(response.data, $row))\n .catch(({response}) =>\n this.handleDeleteItemFailure(response.data, $row)\n );\n },\n\n handleDeleteItemFailure: function (data, $row) {\n var id = this.getItemId($row),\n name = this.getItemName($row);\n\n Craft.cp.displayError(\n Craft.t('app', this.settings.deleteFailMessage, {name})\n );\n },\n\n handleDeleteItemSuccess: function (data, $row) {\n var id = this.getItemId($row),\n name = this.getItemName($row);\n\n if (this.sorter) {\n this.sorter.removeItems($row);\n }\n\n $row.remove();\n this.totalItems--;\n this.updateUI();\n this.onDeleteItem(id);\n\n if (this.settings.deleteSuccessMessage) {\n Craft.cp.displaySuccess(\n Craft.t('app', this.settings.deleteSuccessMessage, {name})\n );\n }\n },\n\n onReorderItems: function (ids) {\n this.settings.onReorderItems(ids);\n },\n\n onDeleteItem: function (id) {\n this.settings.onDeleteItem(id);\n },\n\n getItemId: function ($row) {\n return $row.attr(this.settings.idAttribute);\n },\n\n getItemName: function ($row) {\n return Craft.escapeHtml($row.attr(this.settings.nameAttribute));\n },\n\n updateUI: function () {\n // Show the \"No Whatever Exists\" message if there aren't any\n if (this.totalItems === 0) {\n this.$table.hide();\n this.$noItems.removeClass('hidden');\n } else {\n this.$table.show();\n this.$noItems.addClass('hidden');\n }\n\n // Disable the sort buttons if there's only one row\n if (this.settings.sortable) {\n var $moveButtons = this.$table.find('.move');\n\n if (this.totalItems === 1) {\n $moveButtons.addClass('disabled');\n } else {\n $moveButtons.removeClass('disabled');\n }\n }\n\n // Disable the delete buttons if we've reached the minimum items\n if (this.settings.minItems && this.totalItems <= this.settings.minItems) {\n this.$deleteBtns.addClass('disabled');\n } else {\n this.$deleteBtns.removeClass('disabled');\n }\n\n // Hide the New Whatever button if we've reached the maximum items\n if (this.settings.newItemBtnSelector) {\n if (\n this.settings.maxItems &&\n this.totalItems >= this.settings.maxItems\n ) {\n $(this.settings.newItemBtnSelector).addClass('hidden');\n } else {\n $(this.settings.newItemBtnSelector).removeClass('hidden');\n }\n }\n },\n },\n {\n defaults: {\n tableSelector: null,\n noItemsSelector: null,\n newItemBtnSelector: null,\n idAttribute: 'data-id',\n nameAttribute: 'data-name',\n sortable: false,\n allowDeleteAll: true,\n minItems: 0,\n maxItems: null,\n reorderAction: null,\n deleteAction: null,\n reorderSuccessMessage: Craft.t('app', 'New order saved.'),\n reorderFailMessage: Craft.t('app', 'Couldn’t save new order.'),\n confirmDeleteMessage: Craft.t(\n 'app',\n 'Are you sure you want to delete “{name}”?'\n ),\n deleteSuccessMessage: Craft.t('app', '“{name}” deleted.'),\n deleteFailMessage: Craft.t('app', 'Couldn’t delete “{name}”.'),\n onReorderItems: $.noop,\n onDeleteItem: $.noop,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n\n/**\n * Asset image editor class\n */\n\nCraft.AssetImageEditor = Garnish.Modal.extend(\n {\n // jQuery objects\n $body: null,\n $footer: null,\n $imageTools: null,\n $buttons: null,\n $cancelBtn: null,\n $replaceBtn: null,\n $saveBtn: null,\n $focalPointBtn: null,\n $editorContainer: null,\n $straighten: null,\n $croppingCanvas: null,\n $spinner: null,\n $constraintContainer: null,\n $constraintRadioInputs: null,\n $customConstraints: null,\n\n // FabricJS objects\n canvas: null,\n image: null,\n viewport: null,\n focalPoint: null,\n grid: null,\n croppingCanvas: null,\n clipper: null,\n croppingRectangle: null,\n cropperHandles: null,\n cropperGrid: null,\n croppingShade: null,\n\n // Image state attributes\n imageStraightenAngle: 0,\n viewportRotation: 0,\n originalWidth: 0,\n originalHeight: 0,\n imageVerticeCoords: null,\n zoomRatio: 1,\n\n // Editor state attributes\n animationInProgress: false,\n currentView: '',\n assetId: null,\n cacheBust: null,\n draggingCropper: false,\n scalingCropper: false,\n draggingFocal: false,\n previousMouseX: 0,\n previousMouseY: 0,\n shiftKeyHeld: false,\n editorHeight: 0,\n editorWidth: 0,\n cropperState: false,\n scaleFactor: 1,\n flipData: {},\n focalPointState: false,\n maxImageSize: null,\n lastLoadedDimensions: null,\n imageIsLoading: false,\n mouseMoveEvent: null,\n croppingConstraint: false,\n constraintOrientation: 'landscape',\n showingCustomConstraint: false,\n saving: false,\n\n // Rendering proxy functions\n renderImage: null,\n renderCropper: null,\n\n _queue: null,\n\n init: function (assetId, settings) {\n this._queue = new Craft.Queue();\n\n this.cacheBust = Date.now();\n\n this.setSettings(settings, Craft.AssetImageEditor.defaults);\n\n if (this.settings.allowDegreeFractions === null) {\n this.settings.allowDegreeFractions = Craft.isImagick;\n }\n\n if (Garnish.prefersReducedMotion()) {\n this.settings.animationDuration = 1;\n }\n\n this.assetId = assetId;\n this.flipData = {x: 0, y: 0};\n\n // Build the modal\n this.$container = $(\n '<form class=\"modal fitted imageeditor\"></form>'\n ).appendTo(Garnish.$bod);\n this.$body = $('<div class=\"body\"></div>').appendTo(this.$container);\n this.$footer = $('<div class=\"footer\"/>').appendTo(this.$container);\n\n this.base(this.$container, this.settings);\n\n this.$buttons = $('<div class=\"buttons right\"/>').appendTo(this.$footer);\n this.$cancelBtn = $('<button/>', {\n type: 'button',\n class: 'btn cancel',\n text: Craft.t('app', 'Cancel'),\n }).appendTo(this.$buttons);\n\n if (this.settings.allowSavingAsNew) {\n this.$saveBtn = Craft.ui\n .createButton({\n class: 'save copy',\n label: Craft.t('app', 'Save as a new asset'),\n spinner: true,\n })\n .appendTo(this.$buttons);\n this.addListener(this.$saveBtn, 'activate', this.saveImage);\n }\n\n this.$replaceBtn = Craft.ui\n .createSubmitButton({\n class: 'save replace',\n label: Craft.t('app', 'Save'),\n spinner: true,\n })\n .appendTo(this.$buttons);\n\n this.addListener(this.$replaceBtn, 'activate', this.saveImage);\n this.addListener(this.$cancelBtn, 'activate', this.hide);\n this.removeListener(this.$shade, 'click');\n\n this.maxImageSize = this.getMaxImageSize();\n Craft.sendActionRequest('POST', 'assets/image-editor', {\n data: {assetId},\n }).then((response) => this.loadEditor(response.data));\n },\n\n /**\n * Get the max image size that is viewable in the editor currently\n */\n getMaxImageSize: function () {\n var browserViewportWidth =\n Garnish.$doc.get(0).documentElement.clientWidth;\n var browserViewportHeight =\n Garnish.$doc.get(0).documentElement.clientHeight;\n\n return (\n Math.max(browserViewportHeight, browserViewportWidth) *\n (window.devicePixelRatio > 1 ? 2 : 1)\n );\n },\n\n /**\n * Load the editor markup and start loading components and the image.\n *\n * @param {Object} data\n */\n loadEditor: function (data) {\n if (!data.html) {\n alert(Craft.t('app', 'Could not load the image editor.'));\n }\n\n this.$body.html(data.html);\n this.$tabs = $('.tabs li', this.$body);\n this.$viewsContainer = $('.views', this.$body);\n this.$views = $('> div', this.$viewsContainer);\n this.$imageTools = $('.image-container .image-tools', this.$body);\n this.$editorContainer = $('.image-container .image', this.$body);\n this.$constraintContainer = $('.constraint-group', this.$body);\n this.$constraintRadioInputs = $(\n '[name=\"constraint\"]',\n this.$constraintContainer\n );\n this.$focalPointBtn = $('.focal-point', this.$body);\n this.editorHeight = this.$editorContainer.innerHeight();\n this.editorWidth = this.$editorContainer.innerWidth();\n\n this._showSpinner();\n\n this.updateSizeAndPosition();\n\n $customConstraintWrapper = this.$constraintRadioInputs\n .filter('[value=\"custom\"]')\n .parent();\n\n // Add custom constraint inputs to fieldset\n this.$customConstraints = $('<div/>', {\n class: 'constraint custom hidden',\n 'data-constraint': 'custom',\n })\n .append(\n $('<input/>', {\n type: 'text',\n class: 'custom-constraint-w',\n size: 3,\n value: 1,\n 'aria-label': Craft.t('app', 'Width unit'),\n })\n )\n .append(\n $('<span/>', {\n class: 'custom-constraint-spacer',\n text: 'x',\n 'aria-hidden': 'true',\n })\n )\n .append(\n $('<input/>', {\n type: 'text',\n class: 'custom-constraint-h',\n size: 3,\n value: 1,\n 'aria-label': Craft.t('app', 'Height unit'),\n })\n )\n .appendTo($customConstraintWrapper);\n\n // Specify which get flipped on orientation change\n this.$constraintRadioInputs\n .filter(function () {\n const regex = /^\\d*\\.\\d+$/;\n const value = $(this).val();\n return regex.test(value);\n })\n .addClass('flip');\n\n // Load the canvas on which we'll host our image and set up the proxy render function\n this.canvas = new fabric.StaticCanvas('image-canvas');\n\n // Set up the cropping canvas jquery element for tracking all the nice events\n this.$croppingCanvas = $('#cropping-canvas', this.$editorContainer);\n this.$croppingCanvas.width(this.editorWidth);\n this.$croppingCanvas.height(this.editorHeight);\n\n this.canvas.enableRetinaScaling = true;\n this.renderImage = () => {\n Garnish.requestAnimationFrame(this.canvas.renderAll.bind(this.canvas));\n };\n\n // Load the image from URL\n var imageUrl = Craft.getActionUrl('assets/edit-image', {\n assetId: this.assetId,\n size: this.maxImageSize,\n cacheBust: this.cacheBust,\n });\n\n // Load image and set up the initial properties\n fabric.Image.fromURL(imageUrl, (imageObject) => {\n this.image = imageObject;\n this.image.set({\n originX: 'center',\n originY: 'center',\n left: this.editorWidth / 2,\n top: this.editorHeight / 2,\n });\n this.canvas.add(this.image);\n\n this.originalHeight = this.image.getHeight();\n this.originalWidth = this.image.getWidth();\n this.zoomRatio = 1;\n\n this.lastLoadedDimensions = this.getScaledImageDimensions();\n\n // Set up the image bounding box, viewport and position everything\n this._setFittedImageVerticeCoordinates();\n this._repositionEditorElements();\n\n // Set up the focal point\n var focalState = {\n imageDimensions: this.getScaledImageDimensions(),\n offsetX: 0,\n offsetY: 0,\n };\n\n var focal = false;\n if (data.focalPoint) {\n // Transform the focal point coordinates from relative to absolute\n var focalData = data.focalPoint;\n\n // Resolve for the current image dimensions.\n var adjustedX = focalState.imageDimensions.width * focalData.x;\n var adjustedY = focalState.imageDimensions.height * focalData.y;\n\n focalState.offsetX = adjustedX - focalState.imageDimensions.width / 2;\n focalState.offsetY =\n adjustedY - focalState.imageDimensions.height / 2;\n\n focal = true;\n }\n\n this.storeFocalPointState(focalState);\n\n if (focal) {\n this._createFocalPoint();\n }\n\n this._createViewport();\n this.storeCropperState();\n\n // Add listeners to buttons\n this._addControlListeners();\n\n // Add mouse event listeners\n this.addListener(\n this.$croppingCanvas,\n 'mousemove,touchmove',\n this._handleMouseMove\n );\n this.addListener(\n this.$croppingCanvas,\n 'mousedown,touchstart',\n this._handleMouseDown\n );\n this.addListener(\n this.$croppingCanvas,\n 'mouseup,touchend',\n this._handleMouseUp\n );\n this.addListener(\n this.$croppingCanvas,\n 'mouseout,touchcancel',\n this._handleMouseOut\n );\n\n this._hideSpinner();\n\n // Render it, finally\n this.renderImage();\n\n // Make sure verything gets fired for the first tab\n this.$tabs.first().trigger('click');\n });\n },\n\n /**\n * Reload the image to better fit the current available image editor viewport.\n */\n _reloadImage: function () {\n if (this.imageIsLoading) {\n return;\n }\n\n this.imageIsLoading = true;\n this.maxImageSize = this.getMaxImageSize();\n\n // Load the image from URL\n var imageUrl = Craft.getActionUrl('assets/edit-image', {\n assetId: this.assetId,\n size: this.maxImageSize,\n cacheBust: this.cacheBust,\n });\n\n this.image.setSrc(imageUrl, (imageObject) => {\n this.originalHeight = imageObject.getHeight();\n this.originalWidth = imageObject.getWidth();\n this.lastLoadedDimensions = {\n width: this.originalHeight,\n height: this.originalWidth,\n };\n this.updateSizeAndPosition();\n this.renderImage();\n this.imageIsLoading = false;\n });\n },\n\n /**\n * Update the modal size and position on browser resize\n */\n updateSizeAndPosition: function () {\n if (!this.$container) {\n return;\n }\n\n // Fullscreen modal\n var innerWidth = window.innerWidth;\n var innerHeight = window.innerHeight;\n\n this.$container.css({\n width: innerWidth,\n 'min-width': innerWidth,\n left: 0,\n\n height: innerHeight,\n 'min-height': innerHeight,\n top: 0,\n });\n\n this.$body.css({\n height: innerHeight - (this.$footer.outerHeight() - 1),\n });\n\n if (innerWidth < innerHeight) {\n this.$container.addClass('vertical');\n } else {\n this.$container.removeClass('vertical');\n }\n\n // If image is already loaded, make sure it looks pretty.\n if (this.$editorContainer && this.image) {\n this._repositionEditorElements();\n }\n },\n\n /**\n * Reposition the editor elements to accurately reflect the editor state with current dimensions\n */\n _repositionEditorElements: function () {\n // Remember what the dimensions were before the resize took place\n var previousEditorDimensions = {\n width: this.editorWidth,\n height: this.editorHeight,\n };\n\n this.editorHeight = this.$editorContainer.innerHeight();\n this.editorWidth = this.$editorContainer.innerWidth();\n\n this.canvas.setDimensions({\n width: this.editorWidth,\n height: this.editorHeight,\n });\n\n var currentScaledDimensions = this.getScaledImageDimensions();\n\n // If we're cropping now, we have to reposition the cropper correctly in case\n // the area for image changes, forcing the image size to change as well.\n if (this.currentView === 'crop') {\n this.zoomRatio = this.getZoomToFitRatio(\n this.getScaledImageDimensions()\n );\n var previouslyOccupiedArea = this._getBoundingRectangle(\n this.imageVerticeCoords\n );\n this._setFittedImageVerticeCoordinates();\n this._repositionCropper(previouslyOccupiedArea);\n } else {\n // Otherwise just recalculate the image zoom ratio\n this.zoomRatio =\n this.getZoomToCoverRatio(this.getScaledImageDimensions()) *\n this.scaleFactor;\n }\n\n // Reposition the image relatively to the previous editor dimensions.\n this._repositionImage(previousEditorDimensions);\n this._repositionViewport();\n this._repositionFocalPoint(previousEditorDimensions);\n this._zoomImage();\n\n this.renderImage();\n\n if (\n currentScaledDimensions.width / this.lastLoadedDimensions.width > 1.5 ||\n currentScaledDimensions.height / this.lastLoadedDimensions.height > 1.5\n ) {\n this._reloadImage();\n }\n },\n\n /**\n * Reposition image based on how the editor dimensions have changed.\n * This ensures keeping the image center offset, if there is any.\n *\n * @param {Object} previousEditorDimensions\n */\n _repositionImage: function (previousEditorDimensions) {\n this.image.set({\n left:\n this.image.left -\n (previousEditorDimensions.width - this.editorWidth) / 2,\n top:\n this.image.top -\n (previousEditorDimensions.height - this.editorHeight) / 2,\n });\n },\n\n /**\n * Create the viewport for image editor.\n */\n _createViewport: function () {\n this.viewport = new fabric.Rect({\n width: this.image.width,\n height: this.image.height,\n fill: 'rgba(127,0,0,1)',\n originX: 'center',\n originY: 'center',\n globalCompositeOperation: 'destination-in', // This clips everything outside of the viewport\n left: this.image.left,\n top: this.image.top,\n });\n this.canvas.add(this.viewport);\n this.renderImage();\n },\n\n /**\n * Create the focal point.\n */\n _createFocalPoint: function () {\n var focalPointState = this.focalPointState;\n var sizeFactor =\n this.getScaledImageDimensions().width /\n focalPointState.imageDimensions.width;\n\n var focalX =\n focalPointState.offsetX *\n sizeFactor *\n this.zoomRatio *\n this.scaleFactor;\n var focalY =\n focalPointState.offsetY *\n sizeFactor *\n this.zoomRatio *\n this.scaleFactor;\n\n // Adjust by image margins\n focalX += this.image.left;\n focalY += this.image.top;\n\n var deltaX = 0;\n var deltaY = 0;\n\n // When creating a fresh focal point, drop it dead in the center of the viewport, not the image.\n if (\n this.viewport &&\n focalPointState.offsetX === 0 &&\n focalPointState.offsetY === 0\n ) {\n if (this.currentView !== 'crop') {\n deltaX = this.viewport.left - this.image.left;\n deltaY = this.viewport.top - this.image.top;\n } else {\n // Unless we have a cropper showing, in which case drop it in the middle of the cropper\n deltaX = this.clipper.left - this.image.left;\n deltaY = this.clipper.top - this.image.top;\n }\n\n // Bump focal to middle of viewport\n focalX += deltaX;\n focalY += deltaY;\n\n // Reflect changes in saved state\n focalPointState.offsetX +=\n deltaX / (sizeFactor * this.zoomRatio * this.scaleFactor);\n focalPointState.offsetY +=\n deltaY / (sizeFactor * this.zoomRatio * this.scaleFactor);\n }\n\n this.focalPoint = new fabric.Group(\n [\n new fabric.Circle({\n radius: 8,\n fill: 'rgba(0,0,0,0.5)',\n strokeWidth: 2,\n stroke: 'rgba(255,255,255,0.8)',\n left: 0,\n top: 0,\n originX: 'center',\n originY: 'center',\n }),\n new fabric.Circle({\n radius: 1,\n fill: 'rgba(255,255,255,0)',\n strokeWidth: 2,\n stroke: 'rgba(255,255,255,0.8)',\n left: 0,\n top: 0,\n originX: 'center',\n originY: 'center',\n }),\n ],\n {\n originX: 'center',\n originY: 'center',\n left: focalX,\n top: focalY,\n }\n );\n\n this.storeFocalPointState(focalPointState);\n this.canvas.add(this.focalPoint);\n },\n\n /**\n * Toggle focal point\n */\n toggleFocalPoint: function () {\n if (!this.focalPoint) {\n this._createFocalPoint();\n this.$focalPointBtn.attr('aria-pressed', 'true');\n } else {\n this.canvas.remove(this.focalPoint);\n this.focalPoint = null;\n this.$focalPointBtn.attr('aria-pressed', 'false');\n }\n\n this.renderImage();\n },\n\n /**\n * Reposition the viewport to handle editor resizing.\n */\n _repositionViewport: function () {\n if (this.viewport) {\n var dimensions = {\n left: this.editorWidth / 2,\n top: this.editorHeight / 2,\n };\n\n // If we're cropping, nothing exciting happens for the viewport\n if (this.currentView === 'crop') {\n dimensions.width = this.editorWidth;\n dimensions.height = this.editorHeight;\n } else {\n // If this is the first initial reposition, no cropper state yet\n if (this.cropperState) {\n // Recall the state\n var state = this.cropperState;\n\n var scaledImageDimensions = this.getScaledImageDimensions();\n // Make sure we have the correct current image size\n var sizeFactor =\n scaledImageDimensions.width / state.imageDimensions.width;\n\n // Set the viewport dimensions\n dimensions.width = state.width * sizeFactor * this.zoomRatio;\n dimensions.height = state.height * sizeFactor * this.zoomRatio;\n\n // Adjust the image position to show the correct part of the image in the viewport\n this.image.set({\n left: this.editorWidth / 2 - state.offsetX * sizeFactor,\n top: this.editorHeight / 2 - state.offsetY * sizeFactor,\n });\n } else {\n $.extend(dimensions, this.getScaledImageDimensions());\n }\n }\n this.viewport.set(dimensions);\n }\n },\n\n _repositionFocalPoint: function (previousEditorDimensions) {\n if (this.focalPoint) {\n var offsetX = this.focalPoint.left - this.editorWidth / 2;\n var offsetY = this.focalPoint.top - this.editorHeight / 2;\n\n var currentWidth = this.image.width;\n var newWidth = this.getScaledImageDimensions().width * this.zoomRatio;\n var ratio = newWidth / currentWidth / this.scaleFactor;\n\n offsetX -= (previousEditorDimensions.width - this.editorWidth) / 2;\n offsetY -= (previousEditorDimensions.height - this.editorHeight) / 2;\n\n offsetX *= ratio;\n offsetY *= ratio;\n\n this.focalPoint.set({\n left: this.editorWidth / 2 + offsetX,\n top: this.editorHeight / 2 + offsetY,\n });\n }\n },\n\n /**\n * Return true if the image orientation has changed\n */\n hasOrientationChanged: function () {\n return this.viewportRotation % 180 !== 0;\n },\n\n /**\n * Return the current image dimensions that would be used in the current image area with no straightening or rotation applied.\n */\n getScaledImageDimensions: function () {\n if (typeof this.getScaledImageDimensions._ === 'undefined') {\n this.getScaledImageDimensions._ = {};\n }\n\n this.getScaledImageDimensions._.imageRatio =\n this.originalHeight / this.originalWidth;\n this.getScaledImageDimensions._.editorRatio =\n this.editorHeight / this.editorWidth;\n\n this.getScaledImageDimensions._.dimensions = {};\n if (\n this.getScaledImageDimensions._.imageRatio >\n this.getScaledImageDimensions._.editorRatio\n ) {\n this.getScaledImageDimensions._.dimensions.height = Math.min(\n this.editorHeight,\n this.originalHeight\n );\n this.getScaledImageDimensions._.dimensions.width = Math.round(\n this.originalWidth /\n (this.originalHeight /\n this.getScaledImageDimensions._.dimensions.height)\n );\n } else {\n this.getScaledImageDimensions._.dimensions.width = Math.min(\n this.editorWidth,\n this.originalWidth\n );\n this.getScaledImageDimensions._.dimensions.height = Math.round(\n this.originalHeight *\n (this.getScaledImageDimensions._.dimensions.width /\n this.originalWidth)\n );\n }\n\n return this.getScaledImageDimensions._.dimensions;\n },\n\n /**\n * Set the image dimensions to reflect the current zoom ratio.\n */\n _zoomImage: function () {\n if (typeof this._zoomImage._ === 'undefined') {\n this._zoomImage._ = {};\n }\n\n this._zoomImage._.imageDimensions = this.getScaledImageDimensions();\n this.image.set({\n width: this._zoomImage._.imageDimensions.width * this.zoomRatio,\n height: this._zoomImage._.imageDimensions.height * this.zoomRatio,\n });\n },\n\n /**\n * Gets previous tab element from currently-active.\n */\n _getPrevTab: function () {\n const activeTabIndex = this._getActiveTabIndex();\n\n if (activeTabIndex < 0) return;\n\n let newTabIndex;\n\n if (activeTabIndex > 0) {\n newTabIndex = activeTabIndex - 1;\n } else {\n newTabIndex = this.$tabs.length - 1;\n }\n\n return this.$tabs.eq(newTabIndex);\n },\n\n /**\n * Gets next tab element from currently-active.\n */\n _getNextTab: function () {\n const activeTabIndex = this._getActiveTabIndex();\n\n if (activeTabIndex < 0) return;\n\n let newTabIndex;\n\n if (activeTabIndex < this.$tabs.length - 1) {\n newTabIndex = activeTabIndex + 1;\n } else {\n newTabIndex = 0;\n }\n\n return this.$tabs.eq(newTabIndex);\n },\n\n /**\n * Gets active tab element\n */\n _getActiveTab: function () {\n return this.$tabs.filter('[aria-selected=\"true\"]');\n },\n\n /**\n * Gets index of active tab among sibling tabs\n */\n _getActiveTabIndex: function () {\n const $activeTab = this._getActiveTab();\n\n if (!$activeTab.length) return;\n\n return $activeTab.index();\n },\n\n /**\n * Set up listeners for the controls.\n */\n _addControlListeners: function () {\n // Tabs\n this.addListener(this.$tabs, 'click', this._handleTabClick);\n this.addListener(this.$tabs, 'keydown', (event) => {\n switch (event.keyCode) {\n case Garnish.LEFT_KEY:\n case Garnish.UP_KEY:\n event.preventDefault();\n const $prevTab = this._getPrevTab();\n this.activateTab($prevTab);\n break;\n case Garnish.RIGHT_KEY:\n case Garnish.DOWN_KEY:\n event.preventDefault();\n const $nextTab = this._getNextTab();\n this.activateTab($nextTab);\n break;\n }\n });\n\n // Focal point\n this.addListener(this.$focalPointBtn, 'click', this.toggleFocalPoint);\n\n // Rotate controls\n this.addListener($('.rotate-left'), 'click', function () {\n this.rotateImage(-90);\n });\n this.addListener($('.rotate-right'), 'click', function () {\n this.rotateImage(90);\n });\n this.addListener($('.flip-vertical'), 'click', function () {\n this.flipImage('y');\n });\n this.addListener($('.flip-horizontal'), 'click', function () {\n this.flipImage('x');\n });\n\n // Straighten slider\n this.straighteningInput = new Craft.SlideRuleInput('slide-rule', {\n onStart: () => {\n this._showGrid();\n },\n onChange: (slider) => {\n this.straighten(slider);\n },\n onEnd: () => {\n this._hideGrid();\n this._cleanupFocalPointAfterStraighten();\n },\n });\n\n // Cropper scale modifier key\n this.addListener(Garnish.$doc, 'keydown', function (ev) {\n if (ev.keyCode === Garnish.SHIFT_KEY) {\n this.shiftKeyHeld = true;\n }\n });\n this.addListener(Garnish.$doc, 'keyup', function (ev) {\n if (ev.keyCode === Garnish.SHIFT_KEY) {\n this.shiftKeyHeld = false;\n }\n });\n\n this.addListener(\n this.$constraintRadioInputs,\n 'change',\n this._handleConstraintChange\n );\n this.addListener(\n $('.orientation input', this.$container),\n 'click',\n this._handleOrientationClick\n );\n this.addListener(\n $('.constraint-group .custom input', this.$container),\n 'keyup',\n this._applyCustomConstraint\n );\n },\n\n /**\n * Handle a constraint button click.\n *\n * @param {Object} ev\n */\n _handleConstraintClick: function (ev) {\n var constraint = $(ev.currentTarget).data('constraint');\n var $target = $(ev.currentTarget);\n $target.siblings().removeClass('active');\n $target.addClass('active');\n\n if (constraint == 'custom') {\n this._showCustomConstraint();\n this._applyCustomConstraint();\n return;\n }\n\n this._hideCustomConstraint();\n\n this.setCroppingConstraint(constraint);\n this.enforceCroppingConstraint();\n },\n\n /**\n * Handle a constraint change.\n *\n * @param {Object} ev\n */\n _handleConstraintChange: function (ev) {\n const constraint = $(ev.target).val();\n\n if (constraint == 'custom') {\n this._showCustomConstraint();\n this._applyCustomConstraint();\n return;\n }\n\n this._hideCustomConstraint();\n\n this.setCroppingConstraint(constraint);\n this.enforceCroppingConstraint();\n },\n\n /**\n * Handle an orientation switch click.\n *\n * @param {Object} ev\n */\n _handleOrientationClick: function (ev) {\n if (ev.currentTarget.value === this.constraintOrientation) {\n return;\n }\n this.constraintOrientation = ev.currentTarget.value;\n\n const $constraints = $('.flip', this.$constraintContainer);\n\n for (var i = 0; i < $constraints.length; i++) {\n var $constraint = $($constraints[i]);\n const labelSelector = 'label[for=\"' + $constraint.attr('id') + '\"]';\n const $label = $(labelSelector, this.$constraintContainer);\n $constraint.val(1 / $constraint.val());\n $label.html(\n $label.text().split(':').reverse().join(':').replace(/\\s/g, '')\n );\n }\n\n $constraints.filter(':checked').trigger('change');\n },\n\n /**\n * Apply the custom ratio set in the inputs\n */\n _applyCustomConstraint: function () {\n var constraint = this._getCustomConstraint();\n\n if (constraint.w > 0 && constraint.h > 0) {\n this.setCroppingConstraint(constraint.w / constraint.h);\n this.enforceCroppingConstraint();\n }\n },\n\n /**\n * Get the custom constraint.\n *\n * @returns {{w: *, h: *}}\n */\n _getCustomConstraint: function () {\n var w = parseFloat($('.custom-constraint-w').val());\n var h = parseFloat($('.custom-constraint-h').val());\n return {\n w: isNaN(w) ? 0 : w,\n h: isNaN(h) ? 0 : h,\n };\n },\n\n /**\n * Set the custom constraint.\n *\n * @param {number} w\n * @param {number} h\n */\n _setCustomConstraint: function (w, h) {\n $('.custom-constraint-w').val(parseFloat(w));\n $('.custom-constraint-h').val(parseFloat(h));\n },\n\n /**\n * Hide the custom constraint inputs.\n */\n _hideCustomConstraint: function () {\n this.showingCustomConstraint = false;\n this.$customConstraints.addClass('hidden');\n $('.orientation', this.$container).removeClass('hidden');\n },\n\n /**\n * Show the custom constraint inputs.\n */\n _showCustomConstraint: function () {\n if (this.showingCustomConstraint) {\n return;\n }\n\n this.showingCustomConstraint = true;\n this.$customConstraints.removeClass('hidden');\n $('.orientation', this.$container).addClass('hidden');\n },\n\n /**\n * Handle tab click.\n *\n * @param {Object} ev\n */\n _handleTabClick: function (ev) {\n if (!this.animationInProgress) {\n var $tab = $(ev.currentTarget);\n this.activateTab($tab);\n }\n },\n\n /**\n * Activate a tab.\n *\n * @param {(jQuery|HTMLElement|string)} tab\n */\n\n activateTab: function (tab) {\n const view = $(tab).data('view');\n this.$tabs.removeClass('selected').attr({\n 'aria-selected': 'false',\n tabindex: '-1',\n });\n $(tab)\n .addClass('selected')\n .attr({\n 'aria-selected': 'true',\n tabindex: '0',\n })\n .trigger('focus');\n this.showView(view);\n },\n\n /**\n * Show a view.\n *\n * @param {string} view\n */\n showView: function (view) {\n if (this.currentView === view) {\n return;\n }\n\n this.$views.addClass('hidden');\n var $view = this.$views.filter('[data-view=\"' + view + '\"]');\n $view.removeClass('hidden');\n\n if (view === 'rotate') {\n this.enableSlider();\n } else {\n this.disableSlider();\n }\n\n // Now that most likely our editor dimensions have changed, time to reposition stuff\n this.updateSizeAndPosition();\n\n // See if we have to enable or disable crop mode as we transition between tabs\n if (this.currentView === 'crop' && view !== 'crop') {\n this._queue.push(\n () =>\n new Promise((resolve, reject) => {\n this.disableCropMode();\n resolve();\n })\n );\n } else if (this.currentView !== 'crop' && view === 'crop') {\n this._queue.push(\n () =>\n new Promise((resolve, reject) => {\n this.enableCropMode();\n resolve();\n })\n );\n }\n\n // Mark the current view\n this.currentView = view;\n },\n\n /**\n * Store the current cropper state.\n *\n * Cropper state is always assumed to be saved at a zoom ratio of 1 to be used\n * as the basis for recalculating the cropper position and dimensions.\n *\n * @param {Object} [state]\n */\n storeCropperState: function (state) {\n if (typeof this.storeCropperState._ === 'undefined') {\n this.storeCropperState._ = {};\n }\n\n // If we're asked to store a specific state.\n if (state) {\n this.cropperState = state;\n } else if (this.clipper) {\n this.storeCropperState._.zoomFactor = 1 / this.zoomRatio;\n\n this.cropperState = {\n offsetX:\n (this.clipper.left - this.image.left) *\n this.storeCropperState._.zoomFactor,\n offsetY:\n (this.clipper.top - this.image.top) *\n this.storeCropperState._.zoomFactor,\n height: this.clipper.height * this.storeCropperState._.zoomFactor,\n width: this.clipper.width * this.storeCropperState._.zoomFactor,\n imageDimensions: this.getScaledImageDimensions(),\n };\n } else {\n this.storeCropperState._.dimensions = this.getScaledImageDimensions();\n this.cropperState = {\n offsetX: 0,\n offsetY: 0,\n height: this.storeCropperState._.dimensions.height,\n width: this.storeCropperState._.dimensions.width,\n imageDimensions: this.storeCropperState._.dimensions,\n };\n }\n },\n\n /**\n * Store focal point coordinates in a manner that is not tied to zoom ratio and rotation.\n */\n storeFocalPointState: function (state) {\n if (typeof this.storeFocalPointState._ === 'undefined') {\n this.storeFocalPointState._ = {};\n }\n\n // If we're asked to store a specific state.\n if (state) {\n this.focalPointState = state;\n } else if (this.focalPoint) {\n this.storeFocalPointState._.zoomFactor = 1 / this.zoomRatio;\n this.focalPointState = {\n offsetX:\n ((this.focalPoint.left - this.image.left) *\n this.storeFocalPointState._.zoomFactor) /\n this.scaleFactor,\n offsetY:\n ((this.focalPoint.top - this.image.top) *\n this.storeFocalPointState._.zoomFactor) /\n this.scaleFactor,\n imageDimensions: this.getScaledImageDimensions(),\n };\n }\n },\n\n /**\n * Rotate the image along with the viewport.\n *\n * @param {number} degrees\n */\n rotateImage: function (degrees) {\n if (!this.animationInProgress) {\n // We're not that kind of an establishment, sir.\n if (degrees !== 90 && degrees !== -90) {\n return false;\n }\n\n this.animationInProgress = true;\n this.viewportRotation += degrees;\n\n // Normalize the viewport rotation angle so it's between 0 and 359\n this.viewportRotation = parseInt(\n (this.viewportRotation + 360) % 360,\n 10\n );\n\n var newAngle = this.image.angle + degrees;\n var scaledImageDimensions = this.getScaledImageDimensions();\n var imageZoomRatio;\n\n if (this.hasOrientationChanged()) {\n imageZoomRatio = this.getZoomToCoverRatio({\n height: scaledImageDimensions.width,\n width: scaledImageDimensions.height,\n });\n } else {\n imageZoomRatio = this.getZoomToCoverRatio(scaledImageDimensions);\n }\n\n // In cases when for some reason we've already zoomed in on the image,\n // use existing zoom.\n if (this.zoomRatio > imageZoomRatio) {\n imageZoomRatio = this.zoomRatio;\n }\n\n var viewportProperties = {\n angle: degrees === 90 ? '+=90' : '-=90',\n };\n\n var imageProperties = {\n angle: newAngle,\n width: scaledImageDimensions.width * imageZoomRatio,\n height: scaledImageDimensions.height * imageZoomRatio,\n };\n\n var scaleFactor = 1;\n if (this.scaleFactor < 1) {\n scaleFactor = 1 / this.scaleFactor;\n this.scaleFactor = 1;\n } else {\n if (this.viewport.width > this.editorHeight) {\n scaleFactor = this.editorHeight / this.viewport.width;\n } else if (this.viewport.height > this.editorWidth) {\n scaleFactor = this.editorWidth / this.viewport.height;\n }\n this.scaleFactor = scaleFactor;\n }\n\n if (scaleFactor < 1) {\n imageProperties.width *= scaleFactor;\n imageProperties.height *= scaleFactor;\n }\n\n var state = this.cropperState;\n\n // Make sure we reposition the image as well to focus on the same image area\n var deltaX = state.offsetX;\n var deltaY = state.offsetY;\n var angleInRadians = degrees * (Math.PI / 180);\n\n // Calculate how the cropper would need to move in a circle to maintain\n // the focus on the same region if the image was rotated with zoom intact.\n var newDeltaX =\n deltaX * Math.cos(angleInRadians) - deltaY * Math.sin(angleInRadians);\n var newDeltaY =\n deltaX * Math.sin(angleInRadians) + deltaY * Math.cos(angleInRadians);\n\n var sizeFactor =\n scaledImageDimensions.width / state.imageDimensions.width;\n\n var modifiedDeltaX =\n newDeltaX * sizeFactor * this.zoomRatio * this.scaleFactor;\n var modifiedDeltaY =\n newDeltaY * sizeFactor * this.zoomRatio * this.scaleFactor;\n\n imageProperties.left = this.editorWidth / 2 - modifiedDeltaX;\n imageProperties.top = this.editorHeight / 2 - modifiedDeltaY;\n\n state.offsetX = newDeltaX;\n state.offsetY = newDeltaY;\n\n var temp = state.width;\n state.width = state.height;\n state.height = temp;\n\n this.storeCropperState(state);\n\n if (this.focalPoint) {\n this.canvas.remove(this.focalPoint);\n }\n\n this.viewport.animate(viewportProperties, {\n duration: this.settings.animationDuration,\n onComplete: () => {\n // If we're zooming the image in or out, better do the same to viewport\n var temp = this.viewport.height * scaleFactor;\n this.viewport.height = this.viewport.width * scaleFactor;\n this.viewport.width = temp;\n this.viewport.set({angle: 0});\n },\n });\n\n // Animate the rotation and dimension change\n this.image.animate(imageProperties, {\n onChange: this.canvas.renderAll.bind(this.canvas),\n duration: this.settings.animationDuration,\n onComplete: () => {\n var cleanAngle = parseFloat((this.image.angle + 360) % 360);\n this.image.set({angle: cleanAngle});\n this.animationInProgress = false;\n if (this.focalPoint) {\n this._adjustFocalPointByAngle(degrees);\n this.straighten(this.straighteningInput);\n this.canvas.add(this.focalPoint);\n } else {\n this._resetFocalPointPosition();\n }\n },\n });\n }\n },\n\n /**\n * Flip an image along an axis.\n *\n * @param {string} axis\n */\n flipImage: function (axis) {\n if (!this.animationInProgress) {\n this.animationInProgress = true;\n\n if (this.hasOrientationChanged()) {\n axis = axis === 'y' ? 'x' : 'y';\n }\n\n if (this.focalPoint) {\n this.canvas.remove(this.focalPoint);\n } else {\n this._resetFocalPointPosition();\n }\n\n var editorCenter = {x: this.editorWidth / 2, y: this.editorHeight / 2};\n this.straighteningInput.setValue(-this.imageStraightenAngle);\n this.imageStraightenAngle = -this.imageStraightenAngle;\n var properties = {\n angle: this.viewportRotation + this.imageStraightenAngle,\n };\n\n var deltaY, deltaX;\n var cropperState = this.cropperState;\n var focalPointState = this.focalPointState;\n\n // Reposition the image, viewport, and stored cropper and focal point states.\n if (\n (axis === 'y' && this.hasOrientationChanged()) ||\n (axis !== 'y' && !this.hasOrientationChanged())\n ) {\n cropperState.offsetX = -cropperState.offsetX;\n focalPointState.offsetX = -focalPointState.offsetX;\n deltaX = this.image.left - editorCenter.x;\n properties.left = editorCenter.x - deltaX;\n } else {\n cropperState.offsetY = -cropperState.offsetY;\n focalPointState.offsetY = -focalPointState.offsetY;\n deltaY = this.image.top - editorCenter.y;\n properties.top = editorCenter.y - deltaY;\n }\n\n if (axis === 'y') {\n properties.scaleY = this.image.scaleY * -1;\n this.flipData.y = 1 - this.flipData.y;\n } else {\n properties.scaleX = this.image.scaleX * -1;\n this.flipData.x = 1 - this.flipData.x;\n }\n\n this.storeCropperState(cropperState);\n this.storeFocalPointState(focalPointState);\n\n this.image.animate(properties, {\n onChange: this.canvas.renderAll.bind(this.canvas),\n duration: this.settings.animationDuration,\n onComplete: () => {\n this.animationInProgress = false;\n if (this.focalPoint) {\n // Well this is handy\n this._adjustFocalPointByAngle(0);\n this.canvas.add(this.focalPoint);\n }\n },\n });\n }\n },\n\n /**\n * Perform the straightening with input slider.\n *\n * @param {Craft.SlideRuleInput} slider\n */\n straighten: function (slider) {\n if (!this.animationInProgress) {\n this.animationInProgress = true;\n\n var previousAngle = this.image.angle;\n\n this.imageStraightenAngle =\n (this.settings.allowDegreeFractions\n ? parseFloat(slider.value)\n : Math.round(parseFloat(slider.value))) % 360;\n\n // Straighten the image\n this.image.set({\n angle: this.viewportRotation + this.imageStraightenAngle,\n });\n\n // Set the new zoom ratio\n this.zoomRatio =\n this.getZoomToCoverRatio(this.getScaledImageDimensions()) *\n this.scaleFactor;\n this._zoomImage();\n\n if (this.cropperState) {\n this._adjustEditorElementsOnStraighten(previousAngle);\n }\n\n this.renderImage();\n\n this.animationInProgress = false;\n }\n },\n\n /**\n * Adjust the cropped viewport when straightening the image to correct for\n * bumping into edges, keeping focus on the cropped area center and to\n * maintain the illusion that the image is being straightened relative to the viewport center.\n *\n * @param {integer} previousAngle integer the previous image angle before straightening\n */\n _adjustEditorElementsOnStraighten: function (previousAngle) {\n var scaledImageDimensions = this.getScaledImageDimensions();\n var angleDelta = this.image.angle - previousAngle;\n var state = this.cropperState;\n\n var currentZoomRatio = this.zoomRatio;\n var adjustmentRatio = 1;\n\n var deltaX, deltaY, newCenterX, newCenterY, sizeFactor;\n\n do {\n // Get the cropper center coordinates\n var cropperCenterX = state.offsetX;\n var cropperCenterY = state.offsetY;\n var angleInRadians = angleDelta * (Math.PI / 180);\n\n // Calculate how the cropper would need to move in a circle to maintain\n // the focus on the same region if the image was rotated with zoom intact.\n newCenterX =\n cropperCenterX * Math.cos(angleInRadians) -\n cropperCenterY * Math.sin(angleInRadians);\n newCenterY =\n cropperCenterX * Math.sin(angleInRadians) +\n cropperCenterY * Math.cos(angleInRadians);\n\n sizeFactor = scaledImageDimensions.width / state.imageDimensions.width;\n\n // Figure out the final image offset to keep the viewport focused where we need it\n deltaX = newCenterX * currentZoomRatio * sizeFactor;\n deltaY = newCenterY * currentZoomRatio * sizeFactor;\n\n // If the image would creep in the viewport, figure out how to math around it.\n var imageVertices = this.getImageVerticeCoords(currentZoomRatio);\n var rectangle = {\n width: this.viewport.width,\n height: this.viewport.height,\n left: this.editorWidth / 2 - this.viewport.width / 2 + deltaX,\n top: this.editorHeight / 2 - this.viewport.height / 2 + deltaY,\n };\n adjustmentRatio = this._getZoomRatioToFitRectangle(\n rectangle,\n imageVertices\n );\n currentZoomRatio = currentZoomRatio * adjustmentRatio;\n\n // If we had to make adjustments, do the calculations again\n } while (adjustmentRatio !== 1);\n\n // Reposition the image correctly\n this.image.set({\n left: this.editorWidth / 2 - deltaX,\n top: this.editorHeight / 2 - deltaY,\n });\n\n // Finally, store the new cropper state to reflect the rotation change.\n state.offsetX = newCenterX;\n state.offsetY = newCenterY;\n state.width = this.viewport.width / currentZoomRatio / sizeFactor;\n state.height = this.viewport.height / currentZoomRatio / sizeFactor;\n\n this.storeCropperState(state);\n\n // Zoom the image in and we're done.\n this.zoomRatio = currentZoomRatio;\n\n if (this.focalPoint) {\n this._adjustFocalPointByAngle(angleDelta);\n\n if (!this._isCenterInside(this.focalPoint, this.viewport)) {\n this.focalPoint.set({opacity: 0});\n } else {\n this.focalPoint.set({opacity: 1});\n }\n } else if (angleDelta !== 0) {\n this._resetFocalPointPosition();\n }\n\n this._zoomImage();\n },\n\n /**\n * If focal point is active and outside of viewport after straightening, reset it.\n */\n _cleanupFocalPointAfterStraighten: function () {\n if (\n this.focalPoint &&\n !this._isCenterInside(this.focalPoint, this.viewport)\n ) {\n this.focalPoint.set({opacity: 1});\n var state = this.focalPointState;\n state.offsetX = 0;\n state.offsetY = 0;\n this.storeFocalPointState(state);\n this.toggleFocalPoint();\n }\n },\n\n /**\n * Reset focal point to the middle of image.\n */\n _resetFocalPointPosition: function () {\n var state = this.focalPointState;\n state.offsetX = 0;\n state.offsetY = 0;\n this.storeFocalPointState(state);\n },\n\n /**\n * Returns true if a center of an object is inside another rectangle shaped object that is not rotated.\n *\n * @param {Object} object\n * @param {Object} containingObject\n * @returns {boolean}\n */\n _isCenterInside: function (object, containingObject) {\n return (\n object.left > containingObject.left - containingObject.width / 2 &&\n object.top > containingObject.top - containingObject.height / 2 &&\n object.left < containingObject.left + containingObject.width / 2 &&\n object.top < containingObject.top + containingObject.height / 2\n );\n },\n\n /**\n * Adjust the focal point by an angle in degrees.\n * @param {number} angle\n */\n _adjustFocalPointByAngle: function (angle) {\n var angleInRadians = angle * (Math.PI / 180);\n var state = this.focalPointState;\n\n var focalX = state.offsetX;\n var focalY = state.offsetY;\n\n // Calculate how the focal point would need to move in a circle to keep on the same spot\n // on the image if it was rotated with zoom intact.\n var newFocalX =\n focalX * Math.cos(angleInRadians) - focalY * Math.sin(angleInRadians);\n var newFocalY =\n focalX * Math.sin(angleInRadians) + focalY * Math.cos(angleInRadians);\n var sizeFactor =\n this.getScaledImageDimensions().width / state.imageDimensions.width;\n\n var adjustedFocalX = newFocalX * sizeFactor * this.zoomRatio;\n var adjustedFocalY = newFocalY * sizeFactor * this.zoomRatio;\n\n this.focalPoint.left = this.image.left + adjustedFocalX;\n this.focalPoint.top = this.image.top + adjustedFocalY;\n\n state.offsetX = newFocalX;\n state.offsetY = newFocalY;\n this.storeFocalPointState(state);\n },\n\n /**\n * Get the zoom ratio required to fit a rectangle within another rectangle, that is defined by vertices.\n * If the rectangle fits, 1 will be returned.\n *\n * @param {Object} rectangle\n * @param {Object} containingVertices\n */\n _getZoomRatioToFitRectangle: function (rectangle, containingVertices) {\n var rectangleVertices = this._getRectangleVertices(rectangle);\n var vertex;\n\n // Check if any of the viewport vertices end up out of bounds\n for (\n var verticeIndex = 0;\n verticeIndex < rectangleVertices.length;\n verticeIndex++\n ) {\n vertex = rectangleVertices[verticeIndex];\n\n if (!this.arePointsInsideRectangle([vertex], containingVertices)) {\n break;\n }\n\n vertex = false;\n }\n\n // If there's no vertex set after loop, it means that all of them are inside the image rectangle\n var adjustmentRatio;\n\n if (!vertex) {\n adjustmentRatio = 1;\n } else {\n // Find out which edge got crossed by the vertex\n var edge = this._getEdgeCrossed(containingVertices, vertex);\n\n var rectangleCenter = {\n x: rectangle.left + rectangle.width / 2,\n y: rectangle.top + rectangle.height / 2,\n };\n\n // Calculate how much further that edge needs to be.\n // https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line#Line_defined_by_two_points\n var distanceFromVertexToEdge =\n Math.abs(\n (edge[1].y - edge[0].y) * vertex.x -\n (edge[1].x - edge[0].x) * vertex.y +\n edge[1].x * edge[0].y -\n edge[1].y * edge[0].x\n ) /\n Math.sqrt(\n Math.pow(edge[1].y - edge[0].y, 2) +\n Math.pow(edge[1].x - edge[0].x, 2)\n );\n var distanceFromCenterToEdge =\n Math.abs(\n (edge[1].y - edge[0].y) * rectangleCenter.x -\n (edge[1].x - edge[0].x) * rectangleCenter.y +\n edge[1].x * edge[0].y -\n edge[1].y * edge[0].x\n ) /\n Math.sqrt(\n Math.pow(edge[1].y - edge[0].y, 2) +\n Math.pow(edge[1].x - edge[0].x, 2)\n );\n\n // Adjust the zoom ratio\n adjustmentRatio =\n (distanceFromVertexToEdge + distanceFromCenterToEdge) /\n distanceFromCenterToEdge;\n }\n\n return adjustmentRatio;\n },\n\n /**\n * Save the image.\n *\n * @param {Object} ev\n */\n saveImage: function (ev) {\n var $button = $(ev.currentTarget);\n if (this.saving) {\n return false;\n }\n\n this.saving = true;\n $button.addClass('loading');\n const replace = $button.hasClass('replace');\n\n var postData = {\n assetId: this.assetId,\n viewportRotation: this.viewportRotation,\n imageRotation: this.imageStraightenAngle,\n replace: replace ? 1 : 0,\n };\n\n if (this.cropperState) {\n var cropData = {};\n\n cropData.height = this.cropperState.height;\n cropData.width = this.cropperState.width;\n cropData.offsetX = this.cropperState.offsetX;\n cropData.offsetY = this.cropperState.offsetY;\n\n postData.imageDimensions = this.cropperState.imageDimensions;\n\n postData.cropData = cropData;\n } else {\n postData.imageDimensions = this.getScaledImageDimensions();\n }\n\n if (this.focalPoint) {\n postData.focalPoint = this.focalPointState;\n }\n\n postData.flipData = this.flipData;\n postData.zoom = this.zoomRatio;\n\n Craft.sendActionRequest('POST', 'assets/save-image', {data: postData})\n .then(({data}) => {\n this.onSave(data);\n if (replace && Craft.broadcaster) {\n Craft.broadcaster.postMessage({\n event: 'saveElement',\n id: this.assetId,\n });\n }\n this.hide();\n Craft.cp.runQueue();\n\n // Refresh Live Preview\n Craft.Preview.refresh();\n })\n .catch(({response}) => {\n alert(response.data.message);\n })\n .finally(() => {\n this.$buttons.find('.btn').removeClass('loading');\n this.saving = false;\n });\n },\n\n /**\n * Return image zoom ratio depending on the straighten angle to cover a viewport by given dimensions.\n *\n * @param {Object} dimensions\n */\n getZoomToCoverRatio: function (dimensions) {\n // Convert the angle to radians\n var angleInRadians =\n Math.abs(this.imageStraightenAngle) * (Math.PI / 180);\n\n // Calculate the dimensions of the scaled image using the magic of math\n var scaledWidth =\n Math.sin(angleInRadians) * dimensions.height +\n Math.cos(angleInRadians) * dimensions.width;\n var scaledHeight =\n Math.sin(angleInRadians) * dimensions.width +\n Math.cos(angleInRadians) * dimensions.height;\n\n // Calculate the ratio\n return Math.max(\n scaledWidth / dimensions.width,\n scaledHeight / dimensions.height\n );\n },\n\n /**\n * Return image zoom ratio depending on the straighten angle to fit inside a viewport by given dimensions.\n *\n * @param {Object} dimensions\n */\n getZoomToFitRatio: function (dimensions) {\n // Get the bounding box for a rotated image\n var boundingBox = this._getImageBoundingBox(dimensions);\n\n // Scale the bounding box to fit\n var scale = 1;\n if (\n boundingBox.height > this.editorHeight ||\n boundingBox.width > this.editorWidth\n ) {\n var vertScale = this.editorHeight / boundingBox.height;\n var horiScale = this.editorWidth / boundingBox.width;\n scale = Math.min(horiScale, vertScale);\n }\n\n return scale;\n },\n\n /**\n * Return the combined zoom ratio to fit a rectangle inside image that's been zoomed to fit.\n */\n getCombinedZoomRatio: function (dimensions) {\n return (\n this.getZoomToCoverRatio(dimensions) /\n this.getZoomToFitRatio(dimensions)\n );\n },\n\n /**\n * Draw the grid.\n *\n * @private\n */\n _showGrid: function () {\n if (!this.grid) {\n var strokeOptions = {\n strokeWidth: 1,\n stroke: 'rgba(255,255,255,0.5)',\n };\n\n var lineCount = 8;\n var gridWidth = this.viewport.width;\n var gridHeight = this.viewport.height;\n var xStep = gridWidth / (lineCount + 1);\n var yStep = gridHeight / (lineCount + 1);\n\n var grid = [\n new fabric.Rect({\n strokeWidth: 2,\n stroke: 'rgba(255,255,255,1)',\n originX: 'center',\n originY: 'center',\n width: gridWidth,\n height: gridHeight,\n left: gridWidth / 2,\n top: gridHeight / 2,\n fill: 'rgba(255,255,255,0)',\n }),\n ];\n\n var i;\n for (i = 1; i <= lineCount; i++) {\n grid.push(\n new fabric.Line(\n [i * xStep, 0, i * xStep, gridHeight],\n strokeOptions\n )\n );\n }\n for (i = 1; i <= lineCount; i++) {\n grid.push(\n new fabric.Line([0, i * yStep, gridWidth, i * yStep], strokeOptions)\n );\n }\n\n this.grid = new fabric.Group(grid, {\n left: this.editorWidth / 2,\n top: this.editorHeight / 2,\n originX: 'center',\n originY: 'center',\n angle: this.viewport.angle,\n });\n\n this.canvas.add(this.grid);\n this.renderImage();\n }\n },\n\n /**\n * Hide the grid\n */\n _hideGrid: function () {\n this.canvas.remove(this.grid);\n this.grid = null;\n this.renderImage();\n },\n\n /**\n * Remove all the events when hiding the editor.\n */\n onFadeOut: function () {\n this.destroy();\n },\n\n /**\n * Make sure underlying content is not scrolled by accident.\n */\n show: function () {\n this.base();\n Garnish.$bod.addClass('no-scroll');\n },\n\n /**\n * Allow the content to scroll.\n */\n hide: function () {\n this.removeAllListeners();\n this.straighteningInput.removeAllListeners();\n Garnish.$bod.removeClass('no-scroll');\n this.base();\n },\n\n /**\n * onSave callback.\n */\n onSave: function (data) {\n this.settings.onSave(data);\n this.trigger('save');\n },\n\n /**\n * Enable the rotation slider.\n */\n enableSlider: function () {\n this.$imageTools.removeClass('hidden');\n },\n\n /**\n * Disable the rotation slider.\n */\n disableSlider: function () {\n this.$imageTools.addClass('hidden');\n },\n\n /**\n * Switch to crop mode.\n */\n enableCropMode: function () {\n var imageDimensions = this.getScaledImageDimensions();\n this.zoomRatio = this.getZoomToFitRatio(imageDimensions);\n\n var viewportProperties = {\n width: this.editorWidth,\n height: this.editorHeight,\n };\n\n var imageProperties = {\n width: imageDimensions.width * this.zoomRatio,\n height: imageDimensions.height * this.zoomRatio,\n left: this.editorWidth / 2,\n top: this.editorHeight / 2,\n };\n\n var callback = () => {\n this._setFittedImageVerticeCoordinates();\n\n // Restore cropper\n var state = this.cropperState;\n var scaledImageDimensions = this.getScaledImageDimensions();\n var sizeFactor =\n scaledImageDimensions.width / state.imageDimensions.width;\n\n // Restore based on the stored information\n var cropperData = {\n left: this.image.left + state.offsetX * sizeFactor * this.zoomRatio,\n top: this.image.top + state.offsetY * sizeFactor * this.zoomRatio,\n width: state.width * sizeFactor * this.zoomRatio,\n height: state.height * sizeFactor * this.zoomRatio,\n };\n\n this._showCropper(cropperData);\n\n if (this.focalPoint) {\n sizeFactor =\n scaledImageDimensions.width /\n this.focalPointState.imageDimensions.width;\n this.focalPoint.left =\n this.image.left +\n this.focalPointState.offsetX * sizeFactor * this.zoomRatio;\n this.focalPoint.top =\n this.image.top +\n this.focalPointState.offsetY * sizeFactor * this.zoomRatio;\n this.canvas.add(this.focalPoint);\n }\n };\n\n this._editorModeTransition(callback, imageProperties, viewportProperties);\n },\n\n /**\n * Switch out of crop mode.\n */\n disableCropMode: function () {\n var viewportProperties = {};\n\n this._hideCropper();\n var imageDimensions = this.getScaledImageDimensions();\n var targetZoom =\n this.getZoomToCoverRatio(imageDimensions) * this.scaleFactor;\n var inverseZoomFactor = targetZoom / this.zoomRatio;\n this.zoomRatio = targetZoom;\n\n var imageProperties = {\n width: imageDimensions.width * this.zoomRatio,\n height: imageDimensions.height * this.zoomRatio,\n left: this.editorWidth / 2,\n top: this.editorHeight / 2,\n };\n\n var offsetX = this.clipper.left - this.image.left;\n var offsetY = this.clipper.top - this.image.top;\n\n var imageOffsetX = offsetX * inverseZoomFactor;\n var imageOffsetY = offsetY * inverseZoomFactor;\n imageProperties.left = this.editorWidth / 2 - imageOffsetX;\n imageProperties.top = this.editorHeight / 2 - imageOffsetY;\n\n // Calculate the cropper dimensions after all the zooming\n viewportProperties.height = this.clipper.height * inverseZoomFactor;\n viewportProperties.width = this.clipper.width * inverseZoomFactor;\n\n if (\n !this.focalPoint ||\n (this.focalPoint &&\n !this._isCenterInside(this.focalPoint, this.clipper))\n ) {\n if (this.focalPoint) {\n this.toggleFocalPoint();\n }\n\n this._resetFocalPointPosition();\n }\n\n var callback = () => {\n // Reposition focal point correctly\n if (this.focalPoint) {\n var sizeFactor =\n this.getScaledImageDimensions().width /\n this.focalPointState.imageDimensions.width;\n this.focalPoint.left =\n this.image.left +\n this.focalPointState.offsetX * sizeFactor * this.zoomRatio;\n this.focalPoint.top =\n this.image.top +\n this.focalPointState.offsetY * sizeFactor * this.zoomRatio;\n this.canvas.add(this.focalPoint);\n }\n };\n\n this._editorModeTransition(callback, imageProperties, viewportProperties);\n },\n\n /**\n * @callback editorModeTransitionCallback\n */\n /**\n * Transition between cropping end editor modes\n *\n * @param {editorModeTransitionCallback}\n * @param {Object} imageProperties\n * @param {Object} viewportProperties\n * @private\n */\n _editorModeTransition: function (\n callback,\n imageProperties,\n viewportProperties\n ) {\n this._queue.pause();\n\n if (!this.animationInProgress) {\n this.animationInProgress = true;\n\n // Without this it looks semi-broken during animation\n if (this.focalPoint) {\n this.canvas.remove(this.focalPoint);\n this.renderImage();\n }\n\n this.image.animate(imageProperties, {\n onChange: this.canvas.renderAll.bind(this.canvas),\n duration: this.settings.animationDuration,\n onComplete: () => {\n callback();\n this.animationInProgress = false;\n this.renderImage();\n this._queue.resume();\n },\n });\n\n this.viewport.animate(viewportProperties, {\n duration: this.settings.animationDuration,\n });\n }\n },\n\n _showSpinner: function () {\n if (!this.$spinner) {\n this.$spinner = $('<div class=\"spinner big spinner-absolute\"/>');\n }\n this.$spinner.appendTo(this.$container.find('.image'));\n },\n\n _hideSpinner: function () {\n this.$spinner.remove();\n },\n\n /**\n * Show the cropper.\n *\n * @param {Object} clipperData\n */\n _showCropper: function (clipperData) {\n this._setupCropperLayer(clipperData);\n this._redrawCropperElements();\n this.renderCropper();\n },\n\n /**\n * Hide the cropper.\n */\n _hideCropper: function () {\n if (this.clipper) {\n this.croppingCanvas.remove(this.clipper);\n this.croppingCanvas.remove(this.croppingShade);\n this.croppingCanvas.remove(this.cropperHandles);\n this.croppingCanvas.remove(this.cropperGrid);\n this.croppingCanvas.remove(this.croppingRectangle);\n\n this.croppingCanvas = null;\n this.renderCropper = null;\n }\n },\n\n /**\n * Draw the cropper.\n *\n * @param {Object} clipperData\n */\n _setupCropperLayer: function (clipperData) {\n // Set up the canvas for cropper\n this.croppingCanvas = new fabric.StaticCanvas('cropping-canvas', {\n backgroundColor: 'rgba(0,0,0,0)',\n hoverCursor: 'default',\n selection: false,\n });\n\n this.croppingCanvas.setDimensions({\n width: this.editorWidth,\n height: this.editorHeight,\n });\n\n this.renderCropper = () =>\n Garnish.requestAnimationFrame(\n this.croppingCanvas.renderAll.bind(this.croppingCanvas)\n );\n\n $('#cropping-canvas', this.$editorContainer).css({\n position: 'absolute',\n top: 0,\n left: 0,\n });\n\n this.croppingShade = new fabric.Rect({\n left: this.editorWidth / 2,\n top: this.editorHeight / 2,\n originX: 'center',\n originY: 'center',\n width: this.editorWidth,\n height: this.editorHeight,\n fill: 'rgba(0,0,0,0.7)',\n });\n\n // Calculate the cropping rectangle size\n var imageDimensions = this.getScaledImageDimensions();\n var rectangleRatio =\n this.imageStraightenAngle === 0\n ? 1\n : this.getCombinedZoomRatio(imageDimensions) * 1.2;\n var rectWidth = imageDimensions.width / rectangleRatio;\n var rectHeight = imageDimensions.height / rectangleRatio;\n\n if (this.hasOrientationChanged()) {\n var temp = rectHeight;\n rectHeight = rectWidth;\n rectWidth = temp;\n }\n\n // Set up the cropping viewport rectangle\n this.clipper = new fabric.Rect({\n left: this.editorWidth / 2,\n top: this.editorHeight / 2,\n originX: 'center',\n originY: 'center',\n width: rectWidth,\n height: rectHeight,\n stroke: 'black',\n fill: 'rgba(128,0,0,1)',\n strokeWidth: 0,\n });\n\n // Set from clipper data\n if (clipperData) {\n this.clipper.set(clipperData);\n }\n\n this.clipper.globalCompositeOperation = 'destination-out';\n this.croppingCanvas.add(this.croppingShade);\n this.croppingCanvas.add(this.clipper);\n },\n\n /**\n * Redraw the cropper boundaries\n */\n _redrawCropperElements: function () {\n if (typeof this._redrawCropperElements._ === 'undefined') {\n this._redrawCropperElements._ = {};\n }\n\n if (this.cropperHandles) {\n this.croppingCanvas.remove(this.cropperHandles);\n this.croppingCanvas.remove(this.cropperGrid);\n this.croppingCanvas.remove(this.croppingRectangle);\n }\n this._redrawCropperElements._.lineOptions = {\n strokeWidth: 4,\n stroke: 'rgb(255,255,255)',\n fill: false,\n };\n\n this._redrawCropperElements._.gridOptions = {\n strokeWidth: 2,\n stroke: 'rgba(255,255,255,0.5)',\n };\n\n // Draw the handles\n this._redrawCropperElements._.pathGroup = [\n new fabric.Path(\n 'M 0,10 L 0,0 L 10,0',\n this._redrawCropperElements._.lineOptions\n ),\n new fabric.Path(\n 'M ' +\n (this.clipper.width - 8) +\n ',0 L ' +\n (this.clipper.width + 4) +\n ',0 L ' +\n (this.clipper.width + 4) +\n ',10',\n this._redrawCropperElements._.lineOptions\n ),\n new fabric.Path(\n 'M ' +\n (this.clipper.width + 4) +\n ',' +\n (this.clipper.height - 8) +\n ' L' +\n (this.clipper.width + 4) +\n ',' +\n (this.clipper.height + 4) +\n ' L ' +\n (this.clipper.width - 8) +\n ',' +\n (this.clipper.height + 4),\n this._redrawCropperElements._.lineOptions\n ),\n new fabric.Path(\n 'M 10,' +\n (this.clipper.height + 4) +\n ' L 0,' +\n (this.clipper.height + 4) +\n ' L 0,' +\n (this.clipper.height - 8),\n this._redrawCropperElements._.lineOptions\n ),\n ];\n\n this.cropperHandles = new fabric.Group(\n this._redrawCropperElements._.pathGroup,\n {\n left: this.clipper.left,\n top: this.clipper.top,\n originX: 'center',\n originY: 'center',\n }\n );\n\n // Don't forget the rectangle\n this.croppingRectangle = new fabric.Rect({\n left: this.clipper.left,\n top: this.clipper.top,\n width: this.clipper.width,\n height: this.clipper.height,\n fill: 'rgba(0,0,0,0)',\n stroke: 'rgba(255,255,255,0.8)',\n strokeWidth: 2,\n originX: 'center',\n originY: 'center',\n });\n\n this.cropperGrid = new fabric.Group(\n [\n new fabric.Line(\n [\n this.clipper.width * 0.33,\n 0,\n this.clipper.width * 0.33,\n this.clipper.height,\n ],\n this._redrawCropperElements._.gridOptions\n ),\n new fabric.Line(\n [\n this.clipper.width * 0.66,\n 0,\n this.clipper.width * 0.66,\n this.clipper.height,\n ],\n this._redrawCropperElements._.gridOptions\n ),\n new fabric.Line(\n [\n 0,\n this.clipper.height * 0.33,\n this.clipper.width,\n this.clipper.height * 0.33,\n ],\n this._redrawCropperElements._.gridOptions\n ),\n new fabric.Line(\n [\n 0,\n this.clipper.height * 0.66,\n this.clipper.width,\n this.clipper.height * 0.66,\n ],\n this._redrawCropperElements._.gridOptions\n ),\n ],\n {\n left: this.clipper.left,\n top: this.clipper.top,\n originX: 'center',\n originY: 'center',\n }\n );\n\n this._redrawCropperElements._.cropTextTop =\n this.croppingRectangle.top + this.clipper.height / 2 + 12;\n this._redrawCropperElements._.cropTextBackgroundColor = 'rgba(0,0,0,0)';\n\n if (\n this._redrawCropperElements._.cropTextTop + 12 >\n this.editorHeight - 2\n ) {\n this._redrawCropperElements._.cropTextTop -= 24;\n this._redrawCropperElements._.cropTextBackgroundColor =\n 'rgba(0,0,0,0.5)';\n }\n\n this.croppingCanvas.add(this.cropperHandles);\n this.croppingCanvas.add(this.cropperGrid);\n this.croppingCanvas.add(this.croppingRectangle);\n },\n\n /**\n * Reposition the cropper when the image editor dimensions change.\n *\n * @param {Object} previousImageArea\n */\n _repositionCropper: function (previousImageArea) {\n if (!this.croppingCanvas) {\n return;\n }\n\n // Get the current clipper offset relative to center\n var currentOffset = {\n x: this.clipper.left - this.croppingCanvas.width / 2,\n y: this.clipper.top - this.croppingCanvas.height / 2,\n };\n\n // Resize the cropping canvas\n this.croppingCanvas.setDimensions({\n width: this.editorWidth,\n height: this.editorHeight,\n });\n\n // Check by what factor will the new final bounding box be different\n var currentArea = this._getBoundingRectangle(this.imageVerticeCoords);\n var areaFactor = currentArea.width / previousImageArea.width;\n\n // Adjust the cropper size to scale along with the bounding box\n this.clipper.width = Math.round(this.clipper.width * areaFactor);\n this.clipper.height = Math.round(this.clipper.height * areaFactor);\n\n // Adjust the coordinates: re-position clipper in relation to the new center to adjust\n // for editor size changes and then multiply by the size factor to adjust for image size changes\n this.clipper.left = this.editorWidth / 2 + currentOffset.x * areaFactor;\n this.clipper.top = this.editorHeight / 2 + currentOffset.y * areaFactor;\n\n // Resize the cropping shade\n this.croppingShade.set({\n width: this.editorWidth,\n height: this.editorHeight,\n left: this.editorWidth / 2,\n top: this.editorHeight / 2,\n });\n\n this._redrawCropperElements();\n this.renderCropper();\n },\n\n /**\n * Get the dimensions of a bounding rectangle by a set of four coordinates.\n *\n * @param {Object} coordinateSet\n */\n _getBoundingRectangle: function (coordinateSet) {\n return {\n width:\n Math.max(\n coordinateSet.a.x,\n coordinateSet.b.x,\n coordinateSet.c.x,\n coordinateSet.d.x\n ) -\n Math.min(\n coordinateSet.a.x,\n coordinateSet.b.x,\n coordinateSet.c.x,\n coordinateSet.d.x\n ),\n height:\n Math.max(\n coordinateSet.a.y,\n coordinateSet.b.y,\n coordinateSet.c.y,\n coordinateSet.d.y\n ) -\n Math.min(\n coordinateSet.a.y,\n coordinateSet.b.y,\n coordinateSet.c.y,\n coordinateSet.d.y\n ),\n };\n },\n\n /**\n * Handle the mouse being clicked.\n *\n * @param {Object} ev\n */\n _handleMouseDown: function (ev) {\n // Focal before resize before dragging\n var focal = this.focalPoint && this._isMouseOver(ev, this.focalPoint);\n var move = this.croppingCanvas && this._isMouseOver(ev, this.clipper);\n var handle = this.croppingCanvas && this._cropperHandleHitTest(ev);\n\n if (handle || move || focal) {\n this.previousMouseX = ev.pageX;\n this.previousMouseY = ev.pageY;\n\n if (focal) {\n this.draggingFocal = true;\n } else if (handle) {\n this.scalingCropper = handle;\n } else if (move) {\n this.draggingCropper = true;\n }\n }\n },\n\n /**\n * Handle the mouse being moved.\n *\n * @param {Object} ev\n */\n _handleMouseMove: function (ev) {\n if (this.mouseMoveEvent !== null) {\n Garnish.requestAnimationFrame(this._handleMouseMoveInternal.bind(this));\n }\n this.mouseMoveEvent = ev;\n },\n\n _handleMouseMoveInternal: function () {\n if (this.mouseMoveEvent === null) {\n return;\n }\n\n if (this.focalPoint && this.draggingFocal) {\n this._handleFocalDrag(this.mouseMoveEvent);\n this.storeFocalPointState();\n this.renderImage();\n } else if (this.draggingCropper || this.scalingCropper) {\n if (this.draggingCropper) {\n this._handleCropperDrag(this.mouseMoveEvent);\n } else {\n this._handleCropperResize(this.mouseMoveEvent);\n }\n\n this._redrawCropperElements();\n\n this.storeCropperState();\n this.renderCropper();\n } else {\n this._setMouseCursor(this.mouseMoveEvent);\n }\n\n this.previousMouseX = this.mouseMoveEvent.pageX;\n this.previousMouseY = this.mouseMoveEvent.pageY;\n\n this.mouseMoveEvent = null;\n },\n\n /**\n * Handle mouse being released.\n */\n _handleMouseUp: function () {\n this.draggingCropper = false;\n this.scalingCropper = false;\n this.draggingFocal = false;\n },\n\n /**\n * Handle mouse out\n *\n * @param {Object} ev\n */\n _handleMouseOut: function (ev) {\n this._handleMouseUp(ev);\n this.mouseMoveEvent = ev;\n this._handleMouseMoveInternal();\n },\n\n /**\n * Handle cropper being dragged.\n *\n * @param {Object} ev\n */\n _handleCropperDrag: function (ev) {\n if (typeof this._handleCropperDrag._ === 'undefined') {\n this._handleCropperDrag._ = {};\n }\n\n this._handleCropperDrag._.deltaX = ev.pageX - this.previousMouseX;\n this._handleCropperDrag._.deltaY = ev.pageY - this.previousMouseY;\n\n if (\n this._handleCropperDrag._.deltaX === 0 &&\n this._handleCropperDrag._.deltaY === 0\n ) {\n return false;\n }\n\n this._handleCropperDrag._.rectangle = {\n left: this.clipper.left - this.clipper.width / 2,\n top: this.clipper.top - this.clipper.height / 2,\n width: this.clipper.width,\n height: this.clipper.height,\n };\n\n this._handleCropperDrag._.vertices = this._getRectangleVertices(\n this._handleCropperDrag._.rectangle,\n this._handleCropperDrag._.deltaX,\n this._handleCropperDrag._.deltaY\n );\n\n // If this would drag it outside of the image\n if (\n !this.arePointsInsideRectangle(\n this._handleCropperDrag._.vertices,\n this.imageVerticeCoords\n )\n ) {\n // Try to find the furthest point in the same general direction where we can drag it\n\n // Delta iterator setup\n this._handleCropperDrag._.dxi = 0;\n this._handleCropperDrag._.dyi = 0;\n this._handleCropperDrag._.xStep =\n this._handleCropperDrag._.deltaX > 0 ? -1 : 1;\n this._handleCropperDrag._.yStep =\n this._handleCropperDrag._.deltaY > 0 ? -1 : 1;\n\n // The furthest we can move\n this._handleCropperDrag._.furthest = 0;\n this._handleCropperDrag._.furthestDeltas = {};\n\n // Loop through every combination of dragging it not so far\n for (\n this._handleCropperDrag._.dxi = Math.min(\n Math.abs(this._handleCropperDrag._.deltaX),\n 10\n );\n this._handleCropperDrag._.dxi >= 0;\n this._handleCropperDrag._.dxi--\n ) {\n for (\n this._handleCropperDrag._.dyi = Math.min(\n Math.abs(this._handleCropperDrag._.deltaY),\n 10\n );\n this._handleCropperDrag._.dyi >= 0;\n this._handleCropperDrag._.dyi--\n ) {\n this._handleCropperDrag._.vertices = this._getRectangleVertices(\n this._handleCropperDrag._.rectangle,\n this._handleCropperDrag._.dxi *\n (this._handleCropperDrag._.deltaX > 0 ? 1 : -1),\n this._handleCropperDrag._.dyi *\n (this._handleCropperDrag._.deltaY > 0 ? 1 : -1)\n );\n\n if (\n this.arePointsInsideRectangle(\n this._handleCropperDrag._.vertices,\n this.imageVerticeCoords\n )\n ) {\n if (\n this._handleCropperDrag._.dxi + this._handleCropperDrag._.dyi >\n this._handleCropperDrag._.furthest\n ) {\n this._handleCropperDrag._.furthest =\n this._handleCropperDrag._.dxi + this._handleCropperDrag._.dyi;\n this._handleCropperDrag._.furthestDeltas = {\n x:\n this._handleCropperDrag._.dxi *\n (this._handleCropperDrag._.deltaX > 0 ? 1 : -1),\n y:\n this._handleCropperDrag._.dyi *\n (this._handleCropperDrag._.deltaY > 0 ? 1 : -1),\n };\n }\n }\n }\n }\n\n // REALLY can't drag along the cursor movement\n if (this._handleCropperDrag._.furthest == 0) {\n return;\n } else {\n this._handleCropperDrag._.deltaX =\n this._handleCropperDrag._.furthestDeltas.x;\n this._handleCropperDrag._.deltaY =\n this._handleCropperDrag._.furthestDeltas.y;\n }\n }\n\n this.clipper.set({\n left: this.clipper.left + this._handleCropperDrag._.deltaX,\n top: this.clipper.top + this._handleCropperDrag._.deltaY,\n });\n },\n\n /**\n * Handle focal point being dragged.\n *\n * @param {Object} ev\n */\n _handleFocalDrag: function (ev) {\n if (typeof this._handleFocalDrag._ === 'undefined') {\n this._handleFocalDrag._ = {};\n }\n\n if (this.focalPoint) {\n this._handleFocalDrag._.deltaX = ev.pageX - this.previousMouseX;\n this._handleFocalDrag._.deltaY = ev.pageY - this.previousMouseY;\n\n if (\n this._handleFocalDrag._.deltaX === 0 &&\n this._handleFocalDrag._.deltaY === 0\n ) {\n return;\n }\n\n this._handleFocalDrag._.newX =\n this.focalPoint.left + this._handleFocalDrag._.deltaX;\n this._handleFocalDrag._.newY =\n this.focalPoint.top + this._handleFocalDrag._.deltaY;\n\n // Just make sure that the focal point stays inside the image\n if (this.currentView === 'crop') {\n if (\n !this.arePointsInsideRectangle(\n [\n {\n x: this._handleFocalDrag._.newX,\n y: this._handleFocalDrag._.newY,\n },\n ],\n this.imageVerticeCoords\n )\n ) {\n return;\n }\n } else {\n if (\n !(\n this.viewport.left -\n this.viewport.width / 2 -\n this._handleFocalDrag._.newX <\n 0 &&\n this.viewport.left +\n this.viewport.width / 2 -\n this._handleFocalDrag._.newX >\n 0 &&\n this.viewport.top -\n this.viewport.height / 2 -\n this._handleFocalDrag._.newY <\n 0 &&\n this.viewport.top +\n this.viewport.height / 2 -\n this._handleFocalDrag._.newY >\n 0\n )\n ) {\n return;\n }\n }\n\n this.focalPoint.set({\n left: this.focalPoint.left + this._handleFocalDrag._.deltaX,\n top: this.focalPoint.top + this._handleFocalDrag._.deltaY,\n });\n }\n },\n\n /**\n * Set the cropping constraint\n * @param {string} constraint\n */\n setCroppingConstraint: function (constraint) {\n // In case this caused the sidebar width to change.\n this.updateSizeAndPosition();\n\n switch (constraint) {\n case 'none':\n this.croppingConstraint = false;\n break;\n\n case 'original':\n this.croppingConstraint = this.originalWidth / this.originalHeight;\n break;\n\n case 'current':\n this.croppingConstraint = this.clipper.width / this.clipper.height;\n break;\n\n case 'custom':\n break;\n default:\n this.croppingConstraint = parseFloat(constraint);\n\n break;\n }\n },\n\n /**\n * Enforce the cropping constraint\n */\n enforceCroppingConstraint: function () {\n if (typeof this.enforceCroppingConstraint._ === 'undefined') {\n this.enforceCroppingConstraint._ = {};\n }\n\n if (this.animationInProgress || !this.croppingConstraint) {\n return;\n }\n\n this.animationInProgress = true;\n\n // Mock the clipping rectangle for collision tests\n this.enforceCroppingConstraint._.rectangle = {\n left: this.clipper.left - this.clipper.width / 2,\n top: this.clipper.top - this.clipper.height / 2,\n width: this.clipper.width,\n height: this.clipper.height,\n };\n\n // If wider than it should be\n if (this.clipper.width > this.clipper.height * this.croppingConstraint) {\n this.enforceCroppingConstraint._.previousHeight =\n this.enforceCroppingConstraint._.rectangle.height;\n\n // Make it taller!\n this.enforceCroppingConstraint._.rectangle.height =\n this.clipper.width / this.croppingConstraint;\n\n // Getting really awkward having to convert between 0;0 being center or top-left corner.\n this.enforceCroppingConstraint._.rectangle.top -=\n (this.enforceCroppingConstraint._.rectangle.height -\n this.enforceCroppingConstraint._.previousHeight) /\n 2;\n\n // If the clipper would end up out of bounds, make it narrower instead.\n if (\n !this.arePointsInsideRectangle(\n this._getRectangleVertices(\n this.enforceCroppingConstraint._.rectangle\n ),\n this.imageVerticeCoords\n )\n ) {\n this.enforceCroppingConstraint._.rectangle.width =\n this.clipper.height * this.croppingConstraint;\n this.enforceCroppingConstraint._.rectangle.height =\n this.enforceCroppingConstraint._.rectangle.width /\n this.croppingConstraint;\n }\n } else {\n // Follow the same pattern, if taller than it should be.\n this.enforceCroppingConstraint._.previousWidth =\n this.enforceCroppingConstraint._.rectangle.width;\n this.enforceCroppingConstraint._.rectangle.width =\n this.clipper.height * this.croppingConstraint;\n this.enforceCroppingConstraint._.rectangle.left -=\n (this.enforceCroppingConstraint._.rectangle.width -\n this.enforceCroppingConstraint._.previousWidth) /\n 2;\n\n if (\n !this.arePointsInsideRectangle(\n this._getRectangleVertices(\n this.enforceCroppingConstraint._.rectangle\n ),\n this.imageVerticeCoords\n )\n ) {\n this.enforceCroppingConstraint._.rectangle.height =\n this.clipper.width / this.croppingConstraint;\n this.enforceCroppingConstraint._.rectangle.width =\n this.enforceCroppingConstraint._.rectangle.height *\n this.croppingConstraint;\n }\n }\n\n this.enforceCroppingConstraint._.properties = {\n height: this.enforceCroppingConstraint._.rectangle.height,\n width: this.enforceCroppingConstraint._.rectangle.width,\n };\n\n // Make sure to redraw cropper handles and gridlines when resizing\n this.clipper.animate(this.enforceCroppingConstraint._.properties, {\n onChange: () => {\n this._redrawCropperElements();\n this.croppingCanvas.renderAll();\n },\n duration: this.settings.animationDuration,\n onComplete: () => {\n this._redrawCropperElements();\n this.animationInProgress = false;\n this.renderCropper();\n this.storeCropperState();\n },\n });\n },\n\n /**\n * Handle cropper being resized.\n *\n * @param {Object} ev\n */\n _handleCropperResize: function (ev) {\n if (typeof this._handleCropperResize._ === 'undefined') {\n this._handleCropperResize._ = {};\n }\n\n // Size deltas\n this._handleCropperResize._.deltaX = ev.pageX - this.previousMouseX;\n this._handleCropperResize._.deltaY = ev.pageY - this.previousMouseY;\n\n if (this.scalingCropper === 'b' || this.scalingCropper === 't') {\n this._handleCropperResize._.deltaX = 0;\n }\n\n if (this.scalingCropper === 'l' || this.scalingCropper === 'r') {\n this._handleCropperResize._.deltaY = 0;\n }\n\n if (\n this._handleCropperResize._.deltaX === 0 &&\n this._handleCropperResize._.deltaY === 0\n ) {\n return;\n }\n\n // Translate from center-center origin to absolute coords\n this._handleCropperResize._.startingRectangle = {\n left: this.clipper.left - this.clipper.width / 2,\n top: this.clipper.top - this.clipper.height / 2,\n width: this.clipper.width,\n height: this.clipper.height,\n };\n\n this._handleCropperResize._.rectangle =\n this._calculateNewCropperSizeByDeltas(\n this._handleCropperResize._.startingRectangle,\n this._handleCropperResize._.deltaX,\n this._handleCropperResize._.deltaY,\n this.scalingCropper\n );\n\n if (\n this._handleCropperResize._.rectangle.height < 30 ||\n this._handleCropperResize._.rectangle.width < 30\n ) {\n return;\n }\n\n if (\n !this.arePointsInsideRectangle(\n this._getRectangleVertices(this._handleCropperResize._.rectangle),\n this.imageVerticeCoords\n )\n ) {\n return;\n }\n\n // Translate back to center-center origin.\n this.clipper.set({\n top:\n this._handleCropperResize._.rectangle.top +\n this._handleCropperResize._.rectangle.height / 2,\n left:\n this._handleCropperResize._.rectangle.left +\n this._handleCropperResize._.rectangle.width / 2,\n width: this._handleCropperResize._.rectangle.width,\n height: this._handleCropperResize._.rectangle.height,\n });\n\n this._redrawCropperElements();\n },\n\n _calculateNewCropperSizeByDeltas: function (\n startingRectangle,\n deltaX,\n deltaY,\n cropperDirection\n ) {\n if (typeof this._calculateNewCropperSizeByDeltas._ === 'undefined') {\n this._calculateNewCropperSizeByDeltas._ = {};\n }\n\n // Center deltas\n this._calculateNewCropperSizeByDeltas._.topDelta = 0;\n this._calculateNewCropperSizeByDeltas._.leftDelta = 0;\n\n this._calculateNewCropperSizeByDeltas._.rectangle = startingRectangle;\n this._calculateNewCropperSizeByDeltas._.deltaX = deltaX;\n this._calculateNewCropperSizeByDeltas._.deltaY = deltaY;\n\n // Lock the aspect ratio if needed\n if (this.croppingConstraint) {\n this._calculateNewCropperSizeByDeltas._.change = 0;\n\n // Take into account the mouse direction and figure out the \"real\" change in cropper size\n switch (cropperDirection) {\n case 't':\n this._calculateNewCropperSizeByDeltas._.change =\n -this._calculateNewCropperSizeByDeltas._.deltaY;\n break;\n case 'b':\n this._calculateNewCropperSizeByDeltas._.change =\n this._calculateNewCropperSizeByDeltas._.deltaY;\n break;\n case 'r':\n this._calculateNewCropperSizeByDeltas._.change =\n this._calculateNewCropperSizeByDeltas._.deltaX;\n break;\n case 'l':\n this._calculateNewCropperSizeByDeltas._.change =\n -this._calculateNewCropperSizeByDeltas._.deltaX;\n break;\n case 'tr':\n this._calculateNewCropperSizeByDeltas._.change =\n Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY) >\n Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)\n ? -this._calculateNewCropperSizeByDeltas._.deltaY\n : this._calculateNewCropperSizeByDeltas._.deltaX;\n break;\n case 'tl':\n this._calculateNewCropperSizeByDeltas._.change =\n Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY) >\n Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)\n ? -this._calculateNewCropperSizeByDeltas._.deltaY\n : -this._calculateNewCropperSizeByDeltas._.deltaX;\n break;\n case 'br':\n this._calculateNewCropperSizeByDeltas._.change =\n Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY) >\n Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)\n ? this._calculateNewCropperSizeByDeltas._.deltaY\n : this._calculateNewCropperSizeByDeltas._.deltaX;\n break;\n case 'bl':\n this._calculateNewCropperSizeByDeltas._.change =\n Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY) >\n Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)\n ? this._calculateNewCropperSizeByDeltas._.deltaY\n : -this._calculateNewCropperSizeByDeltas._.deltaX;\n break;\n }\n\n if (this.croppingConstraint > 1) {\n this._calculateNewCropperSizeByDeltas._.deltaX =\n this._calculateNewCropperSizeByDeltas._.change;\n this._calculateNewCropperSizeByDeltas._.deltaY =\n this._calculateNewCropperSizeByDeltas._.deltaX /\n this.croppingConstraint;\n } else {\n this._calculateNewCropperSizeByDeltas._.deltaY =\n this._calculateNewCropperSizeByDeltas._.change;\n this._calculateNewCropperSizeByDeltas._.deltaX =\n this._calculateNewCropperSizeByDeltas._.deltaY *\n this.croppingConstraint;\n }\n\n this._calculateNewCropperSizeByDeltas._.rectangle.height +=\n this._calculateNewCropperSizeByDeltas._.deltaY;\n this._calculateNewCropperSizeByDeltas._.rectangle.width +=\n this._calculateNewCropperSizeByDeltas._.deltaX;\n\n // Make the cropper compress/expand relative to the correct edge to make it feel \"right\"\n switch (cropperDirection) {\n case 't':\n this._calculateNewCropperSizeByDeltas._.rectangle.top -=\n this._calculateNewCropperSizeByDeltas._.deltaY;\n this._calculateNewCropperSizeByDeltas._.rectangle.left -=\n this._calculateNewCropperSizeByDeltas._.deltaX / 2;\n break;\n case 'b':\n this._calculateNewCropperSizeByDeltas._.rectangle.left +=\n -this._calculateNewCropperSizeByDeltas._.deltaX / 2;\n break;\n case 'r':\n this._calculateNewCropperSizeByDeltas._.rectangle.top +=\n -this._calculateNewCropperSizeByDeltas._.deltaY / 2;\n break;\n case 'l':\n this._calculateNewCropperSizeByDeltas._.rectangle.top -=\n this._calculateNewCropperSizeByDeltas._.deltaY / 2;\n this._calculateNewCropperSizeByDeltas._.rectangle.left -=\n this._calculateNewCropperSizeByDeltas._.deltaX;\n break;\n case 'tr':\n this._calculateNewCropperSizeByDeltas._.rectangle.top -=\n this._calculateNewCropperSizeByDeltas._.deltaY;\n break;\n case 'tl':\n this._calculateNewCropperSizeByDeltas._.rectangle.top -=\n this._calculateNewCropperSizeByDeltas._.deltaY;\n this._calculateNewCropperSizeByDeltas._.rectangle.left -=\n this._calculateNewCropperSizeByDeltas._.deltaX;\n break;\n case 'bl':\n this._calculateNewCropperSizeByDeltas._.rectangle.left -=\n this._calculateNewCropperSizeByDeltas._.deltaX;\n break;\n }\n } else {\n // Lock the aspect ratio\n if (\n this.shiftKeyHeld &&\n (cropperDirection === 'tl' ||\n cropperDirection === 'tr' ||\n cropperDirection === 'bl' ||\n cropperDirection === 'br')\n ) {\n this._calculateNewCropperSizeByDeltas._.ratio;\n if (Math.abs(deltaX) > Math.abs(deltaY)) {\n this._calculateNewCropperSizeByDeltas._.ratio =\n startingRectangle.width / startingRectangle.height;\n this._calculateNewCropperSizeByDeltas._.deltaY =\n this._calculateNewCropperSizeByDeltas._.deltaX /\n this._calculateNewCropperSizeByDeltas._.ratio;\n this._calculateNewCropperSizeByDeltas._.deltaY *=\n cropperDirection === 'tr' || cropperDirection === 'bl' ? -1 : 1;\n } else {\n this._calculateNewCropperSizeByDeltas._.ratio =\n startingRectangle.width / startingRectangle.height;\n this._calculateNewCropperSizeByDeltas._.deltaX =\n this._calculateNewCropperSizeByDeltas._.deltaY *\n this._calculateNewCropperSizeByDeltas._.ratio;\n this._calculateNewCropperSizeByDeltas._.deltaX *=\n cropperDirection === 'tr' || cropperDirection === 'bl' ? -1 : 1;\n }\n }\n\n if (cropperDirection.match(/t/)) {\n this._calculateNewCropperSizeByDeltas._.rectangle.top +=\n this._calculateNewCropperSizeByDeltas._.deltaY;\n this._calculateNewCropperSizeByDeltas._.rectangle.height -=\n this._calculateNewCropperSizeByDeltas._.deltaY;\n }\n if (cropperDirection.match(/b/)) {\n this._calculateNewCropperSizeByDeltas._.rectangle.height +=\n this._calculateNewCropperSizeByDeltas._.deltaY;\n }\n if (cropperDirection.match(/r/)) {\n this._calculateNewCropperSizeByDeltas._.rectangle.width +=\n this._calculateNewCropperSizeByDeltas._.deltaX;\n }\n if (cropperDirection.match(/l/)) {\n this._calculateNewCropperSizeByDeltas._.rectangle.left +=\n this._calculateNewCropperSizeByDeltas._.deltaX;\n this._calculateNewCropperSizeByDeltas._.rectangle.width -=\n this._calculateNewCropperSizeByDeltas._.deltaX;\n }\n }\n\n this._calculateNewCropperSizeByDeltas._.rectangle.top =\n this._calculateNewCropperSizeByDeltas._.rectangle.top;\n this._calculateNewCropperSizeByDeltas._.rectangle.left =\n this._calculateNewCropperSizeByDeltas._.rectangle.left;\n this._calculateNewCropperSizeByDeltas._.rectangle.width =\n this._calculateNewCropperSizeByDeltas._.rectangle.width;\n this._calculateNewCropperSizeByDeltas._.rectangle.height =\n this._calculateNewCropperSizeByDeltas._.rectangle.height;\n\n return this._calculateNewCropperSizeByDeltas._.rectangle;\n },\n\n /**\n * Set mouse cursor by it's position over cropper.\n *\n * @param {Object} ev\n */\n _setMouseCursor: function (ev) {\n if (typeof this._setMouseCursor._ === 'undefined') {\n this._setMouseCursor._ = {};\n }\n\n if (Garnish.isMobileBrowser(true)) {\n return;\n }\n this._setMouseCursor._.cursor = 'default';\n this._setMouseCursor._.handle =\n this.croppingCanvas && this._cropperHandleHitTest(ev);\n if (this.focalPoint && this._isMouseOver(ev, this.focalPoint)) {\n this._setMouseCursor._.cursor = 'pointer';\n } else if (this._setMouseCursor._.handle) {\n if (\n this._setMouseCursor._.handle === 't' ||\n this._setMouseCursor._.handle === 'b'\n ) {\n this._setMouseCursor._.cursor = 'ns-resize';\n } else if (\n this._setMouseCursor._.handle === 'l' ||\n this._setMouseCursor._.handle === 'r'\n ) {\n this._setMouseCursor._.cursor = 'ew-resize';\n } else if (\n this._setMouseCursor._.handle === 'tl' ||\n this._setMouseCursor._.handle === 'br'\n ) {\n this._setMouseCursor._.cursor = 'nwse-resize';\n } else if (\n this._setMouseCursor._.handle === 'bl' ||\n this._setMouseCursor._.handle === 'tr'\n ) {\n this._setMouseCursor._.cursor = 'nesw-resize';\n }\n } else if (this.croppingCanvas && this._isMouseOver(ev, this.clipper)) {\n this._setMouseCursor._.cursor = 'move';\n }\n\n $('.body').css('cursor', this._setMouseCursor._.cursor);\n },\n\n /**\n * Test whether the mouse cursor is on any cropper handles.\n *\n * @param {Object} ev\n */\n _cropperHandleHitTest: function (ev) {\n if (typeof this._cropperHandleHitTest._ === 'undefined') {\n this._cropperHandleHitTest._ = {};\n }\n\n this._cropperHandleHitTest._.parentOffset = this.$croppingCanvas.offset();\n this._cropperHandleHitTest._.mouseX =\n ev.pageX - this._cropperHandleHitTest._.parentOffset.left;\n this._cropperHandleHitTest._.mouseY =\n ev.pageY - this._cropperHandleHitTest._.parentOffset.top;\n\n // Compensate for center origin coordinate-wise\n this._cropperHandleHitTest._.lb =\n this.clipper.left - this.clipper.width / 2;\n this._cropperHandleHitTest._.rb =\n this._cropperHandleHitTest._.lb + this.clipper.width;\n this._cropperHandleHitTest._.tb =\n this.clipper.top - this.clipper.height / 2;\n this._cropperHandleHitTest._.bb =\n this._cropperHandleHitTest._.tb + this.clipper.height;\n\n // Left side top/bottom\n if (\n this._cropperHandleHitTest._.mouseX <\n this._cropperHandleHitTest._.lb + 10 &&\n this._cropperHandleHitTest._.mouseX >\n this._cropperHandleHitTest._.lb - 3\n ) {\n if (\n this._cropperHandleHitTest._.mouseY <\n this._cropperHandleHitTest._.tb + 10 &&\n this._cropperHandleHitTest._.mouseY >\n this._cropperHandleHitTest._.tb - 3\n ) {\n return 'tl';\n } else if (\n this._cropperHandleHitTest._.mouseY <\n this._cropperHandleHitTest._.bb + 3 &&\n this._cropperHandleHitTest._.mouseY >\n this._cropperHandleHitTest._.bb - 10\n ) {\n return 'bl';\n }\n }\n // Right side top/bottom\n if (\n this._cropperHandleHitTest._.mouseX >\n this._cropperHandleHitTest._.rb - 13 &&\n this._cropperHandleHitTest._.mouseX <\n this._cropperHandleHitTest._.rb + 3\n ) {\n if (\n this._cropperHandleHitTest._.mouseY <\n this._cropperHandleHitTest._.tb + 10 &&\n this._cropperHandleHitTest._.mouseY >\n this._cropperHandleHitTest._.tb - 3\n ) {\n return 'tr';\n } else if (\n this._cropperHandleHitTest._.mouseY <\n this._cropperHandleHitTest._.bb + 2 &&\n this._cropperHandleHitTest._.mouseY >\n this._cropperHandleHitTest._.bb - 10\n ) {\n return 'br';\n }\n }\n\n // Left or right\n if (\n this._cropperHandleHitTest._.mouseX <\n this._cropperHandleHitTest._.lb + 3 &&\n this._cropperHandleHitTest._.mouseX >\n this._cropperHandleHitTest._.lb - 3 &&\n this._cropperHandleHitTest._.mouseY <\n this._cropperHandleHitTest._.bb - 10 &&\n this._cropperHandleHitTest._.mouseY >\n this._cropperHandleHitTest._.tb + 10\n ) {\n return 'l';\n }\n if (\n this._cropperHandleHitTest._.mouseX <\n this._cropperHandleHitTest._.rb + 1 &&\n this._cropperHandleHitTest._.mouseX >\n this._cropperHandleHitTest._.rb - 5 &&\n this._cropperHandleHitTest._.mouseY <\n this._cropperHandleHitTest._.bb - 10 &&\n this._cropperHandleHitTest._.mouseY >\n this._cropperHandleHitTest._.tb + 10\n ) {\n return 'r';\n }\n\n // Top or bottom\n if (\n this._cropperHandleHitTest._.mouseY <\n this._cropperHandleHitTest._.tb + 4 &&\n this._cropperHandleHitTest._.mouseY >\n this._cropperHandleHitTest._.tb - 2 &&\n this._cropperHandleHitTest._.mouseX >\n this._cropperHandleHitTest._.lb + 10 &&\n this._cropperHandleHitTest._.mouseX <\n this._cropperHandleHitTest._.rb - 10\n ) {\n return 't';\n }\n if (\n this._cropperHandleHitTest._.mouseY <\n this._cropperHandleHitTest._.bb + 2 &&\n this._cropperHandleHitTest._.mouseY >\n this._cropperHandleHitTest._.bb - 4 &&\n this._cropperHandleHitTest._.mouseX >\n this._cropperHandleHitTest._.lb + 10 &&\n this._cropperHandleHitTest._.mouseX <\n this._cropperHandleHitTest._.rb - 10\n ) {\n return 'b';\n }\n\n return false;\n },\n\n /**\n * Test whether the mouse cursor is on a fabricJS object.\n *\n * @param {Object} event\n * @param {Object} object\n * @returns {boolean}\n */\n _isMouseOver: function (event, object) {\n if (typeof this._isMouseOver._ === 'undefined') {\n this._isMouseOver._ = {};\n }\n\n this._isMouseOver._.parentOffset = this.$croppingCanvas.offset();\n this._isMouseOver._.mouseX =\n event.pageX - this._isMouseOver._.parentOffset.left;\n this._isMouseOver._.mouseY =\n event.pageY - this._isMouseOver._.parentOffset.top;\n\n // Compensate for center origin coordinate-wise\n this._isMouseOver._.lb = object.left - object.width / 2;\n this._isMouseOver._.rb = this._isMouseOver._.lb + object.width;\n this._isMouseOver._.tb = object.top - object.height / 2;\n this._isMouseOver._.bb = this._isMouseOver._.tb + object.height;\n\n return (\n this._isMouseOver._.mouseX >= this._isMouseOver._.lb &&\n this._isMouseOver._.mouseX <= this._isMouseOver._.rb &&\n this._isMouseOver._.mouseY >= this._isMouseOver._.tb &&\n this._isMouseOver._.mouseY <= this._isMouseOver._.bb\n );\n },\n\n /**\n * Get vertices of a rectangle defined by left,top,height and width properties.\n * Optionally it's possible to provide offsetX and offsetY values.\n * Left and top properties of rectangle reference the top-left corner.\n *\n * @param {Object} rectangle\n * @param {number} [offsetX]\n * @param {number} [offsetY]\n */\n _getRectangleVertices: function (rectangle, offsetX, offsetY) {\n if (typeof this._getRectangleVertices._ === 'undefined') {\n this._getRectangleVertices._ = {};\n }\n\n if (typeof offsetX === 'undefined') {\n offsetX = 0;\n }\n if (typeof offsetY === 'undefined') {\n offsetY = 0;\n }\n\n this._getRectangleVertices._.topLeft = {\n x: rectangle.left + offsetX,\n y: rectangle.top + offsetY,\n };\n\n this._getRectangleVertices._.topRight = {\n x: this._getRectangleVertices._.topLeft.x + rectangle.width,\n y: this._getRectangleVertices._.topLeft.y,\n };\n this._getRectangleVertices._.bottomRight = {\n x: this._getRectangleVertices._.topRight.x,\n y: this._getRectangleVertices._.topRight.y + rectangle.height,\n };\n this._getRectangleVertices._.bottomLeft = {\n x: this._getRectangleVertices._.topLeft.x,\n y: this._getRectangleVertices._.bottomRight.y,\n };\n\n return [\n this._getRectangleVertices._.topLeft,\n this._getRectangleVertices._.topRight,\n this._getRectangleVertices._.bottomRight,\n this._getRectangleVertices._.bottomLeft,\n ];\n },\n\n /**\n * Set image vertice coordinates for an image that's been zoomed to fit.\n */\n _setFittedImageVerticeCoordinates: function () {\n this.imageVerticeCoords = this.getImageVerticeCoords('fit');\n },\n\n /**\n * Get image vertice coords by a zoom mode and taking into account the straightening angle.\n * The zoomMode can be either \"cover\", \"fit\" or a discrete float value.\n *\n * @param {string} zoomMode\n */\n getImageVerticeCoords: function (zoomMode) {\n var angleInRadians =\n -1 *\n ((this.hasOrientationChanged() ? 90 : 0) + this.imageStraightenAngle) *\n (Math.PI / 180);\n\n var imageDimensions = this.getScaledImageDimensions();\n\n var ratio;\n\n if (typeof zoomMode === 'number') {\n ratio = zoomMode;\n } else if (zoomMode === 'cover') {\n ratio = this.getZoomToCoverRatio(imageDimensions);\n } else {\n ratio = this.getZoomToFitRatio(imageDimensions);\n }\n\n // Get the dimensions of the scaled image\n var scaledHeight = imageDimensions.height * ratio;\n var scaledWidth = imageDimensions.width * ratio;\n\n // Calculate the segments of the containing box for the image.\n // When referring to top/bottom or right/left segments, these are on the\n // right-side and bottom projection of the containing box for the zoomed out image.\n var topVerticalSegment = Math.cos(angleInRadians) * scaledHeight;\n var bottomVerticalSegment = Math.sin(angleInRadians) * scaledWidth;\n var rightHorizontalSegment = Math.cos(angleInRadians) * scaledWidth;\n var leftHorizontalSegment = Math.sin(angleInRadians) * scaledHeight;\n\n // Calculate the offsets from editor box for the image-containing box\n var verticalOffset =\n (this.editorHeight - (topVerticalSegment + bottomVerticalSegment)) / 2;\n var horizontalOffset =\n (this.editorWidth - (leftHorizontalSegment + rightHorizontalSegment)) /\n 2;\n\n // Finally, calculate the image vertice coordinates\n return {\n a: {\n x: horizontalOffset + rightHorizontalSegment,\n y: verticalOffset,\n },\n b: {\n x: this.editorWidth - horizontalOffset,\n y: verticalOffset + topVerticalSegment,\n },\n c: {\n x: horizontalOffset + leftHorizontalSegment,\n y: this.editorHeight - verticalOffset,\n },\n d: {\n x: horizontalOffset,\n y: verticalOffset + bottomVerticalSegment,\n },\n };\n },\n\n /**\n * Debug stuff by continuously rendering a fabric object on canvas.\n *\n * @param {Object} fabricObj\n */\n _debug: function (fabricObj) {\n this.canvas.remove(this.debugger);\n this.debugger = fabricObj;\n this.canvas.add(this.debugger);\n },\n\n /**\n * Given an array of points in the form of {x: int, y:int} and a rectangle in the form of\n * {a:{x:int, y:int}, b:{x:int, y:int}, c:{x:int, y:int}} (the fourth vertice is unnecessary)\n * return true if the point is in the rectangle.\n *\n * Adapted from: http://stackoverflow.com/a/2763387/2040791\n *\n * @param {Object} points\n * @param {Object} rectangle\n */\n arePointsInsideRectangle: function (points, rectangle) {\n if (typeof this.arePointsInsideRectangle._ === 'undefined') {\n this.arePointsInsideRectangle._ = {};\n }\n\n // Pre-calculate the vectors and scalar products for two rectangle edges\n this.arePointsInsideRectangle._.ab = this._getVector(\n rectangle.a,\n rectangle.b\n );\n this.arePointsInsideRectangle._.bc = this._getVector(\n rectangle.b,\n rectangle.c\n );\n this.arePointsInsideRectangle._.scalarAbAb = this._getScalarProduct(\n this.arePointsInsideRectangle._.ab,\n this.arePointsInsideRectangle._.ab\n );\n this.arePointsInsideRectangle._.scalarBcBc = this._getScalarProduct(\n this.arePointsInsideRectangle._.bc,\n this.arePointsInsideRectangle._.bc\n );\n\n for (\n this.arePointsInsideRectangle._.i = 0;\n this.arePointsInsideRectangle._.i < points.length;\n this.arePointsInsideRectangle._.i++\n ) {\n this.arePointsInsideRectangle._.point =\n points[this.arePointsInsideRectangle._.i];\n\n // Calculate the vectors for two rectangle sides and for\n // the vector from vertices a and b to the point P\n this.arePointsInsideRectangle._.ap = this._getVector(\n rectangle.a,\n this.arePointsInsideRectangle._.point\n );\n this.arePointsInsideRectangle._.bp = this._getVector(\n rectangle.b,\n this.arePointsInsideRectangle._.point\n );\n\n // Calculate scalar or dot products for some vector combinations\n this.arePointsInsideRectangle._.scalarAbAp = this._getScalarProduct(\n this.arePointsInsideRectangle._.ab,\n this.arePointsInsideRectangle._.ap\n );\n this.arePointsInsideRectangle._.scalarBcBp = this._getScalarProduct(\n this.arePointsInsideRectangle._.bc,\n this.arePointsInsideRectangle._.bp\n );\n\n this.arePointsInsideRectangle._.projectsOnAB =\n 0 <= this.arePointsInsideRectangle._.scalarAbAp &&\n this.arePointsInsideRectangle._.scalarAbAp <=\n this.arePointsInsideRectangle._.scalarAbAb;\n this.arePointsInsideRectangle._.projectsOnBC =\n 0 <= this.arePointsInsideRectangle._.scalarBcBp &&\n this.arePointsInsideRectangle._.scalarBcBp <=\n this.arePointsInsideRectangle._.scalarBcBc;\n\n if (\n !(\n this.arePointsInsideRectangle._.projectsOnAB &&\n this.arePointsInsideRectangle._.projectsOnBC\n )\n ) {\n return false;\n }\n }\n\n return true;\n },\n\n /**\n * Returns an object representing the vector between points a and b.\n *\n * @param {Object} a\n * @param {Object} b\n */\n _getVector: function (a, b) {\n return {x: b.x - a.x, y: b.y - a.y};\n },\n\n /**\n * Returns the scalar product of two vectors\n *\n * @param {Object} a\n * @param {Object} b\n */\n _getScalarProduct: function (a, b) {\n return a.x * b.x + a.y * b.y;\n },\n\n /**\n * Returns the magnitude of a vector_redrawCropperElements\n * .\n *\n * @param {Object} vector\n */\n _getVectorMagnitude: function (vector) {\n return Math.sqrt(vector.x * vector.x + vector.y * vector.y);\n },\n\n /**\n * Returns the angle between two vectors in degrees with two decimal points\n *\n * @param {Object} a\n * @param {Object} b\n */\n _getAngleBetweenVectors: function (a, b) {\n return (\n Math.round(\n ((Math.acos(\n Math.min(\n 1,\n this._getScalarProduct(a, b) /\n (this._getVectorMagnitude(a) * this._getVectorMagnitude(b))\n )\n ) *\n 180) /\n Math.PI) *\n 100\n ) / 100\n );\n },\n\n /**\n * Return the rectangle edge crossed by an imaginary line drawn from editor center to a vertex\n *\n * @param {Object} rectangle\n * @param {Object} vertex\n *\n * @returns {*}\n */\n _getEdgeCrossed: function (rectangle, vertex) {\n // Determine over which edge the vertex is\n var edgePoints = [\n [rectangle.a, rectangle.b],\n [rectangle.b, rectangle.c],\n [rectangle.c, rectangle.d],\n [rectangle.d, rectangle.a],\n ];\n\n var centerPoint = {x: this.editorWidth / 2, y: this.editorHeight / 2};\n var smallestDiff = 180;\n var edgeCrossed = null;\n\n // Test each edge\n for (var edgeIndex = 0; edgeIndex < edgePoints.length; edgeIndex++) {\n var edge = edgePoints[edgeIndex];\n var toCenter = this._getVector(edge[0], centerPoint);\n var edgeVector = this._getVector(edge[0], edge[1]);\n var toVertex = this._getVector(edge[0], vertex);\n\n // If the angle between toCenter/toVertex is the sum of\n // angles between edgeVector/toCenter and edgeVector/toVertex, it means that\n // the edgeVector is between the other two meaning that this is the offending vertex.\n // To avoid the rounding errors, we'll take the closest match\n var diff = Math.abs(\n this._getAngleBetweenVectors(toCenter, toVertex) -\n (this._getAngleBetweenVectors(toCenter, edgeVector) +\n this._getAngleBetweenVectors(edgeVector, toVertex))\n );\n\n if (diff < smallestDiff) {\n smallestDiff = diff;\n edgeCrossed = edge;\n }\n }\n\n return edgeCrossed;\n },\n\n /**\n * Get the image bounding box by image scaled dimensions, taking ingo account the straightening angle.\n *\n * @param {Object} dimensions\n */\n _getImageBoundingBox: function (dimensions) {\n var box = {};\n\n var angleInRadians =\n Math.abs(this.imageStraightenAngle) * (Math.PI / 180);\n\n var proportion = dimensions.height / dimensions.width;\n box.height =\n dimensions.width *\n (Math.sin(angleInRadians) + Math.cos(angleInRadians) * proportion);\n box.width =\n dimensions.width *\n (Math.cos(angleInRadians) + Math.sin(angleInRadians) * proportion);\n\n if (this.hasOrientationChanged()) {\n var temp = box.width;\n box.width = box.height;\n box.height = temp;\n }\n\n return box;\n },\n },\n {\n defaults: {\n animationDuration: 100,\n allowSavingAsNew: true,\n onSave: $.noop,\n allowDegreeFractions: null,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Asset index class\n */\nCraft.AssetIndex = Craft.BaseElementIndex.extend({\n $includeSubfoldersContainer: null,\n $includeSubfoldersCheckbox: null,\n showingIncludeSubfoldersCheckbox: false,\n\n $uploadButton: null,\n $uploadInput: null,\n $progressBar: null,\n $folders: null,\n\n uploader: null,\n promptHandler: null,\n progressBar: null,\n\n _uploadTotalFiles: 0,\n _uploadFileProgress: {},\n _currentUploaderSettings: {},\n\n _assetDrag: null,\n _folderDrag: null,\n _expandDropTargetFolderTimeout: null,\n _tempExpandedFolders: [],\n\n _fileConflictTemplate: {\n choices: [\n {value: 'keepBoth', title: Craft.t('app', 'Keep both')},\n {value: 'replace', title: Craft.t('app', 'Replace it')},\n ],\n },\n _folderConflictTemplate: {\n choices: [\n {\n value: 'replace',\n title: Craft.t(\n 'app',\n 'Replace the folder (all existing files will be deleted)'\n ),\n },\n {\n value: 'merge',\n title: Craft.t(\n 'app',\n 'Merge the folder (any conflicting files will be replaced)'\n ),\n },\n ],\n },\n\n init: function (elementType, $container, settings) {\n this.base(elementType, $container, settings);\n\n if (this.settings.context === 'index') {\n if (!this._folderDrag) {\n this._initIndexPageMode();\n }\n\n this.addListener(Garnish.$win, 'resize,scroll', '_positionProgressBar');\n } else {\n this.addListener(this.$main, 'scroll', '_positionProgressBar');\n\n if (this.settings.modal) {\n this.settings.modal.on(\n 'updateSizeAndPosition',\n this._positionProgressBar.bind(this)\n );\n }\n }\n },\n\n initSources: function () {\n if (this.settings.context === 'index' && !this._folderDrag) {\n this._initIndexPageMode();\n }\n\n return this.base();\n },\n\n initSource: function ($source) {\n this.base($source);\n\n this._createFolderContextMenu($source);\n\n if (this.settings.context === 'index') {\n if (this._folderDrag && this.getSourceLevel($source) > 1) {\n if ($source.data('folder-id')) {\n this._folderDrag.addItems($source.parent());\n }\n }\n\n if (this._assetDrag) {\n this._assetDrag.updateDropTargets();\n }\n }\n },\n\n deinitSource: function ($source) {\n this.base($source);\n\n // Does this source have a context menu?\n var contextMenu = $source.data('contextmenu');\n\n if (contextMenu) {\n contextMenu.destroy();\n }\n\n if (this.settings.context === 'index') {\n if (this._folderDrag && this.getSourceLevel($source) > 1) {\n this._folderDrag.removeItems($source.parent());\n }\n\n if (this._assetDrag) {\n this._assetDrag.updateDropTargets();\n }\n }\n },\n\n /**\n * Initialize the index page-specific features\n */\n _initIndexPageMode: function () {\n if (this._folderDrag) {\n return;\n }\n\n // Make the elements selectable\n this.settings.selectable = true;\n this.settings.multiSelect = true;\n\n // Asset dragging\n // ---------------------------------------------------------------------\n\n this._assetDrag = new Garnish.DragDrop({\n activeDropTargetClass: 'sel',\n helperOpacity: 0.75,\n filter: () =>\n this.view.getSelectedElements().has('div.element[data-movable]'),\n helper: ($file) => this._getFileDragHelper($file),\n dropTargets: () => {\n // Which data attribute should we be checking?\n var attr;\n if (\n this._assetDrag.$draggee &&\n this._assetDrag.$draggee.has('.element[data-peer-file]').length\n ) {\n attr = 'data-can-move-peer-files-to';\n } else {\n attr = 'data-can-move-to';\n }\n\n var targets = [];\n\n for (var i = 0; i < this.$sources.length; i++) {\n // Make sure it's a volume folder\n var $source = this.$sources.eq(i);\n if (Garnish.hasAttr($source, attr)) {\n targets.push($source);\n }\n }\n\n return targets;\n },\n\n onDragStart: this._onDragStart.bind(this),\n onDropTargetChange: this._onDropTargetChange.bind(this),\n onDragStop: this._onFileDragStop.bind(this),\n helperBaseZindex: 800,\n });\n\n // Folder dragging\n // ---------------------------------------------------------------------\n\n this._folderDrag = new Garnish.DragDrop({\n activeDropTargetClass: 'sel',\n helperOpacity: 0.75,\n\n helper: ($draggeeHelper) => {\n var $helperSidebar = $('<div class=\"sidebar drag-helper\"/>'),\n $helperNav = $('<nav/>').appendTo($helperSidebar),\n $helperUl = $('<ul/>').appendTo($helperNav);\n\n $draggeeHelper.appendTo($helperUl).removeClass('expanded');\n $draggeeHelper.children('a').addClass('sel');\n\n // Match the style\n $draggeeHelper.css({\n 'padding-top': this._folderDrag.$draggee.css('padding-top'),\n 'padding-right': this._folderDrag.$draggee.css('padding-right'),\n 'padding-bottom': this._folderDrag.$draggee.css('padding-bottom'),\n 'padding-left': this._folderDrag.$draggee.css('padding-left'),\n });\n\n return $helperSidebar;\n },\n\n dropTargets: () => {\n var targets = [];\n\n // Tag the dragged folder and it's subfolders\n var draggedSourceIds = [];\n this._folderDrag.$draggee.find('a[data-key]').each(function () {\n draggedSourceIds.push($(this).data('key'));\n });\n\n for (var i = 0; i < this.$sources.length; i++) {\n // Make sure it's a volume folder and not one of the dragged folders\n var $source = this.$sources.eq(i),\n key = $source.data('key');\n\n if (!this._getVolumeOrFolderUidFromSourceKey(key)) {\n continue;\n }\n\n if (!Craft.inArray(key, draggedSourceIds)) {\n targets.push($source);\n }\n }\n\n return targets;\n },\n\n onDragStart: this._onDragStart.bind(this),\n onDropTargetChange: this._onDropTargetChange.bind(this),\n onDragStop: this._onFolderDragStop.bind(this),\n });\n },\n\n /**\n * On file drag stop\n */\n _onFileDragStop: function () {\n if (\n this._assetDrag.$activeDropTarget &&\n this._assetDrag.$activeDropTarget[0] !== this.$source[0]\n ) {\n // Keep it selected\n var originatingSource = this.$source;\n\n var targetFolderId = this._assetDrag.$activeDropTarget.data('folder-id'),\n originalAssetIds = [];\n\n // For each file, prepare array data.\n for (var i = 0; i < this._assetDrag.$draggee.length; i++) {\n var originalAssetId = Craft.getElementInfo(\n this._assetDrag.$draggee[i]\n ).id;\n\n originalAssetIds.push(originalAssetId);\n }\n\n // Are any files actually getting moved?\n if (originalAssetIds.length) {\n this.setIndexBusy();\n\n this._positionProgressBar();\n this.progressBar.resetProgressBar();\n this.progressBar.setItemCount(originalAssetIds.length);\n this.progressBar.showProgressBar();\n\n // For each file to move a separate request\n var parameterArray = [];\n for (i = 0; i < originalAssetIds.length; i++) {\n parameterArray.push({\n action: 'assets/move-asset',\n params: {\n assetId: originalAssetIds[i],\n folderId: targetFolderId,\n },\n });\n }\n\n // Define the callback for when all file moves are complete\n var onMoveFinish = (responseArray) => {\n this.promptHandler.resetPrompts();\n\n // Loop trough all the responses\n for (var i = 0; i < responseArray.length; i++) {\n var response = responseArray[i];\n\n // Push prompt into prompt array\n if (response.conflict) {\n this.promptHandler.addPrompt({\n assetId: response.assetId,\n suggestedFilename: response.suggestedFilename,\n prompt: {\n message: response.conflict,\n choices: this._fileConflictTemplate.choices,\n },\n });\n }\n\n if (response.error) {\n alert(response.error);\n }\n }\n\n this.setIndexAvailable();\n this.progressBar.hideProgressBar();\n var reloadIndex = false;\n\n var performAfterMoveActions = function () {\n // Select original source\n this.sourceSelect.selectItem(originatingSource);\n\n // Make sure we use the correct offset when fetching the next page\n this._totalVisible -= this._assetDrag.$draggee.length;\n\n // And remove the elements that have been moved away\n for (var i = 0; i < originalAssetIds.length; i++) {\n $('[data-id=' + originalAssetIds[i] + ']').remove();\n }\n\n this.view.deselectAllElements();\n this._collapseExtraExpandedFolders(targetFolderId);\n\n if (reloadIndex) {\n this.updateElements();\n }\n };\n\n if (this.promptHandler.getPromptCount()) {\n // Define callback for completing all prompts\n var promptCallback = (returnData) => {\n var newParameterArray = [];\n\n // Loop trough all returned data and prepare a new request array\n for (var i = 0; i < returnData.length; i++) {\n if (returnData[i].choice === 'cancel') {\n reloadIndex = true;\n continue;\n }\n\n if (returnData[i].choice === 'keepBoth') {\n newParameterArray.push({\n action: 'assets/move-asset',\n params: {\n folderId: targetFolderId,\n assetId: returnData[i].assetId,\n filename: returnData[i].suggestedFilename,\n },\n });\n }\n\n if (returnData[i].choice === 'replace') {\n newParameterArray.push({\n action: 'assets/move-asset',\n params: {\n folderId: targetFolderId,\n assetId: returnData[i].assetId,\n force: true,\n },\n });\n }\n }\n\n // Nothing to do, carry on\n if (newParameterArray.length === 0) {\n performAfterMoveActions.apply(this);\n } else {\n // Start working\n this.setIndexBusy();\n this.progressBar.resetProgressBar();\n this.progressBar.setItemCount(\n this.promptHandler.getPromptCount()\n );\n this.progressBar.showProgressBar();\n\n // Move conflicting files again with resolutions now\n this._performBatchRequests(newParameterArray, onMoveFinish);\n }\n };\n\n this._assetDrag.fadeOutHelpers();\n this.promptHandler.showBatchPrompts(promptCallback);\n } else {\n performAfterMoveActions.apply(this);\n this._assetDrag.fadeOutHelpers();\n }\n };\n\n // Initiate the file move with the built array, index of 0 and callback to use when done\n this._performBatchRequests(parameterArray, onMoveFinish);\n\n // Skip returning dragees\n return;\n }\n } else {\n // Add the .sel class back on the selected source\n this.$source.addClass('sel');\n\n this._collapseExtraExpandedFolders();\n }\n\n this._assetDrag.returnHelpersToDraggees();\n },\n\n /**\n * On folder drag stop\n */\n _onFolderDragStop: function () {\n // Only move if we have a valid target and we're not trying to move into our direct parent\n if (\n this._folderDrag.$activeDropTarget &&\n this._folderDrag.$activeDropTarget\n .siblings('ul')\n .children('li')\n .filter(this._folderDrag.$draggee).length === 0\n ) {\n var targetFolderId = this._folderDrag.$activeDropTarget.data('folder-id');\n\n this._collapseExtraExpandedFolders(targetFolderId);\n\n // Get the old folder IDs, and sort them so that we're moving the most-nested folders first\n var folderIds = [];\n\n for (var i = 0; i < this._folderDrag.$draggee.length; i++) {\n var $a = this._folderDrag.$draggee.eq(i).children('a'),\n folderId = $a.data('folder-id');\n\n // Make sure it’s not already in the target folder and use this single folder Id.\n if (folderId != targetFolderId) {\n folderIds.push(folderId);\n break;\n }\n }\n\n if (folderIds.length) {\n folderIds.sort();\n folderIds.reverse();\n\n this.setIndexBusy();\n this._positionProgressBar();\n this.progressBar.resetProgressBar();\n this.progressBar.setItemCount(folderIds.length);\n this.progressBar.showProgressBar();\n\n var parameterArray = [];\n\n for (i = 0; i < folderIds.length; i++) {\n parameterArray.push({\n action: 'assets/move-folder',\n params: {\n folderId: folderIds[i],\n parentId: targetFolderId,\n },\n });\n }\n\n // Increment, so to avoid displaying folder files that are being moved\n this.requestId++;\n\n /*\n Here's the rundown:\n 1) Send all the folders being moved\n 2) Get results:\n a) For all conflicting, receive prompts and resolve them to get:\n b) For all valid move operations: by now server has created the needed folders\n in target destination. Server returns an array of file move operations\n c) server also returns a list of all the folder id changes\n d) and the data-id of node to be removed, in case of conflict\n e) and a list of folders to delete after the move\n 3) From data in 2) build a large file move operation array\n 4) Create a request loop based on this, so we can display progress bar\n 5) when done, delete all the folders and perform other maintenance\n 6) Champagne\n */\n\n // This will hold the final list of files to move\n var fileMoveList = [];\n\n var newSourceKey = '';\n\n var onMoveFinish = (responseArray) => {\n this.promptHandler.resetPrompts();\n\n // Loop trough all the responses\n for (var i = 0; i < responseArray.length; i++) {\n var data = responseArray[i];\n\n // If successful and have data, then update\n if (data.success) {\n if (data.transferList) {\n fileMoveList = data.transferList;\n }\n\n if (data.newFolderId) {\n newSourceKey =\n this._folderDrag.$activeDropTarget.data('key') +\n '/folder:' +\n data.newFolderUid;\n }\n }\n\n // Push prompt into prompt array\n if (data.conflict) {\n data.prompt = {\n message: data.conflict,\n choices: this._folderConflictTemplate.choices,\n };\n\n this.promptHandler.addPrompt(data);\n }\n\n if (data.error) {\n alert(data.error);\n }\n }\n\n if (this.promptHandler.getPromptCount()) {\n // Define callback for completing all prompts\n var promptCallback = (returnData) => {\n this.promptHandler.resetPrompts();\n\n var newParameterArray = [];\n\n var params = {};\n // Loop trough all returned data and prepare a new request array\n for (var i = 0; i < returnData.length; i++) {\n if (returnData[i].choice === 'cancel') {\n continue;\n }\n\n if (returnData[i].choice === 'replace') {\n params.force = true;\n }\n\n if (returnData[i].choice === 'merge') {\n params.merge = true;\n }\n\n params.folderId = data.folderId;\n params.parentId = data.parentId;\n\n newParameterArray.push({\n action: 'assets/move-folder',\n params: params,\n });\n }\n\n // Start working on them lists, baby\n if (newParameterArray.length === 0) {\n this._performActualFolderMove(\n fileMoveList,\n folderIds,\n newSourceKey\n );\n } else {\n // Start working\n this.setIndexBusy();\n this.progressBar.resetProgressBar();\n this.progressBar.setItemCount(\n this.promptHandler.getPromptCount()\n );\n this.progressBar.showProgressBar();\n\n this._performBatchRequests(newParameterArray, onMoveFinish);\n }\n };\n\n this.promptHandler.showBatchPrompts(promptCallback);\n\n this.setIndexAvailable();\n this.progressBar.hideProgressBar();\n } else {\n this._performActualFolderMove(\n fileMoveList,\n folderIds,\n newSourceKey\n );\n }\n };\n\n // Initiate the folder move with the built array, index of 0 and callback to use when done\n this._performBatchRequests(parameterArray, onMoveFinish);\n\n // Skip returning dragees until we get the Ajax response\n return;\n }\n } else {\n // Add the .sel class back on the selected source\n this.$source.addClass('sel');\n\n this._collapseExtraExpandedFolders();\n }\n\n this._folderDrag.returnHelpersToDraggees();\n },\n\n /**\n * Really move the folder. Like really. For real.\n */\n _performActualFolderMove: function (\n fileMoveList,\n folderDeleteList,\n newSourceKey\n ) {\n this.setIndexBusy();\n this.progressBar.resetProgressBar();\n this.progressBar.setItemCount(1);\n this.progressBar.showProgressBar();\n\n var moveCallback = (folderDeleteList) => {\n // Delete the old folders\n var counter = 0;\n var limit = folderDeleteList.length;\n for (var i = 0; i < folderDeleteList.length; i++) {\n let data = {folderId: folderDeleteList[i]};\n\n // When all folders are deleted, reload the sources.\n Craft.sendActionRequest('POST', 'assets/delete-folder', {data}).then(\n (response) => {\n if (++counter === limit) {\n this.setIndexAvailable();\n this.progressBar.hideProgressBar();\n this._folderDrag.returnHelpersToDraggees();\n this.setInstanceState('selectedSource', newSourceKey);\n this.refreshSources();\n }\n }\n );\n }\n };\n\n if (fileMoveList.length > 0) {\n var parameterArray = [];\n\n for (var i = 0; i < fileMoveList.length; i++) {\n parameterArray.push({\n action: 'assets/move-asset',\n params: fileMoveList[i],\n });\n }\n this._performBatchRequests(parameterArray, function () {\n moveCallback(folderDeleteList);\n });\n } else {\n moveCallback(folderDeleteList);\n }\n },\n\n _selectSourceByFolderId: function (targetFolderId) {\n var $targetSource = this._getSourceByKey(targetFolderId);\n\n // Make sure that all the parent sources are expanded and this source is visible.\n var $parentSources = $targetSource.parent().parents('li');\n\n for (var i = 0; i < $parentSources.length; i++) {\n var $parentSource = $($parentSources[i]);\n\n if (!$parentSource.hasClass('expanded')) {\n $parentSource.children('.toggle').trigger('click');\n }\n }\n\n this.selectSource($targetSource);\n this.updateElements();\n },\n\n /**\n * Initialize the uploader.\n *\n * @private\n */\n afterInit: function () {\n if (!this.$uploadButton) {\n this.$uploadButton = $('<button/>', {\n type: 'button',\n class: 'btn submit',\n 'data-icon': 'upload',\n style: 'position: relative; overflow: hidden;',\n text: Craft.t('app', 'Upload files'),\n });\n this.addButton(this.$uploadButton);\n\n this.$uploadInput = $(\n '<input type=\"file\" multiple=\"multiple\" name=\"assets-upload\" />'\n )\n .hide()\n .insertBefore(this.$uploadButton);\n }\n\n this.promptHandler = new Craft.PromptHandler();\n this.progressBar = new Craft.ProgressBar(this.$main, true);\n\n var options = {\n url: Craft.getActionUrl('assets/upload'),\n fileInput: this.$uploadInput,\n dropZone: this.$container,\n };\n\n options.events = {\n fileuploadstart: this._onUploadStart.bind(this),\n fileuploadprogressall: this._onUploadProgress.bind(this),\n fileuploaddone: this._onUploadSuccess.bind(this),\n fileuploadalways: this._onUploadAlways.bind(this),\n fileuploadfail: this._onUploadFailure.bind(this),\n };\n\n if (\n this.settings.criteria &&\n typeof this.settings.criteria.kind !== 'undefined'\n ) {\n options.allowedKinds = this.settings.criteria.kind;\n }\n\n this._currentUploaderSettings = options;\n\n this.uploader = new Craft.Uploader(this.$uploadButton, options);\n\n this.$uploadButton.on('click', () => {\n if (this.$uploadButton.hasClass('disabled')) {\n return;\n }\n if (!this.isIndexBusy) {\n this.$uploadButton\n .parent()\n .find('input[name=assets-upload]')\n .trigger('click');\n }\n });\n\n this.base();\n },\n\n getDefaultSourceKey: function () {\n // Did they request a specific volume in the URL?\n if (\n this.settings.context === 'index' &&\n typeof window.defaultSource !== 'undefined'\n ) {\n let defaultSourceParts = window.defaultSource.split('/');\n let volumeSource = this.$sources.toArray().find((s) => {\n return $(s).data('volume-handle') === defaultSourceParts[0];\n });\n if (volumeSource) {\n let $source = $(volumeSource);\n\n for (let i = 1; i < defaultSourceParts.length; i++) {\n // does $source have a subfolder with this path name?\n let subfolderSource = this._getChildSources($source)\n .toArray()\n .find((s) => {\n return $('> .label', s).text() === defaultSourceParts[i];\n });\n if (!subfolderSource) {\n break;\n }\n this._expandSource($source);\n $source = $(subfolderSource);\n }\n\n return $source.data('key');\n }\n }\n\n return this.base();\n },\n\n onSelectSource: function () {\n var $source = this._getSourceByKey(this.sourceKey);\n var folderId = $source.data('folder-id');\n\n if (folderId && Garnish.hasAttr(this.$source, 'data-can-upload')) {\n this.uploader.setParams({\n folderId: this.$source.attr('data-folder-id'),\n });\n this.$uploadButton.removeClass('disabled');\n } else {\n this.$uploadButton.addClass('disabled');\n }\n\n // Update the URL if we're on the Assets index\n if ($source.length && this.settings.context === 'index') {\n this._updateUrl($source);\n }\n\n this.base();\n },\n\n _updateUrl: function ($source) {\n // Find all the subfolder sources. At the end, $thisSource will be the root volume source\n let nestedSources = [];\n let $thisSource = $source;\n let $parent;\n while (($parent = this.getParentSource($thisSource)) && $parent.length) {\n nestedSources.unshift($thisSource);\n $thisSource = $parent;\n }\n\n let uri = 'assets';\n if ($thisSource.data('volume-handle')) {\n uri += '/' + $thisSource.data('volume-handle');\n nestedSources.forEach(($s) => {\n uri += '/' + $s.children('.label').text();\n });\n }\n\n Craft.setPath(uri);\n },\n\n _getVolumeOrFolderUidFromSourceKey: function (sourceKey) {\n var m = sourceKey.match(/\\b(?:folder|volume):([0-9a-f\\-]+)$/);\n\n return m ? m[1] : null;\n },\n\n startSearching: function () {\n // Does this source have subfolders?\n if (!this.settings.hideSidebar && this.$source.siblings('ul').length) {\n if (this.$includeSubfoldersContainer === null) {\n var id = 'includeSubfolders-' + Math.floor(Math.random() * 1000000000);\n\n this.$includeSubfoldersContainer = $(\n '<div style=\"margin-bottom: -25px; opacity: 0;\"/>'\n ).insertAfter(this.$search);\n var $subContainer = $('<div style=\"padding-top: 5px;\"/>').appendTo(\n this.$includeSubfoldersContainer\n );\n this.$includeSubfoldersCheckbox = $(\n '<input type=\"checkbox\" id=\"' + id + '\" class=\"checkbox\"/>'\n ).appendTo($subContainer);\n $('<label class=\"light smalltext\" for=\"' + id + '\"/>')\n .text(' ' + Craft.t('app', 'Search in subfolders'))\n .appendTo($subContainer);\n\n this.addListener(\n this.$includeSubfoldersCheckbox,\n 'change',\n function () {\n this.setSelecetedSourceState(\n 'includeSubfolders',\n this.$includeSubfoldersCheckbox.prop('checked')\n );\n this.updateElements();\n }\n );\n } else {\n this.$includeSubfoldersContainer.velocity('stop').removeClass('hidden');\n }\n\n var checked = this.getSelectedSourceState('includeSubfolders', false);\n this.$includeSubfoldersCheckbox.prop('checked', checked);\n\n this.$includeSubfoldersContainer.velocity(\n {\n marginBottom: 0,\n opacity: 1,\n },\n 'fast'\n );\n\n this.showingIncludeSubfoldersCheckbox = true;\n }\n\n this.base();\n },\n\n stopSearching: function () {\n if (this.showingIncludeSubfoldersCheckbox) {\n this.$includeSubfoldersContainer.velocity('stop');\n\n this.$includeSubfoldersContainer.velocity(\n {\n marginBottom: -25,\n opacity: 0,\n },\n {\n duration: 'fast',\n complete: () => {\n this.$includeSubfoldersContainer.addClass('hidden');\n },\n }\n );\n\n this.showingIncludeSubfoldersCheckbox = false;\n }\n\n this.base();\n },\n\n getViewParams: function () {\n var data = this.base();\n\n if (\n this.showingIncludeSubfoldersCheckbox &&\n this.$includeSubfoldersCheckbox.prop('checked')\n ) {\n data.criteria.includeSubfolders = true;\n }\n\n return data;\n },\n\n /**\n * React on upload submit.\n *\n * @private\n */\n _onUploadStart: function () {\n this.setIndexBusy();\n\n // Initial values\n this._positionProgressBar();\n this.progressBar.resetProgressBar();\n this.progressBar.showProgressBar();\n\n this.promptHandler.resetPrompts();\n },\n\n /**\n * Update uploaded byte count.\n */\n _onUploadProgress: function (event, data) {\n var progress = parseInt((data.loaded / data.total) * 100, 10);\n this.progressBar.setProgressPercentage(progress);\n },\n\n /**\n * On upload success.\n *\n * @param {Object} event\n * @param {Object} data\n * @private\n */\n _onUploadSuccess: function (event, data) {\n const {result} = data;\n\n // Add the uploaded file to the selected ones, if appropriate\n this.selectElementAfterUpdate(result.assetId);\n\n // If there is a prompt, add it to the queue\n if (result.conflict) {\n result.prompt = {\n message: Craft.t('app', result.conflict, {file: result.filename}),\n choices: this._fileConflictTemplate.choices,\n };\n\n this.promptHandler.addPrompt(result);\n }\n\n Craft.cp.runQueue();\n },\n\n /**\n * On upload complete no matter what (success, fail, or abort).\n */\n _onUploadAlways: function () {\n if (this.uploader.isLastUpload()) {\n this.progressBar.hideProgressBar();\n this.setIndexAvailable();\n\n if (this.promptHandler.getPromptCount()) {\n this.promptHandler.showBatchPrompts(this._uploadFollowup.bind(this));\n } else {\n this._updateAfterUpload();\n }\n }\n },\n\n /**\n * On Upload Failure.\n */\n _onUploadFailure: function (event, data) {\n const response = data.response();\n let {message, filename} = response?.jqXHR?.responseJSON || {};\n\n if (!message) {\n message = filename\n ? Craft.t('app', 'Upload failed for “{filename}”.', {filename})\n : Craft.t('app', 'Upload failed.');\n }\n\n alert(message);\n },\n\n /**\n * Update the elements after an upload, setting sort to dateModified descending, if not using index.\n *\n * @private\n */\n _updateAfterUpload: function () {\n if (this.settings.context !== 'index') {\n this.clearSearch();\n this.setSelectedSortAttribute('dateCreated', 'desc');\n }\n this.updateElements();\n },\n\n /**\n * Follow up to an upload that triggered at least one conflict resolution prompt.\n *\n * @param {Object} returnData\n * @private\n */\n _uploadFollowup: function (returnData) {\n this.setIndexBusy();\n this.progressBar.resetProgressBar();\n\n this.promptHandler.resetPrompts();\n\n var finalCallback = () => {\n this.progressBar.hideProgressBar();\n this.setIndexAvailable();\n this._updateAfterUpload();\n };\n\n this.progressBar.setItemCount(returnData.length);\n\n var doFollowup = (parameterArray, parameterIndex, callback) => {\n var data = {};\n var action = null;\n\n const followupAlways = () => {\n parameterIndex++;\n this.progressBar.incrementProcessedItemCount(1);\n this.progressBar.updateProgressBar();\n\n if (parameterIndex === parameterArray.length) {\n callback();\n } else {\n doFollowup(parameterArray, parameterIndex, callback);\n }\n };\n const followupSuccess = (data) => {\n if (data.assetId) {\n this.selectElementAfterUpdate(data.assetId);\n }\n\n followupAlways();\n };\n const followupFailure = (data) => {\n alert(data.message);\n followupAlways();\n };\n\n if (parameterArray[parameterIndex].choice === 'replace') {\n action = 'assets/replace-file';\n data.sourceAssetId = parameterArray[parameterIndex].assetId;\n\n if (parameterArray[parameterIndex].conflictingAssetId) {\n data.assetId = parameterArray[parameterIndex].conflictingAssetId;\n } else {\n data.targetFilename = parameterArray[parameterIndex].filename;\n }\n } else if (parameterArray[parameterIndex].choice === 'cancel') {\n action = 'assets/delete-asset';\n data.assetId = parameterArray[parameterIndex].assetId;\n }\n\n if (!action) {\n // We don't really need to do another request, so let's pretend that already happened\n followupSuccess({\n assetId: parameterArray[parameterIndex].assetId,\n });\n } else {\n Craft.sendActionRequest('POST', action, {data})\n .then((response) => followupSuccess(response.data))\n .catch(({response}) => followupFailure(response.data));\n }\n };\n\n this.progressBar.showProgressBar();\n doFollowup(returnData, 0, finalCallback);\n },\n\n /**\n * Perform actions after updating elements\n * @private\n */\n onUpdateElements: function () {\n this._onUpdateElements(false, this.view.getAllElements());\n this.view.on('appendElements', (ev) => {\n this._onUpdateElements(true, ev.newElements);\n });\n\n this.base();\n },\n\n /**\n * Do the after-update initializations\n * @private\n */\n _onUpdateElements: function (append, $newElements) {\n if (this.settings.context === 'index') {\n if (!append) {\n this._assetDrag.removeAllItems();\n }\n\n this._assetDrag.addItems($newElements.has('div.element[data-movable]'));\n }\n\n this.base(append, $newElements);\n\n this.removeListener(this.$elements, 'keydown');\n this.addListener(this.$elements, 'keydown', this._onKeyDown.bind(this));\n this.view.elementSelect.on('focusItem', this._onElementFocus.bind(this));\n },\n\n /**\n * Handle a keypress\n * @private\n */\n _onKeyDown: function (ev) {\n if (ev.keyCode === Garnish.SPACE_KEY && ev.shiftKey) {\n if (Craft.PreviewFileModal.openInstance) {\n Craft.PreviewFileModal.openInstance.selfDestruct();\n } else {\n var $element = this.view.elementSelect.$focusedItem.find('.element');\n\n if ($element.length) {\n this._loadPreview($element);\n }\n }\n\n ev.stopPropagation();\n return false;\n }\n },\n\n /**\n * Handle element being focused\n * @private\n */\n _onElementFocus: function (ev) {\n var $element = $(ev.item).find('.element');\n\n if (Craft.PreviewFileModal.openInstance && $element.length) {\n this._loadPreview($element);\n }\n },\n\n /**\n * Load the preview for an Asset element\n * @private\n */\n _loadPreview: function ($element) {\n var settings = {};\n\n if ($element.data('image-width')) {\n settings.startingWidth = $element.data('image-width');\n settings.startingHeight = $element.data('image-height');\n }\n\n new Craft.PreviewFileModal(\n $element.data('id'),\n this.view.elementSelect,\n settings\n );\n },\n\n /**\n * On Drag Start\n */\n _onDragStart: function () {\n this._tempExpandedFolders = [];\n },\n\n /**\n * Get File Drag Helper\n */\n _getFileDragHelper: function ($element) {\n var currentView = this.getSelectedSourceState('mode');\n var $outerContainer;\n var $innerContainer;\n\n switch (currentView) {\n case 'table': {\n $outerContainer = $(\n '<div class=\"elements datatablesorthelper\"/>'\n ).appendTo(Garnish.$bod);\n $innerContainer = $('<div class=\"tableview\"/>').appendTo(\n $outerContainer\n );\n var $table = $('<table class=\"data\"/>').appendTo($innerContainer);\n var $tbody = $('<tbody/>').appendTo($table);\n\n $element.appendTo($tbody);\n\n // Copy the column widths\n this._$firstRowCells = this.view.$table\n .children('tbody')\n .children('tr:first')\n .children();\n var $helperCells = $element.children();\n\n for (var i = 0; i < $helperCells.length; i++) {\n // Hard-set the cell widths\n var $helperCell = $($helperCells[i]);\n\n // Skip the checkbox cell\n if ($helperCell.hasClass('checkbox-cell')) {\n $helperCell.remove();\n $outerContainer.css('margin-' + Craft.left, 19); // 26 - 7\n continue;\n }\n\n var $firstRowCell = $(this._$firstRowCells[i]),\n width = $firstRowCell.width();\n\n $firstRowCell.width(width);\n $helperCell.width(width);\n }\n\n return $outerContainer;\n }\n case 'thumbs': {\n $outerContainer = $('<div class=\"elements thumbviewhelper\"/>').appendTo(\n Garnish.$bod\n );\n $innerContainer = $('<ul class=\"thumbsview\"/>').appendTo(\n $outerContainer\n );\n\n $element.appendTo($innerContainer);\n\n return $outerContainer;\n }\n }\n\n return $();\n },\n\n /**\n * On Drop Target Change\n */\n _onDropTargetChange: function ($dropTarget) {\n clearTimeout(this._expandDropTargetFolderTimeout);\n\n if ($dropTarget) {\n var folderId = $dropTarget.data('folder-id');\n\n if (folderId) {\n this.dropTargetFolder = this._getSourceByKey(folderId);\n\n if (\n this._hasSubfolders(this.dropTargetFolder) &&\n !this._isExpanded(this.dropTargetFolder)\n ) {\n this._expandDropTargetFolderTimeout = setTimeout(\n this._expandFolder.bind(this),\n 500\n );\n }\n } else {\n this.dropTargetFolder = null;\n }\n }\n\n if ($dropTarget && $dropTarget[0] !== this.$source[0]) {\n // Temporarily remove the .sel class on the active source\n this.$source.removeClass('sel');\n } else {\n this.$source.addClass('sel');\n }\n },\n\n /**\n * Collapse Extra Expanded Folders\n */\n _collapseExtraExpandedFolders: function (dropTargetFolderId) {\n clearTimeout(this._expandDropTargetFolderTimeout);\n\n // If a source ID is passed in, exclude its parents\n var $excludedSources;\n\n if (dropTargetFolderId) {\n $excludedSources = this._getSourceByKey(dropTargetFolderId)\n .parents('li')\n .children('a');\n }\n\n for (var i = this._tempExpandedFolders.length - 1; i >= 0; i--) {\n var $source = this._tempExpandedFolders[i];\n\n // Check the parent list, if a source id is passed in\n if (\n typeof $excludedSources === 'undefined' ||\n $excludedSources.filter('[data-key=\"' + $source.data('key') + '\"]')\n .length === 0\n ) {\n this._collapseFolder($source);\n this._tempExpandedFolders.splice(i, 1);\n }\n }\n },\n\n _getSourceByKey: function (key) {\n return this.$sources.filter('[data-key$=\"' + key + '\"]');\n },\n\n _hasSubfolders: function ($source) {\n return $source.siblings('ul').find('li').length;\n },\n\n _isExpanded: function ($source) {\n return $source.parent('li').hasClass('expanded');\n },\n\n _expandFolder: function () {\n // Collapse any temp-expanded drop targets that aren't parents of this one\n this._collapseExtraExpandedFolders(this.dropTargetFolder.data('folder-id'));\n\n this.dropTargetFolder.siblings('.toggle').trigger('click');\n\n // Keep a record of that\n this._tempExpandedFolders.push(this.dropTargetFolder);\n },\n\n _collapseFolder: function ($source) {\n if ($source.parent().hasClass('expanded')) {\n $source.siblings('.toggle').trigger('click');\n }\n },\n\n getSourceActions: function () {\n const actions = this.base();\n\n // Make sure it's a volume folder\n if (this._getVolumeOrFolderUidFromSourceKey(this.sourceKey)) {\n actions.push({\n label: Craft.t('app', 'New subfolder'),\n onSelect: () => {\n this._createSubfolder(this.$source);\n },\n });\n\n // For all folders that are not top folders\n if (this.getSourceLevel(this.$source) > 1) {\n actions.push({\n label: Craft.t('app', 'Rename folder'),\n onSelect: () => {\n this._renameFolder(this.$source);\n },\n });\n actions.push({\n label: Craft.t('app', 'Delete folder'),\n destructive: true,\n onSelect: () => {\n this._deleteFolder(this.$source);\n },\n });\n }\n }\n\n return actions;\n },\n\n _createFolderContextMenu: function ($source) {\n // Make sure it's a volume folder\n if (!this._getVolumeOrFolderUidFromSourceKey($source.data('key'))) {\n return;\n }\n\n var menuOptions = [\n {\n label: Craft.t('app', 'New subfolder'),\n onClick: () => {\n this._createSubfolder($source);\n },\n },\n ];\n\n // For all folders that are not top folders\n if (this.settings.context === 'index' && this.getSourceLevel($source) > 1) {\n menuOptions.push({\n label: Craft.t('app', 'Rename folder'),\n onClick: () => {\n this._renameFolder($source);\n },\n });\n menuOptions.push({\n label: Craft.t('app', 'Delete folder'),\n onClick: () => {\n this._deleteFolder($source);\n },\n });\n }\n\n new Garnish.ContextMenu($source, menuOptions, {menuClass: 'menu'});\n },\n\n _createSubfolder: function ($parentFolder) {\n var subfolderName = prompt(Craft.t('app', 'Enter the name of the folder'));\n\n if (subfolderName) {\n var data = {\n parentId: $parentFolder.data('folder-id'),\n folderName: subfolderName,\n };\n\n this.setIndexBusy();\n\n Craft.sendActionRequest('POST', 'assets/create-folder', {data})\n .then((response) => {\n const data = response.data;\n this.setIndexAvailable();\n this._prepareParentForChildren($parentFolder);\n var $subfolder = $(\n '<li>' +\n `<a data-key=\"${$parentFolder.data('key')}/folder:${\n data.folderUid\n }\" data-default-sort=\"${$parentFolder.data('default-sort')}\"` +\n (Garnish.hasAttr($parentFolder, 'data-has-thumbs')\n ? ' data-has-thumbs'\n : '') +\n ` data-folder-id=\"${data.folderId}\"` +\n (Garnish.hasAttr($parentFolder, 'data-can-upload')\n ? ' data-can-upload'\n : '') +\n (Garnish.hasAttr($parentFolder, 'data-can-move-to')\n ? ' data-can-move-to'\n : '') +\n (Garnish.hasAttr($parentFolder, 'data-can-move-peer-files-to')\n ? ' data-can-move-peer-files-to'\n : '') +\n '>' +\n `<span class=\"label\">${data.folderName}</span>` +\n '</a>' +\n '</li>'\n );\n\n var $a = $subfolder.children('a:first');\n this._appendSubfolder($parentFolder, $subfolder);\n this.initSource($a);\n\n Craft.cp.displayNotice(Craft.t('app', 'Folder created.'));\n })\n .catch(({response}) => {\n this.setIndexAvailable();\n alert(response.data.message);\n });\n }\n },\n\n _deleteFolder: function ($targetFolder) {\n if (\n confirm(\n Craft.t('app', 'Really delete folder “{folder}”?', {\n folder: $.trim($targetFolder.text()),\n })\n )\n ) {\n var data = {\n folderId: $targetFolder.data('folder-id'),\n };\n\n this.setIndexBusy();\n\n Craft.sendActionRequest('POST', 'assets/delete-folder', {data})\n .then((response) => {\n this.setIndexAvailable();\n var $parentFolder = this.getParentSource($targetFolder);\n\n // Remove folder and any trace from its parent, if needed\n this.deinitSource($targetFolder);\n\n $targetFolder.parent().remove();\n this._cleanUpTree($parentFolder);\n\n Craft.cp.displayNotice(Craft.t('app', 'Folder deleted.'));\n })\n .catch(({response}) => {\n this.setIndexAvailable();\n alert(response.data.message);\n });\n }\n },\n\n /**\n * Rename\n */\n _renameFolder: function ($source) {\n const $label = $source.children('.label');\n const oldName = Craft.trim($label.text());\n const newName = prompt(Craft.t('app', 'Rename folder'), oldName);\n\n if (!newName || newName === oldName) {\n return;\n }\n\n this.setIndexBusy();\n\n Craft.sendActionRequest('POST', 'assets/rename-folder', {\n data: {\n folderId: $source.data('folder-id'),\n newName: newName,\n },\n })\n .then((response) => {\n $label.text(response.data.newName);\n\n // Is this the selected source?\n if ($source.data('key') === this.$source.data('key')) {\n this.updateElements();\n\n Craft.cp.displayNotice(Craft.t('app', 'Folder renamed.'));\n\n // Update the URL if we're on the Assets index\n if (this.settings.context === 'index') {\n this._updateUrl($source);\n }\n }\n })\n .catch(({response}) => {\n this.setIndexAvailable();\n alert(response.data.message);\n });\n },\n\n /**\n * Prepare a source folder for children folder.\n *\n * @param {jQuery} $parentFolder\n * @private\n */\n _prepareParentForChildren: function ($parentFolder) {\n if (!this._hasSubfolders($parentFolder)) {\n $parentFolder\n .parent()\n .addClass('expanded')\n .append('<div class=\"toggle\"></div><ul class=\"nested\"></ul>');\n this.initSourceToggle($parentFolder);\n }\n },\n\n /**\n * Appends a subfolder to the parent folder at the correct spot.\n *\n * @param {jQuery} $parentFolder\n * @param {jQuery} $subfolder\n * @private\n */\n _appendSubfolder: function ($parentFolder, $subfolder) {\n var $subfolderList = $parentFolder.siblings('ul'),\n $existingChildren = $subfolderList.children('li'),\n subfolderLabel = $.trim($subfolder.children('a:first').text()),\n folderInserted = false;\n\n for (var i = 0; i < $existingChildren.length; i++) {\n var $existingChild = $($existingChildren[i]);\n\n if ($.trim($existingChild.children('a:first').text()) > subfolderLabel) {\n $existingChild.before($subfolder);\n folderInserted = true;\n break;\n }\n }\n\n if (!folderInserted) {\n $parentFolder.siblings('ul').append($subfolder);\n }\n },\n\n _cleanUpTree: function ($parentFolder) {\n if (\n $parentFolder !== null &&\n $parentFolder.siblings('ul').children('li').length === 0\n ) {\n this.deinitSourceToggle($parentFolder);\n $parentFolder.siblings('ul').remove();\n $parentFolder.siblings('.toggle').remove();\n $parentFolder.parent().removeClass('expanded');\n }\n },\n\n _positionProgressBar: function () {\n if (!this.progressBar) {\n this.progressBar = new Craft.ProgressBar(this.$main, true);\n }\n\n var $container = $(),\n scrollTop = 0,\n offset = 0;\n\n if (this.settings.context === 'index') {\n $container = this.progressBar.$progressBar.closest('#content');\n scrollTop = Garnish.$win.scrollTop();\n } else {\n $container = this.progressBar.$progressBar.closest('.main');\n scrollTop = this.$main.scrollTop();\n }\n\n var containerTop = $container.offset().top;\n var diff = scrollTop - containerTop;\n var windowHeight = Garnish.$win.height();\n\n if ($container.height() > windowHeight) {\n offset = windowHeight / 2 - 6 + diff;\n } else {\n offset = $container.height() / 2 - 6;\n }\n\n if (this.settings.context !== 'index') {\n offset = scrollTop + ($container.height() / 2 - 6);\n }\n\n this.progressBar.$progressBar.css({\n top: offset,\n });\n },\n\n _performBatchRequests: function (parameterArray, finalCallback) {\n const responseArray = [];\n let activeRequests = parameterArray.length;\n\n while (parameterArray.length) {\n const parameters = parameterArray.shift();\n Craft.sendActionRequest('POST', parameters.action, {\n data: parameters.params,\n })\n .then((response) => {\n responseArray.push(response.data);\n })\n .finally(() => {\n this.progressBar.incrementProcessedItemCount(1);\n this.progressBar.updateProgressBar();\n\n // Was that the last one?\n if (--activeRequests === 0) {\n // If assets were just merged we should get the reference tags updated right away\n Craft.cp.runQueue();\n finalCallback(responseArray);\n }\n });\n }\n },\n});\n\n// Register it!\nCraft.registerElementIndexClass('craft\\\\elements\\\\Asset', Craft.AssetIndex);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Asset Select input\n */\nCraft.AssetSelectInput = Craft.BaseElementSelectInput.extend({\n requestId: 0,\n hud: null,\n $uploadBtn: null,\n uploader: null,\n progressBar: null,\n openPreviewTimeout: null,\n\n init: function () {\n this.base.apply(this, arguments);\n\n if (this.settings.canUpload) {\n this._attachUploader();\n }\n\n this.updateAddElementsBtn();\n\n this.addListener(\n this.$elementsContainer,\n 'keydown',\n this._onKeyDown.bind(this)\n );\n this.elementSelect.on('focusItem', this._onElementFocus.bind(this));\n },\n\n /**\n * Handle a keypress\n * @private\n */\n _onKeyDown: function (ev) {\n if (ev.keyCode === Garnish.SPACE_KEY && ev.shiftKey) {\n this.openPreview();\n ev.stopPropagation();\n return false;\n }\n },\n\n onAddElements: function () {\n this.$elements\n .find('.elementthumb')\n .addClass('open-preview')\n .on('click', (ev) => {\n this.clearOpenPreviewTimeout();\n this.openPreviewTimeout = setTimeout(() => {\n this.openPreview();\n this.openPreviewTimeout = null;\n }, 500);\n })\n .on('dblclick', (ev) => {\n this.clearOpenPreviewTimeout();\n });\n this.base();\n },\n\n clearOpenPreviewTimeout: function () {\n if (this.openPreviewTimeout) {\n clearTimeout(this.openPreviewTimeout);\n this.openPreviewTimeout = null;\n }\n },\n\n openPreview: function () {\n if (Craft.PreviewFileModal.openInstance) {\n Craft.PreviewFileModal.openInstance.selfDestruct();\n } else {\n var $element = this.elementSelect.$focusedItem;\n\n if ($element.length) {\n this._loadPreview($element);\n }\n }\n },\n\n /**\n * Handle element being focused\n * @private\n */\n _onElementFocus: function (ev) {\n var $element = $(ev.item);\n\n if (Craft.PreviewFileModal.openInstance && $element.length) {\n this._loadPreview($element);\n }\n },\n\n /**\n * Load the preview for an Asset element\n * @private\n */\n _loadPreview: function ($element) {\n var settings = {\n minGutter: 50,\n };\n\n if ($element.data('image-width')) {\n settings.startingWidth = $element.data('image-width');\n settings.startingHeight = $element.data('image-height');\n }\n\n new Craft.PreviewFileModal(\n $element.data('id'),\n this.elementSelect,\n settings\n );\n },\n\n /**\n * Attach the uploader with drag event handler\n */\n _attachUploader: function () {\n this.progressBar = new Craft.ProgressBar(\n $('<div class=\"progress-shade\"></div>').appendTo(this.$container)\n );\n\n var options = {\n url: Craft.getActionUrl('assets/upload'),\n dropZone: this.$container,\n formData: {\n fieldId: this.settings.fieldId,\n },\n };\n\n if (this.settings.sourceElementId) {\n options.formData.elementId = this.settings.sourceElementId;\n }\n\n if (this.settings.criteria.siteId) {\n options.formData.siteId = this.settings.criteria.siteId;\n }\n\n if (this.$addElementBtn) {\n this.$uploadBtn = $('<button/>', {\n type: 'button',\n class: 'btn dashed',\n 'data-icon': 'upload',\n 'aria-label':\n this.settings.limit == 1\n ? Craft.t('app', 'Upload a file')\n : Craft.t('app', 'Upload files'),\n 'aria-describedby': this.settings.describedBy,\n text:\n this.settings.limit == 1\n ? Craft.t('app', 'Upload a file')\n : Craft.t('app', 'Upload files'),\n }).insertAfter(this.$addElementBtn);\n options.fileInput = $('<input/>', {\n type: 'file',\n class: 'hidden',\n multiple: this.settings.limit != 1,\n }).insertAfter(this.$uploadBtn);\n\n // Trigger a window resize in case the field is inside an element editor HUD\n Garnish.$win.trigger('resize');\n }\n\n // If CSRF protection isn't enabled, these won't be defined.\n if (\n typeof Craft.csrfTokenName !== 'undefined' &&\n typeof Craft.csrfTokenValue !== 'undefined'\n ) {\n // Add the CSRF token\n options.formData[Craft.csrfTokenName] = Craft.csrfTokenValue;\n }\n\n if (typeof this.settings.criteria.kind !== 'undefined') {\n options.allowedKinds = this.settings.criteria.kind;\n }\n\n options.canAddMoreFiles = this.canAddMoreFiles.bind(this);\n\n options.events = {};\n options.events.fileuploadstart = this._onUploadStart.bind(this);\n options.events.fileuploadprogressall = this._onUploadProgress.bind(this);\n options.events.fileuploaddone = this._onUploadComplete.bind(this);\n options.events.fileuploadfail = this._onUploadFailure.bind(this);\n\n this.uploader = new Craft.Uploader(this.$container, options);\n\n if (this.$uploadBtn) {\n this.$uploadBtn.on('click', (ev) => {\n // We can't store a reference to the file input, because it gets replaced with a new input\n // each time a new file is uploaded - see https://stackoverflow.com/a/25034721/1688568\n this.$uploadBtn.next('input[type=file]').trigger('click');\n });\n }\n },\n\n enableAddElementsBtn: function () {\n if (this.$uploadBtn) {\n this.$uploadBtn.removeClass('hidden');\n }\n\n this.base();\n },\n\n disableAddElementsBtn: function () {\n if (this.$uploadBtn) {\n this.$uploadBtn.addClass('hidden');\n }\n\n this.base();\n },\n\n /**\n * Add the freshly uploaded file to the input field.\n */\n selectUploadedFile: function (element) {\n // Check if we're able to add new elements\n if (!this.canAddMoreElements()) {\n return;\n }\n\n var $newElement = element.$element;\n\n // Make a couple tweaks\n $newElement.addClass('removable');\n $newElement.prepend(\n '<input type=\"hidden\" name=\"' +\n this.settings.name +\n '[]\" value=\"' +\n element.id +\n '\">' +\n '<a class=\"delete icon\" title=\"' +\n Craft.t('app', 'Remove') +\n '\"></a>'\n );\n\n $newElement.appendTo(this.$elementsContainer);\n\n var margin = -($newElement.outerWidth() + 10);\n\n this.$addElementBtn.css('margin-' + Craft.left, margin + 'px');\n\n var animateCss = {};\n animateCss['margin-' + Craft.left] = 0;\n this.$addElementBtn.velocity(animateCss, 'fast');\n\n this.addElements($newElement);\n\n delete this.modal;\n },\n\n /**\n * On upload start.\n */\n _onUploadStart: function () {\n this.progressBar.$progressBar.css({\n top: Math.round(this.$container.outerHeight() / 2) - 6,\n });\n\n this.$container.addClass('uploading');\n this.progressBar.resetProgressBar();\n this.progressBar.showProgressBar();\n },\n\n /**\n * On upload progress.\n */\n _onUploadProgress: function (event, data) {\n var progress = parseInt((data.loaded / data.total) * 100, 10);\n this.progressBar.setProgressPercentage(progress);\n },\n\n /**\n * On a file being uploaded.\n */\n _onUploadComplete: function (event, data) {\n if (data.result.error) {\n alert(data.result.error);\n this.progressBar.hideProgressBar();\n this.$container.removeClass('uploading');\n } else {\n var parameters = {\n elementId: data.result.assetId,\n siteId: this.settings.criteria.siteId,\n thumbSize: this.settings.viewMode,\n };\n\n Craft.sendActionRequest('POST', 'elements/get-element-html', {\n data: parameters,\n })\n .then((response) => {\n var html = $(response.data.html);\n Craft.appendHeadHtml(response.data.headHtml);\n this.selectUploadedFile(Craft.getElementInfo(html));\n\n // Last file\n if (this.uploader.isLastUpload()) {\n this.progressBar.hideProgressBar();\n this.$container.removeClass('uploading');\n this.$container.trigger('change');\n }\n })\n .catch(({response}) => {\n alert(response.data.message);\n });\n\n Craft.cp.runQueue();\n }\n },\n\n /**\n * On Upload Failure.\n */\n _onUploadFailure: function (event, data) {\n const response = data.response();\n let {message, filename} = response?.jqXHR?.responseJSON || {};\n\n if (!message) {\n message = filename\n ? Craft.t('app', 'Upload failed for “{filename}”.', {filename})\n : Craft.t('app', 'Upload failed.');\n }\n\n alert(message);\n this.progressBar.hideProgressBar();\n this.$container.removeClass('uploading');\n },\n\n /**\n * We have to take into account files about to be added as well\n */\n canAddMoreFiles: function (slotsTaken) {\n return (\n !this.settings.limit ||\n this.$elements.length + slotsTaken < this.settings.limit\n );\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Asset selector modal class\n */\nCraft.AssetSelectorModal = Craft.BaseElementSelectorModal.extend(\n {\n $selectTransformBtn: null,\n _selectedTransform: null,\n\n init: function (elementType, settings) {\n settings = $.extend({}, Craft.AssetSelectorModal.defaults, settings);\n\n this.base(elementType, settings);\n\n if (settings.transforms.length) {\n this.createSelectTransformButton(settings.transforms);\n }\n },\n\n createSelectTransformButton: function (transforms) {\n if (!transforms || !transforms.length) {\n return;\n }\n\n var $btnGroup = $('<div class=\"btngroup\"/>').appendTo(\n this.$primaryButtons\n );\n this.$selectBtn.appendTo($btnGroup);\n\n this.$selectTransformBtn = $('<button/>', {\n type: 'button',\n class: 'btn menubtn disabled',\n text: Craft.t('app', 'Select transform'),\n }).appendTo($btnGroup);\n\n var $menu = $('<div class=\"menu\" data-align=\"right\"></div>').insertAfter(\n this.$selectTransformBtn\n ),\n $menuList = $('<ul></ul>').appendTo($menu);\n\n for (var i = 0; i < transforms.length; i++) {\n $(\n '<li><a data-transform=\"' +\n transforms[i].handle +\n '\">' +\n transforms[i].name +\n '</a></li>'\n ).appendTo($menuList);\n }\n\n var MenuButton = new Garnish.MenuBtn(this.$selectTransformBtn, {\n onOptionSelect: this.onSelectTransform.bind(this),\n });\n MenuButton.disable();\n\n this.$selectTransformBtn.data('menuButton', MenuButton);\n },\n\n onSelectionChange: function (ev) {\n var $selectedElements = this.elementIndex.getSelectedElements(),\n allowTransforms = false;\n\n if ($selectedElements.length && this.settings.transforms.length) {\n allowTransforms = true;\n\n for (var i = 0; i < $selectedElements.length; i++) {\n if (!$('.element.hasthumb:first', $selectedElements[i]).length) {\n break;\n }\n }\n }\n\n var MenuBtn = null;\n\n if (this.$selectTransformBtn) {\n MenuBtn = this.$selectTransformBtn.data('menuButton');\n }\n\n if (allowTransforms) {\n if (MenuBtn) {\n MenuBtn.enable();\n }\n\n this.$selectTransformBtn.removeClass('disabled');\n } else if (this.$selectTransformBtn) {\n if (MenuBtn) {\n MenuBtn.disable();\n }\n\n this.$selectTransformBtn.addClass('disabled');\n }\n\n this.base();\n },\n\n onSelectTransform: function (option) {\n var transform = $(option).data('transform');\n this.selectImagesWithTransform(transform);\n },\n\n selectImagesWithTransform: function (transform) {\n // First we must get any missing transform URLs\n if (\n typeof Craft.AssetSelectorModal.transformUrls[transform] === 'undefined'\n ) {\n Craft.AssetSelectorModal.transformUrls[transform] = {};\n }\n\n var $selectedElements = this.elementIndex.getSelectedElements(),\n imageIdsWithMissingUrls = [];\n\n for (var i = 0; i < $selectedElements.length; i++) {\n var $item = $($selectedElements[i]),\n elementId = Craft.getElementInfo($item).id;\n\n if (\n typeof Craft.AssetSelectorModal.transformUrls[transform][\n elementId\n ] === 'undefined'\n ) {\n imageIdsWithMissingUrls.push(elementId);\n }\n }\n\n if (imageIdsWithMissingUrls.length) {\n this.showFooterSpinner();\n\n this.fetchMissingTransformUrls(\n imageIdsWithMissingUrls,\n transform,\n () => {\n this.hideFooterSpinner();\n this.selectImagesWithTransform(transform);\n }\n );\n } else {\n this._selectedTransform = transform;\n this.selectElements();\n this._selectedTransform = null;\n }\n },\n\n fetchMissingTransformUrls: function (\n imageIdsWithMissingUrls,\n transform,\n callback\n ) {\n var elementId = imageIdsWithMissingUrls.pop();\n\n var data = {\n assetId: elementId,\n handle: transform,\n };\n\n Craft.sendActionRequest('POST', 'assets/generate-transform', {data})\n .then((response) => {\n Craft.AssetSelectorModal.transformUrls[transform][elementId] = false;\n if (response.data.url) {\n Craft.AssetSelectorModal.transformUrls[transform][elementId] =\n response.data.url;\n }\n })\n .catch(({response}) => {\n Craft.AssetSelectorModal.transformUrls[transform][elementId] = false;\n\n // More to load?\n if (imageIdsWithMissingUrls.length) {\n this.fetchMissingTransformUrls(\n imageIdsWithMissingUrls,\n transform,\n callback\n );\n } else {\n callback();\n }\n });\n },\n\n getElementInfo: function ($selectedElements) {\n var info = this.base($selectedElements);\n\n if (this._selectedTransform) {\n for (var i = 0; i < info.length; i++) {\n var elementId = info[i].id;\n\n if (\n typeof Craft.AssetSelectorModal.transformUrls[\n this._selectedTransform\n ][elementId] !== 'undefined' &&\n Craft.AssetSelectorModal.transformUrls[this._selectedTransform][\n elementId\n ] !== false\n ) {\n info[i].url =\n Craft.AssetSelectorModal.transformUrls[this._selectedTransform][\n elementId\n ];\n }\n }\n }\n\n return info;\n },\n\n onSelect: function (elementInfo) {\n this.settings.onSelect(elementInfo, this._selectedTransform);\n },\n },\n {\n defaults: {\n canSelectImageTransforms: false,\n transforms: [],\n },\n\n transformUrls: {},\n }\n);\n\n// Register it!\nCraft.registerElementSelectorModalClass(\n 'craft\\\\elements\\\\Asset',\n Craft.AssetSelectorModal\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * AuthManager class\n */\nCraft.AuthManager = Garnish.Base.extend(\n {\n remainingSessionTime: null,\n checkRemainingSessionTimer: null,\n showLoginModalTimer: null,\n decrementLogoutWarningInterval: null,\n\n showingLogoutWarningModal: false,\n showingLoginModal: false,\n\n logoutWarningModal: null,\n loginModal: null,\n\n $logoutWarningPara: null,\n $passwordInput: null,\n $loginBtn: null,\n $loginErrorPara: null,\n\n submitLoginIfLoggedOut: false,\n\n /**\n * Init\n */\n init: function () {\n if (Craft.username) {\n this.updateRemainingSessionTime(Craft.remainingSessionTime);\n }\n },\n\n /**\n * Sets a timer for the next time to check the auth timeout.\n */\n setCheckRemainingSessionTimer: function (seconds) {\n if (this.checkRemainingSessionTimer) {\n clearTimeout(this.checkRemainingSessionTimer);\n }\n\n this.checkRemainingSessionTimer = setTimeout(\n this.checkRemainingSessionTime.bind(this),\n seconds * 1000\n );\n },\n\n /**\n * Pings the server to see how many seconds are left on the current user session, and handles the response.\n */\n checkRemainingSessionTime: function (extendSession) {\n $.ajax({\n url: Craft.getActionUrl(\n 'users/session-info',\n extendSession ? null : 'dontExtendSession=1'\n ),\n type: 'GET',\n dataType: 'json',\n complete: (jqXHR, textStatus) => {\n if (textStatus === 'success') {\n if (\n typeof jqXHR.responseJSON.csrfTokenValue !== 'undefined' &&\n typeof Craft.csrfTokenValue !== 'undefined'\n ) {\n Craft.csrfTokenValue = jqXHR.responseJSON.csrfTokenValue;\n }\n\n this.updateRemainingSessionTime(jqXHR.responseJSON.timeout);\n this.submitLoginIfLoggedOut = false;\n } else {\n this.updateRemainingSessionTime(-1);\n }\n },\n });\n },\n\n /**\n * Updates our record of the auth timeout, and handles it.\n */\n updateRemainingSessionTime: function (remainingSessionTime) {\n this.remainingSessionTime = parseInt(remainingSessionTime);\n\n // Are we within the warning window?\n if (\n this.remainingSessionTime !== -1 &&\n this.remainingSessionTime < Craft.AuthManager.minSafeSessionTime\n ) {\n // Is there still time to renew the session?\n if (this.remainingSessionTime) {\n if (!this.showingLogoutWarningModal) {\n // Show the warning modal\n this.showLogoutWarningModal();\n }\n\n // Will the session expire before the next checkup?\n if (this.remainingSessionTime < Craft.AuthManager.checkInterval) {\n if (this.showLoginModalTimer) {\n clearTimeout(this.showLoginModalTimer);\n }\n\n this.showLoginModalTimer = setTimeout(\n this.showLoginModal.bind(this),\n this.remainingSessionTime * 1000\n );\n }\n } else {\n if (this.showingLoginModal) {\n if (this.submitLoginIfLoggedOut) {\n this.submitLogin();\n }\n } else {\n // Show the login modal\n this.showLoginModal();\n }\n }\n\n this.setCheckRemainingSessionTimer(Craft.AuthManager.checkInterval);\n } else {\n // Everything's good!\n this.hideLogoutWarningModal();\n this.hideLoginModal();\n\n // Will be be within the minSafeSessionTime before the next update?\n if (\n this.remainingSessionTime !== -1 &&\n this.remainingSessionTime <\n Craft.AuthManager.minSafeSessionTime +\n Craft.AuthManager.checkInterval\n ) {\n this.setCheckRemainingSessionTimer(\n this.remainingSessionTime - Craft.AuthManager.minSafeSessionTime + 1\n );\n } else {\n this.setCheckRemainingSessionTimer(Craft.AuthManager.checkInterval);\n }\n }\n },\n\n /**\n * Shows the logout warning modal.\n */\n showLogoutWarningModal: function () {\n var quickShow;\n\n if (this.showingLoginModal) {\n this.hideLoginModal(true);\n quickShow = true;\n } else {\n quickShow = false;\n }\n\n this.showingLogoutWarningModal = true;\n\n if (!this.logoutWarningModal) {\n let $form = $(\n '<form id=\"logoutwarningmodal\" class=\"modal alert fitted\"/>'\n );\n let $body = $('<div class=\"body\"/>').appendTo($form);\n let $buttons = $('<div class=\"buttons right\"/>').appendTo($body);\n let $logoutBtn = $('<button/>', {\n type: 'button',\n class: 'btn',\n text: Craft.t('app', 'Sign out now'),\n }).appendTo($buttons);\n let $renewSessionBtn = $('<button/>', {\n type: 'submit',\n class: 'btn submit',\n text: Craft.t('app', 'Keep me signed in'),\n }).appendTo($buttons);\n\n this.$logoutWarningPara = $('<p/>').prependTo($body);\n\n this.logoutWarningModal = new Garnish.Modal($form, {\n autoShow: false,\n closeOtherModals: false,\n hideOnEsc: false,\n hideOnShadeClick: false,\n shadeClass: 'modal-shade dark logoutwarningmodalshade',\n onFadeIn: function () {\n if (!Garnish.isMobileBrowser(true)) {\n // Auto-focus the renew button\n setTimeout(function () {\n $renewSessionBtn.trigger('focus');\n }, 100);\n }\n },\n });\n\n this.addListener($logoutBtn, 'activate', 'logout');\n this.addListener($form, 'submit', 'renewSession');\n }\n\n if (quickShow) {\n this.logoutWarningModal.quickShow();\n } else {\n this.logoutWarningModal.show();\n }\n\n this.updateLogoutWarningMessage();\n\n this.decrementLogoutWarningInterval = setInterval(\n this.decrementLogoutWarning.bind(this),\n 1000\n );\n },\n\n /**\n * Updates the logout warning message indicating that the session is about to expire.\n */\n updateLogoutWarningMessage: function () {\n this.$logoutWarningPara.text(\n Craft.t('app', 'Your session will expire in {time}.', {\n time: Craft.secondsToHumanTimeDuration(this.remainingSessionTime),\n })\n );\n\n this.logoutWarningModal.updateSizeAndPosition();\n },\n\n decrementLogoutWarning: function () {\n if (this.remainingSessionTime > 0) {\n this.remainingSessionTime--;\n this.updateLogoutWarningMessage();\n }\n\n if (this.remainingSessionTime === 0) {\n clearInterval(this.decrementLogoutWarningInterval);\n }\n },\n\n /**\n * Hides the logout warning modal.\n */\n hideLogoutWarningModal: function (quick) {\n this.showingLogoutWarningModal = false;\n\n if (this.logoutWarningModal) {\n if (quick) {\n this.logoutWarningModal.quickHide();\n } else {\n this.logoutWarningModal.hide();\n }\n\n if (this.decrementLogoutWarningInterval) {\n clearInterval(this.decrementLogoutWarningInterval);\n }\n }\n },\n\n /**\n * Shows the login modal.\n */\n showLoginModal: function () {\n var quickShow;\n\n if (this.showingLogoutWarningModal) {\n this.hideLogoutWarningModal(true);\n quickShow = true;\n } else {\n quickShow = false;\n }\n\n this.showingLoginModal = true;\n\n if (!this.loginModal) {\n var $form = $('<form id=\"loginmodal\" class=\"modal alert fitted\"/>'),\n $body = $(\n '<div class=\"body\"><h2>' +\n Craft.t('app', 'Your session has ended.') +\n '</h2><p>' +\n Craft.t('app', 'Enter your password to log back in.') +\n '</p></div>'\n ).appendTo($form),\n $inputContainer = $('<div class=\"inputcontainer\">').appendTo($body),\n $inputsFlexContainer = $('<div class=\"flex\"/>').appendTo(\n $inputContainer\n ),\n $passwordContainer = $('<div class=\"flex-grow\"/>').appendTo(\n $inputsFlexContainer\n ),\n $buttonContainer = $('<div/>').appendTo($inputsFlexContainer),\n $passwordWrapper = $('<div class=\"passwordwrapper\"/>').appendTo(\n $passwordContainer\n );\n\n this.$passwordInput = $(\n '<input type=\"password\" class=\"text password fullwidth\" autocomplete=\"current-password\" placeholder=\"' +\n Craft.t('app', 'Password') +\n '\"/>'\n ).appendTo($passwordWrapper);\n this.$loginBtn = Craft.ui\n .createSubmitButton({\n class: 'disabled',\n label: Craft.t('app', 'Sign in'),\n spinner: true,\n })\n .attr('aria-disabled', 'true')\n .appendTo($buttonContainer);\n this.$loginErrorPara = $('<p class=\"error\"/>').appendTo($body);\n\n this.loginModal = new Garnish.Modal($form, {\n autoShow: false,\n closeOtherModals: false,\n hideOnEsc: false,\n hideOnShadeClick: false,\n shadeClass: 'modal-shade dark loginmodalshade',\n onFadeIn: () => {\n if (!Garnish.isMobileBrowser(true)) {\n // Auto-focus the password input\n setTimeout(() => {\n this.$passwordInput.trigger('focus');\n }, 100);\n }\n },\n onFadeOut: () => {\n this.$passwordInput.val('');\n },\n });\n\n new Craft.PasswordInput(this.$passwordInput, {\n onToggleInput: ($newPasswordInput) => {\n this.$passwordInput = $newPasswordInput;\n },\n });\n\n this.addListener(this.$passwordInput, 'input', 'validatePassword');\n this.addListener($form, 'submit', 'login');\n }\n\n if (quickShow) {\n this.loginModal.quickShow();\n } else {\n this.loginModal.show();\n }\n },\n\n /**\n * Hides the login modal.\n */\n hideLoginModal: function (quick) {\n this.showingLoginModal = false;\n\n if (this.loginModal) {\n if (quick) {\n this.loginModal.quickHide();\n } else {\n this.loginModal.hide();\n }\n }\n },\n\n logout: function () {\n $.get({\n url: Craft.getActionUrl('users/logout'),\n dataType: 'json',\n success: () => {\n Craft.redirectTo('');\n },\n });\n },\n\n renewSession: function (ev) {\n if (ev) {\n ev.preventDefault();\n }\n\n this.hideLogoutWarningModal();\n this.checkRemainingSessionTime(true);\n },\n\n validatePassword: function () {\n if (this.$passwordInput.val().length >= 6) {\n this.$loginBtn.removeClass('disabled');\n this.$loginBtn.removeAttr('aria-disabled');\n return true;\n } else {\n this.$loginBtn.addClass('disabled');\n this.$loginBtn.attr('aria-disabled', 'true');\n return false;\n }\n },\n\n login: function (ev) {\n if (ev) {\n ev.preventDefault();\n }\n\n if (this.validatePassword()) {\n this.$loginBtn.addClass('loading');\n this.clearLoginError();\n\n if (typeof Craft.csrfTokenValue !== 'undefined') {\n // Check the auth status one last time before sending this off,\n // in case the user has already logged back in from another window/tab\n this.submitLoginIfLoggedOut = true;\n this.checkRemainingSessionTime();\n } else {\n this.submitLogin();\n }\n }\n },\n\n submitLogin: function () {\n var data = {\n loginName: Craft.username,\n password: this.$passwordInput.val(),\n };\n\n Craft.sendActionRequest('POST', 'users/login', {data})\n .then((response) => {\n this.$loginBtn.removeClass('loading');\n this.hideLoginModal();\n this.checkRemainingSessionTime();\n })\n .catch(({response}) => {\n this.$loginBtn.removeClass('loading');\n this.showLoginError(response.data.message || null);\n Garnish.shake(this.loginModal.$container);\n\n if (!Garnish.isMobileBrowser(true)) {\n this.$passwordInput.trigger('focus');\n }\n });\n },\n\n showLoginError: function (error) {\n if (error === null || typeof error === 'undefined') {\n error = Craft.t('app', 'A server error occurred.');\n }\n\n this.$loginErrorPara.text(error);\n this.loginModal.updateSizeAndPosition();\n },\n\n clearLoginError: function () {\n this.showLoginError('');\n },\n },\n {\n checkInterval: 60,\n minSafeSessionTime: 120,\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n\n/**\n * Element index class\n */\nCraft.BaseElementIndex = Garnish.Base.extend(\n {\n initialized: false,\n elementType: null,\n idPrefix: null,\n\n instanceState: null,\n sourceStates: null,\n sourceStatesStorageKey: null,\n\n searchTimeout: null,\n sourceSelect: null,\n\n $container: null,\n $main: null,\n isIndexBusy: false,\n\n $sidebar: null,\n showingSidebar: null,\n sourceKey: null,\n rootSourceKey: null,\n sourceViewModes: null,\n $source: null,\n $rootSource: null,\n sourcesByKey: null,\n $visibleSources: null,\n\n $sourceActionsContainer: null,\n $sourceActionsBtn: null,\n\n $toolbar: null,\n toolbarOffset: null,\n\n $searchContainer: null,\n $search: null,\n $filterBtn: null,\n searching: false,\n searchText: null,\n sortByScore: null,\n trashed: false,\n drafts: false,\n $clearSearchBtn: null,\n\n $statusMenuBtn: null,\n $statusMenuContainer: null,\n statusMenu: null,\n status: null,\n\n $siteMenuBtn: null,\n siteMenu: null,\n siteId: null,\n\n $elements: null,\n $updateSpinner: null,\n $viewModeBtnContainer: null,\n viewModeBtns: null,\n viewMode: null,\n view: null,\n _autoSelectElements: null,\n $countSpinner: null,\n $countContainer: null,\n $actionsContainer: null,\n page: 1,\n resultSet: null,\n totalResults: null,\n $exportBtn: null,\n\n actions: null,\n actionsHeadHtml: null,\n actionsBodyHtml: null,\n $selectAllContainer: null,\n $selectAllCheckbox: null,\n showingActionTriggers: false,\n exporters: null,\n exportersByType: null,\n _$triggers: null,\n\n _ignoreFailedRequest: false,\n _cancelToken: null,\n\n viewMenus: null,\n activeViewMenu: null,\n filterHuds: null,\n\n /**\n * Constructor\n */\n init: function (elementType, $container, settings) {\n this.elementType = elementType;\n this.$container = $container;\n this.setSettings(settings, Craft.BaseElementIndex.defaults);\n\n // Define an ID prefix that can be used for dynamically created elements\n // ---------------------------------------------------------------------\n\n this.idPrefix = Craft.randomString(10);\n\n // Set the state objects\n // ---------------------------------------------------------------------\n\n this.instanceState = this.getDefaultInstanceState();\n\n this.sourceStates = {};\n\n // Instance states (selected source) are stored by a custom storage key defined in the settings\n if (this.settings.storageKey) {\n $.extend(\n this.instanceState,\n Craft.getLocalStorage(this.settings.storageKey),\n {}\n );\n }\n\n // Source states (view mode, etc.) are stored by the element type and context\n this.sourceStatesStorageKey =\n 'BaseElementIndex.' + this.elementType + '.' + this.settings.context;\n $.extend(\n this.sourceStates,\n Craft.getLocalStorage(this.sourceStatesStorageKey, {})\n );\n\n // Find the DOM elements\n // ---------------------------------------------------------------------\n\n this.$main = this.$container.find('.main');\n this.$toolbar = this.$container.find(this.settings.toolbarSelector);\n this.$statusMenuBtn = this.$toolbar.find('.statusmenubtn:first');\n this.$statusMenuContainer = this.$statusMenuBtn.parent();\n this.$siteMenuBtn = this.$container.find('.sitemenubtn:first');\n\n this.$searchContainer = this.$toolbar.find('.search:first');\n this.$search = this.$searchContainer.children('input:first');\n this.$filterBtn = this.$searchContainer.children('.filter-btn:first');\n this.$clearSearchBtn = this.$searchContainer.children('.clear-btn:first');\n\n this.$sidebar = this.$container.find('.sidebar:first');\n this.$sourceActionsContainer = this.$sidebar.find('#source-actions');\n\n this.$elements = this.$container.find('.elements:first');\n this.$updateSpinner = this.$elements.find('.spinner');\n\n if (!this.$updateSpinner.length) {\n this.$updateSpinner = $('<div/>', {\n class: 'update-spinner spinner spinner-absolute',\n }).appendTo(this.$elements);\n }\n\n this.$countSpinner = this.$container.find('#count-spinner');\n this.$countContainer = this.$container.find('#count-container');\n this.$actionsContainer = this.$container.find('#actions-container');\n this.$exportBtn = this.$container.find('#export-btn');\n\n // Hide sidebar if needed\n if (this.settings.hideSidebar) {\n this.$sidebar.hide();\n $('.body, .content', this.$container).removeClass('has-sidebar');\n }\n\n // Initialize the sources\n // ---------------------------------------------------------------------\n\n if (!this.initSources()) {\n return;\n }\n\n // Initialize the status menu\n // ---------------------------------------------------------------------\n\n if (this.$statusMenuBtn.length) {\n this.statusMenu = this.$statusMenuBtn.menubtn().data('menubtn').menu;\n this.statusMenu.on('optionselect', this._handleStatusChange.bind(this));\n }\n\n // Initialize the site menu\n // ---------------------------------------------------------------------\n\n // Is there a site menu?\n if (this.$siteMenuBtn.length) {\n this.siteMenu = this.$siteMenuBtn.menubtn().data('menubtn').menu;\n\n // Figure out the initial site\n var $option = this.siteMenu.$options.filter('.sel:first');\n\n if (!$option.length) {\n $option = this.siteMenu.$options.first();\n }\n\n if ($option.length) {\n this._setSite($option.data('site-id'));\n } else {\n // No site options -- they must not have any site permissions\n this.settings.criteria = {id: '0'};\n }\n\n this.siteMenu.on('optionselect', this._handleSiteChange.bind(this));\n\n if (this.siteId) {\n // Should we be using a different default site?\n var defaultSiteId =\n this.settings.defaultSiteId || Craft.cp.getSiteId();\n\n if (defaultSiteId && defaultSiteId != this.siteId) {\n // Is that one available here?\n var $storedSiteOption = this.siteMenu.$options.filter(\n '[data-site-id=\"' + defaultSiteId + '\"]:first'\n );\n\n if ($storedSiteOption.length) {\n // Todo: switch this to siteMenu.selectOption($storedSiteOption) once Menu is updated to support that\n $storedSiteOption.trigger('click');\n }\n }\n }\n } else if (\n this.settings.criteria &&\n this.settings.criteria.siteId &&\n this.settings.criteria.siteId !== '*'\n ) {\n this._setSite(this.settings.criteria.siteId);\n } else {\n this._setSite(Craft.siteId);\n }\n\n // Don't let the criteria override the selected site\n if (this.settings.criteria && this.settings.criteria.siteId) {\n delete this.settings.criteria.siteId;\n }\n\n // Initialize the search input\n // ---------------------------------------------------------------------\n\n // Automatically update the elements after new search text has been sitting for a 1/2 second\n this.addListener(this.$search, 'input', () => {\n if (!this.searching && this.$search.val()) {\n this.startSearching();\n } else if (this.searching && !this.$search.val()) {\n this.stopSearching();\n }\n\n if (this.searchTimeout) {\n clearTimeout(this.searchTimeout);\n }\n\n this.searchTimeout = setTimeout(\n this.updateElementsIfSearchTextChanged.bind(this),\n 500\n );\n });\n\n // Update the elements when the Return key is pressed\n this.addListener(this.$search, 'keypress', (ev) => {\n if (ev.keyCode === Garnish.RETURN_KEY) {\n ev.preventDefault();\n\n if (this.searchTimeout) {\n clearTimeout(this.searchTimeout);\n }\n\n this.updateElementsIfSearchTextChanged();\n }\n });\n\n // Clear the search when the X button is clicked\n this.addListener(this.$clearSearchBtn, 'click', () => {\n this.clearSearch(true);\n\n if (!Garnish.isMobileBrowser(true)) {\n this.$search.trigger('focus');\n }\n });\n\n // Auto-focus the Search box\n if (!Garnish.isMobileBrowser(true)) {\n this.$search.trigger('focus');\n }\n\n // View menus\n this.viewMenus = {};\n\n // Filter HUDs\n this.filterHuds = {};\n this.addListener(this.$filterBtn, 'click', 'showFilterHud');\n\n // Set the default status\n // ---------------------------------------------------------------------\n\n const queryParams = Craft.getQueryParams();\n\n if (queryParams.status) {\n let selector;\n switch (queryParams.status) {\n case 'trashed':\n selector = '[data-trashed]';\n break;\n case 'drafts':\n selector = '[data-drafts]';\n break;\n default:\n selector = `[data-status=\"${queryParams.status}\"]`;\n }\n\n const $option = this.statusMenu.$options.filter(selector);\n if ($option.length) {\n this.statusMenu.selectOption($option[0]);\n } else {\n this.setQueryParam('status', null);\n }\n }\n\n // Initialize the Export button\n // ---------------------------------------------------------------------\n\n this.addListener(this.$exportBtn, 'click', '_showExportHud');\n\n // Let everyone know that the UI is initialized\n // ---------------------------------------------------------------------\n\n this.initialized = true;\n this.afterInit();\n\n // Select the initial source\n // ---------------------------------------------------------------------\n\n this.selectDefaultSource();\n\n // Select the default sort attribute/direction\n // ---------------------------------------------------------------------\n\n if (queryParams.sort) {\n const lastDashPos = queryParams.sort.lastIndexOf('-');\n if (lastDashPos !== -1) {\n const attr = queryParams.sort.substring(0, lastDashPos);\n const dir = queryParams.sort.substring(lastDashPos + 1);\n this.setSelectedSortAttribute(attr, dir);\n }\n }\n\n // Load the first batch of elements!\n // ---------------------------------------------------------------------\n\n // Default to whatever page is in the URL\n this.setPage(Craft.pageNum);\n\n this.updateElements(true);\n },\n\n afterInit: function () {\n this.onAfterInit();\n },\n\n _createCancelToken: function () {\n this._cancelToken = axios.CancelToken.source();\n return this._cancelToken.token;\n },\n\n _cancelRequests: function () {\n if (this._cancelToken) {\n this._ignoreFailedRequest = true;\n this._cancelToken.cancel();\n Garnish.requestAnimationFrame(() => {\n this._ignoreFailedRequest = false;\n });\n }\n },\n\n getSourceContainer: function () {\n return this.$sidebar.find('nav > ul');\n },\n\n get $sources() {\n if (!this.sourceSelect) {\n return undefined;\n }\n\n return this.sourceSelect.$items;\n },\n\n getSite: function () {\n if (!this.siteId) {\n return undefined;\n }\n return Craft.sites.find((s) => s.id == this.siteId);\n },\n\n initSources: function () {\n var $sources = this._getSourcesInList(this.getSourceContainer(), true);\n\n // No source, no party.\n if ($sources.length === 0) {\n return false;\n }\n\n // The source selector\n if (!this.sourceSelect) {\n this.sourceSelect = new Garnish.Select(this.$sidebar.find('nav'), {\n multi: false,\n allowEmpty: false,\n vertical: true,\n onSelectionChange: this._handleSourceSelectionChange.bind(this),\n });\n }\n\n this.sourcesByKey = {};\n\n for (let i = 0; i < $sources.length; i++) {\n this.initSource($($sources[i]));\n }\n\n return true;\n },\n\n selectDefaultSource: function () {\n // The `source` query param should always take precedence\n let sourceKey;\n if (this.settings.context === 'index') {\n sourceKey = Craft.getQueryParam('source');\n }\n\n if (!sourceKey) {\n sourceKey = this.getDefaultSourceKey();\n }\n\n let $source;\n\n if (sourceKey) {\n $source = this.getSourceByKey(sourceKey);\n\n // Make sure it's visible\n if (this.$visibleSources.index($source) === -1) {\n $source = null;\n }\n }\n\n if (!sourceKey || !$source) {\n // Select the first source by default\n $source = this.$visibleSources.first();\n }\n\n return this.selectSource($source);\n },\n\n refreshSources: function () {\n this.sourceSelect.removeAllItems();\n\n this.setIndexBusy();\n\n Craft.sendActionRequest('POST', this.settings.refreshSourcesAction, {\n data: {\n context: this.settings.context,\n elementType: this.elementType,\n },\n })\n .then((response) => {\n this.setIndexAvailable();\n this.getSourceContainer().replaceWith(response.data.html);\n this.initSources();\n this.selectDefaultSource();\n })\n .catch(() => {\n this.setIndexAvailable();\n if (!this._ignoreFailedRequest) {\n Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n }\n });\n },\n\n initSource: function ($source) {\n this.sourceSelect.addItems($source);\n this.initSourceToggle($source);\n this.sourcesByKey[$source.data('key')] = $source;\n\n if (\n $source.data('hasNestedSources') &&\n this.instanceState.expandedSources.indexOf($source.data('key')) !== -1\n ) {\n this._expandSource($source);\n }\n },\n\n initSourceToggle: function ($source) {\n // Remove handlers for the same thing. Just in case.\n this.deinitSourceToggle($source);\n\n var $toggle = this._getSourceToggle($source);\n\n if ($toggle.length) {\n this.addListener($source, 'dblclick', '_handleSourceDblClick');\n this.addListener($toggle, 'click', '_handleSourceToggleClick');\n $source.data('hasNestedSources', true);\n } else {\n $source.data('hasNestedSources', false);\n }\n },\n\n deinitSource: function ($source) {\n this.sourceSelect.removeItems($source);\n this.deinitSourceToggle($source);\n delete this.sourcesByKey[$source.data('key')];\n },\n\n deinitSourceToggle: function ($source) {\n if ($source.data('hasNestedSources')) {\n this.removeListener($source, 'dblclick');\n this.removeListener(this._getSourceToggle($source), 'click');\n }\n\n $source.removeData('hasNestedSources');\n },\n\n getDefaultInstanceState: function () {\n return {\n selectedSource: null,\n expandedSources: [],\n };\n },\n\n getDefaultSourceKey: function () {\n if (this.settings.defaultSource) {\n const paths = this.settings.defaultSource.split('/');\n let path = '';\n\n // Expand the tree\n for (let i = 0; i < paths.length; i++) {\n path += paths[i];\n const $source = this.getSourceByKey(path);\n\n // If the folder can't be found, then just go to the stored instance source.\n if (!$source) {\n return this.instanceState.selectedSource;\n }\n\n this._expandSource($source);\n path += '/';\n }\n\n // Just make sure that the modal is aware of the newly expanded sources, too.\n this._setSite(this.siteId);\n\n return this.settings.defaultSource;\n }\n\n return this.instanceState.selectedSource;\n },\n\n getDefaultExpandedSources: function () {\n return this.instanceState.expandedSources;\n },\n\n startSearching: function () {\n // Show the clear button\n this.$clearSearchBtn.removeClass('hidden');\n this.searching = true;\n this.sortByScore = true;\n\n if (this.activeViewMenu) {\n this.activeViewMenu.updateSortField();\n }\n },\n\n clearSearch: function (updateElements) {\n if (!this.searching) {\n return;\n }\n\n this.$search.val('');\n\n if (this.searchTimeout) {\n clearTimeout(this.searchTimeout);\n }\n\n this.stopSearching();\n\n if (updateElements) {\n this.updateElementsIfSearchTextChanged();\n } else {\n this.searchText = null;\n }\n },\n\n stopSearching: function () {\n // Hide the clear button\n this.$clearSearchBtn.addClass('hidden');\n this.searching = false;\n this.sortByScore = false;\n\n if (this.activeViewMenu) {\n this.activeViewMenu.updateSortField();\n }\n },\n\n setInstanceState: function (key, value) {\n if (typeof key === 'object') {\n $.extend(this.instanceState, key);\n } else {\n this.instanceState[key] = value;\n }\n\n this.storeInstanceState();\n },\n\n storeInstanceState: function () {\n if (this.settings.storageKey) {\n Craft.setLocalStorage(this.settings.storageKey, this.instanceState);\n }\n },\n\n getSourceState: function (sourceKey, key, defaultValue) {\n sourceKey = sourceKey.replace(/\\/.*/, '');\n\n if (typeof this.sourceStates[sourceKey] === 'undefined') {\n // Set it now so any modifications to it by whoever's calling this will be stored.\n this.sourceStates[sourceKey] = {};\n }\n\n if (typeof key === 'undefined') {\n return this.sourceStates[sourceKey];\n } else if (typeof this.sourceStates[sourceKey][key] !== 'undefined') {\n return this.sourceStates[sourceKey][key];\n } else {\n return typeof defaultValue !== 'undefined' ? defaultValue : null;\n }\n },\n\n getSelectedSourceState: function (key, defaultValue) {\n return this.getSourceState(\n this.instanceState.selectedSource,\n key,\n defaultValue\n );\n },\n\n setSelecetedSourceState: function (key, value) {\n var viewState = this.getSelectedSourceState();\n\n if (typeof key === 'object') {\n for (let k in key) {\n if (key.hasOwnProperty(k)) {\n if (key[k] !== null) {\n viewState[k] = key[k];\n } else {\n delete viewState[k];\n }\n }\n }\n } else if (value !== null) {\n viewState[key] = value;\n } else {\n delete viewState[key];\n }\n\n const sourceKey = this.instanceState.selectedSource.replace(/\\/.*/, '');\n\n this.sourceStates[sourceKey] = viewState;\n\n // Clean up sourceStates while we're at it\n for (let i in this.sourceStates) {\n if (this.sourceStates.hasOwnProperty(i) && i.includes('/')) {\n delete this.sourceStates[i];\n }\n }\n\n // Store it in localStorage too\n Craft.setLocalStorage(this.sourceStatesStorageKey, this.sourceStates);\n },\n\n /**\n * @deprecated in 4.3.0.\n */\n storeSortAttributeAndDirection: function () {},\n\n /**\n * Sets the page number.\n */\n setPage: function (page) {\n if (this.settings.context !== 'index') {\n return;\n }\n\n page = Math.max(page, 1);\n this.page = page;\n\n const url = Craft.getPageUrl(this.page);\n history.replaceState({}, '', url);\n },\n\n _resetCount: function () {\n this.resultSet = null;\n this.totalResults = null;\n },\n\n updateSourceMenu: function () {\n if (!this.$sourceActionsContainer.length) {\n return;\n }\n\n if (this.$sourceActionsBtn) {\n this.$sourceActionsBtn.data('trigger').destroy();\n this.$sourceActionsContainer.empty();\n $('#source-actions-menu').remove();\n this.$sourceActionsBtn = null;\n }\n\n const actions = this.getSourceActions();\n if (!actions.length) {\n return;\n }\n\n const groupedActions = [\n actions.filter((a) => !a.destructive && !a.administrative),\n actions.filter((a) => a.destructive && !a.administrative),\n actions.filter((a) => a.administrative),\n ].filter((group) => group.length);\n\n this.$sourceActionsBtn = $('<button/>', {\n type: 'button',\n class: 'btn settings icon menubtn',\n title: Craft.t('app', 'Source settings'),\n 'aria-label': Craft.t('app', 'Source settings'),\n 'aria-controls': 'source-actions-menu',\n }).appendTo(this.$sourceActionsContainer);\n\n const $menu = $('<div/>', {\n id: 'source-actions-menu',\n class: 'menu menu--disclosure',\n }).appendTo(this.$sourceActionsContainer);\n\n groupedActions.forEach((group, index) => {\n if (index !== 0) {\n $('<hr/>').appendTo($menu);\n }\n\n this._buildActionList(group).appendTo($menu);\n });\n\n this.$sourceActionsBtn.disclosureMenu();\n },\n\n _buildActionList: function (actions) {\n const $ul = $('<ul/>');\n\n actions.forEach((action) => {\n const $button = $('<button/>', {\n type: 'button',\n class: 'menu-option',\n text: action.label,\n }).on('click', () => {\n this.$sourceActionsBtn.data('trigger').hide();\n if (action.onSelect) {\n action.onSelect();\n }\n });\n\n if (action.destructive) {\n $button.addClass('error');\n }\n\n $('<li/>').append($button).appendTo($ul);\n });\n\n return $ul;\n },\n\n getSourceActions: function () {\n let actions = [];\n\n if (Craft.userIsAdmin && Craft.allowAdminChanges) {\n actions.push({\n label: Craft.t('app', 'Customize sources'),\n administrative: true,\n onSelect: () => {\n this.createCustomizeSourcesModal();\n },\n });\n }\n\n return actions;\n },\n\n updateViewMenu: function () {\n if (\n !this.activeViewMenu ||\n this.activeViewMenu !== this.viewMenus[this.rootSourceKey]\n ) {\n if (this.activeViewMenu) {\n this.activeViewMenu.hideTrigger();\n }\n if (!this.viewMenus[this.rootSourceKey]) {\n this.viewMenus[this.rootSourceKey] = new ViewMenu(\n this,\n this.$rootSource\n );\n }\n this.activeViewMenu = this.viewMenus[this.rootSourceKey];\n this.activeViewMenu.showTrigger();\n }\n },\n\n /**\n * Returns the data that should be passed to the elementIndex/getElements controller action\n * when loading elements.\n */\n getViewParams: function () {\n var criteria = {\n siteId: this.siteId,\n search: this.searchText,\n offset: this.settings.batchSize * (this.page - 1),\n limit: this.settings.batchSize,\n };\n\n // Only set drafts/draftOf/trashed params when needed, so we don't potentially override a source's criteria\n if (\n this.settings.canHaveDrafts &&\n (this.drafts || (this.settings.context === 'index' && !this.status))\n ) {\n criteria.drafts = this.drafts || null;\n criteria.savedDraftsOnly = true;\n if (!this.drafts) {\n criteria.draftOf = false;\n }\n }\n if (this.trashed) {\n criteria.trashed = true;\n }\n\n if (!Garnish.hasAttr(this.$source, 'data-override-status')) {\n criteria.status = this.status;\n }\n\n $.extend(criteria, this.settings.criteria);\n\n var params = {\n context: this.settings.context,\n elementType: this.elementType,\n source: this.instanceState.selectedSource,\n condition: this.settings.condition,\n criteria: criteria,\n disabledElementIds: this.settings.disabledElementIds,\n viewState: $.extend({}, this.getSelectedSourceState()),\n paginated: this._isViewPaginated() ? 1 : 0,\n };\n\n // Possible that the order/sort isn't entirely accurate if we're sorting by Score\n const [sortAttribute, sortDirection] =\n this.getSortAttributeAndDirection();\n params.viewState.order = sortAttribute;\n params.viewState.sort = sortDirection;\n\n if (sortAttribute === 'structure') {\n if (typeof this.instanceState.collapsedElementIds === 'undefined') {\n this.instanceState.collapsedElementIds = [];\n }\n params.collapsedElementIds = this.instanceState.collapsedElementIds;\n }\n\n if (\n this.filterHuds[this.siteId] &&\n this.filterHuds[this.siteId][this.sourceKey] &&\n this.filterHuds[this.siteId][this.sourceKey].serialized\n ) {\n params.filters =\n this.filterHuds[this.siteId][this.sourceKey].serialized;\n }\n\n // Give plugins a chance to hook in here\n this.trigger('registerViewParams', {\n params: params,\n });\n\n return params;\n },\n\n updateElements: function (preservePagination, pageChanged) {\n // Ignore if we're not fully initialized yet\n if (!this.initialized) {\n return;\n }\n\n // Cancel any ongoing requests\n this._cancelRequests();\n\n this.setIndexBusy();\n\n // Kill the old view class\n if (this.view) {\n this.view.destroy();\n delete this.view;\n }\n\n if (preservePagination !== true) {\n this.setPage(1);\n this._resetCount();\n }\n\n var params = this.getViewParams();\n\n Craft.sendActionRequest('POST', this.settings.updateElementsAction, {\n data: params,\n cancelToken: this._createCancelToken(),\n })\n .then((response) => {\n this.setIndexAvailable();\n (this.settings.context === 'index'\n ? Garnish.$scrollContainer\n : this.$main\n ).scrollTop(0);\n this._updateView(params, response.data);\n\n if (pageChanged) {\n const $elementContainer = this.view.getElementContainer();\n Garnish.firstFocusableElement($elementContainer).trigger('focus');\n }\n })\n .catch((e) => {\n this.setIndexAvailable();\n if (!this._ignoreFailedRequest) {\n Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n }\n });\n },\n\n updateElementsIfSearchTextChanged: function () {\n if (\n this.searchText !==\n (this.searchText = this.searching ? this.$search.val() : null)\n ) {\n this.updateElements();\n }\n },\n\n showActionTriggers: function () {\n // Ignore if they're already shown\n if (this.showingActionTriggers) {\n return;\n }\n\n if (!this._$triggers) {\n this._createTriggers();\n } else {\n this._$triggers.appendTo(this.$actionsContainer);\n }\n\n this.showingActionTriggers = true;\n },\n\n submitAction: function (action, actionParams) {\n // Make sure something's selected\n var selectedElementIds = this.view.getSelectedElementIds(),\n totalSelected = selectedElementIds.length;\n\n if (totalSelected === 0) {\n return;\n }\n\n if (typeof action === 'string') {\n action = this._findAction(action);\n }\n\n if (action.confirm && !confirm(action.confirm)) {\n return;\n }\n\n // Cancel any ongoing requests\n this._cancelRequests();\n\n // Get ready to submit\n var viewParams = this.getViewParams();\n\n actionParams = actionParams ? Craft.expandPostArray(actionParams) : {};\n var params = $.extend(viewParams, action.settings || {}, actionParams, {\n elementAction: action.type,\n elementIds: selectedElementIds,\n });\n\n // Do it\n this.setIndexBusy();\n this._autoSelectElements = selectedElementIds;\n\n if (action.download) {\n if (Craft.csrfTokenName) {\n params[Craft.csrfTokenName] = Craft.csrfTokenValue;\n }\n Craft.downloadFromUrl(\n 'POST',\n Craft.getActionUrl(this.settings.submitActionsAction),\n params\n )\n .then((response) => {\n this.setIndexAvailable();\n })\n .catch((e) => {\n this.setIndexAvailable();\n });\n } else {\n Craft.sendActionRequest('POST', this.settings.submitActionsAction, {\n data: params,\n cancelToken: this._createCancelToken(),\n })\n .then((response) => {\n // Update the count text too\n this._resetCount();\n this._updateView(viewParams, response.data);\n\n if (typeof response.data.badgeCounts !== 'undefined') {\n this._updateBadgeCounts(response.data.badgeCounts);\n }\n\n if (response.data.message) {\n Craft.cp.displaySuccess(response.data.message);\n }\n\n this.afterAction(action, params);\n })\n .catch(({response}) => {\n Craft.cp.displayError(response.data.message);\n })\n .finally(() => {\n this.setIndexAvailable();\n });\n }\n },\n\n _findAction: function (actionClass) {\n for (var i = 0; i < this.actions.length; i++) {\n if (this.actions[i].type === actionClass) {\n return this.actions[i];\n }\n }\n throw `Invalid element action: ${actionClass}`;\n },\n\n afterAction: function (action, params) {\n // There may be a new background job that needs to be run\n Craft.cp.runQueue();\n\n this.onAfterAction(action, params);\n },\n\n hideActionTriggers: function () {\n // Ignore if there aren't any\n if (!this.showingActionTriggers) {\n return;\n }\n\n this._$triggers.detach();\n\n this.showingActionTriggers = false;\n },\n\n updateActionTriggers: function () {\n // Do we have an action UI to update?\n if (this.actions) {\n var totalSelected = this.view.getSelectedElements().length;\n\n if (totalSelected !== 0) {\n if (totalSelected === this.view.getEnabledElements().length) {\n this.$selectAllCheckbox.removeClass('indeterminate');\n this.$selectAllCheckbox.addClass('checked');\n this.$selectAllCheckbox.attr('aria-checked', 'true');\n } else {\n this.$selectAllCheckbox.addClass('indeterminate');\n this.$selectAllCheckbox.removeClass('checked');\n this.$selectAllCheckbox.attr('aria-checked', 'mixed');\n }\n\n this.showActionTriggers();\n } else {\n this.$selectAllCheckbox.removeClass('indeterminate checked');\n this.$selectAllCheckbox.attr('aria-checked', 'false');\n this.hideActionTriggers();\n }\n }\n },\n\n getSelectedElements: function () {\n return this.view ? this.view.getSelectedElements() : $();\n },\n\n getSelectedElementIds: function () {\n return this.view ? this.view.getSelectedElementIds() : [];\n },\n\n setStatus: function (status) {\n // Find the option (and make sure it actually exists)\n var $option = this.statusMenu.$options.filter(\n 'a[data-status=\"' + status + '\"]:first'\n );\n\n if ($option.length) {\n this.statusMenu.selectOption($option[0]);\n }\n },\n\n /**\n * Returns the selected sort attribute for a source\n * @param {jQuery} [$source]\n * @returns {string}\n */\n getSelectedSortAttribute: function ($source) {\n $source = $source || this.$source;\n if ($source) {\n const attribute = this.getSourceState($source.data('key'), 'order');\n\n // Make sure it's valid\n if (this.getSortOption(attribute, $source)) {\n return attribute;\n }\n }\n\n return this.getDefaultSort()[0];\n },\n\n /**\n * Returns the selected sort direction for a source\n * @param {jQuery} [$source]\n * @returns {string}\n */\n getSelectedSortDirection: function ($source) {\n $source = $source || this.$source;\n if ($source) {\n const direction = this.getSourceState($source.data('key'), 'sort');\n\n // Make sure it's valid\n if (['asc', 'desc'].includes(direction)) {\n return direction;\n }\n }\n\n return this.getDefaultSort()[1];\n },\n\n /**\n * @deprecated in 4.3.0. Use setSelectedSortAttribute() instead.\n */\n setSortAttribute: function (attr) {\n this.setSelectedSortAttribute(attr);\n },\n\n /**\n * Sets the selected sort attribute and direction.\n *\n * If direction isn’t provided, the attribute’s default direction will be used.\n *\n * @param {string} attr\n * @param {string} [dir]\n */\n setSelectedSortAttribute: function (attr, dir) {\n // If score, keep track of that separately\n if (attr === 'score') {\n this.sortByScore = true;\n if (this.activeViewMenu) {\n this.activeViewMenu.updateSortField();\n }\n return;\n }\n\n this.sortByScore = false;\n\n // Make sure it's valid\n const sortOption = this.getSortOption(attr);\n if (!sortOption) {\n console.warn(`Invalid sort option: ${attr}`);\n return;\n }\n\n if (attr === 'structure') {\n dir = 'asc';\n } else {\n dir = dir || sortOption.defaultDir;\n }\n\n const history = [];\n\n // Remember the previous choices\n const attributes = [attr];\n\n // Only include the last attribute if it changed\n const lastAttr = this.getSelectedSourceState('order');\n if (lastAttr && lastAttr !== attr) {\n history.push([lastAttr, this.getSelectedSourceState('sort')]);\n attributes.push(lastAttr);\n }\n\n const oldHistory = this.getSelectedSourceState('orderHistory', []);\n for (let i = 0; i < oldHistory.length; i++) {\n const [a] = oldHistory[i];\n if (a && !attributes.includes(a)) {\n history.push(oldHistory[i]);\n attributes.push(a);\n } else {\n break;\n }\n }\n\n this.setSelecetedSourceState({\n order: attr,\n sort: dir,\n orderHistory: history,\n });\n\n // Update the view menu\n if (this.activeViewMenu) {\n this.activeViewMenu.updateSortField();\n }\n\n // Update the query string\n Craft.setQueryParam('sort', `${attr}-${dir}`);\n },\n\n /**\n * @deprecated in 4.3.0. Use setSelectedSortAttribute() or setSelectedSortDirection() instead.\n */\n setSortDirection: function (dir) {\n this.setSelectedSortDirection(dir);\n },\n\n /**\n * Sets the selected sort direction, maintaining the current sort attribute.\n * @param {string} dir\n */\n setSelectedSortDirection: function (dir) {\n this.setSelectedSortAttribute(this.getSelectedSortAttribute(), dir);\n },\n\n /**\n * Returns whether sorting by a structure is permitted for the current state.\n * @returns {boolean}\n */\n canSortByStructure: function () {\n return (\n !this.trashed && !this.drafts && !this.searching && !this.sortByScore\n );\n },\n\n /**\n * Returns the actual sort attribute, which may be different from what's selected.\n * @returns {string[]}\n */\n getSortAttributeAndDirection: function () {\n if (this.searching && this.sortByScore) {\n return ['score', 'desc'];\n }\n\n let attribute = this.getSelectedSortAttribute();\n let direction = this.getSelectedSortDirection();\n\n if (attribute === 'structure') {\n if (!this.canSortByStructure()) {\n const alt = this.getSortOptions().find((a) => a.attr !== 'structure');\n attribute = alt.attr;\n direction = alt.defaultDir;\n } else {\n direction = 'asc';\n }\n }\n\n return [attribute, direction];\n },\n\n getSortLabel: function (attr) {\n const sortOption = this.getSortOption(attr);\n return sortOption ? sortOption.label : null;\n },\n\n getSelectedViewMode: function () {\n return this.getSelectedSourceState('mode') || 'table';\n },\n\n /**\n * Returns the nesting level for a given source, where 1 = the root level\n * @param {jQuery} $source\n * @returns {number}\n */\n getSourceLevel: function ($source) {\n return $source.parentsUntil('nav', 'ul.nested').length + 1;\n },\n\n /**\n * Returns a source’s parent, or null if it’s the root source\n * @param {jQuery} $source\n * @returns {?jQuery}\n */\n getParentSource: function ($source) {\n const $parent = $source.parent().parent().siblings('a');\n return $parent.length ? $parent : null;\n },\n\n /**\n * Returns the root level source for a given source.\n * @param {jQuery} $source\n * @returns {jQuery}\n */\n getRootSource: function ($source) {\n let $parent;\n while (($parent = this.getParentSource($source))) {\n $source = $parent;\n }\n return $source;\n },\n\n getSourceByKey: function (key) {\n return this.sourcesByKey[key] || null;\n },\n\n selectSource: function (source) {\n const $source = $(source);\n\n // return false if there truly are no sources;\n // don't attempt to check only default/visible sources\n if (!this.sourcesByKey || !Object.keys(this.sourcesByKey).length) {\n return false;\n }\n\n if (\n this.$source &&\n this.$source[0] &&\n this.$source[0] === $source[0] &&\n $source.data('key') === this.sourceKey\n ) {\n return false;\n }\n\n // Hide action triggers if they're currently being shown\n this.hideActionTriggers();\n\n this.$source = $source;\n this.$rootSource = this.getRootSource($source);\n this.sourceKey = $source.data('key');\n this.rootSourceKey = this.$rootSource.data('key');\n this.setInstanceState('selectedSource', this.sourceKey);\n this.sourceSelect.selectItem($source);\n\n Craft.cp.updateContentHeading();\n\n if (this.searching) {\n // Clear the search value without causing it to update elements\n this.searchText = null;\n this.$search.val('');\n this.stopSearching();\n }\n\n // Status menu\n // ----------------------------------------------------------------------\n\n if (this.$statusMenuBtn.length) {\n if (Garnish.hasAttr(this.$source, 'data-override-status')) {\n this.$statusMenuContainer.addClass('hidden');\n } else {\n this.$statusMenuContainer.removeClass('hidden');\n }\n\n if (this.trashed) {\n // Swap to the initial status\n var $firstOption = this.statusMenu.$options.first();\n this.setStatus($firstOption.data('status'));\n }\n }\n\n // View mode buttons\n // ----------------------------------------------------------------------\n\n // Clear out any previous view mode data\n if (this.$viewModeBtnContainer) {\n this.$viewModeBtnContainer.remove();\n }\n\n this.viewModeBtns = {};\n this.viewMode = null;\n\n // Get the new list of view modes\n this.sourceViewModes = this.getViewModesForSource();\n\n // Create the buttons if there's more than one mode available to this source\n if (this.sourceViewModes.length > 1) {\n this.$viewModeBtnContainer = $(\n '<section class=\"btngroup btngroup--exclusive\"/>'\n ).attr('aria-label', Craft.t('app', 'View'));\n\n if (this.activeViewMenu) {\n this.$viewModeBtnContainer.insertBefore(this.activeViewMenu.$trigger);\n } else {\n this.$viewModeBtnContainer.appendTo(this.$toolbar);\n }\n\n for (var i = 0; i < this.sourceViewModes.length; i++) {\n let sourceViewMode = this.sourceViewModes[i];\n\n let $viewModeBtn = $('<button/>', {\n type: 'button',\n class:\n 'btn' +\n (typeof sourceViewMode.className !== 'undefined'\n ? ` ${sourceViewMode.className}`\n : ''),\n 'data-view': sourceViewMode.mode,\n 'data-icon': sourceViewMode.icon,\n 'aria-label': sourceViewMode.title,\n 'aria-pressed': 'false',\n title: sourceViewMode.title,\n }).appendTo(this.$viewModeBtnContainer);\n\n this.viewModeBtns[sourceViewMode.mode] = $viewModeBtn;\n\n this.addListener(\n $viewModeBtn,\n 'click',\n {mode: sourceViewMode.mode},\n function (ev) {\n this.selectViewMode(ev.data.mode);\n this.updateElements();\n }\n );\n }\n }\n\n // Figure out which mode we should start with\n var viewMode = this.getSelectedViewMode();\n\n if (!viewMode || !this.doesSourceHaveViewMode(viewMode)) {\n // Try to keep using the current view mode\n if (this.viewMode && this.doesSourceHaveViewMode(this.viewMode)) {\n viewMode = this.viewMode;\n }\n // Just use the first one\n else {\n viewMode = this.sourceViewModes[0].mode;\n }\n }\n\n this.selectViewMode(viewMode);\n\n this.updateSourceMenu();\n this.updateViewMenu();\n this.updateFilterBtn();\n\n this.onSelectSource();\n\n if (this.settings.context === 'index') {\n const urlParams = Craft.getQueryParams();\n urlParams.source = this.sourceKey;\n Craft.setUrl(Craft.getUrl(Craft.path, urlParams));\n }\n\n return true;\n },\n\n selectSourceByKey: function (key) {\n var $source = this.getSourceByKey(key);\n\n if ($source) {\n return this.selectSource($source);\n } else {\n return false;\n }\n },\n\n /**\n * Returns the available sort attributes for a source (or the selected root source)\n * @param {jQuery} [$source]\n * @returns {Object[]}\n */\n getSortOptions: function ($source) {\n $source = $source || this.$rootSource;\n const sortOptions = ($source ? $source.data('sort-opts') : null) || [];\n\n // Make sure there's at least one non-structure attribute\n if (!sortOptions.find((a) => a.attr !== 'structure')) {\n sortOptions.push({\n label: Craft.t('app', 'Title'),\n attr: 'title',\n defaultDir: 'asc',\n });\n }\n\n return sortOptions;\n },\n\n /**\n * Returns info about a sort attribute.\n * @param {string} attribute\n * @param {jQuery} [$source]\n * @returns {?Object}\n */\n getSortOption: function (attribute, $source) {\n return (\n this.getSortOptions($source).find((o) => o.attr === attribute) || null\n );\n },\n\n /**\n * Returns the default sort attribute and direction for a source.\n * @param {jQuery} [$source]\n * @returns {string[]}\n */\n getDefaultSort: function ($source) {\n $source = $source || this.$rootSource;\n if ($source) {\n let defaultSort = $source.data('default-sort');\n if (defaultSort) {\n if (typeof defaultSort === 'string') {\n defaultSort = [defaultSort];\n }\n\n // Make sure it's valid\n const sortOption = this.getSortOption(defaultSort[0], $source);\n if (sortOption) {\n // Fill in the default direction if it's not specified\n if (!defaultSort[1]) {\n defaultSort[1] = sortOption.defaultDir;\n }\n\n return defaultSort;\n }\n }\n }\n\n // Default to the first sort option\n const sortOptions = this.getSortOptions($source);\n return [sortOptions[0].attr, sortOptions[0].defaultDir];\n },\n\n /**\n * Returns the available table columns for a source (or the selected root source)\n * @param {jQuery} [$source]\n * @returns {Object[]}\n */\n getTableColumnOptions: function ($source) {\n $source = $source || this.$rootSource;\n return ($source ? $source.data('table-col-opts') : null) || [];\n },\n\n /**\n * Returns info about a table column.\n * @param {string} attribute\n * @param {jQuery} [$source]\n * @returns {?Object}\n */\n getTableColumnOption: function (attribute, $source) {\n return (\n this.getTableColumnOptions($source).find((o) => o.attr === attribute) ||\n null\n );\n },\n\n /**\n * Returns the default table columns for a source (or the selected root source)\n * @param {jQuery} [$source]\n * @returns {string[]}\n */\n getDefaultTableColumns: function ($source) {\n $source = $source || this.$rootSource;\n return ($source ? $source.data('default-table-cols') : null) || [];\n },\n\n /**\n * Returns the selected sort attribute for a source\n * @param {jQuery} [$source]\n * @returns {string[]}\n */\n getSelectedTableColumns: function ($source) {\n $source = $source || this.$rootSource;\n if ($source) {\n const attributes = this.getSourceState(\n $source.data('key'),\n 'tableColumns'\n );\n\n if (attributes) {\n // Only return the valid ones\n return attributes.filter(\n (a) => !!this.getTableColumnOption(a, $source)\n );\n }\n }\n\n return this.getDefaultTableColumns($source);\n },\n\n setSelectedTableColumns: function (attributes) {\n this.setSelecetedSourceState({\n tableColumns: attributes,\n });\n\n // Update the view menu\n if (this.activeViewMenu) {\n this.activeViewMenu.updateTableColumnField();\n }\n },\n\n getViewModesForSource: function () {\n var viewModes = [\n {\n mode: 'table',\n title: Craft.t('app', 'Display in a table'),\n icon: 'list',\n },\n ];\n\n if (this.$source && Garnish.hasAttr(this.$source, 'data-has-thumbs')) {\n viewModes.push({\n mode: 'thumbs',\n title: Craft.t('app', 'Display as thumbnails'),\n icon: 'grid',\n });\n }\n\n return viewModes;\n },\n\n doesSourceHaveViewMode: function (viewMode) {\n for (var i = 0; i < this.sourceViewModes.length; i++) {\n if (this.sourceViewModes[i].mode === viewMode) {\n return true;\n }\n }\n\n return false;\n },\n\n selectViewMode: function (viewMode, force) {\n // Make sure that the current source supports it\n if (!force && !this.doesSourceHaveViewMode(viewMode)) {\n viewMode = this.sourceViewModes[0].mode;\n }\n\n // Has anything changed?\n if (viewMode === this.viewMode) {\n return;\n }\n\n // Deselect the previous view mode\n if (\n this.viewMode &&\n typeof this.viewModeBtns[this.viewMode] !== 'undefined'\n ) {\n this.viewModeBtns[this.viewMode]\n .removeClass('active')\n .attr('aria-pressed', 'false');\n }\n\n this.viewMode = viewMode;\n this.setSelecetedSourceState('mode', this.viewMode);\n\n if (typeof this.viewModeBtns[this.viewMode] !== 'undefined') {\n this.viewModeBtns[this.viewMode]\n .addClass('active')\n .attr('aria-pressed', 'true');\n }\n },\n\n createView: function (mode, settings) {\n var viewClass = this.getViewClass(mode);\n return new viewClass(this, this.$elements, settings);\n },\n\n getViewClass: function (mode) {\n switch (mode) {\n case 'table':\n return Craft.TableElementIndexView;\n case 'thumbs':\n return Craft.ThumbsElementIndexView;\n default:\n throw `View mode \"${mode}\" not supported.`;\n }\n },\n\n rememberDisabledElementId: function (id) {\n var index = $.inArray(id, this.settings.disabledElementIds);\n\n if (index === -1) {\n this.settings.disabledElementIds.push(id);\n }\n },\n\n forgetDisabledElementId: function (id) {\n var index = $.inArray(id, this.settings.disabledElementIds);\n\n if (index !== -1) {\n this.settings.disabledElementIds.splice(index, 1);\n }\n },\n\n enableElements: function ($elements) {\n $elements\n .removeClass('disabled')\n .parents('.disabled')\n .removeClass('disabled');\n\n for (var i = 0; i < $elements.length; i++) {\n var id = $($elements[i]).data('id');\n this.forgetDisabledElementId(id);\n }\n\n this.onEnableElements($elements);\n },\n\n disableElements: function ($elements) {\n $elements.removeClass('sel').addClass('disabled');\n\n for (var i = 0; i < $elements.length; i++) {\n var id = $($elements[i]).data('id');\n this.rememberDisabledElementId(id);\n }\n\n this.onDisableElements($elements);\n },\n\n getElementById: function (id) {\n return this.view.getElementById(id);\n },\n\n enableElementsById: function (ids) {\n ids = $.makeArray(ids);\n\n for (var i = 0; i < ids.length; i++) {\n var id = ids[i],\n $element = this.getElementById(id);\n\n if ($element && $element.length) {\n this.enableElements($element);\n } else {\n this.forgetDisabledElementId(id);\n }\n }\n },\n\n disableElementsById: function (ids) {\n ids = $.makeArray(ids);\n\n for (var i = 0; i < ids.length; i++) {\n var id = ids[i],\n $element = this.getElementById(id);\n\n if ($element && $element.length) {\n this.disableElements($element);\n } else {\n this.rememberDisabledElementId(id);\n }\n }\n },\n\n selectElementAfterUpdate: function (id) {\n if (this._autoSelectElements === null) {\n this._autoSelectElements = [];\n }\n\n this._autoSelectElements.push(id);\n },\n\n addButton: function ($button) {\n this.getButtonContainer().append($button);\n },\n\n isShowingSidebar: function () {\n if (this.showingSidebar === null) {\n this.showingSidebar =\n this.$sidebar.length && !this.$sidebar.hasClass('hidden');\n }\n\n return this.showingSidebar;\n },\n\n getButtonContainer: function () {\n // Is there a predesignated place where buttons should go?\n if (this.settings.buttonContainer) {\n return $(this.settings.buttonContainer);\n } else {\n var $container = $('#action-buttons');\n\n if (!$container.length) {\n $container = $('<div id=\"action-buttons\"/>').appendTo($('#header'));\n }\n\n return $container;\n }\n },\n\n setIndexBusy: function () {\n this.$elements.addClass('busy');\n this.$updateSpinner.appendTo(this.$elements);\n this.isIndexBusy = true;\n },\n\n setIndexAvailable: function () {\n this.$elements.removeClass('busy');\n this.$updateSpinner.remove();\n this.isIndexBusy = false;\n },\n\n createCustomizeSourcesModal: function () {\n // Recreate it each time\n var modal = new Craft.CustomizeSourcesModal(this, {\n onHide: function () {\n modal.destroy();\n },\n });\n\n return modal;\n },\n\n disable: function () {\n if (this.sourceSelect) {\n this.sourceSelect.disable();\n }\n\n if (this.view) {\n this.view.disable();\n }\n\n this.base();\n },\n\n enable: function () {\n if (this.sourceSelect) {\n this.sourceSelect.enable();\n }\n\n if (this.view) {\n this.view.enable();\n }\n\n this.base();\n },\n\n onAfterInit: function () {\n this.settings.onAfterInit();\n this.trigger('afterInit');\n },\n\n onSelectSource: function () {\n this.settings.onSelectSource(this.sourceKey);\n this.trigger('selectSource', {sourceKey: this.sourceKey});\n },\n\n onSelectSite: function () {\n this.settings.onSelectSite(this.siteId);\n this.trigger('selectSite', {siteId: this.siteId});\n },\n\n onUpdateElements: function () {\n this.settings.onUpdateElements();\n this.trigger('updateElements');\n },\n\n onSelectionChange: function () {\n this.settings.onSelectionChange();\n this.trigger('selectionChange');\n },\n\n onEnableElements: function ($elements) {\n this.settings.onEnableElements($elements);\n this.trigger('enableElements', {elements: $elements});\n },\n\n onDisableElements: function ($elements) {\n this.settings.onDisableElements($elements);\n this.trigger('disableElements', {elements: $elements});\n },\n\n onAfterAction: function (action, params) {\n this.settings.onAfterAction(action, params);\n this.trigger('afterAction', {action: action, params: params});\n },\n\n // UI state handlers\n // -------------------------------------------------------------------------\n\n _handleSourceSelectionChange: function () {\n // If the selected source was just removed (maybe because its parent was collapsed),\n // there won't be a selected source\n if (!this.sourceSelect.totalSelected) {\n this.sourceSelect.selectItem(this.$visibleSources.first());\n return;\n }\n\n if (this.selectSource(this.sourceSelect.$selectedItems)) {\n this.updateElements();\n }\n },\n\n _handleActionTriggerSubmit: function (ev) {\n ev.preventDefault();\n\n var $form = $(ev.currentTarget);\n\n // Make sure Craft.ElementActionTrigger isn't overriding this\n if ($form.hasClass('disabled') || $form.data('custom-handler')) {\n return;\n }\n\n this.submitAction($form.data('action'), Garnish.getPostData($form));\n },\n\n _handleMenuActionTriggerSubmit: function (ev) {\n var $option = $(ev.option);\n\n // Make sure Craft.ElementActionTrigger isn't overriding this\n if ($option.hasClass('disabled') || $option.data('custom-handler')) {\n return;\n }\n\n this.submitAction($option.data('action'));\n },\n\n _handleStatusChange: function (ev) {\n this.statusMenu.$options.removeClass('sel');\n var $option = $(ev.selectedOption).addClass('sel');\n this.$statusMenuBtn.html($option.html());\n\n this.trashed = false;\n this.drafts = false;\n this.status = null;\n let queryParam = null;\n\n if (Garnish.hasAttr($option, 'data-trashed')) {\n this.trashed = true;\n queryParam = 'trashed';\n } else if (Garnish.hasAttr($option, 'data-drafts')) {\n this.drafts = true;\n queryParam = 'drafts';\n } else {\n this.status = queryParam = $option.data('status') || null;\n }\n\n if (this.activeViewMenu) {\n this.activeViewMenu.updateSortField();\n }\n\n Craft.setQueryParam('status', queryParam);\n this.updateElements();\n },\n\n _handleSiteChange: function (ev) {\n this.siteMenu.$options.removeClass('sel');\n var $option = $(ev.selectedOption).addClass('sel');\n this.$siteMenuBtn.html($option.html());\n this._setSite($option.data('site-id'));\n this.onSelectSite();\n },\n\n _setSite: function (siteId) {\n let firstSite = this.siteId === null;\n this.siteId = siteId;\n\n this.updateSourceVisibility();\n\n if (\n this.initialized &&\n !firstSite &&\n (!this.$source || !this.$source.length) &&\n this.$visibleSources.length\n ) {\n this.selectSource(this.$visibleSources[0]);\n }\n\n // Hide any empty-nester headings\n var $headings = this.getSourceContainer().children('.heading');\n var $heading;\n\n for (let i = 0; i < $headings.length; i++) {\n $heading = $headings.eq(i);\n if ($heading.has('> ul > li:not(.hidden)').length !== 0) {\n $heading.removeClass('hidden');\n } else {\n $heading.addClass('hidden');\n }\n }\n\n if (this.initialized) {\n if (this.settings.context === 'index') {\n // Remember this site for later\n Craft.cp.setSiteId(siteId);\n }\n\n // Update the elements\n this.updateElements();\n this.updateFilterBtn();\n }\n },\n\n updateSourceVisibility: function () {\n this.$visibleSources = $();\n\n for (let i = 0; i < this.$sources.length; i++) {\n const $source = this.$sources.eq(i);\n\n if (\n !Garnish.hasAttr($source, 'data-disabled') &&\n (typeof $source.data('sites') === 'undefined' ||\n $source\n .data('sites')\n .toString()\n .split(',')\n .indexOf(this.siteId.toString()) !== -1)\n ) {\n $source.parent().removeClass('hidden');\n this.$visibleSources = this.$visibleSources.add($source);\n } else {\n $source.parent().addClass('hidden');\n\n // Is this the currently selected source?\n if (this.$source && this.$source.get(0) === $source.get(0)) {\n this.$source = null;\n this.$rootSource = null;\n this.sourceKey = null;\n this.rootSourceKey = null;\n }\n }\n }\n },\n\n _handleSelectionChange: function () {\n this.updateActionTriggers();\n this.onSelectionChange();\n },\n\n _handleSourceDblClick: function (ev) {\n this._toggleSource($(ev.currentTarget));\n ev.stopPropagation();\n },\n\n _handleSourceToggleClick: function (ev) {\n this._toggleSource($(ev.currentTarget).prev('a'));\n ev.stopPropagation();\n },\n\n // Source managemnet\n // -------------------------------------------------------------------------\n\n _getSourcesInList: function ($list, topLevel) {\n let $sources = $list.find('> li:not(.heading) > a');\n if (topLevel) {\n $sources = $sources.add($list.find('> li.heading > ul > li > a'));\n }\n return $sources;\n },\n\n _getChildSources: function ($source) {\n var $list = $source.siblings('ul');\n return this._getSourcesInList($list);\n },\n\n _getSourceToggle: function ($source) {\n return $source.siblings('.toggle');\n },\n\n _toggleSource: function ($source) {\n if ($source.parent('li').hasClass('expanded')) {\n this._collapseSource($source);\n } else {\n this._expandSource($source);\n }\n },\n\n _expandSource: function ($source) {\n $source.next('.toggle').attr({\n 'aria-expanded': 'true',\n 'aria-label': Craft.t('app', 'Hide nested sources'),\n });\n $source.parent('li').addClass('expanded');\n\n var $childSources = this._getChildSources($source);\n for (let i = 0; i < $childSources.length; i++) {\n this.initSource($($childSources[i]));\n if (this.$visibleSources) {\n this.$visibleSources = this.$visibleSources.add($childSources[i]);\n }\n }\n\n var key = $source.data('key');\n if (this.instanceState.expandedSources.indexOf(key) === -1) {\n this.instanceState.expandedSources.push(key);\n this.storeInstanceState();\n }\n },\n\n _collapseSource: function ($source) {\n $source.next('.toggle').attr({\n 'aria-expanded': 'false',\n 'aria-label': Craft.t('app', 'Show nested sources'),\n });\n $source.parent('li').removeClass('expanded');\n\n var $childSources = this._getChildSources($source);\n for (let i = 0; i < $childSources.length; i++) {\n this.deinitSource($($childSources[i]));\n this.$visibleSources = this.$visibleSources.not($childSources[i]);\n }\n\n var i = this.instanceState.expandedSources.indexOf($source.data('key'));\n if (i !== -1) {\n this.instanceState.expandedSources.splice(i, 1);\n this.storeInstanceState();\n }\n },\n\n // View\n // -------------------------------------------------------------------------\n\n _isViewPaginated: function () {\n return (\n this.settings.context === 'index' &&\n this.getSortAttributeAndDirection()[0] !== 'structure'\n );\n },\n\n _updateView: function (params, response) {\n // Cleanup\n // -------------------------------------------------------------\n\n // Get rid of the old action triggers regardless of whether the new batch has actions or not\n if (this.actions) {\n this.hideActionTriggers();\n this.actions =\n this.actionsHeadHtml =\n this.actionsBodyHtml =\n this._$triggers =\n null;\n }\n\n // Capture the focused element, in case it's about to get removed from the DOM\n const activeElement = document.activeElement;\n\n // Update the count text\n // -------------------------------------------------------------\n\n if (this.$countContainer.length) {\n this.$countSpinner.removeClass('hidden');\n this.$countContainer.html('');\n\n this._countResults()\n .then((total) => {\n this.$countSpinner.addClass('hidden');\n\n let itemLabel = Craft.elementTypeNames[this.elementType]\n ? Craft.elementTypeNames[this.elementType][2]\n : this.settings.elementTypeName.toLowerCase();\n let itemsLabel = Craft.elementTypeNames[this.elementType]\n ? Craft.elementTypeNames[this.elementType][3]\n : this.settings.elementTypePluralName.toLowerCase();\n\n if (!this._isViewPaginated()) {\n let countLabel = Craft.t(\n 'app',\n '{total, number} {total, plural, =1{{item}} other{{items}}}',\n {\n total: total,\n item: itemLabel,\n items: itemsLabel,\n }\n );\n this.$countContainer.text(countLabel);\n } else {\n let first = Math.min(\n this.settings.batchSize * (this.page - 1) + 1,\n total\n );\n let last = Math.min(first + (this.settings.batchSize - 1), total);\n let countLabel = Craft.t(\n 'app',\n '{first, number}-{last, number} of {total, number} {total, plural, =1{{item}} other{{items}}}',\n {\n first: first,\n last: last,\n total: total,\n item: itemLabel,\n items: itemsLabel,\n }\n );\n\n let $paginationContainer = $(\n '<div class=\"flex pagination\"/>'\n ).appendTo(this.$countContainer);\n let totalPages = Math.max(\n Math.ceil(total / this.settings.batchSize),\n 1\n );\n\n const $paginationNav = $('<nav/>', {\n class: 'flex',\n 'aria-label': Craft.t('app', '{element} pagination', {\n element: itemLabel,\n }),\n }).appendTo($paginationContainer);\n\n let $prevBtn = $('<button/>', {\n role: 'button',\n class:\n 'page-link prev-page' + (this.page > 1 ? '' : ' disabled'),\n disabled: this.page === 1,\n title: Craft.t('app', 'Previous Page'),\n }).appendTo($paginationNav);\n let $nextBtn = $('<button/>', {\n role: 'button',\n class:\n 'page-link next-page' +\n (this.page < totalPages ? '' : ' disabled'),\n disabled: this.page === totalPages,\n title: Craft.t('app', 'Next Page'),\n }).appendTo($paginationNav);\n\n $('<div/>', {\n class: 'page-info',\n text: countLabel,\n }).appendTo($paginationContainer);\n\n if (this.page > 1) {\n this.addListener($prevBtn, 'click', function () {\n this.removeListener($prevBtn, 'click');\n this.removeListener($nextBtn, 'click');\n this.setPage(this.page - 1);\n this.updateElements(true, true);\n });\n }\n\n if (this.page < totalPages) {\n this.addListener($nextBtn, 'click', function () {\n this.removeListener($prevBtn, 'click');\n this.removeListener($nextBtn, 'click');\n this.setPage(this.page + 1);\n this.updateElements(true, true);\n });\n }\n }\n })\n .catch(() => {\n this.$countSpinner.addClass('hidden');\n });\n }\n\n // Update the view with the new container + elements HTML\n // -------------------------------------------------------------\n\n this.$elements.html(response.html);\n Craft.appendHeadHtml(response.headHtml);\n Craft.appendBodyHtml(response.bodyHtml);\n\n // Batch actions setup\n // -------------------------------------------------------------\n\n this.$selectAllContainer = this.$elements.find(\n '.selectallcontainer:first'\n );\n\n if (response.actions && response.actions.length) {\n if (this.$selectAllContainer.length) {\n this.actions = response.actions;\n this.actionsHeadHtml = response.actionsHeadHtml;\n this.actionsBodyHtml = response.actionsBodyHtml;\n\n // Create the select all checkbox\n this.$selectAllCheckbox = $('<div class=\"checkbox\"/>')\n .prependTo(this.$selectAllContainer)\n .attr({\n role: 'checkbox',\n tabindex: '0',\n 'aria-checked': 'false',\n 'aria-label': Craft.t('app', 'Select all'),\n });\n\n this.addListener(this.$selectAllCheckbox, 'click', function () {\n if (this.view.getSelectedElements().length === 0) {\n this.view.selectAllElements();\n } else {\n this.view.deselectAllElements();\n }\n });\n\n this.addListener(this.$selectAllCheckbox, 'keydown', function (ev) {\n if (ev.keyCode === Garnish.SPACE_KEY) {\n ev.preventDefault();\n\n $(ev.currentTarget).trigger('click');\n }\n });\n }\n } else {\n if (!this.$selectAllContainer.siblings().length) {\n this.$selectAllContainer.parent('.header').remove();\n }\n this.$selectAllContainer.remove();\n }\n\n // Exporters setup\n // -------------------------------------------------------------\n\n this.exporters = response.exporters;\n this.exportersByType = Craft.index(this.exporters || [], (e) => e.type);\n\n if (this.exporters && this.exporters.length) {\n this.$exportBtn.removeClass('hidden');\n } else {\n this.$exportBtn.addClass('hidden');\n }\n\n // Create the view\n // -------------------------------------------------------------\n\n // Should we make the view selectable?\n var selectable = this.actions || this.settings.selectable;\n\n this.view = this.createView(this.getSelectedViewMode(), {\n context: this.settings.context,\n batchSize:\n this.settings.context !== 'index' ||\n this.getSortAttributeAndDirection()[0] === 'structure'\n ? this.settings.batchSize\n : null,\n params: params,\n selectable: selectable,\n multiSelect: this.actions || this.settings.multiSelect,\n checkboxMode: !!this.actions,\n onSelectionChange: this._handleSelectionChange.bind(this),\n });\n\n // Refocus the previously-focused element\n // -------------------------------------------------------------\n\n if (\n activeElement &&\n activeElement.id &&\n !document.body.contains(activeElement)\n ) {\n $(`#${activeElement.id}`).focus();\n }\n\n // Auto-select elements\n // -------------------------------------------------------------\n\n if (this._autoSelectElements) {\n if (selectable) {\n for (var i = 0; i < this._autoSelectElements.length; i++) {\n this.view.selectElementById(this._autoSelectElements[i]);\n }\n }\n\n this._autoSelectElements = null;\n }\n\n // Trigger the event\n // -------------------------------------------------------------\n\n this.onUpdateElements();\n },\n\n _updateBadgeCounts: function (badgeCounts) {\n for (let sourceKey in badgeCounts) {\n if (badgeCounts.hasOwnProperty(sourceKey)) {\n const $source = this.getSourceByKey(sourceKey);\n if ($source) {\n let $badge = $source.children('.badge');\n if (badgeCounts[sourceKey] !== null) {\n if (!$badge.length) {\n $badge = $('<span class=\"badge\"/>').appendTo($source);\n }\n $badge.text(badgeCounts[sourceKey]);\n } else if ($badge) {\n $badge.remove();\n }\n }\n }\n }\n },\n\n _countResults: function () {\n return new Promise((resolve, reject) => {\n if (this.totalResults !== null) {\n resolve(this.totalResults);\n } else {\n var params = this.getViewParams();\n delete params.criteria.offset;\n delete params.criteria.limit;\n\n // Make sure we've got an active result set ID\n if (this.resultSet === null) {\n this.resultSet = Math.floor(Math.random() * 100000000);\n }\n params.resultSet = this.resultSet;\n\n Craft.sendActionRequest('POST', this.settings.countElementsAction, {\n data: params,\n cancelToken: this._createCancelToken(),\n })\n .then((response) => {\n if (response.data.resultSet == this.resultSet) {\n this.totalResults = response.data.count;\n resolve(response.data.count);\n } else {\n reject();\n }\n })\n .catch(reject);\n }\n });\n },\n\n _createTriggers: function () {\n var triggers = [],\n safeMenuActions = [],\n destructiveMenuActions = [];\n\n var i;\n\n for (i = 0; i < this.actions.length; i++) {\n var action = this.actions[i];\n\n if (action.trigger) {\n var $form = $(\n '<form id=\"' +\n Craft.formatInputId(action.type) +\n '-actiontrigger\"/>'\n )\n .data('action', action)\n .append(action.trigger);\n\n this.addListener($form, 'submit', '_handleActionTriggerSubmit');\n triggers.push($form);\n } else {\n if (!action.destructive) {\n safeMenuActions.push(action);\n } else {\n destructiveMenuActions.push(action);\n }\n }\n }\n\n var $btn;\n\n if (safeMenuActions.length || destructiveMenuActions.length) {\n var $menuTrigger = $('<form/>');\n\n $btn = $('<button/>', {\n type: 'button',\n class: 'btn menubtn',\n 'data-icon': 'settings',\n title: Craft.t('app', 'Actions'),\n }).appendTo($menuTrigger);\n\n var $menu = $('<ul class=\"menu\"/>').appendTo($menuTrigger),\n $safeList = this._createMenuTriggerList(safeMenuActions, false),\n $destructiveList = this._createMenuTriggerList(\n destructiveMenuActions,\n true\n );\n\n if ($safeList) {\n $safeList.appendTo($menu);\n }\n\n if ($safeList && $destructiveList) {\n $('<hr/>').appendTo($menu);\n }\n\n if ($destructiveList) {\n $destructiveList.appendTo($menu);\n }\n\n triggers.push($menuTrigger);\n }\n\n this._$triggers = $();\n\n for (i = 0; i < triggers.length; i++) {\n var $div = $('<div/>').append(triggers[i]);\n this._$triggers = this._$triggers.add($div);\n }\n\n this._$triggers.appendTo(this.$actionsContainer);\n Craft.appendHeadHtml(this.actionsHeadHtml);\n Craft.appendBodyHtml(this.actionsBodyHtml);\n\n Craft.initUiElements(this._$triggers);\n\n if ($btn) {\n $btn\n .data('menubtn')\n .on('optionSelect', this._handleMenuActionTriggerSubmit.bind(this));\n }\n },\n\n _showExportHud: function () {\n this.$exportBtn.addClass('active');\n this.$exportBtn.attr('aria-expanded', 'true');\n\n var $form = $('<form/>', {\n class: 'export-form',\n });\n\n var typeOptions = [];\n for (var i = 0; i < this.exporters.length; i++) {\n typeOptions.push({\n label: this.exporters[i].name,\n value: this.exporters[i].type,\n });\n }\n var $typeField = Craft.ui\n .createSelectField({\n label: Craft.t('app', 'Export Type'),\n options: typeOptions,\n class: 'fullwidth',\n })\n .appendTo($form);\n\n var $formatField = Craft.ui\n .createSelectField({\n label: Craft.t('app', 'Format'),\n options: [\n {label: 'CSV', value: 'csv'},\n {label: 'JSON', value: 'json'},\n {label: 'XML', value: 'xml'},\n ],\n class: 'fullwidth',\n })\n .appendTo($form);\n\n let $typeSelect = $typeField.find('select');\n this.addListener($typeSelect, 'change', () => {\n let type = $typeSelect.val();\n if (this.exportersByType[type].formattable) {\n $formatField.removeClass('hidden');\n } else {\n $formatField.addClass('hidden');\n }\n });\n $typeSelect.trigger('change');\n\n // Only show the Limit field if there aren't any selected elements\n var selectedElementIds = this.view.getSelectedElementIds();\n\n if (!selectedElementIds.length) {\n var $limitField = Craft.ui\n .createTextField({\n label: Craft.t('app', 'Limit'),\n placeholder: Craft.t('app', 'No limit'),\n type: 'number',\n min: 1,\n })\n .appendTo($form);\n }\n\n const $submitBtn = Craft.ui\n .createSubmitButton({\n class: 'fullwidth',\n label: Craft.t('app', 'Export'),\n spinner: true,\n })\n .appendTo($form);\n\n var hud = new Garnish.HUD(this.$exportBtn, $form);\n\n hud.on('hide', () => {\n this.$exportBtn.removeClass('active');\n this.$exportBtn.attr('aria-expanded', 'false');\n });\n\n var submitting = false;\n\n this.addListener($form, 'submit', function (ev) {\n ev.preventDefault();\n if (submitting) {\n return;\n }\n\n submitting = true;\n $submitBtn.addClass('loading');\n\n var params = this.getViewParams();\n delete params.criteria.offset;\n delete params.criteria.limit;\n delete params.collapsedElementIds;\n\n params.type = $typeField.find('select').val();\n params.format = $formatField.find('select').val();\n\n if (selectedElementIds.length) {\n params.criteria.id = selectedElementIds;\n } else {\n var limit = parseInt($limitField.find('input').val());\n if (limit && !isNaN(limit)) {\n params.criteria.limit = limit;\n }\n }\n\n if (Craft.csrfTokenValue) {\n params[Craft.csrfTokenName] = Craft.csrfTokenValue;\n }\n\n Craft.downloadFromUrl(\n 'POST',\n Craft.getActionUrl('element-indexes/export'),\n params\n )\n .catch(() => {\n if (!this._ignoreFailedRequest) {\n Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n }\n })\n .finally(() => {\n submitting = false;\n $submitBtn.removeClass('loading');\n });\n });\n },\n\n _createMenuTriggerList: function (actions, destructive) {\n if (actions && actions.length) {\n var $ul = $('<ul/>');\n\n for (var i = 0; i < actions.length; i++) {\n $('<li/>')\n .append(\n $('<a/>', {\n id: Craft.formatInputId(actions[i].type) + '-actiontrigger',\n class: destructive ? 'error' : null,\n data: {\n action: actions[i],\n },\n text: actions[i].name,\n })\n )\n .appendTo($ul);\n }\n\n return $ul;\n }\n },\n\n showFilterHud: function () {\n if (!this.filterHuds[this.siteId]) {\n this.filterHuds[this.siteId] = {};\n }\n if (!this.filterHuds[this.siteId][this.sourceKey]) {\n this.filterHuds[this.siteId][this.sourceKey] = new FilterHud(\n this,\n this.sourceKey,\n this.siteId\n );\n this.updateFilterBtn();\n } else {\n this.filterHuds[this.siteId][this.sourceKey].show();\n }\n },\n\n updateFilterBtn: function () {\n this.$filterBtn.removeClass('active');\n\n if (\n this.filterHuds[this.siteId] &&\n this.filterHuds[this.siteId][this.sourceKey]\n ) {\n this.$filterBtn\n .attr(\n 'aria-controls',\n this.filterHuds[this.siteId][this.sourceKey].id\n )\n .attr(\n 'aria-expanded',\n this.filterHuds[this.siteId][this.sourceKey].showing\n ? 'true'\n : 'false'\n );\n\n if (\n this.filterHuds[this.siteId][this.sourceKey].showing ||\n this.filterHuds[this.siteId][this.sourceKey].hasRules()\n ) {\n this.$filterBtn.addClass('active');\n }\n } else {\n this.$filterBtn.attr('aria-controls', null);\n }\n },\n },\n {\n defaults: {\n context: 'index',\n modal: null,\n storageKey: null,\n condition: null,\n criteria: null,\n batchSize: 100,\n disabledElementIds: [],\n selectable: false,\n multiSelect: false,\n buttonContainer: null,\n hideSidebar: false,\n toolbarSelector: '.toolbar:first',\n refreshSourcesAction: 'element-indexes/get-source-tree-html',\n updateElementsAction: 'element-indexes/get-elements',\n countElementsAction: 'element-indexes/count-elements',\n submitActionsAction: 'element-indexes/perform-action',\n defaultSiteId: null,\n defaultSource: null,\n canHaveDrafts: false,\n\n elementTypeName: Craft.t('app', 'Element'),\n elementTypePluralName: Craft.t('app', 'Elements'),\n\n onAfterInit: $.noop,\n onSelectSource: $.noop,\n onSelectSite: $.noop,\n onUpdateElements: $.noop,\n onSelectionChange: $.noop,\n onEnableElements: $.noop,\n onDisableElements: $.noop,\n onAfterAction: $.noop,\n },\n }\n);\n\nconst ViewMenu = Garnish.Base.extend({\n elementIndex: null,\n $source: null,\n sourceKey: null,\n menu: null,\n id: null,\n\n $trigger: null,\n $container: null,\n $sortAttributeSelect: null,\n $sortDirectionPicker: null,\n sortDirectionListbox: null,\n $tableColumnsContainer: null,\n $revertContainer: null,\n $revertBtn: null,\n $closeBtn: null,\n\n init: function (elementIndex, $source) {\n this.elementIndex = elementIndex;\n this.$source = $source;\n this.sourceKey = $source.data('key');\n this.id = `view-menu-${Math.floor(Math.random() * 1000000000)}`;\n\n this.$trigger = $('<button/>', {\n type: 'button',\n class: 'btn menubtn hidden',\n text: Craft.t('app', 'View'),\n 'aria-label': Craft.t('app', 'View settings'),\n 'aria-controls': this.id,\n 'data-icon': 'sliders',\n }).appendTo(this.elementIndex.$toolbar);\n\n this.$container = $('<div/>', {\n id: this.id,\n class: 'menu menu--disclosure element-index-view-menu',\n 'data-align': 'right',\n }).appendTo(Garnish.$bod);\n\n this._buildMenu();\n\n this.addListener(this.$container, 'mousedown', (ev) => {\n ev.stopPropagation();\n });\n\n this.menu = new Garnish.DisclosureMenu(this.$trigger);\n\n this.menu.on('show', () => {\n this.$trigger.addClass('active');\n });\n\n this.menu.on('hide', () => {\n this.$trigger.removeClass('active');\n\n // Move all checked table column checkboxes to the top once it's fully faded out\n setTimeout(() => {\n this.tidyTableColumnField();\n }, Garnish.FX_DURATION);\n });\n },\n\n showTrigger: function () {\n this.$trigger.removeClass('hidden');\n },\n\n hideTrigger: function () {\n this.$trigger.data('trigger').hide();\n this.$trigger.addClass('hidden');\n this.menu.hide();\n },\n\n updateSortField: function () {\n let [attribute, direction] =\n this.elementIndex.getSortAttributeAndDirection();\n\n // Add/remove a score option\n const $scoreOption = this.$sortAttributeSelect.children(\n 'option[value=\"score\"]'\n );\n\n // If searching by score, just keep showing the actual selection\n if (this.elementIndex.searching) {\n if (!$scoreOption.length) {\n this.$sortAttributeSelect.prepend(\n $('<option/>', {\n value: 'score',\n text: Craft.t('app', 'Score'),\n })\n );\n }\n } else if ($scoreOption.length) {\n $scoreOption.remove();\n }\n\n this.$sortAttributeSelect.val(attribute);\n this.sortDirectionListbox.select(direction === 'asc' ? 0 : 1);\n\n if (['structure', 'score'].includes(attribute)) {\n this.sortDirectionListbox.disable();\n this.$sortDirectionPicker.addClass('disabled');\n } else {\n this.sortDirectionListbox.enable();\n this.$sortDirectionPicker.removeClass('disabled');\n }\n\n if (!this.elementIndex.canSortByStructure()) {\n this.$sortAttributeSelect\n .children('option[value=\"structure\"]')\n .attr('disabled', 'disabled');\n } else {\n this.$sortAttributeSelect\n .children('option[value=\"structure\"]')\n .removeAttr('disabled');\n }\n },\n\n updateTableColumnField: function () {\n const attributes = this.elementIndex.getSelectedTableColumns();\n let $lastContainer, lastIndex;\n\n attributes.forEach((attribute) => {\n const $checkbox = this.$tableColumnsContainer.find(\n `input[value=\"${attribute}\"]`\n );\n if (!$checkbox.prop('checked')) {\n $checkbox.prop('checked', true);\n }\n const $container = $checkbox.parent();\n\n // Do we need to move it up?\n if ($lastContainer && $container.index() < lastIndex) {\n $container.insertAfter($lastContainer);\n }\n\n $lastContainer = $container;\n lastIndex = $container.index();\n });\n\n // See if we need to uncheck any checkboxes\n const $checkboxes = this._getTableColumnCheckboxes();\n for (let i = 0; i < $checkboxes.length; i++) {\n const $checkbox = $checkboxes.eq(i);\n if ($checkbox.prop('checked') && !attributes.includes($checkbox.val())) {\n $checkbox.prop('checked', false);\n }\n }\n },\n\n tidyTableColumnField: function () {\n const defaultOrder = this.elementIndex\n .getTableColumnOptions(this.$source)\n .map((column) => column.attr)\n .reduce((obj, attr, index) => {\n return {...obj, [attr]: index};\n }, {});\n\n this.$tableColumnsContainer\n .children()\n .sort((a, b) => {\n const checkboxA = $(a).children('input[type=\"checkbox\"]')[0];\n const checkboxB = $(b).children('input[type=\"checkbox\"]')[0];\n if (checkboxA.checked && checkboxB.checked) {\n return 0;\n }\n if (checkboxA.checked || checkboxB.checked) {\n return checkboxA.checked ? -1 : 1;\n }\n return defaultOrder[checkboxA.value] < defaultOrder[checkboxB.value]\n ? -1\n : 1;\n })\n .appendTo(this.$tableColumnsContainer);\n },\n\n revert: function () {\n this.elementIndex.setSelecetedSourceState({\n order: null,\n sort: null,\n tableColumns: null,\n });\n\n this.updateSortField();\n this.updateTableColumnField();\n this.tidyTableColumnField();\n\n this.$revertBtn.remove();\n this.$revertBtn = null;\n\n this.$closeBtn.focus();\n this.elementIndex.updateElements();\n },\n\n _buildMenu: function () {\n const $metaContainer = $('<div class=\"meta\"/>').appendTo(this.$container);\n this._createSortField().appendTo($metaContainer);\n this._createTableColumnsField().appendTo($metaContainer);\n\n this.$sortAttributeSelect.focus();\n\n const $footerContainer = $('<div/>', {\n class: 'flex menu-footer',\n }).appendTo(this.$container);\n\n this.$revertContainer = $('<div/>', {\n class: 'flex-grow',\n }).appendTo($footerContainer);\n\n // Only create the revert button if there's a custom view state\n if (\n this.elementIndex.getSelectedSourceState('order') ||\n this.elementIndex.getSelectedSourceState('sort') ||\n this.elementIndex.getSelectedSourceState('tableColumns')\n ) {\n this._createRevertBtn();\n }\n\n this.$closeBtn = $('<button/>', {\n type: 'button',\n class: 'btn',\n text: Craft.t('app', 'Close'),\n })\n .appendTo($footerContainer)\n .on('click', () => {\n this.menu.hide();\n });\n },\n\n _createSortField: function () {\n const $container = $('<div class=\"flex\"/>');\n\n const $sortAttributeSelectContainer = Craft.ui\n .createSelect({\n options: this.elementIndex.getSortOptions(this.$source).map((o) => {\n return {\n label: o.label,\n value: o.attr,\n };\n }),\n })\n .addClass('fullwidth')\n .appendTo($('<div class=\"flex-grow\"/>').appendTo($container));\n\n this.$sortAttributeSelect = $sortAttributeSelectContainer\n .children('select')\n .attr({\n 'aria-label': Craft.t('app', 'Sort attribute'),\n });\n\n this.$sortDirectionPicker = $('<section/>', {\n class: 'btngroup btngroup--exclusive',\n 'aria-label': Craft.t('app', 'Sort direction'),\n })\n .append(\n $('<button/>', {\n type: 'button',\n class: 'btn',\n title: Craft.t('app', 'Sort ascending'),\n 'aria-label': Craft.t('app', 'Sort ascending'),\n 'aria-pressed': 'false',\n 'data-icon': 'asc',\n 'data-dir': 'asc',\n })\n )\n .append(\n $('<button/>', {\n type: 'button',\n class: 'btn',\n title: Craft.t('app', 'Sort descending'),\n 'aria-label': Craft.t('app', 'Sort descending'),\n 'aria-pressed': 'false',\n 'data-icon': 'desc',\n 'data-dir': 'desc',\n })\n )\n .appendTo($container);\n\n this.sortDirectionListbox = new Craft.Listbox(this.$sortDirectionPicker, {\n onChange: ($selectedOption) => {\n const direction = $selectedOption.data('dir');\n if (direction !== this.elementIndex.getSelectedSortDirection()) {\n this.elementIndex.setSelectedSortAttribute(\n this.$sortAttributeSelect.val(),\n $selectedOption.data('dir')\n );\n this.elementIndex.updateElements();\n this._createRevertBtn();\n }\n },\n });\n\n this.$sortAttributeSelect.on('change', () => {\n this.elementIndex.setSelectedSortAttribute(\n this.$sortAttributeSelect.val(),\n null,\n false\n );\n this.elementIndex.updateElements();\n this._createRevertBtn();\n });\n\n this.updateSortField();\n\n const $field = Craft.ui.createField($container, {\n label: Craft.t('app', 'Sort by'),\n fieldset: true,\n });\n $field.addClass('sort-field');\n return $field;\n },\n\n _getTableColumnCheckboxes: function () {\n return this.$tableColumnsContainer.find('input[type=\"checkbox\"]');\n },\n\n _createTableColumnsField: function () {\n const columns = this.elementIndex.getTableColumnOptions(this.$source);\n\n if (!columns.length) {\n return $();\n }\n\n this.$tableColumnsContainer = $('<div/>');\n\n columns.forEach((column) => {\n $('<div class=\"element-index-view-menu-table-column\"/>')\n .append('<div class=\"icon move\"/>')\n .append(\n Craft.ui.createCheckbox({\n label: Craft.escapeHtml(column.label),\n value: column.attr,\n })\n )\n .appendTo(this.$tableColumnsContainer);\n });\n\n this.updateTableColumnField();\n this.tidyTableColumnField();\n\n new Garnish.DragSort(this.$tableColumnsContainer.children(), {\n handle: '.move',\n axis: 'y',\n onSortChange: () => {\n this._onTableColumnChange();\n },\n });\n\n this._getTableColumnCheckboxes().on('change', (ev) => {\n this._onTableColumnChange();\n });\n\n const $field = Craft.ui.createField(this.$tableColumnsContainer, {\n label: Craft.t('app', 'Table Columns'),\n fieldset: true,\n });\n $field.addClass('table-columns-field');\n return $field;\n },\n\n _onTableColumnChange: function () {\n const columns = [];\n const $selectedCheckboxes =\n this._getTableColumnCheckboxes().filter(':checked');\n for (let i = 0; i < $selectedCheckboxes.length; i++) {\n columns.push($selectedCheckboxes.eq(i).val());\n }\n\n // Only commit the change if it's different from the current column selections\n // (maybe an unchecked column was dragged, etc.)\n if (\n Craft.compare(\n columns,\n this.elementIndex.getSelectedTableColumns(this.$source)\n )\n ) {\n return;\n }\n\n this.elementIndex.setSelectedTableColumns(columns, false);\n this.elementIndex.updateElements();\n this._createRevertBtn();\n },\n\n _createRevertBtn: function () {\n if (this.$revertBtn) {\n return;\n }\n\n this.$revertBtn = $('<button/>', {\n type: 'button',\n class: 'light',\n text: Craft.t('app', 'Use defaults'),\n })\n .appendTo(this.$revertContainer)\n .on('click', () => {\n this.revert();\n });\n },\n\n destroy: function () {\n this.menu.destroy();\n delete this.menu;\n this.base();\n },\n});\n\nconst FilterHud = Garnish.HUD.extend({\n elementIndex: null,\n sourceKey: null,\n siteId: null,\n id: null,\n loading: true,\n serialized: null,\n $clearBtn: null,\n cleared: false,\n\n init: function (elementIndex, sourceKey, siteId) {\n this.elementIndex = elementIndex;\n this.sourceKey = sourceKey;\n this.siteId = siteId;\n this.id = `filter-${Math.floor(Math.random() * 1000000000)}`;\n\n const $loadingContent = $('<div/>')\n .append(\n $('<div/>', {\n class: 'spinner',\n })\n )\n .append(\n $('<div/>', {\n text: Craft.t('app', 'Loading'),\n class: 'visually-hidden',\n 'aria-role': 'alert',\n })\n );\n\n this.base(this.elementIndex.$filterBtn, $loadingContent, {\n hudClass: 'hud element-filter-hud loading',\n });\n\n this.$hud.attr({\n id: this.id,\n 'aria-live': 'polite',\n 'aria-busy': 'false',\n });\n this.$tip.remove();\n this.$tip = null;\n\n this.$body.on('submit', (ev) => {\n ev.preventDefault();\n this.hide();\n });\n\n Craft.sendActionRequest('POST', 'element-indexes/filter-hud', {\n data: {\n elementType: this.elementIndex.elementType,\n source: this.sourceKey,\n condition: this.elementIndex.settings.condition,\n id: `${this.id}-filters`,\n },\n })\n .then((response) => {\n this.loading = false;\n this.$hud.removeClass('loading');\n $loadingContent.remove();\n\n this.$main.append(response.data.hudHtml);\n Craft.appendHeadHtml(response.data.headHtml);\n Craft.appendBodyHtml(response.data.bodyHtml);\n\n const $btnContainer = $('<div/>', {\n class: 'flex flex-nowrap',\n }).appendTo(this.$main);\n $('<div/>', {\n class: 'flex-grow',\n }).appendTo($btnContainer);\n this.$clearBtn = $('<button/>', {\n type: 'button',\n class: 'btn',\n text: Craft.t('app', 'Cancel'),\n }).appendTo($btnContainer);\n $('<button/>', {\n type: 'submit',\n class: 'btn secondary',\n text: Craft.t('app', 'Apply'),\n }).appendTo($btnContainer);\n this.$clearBtn.on('click', () => {\n this.clear();\n });\n\n this.$hud.find('.condition-container').on('htmx:beforeRequest', () => {\n this.setBusy();\n });\n\n this.$hud.find('.condition-container').on('htmx:load', () => {\n this.setReady();\n });\n this.setFocus();\n })\n .catch(() => {\n Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n });\n\n this.$hud.css('position', 'fixed');\n\n this.addListener(Garnish.$win, 'scroll,resize', () => {\n this.updateSizeAndPosition(true);\n });\n },\n\n addListener: function (elem, events, data, func) {\n if (elem === this.$main && events === 'resize') {\n return;\n }\n this.base(elem, events, data, func);\n },\n\n setBusy: function () {\n this.$hud.attr('aria-busy', 'true');\n\n $('<div/>', {\n class: 'visually-hidden',\n text: Craft.t('app', 'Loading'),\n }).insertAfter(this.$main.find('.htmx-indicator'));\n },\n\n setReady: function () {\n this.$hud.attr('aria-busy', 'false');\n },\n\n setFocus: function () {\n Garnish.setFocusWithin(this.$main);\n },\n\n clear: function () {\n this.cleared = true;\n this.hide();\n },\n\n updateSizeAndPositionInternal: function () {\n // const searchOffset = this.elementIndex.$searchContainer.offset();\n const searchOffset =\n this.elementIndex.$searchContainer[0].getBoundingClientRect();\n\n this.$hud.css({\n width: this.elementIndex.$searchContainer.outerWidth() - 2,\n top: searchOffset.top + this.elementIndex.$searchContainer.outerHeight(),\n left: searchOffset.left + 1,\n });\n },\n\n onShow: function () {\n this.base();\n\n // Cancel => Clear\n if (this.$clearBtn) {\n this.$clearBtn.text(Craft.t('app', 'Clear'));\n }\n\n this.elementIndex.updateFilterBtn();\n this.setFocus();\n },\n\n onHide: function () {\n this.base();\n\n // If something changed, update the elements\n if (this.serialized !== (this.serialized = this.serialize())) {\n this.elementIndex.updateElements();\n }\n\n if (this.cleared) {\n this.destroy();\n } else {\n this.$hud.detach();\n this.$shade.detach();\n }\n\n this.elementIndex.updateFilterBtn();\n this.elementIndex.$filterBtn.focus();\n },\n\n hasRules: function () {\n return this.$main.has('.condition-rule').length !== 0;\n },\n\n serialize: function () {\n return !this.cleared && this.hasRules() ? this.$body.serialize() : null;\n },\n\n destroy: function () {\n this.base();\n delete this.elementIndex.filterHuds[this.siteId][this.sourceKey];\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Base Element Index View\n */\nCraft.BaseElementIndexView = Garnish.Base.extend(\n {\n $container: null,\n $loadingMoreSpinner: null,\n $elementContainer: null,\n $scroller: null,\n\n elementIndex: null,\n thumbLoader: null,\n elementSelect: null,\n\n loadingMore: false,\n\n _totalVisible: null,\n _morePending: null,\n _handleEnableElements: null,\n _handleDisableElements: null,\n\n init: function (elementIndex, container, settings) {\n this.elementIndex = elementIndex;\n this.$container = $(container);\n this.setSettings(settings, Craft.BaseElementIndexView.defaults);\n\n // Create a \"loading-more\" spinner\n this.$loadingMoreSpinner = $(\n '<div class=\"centeralign hidden\">' +\n '<div class=\"spinner loadingmore\"></div>' +\n '</div>'\n ).insertAfter(this.$container);\n\n // Get the actual elements container and its child elements\n this.$elementContainer = this.getElementContainer();\n var $elements = this.$elementContainer.children();\n\n this.setTotalVisible($elements.length);\n this.setMorePending(\n this.settings.batchSize && $elements.length == this.settings.batchSize\n );\n\n // Instantiate the thumb loader\n this.thumbLoader = new Craft.ElementThumbLoader();\n this.thumbLoader.load($elements);\n\n if (this.settings.selectable) {\n this.elementSelect = new Garnish.Select(\n this.$elementContainer,\n $elements.filter(':not(.disabled)'),\n {\n multi: this.settings.multiSelect,\n vertical: this.isVerticalList(),\n handle:\n this.settings.context === 'index'\n ? '.checkbox, .element:first'\n : null,\n filter: ':not(a):not(.toggle)',\n checkboxMode: this.settings.checkboxMode,\n onSelectionChange: this.onSelectionChange.bind(this),\n }\n );\n\n this._handleEnableElements = (ev) => {\n this.elementSelect.addItems(ev.elements);\n };\n\n this._handleDisableElements = (ev) => {\n this.elementSelect.removeItems(ev.elements);\n };\n\n this.elementIndex.on('enableElements', this._handleEnableElements);\n this.elementIndex.on('disableElements', this._handleDisableElements);\n }\n\n // Enable inline element editing if this is an index page\n if (this.settings.context === 'index') {\n this._handleElementEditing = (ev) => {\n var $target = $(ev.target);\n\n if ($target.prop('nodeName') === 'A') {\n // Let the link do its thing\n return;\n }\n\n var $element;\n\n if ($target.hasClass('element')) {\n $element = $target;\n } else {\n $element = $target.closest('.element');\n\n if (!$element.length) {\n return;\n }\n }\n\n if (Garnish.hasAttr($element, 'data-editable')) {\n Craft.createElementEditor($element.data('type'), $element);\n }\n };\n\n if (!this.elementIndex.trashed) {\n this.addListener(\n this.$elementContainer,\n 'dblclick',\n this._handleElementEditing\n );\n if ($.isTouchCapable()) {\n this.addListener(\n this.$elementContainer,\n 'taphold',\n this._handleElementEditing\n );\n }\n }\n }\n\n // Give sub-classes a chance to do post-initialization stuff here\n this.afterInit();\n\n // Set up lazy-loading\n if (this.settings.batchSize) {\n if (this.settings.context === 'index') {\n this.$scroller = Garnish.$scrollContainer;\n } else {\n this.$scroller = this.elementIndex.$main;\n }\n\n this.$scroller.scrollTop(0);\n this.addListener(this.$scroller, 'scroll', 'maybeLoadMore');\n this.maybeLoadMore();\n }\n },\n\n getElementContainer: function () {\n throw 'Classes that extend Craft.BaseElementIndexView must supply a getElementContainer() method.';\n },\n\n afterInit: function () {},\n\n getAllElements: function () {\n return this.$elementContainer.children();\n },\n\n getEnabledElements: function () {\n return this.$elementContainer.children(':not(.disabled)');\n },\n\n getElementById: function (id) {\n var $element = this.$elementContainer.children(\n '[data-id=\"' + id + '\"]:first'\n );\n\n if ($element.length) {\n return $element;\n } else {\n return null;\n }\n },\n\n getSelectedElements: function () {\n if (!this.elementSelect) {\n throw 'This view is not selectable.';\n }\n\n return this.elementSelect.$selectedItems;\n },\n\n getSelectedElementIds: function () {\n let $selectedElements;\n try {\n $selectedElements = this.getSelectedElements();\n } catch (e) {}\n\n let ids = [];\n if ($selectedElements) {\n for (var i = 0; i < $selectedElements.length; i++) {\n ids.push($selectedElements.eq(i).data('id'));\n }\n }\n return ids;\n },\n\n selectElement: function ($element) {\n if (!this.elementSelect) {\n throw 'This view is not selectable.';\n }\n\n this.elementSelect.selectItem($element, true);\n return true;\n },\n\n selectElementById: function (id) {\n if (!this.elementSelect) {\n throw 'This view is not selectable.';\n }\n\n var $element = this.getElementById(id);\n\n if ($element) {\n this.elementSelect.selectItem($element, true);\n return true;\n } else {\n return false;\n }\n },\n\n selectAllElements: function () {\n this.elementSelect.selectAll();\n },\n\n deselectAllElements: function () {\n this.elementSelect.deselectAll();\n },\n\n isVerticalList: function () {\n return false;\n },\n\n getTotalVisible: function () {\n return this._totalVisible;\n },\n\n setTotalVisible: function (totalVisible) {\n this._totalVisible = totalVisible;\n },\n\n getMorePending: function () {\n return this._morePending;\n },\n\n setMorePending: function (morePending) {\n this._morePending = morePending;\n },\n\n /**\n * Checks if the user has reached the bottom of the scroll area, and if so, loads the next batch of elemets.\n */\n maybeLoadMore: function () {\n if (this.canLoadMore()) {\n this.loadMore();\n }\n },\n\n /**\n * Returns whether the user has reached the bottom of the scroll area.\n */\n canLoadMore: function () {\n if (!this.getMorePending() || !this.settings.batchSize) {\n return false;\n }\n\n // Check if the user has reached the bottom of the scroll area\n var containerHeight;\n\n if (this.$scroller[0] === Garnish.$win[0]) {\n var winHeight = Garnish.$win.innerHeight(),\n winScrollTop = Garnish.$win.scrollTop(),\n containerOffset = this.$container.offset().top;\n containerHeight = this.$container.height();\n\n return winHeight + winScrollTop >= containerOffset + containerHeight;\n } else {\n var containerScrollHeight = this.$scroller.prop('scrollHeight'),\n containerScrollTop = this.$scroller.scrollTop();\n containerHeight = this.$scroller.outerHeight();\n\n return (\n containerScrollHeight - containerScrollTop <= containerHeight + 15\n );\n }\n },\n\n /**\n * Loads the next batch of elements.\n */\n loadMore: function () {\n if (\n !this.getMorePending() ||\n this.loadingMore ||\n !this.settings.batchSize\n ) {\n return;\n }\n\n this.loadingMore = true;\n this.$loadingMoreSpinner.removeClass('hidden');\n this.removeListener(this.$scroller, 'scroll');\n\n Craft.sendActionRequest('POST', this.settings.loadMoreElementsAction, {\n data: this.getLoadMoreParams(),\n })\n .then((response) => {\n this.loadingMore = false;\n this.$loadingMoreSpinner.addClass('hidden');\n\n let $newElements = $(response.data.html);\n\n this.appendElements($newElements);\n Craft.appendHeadHtml(response.data.headHtml);\n Craft.appendBodyHtml(response.data.bodyHtml);\n\n if (this.elementSelect) {\n this.elementSelect.addItems($newElements.filter(':not(.disabled)'));\n this.elementIndex.updateActionTriggers();\n }\n\n this.setTotalVisible(this.getTotalVisible() + $newElements.length);\n this.setMorePending($newElements.length == this.settings.batchSize);\n\n // Is there room to load more right now?\n this.addListener(this.$scroller, 'scroll', 'maybeLoadMore');\n this.maybeLoadMore();\n })\n .catch((e) => {\n this.loadingMore = false;\n this.$loadingMoreSpinner.addClass('hidden');\n });\n },\n\n getLoadMoreParams: function () {\n // Use the same params that were passed when initializing this view\n var params = $.extend(true, {}, this.settings.params);\n params.criteria.offset = this.getTotalVisible();\n return params;\n },\n\n appendElements: function ($newElements) {\n $newElements.appendTo(this.$elementContainer);\n this.thumbLoader.load($newElements);\n this.onAppendElements($newElements);\n },\n\n onAppendElements: function ($newElements) {\n this.settings.onAppendElements($newElements);\n this.trigger('appendElements', {\n newElements: $newElements,\n });\n },\n\n onSelectionChange: function () {\n this.settings.onSelectionChange();\n this.trigger('selectionChange');\n },\n\n disable: function () {\n if (this.elementSelect) {\n this.elementSelect.disable();\n }\n },\n\n enable: function () {\n if (this.elementSelect) {\n this.elementSelect.enable();\n }\n },\n\n destroy: function () {\n // Remove the \"loading-more\" spinner, since we added that outside of the view container\n this.$loadingMoreSpinner.remove();\n\n // Kill the thumb loader\n this.thumbLoader.destroy();\n delete this.thumbLoader;\n\n // Delete the element select\n if (this.elementSelect) {\n this.elementIndex.off('enableElements', this._handleEnableElements);\n this.elementIndex.off('disableElements', this._handleDisableElements);\n\n this.elementSelect.destroy();\n delete this.elementSelect;\n }\n\n this.base();\n },\n },\n {\n defaults: {\n context: 'index',\n batchSize: null,\n params: null,\n selectable: false,\n multiSelect: false,\n checkboxMode: false,\n loadMoreElementsAction: 'element-indexes/get-more-elements',\n onAppendElements: $.noop,\n onSelectionChange: $.noop,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Element Select input\n */\nCraft.BaseElementSelectInput = Garnish.Base.extend(\n {\n thumbLoader: null,\n elementSelect: null,\n elementSort: null,\n modal: null,\n elementEditor: null,\n\n fieldLabel: null,\n\n $container: null,\n $form: null,\n $elementsContainer: null,\n $elements: null,\n $addElementBtn: null,\n $spinner: null,\n\n _initialized: false,\n\n init: function (settings) {\n // Normalize the settings and set them\n // ---------------------------------------------------------------------\n\n // Are they still passing in a bunch of arguments?\n if (!$.isPlainObject(settings)) {\n // Loop through all of the old arguments and apply them to the settings\n var normalizedSettings = {},\n args = [\n 'id',\n 'name',\n 'elementType',\n 'sources',\n 'criteria',\n 'sourceElementId',\n 'limit',\n 'modalStorageKey',\n 'fieldId',\n ];\n\n for (var i = 0; i < args.length; i++) {\n if (typeof arguments[i] !== 'undefined') {\n normalizedSettings[args[i]] = arguments[i];\n } else {\n break;\n }\n }\n\n settings = normalizedSettings;\n }\n\n this.setSettings(settings, Craft.BaseElementSelectInput.defaults);\n\n // Apply the storage key prefix\n if (this.settings.modalStorageKey) {\n this.modalStorageKey =\n 'BaseElementSelectInput.' + this.settings.modalStorageKey;\n }\n\n // No reason for this to be sortable if we're only allowing 1 selection\n if (this.settings.limit == 1 || this.settings.maintainHierarchy) {\n this.settings.sortable = false;\n }\n\n this.$container = this.getContainer();\n this.$form = this.$container.closest('form');\n this.fieldLabel = this.getFieldLabel();\n\n // Store a reference to this class\n this.$container.data('elementSelect', this);\n\n this.$elementsContainer = this.getElementsContainer();\n this.$addElementBtn = this.getAddElementsBtn();\n this.$spinner = this.getSpinner();\n\n this.thumbLoader = new Craft.ElementThumbLoader();\n\n this.initElementSelect();\n this.initElementSort();\n this.resetElements();\n\n if (this.$addElementBtn) {\n this.addListener(this.$addElementBtn, 'activate', 'showModal');\n }\n\n Garnish.requestAnimationFrame(() => {\n this._initialized = true;\n });\n },\n\n get totalSelected() {\n return this.$elements.length;\n },\n\n getContainer: function () {\n return $('#' + this.settings.id);\n },\n\n getFieldLabel: function () {\n if (!this.$container) return;\n\n const $fieldset = this.$container.closest('fieldset');\n return $fieldset.find('legend').first().data('label');\n },\n\n getElementsContainer: function () {\n return this.$container.children('.elements');\n },\n\n getElements: function () {\n return this.$elementsContainer.find('.element');\n },\n\n getAddElementsBtn: function () {\n return this.$container.find('.btn.add:first');\n },\n\n getSpinner: function () {\n return this.$container.find('.spinner');\n },\n\n initElementSelect: function () {\n if (this.settings.selectable) {\n this.elementSelect = new Garnish.Select({\n multi: this.settings.sortable,\n filter: ':not(.delete)',\n });\n }\n },\n\n initElementSort: function () {\n if (this.settings.sortable) {\n this.elementSort = new Garnish.DragSort({\n container: this.$elementsContainer,\n filter: this.settings.selectable\n ? () => {\n // Only return all the selected items if the target item is selected\n if (this.elementSort.$targetItem.hasClass('sel')) {\n return this.elementSelect.getSelectedItems();\n } else {\n return this.elementSort.$targetItem;\n }\n }\n : null,\n ignoreHandleSelector: '.delete',\n axis: this.getElementSortAxis(),\n collapseDraggees: true,\n magnetStrength: 4,\n helperLagBase: 1.5,\n onSortChange: this.settings.selectable\n ? () => {\n this.elementSelect.resetItemOrder();\n }\n : null,\n });\n }\n },\n\n getElementSortAxis: function () {\n return this.settings.viewMode === 'list' ? 'y' : null;\n },\n\n canAddMoreElements: function () {\n return (\n !this.settings.limit || this.$elements.length < this.settings.limit\n );\n },\n\n updateAddElementsBtn: function () {\n if (this.canAddMoreElements()) {\n this.enableAddElementsBtn();\n } else {\n this.disableAddElementsBtn();\n }\n },\n\n enableAddElementsBtn: function () {\n if (this.$addElementBtn) {\n this.$addElementBtn.removeClass('hidden');\n }\n\n this.updateButtonContainer();\n },\n\n disableAddElementsBtn: function () {\n if (this.$addElementBtn) {\n this.$addElementBtn.addClass('hidden');\n }\n\n this.updateButtonContainer();\n },\n\n showSpinner: function () {\n if (this.$spinner) {\n this.$spinner.removeClass('hidden');\n }\n\n this.updateButtonContainer();\n },\n\n hideSpinner: function () {\n if (this.$spinner) {\n this.$spinner.addClass('hidden');\n }\n\n this.updateButtonContainer();\n },\n\n updateButtonContainer: function () {\n const $container =\n this.$addElementBtn && this.$addElementBtn.parent('.flex');\n if ($container && $container.length) {\n if ($container.children(':not(.hidden)').length) {\n $container.removeClass('hidden');\n } else {\n $container.addClass('hidden');\n }\n }\n },\n\n focusNextLogicalElement: function () {\n if (this.canAddMoreElements()) {\n // If can add more elements, focus ADD button\n let $btn = this.$addElementBtn;\n\n if ($btn) {\n $btn.get(0).focus();\n }\n } else {\n // If can't add more elements, focus on the final remove\n this.focusLastRemoveBtn();\n }\n },\n\n focusLastRemoveBtn: function () {\n const $removeBtns = this.$container.find('.delete');\n\n if (!$removeBtns.length) return;\n\n $removeBtns.last()[0].focus();\n },\n\n resetElements: function () {\n if (this.$elements !== null) {\n this.removeElements(this.$elements);\n } else {\n this.$elements = $();\n }\n\n this.addElements(this.getElements());\n },\n\n addElements: function ($elements) {\n this.thumbLoader.load($elements);\n\n if (this.settings.selectable) {\n this.elementSelect.addItems($elements);\n }\n\n if (this.settings.sortable) {\n this.elementSort.addItems($elements);\n }\n\n if (this.settings.editable) {\n this._handleShowElementEditor = (ev) => {\n var $element = $(ev.currentTarget);\n if (\n Garnish.hasAttr($element, 'data-editable') &&\n !$element.hasClass('disabled') &&\n !$element.hasClass('loading')\n ) {\n this.elementEditor = this.createElementEditor($element);\n }\n };\n\n this.addListener($elements, 'dblclick', this._handleShowElementEditor);\n\n if ($.isTouchCapable()) {\n this.addListener($elements, 'taphold', this._handleShowElementEditor);\n }\n }\n\n $elements.find('.delete').on('click dblclick', (ev) => {\n this.removeElement($(ev.currentTarget).closest('.element'));\n // Prevent this from acting as one of a double-click\n ev.stopPropagation();\n });\n\n $elements.on('keydown', (ev) => {\n if ([Garnish.BACKSPACE_KEY, Garnish.DELETE_KEY].includes(ev.keyCode)) {\n ev.stopPropagation();\n ev.preventDefault();\n const $elements = this.elementSelect.getSelectedItems();\n for (let i = 0; i < $elements.length; i++) {\n this.removeElement($elements.eq(i));\n }\n }\n });\n\n this.$elements = this.$elements.add($elements);\n\n this.updateAddElementsBtn();\n\n this.onAddElements();\n },\n\n createElementEditor: function ($element, settings) {\n settings = Object.assign(\n {\n elementSelectInput: this,\n prevalidate: this.settings.prevalidate,\n },\n settings\n );\n\n return Craft.createElementEditor(\n this.settings.elementType,\n $element,\n settings\n );\n },\n\n replaceElement: function (elementId, replacementId) {\n return new Promise((resolve, reject) => {\n const $existing = this.$elements.filter(`[data-id=\"${elementId}\"]`);\n\n if (!$existing.length) {\n reject(`No element selected with an ID of ${elementId}.`);\n return;\n }\n\n this.showSpinner();\n\n const data = {\n elementId: replacementId,\n siteId: this.settings.criteria.siteId,\n thumbSize: this.settings.viewMode,\n };\n\n Craft.sendActionRequest('POST', 'elements/get-element-html', {data})\n .then((response) => {\n this.removeElement($existing);\n const elementInfo = Craft.getElementInfo(response.data.html);\n this.selectElements([elementInfo]);\n resolve();\n })\n .catch(({response}) => {\n if (response && response.data && response.data.message) {\n alert(response.data.message);\n } else {\n Craft.cp.displayError();\n }\n\n reject(response.data.message);\n })\n .finally(() => {\n this.hideSpinner();\n });\n });\n },\n\n removeElements: function ($elements) {\n if (this.settings.selectable) {\n this.elementSelect.removeItems($elements);\n }\n\n if (this.modal) {\n var ids = [];\n\n for (var i = 0; i < $elements.length; i++) {\n var id = $elements.eq(i).data('id');\n\n if (id) {\n ids.push(id);\n }\n }\n\n if (ids.length) {\n this.modal.elementIndex.enableElementsById(ids);\n }\n }\n\n // Disable the hidden input in case the form is submitted before this element gets removed from the DOM\n $elements.children('input').prop('disabled', true);\n\n // Move the focus to the next element in the list, if there is one\n let $nextDeleteBtn;\n if (this.settings.selectable) {\n const lastElementIndex = this.$elements.index($elements.last());\n $nextDeleteBtn = this.$elements\n .eq(lastElementIndex + 1)\n .find('.delete');\n }\n if ($nextDeleteBtn.length) {\n $nextDeleteBtn.focus();\n } else {\n this.focusNextLogicalElement();\n }\n\n this.$elements = this.$elements.not($elements);\n this.updateAddElementsBtn();\n\n this.onRemoveElements();\n },\n\n removeElement: function ($element) {\n if (this.settings.maintainHierarchy) {\n // Find any descendants this element might have\n const $allElements = $element.add(\n $element.parent().siblings('ul').find('.element')\n );\n\n // Remove any inputs from the form data\n $('[name]', $allElements).removeAttr('name');\n\n // Remove our record of them all at once\n this.removeElements($allElements);\n\n // Animate them away one at a time\n for (let i = 0; i < $allElements.length; i++) {\n this._animateStructureElementAway($allElements, i);\n }\n } else {\n // Remove any inputs from the form data\n $('[name]', $element).removeAttr('name');\n this.removeElements($element);\n this.animateElementAway($element, () => {\n $element.remove();\n });\n }\n },\n\n animateElementAway: function ($element, callback) {\n $element.css('z-index', 0);\n\n var animateCss = {\n opacity: -1,\n };\n animateCss['margin-' + Craft.left] = -(\n $element.outerWidth() + parseInt($element.css('margin-' + Craft.right))\n );\n\n if (this.settings.viewMode === 'list' || this.$elements.length === 0) {\n animateCss['margin-bottom'] = -(\n $element.outerHeight() + parseInt($element.css('margin-bottom'))\n );\n }\n\n $element.velocity(\n animateCss,\n Craft.BaseElementSelectInput.REMOVE_FX_DURATION,\n () => {\n if (callback) {\n callback();\n }\n }\n );\n },\n\n showModal: function () {\n // Make sure we haven't reached the limit\n if (!this.canAddMoreElements()) {\n return;\n }\n\n if (!this.modal) {\n this.modal = this.createModal();\n } else {\n this.modal.show();\n }\n },\n\n createModal: function () {\n return Craft.createElementSelectorModal(\n this.settings.elementType,\n this.getModalSettings()\n );\n },\n\n getModalSettings: function () {\n return $.extend(\n {\n closeOtherModals: false,\n storageKey: this.modalStorageKey,\n sources: this.settings.sources,\n condition: this.settings.condition,\n criteria: this.settings.criteria,\n multiSelect: this.settings.limit != 1,\n hideOnSelect: !this.settings.maintainHierarchy,\n showSiteMenu: this.settings.showSiteMenu,\n disabledElementIds: this.getDisabledElementIds(),\n onSelect: this.onModalSelect.bind(this),\n onHide: this.onModalHide.bind(this),\n triggerElement: this.$addElementBtn,\n modalTitle: Craft.t('app', 'Select {element}', {\n element: this.fieldLabel,\n }),\n },\n this.settings.modalSettings\n );\n },\n\n getSelectedElementIds: function () {\n var ids = [];\n\n for (var i = 0; i < this.$elements.length; i++) {\n ids.push(this.$elements.eq(i).data('id'));\n }\n\n return ids;\n },\n\n getDisabledElementIds: function () {\n var ids = this.getSelectedElementIds();\n\n if (!this.settings.allowSelfRelations && this.settings.sourceElementId) {\n ids.push(this.settings.sourceElementId);\n }\n\n if (this.settings.disabledElementIds) {\n ids.push(...this.settings.disabledElementIds);\n }\n\n return ids;\n },\n\n onModalSelect: function (elements) {\n if (this.settings.maintainHierarchy) {\n this.selectStructuredElements(elements);\n } else {\n if (this.settings.limit) {\n // Cut off any excess elements\n var slotsLeft = this.settings.limit - this.$elements.length;\n\n if (elements.length > slotsLeft) {\n elements = elements.slice(0, slotsLeft);\n }\n }\n\n this.selectElements(elements);\n this.updateDisabledElementsInModal();\n }\n },\n\n onModalHide: function () {\n // If can add more elements, do default behavior of focus on \"Add\" button\n if (this.canAddMoreElements()) return;\n\n setTimeout(() => {\n this.focusNextLogicalElement();\n }, 200);\n },\n\n selectElements: function (elements) {\n for (let i = 0; i < elements.length; i++) {\n let elementInfo = elements[i],\n $element = this.createNewElement(elementInfo);\n\n this.appendElement($element);\n this.addElements($element);\n this.animateElementIntoPlace(elementInfo.$element, $element);\n\n // Override the element reference with the new one\n elementInfo.$element = $element;\n }\n\n this.onSelectElements(elements);\n },\n\n selectStructuredElements: function (elements) {\n // Disable the modal\n this.modal.disable();\n this.modal.disableCancelBtn();\n this.modal.disableSelectBtn();\n this.modal.showFooterSpinner();\n\n // Get the new element HTML\n var selectedElementIds = this.getSelectedElementIds();\n\n for (var i = 0; i < elements.length; i++) {\n selectedElementIds.push(elements[i].id);\n }\n\n var data = {\n elementIds: selectedElementIds,\n siteId: elements[0].siteId,\n containerId: this.settings.id,\n name: this.settings.name,\n branchLimit: this.settings.branchLimit,\n selectionLabel: this.settings.selectionLabel,\n elementType: this.settings.elementType,\n };\n\n const onResponse = () => {\n this.modal.enable();\n this.modal.enableCancelBtn();\n this.modal.enableSelectBtn();\n this.modal.hideFooterSpinner();\n };\n Craft.sendActionRequest(\n 'POST',\n 'relational-fields/structured-input-html',\n {data}\n )\n .then((response) => {\n onResponse();\n var $newInput = $(response.data.html),\n $newElementsContainer = $newInput.children('.elements');\n\n this.$elementsContainer.replaceWith($newElementsContainer);\n this.$elementsContainer = $newElementsContainer;\n this.resetElements();\n\n var filteredElements = [];\n\n for (var i = 0; i < elements.length; i++) {\n var element = elements[i],\n $element = this.getElementById(element.id);\n\n if ($element) {\n this.animateElementIntoPlace(element.$element, $element);\n filteredElements.push(element);\n }\n }\n\n this.updateDisabledElementsInModal();\n this.modal.hide();\n this.onSelectElements(filteredElements);\n })\n .catch(({response}) => {\n onResponse();\n });\n },\n\n createNewElement: function (elementInfo) {\n var $element = elementInfo.$element.clone();\n var removeText = Craft.t('app', 'Remove {label}', {\n label: Craft.escapeHtml(elementInfo.label),\n });\n // Make a couple tweaks\n Craft.setElementSize(\n $element,\n this.settings.viewMode === 'large' ? 'large' : 'small'\n );\n $element\n .addClass('removable')\n .prepend(\n $('<input/>', {\n type: 'hidden',\n name: this.settings.name + (this.settings.single ? '' : '[]'),\n value: elementInfo.id,\n })\n )\n .prepend(\n $('<button/>', {\n type: 'button',\n class: 'delete icon',\n title: Craft.t('app', 'Remove'),\n 'aria-label': removeText,\n })\n );\n\n return $element;\n },\n\n appendElement: function ($element) {\n $element.appendTo(this.$elementsContainer);\n },\n\n animateElementIntoPlace: function ($modalElement, $inputElement) {\n var origOffset = $modalElement.offset(),\n destOffset = $inputElement.offset(),\n $helper = $inputElement.clone().appendTo(Garnish.$bod);\n\n $inputElement.css('visibility', 'hidden');\n\n $helper.css({\n position: 'absolute',\n zIndex: 10000,\n top: origOffset.top,\n left: origOffset.left,\n });\n\n var animateCss = {\n top: destOffset.top,\n left: destOffset.left,\n };\n\n $helper.velocity(\n animateCss,\n Craft.BaseElementSelectInput.ADD_FX_DURATION,\n function () {\n $helper.remove();\n $inputElement.css('visibility', 'visible');\n }\n );\n },\n\n updateDisabledElementsInModal: function () {\n if (this.modal.elementIndex) {\n this.modal.elementIndex.disableElementsById(\n this.getDisabledElementIds()\n );\n }\n },\n\n getElementById: function (id) {\n for (var i = 0; i < this.$elements.length; i++) {\n var $element = this.$elements.eq(i);\n\n if ($element.data('id') == id) {\n return $element;\n }\n }\n },\n\n onSelectElements: function (elements) {\n this.trigger('selectElements', {elements});\n this.settings.onSelectElements(elements);\n this.$container.trigger('change');\n },\n\n onAddElements: function () {\n this.trigger('addElements');\n this.settings.onAddElements();\n this.$container.trigger('change');\n },\n\n onRemoveElements: function () {\n this.trigger('removeElements');\n this.settings.onRemoveElements();\n this.$container.trigger('change');\n },\n\n _animateStructureElementAway: function ($allElements, i) {\n let callback;\n\n // Is this the last one?\n if (i === $allElements.length - 1) {\n callback = () => {\n const $li = $allElements.first().parent().parent();\n const $ul = $li.parent();\n\n if ($ul[0] === this.$elementsContainer[0] || $li.siblings().length) {\n $li.remove();\n } else {\n $ul.remove();\n }\n };\n }\n\n const func = () => {\n this.animateElementAway($allElements.eq(i), callback);\n };\n\n if (i === 0) {\n func();\n } else {\n setTimeout(func, 100 * i);\n }\n },\n },\n {\n ADD_FX_DURATION: 200,\n REMOVE_FX_DURATION: 200,\n\n defaults: {\n id: null,\n name: null,\n fieldId: null,\n elementType: null,\n sources: null,\n condition: null,\n criteria: {},\n allowSelfRelations: false,\n sourceElementId: null,\n disabledElementIds: null,\n viewMode: 'list',\n single: false,\n maintainHierarchy: false,\n branchLimit: null,\n limit: null,\n showSiteMenu: false,\n modalStorageKey: null,\n modalSettings: {},\n onAddElements: $.noop,\n onSelectElements: $.noop,\n onRemoveElements: $.noop,\n sortable: true,\n selectable: true,\n editable: true,\n prevalidate: false,\n editorSettings: {},\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Element selector modal class\n */\nCraft.BaseElementSelectorModal = Garnish.Modal.extend(\n {\n elementType: null,\n elementIndex: null,\n\n supportSidebarToggleView: false,\n\n $body: null,\n $content: null,\n $footer: null,\n $selectBtn: null,\n $sidebar: null,\n $sources: null,\n $sourceToggles: null,\n $sidebarToggleBtn: null,\n $sidebarCloseBtn: null,\n $mainHeading: null,\n $main: null,\n $search: null,\n $elements: null,\n $tbody: null,\n $primaryButtons: null,\n $secondaryButtons: null,\n $cancelBtn: null,\n\n init: function (elementType, settings) {\n this.elementType = elementType;\n this.setSettings(settings, Craft.BaseElementSelectorModal.defaults);\n var $headingId = 'elementSelectorModalHeading-' + Date.now();\n\n // Build the modal\n var $container = $(\n '<div class=\"modal elementselectormodal\" aria-labelledby=\"' +\n $headingId +\n '\"></div>'\n ).appendTo(Garnish.$bod),\n $heading = $(\n '<h1 id=\"' +\n $headingId +\n '\" class=\"visually-hidden\">' +\n this.settings.modalTitle +\n '</h1>'\n ).appendTo($container),\n $body = $(\n '<div class=\"body\"><div class=\"spinner big\"></div></div>'\n ).appendTo($container);\n\n this.$footer = $('<div class=\"footer\"/>').appendTo($container);\n\n if (this.settings.fullscreen) {\n $container.addClass('fullscreen');\n this.settings.minGutter = 0;\n }\n\n this.base($container, this.settings);\n\n this.$secondaryButtons = $(\n '<div class=\"buttons left secondary-buttons\"/>'\n ).appendTo(this.$footer);\n this.$primaryButtons = $('<div class=\"buttons right\"/>').appendTo(\n this.$footer\n );\n this.$cancelBtn = $('<button/>', {\n type: 'button',\n class: 'btn',\n text: Craft.t('app', 'Cancel'),\n }).appendTo(this.$primaryButtons);\n this.$selectBtn = Craft.ui\n .createSubmitButton({\n class: 'disabled',\n label: Craft.t('app', 'Select'),\n spinner: true,\n })\n .attr('aria-disabled', 'true')\n .appendTo(this.$primaryButtons);\n\n this.$body = $body;\n\n this.addListener(this.$cancelBtn, 'activate', 'cancel');\n this.addListener(this.$selectBtn, 'activate', 'selectElements');\n },\n\n updateModalBottomPadding: function () {\n const footerHeight = this.$footer.outerHeight();\n const bottomPadding = parseInt(this.$container.css('padding-bottom'));\n\n if (footerHeight !== bottomPadding) {\n this.$container.css('padding-bottom', footerHeight);\n }\n },\n\n updateSidebarView: function () {\n if (!this.supportSidebarToggleView) return;\n\n if (this.sidebarShouldBeHidden()) {\n if (!this.$sidebarToggleBtn) this.buildSidebarToggleView();\n } else {\n if (this.$sidebarToggleBtn) this.resetView();\n }\n },\n\n sidebarShouldBeHidden: function () {\n const contentWidth = this.$container.outerWidth();\n return contentWidth < 550;\n },\n\n resetView: function () {\n if (this.$mainHeader) {\n this.$mainHeader.remove();\n }\n\n if (this.$sidebarHeader) {\n this.$sidebarHeader.remove();\n }\n\n this.$sidebarToggleBtn = null;\n this.$body.addClass('has-sidebar');\n this.$content.addClass('has-sidebar');\n this.$sidebar.removeClass('hidden');\n },\n\n buildSidebarToggleView: function () {\n if (this.$sidebarToggleBtn || !this.sidebarShouldBeHidden()) return;\n\n this.$sidebarHeader = $('<div class=\"sidebar-header\"/>').prependTo(\n this.$sidebar\n );\n\n this.$sidebarCloseBtn = Craft.ui\n .createButton({\n class: 'nav-close close-btn',\n })\n .attr('aria-label', Craft.t('app', 'Close'))\n .removeClass('btn')\n .appendTo(this.$sidebarHeader);\n\n this.$mainHeader = $('<div class=\"main-header\"/>').prependTo(this.$main);\n this.$mainHeading = $(\n `<h2 class=\"main-heading\">${this.getActiveSourceName()}</h2>`\n ).appendTo(this.$mainHeader);\n\n const buttonConfig = {\n toggle: true,\n controls: 'modal-sidebar',\n class: 'nav-toggle',\n };\n this.$sidebarToggleBtn = Craft.ui\n .createButton(buttonConfig)\n .removeClass('btn')\n .attr('aria-label', Craft.t('app', 'Show sidebar'))\n .appendTo(this.$mainHeader);\n\n this.$sidebar.attr('id', 'modal-sidebar');\n\n this.closeSidebar();\n\n this.addListener(this.$sidebarToggleBtn, 'click', () => {\n this.toggleSidebar();\n });\n\n this.addListener(this.$sidebarCloseBtn, 'click', () => {\n this.toggleSidebar();\n });\n },\n\n sidebarIsOpen: function () {\n return this.$sidebarToggleBtn.attr('aria-expanded') === 'true';\n },\n\n toggleSidebar: function () {\n if (this.sidebarIsOpen()) {\n this.closeSidebar();\n } else {\n this.openSidebar();\n }\n },\n\n openSidebar: function () {\n this.$body.addClass('has-sidebar');\n this.$content.addClass('has-sidebar');\n this.$sidebar.removeClass('hidden');\n this.$sidebarToggleBtn.attr('aria-expanded', 'true');\n this.$sidebar.find(':focusable').first().focus();\n\n Garnish.uiLayerManager.addLayer(this.$sidebar);\n Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n this.closeSidebar();\n\n // If the focus is currently inside the sidebar, refocus the toggle\n const $focusedEl = Garnish.getFocusedElement();\n if ($.contains(this.$sidebar.get(0), $focusedEl.get(0)))\n this.$sidebarToggleBtn.focus();\n });\n },\n\n closeSidebar: function () {\n if (!this.$sidebarToggleBtn) return;\n\n if (this.sidebarIsOpen()) {\n Garnish.uiLayerManager.removeLayer();\n this.$sidebar.addClass('hidden');\n this.$sidebarToggleBtn.attr('aria-expanded', 'false');\n }\n\n this.$body.removeClass('has-sidebar');\n this.$content.removeClass('has-sidebar');\n },\n\n getActiveSourceName: function () {\n return this.$sidebar.find('.sel').text();\n },\n\n onFadeIn: function () {\n if (!this.elementIndex) {\n this._createElementIndex();\n } else {\n // Auto-focus the Search box\n if (!Garnish.isMobileBrowser(true)) {\n this.elementIndex.$search.trigger('focus');\n }\n }\n\n this.base();\n },\n\n onSelectionChange: function () {\n this.updateSelectBtnState();\n },\n\n onSelectSource: function () {\n this.updateHeading();\n this.updateModalBottomPadding();\n },\n\n updateHeading: function () {\n if (!this.$mainHeading) return;\n\n this.$mainHeading.text(this.getActiveSourceName());\n },\n\n updateSelectBtnState: function () {\n if (this.$selectBtn) {\n if (this.elementIndex.getSelectedElements().length) {\n this.enableSelectBtn();\n } else {\n this.disableSelectBtn();\n }\n }\n },\n\n enableSelectBtn: function () {\n this.$selectBtn.removeClass('disabled').attr('aria-disabled', 'false');\n },\n\n disableSelectBtn: function () {\n this.$selectBtn.addClass('disabled').attr('aria-disabled', 'true');\n },\n\n enableCancelBtn: function () {\n this.$cancelBtn.removeClass('disabled');\n },\n\n disableCancelBtn: function () {\n this.$cancelBtn.addClass('disabled');\n },\n\n showFooterSpinner: function () {\n this.$selectBtn.addClass('loading');\n },\n\n hideFooterSpinner: function () {\n this.$selectBtn.removeClass('loading');\n },\n\n cancel: function () {\n if (!this.$cancelBtn.hasClass('disabled')) {\n this.hide();\n }\n },\n\n selectElements: function () {\n if (this.elementIndex && this.elementIndex.getSelectedElements().length) {\n // TODO: This code shouldn't know about views' elementSelect objects\n this.elementIndex.view.elementSelect.clearMouseUpTimeout();\n\n var $selectedElements = this.elementIndex.getSelectedElements(),\n elementInfo = this.getElementInfo($selectedElements);\n\n this.onSelect(elementInfo);\n\n if (this.settings.disableElementsOnSelect) {\n this.elementIndex.disableElements(\n this.elementIndex.getSelectedElements()\n );\n }\n\n if (this.settings.hideOnSelect) {\n this.hide();\n }\n }\n },\n\n getElementInfo: function ($selectedElements) {\n var info = [];\n\n for (var i = 0; i < $selectedElements.length; i++) {\n var $element = $($selectedElements[i]);\n var elementInfo = Craft.getElementInfo($element);\n\n info.push(elementInfo);\n }\n\n return info;\n },\n\n onShow: function () {\n this.updateSelectBtnState();\n\n // Add listeners again since they get removed during modal close\n this.addListener(Garnish.$win, 'resize', this.updateSidebarView);\n this.addListener(Garnish.$win, 'resize', this.updateModalBottomPadding);\n\n this.updateModalBottomPadding();\n this.updateSidebarView();\n this.base();\n },\n\n onHide: function () {\n this.closeSidebar();\n this.base();\n },\n\n onSelect: function (elementInfo) {\n this.settings.onSelect(elementInfo);\n },\n\n disable: function () {\n if (this.elementIndex) {\n this.elementIndex.disable();\n }\n\n this.base();\n },\n\n enable: function () {\n if (this.elementIndex) {\n this.elementIndex.enable();\n }\n\n this.base();\n },\n\n _createElementIndex: function () {\n // Get the modal body HTML based on the settings\n var data = {\n context: 'modal',\n elementType: this.elementType,\n sources: this.settings.sources,\n };\n\n if (\n this.settings.showSiteMenu !== null &&\n this.settings.showSiteMenu !== 'auto'\n ) {\n data.showSiteMenu = this.settings.showSiteMenu ? '1' : '0';\n }\n\n Craft.sendActionRequest('POST', this.settings.bodyAction, {data}).then(\n (response) => {\n this.$body.html(response.data.html);\n\n if (this.$body.has('.sidebar:not(.hidden)').length) {\n this.$body.addClass('has-sidebar');\n this.supportSidebarToggleView = true;\n }\n\n // Initialize the element index\n this.elementIndex = Craft.createElementIndex(\n this.elementType,\n this.$body,\n Object.assign(\n {\n context: 'modal',\n modal: this,\n storageKey: this.settings.storageKey,\n condition: this.settings.condition,\n criteria: this.settings.criteria,\n disabledElementIds: this.settings.disabledElementIds,\n selectable: true,\n multiSelect: this.settings.multiSelect,\n buttonContainer: this.$secondaryButtons,\n onSelectionChange: this.onSelectionChange.bind(this),\n onSelectSource: this.onSelectSource.bind(this),\n hideSidebar: this.settings.hideSidebar,\n defaultSiteId: this.settings.defaultSiteId,\n defaultSource: this.settings.defaultSource,\n },\n this.settings.indexSettings\n )\n );\n\n this.$main = this.elementIndex.$main;\n this.$sidebar = this.elementIndex.$sidebar;\n this.$content = this.$body.find('.content');\n\n this.updateSidebarView();\n this.updateModalBottomPadding();\n\n // Double-clicking or double-tapping should select the elements\n this.addListener(\n this.elementIndex.$elements,\n 'doubletap',\n function (ev, touchData) {\n // Make sure the touch targets are the same\n // (they may be different if Command/Ctrl/Shift-clicking on multiple elements quickly)\n if (touchData.firstTap.target === touchData.secondTap.target) {\n this.selectElements();\n }\n }\n );\n }\n );\n },\n },\n {\n defaults: {\n fullscreen: false,\n resizable: true,\n storageKey: null,\n sources: null,\n condition: null,\n criteria: null,\n multiSelect: false,\n showSiteMenu: null,\n disabledElementIds: [],\n disableElementsOnSelect: false,\n hideOnSelect: true,\n modalTitle: Craft.t('app', 'Select element'),\n onCancel: $.noop,\n onSelect: $.noop,\n hideSidebar: false,\n defaultSiteId: null,\n defaultSource: null,\n bodyAction: 'element-selector-modals/body',\n indexSettings: {},\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Input Generator\n */\nCraft.BaseInputGenerator = Garnish.Base.extend({\n $source: null,\n $target: null,\n $form: null,\n settings: null,\n\n listening: null,\n timeout: null,\n\n init: function (source, target, settings) {\n this.$source = $(source);\n this.$target = $(target);\n this.$form = this.$source.closest('form');\n\n this.setSettings(settings);\n\n this.startListening();\n },\n\n setNewSource: function (source) {\n var listening = this.listening;\n this.stopListening();\n\n this.$source = $(source);\n\n if (listening) {\n this.startListening();\n }\n },\n\n startListening: function () {\n if (this.listening) {\n return;\n }\n\n this.listening = true;\n\n this.addListener(this.$source, 'input', 'onSourceTextChange');\n this.addListener(this.$target, 'input', 'onTargetTextChange');\n this.addListener(this.$form, 'submit', 'onFormSubmit');\n },\n\n stopListening: function () {\n if (!this.listening) {\n return;\n }\n\n this.listening = false;\n\n if (this.timeout) {\n clearTimeout(this.timeout);\n }\n\n this.removeAllListeners(this.$source);\n this.removeAllListeners(this.$target);\n this.removeAllListeners(this.$form);\n },\n\n onSourceTextChange: function () {\n if (this.timeout) {\n clearTimeout(this.timeout);\n }\n\n this.timeout = setTimeout(this.updateTarget.bind(this), 250);\n },\n\n onTargetTextChange: function () {\n if (this.$target.get(0) === document.activeElement) {\n this.stopListening();\n }\n },\n\n onFormSubmit: function () {\n if (this.timeout) {\n clearTimeout(this.timeout);\n }\n\n this.updateTarget();\n },\n\n updateTarget: function () {\n if (!this.$target.is(':visible')) {\n return;\n }\n\n var sourceVal = this.$source.val();\n\n if (typeof sourceVal === 'undefined') {\n // The source input may not exist anymore\n return;\n }\n\n var targetVal = this.generateTargetValue(sourceVal);\n\n this.$target.val(targetVal);\n\n for (let i = 0; i < this.$target.length; i++) {\n this.$target[i].dispatchEvent(\n new InputEvent('input', {\n inputType: 'insertText',\n })\n );\n this.$target[i].dispatchEvent(new Event('input'));\n }\n\n // If the target already has focus, select its whole value to mimic\n // the behavior if the value had already been generated and they just tabbed in\n if (this.$target.is(':focus')) {\n Craft.selectFullValue(this.$target);\n }\n },\n\n generateTargetValue: function (sourceVal) {\n return sourceVal;\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Category index class\n */\nCraft.CategoryIndex = Craft.BaseElementIndex.extend({\n editableGroups: null,\n $newCategoryBtnGroup: null,\n $newCategoryBtn: null,\n\n init: function (elementType, $container, settings) {\n this.editableGroups = [];\n this.on('selectSource', this.updateButton.bind(this));\n this.on('selectSite', this.updateButton.bind(this));\n this.base(elementType, $container, settings);\n },\n\n afterInit: function () {\n // Find which of the visible groups the user has permission to create new categories in\n this.editableGroups = Craft.editableCategoryGroups.filter(\n (g) => !!this.getSourceByKey(`group:${g.uid}`)\n );\n\n this.base();\n },\n\n getDefaultSourceKey: function () {\n // Did they request a specific category group in the URL?\n if (\n this.settings.context === 'index' &&\n typeof defaultGroupHandle !== 'undefined'\n ) {\n for (let i = 0; i < this.$sources.length; i++) {\n const $source = $(this.$sources[i]);\n if ($source.data('handle') === defaultGroupHandle) {\n return $source.data('key');\n }\n }\n }\n\n return this.base();\n },\n\n updateButton: function () {\n if (!this.$source) {\n return;\n }\n\n // Get the handle of the selected source\n const selectedSourceHandle = this.$source.data('handle');\n\n // Update the New Category button\n // ---------------------------------------------------------------------\n\n if (this.editableGroups.length) {\n // Remove the old button, if there is one\n if (this.$newCategoryBtnGroup) {\n this.$newCategoryBtnGroup.remove();\n }\n\n // Determine if they are viewing a group that they have permission to create categories in\n const selectedGroup = this.editableGroups.find(\n (g) => g.handle === selectedSourceHandle\n );\n\n this.$newCategoryBtnGroup = $(\n '<div class=\"btngroup submit\" data-wrapper/>'\n );\n let $menuBtn;\n const menuId = 'new-category-menu-' + Craft.randomString(10);\n\n // If they are, show a primary \"New category\" button, and a dropdown of the other groups (if any).\n // Otherwise only show a menu button\n if (selectedGroup) {\n const visibleLabel =\n this.settings.context === 'index'\n ? Craft.t('app', 'New category')\n : Craft.t('app', 'New {group} category', {\n group: selectedGroup.name,\n });\n const ariaLabel =\n this.settings.context === 'index'\n ? Craft.t('app', 'New category in the {group} category group', {\n group: selectedGroup.name,\n })\n : visibleLabel;\n\n const role = this.settings.context === 'index' ? 'link' : null;\n\n this.$newCategoryBtn = Craft.ui\n .createButton({\n label: visibleLabel,\n ariaLabel: ariaLabel,\n spinner: true,\n role: role,\n })\n .addClass('submit add icon')\n .appendTo(this.$newCategoryBtnGroup);\n\n this.addListener(this.$newCategoryBtn, 'click mousedown', (ev) => {\n // If this is the element index, check for Ctrl+clicks and middle button clicks\n if (\n this.settings.context === 'index' &&\n ((ev.type === 'click' && Garnish.isCtrlKeyPressed(ev)) ||\n (ev.type === 'mousedown' && ev.originalEvent.button === 1))\n ) {\n window.open(Craft.getUrl(`categories/${selectedGroup.handle}/new`));\n } else if (ev.type === 'click') {\n this._createCategory(selectedGroup.id);\n }\n });\n\n if (this.editableGroups.length > 1) {\n $menuBtn = $('<button/>', {\n type: 'button',\n class: 'btn submit menubtn btngroup-btn-last',\n 'aria-controls': menuId,\n 'data-disclosure-trigger': '',\n 'aria-label': Craft.t(\n 'app',\n 'New category, choose a category group'\n ),\n }).appendTo(this.$newCategoryBtnGroup);\n }\n } else {\n this.$newCategoryBtn = $menuBtn = Craft.ui\n .createButton({\n label: Craft.t('app', 'New category'),\n ariaLabel: Craft.t('app', 'New category, choose a category group'),\n spinner: true,\n })\n .addClass('submit add icon menubtn btngroup-btn-last')\n .attr('aria-controls', menuId)\n .attr('data-disclosure-trigger', '')\n .appendTo(this.$newCategoryBtnGroup);\n }\n\n this.addButton(this.$newCategoryBtnGroup);\n\n if ($menuBtn) {\n const $menuContainer = $('<div/>', {\n id: menuId,\n class: 'menu menu--disclosure',\n }).appendTo(this.$newCategoryBtnGroup);\n const $ul = $('<ul/>').appendTo($menuContainer);\n\n for (const group of this.editableGroups) {\n const anchorRole =\n this.settings.context === 'index' ? 'link' : 'button';\n if (this.settings.context === 'index' || group !== selectedGroup) {\n const $li = $('<li/>').appendTo($ul);\n const $a = $('<a/>', {\n role: anchorRole === 'button' ? 'button' : null,\n href: '#', // Allows for click listener and tab order\n type: anchorRole === 'button' ? 'button' : null,\n text: Craft.t('app', 'New {group} category', {\n group: group.name,\n }),\n }).appendTo($li);\n this.addListener($a, 'click', () => {\n $menuBtn.data('trigger').hide();\n this._createCategory(group.id);\n });\n\n if (anchorRole === 'button') {\n this.addListener($a, 'keydown', (event) => {\n if (event.keyCode === Garnish.SPACE_KEY) {\n event.preventDefault();\n $menuBtn.data('trigger').hide();\n this._createCategory(group.id);\n }\n });\n }\n }\n }\n\n new Garnish.DisclosureMenu($menuBtn);\n }\n }\n\n // Update the URL if we're on the Categories index\n // ---------------------------------------------------------------------\n\n if (this.settings.context === 'index') {\n let uri = 'categories';\n\n if (selectedSourceHandle) {\n uri += '/' + selectedSourceHandle;\n }\n\n Craft.setPath(uri);\n }\n },\n\n _createCategory: function (groupId) {\n if (this.$newCategoryBtn.hasClass('loading')) {\n console.warn('New category creation already in progress.');\n return;\n }\n\n // Find the group\n const group = this.editableGroups.find((s) => s.id === groupId);\n\n if (!group) {\n throw `Invalid category group ID: ${groupId}`;\n }\n\n this.$newCategoryBtn.addClass('loading');\n\n Craft.sendActionRequest('POST', 'elements/create', {\n data: {\n elementType: this.elementType,\n siteId: this.siteId,\n groupId: groupId,\n },\n })\n .then((ev) => {\n if (this.settings.context === 'index') {\n document.location.href = Craft.getUrl(ev.data.cpEditUrl, {fresh: 1});\n } else {\n const slideout = Craft.createElementEditor(this.elementType, {\n siteId: this.siteId,\n elementId: ev.data.element.id,\n draftId: ev.data.element.draftId,\n params: {\n fresh: 1,\n },\n });\n slideout.on('submit', () => {\n // Make sure the right group is selected\n const groupSourceKey = `group:${group.uid}`;\n\n if (this.sourceKey !== groupSourceKey) {\n this.selectSourceByKey(groupSourceKey);\n }\n\n this.clearSearch();\n this.selectElementAfterUpdate(ev.data.element.id);\n this.updateElements();\n });\n }\n })\n .finally(() => {\n this.$newCategoryBtn.removeClass('loading');\n });\n },\n});\n\n// Register it!\nCraft.registerElementIndexClass(\n 'craft\\\\elements\\\\Category',\n Craft.CategoryIndex\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Category Select input\n * @deprecated in 4.3.0. Use Craft.BaseElementSelectInput instead.\n */\nCraft.CategorySelectInput = Craft.BaseElementSelectInput.extend({\n setSettings: function () {\n this.base.apply(this, arguments);\n this.settings.sortable = false;\n },\n\n getModalSettings: function () {\n var settings = this.base();\n settings.hideOnSelect = false;\n return settings;\n },\n\n getElements: function () {\n return this.$elementsContainer.find('.element');\n },\n\n onModalSelect: function (elements) {\n // Disable the modal\n this.modal.disable();\n this.modal.disableCancelBtn();\n this.modal.disableSelectBtn();\n this.modal.showFooterSpinner();\n\n // Get the new category HTML\n var selectedCategoryIds = this.getSelectedElementIds();\n\n for (var i = 0; i < elements.length; i++) {\n selectedCategoryIds.push(elements[i].id);\n }\n\n var data = {\n categoryIds: selectedCategoryIds,\n siteId: elements[0].siteId,\n id: this.settings.id,\n name: this.settings.name,\n branchLimit: this.settings.branchLimit,\n selectionLabel: this.settings.selectionLabel,\n };\n\n const onResponse = () => {\n this.modal.enable();\n this.modal.enableCancelBtn();\n this.modal.enableSelectBtn();\n this.modal.hideFooterSpinner();\n };\n Craft.sendActionRequest('POST', 'categories/input-html', {data})\n .then((response) => {\n onResponse();\n var $newInput = $(response.data.html),\n $newElementsContainer = $newInput.children('.elements');\n\n this.$elementsContainer.replaceWith($newElementsContainer);\n this.$elementsContainer = $newElementsContainer;\n this.resetElements();\n\n var filteredElements = [];\n\n for (var i = 0; i < elements.length; i++) {\n var element = elements[i],\n $element = this.getElementById(element.id);\n\n if ($element) {\n this.animateElementIntoPlace(element.$element, $element);\n filteredElements.push(element);\n }\n }\n\n this.updateDisabledElementsInModal();\n this.modal.hide();\n this.onSelectElements(filteredElements);\n })\n .catch(({response}) => {\n onResponse();\n });\n },\n\n removeElement: function ($element) {\n // Find any descendants this category might have\n const $allCategories = $element.add(\n $element.parent().siblings('ul').find('.element')\n );\n\n // Remove our record of them all at once\n this.removeElements($allCategories);\n\n // Animate them away one at a time\n for (let i = 0; i < $allCategories.length; i++) {\n this._animateCategoryAway($allCategories, i);\n }\n },\n\n _animateCategoryAway: function ($allCategories, i) {\n let callback;\n\n // Is this the last one?\n if (i === $allCategories.length - 1) {\n callback = () => {\n const $li = $allCategories.first().parent().parent();\n const $ul = $li.parent();\n\n if ($ul[0] === this.$elementsContainer[0] || $li.siblings().length) {\n $li.remove();\n } else {\n $ul.remove();\n }\n };\n }\n\n const func = () => {\n this.animateElementAway($allCategories.eq(i), callback);\n };\n\n if (i === 0) {\n func();\n } else {\n setTimeout(func, 100 * i);\n }\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Craft Charts\n */\n\nCraft.charts = {};\n\n// ---------------------------------------------------------------------\n\n/**\n * Class Craft.charts.DataTable\n */\nCraft.charts.DataTable = Garnish.Base.extend({\n columns: null,\n rows: null,\n\n init: function (data) {\n let columns = data.columns;\n let rows = data.rows;\n\n rows.forEach((d) => {\n $.each(d, function (cellIndex) {\n var column = columns[cellIndex];\n\n var parseTime;\n\n switch (column.type) {\n case 'date':\n parseTime = d3.timeParse('%Y-%m-%d');\n d[cellIndex] = parseTime(d[cellIndex]);\n break;\n\n case 'datetime':\n parseTime = d3.timeParse('%Y-%m-%d %H:00:00');\n d[cellIndex] = parseTime(d[cellIndex]);\n break;\n\n case 'percent':\n d[cellIndex] = d[cellIndex] / 100;\n break;\n\n case 'number':\n d[cellIndex] = +d[cellIndex];\n break;\n\n default:\n // do nothing\n }\n });\n });\n\n this.columns = columns;\n this.rows = rows;\n },\n});\n\n// ---------------------------------------------------------------------\n\n/**\n * Class Craft.charts.Tip\n */\n\nCraft.charts.Tip = Garnish.Base.extend({\n $container: null,\n $tip: null,\n\n init: function ($container) {\n this.$container = $container;\n\n this.$tip = $('<div class=\"tooltip\"></div>').appendTo(this.$container);\n\n this.hide();\n },\n\n setContent: function (html) {\n this.$tip.html(html);\n },\n\n setPosition: function (position) {\n this.$tip.css('left', `${position.left}px`);\n this.$tip.css('top', `${position.top}px`);\n },\n\n show: function () {\n this.$tip.css('display', 'block');\n },\n\n hide: function () {\n this.$tip.css('display', 'none');\n },\n});\n\n// ---------------------------------------------------------------------\n\n/**\n * Class Craft.charts.BaseChart\n */\nCraft.charts.BaseChart = Garnish.Base.extend(\n {\n $container: null,\n $chart: null,\n\n chartBaseClass: 'cp-chart',\n dataTable: null,\n\n formatLocale: null,\n timeFormatLocale: null,\n orientation: null,\n\n svg: null,\n width: null,\n height: null,\n\n init: function (container, settings) {\n this.$container = container;\n\n this.setSettings(Craft.charts.BaseChart.defaults);\n this.setSettings(settings);\n\n var globalSettings = {\n formats: window.d3Formats,\n formatLocaleDefinition: window.d3FormatLocaleDefinition,\n timeFormatLocaleDefinition: window.d3TimeFormatLocaleDefinition,\n };\n\n this.setSettings(globalSettings);\n\n d3.select(window).on('resize', () => {\n this.resize();\n });\n },\n\n setSettings: function (settings, defaults) {\n var baseSettings =\n typeof this.settings === 'undefined' ? {} : this.settings;\n this.settings = $.extend(true, {}, baseSettings, defaults, settings);\n },\n\n draw: function (dataTable, settings) {\n // Settings and chart attributes\n\n this.setSettings(settings);\n\n this.dataTable = dataTable;\n this.formatLocale = d3.formatLocale(this.settings.formatLocaleDefinition);\n this.timeFormatLocale = d3.timeFormatLocale(\n this.settings.timeFormatLocaleDefinition\n );\n this.orientation = this.settings.orientation;\n\n // Set (or reset) the chart element\n\n if (this.$chart) {\n this.$chart.remove();\n }\n\n var className = this.chartBaseClass;\n\n if (this.settings.chartClass) {\n className += ' ' + this.settings.chartClass;\n }\n\n this.$chart = $(`<div class=\"${className}\" />`).appendTo(this.$container);\n },\n\n resize: function () {\n this.draw(this.dataTable, this.settings);\n },\n\n onAfterDrawTicks: function () {\n // White border for ticks' text\n $('.tick', this.$chart).each(function (tickKey, tick) {\n var $tickText = $('text', tick);\n\n var $clone = $tickText.clone();\n $clone.appendTo(tick);\n\n $tickText.attr('stroke', '#ffffff');\n $tickText.attr('stroke-width', 3);\n });\n },\n },\n {\n defaults: {\n formatLocaleDefinition: null,\n timeFormatLocaleDefinition: null,\n formats: {\n numberFormat: ',.2f',\n percentFormat: ',.2%',\n currencyFormat: '$,.2f',\n shortDateFormats: {\n day: '%-m/%-d',\n month: '%-m/%y',\n year: '%Y',\n },\n },\n margin: {top: 0, right: 0, bottom: 0, left: 0},\n chartClass: null,\n colors: ['#0594D1', '#DE3800', '#FF9A00', '#009802', '#9B009B'],\n },\n }\n);\n\n// ---------------------------------------------------------------------\n\n/**\n * Class Craft.charts.Area\n */\nCraft.charts.Area = Craft.charts.BaseChart.extend(\n {\n tip: null,\n drawingArea: null,\n\n init: function (container, settings) {\n this.base(container, Craft.charts.Area.defaults);\n\n this.setSettings(settings);\n },\n\n draw: function (dataTable, settings) {\n this.base(dataTable, settings);\n\n if (this.tip) {\n this.tip = null;\n }\n\n var margin = this.getChartMargin();\n\n this.width = this.$chart.width() - margin.left - margin.right;\n this.height = this.$chart.height() - margin.top - margin.bottom;\n\n // Append SVG to chart element\n\n var svg = {\n width: this.width + (margin.left + margin.right),\n height: this.height + (margin.top + margin.bottom),\n translateX: this.orientation !== 'rtl' ? margin.left : margin.right,\n translateY: margin.top,\n };\n\n this.svg = d3\n .select(this.$chart.get(0))\n .append('svg')\n .attr('width', svg.width)\n .attr('height', svg.height);\n\n this.drawingArea = this.svg\n .append('g')\n .attr('transform', `translate(${svg.translateX},${svg.translateY})`);\n\n // Draw elements\n\n this.drawTicks();\n this.drawAxes();\n this.drawChart();\n this.drawTipTriggers();\n },\n\n drawTicks: function () {\n // Draw X ticks\n\n var x = this.getX(true);\n var xTicks = 3;\n var xAxis = d3\n .axisBottom(x)\n .tickFormat(this.getXFormatter())\n .ticks(xTicks);\n\n this.drawingArea\n .append('g')\n .attr('class', 'x ticks-axis')\n .attr('transform', `translate(0, ${this.height})`)\n .call(xAxis);\n\n // Draw Y ticks\n\n var y = this.getY();\n var yTicks = 2;\n var yAxis;\n\n if (this.orientation !== 'rtl') {\n yAxis = d3\n .axisLeft(y)\n .tickFormat(this.getYFormatter())\n .tickValues(this.getYTickValues())\n .ticks(yTicks);\n\n this.drawingArea.append('g').attr('class', 'y ticks-axis').call(yAxis);\n } else {\n yAxis = d3\n .axisRight(y)\n .tickFormat(this.getYFormatter())\n .tickValues(this.getYTickValues())\n .ticks(yTicks);\n\n this.drawingArea\n .append('g')\n .attr('class', 'y ticks-axis')\n .attr('transform', `translate(${this.width},0)`)\n .call(yAxis);\n }\n\n // On after draw ticks\n\n this.onAfterDrawTicks();\n },\n\n drawAxes: function () {\n if (this.settings.xAxis.showAxis) {\n var x = this.getX();\n var xAxis = d3.axisBottom(x).ticks(0).tickSizeOuter(0);\n this.drawingArea\n .append('g')\n .attr('class', 'x axis')\n .attr('transform', `translate(0, ${this.height})`)\n .call(xAxis);\n }\n\n if (this.settings.yAxis.showAxis) {\n var y = this.getY();\n var chartPadding = 0;\n var yAxis;\n\n if (this.orientation === 'rtl') {\n yAxis = d3.axisLeft(y).ticks(0);\n this.drawingArea\n .append('g')\n .attr('class', 'y axis')\n .attr('transform', `translate(${this.width - chartPadding}, 0)`)\n .call(yAxis);\n } else {\n yAxis = d3.axisRight(y).ticks(0);\n this.drawingArea\n .append('g')\n .attr('class', 'y axis')\n .attr('transform', `translate(${chartPadding}, 0)`)\n .call(yAxis);\n }\n }\n },\n\n drawChart: function () {\n var x = this.getX(true);\n var y = this.getY();\n\n // X & Y grid lines\n\n if (this.settings.xAxis.gridlines) {\n var xLineAxis = d3.axisBottom(x);\n\n this.drawingArea\n .append('g')\n .attr('class', 'x grid-line')\n .attr('transform', `translate(0,${this.height})`)\n .call(xLineAxis.tickSize(-this.height, 0, 0).tickFormat(''));\n }\n\n var yTicks = 2;\n\n if (this.settings.yAxis.gridlines) {\n var yLineAxis = d3.axisLeft(y);\n\n this.drawingArea\n .append('g')\n .attr('class', 'y grid-line')\n .attr('transform', 'translate(0 , 0)')\n .call(\n yLineAxis\n .tickSize(-this.width, 0)\n .tickFormat('')\n .tickValues(this.getYTickValues())\n .ticks(yTicks)\n );\n }\n\n // Line\n\n var line = d3\n .line()\n .x(function (d) {\n return x(d[0]);\n })\n .y(function (d) {\n return y(d[1]);\n });\n\n this.drawingArea\n .append('g')\n .attr('class', 'chart-line')\n .append('path')\n .datum(this.dataTable.rows)\n .style('fill', 'none')\n .style('stroke', this.settings.colors[0])\n .style('stroke-width', '3px')\n .attr('d', line);\n\n // Area\n\n var area = d3\n .area()\n .x(function (d) {\n return x(d[0]);\n })\n .y0(this.height)\n .y1(function (d) {\n return y(d[1]);\n });\n\n this.drawingArea\n .append('g')\n .attr('class', 'chart-area')\n .append('path')\n .datum(this.dataTable.rows)\n .style('fill', this.settings.colors[0])\n .style('fill-opacity', '0.3')\n .attr('d', area);\n\n // Plots\n\n if (this.settings.plots) {\n this.drawingArea\n .append('g')\n .attr('class', 'plots')\n .selectAll('circle')\n .data(this.dataTable.rows)\n .enter()\n .append('circle')\n .style('fill', this.settings.colors[0])\n .attr('class', (d, index) => `plot plot-${index}`)\n .attr('r', 4)\n .attr('cx', (d) => x(d[0]))\n .attr('cy', (d) => y(d[1]));\n }\n },\n\n drawTipTriggers: function () {\n if (this.settings.tips) {\n if (!this.tip) {\n this.tip = new Craft.charts.Tip(this.$chart);\n }\n\n // Define xAxisTickInterval\n\n var chartMargin = this.getChartMargin();\n var tickSizeOuter = 6;\n var length =\n this.drawingArea.select('.x path.domain').node().getTotalLength() -\n chartMargin.left -\n chartMargin.right -\n tickSizeOuter * 2;\n var xAxisTickInterval = length / (this.dataTable.rows.length - 1);\n\n // Tip trigger width\n\n var tipTriggerWidth = Math.max(0, xAxisTickInterval);\n\n // Draw triggers\n\n var x = this.getX(true);\n var y = this.getY();\n\n this.drawingArea\n .append('g')\n .attr('class', 'tip-triggers')\n .selectAll('rect')\n .data(this.dataTable.rows)\n .enter()\n .append('rect')\n .attr('class', 'tip-trigger')\n .style('fill', 'transparent')\n .style('fill-opacity', '1')\n .attr('width', tipTriggerWidth)\n .attr('height', this.height)\n .attr('x', (d) => x(d[0]) - tipTriggerWidth / 2)\n .on('mouseover', (d, index) => {\n // Expand plot\n\n this.drawingArea.select('.plot-' + index).attr('r', 5);\n\n // Set tip content\n\n var $content = $('<div />');\n var $xValue = $('<div class=\"x-value\" />').appendTo($content);\n var $yValue = $('<div class=\"y-value\" />').appendTo($content);\n\n $xValue.html(this.getXFormatter()(d[0]));\n $yValue.html(this.getYFormatter()(d[1]));\n\n var content = $content.get(0);\n\n this.tip.setContent(content);\n\n // Set tip position\n\n var margin = this.getChartMargin();\n\n var offset = 24;\n var top = y(d[1]) + offset;\n var left;\n\n if (this.orientation !== 'rtl') {\n left = x(d[0]) + margin.left + offset;\n\n var calcLeft =\n this.$chart.offset().left + left + this.tip.$tip.width();\n var maxLeft =\n this.$chart.offset().left + this.$chart.width() - offset;\n\n if (calcLeft > maxLeft) {\n left = x(d[0]) - (this.tip.$tip.width() + offset);\n }\n } else {\n left = x(d[0]) - (this.tip.$tip.width() + margin.left + offset);\n }\n\n if (left < 0) {\n left = x(d[0]) + margin.left + offset;\n }\n\n var position = {\n top: top,\n left: left,\n };\n\n this.tip.setPosition(position);\n\n // Show tip\n\n this.tip.show();\n })\n .on('mouseout', (d, index) => {\n // Unexpand Plot\n this.drawingArea.select('.plot-' + index).attr('r', 4);\n\n // Hide tip\n this.tip.hide();\n });\n }\n },\n\n getChartMargin: function () {\n var margin = this.settings.margin;\n\n // Estimate the max width of y ticks and set it as the left margin\n\n var values = this.getYTickValues();\n var yTicksMaxWidth = 0;\n\n $.each(values, (key, value) => {\n var characterWidth = 8;\n\n var formatter = this.getYFormatter();\n\n var formattedValue = formatter(value);\n var computedTickWidth = formattedValue.length * characterWidth;\n\n if (computedTickWidth > yTicksMaxWidth) {\n yTicksMaxWidth = computedTickWidth;\n }\n });\n\n yTicksMaxWidth += 10;\n\n margin.left = yTicksMaxWidth;\n\n return margin;\n },\n\n getX: function (padded) {\n var xDomainMin = d3.min(this.dataTable.rows, function (d) {\n return d[0];\n });\n\n var xDomainMax = d3.max(this.dataTable.rows, function (d) {\n return d[0];\n });\n\n var xDomain = [xDomainMin, xDomainMax];\n\n if (this.orientation === 'rtl') {\n xDomain = [xDomainMax, xDomainMin];\n }\n\n var left = 0;\n var right = 0;\n\n if (padded) {\n left = 0;\n right = 0;\n }\n\n var x = d3.scaleTime().range([left, this.width - right]);\n\n x.domain(xDomain);\n\n return x;\n },\n\n getY: function () {\n var yDomain = [0, this.getYMaxValue()];\n\n var y = d3.scaleLinear().range([this.height, 0]);\n\n y.domain(yDomain);\n\n return y;\n },\n\n getXFormatter: function () {\n var formatter;\n\n if (this.settings.xAxis.formatter !== $.noop) {\n formatter = this.settings.xAxis.formatter(this);\n } else {\n formatter = Craft.charts.utils.getTimeFormatter(\n this.timeFormatLocale,\n this.settings\n );\n }\n\n return formatter;\n },\n\n getYFormatter: function () {\n var formatter;\n\n if (this.settings.yAxis.formatter !== $.noop) {\n formatter = this.settings.yAxis.formatter(this);\n } else {\n formatter = Craft.charts.utils.getNumberFormatter(\n this.formatLocale,\n this.dataTable.columns[1].type,\n this.settings\n );\n }\n\n return formatter;\n },\n\n getYMaxValue: function () {\n return d3.max(this.dataTable.rows, function (d) {\n return d[1];\n });\n },\n\n getYTickValues: function () {\n var maxValue = this.getYMaxValue();\n\n if (maxValue > 1) {\n return [maxValue / 2, maxValue];\n } else {\n return [0, maxValue];\n }\n },\n },\n {\n defaults: {\n chartClass: 'area',\n margin: {top: 25, right: 5, bottom: 25, left: 0},\n plots: true,\n tips: true,\n xAxis: {\n gridlines: false,\n showAxis: true,\n formatter: $.noop,\n },\n yAxis: {\n gridlines: true,\n showAxis: false,\n formatter: $.noop,\n },\n },\n }\n);\n\n// ---------------------------------------------------------------------\n\n/**\n * Class Craft.charts.Utils\n */\nCraft.charts.utils = {\n getDuration: function (seconds) {\n var secondsNum = parseInt(seconds, 10);\n\n var duration = {\n hours: Math.floor(secondsNum / 3600),\n minutes: Math.floor((secondsNum - duration.hours * 3600) / 60),\n seconds: secondsNum - duration.hours * 3600 - duration.minutes * 60,\n };\n\n if (duration.hours < 10) {\n duration.hours = `0${duration.hours}`;\n }\n\n if (duration.minutes < 10) {\n duration.minutes = `0${duration.minutes}`;\n }\n\n if (duration.seconds < 10) {\n duration.seconds = `0${duration.seconds}`;\n }\n\n return `${duration.hours}:${duration.minutes}:${duration.seconds}`;\n },\n\n getTimeFormatter: function (timeFormatLocale, chartSettings) {\n switch (chartSettings.dataScale) {\n case 'year':\n return timeFormatLocale.format('%Y');\n\n case 'month':\n return timeFormatLocale.format(\n chartSettings.formats.shortDateFormats.month\n );\n\n case 'hour':\n return timeFormatLocale.format(\n `${chartSettings.formats.shortDateFormats.day} %H:00:00`\n );\n\n default:\n return timeFormatLocale.format(\n chartSettings.formats.shortDateFormats.day\n );\n }\n },\n\n getNumberFormatter: function (formatLocale, type, chartSettings) {\n switch (type) {\n case 'currency':\n return formatLocale.format(chartSettings.formats.currencyFormat);\n\n case 'percent':\n return formatLocale.format(chartSettings.formats.percentFormat);\n\n case 'time':\n return Craft.charts.utils.getDuration;\n\n case 'number':\n return formatLocale.format(chartSettings.formats.numberFormat);\n }\n },\n};\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Color input\n */\nCraft.ColorInput = Garnish.Base.extend(\n {\n $container: null,\n $input: null,\n $colorContainer: null,\n $colorPreview: null,\n $colorInput: null,\n\n init: function (container) {\n this.$container = $(container);\n this.$input = this.$container.find('.color-input');\n this.$colorContainer = this.$container.children('.color');\n this.$colorPreview = this.$colorContainer.children('.color-preview');\n\n this.createColorInput();\n this.handleTextChange();\n\n this.addListener(this.$input, 'input', 'handleTextChange');\n },\n\n createColorInput: function () {\n var input = document.createElement('input');\n input.setAttribute('type', 'color');\n\n if (input.type !== 'color') {\n // The browser doesn't support input[type=color]\n return;\n }\n\n this.$colorContainer.removeClass('static');\n this.$colorInput = $(input)\n .addClass('color-preview-input')\n .attr({\n 'aria-controls': this.$input.attr('id'),\n 'aria-label': Craft.t('app', 'Color picker'),\n })\n .appendTo(this.$colorPreview);\n\n this.addListener(this.$colorInput, 'click', function (ev) {\n ev.stopPropagation();\n });\n\n this.addListener(this.$colorContainer, 'click', function () {\n this.$colorInput.trigger('click');\n });\n\n this.addListener(this.$colorInput, 'input', 'updateColor');\n },\n\n updateColor: function () {\n this.$input.val(this.$colorInput.val());\n this.handleTextChange();\n },\n\n handleTextChange: function () {\n let val = this.$input.val();\n\n if (val !== (val = Craft.trim(val))) {\n this.$input.val(val);\n }\n\n // Chop off the #\n if (val.length && val[0] === '#') {\n val = val.substring(1);\n this.$input.val(val);\n }\n\n // If empty, set the preview to transparent\n if (!val.length) {\n this.$colorPreview.css('background-color', '');\n return;\n }\n\n // Now normalize it for the UI stuff\n if (val.length === 3) {\n val = val[0].repeat(2) + val[1].repeat(2) + val[2].repeat(2);\n }\n\n if (val.match(/^[0-9a-f]{6}$/i)) {\n this.$colorPreview.css('background-color', `#${val}`);\n if (this.$colorInput) {\n this.$colorInput.val(`#${val}`);\n }\n } else {\n this.$colorPreview.css('background-color', '');\n }\n },\n },\n {\n _browserSupportsColorInputs: null,\n\n doesBrowserSupportColorInputs: function () {\n if (Craft.ColorInput._browserSupportsColorInputs === null) {\n }\n\n return Craft.ColorInput._browserSupportsColorInputs;\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * CP Screen Slideout\n */\nCraft.CpScreenSlideout = Craft.Slideout.extend(\n {\n action: null,\n\n namespace: null,\n\n showingLoadSpinner: false,\n hasTabs: false,\n hasCpLink: false,\n hasSidebar: false,\n\n $header: null,\n $toolbar: null,\n $tabContainer: null,\n $loadSpinner: null,\n $editLink: null,\n $sidebarBtn: null,\n\n $body: null,\n $content: null,\n\n $sidebar: null,\n\n $footer: null,\n $noticeContainer: null,\n $cancelBtn: null,\n $saveBtn: null,\n\n tabManager: null,\n showingSidebar: false,\n\n cancelToken: null,\n ignoreFailedRequest: false,\n fieldsWithErrors: null,\n\n init: function (action, settings) {\n this.action = action;\n this.setSettings(settings, Craft.CpScreenSlideout.defaults);\n\n this.fieldsWithErrors = [];\n\n // Header\n this.$header = $('<header/>', {class: 'pane-header'});\n this.$toolbar = $('<div/>', {class: 'so-toolbar'}).appendTo(this.$header);\n this.$tabContainer = $('<div/>', {class: 'pane-tabs'}).appendTo(\n this.$toolbar\n );\n this.$loadSpinner = $('<div/>', {\n class: 'spinner',\n title: Craft.t('app', 'Loading'),\n 'aria-label': Craft.t('app', 'Loading'),\n }).appendTo(this.$toolbar);\n this.$editLink = $('<a/>', {\n target: '_blank',\n class: 'btn header-btn hidden',\n title: Craft.t('app', 'Open the full edit page in a new tab'),\n 'aria-label': Craft.t('app', 'Open the full edit page in a new tab'),\n 'data-icon': 'external',\n }).appendTo(this.$toolbar);\n this.$sidebarBtn = $('<button/>', {\n type: 'button',\n class: 'btn header-btn hidden sidebar-btn',\n title: Craft.t('app', 'Show sidebar'),\n 'aria-label': Craft.t('app', 'Show sidebar'),\n 'data-icon': `sidebar-${Garnish.ltr ? 'right' : 'left'}`,\n 'aria-expanded': 'false',\n }).appendTo(this.$toolbar);\n\n this.addListener(this.$sidebarBtn, 'click', (ev) => {\n ev.preventDefault();\n if (!this.showingSidebar) {\n this.showSidebar();\n } else {\n this.hideSidebar();\n }\n });\n\n // Body\n this.$body = $('<div/>', {class: 'so-body'});\n\n // Content\n this.$content = $('<div/>', {class: 'so-content'}).appendTo(this.$body);\n\n // Sidebar\n this.$sidebar = $('<div/>', {\n class: 'so-sidebar details hidden',\n }).appendTo(this.$body);\n\n // Footer\n this.$footer = $('<div/>', {class: 'so-footer hidden'});\n this.$noticeContainer = $('<div/>', {class: 'so-notice'}).appendTo(\n this.$footer\n );\n $('<div/>', {class: 'flex-grow'}).appendTo(this.$footer);\n const $btnContainer = $('<div/>', {class: 'flex flex-nowrap'}).appendTo(\n this.$footer\n );\n this.$cancelBtn = $('<button/>', {\n type: 'button',\n class: 'btn',\n text: Craft.t('app', 'Cancel'),\n }).appendTo($btnContainer);\n this.$saveBtn = Craft.ui\n .createSubmitButton({\n label: Craft.t('app', 'Save'),\n spinner: true,\n })\n .appendTo($btnContainer);\n\n let $contents = this.$header.add(this.$body).add(this.$footer);\n\n this.base($contents, {\n containerElement: 'form',\n containerAttributes: {\n id: `cp-screen-${Math.floor(Math.random() * 100000000)}`,\n action: '',\n method: 'post',\n novalidate: '',\n class: 'cp-screen',\n },\n closeOnEsc: false,\n closeOnShadeClick: false,\n });\n\n this.$container.data('cpScreen', this);\n this.on('beforeClose', () => {\n this.hideSidebar();\n });\n\n // Register shortcuts & events\n Garnish.uiLayerManager.registerShortcut(\n {\n keyCode: Garnish.S_KEY,\n ctrl: true,\n },\n (ev) => {\n this.handleSubmit(ev);\n }\n );\n Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n this.closeMeMaybe();\n });\n this.addListener(this.$cancelBtn, 'click', () => {\n this.closeMeMaybe();\n });\n this.addListener(this.$shade, 'click', () => {\n this.closeMeMaybe();\n });\n this.addListener(this.$container, 'click', (ev) => {\n const $target = $(event.target);\n\n if (\n this.showingSidebar &&\n !$target.closest(this.$sidebarBtn).length &&\n !$target.closest(this.$sidebar).length\n ) {\n this.hideSidebar();\n }\n });\n this.addListener(this.$container, 'submit', 'handleSubmit');\n\n this.load();\n },\n\n /**\n * @param {Object} [data={}]\n * @param {boolean} [refreshInitialData=true]\n * @returns {Promise}\n */\n load: function (data, refreshInitialData) {\n return new Promise((resolve, reject) => {\n this.trigger('beforeLoad');\n this.showLoadSpinner();\n\n if (this.cancelToken) {\n this.ignoreFailedRequest = true;\n this.cancelToken.cancel();\n }\n\n this.cancelToken = axios.CancelToken.source();\n\n Craft.sendActionRequest(\n 'GET',\n this.action,\n $.extend(\n {\n params: Object.assign({}, this.getParams(), this.settings.params),\n cancelToken: this.cancelToken.token,\n headers: {\n 'X-Craft-Container-Id': this.$container.attr('id'),\n },\n },\n this.settings.requestOptions\n )\n )\n .then((response) => {\n this.update(response.data)\n .then(() => {\n if (refreshInitialData !== false) {\n this.$container.data('delta-names', response.data.deltaNames);\n this.$container.data(\n 'initial-delta-values',\n response.data.initialDeltaValues\n );\n this.$container.data(\n 'initialSerializedValue',\n this.$container.serialize()\n );\n }\n resolve();\n })\n .catch((e) => {\n reject(e);\n });\n })\n .catch((e) => {\n if (!this.ignoreFailedRequest) {\n Craft.cp.displayError();\n reject(e);\n }\n this.ignoreFailedRequest = false;\n })\n .finally(() => {\n this.hideLoadSpinner();\n this.cancelToken = null;\n });\n });\n },\n\n getParams: function () {\n return {};\n },\n\n updateHeaderVisibility: function () {\n // Should the header be shown regardless of viewport size?\n const forceShow =\n this.settings.showHeader ||\n this.hasTabs ||\n this.hasCpLink ||\n this.showingLoadSpinner;\n\n if (forceShow || this.hasSidebar) {\n this.$header.removeClass('hidden');\n } else {\n this.$header.addClass('hidden');\n }\n\n if (forceShow) {\n this.$header.addClass('so-visible');\n } else {\n this.$header.removeClass('so-visible');\n }\n },\n\n showLoadSpinner: function () {\n this.$loadSpinner.removeClass('hidden');\n this.showingLoadSpinner = true;\n this.updateHeaderVisibility();\n },\n\n hideLoadSpinner: function () {\n this.$loadSpinner.addClass('hidden');\n this.showingLoadSpinner = false;\n this.updateHeaderVisibility();\n },\n\n /**\n * @param {Object} data\n * @returns {Promise}\n */\n update: function (data) {\n return new Promise((resolve) => {\n this.namespace = data.namespace;\n this.$content.html(data.content);\n\n if (data.submitButtonLabel) {\n this.$saveBtn.text(data.submitButtonLabel);\n }\n\n this.updateTabs(data.tabs);\n\n if (data.formAttributes) {\n Craft.setElementAttributes(this.$container, data.formAttributes);\n }\n\n if (data.editUrl) {\n this.$editLink.removeClass('hidden').attr('href', data.editUrl);\n this.hasCpLink = true;\n } else {\n this.$editLink.addClass('hidden');\n this.hasCpLink = false;\n }\n\n if (data.sidebar) {\n this.$container.addClass('has-sidebar');\n this.$sidebarBtn.removeClass('hidden');\n this.$sidebar.html(data.sidebar);\n\n // Open outbound links in new windows\n this.$sidebar.find('a').each(function () {\n if (\n this.hostname.length &&\n typeof $(this).attr('target') === 'undefined'\n ) {\n $(this).attr('target', '_blank');\n }\n });\n\n this.hasSidebar = true;\n } else {\n this.$container.removeClass('has-sidebar');\n this.$sidebarBtn.addClass('hidden');\n this.$sidebar.addClass('hidden').html('');\n this.hasSidebar = false;\n }\n\n if (data.notice) {\n this.$noticeContainer.html(data.notice);\n } else {\n this.$noticeContainer.empty();\n }\n\n this.updateHeaderVisibility();\n this.$footer.removeClass('hidden');\n\n Garnish.requestAnimationFrame(() => {\n Craft.appendHeadHtml(data.headHtml);\n Craft.appendBodyHtml(data.bodyHtml);\n\n Craft.initUiElements(this.$content);\n new Craft.ElementThumbLoader().load($(this.$content));\n\n if (data.sidebar) {\n Craft.initUiElements(this.$sidebar);\n new Craft.ElementThumbLoader().load(this.$sidebar);\n }\n\n if (!Garnish.isMobileBrowser()) {\n Craft.setFocusWithin(this.$content);\n }\n\n resolve();\n this.trigger('load');\n });\n });\n },\n\n updateTabs: function (tabs) {\n if (this.tabManager) {\n this.tabManager.destroy();\n this.tabManager = null;\n this.$tabContainer.html('');\n }\n\n this.hasTabs = !!tabs;\n\n if (this.hasTabs) {\n const $tabContainer = $(tabs);\n this.$tabContainer.replaceWith($tabContainer);\n this.$tabContainer = $tabContainer;\n this.tabManager = new Craft.Tabs(this.$tabContainer);\n this.tabManager.on('deselectTab', (ev) => {\n $(ev.$tab.attr('href')).addClass('hidden');\n });\n this.tabManager.on('selectTab', (ev) => {\n $(ev.$tab.attr('href')).removeClass('hidden');\n Garnish.$win.trigger('resize');\n this.$body.trigger('scroll');\n });\n }\n },\n\n showSidebar: function () {\n if (this.showingSidebar) {\n return;\n }\n\n this.$body.scrollTop(0).addClass('no-scroll');\n\n this.$sidebar\n .off('transitionend.so')\n .css(this._closedSidebarStyles())\n .removeClass('hidden');\n\n // Hack to force CSS animations\n this.$sidebar[0].offsetWidth;\n\n this.$sidebar.css(this._openedSidebarStyles());\n\n if (!Garnish.isMobileBrowser()) {\n this.$sidebar.one('transitionend.so', () => {\n Craft.setFocusWithin(this.$sidebar);\n });\n }\n\n Craft.trapFocusWithin(this.$sidebar);\n\n this.$sidebarBtn.addClass('active').attr({\n 'aria-expanded': 'true',\n });\n\n Garnish.$win.trigger('resize');\n this.$sidebar.trigger('scroll');\n\n Garnish.uiLayerManager.addLayer();\n Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n this.hideSidebar();\n });\n\n this.showingSidebar = true;\n },\n\n hideSidebar: function () {\n if (!this.showingSidebar) {\n return;\n }\n\n this.$body.removeClass('no-scroll');\n\n this.$sidebar\n .off('transitionend.so')\n .css(this._closedSidebarStyles())\n .one('transitionend.so', () => {\n this.$sidebar.addClass('hidden');\n this.$sidebarBtn.focus();\n });\n\n this.$sidebarBtn.removeClass('active').attr({\n 'aria-expanded': 'false',\n });\n\n Garnish.uiLayerManager.removeLayer();\n\n this.showingSidebar = false;\n },\n\n _openedSidebarStyles: function () {\n return {\n [Garnish.ltr ? 'right' : 'left']: '0',\n };\n },\n\n _closedSidebarStyles: function () {\n return {\n [Garnish.ltr ? 'right' : 'left']: '-350px',\n };\n },\n\n showSubmitSpinner: function () {\n this.$saveBtn.addClass('loading');\n },\n\n hideSubmitSpinner: function () {\n this.$saveBtn.removeClass('loading');\n },\n\n handleSubmit: function (ev) {\n ev.preventDefault();\n this.submit();\n },\n\n submit: function () {\n this.showSubmitSpinner();\n\n const data = Craft.findDeltaData(\n this.$container.data('initialSerializedValue'),\n this.$container.serialize(),\n this.$container.data('delta-names'),\n null,\n this.$container.data('initial-delta-values')\n );\n\n Craft.sendActionRequest('POST', null, {\n data,\n headers: {\n 'X-Craft-Namespace': this.namespace,\n },\n })\n .then((response) => {\n this.handleSubmitResponse(response);\n })\n .catch((error) => {\n this.handleSubmitError(error);\n })\n .finally(() => {\n this.hideSubmitSpinner();\n });\n },\n\n handleSubmitResponse: function (response) {\n this.clearErrors();\n const data = response.data || {};\n if (data.message) {\n Craft.cp.displaySuccess(data.message, data.notificationSettings);\n }\n this.trigger('submit', {\n response: response,\n data: (data.modelName && data[data.modelName]) || {},\n });\n if (this.settings.closeOnSubmit) {\n this.close();\n }\n },\n\n handleSubmitError: function (error) {\n if (\n !error.isAxiosError ||\n !error.response ||\n !error.response.status === 400\n ) {\n Craft.cp.displayError();\n throw error;\n }\n\n const data = error.response.data || {};\n Craft.cp.displayError(data.message);\n if (data.errors) {\n this.showErrors(data.errors);\n }\n },\n\n /**\n * @param {string[]} errors\n */\n showErrors: function (errors) {\n this.clearErrors();\n\n Object.entries(errors).forEach(([name, fieldErrors]) => {\n const $field = this.$container.find(`[data-attribute=\"${name}\"]`);\n if ($field) {\n Craft.ui.addErrorsToField($field, fieldErrors);\n this.fieldsWithErrors.push($field);\n }\n });\n },\n\n clearErrors: function () {\n this.fieldsWithErrors.forEach(($field) => {\n Craft.ui.clearErrorsFromField($field);\n });\n },\n\n isDirty: function () {\n return (\n typeof this.$container.data('initialSerializedValue') !== 'undefined' &&\n this.$container.serialize() !==\n this.$container.data('initialSerializedValue')\n );\n },\n\n closeMeMaybe: function () {\n if (!this.isOpen) {\n return;\n }\n\n if (\n !this.isDirty() ||\n confirm(\n Craft.t(\n 'app',\n 'Are you sure you want to close this screen? Any changes will be lost.'\n )\n )\n ) {\n this.close();\n }\n },\n\n close: function () {\n this.base();\n\n if (this.cancelToken) {\n this.ignoreFailedRequest = true;\n this.cancelToken.cancel();\n }\n },\n },\n {\n defaults: {\n params: {},\n requestOptions: {},\n showHeader: null,\n closeOnSubmit: true,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n\n// Use old jQuery prefilter behavior\n// see https://jquery.com/upgrade-guide/3.5/\nvar rxhtmlTag =\n /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi;\njQuery.htmlPrefilter = function (html) {\n return html.replace(rxhtmlTag, '<$1></$2>');\n};\n\n// Set all the standard Craft.* stuff\n$.extend(Craft, {\n navHeight: 48,\n\n /**\n * @callback indexKeyCallback\n * @param {Object} currentValue\n * @param {number} [index]\n * @returns {string}\n */\n /**\n * Indexes an array of objects by a specified key\n *\n * @param {Object[]} arr\n * @param {(string|indexKeyCallback)} key\n */\n index: function (arr, key) {\n if (!$.isArray(arr)) {\n throw 'The first argument passed to Craft.index() must be an array.';\n }\n\n return arr.reduce((index, obj, i) => {\n index[typeof key === 'string' ? obj[key] : key(obj, i)] = obj;\n return index;\n }, {});\n },\n\n /**\n * Groups an array of objects by a specified key\n *\n * @param {Object[]} arr\n * @param {(string|indexKeyCallback)} key\n */\n group: function (arr, key) {\n if (!$.isArray(arr)) {\n throw 'The first argument passed to Craft.group() must be an array.';\n }\n\n let index = {};\n\n return arr.reduce((grouped, obj, i) => {\n const thisKey = typeof key === 'string' ? obj[key] : key(obj, i);\n if (!index.hasOwnProperty(thisKey)) {\n index[thisKey] = [[], thisKey];\n grouped.push(index[thisKey]);\n }\n index[thisKey][0].push(obj);\n return grouped;\n }, []);\n },\n\n /**\n * Get a translated message.\n *\n * @param {string} category\n * @param {string} message\n * @param {Object} params\n * @returns {string}\n */\n t: function (category, message, params) {\n if (\n typeof Craft.translations[category] !== 'undefined' &&\n typeof Craft.translations[category][message] !== 'undefined'\n ) {\n message = Craft.translations[category][message];\n }\n\n if (params) {\n return this.formatMessage(message, params);\n }\n\n return message;\n },\n\n formatMessage: function (pattern, args) {\n let tokens;\n if ((tokens = this._tokenizePattern(pattern)) === false) {\n throw 'Message pattern is invalid.';\n }\n for (let i = 0; i < tokens.length; i++) {\n let token = tokens[i];\n if (typeof token === 'object') {\n if ((tokens[i] = this._parseToken(token, args)) === false) {\n throw 'Message pattern is invalid.';\n }\n }\n }\n return tokens.join('');\n },\n\n _tokenizePattern: function (pattern) {\n let depth = 1,\n start,\n pos;\n // Get an array of the string characters (factoring in 3+ byte chars)\n const chars = [...pattern];\n if ((start = pos = chars.indexOf('{')) === -1) {\n return [pattern];\n }\n let tokens = [chars.slice(0, pos).join('')];\n while (true) {\n let open = chars.indexOf('{', pos + 1);\n let close = chars.indexOf('}', pos + 1);\n if (open === -1) {\n open = false;\n }\n if (close === -1) {\n close = false;\n }\n if (open === false && close === false) {\n break;\n }\n if (open === false) {\n open = chars.length;\n }\n if (close > open) {\n depth++;\n pos = open;\n } else {\n depth--;\n pos = close;\n }\n if (depth === 0) {\n tokens.push(\n chars\n .slice(start + 1, pos)\n .join('')\n .split(',', 3)\n );\n start = pos + 1;\n tokens.push(chars.slice(start, open).join(''));\n start = open;\n }\n\n if (depth !== 0 && (open === false || close === false)) {\n break;\n }\n }\n if (depth !== 0) {\n return false;\n }\n\n return tokens;\n },\n\n _parseToken: function (token, args) {\n // parsing pattern based on ICU grammar:\n // http://icu-project.org/apiref/icu4c/classMessageFormat.html#details\n const param = Craft.trim(token[0]);\n if (typeof args[param] === 'undefined') {\n return `{${token.join(',')}}`;\n }\n const arg = args[param];\n const type =\n typeof token[1] !== 'undefined' ? Craft.trim(token[1]) : 'none';\n switch (type) {\n case 'number':\n return (() => {\n let format =\n typeof token[2] !== 'undefined' ? Craft.trim(token[2]) : null;\n if (format !== null && format !== 'integer') {\n throw `Message format 'number' is only supported for integer values.`;\n }\n let number = Craft.formatNumber(arg);\n let pos;\n if (format === null && (pos = `${arg}`.indexOf('.')) !== -1) {\n number += `.${arg.substring(pos + 1)}`;\n }\n return number;\n })();\n case 'none':\n return arg;\n case 'select':\n return (() => {\n /* http://icu-project.org/apiref/icu4c/classicu_1_1SelectFormat.html\n selectStyle = (selector '{' message '}')+\n */\n if (typeof token[2] === 'undefined') {\n return false;\n }\n let select = this._tokenizePattern(token[2]);\n let c = select.length;\n let message = false;\n for (let i = 0; i + 1 < c; i++) {\n if (Garnish.isArray(select[i]) || !Garnish.isArray(select[i + 1])) {\n return false;\n }\n let selector = Craft.trim(select[i++]);\n if (\n (message === false && selector === 'other') ||\n selector == arg\n ) {\n message = select[i].join(',');\n }\n }\n if (message === false) {\n return false;\n }\n return this.formatMessage(message, args);\n })();\n case 'plural':\n return (() => {\n /* http://icu-project.org/apiref/icu4c/classicu_1_1PluralFormat.html\n pluralStyle = [offsetValue] (selector '{' message '}')+\n offsetValue = \"offset:\" number\n selector = explicitValue | keyword\n explicitValue = '=' number // adjacent, no white space in between\n keyword = [^[[:Pattern_Syntax:][:Pattern_White_Space:]]]+\n message: see MessageFormat\n */\n if (typeof token[2] === 'undefined') {\n return false;\n }\n let plural = this._tokenizePattern(token[2]);\n const c = plural.length;\n let message = false;\n let offset = 0;\n for (let i = 0; i + 1 < c; i++) {\n if (\n typeof plural[i] === 'object' ||\n typeof plural[i + 1] !== 'object'\n ) {\n return false;\n }\n let selector = Craft.trim(plural[i++]);\n let selectorChars = [...selector];\n\n if (i === 1 && selector.substring(0, 7) === 'offset:') {\n let pos = [...selector.replace(/[\\n\\r\\t]/g, ' ')].indexOf(' ', 7);\n if (pos === -1) {\n throw 'Message pattern is invalid.';\n }\n offset = parseInt(\n Craft.trim(selectorChars.slice(7, pos).join(''))\n );\n selector = Craft.trim(\n selectorChars\n .slice(pos + 1, pos + 1 + selectorChars.length)\n .join('')\n );\n }\n if (\n (message === false && selector === 'other') ||\n (selector[0] === '=' &&\n parseInt(\n selectorChars.slice(1, 1 + selectorChars.length).join('')\n ) === arg) ||\n (selector === 'one' && arg - offset === 1)\n ) {\n message = (\n typeof plural[i] === 'string' ? [plural[i]] : plural[i]\n )\n .map((p) => {\n return p.replace('#', arg - offset);\n })\n .join(',');\n }\n }\n if (message === false) {\n return false;\n }\n return this.formatMessage(message, args);\n })();\n default:\n throw `Message format '${type}' is not supported.`;\n }\n },\n\n formatDate: function (date) {\n if (typeof date !== 'object') {\n date = new Date(date);\n }\n\n return $.datepicker.formatDate(Craft.datepickerOptions.dateFormat, date);\n },\n\n /**\n * Formats a number.\n *\n * @param {string} number\n * @param {string} [format] D3 format\n * @returns {string}\n */\n formatNumber: function (number, format) {\n if (typeof format == 'undefined') {\n format = ',.0f';\n }\n\n var formatter = d3.formatLocale(d3FormatLocaleDefinition).format(format);\n\n return formatter(number);\n },\n\n /**\n * @param {string} key\n * @param {boolean} shift\n * @param {boolean} alt\n */\n shortcutText: function (key, shift, alt) {\n if (Craft.clientOs === 'Mac') {\n return (alt ? '⌥' : '') + (shift ? '⇧' : '') + '⌘' + key;\n }\n return 'Ctrl+' + (alt ? 'Alt+' : '') + (shift ? 'Shift+' : '') + key;\n },\n\n /**\n * Escapes some HTML.\n *\n * @param {string} str\n * @returns {string}\n */\n escapeHtml: function (str) {\n return $('<div/>').text(str).html();\n },\n\n /**\n * Escapes special regular expression characters.\n *\n * @param {string} str\n * @returns {string}\n */\n escapeRegex: function (str) {\n // h/t https://stackoverflow.com/a/9310752\n return str.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n },\n\n /**\n * Returns the text in a string that might contain HTML tags.\n *\n * @param {string} str\n * @returns {string}\n */\n getText: function (str) {\n return $('<div/>').html(str).text();\n },\n\n /**\n * Encodes a URI copmonent. Mirrors PHP's rawurlencode().\n *\n * @param {string} str\n * @returns {string}\n * @see http://stackoverflow.com/questions/1734250/what-is-the-equivalent-of-javascripts-encodeuricomponent-in-php\n */\n encodeUriComponent: function (str) {\n str = encodeURIComponent(str);\n\n var differences = {\n '!': '%21',\n '*': '%2A',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n };\n\n for (var chr in differences) {\n var re = new RegExp('\\\\' + chr, 'g');\n str = str.replace(re, differences[chr]);\n }\n\n return str;\n },\n\n /**\n * Selects the full value of a given text input.\n *\n * @param {(jQuery|HTMLElement|string)} input\n */\n selectFullValue: function (input) {\n var $input = $(input);\n var val = $input.val();\n\n // Does the browser support setSelectionRange()?\n if (typeof $input[0].setSelectionRange !== 'undefined') {\n // Select the whole value\n var length = val.length * 2;\n $input[0].setSelectionRange(0, length);\n } else {\n // Refresh the value to get the cursor positioned at the end\n $input.val(val);\n }\n },\n\n /**\n * Formats an ID out of an input name.\n *\n * @param {string} inputName\n * @returns {string}\n */\n formatInputId: function (inputName) {\n return this.rtrim(inputName.replace(/[^\\w\\-]+/g, '-'), '-');\n },\n\n /**\n * @param {string} [path]\n * @param {(Object|string)} [params]\n * @param {string} [baseUrl]\n * @returns {string}\n */\n getUrl: function (path, params, baseUrl) {\n if (typeof path !== 'string') {\n path = '';\n }\n\n // Normalize the params\n let anchor = null;\n if ($.isPlainObject(params)) {\n if (typeof params['#'] !== 'undefined') {\n anchor = params['#'];\n delete params['#'];\n }\n } else if (typeof params === 'string') {\n let anchorPos = params.indexOf('#');\n if (anchorPos !== -1) {\n anchor = params.substring(anchorPos + 1);\n params = params.substring(0, anchorPos);\n }\n params = Object.fromEntries(new URLSearchParams(params).entries());\n } else {\n params = {};\n }\n\n // Was there already an anchor on the path?\n let anchorPos = path.indexOf('#');\n if (anchorPos !== -1) {\n // Only keep it if the params didn't specify a new anchor\n if (!anchor) {\n anchor = path.substring(anchorPos + 1);\n }\n path = path.substring(0, anchorPos);\n }\n\n // Were there already any query string params in the path?\n let qsPos = path.indexOf('?');\n if (qsPos !== -1) {\n params = $.extend(\n Object.fromEntries(\n new URLSearchParams(path.substring(qsPos + 1)).entries()\n ),\n params\n );\n path = path.substring(0, qsPos);\n }\n\n // Return path if it appears to be an absolute URL.\n if (path.search('://') !== -1 || path[0] === '/') {\n return (\n path +\n (!$.isEmptyObject(params) ? `?${$.param(params)}` : '') +\n (anchor ? `#${anchor}` : '')\n );\n }\n\n path = Craft.trim(path, '/');\n\n // Put it all together\n let url;\n\n if (baseUrl) {\n url = baseUrl;\n\n if (path && Craft.pathParam) {\n // Does baseUrl already contain a path?\n var pathMatch = url.match(\n new RegExp('[&?]' + Craft.escapeRegex(Craft.pathParam) + '=[^&]+')\n );\n if (pathMatch) {\n url = url.replace(\n pathMatch[0],\n Craft.rtrim(pathMatch[0], '/') + '/' + path\n );\n path = '';\n }\n }\n } else {\n url = Craft.baseUrl;\n }\n\n // Does the base URL already have a query string?\n qsPos = url.indexOf('?');\n if (qsPos !== -1) {\n params = $.extend(\n Object.fromEntries(\n new URLSearchParams(url.substring(qsPos + 1)).entries()\n ),\n params\n );\n url = url.substring(0, qsPos);\n }\n\n if (!Craft.omitScriptNameInUrls && path) {\n if (Craft.usePathInfo || !Craft.pathParam) {\n // Make sure that the script name is in the URL\n if (url.search(Craft.scriptName) === -1) {\n url = Craft.rtrim(url, '/') + '/' + Craft.scriptName;\n }\n } else {\n // Move the path into the query string params\n\n // Is the path param already set?\n if (typeof params[Craft.pathParam] !== 'undefined') {\n let basePath = Craft.rtrim(params[Craft.pathParam]);\n path = basePath + (path ? '/' + path : '');\n }\n\n params[Craft.pathParam] = path;\n path = null;\n }\n }\n\n if (path) {\n url = Craft.rtrim(url, '/') + '/' + path;\n }\n\n if (!$.isEmptyObject(params)) {\n url += `?${$.param(params)}`;\n }\n\n if (anchor) {\n url += `#${anchor}`;\n }\n\n return url;\n },\n\n /**\n * @param {string} [path]\n * @param {(Object|string)} [params]\n * @returns {string}\n */\n getCpUrl: function (path, params) {\n return this.getUrl(path, params, Craft.baseCpUrl);\n },\n\n /**\n * @param {string} [path]\n * @param {(Object|string)} [params]\n * @returns {string}\n */\n getSiteUrl: function (path, params) {\n return this.getUrl(path, params, Craft.baseSiteUrl);\n },\n\n /**\n * Returns an action URL.\n *\n * @param {string} action\n * @param {(Object|string)} [params]\n * @returns {string}\n */\n getActionUrl: function (action, params) {\n return Craft.getUrl(action, params, Craft.actionUrl);\n },\n\n /**\n * Redirects the window to a given URL.\n *\n * @param {string} url\n */\n redirectTo: function (url) {\n document.location.href = this.getUrl(url);\n },\n\n /**\n * Replaces the page’s current URL.\n *\n * The location hash will be left intact, unless the given URL specifies one.\n *\n * @param {string} url\n */\n setUrl: function (url) {\n if (typeof history === 'undefined') {\n return;\n }\n\n if (!url.match(/#/)) {\n url += document.location.hash;\n }\n\n history.replaceState({}, '', url);\n },\n\n /**\n * Replaces the page’s current URL based on the given path, leaving the current query string and hash intact.\n *\n * @param {string} path\n */\n setPath: function (path) {\n this.path = path;\n this.setUrl(Craft.getUrl(path, document.location.search));\n },\n\n /**\n * Replaces the page’s current URL based on the given query param name and value, leaving the current URI, other query params, and hash intact.\n *\n * @param {string} name\n * @param {*} value\n */\n setQueryParam(name, value) {\n const baseUrl = document.location.origin + document.location.pathname;\n const params = this.getQueryParams();\n\n if (typeof value !== 'undefined' && value !== null && value !== false) {\n params[name] = value;\n } else {\n delete params[name];\n }\n\n this.setUrl(Craft.getUrl(baseUrl, params));\n },\n\n /**\n * Returns the current URL with a certain page added to it.\n *\n * @param {int} page\n * @returns {string}\n */\n getPageUrl: function (page) {\n let url = document.location.origin + document.location.pathname;\n url = Craft.rtrim(url, '/');\n\n let qs = document.location.search\n ? document.location.search.substring(1)\n : '';\n\n // query string-based pagination?\n if (Craft.pageTrigger[0] === '?') {\n const pageParam = Craft.pageTrigger.substring(1);\n // remove the existing page param\n if (document.location.search) {\n const params = Object.fromEntries(new URLSearchParams(qs).entries());\n delete params[pageParam];\n qs = $.param(params);\n }\n if (page !== 1) {\n qs += (qs !== '' ? '&' : '') + `${pageParam}=${page}`;\n }\n } else {\n // Remove the existing page segment(s)\n url = url.replace(\n new RegExp('/' + Craft.escapeRegex(Craft.pageTrigger) + '\\\\d+$'),\n ''\n );\n\n if (page !== 1) {\n url += `/${Craft.pageTrigger}${page}`;\n }\n }\n\n return url + (qs ? `?${qs}` : '') + document.location.hash;\n },\n\n /**\n * Returns a hidden CSRF token input, if CSRF protection is enabled.\n *\n * @returns {string}\n */\n getCsrfInput: function () {\n if (Craft.csrfTokenName) {\n return (\n '<input type=\"hidden\" name=\"' +\n Craft.csrfTokenName +\n '\" value=\"' +\n Craft.csrfTokenValue +\n '\"/>'\n );\n } else {\n return '';\n }\n },\n\n /**\n * @callback postActionRequestCallback\n * @param {?Object} response\n * @param {string} textStatus\n * @param {Object} jqXHR\n */\n /**\n * Posts an action request to the server.\n *\n * @param {string} action\n * @param {Object} [data]\n * @param {postActionRequestCallback} [callback]\n * @param {Object} [options]\n * @returns {Object}\n * @deprecated in 3.4.6. sendActionRequest() should be used instead\n */\n postActionRequest: function (action, data, callback, options) {\n // Make 'data' optional\n if (typeof data === 'function') {\n options = callback;\n callback = data;\n data = {};\n }\n\n options = options || {};\n\n if (options.contentType && options.contentType.match(/\\bjson\\b/)) {\n if (typeof data === 'object') {\n data = JSON.stringify(data);\n }\n options.contentType = 'application/json; charset=utf-8';\n }\n\n var jqXHR = $.ajax(\n $.extend(\n {\n url: Craft.getActionUrl(action),\n type: 'POST',\n dataType: 'json',\n headers: this._actionHeaders(),\n data: data,\n success: callback,\n error: function (jqXHR, textStatus, errorThrown) {\n // Ignore incomplete requests, likely due to navigating away from the page\n // h/t https://stackoverflow.com/a/22107079/1688568\n if (jqXHR.readyState !== 4) {\n return;\n }\n\n if (jqXHR.status !== 400) {\n if (typeof Craft.cp !== 'undefined') {\n Craft.cp.displayError();\n } else {\n alert(Craft.t('app', 'A server error occurred.'));\n }\n }\n\n if (callback) {\n callback(\n jqXHR.status === 400 ? jqXHR.responseJSON : null,\n textStatus,\n jqXHR\n );\n }\n },\n },\n options\n )\n );\n\n // Call the 'send' callback\n if (typeof options.send === 'function') {\n options.send(jqXHR);\n }\n\n return jqXHR;\n },\n\n _actionHeaders: function () {\n let headers = {\n 'X-Registered-Asset-Bundles': Object.keys(\n Craft.registeredAssetBundles\n ).join(','),\n 'X-Registered-Js-Files': Object.keys(Craft.registeredJsFiles).join(','),\n };\n\n if (Craft.csrfTokenValue) {\n headers['X-CSRF-Token'] = Craft.csrfTokenValue;\n }\n\n return headers;\n },\n\n /**\n * Sends a request to a Craft/plugin action\n * @param {string} method The request action to use ('GET' or 'POST')\n * @param {?string} [action] The action to request\n * @param {Object} [options] Axios request options\n * @returns {Promise}\n * @since 3.4.6\n */\n sendActionRequest: function (method, action, options = {}) {\n if ($.isPlainObject(action)) {\n options = action;\n action = null;\n }\n\n if (method.toUpperCase() === 'POST' && action && options.data) {\n // Avoid conflicting `action` params\n if (typeof options.data === 'string') {\n const namespace =\n options && options.headers && options.headers['X-Craft-Namespace'];\n const actionName = this.namespaceInputName('action', namespace);\n options.data += `&${actionName}=${action}`;\n } else {\n delete options.data.action;\n }\n }\n\n return new Promise((resolve, reject) => {\n options = options ? $.extend({}, options) : {};\n options.method = method;\n options.url = action ? Craft.getActionUrl(action) : Craft.getCpUrl();\n options.headers = $.extend(\n {\n 'X-Requested-With': 'XMLHttpRequest',\n },\n options.headers || {},\n this._actionHeaders()\n );\n options.params = $.extend({}, options.params || {}, {\n // Force Safari to not load from cache\n v: new Date().getTime(),\n });\n axios.request(options).then(resolve).catch(reject);\n });\n },\n\n /**\n * Sends a request to the Craftnet API.\n * @param {string} method The request action to use ('GET' or 'POST')\n * @param {string} uri The API endpoint URI\n * @param {Object} options Axios request options\n * @returns {Promise}\n * @since 3.3.16\n */\n sendApiRequest: function (method, uri, options) {\n return new Promise((resolve, reject) => {\n options = options ? $.extend({}, options) : {};\n let cancelToken = options.cancelToken || null;\n\n // Get the latest headers\n this._getApiHeaders(cancelToken)\n .then((apiHeaders) => {\n // Send the API request\n options.method = method;\n options.baseURL = Craft.baseApiUrl;\n options.url = uri;\n options.headers = $.extend(apiHeaders, options.headers || {});\n options.params = $.extend(\n Craft.apiParams || {},\n options.params || {},\n {\n // Force Safari to not load from cache\n v: new Date().getTime(),\n }\n );\n\n // Force the API to process the Craft headers if this is the first API request\n if (!this._apiHeaders) {\n options.params.processCraftHeaders = 1;\n }\n\n if (Craft.httpProxy) {\n options.proxy = Craft.httpProxy;\n }\n\n axios\n .request(options)\n .then((apiResponse) => {\n // Process the response headers\n this._processApiHeaders(apiResponse.headers, cancelToken)\n .then(() => {\n // Finally return the API response data\n resolve(apiResponse.data);\n })\n .catch(reject);\n })\n .catch(reject);\n })\n .catch(reject);\n });\n },\n\n _loadingApiHeaders: false,\n _apiHeaders: null,\n _apiHeaderWaitlist: [],\n\n /**\n * Returns the headers that should be sent with API requests.\n *\n * @param {Object} [cancelToken]\n * @returns {Promise}\n */\n _getApiHeaders: function (cancelToken) {\n return new Promise((resolve, reject) => {\n // Are we already loading them?\n if (this._loadingApiHeaders) {\n this._apiHeaderWaitlist.push([resolve, reject]);\n return;\n }\n\n // Are the headers already cached?\n if (this._apiHeaders) {\n resolve(this._apiHeaders);\n return;\n }\n\n this._loadingApiHeaders = true;\n this.sendActionRequest('POST', 'app/api-headers', {\n cancelToken: cancelToken,\n })\n .then((response) => {\n // Make sure we even are waiting for these anymore\n if (!this._loadingApiHeaders) {\n reject(e);\n return;\n }\n\n resolve(response.data);\n })\n .catch((e) => {\n this._rejectApiRequests(reject, e);\n });\n });\n },\n\n _processApiHeaders: function (headers, cancelToken) {\n return new Promise((resolve, reject) => {\n // Have we already processed them?\n if (this._apiHeaders) {\n resolve();\n return;\n }\n\n this.sendActionRequest('POST', 'app/process-api-response-headers', {\n data: {\n headers: headers,\n },\n cancelToken: cancelToken,\n })\n .then((response) => {\n // Make sure we even are waiting for these anymore\n if (!this._loadingApiHeaders) {\n reject(e);\n return;\n }\n\n this._apiHeaders = response.data;\n this._loadingApiHeaders = false;\n\n resolve();\n\n // Was anything else waiting for them?\n while (this._apiHeaderWaitlist.length) {\n this._apiHeaderWaitlist.shift()[0](this._apiHeaders);\n }\n })\n .catch((e) => {\n this._rejectApiRequests(reject, e);\n });\n });\n },\n\n _rejectApiRequests: function (reject, e) {\n this._loadingApiHeaders = false;\n reject(e);\n while (this._apiHeaderWaitlist.length) {\n this._apiHeaderWaitlist.shift()[1](e);\n }\n },\n\n /**\n * Clears the cached API headers.\n */\n clearCachedApiHeaders: function () {\n this._apiHeaders = null;\n this._loadingApiHeaders = false;\n\n // Reject anything in the header waitlist\n while (this._apiHeaderWaitlist.length) {\n this._apiHeaderWaitlist.shift()[1]();\n }\n },\n\n /**\n * Requests a URL and downloads the response.\n *\n * @param {string} method the request method to use\n * @param {string} url the URL\n * @param {(string|Object)} [body] the request body, if method = POST\n * @returns {Promise}\n */\n downloadFromUrl: function (method, url, body) {\n return new Promise((resolve, reject) => {\n // h/t https://nehalist.io/downloading-files-from-post-requests/\n let request = new XMLHttpRequest();\n request.open(method, url, true);\n if (typeof body === 'object') {\n request.setRequestHeader(\n 'Content-Type',\n 'application/json; charset=UTF-8'\n );\n body = JSON.stringify(body);\n } else {\n request.setRequestHeader(\n 'Content-Type',\n 'application/x-www-form-urlencoded; charset=UTF-8'\n );\n }\n request.responseType = 'blob';\n\n request.onload = () => {\n // Only handle status code 200\n if (request.status === 200) {\n // Try to find out the filename from the content disposition `filename` value\n let disposition = request.getResponseHeader('content-disposition');\n let matches = /\"([^\"]*)\"/.exec(disposition);\n let filename =\n matches != null && matches[1] ? matches[1] : 'Download';\n\n // Encode the download into an anchor href\n let contentType = request.getResponseHeader('content-type');\n let blob = new Blob([request.response], {type: contentType});\n let link = document.createElement('a');\n link.href = window.URL.createObjectURL(blob);\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n resolve();\n } else {\n reject();\n }\n };\n\n request.send(body);\n });\n },\n\n /**\n * Converts a comma-delimited string into an array.\n *\n * @param {string} str\n * @returns array\n */\n stringToArray: function (str) {\n if (typeof str !== 'string') {\n return str;\n }\n\n var arr = str.split(',');\n for (var i = 0; i < arr.length; i++) {\n arr[i] = $.trim(arr[i]);\n }\n return arr;\n },\n\n /**\n * @callback findDeltaDataCallback\n * @param {string} deltaName\n * @param {Array} params\n */\n /**\n * Compares old and new post data, and removes any values that haven't\n * changed within the given list of delta namespaces.\n *\n * @param {string} oldData\n * @param {string} newData\n * @param {Object} deltaNames\n * @param {findDeltaDataCallback} [callback] Callback function that should be called whenever a new group of modified params has been found\n * @param {Object} [initialDeltaValues] Initial delta values. If undefined, `Craft.initialDeltaValues` will be used.\n * @param {Object} [modifiedDeltaNames} List of delta names that should be considered modified regardles of their param values\n * @returns {string}\n */\n findDeltaData: function (\n oldData,\n newData,\n deltaNames,\n callback,\n initialDeltaValues,\n modifiedDeltaNames\n ) {\n // Make sure oldData and newData are always strings. This is important because further below String.split is called.\n oldData = typeof oldData === 'string' ? oldData : '';\n newData = typeof newData === 'string' ? newData : '';\n deltaNames = $.isArray(deltaNames) ? deltaNames : [];\n initialDeltaValues = $.isPlainObject(initialDeltaValues)\n ? initialDeltaValues\n : {};\n modifiedDeltaNames = $.isArray(modifiedDeltaNames)\n ? modifiedDeltaNames\n : [];\n\n // Sort the delta namespaces from least -> most specific\n deltaNames.sort(function (a, b) {\n if (a.length === b.length) {\n return 0;\n }\n return a.length > b.length ? 1 : -1;\n });\n\n // Group all of the old & new params by namespace\n var groupedOldParams = this._groupParamsByDeltaNames(\n oldData.split('&'),\n deltaNames,\n false,\n initialDeltaValues\n );\n var groupedNewParams = this._groupParamsByDeltaNames(\n newData.split('&'),\n deltaNames,\n true,\n false\n );\n\n // Figure out which of the new params should actually be posted\n var params = groupedNewParams.__root__;\n for (var n = 0; n < deltaNames.length; n++) {\n if (\n Craft.inArray(deltaNames[n], modifiedDeltaNames) ||\n (typeof groupedNewParams[deltaNames[n]] === 'object' &&\n (typeof groupedOldParams[deltaNames[n]] !== 'object' ||\n JSON.stringify(groupedOldParams[deltaNames[n]]) !==\n JSON.stringify(groupedNewParams[deltaNames[n]])))\n ) {\n params = params.concat(groupedNewParams[deltaNames[n]]);\n params.push('modifiedDeltaNames[]=' + deltaNames[n]);\n if (callback) {\n callback(deltaNames[n], groupedNewParams[deltaNames[n]]);\n }\n }\n }\n\n return params.join('&');\n },\n\n /**\n * @param {Object} params\n * @param {Object} deltaNames\n * @param {boolean} withRoot\n * @param {(boolean|Object)} initialValues\n * @returns {Object}\n * @private\n */\n _groupParamsByDeltaNames: function (\n params,\n deltaNames,\n withRoot,\n initialValues\n ) {\n const grouped = {};\n\n if (withRoot) {\n grouped.__root__ = [];\n }\n\n const encodeURIComponentExceptEqualChar = (o) =>\n encodeURIComponent(o).replace('%3D', '=');\n\n params = params.map((p) => decodeURIComponent(p));\n\n paramLoop: for (let p = 0; p < params.length; p++) {\n // loop through the delta names from most -> least specific\n for (let n = deltaNames.length - 1; n >= 0; n--) {\n const paramName = params[p].substring(0, deltaNames[n].length + 1);\n if (\n paramName === deltaNames[n] + '=' ||\n paramName === deltaNames[n] + '['\n ) {\n if (typeof grouped[deltaNames[n]] === 'undefined') {\n grouped[deltaNames[n]] = [];\n }\n grouped[deltaNames[n]].push(\n encodeURIComponentExceptEqualChar(params[p])\n );\n continue paramLoop;\n }\n }\n\n if (withRoot) {\n grouped.__root__.push(encodeURIComponentExceptEqualChar(params[p]));\n }\n }\n\n if (initialValues) {\n const serializeParam = (name, value) => {\n if ($.isArray(value) || $.isPlainObject(value)) {\n value = $.param(value);\n } else if (typeof value === 'string') {\n value = encodeURIComponent(value);\n } else if (value === null) {\n value = '';\n }\n return `${encodeURIComponent(name)}=${value}`;\n };\n\n for (let name in initialValues) {\n if (initialValues.hasOwnProperty(name)) {\n if ($.isPlainObject(initialValues[name])) {\n grouped[name] = [];\n for (let subName in initialValues[name]) {\n if (initialValues[name].hasOwnProperty(subName)) {\n grouped[name].push(\n serializeParam(\n `${name}[${subName}]`,\n initialValues[name][subName]\n )\n );\n }\n }\n } else {\n grouped[name] = [serializeParam(name, initialValues[name])];\n }\n }\n }\n }\n\n return grouped;\n },\n\n /**\n * Expands an object of POST array-style strings into an actual array.\n *\n * @param {Object} arr\n * @returns {Array}\n */\n expandPostArray: function (arr) {\n var expanded = {};\n var i;\n\n for (var key in arr) {\n if (!arr.hasOwnProperty(key)) {\n continue;\n }\n\n var value = arr[key],\n m = key.match(/^(\\w+)(\\[.*)?/),\n keys;\n\n if (m[2]) {\n // Get all of the nested keys\n keys = m[2].match(/\\[[^\\[\\]]*\\]/g);\n\n // Chop off the brackets\n for (i = 0; i < keys.length; i++) {\n keys[i] = keys[i].substring(1, keys[i].length - 1);\n }\n } else {\n keys = [];\n }\n\n keys.unshift(m[1]);\n\n var parentElem = expanded;\n\n for (i = 0; i < keys.length; i++) {\n if (i < keys.length - 1) {\n if (typeof parentElem[keys[i]] !== 'object') {\n // Figure out what this will be by looking at the next key\n if (!keys[i + 1] || parseInt(keys[i + 1]) == keys[i + 1]) {\n parentElem[keys[i]] = [];\n } else {\n parentElem[keys[i]] = {};\n }\n }\n\n parentElem = parentElem[keys[i]];\n } else {\n // Last one. Set the value\n if (!keys[i]) {\n keys[i] = parentElem.length;\n }\n\n parentElem[keys[i]] = value;\n }\n }\n }\n\n return expanded;\n },\n\n /**\n * Creates a form element populated with hidden inputs based on a string of serialized form data.\n *\n * @param {string} data\n * @returns {(jQuery|HTMLElement)}\n */\n createForm: function (data) {\n var $form = $('<form/>', {\n attr: {\n method: 'post',\n action: '',\n 'accept-charset': 'UTF-8',\n },\n });\n\n if (typeof data === 'string') {\n var values = data.split('&');\n var chunks;\n for (var i = 0; i < values.length; i++) {\n chunks = values[i].split('=', 2);\n $('<input/>', {\n type: 'hidden',\n name: decodeURIComponent(chunks[0]),\n value: decodeURIComponent(chunks[1] || ''),\n }).appendTo($form);\n }\n }\n\n return $form;\n },\n\n /**\n * Compares two variables and returns whether they are equal in value.\n * Recursively compares array and object values.\n *\n * @param {*} obj1\n * @param {*} obj2\n * @param {boolean} [sortObjectKeys] Whether object keys should be sorted before being compared. Default is true.\n * @returns boolean\n */\n compare: function (obj1, obj2, sortObjectKeys) {\n // Compare the types\n if (typeof obj1 !== typeof obj2) {\n return false;\n }\n\n if (typeof obj1 === 'object') {\n // Compare the lengths\n if (obj1.length !== obj2.length) {\n return false;\n }\n\n // Is one of them an array but the other is not?\n if (obj1 instanceof Array !== obj2 instanceof Array) {\n return false;\n }\n\n // If they're actual objects (not arrays), compare the keys\n if (!(obj1 instanceof Array)) {\n if (typeof sortObjectKeys === 'undefined' || sortObjectKeys === true) {\n if (\n !Craft.compare(\n Craft.getObjectKeys(obj1).sort(),\n Craft.getObjectKeys(obj2).sort()\n )\n ) {\n return false;\n }\n } else {\n if (\n !Craft.compare(Craft.getObjectKeys(obj1), Craft.getObjectKeys(obj2))\n ) {\n return false;\n }\n }\n }\n\n // Compare each value\n for (var i in obj1) {\n if (!obj1.hasOwnProperty(i)) {\n continue;\n }\n\n if (!Craft.compare(obj1[i], obj2[i])) {\n return false;\n }\n }\n\n // All clear\n return true;\n } else {\n return obj1 === obj2;\n }\n },\n\n /**\n * Returns an array of an object's keys.\n *\n * @param {Object} obj\n * @returns {string[]}\n */\n getObjectKeys: function (obj) {\n var keys = [];\n\n for (var key in obj) {\n if (!obj.hasOwnProperty(key)) {\n continue;\n }\n\n keys.push(key);\n }\n\n return keys;\n },\n\n /**\n * Takes an array or string of chars, and places a backslash before each one, returning the combined string.\n *\n * Userd by ltrim() and rtrim()\n *\n * @param {(string|Object)} chars\n * @returns {string}\n */\n escapeChars: function (chars) {\n if (!Garnish.isArray(chars)) {\n chars = chars.split();\n }\n\n var escaped = '';\n\n for (var i = 0; i < chars.length; i++) {\n escaped += '\\\\' + chars[i];\n }\n\n return escaped;\n },\n\n /**\n * Trim characters off of the beginning of a string.\n *\n * @param {string} str\n * @param {(string|Object)} [chars] The characters to trim off. Defaults to a space if left blank.\n * @returns {string}\n */\n ltrim: function (str, chars) {\n if (!str) {\n return str;\n }\n if (typeof chars === 'undefined') {\n chars = ' \\t\\n\\r\\0\\x0B';\n }\n var re = new RegExp('^[' + Craft.escapeChars(chars) + ']+');\n return str.replace(re, '');\n },\n\n /**\n * Trim characters off of the end of a string.\n *\n * @param {string} str\n * @param {(string|Object)} [chars] The characters to trim off. Defaults to a space if left blank.\n * @returns {string}\n */\n rtrim: function (str, chars) {\n if (!str) {\n return str;\n }\n if (typeof chars === 'undefined') {\n chars = ' \\t\\n\\r\\0\\x0B';\n }\n var re = new RegExp('[' + Craft.escapeChars(chars) + ']+$');\n return str.replace(re, '');\n },\n\n /**\n * Trim characters off of the beginning and end of a string.\n *\n * @param {string} str\n * @param {(string|Object)} [chars] The characters to trim off. Defaults to a space if left blank.\n * @returns {string}\n */\n trim: function (str, chars) {\n str = Craft.ltrim(str, chars);\n str = Craft.rtrim(str, chars);\n return str;\n },\n\n /**\n * Returns whether a string starts with another string.\n *\n * @param {string} str\n * @param {string} substr\n * @returns {boolean}\n */\n startsWith: function (str, substr) {\n return str.substring(0, substr.length) === substr;\n },\n\n /**\n * @callback filterArrayCallback\n * @param {*} value\n * @param {number} index\n * @return {boolean}\n */\n /**\n * Filters an array.\n *\n * @param {Object} arr\n * @param {filterArrayCallback} [callback] A user-defined callback function. If null, we'll just remove any elements that equate to false.\n * @returns {Array}\n */\n filterArray: function (arr, callback) {\n var filtered = [];\n\n for (var i = 0; i < arr.length; i++) {\n var include;\n\n if (typeof callback === 'function') {\n include = callback(arr[i], i);\n } else {\n include = arr[i];\n }\n\n if (include) {\n filtered.push(arr[i]);\n }\n }\n\n return filtered;\n },\n\n /**\n * Returns whether an element is in an array (unlike jQuery.inArray(), which returns the element’s index, or -1).\n *\n * @param {*} elem\n * @param {(Object|Array)} arr\n * @returns {boolean}\n */\n inArray: function (elem, arr) {\n if ($.isPlainObject(arr)) {\n arr = Object.values(arr);\n }\n return arr.includes(elem);\n },\n\n /**\n * Removes an element from an array.\n *\n * @param {*} elem\n * @param {Array} arr\n * @returns {boolean} Whether the element could be found or not.\n */\n removeFromArray: function (elem, arr) {\n var index = $.inArray(elem, arr);\n if (index !== -1) {\n arr.splice(index, 1);\n return true;\n } else {\n return false;\n }\n },\n\n /**\n * Returns the last element in an array.\n *\n * @param {Array} arr\n * @returns {*}\n */\n getLast: function (arr) {\n if (!arr.length) {\n return null;\n } else {\n return arr[arr.length - 1];\n }\n },\n\n /**\n * Makes the first character of a string uppercase.\n *\n * @param {string} str\n * @returns {string}\n */\n uppercaseFirst: function (str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n },\n\n /**\n * Makes the first character of a string lowercase.\n *\n * @param {string} str\n * @returns {string}\n */\n lowercaseFirst: function (str) {\n return str.charAt(0).toLowerCase() + str.slice(1);\n },\n\n parseUrl: function (url) {\n var m = url.match(\n /^(?:(https?):\\/\\/|\\/\\/)([^\\/\\:]*)(?:\\:(\\d+))?(\\/[^\\?]*)?(?:\\?([^#]*))?(#.*)?/\n );\n if (!m) {\n return {};\n }\n return {\n scheme: m[1],\n host: m[2] + (m[3] ? ':' + m[3] : ''),\n hostname: m[2],\n port: m[3] || null,\n path: m[4] || '/',\n query: m[5] || null,\n hash: m[6] || null,\n };\n },\n\n getQueryParams: function () {\n return Object.fromEntries(\n new URLSearchParams(window.location.search).entries()\n );\n },\n\n getQueryParam: function (name) {\n // h/t https://stackoverflow.com/a/901144/1688568\n const params = new Proxy(new URLSearchParams(window.location.search), {\n get: (searchParams, prop) => searchParams.get(prop),\n });\n return params[name];\n },\n\n isSameHost: function (url) {\n var requestUrlInfo = this.parseUrl(document.location.href);\n if (!requestUrlInfo) {\n return false;\n }\n var urlInfo = this.parseUrl(url);\n if (!urlInfo) {\n return false;\n }\n return requestUrlInfo.host === urlInfo.host;\n },\n\n /**\n * Converts a number of seconds into a human-facing time duration.\n */\n secondsToHumanTimeDuration: function (seconds, showSeconds) {\n if (typeof showSeconds === 'undefined') {\n showSeconds = true;\n }\n\n var secondsInWeek = 604800,\n secondsInDay = 86400,\n secondsInHour = 3600,\n secondsInMinute = 60;\n\n var weeks = Math.floor(seconds / secondsInWeek);\n seconds = seconds % secondsInWeek;\n\n var days = Math.floor(seconds / secondsInDay);\n seconds = seconds % secondsInDay;\n\n var hours = Math.floor(seconds / secondsInHour);\n seconds = seconds % secondsInHour;\n\n var minutes;\n\n if (showSeconds) {\n minutes = Math.floor(seconds / secondsInMinute);\n seconds = seconds % secondsInMinute;\n } else {\n minutes = Math.round(seconds / secondsInMinute);\n seconds = 0;\n }\n\n var timeComponents = [];\n\n if (weeks) {\n timeComponents.push(\n weeks +\n ' ' +\n (weeks === 1 ? Craft.t('app', 'week') : Craft.t('app', 'weeks'))\n );\n }\n\n if (days) {\n timeComponents.push(\n days +\n ' ' +\n (days === 1 ? Craft.t('app', 'day') : Craft.t('app', 'days'))\n );\n }\n\n if (hours) {\n timeComponents.push(\n hours +\n ' ' +\n (hours === 1 ? Craft.t('app', 'hour') : Craft.t('app', 'hours'))\n );\n }\n\n if (minutes || (!showSeconds && !weeks && !days && !hours)) {\n timeComponents.push(\n minutes +\n ' ' +\n (minutes === 1 ? Craft.t('app', 'minute') : Craft.t('app', 'minutes'))\n );\n }\n\n if (seconds || (showSeconds && !weeks && !days && !hours && !minutes)) {\n timeComponents.push(\n seconds +\n ' ' +\n (seconds === 1 ? Craft.t('app', 'second') : Craft.t('app', 'seconds'))\n );\n }\n\n return timeComponents.join(', ');\n },\n\n /**\n * Converts extended ASCII characters to ASCII.\n *\n * @param {string} str\n * @param {Object} [charMap]\n * @returns {string}\n */\n asciiString: function (str, charMap) {\n // Normalize NFD chars to NFC\n str = str.normalize('NFC');\n\n var asciiStr = '';\n var char;\n\n for (var i = 0; i < str.length; i++) {\n char = str.charAt(i);\n asciiStr +=\n typeof (charMap || Craft.asciiCharMap)[char] === 'string'\n ? (charMap || Craft.asciiCharMap)[char]\n : char;\n }\n\n return asciiStr;\n },\n\n uuid: function () {\n if (typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n\n // h/t https://stackoverflow.com/a/2117523/1688568\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) =>\n (\n c ^\n (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))\n ).toString(16)\n );\n },\n\n /**\n * @param {string} name\n * @param {string} [namespace]\n * @returns {string}\n */\n namespaceInputName: function (name, namespace) {\n if (!namespace) {\n return name;\n }\n\n return name.replace(/([^'\"\\[\\]]+)([^'\"]*)/, `${namespace}[$1]$2`);\n },\n\n /**\n * @param {string} id\n * @param {string} [namespace]\n * @returns {string}\n */\n namespaceId: function (id, namespace) {\n return Craft.formatInputId(namespace ? `${namespace}-${id}` : id);\n },\n\n randomString: function (length) {\n // h/t https://stackoverflow.com/a/1349426/1688568\n var result = '';\n var characters =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n for (var i = 0; i < length; i++) {\n result += characters.charAt(Math.floor(Math.random() * 62));\n }\n return result;\n },\n\n /**\n * Creates a validation error list.\n *\n * @param {Object} errors\n * @returns {jQuery}\n */\n createErrorList: function (errors) {\n var $ul = $(document.createElement('ul')).addClass('errors');\n\n for (var i = 0; i < errors.length; i++) {\n var $li = $(document.createElement('li'));\n $li.appendTo($ul);\n $li.html(errors[i]);\n }\n\n return $ul;\n },\n\n /**\n * Appends HTML to the page `<head>`.\n *\n * @param {string} html\n */\n appendHeadHtml: function (html) {\n if (!html) {\n return;\n }\n\n // Prune out any link tags that are already included\n var $existingCss = $('link[href]');\n\n if ($existingCss.length) {\n var existingCss = [];\n var href;\n\n for (var i = 0; i < $existingCss.length; i++) {\n href = $existingCss.eq(i).attr('href').replace(/&/g, '&');\n existingCss.push(Craft.escapeRegex(href));\n }\n\n const regexp = new RegExp(\n '<link\\\\s[^>]*href=\"(?:' + existingCss.join('|') + ')\".*?></link>',\n 'g'\n );\n\n html = html.replace(regexp, '');\n }\n\n $('head').append(html);\n },\n\n /**\n * Appends HTML to the page `<body>`.\n *\n * @param {string} html\n */\n appendBodyHtml: function (html) {\n if (!html) {\n return;\n }\n\n // Prune out any script tags that are already included\n var $existingJs = $('script[src]');\n\n if ($existingJs.length) {\n var existingJs = [];\n var src;\n\n for (var i = 0; i < $existingJs.length; i++) {\n src = $existingJs.eq(i).attr('src').replace(/&/g, '&');\n existingJs.push(Craft.escapeRegex(src));\n }\n\n var regexp = new RegExp(\n '<script\\\\s[^>]*src=\"(?:' + existingJs.join('|') + ')\".*?></script>',\n 'g'\n );\n\n html = html.replace(regexp, '');\n }\n\n Garnish.$bod.append(html);\n },\n\n /**\n * Appends HTML to the page `<body>`.\n *\n * @deprecated in 4.0.0. `appendBodyHtml()` should be used instead\n */\n appendFootHtml: function (html) {\n console.warn(\n 'Craft.appendFootHtml() is deprecated. Craft.appendBodyHtml() should be used instead.'\n );\n this.appendBodyHtml(html);\n },\n\n /**\n * Initializes any common UI elements in a given container.\n *\n * @param {Object} $container\n */\n initUiElements: function ($container) {\n $('.grid', $container).grid();\n $('.info', $container).infoicon();\n $('.checkbox-select', $container).checkboxselect();\n $('.fieldtoggle', $container).fieldtoggle();\n $('.lightswitch', $container).lightswitch();\n $('.nicetext', $container).nicetext();\n $('.formsubmit', $container).formsubmit();\n $('.menubtn:not([data-disclosure-trigger])', $container).menubtn();\n $('[data-disclosure-trigger]', $container).disclosureMenu();\n $('.datetimewrapper', $container).datetime();\n $(\n '.datewrapper > input[type=\"date\"], .timewrapper > input[type=\"time\"]',\n $container\n ).datetimeinput();\n\n // Open outbound links in new windows\n // hat tip: https://stackoverflow.com/a/2911045/1688568\n $('a', $container).each(function () {\n if (\n this.hostname.length &&\n this.hostname !== location.hostname &&\n typeof $(this).attr('target') === 'undefined'\n ) {\n $(this).attr('rel', 'noopener').attr('target', '_blank');\n }\n });\n },\n\n _elementIndexClasses: {},\n _elementSelectorModalClasses: {},\n _elementEditorClasses: {},\n\n /**\n * Registers an element index class for a given element type.\n *\n * @param {string} elementType\n * @param {function} func\n */\n registerElementIndexClass: function (elementType, func) {\n if (typeof this._elementIndexClasses[elementType] !== 'undefined') {\n throw (\n 'An element index class has already been registered for the element type “' +\n elementType +\n '”.'\n );\n }\n\n this._elementIndexClasses[elementType] = func;\n },\n\n /**\n * Registers an element selector modal class for a given element type.\n *\n * @param {string} elementType\n * @param {function} func\n */\n registerElementSelectorModalClass: function (elementType, func) {\n if (typeof this._elementSelectorModalClasses[elementType] !== 'undefined') {\n throw (\n 'An element selector modal class has already been registered for the element type “' +\n elementType +\n '”.'\n );\n }\n\n this._elementSelectorModalClasses[elementType] = func;\n },\n\n /**\n * Registers an element editor class for a given element type.\n *\n * @param {string} elementType\n * @param {function} func\n */\n registerElementEditorClass: function (elementType, func) {\n if (typeof this._elementEditorClasses[elementType] !== 'undefined') {\n throw (\n 'An element editor class has already been registered for the element type “' +\n elementType +\n '”.'\n );\n }\n\n this._elementEditorClasses[elementType] = func;\n },\n\n /**\n * Creates a new element index for a given element type.\n *\n * @param {string} elementType\n * @param {jQuery} $container\n * @param {Object} settings\n * @returns {BaseElementIndex}\n */\n createElementIndex: function (elementType, $container, settings) {\n var func;\n\n if (typeof this._elementIndexClasses[elementType] !== 'undefined') {\n func = this._elementIndexClasses[elementType];\n } else {\n func = Craft.BaseElementIndex;\n }\n\n return new func(elementType, $container, settings);\n },\n\n /**\n * Creates a new element selector modal for a given element type.\n *\n * @param {string} elementType\n * @param {Object} settings\n */\n createElementSelectorModal: function (elementType, settings) {\n var func;\n\n if (typeof this._elementSelectorModalClasses[elementType] !== 'undefined') {\n func = this._elementSelectorModalClasses[elementType];\n } else {\n func = Craft.BaseElementSelectorModal;\n }\n\n return new func(elementType, settings);\n },\n\n /**\n * Creates a new element editor slideout for a given element type.\n *\n * @param {string} elementType\n * @param {(jQuery|HTMLElement|string)} element\n * @param {Object} settings\n */\n createElementEditor: function (elementType, element, settings) {\n // Param mapping\n if (typeof settings === 'undefined' && $.isPlainObject(element)) {\n // (settings)\n settings = element;\n element = null;\n } else if (typeof settings !== 'object') {\n settings = {};\n }\n\n if (!settings.elementType) {\n settings.elementType = elementType;\n }\n\n return new Craft.ElementEditorSlideout(element, settings);\n },\n\n /**\n * Retrieves a value from localStorage if it exists.\n *\n * @param {string} key\n * @param {*} defaultValue\n */\n getLocalStorage: function (key, defaultValue) {\n key = 'Craft-' + Craft.systemUid + '.' + key;\n\n if (\n typeof localStorage !== 'undefined' &&\n typeof localStorage[key] !== 'undefined'\n ) {\n return JSON.parse(localStorage[key]);\n } else {\n return defaultValue;\n }\n },\n\n /**\n * Saves a value to localStorage.\n *\n * @param {string} key\n * @param {*} value\n */\n setLocalStorage: function (key, value) {\n if (typeof localStorage !== 'undefined') {\n key = 'Craft-' + Craft.systemUid + '.' + key;\n\n // localStorage might be filled all the way up.\n // Especially likely if this is a private window in Safari 8+, where localStorage technically exists,\n // but has a max size of 0 bytes.\n try {\n localStorage[key] = JSON.stringify(value);\n } catch (e) {}\n }\n },\n\n /**\n * Removes a value from localStorage.\n * @param {string} key\n */\n removeLocalStorage: function (key) {\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(`Craft-${Craft.systemUid}.${key}`);\n }\n },\n\n /**\n * Returns a cookie value, if it exists, otherwise returns `false`\n * @returns {(string|boolean)}\n */\n getCookie: function (name) {\n // Adapted from https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie\n return document.cookie.replace(\n new RegExp(\n `(?:(?:^|.*;\\\\s*)Craft-${Craft.systemUid}:${name}\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$`\n ),\n '$1'\n );\n },\n\n /**\n * Sets a cookie value.\n * @param {string} name\n * @param {string} value\n * @param {Object} [options]\n * @param {string} [options.path] The cookie path.\n * @param {string} [options.domain] The cookie domain. Defaults to the `defaultCookieDomain` config setting.\n * @param {number} [options.maxAge] The max age of the cookie (in seconds)\n * @param {Date} [options.expires] The expiry date of the cookie. Defaults to none (session-based cookie).\n * @param {boolean} [options.secure] Whether this is a secure cookie. Defaults to the `useSecureCookies`\n * config setting.\n * @param {string} [options.sameSite] The SameSite value (`lax` or `strict`). Defaults to the\n * `sameSiteCookieValue` config setting.\n */\n setCookie: function (name, value, options) {\n options = $.extend({}, this.defaultCookieOptions, options);\n let cookie = `Craft-${Craft.systemUid}:${name}=${encodeURIComponent(\n value\n )}`;\n if (options.path) {\n cookie += `;path=${options.path}`;\n }\n if (options.domain) {\n cookie += `;domain=${options.domain}`;\n }\n if (options.maxAge) {\n cookie += `;max-age-in-seconds=${options.maxAge}`;\n } else if (options.expires) {\n cookie += `;expires=${options.expires.toUTCString()}`;\n }\n if (options.secure) {\n cookie += ';secure';\n }\n document.cookie = cookie;\n },\n\n /**\n * Removes a cookie\n * @param {string} name\n */\n removeCookie: function (name) {\n this.setCookie(name, '', new Date('1970-01-01T00:00:00'));\n },\n\n /**\n * Returns element information from its DOM element.\n *\n * @param {(jQuery|HTMLElement|string)} element\n * @returns {Object}\n */\n getElementInfo: function (element) {\n var $element = $(element);\n\n if (!$element.hasClass('element')) {\n $element = $element.find('.element:first');\n }\n\n return {\n id: $element.data('id'),\n siteId: $element.data('site-id'),\n label: $element.data('label'),\n status: $element.data('status'),\n url: $element.data('url'),\n hasThumb: $element.hasClass('hasthumb'),\n $element: $element,\n };\n },\n\n /**\n * Changes an element to the requested size.\n *\n * @param {(jQuery|HTMLElement|string))} element\n * @param {string} size\n */\n setElementSize: function (element, size) {\n var $element = $(element);\n\n if (size !== 'small' && size !== 'large') {\n size = 'small';\n }\n\n if ($element.hasClass(size)) {\n return;\n }\n\n var otherSize = size === 'small' ? 'large' : 'small';\n\n $element.addClass(size).removeClass(otherSize);\n\n if ($element.hasClass('hasthumb')) {\n var $oldImg = $element.find('> .elementthumb > img'),\n imgSize = size === 'small' ? '30' : '100',\n $newImg = $('<img/>', {\n sizes: imgSize + 'px',\n srcset: $oldImg.attr('srcset') || $oldImg.attr('data-pfsrcset'),\n });\n\n $oldImg.replaceWith($newImg);\n\n picturefill({\n elements: [$newImg[0]],\n });\n }\n },\n\n /**\n * Submits a form.\n * @param {Object} $form\n * @param {Object} [options]\n * @param {string} [options.action] The `action` param value override\n * @param {string} [options.redirect] The `redirect` param value override\n * @param {string} [options.confirm] A confirmation message that should be shown to the user before submit\n * @param {Object} [options.params] Additional params that should be added to the form, defined as name/value pairs\n * @param {Object} [options.data] Additional data to be passed to the submit event\n * @param {boolean} [options.retainScroll] Whether the scroll position should be stored and reapplied on the next page load\n */\n submitForm: function ($form, options) {\n if (typeof options === 'undefined') {\n options = {};\n }\n\n if (options.confirm && !confirm(options.confirm)) {\n return;\n }\n\n if (options.action) {\n $('<input/>', {\n type: 'hidden',\n name: 'action',\n val: options.action,\n }).appendTo($form);\n }\n\n if (options.redirect) {\n $('<input/>', {\n type: 'hidden',\n name: 'redirect',\n val: options.redirect,\n }).appendTo($form);\n }\n\n if (options.params) {\n for (let name in options.params) {\n let value = options.params[name];\n $('<input/>', {\n type: 'hidden',\n name: name,\n val: value,\n }).appendTo($form);\n }\n }\n\n if (options.retainScroll) {\n this.setLocalStorage('scrollY', window.scrollY);\n }\n\n $form.trigger($.extend({type: 'submit'}, options.data));\n },\n\n /**\n * Traps focus within a container, so when focus is tabbed out of it, it’s cycled back into it.\n * @param {Object} container\n */\n trapFocusWithin: function (container) {\n Garnish.trapFocusWithin(container);\n },\n\n /**\n * Sets focus to the first focusable element within a container.\n * @param {Object} container\n */\n setFocusWithin: function (container) {\n Garnish.setFocusWithin(container);\n },\n\n /**\n * Reduces an input’s value to characters that match the given regex pattern.\n * @param {jQuery|HTMLElement} input\n * @param {RegExp} regex\n */\n filterInputVal: function (input, regex) {\n const $input = $(input);\n const val = $input.val();\n let selectionStart = $input[0].selectionStart;\n let newVal = '';\n for (let i = 0; i < val.length; i++) {\n if (val[i].match(regex)) {\n newVal += val[i];\n } else if (i < selectionStart) {\n selectionStart--;\n }\n }\n if (newVal !== val) {\n $input.val(newVal);\n $input[0].setSelectionRange(selectionStart, selectionStart);\n }\n },\n\n /**\n * Reduces an input’s value to numeric characters.\n * @param {jQuery|HTMLElement} input\n * @param {RegExp} regex\n */\n filterNumberInputVal: function (input) {\n this.filterInputVal(input, /[0-9.,\\-]/);\n },\n\n /**\n * Sets/removes attributes on an element.\n *\n * Attributes set to `null` or `false` will be removed.\n *\n * @param {(jQuery|HTMLElement|string)} element\n * @param {Object} attributes\n */\n setElementAttributes: function (element, attributes) {\n const $element = $(element);\n\n for (let name in attributes) {\n if (!attributes.hasOwnProperty(name)) {\n continue;\n }\n\n let value = attributes[name];\n\n if (value === null || value === false) {\n $element.removeAttr(name);\n } else if (value === true) {\n $element.attr(name, '');\n } else if ($.isArray(value) || $.isPlainObject(value)) {\n if (Craft.dataAttributes.includes(name)) {\n // Make sure it's an object\n value = Object.assign({}, value);\n for (let n in value) {\n if (!value.hasOwnProperty(n)) {\n continue;\n }\n let subValue = value[n];\n if (subValue === null || subValue === false) {\n continue;\n }\n if ($.isPlainObject(subValue) || $.isArray(subValue)) {\n subValue = JSON.stringify(subValue);\n } else if (subValue === true) {\n subValue = '';\n } else {\n subValue = this.escapeHtml(subValue);\n }\n $element.attr(`${name}-${n}`, subValue);\n }\n } else if (name === 'class') {\n // Make sure it's an array\n if ($.isPlainObject(value)) {\n value = Object.values(value);\n }\n for (let c of value) {\n $element.addClass(c);\n }\n } else if (name === 'style') {\n $element.css(value);\n } else {\n $element.attr(name, JSON.stringify(value));\n }\n } else {\n $element.attr(name, this.escapeHtml(value));\n }\n }\n },\n\n isVisible: function () {\n return (\n typeof document.visibilityState === 'undefined' ||\n document.visibilityState === 'visible'\n );\n },\n\n useMobileStyles: function () {\n return Garnish.isMobileBrowser() || document.body.clientWidth < 600;\n },\n});\n\n// -------------------------------------------\n// Broadcast channel\n// -------------------------------------------\n\nCraft.pageId = Craft.uuid();\n\nif (typeof BroadcastChannel !== 'undefined') {\n const channelName = `CraftCMS:${Craft.appId}`;\n Craft.broadcaster = new BroadcastChannel(channelName);\n Craft.messageReceiver = new BroadcastChannel(channelName);\n\n Craft.messageReceiver.addEventListener('message', (ev) => {\n if (ev.data.event === 'saveElement') {\n // Are there any instances of the same element on the page?\n const $elements = $(\n `div.element[data-id=\"${ev.data.id}\"][data-settings]`\n );\n if (!$elements.length) {\n return;\n }\n const data = {\n type: $elements.data('type'),\n id: ev.data.id,\n instances: [],\n };\n for (let i = 0; i < $elements.length; i++) {\n const $element = $elements.eq(i);\n data.instances.push(\n Object.assign(\n {\n siteId: $element.data('site-id'),\n },\n $element.data('settings')\n )\n );\n }\n Craft.sendActionRequest('POST', 'app/render-element', {data}).then(\n ({data}) => {\n for (let i = 0; i < $elements.length; i++) {\n const $element = $elements.eq(i);\n if (data.elementHtml[i]) {\n const $replacement = $(data.elementHtml[i]);\n for (let attribute of $replacement[0].attributes) {\n if (attribute.name === 'class') {\n $element.addClass(attribute.value);\n } else {\n $element.attr(attribute.name, attribute.value);\n }\n }\n const $inputs = $element.find('input,button').detach();\n $element.html($replacement.html());\n if ($inputs.length) {\n $inputs.prependTo($element);\n }\n }\n }\n new Craft.ElementThumbLoader().load($elements);\n }\n );\n }\n });\n}\n\n// -------------------------------------------\n// Custom jQuery plugins\n// -------------------------------------------\n\n$.extend($.fn, {\n animateLeft: function (pos, duration, easing, complete) {\n if (Craft.orientation === 'ltr') {\n return this.velocity({left: pos}, duration, easing, complete);\n } else {\n return this.velocity({right: pos}, duration, easing, complete);\n }\n },\n\n animateRight: function (pos, duration, easing, complete) {\n if (Craft.orientation === 'ltr') {\n return this.velocity({right: pos}, duration, easing, complete);\n } else {\n return this.velocity({left: pos}, duration, easing, complete);\n }\n },\n\n /**\n * Disables elements by adding a .disabled class and preventing them from receiving focus.\n */\n disable: function () {\n return this.each(function () {\n var $elem = $(this);\n $elem.addClass('disabled');\n\n if ($elem.data('activatable')) {\n $elem.removeAttr('tabindex');\n }\n });\n },\n\n /**\n * Enables elements by removing their .disabled class and allowing them to receive focus.\n */\n enable: function () {\n return this.each(function () {\n var $elem = $(this);\n $elem.removeClass('disabled');\n\n if ($elem.data('activatable')) {\n $elem.attr('tabindex', '0');\n }\n });\n },\n\n /**\n * Sets the element as the container of a grid.\n */\n grid: function () {\n return this.each(function () {\n var $container = $(this),\n settings = {};\n\n if ($container.data('item-selector')) {\n settings.itemSelector = $container.data('item-selector');\n }\n if ($container.data('cols')) {\n settings.cols = parseInt($container.data('cols'));\n }\n if ($container.data('max-cols')) {\n settings.maxCols = parseInt($container.data('max-cols'));\n }\n if ($container.data('min-col-width')) {\n settings.minColWidth = parseInt($container.data('min-col-width'));\n }\n if ($container.data('mode')) {\n settings.mode = $container.data('mode');\n }\n if ($container.data('fill-mode')) {\n settings.fillMode = $container.data('fill-mode');\n }\n if ($container.data('col-class')) {\n settings.colClass = $container.data('col-class');\n }\n if ($container.data('snap-to-grid')) {\n settings.snapToGrid = !!$container.data('snap-to-grid');\n }\n\n new Craft.Grid(this, settings);\n });\n },\n\n infoicon: function () {\n return this.each(function () {\n new Craft.InfoIcon(this);\n });\n },\n\n /**\n * Sets the element as a container for a checkbox select.\n */\n checkboxselect: function () {\n return this.each(function () {\n if (!$.data(this, 'checkboxselect')) {\n new Garnish.CheckboxSelect(this);\n }\n });\n },\n\n /**\n * Sets the element as a field toggle trigger.\n */\n fieldtoggle: function () {\n return this.each(function () {\n if (!$.data(this, 'fieldtoggle')) {\n new Craft.FieldToggle(this);\n }\n });\n },\n\n lightswitch: function (settings, settingName, settingValue) {\n // param mapping\n if (settings === 'settings') {\n if (typeof settingName === 'string') {\n settings = {};\n settings[settingName] = settingValue;\n } else {\n settings = settingName;\n }\n\n return this.each(function () {\n var obj = $.data(this, 'lightswitch');\n if (obj) {\n obj.setSettings(settings);\n }\n });\n } else {\n if (!$.isPlainObject(settings)) {\n settings = {};\n }\n\n return this.each(function () {\n var thisSettings = $.extend({}, settings);\n\n if (Garnish.hasAttr(this, 'data-value')) {\n thisSettings.value = $(this).attr('data-value');\n }\n\n if (Garnish.hasAttr(this, 'data-indeterminate-value')) {\n thisSettings.indeterminateValue = $(this).attr(\n 'data-indeterminate-value'\n );\n }\n\n if (!$.data(this, 'lightswitch')) {\n new Craft.LightSwitch(this, thisSettings);\n }\n });\n }\n },\n\n nicetext: function () {\n return this.each(function () {\n if (!$.data(this, 'nicetext')) {\n new Garnish.NiceText(this);\n }\n });\n },\n\n formsubmit: function () {\n // Secondary form submit buttons\n return this.on('click', function (ev) {\n let $btn = $(ev.currentTarget);\n let params = $btn.data('params') || {};\n if ($btn.data('param')) {\n params[$btn.data('param')] = $btn.data('value');\n }\n\n let $anchor = $btn.data('menu') ? $btn.data('menu').$anchor : $btn;\n let $form = $anchor.attr('data-form')\n ? $('#' + $anchor.attr('data-form'))\n : $anchor.closest('form');\n\n Craft.submitForm($form, {\n confirm: $btn.data('confirm'),\n action: $btn.data('action'),\n redirect: $btn.data('redirect'),\n params: params,\n data: $.extend(\n {\n customTrigger: $btn,\n },\n $btn.data('event-data')\n ),\n });\n });\n },\n\n menubtn: function () {\n return this.each(function () {\n var $btn = $(this);\n\n if (!$btn.data('menubtn') && $btn.next().hasClass('menu')) {\n var settings = {};\n\n if ($btn.data('menu-anchor')) {\n settings.menuAnchor = $btn.data('menu-anchor');\n }\n\n new Garnish.MenuBtn($btn, settings);\n }\n });\n },\n\n disclosureMenu: function () {\n return this.each(function () {\n const $trigger = $(this);\n // Only instantiate if it's not already a disclosure trigger, and it references a disclosure content\n if (!$trigger.data('trigger') && $trigger.attr('aria-controls')) {\n new Garnish.DisclosureMenu($trigger);\n }\n });\n },\n\n datetime: function () {\n return this.each(function () {\n let $wrapper = $(this);\n let $inputs = $wrapper.find('input:not([name$=\"[timezone]\"])');\n let checkValue = () => {\n let hasValue = false;\n for (let i = 0; i < $inputs.length; i++) {\n if ($inputs.eq(i).val()) {\n hasValue = true;\n break;\n }\n }\n if (hasValue) {\n if (!$wrapper.children('.clear-btn').length) {\n let $btn = $('<button/>', {\n type: 'button',\n class: 'clear-btn',\n title: Craft.t('app', 'Clear'),\n 'aria-label': Craft.t('app', 'Clear'),\n })\n .appendTo($wrapper)\n .on('click', () => {\n for (let i = 0; i < $inputs.length; i++) {\n $inputs.eq(i).val('').trigger('input').trigger('change');\n }\n $btn.remove();\n $inputs.first().filter('[type=\"text\"]').focus();\n });\n }\n } else {\n $wrapper.children('.clear-btn').remove();\n }\n };\n $inputs.on('change', checkValue);\n checkValue();\n });\n },\n\n datetimeinput: function () {\n return this.each(function () {\n const $input = $(this);\n const checkValue = () => {\n if ($input.val() === '') {\n $input.addClass('empty-value');\n } else {\n $input.removeClass('empty-value');\n }\n };\n $input.on('input', checkValue);\n checkValue();\n });\n },\n});\n\n// Override Garnish.NiceText.charsLeftHtml() to be more accessible\nGarnish.NiceText.charsLeftHtml = (charsLeft) => {\n return Craft.t(\n 'app',\n '<span class=\"visually-hidden\">Characters left:</span> {chars, number}',\n {\n chars: charsLeft,\n }\n );\n};\n\nGarnish.$doc.ready(function () {\n Craft.initUiElements();\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Customize Sources modal\n */\nCraft.CustomizeSourcesModal = Garnish.Modal.extend({\n elementIndex: null,\n $elementIndexSourcesContainer: null,\n\n $sidebar: null,\n $sidebarToggleBtn: null,\n $sourcesContainer: null,\n $sourcesHeader: null,\n $sourcesHeading: null,\n $sourceSettingsContainer: null,\n $sourceSettingsHeader: null,\n $addSourceMenu: null,\n addSourceMenu: null,\n $footer: null,\n $footerBtnContainer: null,\n $saveBtn: null,\n $cancelBtn: null,\n $loadingSpinner: null,\n\n sourceSort: null,\n sources: null,\n selectedSource: null,\n\n elementTypeName: null,\n baseSortOptions: null,\n availableTableAttributes: null,\n customFieldAttributes: null,\n\n conditionBuilderHtml: null,\n conditionBuilderJs: null,\n userGroups: null,\n\n init: function (elementIndex, settings) {\n this.base();\n\n this.setSettings(settings, {\n resizable: true,\n });\n\n this.elementIndex = elementIndex;\n this.$elementIndexSourcesContainer = this.elementIndex.$sidebar\n .children('nav')\n .children('ul');\n\n const $container = $(\n '<form class=\"modal customize-sources-modal\"/>'\n ).appendTo(Garnish.$bod);\n\n this.$sidebar = $('<div class=\"cs-sidebar block-types\"/>')\n .appendTo($container)\n .attr({\n role: 'navigation',\n 'aria-label': Craft.t('app', 'Source'),\n });\n this.$sourcesContainer = $('<div class=\"sources\">').appendTo(this.$sidebar);\n this.$sourceSettingsContainer = $('<div class=\"source-settings\">').appendTo(\n $container\n );\n\n this.$footer = $('<div class=\"footer\"/>').appendTo($container);\n this.$footerBtnContainer = $('<div class=\"buttons right\"/>').appendTo(\n this.$footer\n );\n this.$cancelBtn = $('<button/>', {\n type: 'button',\n class: 'btn',\n text: Craft.t('app', 'Cancel'),\n }).appendTo(this.$footerBtnContainer);\n this.$saveBtn = Craft.ui\n .createSubmitButton({\n class: 'disabled',\n label: Craft.t('app', 'Save'),\n spinner: true,\n })\n .appendTo(this.$footerBtnContainer);\n\n this.$loadingSpinner = $('<div class=\"spinner\"/>').appendTo(\n this.$sourceSettingsContainer\n );\n\n this.setContainer($container);\n this.show();\n\n Craft.sendActionRequest(\n 'POST',\n 'element-index-settings/get-customize-sources-modal-data',\n {\n data: {\n elementType: this.elementIndex.elementType,\n },\n }\n )\n .then((response) => {\n this.$saveBtn.removeClass('disabled');\n this.buildModal(response.data);\n })\n .finally(() => {\n this.$loadingSpinner.remove();\n Garnish.setFocusWithin(this.$sidebar);\n });\n\n this.addListener(this.$cancelBtn, 'click', 'hide');\n this.addListener(this.$saveBtn, 'click', 'save');\n this.addListener(this.$container, 'submit', 'save');\n },\n\n buildModal: function (response) {\n this.baseSortOptions = response.baseSortOptions;\n this.defaultSortOptions = response.defaultSortOptions;\n this.availableTableAttributes = response.availableTableAttributes;\n this.customFieldAttributes = response.customFieldAttributes;\n this.elementTypeName = response.elementTypeName;\n this.conditionBuilderHtml = response.conditionBuilderHtml;\n this.conditionBuilderJs = response.conditionBuilderJs;\n this.userGroups = response.userGroups;\n\n if (response.headHtml) {\n Craft.appendHeadHtml(response.headHtml);\n }\n if (response.bodyHtml) {\n Craft.appendBodyHtml(response.bodyHtml);\n }\n\n // Create the source item sorter\n this.sourceSort = new Garnish.DragSort({\n handle: '.move',\n axis: 'y',\n });\n\n // Create the sources\n this.sources = [];\n\n for (let i = 0; i < response.sources.length; i++) {\n this.sources.push(this.addSource(response.sources[i]));\n }\n\n if (!this.selectedSource && typeof this.sources[0] !== 'undefined') {\n this.sources[0].select();\n }\n\n const $menuBtnContainer = $(\n '<div class=\"buttons left\" data-wrapper/>'\n ).appendTo(this.$footer);\n const $menuBtn = $('<button/>', {\n type: 'button',\n class: 'btn menubtn add icon',\n 'aria-label': Craft.t('app', 'Add…'),\n 'aria-controls': 'add-source-menu',\n title: Craft.t('app', 'Add…'),\n 'data-disclosure-trigger': '',\n }).appendTo($menuBtnContainer);\n\n this.$addSourceMenu = $('<div/>', {\n id: 'add-source-menu',\n class: 'menu menu--disclosure',\n }).appendTo($menuBtnContainer);\n\n const addSource = (sourceData) => {\n const source = this.addSource(sourceData, true);\n Garnish.scrollContainerToElement(this.$sidebar, source.$item);\n source.select();\n this.addSourceMenu.hide();\n };\n\n const $newHeadingBtn = $('<button/>', {\n type: 'button',\n class: 'menu-option',\n text: Craft.t('app', 'New heading'),\n }).on('click', () => {\n addSource({\n type: 'heading',\n });\n this.focusLabelInput();\n });\n\n const $newCustomSourceBtn = $('<button/>', {\n type: 'button',\n class: 'menu-option',\n text: Craft.t('app', 'New custom source'),\n 'data-type': 'custom',\n }).on('click', () => {\n const sortOptions = this.baseSortOptions.slice(0);\n sortOptions.push(this.defaultSortOptions);\n\n addSource({\n type: 'custom',\n key: `custom:${Craft.uuid()}`,\n sortOptions: sortOptions,\n defaultSort: [sortOptions[0].attr, sortOptions[1].defaultDir],\n tableAttributes: [],\n availableTableAttributes: [],\n });\n this.focusLabelInput();\n });\n\n const $ul = $('<ul/>')\n .append($('<li/>').append($newHeadingBtn))\n .appendTo(this.$addSourceMenu);\n\n if (response.conditionBuilderHtml) {\n $('<li/>').append($newCustomSourceBtn).appendTo($ul);\n }\n\n if (Craft.useMobileStyles()) {\n this.buildSidebarToggleView();\n }\n\n // Add resize listener to enable/disable sidebar toggle view\n this.addListener(Garnish.$win, 'resize', this.updateSidebarView);\n\n this.addSourceMenu = new Garnish.DisclosureMenu($menuBtn);\n },\n\n focusLabelInput: function () {\n this.selectedSource.$labelInput.trigger('focus');\n },\n\n getSourceName: function () {\n return this.selectedSource\n ? this.selectedSource.sourceData.label\n : this.sources[0].sourceData.label;\n },\n\n updateSidebarView: function () {\n if (Craft.useMobileStyles()) {\n if (!this.$sidebarToggleBtn) this.buildSidebarToggleView();\n } else {\n if (this.$sidebarToggleBtn) this.resetView();\n }\n },\n\n resetView: function () {\n if (this.$sourceSettingsHeader) {\n this.$sourceSettingsHeader.remove();\n }\n\n if (this.$sourcesHeader) {\n this.$sourcesHeader.remove();\n }\n\n this.$sidebarToggleBtn = null;\n this.$container.removeClass('sidebar-hidden');\n },\n\n updateHeading: function () {\n if (!this.$sourcesHeading) return;\n\n this.$sourcesHeading.text(this.getSourceName());\n },\n\n buildSidebarToggleView: function () {\n this.$sourcesHeader = $('<div class=\"sources-header\"/>')\n .addClass('sidebar-header')\n .prependTo(this.$sourcesContainer);\n\n this.$sidebarCloseBtn = Craft.ui\n .createButton({\n class: 'nav-close close-btn',\n })\n .attr('aria-label', Craft.t('app', 'Close'))\n .removeClass('btn')\n .appendTo(this.$sourcesHeader);\n\n this.$sourcesHeading = $('<h1 class=\"main-heading\"/>').text(\n this.getSourceName()\n );\n\n this.$sourceSettingsHeader = $('<div class=\"source-settings-header\"/>')\n .addClass('main-header')\n .append(this.$sourcesHeading)\n .prependTo(this.$sourceSettingsContainer);\n\n // Toggle sidebar button\n const buttonConfig = {\n toggle: true,\n controls: 'modal-sidebar',\n class: 'nav-toggle',\n };\n\n this.$sidebarToggleBtn = Craft.ui\n .createButton(buttonConfig)\n .removeClass('btn')\n .attr('aria-label', Craft.t('app', 'Show sidebar'))\n .appendTo(this.$sourceSettingsHeader);\n\n this.closeSidebar();\n\n // Add listeners\n this.addListener(this.$sidebarToggleBtn, 'click', () => {\n this.toggleSidebar();\n });\n\n this.addListener(this.$sidebarCloseBtn, 'click', () => {\n this.toggleSidebar();\n this.$sidebarToggleBtn.trigger('focus');\n });\n },\n\n toggleSidebar: function () {\n if (this.sidebarIsOpen()) {\n this.closeSidebar();\n } else {\n this.openSidebar();\n }\n },\n\n openSidebar: function () {\n this.$container.removeClass('sidebar-hidden');\n this.$sidebarToggleBtn.attr('aria-expanded', 'true');\n this.$sidebar.find(':focusable').first().focus();\n\n Garnish.uiLayerManager.addLayer(this.$sidebar);\n\n Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n this.closeSidebar();\n\n if (Garnish.focusIsInside(this.$sidebar)) {\n this.$sidebarToggleBtn.focus();\n }\n });\n },\n\n closeSidebar: function () {\n this.$container.addClass('sidebar-hidden');\n\n if (this.$sidebarToggleBtn) {\n this.$sidebarToggleBtn.attr('aria-expanded', 'false');\n }\n\n // if sidebar is topmost layer, remove layer\n if (Garnish.uiLayerManager.currentLayer.$container.hasClass('cs-sidebar')) {\n Garnish.uiLayerManager.removeLayer();\n }\n },\n\n sidebarIsOpen: function () {\n return this.$sidebarToggleBtn.attr('aria-expanded') === 'true';\n },\n\n addSource: function (sourceData, isNew) {\n const $item = $('<div class=\"customize-sources-item\"/>').appendTo(\n this.$sourcesContainer\n );\n const $itemLabel = $('<div class=\"label customize-sources-item__btn\"/>')\n .attr({\n tabindex: '0',\n role: 'button',\n })\n .appendTo($item);\n const $itemInput = $('<input type=\"hidden\"/>').appendTo($item);\n $(\n `<a class=\"move icon customize-sources-item__move\" title=\"${Craft.t(\n 'app',\n 'Reorder'\n )}\" role=\"button\"></a>`\n ).appendTo($item);\n\n let source;\n\n if (sourceData.type === 'heading') {\n $item.addClass('heading');\n $itemInput.attr('name', 'sourceOrder[][heading]');\n source = new Craft.CustomizeSourcesModal.Heading(\n this,\n $item,\n $itemLabel,\n $itemInput,\n sourceData,\n isNew\n );\n source.updateItemLabel(sourceData.heading);\n } else {\n $itemInput.attr('name', 'sourceOrder[][key]').val(sourceData.key);\n if (sourceData.type === 'native') {\n source = new Craft.CustomizeSourcesModal.Source(\n this,\n $item,\n $itemLabel,\n $itemInput,\n sourceData,\n isNew\n );\n } else {\n source = new Craft.CustomizeSourcesModal.CustomSource(\n this,\n $item,\n $itemLabel,\n $itemInput,\n sourceData,\n isNew\n );\n }\n source.updateItemLabel(sourceData.label);\n\n // Select this by default?\n if (sourceData.key === this.elementIndex.rootSourceKey) {\n source.select();\n }\n }\n\n this.sourceSort.addItems($item);\n return source;\n },\n\n save: function (ev) {\n if (ev) {\n ev.preventDefault();\n }\n\n if (\n this.$saveBtn.hasClass('disabled') ||\n this.$saveBtn.hasClass('loading')\n ) {\n return;\n }\n\n this.$saveBtn.addClass('loading');\n\n Craft.sendActionRequest(\n 'POST',\n 'element-index-settings/save-customize-sources-modal-settings',\n {\n data:\n this.$container.serialize() +\n `&elementType=${this.elementIndex.elementType}`,\n }\n )\n .then(({data}) => {\n // Figure out which source to select\n let sourceKey = null;\n if (\n this.selectedSource &&\n this.selectedSource.sourceData.key &&\n !data.disabledSourceKeys.includes(this.selectedSource.sourceData.key)\n ) {\n sourceKey = this.selectedSource.sourceData.key;\n } else if (!this.elementIndex.sourceKey) {\n sourceKey = this.elementIndex.$visibleSources.first().data('key');\n }\n\n if (sourceKey) {\n this.elementIndex.selectSourceByKey(sourceKey);\n }\n\n window.location.reload();\n })\n .catch(() => {\n Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n })\n .finally(() => {\n this.$saveBtn.removeClass('loading');\n });\n },\n\n appendIndexSourceItem: function ($sourceItem, $lastSourceItem) {\n if (!$lastSourceItem) {\n $sourceItem.prependTo(this.$elementIndexSourcesContainer);\n } else {\n const isHeading = $sourceItem.hasClass('heading');\n if ($lastSourceItem.hasClass('heading') && !isHeading) {\n // First source to be placed below a new heading\n $sourceItem.appendTo($lastSourceItem.children('ul'));\n } else {\n if (isHeading) {\n // New heading. Swap $lastSourceItem with the top level <li> if it's nested\n const $lastTopLevelSource = $lastSourceItem\n .parentsUntil(this.$elementIndexSourcesContainer, 'li')\n .last();\n if ($lastTopLevelSource.length) {\n $lastSourceItem = $lastTopLevelSource;\n }\n }\n $sourceItem.insertAfter($lastSourceItem);\n }\n }\n },\n\n destroy: function () {\n for (let i = 0; i < this.sources.length; i++) {\n this.sources[i].destroy();\n }\n\n if (this.addSourceMenu) {\n this.addSourceMenu.destroy();\n this.$addSourceMenu.remove();\n }\n\n delete this.sources;\n this.base();\n },\n});\n\nCraft.CustomizeSourcesModal.BaseSource = Garnish.Base.extend({\n modal: null,\n\n $item: null,\n $itemLabel: null,\n $itemInput: null,\n $settingsContainer: null,\n\n sourceData: null,\n isNew: null,\n\n init: function (modal, $item, $itemLabel, $itemInput, sourceData, isNew) {\n this.modal = modal;\n this.$item = $item;\n this.$itemLabel = $itemLabel;\n this.$itemInput = $itemInput;\n this.sourceData = sourceData;\n this.isNew = isNew;\n\n this.$item.data('source', this);\n\n this.addListener(this.$itemLabel, 'click', 'select');\n this.addListener(this.$itemLabel, 'keypress', (e) =>\n Garnish.handleActivatingKeypress(e, this.select.bind(this))\n );\n },\n\n isHeading: function () {\n return false;\n },\n\n isNative: function () {\n return false;\n },\n\n isSelected: function () {\n return this.modal.selectedSource === this;\n },\n\n select: function () {\n if (this.isSelected()) {\n return;\n }\n\n if (this.modal.selectedSource) {\n this.modal.selectedSource.deselect();\n }\n\n this.$item.addClass('sel');\n this.$itemLabel.attr({\n 'aria-current': 'true',\n });\n this.modal.selectedSource = this;\n this.modal.updateHeading();\n\n if (!this.$settingsContainer) {\n this.$settingsContainer = $('<div/>').appendTo(\n this.modal.$sourceSettingsContainer\n );\n this.createSettings(this.$settingsContainer);\n } else {\n this.$settingsContainer.removeClass('hidden');\n }\n\n this.modal.$sourceSettingsContainer.scrollTop(0);\n },\n\n createSettings: function () {},\n\n getIndexSourceItem: function () {},\n\n deselect: function () {\n this.$item.removeClass('sel');\n this.$itemLabel.attr({\n 'aria-current': 'false',\n });\n this.modal.selectedSource = null;\n this.$settingsContainer.addClass('hidden');\n },\n\n updateItemLabel: function (val) {\n if (val) {\n this.$itemLabel.text(val);\n } else {\n this.$itemLabel.html(' ');\n }\n },\n\n destroy: function () {\n this.modal.sourceSort.removeItems(this.$item);\n this.modal.sources.splice($.inArray(this, this.modal.sources), 1);\n\n if (this.isSelected()) {\n this.deselect();\n\n if (this.modal.sources.length) {\n this.modal.sources[0].select();\n }\n\n Garnish.setFocusWithin(this.modal.$sourceSettingsContainer);\n }\n\n this.$item.data('source', null);\n this.$item.remove();\n\n if (this.$settingsContainer) {\n this.$settingsContainer.remove();\n }\n\n this.base();\n },\n});\n\nCraft.CustomizeSourcesModal.Source =\n Craft.CustomizeSourcesModal.BaseSource.extend({\n $sortAttributeSelect: null,\n $sortDirectionPicker: null,\n $sortDirectionInput: null,\n sortDirectionListbox: null,\n\n isNative: function () {\n return true;\n },\n\n createSettings: function ($container) {\n Craft.ui\n .createLightswitchField({\n label: Craft.t('app', 'Enabled'),\n name: `sources[${this.sourceData.key}][enabled]`,\n on: !this.sourceData.disabled,\n })\n .appendTo($container);\n this.createSortField($container);\n this.createTableAttributesField($container);\n },\n\n createSortField: function ($container) {\n const $inputContainer = $('<div class=\"flex\"/>');\n\n const $sortAttributeSelectContainer = Craft.ui\n .createSelect({\n name: `sources[${this.sourceData.key}][defaultSort][0]`,\n options: this.sourceData.sortOptions.map((o) => {\n return {\n label: o.label,\n value: o.attr,\n };\n }),\n value: this.sourceData.defaultSort[0],\n })\n .addClass('fullwidth')\n .appendTo($('<div/>').appendTo($inputContainer));\n\n this.$sortAttributeSelect = $sortAttributeSelectContainer\n .children('select')\n .attr('aria-label', Craft.t('app', 'Sort attribute'));\n\n this.$sortDirectionPicker = $('<section/>', {\n class: 'btngroup btngroup--exclusive',\n 'aria-label': Craft.t('app', 'Sort direction'),\n })\n .append(\n $('<button/>', {\n type: 'button',\n class: 'btn',\n title: Craft.t('app', 'Sort ascending'),\n 'aria-label': Craft.t('app', 'Sort ascending'),\n 'aria-pressed': 'false',\n 'data-icon': 'asc',\n 'data-dir': 'asc',\n })\n )\n .append(\n $('<button/>', {\n type: 'button',\n class: 'btn',\n title: Craft.t('app', 'Sort descending'),\n 'aria-label': Craft.t('app', 'Sort descending'),\n 'aria-pressed': 'false',\n 'data-icon': 'desc',\n 'data-dir': 'desc',\n })\n )\n .appendTo($inputContainer);\n\n this.$sortDirectionInput = $('<input/>', {\n type: 'hidden',\n name: `sources[${this.sourceData.key}][defaultSort][1]`,\n }).appendTo($inputContainer);\n\n this.sortDirectionListbox = new Craft.Listbox(this.$sortDirectionPicker, {\n onChange: ($selectedOption) => {\n this.$sortDirectionInput.val($selectedOption.data('dir'));\n },\n });\n\n this.$sortAttributeSelect.on('change', () => {\n this.handleSortAttributeChange();\n });\n\n this.handleSortAttributeChange(true);\n\n Craft.ui\n .createField($inputContainer, {\n label: Craft.t('app', 'Default Sort'),\n fieldset: true,\n })\n .appendTo($container)\n .addClass('sort-field');\n },\n\n handleSortAttributeChange: function (useDefaultDir) {\n const attr = this.$sortAttributeSelect.val();\n\n if (attr === 'structure') {\n this.sortDirectionListbox.select(0);\n this.sortDirectionListbox.disable();\n this.$sortDirectionPicker.addClass('disabled');\n } else {\n this.sortDirectionListbox.enable();\n this.$sortDirectionPicker.removeClass('disabled');\n\n const dir = useDefaultDir\n ? this.sourceData.defaultSort[1]\n : this.sourceData.sortOptions.find((o) => o.attr === attr).defaultDir;\n this.sortDirectionListbox.select(dir === 'asc' ? 0 : 1);\n }\n },\n\n createTableAttributesField: function ($container) {\n const availableTableAttributes = this.availableTableAttributes();\n\n if (\n !this.sourceData.tableAttributes.length &&\n !availableTableAttributes.length\n ) {\n return;\n }\n\n const $columnCheckboxes = $('<div/>');\n const selectedAttributes = [];\n\n $(\n `<input type=\"hidden\" name=\"sources[${this.sourceData.key}][tableAttributes][]\" value=\"\"/>`\n ).appendTo($columnCheckboxes);\n\n // Add the selected columns, in the selected order\n for (let i = 0; i < this.sourceData.tableAttributes.length; i++) {\n let [key, label] = this.sourceData.tableAttributes[i];\n $columnCheckboxes.append(\n this.createTableColumnOption(key, label, true)\n );\n selectedAttributes.push(key);\n }\n\n // Add the rest\n for (let i = 0; i < availableTableAttributes.length; i++) {\n const [key, label] = availableTableAttributes[i];\n if (!Craft.inArray(key, selectedAttributes)) {\n $columnCheckboxes.append(\n this.createTableColumnOption(key, label, false)\n );\n }\n }\n\n new Garnish.DragSort($columnCheckboxes.children(), {\n handle: '.move',\n axis: 'y',\n });\n\n Craft.ui\n .createField($columnCheckboxes, {\n label: Craft.t('app', 'Default Table Columns'),\n instructions: Craft.t(\n 'app',\n 'Choose which table columns should be visible for this source by default.'\n ),\n })\n .appendTo($container);\n },\n\n availableTableAttributes: function () {\n const attributes = this.modal.availableTableAttributes.slice(0);\n attributes.push(...this.sourceData.availableTableAttributes);\n return attributes;\n },\n\n createTableColumnOption: function (key, label, checked) {\n return $('<div class=\"customize-sources-table-column\"/>')\n .append('<div class=\"icon move\"/>')\n .append(\n Craft.ui.createCheckbox({\n label: Craft.escapeHtml(label),\n name: `sources[${this.sourceData.key}][tableAttributes][]`,\n value: key,\n checked: checked,\n })\n );\n },\n\n getIndexSourceItem: function () {\n const $source = this.modal.elementIndex.getSourceByKey(\n this.sourceData.key\n );\n\n if ($source) {\n return $source.closest('li');\n }\n },\n });\n\nCraft.CustomizeSourcesModal.CustomSource =\n Craft.CustomizeSourcesModal.Source.extend({\n $labelInput: null,\n\n createSettings: function ($container) {\n const $labelField = Craft.ui\n .createTextField({\n label: Craft.t('app', 'Label'),\n name: `sources[${this.sourceData.key}][label]`,\n value: this.sourceData.label,\n })\n .appendTo($container);\n this.$labelInput = $labelField.find('.text');\n const defaultId = `condition${Math.floor(Math.random() * 1000000)}`;\n\n const swapPlaceholders = (str) =>\n str\n .replace(/__ID__/g, defaultId)\n .replace(\n /__SOURCE_KEY__(?=-)/g,\n Craft.formatInputId(this.sourceData.key)\n )\n .replace(/__SOURCE_KEY__/g, this.sourceData.key);\n\n const conditionBuilderHtml =\n this.sourceData.conditionBuilderHtml ||\n swapPlaceholders(this.modal.conditionBuilderHtml);\n const conditionBuilderJs =\n this.sourceData.conditionBuilderJs ||\n swapPlaceholders(this.modal.conditionBuilderJs);\n\n Craft.ui\n .createField($('<div/>').append(conditionBuilderHtml), {\n id: 'criteria',\n label: Craft.t('app', '{type} Criteria', {\n type: this.modal.elementTypeName,\n }),\n })\n .appendTo($container);\n Craft.appendBodyHtml(conditionBuilderJs);\n\n this.createSortField($container);\n this.createTableAttributesField($container);\n\n if (this.modal.userGroups.length) {\n Craft.ui\n .createCheckboxSelectField({\n label: Craft.t('app', 'User Groups'),\n instructions: Craft.t(\n 'app',\n 'Choose which user groups should have access to this source.'\n ),\n name: `sources[${this.sourceData.key}][userGroups]`,\n options: this.modal.userGroups,\n values: this.sourceData.userGroups || '*',\n showAllOption: true,\n })\n .appendTo($container);\n }\n\n $container.append('<hr/>');\n\n this.$deleteBtn = $('<a class=\"error delete\"/>')\n .attr({\n role: 'button',\n tabindex: '0',\n })\n .text(Craft.t('app', 'Delete custom source'))\n .appendTo($container);\n\n this.addListener(this.$labelInput, 'input', 'handleLabelInputChange');\n this.addListener(this.$deleteBtn, 'click', 'destroy');\n this.addListener(this.$deleteBtn, 'keypress', (e) => {\n Garnish.handleActivatingKeypress(e, this.destroy.bind(this));\n });\n },\n\n availableTableAttributes: function () {\n const attributes = this.base();\n if (this.isNew) {\n attributes.push(...this.modal.customFieldAttributes);\n }\n return attributes;\n },\n\n handleLabelInputChange: function () {\n this.updateItemLabel(this.$labelInput.val());\n },\n\n getIndexSourceItem: function () {\n let $source = this.base();\n let $label;\n\n if ($source) {\n $label = $source.find('.label');\n } else {\n $label = $('<span/>', {class: 'label'});\n $source = $('<li/>').append(\n $('<a/>', {\n 'data-key': this.sourceData.key,\n }).append($label)\n );\n }\n\n if (this.$labelInput) {\n let label = Craft.trim(this.$labelInput.val());\n if (label === '') {\n label = Craft.t('app', '(blank)');\n }\n $label.text(label);\n }\n\n return $source;\n },\n });\n\nCraft.CustomizeSourcesModal.Heading =\n Craft.CustomizeSourcesModal.BaseSource.extend({\n $labelInput: null,\n $deleteBtn: null,\n\n isHeading: function () {\n return true;\n },\n\n createSettings: function ($container) {\n const $labelField = Craft.ui\n .createTextField({\n label: Craft.t('app', 'Heading'),\n instructions: Craft.t(\n 'app',\n 'This can be left blank if you just want an unlabeled separator.'\n ),\n value: this.sourceData.heading || '',\n })\n .appendTo($container);\n this.$labelInput = $labelField.find('.text');\n\n $container.append('<hr/>');\n\n this.$deleteBtn = $('<a class=\"error delete\"/>')\n .text(Craft.t('app', 'Delete heading'))\n .attr({\n role: 'button',\n tabindex: '0',\n })\n .appendTo($container);\n\n this.addListener(this.$labelInput, 'input', 'handleLabelInputChange');\n this.addListener(this.$deleteBtn, 'click', 'destroy');\n this.addListener(this.$deleteBtn, 'keypress', (e) => {\n Garnish.handleActivatingKeypress(e, this.destroy.bind(this));\n });\n },\n\n handleLabelInputChange: function () {\n this.updateItemLabel(this.$labelInput.val());\n },\n\n updateItemLabel: function (val) {\n this.$itemLabel.html(\n (val\n ? Craft.escapeHtml(val)\n : `<em>${Craft.t('app', '(blank)')}</em>`) + ' '\n );\n this.$itemInput.val(val);\n },\n\n getIndexSourceItem: function () {\n const label =\n (this.$labelInput ? this.$labelInput.val() : null) ||\n this.sourceData.heading ||\n '';\n return $('<li class=\"heading\"/>')\n .append($('<span/>').text(label))\n .append('<ul/>');\n },\n });\n","/** global: Craft */\n/** global: Garnish */\n/**\n * DataTableSorter\n */\nCraft.DataTableSorter = Garnish.DragSort.extend(\n {\n $table: null,\n\n init: function (table, settings) {\n this.$table = $(table);\n var $rows = this.$table.children('tbody').children(':not(.filler)');\n\n settings = $.extend({}, Craft.DataTableSorter.defaults, settings);\n\n settings.container = this.$table.children('tbody');\n settings.helper = this.getHelper.bind(this);\n settings.caboose = '<tr/>';\n settings.axis = Garnish.Y_AXIS;\n settings.magnetStrength = 4;\n settings.helperLagBase = 1.5;\n\n this.base($rows, settings);\n },\n\n getHelper: function ($helperRow) {\n var $helper = $(\n '<div class=\"' + this.settings.helperClass + '\"/>'\n ).appendTo(Garnish.$bod),\n $table = $('<table/>').appendTo($helper),\n $tbody = $('<tbody/>').appendTo($table);\n\n $helperRow.appendTo($tbody);\n\n // Copy the table width and classes\n $table.width(this.$table.width());\n $table.prop('className', this.$table.prop('className'));\n\n // Copy the column widths\n var $firstRow = this.$table.find('tr:first'),\n $cells = $firstRow.children(),\n $helperCells = $helperRow.children();\n\n for (var i = 0; i < $helperCells.length; i++) {\n $($helperCells[i]).width($($cells[i]).width());\n }\n\n return $helper;\n },\n },\n {\n defaults: {\n handle: '.move',\n helperClass: 'datatablesorthelper',\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Delete User Modal\n */\nCraft.DeleteUserModal = Garnish.Modal.extend(\n {\n id: null,\n userId: null,\n\n $deleteActionRadios: null,\n $deleteSubmitBtn: null,\n\n userSelect: null,\n _deleting: false,\n\n init: function (userId, settings) {\n this.id = Math.floor(Math.random() * 1000000000);\n this.userId = userId;\n settings = $.extend(Craft.DeleteUserModal.defaults, settings);\n\n let $form = $(\n '<form class=\"modal fitted deleteusermodal\" method=\"post\" accept-charset=\"UTF-8\">' +\n Craft.getCsrfInput() +\n '<input type=\"hidden\" name=\"action\" value=\"users/delete-user\"/>' +\n (!Garnish.isArray(this.userId)\n ? '<input type=\"hidden\" name=\"userId\" value=\"' + this.userId + '\"/>'\n : '') +\n (settings.redirect\n ? '<input type=\"hidden\" name=\"redirect\" value=\"' +\n settings.redirect +\n '\"/>'\n : '') +\n '</form>'\n ).appendTo(Garnish.$bod);\n let $body = $(\n '<div class=\"body\">' +\n '<div class=\"content-summary\">' +\n '<p>' +\n Craft.t('app', 'What do you want to do with their content?') +\n '</p>' +\n '<ul class=\"bullets\"></ul>' +\n '</div>' +\n '<div class=\"options\">' +\n '<label><input type=\"radio\" name=\"contentAction\" value=\"transfer\"/> ' +\n Craft.t('app', 'Transfer it to:') +\n '</label>' +\n '<div id=\"transferselect' +\n this.id +\n '\" class=\"elementselect\">' +\n '<div class=\"elements\"></div>' +\n '<button type=\"button\" class=\"btn add icon dashed\">' +\n Craft.t('app', 'Choose a user') +\n '</button>' +\n '</div>' +\n '</div>' +\n '<div>' +\n '<label class=\"error\"><input type=\"radio\" name=\"contentAction\" value=\"delete\"/> ' +\n Craft.t('app', 'Delete their content') +\n '</label>' +\n '</div>' +\n '</div>'\n ).appendTo($form);\n let $buttons = $('<div class=\"buttons right\"/>').appendTo($body);\n let $cancelBtn = $('<button/>', {\n type: 'button',\n class: 'btn',\n text: Craft.t('app', 'Cancel'),\n }).appendTo($buttons);\n\n if (settings.contentSummary.length) {\n for (let i = 0; i < settings.contentSummary.length; i++) {\n $body\n .find('ul')\n .append($('<li/>', {text: settings.contentSummary[i]}));\n }\n } else {\n $body.find('ul').remove();\n }\n\n this.$deleteActionRadios = $body.find('input[type=radio]');\n this.$deleteSubmitBtn = Craft.ui\n .createSubmitButton({\n class: 'disabled',\n label: this._submitBtnLabel(false),\n spinner: true,\n })\n .appendTo($buttons);\n\n var idParam;\n\n if (Garnish.isArray(this.userId)) {\n idParam = ['and'];\n\n for (let i = 0; i < this.userId.length; i++) {\n idParam.push('not ' + this.userId[i]);\n }\n } else {\n idParam = 'not ' + this.userId;\n }\n\n this.userSelect = new Craft.BaseElementSelectInput({\n id: 'transferselect' + this.id,\n name: 'transferContentTo',\n elementType: 'craft\\\\elements\\\\User',\n criteria: {\n id: idParam,\n },\n limit: 1,\n modalSettings: {\n closeOtherModals: false,\n },\n onSelectElements: () => {\n this.updateSizeAndPosition();\n\n if (!this.$deleteActionRadios.first().prop('checked')) {\n this.$deleteActionRadios.first().trigger('click');\n } else {\n this.validateDeleteInputs();\n }\n },\n onRemoveElements: this.validateDeleteInputs.bind(this),\n selectable: false,\n editable: false,\n });\n\n this.addListener($cancelBtn, 'click', 'hide');\n\n this.addListener(\n this.$deleteActionRadios,\n 'change',\n 'validateDeleteInputs'\n );\n this.addListener($form, 'submit', 'handleSubmit');\n\n this.base($form, settings);\n },\n\n _submitBtnLabel: function (withContent) {\n let message = withContent\n ? 'Delete {num, plural, =1{user} other{users}} and content'\n : 'Delete {num, plural, =1{user} other{users}}';\n\n return Craft.t('app', message, {\n num: Garnish.isArray(this.userId) ? this.userId.length : 1,\n });\n },\n\n validateDeleteInputs: function () {\n var validates = false;\n\n if (this.$deleteActionRadios.eq(1).prop('checked')) {\n validates = true;\n this.$deleteSubmitBtn.find('.label').text(this._submitBtnLabel(true));\n } else {\n this.$deleteSubmitBtn.find('.label').text(this._submitBtnLabel(false));\n if (this.$deleteActionRadios.eq(0).prop('checked')) {\n validates = !!this.userSelect.totalSelected;\n }\n }\n\n this.updateSizeAndPosition();\n\n if (validates) {\n this.$deleteSubmitBtn.removeClass('disabled');\n } else {\n this.$deleteSubmitBtn.addClass('disabled');\n }\n\n return validates;\n },\n\n handleSubmit: function (ev) {\n if (this._deleting || !this.validateDeleteInputs()) {\n ev.preventDefault();\n return;\n }\n\n this.$deleteSubmitBtn.addClass('loading');\n this.disable();\n this.userSelect.disable();\n this._deleting = true;\n\n // Let the onSubmit callback prevent the form from getting submitted\n try {\n if (this.settings.onSubmit() === false) {\n ev.preventDefault();\n }\n } catch (e) {\n ev.preventDefault();\n this.$deleteSubmitBtn.removeClass('loading');\n throw e;\n }\n },\n\n onFadeIn: function () {\n // Auto-focus the first radio\n if (!Garnish.isMobileBrowser(true)) {\n this.$deleteActionRadios.first().trigger('focus');\n }\n\n this.base();\n },\n },\n {\n defaults: {\n contentSummary: [],\n onSubmit: $.noop,\n redirect: null,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Handle Generator\n */\nCraft.DynamicGenerator = Craft.BaseInputGenerator.extend({\n callback: $.noop,\n\n init: function (source, target, callback) {\n this.callback = callback;\n this.base(source, target);\n },\n\n generateTargetValue: function (sourceVal) {\n return this.callback(sourceVal);\n },\n});\n","/* jshint -W083 */\n/**\n * Editable table class\n */\nCraft.EditableTable = Garnish.Base.extend(\n {\n initialized: false,\n\n id: null,\n baseName: null,\n columns: null,\n sorter: null,\n biggestId: -1,\n\n $table: null,\n $tbody: null,\n $addRowBtn: null,\n $tableParent: null,\n $statusMessage: null,\n\n rowCount: 0,\n hasMaxRows: false,\n hasMinRows: false,\n\n radioCheckboxes: null,\n\n init: function (id, baseName, columns, settings) {\n this.id = id;\n this.baseName = baseName;\n this.columns = columns;\n this.setSettings(settings, Craft.EditableTable.defaults);\n this.radioCheckboxes = {};\n\n this.$table = $('#' + id);\n this.$tbody = this.$table.children('tbody');\n this.$tableParent = this.$table.parent();\n this.$statusMessage = this.$tableParent.find('[data-status-message]');\n this.rowCount = this.$tbody.find('tr').length;\n\n // Is this already an editable table?\n if (this.$table.data('editable-table')) {\n console.warn('Double-instantiating an editable table on an element');\n this.$table.data('editable-table').destroy();\n }\n\n this.$table.data('editable-table', this);\n\n this.sorter = new Craft.DataTableSorter(this.$table, {\n helperClass: 'editabletablesorthelper',\n copyDraggeeInputValuesToHelper: true,\n onSortChange: () => {\n this.updateAllRows();\n },\n });\n\n if (this.isVisible()) {\n this.initialize();\n } else {\n // Give everything a chance to initialize\n window.setTimeout(this.initializeIfVisible.bind(this), 500);\n }\n\n if (this.settings.minRows && this.rowCount < this.settings.minRows) {\n for (var i = this.rowCount; i < this.settings.minRows; i++) {\n this.addRow();\n }\n }\n },\n\n isVisible: function () {\n return this.$table.parent().height() > 0;\n },\n\n initialize: function () {\n if (this.initialized) {\n return false;\n }\n\n this.initialized = true;\n this.removeListener(Garnish.$win, 'resize');\n\n var $rows = this.$tbody.children();\n\n for (var i = 0; i < $rows.length; i++) {\n this.createRowObj($rows[i]);\n }\n\n const $container = this.$table.parent('.input');\n if ($container.length && this.$table.width() > $container.width()) {\n $container.css('overflow-x', 'auto');\n }\n\n this.$addRowBtn = this.$table.next('.add');\n this.updateAddRowButton();\n this.addListener(this.$addRowBtn, 'activate', 'addRow');\n return true;\n },\n initializeIfVisible: function () {\n this.removeListener(Garnish.$win, 'resize');\n\n if (this.isVisible()) {\n this.initialize();\n } else {\n this.addListener(Garnish.$win, 'resize', 'initializeIfVisible');\n }\n },\n updateAddRowButton: function () {\n if (!this.canAddRow()) {\n this.$addRowBtn.css('opacity', '0.2');\n this.$addRowBtn.css('pointer-events', 'none');\n this.$addRowBtn.attr('aria-disabled', 'true');\n } else {\n this.$addRowBtn.css('opacity', '1');\n this.$addRowBtn.css('pointer-events', 'auto');\n this.$addRowBtn.attr('aria-disabled', 'false');\n }\n },\n updateAllRows: function () {\n if (this.settings.staticRows) {\n return;\n }\n const $rows = this.$table.find('> tbody > tr');\n for (let i = 0; i < $rows.length; i++) {\n this.updateRow($rows.eq(i));\n }\n },\n updateRow: function ($row) {\n if (this.settings.staticRows) {\n return;\n }\n\n const $deleteBtn = $row.find('button.delete');\n\n if ($deleteBtn.length) {\n $deleteBtn.attr(\n 'aria-label',\n Craft.t('app', 'Delete row {index}', {\n index: $row.index() + 1,\n })\n );\n if (this.canDeleteRow()) {\n $deleteBtn.removeAttr('disabled').removeClass('disabled');\n } else {\n $deleteBtn.attr('disabled', 'disabled').addClass('disabled');\n }\n }\n },\n /**\n * @deprecated\n */\n updateDeleteRowButton: function (rowId) {\n this.updateRow(this.$table.find(`tr[data-id=\"${rowId}\"]`));\n },\n updateStatusMessage: function () {\n this.$statusMessage.empty();\n let message;\n\n if (!this.canAddRow()) {\n message = Craft.t(\n 'app',\n 'Row could not be added. Maximum number of rows reached.'\n );\n } else {\n message = Craft.t(\n 'app',\n 'Row could not be deleted. Minimum number of rows reached.'\n );\n }\n\n setTimeout(() => {\n this.$statusMessage.text(message);\n }, 250);\n },\n canDeleteRow: function () {\n if (!this.settings.allowDelete) {\n return false;\n }\n\n return this.rowCount > this.settings.minRows;\n },\n deleteRow: function (row) {\n if (!this.canDeleteRow()) {\n this.updateStatusMessage();\n return;\n }\n\n this.sorter.removeItems(row.$tr);\n row.$tr.remove();\n\n this.rowCount--;\n\n this.updateAllRows();\n this.updateAddRowButton();\n\n if (this.rowCount === 0) {\n this.$table.addClass('hidden');\n this.$addRowBtn.trigger('focus');\n } else {\n // Focus element in previous row\n this.$tbody.find(':focusable').last().trigger('focus');\n }\n\n // onDeleteRow callback\n this.settings.onDeleteRow(row.$tr);\n\n row.destroy();\n },\n canAddRow: function () {\n if (!this.settings.allowAdd) {\n return false;\n }\n\n if (this.settings.maxRows) {\n return this.rowCount < this.settings.maxRows;\n }\n\n return true;\n },\n addRow: function (focus, prepend) {\n if (!this.canAddRow()) {\n this.updateStatusMessage();\n return;\n }\n\n var rowId = this.settings.rowIdPrefix + (this.biggestId + 1),\n $tr = this.createRow(\n rowId,\n this.columns,\n this.baseName,\n $.extend({}, this.settings.defaultValues)\n );\n\n if (prepend) {\n $tr.prependTo(this.$tbody);\n } else {\n $tr.appendTo(this.$tbody);\n }\n\n var row = this.createRowObj($tr);\n this.sorter.addItems($tr);\n\n // Focus the first input in the row\n if (focus !== false) {\n $tr\n .find('input:visible,textarea:visible,select:visible')\n .first()\n .trigger('focus');\n }\n\n this.rowCount++;\n this.updateAllRows();\n this.updateAddRowButton();\n this.$table.removeClass('hidden');\n\n // onAddRow callback\n this.settings.onAddRow($tr);\n\n return row;\n },\n\n createRow: function (rowId, columns, baseName, values) {\n return Craft.EditableTable.createRow(\n rowId,\n columns,\n baseName,\n values,\n this.settings.allowReorder,\n this.settings.allowDelete\n );\n },\n\n createRowObj: function ($tr) {\n return new Craft.EditableTable.Row(this, $tr);\n },\n\n focusOnPrevRow: function ($tr, tdIndex, blurTd) {\n var $prevTr = $tr.prev('tr');\n var prevRow;\n\n if ($prevTr.length) {\n prevRow = $prevTr.data('editable-table-row');\n } else {\n prevRow = this.addRow(false, true);\n }\n\n // Focus on the same cell in the previous row\n if (!prevRow) {\n return;\n }\n\n if (!prevRow.$tds[tdIndex]) {\n return;\n }\n\n if ($(prevRow.$tds[tdIndex]).hasClass('disabled')) {\n if ($prevTr) {\n this.focusOnPrevRow($prevTr, tdIndex, blurTd);\n }\n return;\n }\n\n var $input = $('textarea,input.text', prevRow.$tds[tdIndex]);\n if ($input.length) {\n $(blurTd).trigger('blur');\n $input.trigger('focus');\n }\n },\n\n focusOnNextRow: function ($tr, tdIndex, blurTd) {\n var $nextTr = $tr.next('tr');\n var nextRow;\n\n if ($nextTr.length) {\n nextRow = $nextTr.data('editable-table-row');\n } else {\n nextRow = this.addRow(false);\n }\n\n // Focus on the same cell in the next row\n if (!nextRow) {\n return;\n }\n\n if (!nextRow.$tds[tdIndex]) {\n return;\n }\n\n if ($(nextRow.$tds[tdIndex]).hasClass('disabled')) {\n if ($nextTr) {\n this.focusOnNextRow($nextTr, tdIndex, blurTd);\n }\n return;\n }\n\n var $input = $('textarea,input.text', nextRow.$tds[tdIndex]);\n if ($input.length) {\n $(blurTd).trigger('blur');\n $input.trigger('focus');\n }\n },\n\n importData: function (data, row, tdIndex) {\n let lines = data.split(/\\r?\\n|\\r/);\n for (let i = 0; i < lines.length; i++) {\n let values = lines[i].split('\\t');\n for (let j = 0; j < values.length; j++) {\n let value = values[j];\n row.$tds\n .eq(tdIndex + j)\n .find('textarea,input[type!=hidden]')\n .val(value)\n .trigger('input');\n }\n\n // move onto the next row\n let $nextTr = row.$tr.next('tr');\n if ($nextTr.length) {\n row = $nextTr.data('editable-table-row');\n } else {\n row = this.addRow(false);\n }\n }\n },\n\n destroy: function () {\n this.$table.removeData('editable-table');\n this.base();\n },\n },\n {\n textualColTypes: [\n 'autosuggest',\n 'color',\n 'date',\n 'email',\n 'multiline',\n 'number',\n 'singleline',\n 'template',\n 'time',\n 'url',\n ],\n defaults: {\n rowIdPrefix: '',\n defaultValues: {},\n allowAdd: false,\n allowReorder: false,\n allowDelete: false,\n minRows: null,\n maxRows: null,\n onAddRow: $.noop,\n onDeleteRow: $.noop,\n },\n\n createRow: function (\n rowId,\n columns,\n baseName,\n values,\n allowReorder,\n allowDelete\n ) {\n var $tr = $('<tr/>', {\n 'data-id': rowId,\n });\n\n for (var colId in columns) {\n if (!columns.hasOwnProperty(colId)) {\n continue;\n }\n\n var col = columns[colId],\n value = typeof values[colId] !== 'undefined' ? values[colId] : '',\n $cell;\n\n if (col.type === 'heading') {\n $cell = $('<th/>', {\n scope: 'row',\n class: col['class'],\n html: value,\n });\n } else {\n var name = baseName + '[' + rowId + '][' + colId + ']';\n\n $cell = $('<td/>', {\n class: `${col.class} ${col.type}-cell`,\n width: col.width,\n });\n\n if (Craft.inArray(col.type, Craft.EditableTable.textualColTypes)) {\n $cell.addClass('textual');\n }\n\n if (col.code) {\n $cell.addClass('code');\n }\n\n switch (col.type) {\n case 'checkbox':\n $('<div class=\"checkbox-wrapper\"/>')\n .append(\n Craft.ui.createCheckbox({\n name: name,\n value: col.value || '1',\n checked: !!value,\n })\n )\n .appendTo($cell);\n break;\n\n case 'color':\n Craft.ui\n .createColorInput({\n name: name,\n value: value,\n small: true,\n })\n .appendTo($cell);\n break;\n\n case 'date':\n Craft.ui\n .createDateInput({\n name: name,\n value: value,\n })\n .appendTo($cell);\n break;\n\n case 'lightswitch':\n Craft.ui\n .createLightswitch({\n name: name,\n value: col.value || '1',\n on: !!value,\n small: true,\n })\n .appendTo($cell);\n break;\n\n case 'select':\n Craft.ui\n .createSelect({\n name: name,\n options: col.options,\n value:\n value ||\n (function () {\n for (var key in col.options) {\n if (\n col.options.hasOwnProperty(key) &&\n col.options[key].default\n ) {\n return typeof col.options[key].value !== 'undefined'\n ? col.options[key].value\n : key;\n }\n }\n return null;\n })(),\n class: 'small',\n })\n .appendTo($cell);\n break;\n\n case 'time':\n Craft.ui\n .createTimeInput({\n name: name,\n value: value,\n })\n .appendTo($cell);\n break;\n\n case 'email':\n case 'url':\n Craft.ui\n .createTextInput({\n name: name,\n value: value,\n type: col.type,\n placeholder: col.placeholder || null,\n })\n .appendTo($cell);\n break;\n\n default:\n $('<textarea/>', {\n name: name,\n rows: col.rows || 1,\n val: value,\n placeholder: col.placeholder,\n }).appendTo($cell);\n }\n }\n\n $cell.appendTo($tr);\n }\n\n if (allowReorder) {\n $('<td/>', {\n class: 'thin action',\n })\n .append(\n $('<a/>', {\n class: 'move icon',\n title: Craft.t('app', 'Reorder'),\n role: 'button',\n type: 'button',\n })\n )\n .appendTo($tr);\n }\n\n if (allowDelete) {\n $('<td/>', {\n class: 'thin action',\n })\n .append(\n $('<button/>', {\n class: 'delete icon',\n title: Craft.t('app', 'Delete'),\n type: 'button',\n })\n )\n .appendTo($tr);\n }\n\n return $tr;\n },\n }\n);\n\n/**\n * Editable table row class\n */\nCraft.EditableTable.Row = Garnish.Base.extend(\n {\n table: null,\n id: null,\n niceTexts: null,\n\n $tr: null,\n $tds: null,\n tds: null,\n $textareas: null,\n $deleteBtn: null,\n\n init: function (table, tr) {\n this.table = table;\n this.$tr = $(tr);\n this.$tds = this.$tr.children();\n this.tds = [];\n this.id = this.$tr.attr('data-id');\n\n this.$tr.data('editable-table-row', this);\n\n // Get the row ID, sans prefix\n var id = parseInt(\n this.id.substring(this.table.settings.rowIdPrefix.length)\n );\n\n if (id > this.table.biggestId) {\n this.table.biggestId = id;\n }\n\n this.$textareas = $();\n this.niceTexts = [];\n var textareasByColId = {};\n\n var i = 0;\n var colId, col, td, $textarea, $checkbox;\n\n for (colId in this.table.columns) {\n if (!this.table.columns.hasOwnProperty(colId)) {\n continue;\n }\n\n col = this.table.columns[colId];\n td = this.tds[colId] = this.$tds[i];\n\n if (Craft.inArray(col.type, Craft.EditableTable.textualColTypes)) {\n $textarea = $('textarea', td);\n this.$textareas = this.$textareas.add($textarea);\n\n this.addListener($textarea, 'focus', 'onTextareaFocus');\n this.addListener($textarea, 'mousedown', 'ignoreNextTextareaFocus');\n\n this.niceTexts.push(\n new Garnish.NiceText($textarea, {\n onHeightChange: this.onTextareaHeightChange.bind(this),\n })\n );\n\n this.addListener(\n $textarea,\n 'keypress',\n {tdIndex: i, type: col.type},\n 'handleKeypress'\n );\n this.addListener(\n $textarea,\n 'input',\n {type: col.type},\n 'validateValue'\n );\n $textarea.trigger('input');\n\n if (col.type !== 'multiline') {\n this.addListener(\n $textarea,\n 'paste',\n {tdIndex: i, type: col.type},\n 'handlePaste'\n );\n }\n\n textareasByColId[colId] = $textarea;\n } else if (col.type === 'checkbox') {\n $checkbox = $('input[type=\"checkbox\"]', td);\n\n if (col.radioMode) {\n if (typeof this.table.radioCheckboxes[colId] === 'undefined') {\n this.table.radioCheckboxes[colId] = [];\n }\n this.table.radioCheckboxes[colId].push($checkbox[0]);\n this.addListener(\n $checkbox,\n 'change',\n {colId},\n 'onRadioCheckboxChange'\n );\n }\n\n if (col.toggle) {\n this.addListener($checkbox, 'change', {colId}, function (ev) {\n this.applyToggleCheckbox(ev.data.colId);\n });\n }\n }\n\n if (!$(td).hasClass('disabled')) {\n this.addListener(td, 'click', {td}, function (ev) {\n if (ev.target === ev.data.td) {\n $(ev.data.td).find('textarea,input,select,.lightswitch').focus();\n }\n });\n }\n\n i++;\n }\n\n // Now that all of the text cells have been nice-ified, let's normalize the heights\n this.onTextareaHeightChange();\n\n // See if we need to apply any checkbox toggles now that we've indexed all the TDs\n for (colId in this.table.columns) {\n if (!this.table.columns.hasOwnProperty(colId)) {\n continue;\n }\n col = this.table.columns[colId];\n if (col.type === 'checkbox' && col.toggle) {\n this.applyToggleCheckbox(colId);\n }\n }\n\n // Now look for any autopopulate columns\n for (colId in this.table.columns) {\n if (!this.table.columns.hasOwnProperty(colId)) {\n continue;\n }\n\n col = this.table.columns[colId];\n\n if (\n col.autopopulate &&\n typeof textareasByColId[col.autopopulate] !== 'undefined' &&\n !textareasByColId[colId].val()\n ) {\n new Craft.HandleGenerator(\n textareasByColId[colId],\n textareasByColId[col.autopopulate],\n {\n allowNonAlphaStart: true,\n }\n );\n }\n }\n\n var $deleteBtn = this.$tr.children().last().find('.delete');\n this.addListener($deleteBtn, 'click', 'deleteRow');\n\n var $inputs = this.$tr.find('input,textarea,select,.lightswitch');\n this.addListener($inputs, 'focus', function (ev) {\n $(ev.currentTarget).closest('td:not(.disabled)').addClass('focus');\n });\n this.addListener($inputs, 'blur', function (ev) {\n $(ev.currentTarget).closest('td').removeClass('focus');\n });\n },\n\n onTextareaFocus: function (ev) {\n this.onTextareaHeightChange();\n\n var $textarea = $(ev.currentTarget);\n\n if ($textarea.data('ignoreNextFocus')) {\n $textarea.data('ignoreNextFocus', false);\n return;\n }\n\n window.setTimeout(function () {\n Craft.selectFullValue($textarea);\n }, 0);\n },\n\n onRadioCheckboxChange: function (ev) {\n if (ev.currentTarget.checked) {\n for (\n var i = 0;\n i < this.table.radioCheckboxes[ev.data.colId].length;\n i++\n ) {\n var checkbox = this.table.radioCheckboxes[ev.data.colId][i];\n checkbox.checked = checkbox === ev.currentTarget;\n }\n }\n },\n\n applyToggleCheckbox: function (checkboxColId) {\n var checkboxCol = this.table.columns[checkboxColId];\n var checked = $('input[type=\"checkbox\"]', this.tds[checkboxColId]).prop(\n 'checked'\n );\n var colId, colIndex, neg;\n for (var i = 0; i < checkboxCol.toggle.length; i++) {\n colId = checkboxCol.toggle[i];\n colIndex = this.table.colum;\n neg = colId[0] === '!';\n if (neg) {\n colId = colId.substring(1);\n }\n if ((checked && !neg) || (!checked && neg)) {\n $(this.tds[colId])\n .removeClass('disabled')\n .find('textarea, input')\n .prop('disabled', false);\n } else {\n $(this.tds[colId])\n .addClass('disabled')\n .find('textarea, input')\n .prop('disabled', true);\n }\n }\n },\n\n ignoreNextTextareaFocus: function (ev) {\n $.data(ev.currentTarget, 'ignoreNextFocus', true);\n },\n\n handleKeypress: function (ev) {\n var keyCode = ev.keyCode ? ev.keyCode : ev.charCode;\n var ctrl = Garnish.isCtrlKeyPressed(ev);\n\n // Going to the next/previous row?\n if (\n keyCode === Garnish.RETURN_KEY &&\n (ev.data.type !== 'multiline' || ctrl)\n ) {\n ev.preventDefault();\n if (ev.shiftKey) {\n this.table.focusOnPrevRow(\n this.$tr,\n ev.data.tdIndex,\n ev.currentTarget\n );\n } else {\n this.table.focusOnNextRow(\n this.$tr,\n ev.data.tdIndex,\n ev.currentTarget\n );\n }\n return;\n }\n },\n\n handlePaste: function (ev) {\n let data = Craft.trim(\n ev.originalEvent.clipboardData.getData('Text'),\n ' \\n\\r'\n );\n if (!data.match(/[\\t\\r\\n]/)) {\n return;\n }\n ev.preventDefault();\n this.table.importData(data, this, ev.data.tdIndex);\n },\n\n validateValue: function (ev) {\n if (ev.data.type === 'multiline') {\n return;\n }\n\n if (ev.data.type === 'number') {\n Craft.filterNumberInputVal(ev.currentTarget);\n return;\n }\n\n // Strip any newlines\n const safeValue = ev.currentTarget.value.replace(/[\\r\\n]/g, '');\n if (safeValue !== ev.currentTarget.value) {\n ev.currentTarget.value = safeValue;\n }\n },\n\n onTextareaHeightChange: function () {\n // Keep all the textareas' heights in sync\n var tallestTextareaHeight = -1;\n\n for (var i = 0; i < this.niceTexts.length; i++) {\n if (this.niceTexts[i].height > tallestTextareaHeight) {\n tallestTextareaHeight = this.niceTexts[i].height;\n }\n }\n\n this.$textareas.css('min-height', tallestTextareaHeight);\n\n // If the <td> is still taller, go with that instead\n var tdHeight = this.$textareas\n .filter(':visible')\n .first()\n .parent()\n .height();\n\n if (tdHeight > tallestTextareaHeight) {\n this.$textareas.css('min-height', tdHeight);\n }\n },\n\n deleteRow: function () {\n this.table.deleteRow(this);\n },\n },\n {\n /** @deprecated */\n numericKeyCodes: [\n 9 /* (tab) */, 8 /* (delete) */, 37, 38, 39, 40 /* (arrows) */, 45,\n 91 /* (minus) */, 46, 190 /* period */, 48, 49, 50, 51, 52, 53, 54, 55,\n 56, 57 /* (0-9) */,\n ],\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Element Action Trigger\n */\nCraft.ElementActionTrigger = Garnish.Base.extend(\n {\n maxLevels: null,\n newChildUrl: null,\n $trigger: null,\n $selectedItems: null,\n triggerEnabled: true,\n\n init: function (settings) {\n if (!$.isPlainObject(settings)) {\n settings = {};\n }\n\n // batch => bulk\n if (typeof settings.batch !== 'undefined') {\n settings.bulk = settings.batch;\n delete settings.batch;\n }\n Object.defineProperty(settings, 'batch', {\n get() {\n return this.bulk;\n },\n set(v) {\n this.bulk = v;\n },\n });\n\n this.setSettings(settings, Craft.ElementActionTrigger.defaults);\n\n this.$trigger = $(\n '#' + settings.type.replace(/[\\[\\]\\\\]+/g, '-') + '-actiontrigger'\n );\n\n // Do we have a custom handler?\n if (this.settings.activate) {\n // Prevent the element index's click handler\n this.$trigger.data('custom-handler', true);\n\n // Is this a custom trigger?\n if (this.$trigger.prop('nodeName') === 'FORM') {\n this.addListener(this.$trigger, 'submit', 'handleTriggerActivation');\n } else {\n this.addListener(this.$trigger, 'click', 'handleTriggerActivation');\n }\n }\n\n this.updateTrigger();\n Craft.elementIndex.on('selectionChange', this.updateTrigger.bind(this));\n },\n\n updateTrigger: function () {\n // Ignore if the last element was just unselected\n if (Craft.elementIndex.getSelectedElements().length === 0) {\n return;\n }\n\n if (this.validateSelection()) {\n this.enableTrigger();\n } else {\n this.disableTrigger();\n }\n },\n\n /**\n * Determines if this action can be performed on the currently selected elements.\n *\n * @returns {boolean}\n */\n validateSelection: function () {\n var valid = true;\n this.$selectedItems = Craft.elementIndex.getSelectedElements();\n\n if (!this.settings.bulk && this.$selectedItems.length > 1) {\n valid = false;\n } else if (typeof this.settings.validateSelection === 'function') {\n valid = this.settings.validateSelection(this.$selectedItems);\n }\n\n return valid;\n },\n\n enableTrigger: function () {\n if (this.triggerEnabled) {\n return;\n }\n\n this.$trigger.removeClass('disabled');\n this.triggerEnabled = true;\n },\n\n disableTrigger: function () {\n if (!this.triggerEnabled) {\n return;\n }\n\n this.$trigger.addClass('disabled');\n this.triggerEnabled = false;\n },\n\n handleTriggerActivation: function (ev) {\n ev.preventDefault();\n ev.stopPropagation();\n\n if (this.triggerEnabled) {\n this.settings.activate(this.$selectedItems);\n }\n },\n },\n {\n defaults: {\n type: null,\n bulk: true,\n validateSelection: null,\n activate: null,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n\n/**\n * Element Editor\n */\nCraft.ElementEditor = Garnish.Base.extend(\n {\n isFullPage: null,\n $container: null,\n $tabContainer: null,\n $contentContainer: null,\n $revisionBtn: null,\n $revisionLabel: null,\n $spinner: null,\n $expandSiteStatusesBtn: null,\n $statusIcon: null,\n $previewBtn: null,\n\n $editMetaBtn: null,\n metaHud: null,\n $nameTextInput: null,\n $saveMetaBtn: null,\n\n $siteStatusPane: null,\n $globalLightswitch: null,\n $siteLightswitches: null,\n $additionalSiteField: null,\n\n siteIds: null,\n newSiteIds: null,\n\n enableAutosave: null,\n lastSerializedValue: null,\n listeningForChanges: false,\n pauseLevel: 0,\n timeout: null,\n cancelToken: null,\n ignoreFailedRequest: false,\n queue: null,\n submittingForm: false,\n\n duplicatedElements: null,\n failed: false,\n httpStatus: null,\n httpError: null,\n\n openingPreview: false,\n preview: null,\n activatedPreviewToken: false,\n previewTokenQueue: null,\n previewLinks: null,\n scrollY: null,\n\n hiddenTipsStorageKey: 'Craft-' + Craft.systemUid + '.TipField.hiddenTips',\n\n get tipDismissBtn() {\n return this.$container.find('.tip-dismiss-btn');\n },\n\n get slideout() {\n return this.$container.data('slideout');\n },\n\n init: function (container, settings) {\n this.$container = $(container);\n\n if (this.$container.prop('tagName') !== 'FORM') {\n throw 'Element editors may only be used with forms.';\n }\n\n if (this.$container.data('elementEditor')) {\n console.warn('Double-instantiating an element editor on an element.');\n this.$container.data('elementEditor').destroy();\n }\n\n this.$container.data('elementEditor', this);\n this.$container.attr('data-element-editor', '');\n\n this.setSettings(settings, Craft.ElementEditor.defaults);\n\n this.isFullPage = this.$container[0] === Craft.cp.$primaryForm[0];\n\n if (this.isFullPage) {\n this.$tabContainer = $('#tabs');\n this.$contentContainer = $('#content');\n } else {\n this.$tabContainer = this.slideout.$tabContainer;\n this.$contentContainer = this.slideout.$content;\n }\n\n this.queue = this._createQueue();\n this.previewTokenQueue = this._createQueue();\n\n this.duplicatedElements = {};\n this.enableAutosave = Craft.autosaveDrafts;\n this.previewLinks = [];\n\n this.siteIds = Object.keys(this.settings.siteStatuses).map((siteId) => {\n return parseInt(siteId);\n });\n\n this.$revisionBtn = this.$container.find('.context-btn');\n this.$revisionLabel = this.$container.find('.revision-label');\n this.$previewBtn = this.$container.find('.preview-btn');\n\n const $spinnerContainer = this.isFullPage\n ? $('#page-title')\n : this.slideout.$toolbar;\n this.$spinner = $('<div/>', {\n class: 'revision-spinner spinner hidden',\n title: Craft.t('app', 'Saving'),\n }).appendTo($spinnerContainer);\n this.$statusIcon = $('<div/>', {\n class: `revision-status ${this.isFullPage ? 'invisible' : 'hidden'}`,\n }).appendTo($spinnerContainer);\n this.$statusMessage = $('<div/>', {\n class: 'revision-status-message visually-hidden',\n 'aria-live': 'polite',\n }).appendTo($spinnerContainer);\n\n this.$expandSiteStatusesBtn = $('.expand-status-btn');\n\n if (this.settings.canEditMultipleSites) {\n this.addListener(\n this.$expandSiteStatusesBtn,\n 'click',\n 'expandSiteStatuses'\n );\n }\n\n if (this.settings.previewTargets.length && this.isFullPage) {\n if (this.settings.enablePreview) {\n this.addListener(this.$previewBtn, 'click', 'openPreview');\n }\n\n const $previewBtnContainer = this.$container.find(\n '.preview-btn-container'\n );\n\n if (this.settings.previewTargets.length === 1) {\n const [target] = this.settings.previewTargets;\n this.createPreviewLink(target)\n .addClass('view-btn btn')\n .attr('aria-label', Craft.t('app', 'View'))\n .appendTo($previewBtnContainer);\n } else {\n this.createShareMenu($previewBtnContainer);\n }\n }\n\n // If this is a revision, we're done here\n if (this.settings.revisionId) {\n return;\n }\n\n // Override the serializer to use our own\n this.$container.data('serializer', () => this.serializeForm(true));\n this.$container.data('initialSerializedValue', this.serializeForm(true));\n\n if (this.isFullPage) {\n this.addListener(this.$container, 'submit', 'handleSubmit');\n }\n\n if (this.settings.isProvisionalDraft) {\n this.initForProvisionalDraft();\n } else if (this.settings.draftId && !this.settings.isUnpublishedDraft) {\n this.initForDraft();\n } else if (!this.settings.canSaveCanonical) {\n // Override the save shortcut to create a draft too\n this.addListener(this.$container, 'submit.saveShortcut', (ev) => {\n if (ev.saveShortcut) {\n ev.preventDefault();\n this.createDraft();\n this.removeListener(this.$container, 'submit.saveShortcut');\n }\n });\n }\n\n this.listenForChanges();\n\n this.addListener(this.$statusIcon, 'click', () => {\n this.showStatusHud(this.$statusIcon);\n });\n\n // handle closing tips\n this.handleDismissibleTips();\n\n if (this.isFullPage && Craft.messageReceiver) {\n // Listen on Craft.broadcaster to ignore any messages sent by this very page\n Craft.broadcaster.addEventListener('message', (ev) => {\n if (\n (ev.data.event === 'saveDraft' &&\n ev.data.canonicalId === this.settings.canonicalId &&\n (ev.data.draftId === this.settings.draftId ||\n (ev.data.isProvisionalDraft && !this.settings.draftId))) ||\n (ev.data.event === 'saveElement' &&\n ev.data.id === this.settings.canonicalId &&\n !this.settings.draftId)\n ) {\n Craft.setLocalStorage('scrollY', window.scrollY);\n window.location.reload();\n } else if (\n ev.data.event === 'deleteDraft' &&\n ev.data.canonicalId === this.settings.canonicalId &&\n ev.data.draftId === this.settings.draftId\n ) {\n const url = new URL(window.location.href);\n url.searchParams.delete('draftId');\n if (url.href !== document.location.href) {\n window.location.href = url;\n } else {\n Craft.setLocalStorage('scrollY', window.scrollY);\n window.location.reload();\n }\n }\n });\n }\n },\n\n _createQueue: function () {\n const queue = new Craft.Queue();\n queue.on('beforeRun', () => {\n this.showSpinner();\n });\n queue.on('afterRun', () => {\n this.hideSpinner();\n });\n return queue;\n },\n\n get namespace() {\n if (this.isFullPage) {\n return null;\n }\n\n return this.slideout.namespace;\n },\n\n namespaceInputName(name) {\n return Craft.namespaceInputName(name, this.namespace);\n },\n\n namespaceId(id) {\n return Craft.namespaceId(id, this.namespace);\n },\n\n listenForChanges: function () {\n if (\n this.listeningForChanges ||\n this.pauseLevel > 0 ||\n !this.enableAutosave ||\n !this.settings.canCreateDrafts\n ) {\n return;\n }\n\n this.listeningForChanges = true;\n\n // Listen for events on the body when editing a full page form, so we don’t miss events from Live Preview\n const $target = this.isFullPage ? Garnish.$bod : this.$container;\n\n this.addListener(\n $target,\n 'keypress,keyup,change,focus,blur,click,mousedown,mouseup',\n (ev) => {\n if ($(ev.target).is(this.statusIcons())) {\n return;\n }\n clearTimeout(this.timeout);\n // If they are typing, wait half a second before checking the form\n if (['keypress', 'keyup', 'change'].includes(ev.type)) {\n this.timeout = setTimeout(this.checkForm.bind(this), 500);\n } else {\n this.checkForm();\n }\n }\n );\n },\n\n stopListeningForChanges: function () {\n if (!this.listeningForChanges) {\n return;\n }\n\n this.removeListener(\n Garnish.$bod,\n 'keypress,keyup,change,focus,blur,click,mousedown,mouseup'\n );\n clearTimeout(this.timeout);\n this.listeningForChanges = false;\n },\n\n pause: function () {\n this.pauseLevel++;\n this.stopListeningForChanges();\n },\n\n resume: function () {\n if (this.pauseLevel === 0) {\n throw 'Craft.ElementEditor::resume() should only be called after pause().';\n }\n\n // Only actually resume operation if this has been called the same\n // number of times that pause() was called\n this.pauseLevel--;\n if (this.pauseLevel === 0) {\n if (this.enableAutosave) {\n this.checkForm();\n this.listenForChanges();\n }\n }\n },\n\n initForProvisionalDraft: function () {\n let $discardButton = this.$container.find('.discard-changes-btn');\n\n if (!$discardButton.length) {\n let initialHeight, scrollTop;\n\n let $noticeContainer;\n if (this.isFullPage) {\n initialHeight = $('#content').height();\n scrollTop = Garnish.$win.scrollTop();\n $noticeContainer = Craft.cp.$noticeContainer;\n } else {\n $noticeContainer = this.$container.find('.so-notice');\n }\n\n const $notice = $('<div/>', {\n class: 'draft-notice',\n })\n .append(\n $('<div/>', {\n class: 'draft-icon',\n 'aria-hidden': 'true',\n 'data-icon': 'edit',\n })\n )\n .append(\n $('<p/>', {\n text: Craft.t('app', 'Showing your unsaved changes.'),\n })\n )\n .appendTo($noticeContainer);\n\n $discardButton = $('<button/>', {\n type: 'button',\n class: 'discard-changes-btn btn',\n text: Craft.t('app', 'Discard'),\n }).appendTo($notice);\n\n if (this.isFullPage) {\n const heightDiff = $('#content').height() - initialHeight;\n Garnish.$win.scrollTop(scrollTop + heightDiff);\n\n // If there isn’t enough content to simulate the same scroll position, slide it down instead\n if (Garnish.$win.scrollTop() === scrollTop) {\n // Disable pointer events until half a second after the animation is complete\n Craft.cp.$contentContainer.css('pointer-events', 'none');\n\n $('#content-header').css('min-height', 'auto');\n const height = $noticeContainer.height();\n $noticeContainer\n .css({height: height - heightDiff, overflow: 'hidden'})\n .velocity({height: height}, 'fast', () => {\n $('#content-header').css('min-height', '');\n $noticeContainer.css({height: '', overflow: ''});\n\n setTimeout(() => {\n Craft.cp.$contentContainer.css('pointer-events', '');\n }, 300);\n });\n }\n }\n }\n\n this.addListener(\n $discardButton,\n 'keypress,keyup,change,focus,blur,click,mousedown,mouseup',\n (ev) => {\n ev.stopPropagation();\n }\n );\n\n this.addListener($discardButton, 'click', () => {\n if (\n confirm(\n Craft.t('app', 'Are you sure you want to discard your changes?')\n )\n ) {\n this.queue.unshift(\n () =>\n new Promise((resolve, reject) => {\n if (this.isFullPage) {\n Craft.submitForm(this.$container, {\n action: 'elements/delete-draft',\n redirect: this.settings.hashedCpEditUrl,\n params: {\n draftId: this.settings.draftId,\n provisional: 1,\n },\n });\n } else {\n Craft.sendActionRequest('POST', 'elements/delete-draft', {\n data: {\n elementId: this.settings.canonicalId,\n draftId: this.settings.draftId,\n provisional: 1,\n },\n })\n .then((response) => {\n Craft.cp.displaySuccess(response.data.message);\n this.slideout.close();\n })\n .catch(reject);\n }\n })\n );\n }\n });\n },\n\n initForDraft: function () {\n // Create the edit draft button\n this.createEditMetaBtn();\n\n if (this.settings.canSaveCanonical) {\n Garnish.uiLayerManager.registerShortcut(\n {\n keyCode: Garnish.S_KEY,\n ctrl: true,\n alt: true,\n },\n () => {\n Craft.submitForm(this.$container, {\n action: 'elements/apply-draft',\n redirect: this.settings.hashedCpEditUrl,\n });\n },\n 0\n );\n }\n },\n\n expandSiteStatuses: function () {\n this.removeListener(this.$expandSiteStatusesBtn, 'click');\n this.$expandSiteStatusesBtn.velocity({opacity: 0}, 'fast', () => {\n this.$expandSiteStatusesBtn.remove();\n });\n\n const $enabledForSiteField = this.$container.find(\n `.enabled-for-site-${this.settings.siteId}-field`\n );\n this.$siteStatusPane = $enabledForSiteField.parent();\n\n // If this is a revision, just show the site statuses statically and be done\n if (this.settings.revisionId) {\n this._getOtherSupportedSites().forEach((s) =>\n this._createSiteStatusField(s)\n );\n return;\n }\n\n $enabledForSiteField.addClass('nested');\n const $globalField = Craft.ui\n .createLightswitchField({\n label: Craft.t('app', 'Enabled for all sites'),\n name: this.namespaceInputName('enabled'),\n })\n .insertBefore($enabledForSiteField);\n $globalField.find('label').css('font-weight', 'bold');\n this.$globalLightswitch = $globalField.find('.lightswitch');\n\n if (!this.settings.revisionId) {\n this._showField($globalField);\n }\n\n // Figure out what the \"Enabled everywhere\" lightswitch would have been set to when the page first loaded\n const siteStatusValues = Object.values(this.settings.siteStatuses);\n const hasEnabled = siteStatusValues.includes(true);\n const hasDisabled = siteStatusValues.includes(false);\n const originalEnabledValue =\n hasEnabled && hasDisabled ? '-' : hasEnabled ? '1' : '';\n const originalSerializedStatus =\n encodeURIComponent(\n this.namespaceInputName(`enabledForSite[${this.settings.siteId}]`)\n ) +\n '=' +\n (this.settings.enabledForSite ? '1' : '');\n\n this.$siteLightswitches = $enabledForSiteField\n .find('.lightswitch')\n .on('change', this._updateGlobalStatus.bind(this));\n\n this._getOtherSupportedSites().forEach((s) =>\n this._createSiteStatusField(s)\n );\n\n let serializedStatuses =\n encodeURIComponent(this.namespaceInputName('enabled')) +\n `=${originalEnabledValue}`;\n for (let i = 0; i < this.$siteLightswitches.length; i++) {\n const $input = this.$siteLightswitches.eq(i).data('lightswitch').$input;\n serializedStatuses +=\n '&' + encodeURIComponent($input.attr('name')) + '=' + $input.val();\n }\n\n this.$container.data(\n 'initialSerializedValue',\n this.$container\n .data('initialSerializedValue')\n .replace(originalSerializedStatus, serializedStatuses)\n );\n\n if (this.lastSerializedValue) {\n this.lastSerializedValue = this.lastSerializedValue.replace(\n originalSerializedStatus,\n serializedStatuses\n );\n }\n\n // Are there additional sites that can be added?\n if (\n this.settings.additionalSites &&\n this.settings.additionalSites.length &&\n this.isFullPage\n ) {\n this._createAddlSiteField();\n }\n\n // Focus on first lightswitch\n this.$globalLightswitch.focus();\n\n this.$globalLightswitch.on('change', this._updateSiteStatuses.bind(this));\n this._updateGlobalStatus();\n },\n\n /**\n * @returns {Array}\n */\n _getOtherSupportedSites: function () {\n return Craft.sites.filter(\n (s) => s.id != this.settings.siteId && this.siteIds.includes(s.id)\n );\n },\n\n _showField: function ($field) {\n const height = $field.height();\n $field\n .css({\n overflow: 'hidden',\n 'min-height': 'auto',\n })\n .height(0)\n .velocity({height}, 'fast', () => {\n $field.css({\n overflow: '',\n height: '',\n 'min-height': '',\n });\n });\n },\n\n _removeField: function ($field) {\n $field\n .css({\n overflow: 'hidden',\n 'min-height': 'auto',\n })\n .velocity({height: 0}, 'fast', () => {\n $field.remove();\n });\n },\n\n _updateGlobalStatus: function () {\n let allEnabled = true,\n allDisabled = true;\n this.$siteLightswitches.each(function () {\n const enabled = $(this).data('lightswitch').on;\n if (enabled) {\n allDisabled = false;\n } else {\n allEnabled = false;\n }\n if (!allEnabled && !allDisabled) {\n return false;\n }\n });\n if (allEnabled) {\n this.$globalLightswitch.data('lightswitch').turnOn(true);\n } else if (allDisabled) {\n this.$globalLightswitch.data('lightswitch').turnOff(true);\n } else {\n this.$globalLightswitch.data('lightswitch').turnIndeterminate(true);\n }\n },\n\n _updateSiteStatuses: function () {\n const enabled = this.$globalLightswitch.data('lightswitch').on;\n this.$siteLightswitches.each(function () {\n if (enabled) {\n $(this).data('lightswitch').turnOn(true);\n } else {\n $(this).data('lightswitch').turnOff(true);\n }\n });\n },\n\n _createSiteStatusField: function (site, status) {\n const $field = Craft.ui.createLightswitchField({\n fieldClass: `enabled-for-site-${site.id}-field`,\n label: site.name,\n name: this.namespaceInputName(`enabledForSite[${site.id}]`),\n on:\n typeof status != 'undefined'\n ? status\n : this.settings.siteStatuses.hasOwnProperty(site.id)\n ? this.settings.siteStatuses[site.id]\n : true,\n disabled: !!this.settings.revisionId,\n });\n\n if (this.$additionalSiteField) {\n $field.insertBefore(this.$additionalSiteField);\n } else {\n $field.appendTo(this.$siteStatusPane);\n }\n\n if (!this.settings.revisionId) {\n $field.addClass('nested');\n const $lightswitch = $field\n .find('.lightswitch')\n .on('change', this._updateGlobalStatus.bind(this));\n this.$siteLightswitches = this.$siteLightswitches.add($lightswitch);\n }\n\n this._showField($field);\n\n return $field;\n },\n\n _createAddlSiteField: function () {\n const additionalSites = Craft.sites.filter((site) => {\n return (\n !this.siteIds.includes(site.id) &&\n this.settings.additionalSites.some((s) => s.siteId == site.id)\n );\n });\n\n if (!additionalSites.length) {\n return;\n }\n\n const selectLabelId = 'add-site-label';\n\n const $addlSiteSelectLabel = $('<span/>', {\n text: Craft.t('app', 'Add a site...'),\n class: 'visually-hidden',\n id: selectLabelId,\n });\n\n const $addlSiteSelectContainer = Craft.ui\n .createSelect({\n options: [\n {label: Craft.t('app', 'Add a site…')},\n ...additionalSites.map((s) => {\n return {label: s.name, value: s.id};\n }),\n ],\n labelledBy: selectLabelId,\n })\n .addClass('fullwidth');\n\n this.$additionalSiteField = Craft.ui\n .createField($addlSiteSelectContainer, {})\n .addClass('nested add')\n .appendTo(this.$siteStatusPane);\n\n $addlSiteSelectLabel.prependTo(this.$additionalSiteField);\n\n const $addlSiteSelect = $addlSiteSelectContainer.find('select');\n\n $addlSiteSelect.on('change', () => {\n const siteId = parseInt($addlSiteSelect.val());\n const site = Craft.sites.find((s) => s.id === siteId);\n\n if (!site) {\n return;\n }\n\n const addlSiteInfo = this.settings.additionalSites.find(\n (s) => s.siteId == site.id\n );\n this._createSiteStatusField(site, addlSiteInfo.enabledByDefault);\n this._updateGlobalStatus();\n\n $addlSiteSelect.val('').find(`option[value=\"${siteId}\"]`).remove();\n\n if (this.newSiteIds === null) {\n this.newSiteIds = [];\n }\n\n this.siteIds.push(siteId);\n this.newSiteIds.push(siteId);\n\n // Was that the last site?\n if ($addlSiteSelect.find('option').length === 1) {\n this._removeField(this.$additionalSiteField);\n }\n });\n\n this._showField(this.$additionalSiteField);\n },\n\n showStatusHud: function (target) {\n let bodyHtml;\n\n if (!this.failed) {\n bodyHtml = `<p>${this._saveSuccessMessage()}</p>`;\n } else {\n bodyHtml = `<p class=\"error\"><strong>${this._saveFailMessage()}</strong></p>`;\n\n if (this.httpError) {\n bodyHtml += `<p class=\"http-error code\">${Craft.escapeHtml(\n this.httpError\n )}</p>`;\n }\n\n if (this.httpStatus === 400) {\n bodyHtml += `<button class=\"btn refresh-btn\">${Craft.t(\n 'app',\n 'Refresh'\n )}</button>`;\n }\n }\n\n const hud = new Garnish.HUD(target, bodyHtml, {\n hudClass: 'hud revision-status-hud',\n onHide: function () {\n hud.destroy();\n },\n });\n\n hud.$mainContainer.find('.refresh-btn').on('click', () => {\n window.location.reload();\n });\n },\n\n /**\n * @returns {string}\n */\n _saveSuccessMessage: function () {\n return this.settings.isProvisionalDraft ||\n this.settings.isUnpublishedDraft\n ? Craft.t('app', 'Your changes have been stored.')\n : Craft.t('app', 'The draft has been saved.');\n },\n\n /**\n * @returns {string}\n */\n _saveFailMessage: function () {\n return this.settings.isProvisionalDraft ||\n this.settings.isUnpublishedDraft\n ? Craft.t('app', 'Your changes could not be stored.')\n : Craft.t('app', 'The draft could not be saved.');\n },\n\n spinners: function () {\n return this.preview\n ? this.$spinner.add(this.preview.$spinner)\n : this.$spinner;\n },\n\n showSpinner: function () {\n this.spinners().removeClass('hidden');\n },\n\n hideSpinner: function () {\n this.spinners().addClass('hidden');\n },\n\n statusIcons: function () {\n return this.preview\n ? this.$statusIcon.add(this.preview.$statusIcon)\n : this.$statusIcon;\n },\n\n statusMessage: function () {\n return this.preview\n ? this.$statusMessage.add(this.preview.$statusMessage)\n : this.$statusMessage;\n },\n\n createEditMetaBtn: function () {\n const $btnGroup = this.$container.find('.context-btngroup');\n this.$editMetaBtn = $('<button/>', {\n type: 'button',\n class: 'btn edit icon',\n 'aria-expanded': 'false',\n 'aria-label': Craft.t('app', 'Edit draft settings'),\n title: Craft.t('app', 'Edit draft settings'),\n }).appendTo($btnGroup);\n $btnGroup.find('.btngroup-btn-last').removeClass('btngroup-btn-last');\n this.addListener(this.$editMetaBtn, 'click', 'showMetaHud');\n },\n\n createPreviewLink: function (target, label) {\n const $a = $('<a/>', {\n href: this.getTokenizedPreviewUrl(target.url, null, false),\n text: label || Craft.t('app', 'View'),\n target: '_blank',\n data: {\n targetUrl: target.url,\n targetLabel: target.label,\n },\n });\n\n this.addListener($a, 'click', () => {\n setTimeout(() => {\n this.activatePreviewToken();\n }, 1);\n });\n\n this.previewLinks.push($a);\n return $a;\n },\n\n updatePreviewLinks: function () {\n this.previewLinks.forEach(($a) => {\n this.updatePreviewLinkHref($a);\n if (this.activatedPreviewToken) {\n this.removeListener($a, 'click');\n }\n });\n },\n\n updatePreviewLinkHref: function ($a) {\n $a.attr(\n 'href',\n this.getTokenizedPreviewUrl($a.data('targetUrl'), null, false)\n );\n },\n\n activatePreviewToken: function () {\n if (this.settings.isLive) {\n // don't do anything yet, but leave the event in case we need it later\n return;\n }\n\n this.activatedPreviewToken = true;\n this.updatePreviewLinks();\n },\n\n createShareMenu: function ($container) {\n const $btn = $('<button/>', {\n type: 'button',\n class: 'view-btn btn menubtn',\n text: Craft.t('app', 'View'),\n }).appendTo($container);\n\n const $menu = $('<div/>', {class: 'menu'}).appendTo($container);\n const $ul = $('<ul/>').appendTo($menu);\n\n this.settings.previewTargets.forEach((target) => {\n $('<li/>')\n .append(this.createPreviewLink(target, target.label))\n .appendTo($ul);\n });\n\n new Garnish.MenuBtn($btn);\n },\n\n getPreviewTokenParams: function () {\n const params = {\n elementType: this.settings.elementType,\n canonicalId: this.settings.canonicalId,\n siteId: this.settings.siteId,\n revisionId: this.settings.revisionId,\n previewToken: this.settings.previewToken,\n };\n\n if (this.settings.draftId && !this.settings.isProvisionalDraft) {\n params.draftId = this.settings.draftId;\n }\n\n return params;\n },\n\n getPreviewToken: function () {\n return this.previewTokenQueue.push(() => {\n return new Promise((resolve, reject) => {\n if (this.activatedPreviewToken) {\n resolve(this.settings.previewToken);\n return;\n }\n\n Craft.sendActionRequest('POST', 'preview/create-token', {\n data: this.getPreviewTokenParams(),\n })\n .then(() => {\n this.activatePreviewToken();\n resolve(this.settings.previewToken);\n })\n .catch(reject);\n });\n });\n },\n\n /**\n * @param {string} url\n * @param {?string} [randoParam]\n * @param {boolean} [asPromise=false]\n * @returns {(Promise|string)}\n */\n getTokenizedPreviewUrl: function (url, randoParam, asPromise) {\n if (typeof asPromise === 'undefined') {\n asPromise = true;\n }\n\n const params = {};\n\n if (randoParam || !this.settings.isLive) {\n // Randomize the URL so CDNs don't return cached pages\n params[randoParam || 'x-craft-preview'] = Craft.randomString(10);\n }\n\n if (this.settings.siteToken) {\n params[Craft.siteToken] = this.settings.siteToken;\n }\n\n // No need for a token if we're looking at a live element\n if (this.settings.isLive) {\n const previewUrl = Craft.getUrl(url, params);\n\n if (asPromise) {\n return new Promise((resolve) => {\n resolve(previewUrl);\n });\n }\n\n return previewUrl;\n }\n\n if (!this.settings.previewToken) {\n throw 'Missing preview token';\n }\n\n params[Craft.tokenParam] = this.settings.previewToken;\n const previewUrl = Craft.getUrl(url, params);\n\n if (this.activatedPreviewToken) {\n if (asPromise) {\n return new Promise((resolve) => {\n resolve(previewUrl);\n });\n }\n\n return previewUrl;\n }\n\n if (asPromise) {\n return new Promise((resolve, reject) => {\n this.getPreviewToken()\n .then(() => {\n resolve(previewUrl);\n })\n .catch(reject);\n });\n }\n\n const createTokenParams = this.getPreviewTokenParams();\n createTokenParams.redirect = previewUrl;\n return Craft.getActionUrl('preview/create-token', createTokenParams);\n },\n\n getPreview: function () {\n if (!this.preview) {\n this.preview = new Craft.Preview(this);\n if (!this.enableAutosave) {\n this.preview.on('open', () => {\n this.enableAutosave = true;\n this.listenForChanges();\n });\n this.preview.on('close', () => {\n this.enableAutosave = false;\n this.stopListeningForChanges();\n\n // Hide the status icon if the save was successful\n const $statusIcons = this.statusIcons();\n if ($statusIcons.hasClass('checkmark-icon')) {\n $statusIcons.addClass('hidden');\n }\n });\n }\n this.preview.on('close', () => {\n if (this.scrollY) {\n window.scrollTo(0, this.scrollY);\n this.scrollY = null;\n }\n });\n }\n return this.preview;\n },\n\n openPreview: function () {\n if (Garnish.hasAttr(this.$previewBtn, 'aria-disabled')) {\n return;\n }\n\n this.$previewBtn.attr('aria-disabled', true);\n this.$previewBtn.addClass('loading');\n\n this.queue.push(\n () =>\n new Promise((resolve, reject) => {\n this.openingPreview = true;\n this.ensureIsDraftOrRevision(true)\n .then(() => {\n this.scrollY = window.scrollY;\n this.$previewBtn.removeAttr('aria-disabled');\n this.$previewBtn.removeClass('loading');\n this.getPreview().open();\n this.openingPreview = false;\n resolve();\n })\n .catch(reject);\n })\n );\n },\n\n ensureIsDraftOrRevision: function (onlyIfChanged) {\n return new Promise((resolve, reject) => {\n if (!this.settings.draftId && !this.settings.revisionId) {\n if (\n onlyIfChanged &&\n this.serializeForm(true) ===\n this.$container.data('initialSerializedValue')\n ) {\n resolve();\n return;\n }\n\n this.createDraft().then(resolve).catch(reject);\n } else {\n resolve();\n }\n });\n },\n\n serializeForm: function (removeActionParams) {\n let data = this.$container.serialize();\n\n if (this.isPreviewActive()) {\n // Replace the temp input with the preview form data\n data = data.replace(\n '__PREVIEW_FIELDS__=1',\n this.preview.$editor.serialize()\n );\n }\n\n if (removeActionParams && !this.settings.isUnpublishedDraft) {\n // Remove action and redirect params\n const actionName = this.namespaceInputName('action');\n const redirectName = this.namespaceInputName('redirect');\n data = data.replace(\n new RegExp(`&${Craft.escapeRegex(actionName)}=[^&]*`),\n ''\n );\n data = data.replace(\n new RegExp(`&${Craft.escapeRegex(redirectName)}=[^&]*`),\n ''\n );\n }\n\n return data;\n },\n\n /**\n * @param {boolean} [force=false]\n * @returns {Promise}\n */\n checkForm: function (force) {\n return this.queue.push(\n () =>\n new Promise((resolve, reject) => {\n // If this isn't a draft and there's no active preview, then there's nothing to check\n if (\n this.settings.revisionId ||\n this.pauseLevel > 0 ||\n !this.enableAutosave ||\n !this.settings.canCreateDrafts\n ) {\n resolve();\n return;\n }\n\n clearTimeout(this.timeout);\n this.timeout = null;\n\n // If we haven't had a chance to fetch the initial data yet, try again in a bit\n if (\n typeof this.$container.data('initialSerializedValue') ===\n 'undefined'\n ) {\n this.timeout = setTimeout(this.checkForm.bind(this), 500);\n return;\n }\n\n // Has anything changed?\n const data = this.serializeForm(true);\n if (\n !force &&\n data ===\n (this.lastSerializedValue ||\n this.$container.data('initialSerializedValue'))\n ) {\n resolve();\n return;\n }\n\n this.saveDraft(data)\n .then(resolve)\n .catch((e) => {\n console.warn('Couldn’t save draft:', e);\n reject(e);\n });\n })\n );\n },\n\n isPreviewActive: function () {\n return this.preview && this.preview.isActive;\n },\n\n createDraft: function () {\n return this.queue.push(\n () =>\n new Promise((resolve, reject) => {\n this.saveDraft(this.serializeForm(true))\n .then(resolve)\n .catch(reject);\n })\n );\n },\n\n /**\n * @param {Object} data\n * @returns {Promise}\n */\n saveDraft: function (data) {\n return new Promise((resolve, reject) => {\n // Ignore if we're already submitting the main form\n if (this.submittingForm) {\n reject('Form already being submitted.');\n return;\n }\n\n this.lastSerializedValue = data;\n this.failed = false;\n this.httpStatus = null;\n this.httpError = null;\n this.cancelToken = axios.CancelToken.source();\n\n this.statusIcons()\n .velocity('stop')\n .css('opacity', '')\n .removeClass('hidden invisible checkmark-icon alert-icon fade-out')\n .addClass('hidden');\n\n // Clear previous status message\n this.statusMessage().empty();\n\n if (this.$saveMetaBtn) {\n this.$saveMetaBtn.addClass('active');\n }\n\n // Prep the data to be saved, keeping track of the first input name for each delta group\n let modifiedFieldNames = [];\n let preparedData = this.prepareData(\n data,\n !this.settings.isUnpublishedDraft\n ? (deltaName, params) => {\n if (params.length) {\n modifiedFieldNames.push(\n decodeURIComponent(params[0].split('=')[0])\n );\n }\n }\n : null\n );\n\n const extraData = {\n [this.namespaceInputName('visibleLayoutElements')]:\n this.settings.visibleLayoutElements,\n };\n\n // Are we saving a provisional draft?\n if (this.settings.isProvisionalDraft || !this.settings.draftId) {\n extraData[this.namespaceInputName('provisional')] = 1;\n }\n\n const selectedTabId = this.$contentContainer\n .children('[data-layout-tab]:not(.hidden)')\n .data('id');\n if (selectedTabId) {\n extraData[this.namespaceInputName('selectedTab')] = selectedTabId;\n }\n\n preparedData += `&${$.param(extraData)}`;\n\n Craft.sendActionRequest('POST', 'elements/save-draft', {\n cancelToken: this.cancelToken.token,\n headers: this._saveHeaders,\n data: preparedData,\n })\n .then((response) => {\n this._afterSaveDraft();\n\n const createdProvisionalDraft = !this.settings.draftId;\n\n if (createdProvisionalDraft) {\n this.settings.isProvisionalDraft = true;\n this.$revisionLabel.append(\n $('<span/>', {\n text: ` — ${Craft.t('app', 'Edited')}`,\n })\n );\n }\n\n if (this.isFullPage) {\n if (response.data.title) {\n this.$container.find('.screen-title').text(response.data.title);\n }\n\n if (response.data.docTitle) {\n document.title = response.data.docTitle;\n }\n }\n\n if (!this.settings.isProvisionalDraft) {\n this.$revisionLabel.text(response.data.draftName);\n this.settings.draftName = response.data.draftName;\n }\n\n let revisionMenu = this.$revisionBtn.data('menubtn')\n ? this.$revisionBtn.data('menubtn').menu\n : null;\n\n // Did we just add a site?\n if (this.newSiteIds) {\n // Do we need to create the revision menu?\n if (!revisionMenu) {\n this.$revisionBtn.removeClass('disabled').addClass('menubtn');\n new Garnish.MenuBtn(this.$revisionBtn);\n revisionMenu = this.$revisionBtn.data('menubtn').menu;\n revisionMenu.$container.removeClass('hidden');\n }\n this.newSiteIds.forEach((siteId) => {\n const $option = revisionMenu.$options.filter(\n `[data-site-id=${siteId}]`\n );\n const siteSettings = this.settings.additionalSites.find(\n (s) => s.siteId == siteId\n );\n if (\n !siteSettings ||\n typeof siteSettings.enabledByDefault === 'undefined' ||\n siteSettings.enabledByDefault\n ) {\n $option\n .find('.status')\n .removeClass('disabled')\n .addClass('enabled');\n }\n const $li = $option.parent().removeClass('hidden');\n $li.closest('.site-group').removeClass('hidden');\n });\n revisionMenu.$container\n .find('.revision-hr')\n .removeClass('hidden');\n this.newSiteIds = null;\n }\n\n if (this.settings.isProvisionalDraft) {\n if (createdProvisionalDraft) {\n // Replace the action\n this.$container\n .find('input.action-input')\n .attr('value', 'elements/apply-draft');\n\n // Update the editor settings\n this.settings.draftId = response.data.draftId;\n this.settings.isLive = false;\n this.previewToken = null;\n\n this.initForProvisionalDraft();\n }\n } else if (revisionMenu) {\n revisionMenu.$options\n .filter('.sel')\n .find('.draft-name')\n .text(response.data.draftName);\n revisionMenu.$options\n .filter('.sel')\n .find('.draft-meta')\n .text(\n response.data.creator\n ? Craft.t('app', 'Saved {timestamp} by {creator}', {\n timestamp: response.data.timestamp,\n creator: response.data.creator,\n })\n : Craft.t('app', 'Saved {timestamp}', {\n timestamp: response.data.timestamp,\n })\n );\n }\n\n // Did the controller send us updated preview targets?\n if (\n response.data.previewTargets &&\n JSON.stringify(response.data.previewTargets) !==\n JSON.stringify(this.settings.previewTargets)\n ) {\n this.updatePreviewTargets(response.data.previewTargets);\n }\n\n if (createdProvisionalDraft) {\n this.updatePreviewLinks();\n this.trigger('createProvisionalDraft');\n }\n\n if (this.$nameTextInput) {\n this.checkMetaValues();\n }\n\n for (const oldId in response.data.duplicatedElements) {\n if (\n oldId != this.settings.canonicalId &&\n response.data.duplicatedElements.hasOwnProperty(oldId)\n ) {\n this.duplicatedElements[oldId] =\n response.data.duplicatedElements[oldId];\n }\n }\n\n // Add missing field modified indicators\n const selectors = response.data.modifiedAttributes\n .map((attr) => {\n attr = this.namespaceInputName(attr);\n return `[name=\"${attr}\"],[name^=\"${attr}[\"]`;\n })\n .concat(modifiedFieldNames.map((name) => `[name=\"${name}\"]`));\n\n const $fields = $(selectors.join(','))\n .parents()\n .filter('.field:not(:has(> .status-badge))');\n for (let i = 0; i < $fields.length; i++) {\n $fields.eq(i).prepend(\n $('<div/>', {\n class: 'status-badge modified',\n title: Craft.t('app', 'This field has been modified.'),\n }).append(\n $('<span/>', {\n class: 'visually-hidden',\n html: Craft.t('app', 'This field has been modified.'),\n })\n )\n );\n }\n\n // Keep track of whether anything changed while we were waiting.\n // If not, we can safely update lastSerializedValue after swapping out the fields\n const noChanges = this.serializeForm(true) === data;\n\n // Update the visible elements\n let $allTabContainers = $();\n const visibleLayoutElements = {};\n let changedElements = false;\n\n for (let i = 0; i < response.data.missingElements.length; i++) {\n const tabInfo = response.data.missingElements[i];\n let $tabContainer = this.$contentContainer.children(\n `[data-layout-tab=\"${tabInfo.uid}\"]`\n );\n\n if (!$tabContainer.length) {\n $tabContainer = $('<div/>', {\n id: this.namespaceId(tabInfo.id),\n class: 'flex-fields',\n 'data-id': tabInfo.id,\n 'data-layout-tab': tabInfo.uid,\n });\n if (tabInfo.id !== selectedTabId) {\n $tabContainer.addClass('hidden');\n }\n $tabContainer.appendTo(this.$contentContainer);\n }\n\n $allTabContainers = $allTabContainers.add($tabContainer);\n\n for (let j = 0; j < tabInfo.elements.length; j++) {\n const elementInfo = tabInfo.elements[j];\n\n if (elementInfo.html !== false) {\n if (!visibleLayoutElements[tabInfo.uid]) {\n visibleLayoutElements[tabInfo.uid] = [];\n }\n visibleLayoutElements[tabInfo.uid].push(elementInfo.uid);\n\n if (typeof elementInfo.html === 'string') {\n const $oldElement = $tabContainer.children(\n `[data-layout-element=\"${elementInfo.uid}\"]`\n );\n const $newElement = $(elementInfo.html);\n if ($oldElement.length) {\n $oldElement.replaceWith($newElement);\n } else {\n $newElement.appendTo($tabContainer);\n }\n Craft.initUiElements($newElement);\n changedElements = true;\n }\n } else {\n const $oldElement = $tabContainer.children(\n `[data-layout-element=\"${elementInfo.uid}\"]`\n );\n if (\n !$oldElement.length ||\n !Garnish.hasAttr(\n $oldElement,\n 'data-layout-element-placeholder'\n )\n ) {\n const $placeholder = $('<div/>', {\n class: 'hidden',\n 'data-layout-element': elementInfo.uid,\n 'data-layout-element-placeholder': '',\n });\n\n if ($oldElement.length) {\n $oldElement.replaceWith($placeholder);\n } else {\n $placeholder.appendTo($tabContainer);\n }\n\n changedElements = true;\n }\n }\n }\n }\n\n // Remove any unused tab content containers\n // (`[data-layout-tab=\"\"]` == unconditional containers, so ignore those)\n const $unusedTabContainers = this.$contentContainer\n .children('[data-layout-tab]')\n .not($allTabContainers)\n .not('[data-layout-tab=\"\"]');\n if ($unusedTabContainers.length) {\n $unusedTabContainers.remove();\n changedElements = true;\n }\n\n // Make the first tab visible if no others are\n if (!$allTabContainers.filter(':not(.hidden)').length) {\n $allTabContainers.first().removeClass('hidden');\n }\n\n this.settings.visibleLayoutElements = visibleLayoutElements;\n\n // Update the tabs\n if (this.isFullPage) {\n Craft.cp.updateTabs(response.data.tabs);\n } else {\n this.slideout.updateTabs(response.data.tabs);\n }\n\n Craft.appendHeadHtml(response.data.headHtml);\n Craft.appendBodyHtml(response.data.bodyHtml);\n\n // Did any layout elements get added or removed?\n if (changedElements) {\n if (response.data.initialDeltaValues) {\n Object.assign(\n this.$container.data('initial-delta-values'),\n response.data.initialDeltaValues\n );\n }\n\n if (noChanges) {\n // Update our record of the last serialized value to avoid a pointless resave\n this.lastSerializedValue = this.serializeForm(true);\n }\n }\n\n // re-grab dismissible tips, re-attach listener, hide on re-load\n this.handleDismissibleTips();\n\n this.afterUpdate(data);\n\n if (Craft.broadcaster) {\n Craft.broadcaster.postMessage({\n pageId: Craft.pageId,\n event: 'saveDraft',\n canonicalId: this.settings.canonicalId,\n draftId: this.settings.draftId,\n isProvisionalDraft: this.settings.isProvisionalDraft,\n });\n }\n\n resolve();\n })\n .catch((e) => {\n this._afterSaveDraft();\n\n if (!this.ignoreFailedRequest) {\n this.failed = true;\n if (e && e.response) {\n this.httpStatus = e.response.status;\n this.httpError = e.response.data\n ? e.response.data.message\n : null;\n }\n this._showFailStatus();\n reject(e);\n }\n\n this.ignoreFailedRequest = false;\n });\n });\n },\n\n _afterSaveDraft: function () {\n if (this.$saveMetaBtn) {\n this.$saveMetaBtn.removeClass('active');\n }\n },\n\n _showFailStatus: function () {\n this.statusIcons()\n .velocity('stop')\n .css('opacity', '')\n .removeClass('hidden checkmark-icon')\n .addClass('alert-icon');\n\n this.setStatusMessage(this._saveFailMessage());\n },\n\n /**\n * @param {string} data\n * @param {findDeltaDataCallback} [deltaCallback] Callback function that should be passed to `Craft.findDeltaData()`\n * @returns {string}\n */\n prepareData: function (data, deltaCallback) {\n // Filter out anything that hasn't changed since the last time the form was submitted\n data = Craft.findDeltaData(\n this.$container.data('initialSerializedValue'),\n data,\n this.$container.data('delta-names'),\n deltaCallback,\n this.$container.data('initial-delta-values'),\n this.$container.data('modified-delta-names')\n );\n\n // Swap out element IDs with their duplicated ones\n data = this.swapDuplicatedElementIds(data);\n\n const extraData = {};\n\n // Add the draft info\n if (this.settings.draftId) {\n extraData[this.namespaceInputName('draftId')] = this.settings.draftId;\n\n if (this.settings.isProvisionalDraft) {\n extraData[this.namespaceInputName('provisional')] = 1;\n }\n }\n\n if (this.settings.draftName !== null) {\n extraData[this.namespaceInputName('draftName')] =\n this.settings.draftName;\n }\n\n if (!$.isEmptyObject(extraData)) {\n data += `&${$.param(extraData)}`;\n }\n\n return data;\n },\n\n get _saveHeaders() {\n const headers = {\n 'content-type': 'application/x-www-form-urlencoded',\n };\n\n if (this.namespace) {\n headers['X-Craft-Namespace'] = this.namespace;\n }\n\n return headers;\n },\n\n /**\n * @param {string} data\n * @returns {string}\n */\n swapDuplicatedElementIds: function (data) {\n const idsRE = Object.keys(this.duplicatedElements).join('|');\n if (idsRE === '') {\n return data;\n }\n const lb = encodeURIComponent('[');\n const rb = encodeURIComponent(']');\n let namespacedFields = this.namespaceInputName('fields');\n\n if (this.isFullPage) {\n namespacedFields = Craft.escapeRegex(namespacedFields);\n } else {\n // don't escape namespaced input names, but URI encode them (for cases like: cnuvbcxlgq[fields])\n namespacedFields = encodeURIComponent(namespacedFields);\n }\n\n // Keep replacing field IDs until data stops changing\n while (true) {\n if (\n data ===\n (data = data\n // &fields[...][X]\n .replace(\n new RegExp(\n `(&${namespacedFields}${lb}[^=]+${rb}${lb})(${idsRE})(${rb})`,\n 'g'\n ),\n (m, pre, id, post) => {\n if (!this._filterFieldInputName(pre)) {\n return m;\n }\n return pre + this.duplicatedElements[id] + post;\n }\n )\n // &fields[...=X\n .replace(\n new RegExp(`&(${namespacedFields}${lb}[^=]+)=(${idsRE})\\\\b`, 'g'),\n (m, name, id) => {\n // Ignore param names that end in `[enabled]`, `[type]`, etc.\n // (`[sortOrder]` should pass here, which could be set to a specific order index, but *not* `[sortOrder][]`!)\n if (\n !this._filterFieldInputName(name) ||\n name.match(\n new RegExp(`${lb}(enabled|sortOrder|type|typeId)${rb}$`)\n )\n ) {\n return m;\n }\n return `&${name}=${this.duplicatedElements[id]}`;\n }\n ))\n ) {\n break;\n }\n }\n return data;\n },\n\n _filterFieldInputName: function (name) {\n // Find the last referenced field handle\n const lb = encodeURIComponent('[');\n const rb = encodeURIComponent(']');\n const nestedNames = name.match(\n new RegExp(`(\\\\bfields|${lb}fields${rb})${lb}.+?${rb}`, 'g')\n );\n if (!nestedNames) {\n throw `Unexpected input name: ${name}`;\n }\n const lastHandle = nestedNames[nestedNames.length - 1].match(\n new RegExp(`(?:\\\\bfields|${lb}fields${rb})${lb}(.+?)${rb}`)\n )[1];\n return Craft.fieldsWithoutContent.includes(lastHandle);\n },\n\n updatePreviewTargets: function (previewTargets) {\n previewTargets.forEach((newTarget) => {\n const currentTarget = this.settings.previewTargets.find(\n (t) => t.label === newTarget.label\n );\n if (currentTarget) {\n currentTarget.url = newTarget.url;\n }\n\n const $previewLink = this.previewLinks.find(\n ($a) => $a.data('targetLabel') === newTarget.label\n );\n if ($previewLink) {\n $previewLink.data('targetUrl', newTarget.url);\n this.updatePreviewLinkHref($previewLink);\n }\n });\n },\n\n afterUpdate: function (data) {\n this.$container.data('initialSerializedValue', data);\n this.$container.data('initial-delta-values', {});\n\n const $statusIcons = this.statusIcons()\n .velocity('stop')\n .css('opacity', '')\n .removeClass('hidden')\n .addClass('checkmark-icon');\n\n this.setStatusMessage(this._saveSuccessMessage());\n\n if (!Craft.autosaveDrafts) {\n // Fade the icon out after a couple seconds, since it won't be accurate as content continues to change\n $statusIcons.velocity('stop').velocity(\n {\n opacity: 0,\n },\n {\n delay: 2000,\n complete: () => {\n $statusIcons.addClass('hidden');\n },\n }\n );\n }\n\n this.trigger('update');\n },\n\n setStatusMessage: function (message) {\n this.statusIcons().attr('title', message);\n this.statusMessage()\n .empty()\n .append(\n $('<span/>', {\n class: 'visually-hidden',\n text: message,\n })\n );\n },\n\n showMetaHud: function () {\n if (!this.metaHud) {\n this.createMetaHud();\n this.onMetaHudShow();\n } else {\n this.metaHud.show();\n }\n\n if (!Garnish.isMobileBrowser(true)) {\n this.$nameTextInput.trigger('focus');\n }\n },\n\n createMetaHud: function () {\n const $hudBody = $('<div/>');\n\n // Add the Name field\n const $nameField = $(\n '<div class=\"field\"><div class=\"heading\"><label for=\"draft-name\">' +\n Craft.t('app', 'Draft Name') +\n '</label></div></div>'\n ).appendTo($hudBody);\n const $nameInputContainer = $('<div class=\"input\"/>').appendTo(\n $nameField\n );\n this.$nameTextInput = $(\n '<input type=\"text\" class=\"text fullwidth\" id=\"draft-name\"/>'\n )\n .appendTo($nameInputContainer)\n .val(this.settings.draftName);\n\n // HUD footer\n const $footer = $('<div class=\"hud-footer flex flex-center\"/>').appendTo(\n $hudBody\n );\n\n $('<div class=\"flex-grow\"></div>').appendTo($footer);\n this.$saveMetaBtn = $('<button/>', {\n type: 'submit',\n class: 'btn submit disabled',\n 'aria-disabled': 'true',\n text: Craft.t('app', 'Save'),\n }).appendTo($footer);\n\n this.metaHud = new Garnish.HUD(this.$editMetaBtn, $hudBody, {\n onSubmit: this.saveMeta.bind(this),\n });\n\n this.addListener(this.$nameTextInput, 'input', 'checkMetaValues');\n\n this.metaHud.on('show', this.onMetaHudShow.bind(this));\n this.metaHud.on('hide', this.onMetaHudHide.bind(this));\n this.metaHud.on('escape', this.onMetaHudEscape.bind(this));\n },\n\n onMetaHudShow: function () {\n this.$editMetaBtn.addClass('active');\n this.$editMetaBtn.attr('aria-expanded', 'true');\n },\n\n onMetaHudHide: function () {\n this.$editMetaBtn.removeClass('active');\n this.$editMetaBtn.attr('aria-expanded', 'false');\n\n if (Garnish.focusIsInside(this.metaHud.$body)) {\n this.$editMetaBtn.trigger('focus');\n }\n },\n\n onMetaHudEscape: function () {\n this.$nameTextInput.val(this.settings.draftName);\n },\n\n checkMetaValues: function () {\n if (\n this.$nameTextInput.val() &&\n this.$nameTextInput.val() !== this.settings.draftName\n ) {\n this.$saveMetaBtn.removeClass('disabled');\n this.$saveMetaBtn.removeAttr('aria-disabled');\n return true;\n }\n\n this.$saveMetaBtn.addClass('disabled');\n this.$saveMetaBtn.attr('aria-disabled', 'true');\n return false;\n },\n\n shakeMetaHud: function () {\n Garnish.shake(this.metaHud.$hud);\n },\n\n saveMeta: function () {\n return new Promise((resolve, reject) => {\n if (!this.checkMetaValues()) {\n this.shakeMetaHud();\n reject();\n return;\n }\n\n this.settings.draftName = this.$nameTextInput.val();\n this.metaHud.hide();\n this.checkForm(true).then(resolve).catch(reject);\n });\n },\n\n handleSubmit: function (ev) {\n ev.preventDefault();\n ev.stopPropagation();\n\n // Prevent double form submits\n if (this.submittingForm) {\n return;\n }\n\n // If this a draft and was this a normal save (either via submit button or save shortcut),\n // then trigger an autosave\n if (\n this.settings.draftId &&\n !this.settings.isUnpublishedDraft &&\n !this.settings.isProvisionalDraft &&\n (typeof ev.autosave === 'undefined' || ev.autosave) &&\n (ev.saveShortcut ||\n (ev.customTrigger &&\n ev.customTrigger.data('action') === 'elements/save-draft')) &&\n this.enableAutosave\n ) {\n this.checkForm(true);\n return;\n }\n\n this.submittingForm = true;\n\n // Prevent the normal unload confirmation dialog\n Craft.cp.$confirmUnloadForms = Craft.cp.$confirmUnloadForms.not(\n this.$container\n );\n\n // Abort the current save request if there is one\n if (this.cancelToken) {\n this.ignoreFailedRequest = true;\n this.cancelToken.cancel();\n }\n\n this.trigger('beforeSubmit');\n\n // Duplicate the form with normalized data\n const data = this.prepareData(this.serializeForm(false));\n\n if (this.isFullPage) {\n this.stopListeningForChanges();\n const $form = Craft.createForm(data);\n $form.appendTo(Garnish.$bod);\n $form.submit();\n } else {\n this.slideout.showSubmitSpinner();\n Craft.sendActionRequest('POST', null, {\n headers: this._saveHeaders,\n data,\n })\n .then((response) => {\n this.slideout.handleSubmitResponse(response);\n })\n .catch((error) => {\n this.slideout.handleSubmitError(error);\n })\n .finally(() => {\n this.submittingForm = false;\n this.slideout.hideSubmitSpinner();\n });\n }\n },\n\n handleDismissibleTips: function () {\n this.addListener(this.tipDismissBtn, 'click', (e) => {\n this.hideTip(e);\n });\n },\n\n getHiddenTipsUids: function () {\n return Craft.getLocalStorage('dismissedTips', []);\n },\n\n setHiddenTipsUids: function (uids) {\n Craft.setLocalStorage('dismissedTips', uids);\n },\n\n hideTip: function (ev) {\n const targetElement = ev.target;\n if (targetElement) {\n const $targetParent = $(targetElement).closest('.readable');\n if ($targetParent.length) {\n const layoutElementUid = $targetParent.data('layout-element');\n $targetParent.remove();\n // add info to local storage\n if (typeof Storage !== 'undefined') {\n const hiddenTips = this.getHiddenTipsUids();\n if (!hiddenTips.includes(layoutElementUid)) {\n hiddenTips.push(layoutElementUid);\n this.setHiddenTipsUids(hiddenTips);\n }\n }\n }\n }\n },\n },\n {\n defaults: {\n additionalSites: [],\n canCreateDrafts: false,\n canEditMultipleSites: false,\n canSaveCanonical: false,\n canonicalId: null,\n draftId: null,\n draftName: null,\n elementType: null,\n enablePreview: false,\n enabled: false,\n enabledForSite: false,\n hashedCpEditUrl: null,\n isLive: false,\n isProvisionalDraft: false,\n isUnpublishedDraft: false,\n previewTargets: [],\n previewToken: null,\n revisionId: null,\n siteId: null,\n siteStatuses: null,\n siteToken: null,\n visibleLayoutElements: {},\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Element Editor Slideout\n */\nCraft.ElementEditorSlideout = Craft.CpScreenSlideout.extend(\n {\n $element: null,\n\n init: function (element, settings) {\n this.$element = $(element);\n\n settings = Object.assign(\n {},\n Craft.ElementEditorSlideout.defaults,\n settings,\n {\n showHeader: true,\n }\n );\n this.base('elements/edit', settings);\n\n this.on('load', () => {\n const editor = this.$container.data('elementEditor');\n if (editor) {\n editor.on('beforeSubmit', () => {\n Object.keys(this.settings.saveParams).forEach((name) => {\n $('<input/>', {\n class: 'hidden',\n name: editor.namespaceInputName(name),\n value: this.settings.saveParams[name],\n }).appendTo(this.$container);\n });\n });\n }\n });\n\n this.on('submit', (ev) => {\n if (Craft.broadcaster) {\n Craft.broadcaster.postMessage({\n event: 'saveElement',\n id: ev.response.data.element.id,\n });\n }\n\n // Pass the response data off to onSaveElement() for backwards compatibility\n if (this.settings.onSaveElement) {\n const data = Object.assign(\n {},\n ev.response.data,\n ev.response.data.element\n );\n delete data.element;\n delete data.modelName;\n delete data.message;\n this.settings.onSaveElement(data);\n }\n\n // Refresh Live Preview\n Craft.Preview.refresh();\n });\n },\n\n getParams: function () {\n const params = {};\n\n if (this.settings.elementType) {\n params.elementType = this.settings.elementType;\n }\n\n if (this.settings.elementId) {\n params.elementId = this.settings.elementId;\n } else if (this.$element && this.$element.data('id')) {\n params.elementId = this.$element.data('id');\n }\n\n if (this.settings.draftId) {\n params.draftId = this.settings.draftId;\n } else if (this.$element && this.$element.data('draft-id')) {\n params.draftId = this.$element.data('draft-id');\n } else if (this.settings.revisionId) {\n params.revisionId = this.settings.revisionId;\n } else if (this.$element && this.$element.data('revision-id')) {\n params.revisionId = this.$element.data('revision-id');\n }\n\n if (this.settings.siteId) {\n params.siteId = this.settings.siteId;\n } else if (this.$element && this.$element.data('site-id')) {\n params.siteId = this.$element.data('site-id');\n }\n\n if (this.settings.prevalidate) {\n params.prevalidate = 1;\n }\n\n return params;\n },\n\n handleSubmit: function (ev) {\n this.$container.data('elementEditor').handleSubmit(ev);\n },\n },\n {\n defaults: {\n elementId: null,\n draftId: null,\n revisionId: null,\n elementType: null,\n siteId: null,\n prevalidate: false,\n saveParams: {},\n onSaveElement: null,\n validators: [],\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\nCraft.ElementFieldSettings = Garnish.Base.extend({\n allowMultipleSources: null,\n $maintainHierarchyField: null,\n $maintainHierarchyInput: null,\n $sourcesField: null,\n $sourceSelect: null,\n $branchLimitField: null,\n $maxRelationsField: null,\n $minRelationsField: null,\n\n init: function (\n allowMultipleSources,\n maintainHierarchyFieldId,\n sourcesFieldId,\n branchLimitFieldId,\n minRelationsFieldId,\n maxRelationsFieldId\n ) {\n debugger;\n this.allowMultipleSources = allowMultipleSources;\n this.$maintainHierarchyField = $(`#${maintainHierarchyFieldId}`);\n this.$maintainHierarchyInput = this.$maintainHierarchyField.find(\n 'input[type=\"checkbox\"]'\n );\n this.$sourcesField = $(`#${sourcesFieldId}`);\n if (!this.allowMultipleSources) {\n this.$sourceSelect = this.$sourcesField.find('select');\n }\n this.$branchLimitField = $(`#${branchLimitFieldId}`);\n this.$minRelationsField = $(`#${minRelationsFieldId}`);\n this.$maxRelationsField = $(`#${maxRelationsFieldId}`);\n\n this.updateLimitFields();\n this.addListener(\n this.$maintainHierarchyInput,\n 'change',\n 'updateLimitFields'\n );\n\n if (this.allowMultipleSources) {\n this.$sourcesField.find('[type=checkbox]').each(\n function (index, checkbox) {\n this.addListener(\n $(checkbox),\n 'change',\n 'updateMaintainHierarchyField'\n );\n }.bind(this)\n );\n } else {\n this.addListener(\n this.$sourceSelect,\n 'change',\n 'updateMaintainHierarchyField'\n );\n }\n this.updateMaintainHierarchyField();\n },\n\n updateLimitFields: function () {\n if (\n !this.$maintainHierarchyField.hasClass('hidden') &&\n this.$maintainHierarchyInput.is(':checked')\n ) {\n this.$minRelationsField.addClass('hidden');\n this.$maxRelationsField.addClass('hidden');\n this.$branchLimitField.removeClass('hidden');\n } else {\n this.$branchLimitField.addClass('hidden');\n this.$minRelationsField.removeClass('hidden');\n this.$maxRelationsField.removeClass('hidden');\n }\n },\n\n updateMaintainHierarchyField: function () {\n let showField;\n if (this.allowMultipleSources) {\n const $checkedInputs = this.$sourcesField.find(\n '[type=\"checkbox\"]:checked'\n );\n showField =\n $checkedInputs.length === 1 && $checkedInputs.data('structure-id');\n } else {\n showField = this.$sourceSelect\n .children('option:selected')\n .data('structure-id');\n }\n\n if (showField) {\n this.$maintainHierarchyField.removeClass('hidden');\n } else {\n this.$maintainHierarchyField.addClass('hidden');\n }\n\n this.updateLimitFields();\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Base Element Index View\n */\nCraft.ElementThumbLoader = Garnish.Base.extend(\n {\n queue: null,\n workers: [],\n\n init: function () {\n this.queue = [];\n\n for (var i = 0; i < 3; i++) {\n this.workers.push(new Craft.ElementThumbLoader.Worker(this));\n }\n },\n\n load: function ($elements) {\n // Only immediately load the visible images\n let $thumbs = $elements.find('.elementthumb');\n for (let i = 0; i < $thumbs.length; i++) {\n let $thumb = $thumbs.eq(i);\n let $scrollParent = $thumb.scrollParent();\n if ($scrollParent.prop('nodeName') === 'FIELDSET') {\n $scrollParent = $scrollParent.scrollParent();\n }\n if ($scrollParent[0] === document.body) {\n $scrollParent = Garnish.$doc;\n }\n if (this.isVisible($thumb, $scrollParent)) {\n this.addToQueue($thumb[0]);\n } else {\n let key = 'thumb' + Math.floor(Math.random() * 1000000);\n Craft.ElementThumbLoader.invisibleThumbs[key] = [\n this,\n $thumb,\n $scrollParent,\n ];\n $scrollParent.on(\n `scroll.${key}`,\n {\n $thumb: $thumb,\n $scrollParent: $scrollParent,\n key: key,\n },\n (ev) => {\n if (this.isVisible(ev.data.$thumb, ev.data.$scrollParent)) {\n delete Craft.ElementThumbLoader.invisibleThumbs[ev.data.key];\n $scrollParent.off(`scroll.${ev.data.key}`);\n this.addToQueue(ev.data.$thumb[0]);\n }\n }\n );\n }\n }\n },\n\n addToQueue: function (thumb) {\n this.queue.push(thumb);\n\n // See if there are any inactive workers\n for (var i = 0; i < this.workers.length; i++) {\n if (!this.workers[i].active) {\n this.workers[i].loadNext();\n }\n }\n },\n\n isVisible: function ($thumb, $scrollParent) {\n let thumbOffset = $thumb.offset().top;\n let scrollParentOffset, scrollParentHeight;\n if ($scrollParent[0] === document) {\n scrollParentOffset = $scrollParent.scrollTop();\n scrollParentHeight = Garnish.$win.height();\n } else {\n scrollParentOffset = $scrollParent.offset().top;\n scrollParentHeight = $scrollParent.height();\n }\n return (\n thumbOffset > scrollParentOffset &&\n thumbOffset < scrollParentOffset + scrollParentHeight + 1000\n );\n },\n\n destroy: function () {\n for (var i = 0; i < this.workers.length; i++) {\n this.workers[i].destroy();\n }\n\n this.base();\n },\n },\n {\n invisibleThumbs: {},\n retryAll: function () {\n for (let key in Craft.ElementThumbLoader.invisibleThumbs) {\n let [queue, $thumb, $scrollParent] =\n Craft.ElementThumbLoader.invisibleThumbs[key];\n delete Craft.ElementThumbLoader.invisibleThumbs[key];\n $scrollParent.off(`scroll.${key}`);\n queue.load($thumb.parent());\n }\n },\n }\n);\n\nCraft.ElementThumbLoader.Worker = Garnish.Base.extend({\n loader: null,\n active: false,\n\n init: function (loader) {\n this.loader = loader;\n },\n\n loadNext: function () {\n var container = this.loader.queue.shift();\n if (typeof container === 'undefined') {\n this.active = false;\n return;\n }\n\n this.active = true;\n var $container = $(container);\n if ($container.find('img').length) {\n this.loadNext();\n return;\n }\n var $img = $('<img/>', {\n sizes: $container.attr('data-sizes'),\n srcset: $container.attr('data-srcset'),\n alt: $container.attr('data-alt') || '',\n });\n this.addListener($img, 'load,error', 'loadNext');\n $img.appendTo($container);\n picturefill({\n elements: [$img[0]],\n });\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Elevated Session Form\n */\nCraft.ElevatedSessionForm = Garnish.Base.extend({\n $form: null,\n inputs: null,\n\n init: function (form, inputs) {\n this.$form = $(form);\n\n // Only check specific inputs?\n if (typeof inputs !== 'undefined') {\n this.inputs = [];\n inputs = $.makeArray(inputs);\n\n for (var i = 0; i < inputs.length; i++) {\n var $inputs = $(inputs[i]);\n\n for (var j = 0; j < $inputs.length; j++) {\n var $input = $inputs.eq(j);\n\n this.inputs.push({\n input: $input,\n val: Garnish.getInputPostVal($input),\n });\n }\n }\n }\n\n this.addListener(this.$form, 'submit', 'handleFormSubmit');\n },\n\n handleFormSubmit: function (ev) {\n // Ignore if we're in the middle of getting the elevated session timeout\n if (Craft.elevatedSessionManager.fetchingTimeout) {\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return;\n }\n\n // Are we only interested in certain inputs?\n if (this.inputs) {\n var inputsChanged = false;\n var $input;\n\n for (var i = 0; i < this.inputs.length; i++) {\n $input = this.inputs[i].input;\n // Is this a password input?\n if ($input.data('passwordInput')) {\n $input = $input.data('passwordInput').$currentInput;\n }\n\n // Has this input's value changed?\n if (Garnish.getInputPostVal($input) !== this.inputs[i].val) {\n inputsChanged = true;\n break;\n }\n }\n\n if (!inputsChanged) {\n // No need to interrupt the submit\n return;\n }\n }\n\n // Prevent the form from submitting until the user has an elevated session\n ev.preventDefault();\n ev.stopImmediatePropagation();\n Craft.elevatedSessionManager.requireElevatedSession(\n this.submitForm.bind(this)\n );\n },\n\n submitForm: function () {\n // Don't let handleFormSubmit() interrupt this time\n this.disable();\n this.$form.trigger('submit');\n this.enable();\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Elevated Session Manager\n */\nCraft.ElevatedSessionManager = Garnish.Base.extend(\n {\n fetchingTimeout: false,\n\n passwordModal: null,\n $passwordInput: null,\n $submitBtn: null,\n $errorPara: null,\n\n callback: null,\n\n /**\n * @callback requireElevatedSessionCallback\n */\n /**\n * Requires that the user has an elevated session.\n *\n * @param {requireElevatedSessionCallback} callback The callback function that should be called once the user has an elevated session\n */\n requireElevatedSession: function (callback) {\n this.callback = callback;\n\n // Check the time remaining on the user’s elevated session (if any)\n this.fetchingTimeout = true;\n\n Craft.sendActionRequest('POST', 'users/get-elevated-session-timeout')\n .then((response) => {\n this.fetchingTimeout = false;\n if (\n response.data.timeout === false ||\n response.data.timeout >=\n Craft.ElevatedSessionManager.minSafeElevatedSessionTimeout\n ) {\n this.callback();\n } else {\n // Show the password modal\n this.showPasswordModal();\n }\n })\n .catch(() => {\n this.fetchingTimeout = false;\n });\n },\n\n showPasswordModal: function () {\n if (!this.passwordModal) {\n var $passwordModal = $(\n '<form id=\"elevatedsessionmodal\" class=\"modal secure fitted\"/>'\n ),\n $body = $(\n '<div class=\"body\"><p>' +\n Craft.t('app', 'Enter your password to continue.') +\n '</p></div>'\n ).appendTo($passwordModal),\n $inputContainer = $('<div class=\"inputcontainer\">').appendTo($body),\n $inputsFlexContainer = $('<div class=\"flex\"/>').appendTo(\n $inputContainer\n ),\n $passwordContainer = $('<div class=\"flex-grow\"/>').appendTo(\n $inputsFlexContainer\n ),\n $buttonContainer = $('<td/>').appendTo($inputsFlexContainer),\n $passwordWrapper = $('<div class=\"passwordwrapper\"/>').appendTo(\n $passwordContainer\n );\n\n this.$passwordInput = $(\n '<input type=\"password\" class=\"text password fullwidth\" placeholder=\"' +\n Craft.t('app', 'Password') +\n '\" autocomplete=\"current-password\"/>'\n ).appendTo($passwordWrapper);\n this.$submitBtn = Craft.ui\n .createSubmitButton({\n class: 'disabled',\n label: Craft.t('app', 'Submit'),\n spinner: true,\n })\n .appendTo($buttonContainer);\n this.$errorPara = $('<p class=\"error\"/>').appendTo($body);\n\n this.passwordModal = new Garnish.Modal($passwordModal, {\n closeOtherModals: false,\n onFadeIn: () => {\n setTimeout(this.focusPasswordInput.bind(this), 100);\n },\n onFadeOut: () => {\n this.$passwordInput.val('');\n },\n });\n\n new Craft.PasswordInput(this.$passwordInput, {\n onToggleInput: ($newPasswordInput) => {\n this.$passwordInput = $newPasswordInput;\n },\n });\n\n this.addListener(this.$passwordInput, 'input', 'validatePassword');\n this.addListener($passwordModal, 'submit', 'submitPassword');\n } else {\n this.passwordModal.show();\n }\n },\n\n focusPasswordInput: function () {\n if (!Garnish.isMobileBrowser(true)) {\n this.$passwordInput.trigger('focus');\n }\n },\n\n validatePassword: function () {\n if (this.$passwordInput.val().length >= 6) {\n this.$submitBtn.removeClass('disabled');\n return true;\n } else {\n this.$submitBtn.addClass('disabled');\n return false;\n }\n },\n\n submitPassword: function (ev) {\n if (ev) {\n ev.preventDefault();\n }\n\n if (!this.validatePassword()) {\n return;\n }\n\n this.$submitBtn.addClass('loading');\n this.clearLoginError();\n\n var data = {\n currentPassword: this.$passwordInput.val(),\n };\n\n Craft.sendActionRequest('POST', 'users/start-elevated-session', {data})\n .then((response) => {\n this.$submitBtn.removeClass('loading');\n this.passwordModal.hide();\n this.callback();\n })\n .catch(({response}) => {\n this.$submitBtn.removeClass('loading');\n this.showPasswordError(\n response.data.message || Craft.t('app', 'Incorrect password.')\n );\n Garnish.shake(this.passwordModal.$container);\n this.focusPasswordInput();\n });\n },\n\n showPasswordError: function (error) {\n if (error === null || typeof error === 'undefined') {\n error = Craft.t('app', 'A server error occurred.');\n }\n\n this.$errorPara.text(error);\n this.passwordModal.updateSizeAndPosition();\n },\n\n clearLoginError: function () {\n this.showPasswordError('');\n },\n },\n {\n minSafeElevatedSessionTimeout: 5,\n }\n);\n\n// Instantiate it\nCraft.elevatedSessionManager = new Craft.ElevatedSessionManager();\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Entry index class\n */\nCraft.EntryIndex = Craft.BaseElementIndex.extend({\n publishableSections: null,\n $newEntryBtnGroup: null,\n $newEntryBtn: null,\n\n init: function (elementType, $container, settings) {\n this.publishableSections = [];\n this.on('selectSource', this.updateButton.bind(this));\n this.on('selectSite', this.updateButton.bind(this));\n this.base(elementType, $container, settings);\n },\n\n afterInit: function () {\n // Find which of the visible sections the user has permission to create new entries in\n this.publishableSections = Craft.publishableSections.filter(\n (s) => !!this.getSourceByKey(`section:${s.uid}`)\n );\n\n this.base();\n },\n\n getDefaultSourceKey: function () {\n // Did they request a specific section in the URL?\n if (\n this.settings.context === 'index' &&\n typeof defaultSectionHandle !== 'undefined'\n ) {\n if (defaultSectionHandle === 'singles') {\n return 'singles';\n }\n\n for (let i = 0; i < this.$sources.length; i++) {\n const $source = $(this.$sources[i]);\n if ($source.data('handle') === defaultSectionHandle) {\n return $source.data('key');\n }\n }\n }\n\n return this.base();\n },\n\n updateButton: function () {\n if (!this.$source) {\n return;\n }\n\n let handle;\n\n // Get the handle of the selected source\n if (this.$source.data('key') === 'singles') {\n handle = 'singles';\n } else {\n handle = this.$source.data('handle');\n }\n\n // Update the New Entry button\n // ---------------------------------------------------------------------\n\n if (this.publishableSections.length) {\n // Remove the old button, if there is one\n if (this.$newEntryBtnGroup) {\n this.$newEntryBtnGroup.remove();\n }\n\n // Determine if they are viewing a section that they have permission to create entries in\n const selectedSection = this.publishableSections.find(\n (s) => s.handle === handle\n );\n\n this.$newEntryBtnGroup = $('<div class=\"btngroup submit\" data-wrapper/>');\n let $menuBtn;\n const menuId = 'new-entry-menu-' + Craft.randomString(10);\n\n // If they are, show a primary \"New entry\" button, and a dropdown of the other sections (if any).\n // Otherwise only show a menu button\n if (selectedSection) {\n const visibleLabel =\n this.settings.context === 'index'\n ? Craft.t('app', 'New entry')\n : Craft.t('app', 'New {section} entry', {\n section: selectedSection.name,\n });\n\n const ariaLabel =\n this.settings.context === 'index'\n ? Craft.t('app', 'New entry in the {section} section', {\n section: selectedSection.name,\n })\n : visibleLabel;\n\n // In index contexts, the button functions as a link\n // In non-index contexts, the button triggers a slideout editor\n const role = this.settings.context === 'index' ? 'link' : null;\n\n this.$newEntryBtn = Craft.ui\n .createButton({\n label: visibleLabel,\n ariaLabel: ariaLabel,\n spinner: true,\n role: role,\n })\n .addClass('submit add icon')\n .appendTo(this.$newEntryBtnGroup);\n\n this.addListener(this.$newEntryBtn, 'click mousedown', (ev) => {\n // If this is the element index, check for Ctrl+clicks and middle button clicks\n if (\n this.settings.context === 'index' &&\n ((ev.type === 'click' && Garnish.isCtrlKeyPressed(ev)) ||\n (ev.type === 'mousedown' && ev.originalEvent.button === 1))\n ) {\n window.open(Craft.getUrl(`entries/${selectedSection.handle}/new`));\n } else if (ev.type === 'click') {\n this._createEntry(selectedSection.id);\n }\n });\n\n if (this.publishableSections.length > 1) {\n $menuBtn = $('<button/>', {\n type: 'button',\n class: 'btn submit menubtn btngroup-btn-last',\n 'aria-controls': menuId,\n 'data-disclosure-trigger': '',\n 'aria-label': Craft.t('app', 'New entry, choose a section'),\n }).appendTo(this.$newEntryBtnGroup);\n }\n } else {\n this.$newEntryBtn = $menuBtn = Craft.ui\n .createButton({\n label: Craft.t('app', 'New entry'),\n ariaLabel: Craft.t('app', 'New entry, choose a section'),\n spinner: true,\n })\n .addClass('submit add icon menubtn btngroup-btn-last')\n .attr('aria-controls', menuId)\n .attr('data-disclosure-trigger', '')\n .appendTo(this.$newEntryBtnGroup);\n }\n\n this.addButton(this.$newEntryBtnGroup);\n\n if ($menuBtn) {\n const $menuContainer = $('<div/>', {\n id: menuId,\n class: 'menu menu--disclosure',\n }).appendTo(this.$newEntryBtnGroup);\n const $ul = $('<ul/>').appendTo($menuContainer);\n\n for (const section of this.publishableSections) {\n const anchorRole =\n this.settings.context === 'index' ? 'link' : 'button';\n if (\n (this.settings.context === 'index' &&\n $.inArray(this.siteId, section.sites) !== -1) ||\n (this.settings.context !== 'index' && section !== selectedSection)\n ) {\n const $li = $('<li/>').appendTo($ul);\n const $a = $('<a/>', {\n role: anchorRole === 'button' ? 'button' : null,\n href: '#', // Allows for click listener and tab order\n type: anchorRole === 'button' ? 'button' : null,\n text: Craft.t('app', 'New {section} entry', {\n section: section.name,\n }),\n }).appendTo($li);\n this.addListener($a, 'click', () => {\n $menuBtn.data('trigger').hide();\n this._createEntry(section.id);\n });\n\n if (anchorRole === 'button') {\n this.addListener($a, 'keydown', (event) => {\n if (event.keyCode === Garnish.SPACE_KEY) {\n event.preventDefault();\n $menuBtn.data('trigger').hide();\n this._createEntry(section.id);\n }\n });\n }\n }\n }\n\n new Garnish.DisclosureMenu($menuBtn);\n }\n }\n\n // Update the URL if we're on the Entries index\n // ---------------------------------------------------------------------\n\n if (this.settings.context === 'index') {\n let uri = 'entries';\n\n if (handle) {\n uri += '/' + handle;\n }\n\n Craft.setPath(uri);\n }\n },\n\n _createEntry: function (sectionId) {\n if (this.$newEntryBtn.hasClass('loading')) {\n console.warn('New entry creation already in progress.');\n return;\n }\n\n // Find the section\n const section = this.publishableSections.find((s) => s.id === sectionId);\n\n if (!section) {\n throw `Invalid section ID: ${sectionId}`;\n }\n\n this.$newEntryBtn.addClass('loading');\n\n Craft.sendActionRequest('POST', 'entries/create', {\n data: {\n siteId: this.siteId,\n section: section.handle,\n },\n })\n .then(({data}) => {\n if (this.settings.context === 'index') {\n document.location.href = Craft.getUrl(data.cpEditUrl, {fresh: 1});\n } else {\n const slideout = Craft.createElementEditor(this.elementType, {\n siteId: this.siteId,\n elementId: data.entry.id,\n draftId: data.entry.draftId,\n params: {\n fresh: 1,\n },\n });\n slideout.on('submit', () => {\n // Make sure the right section is selected\n const sectionSourceKey = `section:${section.uid}`;\n\n if (this.sourceKey !== sectionSourceKey) {\n this.selectSourceByKey(sectionSourceKey);\n }\n\n this.clearSearch();\n this.setSelectedSortAttribute('dateCreated', 'desc');\n this.selectElementAfterUpdate(data.entry.id);\n this.updateElements();\n });\n }\n })\n .finally(() => {\n this.$newEntryBtn.removeClass('loading');\n });\n },\n});\n\n// Register it!\nCraft.registerElementIndexClass('craft\\\\elements\\\\Entry', Craft.EntryIndex);\n","/** global: Craft */\n/** global: Garnish */\nCraft.FieldLayoutDesigner = Garnish.Base.extend(\n {\n $container: null,\n $configInput: null,\n $tabContainer: null,\n $newTabBtn: null,\n $sidebar: null,\n $libraryToggle: null,\n $selectedLibrary: null,\n $fieldLibrary: null,\n $uiLibrary: null,\n $uiLibraryElements: null,\n $fieldSearch: null,\n $clearFieldSearchBtn: null,\n $fieldGroups: null,\n $fields: null,\n\n tabGrid: null,\n elementDrag: null,\n\n _config: null,\n\n init: function (container, settings) {\n this.$container = $(container);\n this.setSettings(settings, Craft.FieldLayoutDesigner.defaults);\n\n this.$configInput = this.$container.children('input[data-config-input]');\n this._config = JSON.parse(this.$configInput.val());\n if (!this._config.tabs) {\n this._config.tabs = [];\n }\n\n let $workspace = this.$container.children('.fld-workspace');\n this.$tabContainer = $workspace.children('.fld-tabs');\n this.$newTabBtn = $workspace.children('.fld-new-tab-btn');\n this.$sidebar = this.$container.children('.fld-sidebar');\n\n this.$fieldLibrary = this.$selectedLibrary =\n this.$sidebar.children('.fld-field-library');\n let $fieldSearchContainer = this.$fieldLibrary.children('.search');\n this.$fieldSearch = $fieldSearchContainer.children('input');\n this.$clearFieldSearchBtn = $fieldSearchContainer.children('.clear');\n this.$fieldGroups = this.$sidebar.find('.fld-field-group');\n this.$fields = this.$fieldGroups.children('.fld-element');\n this.$uiLibrary = this.$sidebar.children('.fld-ui-library');\n this.$uiLibraryElements = this.$uiLibrary.children();\n\n // Set up the layout grids\n this.tabGrid = new Craft.Grid(this.$tabContainer, {\n itemSelector: '.fld-tab',\n minColWidth: 24 * 11,\n fillMode: 'grid',\n snapToGrid: 24,\n });\n\n let $tabs = this.$tabContainer.children();\n for (let i = 0; i < $tabs.length; i++) {\n this.initTab($($tabs[i]));\n }\n\n this.elementDrag = new Craft.FieldLayoutDesigner.ElementDrag(this);\n\n if (this.settings.customizableTabs) {\n this.tabDrag = new Craft.FieldLayoutDesigner.TabDrag(this);\n\n this.addListener(this.$newTabBtn, 'activate', 'addTab');\n }\n\n // Set up the sidebar\n if (this.settings.customizableUi) {\n let $libraryPicker = this.$sidebar.children('.btngroup');\n new Craft.Listbox($libraryPicker, {\n onChange: ($selectedOption) => {\n this.$selectedLibrary.addClass('hidden');\n this.$selectedLibrary =\n this[`$${$selectedOption.data('library')}Library`].removeClass(\n 'hidden'\n );\n },\n });\n }\n\n this.addListener(this.$fieldSearch, 'input', () => {\n let val = this.$fieldSearch.val().toLowerCase().replace(/['\"]/g, '');\n if (!val) {\n this.$fieldLibrary.find('.filtered').removeClass('filtered');\n this.$clearFieldSearchBtn.addClass('hidden');\n return;\n }\n\n this.$clearFieldSearchBtn.removeClass('hidden');\n let $matches = this.$fields\n .filter(`[data-keywords*=\"${val}\"]`)\n .add(\n this.$fieldGroups\n .filter(`[data-name*=\"${val}\"]`)\n .children('.fld-element')\n )\n .removeClass('filtered');\n this.$fields.not($matches).addClass('filtered');\n\n // hide any groups that don't have any results\n for (let i = 0; i < this.$fieldGroups.length; i++) {\n let $group = this.$fieldGroups.eq(i);\n if ($group.find('.fld-element:not(.hidden):not(.filtered)').length) {\n $group.removeClass('filtered');\n } else {\n $group.addClass('filtered');\n }\n }\n });\n\n this.addListener(this.$fieldSearch, 'keydown', (ev) => {\n switch (ev.keyCode) {\n case Garnish.ESC_KEY:\n this.$fieldSearch.val('').trigger('input');\n break;\n case Garnish.RETURN_KEY:\n // they most likely don't want to submit the form from here\n ev.preventDefault();\n break;\n }\n });\n\n // Clear the search when the X button is clicked\n this.addListener(this.$clearFieldSearchBtn, 'click', () => {\n this.$fieldSearch.val('').trigger('input');\n });\n },\n\n initTab: function ($tab) {\n return new Craft.FieldLayoutDesigner.Tab(this, $tab);\n },\n\n removeFieldByHandle: function (attribute) {\n this.$fields\n .filter(`[data-attribute=\"${attribute}\"]:first`)\n .removeClass('hidden')\n .closest('.fld-field-group')\n .removeClass('hidden');\n },\n\n addTab: function () {\n if (!this.settings.customizableTabs) {\n return;\n }\n\n const name = Craft.escapeHtml(\n prompt(Craft.t('app', 'Give your tab a name.'))\n );\n\n if (!name) {\n return;\n }\n\n const $tab = $(`\n<div class=\"fld-tab\">\n <div class=\"tabs\">\n <div class=\"tab sel draggable\">\n <span>${name}</span>\n <a class=\"settings icon\" title=\"${Craft.t('app', 'Settings')}\"></a>\n </div>\n </div>\n <div class=\"fld-tabcontent\"></div>\n</div>\n`).appendTo(this.$tabContainer);\n\n this.tabGrid.addItems($tab);\n this.tabDrag.addItems($tab);\n\n const tab = this.initTab($tab);\n tab.updatePositionInConfig();\n },\n\n get config() {\n return this._config;\n },\n\n set config(config) {\n this._config = config;\n this.$configInput.val(JSON.stringify(config));\n },\n\n updateConfig: function (callback) {\n const config = callback(this.config);\n if (config !== false) {\n this.config = config;\n }\n },\n },\n {\n defaults: {\n customizableTabs: true,\n customizableUi: true,\n },\n\n createSlideout: function (contents, js) {\n const $body = $('<div/>', {class: 'fld-element-settings-body'});\n $('<div/>', {class: 'fields', html: contents}).appendTo($body);\n const $footer = $('<div/>', {class: 'fld-element-settings-footer'});\n $('<div/>', {class: 'flex-grow'}).appendTo($footer);\n const $cancelBtn = Craft.ui\n .createButton({\n label: Craft.t('app', 'Close'),\n spinner: true,\n })\n .appendTo($footer);\n Craft.ui\n .createSubmitButton({\n class: 'secondary',\n label: Craft.t('app', 'Apply'),\n spinner: true,\n })\n .appendTo($footer);\n const $contents = $body.add($footer);\n\n const slideout = new Craft.Slideout($contents, {\n containerElement: 'form',\n containerAttributes: {\n action: '',\n method: 'post',\n novalidate: '',\n class: 'fld-element-settings',\n },\n });\n slideout.on('open', () => {\n // Hold off a sec until it's positioned...\n Garnish.requestAnimationFrame(() => {\n // Focus on the first text input\n slideout.$container.find('.text:first').trigger('focus');\n });\n });\n\n $cancelBtn.on('click', () => {\n slideout.close();\n });\n\n if (js) {\n eval(js);\n }\n\n Craft.initUiElements(slideout.$container);\n\n return slideout;\n },\n }\n);\n\nCraft.FieldLayoutDesigner.Tab = Garnish.Base.extend({\n designer: null,\n uid: null,\n $container: null,\n slideout: null,\n destroyed: false,\n\n init: function (designer, $container) {\n this.designer = designer;\n this.$container = $container;\n this.$container.data('fld-tab', this);\n this.uid = this.$container.data('uid');\n\n // New tab?\n if (!this.uid) {\n this.uid = Craft.uuid();\n this.config = {\n uid: this.uid,\n name: this.$container.find('.tabs .tab span').text(),\n elements: [],\n };\n this.$container.data(\n 'settings-namespace',\n this.designer.$container\n .data('new-tab-settings-namespace')\n .replace(/\\bTAB_UID\\b/g, this.uid)\n );\n this.$container.data(\n 'settings-html',\n this.designer.$container\n .data('new-tab-settings-html')\n .replace(/\\bTAB_UID\\b/g, this.uid)\n .replace(/\\bTAB_NAME\\b/g, this.config.name)\n );\n this.$container.data(\n 'settings-js',\n this.designer.$container\n .data('new-tab-settings-js')\n .replace(/\\bTAB_UID\\b/g, this.uid)\n );\n }\n\n if (this.designer.settings.customizableTabs) {\n this.settingsNamespace = this.$container.data('settings-namespace');\n this.createMenu();\n }\n\n // initialize the elements\n const $elements = this.$container.children('.fld-tabcontent').children();\n\n for (let i = 0; i < $elements.length; i++) {\n this.initElement($($elements[i]));\n }\n },\n\n createMenu: function () {\n const $editBtn = this.$container.find('.tabs .settings');\n\n $('<div class=\"menu\" data-align=\"center\"/>')\n .insertAfter($editBtn)\n .append(\n $('<ul/>')\n .append(\n $('<li/>').append(\n $('<a/>', {\n 'data-action': 'settings',\n text: Craft.t('app', 'Settings'),\n })\n )\n )\n .append(\n $('<li/>').append(\n $('<a/>', {\n 'data-action': 'remove',\n text: Craft.t('app', 'Remove'),\n })\n )\n )\n )\n .append($('<hr/>'))\n .append(\n $('<ul/>')\n .append(\n $('<li/>').append(\n $('<a/>', {\n 'data-action': 'moveLeft',\n text: Craft.t('app', 'Move to the left'),\n })\n )\n )\n .append(\n $('<li/>').append(\n $('<a/>', {\n 'data-action': 'moveRight',\n text: Craft.t('app', 'Move to the right'),\n })\n )\n )\n );\n\n let menuBtn = new Garnish.MenuBtn($editBtn, {\n onOptionSelect: this.onTabOptionSelect.bind(this),\n });\n\n menuBtn.menu.on('show', () => {\n if (this.$container.prev('.fld-tab').length) {\n menuBtn.menu.$container\n .find('[data-action=moveLeft]')\n .removeClass('disabled');\n } else {\n menuBtn.menu.$container\n .find('[data-action=moveLeft]')\n .addClass('disabled');\n }\n\n if (this.$container.next('.fld-tab').length) {\n menuBtn.menu.$container\n .find('[data-action=moveRight]')\n .removeClass('disabled');\n } else {\n menuBtn.menu.$container\n .find('[data-action=moveRight]')\n .addClass('disabled');\n }\n });\n },\n\n onTabOptionSelect: function (option) {\n if (!this.designer.settings.customizableTabs) {\n return;\n }\n\n let $option = $(option);\n let action = $option.data('action');\n\n switch (action) {\n case 'settings':\n if (!this.slideout) {\n this.createSettings();\n } else {\n this.slideout.open();\n }\n break;\n case 'remove':\n this.destroy();\n break;\n case 'moveLeft':\n let $prev = this.$container.prev('.fld-tab');\n if ($prev.length) {\n this.$container.insertBefore($prev);\n this.updatePositionInConfig();\n }\n break;\n case 'moveRight':\n let $next = this.$container.next('.fld-tab');\n if ($next.length) {\n this.$container.insertAfter($next);\n this.updatePositionInConfig();\n }\n break;\n }\n },\n\n createSettings: function () {\n const settingsHtml = this.$container.data('settings-html');\n const settingsJs = this.$container.data('settings-js');\n this.slideout = Craft.FieldLayoutDesigner.createSlideout(\n settingsHtml,\n settingsJs\n );\n\n this.slideout.$container.on('submit', (ev) => {\n ev.preventDefault();\n this.applySettings();\n });\n },\n\n applySettings: function () {\n if (!this.slideout.$container.find('[name$=\"[name]\"]').val()) {\n alert(Craft.t('app', 'You must specify a tab name.'));\n return;\n }\n\n // update the UI\n let $submitBtn = this.slideout.$container\n .find('button[type=submit]')\n .addClass('loading');\n\n const config = $.extend({}, this.config);\n delete config.elements;\n\n Craft.sendActionRequest('POST', 'fields/apply-layout-tab-settings', {\n data: {\n config: config,\n settingsNamespace: this.settingsNamespace,\n settings: this.slideout.$container.serialize(),\n },\n })\n .then((response) => {\n this.updateConfig((config) =>\n $.extend(response.data.config, {elements: config.elements})\n );\n debugger;\n const $label = this.$container.find('.tabs .tab span');\n const $indicator = $label.children('.fld-indicator');\n if (response.data.hasConditions) {\n if (!$indicator.length) {\n $label.append(\n $('<div/>', {\n class: 'fld-indicator',\n title: Craft.t('app', 'This tab is conditional'),\n 'aria-label': Craft.t('app', 'This tab is conditional'),\n 'data-icon': 'condition',\n })\n );\n }\n } else if ($indicator.length) {\n $indicator.remove();\n }\n this.slideout.close();\n })\n .catch((e) => {\n Craft.cp.displayError();\n console.error(e);\n })\n .finally(() => {\n $submitBtn.removeClass('loading');\n this.slideout.close();\n });\n },\n\n initElement: function ($element) {\n return new Craft.FieldLayoutDesigner.Element(this, $element);\n },\n\n get index() {\n return this.designer.config.tabs.findIndex((c) => c.uid === this.uid);\n },\n\n get config() {\n if (!this.uid) {\n throw 'Tab is missing its UID';\n }\n let config = this.designer.config.tabs.find((c) => c.uid === this.uid);\n if (!config) {\n config = {\n uid: this.uid,\n elements: [],\n };\n this.config = config;\n }\n return config;\n },\n\n set config(config) {\n if (this.destroyed) {\n return;\n }\n\n // Is the name changing?\n if (config.name && config.name !== this.config.name) {\n this.$container.find('.tabs .tab span').text(config.name);\n }\n\n const designerConfig = this.designer.config;\n const index = this.index;\n if (index !== -1) {\n designerConfig.tabs[index] = config;\n } else {\n const newIndex = $.inArray(\n this.$container[0],\n this.$container.parent().children('.fld-tab')\n );\n designerConfig.tabs.splice(newIndex, 0, config);\n }\n this.designer.config = designerConfig;\n },\n\n updateConfig: function (callback) {\n if (this.destroyed) {\n return;\n }\n\n const config = callback(this.config);\n if (config !== false) {\n this.config = config;\n }\n },\n\n updatePositionInConfig: function () {\n if (this.destroyed) {\n return;\n }\n\n this.designer.updateConfig((config) => {\n const tabConfig = this.config;\n const oldIndex = this.index;\n const newIndex = $.inArray(\n this.$container[0],\n this.$container.parent().children('.fld-tab')\n );\n if (oldIndex !== -1) {\n config.tabs.splice(oldIndex, 1);\n }\n config.tabs.splice(newIndex, 0, tabConfig);\n return config;\n });\n },\n\n destroy: function () {\n if (this.destroyed) {\n return;\n }\n\n this.destroyed = true;\n\n this.designer.updateConfig((config) => {\n const index = this.index;\n if (index === -1) {\n return false;\n }\n config.tabs.splice(index, 1);\n return config;\n });\n\n // First destroy the tab's elements\n let $elements = this.$container.find('.fld-element');\n for (let i = 0; i < $elements.length; i++) {\n $elements.eq(i).data('fld-element').destroy();\n }\n\n this.designer.tabGrid.removeItems(this.$container);\n this.designer.tabDrag.removeItems(this.$container);\n this.$container.remove();\n\n this.base();\n },\n});\n\nCraft.FieldLayoutDesigner.Element = Garnish.Base.extend({\n tab: null,\n $container: null,\n $settingsContainer: null,\n $editBtn: null,\n\n uid: null,\n isField: false,\n attribute: null,\n requirable: false,\n hasCustomWidth: false,\n hasSettings: false,\n settingsNamespace: null,\n slideout: null,\n\n init: function (tab, $container) {\n this.tab = tab;\n this.$container = $container;\n this.$container.data('fld-element', this);\n this.uid = this.$container.data('uid');\n\n // New element?\n if (!this.uid) {\n this.uid = Craft.uuid();\n this.config = $.extend(this.$container.data('config'), {uid: this.uid});\n }\n\n this.isField = this.$container.hasClass('fld-field');\n this.requirable =\n this.isField && Garnish.hasAttr(this.$container, 'data-requirable');\n\n if (this.isField) {\n this.attribute = this.$container.data('attribute');\n }\n\n this.settingsNamespace = this.$container\n .data('settings-namespace')\n .replace(/\\bELEMENT_UID\\b/g, this.uid);\n let settingsHtml = (this.$container.data('settings-html') || '').replace(\n /\\bELEMENT_UID\\b/g,\n this.uid\n );\n let isRequired =\n this.requirable && this.$container.hasClass('fld-required');\n this.hasCustomWidth =\n this.tab.designer.settings.customizableUi &&\n Garnish.hasAttr(this.$container, 'data-has-custom-width');\n this.hasSettings = settingsHtml || this.requirable;\n\n if (this.hasSettings) {\n // create the setting container\n this.$settingsContainer = $('<div/>', {\n class: 'hidden',\n });\n\n // create the edit button\n this.$editBtn = $('<a/>', {\n role: 'button',\n tabindex: 0,\n class: 'settings icon',\n title: Craft.t('app', 'Edit'),\n });\n\n const showSettings = () => {\n if (!this.slideout) {\n this.createSettings(settingsHtml, isRequired);\n } else {\n this.slideout.open();\n }\n };\n\n this.$editBtn.on('click', showSettings);\n this.$container.on('dblclick', showSettings);\n }\n\n this.initUi();\n\n // cleanup\n this.$container.attr('data-keywords', null);\n this.$container.attr('data-settings-html', null);\n },\n\n initUi: function () {\n if (this.hasCustomWidth) {\n let widthSlider = new Craft.SlidePicker(this.config.width || 100, {\n min: 25,\n max: 100,\n step: 25,\n valueLabel: (width) => {\n return Craft.t('app', '{pct} width', {pct: `${width}%`});\n },\n onChange: (width) => {\n this.updateConfig((config) => {\n config.width = width;\n return config;\n });\n },\n });\n widthSlider.$container.appendTo(this.$container);\n }\n\n if (this.hasSettings) {\n this.$editBtn.appendTo(this.$container);\n }\n },\n\n createSettings: function (settingsHtml, isRequired) {\n const settingsJs = (this.$container.data('settings-js') || '').replace(\n /\\bELEMENT_UID\\b/g,\n this.uid\n );\n this.slideout = Craft.FieldLayoutDesigner.createSlideout(\n settingsHtml,\n settingsJs\n );\n\n this.slideout.$container.on('submit', (ev) => {\n ev.preventDefault();\n this.applySettings();\n });\n\n if (this.requirable) {\n const $fieldsContainer = this.slideout.$container.find('.fields:first');\n Craft.ui\n .createLightswitchField({\n label: Craft.t('app', 'Required'),\n name: `${this.settingsNamespace}[required]`,\n on: isRequired,\n })\n .prependTo($fieldsContainer);\n }\n\n this.trigger('createSettings');\n },\n\n applySettings: function () {\n // update the UI\n let $submitBtn = this.slideout.$container\n .find('button[type=submit]')\n .addClass('loading');\n\n Craft.sendActionRequest('POST', 'fields/apply-layout-element-settings', {\n data: {\n config: this.config,\n settingsNamespace: this.settingsNamespace,\n settings: this.slideout.$container.serialize(),\n },\n })\n .then((response) => {\n this.config = response.data.config;\n this.$editBtn.detach();\n this.$container.html($(response.data.selectorHtml).html());\n this.initUi();\n })\n .catch((e) => {\n Craft.cp.displayError();\n console.error(e);\n })\n .finally(() => {\n $submitBtn.removeClass('loading');\n this.updateRequiredClass();\n this.slideout.close();\n });\n },\n\n updateRequiredClass: function () {\n if (!this.requirable) {\n return;\n }\n\n if (this.config.required) {\n this.$container.addClass('fld-required');\n } else {\n this.$container.removeClass('fld-required');\n }\n },\n\n get index() {\n const tabConfig = this.tab.config;\n if (typeof tabConfig === 'undefined') {\n return -1;\n }\n return tabConfig.elements.findIndex((c) => c.uid === this.uid);\n },\n\n get config() {\n if (!this.uid) {\n throw 'Tab is missing its UID';\n }\n let config = this.tab.config.elements.find((c) => c.uid === this.uid);\n if (!config) {\n config = {\n uid: this.uid,\n };\n this.config = config;\n }\n return config;\n },\n\n set config(config) {\n const tabConfig = this.tab.config;\n const index = this.index;\n if (index !== -1) {\n tabConfig.elements[index] = config;\n } else {\n const newIndex = $.inArray(\n this.$container[0],\n this.$container.parent().children('.fld-element')\n );\n tabConfig.elements.splice(newIndex, 0, config);\n }\n this.tab.config = tabConfig;\n },\n\n updateConfig: function (callback) {\n const config = callback(this.config);\n if (config !== false) {\n this.config = config;\n }\n },\n\n updatePositionInConfig: function () {\n this.tab.updateConfig((config) => {\n const elementConfig = this.config;\n const oldIndex = this.index;\n const newIndex = $.inArray(\n this.$container[0],\n this.$container.parent().children('.fld-element')\n );\n if (oldIndex !== -1) {\n config.elements.splice(oldIndex, 1);\n }\n config.elements.splice(newIndex, 0, elementConfig);\n return config;\n });\n },\n\n destroy: function () {\n this.tab.updateConfig((config) => {\n const index = this.index;\n if (index === -1) {\n return false;\n }\n config.elements.splice(index, 1);\n return config;\n });\n\n this.tab.designer.elementDrag.removeItems(this.$container);\n this.$container.remove();\n\n if (this.isField) {\n this.tab.designer.removeFieldByHandle(this.attribute);\n }\n\n this.base();\n },\n});\n\nCraft.FieldLayoutDesigner.BaseDrag = Garnish.Drag.extend({\n designer: null,\n $insertion: null,\n showingInsertion: false,\n $caboose: null,\n\n /**\n * Constructor\n */\n init: function (designer, settings) {\n this.designer = designer;\n this.base(this.findItems(), settings);\n },\n\n /**\n * On Drag Start\n */\n onDragStart: function () {\n this.base();\n\n // Create the insertion\n this.$insertion = this.createInsertion();\n\n // Add the caboose\n this.$caboose = this.createCaboose();\n this.$items = $().add(this.$items.add(this.$caboose));\n\n Garnish.$bod.addClass('dragging');\n },\n\n removeCaboose: function () {\n this.$items = this.$items.not(this.$caboose);\n this.$caboose.remove();\n },\n\n swapDraggeeWithInsertion: function () {\n this.$insertion.insertBefore(this.$draggee);\n this.$draggee.detach();\n this.$items = $().add(this.$items.not(this.$draggee).add(this.$insertion));\n this.showingInsertion = true;\n },\n\n swapInsertionWithDraggee: function () {\n this.$insertion.replaceWith(this.$draggee);\n this.$items = $().add(this.$items.not(this.$insertion).add(this.$draggee));\n this.showingInsertion = false;\n },\n\n /**\n * Sets the item midpoints up front so we don't have to keep checking on every mouse move\n */\n setMidpoints: function () {\n for (let i = 0; i < this.$items.length; i++) {\n let $item = $(this.$items[i]);\n let offset = $item.offset();\n\n // Skip library elements\n if ($item.hasClass('unused')) {\n continue;\n }\n\n $item.data('midpoint', {\n left: offset.left + $item.outerWidth() / 2,\n top: offset.top + $item.outerHeight() / 2,\n });\n }\n },\n\n /**\n * Returns the closest item to the cursor.\n */\n getClosestItem: function () {\n this.getClosestItem._closestItem = null;\n this.getClosestItem._closestItemMouseDiff = null;\n\n for (\n this.getClosestItem._i = 0;\n this.getClosestItem._i < this.$items.length;\n this.getClosestItem._i++\n ) {\n this.getClosestItem._$item = $(this.$items[this.getClosestItem._i]);\n\n this.getClosestItem._midpoint =\n this.getClosestItem._$item.data('midpoint');\n if (!this.getClosestItem._midpoint) {\n continue;\n }\n\n this.getClosestItem._mouseDiff = Garnish.getDist(\n this.getClosestItem._midpoint.left,\n this.getClosestItem._midpoint.top,\n this.mouseX,\n this.mouseY\n );\n\n if (\n this.getClosestItem._closestItem === null ||\n this.getClosestItem._mouseDiff <\n this.getClosestItem._closestItemMouseDiff\n ) {\n this.getClosestItem._closestItem = this.getClosestItem._$item[0];\n this.getClosestItem._closestItemMouseDiff =\n this.getClosestItem._mouseDiff;\n }\n }\n\n return this.getClosestItem._closestItem;\n },\n\n checkForNewClosestItem: function () {\n // Is there a new closest item?\n this.checkForNewClosestItem._closestItem = this.getClosestItem();\n\n if (this.checkForNewClosestItem._closestItem === this.$insertion[0]) {\n return;\n }\n\n if (\n this.showingInsertion &&\n $.inArray(this.$insertion[0], this.$items) <\n $.inArray(this.checkForNewClosestItem._closestItem, this.$items) &&\n $.inArray(this.checkForNewClosestItem._closestItem, this.$caboose) === -1\n ) {\n this.$insertion.insertAfter(this.checkForNewClosestItem._closestItem);\n } else {\n this.$insertion.insertBefore(this.checkForNewClosestItem._closestItem);\n }\n\n this.$items = $().add(this.$items.add(this.$insertion));\n this.showingInsertion = true;\n this.designer.tabGrid.refreshCols(true);\n this.setMidpoints();\n },\n\n /**\n * On Drag Stop\n */\n onDragStop: function () {\n if (this.showingInsertion) {\n this.swapInsertionWithDraggee();\n }\n\n this.removeCaboose();\n\n this.designer.tabGrid.refreshCols(true);\n\n // return the helpers to the draggees\n let offset = this.$draggee.offset();\n if (!offset || (offset.top === 0 && offset.left === 0)) {\n this.$draggee\n .css({\n display: this.draggeeDisplay,\n visibility: 'visible',\n opacity: 0,\n })\n .velocity({opacity: 1}, Garnish.FX_DURATION);\n this.helpers[0].velocity({opacity: 0}, Garnish.FX_DURATION, () => {\n this._showDraggee();\n });\n } else {\n this.returnHelpersToDraggees();\n }\n\n this.base();\n\n Garnish.$bod.removeClass('dragging');\n },\n});\n\nCraft.FieldLayoutDesigner.TabDrag = Craft.FieldLayoutDesigner.BaseDrag.extend({\n /**\n * Constructor\n */\n init: function (designer) {\n let settings = {\n handle: '.tab',\n };\n\n this.base(designer, settings);\n },\n\n findItems: function () {\n return this.designer.$tabContainer.find('> div.fld-tab');\n },\n\n /**\n * On Drag Start\n */\n onDragStart: function () {\n this.base();\n this.swapDraggeeWithInsertion();\n this.setMidpoints();\n },\n\n swapDraggeeWithInsertion: function () {\n this.base();\n this.designer.tabGrid.removeItems(this.$draggee);\n this.designer.tabGrid.addItems(this.$insertion);\n },\n\n swapInsertionWithDraggee: function () {\n this.base();\n this.designer.tabGrid.removeItems(this.$insertion);\n this.designer.tabGrid.addItems(this.$draggee);\n },\n\n /**\n * On Drag\n */\n onDrag: function () {\n this.checkForNewClosestItem();\n this.base();\n },\n\n /**\n * On Drag Stop\n */\n onDragStop: function () {\n this.base();\n\n // \"show\" the tab, but make it invisible\n this.$draggee.css({\n display: this.draggeeDisplay,\n visibility: 'hidden',\n });\n\n this.$draggee.data('fld-tab').updatePositionInConfig();\n },\n\n /**\n * Creates the caboose\n */\n createCaboose: function () {\n let $caboose = $('<div class=\"fld-tab fld-tab-caboose\"/>').appendTo(\n this.designer.$tabContainer\n );\n this.designer.tabGrid.addItems($caboose);\n return $caboose;\n },\n\n /**\n * Removes the caboose\n */\n removeCaboose: function () {\n this.base();\n this.designer.tabGrid.removeItems(this.$caboose);\n },\n\n /**\n * Creates the insertion\n */\n createInsertion: function () {\n let $tab = this.$draggee.find('.tab');\n\n return $(`\n<div class=\"fld-tab fld-insertion\" style=\"height: ${this.$draggee.height()}px;\">\n <div class=\"tabs\"><div class=\"tab sel draggable\" style=\"width: ${$tab.width()}px; height: ${$tab.height()}px;\"></div></div>\n <div class=\"fld-tabcontent\" style=\"height: ${this.$draggee\n .find('.fld-tabcontent')\n .height()}px;\"></div>\n</div>\n`);\n },\n});\n\nCraft.FieldLayoutDesigner.ElementDrag =\n Craft.FieldLayoutDesigner.BaseDrag.extend({\n draggingLibraryElement: false,\n draggingField: false,\n originalTab: null,\n\n /**\n * On Drag Start\n */\n onDragStart: function () {\n this.base();\n\n // Are we dragging an element from the library?\n this.draggingLibraryElement = this.$draggee.hasClass('unused');\n\n // Is it a field?\n this.draggingField = this.$draggee.hasClass('fld-field');\n\n // keep UI elements visible\n if (this.draggingLibraryElement && !this.draggingField) {\n this.$draggee.css({\n display: this.draggeeDisplay,\n visibility: 'visible',\n });\n }\n\n // Swap the draggee with the insertion if dragging a selected item\n if (!this.draggingLibraryElement) {\n this.originalTab = this.$draggee.closest('.fld-tab').data('fld-tab');\n this.swapDraggeeWithInsertion();\n } else {\n this.originalTab = null;\n }\n\n this.setMidpoints();\n },\n\n /**\n * On Drag\n */\n onDrag: function () {\n if (this.isDraggeeMandatory() || this.isHoveringOverTab()) {\n this.checkForNewClosestItem();\n } else if (this.showingInsertion) {\n this.$insertion.remove();\n this.$items = $().add(this.$items.not(this.$insertion));\n this.showingInsertion = false;\n this.designer.tabGrid.refreshCols(true);\n this.setMidpoints();\n }\n\n this.base();\n },\n\n isDraggeeMandatory: function () {\n return Garnish.hasAttr(this.$draggee, 'data-mandatory');\n },\n\n isHoveringOverTab: function () {\n for (let i = 0; i < this.designer.tabGrid.$items.length; i++) {\n if (\n Garnish.hitTest(\n this.mouseX,\n this.mouseY,\n this.designer.tabGrid.$items.eq(i)\n )\n ) {\n return true;\n }\n }\n\n return false;\n },\n\n findItems: function () {\n // Return all of the used + unused fields\n return this.designer.$tabContainer\n .find('.fld-element')\n .add(this.designer.$sidebar.find('.fld-element'));\n },\n\n /**\n * Creates the caboose\n */\n createCaboose: function () {\n let $caboose = $();\n let $fieldContainers = this.designer.$tabContainer.find(\n '> .fld-tab > .fld-tabcontent'\n );\n\n for (let i = 0; i < $fieldContainers.length; i++) {\n $caboose = $caboose.add($('<div/>').appendTo($fieldContainers[i]));\n }\n\n return $caboose;\n },\n\n /**\n * Creates the insertion\n */\n createInsertion: function () {\n return $(\n `<div class=\"fld-element fld-insertion\" style=\"height: ${this.$draggee.outerHeight()}px;\"/>`\n );\n },\n\n /**\n * On Drag Stop\n */\n onDragStop: function () {\n let showingInsertion = this.showingInsertion;\n if (showingInsertion) {\n if (this.draggingLibraryElement) {\n // Create a new element based on that one\n const $element = this.$draggee.clone().removeClass('unused');\n\n if (this.draggingField) {\n // Hide the library field\n this.$draggee\n .css({visibility: 'inherit', display: 'field'})\n .addClass('hidden');\n\n // Hide the group too?\n if (\n this.$draggee.siblings('.fld-field:not(.hidden)').length === 0\n ) {\n this.$draggee.closest('.fld-field-group').addClass('hidden');\n }\n }\n\n // Set this.$draggee to the clone, as if we were dragging that all along\n this.$draggee = $element;\n\n // Remember it for later\n this.addItems($element);\n }\n } else if (!this.draggingLibraryElement) {\n let $libraryElement = this.draggingField\n ? this.designer.$fields.filter(\n `[data-attribute=\"${this.$draggee.data('attribute')}\"]:first`\n )\n : this.designer.$uiLibraryElements.filter(\n `[data-type=\"${this.$draggee.data('type')}\"]:first`\n );\n\n if (this.draggingField) {\n // show the field in the library\n $libraryElement.removeClass('hidden');\n $libraryElement.closest('.fld-field-group').removeClass('hidden');\n }\n\n // Destroy the original element\n this.$draggee.data('fld-element').destroy();\n\n // Set this.$draggee to the library element, as if we were dragging that all along\n this.$draggee = $libraryElement;\n }\n\n this.base();\n\n this.$draggee.css({\n display: this.draggeeDisplay,\n visibility:\n this.draggingField || showingInsertion ? 'hidden' : 'visible',\n });\n\n if (showingInsertion) {\n const tab = this.$draggee.closest('.fld-tab').data('fld-tab');\n let element;\n\n if (this.draggingLibraryElement) {\n element = tab.initElement(this.$draggee);\n } else {\n element = this.$draggee.data('fld-element');\n\n // New tab?\n if (tab !== this.originalTab) {\n const config = element.config;\n\n this.originalTab.updateConfig((config) => {\n const index = element.index;\n if (index === -1) {\n return false;\n }\n config.elements.splice(index, 1);\n return config;\n });\n\n this.$draggee.data('fld-element').tab = tab;\n element.config = config;\n }\n }\n\n element.updatePositionInConfig();\n }\n },\n });\n","/** global: Craft */\n/** global: Garnish */\n/**\n * FieldToggle\n */\nCraft.FieldToggle = Garnish.Base.extend({\n $toggle: null,\n targetPrefix: null,\n targetSelector: null,\n reverseTargetSelector: null,\n\n _$target: null,\n _$reverseTarget: null,\n type: null,\n\n init: function (toggle) {\n this.$toggle = $(toggle);\n\n // Is this already a field toggle?\n if (this.$toggle.data('fieldtoggle')) {\n console.warn('Double-instantiating a field toggle on an element');\n this.$toggle.data('fieldtoggle').destroy();\n }\n\n this.$toggle.data('fieldtoggle', this);\n\n this.type = this.getType();\n\n if (this.type === 'select' || this.type === 'fieldset') {\n this.targetPrefix = this.$toggle.attr('data-target-prefix') || '';\n } else {\n this.targetSelector = this.normalizeTargetSelector(\n this.$toggle.data('target')\n );\n this.reverseTargetSelector = this.normalizeTargetSelector(\n this.$toggle.data('reverse-target')\n );\n }\n\n this.findTargets();\n\n switch (this.type) {\n case 'link':\n this.addListener(this.$toggle, 'click', 'onToggleChange');\n break;\n case 'fieldset':\n this.addListener(\n this.$toggle.find('input'),\n 'change',\n 'onToggleChange'\n );\n break;\n default:\n this.addListener(this.$toggle, 'change', 'onToggleChange');\n this.onToggleChange();\n }\n },\n\n normalizeTargetSelector: function (selector) {\n if (selector && !selector.match(/^[#\\.]/)) {\n selector = '#' + selector;\n }\n\n return selector;\n },\n\n getType: function () {\n let nodeName = this.$toggle.prop('nodeName');\n if (\n (nodeName === 'INPUT' && this.$toggle.attr('type') === 'checkbox') ||\n this.$toggle.attr('role') === 'checkbox' ||\n this.$toggle.attr('role') === 'switch'\n ) {\n return 'checkbox';\n }\n\n switch (nodeName) {\n case 'SELECT':\n if (Garnish.hasAttr(this.$toggle, 'data-boolean-menu')) {\n return 'booleanMenu';\n }\n return 'select';\n case 'A':\n return 'link';\n default:\n return 'fieldset';\n }\n },\n\n findTargets: function () {\n if (this.type === 'select' || this.type === 'fieldset') {\n var toggleVal = this.getToggleVal();\n this._$target = $(\n this.normalizeTargetSelector(this.targetPrefix + this.getToggleVal())\n );\n } else {\n if (this.targetSelector) {\n this._$target = $(this.targetSelector);\n }\n\n if (this.reverseTargetSelector) {\n this._$reverseTarget = $(this.reverseTargetSelector);\n }\n }\n },\n\n getToggleVal: function () {\n switch (this.type) {\n case 'checkbox':\n if (typeof this.$toggle.prop('checked') !== 'undefined') {\n return this.$toggle.prop('checked');\n }\n return this.$toggle.attr('aria-checked') === 'true';\n\n case 'booleanMenu':\n const boolean = this.$toggle.data('boolean');\n if (typeof boolean !== 'undefined') {\n return boolean;\n }\n const val = this.$toggle.val();\n return val && val !== '0';\n\n default:\n let postVal;\n if (this.type === 'fieldset') {\n postVal = this.$toggle.find('input:checked:first').val();\n } else {\n postVal = Garnish.getInputPostVal(this.$toggle);\n }\n\n // Normalize the value\n return typeof postVal === 'undefined' || postVal === null\n ? null\n : postVal.replace(/[^\\w]+/g, '-');\n }\n },\n\n onToggleChange: function () {\n if (this.type === 'select' || this.type === 'fieldset') {\n this.hideTarget(this._$target);\n this.findTargets();\n this.showTarget(this._$target);\n } else {\n this.findTargets();\n\n if (this.type === 'link') {\n this.onToggleChange._show =\n this.$toggle.hasClass('collapsed') ||\n !this.$toggle.hasClass('expanded');\n } else {\n this.onToggleChange._show = !!this.getToggleVal();\n }\n\n if (this.onToggleChange._show) {\n this.showTarget(this._$target);\n this.hideTarget(this._$reverseTarget);\n } else {\n this.hideTarget(this._$target);\n this.showTarget(this._$reverseTarget);\n }\n\n delete this.onToggleChange._show;\n }\n },\n\n showTarget: function ($target) {\n if ($target && $target.length) {\n this.showTarget._currentHeight = $target.height();\n\n $target.removeClass('hidden');\n\n if (this.type !== 'select' && this.type !== 'fieldset') {\n if (this.type === 'link') {\n this.$toggle.removeClass('collapsed');\n this.$toggle.addClass('expanded');\n }\n\n for (let i = 0; i < $target.length; i++) {\n (($t) => {\n if ($t.prop('nodeName') !== 'SPAN') {\n $t.height('auto');\n this.showTarget._targetHeight = $t.height();\n $t.css({\n height: this.showTarget._currentHeight,\n overflow: 'hidden',\n });\n\n $t.velocity('stop');\n\n $t.velocity(\n {height: this.showTarget._targetHeight},\n 'fast',\n function () {\n $t.css({\n height: '',\n overflow: '',\n });\n }\n );\n }\n })($target.eq(i));\n }\n\n delete this.showTarget._targetHeight;\n }\n\n delete this.showTarget._currentHeight;\n\n // Trigger a resize event in case there are any grids in the target that need to initialize\n Garnish.$win.trigger('resize');\n }\n },\n\n hideTarget: function ($target) {\n if ($target && $target.length) {\n if (this.type === 'select' || this.type === 'fieldset') {\n $target.addClass('hidden');\n } else {\n if (this.type === 'link') {\n this.$toggle.removeClass('expanded');\n this.$toggle.addClass('collapsed');\n }\n\n for (let i = 0; i < $target.length; i++) {\n (($t) => {\n if ($t.hasClass('hidden')) {\n return;\n }\n if ($t.prop('nodeName') === 'SPAN') {\n $t.addClass('hidden');\n } else {\n $t.css('overflow', 'hidden');\n $t.velocity('stop');\n $t.velocity({height: 0}, 'fast', function () {\n $t.addClass('hidden');\n });\n }\n })($target.eq(i));\n }\n }\n }\n },\n\n destroy: function () {\n this.$toggle.removeData('fieldtoggle');\n this.base();\n },\n});\n","/** global: Craft */\n/** global: Garnish */\nCraft.Grid = Garnish.Base.extend(\n {\n $container: null,\n\n $items: null,\n items: null,\n totalCols: null,\n colGutterDrop: null,\n colPctWidth: null,\n\n possibleItemColspans: null,\n possibleItemPositionsByColspan: null,\n\n itemPositions: null,\n itemColspansByPosition: null,\n\n layouts: null,\n layout: null,\n itemHeights: null,\n leftPadding: null,\n\n _refreshingCols: false,\n _refreshColsAfterRefresh: false,\n _forceRefreshColsAfterRefresh: false,\n\n init: function (container, settings) {\n this.$container = $(container);\n\n // Is this already a grid?\n if (this.$container.data('grid')) {\n console.warn('Double-instantiating a grid on an element');\n this.$container.data('grid').destroy();\n }\n\n this.$container.data('grid', this);\n\n this.setSettings(settings, Craft.Grid.defaults);\n\n // Set the refreshCols() proxy that container resizes will trigger\n this.handleContainerHeightProxy = () => {\n this.refreshCols(false, true);\n };\n\n this.$items = this.$container.children(this.settings.itemSelector);\n this.setItems();\n this.refreshCols(true, false);\n\n Garnish.$doc.ready(() => {\n this.refreshCols(false, false);\n });\n },\n\n addItems: function (items) {\n this.$items = $().add(this.$items.add(items));\n this.setItems();\n this.refreshCols(true, true);\n },\n\n removeItems: function (items) {\n this.$items = $().add(this.$items.not(items));\n this.setItems();\n this.refreshCols(true, true);\n },\n\n resetItemOrder: function () {\n this.$items = $().add(this.$items);\n this.setItems();\n this.refreshCols(true, true);\n },\n\n setItems: function () {\n this.setItems._ = {};\n\n this.items = [];\n\n for (\n this.setItems._.i = 0;\n this.setItems._.i < this.$items.length;\n this.setItems._.i++\n ) {\n this.items.push($(this.$items[this.setItems._.i]));\n }\n\n delete this.setItems._;\n },\n\n refreshCols: function (force) {\n if (this._refreshingCols) {\n this._refreshColsAfterRefresh = true;\n if (force) {\n this._forceRefreshColsAfterRefresh = true;\n }\n return;\n }\n\n this._refreshingCols = true;\n\n if (!this.items.length) {\n this.completeRefreshCols();\n return;\n }\n\n this.refreshCols._ = {};\n\n // Check to see if the grid is actually visible\n this.refreshCols._.oldHeight = this.$container[0].style.height;\n this.$container[0].style.height = 1;\n this.refreshCols._.scrollHeight = this.$container[0].scrollHeight;\n this.$container[0].style.height = this.refreshCols._.oldHeight;\n\n if (this.refreshCols._.scrollHeight === 0) {\n this.completeRefreshCols();\n return;\n }\n\n if (this.settings.cols) {\n this.refreshCols._.totalCols = this.settings.cols;\n } else {\n this.refreshCols._.totalCols = Math.floor(\n this.$container.width() / this.settings.minColWidth\n );\n\n // If we're adding a new column, require an extra 20 pixels in case a scrollbar shows up\n if (\n this.totalCols !== null &&\n this.refreshCols._.totalCols > this.totalCols\n ) {\n this.refreshCols._.totalCols = Math.floor(\n (this.$container.width() - 20) / this.settings.minColWidth\n );\n }\n\n if (\n this.settings.maxCols &&\n this.refreshCols._.totalCols > this.settings.maxCols\n ) {\n this.refreshCols._.totalCols = this.settings.maxCols;\n }\n }\n\n if (this.refreshCols._.totalCols === 0) {\n this.refreshCols._.totalCols = 1;\n }\n\n // Same number of columns as before?\n if (force !== true && this.totalCols === this.refreshCols._.totalCols) {\n this.completeRefreshCols();\n return;\n }\n\n this.totalCols = this.refreshCols._.totalCols;\n this.colGutterDrop =\n (this.settings.gutter * (this.totalCols - 1)) / this.totalCols;\n\n // Temporarily stop listening to container resizes\n this.removeListener(this.$container, 'resize');\n\n if (this.settings.fillMode === 'grid') {\n this.refreshCols._.itemIndex = 0;\n\n while (this.refreshCols._.itemIndex < this.items.length) {\n // Append the next X items and figure out which one is the tallest\n this.refreshCols._.tallestItemHeight = -1;\n this.refreshCols._.colIndex = 0;\n\n for (\n this.refreshCols._.i = this.refreshCols._.itemIndex;\n this.refreshCols._.i <\n this.refreshCols._.itemIndex + this.totalCols &&\n this.refreshCols._.i < this.items.length;\n this.refreshCols._.i++\n ) {\n this.refreshCols._.itemHeight = this.items[this.refreshCols._.i]\n .height('auto')\n .height();\n\n if (\n this.refreshCols._.itemHeight >\n this.refreshCols._.tallestItemHeight\n ) {\n this.refreshCols._.tallestItemHeight =\n this.refreshCols._.itemHeight;\n }\n\n this.refreshCols._.colIndex++;\n }\n\n if (this.settings.snapToGrid) {\n this.refreshCols._.remainder =\n this.refreshCols._.tallestItemHeight % this.settings.snapToGrid;\n\n if (this.refreshCols._.remainder) {\n this.refreshCols._.tallestItemHeight +=\n this.settings.snapToGrid - this.refreshCols._.remainder;\n }\n }\n\n // Now set their heights to the tallest one\n for (\n this.refreshCols._.i = this.refreshCols._.itemIndex;\n this.refreshCols._.i <\n this.refreshCols._.itemIndex + this.totalCols &&\n this.refreshCols._.i < this.items.length;\n this.refreshCols._.i++\n ) {\n this.items[this.refreshCols._.i].height(\n this.refreshCols._.tallestItemHeight\n );\n }\n\n // set the this.refreshCols._.itemIndex pointer to the next one up\n this.refreshCols._.itemIndex += this.totalCols;\n }\n } else {\n this.removeListener(this.$items, 'resize');\n\n // If there's only one column, sneak out early\n if (this.totalCols === 1) {\n this.$container.height('auto');\n this.$items\n .show()\n .css({\n position: 'relative',\n width: 'auto',\n top: 0,\n })\n .css(Craft.left, 0);\n } else {\n this.$items.css('position', 'absolute');\n this.colPctWidth = 100 / this.totalCols;\n\n // The setup\n\n this.layouts = [];\n\n this.itemPositions = [];\n this.itemColspansByPosition = [];\n\n // Figure out all of the possible colspans for each item,\n // as well as all the possible positions for each item at each of its colspans\n\n this.possibleItemColspans = [];\n this.possibleItemPositionsByColspan = [];\n this.itemHeightsByColspan = [];\n\n for (\n this.refreshCols._.item = 0;\n this.refreshCols._.item < this.items.length;\n this.refreshCols._.item++\n ) {\n this.possibleItemColspans[this.refreshCols._.item] = [];\n this.possibleItemPositionsByColspan[this.refreshCols._.item] = {};\n this.itemHeightsByColspan[this.refreshCols._.item] = {};\n\n this.refreshCols._.$item =\n this.items[this.refreshCols._.item].show();\n this.refreshCols._.positionRight =\n this.refreshCols._.$item.data('position') === 'right';\n this.refreshCols._.positionLeft =\n this.refreshCols._.$item.data('position') === 'left';\n this.refreshCols._.minColspan = this.refreshCols._.$item.data(\n 'colspan'\n )\n ? this.refreshCols._.$item.data('colspan')\n : this.refreshCols._.$item.data('min-colspan')\n ? this.refreshCols._.$item.data('min-colspan')\n : 1;\n this.refreshCols._.maxColspan = this.refreshCols._.$item.data(\n 'colspan'\n )\n ? this.refreshCols._.$item.data('colspan')\n : this.refreshCols._.$item.data('max-colspan')\n ? this.refreshCols._.$item.data('max-colspan')\n : this.totalCols;\n\n if (this.refreshCols._.minColspan > this.totalCols) {\n this.refreshCols._.minColspan = this.totalCols;\n }\n if (this.refreshCols._.maxColspan > this.totalCols) {\n this.refreshCols._.maxColspan = this.totalCols;\n }\n\n for (\n this.refreshCols._.colspan = this.refreshCols._.minColspan;\n this.refreshCols._.colspan <= this.refreshCols._.maxColspan;\n this.refreshCols._.colspan++\n ) {\n // Get the height for this colspan\n this.refreshCols._.$item.css(\n 'width',\n this.getItemWidthCss(this.refreshCols._.colspan)\n );\n this.itemHeightsByColspan[this.refreshCols._.item][\n this.refreshCols._.colspan\n ] = this.refreshCols._.$item.outerHeight();\n\n this.possibleItemColspans[this.refreshCols._.item].push(\n this.refreshCols._.colspan\n );\n this.possibleItemPositionsByColspan[this.refreshCols._.item][\n this.refreshCols._.colspan\n ] = [];\n\n if (this.refreshCols._.positionLeft) {\n this.refreshCols._.minPosition = 0;\n this.refreshCols._.maxPosition = 0;\n } else if (this.refreshCols._.positionRight) {\n this.refreshCols._.minPosition =\n this.totalCols - this.refreshCols._.colspan;\n this.refreshCols._.maxPosition = this.refreshCols._.minPosition;\n } else {\n this.refreshCols._.minPosition = 0;\n this.refreshCols._.maxPosition =\n this.totalCols - this.refreshCols._.colspan;\n }\n\n for (\n this.refreshCols._.position = this.refreshCols._.minPosition;\n this.refreshCols._.position <= this.refreshCols._.maxPosition;\n this.refreshCols._.position++\n ) {\n this.possibleItemPositionsByColspan[this.refreshCols._.item][\n this.refreshCols._.colspan\n ].push(this.refreshCols._.position);\n }\n }\n }\n\n // Find all the possible layouts\n\n this.refreshCols._.colHeights = [];\n\n for (\n this.refreshCols._.i = 0;\n this.refreshCols._.i < this.totalCols;\n this.refreshCols._.i++\n ) {\n this.refreshCols._.colHeights.push(0);\n }\n\n this.createLayouts(0, [], [], this.refreshCols._.colHeights, 0);\n\n // Now find the layout that looks the best.\n\n // First find the layouts with the highest number of used columns\n this.refreshCols._.layoutTotalCols = [];\n\n for (\n this.refreshCols._.i = 0;\n this.refreshCols._.i < this.layouts.length;\n this.refreshCols._.i++\n ) {\n this.refreshCols._.layoutTotalCols[this.refreshCols._.i] = 0;\n\n for (\n this.refreshCols._.j = 0;\n this.refreshCols._.j < this.totalCols;\n this.refreshCols._.j++\n ) {\n if (\n this.layouts[this.refreshCols._.i].colHeights[\n this.refreshCols._.j\n ]\n ) {\n this.refreshCols._.layoutTotalCols[this.refreshCols._.i]++;\n }\n }\n }\n\n this.refreshCols._.highestTotalCols = Math.max.apply(\n null,\n this.refreshCols._.layoutTotalCols\n );\n\n // Filter out the ones that aren't using as many columns as they could be\n for (\n this.refreshCols._.i = this.layouts.length - 1;\n this.refreshCols._.i >= 0;\n this.refreshCols._.i--\n ) {\n if (\n this.refreshCols._.layoutTotalCols[this.refreshCols._.i] !==\n this.refreshCols._.highestTotalCols\n ) {\n this.layouts.splice(this.refreshCols._.i, 1);\n }\n }\n\n // Find the layout(s) with the least overall height\n this.refreshCols._.layoutHeights = [];\n\n for (\n this.refreshCols._.i = 0;\n this.refreshCols._.i < this.layouts.length;\n this.refreshCols._.i++\n ) {\n this.refreshCols._.layoutHeights.push(\n Math.max.apply(\n null,\n this.layouts[this.refreshCols._.i].colHeights\n )\n );\n }\n\n this.refreshCols._.shortestHeight = Math.min.apply(\n null,\n this.refreshCols._.layoutHeights\n );\n this.refreshCols._.shortestLayouts = [];\n this.refreshCols._.emptySpaces = [];\n\n for (\n this.refreshCols._.i = 0;\n this.refreshCols._.i < this.refreshCols._.layoutHeights.length;\n this.refreshCols._.i++\n ) {\n if (\n this.refreshCols._.layoutHeights[this.refreshCols._.i] ===\n this.refreshCols._.shortestHeight\n ) {\n this.refreshCols._.shortestLayouts.push(\n this.layouts[this.refreshCols._.i]\n );\n\n // Now get its total empty space, including any trailing empty space\n this.refreshCols._.emptySpace =\n this.layouts[this.refreshCols._.i].emptySpace;\n\n for (\n this.refreshCols._.j = 0;\n this.refreshCols._.j < this.totalCols;\n this.refreshCols._.j++\n ) {\n this.refreshCols._.emptySpace +=\n this.refreshCols._.shortestHeight -\n this.layouts[this.refreshCols._.i].colHeights[\n this.refreshCols._.j\n ];\n }\n\n this.refreshCols._.emptySpaces.push(\n this.refreshCols._.emptySpace\n );\n }\n }\n\n // And the layout with the least empty space is...\n this.layout =\n this.refreshCols._.shortestLayouts[\n $.inArray(\n Math.min.apply(null, this.refreshCols._.emptySpaces),\n this.refreshCols._.emptySpaces\n )\n ];\n\n // Set the item widths and left positions\n for (\n this.refreshCols._.i = 0;\n this.refreshCols._.i < this.items.length;\n this.refreshCols._.i++\n ) {\n this.refreshCols._.css = {\n width: this.getItemWidthCss(\n this.layout.colspans[this.refreshCols._.i]\n ),\n };\n this.refreshCols._.css[Craft.left] = this.getItemLeftPosCss(\n this.layout.positions[this.refreshCols._.i]\n );\n this.items[this.refreshCols._.i].css(this.refreshCols._.css);\n }\n\n // If every item is at position 0, then let them lay out au naturel\n if (this.isSimpleLayout()) {\n this.$container.height('auto');\n this.$items.css({\n position: 'relative',\n top: 0,\n 'margin-bottom': this.settings.gutter + 'px',\n });\n } else {\n this.$items.css('position', 'absolute');\n\n // Now position the items\n this.positionItems();\n\n // Update the positions as the items' heigthts change\n this.addListener(this.$items, 'resize', 'onItemResize');\n }\n }\n }\n\n this.completeRefreshCols();\n\n // Resume container resize listening\n this.addListener(\n this.$container,\n 'resize',\n this.handleContainerHeightProxy\n );\n\n this.onRefreshCols();\n },\n\n completeRefreshCols: function () {\n // Delete the internal variable object\n if (typeof this.refreshCols._ !== 'undefined') {\n delete this.refreshCols._;\n }\n\n this._refreshingCols = false;\n\n if (this._refreshColsAfterRefresh) {\n var force = this._forceRefreshColsAfterRefresh;\n this._refreshColsAfterRefresh = false;\n this._forceRefreshColsAfterRefresh = false;\n\n Garnish.requestAnimationFrame(() => {\n this.refreshCols(force);\n });\n }\n },\n\n getItemWidth: function (colspan) {\n return this.colPctWidth * colspan;\n },\n\n getItemWidthCss: function (colspan) {\n return (\n 'calc(' +\n this.getItemWidth(colspan) +\n '% - ' +\n this.colGutterDrop +\n 'px)'\n );\n },\n\n getItemWidthInPx: function (colspan) {\n return (\n (this.getItemWidth(colspan) / 100) * this.$container.width() -\n this.colGutterDrop\n );\n },\n\n getItemLeftPosCss: function (position) {\n return (\n 'calc(' +\n '(' +\n this.getItemWidth(1) +\n '% + ' +\n (this.settings.gutter - this.colGutterDrop) +\n 'px) * ' +\n position +\n ')'\n );\n },\n\n getItemLeftPosInPx: function (position) {\n return (\n ((this.getItemWidth(1) / 100) * this.$container.width() +\n (this.settings.gutter - this.colGutterDrop)) *\n position\n );\n },\n\n createLayouts: function (\n item,\n prevPositions,\n prevColspans,\n prevColHeights,\n prevEmptySpace\n ) {\n new Craft.Grid.LayoutGenerator(this).createLayouts(\n item,\n prevPositions,\n prevColspans,\n prevColHeights,\n prevEmptySpace\n );\n },\n\n isSimpleLayout: function () {\n this.isSimpleLayout._ = {};\n\n for (\n this.isSimpleLayout._.i = 0;\n this.isSimpleLayout._.i < this.layout.positions.length;\n this.isSimpleLayout._.i++\n ) {\n if (this.layout.positions[this.isSimpleLayout._.i] !== 0) {\n delete this.isSimpleLayout._;\n return false;\n }\n }\n\n delete this.isSimpleLayout._;\n return true;\n },\n\n positionItems: function () {\n this.positionItems._ = {};\n\n this.positionItems._.colHeights = [];\n\n for (\n this.positionItems._.i = 0;\n this.positionItems._.i < this.totalCols;\n this.positionItems._.i++\n ) {\n this.positionItems._.colHeights.push(0);\n }\n\n for (\n this.positionItems._.i = 0;\n this.positionItems._.i < this.items.length;\n this.positionItems._.i++\n ) {\n this.positionItems._.endingCol =\n this.layout.positions[this.positionItems._.i] +\n this.layout.colspans[this.positionItems._.i] -\n 1;\n this.positionItems._.affectedColHeights = [];\n\n for (\n this.positionItems._.col =\n this.layout.positions[this.positionItems._.i];\n this.positionItems._.col <= this.positionItems._.endingCol;\n this.positionItems._.col++\n ) {\n this.positionItems._.affectedColHeights.push(\n this.positionItems._.colHeights[this.positionItems._.col]\n );\n }\n\n this.positionItems._.top = Math.max.apply(\n null,\n this.positionItems._.affectedColHeights\n );\n if (this.positionItems._.top > 0) {\n this.positionItems._.top += this.settings.gutter;\n }\n\n this.items[this.positionItems._.i].css('top', this.positionItems._.top);\n\n // Now add the new heights to those columns\n for (\n this.positionItems._.col =\n this.layout.positions[this.positionItems._.i];\n this.positionItems._.col <= this.positionItems._.endingCol;\n this.positionItems._.col++\n ) {\n this.positionItems._.colHeights[this.positionItems._.col] =\n this.positionItems._.top +\n this.itemHeightsByColspan[this.positionItems._.i][\n this.layout.colspans[this.positionItems._.i]\n ];\n }\n }\n\n // Set the container height\n this.$container.height(\n Math.max.apply(null, this.positionItems._.colHeights)\n );\n\n delete this.positionItems._;\n },\n\n onItemResize: function (ev) {\n this.onItemResize._ = {};\n\n // Prevent this from bubbling up to the container, which has its own resize listener\n ev.stopPropagation();\n\n this.onItemResize._.item = $.inArray(ev.currentTarget, this.$items);\n\n if (this.onItemResize._.item !== -1) {\n // Update the height and reposition the items\n this.onItemResize._.newHeight =\n this.items[this.onItemResize._.item].outerHeight();\n\n if (\n this.onItemResize._.newHeight !==\n this.itemHeightsByColspan[this.onItemResize._.item][\n this.layout.colspans[this.onItemResize._.item]\n ]\n ) {\n this.itemHeightsByColspan[this.onItemResize._.item][\n this.layout.colspans[this.onItemResize._.item]\n ] = this.onItemResize._.newHeight;\n this.positionItems(false);\n }\n }\n\n delete this.onItemResize._;\n },\n\n onRefreshCols: function () {\n this.trigger('refreshCols');\n this.settings.onRefreshCols();\n },\n\n destroy: function () {\n this.$container.removeData('grid');\n this.base();\n },\n },\n {\n defaults: {\n itemSelector: '.item',\n cols: null,\n maxCols: null,\n minColWidth: 320,\n gutter: 14,\n fillMode: 'top',\n colClass: 'col',\n snapToGrid: null,\n\n onRefreshCols: $.noop,\n },\n }\n);\n\nCraft.Grid.LayoutGenerator = Garnish.Base.extend({\n grid: null,\n _: null,\n\n init: function (grid) {\n this.grid = grid;\n },\n\n createLayouts: function (\n item,\n prevPositions,\n prevColspans,\n prevColHeights,\n prevEmptySpace\n ) {\n this._ = {};\n\n // Loop through all possible colspans\n for (\n this._.c = 0;\n this._.c < this.grid.possibleItemColspans[item].length;\n this._.c++\n ) {\n this._.colspan = this.grid.possibleItemColspans[item][this._.c];\n\n // Loop through all the possible positions for this colspan,\n // and find the one that is closest to the top\n\n this._.tallestColHeightsByPosition = [];\n\n for (\n this._.p = 0;\n this._.p <\n this.grid.possibleItemPositionsByColspan[item][this._.colspan].length;\n this._.p++\n ) {\n this._.position =\n this.grid.possibleItemPositionsByColspan[item][this._.colspan][\n this._.p\n ];\n\n this._.colHeightsForPosition = [];\n this._.endingCol = this._.position + this._.colspan - 1;\n\n for (\n this._.col = this._.position;\n this._.col <= this._.endingCol;\n this._.col++\n ) {\n this._.colHeightsForPosition.push(prevColHeights[this._.col]);\n }\n\n this._.tallestColHeightsByPosition[this._.p] = Math.max.apply(\n null,\n this._.colHeightsForPosition\n );\n }\n\n // And the shortest position for this colspan is...\n this._.p = $.inArray(\n Math.min.apply(null, this._.tallestColHeightsByPosition),\n this._.tallestColHeightsByPosition\n );\n this._.position =\n this.grid.possibleItemPositionsByColspan[item][this._.colspan][\n this._.p\n ];\n\n // Now log the colspan/position placement\n this._.positions = prevPositions.slice(0);\n this._.colspans = prevColspans.slice(0);\n this._.colHeights = prevColHeights.slice(0);\n this._.emptySpace = prevEmptySpace;\n\n this._.positions.push(this._.position);\n this._.colspans.push(this._.colspan);\n\n // Add the new heights to those columns\n this._.tallestColHeight = this._.tallestColHeightsByPosition[this._.p];\n this._.endingCol = this._.position + this._.colspan - 1;\n\n for (\n this._.col = this._.position;\n this._.col <= this._.endingCol;\n this._.col++\n ) {\n this._.emptySpace +=\n this._.tallestColHeight - this._.colHeights[this._.col];\n this._.colHeights[this._.col] =\n this._.tallestColHeight +\n this.grid.itemHeightsByColspan[item][this._.colspan];\n }\n\n // If this is the last item, create the layout\n if (item === this.grid.items.length - 1) {\n this.grid.layouts.push({\n positions: this._.positions,\n colspans: this._.colspans,\n colHeights: this._.colHeights,\n emptySpace: this._.emptySpace,\n });\n } else {\n // Dive deeper\n this.grid.createLayouts(\n item + 1,\n this._.positions,\n this._.colspans,\n this._.colHeights,\n this._.emptySpace\n );\n }\n }\n\n delete this._;\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Handle Generator\n */\nCraft.HandleGenerator = Craft.BaseInputGenerator.extend({\n generateTargetValue: function (sourceVal) {\n // Remove HTML tags\n var handle = sourceVal.replace('/<(.*?)>/g', '');\n\n // Remove inner-word punctuation\n handle = handle.replace(/['\"‘’“”\\[\\]\\(\\)\\{\\}:]/g, '');\n\n // Make it lowercase\n handle = handle.toLowerCase();\n\n // Convert extended ASCII characters to basic ASCII\n handle = Craft.asciiString(handle);\n\n if (!this.settings.allowNonAlphaStart) {\n // Handle must start with a letter\n handle = handle.replace(/^[^a-z]+/, '');\n }\n\n // Get the \"words\"\n var words = Craft.filterArray(handle.split(/[^a-z0-9]+/));\n handle = '';\n\n if (Craft.handleCasing === 'snake') {\n return words.join('_');\n }\n\n // Make it camelCase\n for (let i = 0; i < words.length; i++) {\n if (Craft.handleCasing !== 'pascal' && i === 0) {\n handle += words[i];\n } else {\n handle += words[i].charAt(0).toUpperCase() + words[i].substring(1);\n }\n }\n\n return handle;\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n\n/**\n * Image upload class for user photos, site icon and logo.\n */\nCraft.ImageUpload = Garnish.Base.extend(\n {\n $container: null,\n progressBar: null,\n uploader: null,\n\n init: function (settings) {\n this.setSettings(settings, Craft.ImageUpload.defaults);\n this.initImageUpload();\n },\n\n initImageUpload: function () {\n this.$container = $(this.settings.containerSelector);\n this.progressBar = new Craft.ProgressBar(\n $('<div class=\"progress-shade\"></div>').appendTo(this.$container)\n );\n\n var options = {\n url: Craft.getActionUrl(this.settings.uploadAction),\n formData: this.settings.postParameters,\n fileInput: this.$container.find(this.settings.fileInputSelector),\n paramName: this.settings.uploadParamName,\n };\n\n // If CSRF protection isn't enabled, these won't be defined.\n if (\n typeof Craft.csrfTokenName !== 'undefined' &&\n typeof Craft.csrfTokenValue !== 'undefined'\n ) {\n // Add the CSRF token\n options.formData[Craft.csrfTokenName] = Craft.csrfTokenValue;\n }\n\n options.events = {};\n options.events.fileuploadstart = this._onUploadStart.bind(this);\n options.events.fileuploadprogressall = this._onUploadProgress.bind(this);\n options.events.fileuploaddone = this._onUploadComplete.bind(this);\n options.events.fileuploadfail = this._onUploadFailure.bind(this);\n\n this.uploader = new Craft.Uploader(this.$container, options);\n\n this.initButtons();\n },\n\n initButtons: function () {\n this.$container\n .find(this.settings.uploadButtonSelector)\n .on('click', (ev) => {\n this.$container\n .find(this.settings.fileInputSelector)\n .trigger('click');\n });\n\n this.$container\n .find(this.settings.deleteButtonSelector)\n .on('click', (ev) => {\n if (\n confirm(\n Craft.t('app', 'Are you sure you want to delete this image?')\n )\n ) {\n $(ev.currentTarget)\n .parent()\n .append('<div class=\"blocking-modal\"></div>');\n\n Craft.sendActionRequest('POST', this.settings.deleteAction, {\n data: this.settings.postParameters,\n }).then(({data}) => {\n this.refreshImage(data);\n });\n }\n });\n },\n\n refreshImage: function (response) {\n $(this.settings.containerSelector).replaceWith(response.html);\n this.settings.onAfterRefreshImage(response);\n this.initImageUpload();\n },\n\n /**\n * On upload start.\n */\n _onUploadStart: function (event) {\n this.progressBar.$progressBar.css({\n top: Math.round(this.$container.outerHeight() / 2) - 6,\n });\n\n this.$container.addClass('uploading');\n this.progressBar.resetProgressBar();\n this.progressBar.showProgressBar();\n },\n\n /**\n * On upload progress.\n */\n _onUploadProgress: function (event, data) {\n var progress = parseInt((data.loaded / data.total) * 100, 10);\n this.progressBar.setProgressPercentage(progress);\n },\n\n /**\n * On a file being uploaded.\n */\n _onUploadComplete: function (event, data) {\n if (data.result.error) {\n alert(data.result.error);\n } else {\n var html = $(data.result.html);\n this.refreshImage(data.result);\n }\n\n // Last file\n if (this.uploader.isLastUpload()) {\n this.progressBar.hideProgressBar();\n this.$container.removeClass('uploading');\n }\n },\n\n /**\n * On Upload Failure.\n */\n _onUploadFailure: function (event, data) {\n const response = data.response();\n let {message, filename} = response?.jqXHR?.responseJSON || {};\n\n if (!message) {\n message = filename\n ? Craft.t('app', 'Upload failed for “{filename}”.', {filename})\n : Craft.t('app', 'Upload failed.');\n }\n\n alert(message);\n this.progressBar.hideProgressBar();\n this.$container.removeClass('uploading');\n },\n },\n {\n defaults: {\n postParameters: {},\n uploadAction: '',\n deleteAction: '',\n fileInputSelector: '',\n\n onAfterRefreshImage: $.noop,\n containerSelector: null,\n\n uploadButtonSelector: null,\n deleteButtonSelector: null,\n\n uploadParamName: 'files',\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Info icon class\n */\nCraft.InfoIcon = Garnish.Base.extend({\n $container: null,\n $icon: null,\n $liveRegion: null,\n content: null,\n hud: null,\n\n init: function (icon) {\n this.$icon = $(icon);\n this.$liveRegion = $('<span/>', {\n role: 'status',\n class: 'visually-hidden',\n });\n\n if (this.$icon.data('infoicon')) {\n console.warn('Double-instantiating an info icon on an element');\n this.content = this.$icon.data('infoicon').content;\n this.$icon.data('infoicon').destroy();\n } else {\n this.content = this.$icon.html();\n this.$icon\n .html('')\n .attr({\n tabindex: 0,\n role: 'button',\n type: 'button',\n 'aria-label': Craft.t('app', 'More info'),\n })\n .wrap(\n $('<span/>', {\n class: 'infoicon-container',\n })\n );\n\n this.$container = this.$icon.parent();\n this.$container.append(this.$liveRegion);\n }\n\n this.$icon.data('infoicon', this);\n\n if (\n this.$icon[0].previousSibling &&\n this.$icon[0].previousSibling.nodeType === Node.TEXT_NODE\n ) {\n // Make sure it's in a .nowrap container\n const $parent = this.$icon.parent();\n if (!$parent.hasClass('nowrap')) {\n // Find the last word in the text\n const m = this.$icon[0].previousSibling.nodeValue.match(/[^\\s\\-]+\\s*$/);\n if (m) {\n this.$icon[0].previousSibling.nodeValue =\n this.$icon[0].previousSibling.nodeValue.substring(0, m.index);\n $('<span/>', {\n class: 'nowrap',\n html: m[0].replace(/\\s+$/, '') + ' ',\n })\n .insertAfter(this.$icon[0].previousSibling)\n .append(this.$icon);\n }\n }\n }\n\n this.addListener(this.$icon, 'click', (ev) => {\n ev.preventDefault();\n ev.stopPropagation();\n this.showHud();\n });\n\n this.addListener(this.$icon, 'keydown', (ev) => {\n if (\n !(this.hud && this.hud.showing) &&\n [Garnish.SPACE_KEY, Garnish.RETURN_KEY].includes(ev.keyCode)\n ) {\n ev.preventDefault();\n ev.stopPropagation();\n this.showHud();\n }\n });\n },\n\n showHud: function (ev) {\n if (!this.hud) {\n this.hud = new Garnish.HUD(this.$icon, this.content, {\n hudClass: 'hud info-hud',\n closeOtherHUDs: false,\n onShow: () => {\n Garnish.uiLayerManager.registerShortcut(Garnish.SPACE_KEY, () => {\n this.hud.hide();\n });\n\n this.$liveRegion.html('');\n\n setTimeout(() => {\n this.$liveRegion.html(this.content);\n }, 200);\n },\n onHide: () => {\n this.$liveRegion.html('');\n },\n });\n Craft.initUiElements(this.hud.$body);\n } else {\n this.hud.show();\n }\n },\n\n destroy: function () {\n this.$icon.removeData('infoicon');\n this.base();\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Light Switch\n */\nCraft.LightSwitch = Garnish.Base.extend(\n {\n settings: null,\n $outerContainer: null,\n $innerContainer: null,\n $input: null,\n small: false,\n on: false,\n indeterminate: false,\n dragger: null,\n\n dragStartMargin: null,\n\n init: function (outerContainer, settings) {\n this.$outerContainer = $(outerContainer);\n\n // Is this already a lightswitch?\n if (this.$outerContainer.data('lightswitch')) {\n console.warn('Double-instantiating a lightswitch on an element');\n this.$outerContainer.data('lightswitch').destroy();\n }\n\n this.$outerContainer.data('lightswitch', this);\n\n this.small = this.$outerContainer.hasClass('small');\n\n this.setSettings(settings, Craft.LightSwitch.defaults);\n\n this.$innerContainer = this.$outerContainer.find(\n '.lightswitch-container:first'\n );\n this.$input = this.$outerContainer.find('input:first');\n\n // If the input is disabled, go no further\n if (this.$input.prop('disabled')) {\n return;\n }\n\n this.on = this.$outerContainer.hasClass('on');\n this.indeterminate = this.$outerContainer.hasClass('indeterminate');\n\n this.addListener(this.$outerContainer, 'mousedown', '_onMouseDown');\n this.addListener(this.$outerContainer, 'keydown', '_onKeyDown');\n\n this.dragger = new Garnish.BaseDrag(this.$outerContainer, {\n axis: Garnish.X_AXIS,\n ignoreHandleSelector: null,\n onDragStart: this._onDragStart.bind(this),\n onDrag: this._onDrag.bind(this),\n onDragStop: this._onDragStop.bind(this),\n });\n\n // Does the input have on/off labels?\n let $wrapper = this.$outerContainer.parent(\n '.lightswitch-inner-container'\n );\n if ($wrapper.length) {\n this.addListener(\n $wrapper.children('span[data-toggle=\"off\"]'),\n 'click',\n this.turnOff\n );\n this.addListener(\n $wrapper.children('span[data-toggle=\"on\"]'),\n 'click',\n this.turnOn\n );\n }\n },\n\n turnOn: function (muteEvent) {\n var changed = !this.on;\n\n this.on = true;\n this.indeterminate = false;\n\n this.$outerContainer.addClass('dragging');\n\n if (Garnish.prefersReducedMotion()) {\n this.$innerContainer.css('margin-' + Craft.left, 0);\n } else {\n var animateCss = {};\n animateCss['margin-' + Craft.left] = 0;\n this.$innerContainer\n .velocity('stop')\n .velocity(\n animateCss,\n Craft.LightSwitch.animationDuration,\n this._onSettle.bind(this)\n );\n }\n\n this.$input.val(this.settings.value);\n this.$outerContainer.addClass('on');\n this.$outerContainer.removeClass('indeterminate');\n this.$outerContainer.attr('aria-checked', 'true');\n\n if (changed && muteEvent !== true) {\n this.onChange();\n }\n },\n\n turnOff: function (muteEvent) {\n var changed = this.on || this.indeterminate;\n\n this.on = false;\n this.indeterminate = false;\n\n this.$outerContainer.addClass('dragging');\n\n if (Garnish.prefersReducedMotion()) {\n this.$innerContainer.css('margin-' + Craft.left, this._getOffMargin());\n } else {\n var animateCss = {};\n animateCss['margin-' + Craft.left] = this._getOffMargin();\n this.$innerContainer\n .velocity('stop')\n .velocity(\n animateCss,\n Craft.LightSwitch.animationDuration,\n this._onSettle.bind(this)\n );\n }\n\n this.$input.val('');\n this.$outerContainer.removeClass('on');\n this.$outerContainer.removeClass('indeterminate');\n this.$outerContainer.attr('aria-checked', 'false');\n\n if (changed && muteEvent !== true) {\n this.onChange();\n }\n },\n\n turnIndeterminate: function (muteEvent) {\n var changed = !this.indeterminate;\n\n this.on = false;\n this.indeterminate = true;\n\n this.$outerContainer.addClass('dragging');\n var animateCss = {};\n animateCss['margin-' + Craft.left] = this._getOffMargin() / 2;\n this.$innerContainer\n .velocity('stop')\n .velocity(\n animateCss,\n Craft.LightSwitch.animationDuration,\n this._onSettle.bind(this)\n );\n\n this.$input.val(this.settings.indeterminateValue);\n this.$outerContainer.removeClass('on');\n this.$outerContainer.addClass('indeterminate');\n this.$outerContainer.attr('aria-checked', 'mixed');\n\n if (changed && muteEvent !== true) {\n this.onChange();\n }\n },\n\n toggle: function () {\n if (this.indeterminate || !this.on) {\n this.turnOn();\n } else {\n this.turnOff();\n }\n },\n\n onChange: function () {\n this.trigger('change');\n this.settings.onChange(this.on);\n this.$outerContainer.trigger('change');\n },\n\n _onMouseDown: function () {\n this.addListener(Garnish.$doc, 'mouseup', '_onMouseUp');\n },\n\n _onMouseUp: function () {\n this.removeListener(Garnish.$doc, 'mouseup');\n\n // Was this a click?\n if (!this.dragger.dragging) {\n this.toggle();\n }\n },\n\n _onKeyDown: function (event) {\n switch (event.keyCode) {\n case Garnish.SPACE_KEY: {\n this.toggle();\n event.preventDefault();\n break;\n }\n case Garnish.RIGHT_KEY: {\n if (Craft.orientation === 'ltr') {\n this.turnOn();\n } else {\n this.turnOff();\n }\n\n event.preventDefault();\n break;\n }\n case Garnish.LEFT_KEY: {\n if (Craft.orientation === 'ltr') {\n this.turnOff();\n } else {\n this.turnOn();\n }\n\n event.preventDefault();\n break;\n }\n }\n },\n\n _getMargin: function () {\n return parseInt(this.$innerContainer.css('margin-' + Craft.left));\n },\n\n _onDragStart: function () {\n this.$outerContainer.addClass('dragging');\n this.dragStartMargin = this._getMargin();\n },\n\n _onDrag: function () {\n var margin;\n\n if (Craft.orientation === 'ltr') {\n margin = this.dragStartMargin + this.dragger.mouseDistX;\n } else {\n margin = this.dragStartMargin - this.dragger.mouseDistX;\n }\n\n if (margin < this._getOffMargin()) {\n margin = this._getOffMargin();\n } else if (margin > 0) {\n margin = 0;\n }\n\n this.$innerContainer.css('margin-' + Craft.left, margin);\n },\n\n _onDragStop: function () {\n var margin = this._getMargin();\n\n if (margin > this._getOffMargin() / 2) {\n this.turnOn();\n } else {\n this.turnOff();\n }\n },\n\n _onSettle: function () {\n this.$outerContainer.removeClass('dragging');\n },\n\n destroy: function () {\n this.$outerContainer.removeData('lightswitch');\n this.base();\n this.dragger.destroy();\n },\n\n _getOffMargin: function () {\n return this.small ? -10 : -12;\n },\n },\n {\n animationDuration: 100,\n defaults: {\n value: '1',\n indeterminateValue: '-',\n onChange: $.noop,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Listbox\n */\nCraft.Listbox = Garnish.Base.extend(\n {\n $container: null,\n $options: null,\n $selectedOption: null,\n selectedOptionIndex: null,\n\n init: function (container, settings) {\n this.$container = $(container);\n this.setSettings(settings, Craft.Listbox.defaults);\n\n // Is this already a listbox?\n if (this.$container.data('listbox')) {\n console.warn('Double-instantiating a listbox on an element');\n this.$container.data('listbox').destroy();\n }\n\n this.$container.data('listbox', this);\n // todo: drop [role=option] in Craft 5\n this.$options = this.$container.find('button,[role=option]');\n\n // is there already a selected option?\n // todo: drop [aria-selected=true] & attr normalization in Craft 5\n this.$selectedOption = this.$options\n .filter('[aria-pressed=true],[aria-selected=true]')\n .removeAttr('aria-selected')\n .attr('aria-pressed', 'true');\n if (this.$selectedOption.length) {\n this.selectedOptionIndex = this.$options.index(this.$selectedOption);\n } else {\n this.$selectedOption = null;\n }\n\n this.addListener(this.$options, 'click', (ev) => {\n this.select(this.$options.index($(ev.currentTarget)));\n ev.preventDefault();\n });\n },\n\n select: function (index) {\n if (\n index < 0 ||\n index >= this.$options.length ||\n index === this.selectedOptionIndex\n ) {\n return;\n }\n\n if (this.$selectedOption) {\n this.$selectedOption\n .removeClass(this.settings.selectedClass)\n .attr('aria-pressed', 'false');\n }\n\n this.$selectedOption = this.$options\n .eq(index)\n .addClass(this.settings.selectedClass)\n .attr('aria-pressed', 'true');\n\n this.selectedOptionIndex = index;\n\n this.settings.onChange(this.$selectedOption, index);\n this.trigger('change', {\n $selectedOption: this.$selectedOption,\n selectedOptionIndex: index,\n });\n },\n\n disable: function () {\n this.base();\n this.$container.attr('aria-disabled', 'true');\n },\n\n enable: function () {\n this.base();\n this.$container.removeAttr('aria-disabled');\n },\n\n destroy: function () {\n this.$container.removeData('listbox');\n this.base();\n },\n },\n {\n defaults: {\n selectedClass: 'active',\n focusClass: 'focus',\n onChange: $.noop,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Live Preview\n */\nCraft.LivePreview = Garnish.Base.extend(\n {\n $extraFields: null,\n $trigger: null,\n $shade: null,\n $editorContainer: null,\n $editor: null,\n $dragHandle: null,\n $previewContainer: null,\n $iframeContainer: null,\n $iframe: null,\n $fieldPlaceholder: null,\n\n previewUrl: null,\n token: null,\n basePostData: null,\n inPreviewMode: false,\n fields: null,\n lastPostData: null,\n updateIframeInterval: null,\n loading: false,\n checkAgain: false,\n\n dragger: null,\n dragStartEditorWidth: null,\n\n _slideInOnIframeLoad: false,\n\n _scrollX: null,\n _scrollY: null,\n\n _editorWidth: null,\n _editorWidthInPx: null,\n\n init: function (settings) {\n this.setSettings(settings, Craft.LivePreview.defaults);\n\n // Should preview requests use a specific URL?\n // This won't affect how the request gets routed (the action param will override it),\n // but it will allow the templates to change behavior based on the request URI.\n if (this.settings.previewUrl) {\n this.previewUrl = this.settings.previewUrl;\n } else {\n this.previewUrl = Craft.baseSiteUrl.replace(/\\/+$/, '') + '/';\n }\n\n // Load the preview over SSL if the current request is\n if (document.location.protocol === 'https:') {\n this.previewUrl = this.previewUrl.replace(/^http:/, 'https:');\n }\n\n // Set the base post data\n this.basePostData = $.extend({}, this.settings.previewParams);\n\n // Find the DOM elements\n this.$extraFields = $(this.settings.extraFields);\n this.$trigger = $(this.settings.trigger);\n this.$fieldPlaceholder = $('<div/>');\n\n // Set the initial editor width\n this.editorWidth = Craft.getLocalStorage(\n 'LivePreview.editorWidth',\n Craft.LivePreview.defaultEditorWidth\n );\n\n // Event Listeners\n this.addListener(this.$trigger, 'activate', 'toggle');\n\n Craft.cp.on('beforeSaveShortcut', () => {\n if (this.inPreviewMode) {\n this.moveFieldsBack();\n }\n });\n\n Craft.Preview.instances.push(this);\n },\n\n get editorWidth() {\n return this._editorWidth;\n },\n\n get editorWidthInPx() {\n return this._editorWidthInPx;\n },\n\n set editorWidth(width) {\n var inPx;\n\n // Is this getting set in pixels?\n if (width >= 1) {\n inPx = width;\n width /= Garnish.$win.width();\n } else {\n inPx = Math.round(width * Garnish.$win.width());\n }\n\n // Make sure it's no less than the minimum\n if (inPx < Craft.LivePreview.minEditorWidthInPx) {\n inPx = Craft.LivePreview.minEditorWidthInPx;\n width = inPx / Garnish.$win.width();\n }\n\n this._editorWidth = width;\n this._editorWidthInPx = inPx;\n },\n\n toggle: function () {\n if (this.inPreviewMode) {\n this.exit();\n } else {\n this.enter();\n }\n },\n\n enter: function () {\n if (this.inPreviewMode) {\n return;\n }\n\n if (!this.token) {\n this.createToken();\n return;\n }\n\n this.trigger('beforeEnter');\n\n $(document.activeElement).trigger('blur');\n\n if (!this.$editor) {\n this.$shade = $('<div/>', {class: 'modal-shade dark'}).appendTo(\n Garnish.$bod\n );\n this.$previewContainer = $('<div/>', {\n class: 'lp-preview-container',\n }).appendTo(Garnish.$bod);\n this.$iframeContainer = $('<div/>', {\n class: 'lp-iframe-container',\n }).appendTo(this.$previewContainer);\n this.$editorContainer = $('<div/>', {\n class: 'lp-editor-container',\n }).appendTo(Garnish.$bod);\n\n var $editorHeader = $('<header/>', {class: 'flex'}).appendTo(\n this.$editorContainer\n );\n this.$editor = $('<form/>', {class: 'lp-editor'}).appendTo(\n this.$editorContainer\n );\n this.$dragHandle = $('<div/>', {class: 'lp-draghandle'}).appendTo(\n this.$editorContainer\n );\n var $closeBtn = $('<button/>', {\n type: 'button',\n class: 'btn',\n text: Craft.t('app', 'Close Preview'),\n }).appendTo($editorHeader);\n $('<div/>', {class: 'flex-grow'}).appendTo($editorHeader);\n let $saveBtn = $('<button/>', {\n type: 'button',\n class: 'btn submit',\n text: Craft.t('app', 'Save'),\n }).appendTo($editorHeader);\n\n this.dragger = new Garnish.BaseDrag(this.$dragHandle, {\n axis: Garnish.X_AXIS,\n onDragStart: this._onDragStart.bind(this),\n onDrag: this._onDrag.bind(this),\n onDragStop: this._onDragStop.bind(this),\n });\n\n this.addListener($closeBtn, 'click', 'exit');\n this.addListener($saveBtn, 'click', 'save');\n }\n\n // Set the sizes\n this.handleWindowResize();\n this.addListener(Garnish.$win, 'resize', 'handleWindowResize');\n\n this.$editorContainer.css(Craft.left, -this.editorWidthInPx + 'px');\n this.$previewContainer.css(Craft.right, -this.getIframeWidth());\n\n // Move all the fields into the editor rather than copying them\n // so any JS that's referencing the elements won't break.\n this.fields = [];\n var $fields = $(this.settings.fields);\n\n for (var i = 0; i < $fields.length; i++) {\n var $field = $($fields[i]),\n $clone = this._getClone($field);\n\n // It's important that the actual field is added to the DOM *after* the clone,\n // so any radio buttons in the field get deselected from the clone rather than the actual field.\n this.$fieldPlaceholder.insertAfter($field);\n $field.detach();\n this.$fieldPlaceholder.replaceWith($clone);\n $field.appendTo(this.$editor);\n\n this.fields.push({\n $field: $field,\n $clone: $clone,\n });\n }\n\n if (this.updateIframe()) {\n this._slideInOnIframeLoad = true;\n } else {\n this.slideIn();\n }\n\n Craft.ElementThumbLoader.retryAll();\n\n Garnish.uiLayerManager.addLayer(this.$sidebar);\n Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n this.exit();\n });\n\n this.inPreviewMode = true;\n this.trigger('enter');\n },\n\n createToken: function () {\n const data = {previewAction: this.settings.previewAction};\n Craft.sendActionRequest('POST', 'live-preview/create-token', {data}).then(\n (response) => {\n this.token = response.data.token;\n this.enter();\n }\n );\n },\n\n save: function () {\n Craft.cp.submitPrimaryForm();\n },\n\n handleWindowResize: function () {\n // Reset the width so the min width is enforced\n this.editorWidth = this.editorWidth;\n\n // Update the editor/iframe sizes\n this.updateWidths();\n },\n\n slideIn: function () {\n $('html').addClass('noscroll');\n this.$shade.velocity('fadeIn');\n\n this.$editorContainer\n .show()\n .velocity('stop')\n .animateLeft(0, 'slow', () => {\n this.trigger('slideIn');\n Garnish.$win.trigger('resize');\n });\n\n this.$previewContainer\n .show()\n .velocity('stop')\n .animateRight(0, 'slow', () => {\n this.updateIframeInterval = setInterval(\n this.updateIframe.bind(this),\n 1000\n );\n });\n },\n\n exit: function () {\n if (!this.inPreviewMode) {\n return;\n }\n\n this.trigger('beforeExit');\n\n $('html').removeClass('noscroll');\n\n this.removeListener(Garnish.$win, 'resize');\n Garnish.uiLayerManager.removeLayer();\n\n if (this.updateIframeInterval) {\n clearInterval(this.updateIframeInterval);\n }\n\n this.moveFieldsBack();\n\n this.$shade.delay(200).velocity('fadeOut');\n\n this.$editorContainer\n .velocity('stop')\n .animateLeft(-this.editorWidthInPx, 'slow', () => {\n for (var i = 0; i < this.fields.length; i++) {\n this.fields[i].$newClone.remove();\n }\n this.$editorContainer.hide();\n this.trigger('slideOut');\n });\n\n this.$previewContainer\n .velocity('stop')\n .animateRight(-this.getIframeWidth(), 'slow', () => {\n this.$previewContainer.hide();\n });\n\n Craft.ElementThumbLoader.retryAll();\n\n this.inPreviewMode = false;\n this.trigger('exit');\n },\n\n moveFieldsBack: function () {\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n field.$newClone = this._getClone(field.$field);\n\n // It's important that the actual field is added to the DOM *after* the clone,\n // so any radio buttons in the field get deselected from the clone rather than the actual field.\n this.$fieldPlaceholder.insertAfter(field.$field);\n field.$field.detach();\n this.$fieldPlaceholder.replaceWith(field.$newClone);\n field.$clone.replaceWith(field.$field);\n }\n\n Garnish.$win.trigger('resize');\n },\n\n getIframeWidth: function () {\n return Garnish.$win.width() - this.editorWidthInPx;\n },\n\n updateWidths: function () {\n this.$editorContainer.css('width', this.editorWidthInPx + 'px');\n this.$previewContainer.width(this.getIframeWidth());\n },\n\n updateIframe: function (force) {\n if (force) {\n this.lastPostData = null;\n }\n\n if (!this.inPreviewMode) {\n return false;\n }\n\n if (this.loading) {\n this.checkAgain = true;\n return false;\n }\n\n // Has the post data changed?\n var postData = $.extend(\n Garnish.getPostData(this.$editor),\n Garnish.getPostData(this.$extraFields)\n );\n\n if (\n !this.lastPostData ||\n !Craft.compare(postData, this.lastPostData, false)\n ) {\n this.lastPostData = postData;\n this.loading = true;\n\n var $doc = this.$iframe\n ? $(this.$iframe[0].contentWindow.document)\n : null;\n\n this._scrollX = $doc ? $doc.scrollLeft() : 0;\n this._scrollY = $doc ? $doc.scrollTop() : 0;\n\n $.ajax({\n url:\n this.previewUrl +\n (this.previewUrl.indexOf('?') !== -1 ? '&' : '?') +\n Craft.tokenParam +\n '=' +\n this.token,\n method: 'POST',\n data: $.extend({}, postData, this.basePostData),\n headers: {\n 'X-Craft-Token': this.token,\n },\n xhrFields: {\n withCredentials: true,\n },\n crossDomain: true,\n success: this.handleSuccess.bind(this),\n error: this.handleError.bind(this),\n });\n\n return true;\n } else {\n return false;\n }\n },\n\n forceUpdateIframe: function () {\n return this.updateIframe(true);\n },\n\n handleSuccess: function (data) {\n var html =\n data +\n '<script type=\"text/javascript\">window.scrollTo(' +\n this._scrollX +\n ', ' +\n this._scrollY +\n ');</script>';\n\n // Create a new iframe\n var $iframe = $('<iframe class=\"lp-preview\" frameborder=\"0\"/>');\n if (this.$iframe) {\n $iframe.insertBefore(this.$iframe);\n } else {\n $iframe.appendTo(this.$iframeContainer);\n }\n\n this.addListener($iframe, 'load', function () {\n if (this.$iframe) {\n this.$iframe.remove();\n }\n this.$iframe = $iframe;\n\n if (this._slideInOnIframeLoad) {\n this.slideIn();\n this._slideInOnIframeLoad = false;\n }\n\n this.removeListener($iframe, 'load');\n });\n\n Garnish.requestAnimationFrame(() => {\n $iframe[0].contentWindow.document.open();\n $iframe[0].contentWindow.document.write(html);\n $iframe[0].contentWindow.document.close();\n this.onResponse();\n });\n },\n\n handleError: function () {\n this.onResponse();\n },\n\n onResponse: function () {\n this.loading = false;\n\n if (this.checkAgain) {\n this.checkAgain = false;\n this.updateIframe();\n }\n },\n\n _getClone: function ($field) {\n var $clone = $field.clone();\n\n // clone() won't account for input values that have changed since the original HTML set them\n Garnish.copyInputValues($field, $clone);\n\n // Remove any id= attributes\n $clone.attr('id', '');\n $clone.find('[id]').attr('id', '');\n\n return $clone;\n },\n\n _onDragStart: function () {\n this.dragStartEditorWidth = this.editorWidthInPx;\n this.$previewContainer.addClass('dragging');\n },\n\n _onDrag: function () {\n if (Craft.orientation === 'ltr') {\n this.editorWidth = this.dragStartEditorWidth + this.dragger.mouseDistX;\n } else {\n this.editorWidth = this.dragStartEditorWidth - this.dragger.mouseDistX;\n }\n\n this.updateWidths();\n },\n\n _onDragStop: function () {\n this.$previewContainer.removeClass('dragging');\n Craft.setLocalStorage('LivePreview.editorWidth', this.editorWidth);\n },\n\n destroy: function () {\n Craft.Preview.instances = Craft.Preview.instances.filter(\n (o) => o !== this\n );\n this.base();\n },\n },\n {\n defaultEditorWidth: 0.33,\n minEditorWidthInPx: 320,\n instances: [],\n\n defaults: {\n trigger: '.livepreviewbtn',\n fields: null,\n extraFields: null,\n previewUrl: null,\n previewAction: null,\n previewParams: {},\n },\n }\n);\n\nCraft.LivePreview.init = function (settings) {\n Craft.livePreview = new Craft.LivePreview(settings);\n};\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Password Input\n */\nCraft.PasswordInput = Garnish.Base.extend(\n {\n $passwordWrapper: null,\n $passwordInput: null,\n $textInput: null,\n $currentInput: null,\n\n $showPasswordToggle: null,\n showingPassword: null,\n\n init: function (passwordInput, settings) {\n this.$passwordInput = $(passwordInput);\n this.$passwordWrapper = this.$passwordInput.parent('.passwordwrapper');\n this.settings = $.extend({}, Craft.PasswordInput.defaults, settings);\n\n // Is this already a password input?\n if (this.$passwordInput.data('passwordInput')) {\n console.warn('Double-instantiating a password input on an element');\n this.$passwordInput.data('passwordInput').destroy();\n }\n\n this.$passwordInput.data('passwordInput', this);\n\n this.$showPasswordToggle = $(\n '<button type=\"button\" class=\"invisible\" />'\n );\n this.$showPasswordToggle.addClass('password-toggle');\n this.$showPasswordToggle.insertAfter(this.$passwordInput);\n\n this.initInputFocusEvents(this.$passwordInput);\n this.addListener(this.$showPasswordToggle, 'click', 'onClick');\n this.hidePassword();\n\n this.addListener(\n this.$passwordWrapper.closest('form'),\n 'submit',\n 'hidePassword'\n );\n },\n\n setCurrentInput: function ($input) {\n if (this.$currentInput) {\n // Swap the inputs, while preventing the focus animation\n $input.insertAfter(this.$currentInput);\n this.$currentInput.detach();\n $input.trigger('focus');\n\n // Restore the input value\n $input.val(this.$currentInput.val());\n }\n\n this.$currentInput = $input;\n\n this.addListener(\n this.$currentInput,\n 'keypress,keyup,change,blur',\n 'onInputChange'\n );\n },\n\n updateToggleLabel: function (label) {\n this.$showPasswordToggle.text(label);\n },\n\n initInputFocusEvents: function ($input) {\n this.addListener($input, 'focus', function () {\n this.$passwordWrapper.addClass('focus');\n });\n this.addListener($input, 'blur', function () {\n this.$passwordWrapper.removeClass('focus');\n });\n },\n\n showPassword: function () {\n if (this.showingPassword) {\n return;\n }\n\n if (!this.$textInput) {\n this.$textInput = this.$passwordInput.clone(true);\n this.$textInput.attr({\n type: 'text',\n autocapitalize: 'off',\n });\n this.initInputFocusEvents(this.$textInput);\n }\n\n this.setCurrentInput(this.$textInput);\n this.updateToggleLabel(Craft.t('app', 'Hide'));\n this.showingPassword = true;\n },\n\n hidePassword: function () {\n // showingPassword could be null, which is acceptable\n if (this.showingPassword === false) {\n return;\n }\n\n this.setCurrentInput(this.$passwordInput);\n this.updateToggleLabel(Craft.t('app', 'Show'));\n this.showingPassword = false;\n },\n\n togglePassword: function () {\n if (this.showingPassword) {\n this.hidePassword();\n } else {\n this.showPassword();\n }\n\n this.settings.onToggleInput(this.$currentInput);\n },\n\n onInputChange: function () {\n if (this.$currentInput.val()) {\n this.$showPasswordToggle.removeClass('invisible');\n } else {\n this.$showPasswordToggle.addClass('invisible');\n }\n },\n\n onClick: function (ev) {\n if (this.$currentInput[0].setSelectionRange) {\n var selectionStart = this.$currentInput[0].selectionStart,\n selectionEnd = this.$currentInput[0].selectionEnd;\n\n this.togglePassword();\n this.$currentInput[0].setSelectionRange(selectionStart, selectionEnd);\n } else {\n this.togglePassword();\n }\n },\n\n destroy: function () {\n this.$passwordInput.removeData('passwordInput');\n this.base();\n },\n },\n {\n defaults: {\n onToggleInput: $.noop,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Preview\n */\nCraft.Preview = Garnish.Base.extend(\n {\n elementEditor: null,\n\n $shade: null,\n $editorContainer: null,\n $editor: null,\n $spinner: null,\n $statusIcon: null,\n $dragHandle: null,\n $previewWrapper: null,\n $previewContainer: null,\n $previewSkipLink: null,\n $bumperLink: null,\n $notifier: null,\n $iframeContainer: null,\n $previewHeader: null,\n $targetBtn: null,\n $targetMenu: null,\n $deviceTypeContainer: null,\n $orientationBtn: null,\n $refreshBtn: null,\n $deviceMask: null,\n $devicePreviewContainer: null,\n $iframe: null,\n iframeLoaded: false,\n $tempInput: null,\n $fieldPlaceholder: null,\n\n isActive: false,\n isVisible: false,\n activeTarget: 0,\n\n animationDuration: 'slow',\n\n currentDeviceType: 'desktop',\n deviceOrientation: null,\n deviceWidth: '',\n deviceHeight: '',\n deviceMaskDimensions: {\n phone: {\n width: 375,\n height: 753,\n },\n tablet: {\n width: 768,\n height: 1110,\n },\n },\n\n draftId: null,\n url: null,\n fields: null,\n\n iframeHeight: null,\n scrollTop: null,\n\n dragger: null,\n dragStartEditorWidth: null,\n\n _updateIframeProxy: null,\n\n _editorWidth: null,\n _editorWidthInPx: null,\n\n init: function (elementEditor) {\n this.elementEditor = elementEditor;\n\n this._updateIframeProxy = this.updateIframe.bind(this);\n\n this.$tempInput = $('<input/>', {\n type: 'hidden',\n name: '__PREVIEW_FIELDS__',\n value: '1',\n });\n this.$fieldPlaceholder = $('<div/>');\n\n // Set the initial editor width\n this.editorWidth = Craft.getLocalStorage(\n 'LivePreview.editorWidth',\n Craft.Preview.defaultEditorWidth\n );\n\n Craft.Preview.instances.push(this);\n },\n\n get editorWidth() {\n return this._editorWidth;\n },\n\n get editorWidthInPx() {\n return this._editorWidthInPx;\n },\n\n set editorWidth(width) {\n var inPx;\n\n // Is this getting set in pixels?\n if (width >= 1) {\n inPx = width;\n width /= Garnish.$win.width();\n } else {\n inPx = Math.round(width * Garnish.$win.width());\n }\n\n // Make sure it's no less than the minimum\n if (inPx < Craft.Preview.minEditorWidthInPx) {\n inPx = Craft.Preview.minEditorWidthInPx;\n width = inPx / Garnish.$win.width();\n }\n\n this._editorWidth = width;\n this._editorWidthInPx = inPx;\n },\n\n open: function () {\n if (this.isActive) {\n return;\n }\n\n this.isActive = true;\n this.trigger('beforeOpen');\n\n $(document.activeElement).trigger('blur');\n\n if (!this.$editor) {\n const previewSkipLinkText = Craft.t('app', 'Skip to {title}', {\n title: Craft.t('app', 'Top of preview'),\n });\n\n this.$shade = $('<div/>', {class: 'modal-shade dark'}).appendTo(\n Garnish.$bod\n );\n this.$previewWrapper = $('<div/>', {\n role: 'dialog',\n 'aria-modal': 'true',\n 'aria-labelledby': 'lp-preview-heading',\n }).appendTo(Garnish.$bod);\n this.$modalLabel = $('<h2/>', {\n id: 'lp-preview-heading',\n class: 'visually-hidden',\n html: Craft.t('app', 'Preview'),\n }).appendTo(this.$previewWrapper);\n this.$editorContainer = $('<div/>', {\n class: 'lp-editor-container',\n }).appendTo(this.$previewWrapper);\n this.$previewContainer = $('<div/>', {\n class: 'lp-preview-container',\n id: 'lp-preview-container',\n }).appendTo(this.$previewWrapper);\n this.$notifier = $('<span/>', {\n class: 'visually-hidden',\n 'aria-live': 'assertive',\n }).appendTo(this.$previewContainer);\n\n var $editorHeader = $('<header/>', {class: 'flex'}).appendTo(\n this.$editorContainer\n );\n this.$editor = $('<form/>', {class: 'lp-editor'}).appendTo(\n this.$editorContainer\n );\n this.$dragHandle = $('<div/>', {class: 'lp-draghandle'}).appendTo(\n this.$editorContainer\n );\n var $closeBtn = $('<button/>', {\n type: 'button',\n class: 'btn',\n text: Craft.t('app', 'Close Preview'),\n }).appendTo($editorHeader);\n $('<div/>', {class: 'flex-grow'}).appendTo($editorHeader);\n this.$spinner = $('<div/>', {\n class: 'spinner hidden',\n title: Craft.t('app', 'Saving'),\n }).appendTo($editorHeader);\n this.$statusIcon = $('<div/>', {class: 'invisible'}).appendTo(\n $editorHeader\n );\n this.$statusMessage = $('<span/>', {\n class: 'visually-hidden',\n 'aria-live': 'polite',\n }).appendTo($editorHeader);\n this.$previewSkipLink = $('<a/>', {\n class: 'skip-link btn',\n href: '#lp-preview-container',\n html: previewSkipLinkText,\n }).appendTo($editorHeader);\n\n if (Craft.Pro) {\n this.$previewHeader = $('<header/>', {\n class: 'lp-preview-header',\n }).appendTo(this.$previewContainer);\n\n // Preview targets\n if (this.elementEditor.settings.previewTargets.length > 1) {\n this.$targetBtn = $('<button/>', {\n type: 'button',\n class: 'btn menubtn',\n text: this.elementEditor.settings.previewTargets[0].label,\n }).appendTo(this.$previewHeader);\n this.$targetMenu = $('<div/>', {\n class: 'menu lp-target-menu',\n }).insertAfter(this.$targetBtn);\n const $ul = $('<ul/>', {class: 'padded'}).appendTo(\n this.$targetMenu\n );\n let $li, $a;\n for (\n let i = 0;\n i < this.elementEditor.settings.previewTargets.length;\n i++\n ) {\n $li = $('<li/>').appendTo($ul);\n $a = $('<a/>', {\n data: {target: i},\n text: this.elementEditor.settings.previewTargets[i].label,\n class: i === 0 ? 'sel' : null,\n }).appendTo($li);\n }\n new Garnish.MenuBtn(this.$targetBtn, {\n onOptionSelect: (option) => {\n this.switchTarget($(option).data('target'));\n },\n });\n\n $('<div class=\"flex-grow\"/>').appendTo(this.$previewHeader);\n }\n\n this._buildDeviceTypeFieldset();\n\n $('<div class=\"flex-grow\"/>').appendTo(this.$previewHeader);\n const $buttonContainer = $('<div class=\"buttons\"/>').appendTo(\n this.$previewHeader\n );\n\n // Orientation toggle\n this.$orientationBtn = $('<button/>', {\n type: 'button',\n class: 'btn disabled',\n 'data-icon': 'rotate',\n 'aria-disabled': 'true',\n text: Craft.t('app', 'Rotate'),\n 'aria-label': Craft.t('app', 'Rotate'),\n }).appendTo($buttonContainer);\n this.addListener(this.$orientationBtn, 'click', 'switchOrientation');\n\n // Refresh button\n this.$refreshBtn = $('<button/>', {\n type: 'button',\n class: 'btn',\n text: Craft.t('app', 'Refresh'),\n 'data-icon': 'refresh',\n }).appendTo($buttonContainer);\n this.addListener(this.$refreshBtn, 'click', () => {\n this.updateIframe(false, true);\n });\n\n // Get the last stored orientation\n this.deviceOrientation = Craft.getLocalStorage(\n 'LivePreview.orientation'\n );\n }\n\n this.$iframeContainer = $('<div/>', {\n class: 'lp-iframe-container',\n }).appendTo(this.$previewContainer);\n this.$devicePreviewContainer = $('<div/>', {\n class: 'lp-device-preview-container',\n }).appendTo(this.$iframeContainer);\n this.$deviceMask = $('<div/>', {\n class: 'lp-device-mask',\n }).appendTo(this.$iframeContainer);\n\n /* Prevents focus trap bug caused by iframe as last element */\n this.$bumperLink = $('<a/>', {\n class: 'skip-link btn lp-preview-container__bumper-link',\n html: previewSkipLinkText,\n href: '#lp-preview-container',\n });\n this.$bumperLink.appendTo(this.$previewContainer);\n\n this.dragger = new Garnish.BaseDrag(this.$dragHandle, {\n axis: Garnish.X_AXIS,\n onDragStart: this._onDragStart.bind(this),\n onDrag: this._onDrag.bind(this),\n onDragStop: this._onDragStop.bind(this),\n });\n\n this.addListener($closeBtn, 'click', 'close');\n this.addListener(this.$statusIcon, 'click', () => {\n this.elementEditor.showStatusHud(this.$statusIcon);\n });\n }\n\n // Set the sizes\n this.handleWindowResize();\n this.addListener(Garnish.$win, 'resize', 'handleWindowResize');\n\n this.$editorContainer.css(Craft.left, -this.editorWidthInPx + 'px');\n this.$previewContainer.css(Craft.right, -this.getIframeWidth());\n\n // Find the fields, excluding nested fields\n this.fields = [];\n var $fields = $('#content .field').not($('#content .field .field'));\n\n if ($fields.length) {\n // Insert our temporary input before the first field so we know where to swap in the serialized form values\n this.$tempInput.insertBefore($fields.get(0));\n\n // Move all the fields into the editor rather than copying them\n // so any JS that's referencing the elements won't break.\n for (let i = 0; i < $fields.length; i++) {\n let $field = $($fields[i]),\n $clone = this._getClone($field);\n\n // It's important that the actual field is added to the DOM *after* the clone,\n // so any radio buttons in the field get deselected from the clone rather than the actual field.\n this.$fieldPlaceholder.insertAfter($field);\n $field.detach();\n this.$fieldPlaceholder.replaceWith($clone);\n $field.appendTo(this.$editor);\n\n this.fields.push({\n $field: $field,\n $clone: $clone,\n });\n }\n }\n\n this.updateIframe();\n\n this.elementEditor.on('update', this._updateIframeProxy);\n\n Craft.ElementThumbLoader.retryAll();\n\n this.trigger('open');\n },\n\n _getDeviceTypeTranslation: function (type) {\n let translation;\n switch (type) {\n case 'phone':\n translation = Craft.t('app', 'Mobile');\n break;\n case 'tablet':\n translation = Craft.t('app', 'Tablet');\n break;\n default:\n translation = Craft.t('app', 'Desktop');\n break;\n }\n return translation;\n },\n\n _getDeviceOrientationTranslation: function (orientation) {\n return orientation === 'portrait'\n ? Craft.t('app', 'Portrait')\n : Craft.t('app', 'Landscape');\n },\n\n _buildDeviceTypeFieldset: function () {\n // Device type buttons\n this.$deviceTypeContainer = $('<section/>', {\n class: 'btngroup lp-device-type',\n 'aria-label': Craft.t('app', 'Device type'),\n }).appendTo(this.$previewHeader);\n $('<button/>', {\n type: 'button',\n class: 'btn lp-device-type-btn--desktop active',\n title: Craft.t('app', 'Desktop'),\n 'aria-label': Craft.t('app', 'Desktop'),\n 'aria-pressed': 'true',\n data: {\n width: '',\n height: '',\n deviceType: 'desktop',\n },\n }).appendTo(this.$deviceTypeContainer);\n $('<button/>', {\n type: 'button',\n class: 'btn lp-device-type-btn--tablet',\n title: Craft.t('app', 'Tablet'),\n 'aria-label': Craft.t('app', 'Tablet'),\n 'aria-pressed': 'false',\n data: {\n width: 768,\n height: 1024,\n deviceType: 'tablet',\n },\n }).appendTo(this.$deviceTypeContainer);\n $('<button/>', {\n type: 'button',\n class: 'btn lp-device-type-btn--phone',\n title: Craft.t('app', 'Mobile'),\n 'aria-label': Craft.t('app', 'Mobile'),\n 'aria-pressed': 'false',\n data: {\n width: 375,\n height: 667,\n deviceType: 'phone',\n },\n }).appendTo(this.$deviceTypeContainer);\n\n // Add functionality\n this.deviceBtnGroup = new Craft.Listbox(this.$deviceTypeContainer, {\n onChange: ($selectedOption) => {\n this.switchDeviceType($selectedOption);\n },\n });\n },\n\n _activeTarget: function () {\n return this.elementEditor.settings.previewTargets[this.activeTarget];\n },\n\n /**\n * @returns {boolean}\n * @private\n */\n _autoRefresh: function () {\n const target = this._activeTarget();\n return typeof typeof target.refresh === 'undefined' || !!target.refresh;\n },\n\n switchTarget: function (i) {\n this.activeTarget = i;\n this.$targetBtn.text(this.elementEditor.settings.previewTargets[i].label);\n this.$targetMenu.find('a.sel').removeClass('sel');\n this.$targetMenu.find('a').eq(i).addClass('sel');\n this.updateIframe(true);\n this.trigger('switchTarget', {\n previewTarget: this.elementEditor.settings.previewTargets[i],\n });\n },\n\n handleWindowResize: function () {\n // Reset the width so the min width is enforced\n this.editorWidth = this.editorWidth;\n\n // Update the editor/iframe sizes\n this.updateWidths();\n },\n\n slideIn: function () {\n if (!this.isActive || this.isVisible) {\n return;\n }\n\n $('html').addClass('noscroll');\n this.$shade.velocity('fadeIn');\n\n this.$editorContainer\n .show()\n .velocity('stop')\n .animateLeft(\n 0,\n Garnish.getUserPreferredAnimationDuration(this.animationDuration),\n () => {\n this.trigger('slideIn');\n Garnish.$win.trigger('resize');\n }\n );\n\n this.$previewContainer\n .show()\n .velocity('stop')\n .animateRight(\n 0,\n Garnish.getUserPreferredAnimationDuration(this.animationDuration)\n );\n\n this.isVisible = true;\n\n Garnish.uiLayerManager.addLayer(this.$previewWrapper);\n Garnish.hideModalBackgroundLayers();\n Craft.setFocusWithin(this.$previewWrapper);\n Craft.trapFocusWithin(this.$previewWrapper);\n Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n this.close();\n });\n },\n\n close: function () {\n if (!this.isActive || !this.isVisible) {\n return;\n }\n\n this.trigger('beforeClose');\n\n $('html').removeClass('noscroll');\n\n this.removeListener(Garnish.$win, 'resize');\n Garnish.uiLayerManager.removeLayer();\n Garnish.resetModalBackgroundLayerVisibility();\n\n // Remove our temporary input and move the preview fields back into place\n this.$tempInput.detach();\n this.moveFieldsBack();\n\n // Delay shade fade-out when animation is present\n if (Garnish.prefersReducedMotion()) {\n this.$shade.velocity('fadeOut');\n } else {\n this.$shade.delay(200).velocity('fadeOut');\n }\n\n this.$editorContainer\n .velocity('stop')\n .animateLeft(\n -this.editorWidthInPx,\n Garnish.getUserPreferredAnimationDuration(this.animationDuration),\n () => {\n for (var i = 0; i < this.fields.length; i++) {\n this.fields[i].$newClone.remove();\n }\n this.$editorContainer.hide();\n this.trigger('slideOut');\n }\n );\n\n this.$previewContainer\n .velocity('stop')\n .animateRight(\n -this.getIframeWidth(),\n Garnish.getUserPreferredAnimationDuration(this.animationDuration),\n () => {\n this.$iframeContainer.removeClass('lp-iframe-container--rotating');\n this.$previewContainer.hide();\n }\n );\n\n this.elementEditor.off('update', this._updateIframeProxy);\n\n Craft.ElementThumbLoader.retryAll();\n\n if (this.elementEditor.$previewBtn) {\n this.elementEditor.$previewBtn.focus();\n }\n\n this.isActive = false;\n this.isVisible = false;\n this.trigger('close');\n },\n\n moveFieldsBack: function () {\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n field.$newClone = this._getClone(field.$field);\n\n // It's important that the actual field is added to the DOM *after* the clone,\n // so any radio buttons in the field get deselected from the clone rather than the actual field.\n this.$fieldPlaceholder.insertAfter(field.$field);\n field.$field.detach();\n this.$fieldPlaceholder.replaceWith(field.$newClone);\n field.$clone.replaceWith(field.$field);\n }\n\n Garnish.$win.trigger('resize');\n Garnish.$doc.trigger('scroll');\n },\n\n getIframeWidth: function () {\n return Garnish.$win.width() - this.editorWidthInPx;\n },\n\n updateWidths: function () {\n this.$editorContainer.css('width', this.editorWidthInPx + 'px');\n this.$previewContainer.width(this.getIframeWidth());\n if (this._devicePreviewIsActive()) {\n this.updateDevicePreview();\n }\n },\n\n _useIframeResizer: function () {\n return Craft.previewIframeResizerOptions !== false;\n },\n\n /**\n * @param {boolean} [resetScroll=false]\n * @param {boolean} [refresh]\n */\n updateIframe: function (resetScroll, refresh) {\n if (!this.isActive) {\n return false;\n }\n\n // Ignore non-boolean resetScroll values\n resetScroll = resetScroll === true;\n\n // If the draft ID has changed or there's no iframe, we definitely need to refresh\n if (\n this.draftId !== (this.draftId = this.elementEditor.settings.draftId) ||\n !this.$iframe\n ) {\n refresh = true;\n }\n\n const target = this._activeTarget();\n if (typeof refresh === 'undefined') {\n refresh = resetScroll || this._autoRefresh();\n }\n\n this.trigger('beforeUpdateIframe', {\n previewTarget: target,\n resetScroll: resetScroll,\n refresh: refresh,\n });\n\n // If this is an existing preview target, make sure it wants to be refreshed automatically\n if (!refresh) {\n this.slideIn();\n return;\n }\n\n this.elementEditor\n .getTokenizedPreviewUrl(target.url, 'x-craft-live-preview')\n .then((url) => {\n // Maintain the current scroll position?\n let sameHost;\n if (resetScroll) {\n this.scrollTop = null;\n } else if (this.iframeLoaded && this.$iframe) {\n if (this._useIframeResizer()) {\n this.iframeHeight = this.$iframe.height();\n this.scrollTop = this.$iframeContainer.scrollTop();\n } else {\n sameHost = Craft.isSameHost(url);\n if (sameHost && this.$iframe[0].contentWindow) {\n this.scrollTop = $(\n this.$iframe[0].contentWindow.document\n ).scrollTop();\n }\n }\n }\n\n this.iframeLoaded = false;\n\n var $iframe = $('<iframe/>', {\n class: 'lp-preview',\n frameborder: 0,\n src: url,\n title: Craft.t('app', 'Preview'),\n });\n\n if (this.$iframe) {\n this.$iframe.replaceWith($iframe);\n } else {\n $iframe.appendTo(this.$devicePreviewContainer);\n }\n\n // Keep the iframe height consistent with its content\n if (this._useIframeResizer()) {\n if (!resetScroll && this.iframeHeight !== null) {\n $iframe.height(this.iframeHeight);\n this.$iframeContainer.scrollTop(this.scrollTop);\n }\n\n iFrameResize(\n $.extend(\n {\n checkOrigin: false,\n // Allow iframe scrolling until we've successfully initialized the resizer\n scrolling: true,\n onInit: (iframe) => {\n this.iframeLoaded = true;\n this.iframeHeight = null;\n this.scrollTop = null;\n iframe.scrolling = 'no';\n },\n },\n Craft.previewIframeResizerOptions || {}\n ),\n $iframe[0]\n );\n } else {\n $iframe.on('load', () => {\n this.iframeLoaded = true;\n if (!resetScroll && sameHost && this.scrollTop !== null) {\n $($iframe[0].contentWindow.document).scrollTop(this.scrollTop);\n }\n });\n }\n\n this.url = url;\n this.$iframe = $iframe;\n\n if (this._devicePreviewIsActive()) {\n this.updateDevicePreview();\n }\n\n this.trigger('afterUpdateIframe', {\n previewTarget:\n this.elementEditor.settings.previewTargets[this.activeTarget],\n $iframe: this.$iframe,\n });\n\n this.slideIn();\n });\n },\n\n _devicePreviewIsActive: function () {\n return this.currentDeviceType !== 'desktop';\n },\n\n _updateNotifier: function () {\n this.$notifier.html = '';\n\n const translation =\n this.currentDeviceType === 'desktop'\n ? 'Previewing {type} device'\n : 'Previewing {type} device in {orientation}';\n let params = {\n type: this._getDeviceTypeTranslation(this.currentDeviceType),\n };\n\n if (this.currentDeviceType !== 'desktop') {\n params = {\n ...params,\n ...{\n orientation: this._getDeviceOrientationTranslation(\n this.deviceOrientation\n ),\n },\n };\n }\n\n const message = Craft.t('app', translation, params);\n\n setTimeout(() => {\n this.$notifier.text(message);\n }, 200);\n },\n\n switchDeviceType: function ($option) {\n this.$iframeContainer.removeClass('lp-iframe-container--rotating');\n\n const newDeviceType = $option.data('deviceType');\n // Bail if we’re just smashing the same button\n if (newDeviceType === this.currentDeviceType) {\n return false;\n }\n\n // Store new device type data\n this.currentDeviceType = newDeviceType;\n this.deviceWidth = $option.data('width');\n this.deviceHeight = $option.data('height');\n\n if (this.currentDeviceType === 'desktop') {\n // Disable the orientation button\n this.$orientationBtn.addClass('disabled').attr('aria-disabled', 'true');\n\n this.$iframeContainer.removeClass(\n 'lp-iframe-container--has-device-preview'\n );\n } else {\n // Enable the orientation button\n this.$orientationBtn\n .removeClass('disabled')\n .removeAttr('aria-disabled');\n\n this.$iframeContainer.addClass(\n 'lp-iframe-container--has-device-preview'\n );\n }\n\n // Add the tablet class if needed\n if (this.currentDeviceType === 'tablet') {\n this.$iframeContainer.addClass('lp-iframe-container--tablet');\n } else {\n this.$iframeContainer.removeClass('lp-iframe-container--tablet');\n }\n\n this._updateNotifier();\n\n if (this.currentDeviceType !== 'desktop') {\n this.updateDevicePreview();\n }\n },\n\n switchOrientation: function () {\n if (!this._devicePreviewIsActive()) {\n return false;\n }\n\n // Switch to whichever orientation is currently not stored\n if (!this.deviceOrientation || this.deviceOrientation === 'portrait') {\n this.deviceOrientation = 'landscape';\n } else {\n this.deviceOrientation = 'portrait';\n }\n\n // Store the new one\n Craft.setLocalStorage('LivePreview.orientation', this.deviceOrientation);\n\n // Allow the animation to take place\n this.$iframeContainer.addClass('lp-iframe-container--rotating');\n\n // Update the device preview\n this.updateDevicePreview();\n this._updateNotifier();\n\n setTimeout(() => {\n this.$iframeContainer.removeClass('lp-iframe-container--rotating');\n }, 300);\n },\n\n updateDevicePreview: function () {\n // Figure out the best zoom\n let hZoom = 1;\n let wZoom = 1;\n let zoom = 1;\n let previewHeight = this.$previewContainer.height() - 50 - 48; // 50px for the header bar and 24px clearance\n let previewWidth = this.$previewContainer.width() - 48;\n let maskHeight = this.deviceMaskDimensions[this.currentDeviceType].height;\n let maskWidth = this.deviceMaskDimensions[this.currentDeviceType].width;\n\n if (this.deviceOrientation === 'landscape') {\n if (previewWidth < maskHeight) {\n hZoom = previewWidth / maskHeight;\n }\n if (previewHeight < maskWidth) {\n wZoom = previewHeight / maskWidth;\n }\n } else {\n if (previewHeight < maskHeight) {\n hZoom = previewHeight / maskHeight;\n }\n if (previewWidth < maskWidth) {\n wZoom = previewWidth / maskWidth;\n }\n }\n\n zoom = hZoom;\n if (wZoom < hZoom) {\n zoom = wZoom;\n }\n\n // Figure out the css values\n const translate = -(100 / zoom / 2);\n const rotationDeg =\n this.deviceOrientation === 'landscape' ? '-90deg' : '0deg';\n\n // Apply first to the device mask\n this.$deviceMask.css({\n width: this.deviceMaskDimensions[this.currentDeviceType].width + 'px',\n height: this.deviceMaskDimensions[this.currentDeviceType].height + 'px',\n transform:\n 'scale(' +\n zoom +\n ') translate(' +\n translate +\n '%, ' +\n translate +\n '%) rotate(' +\n rotationDeg +\n ')',\n });\n\n if (this.deviceOrientation === 'landscape') {\n this.$devicePreviewContainer.css({\n width: this.deviceHeight + 'px',\n height: this.deviceWidth + 'px',\n transform:\n 'scale(' +\n zoom +\n ') translate(' +\n translate +\n '%, ' +\n translate +\n '%)',\n marginTop: 0,\n marginLeft: '-' + 12 * zoom + 'px',\n });\n } else {\n this.$devicePreviewContainer.css({\n width: this.deviceWidth + 'px',\n height: this.deviceHeight + 'px',\n transform:\n 'scale(' +\n zoom +\n ') translate(' +\n translate +\n '%, ' +\n translate +\n '%)',\n marginTop: '-' + 12 * zoom + 'px',\n marginLeft: 0,\n });\n }\n },\n\n _getClone: function ($field) {\n var $clone = $field.clone();\n\n // clone() won't account for input values that have changed since the original HTML set them\n Garnish.copyInputValues($field, $clone);\n\n // Remove any id= attributes\n $clone.attr('id', '');\n $clone.find('[id]').attr('id', '');\n\n // Disable anything with a name attribute\n $clone.find('[name]').prop('disabled', true);\n\n return $clone;\n },\n\n _onDragStart: function () {\n this.dragStartEditorWidth = this.editorWidthInPx;\n this.$previewContainer.addClass('dragging');\n },\n\n _onDrag: function () {\n if (Craft.orientation === 'ltr') {\n this.editorWidth = this.dragStartEditorWidth + this.dragger.mouseDistX;\n } else {\n this.editorWidth = this.dragStartEditorWidth - this.dragger.mouseDistX;\n }\n\n this.updateWidths();\n },\n\n _onDragStop: function () {\n this.$previewContainer.removeClass('dragging');\n Craft.setLocalStorage('LivePreview.editorWidth', this.editorWidth);\n },\n\n destroy: function () {\n Craft.Preview.instances = Craft.Preview.instances.filter(\n (o) => o !== this\n );\n this.base();\n },\n },\n {\n defaultEditorWidth: 0.33,\n minEditorWidthInPx: 320,\n instances: [],\n\n refresh: function () {\n for (preview of Craft.Preview.instances) {\n preview.updateIframe();\n }\n for (preview of Craft.LivePreview.instances) {\n preview.forceUpdateIframe();\n }\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Preview File Modal\n */\nCraft.PreviewFileModal = Garnish.Modal.extend(\n {\n assetId: null,\n $spinner: null,\n $triggerElement: null,\n $bumperButtonStart: null,\n $bumperButtonEnd: null,\n elementSelect: null,\n type: null,\n loaded: null,\n requestId: 0,\n\n /**\n * Initialize the preview file modal.\n * @returns {*|void}\n */\n init: function (assetId, elementSelect, settings) {\n settings = $.extend(this.defaultSettings, settings);\n this.$triggerElement = Garnish.getFocusedElement();\n\n settings.onHide = this._onHide.bind(this);\n\n if (Craft.PreviewFileModal.openInstance) {\n var instance = Craft.PreviewFileModal.openInstance;\n\n if (instance.assetId !== assetId) {\n instance.loadAsset(\n assetId,\n settings.startingWidth,\n settings.startingHeight\n );\n instance.elementSelect = elementSelect;\n }\n\n return this.destroy();\n }\n\n Craft.PreviewFileModal.openInstance = this;\n this.elementSelect = elementSelect;\n\n this.$container = $('<div class=\"modal previewmodal loading\"/>').appendTo(\n Garnish.$bod\n );\n\n this.base(\n this.$container,\n $.extend(\n {\n resizable: true,\n },\n settings\n )\n );\n\n // Cut the flicker, just show the nice person the preview.\n if (this.$container) {\n this.$container.velocity('stop');\n this.$container.show().css('opacity', 1);\n\n this.$shade.velocity('stop');\n this.$shade.show().css('opacity', 1);\n\n Garnish.setFocusWithin(this.$container);\n }\n\n // Add bumper elements to maintain focus trap\n this.$bumperButtonStart = Craft.ui.createButton({\n html: Craft.t('app', 'Close Preview'),\n class: 'skip-link',\n });\n\n this.addListener(this.$bumperButtonStart, 'click', () => {\n this.hide();\n });\n this.$bumperButtonEnd = this.$bumperButtonStart.clone(true);\n\n this.loadAsset(assetId, settings.startingWidth, settings.startingHeight);\n },\n\n /**\n * When hiding, remove all traces and focus last focused element.\n * @private\n */\n _onHide: function () {\n Craft.PreviewFileModal.openInstance = null;\n if (this.elementSelect) {\n this.elementSelect.focusItem(this.elementSelect.$focusedItem);\n } else if (this.$triggerElement && this.$triggerElement.length) {\n this.$triggerElement.trigger('focus');\n }\n\n this.$shade.remove();\n\n return this.destroy();\n },\n\n _addBumperButtons: function () {\n this.$container\n .prepend(this.$bumperButtonStart)\n .append(this.$bumperButtonEnd);\n },\n\n _addModalName: function () {\n const headingId = 'preview-heading';\n\n this.$container\n .prepend(\n $('h1')\n .attr({\n class: 'visually-hidden',\n id: headingId,\n })\n .text(Craft.t('app', 'Preview file'))\n )\n .attr('aria-labelledby', headingId);\n },\n\n /**\n * Disappear immediately forever.\n * @returns {boolean}\n */\n selfDestruct: function () {\n var instance = Craft.PreviewFileModal.openInstance;\n\n instance.hide();\n instance.$shade.remove();\n instance.destroy();\n\n Craft.PreviewFileModal.openInstance = null;\n Craft.focalPoint.destruct();\n Craft.focalPoint = null;\n\n return true;\n },\n\n /**\n * Load an asset, using starting width and height, if applicable\n * @param {number} assetId\n * @param {number} [startingWidth]\n * @param {number} [startingHeight]\n */\n loadAsset: function (assetId, startingWidth, startingHeight) {\n this.assetId = assetId;\n\n this.$container.empty();\n this.loaded = false;\n\n this.desiredHeight = null;\n this.desiredWidth = null;\n\n var containerHeight = Garnish.$win.height() * 0.66;\n var containerWidth = Math.min(\n (containerHeight / 3) * 4,\n Garnish.$win.width() - this.settings.minGutter * 2\n );\n containerHeight = (containerWidth / 4) * 3;\n\n if (startingWidth && startingHeight) {\n var ratio = startingWidth / startingHeight;\n containerWidth = Math.min(\n startingWidth,\n Garnish.$win.width() - this.settings.minGutter * 2\n );\n containerHeight = Math.min(\n containerWidth / ratio,\n Garnish.$win.height() - this.settings.minGutter * 2\n );\n containerWidth = containerHeight * ratio;\n\n // This might actually have put width over the viewport limits, so doublecheck\n if (\n containerWidth >\n Math.min(\n startingWidth,\n Garnish.$win.width() - this.settings.minGutter * 2\n )\n ) {\n containerWidth = Math.min(\n startingWidth,\n Garnish.$win.width() - this.settings.minGutter * 2\n );\n containerHeight = containerWidth / ratio;\n }\n }\n\n this._resizeContainer(containerWidth, containerHeight);\n\n this.$spinner = $('<div class=\"spinner centeralign\"></div>').appendTo(\n this.$container\n );\n var top =\n this.$container.height() / 2 - this.$spinner.height() / 2 + 'px',\n left = this.$container.width() / 2 - this.$spinner.width() / 2 + 'px';\n\n this.$spinner.css({left: left, top: top, position: 'absolute'});\n this.requestId++;\n\n let data = {assetId: assetId, requestId: this.requestId};\n let onResponse = () => {\n this.$container.removeClass('loading');\n this.$spinner.remove();\n this.loaded = true;\n };\n Craft.sendActionRequest('POST', 'assets/preview-file', {data})\n .then((response) => {\n onResponse();\n\n if (response.data.requestId != this.requestId) {\n return;\n }\n\n if (!response.data.previewHtml) {\n this.$container.addClass('zilch');\n this.$container.append(\n $('<p/>', {text: Craft.t('app', 'No preview available.')})\n );\n this._addBumperButtons();\n return;\n }\n\n this.$container.removeClass('zilch');\n this.$container.attr('data-asset-id', this.assetId);\n this.$container.append(response.data.previewHtml);\n this._addBumperButtons();\n this._addModalName();\n Craft.appendHeadHtml(response.data.headHtml);\n Craft.appendBodyHtml(response.data.bodyHtml);\n })\n .catch(({response}) => {\n onResponse();\n alert(response.data.message);\n this.hide();\n });\n },\n\n /**\n * Resize the container to specified dimensions\n * @param {number} containerWidth\n * @param {number} containerHeight\n * @private\n */\n _resizeContainer: function (containerWidth, containerHeight) {\n this.$container.css({\n width: containerWidth,\n 'min-width': containerWidth,\n 'max-width': containerWidth,\n height: containerHeight,\n 'min-height': containerHeight,\n 'max-height': containerHeight,\n top: (Garnish.$win.height() - containerHeight) / 2,\n left: (Garnish.$win.width() - containerWidth) / 2,\n });\n },\n },\n {\n defaultSettings: {\n startingWidth: null,\n startingHeight: null,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * File Manager.\n */\nCraft.ProgressBar = Garnish.Base.extend({\n $progressBar: null,\n $innerProgressBar: null,\n $progressBarStatus: null,\n\n _itemCount: 0,\n _processedItemCount: 0,\n _displaySteps: false,\n\n init: function ($element, displaySteps) {\n if (displaySteps) {\n this._displaySteps = true;\n }\n\n this.$progressBar = $('<div class=\"progressbar pending hidden\"/>').appendTo(\n $element\n );\n this.$innerProgressBar = $('<div class=\"progressbar-inner\"/>').appendTo(\n this.$progressBar\n );\n this.$progressBarStatus = $(\n '<div class=\"progressbar-status hidden\" />'\n ).insertAfter(this.$progressBar);\n\n this.resetProgressBar();\n },\n\n /**\n * Reset the progress bar\n */\n resetProgressBar: function () {\n // Since setting the progress percentage implies that there is progress to be shown\n // It removes the pending class - we must add it back.\n this.setProgressPercentage(100);\n this.$progressBar.addClass('pending');\n\n // Reset all the counters\n this.setItemCount(1);\n this.setProcessedItemCount(0);\n this.$progressBarStatus.html('');\n\n if (this._displaySteps) {\n this.$progressBar.addClass('has-status');\n }\n },\n\n /**\n * Fade to invisible, hide it using a class and reset opacity to visible\n */\n hideProgressBar: function () {\n this.$progressBar.fadeTo('fast', 0.01, () => {\n this.$progressBar.addClass('hidden').fadeTo(1, 1, $.noop);\n });\n this.$progressBarStatus.fadeTo('fast', 0.01, () => {\n this.$progressBarStatus.addClass('hidden').fadeTo(1, 1, $.noop);\n });\n },\n\n showProgressBar: function () {\n this.$progressBar.removeClass('hidden');\n this.$progressBarStatus.removeClass('hidden');\n },\n\n setItemCount: function (count) {\n this._itemCount = count;\n },\n\n incrementItemCount: function (count) {\n this._itemCount += count;\n },\n\n setProcessedItemCount: function (count) {\n this._processedItemCount = count;\n },\n\n incrementProcessedItemCount: function (count) {\n this._processedItemCount += count;\n },\n\n updateProgressBar: function () {\n // Only fools would allow accidental division by zero.\n this._itemCount = Math.max(this._itemCount, 1);\n\n var width = Math.min(\n 100,\n Math.round((100 * this._processedItemCount) / this._itemCount)\n );\n\n this.setProgressPercentage(width);\n\n if (this._displaySteps) {\n this.$progressBarStatus.html(\n this._processedItemCount + ' / ' + this._itemCount\n );\n }\n },\n\n setProgressPercentage: function (percentage, animate) {\n if (percentage === 0) {\n this.$progressBar.addClass('pending');\n } else {\n this.$progressBar.removeClass('pending');\n\n if (animate) {\n this.$innerProgressBar\n .velocity('stop')\n .velocity({width: percentage + '%'}, 'fast');\n } else {\n this.$innerProgressBar.velocity('stop').width(percentage + '%');\n }\n }\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * File Manager.\n */\nCraft.PromptHandler = Garnish.Base.extend({\n modal: null,\n $modalContainerDiv: null,\n $prompt: null,\n $promptApplyToRemainingContainer: null,\n $promptApplyToRemainingCheckbox: null,\n $promptApplyToRemainingLabel: null,\n $pomptChoices: null,\n\n _prompts: [],\n _promptBatchCallback: $.noop,\n _promptBatchReturnData: [],\n _promptBatchNum: 0,\n\n resetPrompts: function () {\n this._prompts = [];\n this._promptBatchCallback = $.noop;\n this._promptBatchReturnData = [];\n this._promptBatchNum = 0;\n },\n\n addPrompt: function (prompt) {\n this._prompts.push(prompt);\n },\n\n getPromptCount: function () {\n return this._prompts.length;\n },\n\n showBatchPrompts: function (callback) {\n this._promptBatchCallback = callback;\n this._promptBatchReturnData = [];\n this._promptBatchNum = 0;\n\n this._showNextPromptInBatch();\n },\n\n _showNextPromptInBatch: function () {\n var prompt = this._prompts[this._promptBatchNum].prompt,\n remainingInBatch = this._prompts.length - (this._promptBatchNum + 1);\n\n this._showPrompt(\n prompt.message,\n prompt.choices,\n this._handleBatchPromptSelection.bind(this),\n remainingInBatch\n );\n },\n\n /**\n * Handles a prompt choice selection.\n *\n * @param {string} choice\n * @param {boolean} applyToRemaining\n * @private\n */\n _handleBatchPromptSelection: function (choice, applyToRemaining) {\n var prompt = this._prompts[this._promptBatchNum],\n remainingInBatch = this._prompts.length - (this._promptBatchNum + 1);\n\n // Record this choice\n var choiceData = $.extend(prompt, {choice});\n this._promptBatchReturnData.push(choiceData);\n\n // Are there any remaining items in the batch?\n if (remainingInBatch) {\n // Get ready to deal with the next prompt\n this._promptBatchNum++;\n\n // Apply the same choice to the remaining items?\n if (applyToRemaining) {\n this._handleBatchPromptSelection(choice, true);\n } else {\n // Show the next prompt\n this._showNextPromptInBatch();\n }\n } else {\n // All done! Call the callback\n if (typeof this._promptBatchCallback === 'function') {\n this._promptBatchCallback(this._promptBatchReturnData);\n }\n }\n },\n\n /**\n * @callback showPromptCallback\n * @param {string} choice\n * @param {boolean} applyToRemaining\n */\n /**\n * Show the user prompt with a given message and choices, plus an optional \"Apply to remaining\" checkbox.\n *\n * @param {string} message\n * @param {Array} choices\n * @param {showPromptCallback} callback\n * @param {number} itemsToGo\n */\n _showPrompt: function (message, choices, callback, itemsToGo) {\n this._promptCallback = callback;\n\n if (this.modal === null) {\n this.modal = new Garnish.Modal({closeOtherModals: false});\n }\n\n if (this.$modalContainerDiv === null) {\n this.$modalContainerDiv = $(\n '<div class=\"modal fitted prompt-modal\"></div>'\n )\n .addClass()\n .appendTo(Garnish.$bod);\n }\n\n this.$prompt = $('<div class=\"body\"></div>').appendTo(\n this.$modalContainerDiv.empty()\n );\n\n this.$promptMessage = $('<p class=\"prompt-msg\"/>').appendTo(this.$prompt);\n\n this.$promptChoices = $('<div class=\"options\"></div>').appendTo(\n this.$prompt\n );\n\n this.$promptApplyToRemainingContainer = $(\n '<label class=\"assets-applytoremaining\"/>'\n )\n .appendTo(this.$prompt)\n .hide();\n this.$promptApplyToRemainingCheckbox = $(\n '<input type=\"checkbox\"/>'\n ).appendTo(this.$promptApplyToRemainingContainer);\n this.$promptApplyToRemainingLabel = $('<span/>').appendTo(\n this.$promptApplyToRemainingContainer\n );\n\n this.$promptButtons = $('<div class=\"buttons right\"/>').appendTo(\n this.$prompt\n );\n\n this.modal.setContainer(this.$modalContainerDiv);\n\n this.$promptMessage.html(message);\n\n let $cancelBtn = $('<button/>', {\n type: 'button',\n class: 'btn',\n text: Craft.t('app', 'Cancel'),\n }).appendTo(this.$promptButtons);\n let $submitBtn = $('<button/>', {\n type: 'submit',\n class: 'btn submit disabled',\n text: Craft.t('app', 'OK'),\n }).appendTo(this.$promptButtons);\n\n for (var i = 0; i < choices.length; i++) {\n var $radioButtonHtml = $(\n '<div><label><input type=\"radio\" name=\"promptAction\" value=\"' +\n choices[i].value +\n '\"/> ' +\n choices[i].title +\n '</label></div>'\n ).appendTo(this.$promptChoices),\n $radioButton = $radioButtonHtml.find('input');\n\n this.addListener($radioButton, 'click', function () {\n $submitBtn.removeClass('disabled');\n });\n }\n\n this.addListener($submitBtn, 'activate', function (ev) {\n var choice = $(ev.currentTarget)\n .parents('.modal')\n .find('input[name=promptAction]:checked')\n .val(),\n applyToRemaining = this.$promptApplyToRemainingCheckbox.prop('checked');\n\n this._selectPromptChoice(choice, applyToRemaining);\n });\n\n this.addListener($cancelBtn, 'activate', function () {\n var choice = 'cancel',\n applyToRemaining = this.$promptApplyToRemainingCheckbox.prop('checked');\n\n this._selectPromptChoice(choice, applyToRemaining);\n });\n\n if (itemsToGo) {\n this.$promptApplyToRemainingContainer.show();\n this.$promptApplyToRemainingLabel.html(\n ' ' +\n Craft.t('app', 'Apply this to the {number} remaining conflicts?', {\n number: itemsToGo,\n })\n );\n }\n\n this.modal.show();\n this.modal.removeListener(Garnish.Modal.$shade, 'click');\n this.addListener(Garnish.Modal.$shade, 'click', '_cancelPrompt');\n },\n\n /**\n * Handles when a user selects one of the prompt choices.\n *\n * @param {string} choice\n * @param {boolean} applyToRemaining\n * @private\n */\n _selectPromptChoice: function (choice, applyToRemaining) {\n this.$prompt.fadeOut('fast', () => {\n this.modal.hide();\n this._promptCallback(choice, applyToRemaining);\n });\n },\n\n /**\n * Cancels the prompt.\n */\n _cancelPrompt: function () {\n this._selectPromptChoice('cancel', true);\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n\n/**\n * Queue\n */\nCraft.Queue = Garnish.Base.extend({\n running: false,\n paused: false,\n pausedForVisibility: false,\n jobs: null,\n\n get length() {\n return this.jobs.length;\n },\n\n get isPaused() {\n return this.paused || this.pausedForVisibility;\n },\n\n init: function () {\n this.jobs = [];\n\n Garnish.$doc.on('visibilitychange', () => {\n if (this.pausedForVisibility && Craft.isVisible()) {\n this.pausedForVisibility = false;\n this._resume();\n }\n });\n },\n\n /**\n * Adds a job to the queue.\n * @param {function} job\n * @returns {Promise}\n */\n push: function (job) {\n return this._add(job, 'push');\n },\n\n /**\n * Adds a job to the beginning of the queue.\n * @param {function} job\n * @returns {Promise}\n */\n unshift: function (job) {\n return this._add(job, 'unshift');\n },\n\n pause: function () {\n if (!this.paused) {\n this.paused = true;\n if (!this.pausedForVisibility) {\n this.trigger('pause');\n }\n }\n },\n\n resume: function () {\n if (this.paused) {\n this.paused = false;\n this._resume();\n }\n },\n\n /**\n * Adds a job to the queue.\n * @param {function} job\n * @param {string} method\n * @returns {Promise}\n * @private\n */\n _add: function (job, method) {\n return new Promise((resolve, reject) => {\n this.jobs[method](() => {\n return new Promise((qResolve, qReject) => {\n job()\n .then((value) => {\n // ...arguments doesn't work here :(\n resolve(value);\n qResolve();\n })\n .catch((value) => {\n // ...arguments doesn't work here :(\n reject(value);\n qReject();\n });\n });\n });\n\n if (!this.running) {\n this.trigger('beforeRun');\n this.running = true;\n this._exec();\n }\n });\n },\n\n clear: function () {\n this.jobs.length = 0;\n },\n\n /**\n * Runs the next job in the queue.\n * @private\n */\n _exec: function () {\n if (!this.jobs.length) {\n this.running = false;\n this.trigger('afterRun');\n return;\n }\n\n if (!this.pausedForVisibility && !Craft.isVisible()) {\n this.pausedForVisibility = true;\n if (!this.paused) {\n this.trigger('pause');\n }\n }\n\n if (this.paused || this.pausedForVisibility) {\n return;\n }\n\n this.trigger('beforeExec');\n const job = this.jobs.shift();\n job().finally(() => {\n this.trigger('afterExec');\n this._exec();\n });\n },\n\n _resume: function () {\n if (!this.isPaused) {\n this.trigger('resume');\n this._exec();\n }\n },\n});\n\nCraft.queue = new Craft.Queue();\n","(function ($) {\n /** global: Craft */\n /** global: Garnish */\n /**\n * Slide Picker\n */\n Craft.SlidePicker = Garnish.Base.extend(\n {\n min: null,\n max: null,\n totalSteps: null,\n value: null,\n label: null,\n describedBy: null,\n\n $container: null,\n $buttons: null,\n\n init: function (value, settings) {\n this.setSettings(settings, Craft.SlidePicker.defaults);\n\n this.$container = $('<div/>', {\n class: 'slide-picker',\n role: 'slider',\n tabindex: 0,\n });\n\n this.refresh();\n this.setValue(value, false);\n\n this.addListener(this.$container, 'keydown', (ev) => {\n switch (ev.keyCode) {\n case Garnish.UP_KEY:\n this.setValue(this.value + this.settings.step);\n ev.preventDefault();\n break;\n case Garnish.DOWN_KEY:\n this.setValue(this.value - this.settings.step);\n ev.preventDefault();\n break;\n case Garnish.RIGHT_KEY:\n if (Craft.orientation === 'ltr') {\n this.setValue(this.value + this.settings.step);\n } else {\n this.setValue(this.value - this.settings.step);\n }\n ev.preventDefault();\n break;\n case Garnish.LEFT_KEY:\n if (Craft.orientation === 'ltr') {\n this.setValue(this.value - this.settings.step);\n } else {\n this.setValue(this.value + this.settings.step);\n }\n ev.preventDefault();\n break;\n case Garnish.HOME_KEY:\n this.setValue(this.min);\n ev.preventDefault();\n break;\n case Garnish.END_KEY:\n this.setValue(this.max);\n ev.preventDefault();\n break;\n }\n });\n },\n\n refresh: function () {\n // Figure out what the min/max values are\n this.min = this._min();\n this.max = this._max();\n this.totalSteps = (this.max - this.min) / this.settings.step;\n\n // Set label\n this.label = this.settings.label;\n this.describedBy = this.settings.describedBy;\n\n if (!Number.isInteger(this.totalSteps)) {\n throw 'Invalid SlidePicker config';\n }\n\n if (this.$buttons) {\n this.$buttons.remove();\n }\n\n this.$container.attr('aria-valuemin', this.min);\n this.$container.attr('aria-valuemax', this.max);\n\n if (this.label) {\n this.$container.attr('aria-label', this.label);\n }\n\n if (this.describedBy) {\n this.$container.attr('aria-describedby', this.describedBy);\n }\n\n this.$buttons = $();\n\n // Create the buttons\n for (\n let value = this.min;\n value <= this.max;\n value += this.settings.step\n ) {\n this.$buttons = this.$buttons.add(\n $('<a/>', {\n title: this.settings.valueLabel(value),\n data: {value},\n })\n );\n }\n\n this.$buttons.appendTo(this.$container);\n\n if (this.value !== null) {\n let value = this.value;\n this.value = null;\n this.setValue(value, false);\n }\n\n this.addListener(this.$buttons, 'mouseover', (ev) => {\n this.$buttons.removeClass('active-hover last-active-hover');\n $(ev.currentTarget)\n .addClass('active-hover last-active-hover')\n .prevAll()\n .addClass('active-hover');\n });\n\n this.addListener(this.$buttons, 'mouseout', () => {\n this.$buttons.removeClass('active-hover');\n });\n\n this.addListener(this.$buttons, 'click', (ev) => {\n this.setValue($.data(ev.currentTarget, 'value'));\n ev.stopPropagation();\n this.$container.focus();\n });\n },\n\n setValue: function (value, triggerEvent) {\n value = Math.max(Math.min(value, this.max), this.min);\n\n if (this.value === (this.value = value)) {\n return;\n }\n\n this.$container.attr({\n 'aria-valuenow': this.value,\n 'aria-valuetext': this.settings.valueLabel(this.value),\n });\n\n this.$buttons.removeClass('last-active active');\n let $activeButton = this.$buttons.eq(\n (this.value - this.min) / this.settings.step\n );\n $activeButton.add($activeButton.prevAll()).addClass('active');\n $activeButton.addClass('last-active');\n\n if (triggerEvent !== false) {\n this.settings.onChange(value);\n }\n },\n\n _min: function () {\n if (typeof this.settings.min === 'function') {\n return this.settings.min();\n }\n return this.settings.min;\n },\n\n _max: function () {\n if (typeof this.settings.max === 'function') {\n return this.settings.max();\n }\n return this.settings.max;\n },\n },\n {\n defaults: {\n min: 0,\n max: 100,\n step: 10,\n valueLabel: null,\n onChange: $.noop,\n },\n }\n );\n})(jQuery);\n","/** global: Garnish */\n\nCraft.SlideRuleInput = Garnish.Base.extend({\n $container: null,\n $options: null,\n $selectedOption: null,\n $input: null,\n value: null,\n\n startPositionX: null,\n\n init: function (id, settings) {\n this.setSettings(settings, Craft.SlideRuleInput.defaultSettings);\n\n this.value = 0;\n this.graduationsMin = -70;\n this.graduationsMax = 70;\n this.slideMin = -45;\n this.slideMax = 45;\n\n this.$container = $('#' + id);\n this.$overlay = $('<div class=\"overlay\"></div>').appendTo(this.$container);\n this.$cursor = $('<div class=\"cursor\"></div>').appendTo(this.$container);\n this.$graduations = $('<div class=\"graduations\"></div>').appendTo(\n this.$container\n );\n this.$graduationsUl = $('<ul></ul>').appendTo(this.$graduations);\n\n this.$container.attr({\n role: 'slider',\n tabindex: '0',\n 'aria-valuemin': this.slideMin,\n 'aria-valuemax': this.slideMax,\n 'aria-valuenow': '0',\n 'aria-valuetext': Craft.t(\n 'app',\n '{num, number} {num, plural, =1{degree} other{degrees}}',\n {\n num: 0,\n }\n ),\n });\n\n for (var i = this.graduationsMin; i <= this.graduationsMax; i++) {\n var $li = $(\n '<li class=\"graduation\" data-graduation=\"' +\n i +\n '\"><div class=\"label\">' +\n i +\n '</div></li>'\n ).appendTo(this.$graduationsUl);\n\n if (i % 5 === 0) {\n $li.addClass('main-graduation');\n }\n\n if (i === 0) {\n $li.addClass('selected');\n }\n }\n\n this.$options = this.$container.find('.graduation');\n\n this.addListener(this.$container, 'resize', this._handleResize.bind(this));\n this.addListener(\n this.$container,\n 'tapstart',\n this._handleTapStart.bind(this)\n );\n this.addListener(Garnish.$bod, 'tapmove', this._handleTapMove.bind(this));\n this.addListener(Garnish.$bod, 'tapend', this._handleTapEnd.bind(this));\n this.addListener(\n this.$container,\n 'keydown',\n this._handleKeypress.bind(this)\n );\n\n // Set to zero\n\n // this.setValue(0);\n\n setTimeout(() => {\n // (n -1) options because the border is placed on the left of the 10px box\n this.graduationsCalculatedWidth = (this.$options.length - 1) * 10;\n this.$graduationsUl.css(\n 'left',\n -this.graduationsCalculatedWidth / 2 + this.$container.width() / 2\n );\n }, 50);\n },\n\n _handleResize: function () {\n var left = this.valueToPosition(this.value);\n this.$graduationsUl.css('left', left);\n },\n\n _handleKeypress: function (event) {\n const current = parseInt(this.$container.attr('aria-valuenow'), 10);\n\n switch (event.keyCode) {\n case Garnish.UP_KEY:\n case Garnish.RIGHT_KEY:\n this.setValue(current + 1);\n break;\n case Garnish.DOWN_KEY:\n case Garnish.LEFT_KEY:\n this.setValue(current - 1);\n break;\n case Garnish.PAGE_UP_KEY:\n this.setValue(current + 10);\n break;\n case Garnish.PAGE_DOWN_KEY:\n this.setValue(current - 10);\n break;\n case Garnish.HOME_KEY:\n this.setValue(this.slideMin);\n break;\n case Garnish.END_KEY:\n this.setValue(this.slideMax);\n break;\n }\n\n this.onChange();\n },\n\n _handleTapStart: function (ev, touch) {\n ev.preventDefault();\n\n this.startPositionX = touch.position.x;\n this.startLeft = this.$graduationsUl.position().left;\n\n this.dragging = true;\n this.onStart();\n },\n\n _handleTapMove: function (ev, touch) {\n if (this.dragging) {\n ev.preventDefault();\n\n var curX = this.startPositionX - touch.position.x;\n var left = this.startLeft - curX;\n var value = this.positionToValue(left);\n\n this.setValue(value);\n\n this.onChange();\n }\n },\n\n setValue: function (value) {\n var left = this.valueToPosition(value);\n if (value < this.slideMin) {\n value = this.slideMin;\n left = this.valueToPosition(value);\n } else if (value > this.slideMax) {\n value = this.slideMax;\n left = this.valueToPosition(value);\n }\n\n this.$graduationsUl.css('left', left);\n\n if (value >= this.slideMin && value <= this.slideMax) {\n this.$options.removeClass('selected');\n\n $.each(this.$options, function (key, option) {\n if ($(option).data('graduation') > 0) {\n if ($(option).data('graduation') <= value) {\n $(option).addClass('selected');\n }\n }\n if ($(option).data('graduation') < 0) {\n if ($(option).data('graduation') >= value) {\n $(option).addClass('selected');\n }\n }\n\n if ($(option).data('graduation') == 0) {\n $(option).addClass('selected');\n }\n });\n }\n\n this.$container.attr({\n 'aria-valuenow': value,\n 'aria-valuetext': Craft.t(\n 'app',\n '{num, number} {num, plural, =1{degree} other{degrees}}',\n {num: parseInt(value, 10)}\n ),\n });\n this.value = value;\n },\n\n _handleTapEnd: function (ev) {\n if (this.dragging) {\n ev.preventDefault();\n this.dragging = false;\n this.onEnd();\n }\n },\n\n positionToValue: function (position) {\n var scaleMin = this.graduationsMin * -1;\n var scaleMax = (this.graduationsMin - this.graduationsMax) * -1;\n\n return (\n ((this.$graduations.width() / 2 + position * -1) /\n this.graduationsCalculatedWidth) *\n scaleMax -\n scaleMin\n );\n },\n\n valueToPosition: function (value) {\n var scaleMin = this.graduationsMin * -1;\n var scaleMax = (this.graduationsMin - this.graduationsMax) * -1;\n\n return -(\n ((value + scaleMin) * this.graduationsCalculatedWidth) / scaleMax -\n this.$graduations.width() / 2\n );\n },\n\n onStart: function () {\n if (typeof this.settings.onChange === 'function') {\n this.settings.onStart(this);\n }\n },\n\n onChange: function () {\n if (typeof this.settings.onChange === 'function') {\n this.settings.onChange(this);\n }\n },\n\n onEnd: function () {\n if (typeof this.settings.onChange === 'function') {\n this.settings.onEnd(this);\n }\n },\n\n defaultSettings: {\n onStart: $.noop,\n onChange: $.noop,\n onEnd: $.noop,\n },\n});\n","(function ($) {\n /** global: Craft */\n /** global: Garnish */\n /**\n * Slide Picker\n */\n Craft.Slideout = Garnish.Base.extend(\n {\n $outerContainer: null,\n $container: null,\n $shade: null,\n isOpen: false,\n\n init: function (contents, settings) {\n this.setSettings(settings, Craft.Slideout.defaults);\n\n if (!Craft.useMobileStyles()) {\n this.$shade = $('<div class=\"slideout-shade\"/>').appendTo(\n Garnish.$bod\n );\n\n if (this.settings.closeOnShadeClick) {\n this.addListener(this.$shade, 'click', (ev) => {\n ev.stopPropagation();\n this.close();\n });\n }\n }\n\n this.$outerContainer = $('<div/>', {\n class: 'slideout-container hidden',\n });\n this.$container = $(\n `<${this.settings.containerElement}/>`,\n this.settings.containerAttributes\n )\n .attr('data-slideout', '')\n .addClass('slideout')\n .append(contents)\n .data('slideout', this)\n .appendTo(this.$outerContainer);\n\n Garnish.addModalAttributes(this.$outerContainer);\n\n if (Craft.useMobileStyles()) {\n this.$container.addClass('so-mobile');\n }\n\n Craft.trapFocusWithin(this.$container);\n\n if (this.settings.autoOpen) {\n this.open();\n }\n },\n\n open: function () {\n if (this.isOpen) {\n return;\n }\n\n this.setTriggerElement(document.activeElement);\n\n this._cancelTransitionListeners();\n\n // Move the shade + container to the end of <body> so they get the highest sub-z-indexes\n if (this.$shade) {\n this.$shade.appendTo(Garnish.$bod).show();\n }\n\n this.$outerContainer.appendTo(Garnish.$bod).removeClass('hidden');\n\n if (Craft.useMobileStyles()) {\n this.$container.css('top', '100vh');\n } else {\n this.$container.css(Garnish.ltr ? 'left' : 'right', '100vw');\n }\n\n this.$container.one('transitionend.slideout', () => {\n Craft.setFocusWithin(this.$container);\n });\n\n if (this.$shade) {\n this.$shade[0].offsetWidth;\n this.$shade.addClass('so-visible');\n }\n\n this.$container[0].offsetWidth;\n Craft.Slideout.addPanel(this);\n\n this.enable();\n Garnish.uiLayerManager.addLayer(this.$outerContainer);\n Garnish.hideModalBackgroundLayers();\n\n if (this.settings.closeOnEsc) {\n Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n this.close();\n });\n }\n\n this.isOpen = true;\n this.trigger('open');\n },\n\n setTriggerElement: function (trigger) {\n this.settings.triggerElement = trigger;\n },\n\n close: function () {\n if (!this.isOpen) {\n return;\n }\n\n this.trigger('beforeClose');\n this.disable();\n this.isOpen = false;\n\n this._cancelTransitionListeners();\n\n if (this.$shade) {\n this.$shade\n .removeClass('so-visible')\n .one('transitionend.slideout', () => {\n this.$shade.hide();\n });\n }\n\n Craft.Slideout.removePanel(this);\n Garnish.uiLayerManager.removeLayer();\n Garnish.resetModalBackgroundLayerVisibility();\n this.$container.one('transitionend.slideout', () => {\n this.$outerContainer.addClass('hidden');\n this.trigger('close');\n });\n\n if (this.settings.triggerElement) {\n this.settings.triggerElement.focus();\n }\n },\n\n _cancelTransitionListeners: function () {\n if (this.$shade) {\n this.$shade.off('transitionend.slideout');\n }\n\n this.$container.off('transitionend.slideout');\n },\n\n /**\n * Destroy\n */\n destroy: function () {\n if (this.$shade) {\n this.$shade.remove();\n this.$shade = null;\n }\n\n this.$outerContainer.remove();\n this.$outerContainer = null;\n this.$container = null;\n\n this.base();\n },\n },\n {\n defaults: {\n containerElement: 'div',\n containerAttributes: {},\n autoOpen: true,\n closeOnEsc: true,\n closeOnShadeClick: true,\n triggerElement: null,\n },\n openPanels: [],\n addPanel: function (panel) {\n Craft.Slideout.openPanels.unshift(panel);\n if (Craft.useMobileStyles()) {\n panel.$container.css('top', 0);\n } else {\n Craft.Slideout.updateStyles();\n }\n },\n removePanel: function (panel) {\n Craft.Slideout.openPanels = Craft.Slideout.openPanels.filter(\n (m) => m !== panel\n );\n if (Craft.useMobileStyles()) {\n panel.$container.css('top', '100vh');\n } else {\n panel.$container.css(Garnish.ltr ? 'left' : 'right', '100vw');\n Craft.Slideout.updateStyles();\n }\n },\n updateStyles: function () {\n const totalPanels = Craft.Slideout.openPanels.length;\n Craft.Slideout.openPanels.forEach((panel, i) => {\n panel.$container.css(\n Garnish.ltr ? 'left' : 'right',\n `${50 * ((totalPanels - i) / totalPanels)}vw`\n );\n });\n\n if (totalPanels !== 0) {\n Garnish.$bod.addClass('no-scroll');\n } else {\n Garnish.$bod.removeClass('no-scroll');\n }\n },\n }\n );\n})(jQuery);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Slug Generator\n */\nCraft.SlugGenerator = Craft.BaseInputGenerator.extend({\n generateTargetValue: function (sourceVal) {\n // Remove HTML tags\n sourceVal = sourceVal.replace(/<(.*?)>/g, '');\n\n // Remove inner-word punctuation\n sourceVal = sourceVal.replace(/['\"‘’“”\\[\\]\\(\\)\\{\\}:]/g, '');\n\n // Make it lowercase\n if (!Craft.allowUppercaseInSlug) {\n sourceVal = sourceVal.toLowerCase();\n }\n\n if (Craft.limitAutoSlugsToAscii) {\n // Convert extended ASCII characters to basic ASCII\n sourceVal = Craft.asciiString(sourceVal, this.settings.charMap);\n }\n\n // Get the \"words\". Split on anything that is not alphanumeric.\n // Reference: http://www.regular-expressions.info/unicode.html\n var words = Craft.filterArray(\n XRegExp.matchChain(sourceVal, [XRegExp('[\\\\p{L}\\\\p{N}\\\\p{M}]+')])\n );\n\n if (words.length) {\n return words.join(Craft.slugWordSeparator);\n } else {\n return '';\n }\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Structure class\n */\nCraft.Structure = Garnish.Base.extend(\n {\n id: null,\n\n $container: null,\n state: null,\n structureDrag: null,\n\n /**\n * Init\n */\n init: function (id, container, settings) {\n this.id = id;\n this.$container = $(container);\n this.setSettings(settings, Craft.Structure.defaults);\n\n // Is this already a structure?\n if (this.$container.data('structure')) {\n console.warn('Double-instantiating a structure on an element');\n this.$container.data('structure').destroy();\n }\n\n this.$container.data('structure', this);\n\n this.state = {};\n\n if (this.settings.storageKey) {\n $.extend(\n this.state,\n Craft.getLocalStorage(this.settings.storageKey, {})\n );\n }\n\n if (typeof this.state.collapsedElementIds === 'undefined') {\n this.state.collapsedElementIds = [];\n }\n\n var $parents = this.$container.find('ul').prev('.row');\n\n for (var i = 0; i < $parents.length; i++) {\n var $row = $($parents[i]),\n $li = $row.parent(),\n $toggle = $(\n '<div class=\"toggle\" title=\"' +\n Craft.t('app', 'Show/hide children') +\n '\"/>'\n ).prependTo($row);\n\n if (\n $.inArray(\n $row.children('.element').data('id'),\n this.state.collapsedElementIds\n ) !== -1\n ) {\n $li.addClass('collapsed');\n }\n\n this.initToggle($toggle);\n }\n\n if (this.settings.sortable) {\n this.structureDrag = new Craft.StructureDrag(\n this,\n this.settings.maxLevels\n );\n }\n\n if (this.settings.newChildUrl) {\n this.initNewChildMenus(this.$container.find('.add'));\n }\n },\n\n initToggle: function ($toggle) {\n $toggle.on('click', (ev) => {\n var $li = $(ev.currentTarget).closest('li'),\n elementId = $li.children('.row').find('.element:first').data('id'),\n viewStateKey = $.inArray(elementId, this.state.collapsedElementIds);\n\n if ($li.hasClass('collapsed')) {\n $li.removeClass('collapsed');\n\n if (viewStateKey !== -1) {\n this.state.collapsedElementIds.splice(viewStateKey, 1);\n }\n } else {\n $li.addClass('collapsed');\n\n if (viewStateKey === -1) {\n this.state.collapsedElementIds.push(elementId);\n }\n }\n\n if (this.settings.storageKey) {\n Craft.setLocalStorage(this.settings.storageKey, this.state);\n }\n });\n },\n\n initNewChildMenus: function ($addBtns) {\n this.addListener($addBtns, 'click', 'onNewChildMenuClick');\n },\n\n onNewChildMenuClick: function (ev) {\n var $btn = $(ev.currentTarget);\n\n if (!$btn.data('menubtn')) {\n var elementId = $btn.parent().children('.element').data('id'),\n newChildUrl = Craft.getUrl(\n this.settings.newChildUrl,\n 'parentId=' + elementId\n );\n\n $(\n '<div class=\"menu\"><ul><li><a href=\"' +\n newChildUrl +\n '\">' +\n Craft.t('app', 'New child') +\n '</a></li></ul></div>'\n ).insertAfter($btn);\n\n var menuBtn = new Garnish.MenuBtn($btn);\n menuBtn.showMenu();\n }\n },\n\n getIndent: function (level) {\n return (\n Craft.Structure.baseIndent + (level - 1) * Craft.Structure.nestedIndent\n );\n },\n\n addElement: function ($element) {\n var $li = $('<li data-level=\"1\"/>').appendTo(this.$container),\n $row = $(\n '<div class=\"row\" style=\"margin-' +\n Craft.left +\n ': -' +\n Craft.Structure.baseIndent +\n 'px; padding-' +\n Craft.left +\n ': ' +\n Craft.Structure.baseIndent +\n 'px;\">'\n ).appendTo($li);\n\n $row.append($element);\n\n if (this.settings.sortable) {\n $row.append(\n '<a class=\"move icon\" title=\"' + Craft.t('app', 'Move') + '\"></a>'\n );\n this.structureDrag.addItems($li);\n }\n\n if (this.settings.newChildUrl) {\n var $addBtn = $(\n '<a class=\"add icon\" title=\"' + Craft.t('app', 'New child') + '\"></a>'\n ).appendTo($row);\n this.initNewChildMenus($addBtn);\n }\n\n $row.css('margin-bottom', -30);\n $row.velocity({'margin-bottom': 0}, 'fast');\n },\n\n removeElement: function ($element) {\n var $li = $element.parent().parent();\n\n if (this.settings.sortable) {\n this.structureDrag.removeItems($li);\n }\n\n var $parentUl;\n\n if (!$li.siblings().length) {\n $parentUl = $li.parent();\n }\n\n $li\n .css('visibility', 'hidden')\n .velocity({marginBottom: -$li.height()}, 'fast', () => {\n $li.remove();\n\n if (typeof $parentUl !== 'undefined') {\n this._removeUl($parentUl);\n }\n });\n },\n\n _removeUl: function ($ul) {\n $ul.siblings('.row').children('.toggle').remove();\n $ul.remove();\n },\n\n destroy: function () {\n this.$container.removeData('structure');\n this.base();\n },\n },\n {\n baseIndent: 8,\n nestedIndent: 35,\n\n defaults: {\n storageKey: null,\n sortable: false,\n newChildUrl: null,\n maxLevels: null,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Structure drag class\n */\nCraft.StructureDrag = Garnish.Drag.extend({\n structure: null,\n maxLevels: null,\n draggeeLevel: null,\n\n $helperLi: null,\n $targets: null,\n draggeeHeight: null,\n\n init: function (structure, maxLevels) {\n this.structure = structure;\n this.maxLevels = maxLevels;\n\n this.$insertion = $('<li class=\"draginsertion\"/>');\n\n var $items = this.structure.$container.find('li');\n\n this.base($items, {\n handle: '.element:first, .move:first',\n helper: this.getHelper.bind(this),\n });\n },\n\n getHelper: function ($helper) {\n this.$helperLi = $helper;\n var $ul = $('<ul class=\"structure draghelper\"/>').append($helper);\n $helper.css(\n 'padding-' + Craft.left,\n this.$draggee.css('padding-' + Craft.left)\n );\n $helper.find('.move').removeAttr('title');\n return $ul;\n },\n\n onDragStart: function () {\n this.$targets = $();\n\n // Recursively find each of the targets, in the order they appear to be in\n this.findTargets(this.structure.$container);\n\n // How deep does the rabbit hole go?\n this.draggeeLevel = 0;\n var $level = this.$draggee;\n do {\n this.draggeeLevel++;\n $level = $level.find('> ul > li');\n } while ($level.length);\n\n // Collapse the draggee\n this.draggeeHeight = this.$draggee.height();\n this.$draggee.velocity(\n {\n height: 0,\n },\n 'fast',\n () => {\n this.$draggee.addClass('hidden');\n }\n );\n this.base();\n\n this.addListener(Garnish.$doc, 'keydown', function (ev) {\n if (ev.keyCode === Garnish.ESC_KEY) {\n this.cancelDrag();\n }\n });\n },\n\n findTargets: function ($ul) {\n var $lis = $ul.children().not(this.$draggee);\n\n for (var i = 0; i < $lis.length; i++) {\n var $li = $($lis[i]);\n this.$targets = this.$targets.add($li.children('.row'));\n\n if (!$li.hasClass('collapsed')) {\n this.findTargets($li.children('ul'));\n }\n }\n },\n\n onDrag: function () {\n if (this._.$closestTarget) {\n this._.$closestTarget.removeClass('draghover');\n this.$insertion.remove();\n }\n\n // First let's find the closest target\n this._.$closestTarget = null;\n this._.closestTargetPos = null;\n this._.closestTargetYDiff = null;\n this._.closestTargetOffset = null;\n this._.closestTargetHeight = null;\n\n for (this._.i = 0; this._.i < this.$targets.length; this._.i++) {\n this._.$target = $(this.$targets[this._.i]);\n this._.targetOffset = this._.$target.offset();\n this._.targetHeight = this._.$target.outerHeight();\n this._.targetYMidpoint =\n this._.targetOffset.top + this._.targetHeight / 2;\n this._.targetYDiff = Math.abs(this.mouseY - this._.targetYMidpoint);\n\n if (\n this._.i === 0 ||\n (this.mouseY >= this._.targetOffset.top + 5 &&\n this._.targetYDiff < this._.closestTargetYDiff)\n ) {\n this._.$closestTarget = this._.$target;\n this._.closestTargetPos = this._.i;\n this._.closestTargetYDiff = this._.targetYDiff;\n this._.closestTargetOffset = this._.targetOffset;\n this._.closestTargetHeight = this._.targetHeight;\n } else {\n // Getting colder\n break;\n }\n }\n\n if (!this._.$closestTarget) {\n return;\n }\n\n // Are we hovering above the first row?\n if (\n this._.closestTargetPos === 0 &&\n this.mouseY < this._.closestTargetOffset.top + 5\n ) {\n this.$insertion.prependTo(this.structure.$container);\n } else {\n this._.$closestTargetLi = this._.$closestTarget.parent();\n this._.closestTargetLevel = this._.$closestTargetLi.data('level');\n\n // Is there a next row?\n if (this._.closestTargetPos < this.$targets.length - 1) {\n this._.$nextTargetLi = $(\n this.$targets[this._.closestTargetPos + 1]\n ).parent();\n this._.nextTargetLevel = this._.$nextTargetLi.data('level');\n } else {\n this._.$nextTargetLi = null;\n this._.nextTargetLevel = null;\n }\n\n // Are we hovering between this row and the next one?\n this._.hoveringBetweenRows =\n this.mouseY >=\n this._.closestTargetOffset.top + this._.closestTargetHeight - 5;\n\n /**\n * Scenario 1: Both rows have the same level.\n *\n * * Row 1\n * ----------------------\n * * Row 2\n */\n\n if (\n this._.$nextTargetLi &&\n this._.nextTargetLevel == this._.closestTargetLevel\n ) {\n if (this._.hoveringBetweenRows) {\n if (\n !this.maxLevels ||\n this.maxLevels >= this._.closestTargetLevel + this.draggeeLevel - 1\n ) {\n // Position the insertion after the closest target\n this.$insertion.insertAfter(this._.$closestTargetLi);\n }\n } else {\n if (\n !this.maxLevels ||\n this.maxLevels >= this._.closestTargetLevel + this.draggeeLevel\n ) {\n this._.$closestTarget.addClass('draghover');\n }\n }\n } else if (\n /**\n * Scenario 2: Next row is a child of this one.\n *\n * * Row 1\n * ----------------------\n * * Row 2\n */\n this._.$nextTargetLi &&\n this._.nextTargetLevel > this._.closestTargetLevel\n ) {\n if (\n !this.maxLevels ||\n this.maxLevels >= this._.nextTargetLevel + this.draggeeLevel - 1\n ) {\n if (this._.hoveringBetweenRows) {\n // Position the insertion as the first child of the closest target\n this.$insertion.insertBefore(this._.$nextTargetLi);\n } else {\n this._.$closestTarget.addClass('draghover');\n this.$insertion.appendTo(this._.$closestTargetLi.children('ul'));\n }\n }\n } else {\n /**\n * Scenario 3: Next row is a child of a parent node, or there is no next row.\n *\n * * Row 1\n * ----------------------\n * * Row 2\n */\n if (this._.hoveringBetweenRows) {\n // Determine which <li> to position the insertion after\n this._.draggeeX = this.mouseX - this.targetItemMouseDiffX;\n\n if (Craft.orientation === 'rtl') {\n this._.draggeeX += this.$helperLi.width();\n }\n\n this._.$parentLis = this._.$closestTarget.parentsUntil(\n this.structure.$container,\n 'li'\n );\n this._.$closestParentLi = null;\n this._.closestParentLiXDiff = null;\n this._.closestParentLevel = null;\n\n for (this._.i = 0; this._.i < this._.$parentLis.length; this._.i++) {\n this._.$parentLi = $(this._.$parentLis[this._.i]);\n this._.parentLiX = this._.$parentLi.offset().left;\n\n if (Craft.orientation === 'rtl') {\n this._.parentLiX += this._.$parentLi.width();\n }\n\n this._.parentLiXDiff = Math.abs(this._.parentLiX - this._.draggeeX);\n this._.parentLevel = this._.$parentLi.data('level');\n\n if (\n (!this.maxLevels ||\n this.maxLevels >= this._.parentLevel + this.draggeeLevel - 1) &&\n (!this._.$closestParentLi ||\n (this._.parentLiXDiff < this._.closestParentLiXDiff &&\n (!this._.$nextTargetLi ||\n this._.parentLevel >= this._.nextTargetLevel)))\n ) {\n this._.$closestParentLi = this._.$parentLi;\n this._.closestParentLiXDiff = this._.parentLiXDiff;\n this._.closestParentLevel = this._.parentLevel;\n }\n }\n\n if (this._.$closestParentLi) {\n this.$insertion.insertAfter(this._.$closestParentLi);\n }\n } else {\n if (\n !this.maxLevels ||\n this.maxLevels >= this._.closestTargetLevel + this.draggeeLevel\n ) {\n this._.$closestTarget.addClass('draghover');\n }\n }\n }\n }\n },\n\n cancelDrag: function () {\n this.$insertion.remove();\n\n if (this._.$closestTarget) {\n this._.$closestTarget.removeClass('draghover');\n }\n\n this.onMouseUp();\n },\n\n onDragStop: function () {\n // Are we repositioning the draggee?\n if (\n this._.$closestTarget &&\n (this.$insertion.parent().length ||\n this._.$closestTarget.hasClass('draghover'))\n ) {\n var $draggeeParent, moved;\n\n // Are we about to leave the draggee's original parent childless?\n if (!this.$draggee.siblings().length) {\n $draggeeParent = this.$draggee.parent();\n }\n\n if (this.$insertion.parent().length) {\n // Make sure the insertion isn't right next to the draggee\n var $closestSiblings = this.$insertion\n .next()\n .add(this.$insertion.prev());\n\n if ($.inArray(this.$draggee[0], $closestSiblings) === -1) {\n this.$insertion.replaceWith(this.$draggee);\n moved = true;\n } else {\n this.$insertion.remove();\n moved = false;\n }\n } else {\n var $ul = this._.$closestTargetLi.children('ul');\n\n // Make sure this is a different parent than the draggee's\n if (!$draggeeParent || !$ul.length || $ul[0] !== $draggeeParent[0]) {\n if (!$ul.length) {\n var $toggle = $(\n '<div class=\"toggle\" title=\"' +\n Craft.t('app', 'Show/hide children') +\n '\"/>'\n ).prependTo(this._.$closestTarget);\n this.structure.initToggle($toggle);\n\n $ul = $('<ul>').appendTo(this._.$closestTargetLi);\n } else if (this._.$closestTargetLi.hasClass('collapsed')) {\n this._.$closestTarget.children('.toggle').trigger('click');\n }\n\n this.$draggee.appendTo($ul);\n moved = true;\n } else {\n moved = false;\n }\n }\n\n // Remove the class either way\n this._.$closestTarget.removeClass('draghover');\n\n if (moved) {\n // Now deal with the now-childless parent\n if ($draggeeParent) {\n this.structure._removeUl($draggeeParent);\n }\n\n // Has the level changed?\n var newLevel =\n this.$draggee.parentsUntil(this.structure.$container, 'li').length +\n 1;\n\n var animateCss;\n\n if (newLevel != this.$draggee.data('level')) {\n // Correct the helper's padding if moving to/from level 1\n if (this.$draggee.data('level') == 1) {\n animateCss = {};\n animateCss['padding-' + Craft.left] = 38;\n this.$helperLi.velocity(animateCss, 'fast');\n } else if (newLevel == 1) {\n animateCss = {};\n animateCss['padding-' + Craft.left] = Craft.Structure.baseIndent;\n this.$helperLi.velocity(animateCss, 'fast');\n }\n\n this.setLevel(this.$draggee, newLevel);\n }\n\n // Make it real\n var $element = this.$draggee.children('.row').children('.element');\n\n var data = {\n structureId: this.structure.id,\n elementId: $element.data('id'),\n siteId: $element.data('site-id'),\n prevId: this.$draggee\n .prev()\n .children('.row')\n .children('.element')\n .data('id'),\n parentId: this.$draggee\n .parent('ul')\n .parent('li')\n .children('.row')\n .children('.element')\n .data('id'),\n };\n\n Craft.sendActionRequest('POST', 'structures/move-element', {data}).then(\n (response) => {\n Craft.cp.displaySuccess(Craft.t('app', 'New order saved.'));\n }\n );\n }\n }\n\n // Animate things back into place\n this.$draggee\n .velocity('stop')\n .removeClass('hidden')\n .velocity(\n {\n height: this.draggeeHeight,\n },\n 'fast',\n () => {\n this.$draggee.css('height', 'auto');\n }\n );\n\n this.returnHelpersToDraggees();\n\n this.base();\n },\n\n setLevel: function ($li, level) {\n $li.data('level', level);\n\n var indent = this.structure.getIndent(level);\n\n var css = {};\n css['margin-' + Craft.left] = '-' + indent + 'px';\n css['padding-' + Craft.left] = indent + 'px';\n this.$draggee.children('.row').css(css);\n\n var $childLis = $li.children('ul').children();\n\n for (var i = 0; i < $childLis.length; i++) {\n this.setLevel($($childLis[i]), level + 1);\n }\n },\n});\n","/** global: Craft */\n/** global: Garnish */\nCraft.StructureTableSorter = Garnish.DragSort.extend(\n {\n tableView: null,\n structureId: null,\n maxLevels: null,\n\n _basePadding: null,\n _helperMargin: null,\n\n _$firstRowCells: null,\n _$titleHelperCell: null,\n\n _titleHelperCellOuterWidth: null,\n\n _ancestors: null,\n _updateAncestorsFrame: null,\n\n _draggeeLevel: null,\n _draggeeLevelDelta: null,\n draggingLastElements: null,\n _loadingDraggeeLevelDelta: false,\n\n _targetLevel: null,\n _targetLevelBounds: null,\n\n _positionChanged: null,\n\n /**\n * Constructor\n */\n init: function (tableView, $elements, settings) {\n this.tableView = tableView;\n this.structureId = this.tableView.$table.data('structure-id');\n this.maxLevels = parseInt(this.tableView.$table.attr('data-max-levels'));\n\n this._basePadding = 14 + (this.tableView.elementIndex.actions ? 34 : 24); // see _elements/tableview/elements.html\n this._helperMargin = this.tableView.elementIndex.actions ? 54 : 0;\n\n settings = $.extend({}, Craft.StructureTableSorter.defaults, settings, {\n handle: '.move',\n collapseDraggees: true,\n singleHelper: true,\n helperSpacingY: 2,\n magnetStrength: 4,\n helper: this.getHelper.bind(this),\n helperLagBase: 1.5,\n axis: Garnish.Y_AXIS,\n });\n\n this.base($elements, settings);\n },\n\n /**\n * Returns the draggee rows (including any descendent rows).\n */\n findDraggee: function () {\n this._draggeeLevel = this._targetLevel = this.$targetItem.data('level');\n this._draggeeLevelDelta = 0;\n\n var $draggee = $(this.$targetItem),\n $nextRow = this.$targetItem.next();\n\n while ($nextRow.length) {\n // See if this row is a descendant of the draggee\n var nextRowLevel = $nextRow.data('level');\n\n if (nextRowLevel <= this._draggeeLevel) {\n break;\n }\n\n // Is this the deepest descendant we've seen so far?\n var nextRowLevelDelta = nextRowLevel - this._draggeeLevel;\n\n if (nextRowLevelDelta > this._draggeeLevelDelta) {\n this._draggeeLevelDelta = nextRowLevelDelta;\n }\n\n // Add it and prep the next row\n $draggee = $draggee.add($nextRow);\n $nextRow = $nextRow.next();\n }\n\n // Are we dragging the last elements on the page?\n this.draggingLastElements = !$nextRow.length;\n\n // Do we have a maxLevels to enforce,\n // and does it look like this draggee has descendants we don't know about yet?\n if (\n this.maxLevels &&\n this.draggingLastElements &&\n this.tableView.getMorePending()\n ) {\n // Only way to know the true descendant level delta is to ask PHP\n this._loadingDraggeeLevelDelta = true;\n\n var data = this._getAjaxBaseData(this.$targetItem);\n\n Craft.sendActionRequest('POST', 'structures/get-element-level-delta', {\n data,\n }).then((response) => {\n this._loadingDraggeeLevelDelta = false;\n\n if (this.dragging) {\n this._draggeeLevelDelta = response.data.delta;\n this.drag(false);\n }\n });\n }\n\n return $draggee;\n },\n\n /**\n * Returns the drag helper.\n */\n getHelper: function ($helperRow) {\n var $outerContainer = $(\n '<div class=\"elements datatablesorthelper\"/>'\n ).appendTo(Garnish.$bod),\n $innerContainer = $('<div class=\"tableview\"/>').appendTo(\n $outerContainer\n ),\n $table = $('<table class=\"data\"/>').appendTo($innerContainer),\n $tbody = $('<tbody/>').appendTo($table);\n\n $helperRow.appendTo($tbody);\n\n // Copy the column widths\n this._$firstRowCells = this.tableView.$elementContainer\n .children('tr:first')\n .children();\n var $helperCells = $helperRow.children();\n\n for (var i = 0; i < $helperCells.length; i++) {\n var $helperCell = $($helperCells[i]);\n\n // Skip the checkbox cell\n if ($helperCell.hasClass('checkbox-cell')) {\n $helperCell.remove();\n continue;\n }\n\n // Hard-set the cell widths\n var $firstRowCell = $(this._$firstRowCells[i]);\n var width = $firstRowCell[0].getBoundingClientRect().width;\n\n $firstRowCell.css('width', width + 'px');\n $helperCell.css('width', width + 'px');\n\n // Is this the title cell?\n if (Garnish.hasAttr($firstRowCell, 'data-titlecell')) {\n this._$titleHelperCell = $helperCell;\n var padding = parseInt($firstRowCell.css('padding-' + Craft.left));\n this._titleHelperCellOuterWidth = width;\n\n $helperCell.css('padding-' + Craft.left, this._basePadding);\n }\n }\n\n return $outerContainer;\n },\n\n /**\n * Returns whether the draggee can be inserted before a given item.\n */\n canInsertBefore: function ($item) {\n if (this._loadingDraggeeLevelDelta) {\n return false;\n }\n\n return this._getLevelBounds($item.prev(), $item) !== false;\n },\n\n /**\n * Returns whether the draggee can be inserted after a given item.\n */\n canInsertAfter: function ($item) {\n if (this._loadingDraggeeLevelDelta) {\n return false;\n }\n\n return this._getLevelBounds($item, $item.next()) !== false;\n },\n\n // Events\n // -------------------------------------------------------------------------\n\n /**\n * On Drag Start\n */\n onDragStart: function () {\n // Get the initial set of ancestors, before the item gets moved\n this._ancestors = this._getAncestors(\n this.$targetItem,\n this.$targetItem.data('level')\n );\n\n // Set the initial target level bounds\n this._setTargetLevelBounds();\n\n // Check to see if we should load more elements now\n this.tableView.maybeLoadMore();\n\n this.base();\n },\n\n /**\n * On Drag\n */\n onDrag: function () {\n this.base();\n this._updateIndent();\n },\n\n /**\n * On Insertion Point Change\n */\n onInsertionPointChange: function () {\n this._setTargetLevelBounds();\n this._updateAncestorsBeforeRepaint();\n this.base();\n },\n\n /**\n * On Drag Stop\n */\n onDragStop: function () {\n this._positionChanged = false;\n this.base();\n\n // Update the draggee's padding if the position just changed\n // ---------------------------------------------------------------------\n\n if (this._targetLevel != this._draggeeLevel) {\n var levelDiff = this._targetLevel - this._draggeeLevel;\n\n for (var i = 0; i < this.$draggee.length; i++) {\n var $draggee = $(this.$draggee[i]),\n oldLevel = $draggee.data('level'),\n newLevel = oldLevel + levelDiff,\n padding = this._basePadding + this._getLevelIndent(newLevel);\n\n $draggee.data('level', newLevel);\n $draggee.find('.element').data('level', newLevel);\n $draggee\n .children('[data-titlecell]:first')\n .css('padding-' + Craft.left, padding);\n }\n\n this._positionChanged = true;\n }\n\n // Keep in mind this could have also been set by onSortChange()\n if (this._positionChanged) {\n // Tell the server about the new position\n // -----------------------------------------------------------------\n\n var data = this._getAjaxBaseData(this.$draggee);\n\n // Find the previous sibling/parent, if there is one\n var $prevRow = this.$draggee.first().prev();\n\n while ($prevRow.length) {\n var prevRowLevel = $prevRow.data('level');\n\n if (prevRowLevel == this._targetLevel) {\n data.prevId = $prevRow.data('id');\n break;\n }\n\n if (prevRowLevel < this._targetLevel) {\n data.parentId = $prevRow.data('id');\n\n // Is this row collapsed?\n var $toggle = $prevRow.find('> th > .toggle');\n\n if (!$toggle.hasClass('expanded')) {\n // Make it look expanded\n $toggle.addClass('expanded');\n\n // Add a temporary row\n var $spinnerRow = this.tableView._createSpinnerRowAfter($prevRow);\n\n // Remove the target item\n if (this.tableView.elementSelect) {\n this.tableView.elementSelect.removeItems(this.$targetItem);\n }\n\n this.removeItems(this.$targetItem);\n this.$targetItem.remove();\n this.tableView._totalVisible--;\n }\n\n break;\n }\n\n $prevRow = $prevRow.prev();\n }\n\n Craft.sendActionRequest('POST', 'structures/move-element', {data})\n .then((response) => {\n Craft.cp.displaySuccess(Craft.t('app', 'New position saved.'));\n this.onPositionChange();\n\n // Were we waiting on this to complete so we can expand the new parent?\n if ($spinnerRow && $spinnerRow.parent().length) {\n $spinnerRow.remove();\n this.tableView._expandElement($toggle, true);\n }\n\n // See if we should run any pending tasks\n Craft.cp.runQueue();\n })\n .catch(({response}) => {\n Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n this.tableView.elementIndex.updateElements();\n return;\n });\n }\n },\n\n onSortChange: function () {\n if (this.tableView.elementSelect) {\n this.tableView.elementSelect.resetItemOrder();\n }\n\n this._positionChanged = true;\n this.base();\n },\n\n onPositionChange: function () {\n Garnish.requestAnimationFrame(() => {\n this.trigger('positionChange');\n this.settings.onPositionChange();\n });\n },\n\n onReturnHelpersToDraggees: function () {\n this._$firstRowCells.css('width', '');\n\n // If we were dragging the last elements on the page and ended up loading any additional elements in,\n // there could be a gap between the last draggee item and whatever now comes after it.\n // So remove the post-draggee elements and possibly load up the next batch.\n if (this.draggingLastElements && this.tableView.getMorePending()) {\n // Update the element index's record of how many items are actually visible\n this.tableView._totalVisible +=\n this.newDraggeeIndexes[0] - this.oldDraggeeIndexes[0];\n\n var $postDraggeeItems = this.$draggee.last().nextAll();\n\n if ($postDraggeeItems.length) {\n this.removeItems($postDraggeeItems);\n $postDraggeeItems.remove();\n this.tableView.maybeLoadMore();\n }\n }\n\n this.base();\n },\n\n /**\n * Returns the min and max levels that the draggee could occupy between\n * two given rows, or false if it’s not going to work out.\n */\n _getLevelBounds: function ($prevRow, $nextRow) {\n // Can't go any lower than the next row, if there is one\n if ($nextRow && $nextRow.length) {\n this._getLevelBounds._minLevel = $nextRow.data('level');\n } else {\n this._getLevelBounds._minLevel = 1;\n }\n\n // Can't go any higher than the previous row + 1\n if ($prevRow && $prevRow.length) {\n this._getLevelBounds._maxLevel = $prevRow.data('level') + 1;\n } else {\n this._getLevelBounds._maxLevel = 1;\n }\n\n // Does this structure have a max level?\n if (this.maxLevels) {\n // Make sure it's going to fit at all here\n if (\n this._getLevelBounds._minLevel != 1 &&\n this._getLevelBounds._minLevel + this._draggeeLevelDelta >\n this.maxLevels\n ) {\n return false;\n }\n\n // Limit the max level if we have to\n if (\n this._getLevelBounds._maxLevel + this._draggeeLevelDelta >\n this.maxLevels\n ) {\n this._getLevelBounds._maxLevel =\n this.maxLevels - this._draggeeLevelDelta;\n\n if (this._getLevelBounds._maxLevel < this._getLevelBounds._minLevel) {\n this._getLevelBounds._maxLevel = this._getLevelBounds._minLevel;\n }\n }\n }\n\n return {\n min: this._getLevelBounds._minLevel,\n max: this._getLevelBounds._maxLevel,\n };\n },\n\n /**\n * Determines the min and max possible levels at the current draggee's position.\n */\n _setTargetLevelBounds: function () {\n this._targetLevelBounds = this._getLevelBounds(\n this.$draggee.first().prev(),\n this.$draggee.last().next()\n );\n },\n\n /**\n * Determines the target level based on the current mouse position.\n */\n _updateIndent: function (forcePositionChange) {\n // Figure out the target level\n // ---------------------------------------------------------------------\n\n // How far has the cursor moved?\n this._updateIndent._mouseDist = this.realMouseX - this.mousedownX;\n\n // Flip that if this is RTL\n if (Craft.orientation === 'rtl') {\n this._updateIndent._mouseDist *= -1;\n }\n\n // What is that in indentation levels?\n this._updateIndent._indentationDist = Math.round(\n this._updateIndent._mouseDist / Craft.StructureTableSorter.LEVEL_INDENT\n );\n\n // Combine with the original level to get the new target level\n this._updateIndent._targetLevel =\n this._draggeeLevel + this._updateIndent._indentationDist;\n\n // Contain it within our min/max levels\n if (this._updateIndent._targetLevel < this._targetLevelBounds.min) {\n this._updateIndent._indentationDist +=\n this._targetLevelBounds.min - this._updateIndent._targetLevel;\n this._updateIndent._targetLevel = this._targetLevelBounds.min;\n } else if (\n this._updateIndent._targetLevel > this._targetLevelBounds.max\n ) {\n this._updateIndent._indentationDist -=\n this._updateIndent._targetLevel - this._targetLevelBounds.max;\n this._updateIndent._targetLevel = this._targetLevelBounds.max;\n }\n\n // Has the target level changed?\n if (\n this._targetLevel !==\n (this._targetLevel = this._updateIndent._targetLevel)\n ) {\n // Target level is changing, so update the ancestors\n this._updateAncestorsBeforeRepaint();\n }\n\n // Update the UI\n // ---------------------------------------------------------------------\n\n // How far away is the cursor from the exact target level distance?\n this._updateIndent._targetLevelMouseDiff =\n this._updateIndent._mouseDist -\n this._updateIndent._indentationDist *\n Craft.StructureTableSorter.LEVEL_INDENT;\n\n // What's the magnet impact of that?\n this._updateIndent._magnetImpact = Math.round(\n this._updateIndent._targetLevelMouseDiff / 15\n );\n\n // Put it on a leash\n if (\n Math.abs(this._updateIndent._magnetImpact) >\n Craft.StructureTableSorter.MAX_GIVE\n ) {\n this._updateIndent._magnetImpact =\n (this._updateIndent._magnetImpact > 0 ? 1 : -1) *\n Craft.StructureTableSorter.MAX_GIVE;\n }\n\n // Apply the new margin/width\n this._updateIndent._closestLevelMagnetIndent =\n this._getLevelIndent(this._targetLevel) +\n this._updateIndent._magnetImpact;\n this.helpers[0].css(\n 'margin-' + Craft.left,\n this._updateIndent._closestLevelMagnetIndent + this._helperMargin\n );\n this._$titleHelperCell.css(\n 'width',\n this._titleHelperCellOuterWidth -\n this._updateIndent._closestLevelMagnetIndent\n );\n },\n\n /**\n * Returns the indent size for a given level\n */\n _getLevelIndent: function (level) {\n return (level - 1) * Craft.StructureTableSorter.LEVEL_INDENT;\n },\n\n /**\n * Returns the base data that should be sent with StructureController Ajax requests.\n */\n _getAjaxBaseData: function ($row) {\n return {\n structureId: this.structureId,\n elementId: $row.data('id'),\n siteId: $row.find('.element:first').data('site-id'),\n };\n },\n\n /**\n * Returns a row's ancestor rows\n */\n _getAncestors: function ($row, targetLevel) {\n this._getAncestors._ancestors = [];\n\n if (targetLevel != 0) {\n this._getAncestors._level = targetLevel;\n this._getAncestors._$prevRow = $row.prev();\n\n while (this._getAncestors._$prevRow.length) {\n if (\n this._getAncestors._$prevRow.data('level') <\n this._getAncestors._level\n ) {\n this._getAncestors._ancestors.unshift(this._getAncestors._$prevRow);\n this._getAncestors._level =\n this._getAncestors._$prevRow.data('level');\n\n // Did we just reach the top?\n if (this._getAncestors._level == 0) {\n break;\n }\n }\n\n this._getAncestors._$prevRow = this._getAncestors._$prevRow.prev();\n }\n }\n\n return this._getAncestors._ancestors;\n },\n\n /**\n * Prepares to have the ancestors updated before the screen is repainted.\n */\n _updateAncestorsBeforeRepaint: function () {\n if (this._updateAncestorsFrame) {\n Garnish.cancelAnimationFrame(this._updateAncestorsFrame);\n }\n\n this._updateAncestorsFrame = Garnish.requestAnimationFrame(\n this._updateAncestors.bind(this)\n );\n },\n\n _updateAncestors: function () {\n this._updateAncestorsFrame = null;\n\n // Update the old ancestors\n // -----------------------------------------------------------------\n\n for (\n this._updateAncestors._i = 0;\n this._updateAncestors._i < this._ancestors.length;\n this._updateAncestors._i++\n ) {\n this._updateAncestors._$ancestor =\n this._ancestors[this._updateAncestors._i];\n\n // One less descendant now\n this._updateAncestors._$ancestor.data(\n 'descendants',\n this._updateAncestors._$ancestor.data('descendants') - 1\n );\n\n // Is it now childless?\n if (this._updateAncestors._$ancestor.data('descendants') == 0) {\n // Remove its toggle\n this._updateAncestors._$ancestor\n .find('> th > .toggle:first')\n .remove();\n }\n }\n\n // Update the new ancestors\n // -----------------------------------------------------------------\n\n this._updateAncestors._newAncestors = this._getAncestors(\n this.$targetItem,\n this._targetLevel\n );\n\n for (\n this._updateAncestors._i = 0;\n this._updateAncestors._i < this._updateAncestors._newAncestors.length;\n this._updateAncestors._i++\n ) {\n this._updateAncestors._$ancestor =\n this._updateAncestors._newAncestors[this._updateAncestors._i];\n\n // One more descendant now\n this._updateAncestors._$ancestor.data(\n 'descendants',\n this._updateAncestors._$ancestor.data('descendants') + 1\n );\n\n // Is this its first child?\n if (this._updateAncestors._$ancestor.data('descendants') == 1) {\n // Create its toggle\n const ancestorTitle = this._updateAncestors._$ancestor.data('title');\n $(\n '<button class=\"toggle expanded\" type=\"button\" aria-expanded=\"true\" title=\"' +\n Craft.t('app', 'Show/hide children') +\n '\" aria-label=\"' +\n Craft.t('app', 'Show {title} children', {title: ancestorTitle}) +\n '\"></button>'\n ).insertAfter(\n this._updateAncestors._$ancestor.find('> th .move:first')\n );\n }\n }\n\n this._ancestors = this._updateAncestors._newAncestors;\n\n delete this._updateAncestors._i;\n delete this._updateAncestors._$ancestor;\n delete this._updateAncestors._newAncestors;\n },\n },\n {\n HELPER_MARGIN: 0,\n LEVEL_INDENT: 44,\n MAX_GIVE: 22,\n\n defaults: {\n onPositionChange: $.noop,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Table Element Index View\n */\nCraft.TableElementIndexView = Craft.BaseElementIndexView.extend({\n $table: null,\n $tableCaption: null,\n $selectedSortHeader: null,\n $statusMessage: null,\n\n structureTableSort: null,\n\n _totalVisiblePostStructureTableDraggee: null,\n _morePendingPostStructureTableDraggee: false,\n\n _broadcastListener: null,\n\n getElementContainer: function () {\n // Save a reference to the table\n this.$table = this.$container.find('table:first');\n return this.$table.children('tbody:first');\n },\n\n afterInit: function () {\n // Set table caption\n this.$tableCaption = this.$table.find('caption');\n\n this.$statusMessage = this.$table.parent().find('[data-status-message]');\n\n // Set the sort header\n this.initTableHeaders();\n\n // Add callback for after elements are updated\n this.elementIndex.on('updateElements', () => {\n this._updateScreenReaderStatus();\n });\n\n // Create the Structure Table Sorter\n if (\n this.elementIndex.settings.context === 'index' &&\n this.elementIndex.getSelectedSortAttribute() === 'structure' &&\n Garnish.hasAttr(this.$table, 'data-structure-id')\n ) {\n this.structureTableSort = new Craft.StructureTableSorter(\n this,\n this.getAllElements()\n );\n } else {\n this.structureTableSort = null;\n }\n\n // Handle expand/collapse toggles for Structures\n if (this.elementIndex.getSelectedSortAttribute() === 'structure') {\n this.addListener(this.$elementContainer, 'click', function (ev) {\n var $target = $(ev.target);\n\n if ($target.hasClass('toggle')) {\n if (this._collapseElement($target) === false) {\n this._expandElement($target);\n }\n }\n });\n }\n\n // Set up the broadcast listener\n if (Craft.messageReceiver) {\n this._broadcastListener = (ev) => {\n if (ev.data.event === 'saveElement') {\n const $rows = this.$table.find(\n `> tbody > tr[data-id=\"${ev.data.id}\"]`\n );\n if ($rows.length) {\n const data = {\n elementType: this.elementIndex.elementType,\n source: this.elementIndex.sourceKey,\n id: ev.data.id,\n siteId: this.elementIndex.siteId,\n };\n Craft.sendActionRequest(\n 'POST',\n 'element-indexes/element-table-html',\n {data}\n ).then(({data}) => {\n for (let i = 0; i < $rows.length; i++) {\n const $row = $rows.eq(i);\n $row\n .find('> th[data-titlecell] .element')\n .replaceWith(data.elementHtml);\n for (let attribute in data.attributeHtml) {\n if (data.attributeHtml.hasOwnProperty(attribute)) {\n $row\n .find(`> td[data-attr=\"${attribute}\"]`)\n .html(data.attributeHtml[attribute]);\n }\n }\n }\n new Craft.ElementThumbLoader().load($rows);\n });\n }\n }\n };\n\n Craft.messageReceiver.addEventListener(\n 'message',\n this._broadcastListener\n );\n }\n },\n\n initTableHeaders: function () {\n const [selectedSortAttr] = this.elementIndex.getSortAttributeAndDirection();\n const $tableHeaders = this.$table\n .children('thead')\n .children()\n .children('[data-attribute]');\n\n for (let i = 0; i < $tableHeaders.length; i++) {\n const $header = $tableHeaders.eq(i);\n const attr = $header.attr('data-attribute');\n let sortValue = 'none';\n\n // Is this the selected sort attribute?\n if (attr === selectedSortAttr) {\n this.$selectedSortHeader = $header;\n const selectedSortDir = this.elementIndex.getSelectedSortDirection();\n sortValue = selectedSortDir === 'asc' ? 'ascending' : 'descending';\n $header.addClass('ordered ' + selectedSortDir);\n this.makeColumnSortable($header, true);\n } else {\n // Is this attribute sortable?\n if (this.elementIndex.getSortOption(attr)) {\n this.makeColumnSortable($header);\n }\n }\n\n $header.attr('aria-sort', sortValue);\n }\n },\n\n makeColumnSortable: function ($header, sorted = false) {\n $header.addClass('orderable');\n\n const headerHtml = $header.html();\n const $instructions = this.$tableCaption.find('[data-sort-instructions]');\n const $headerButton = $('<button/>', {\n id: `${this.elementIndex.idPrefix}-${$header.attr('data-attribute')}`,\n type: 'button',\n 'aria-pressed': 'false',\n }).html(headerHtml);\n\n if ($instructions.length) {\n $headerButton.attr('aria-describedby', $instructions.attr('id'));\n }\n\n if (sorted) {\n $headerButton.attr('aria-pressed', 'true');\n $headerButton.on('click', this._handleSelectedSortHeaderClick.bind(this));\n } else {\n $headerButton.on(\n 'click',\n this._handleUnselectedSortHeaderClick.bind(this)\n );\n }\n\n $header.empty().append($headerButton);\n },\n\n isVerticalList: function () {\n return true;\n },\n\n getTotalVisible: function () {\n if (this._isStructureTableDraggingLastElements()) {\n return this._totalVisiblePostStructureTableDraggee;\n } else {\n return this._totalVisible;\n }\n },\n\n setTotalVisible: function (totalVisible) {\n if (this._isStructureTableDraggingLastElements()) {\n this._totalVisiblePostStructureTableDraggee = totalVisible;\n } else {\n this._totalVisible = totalVisible;\n }\n },\n\n getMorePending: function () {\n if (this._isStructureTableDraggingLastElements()) {\n return this._morePendingPostStructureTableDraggee;\n } else {\n return this._morePending;\n }\n },\n\n setMorePending: function (morePending) {\n if (this._isStructureTableDraggingLastElements()) {\n this._morePendingPostStructureTableDraggee = morePending;\n } else {\n this._morePending = this._morePendingPostStructureTableDraggee =\n morePending;\n }\n },\n\n getLoadMoreParams: function () {\n var params = this.base();\n\n // If we are dragging the last elements on the page,\n // tell the controller to only load elements positioned after the draggee.\n if (this._isStructureTableDraggingLastElements()) {\n params.criteria.positionedAfter =\n this.structureTableSort.$targetItem.data('id');\n }\n\n return params;\n },\n\n appendElements: function ($newElements) {\n this.base($newElements);\n\n if (this.structureTableSort) {\n this.structureTableSort.addItems($newElements);\n }\n\n Craft.cp.updateResponsiveTables();\n },\n\n _collapseElement: function ($toggle, force) {\n if (!force && !$toggle.hasClass('expanded')) {\n return false;\n }\n\n $toggle.removeClass('expanded');\n $toggle.attr('aria-expanded', 'false');\n\n // Find and remove the descendant rows\n var $row = $toggle.parent().parent(),\n id = $row.data('id'),\n level = $row.data('level'),\n $nextRow = $row.next();\n\n while ($nextRow.length) {\n if (!Garnish.hasAttr($nextRow, 'data-spinnerrow')) {\n if ($nextRow.data('level') <= level) {\n break;\n }\n\n if (this.elementSelect) {\n this.elementSelect.removeItems($nextRow);\n }\n\n if (this.structureTableSort) {\n this.structureTableSort.removeItems($nextRow);\n }\n\n this._totalVisible--;\n }\n\n var $nextNextRow = $nextRow.next();\n $nextRow.remove();\n $nextRow = $nextNextRow;\n }\n\n // Remember that this row should be collapsed\n if (!this.elementIndex.instanceState.collapsedElementIds) {\n this.elementIndex.instanceState.collapsedElementIds = [];\n }\n\n this.elementIndex.instanceState.collapsedElementIds.push(id);\n this.elementIndex.setInstanceState(\n 'collapsedElementIds',\n this.elementIndex.instanceState.collapsedElementIds\n );\n\n // Bottom of the index might be viewable now\n this.maybeLoadMore();\n },\n\n _expandElement: function ($toggle, force) {\n if (!force && $toggle.hasClass('expanded')) {\n return false;\n }\n\n $toggle.addClass('expanded');\n $toggle.attr('aria-expanded', 'true');\n\n // Remove this element from our list of collapsed elements\n if (this.elementIndex.instanceState.collapsedElementIds) {\n var $row = $toggle.parent().parent(),\n id = $row.data('id'),\n index = $.inArray(\n id,\n this.elementIndex.instanceState.collapsedElementIds\n );\n\n if (index !== -1) {\n this.elementIndex.instanceState.collapsedElementIds.splice(index, 1);\n this.elementIndex.setInstanceState(\n 'collapsedElementIds',\n this.elementIndex.instanceState.collapsedElementIds\n );\n\n // Add a temporary row\n var $spinnerRow = this._createSpinnerRowAfter($row);\n\n // Load the nested elements\n let data = $.extend(true, {}, this.settings.params);\n data.criteria.descendantOf = id;\n\n Craft.sendActionRequest('POST', this.settings.loadMoreElementsAction, {\n data,\n })\n .then((response) => {\n // Do we even care about this anymore?\n if (!$spinnerRow.parent().length) {\n return;\n }\n\n let $newElements = $(response.data.html);\n\n // Are there more descendants we didn't get in this batch?\n let totalVisible = this._totalVisible + $newElements.length;\n let morePending =\n this.settings.batchSize &&\n $newElements.length === this.settings.batchSize;\n\n if (morePending) {\n // Remove all the elements after it\n let $nextRows = $spinnerRow.nextAll();\n\n if (this.elementSelect) {\n this.elementSelect.removeItems($nextRows);\n }\n\n if (this.structureTableSort) {\n this.structureTableSort.removeItems($nextRows);\n }\n\n $nextRows.remove();\n totalVisible -= $nextRows.length;\n } else {\n // Maintain the current 'more' status\n morePending = this._morePending;\n }\n\n $spinnerRow.replaceWith($newElements);\n this.thumbLoader.load($newElements);\n\n if (this.elementIndex.actions || this.settings.selectable) {\n this.elementSelect.addItems(\n $newElements.filter(':not(.disabled)')\n );\n this.elementIndex.updateActionTriggers();\n }\n\n if (this.structureTableSort) {\n this.structureTableSort.addItems($newElements);\n }\n\n Craft.appendHeadHtml(response.data.headHtml);\n Craft.appendBodyHtml(response.data.bodyHtml);\n Craft.cp.updateResponsiveTables();\n\n this.setTotalVisible(totalVisible);\n this.setMorePending(morePending);\n\n // Is there room to load more right now?\n this.maybeLoadMore();\n })\n .catch((e) => {\n Craft.cp.displayError();\n if (!$spinnerRow.parent().length) {\n return;\n }\n });\n }\n }\n },\n\n _createSpinnerRowAfter: function ($row) {\n return $(\n '<tr data-spinnerrow>' +\n '<td class=\"centeralign\" colspan=\"' +\n $row.children().length +\n '\">' +\n '<div class=\"spinner\"/>' +\n '</td>' +\n '</tr>'\n ).insertAfter($row);\n },\n\n _isStructureTableDraggingLastElements: function () {\n return (\n this.structureTableSort &&\n this.structureTableSort.dragging &&\n this.structureTableSort.draggingLastElements\n );\n },\n\n _handleSelectedSortHeaderClick: function (ev) {\n var $header = $(ev.currentTarget).closest('th');\n\n if ($header.hasClass('loading')) {\n return;\n }\n\n // Reverse the sort direction\n var selectedSortDir = this.elementIndex.getSelectedSortDirection(),\n newSortDir = selectedSortDir === 'asc' ? 'desc' : 'asc';\n\n this.elementIndex.setSelectedSortDirection(newSortDir);\n this._handleSortHeaderClick(ev, $header);\n },\n\n _handleUnselectedSortHeaderClick: function (ev) {\n var $header = $(ev.currentTarget).closest('th');\n\n if ($header.hasClass('loading')) {\n return;\n }\n\n var attr = $header.attr('data-attribute');\n\n this.elementIndex.setSelectedSortAttribute(attr);\n this._handleSortHeaderClick(ev, $header);\n },\n\n _handleSortHeaderClick: function (ev, $header) {\n if (this.$selectedSortHeader) {\n this.$selectedSortHeader.removeClass('ordered asc desc');\n }\n\n $header.addClass('ordered loading');\n this.elementIndex.updateElements();\n\n // No need for two spinners\n this.elementIndex.setIndexAvailable();\n },\n\n _updateScreenReaderStatus: function () {\n const attribute = this.elementIndex.getSelectedSortAttribute();\n const direction =\n this.elementIndex.getSelectedSortDirection() === 'asc'\n ? Craft.t('app', 'Ascending')\n : Craft.t('app', 'Descending');\n const label = this.elementIndex.getSortLabel(attribute);\n\n if (!attribute && !direction && !label) return;\n\n const message = Craft.t(\n 'app',\n 'Table {name} sorted by {attribute}, {direction}',\n {\n name: this.$table.attr('data-name'),\n attribute: label,\n direction: direction,\n }\n );\n\n this.$statusMessage.empty();\n this.$statusMessage.text(message);\n },\n\n _updateTableAttributes: function ($element, tableAttributes) {\n var $tr = $element.closest('tr');\n\n for (var attr in tableAttributes) {\n if (!tableAttributes.hasOwnProperty(attr)) {\n continue;\n }\n\n $tr\n .children('[data-attr=\"' + attr + '\"]:first')\n .html(tableAttributes[attr]);\n }\n },\n\n destroy: function () {\n if (this._broadcastListener) {\n Craft.messageReceiver.removeEventListener(\n 'message',\n this._broadcastListener\n );\n delete this._broadcastListener;\n }\n\n this.base();\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Tab manager\n */\nCraft.Tabs = Garnish.Base.extend({\n $container: null,\n $tablist: null,\n $menuBtn: null,\n $tabs: null,\n $firstTab: null,\n $lastTab: null,\n $selectedTab: null,\n $focusableTab: null,\n menu: null,\n\n init: function (container) {\n this.$container = $(container);\n this.$tablist = this.$container.find('> [role=\"tablist\"]:first');\n this.$tabs = this.$tablist.find('> [role=\"tab\"]');\n this.$firstTab = this.$tabs.first();\n this.$lastTab = this.$tabs.last();\n this.$selectedTab = this.$tabs.filter('.sel:first');\n this.$focusableTab = this.$tabs.filter('[tabindex=0]:first');\n this.$menuBtn = this.$container.find('> .menubtn:first').menubtn();\n this.menu = this.$menuBtn.data('menubtn').menu;\n\n // Is there already a tab manager?\n if (this.$container.data('tabs')) {\n console.warn('Double-instantiating a tab manager on an element');\n this.$container.data('tabs').destroy();\n }\n\n this.$container.data('tabs', this);\n\n for (let i = 0; i < this.$tabs.length; i++) {\n const $a = this.$tabs.eq(i);\n\n // Does it link to an anchor?\n const href = $a.attr('href');\n if (href && href.charAt(0) === '#') {\n this.addListener($a, 'keydown', (ev) => {\n if ([Garnish.SPACE_KEY, Garnish.RETURN_KEY].includes(ev.keyCode)) {\n ev.preventDefault();\n this.selectTab(ev.currentTarget);\n }\n });\n this.addListener($a, 'click', (ev) => {\n ev.preventDefault();\n this.selectTab(ev.currentTarget);\n });\n }\n\n this.addListener($a, 'keydown', (ev) => {\n let $tab;\n if (\n [Garnish.LEFT_KEY, Garnish.RIGHT_KEY].includes(ev.keyCode) &&\n $.contains(this.$tablist[0], ev.currentTarget)\n ) {\n if (\n ev.keyCode ===\n (Craft.orientation === 'ltr' ? Garnish.LEFT_KEY : Garnish.RIGHT_KEY)\n ) {\n $tab = $(ev.currentTarget).prevAll(\n '[role=\"tab\"]:not(.hidden):first'\n );\n $tab = $tab.length ? $tab : this.$lastTab;\n } else {\n $tab = $(ev.currentTarget).nextAll(\n '[role=\"tab\"]:not(.hidden):first'\n );\n $tab = $tab.length ? $tab : this.$firstTab;\n }\n } else if (\n ev.keyCode === Garnish.HOME_KEY ||\n ev.keyCode === Garnish.END_KEY\n ) {\n $tab =\n ev.keyCode === Garnish.HOME_KEY ? this.$firstTab : this.$lastTab;\n }\n\n if ($tab) {\n ev.preventDefault();\n this.makeTabFocusable($tab);\n $tab.focus();\n this.scrollToTab($tab);\n }\n });\n }\n\n this.updateMenuBtn();\n\n Garnish.$win.on('resize', () => {\n this.updateMenuBtn();\n });\n\n // Prevent menu options from updating the URL\n this.menu.$options.on('click', (ev) => {\n const $option = $(ev.currentTarget);\n const href = $option.attr('href');\n if (href && href.charAt(0) === '#') {\n ev.preventDefault();\n }\n });\n\n this.menu.on('optionselect', (ev) => {\n this.selectTab($(ev.selectedOption).data('id'));\n });\n },\n\n selectTab: function (tab) {\n const $tab = this._getTab(tab);\n\n if ($tab[0] === this.$selectedTab[0]) {\n return;\n }\n\n this.deselectTab();\n this.$selectedTab = $tab.addClass('sel').attr('aria-selected', 'true');\n this.makeTabFocusable($tab);\n $tab.focus();\n this.scrollToTab($tab);\n\n this.menu.$options.removeClass('sel');\n this.menu.$options.filter(`[data-id=\"${$tab.data('id')}\"]`).addClass('sel');\n\n this.trigger('selectTab', {\n $tab: $tab,\n });\n\n $('#content').trigger('scroll');\n },\n\n deselectTab: function () {\n const $tab = this.$selectedTab\n .removeClass('sel')\n .attr('aria-selected', 'false');\n this.$selectedTab = null;\n\n this.trigger('deselectTab', {\n $tab: $tab,\n });\n },\n\n makeTabFocusable: function (tab) {\n const $tab = this._getTab(tab);\n\n if ($tab[0] === this.$focusableTab[0]) {\n return;\n }\n\n this.$focusableTab.attr('tabindex', '-1');\n this.$focusableTab = $tab.attr('tabindex', '0');\n },\n\n scrollToTab: function (tab) {\n const $tab = this._getTab(tab);\n const scrollLeft = this.$tablist.scrollLeft();\n const tabOffset = $tab.offset().left;\n const elemScrollOffset = tabOffset - this.$tablist.offset().left;\n let targetScrollLeft = false;\n\n // Is the tab hidden on the left?\n if (elemScrollOffset < 0) {\n targetScrollLeft = scrollLeft + elemScrollOffset - 24;\n } else {\n const tabWidth = $tab.outerWidth();\n const ulWidth = this.$tablist.prop('clientWidth');\n\n // Is it hidden to the right?\n if (elemScrollOffset + tabWidth > ulWidth) {\n targetScrollLeft =\n scrollLeft + (elemScrollOffset - (ulWidth - tabWidth)) + 24;\n }\n }\n\n if (targetScrollLeft !== false) {\n this.$tablist.scrollLeft(targetScrollLeft);\n }\n },\n\n updateMenuBtn: function () {\n if (\n Math.floor(this.$tablist.prop('scrollWidth') - 48) >\n this.$container.prop('clientWidth')\n ) {\n this.$tablist.addClass('scrollable');\n this.$menuBtn.removeClass('hidden');\n } else {\n this.$tablist.removeClass('scrollable');\n this.$menuBtn.addClass('hidden');\n }\n },\n\n _getTab: function (tab) {\n if (tab instanceof jQuery) {\n return tab;\n }\n\n if (tab instanceof HTMLElement) {\n return $(tab);\n }\n\n if (typeof tab !== 'string') {\n throw 'Invalid tab ID';\n }\n\n const $tab = this.$tabs.filter(`[data-id=\"${tab}\"]`);\n\n if (!$tab.length) {\n throw `Invalid tab ID: ${tab}`;\n }\n\n return $tab;\n },\n\n destroy: function () {\n this.$container.removeData('tabs');\n this.base();\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Tag select input\n */\nCraft.TagSelectInput = Craft.BaseElementSelectInput.extend(\n {\n searchTimeout: null,\n searchMenu: null,\n\n $container: null,\n $elementsContainer: null,\n $elements: null,\n $addTagInput: null,\n $spinner: null,\n\n _ignoreBlur: false,\n\n init: function (settings) {\n // Normalize the settings\n // ---------------------------------------------------------------------\n\n // Are they still passing in a bunch of arguments?\n if (!$.isPlainObject(settings)) {\n // Loop through all of the old arguments and apply them to the settings\n var normalizedSettings = {},\n args = ['id', 'name', 'tagGroupId', 'sourceElementId'];\n\n for (var i = 0; i < args.length; i++) {\n if (typeof arguments[i] !== 'undefined') {\n normalizedSettings[args[i]] = arguments[i];\n } else {\n break;\n }\n }\n\n settings = normalizedSettings;\n }\n\n this.base($.extend({}, Craft.TagSelectInput.defaults, settings));\n\n this.$addTagInput = this.$container.children('.add').children('.text');\n this.$spinner = this.$addTagInput.next();\n\n this.addListener(this.$addTagInput, 'input', () => {\n if (this.searchTimeout) {\n clearTimeout(this.searchTimeout);\n }\n\n this.searchTimeout = setTimeout(this.searchForTags.bind(this), 500);\n });\n\n this.addListener(this.$addTagInput, 'keydown', function (ev) {\n if (ev.keyCode === Garnish.RETURN_KEY) {\n ev.preventDefault();\n }\n\n let $option;\n\n switch (ev.keyCode) {\n case Garnish.RETURN_KEY: {\n ev.preventDefault();\n if (this.searchMenu) {\n this.selectTag(this.searchMenu.$options.filter('.hover'));\n }\n return;\n }\n\n case Garnish.DOWN_KEY: {\n ev.preventDefault();\n if (this.searchMenu) {\n let $hoverOption = this.searchMenu.$options.filter('.hover');\n if ($hoverOption.length) {\n let $nextOption = $hoverOption\n .parent()\n .nextAll()\n .find('a:not(.disabled)')\n .first();\n if ($nextOption.length) {\n this.focusOption($nextOption);\n }\n } else {\n this.focusOption(this.searchMenu.$options.eq(0));\n }\n }\n return;\n }\n\n case Garnish.UP_KEY: {\n ev.preventDefault();\n if (this.searchMenu) {\n let $hoverOption = this.searchMenu.$options.filter('.hover');\n if ($hoverOption.length) {\n let $prevOption = $hoverOption\n .parent()\n .prevAll()\n .find('a:not(.disabled)')\n .last();\n if ($prevOption.length) {\n this.focusOption($prevOption);\n }\n } else {\n this.focusOption(\n this.searchMenu.$options.eq(\n this.searchMenu.$options.length - 1\n )\n );\n }\n }\n return;\n }\n }\n });\n\n this.addListener(this.$addTagInput, 'focus', function () {\n if (this.searchMenu) {\n this.searchMenu.show();\n }\n });\n\n this.addListener(this.$addTagInput, 'blur', function () {\n if (this._ignoreBlur) {\n this._ignoreBlur = false;\n return;\n }\n\n setTimeout(() => {\n if (this.searchMenu) {\n this.searchMenu.hide();\n }\n }, 1);\n });\n },\n\n focusOption: function ($option) {\n this.searchMenu.$options.removeClass('hover');\n $option.addClass('hover');\n this.searchMenu.$menuList.attr(\n 'aria-activedescendant',\n $option.attr('id')\n );\n },\n\n // No \"add\" button\n getAddElementsBtn: $.noop,\n\n getElementSortAxis: function () {\n return null;\n },\n\n searchForTags: function () {\n if (this.searchMenu) {\n this.killSearchMenu();\n }\n\n var val = this.$addTagInput.val();\n\n if (val) {\n this.$spinner.removeClass('hidden');\n\n var excludeIds = [];\n\n for (var i = 0; i < this.$elements.length; i++) {\n var id = $(this.$elements[i]).data('id');\n\n if (id) {\n excludeIds.push(id);\n }\n }\n\n if (this.settings.sourceElementId) {\n excludeIds.push(this.settings.sourceElementId);\n }\n\n var data = {\n search: this.$addTagInput.val(),\n tagGroupId: this.settings.tagGroupId,\n excludeIds: excludeIds,\n };\n\n Craft.sendActionRequest('POST', 'tags/search-for-tags', {data})\n .then((response) => {\n if (this.searchMenu) {\n this.killSearchMenu();\n }\n this.$spinner.addClass('hidden');\n var $menu = $('<div class=\"menu tagmenu\"/>').appendTo(Garnish.$bod),\n $ul = $('<ul/>').appendTo($menu);\n\n var $li;\n\n for (var i = 0; i < response.data.tags.length; i++) {\n $li = $('<li/>').appendTo($ul);\n\n $('<a data-icon=\"tag\"/>')\n .appendTo($li)\n .text(response.data.tags[i].title)\n .data('id', response.data.tags[i].id)\n .addClass(response.data.tags[i].exclude ? 'disabled' : '');\n }\n\n if (!response.data.exactMatch) {\n $li = $('<li/>').appendTo($ul);\n $('<a data-icon=\"plus\"/>').appendTo($li).text(data.search);\n }\n\n $ul.find('a:not(.disabled):first').addClass('hover');\n\n this.searchMenu = new Garnish.Menu($menu, {\n attachToElement: this.$addTagInput,\n onOptionSelect: this.selectTag.bind(this),\n });\n\n this.addListener($menu, 'mousedown', () => {\n this._ignoreBlur = true;\n });\n\n this.searchMenu.show();\n })\n .catch(({response}) => {\n // Just in case\n if (this.searchMenu) {\n this.killSearchMenu();\n }\n\n this.$spinner.addClass('hidden');\n });\n } else {\n this.$spinner.addClass('hidden');\n }\n },\n\n selectTag: function (option) {\n var $option = $(option);\n\n if ($option.hasClass('disabled')) {\n return;\n }\n\n var id = $option.data('id');\n var title = $option.text();\n\n var $element = $('<div/>', {\n class: 'element small removable',\n 'data-id': id,\n 'data-site-id': this.settings.targetSiteId,\n 'data-label': title,\n 'data-editable': '1',\n }).appendTo(this.$elementsContainer);\n\n var $input = $('<input/>', {\n type: 'hidden',\n name: this.settings.name + '[]',\n value: id,\n }).appendTo($element);\n\n $('<button/>', {\n class: 'delete icon',\n title: Craft.t('app', 'Remove'),\n type: 'button',\n 'aria-label': Craft.t('app', 'Remove {label}', {\n label: title,\n }),\n }).appendTo($element);\n\n var $titleContainer = $('<div/>', {\n class: 'label',\n }).appendTo($element);\n\n $('<span/>', {\n class: 'title',\n text: title,\n }).appendTo($titleContainer);\n\n var margin = -($element.outerWidth() + 10);\n this.$addTagInput.css('margin-' + Craft.left, margin + 'px');\n\n var animateCss = {};\n animateCss['margin-' + Craft.left] = 0;\n this.$addTagInput.velocity(animateCss, 'fast');\n\n this.$elements = this.$elements.add($element);\n\n this.addElements($element);\n\n this.killSearchMenu();\n this.$addTagInput.val('');\n this.$addTagInput.trigger('focus');\n\n if (!id) {\n // We need to create the tag first\n $element.addClass('loading disabled');\n\n var data = {\n groupId: this.settings.tagGroupId,\n title: title,\n };\n\n Craft.sendActionRequest('POST', 'tags/create-tag', {data})\n .then((response) => {\n $element.attr('data-id', response.data.id);\n $input.val(response.data.id);\n\n $element.removeClass('loading disabled');\n })\n .catch(({response}) => {\n this.removeElement($element);\n Craft.cp.displayError(Craft.t('app', 'A server error occurred.'));\n });\n }\n },\n\n killSearchMenu: function () {\n this.searchMenu.hide();\n this.searchMenu.destroy();\n this.searchMenu = null;\n },\n },\n {\n defaults: {\n tagGroupId: null,\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Thumb Element Index View\n */\nCraft.ThumbsElementIndexView = Craft.BaseElementIndexView.extend({\n getElementContainer: function () {\n return this.$container.children('ul');\n },\n});\n","/** global: Craft */\n/** global: Garnish */\nCraft.ui = {\n createButton: function (config) {\n const $btn = $('<button/>', {\n type: config.type || 'button',\n class: 'btn',\n });\n if (config.id) {\n $btn.attr('id', config.id);\n }\n if (config.class) {\n $btn.addClass(config.class);\n }\n if (config.ariaLabel) {\n $btn.attr('aria-label', config.ariaLabel);\n }\n if (config.role) {\n $btn.attr('role', config.role);\n }\n if (config.html) {\n $btn.html(config.html);\n } else if (config.label) {\n $btn.append($('<div class=\"label\"/>').text(config.label));\n } else {\n $btn.addClass('btn-empty');\n }\n if (config.toggle) {\n $btn.attr('aria-expanded', 'false');\n }\n if (config.controls) {\n $btn.attr('aria-controls', config.controls);\n }\n if (config.spinner) {\n $btn.append($('<div class=\"spinner spinner-absolute\"/>'));\n }\n return $btn;\n },\n\n createSubmitButton: function (config) {\n const $btn = this.createButton(\n Object.assign({}, config, {\n type: 'submit',\n label: config.label || Craft.t('app', 'Submit'),\n })\n );\n $btn.addClass('submit');\n return $btn;\n },\n\n createTextInput: function (config) {\n config = $.extend(\n {\n autocomplete: false,\n },\n config\n );\n var $input = $('<input/>', {\n attr: {\n class: 'text',\n type: config.type || 'text',\n inputmode: config.inputmode,\n id: config.id,\n size: config.size,\n name: config.name,\n value: config.value,\n maxlength: config.maxlength,\n autofocus: this.getAutofocusValue(config.autofocus),\n autocomplete:\n typeof config.autocomplete === 'boolean'\n ? config.autocomplete\n ? 'on'\n : 'off'\n : config.autocomplete,\n disabled: this.getDisabledValue(config.disabled),\n readonly: config.readonly,\n title: config.title,\n placeholder: config.placeholder,\n step: config.step,\n min: config.min,\n max: config.max,\n },\n });\n\n if (config.class) {\n $input.addClass(config.class);\n }\n if (config.placeholder) {\n $input.addClass('nicetext');\n }\n if (config.type === 'password') {\n $input.addClass('password');\n }\n if (config.disabled) {\n $input.addClass('disabled');\n }\n if (!config.size) {\n $input.addClass('fullwidth');\n }\n\n if (config.showCharsLeft && config.maxlength) {\n $input\n .attr('data-show-chars-left')\n .css(\n 'padding-' + (Craft.orientation === 'ltr' ? 'right' : 'left'),\n 7.2 * config.maxlength.toString().length + 14 + 'px'\n );\n }\n\n if (config.placeholder || config.showCharsLeft) {\n new Garnish.NiceText($input);\n }\n\n if (config.type === 'password') {\n return $('<div class=\"passwordwrapper\"/>').append($input);\n } else {\n return $input;\n }\n },\n\n createTextField: function (config) {\n if (!config.id) {\n config.id = 'text' + Math.floor(Math.random() * 1000000000);\n }\n return this.createField(this.createTextInput(config), config);\n },\n\n createCopyTextInput: function (config) {\n let id = config.id || 'copytext' + Math.floor(Math.random() * 1000000000);\n let buttonId = config.buttonId || `${id}-btn`;\n\n let $container = $('<div/>', {\n class: 'copytext',\n });\n\n let $input = this.createTextInput(\n $.extend({}, config, {\n readonly: true,\n })\n ).appendTo($container);\n\n let $btn = $('<button/>', {\n type: 'button',\n id: buttonId,\n class: 'btn',\n 'data-icon': 'clipboard',\n title: Craft.t('app', 'Copy to clipboard'),\n 'aria-label': Craft.t('app', 'Copy to clipboard'),\n }).appendTo($container);\n\n $btn.on('click', () => {\n $input[0].select();\n document.execCommand('copy');\n Craft.cp.displayNotice(Craft.t('app', 'Copied to clipboard.'));\n $container.trigger('copy');\n $input[0].setSelectionRange(0, 0);\n });\n\n return $container;\n },\n\n createCopyTextBtn: function (config) {\n let id = config.id || 'copytext' + Math.floor(Math.random() * 1000000000);\n let value = config.value;\n\n let $btn = $('<div/>', {\n id,\n class: 'copytextbtn',\n role: 'button',\n title: Craft.t('app', 'Copy to clipboard'),\n 'aria-label': Craft.t('app', 'Copy to clipboard'),\n tabindex: '0',\n });\n\n if (config.class) {\n $btn.addClass(config.class);\n }\n\n let $input = $('<input/>', {\n value,\n readonly: true,\n size: value.length,\n tabindex: '-1',\n }).appendTo($btn);\n\n let $icon = $('<span/>', {\n 'data-icon': 'clipboard',\n 'aria-hidden': 'true',\n }).appendTo($btn);\n\n const copyValue = function () {\n $input[0].select();\n document.execCommand('copy');\n Craft.cp.displayNotice(Craft.t('app', 'Copied to clipboard.'));\n $btn.trigger('copy');\n $input[0].setSelectionRange(0, 0);\n $btn.focus();\n };\n\n $btn.on('click', () => {\n copyValue();\n });\n\n $btn.on('keydown', (ev) => {\n if (ev.keyCode === Garnish.SPACE_KEY) {\n copyValue();\n ev.preventDefault();\n }\n });\n\n return $btn;\n },\n\n createCopyTextField: function (config) {\n if (!config.id) {\n config.id = 'copytext' + Math.floor(Math.random() * 1000000000);\n }\n return this.createField(this.createCopyTextInput(config), config);\n },\n\n createCopyTextPrompt: function (config) {\n let $container = $('<div/>', {\n class: 'modal fitted',\n });\n let $body = $('<div/>', {\n class: 'body',\n }).appendTo($container);\n this.createCopyTextField(\n $.extend(\n {\n size: Math.max(Math.min(config.value.length, 50), 25),\n },\n config\n )\n ).appendTo($body);\n\n const $label = $body.find('label');\n\n // Provide accessible name for modal dialog\n if ($label.length > 0 && $label.attr('id')) {\n $container.attr('aria-labelledby', $label.attr('id'));\n }\n\n let modal = new Garnish.Modal($container, {\n closeOtherModals: false,\n });\n $container.on('copy', () => {\n modal.hide();\n });\n return $container;\n },\n\n createTextarea: function (config) {\n var $textarea = $('<textarea/>', {\n class: 'text',\n rows: config.rows || 2,\n cols: config.cols || 50,\n id: config.id,\n name: config.name,\n maxlength: config.maxlength,\n autofocus: config.autofocus && !Garnish.isMobileBrowser(true),\n disabled: !!config.disabled,\n placeholder: config.placeholder,\n html: config.value,\n });\n\n if (config.showCharsLeft) {\n $textarea.attr('data-show-chars-left', '');\n }\n\n if (config.class) {\n $textarea.addClass(config.class);\n }\n\n if (!config.size) {\n $textarea.addClass('fullwidth');\n }\n\n return $textarea;\n },\n\n createTextareaField: function (config) {\n if (!config.id) {\n config.id = 'textarea' + Math.floor(Math.random() * 1000000000);\n }\n return this.createField(this.createTextarea(config), config);\n },\n\n createSelect: function (config) {\n var $container = $('<div/>', {\n class: 'select',\n });\n\n if (config.class) {\n $container.addClass(config.class);\n }\n\n var $select = $('<select/>', {\n id: config.id,\n name: config.name,\n autofocus: config.autofocus && Garnish.isMobileBrowser(true),\n disabled: config.disabled,\n 'data-target-prefix': config.targetPrefix,\n 'aria-labelledby': config.labelledBy,\n }).appendTo($container);\n\n // Normalize the options into an array\n if ($.isPlainObject(config.options)) {\n let options = [];\n for (var key in config.options) {\n if (!config.options.hasOwnProperty(key)) {\n continue;\n }\n let option = config.options[key];\n if ($.isPlainObject(option)) {\n if (typeof option.optgroup !== 'undefined') {\n options.push(option);\n } else {\n options.push({\n label: option.label,\n value: typeof option.value !== 'undefined' ? option.value : key,\n disabled:\n typeof option.disabled !== 'undefined'\n ? option.disabled\n : false,\n });\n }\n } else {\n options.push({\n label: option,\n value: key,\n });\n }\n }\n config.options = options;\n }\n\n var $optgroup = null;\n\n for (let i = 0; i < config.options.length; i++) {\n let option = config.options[i];\n\n // Starting a new <optgroup>?\n if (typeof option.optgroup !== 'undefined') {\n $optgroup = $('<optgroup/>', {\n label: option.label,\n }).appendTo($select);\n } else {\n $('<option/>', {\n value: option.value,\n selected: option.value == config.value,\n disabled:\n typeof option.disabled !== 'undefined' ? option.disabled : false,\n html: option.label,\n }).appendTo($optgroup || $select);\n }\n }\n\n if (config.toggle) {\n $select.addClass('fieldtoggle');\n new Craft.FieldToggle($select);\n }\n\n return $container;\n },\n\n createSelectField: function (config) {\n if (!config.id) {\n config.id = 'select' + Math.floor(Math.random() * 1000000000);\n }\n return this.createField(this.createSelect(config), config);\n },\n\n createCheckbox: function (config) {\n var id = config.id || 'checkbox' + Math.floor(Math.random() * 1000000000);\n\n var $input = $('<input/>', {\n type: 'checkbox',\n value: typeof config.value !== 'undefined' ? config.value : '1',\n id: id,\n class: 'checkbox',\n name: config.name,\n checked: config.checked ? 'checked' : null,\n autofocus: this.getAutofocusValue(config.autofocus),\n disabled: this.getDisabledValue(config.disabled),\n 'data-target': config.toggle,\n 'data-reverse-target': config.reverseToggle,\n });\n\n if (config.class) {\n $input.addClass(config.class);\n }\n\n if (config.toggle || config.reverseToggle) {\n $input.addClass('fieldtoggle');\n new Craft.FieldToggle($input);\n }\n\n var $label = $('<label/>', {\n for: id,\n html: config.label,\n });\n\n // Should we include a hidden input first?\n if (\n config.name &&\n (config.name.length < 3 || config.name.slice(-2) !== '[]')\n ) {\n return $([\n $('<input/>', {\n type: 'hidden',\n name: config.name,\n value: '',\n })[0],\n $input[0],\n $label[0],\n ]);\n } else {\n return $([$input[0], $label[0]]);\n }\n },\n\n createCheckboxField: function (config) {\n if (!config.id) {\n config.id = 'checkbox' + Math.floor(Math.random() * 1000000000);\n }\n\n var $field = $('<div class=\"field checkboxfield\"/>', {\n id: `${config.id}-field`,\n });\n\n if (config.first) {\n $field.addClass('first');\n }\n if (config.instructions) {\n $field.addClass('has-instructions');\n }\n\n this.createCheckbox(config).appendTo($field);\n\n if (config.instructions) {\n $('<div class=\"instructions\"/>')\n .text(config.instructions)\n .appendTo($field);\n }\n\n return $field;\n },\n\n createCheckboxSelect: function (config) {\n var $container = $('<fieldset class=\"checkbox-select\"/>');\n\n if (config.class) {\n $container.addClass(config.class);\n }\n\n var allValue, allChecked;\n\n if (config.showAllOption) {\n allValue = config.allValue || '*';\n allChecked = config.values == allValue;\n\n // Create the \"All\" checkbox\n $('<div/>')\n .appendTo($container)\n .append(\n this.createCheckbox({\n id: config.id,\n class: 'all',\n label: '<b>' + (config.allLabel || Craft.t('app', 'All')) + '</b>',\n name: config.name,\n value: allValue,\n checked: allChecked,\n autofocus: config.autofocus,\n })\n );\n } else {\n allChecked = false;\n }\n\n // Create the actual options\n for (var i = 0; i < config.options.length; i++) {\n var option = config.options[i];\n\n if (option.value == allValue) {\n continue;\n }\n\n $('<div/>')\n .appendTo($container)\n .append(\n this.createCheckbox({\n label: option.label,\n name: config.name ? config.name + '[]' : null,\n value: option.value,\n checked: allChecked || (config.values || []).includes(option.value),\n disabled: allChecked,\n })\n );\n }\n\n new Garnish.CheckboxSelect($container);\n\n return $container;\n },\n\n createCheckboxSelectField: function (config) {\n config.fieldset = true;\n if (!config.id) {\n config.id = 'checkboxselect' + Math.floor(Math.random() * 1000000000);\n }\n return this.createField(this.createCheckboxSelect(config), config);\n },\n\n createLightswitch: function (config) {\n var value = config.value || '1';\n var indeterminateValue = config.indeterminateValue || '-';\n\n var $container = $('<button/>', {\n type: 'button',\n class: 'lightswitch',\n 'data-value': value,\n 'data-indeterminate-value': indeterminateValue,\n id: config.id,\n role: 'switch',\n 'aria-checked': config.on\n ? 'true'\n : config.indeterminate\n ? 'mixed'\n : 'false',\n 'aria-labelledby': config.labelId,\n 'data-target': config.toggle,\n 'data-reverse-target': config.reverseToggle,\n });\n\n if (config.on) {\n $container.addClass('on');\n } else if (config.indeterminate) {\n $container.addClass('indeterminate');\n }\n\n if (config.small) {\n $container.addClass('small');\n }\n\n if (config.disabled) {\n $container.addClass('disabled');\n }\n\n $(\n '<div class=\"lightswitch-container\">' +\n '<div class=\"handle\"></div>' +\n '</div>'\n ).appendTo($container);\n\n if (config.name) {\n $('<input/>', {\n type: 'hidden',\n name: config.name,\n value: config.on\n ? value\n : config.indeterminate\n ? indeterminateValue\n : '',\n disabled: config.disabled,\n }).appendTo($container);\n }\n\n if (config.toggle || config.reverseToggle) {\n $container.addClass('fieldtoggle');\n new Craft.FieldToggle($container);\n }\n\n new Craft.LightSwitch($container, {\n onChange: config.onChange || $.noop,\n });\n\n return $container;\n },\n\n createLightswitchField: function (config) {\n if (!config.id) {\n config.id = 'lightswitch' + Math.floor(Math.random() * 1000000000);\n }\n if (!config.labelId) {\n config.labelId = `${config.id}-label`;\n }\n return this.createField(this.createLightswitch(config), config).addClass(\n 'lightswitch-field'\n );\n },\n\n createColorInput: function (config) {\n const id = config.id || 'color' + Math.floor(Math.random() * 1000000000);\n const containerId = config.containerId || id + '-container';\n const name = config.name || null;\n const value = config.value || null;\n const small = config.small || false;\n const autofocus = config.autofocus && Garnish.isMobileBrowser(true);\n const disabled = config.disabled || false;\n\n const $container = $('<div/>', {\n id: containerId,\n class: 'flex color-container',\n });\n\n const $colorPreviewContainer = $('<div/>', {\n class: 'color static' + (small ? ' small' : ''),\n }).appendTo($container);\n\n const $colorPreview = $('<div/>', {\n class: 'color-preview',\n style: config.value ? {backgroundColor: config.value} : null,\n }).appendTo($colorPreviewContainer);\n\n const $inputContainer = $('<div/>', {\n class: 'color-input-container',\n })\n .append(\n $('<div/>', {\n class: 'color-hex-indicator light code',\n 'aria-hidden': 'true',\n text: '#',\n })\n )\n .appendTo($container);\n\n const $input = this.createTextInput({\n id: id,\n name: name,\n value: Craft.ltrim(value, '#'),\n size: 10,\n class: 'color-input',\n autofocus: autofocus,\n disabled: disabled,\n 'aria-label': Craft.t('app', 'Color hex value'),\n }).appendTo($inputContainer);\n\n new Craft.ColorInput($container);\n return $container;\n },\n\n createColorField: function (config) {\n config.fieldset = true;\n o;\n if (!config.id) {\n config.id = 'color' + Math.floor(Math.random() * 1000000000);\n }\n return this.createField(this.createColorInput(config), config);\n },\n\n createDateInput: function (config) {\n const isMobile = Garnish.isMobileBrowser();\n const id =\n (config.id || 'date' + Math.floor(Math.random() * 1000000000)) + '-date';\n const name = config.name || null;\n const inputName = name ? name + '[date]' : null;\n const value =\n config.value && typeof config.value.getMonth === 'function'\n ? config.value\n : null;\n const autofocus = config.autofocus && Garnish.isMobileBrowser(true);\n const disabled = config.disabled || false;\n\n const $container = $('<div/>', {\n class: 'datewrapper',\n });\n\n const $input = this.createTextInput({\n id: id,\n type: isMobile ? 'date' : 'text',\n class: isMobile && !value ? 'empty-value' : false,\n name: inputName,\n value: value\n ? isMobile\n ? value.toISOString().split('T')[0]\n : Craft.formatDate(value)\n : '',\n placeholder: ' ',\n autocomplete: false,\n autofocus: autofocus,\n disabled: disabled,\n }).appendTo($container);\n\n $('<div data-icon=\"date\"></div>').appendTo($container);\n\n if (name) {\n $('<input/>', {\n type: 'hidden',\n name: name + '[timezone]',\n val: Craft.timezone,\n }).appendTo($container);\n }\n\n if (isMobile) {\n $input.datetimeinput();\n } else {\n $input.datepicker(\n $.extend(\n {\n defaultDate: value || new Date(),\n },\n Craft.datepickerOptions\n )\n );\n }\n\n if (config.hasOuterContainer) {\n return $container;\n }\n\n return $('<div class=\"datetimewrapper\"/>').append($container).datetime();\n },\n\n createDateField: function (config) {\n if (!config.id) {\n config.id = 'date' + Math.floor(Math.random() * 1000000000);\n }\n return this.createField(this.createDateInput(config), config);\n },\n\n createDateRangePicker: function (config) {\n var now = new Date();\n var today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n config = $.extend(\n {\n class: '',\n options: [\n 'today',\n 'thisWeek',\n 'thisMonth',\n 'thisYear',\n 'past7Days',\n 'past30Days',\n 'past90Days',\n 'pastYear',\n ],\n onChange: $.noop,\n selected: null,\n startDate: null,\n endDate: null,\n },\n config\n );\n\n var $menu = $('<div/>', {class: 'menu'});\n var $ul = $('<ul/>', {class: 'padded'}).appendTo($menu);\n var $allOption = $('<a/>')\n .addClass('sel')\n .text(Craft.t('app', 'All'))\n .data('handle', 'all');\n\n $('<li/>').append($allOption).appendTo($ul);\n\n var option;\n var selectedOption;\n for (var i = 0; i < config.options.length; i++) {\n var handle = config.options[i];\n switch (handle) {\n case 'today':\n option = {\n label: Craft.t('app', 'Today'),\n startDate: today,\n endDate: today,\n };\n break;\n case 'thisWeek':\n var firstDayOffset = now.getDay() - Craft.datepickerOptions.firstDay;\n if (firstDayOffset < 0) {\n firstDayOffset += 7;\n }\n option = {\n label: Craft.t('app', 'This week'),\n startDate: new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate() - firstDayOffset\n ),\n endDate: today,\n };\n break;\n case 'thisMonth':\n option = {\n label: Craft.t('app', 'This month'),\n startDate: new Date(now.getFullYear(), now.getMonth()),\n endDate: today,\n };\n break;\n case 'thisYear':\n option = {\n label: Craft.t('app', 'This year'),\n startDate: new Date(now.getFullYear(), 0),\n endDate: today,\n };\n break;\n case 'past7Days':\n option = {\n label: Craft.t('app', 'Past {num} days', {num: 7}),\n startDate: new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate() - 7\n ),\n endDate: today,\n };\n break;\n case 'past30Days':\n option = {\n label: Craft.t('app', 'Past {num} days', {num: 30}),\n startDate: new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate() - 30\n ),\n endDate: today,\n };\n break;\n case 'past90Days':\n option = {\n label: Craft.t('app', 'Past {num} days', {num: 90}),\n startDate: new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate() - 90\n ),\n endDate: today,\n };\n break;\n case 'pastYear':\n option = {\n label: Craft.t('app', 'Past year'),\n startDate: new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate() - 365\n ),\n endDate: today,\n };\n break;\n }\n\n var $li = $('<li/>');\n var $a = $('<a/>', {text: option.label})\n .data('handle', handle)\n .data('startDate', option.startDate)\n .data('endDate', option.endDate)\n .data('startTime', option.startDate ? option.startDate.getTime() : null)\n .data('endTime', option.endDate ? option.endDate.getTime() : null);\n\n if (config.selected && handle == config.selected) {\n selectedOption = $a[0];\n }\n\n $li.append($a);\n $li.appendTo($ul);\n }\n\n $('<hr/>').appendTo($menu);\n\n var $flex = $('<div/>', {class: 'flex flex-nowrap padded'}).appendTo($menu);\n var $startDate = this.createDateField({label: Craft.t('app', 'From')})\n .appendTo($flex)\n .find('input');\n var $endDate = this.createDateField({label: Craft.t('app', 'To')})\n .appendTo($flex)\n .find('input');\n\n // prevent ESC keypresses in the date inputs from closing the menu\n var $dateInputs = $startDate.add($endDate);\n $dateInputs.on('keyup', function (ev) {\n if (\n ev.keyCode === Garnish.ESC_KEY &&\n $(this).data('datepicker') &&\n $(this).data('datepicker').dpDiv.is(':visible')\n ) {\n ev.stopPropagation();\n }\n });\n\n // prevent clicks in the datepicker divs from closing the menu\n if ($startDate.data('datepicker')) {\n $startDate.data('datepicker').dpDiv.on('mousedown', function (ev) {\n ev.stopPropagation();\n });\n }\n if ($endDate.data('datepicker')) {\n $endDate.data('datepicker').dpDiv.on('mousedown', function (ev) {\n ev.stopPropagation();\n });\n }\n\n var menu = new Garnish.Menu($menu, {\n onOptionSelect: function (option) {\n var $option = $(option);\n $btn.text($option.text());\n menu.setPositionRelativeToAnchor();\n $menu.find('.sel').removeClass('sel');\n $option.addClass('sel');\n\n // Update the start/end dates\n $startDate.datepicker('setDate', $option.data('startDate'));\n $endDate.datepicker('setDate', $option.data('endDate'));\n\n config.onChange(\n $option.data('startDate') || null,\n $option.data('endDate') || null,\n $option.data('handle')\n );\n },\n });\n\n $dateInputs.on('change', function () {\n // Do the start & end dates match one of our options?\n let startDate = $startDate.datepicker('getDate');\n let endDate = $endDate.datepicker('getDate');\n let startTime = startDate ? startDate.getTime() : null;\n let endTime = endDate ? endDate.getTime() : null;\n\n let $options = $ul.find('a');\n let $option;\n let foundOption = false;\n\n for (let i = 0; i < $options.length; i++) {\n $option = $options.eq(i);\n if (\n startTime === ($option.data('startTime') || null) &&\n endTime === ($option.data('endTime') || null)\n ) {\n menu.selectOption($option[0]);\n foundOption = true;\n config.onChange(null, null, $option.data('handle'));\n break;\n }\n }\n\n if (!foundOption) {\n $menu.find('.sel').removeClass('sel');\n $flex.addClass('sel');\n\n if (!startTime && !endTime) {\n $btn.text(Craft.t('app', 'All'));\n } else if (startTime && endTime) {\n $btn.text($startDate.val() + ' - ' + $endDate.val());\n } else if (startTime) {\n $btn.text(Craft.t('app', 'From {date}', {date: $startDate.val()}));\n } else {\n $btn.text(Craft.t('app', 'To {date}', {date: $endDate.val()}));\n }\n menu.setPositionRelativeToAnchor();\n\n config.onChange(startDate, endDate, 'custom');\n }\n });\n\n menu.on('hide', function () {\n $startDate.datepicker('hide');\n $endDate.datepicker('hide');\n });\n\n let btnClasses = 'btn menubtn';\n if (config.class) {\n btnClasses = btnClasses + ' ' + config.class;\n }\n\n let $btn = $('<button/>', {\n type: 'button',\n class: btnClasses,\n 'data-icon': 'date',\n text: Craft.t('app', 'All'),\n });\n\n new Garnish.MenuBtn($btn, menu);\n\n if (selectedOption) {\n menu.selectOption(selectedOption);\n }\n\n if (config.startDate) {\n $startDate.datepicker('setDate', config.startDate);\n }\n\n if (config.endDate) {\n $endDate.datepicker('setDate', config.endDate);\n }\n\n if (config.startDate || config.endDate) {\n $dateInputs.trigger('change');\n }\n\n return $btn;\n },\n\n createTimeInput: function (config) {\n const isMobile = Garnish.isMobileBrowser();\n const id =\n (config.id || 'time' + Math.floor(Math.random() * 1000000000)) + '-time';\n const name = config.name || null;\n const inputName = name ? name + '[time]' : null;\n const value =\n config.value && typeof config.value.getMonth === 'function'\n ? config.value\n : null;\n const autofocus = config.autofocus && Garnish.isMobileBrowser(true);\n const disabled = config.disabled || false;\n\n const $container = $('<div/>', {\n class: 'timewrapper',\n });\n\n const $input = this.createTextInput({\n id: id,\n type: isMobile ? 'time' : 'text',\n class: isMobile && !value ? 'empty-value' : false,\n name: inputName,\n placeholder: ' ',\n autocomplete: false,\n autofocus: autofocus,\n disabled: disabled,\n }).appendTo($container);\n\n $('<div data-icon=\"time\"></div>').appendTo($container);\n\n if (name) {\n $('<input/>', {\n type: 'hidden',\n name: name + '[timezone]',\n val: Craft.timezone,\n }).appendTo($container);\n }\n\n if (isMobile) {\n if (value) {\n $input.val(value.toISOString().split('T')[1]);\n }\n $input.datetimeinput();\n } else {\n $input.timepicker(Craft.timepickerOptions);\n if (value) {\n $input.timepicker(\n 'setTime',\n value.getHours() * 3600 + value.getMinutes() * 60 + value.getSeconds()\n );\n }\n }\n\n if (config.hasOuterContainer) {\n return $container;\n }\n\n return $('<div class=\"datetimewrapper\"/>').append($container).datetime();\n },\n\n createTimeField: function (config) {\n if (!config.id) {\n config.id = 'time' + Math.floor(Math.random() * 1000000000);\n }\n return this.createField(this.createTimeInput(config), config);\n },\n\n createField: function (input, config) {\n const label =\n config.label && config.label !== '__blank__' ? config.label : null;\n\n const $field = $(config.fieldset ? '<fieldset/>' : '<div/>', {\n class: 'field',\n id: config.fieldId || (config.id ? config.id + '-field' : null),\n });\n\n if (config.first) {\n $field.addClass('first');\n }\n\n if (config.fieldClass) {\n $field.addClass(config.fieldClass);\n }\n\n if (label && config.fieldset) {\n $('<legend/>', {\n text: label,\n class: 'visually-hidden',\n 'data-label': label,\n }).appendTo($field);\n }\n\n if (label) {\n const $heading = $('<div class=\"heading\"/>').appendTo($field);\n\n $(config.fieldset ? '<legend/>' : '<label/>', {\n id:\n config.labelId ||\n (config.id\n ? `${config.id}-${config.fieldset ? 'legend' : 'label'}`\n : null),\n class: config.required ? 'required' : null,\n for: (!config.fieldset && config.id) || null,\n text: label,\n }).appendTo($heading);\n }\n\n if (config.instructions) {\n $('<div class=\"instructions\"/>')\n .text(config.instructions)\n .appendTo($field);\n }\n\n $('<div class=\"input\"/>').append(input).appendTo($field);\n\n if (config.tip) {\n const $tip = $('<p class=\"notice has-icon\"/>');\n $('<span class=\"icon\" aria-hidden=\"true\"/>').appendTo($tip);\n $('<span class=\"visually-hidden\"/>')\n .text(Craft.t('app', 'Tip') + ': ')\n .appendTo($tip);\n $('<span/>').text(config.tip).appendTo($tip);\n $tip.appendTo($field);\n }\n\n if (config.warning) {\n const $warning = $('<p class=\"warning has-icon\"/>');\n $('<span class=\"icon\" aria-hidden=\"true\"/>').appendTo($warning);\n $('<span class=\"visually-hidden\"/>')\n .text(Craft.t('app', 'Warning') + ': ')\n .appendTo($warning);\n $('<span/>').text(config.warning).appendTo($warning);\n $warning.appendTo($field);\n }\n\n if (config.errors) {\n this.addErrorsToField($field, config.errors);\n }\n\n return $field;\n },\n\n createErrorList: function (errors) {\n var $list = $('<ul class=\"errors\"/>');\n\n if (errors) {\n this.addErrorsToList($list, errors);\n }\n\n return $list;\n },\n\n addErrorsToList: function ($list, errors) {\n for (var i = 0; i < errors.length; i++) {\n $('<li/>').text(errors[i]).appendTo($list);\n }\n },\n\n addErrorsToField: function ($field, errors) {\n if (!errors) {\n return;\n }\n\n $field.addClass('has-errors');\n $field.children('.input').addClass('errors');\n\n var $errors = $field.children('ul.errors');\n\n if (!$errors.length) {\n $errors = this.createErrorList().appendTo($field);\n }\n\n this.addErrorsToList($errors, errors);\n },\n\n clearErrorsFromField: function ($field) {\n $field.removeClass('has-errors');\n $field.children('.input').removeClass('errors');\n $field.children('ul.errors').remove();\n },\n\n getAutofocusValue: function (autofocus) {\n return autofocus && !Garnish.isMobileBrowser(true) ? 'autofocus' : null;\n },\n\n getDisabledValue: function (disabled) {\n return disabled ? 'disabled' : null;\n },\n};\n","/** global: Craft */\n/** global: Garnish */\n/**\n * File Manager.\n */\nCraft.Uploader = Garnish.Base.extend(\n {\n uploader: null,\n allowedKinds: null,\n $element: null,\n settings: null,\n _rejectedFiles: {},\n _extensionList: null,\n _totalFileCounter: 0,\n _validFileCounter: 0,\n\n init: function ($element, settings) {\n this._rejectedFiles = {size: [], type: [], limit: []};\n this.$element = $element;\n this.allowedKinds = null;\n this._extensionList = null;\n this._totalFileCounter = 0;\n this._validFileCounter = 0;\n\n settings = $.extend({}, Craft.Uploader.defaults, settings);\n\n var events = settings.events;\n delete settings.events;\n\n if (settings.allowedKinds && settings.allowedKinds.length) {\n if (typeof settings.allowedKinds === 'string') {\n settings.allowedKinds = [settings.allowedKinds];\n }\n\n this.allowedKinds = settings.allowedKinds;\n delete settings.allowedKinds;\n }\n\n settings.autoUpload = false;\n\n this.uploader = this.$element.fileupload(settings);\n for (var event in events) {\n if (!events.hasOwnProperty(event)) {\n continue;\n }\n\n this.uploader.on(event, events[event]);\n }\n\n this.settings = settings;\n\n this.uploader.on('fileuploadadd', this.onFileAdd.bind(this));\n },\n\n /**\n * Set uploader parameters.\n */\n setParams: function (paramObject) {\n // If CSRF protection isn't enabled, these won't be defined.\n if (\n typeof Craft.csrfTokenName !== 'undefined' &&\n typeof Craft.csrfTokenValue !== 'undefined'\n ) {\n // Add the CSRF token\n paramObject[Craft.csrfTokenName] = Craft.csrfTokenValue;\n }\n\n this.uploader.fileupload('option', {formData: paramObject});\n },\n\n /**\n * Get the number of uploads in progress.\n */\n getInProgress: function () {\n return this.uploader.fileupload('active');\n },\n\n /**\n * Return true, if this is the last upload.\n */\n isLastUpload: function () {\n // Processing the last file or not processing at all.\n return this.getInProgress() < 2;\n },\n\n /**\n * Called on file add.\n */\n onFileAdd: function (e, data) {\n e.stopPropagation();\n\n var validateExtension = false;\n\n if (this.allowedKinds) {\n if (!this._extensionList) {\n this._createExtensionList();\n }\n\n validateExtension = true;\n }\n\n // Make sure that file API is there before relying on it\n data.process().done(() => {\n var file = data.files[0];\n var pass = true;\n if (validateExtension) {\n var matches = file.name.match(/\\.([a-z0-4_]+)$/i);\n var fileExtension = matches[1];\n if (\n $.inArray(fileExtension.toLowerCase(), this._extensionList) === -1\n ) {\n pass = false;\n this._rejectedFiles.type.push('“' + file.name + '”');\n }\n }\n\n if (file.size > this.settings.maxFileSize) {\n this._rejectedFiles.size.push('“' + file.name + '”');\n pass = false;\n }\n\n // If the validation has passed for this file up to now, check if we're not hitting any limits\n if (\n pass &&\n typeof this.settings.canAddMoreFiles === 'function' &&\n !this.settings.canAddMoreFiles(this._validFileCounter)\n ) {\n this._rejectedFiles.limit.push('“' + file.name + '”');\n pass = false;\n }\n\n if (pass) {\n this._validFileCounter++;\n data.submit();\n }\n\n if (++this._totalFileCounter === data.originalFiles.length) {\n this._totalFileCounter = 0;\n this._validFileCounter = 0;\n this.processErrorMessages();\n }\n });\n\n return true;\n },\n\n /**\n * Process error messages.\n */\n processErrorMessages: function () {\n var str;\n\n if (this._rejectedFiles.type.length) {\n if (this._rejectedFiles.type.length === 1) {\n str =\n 'The file {files} could not be uploaded. The allowed file kinds are: {kinds}.';\n } else {\n str =\n 'The files {files} could not be uploaded. The allowed file kinds are: {kinds}.';\n }\n\n str = Craft.t('app', str, {\n files: this._rejectedFiles.type.join(', '),\n kinds: this.allowedKinds.join(', '),\n });\n this._rejectedFiles.type = [];\n alert(str);\n }\n\n if (this._rejectedFiles.size.length) {\n if (this._rejectedFiles.size.length === 1) {\n str =\n 'The file {files} could not be uploaded, because it exceeds the maximum upload size of {size}.';\n } else {\n str =\n 'The files {files} could not be uploaded, because they exceeded the maximum upload size of {size}.';\n }\n\n str = Craft.t('app', str, {\n files: this._rejectedFiles.size.join(', '),\n size: this.humanFileSize(Craft.maxUploadSize),\n });\n this._rejectedFiles.size = [];\n alert(str);\n }\n\n if (this._rejectedFiles.limit.length) {\n if (this._rejectedFiles.limit.length === 1) {\n str =\n 'The file {files} could not be uploaded, because the field limit has been reached.';\n } else {\n str =\n 'The files {files} could not be uploaded, because the field limit has been reached.';\n }\n\n str = Craft.t('app', str, {\n files: this._rejectedFiles.limit.join(', '),\n });\n this._rejectedFiles.limit = [];\n alert(str);\n }\n },\n\n humanFileSize: function (bytes) {\n var threshold = 1024;\n\n if (bytes < threshold) {\n return bytes + ' B';\n }\n\n var units = ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\n var u = -1;\n\n do {\n bytes = bytes / threshold;\n ++u;\n } while (bytes >= threshold);\n\n return bytes.toFixed(1) + ' ' + units[u];\n },\n\n _createExtensionList: function () {\n this._extensionList = [];\n\n for (var i = 0; i < this.allowedKinds.length; i++) {\n var allowedKind = this.allowedKinds[i];\n\n if (typeof Craft.fileKinds[allowedKind] !== 'undefined') {\n for (\n var j = 0;\n j < Craft.fileKinds[allowedKind].extensions.length;\n j++\n ) {\n var ext = Craft.fileKinds[allowedKind].extensions[j];\n this._extensionList.push(ext);\n }\n }\n }\n },\n\n destroy: function () {\n this.$element.fileupload('destroy');\n this.base();\n },\n },\n {\n defaults: {\n dropZone: null,\n pasteZone: null,\n fileInput: null,\n sequentialUploads: true,\n maxFileSize: Craft.maxUploadSize,\n allowedKinds: null,\n events: {},\n canAddMoreFiles: null,\n headers: {Accept: 'application/json;q=0.9,*/*;q=0.8'},\n paramName: 'assets-upload',\n },\n }\n);\n","/** global: Craft */\n/** global: Garnish */\n/**\n * Handle Generator\n */\nCraft.UriFormatGenerator = Craft.BaseInputGenerator.extend({\n generateTargetValue: function (sourceVal) {\n // Remove HTML tags\n sourceVal = sourceVal.replace('/<(.*?)>/g', '');\n\n // Make it lowercase\n sourceVal = sourceVal.toLowerCase();\n\n // Convert extended ASCII characters to basic ASCII\n sourceVal = Craft.asciiString(sourceVal);\n\n // Handle must start with a letter and end with a letter/number\n sourceVal = sourceVal.replace(/^[^a-z]+/, '');\n sourceVal = sourceVal.replace(/[^a-z0-9]+$/, '');\n\n // Get the \"words\"\n var words = Craft.filterArray(sourceVal.split(/[^a-z0-9]+/));\n\n var uriFormat = words.join(Craft.slugWordSeparator);\n\n if (uriFormat && this.settings.suffix) {\n uriFormat += this.settings.suffix;\n }\n\n return uriFormat;\n },\n});\n","/** global: Craft */\n/** global: Garnish */\n/**\n * User index class\n */\nCraft.UserIndex = Craft.BaseElementIndex.extend({\n init: function (elementType, $container, settings) {\n this.on('selectSource', this.updateUrl.bind(this));\n this.base(elementType, $container, settings);\n },\n\n getDefaultSourceKey: function () {\n // Did they request a specific group in the URL?\n if (\n this.settings.context === 'index' &&\n typeof defaultSourceSlug !== 'undefined'\n ) {\n for (let i = 0; i < this.$sources.length; i++) {\n const $source = $(this.$sources[i]);\n if ($source.data('slug') === defaultSourceSlug) {\n return $source.data('key');\n }\n }\n }\n\n return this.base();\n },\n\n updateUrl: function () {\n if (this.settings.context === 'index') {\n let uri = 'users';\n const slug = this.$source.data('slug');\n if (slug) {\n uri += `/${slug}`;\n }\n Craft.setPath(uri);\n }\n },\n});\n\n// Register it!\nCraft.registerElementIndexClass('craft\\\\elements\\\\User', Craft.UserIndex);\n","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ruleSet[1].rules[3].use[1]!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[3]!../../../../../../node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[4]!./charts.scss\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"3790022a\", content, true, {});","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ruleSet[1].rules[3].use[1]!../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[3]!../../../../../../node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[4]!./craft.scss\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"80058a3c\", content, true, {});","/**\n * Translates the list format produced by css-loader into something\n * easier to manipulate.\n */\nexport default function listToStyles (parentId, list) {\n var styles = []\n var newStyles = {}\n for (var i = 0; i < list.length; i++) {\n var item = list[i]\n var id = item[0]\n var css = item[1]\n var media = item[2]\n var sourceMap = item[3]\n var part = {\n id: parentId + ':' + i,\n css: css,\n media: media,\n sourceMap: sourceMap\n }\n if (!newStyles[id]) {\n styles.push(newStyles[id] = { id: id, parts: [part] })\n } else {\n newStyles[id].parts.push(part)\n }\n }\n return styles\n}\n","/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n Modified by Evan You @yyx990803\n*/\n\nimport listToStyles from './listToStyles'\n\nvar hasDocument = typeof document !== 'undefined'\n\nif (typeof DEBUG !== 'undefined' && DEBUG) {\n if (!hasDocument) {\n throw new Error(\n 'vue-style-loader cannot be used in a non-browser environment. ' +\n \"Use { target: 'node' } in your Webpack config to indicate a server-rendering environment.\"\n ) }\n}\n\n/*\ntype StyleObject = {\n id: number;\n parts: Array<StyleObjectPart>\n}\n\ntype StyleObjectPart = {\n css: string;\n media: string;\n sourceMap: ?string\n}\n*/\n\nvar stylesInDom = {/*\n [id: number]: {\n id: number,\n refs: number,\n parts: Array<(obj?: StyleObjectPart) => void>\n }\n*/}\n\nvar head = hasDocument && (document.head || document.getElementsByTagName('head')[0])\nvar singletonElement = null\nvar singletonCounter = 0\nvar isProduction = false\nvar noop = function () {}\nvar options = null\nvar ssrIdKey = 'data-vue-ssr-id'\n\n// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n// tags it will allow on a page\nvar isOldIE = typeof navigator !== 'undefined' && /msie [6-9]\\b/.test(navigator.userAgent.toLowerCase())\n\nexport default function addStylesClient (parentId, list, _isProduction, _options) {\n isProduction = _isProduction\n\n options = _options || {}\n\n var styles = listToStyles(parentId, list)\n addStylesToDom(styles)\n\n return function update (newList) {\n var mayRemove = []\n for (var i = 0; i < styles.length; i++) {\n var item = styles[i]\n var domStyle = stylesInDom[item.id]\n domStyle.refs--\n mayRemove.push(domStyle)\n }\n if (newList) {\n styles = listToStyles(parentId, newList)\n addStylesToDom(styles)\n } else {\n styles = []\n }\n for (var i = 0; i < mayRemove.length; i++) {\n var domStyle = mayRemove[i]\n if (domStyle.refs === 0) {\n for (var j = 0; j < domStyle.parts.length; j++) {\n domStyle.parts[j]()\n }\n delete stylesInDom[domStyle.id]\n }\n }\n }\n}\n\nfunction addStylesToDom (styles /* Array<StyleObject> */) {\n for (var i = 0; i < styles.length; i++) {\n var item = styles[i]\n var domStyle = stylesInDom[item.id]\n if (domStyle) {\n domStyle.refs++\n for (var j = 0; j < domStyle.parts.length; j++) {\n domStyle.parts[j](item.parts[j])\n }\n for (; j < item.parts.length; j++) {\n domStyle.parts.push(addStyle(item.parts[j]))\n }\n if (domStyle.parts.length > item.parts.length) {\n domStyle.parts.length = item.parts.length\n }\n } else {\n var parts = []\n for (var j = 0; j < item.parts.length; j++) {\n parts.push(addStyle(item.parts[j]))\n }\n stylesInDom[item.id] = { id: item.id, refs: 1, parts: parts }\n }\n }\n}\n\nfunction createStyleElement () {\n var styleElement = document.createElement('style')\n styleElement.type = 'text/css'\n head.appendChild(styleElement)\n return styleElement\n}\n\nfunction addStyle (obj /* StyleObjectPart */) {\n var update, remove\n var styleElement = document.querySelector('style[' + ssrIdKey + '~=\"' + obj.id + '\"]')\n\n if (styleElement) {\n if (isProduction) {\n // has SSR styles and in production mode.\n // simply do nothing.\n return noop\n } else {\n // has SSR styles but in dev mode.\n // for some reason Chrome can't handle source map in server-rendered\n // style tags - source maps in <style> only works if the style tag is\n // created and inserted dynamically. So we remove the server rendered\n // styles and inject new ones.\n styleElement.parentNode.removeChild(styleElement)\n }\n }\n\n if (isOldIE) {\n // use singleton mode for IE9.\n var styleIndex = singletonCounter++\n styleElement = singletonElement || (singletonElement = createStyleElement())\n update = applyToSingletonTag.bind(null, styleElement, styleIndex, false)\n remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true)\n } else {\n // use multi-style-tag mode in all other cases\n styleElement = createStyleElement()\n update = applyToTag.bind(null, styleElement)\n remove = function () {\n styleElement.parentNode.removeChild(styleElement)\n }\n }\n\n update(obj)\n\n return function updateStyle (newObj /* StyleObjectPart */) {\n if (newObj) {\n if (newObj.css === obj.css &&\n newObj.media === obj.media &&\n newObj.sourceMap === obj.sourceMap) {\n return\n }\n update(obj = newObj)\n } else {\n remove()\n }\n }\n}\n\nvar replaceText = (function () {\n var textStore = []\n\n return function (index, replacement) {\n textStore[index] = replacement\n return textStore.filter(Boolean).join('\\n')\n }\n})()\n\nfunction applyToSingletonTag (styleElement, index, remove, obj) {\n var css = remove ? '' : obj.css\n\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = replaceText(index, css)\n } else {\n var cssNode = document.createTextNode(css)\n var childNodes = styleElement.childNodes\n if (childNodes[index]) styleElement.removeChild(childNodes[index])\n if (childNodes.length) {\n styleElement.insertBefore(cssNode, childNodes[index])\n } else {\n styleElement.appendChild(cssNode)\n }\n }\n}\n\nfunction applyToTag (styleElement, obj) {\n var css = obj.css\n var media = obj.media\n var sourceMap = obj.sourceMap\n\n if (media) {\n styleElement.setAttribute('media', media)\n }\n if (options.ssrId) {\n styleElement.setAttribute(ssrIdKey, obj.id)\n }\n\n if (sourceMap) {\n // https://developer.chrome.com/devtools/docs/javascript-debugging\n // this makes source maps inside style tags work properly in Chrome\n css += '\\n/*# sourceURL=' + sourceMap.sources[0] + ' */'\n // http://stackoverflow.com/a/26603875\n css += '\\n/*# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + ' */'\n }\n\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild)\n }\n styleElement.appendChild(document.createTextNode(css))\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var __WEBPACK_NAMESPACE_OBJECT__ = jQuery;","/** global: Craft */\n/** global: Garnish */\nimport $ from 'jquery';\n\n/**\n * CP class\n */\nCraft.CP = Garnish.Base.extend(\n {\n authManager: null,\n\n $nav: null,\n $navToggle: null,\n $globalSidebar: null,\n $globalContainer: null,\n $mainContainer: null,\n $alerts: null,\n $crumbs: null,\n $breadcrumbList: null,\n $breadcrumbItems: null,\n $notificationContainer: null,\n $main: null,\n $primaryForm: null,\n $headerContainer: null,\n $header: null,\n $mainContent: null,\n $details: null,\n $sidebarContainer: null,\n $sidebarToggle: null,\n $sidebar: null,\n $contentContainer: null,\n $edition: null,\n\n $confirmUnloadForms: null,\n $deltaForms: null,\n $collapsibleTables: null,\n\n isMobile: null,\n fixedHeader: false,\n\n breadcrumbListWidth: 0,\n breadcrumbDisclosureItem: `<li class=\"breadcrumb-toggle-wrapper\" data-disclosure-item><button data-disclosure-trigger aria-controls=\"breadcrumb-disclosure\" aria-haspopup=\"true\">${Craft.t(\n 'app',\n 'More…'\n )}</button><div id=\"breadcrumb-disclosure\" class=\"menu menu--disclosure\" data-disclosure-menu><ul></ul></div></li>`,\n\n tabManager: null,\n\n enableQueue: true,\n totalJobs: 0,\n jobInfo: null,\n displayedJobInfo: null,\n displayedJobInfoUnchanged: 1,\n trackJobProgressTimeout: null,\n jobProgressIcon: null,\n\n checkingForUpdates: false,\n forcingRefreshOnUpdatesCheck: false,\n includingDetailsOnUpdatesCheck: false,\n checkForUpdatesCallbacks: null,\n\n resizeTimeout: null,\n\n init: function () {\n // Is this session going to expire?\n if (Craft.remainingSessionTime !== 0) {\n this.authManager = new Craft.AuthManager();\n }\n\n // Find all the key elements\n this.$nav = $('#nav');\n this.$navToggle = $('#primary-nav-toggle');\n this.$globalSidebar = $('#global-sidebar');\n this.$globalContainer = $('#global-container');\n this.$mainContainer = $('#main-container');\n this.$alerts = $('#alerts');\n this.$crumbs = $('#crumbs');\n this.$breadcrumbList = $('.breadcrumb-list');\n this.$breadcrumbItems = $('.breadcrumb-list li');\n this.$notificationContainer = $('#notifications');\n this.$main = $('#main');\n this.$primaryForm = $('#main-form');\n this.$headerContainer = $('#header-container');\n this.$header = $('#header');\n this.$mainContent = $('#main-content');\n this.$details = $('#details');\n this.$sidebarContainer = $('#sidebar-container');\n this.$sidebarToggle = $('#sidebar-toggle');\n this.$sidebar = $('#sidebar');\n this.$contentContainer = $('#content-container');\n this.$collapsibleTables = $('table.collapsible');\n\n this.isMobile = Garnish.isMobileBrowser();\n\n this.updateContentHeading();\n\n // Swap any instruction text with info icons\n let $allInstructions = this.$details.find(\n '.meta > .field > .instructions'\n );\n\n for (let i = 0; i < $allInstructions.length; i++) {\n let $instructions = $allInstructions.eq(i);\n let $label = $instructions.siblings('.heading').children('label');\n $('<span/>', {\n class: 'info',\n html: $instructions.children().html(),\n }).appendTo($label);\n $instructions.remove();\n }\n\n if (!this.isMobile && this.$header.length) {\n this.addListener(Garnish.$win, 'scroll', 'updateFixedHeader');\n this.updateFixedHeader();\n }\n\n Garnish.$doc.ready(() => {\n // Update responsive tables on window resize\n this.addListener(Garnish.$win, 'resize', (ev) => {\n // Ignore element resizes\n if (ev.target === window) {\n this.handleWindowResize();\n\n clearTimeout(this.resizeTimeout);\n var cp = this;\n this.resizeTimeout = setTimeout(function () {\n cp.setSidebarNavAttributes();\n }, 100);\n }\n });\n this.handleWindowResize();\n this.setSidebarNavAttributes();\n\n // Wait a frame before initializing any confirm-unload forms,\n // so other JS that runs on ready() has a chance to initialize\n Garnish.requestAnimationFrame(this.initSpecialForms.bind(this));\n });\n\n // Alerts\n if (this.$alerts.length) {\n this.initAlerts();\n }\n\n // Toggles\n this.addListener(this.$navToggle, 'click', 'toggleNav');\n this.addListener(this.$sidebarToggle, 'click', 'toggleSidebar');\n\n // Does this page have a primary form?\n if (!this.$primaryForm.length) {\n this.$primaryForm = $('form[data-saveshortcut]:first');\n }\n\n // Does the primary form support the save shortcut?\n if (\n this.$primaryForm.length &&\n Garnish.hasAttr(this.$primaryForm, 'data-saveshortcut')\n ) {\n let shortcuts = [];\n let actions = this.$primaryForm.data('actions');\n if (typeof actions === 'undefined') {\n shortcuts.push([\n {\n keyCode: Garnish.S_KEY,\n ctrl: true,\n },\n {\n redirect: this.$primaryForm.data('saveshortcut-redirect'),\n retainScroll: Garnish.hasAttr(\n this.$primaryForm,\n 'saveshortcut-scroll'\n ),\n },\n ]);\n } else {\n for (let i = 0; i < actions.length; i++) {\n let action = actions[i];\n if (!action.shortcut) {\n continue;\n }\n shortcuts.push([\n {\n keyCode: Garnish.S_KEY,\n ctrl: true,\n shift: !!action.shift,\n },\n {\n action: action.action,\n redirect: action.redirect,\n confirm: action.confirm,\n params: action.params,\n data: action.data,\n retainScroll: action.retainScroll,\n },\n ]);\n }\n }\n for (let i = 0; i < shortcuts.length; i++) {\n Garnish.uiLayerManager.registerShortcut(shortcuts[i][0], () => {\n this.submitPrimaryForm(shortcuts[i][1]);\n });\n }\n }\n\n this.initTabs();\n\n if (this.tabManager) {\n if (window.LOCATION_HASH) {\n const $tab = this.tabManager.$tabs.filter(\n `[href=\"#${window.LOCATION_HASH}\"]`\n );\n if ($tab.length) {\n this.tabManager.selectTab($tab);\n }\n }\n }\n\n // Should we match the previous scroll position?\n let scrollY = Craft.getLocalStorage('scrollY');\n if (typeof scrollY !== 'undefined') {\n Craft.removeLocalStorage('scrollY');\n Garnish.$doc.ready(() => {\n Garnish.requestAnimationFrame(() => {\n window.scrollTo(0, scrollY);\n });\n });\n }\n\n if ($.isTouchCapable()) {\n this.$mainContainer.on(\n 'focus',\n 'input, textarea, .focusable-input',\n this._handleInputFocus.bind(this)\n );\n this.$mainContainer.on(\n 'blur',\n 'input, textarea, .focusable-input',\n this._handleInputBlur.bind(this)\n );\n }\n\n // Announcements HUD\n if (Craft.announcements.length) {\n let $btn = $('#announcements-btn').removeClass('hidden');\n const hasUnreads = Craft.announcements.some((a) => a.unread);\n let $unreadMessage;\n if (hasUnreads) {\n $unreadMessage = $('<span/>', {\n class: 'visually-hidden',\n html: Craft.t('app', 'Unread messages'),\n });\n $btn.addClass('unread').append($unreadMessage);\n }\n let hud;\n this.addListener($btn, 'click', () => {\n if (!hud) {\n let contents = '';\n Craft.announcements.forEach((a) => {\n contents +=\n `<div class=\"announcement ${\n a.unread ? 'unread' : ''\n }\" role=\"listitem\">` +\n '<div class=\"announcement__header\">' +\n `<h3 class=\"announcement__heading h2\">${a.heading}</h3>` +\n '<div class=\"announcement-label-container\">' +\n `<div class=\"announcement-icon\" aria-hidden=\"true\">${a.icon}</div>` +\n `<div class=\"announcement-label\">${a.label}</div>` +\n '</div>' +\n '</div>' +\n `<p>${a.body}</p>` +\n '</div>';\n });\n hud = new Garnish.HUD(\n $btn,\n `<h2 class=\"visually-hidden\">${Craft.t(\n 'app',\n 'Announcements'\n )}</h2><div id=\"announcements\" role=\"list\">${contents}</div>`,\n {\n onShow: () => {\n $btn.addClass('active');\n },\n onHide: () => {\n $btn.removeClass('active');\n },\n }\n );\n\n // Open outbound links in new windows\n $('a', hud.$main).each(function () {\n if (\n this.hostname.length &&\n this.hostname !== location.hostname &&\n typeof $(this).attr('target') === 'undefined'\n ) {\n $(this).attr('rel', 'noopener').attr('target', '_blank');\n }\n });\n\n if (hasUnreads) {\n $btn.removeClass('unread');\n $unreadMessage.remove();\n Craft.sendActionRequest(\n 'POST',\n 'users/mark-announcements-as-read',\n {\n data: {\n ids: Craft.announcements.map((a) => a.id),\n },\n }\n );\n }\n } else {\n hud.show();\n }\n });\n }\n\n // Add .stuck class to #footer when stuck\n // h/t https://stackoverflow.com/a/61115077/1688568\n const footer = document.getElementById('footer');\n if (footer) {\n const observer = new IntersectionObserver(\n ([ev]) => {\n ev.target.classList.toggle('stuck', ev.intersectionRatio < 1);\n },\n {\n rootMargin: '0px 0px -1px 0px',\n threshold: [1],\n }\n );\n observer.observe(footer);\n }\n },\n\n get $contentHeader() {\n const $contentHeader = $('#content-header');\n if ($contentHeader.length) {\n return $contentHeader;\n }\n return $('<header/>', {\n id: 'content-header',\n class: 'pane-header',\n }).prependTo($('#content'));\n },\n\n get $noticeContainer() {\n const $noticeContainer = $('#content-notice');\n if ($noticeContainer.length) {\n return $noticeContainer;\n }\n return $('<div id=\"content-notice\"/>')\n .attr('role', 'status')\n .prependTo(this.$contentHeader);\n },\n\n initSpecialForms: function () {\n // Look for forms that we should watch for changes on\n this.$confirmUnloadForms = $('form[data-confirm-unload]');\n this.$deltaForms = $('form[data-delta]');\n\n if (!this.$confirmUnloadForms.length) {\n return;\n }\n\n const $forms = this.$confirmUnloadForms.add(this.$deltaForms);\n\n for (let i = 0; i < $forms.length; i++) {\n const $form = $forms.eq(i);\n let serialized;\n if (!$form.data('initialSerializedValue')) {\n if (typeof $form.data('serializer') === 'function') {\n serialized = $form.data('serializer')();\n } else {\n serialized = $form.serialize();\n }\n $form.data('initialSerializedValue', serialized);\n }\n this.addListener($form, 'submit', function (ev) {\n if (Garnish.hasAttr($form, 'data-confirm-unload')) {\n this.removeListener(Garnish.$win, 'beforeunload');\n }\n if (Garnish.hasAttr($form, 'data-delta')) {\n ev.preventDefault();\n let serialized;\n if (typeof $form.data('serializer') === 'function') {\n serialized = $form.data('serializer')();\n } else {\n serialized = $form.serialize();\n }\n const data = Craft.findDeltaData(\n $form.data('initialSerializedValue'),\n serialized,\n $form.data('delta-names'),\n null,\n $form.data('initial-delta-values'),\n $form.data('modified-delta-names')\n );\n Craft.createForm(data).appendTo(Garnish.$bod).submit();\n }\n });\n }\n\n this.addListener(Garnish.$win, 'beforeunload', function (ev) {\n let confirmUnload = false;\n if (\n typeof Craft.livePreview !== 'undefined' &&\n Craft.livePreview.inPreviewMode\n ) {\n confirmUnload = true;\n } else {\n for (let i = 0; i < this.$confirmUnloadForms.length; i++) {\n const $form = this.$confirmUnloadForms.eq(i);\n let serialized;\n if (typeof $form.data('serializer') === 'function') {\n serialized = $form.data('serializer')();\n } else {\n serialized = $form.serialize();\n }\n if ($form.data('initialSerializedValue') !== serialized) {\n confirmUnload = true;\n break;\n }\n }\n }\n\n if (confirmUnload) {\n var message = Craft.t(\n 'app',\n 'Any changes will be lost if you leave this page.'\n );\n\n if (ev) {\n ev.originalEvent.returnValue = message;\n } else {\n window.event.returnValue = message;\n }\n\n return message;\n }\n });\n },\n\n _handleInputFocus: function () {\n this.updateFixedHeader();\n },\n\n _handleInputBlur: function () {\n this.updateFixedHeader();\n },\n\n /**\n * Submits a form.\n * @param {Object} [options]\n * @param {string} [options.action] The `action` param value override\n * @param {string} [options.redirect] The `redirect` param value override\n * @param {string} [options.confirm] A confirmation message that should be shown to the user before submit\n * @param {Object} [options.params] Additional params that should be added to the form, defined as name/value pairs\n * @param {Object} [options.data] Additional data to be passed to the submit event\n * @param {boolean} [options.retainScroll] Whether the scroll position should be stored and reapplied on the next page load\n */\n submitPrimaryForm: function (options) {\n // Give other stuff on the page a chance to prepare\n this.trigger('beforeSaveShortcut');\n\n if (typeof options !== 'object' || !$.isPlainObject(options)) {\n options = {};\n }\n\n if (!options.redirect) {\n options.redirect = this.$primaryForm.data('saveshortcut-redirect');\n }\n\n if (!options.data) {\n options.data = {};\n }\n options.data.saveShortcut = true;\n\n Craft.submitForm(this.$primaryForm, options);\n },\n\n updateSidebarMenuLabel: function () {\n this.updateContentHeading();\n },\n\n updateContentHeading: function () {\n const $item = this.$sidebar.find('a.sel:first');\n const $label = $item.children('.label');\n $('#content-heading').text($label.length ? $label.text() : $item.text());\n Garnish.$bod.removeClass('showing-sidebar');\n },\n\n toggleNav: function () {\n const isExpanded = this.navIsExpanded();\n\n if (isExpanded === null) return;\n\n if (isExpanded) {\n this.disableGlobalSidebarLinks();\n this.$navToggle.focus();\n this.$navToggle.attr('aria-expanded', 'false');\n Garnish.$bod.removeClass('showing-nav');\n } else {\n this.enableGlobalSidebarLinks();\n this.$globalSidebar.find(':focusable')[0].focus();\n this.$navToggle.attr('aria-expanded', 'true');\n Garnish.$bod.addClass('showing-nav');\n }\n },\n\n enableGlobalSidebarLinks: function () {\n const focusableItems = this.$globalSidebar.find(':focusable');\n\n $(focusableItems).each(function () {\n $(this).attr('tabindex', '0');\n });\n },\n\n disableGlobalSidebarLinks: function () {\n const focusableItems = this.$globalSidebar.find(':focusable');\n\n $(focusableItems).each(function () {\n $(this).attr('tabindex', '-1');\n });\n },\n\n setSidebarNavAttributes: function () {\n const isExpanded = this.navIsExpanded();\n\n if (isExpanded === null) return;\n\n if (!isExpanded) {\n this.disableGlobalSidebarLinks();\n } else {\n this.enableGlobalSidebarLinks();\n }\n },\n\n navIsExpanded: function () {\n if (!this.$globalSidebar[0]) return null;\n\n const isAlwaysVisible = getComputedStyle(this.$globalSidebar[0])\n .getPropertyValue('--is-always-visible')\n .trim();\n\n return (\n this.$navToggle.attr('aria-expanded') === 'true' ||\n isAlwaysVisible === 'true'\n );\n },\n\n toggleSidebar: function () {\n const expanded = this.$sidebarToggle.attr('aria-expanded') === 'true';\n const newState = expanded ? 'false' : 'true';\n this.$sidebarToggle.attr('aria-expanded', newState);\n Garnish.$bod.toggleClass('showing-sidebar');\n },\n\n initTabs: function () {\n if (this.tabManager) {\n this.tabManager.destroy();\n this.tabManager = null;\n }\n\n const $tabs = $('#tabs');\n if (!$tabs.length) {\n return;\n }\n\n this.tabManager = new Craft.Tabs($tabs);\n\n this.tabManager.on('selectTab', (ev) => {\n const href = ev.$tab.attr('href');\n\n // Show its content area\n if (href && href.charAt(0) === '#') {\n $(href).removeClass('hidden');\n }\n\n // Trigger a resize event to update any UI components that are listening for it\n Garnish.$win.trigger('resize');\n\n // Fixes Redactor fixed toolbars on previously hidden panes\n Garnish.$doc.trigger('scroll');\n\n // If there is a revision menu, set its links to this tab ID\n if (href && href.charAt(0) === '#') {\n const menuBtn = $('#context-btn').menubtn().data('menubtn');\n if (menuBtn) {\n for (let i = 0; i < menuBtn.menu.$options.length; i++) {\n let a = menuBtn.menu.$options[i];\n if (a.href) {\n a.href = a.href.match(/^[^#]*/)[0] + href;\n }\n }\n }\n }\n\n if (typeof history !== 'undefined') {\n // Delay changing the hash so it doesn't cause the browser to jump on page load\n Garnish.requestAnimationFrame(() => {\n history.replaceState(undefined, undefined, href);\n });\n }\n });\n\n this.tabManager.on('deselectTab', (ev) => {\n const href = ev.$tab.attr('href');\n if (href && href.charAt(0) === '#') {\n // Hide its content area\n $(ev.$tab.attr('href')).addClass('hidden');\n }\n });\n },\n\n updateTabs: function (tabs) {\n if (tabs) {\n const $tabContainer = $(tabs).attr('id', 'tabs');\n if (this.tabManager) {\n this.tabManager.$container.replaceWith($tabContainer);\n } else {\n $tabContainer.appendTo(this.$contentHeader);\n }\n this.initTabs();\n } else if (this.tabManager) {\n if (this.tabManager.$container.siblings().length) {\n this.tabManager.$container.remove();\n } else {\n this.tabManager.$container.parent().remove();\n }\n this.tabManager.destroy();\n this.tabManager = null;\n }\n },\n\n /**\n * @deprecated in 3.7.0\n */\n get $tabsContainer() {\n return this.tabManager ? this.tabManager.$container : undefined;\n },\n /**\n * @deprecated in 3.7.0\n */\n get $tabsList() {\n return this.tabManager ? this.tabManager.$tablist : undefined;\n },\n /**\n * @deprecated in 3.7.0\n */\n get $tabs() {\n return this.tabManager ? this.tabManager.$tablist.find('> a') : undefined;\n },\n /**\n * @deprecated in 3.7.0\n */\n get $selectedTab() {\n return this.tabManager ? this.tabManager.$selectedTab : undefined;\n },\n /**\n * @deprecated in 3.7.0\n */\n get selectedTabIndex() {\n return this.tabManager\n ? this.tabManager.$tabs.index(this.tabManager.$selectedTab)\n : undefined;\n },\n /**\n * @deprecated in 3.7.0\n */\n get $focusableTab() {\n return this.tabManager ? this.tabManager.$focusableTab : undefined;\n },\n /**\n * @param {(jQuery|HTMLElement|string)} tab\n * @deprecated in 3.7.0\n */\n selectTab: function (tab) {\n if (this.tabManager) {\n this.tabManager.selectTab(tab);\n }\n },\n /**\n * @deprecated in 3.7.0\n */\n deselectTab: function () {\n if (this.tabManager) {\n this.tabManager.deselectTab();\n }\n },\n\n handleWindowResize: function () {\n this.updateResponsiveTables();\n this.handleBreadcrumbVisibility();\n },\n\n breadcrumbItemsWrap: function () {\n if (!this.$breadcrumbItems[0]) return;\n\n this.$breadcrumbList.css(\n Craft.orientation === 'ltr' ? 'margin-right' : 'margin-left',\n ''\n );\n const listWidth = this.$breadcrumbList[0].getBoundingClientRect().width;\n let totalItemWidth = 0;\n\n // Iterate through all list items (inclusive of more button)\n const $items = this.$breadcrumbList.find('li');\n for (let i = 0; i < $items.length; i++) {\n totalItemWidth += $items.get(i).getBoundingClientRect().width;\n }\n\n this.breadcrumbListWidth = listWidth;\n\n if (totalItemWidth <= listWidth) {\n return false;\n }\n\n // If it's less than a pixel off, it's probably just a rounding error.\n // Give the container an extra pixel to be safe, though\n if (totalItemWidth < listWidth + 1) {\n this.$breadcrumbList.css(\n Craft.orientation === 'ltr' ? 'margin-right' : 'margin-left',\n '-1px'\n );\n return false;\n }\n\n return true;\n },\n\n handleBreadcrumbVisibility: function () {\n if (!this.breadcrumbItemsWrap()) return;\n\n if (this.$breadcrumbList.find('[data-disclosure-item]').length === 0) {\n this.$breadcrumbList.append(this.breadcrumbDisclosureItem);\n }\n\n const triggerWidth = this.$breadcrumbList.find(\n '[data-disclosure-item]'\n )[0].offsetWidth;\n let visibleItemWidth = triggerWidth;\n let finalIndex;\n let newWidth;\n const listWidth = this.breadcrumbListWidth;\n\n // Find breadcrumbs that should remain visible without overflowing\n this.$breadcrumbItems.each(function (index) {\n newWidth = visibleItemWidth + this.offsetWidth;\n\n if (newWidth < listWidth) {\n finalIndex = index;\n visibleItemWidth += this.offsetWidth;\n } else {\n return false;\n }\n });\n\n // Separate breadcrums that should remain visible vs. hidden\n const shownItems = this.$breadcrumbItems.slice(0, finalIndex + 1);\n const hiddenItems = this.$breadcrumbItems.slice(finalIndex + 1);\n\n // Empty list DOM and add shown items and trigger item\n this.$breadcrumbList.html('');\n this.$breadcrumbList.append(shownItems);\n this.$breadcrumbList.append(this.breadcrumbDisclosureItem);\n\n // Add hidden items to disclosure menu and initialize\n this.$breadcrumbList\n .find('[data-disclosure-menu] ul')\n .append(hiddenItems);\n this.$breadcrumbList.find('[data-disclosure-trigger]').disclosureMenu();\n },\n\n updateResponsiveTables: function () {\n for (\n this.updateResponsiveTables._i = 0;\n this.updateResponsiveTables._i < this.$collapsibleTables.length;\n this.updateResponsiveTables._i++\n ) {\n this.updateResponsiveTables._$table = this.$collapsibleTables.eq(\n this.updateResponsiveTables._i\n );\n this.updateResponsiveTables._containerWidth =\n this.updateResponsiveTables._$table.parent().width();\n this.updateResponsiveTables._check = false;\n\n if (this.updateResponsiveTables._containerWidth > 0) {\n // Is this the first time we've checked this table?\n if (\n typeof this.updateResponsiveTables._$table.data(\n 'lastContainerWidth'\n ) === 'undefined'\n ) {\n this.updateResponsiveTables._check = true;\n } else {\n this.updateResponsiveTables._isCollapsed =\n this.updateResponsiveTables._$table.hasClass('collapsed');\n\n // Getting wider?\n if (\n this.updateResponsiveTables._containerWidth >\n this.updateResponsiveTables._$table.data('lastContainerWidth')\n ) {\n if (this.updateResponsiveTables._isCollapsed) {\n this.updateResponsiveTables._$table.removeClass('collapsed');\n this.updateResponsiveTables._check = true;\n }\n } else if (!this.updateResponsiveTables._isCollapsed) {\n this.updateResponsiveTables._check = true;\n }\n }\n\n // Are we checking the table width?\n if (this.updateResponsiveTables._check) {\n if (\n this.updateResponsiveTables._$table.width() - 30 >\n this.updateResponsiveTables._containerWidth\n ) {\n this.updateResponsiveTables._$table.addClass('collapsed');\n }\n }\n\n // Remember the container width for next time\n this.updateResponsiveTables._$table.data(\n 'lastContainerWidth',\n this.updateResponsiveTables._containerWidth\n );\n }\n }\n },\n\n updateFixedHeader: function () {\n if (this.isMobile) {\n return;\n }\n\n // Have we scrolled passed the top of #main?\n if (\n this.$main.length &&\n this.$headerContainer[0].getBoundingClientRect().top < 0\n ) {\n if (!this.fixedHeader) {\n var headerHeight = this.$headerContainer.height();\n\n // Hard-set the minimum content container height\n this.$contentContainer.css(\n 'min-height',\n 'calc(100vh - ' + (headerHeight + 14 + 48 - 1) + 'px)'\n );\n\n // Hard-set the header container height\n this.$headerContainer.height(headerHeight);\n Garnish.$bod.addClass('fixed-header');\n\n // Fix the sidebar and details pane positions if they are taller than #content-container\n var contentHeight = this.$contentContainer.outerHeight();\n var $detailsHeight = this.$details.outerHeight();\n var css = {\n top: headerHeight + 'px',\n 'max-height': 'calc(100vh - ' + headerHeight + 'px)',\n };\n this.$sidebar.addClass('fixed').css(css);\n this.$details.addClass('fixed').css(css);\n this.fixedHeader = true;\n }\n } else if (this.fixedHeader) {\n this.$headerContainer.height('auto');\n Garnish.$bod.removeClass('fixed-header');\n this.$contentContainer.css('min-height', '');\n this.$sidebar.removeClass('fixed').css({\n top: '',\n 'max-height': '',\n });\n this.$details.removeClass('fixed').css({\n top: '',\n 'max-height': '',\n });\n this.fixedHeader = false;\n }\n },\n\n /**\n * Dispays a notification.\n *\n * @param {string} type `notice`, `success`, or `error`\n * @param {string} message\n * @param {Object} [settings]\n * @param {string} [settings.icon] The icon to show on the notification\n * @param {string} [settings.iconLabel] The icon’s ARIA label\n * @param {string} [settings.details] Any additional HTML that should be included below the message\n * @returns {Object} The notification\n */\n displayNotification: function (type, message, settings) {\n const notification = new Craft.CP.Notification(type, message, settings);\n\n this.trigger('displayNotification', {\n notificationType: type,\n message,\n notification,\n });\n\n return notification;\n },\n\n /**\n * Displays a notice.\n *\n * @param {string} message\n * @param {Object} [settings]\n * @param {string} [settings.icon] The icon to show on the notification\n * @param {string} [settings.iconLabel] The icon’s ARIA label\n * @param {string} [settings.details] Any additional HTML that should be included below the message\n * @returns {Object} The notification\n */\n displayNotice: function (message, settings) {\n return this.displayNotification(\n 'notice',\n message,\n Object.assign(\n {\n icon: 'info',\n iconLabel: Craft.t('app', 'Notice'),\n },\n settings\n )\n );\n },\n\n /**\n * Displays a success notification.\n *\n * @param {string} message\n * @param {Object} [settings]\n * @param {string} [settings.icon] The icon to show on the notification\n * @param {string} [settings.iconLabel] The icon’s ARIA label\n * @param {string} [settings.details] Any additional HTML that should be included below the message\n * @returns {Object} The notification\n */\n displaySuccess: function (message, settings) {\n return this.displayNotification(\n 'success',\n message,\n Object.assign(\n {\n icon: 'check',\n iconLabel: Craft.t('app', 'Success'),\n },\n settings\n )\n );\n },\n\n /**\n * Displays an error.\n *\n * @param {string} message\n * @param {Object} [settings]\n * @param {string} [settings.icon] The icon to show on the notification\n * @param {string} [settings.iconLabel] The icon’s ARIA label\n * @param {string} [settings.details] Any additional HTML that should be included below the message\n * @returns {Object} The notification\n */\n displayError: function (message, settings) {\n if (!message || typeof message === 'object') {\n settings = message;\n message = Craft.t('app', 'A server error occurred.');\n }\n\n return this.displayNotification(\n 'error',\n message,\n Object.assign(\n {\n icon: 'alert',\n iconLabel: Craft.t('app', 'Error'),\n },\n settings\n )\n );\n },\n\n fetchAlerts: function () {\n return Craft.queue.push(\n () =>\n new Promise((resolve, reject) => {\n const data = {\n path: Craft.path,\n };\n Craft.sendActionRequest('POST', 'app/get-cp-alerts', {data})\n .then(({data}) => {\n resolve(data.alerts);\n })\n .catch(reject);\n })\n );\n },\n\n displayAlerts: function (alerts) {\n this.$alerts.remove();\n\n if (Garnish.isArray(alerts) && alerts.length) {\n this.$alerts = $('<ul id=\"alerts\"/>').prependTo($('#page-container'));\n\n for (var i = 0; i < alerts.length; i++) {\n $(\n `<li><span data-icon=\"alert\" aria-label=\"${Craft.t(\n 'app',\n 'Error'\n )}\"></span> ${alerts[i]}</li>`\n ).appendTo(this.$alerts);\n }\n\n var height = this.$alerts.outerHeight();\n this.$alerts\n .css('margin-top', -height)\n .velocity({'margin-top': 0}, 'fast');\n\n this.initAlerts();\n }\n },\n\n initAlerts: function () {\n // Are there any shunnable alerts?\n var $shunnableAlerts = this.$alerts.find('a[class^=\"shun:\"]');\n\n for (var i = 0; i < $shunnableAlerts.length; i++) {\n this.addListener($shunnableAlerts[i], 'click', (ev) => {\n ev.preventDefault();\n\n Craft.queue.push(\n () =>\n new Promise((resolve, reject) => {\n const $link = $(ev.currentTarget);\n const data = {\n message: $link.prop('className').substring(5),\n };\n Craft.sendActionRequest('POST', 'app/shun-cp-alert', {data})\n .then(() => {\n $link.parent().remove();\n resolve();\n })\n .catch(({response}) => {\n this.displayError(response.data.message);\n reject();\n });\n })\n );\n });\n }\n },\n\n checkForUpdates: function (forceRefresh, includeDetails, callback) {\n // Make 'includeDetails' optional\n if (typeof includeDetails === 'function') {\n callback = includeDetails;\n includeDetails = false;\n }\n\n // If forceRefresh == true, we're currently checking for updates, and not currently forcing a refresh,\n // then just set a new callback that re-checks for updates when the current one is done.\n if (\n this.checkingForUpdates &&\n ((forceRefresh === true && !this.forcingRefreshOnUpdatesCheck) ||\n (includeDetails === true && !this.includingDetailsOnUpdatesCheck))\n ) {\n var realCallback = callback;\n callback = () => {\n this.checkForUpdates(forceRefresh, includeDetails, realCallback);\n };\n }\n\n // Callback function?\n if (typeof callback === 'function') {\n if (!Garnish.isArray(this.checkForUpdatesCallbacks)) {\n this.checkForUpdatesCallbacks = [];\n }\n\n this.checkForUpdatesCallbacks.push(callback);\n }\n\n if (!this.checkingForUpdates) {\n this.checkingForUpdates = true;\n this.forcingRefreshOnUpdatesCheck = forceRefresh === true;\n this.includingDetailsOnUpdatesCheck = includeDetails === true;\n\n this._checkForUpdates(forceRefresh, includeDetails).then((info) => {\n this.updateUtilitiesBadge();\n this.checkingForUpdates = false;\n\n if (Garnish.isArray(this.checkForUpdatesCallbacks)) {\n var callbacks = this.checkForUpdatesCallbacks;\n this.checkForUpdatesCallbacks = null;\n\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i](info);\n }\n }\n\n this.trigger('checkForUpdates', {\n updateInfo: info,\n });\n });\n }\n },\n\n _checkForUpdates: function (forceRefresh, includeDetails) {\n return new Promise((resolve, reject) => {\n if (!forceRefresh) {\n this._checkForCachedUpdates(includeDetails)\n .then((info) => {\n if (info.cached) {\n resolve(info);\n return;\n }\n\n this._getUpdates(includeDetails).then((info) => {\n resolve(info);\n });\n })\n .catch(reject);\n } else {\n this._getUpdates(includeDetails).then(resolve).catch(reject);\n }\n });\n },\n\n _checkForCachedUpdates: function (includeDetails) {\n return new Promise(function (resolve, reject) {\n var data = {\n onlyIfCached: true,\n includeDetails: includeDetails,\n };\n\n Craft.sendActionRequest('POST', 'app/check-for-updates', {data})\n .then(({data}) => {\n resolve(data);\n })\n .catch(() => {\n resolve({cached: false});\n });\n });\n },\n\n _getUpdates: function (includeDetails) {\n return new Promise((resolve, reject) => {\n Craft.sendApiRequest('GET', 'updates')\n .then((updates) => {\n this._cacheUpdates(updates, includeDetails).then((data) => {\n resolve(data);\n });\n })\n .catch(reject);\n });\n },\n\n _cacheUpdates: function (updates, includeDetails) {\n return new Promise((resolve, reject) => {\n const data = {\n updates,\n includeDetails,\n };\n\n Craft.sendActionRequest('POST', 'app/cache-updates', {data})\n .then(({data}) => {\n resolve(data);\n })\n .catch(reject);\n });\n },\n\n updateUtilitiesBadge: function () {\n var $utilitiesLink = $('#nav-utilities').find('> a:not(.sel)');\n\n // Ignore if there is no (non-selected) Utilities nav item\n if (!$utilitiesLink.length) {\n return;\n }\n\n Craft.queue.push(\n () =>\n new Promise((resolve, reject) => {\n Craft.sendActionRequest('POST', 'app/get-utilities-badge-count')\n .then(({data}) => {\n // Get the existing utility nav badge and screen reader text, if any\n let $badge = $utilitiesLink.children('.badge');\n let $screenReaderText = $utilitiesLink.children(\n '[data-notification]'\n );\n\n if (data.badgeCount) {\n if (!$badge.length) {\n $badge = $(\n '<span class=\"badge\" aria-hidden=\"true\"/>'\n ).appendTo($utilitiesLink);\n }\n\n if (!$screenReaderText.length) {\n $screenReaderText = $(\n '<span class=\"visually-hidden\" data-notification/>'\n ).appendTo($utilitiesLink);\n }\n\n $badge.text(data.badgeCount);\n $screenReaderText.text(\n Craft.t(\n 'app',\n '{num, number} {num, plural, =1{notification} other{notifications}}',\n {\n num: data.badgeCount,\n }\n )\n );\n } else if ($badge.length && $screenReaderText.length) {\n $badge.remove();\n $screenReaderText.remove();\n }\n resolve();\n })\n .catch(reject);\n })\n );\n },\n\n runQueue: function () {\n if (!this.enableQueue) {\n return;\n }\n\n if (Craft.runQueueAutomatically) {\n Craft.queue.push(\n () =>\n new Promise((resolve, reject) => {\n Craft.sendActionRequest('POST', 'queue/run')\n .then(() => {\n this.trackJobProgress(false, true);\n resolve();\n })\n .catch(reject);\n })\n );\n } else {\n this.trackJobProgress(false, true);\n }\n },\n\n trackJobProgress: function (delay, force) {\n if (force && this.trackJobProgressTimeout) {\n clearTimeout(this.trackJobProgressTimeout);\n this.trackJobProgressTimeout = null;\n }\n\n // Ignore if we're already tracking jobs, or the queue is disabled\n if (this.trackJobProgressTimeout || !this.enableQueue) {\n return;\n }\n\n if (delay === true) {\n // Determine the delay based on how long the displayed job info has remained unchanged\n var timeout = Math.min(60000, this.displayedJobInfoUnchanged * 500);\n this.trackJobProgressTimeout = setTimeout(\n this._trackJobProgressInternal.bind(this),\n timeout\n );\n } else {\n this._trackJobProgressInternal();\n }\n },\n\n _trackJobProgressInternal: function () {\n Craft.queue.push(\n () =>\n new Promise((resolve, reject) => {\n Craft.sendActionRequest(\n 'POST',\n 'queue/get-job-info?limit=50&dontExtendSession=1'\n )\n .then(({data}) => {\n this.trackJobProgressTimeout = null;\n this.totalJobs = data.total;\n this.setJobInfo(data.jobs);\n if (this.jobInfo.length) {\n // Check again after a delay\n this.trackJobProgress(true);\n }\n resolve();\n })\n .catch(reject);\n })\n );\n },\n\n setJobInfo: function (jobInfo) {\n if (!this.enableQueue) {\n return;\n }\n\n this.jobInfo = jobInfo;\n\n // Update the displayed job info\n var oldInfo = this.displayedJobInfo;\n this.displayedJobInfo = this.getDisplayedJobInfo();\n\n // Same old same old?\n if (\n oldInfo &&\n this.displayedJobInfo &&\n oldInfo.id === this.displayedJobInfo.id &&\n oldInfo.progress === this.displayedJobInfo.progress &&\n oldInfo.progressLabel === this.displayedJobInfo.progressLabel &&\n oldInfo.status === this.displayedJobInfo.status\n ) {\n this.displayedJobInfoUnchanged++;\n } else {\n // Reset the counter\n this.displayedJobInfoUnchanged = 1;\n }\n\n this.updateJobIcon();\n\n // Fire a setJobInfo event\n this.trigger('setJobInfo');\n },\n\n /**\n * Returns info for the job that should be displayed in the control panel sidebar\n */\n getDisplayedJobInfo: function () {\n if (!this.enableQueue) {\n return null;\n }\n\n // Set the status preference order\n var statuses = [\n Craft.CP.JOB_STATUS_RESERVED,\n Craft.CP.JOB_STATUS_FAILED,\n Craft.CP.JOB_STATUS_WAITING,\n ];\n\n for (var i = 0; i < statuses.length; i++) {\n for (var j = 0; j < this.jobInfo.length; j++) {\n if (\n this.jobInfo[j].status === statuses[i] &&\n (statuses[i] !== Craft.CP.JOB_STATUS_WAITING ||\n !this.jobInfo[j].delay)\n ) {\n return this.jobInfo[j];\n }\n }\n }\n\n return null;\n },\n\n updateJobIcon: function () {\n if (!this.enableQueue || !this.$nav.length) {\n return;\n }\n\n if (this.displayedJobInfo) {\n if (!this.jobProgressIcon) {\n this.jobProgressIcon = new JobProgressIcon();\n }\n\n if (\n this.displayedJobInfo.status === Craft.CP.JOB_STATUS_RESERVED ||\n this.displayedJobInfo.status === Craft.CP.JOB_STATUS_WAITING\n ) {\n this.jobProgressIcon.hideFailMode();\n this.jobProgressIcon.setDescription(\n this.displayedJobInfo.description,\n this.displayedJobInfo.progressLabel\n );\n this.jobProgressIcon.setProgress(this.displayedJobInfo.progress);\n } else if (\n this.displayedJobInfo.status === Craft.CP.JOB_STATUS_FAILED\n ) {\n this.jobProgressIcon.showFailMode(Craft.t('app', 'Failed'));\n }\n } else {\n if (this.jobProgressIcon) {\n this.jobProgressIcon.hideFailMode();\n this.jobProgressIcon.complete();\n delete this.jobProgressIcon;\n }\n }\n },\n\n /**\n * Returns the active site for the control panel\n *\n * @returns {number}\n */\n getSiteId: function () {\n // If the old BaseElementIndex.siteId value is in localStorage, go aheand and remove & return that\n let siteId = Craft.getLocalStorage('BaseElementIndex.siteId');\n if (typeof siteId !== 'undefined') {\n Craft.removeLocalStorage('BaseElementIndex.siteId');\n try {\n this.setSiteId(siteId);\n } catch (e) {}\n }\n return Craft.siteId;\n },\n\n /**\n * Sets the active site for the control panel\n * @param {number} siteId\n */\n setSiteId: function (siteId) {\n const site = Craft.sites.find((s) => s.id === siteId);\n\n if (!site) {\n throw `Invalid site ID: ${siteId}`;\n }\n\n Craft.siteId = siteId;\n\n // update the base URLs used get Craft.getUrl(), etc.\n Craft.actionUrl = Craft.getUrl(Craft.actionUrl, {site: site.handle});\n Craft.baseCpUrl = Craft.getUrl(Craft.baseCpUrl, {site: site.handle});\n Craft.baseUrl = Craft.getUrl(Craft.baseUrl, {site: site.handle});\n\n // update the current URL\n const url = Craft.getUrl(document.location.href, {site: site.handle});\n history.replaceState({}, '', url);\n\n // update the site--x body class\n for (let className of document.body.classList) {\n if (className.match(/^site--/)) {\n document.body.classList.remove(className);\n }\n }\n document.body.classList.add(`site--${site.handle}`);\n\n // update other URLs on the page\n $('a').each(function () {\n if (\n this.hostname.length &&\n this.hostname === location.hostname &&\n this.href.indexOf(Craft.cpTrigger) !== -1\n ) {\n this.href = Craft.getUrl(this.href, {site: site.handle});\n }\n });\n },\n },\n {\n //maxWidth: 1051, //1024,\n\n /**\n * @deprecated in 4.2.0. Use Craft.notificationDuration instead.\n */\n notificationDuration: 5000,\n\n JOB_STATUS_WAITING: 1,\n JOB_STATUS_RESERVED: 2,\n JOB_STATUS_DONE: 3,\n JOB_STATUS_FAILED: 4,\n }\n);\n\nCraft.CP.Notification = Garnish.Base.extend({\n type: null,\n message: null,\n settings: null,\n closing: false,\n closeTimeout: null,\n _preventDelayedClose: false,\n $container: null,\n $closeBtn: null,\n originalActiveElement: null,\n\n init: function (type, message, settings) {\n this.type = type;\n this.message = message;\n this.settings = settings || {};\n\n this.$container = $('<div/>', {\n class: 'notification',\n 'data-type': this.type,\n }).appendTo(Craft.cp.$notificationContainer);\n\n const $body = $('<div class=\"notification-body\"/>')\n .appendTo(this.$container)\n .attr('role', 'status');\n\n if (this.settings.icon) {\n const $icon = $('<span/>', {\n class: 'notification-icon',\n 'data-icon': this.settings.icon,\n }).appendTo($body);\n if (this.settings.iconLabel) {\n $icon.attr({\n 'aria-label': this.settings.iconLabel,\n role: 'img',\n });\n } else {\n $icon.attr('aria-hidden', 'true');\n }\n }\n\n const $main = $('<div class=\"notification-main\"/>').appendTo($body);\n\n $('<div/>', {\n class: 'notification-message',\n text: this.message,\n }).appendTo($main);\n\n const $closeBtnContainer = $('<div/>').appendTo(this.$container);\n this.$closeBtn = $('<button/>', {\n type: 'button',\n class: 'notification-close-btn',\n 'aria-label': Craft.t('app', 'Close'),\n 'data-icon': 'remove',\n }).appendTo($closeBtnContainer);\n\n if (this.settings.details) {\n const $detailsContainer = $('<div class=\"notification-details\"/>')\n .append(this.settings.details)\n .appendTo($main);\n\n const $focusableElement = $detailsContainer.find('button,input');\n if ($focusableElement.length) {\n Garnish.uiLayerManager.addLayer(this.$container);\n Garnish.uiLayerManager.registerShortcut(Garnish.ESC_KEY, () => {\n this.close();\n });\n this.originalActiveElement = document.activeElement;\n this.$container.attr('tabindex', '-1').focus();\n this.$container.on('keydown', (ev) => {\n if (ev.keyCode === Garnish.ESC_KEY) {\n ev.stopPropagation();\n this.close();\n }\n });\n }\n }\n\n this.$container\n .css({\n opacity: 0,\n 'margin-bottom': this._negMargin(),\n })\n .velocity({opacity: 1, 'margin-bottom': 0}, {duration: 'fast'});\n\n Craft.initUiElements(this.$container);\n\n this.addListener(this.$closeBtn, 'click', 'close');\n\n if (Craft.notificationDuration) {\n this._initDelayedClose();\n }\n },\n\n _initDelayedClose: function () {\n if (this._preventDelayedClose) {\n return;\n }\n\n if (!Craft.isVisible()) {\n Garnish.$doc.one('visibilitychange', () => {\n this._initDelayedClose();\n });\n return;\n }\n\n this.delayedClose();\n\n this.$container.on(\n 'keypress keyup change focus blur click mousedown mouseup',\n (ev) => {\n if (ev.target != this.$closeBtn[0]) {\n this.$container.off(\n 'keypress keyup change focus blur click mousedown mouseup'\n );\n this.preventDelayedClose();\n }\n }\n );\n },\n\n _negMargin: function () {\n return `-${this.$container.outerHeight() + 12}px`;\n },\n\n close: function () {\n if (this.closing) {\n return;\n }\n\n if (this.closeTimeout) {\n clearTimeout(this.closeTimeout);\n this.closeTimeout = null;\n }\n\n this.closing = true;\n\n if (\n this.originalActiveElement &&\n document.activeElement &&\n (document.activeElement === this.$container[0] ||\n $.contains(this.$container[0], document.activeElement))\n ) {\n $(this.originalActiveElement).focus();\n }\n\n this.$container.velocity(\n {opacity: 0, 'margin-bottom': this._negMargin()},\n {\n duration: 'fast',\n complete: () => {\n this.$container.remove();\n },\n }\n );\n },\n\n delayedClose: function () {\n this.closeTimeout = setTimeout(() => {\n this.close();\n }, Craft.notificationDuration);\n\n // Hold off on closing automatically on hover\n this.$container.one('mouseover', () => {\n clearTimeout(this.closeTimeout);\n this.closeTimeout = null;\n\n this.$container.on('mouseout', (ev) => {\n if (ev.target == this.$container[0]) {\n this.$container.off('mouseout');\n this.delayedClose();\n }\n });\n });\n },\n\n preventDelayedClose: function () {\n this._preventDelayedClose = true;\n\n if (this.closeTimeout) {\n clearTimeout(this.closeTimeout);\n this.closeTimeout = null;\n }\n\n this.$container.off('mouseover mouseout');\n },\n});\n\nGarnish.$scrollContainer = Garnish.$win;\nCraft.cp = new Craft.CP();\n\n/**\n * Job progress icon class\n */\nvar JobProgressIcon = Garnish.Base.extend({\n $li: null,\n $a: null,\n $label: null,\n $progressLabel: null,\n\n progress: null,\n failMode: false,\n\n _$bgCanvas: null,\n _$staticCanvas: null,\n _$hoverCanvas: null,\n _$failCanvas: null,\n\n _staticCtx: null,\n _hoverCtx: null,\n _canvasSize: null,\n _arcPos: null,\n _arcRadius: null,\n _lineWidth: null,\n\n _arcStartPos: 0,\n _arcEndPos: 0,\n _arcStartStepSize: null,\n _arcEndStepSize: null,\n _arcStep: null,\n _arcStepTimeout: null,\n _arcAnimateCallback: null,\n\n _progressBar: null,\n\n init: function () {\n this.$li = $('<li/>').appendTo(Craft.cp.$nav.children('ul'));\n this.$a = $('<a/>', {\n id: 'job-icon',\n href: Craft.canAccessQueueManager\n ? Craft.getUrl('utilities/queue-manager')\n : null,\n }).appendTo(this.$li);\n this.$canvasContainer = $('<span class=\"icon\"/>').appendTo(this.$a);\n var $labelContainer = $('<span class=\"label\"/>').appendTo(this.$a);\n this.$label = $('<span/>').appendTo($labelContainer);\n this.$progressLabel = $('<span class=\"progress-label\"/>')\n .appendTo($labelContainer)\n .hide();\n\n let m = window.devicePixelRatio > 1 ? 2 : 1;\n this._canvasSize = 18 * m;\n this._arcPos = this._canvasSize / 2;\n this._arcRadius = 7 * m;\n this._lineWidth = 3 * m;\n\n this._$bgCanvas = this._createCanvas('bg', '#61666b');\n this._$staticCanvas = this._createCanvas('static', '#d7d9db');\n this._$hoverCanvas = this._createCanvas('hover', '#fff');\n this._$failCanvas = this._createCanvas('fail', '#da5a47').hide();\n\n this._staticCtx = this._$staticCanvas[0].getContext('2d');\n this._hoverCtx = this._$hoverCanvas[0].getContext('2d');\n\n this._drawArc(this._$bgCanvas[0].getContext('2d'), 0, 1);\n this._drawArc(this._$failCanvas[0].getContext('2d'), 0, 1);\n },\n\n setDescription: function (description, progressLabel) {\n this.$a.attr('title', description);\n this.$label.text(description);\n if (progressLabel) {\n this.$progressLabel.text(progressLabel).show();\n } else {\n this.$progressLabel.hide();\n }\n },\n\n setProgress: function (progress) {\n if (progress == 0) {\n this._$staticCanvas.hide();\n this._$hoverCanvas.hide();\n } else {\n this._$staticCanvas.show();\n this._$hoverCanvas.show();\n if (this.progress && progress > this.progress) {\n this._animateArc(0, progress / 100);\n } else {\n this._setArc(0, progress / 100);\n }\n }\n\n this.progress = progress;\n },\n\n complete: function () {\n this._animateArc(0, 1, () => {\n this._$bgCanvas.velocity('fadeOut');\n\n this._animateArc(1, 1, () => {\n this.$a.remove();\n this.destroy();\n });\n });\n },\n\n showFailMode: function (message) {\n if (this.failMode) {\n return;\n }\n\n this.failMode = true;\n this.progress = null;\n\n this._$bgCanvas.hide();\n this._$staticCanvas.hide();\n this._$hoverCanvas.hide();\n this._$failCanvas.show();\n\n this.setDescription(message);\n },\n\n hideFailMode: function () {\n if (!this.failMode) {\n return;\n }\n\n this.failMode = false;\n\n this._$bgCanvas.show();\n this._$staticCanvas.show();\n this._$hoverCanvas.show();\n this._$failCanvas.hide();\n },\n\n _createCanvas: function (id, color) {\n var $canvas = $(\n '<canvas id=\"job-icon-' +\n id +\n '\" width=\"' +\n this._canvasSize +\n '\" height=\"' +\n this._canvasSize +\n '\"/>'\n ).appendTo(this.$canvasContainer),\n ctx = $canvas[0].getContext('2d');\n\n ctx.strokeStyle = color;\n ctx.lineWidth = this._lineWidth;\n ctx.lineCap = 'round';\n return $canvas;\n },\n\n _setArc: function (startPos, endPos) {\n this._arcStartPos = startPos;\n this._arcEndPos = endPos;\n\n this._drawArc(this._staticCtx, startPos, endPos);\n this._drawArc(this._hoverCtx, startPos, endPos);\n },\n\n _drawArc: function (ctx, startPos, endPos) {\n ctx.clearRect(0, 0, this._canvasSize, this._canvasSize);\n ctx.beginPath();\n ctx.arc(\n this._arcPos,\n this._arcPos,\n this._arcRadius,\n (1.5 + startPos * 2) * Math.PI,\n (1.5 + endPos * 2) * Math.PI\n );\n ctx.stroke();\n ctx.closePath();\n },\n\n _animateArc: function (targetStartPos, targetEndPos, callback) {\n if (this._arcStepTimeout) {\n clearTimeout(this._arcStepTimeout);\n }\n\n this._arcStep = 0;\n this._arcStartStepSize = (targetStartPos - this._arcStartPos) / 10;\n this._arcEndStepSize = (targetEndPos - this._arcEndPos) / 10;\n this._arcAnimateCallback = callback;\n this._takeNextArcStep();\n },\n\n _takeNextArcStep: function () {\n this._setArc(\n this._arcStartPos + this._arcStartStepSize,\n this._arcEndPos + this._arcEndStepSize\n );\n\n this._arcStep++;\n\n if (this._arcStep < 10) {\n this._arcStepTimeout = setTimeout(this._takeNextArcStep.bind(this), 50);\n } else if (this._arcAnimateCallback) {\n this._arcAnimateCallback();\n }\n },\n});\n"],"names":["Craft","Accordion","Garnish","Base","extend","$trigger","targetSelector","_$target","init","trigger","this","$","data","console","warn","destroy","attr","addListener","event","key","keyCode","SPACE_KEY","RETURN_KEY","preventDefault","onTriggerClick","hideTarget","showTarget","$target","length","_currentHeight","height","removeClass","addClass","i","$t","prop","_targetHeight","css","overflow","velocity","getUserPreferredAnimationDuration","eq","$win","hasClass","removeData","base","AddressesInput","$container","$addBtn","$addBtnItem","$cards","container","settings","setSettings","defaults","find","closest","initCard","updateAddButton","createAddress","$card","ev","target","editAddress","$actionBtn","disclosureMenu","menu","$menu","$editBtn","stopPropagation","$deleteBtn","confirm","t","addressId","draftId","sendActionRequest","elementId","then","remove","not","createElementEditor","on","id","response","$newCard","html","replaceWith","insertBefore","initUiElements","add","canCreateAddress","maxAddresses","elementType","ownerId","element","AdminTable","totalItems","sorter","$noItems","$table","$tbody","$deleteBtns","allowDeleteAll","minItems","noItemsSelector","tableSelector","children","sortable","DataTableSorter","onSortChange","reorderItems","bind","handleDeleteBtnClick","updateUI","addRow","row","maxItems","$row","appendTo","addItems","ids","$items","idAttribute","push","JSON","stringify","reorderAction","onReorderItems","cp","displaySuccess","reorderSuccessMessage","displayError","reorderFailMessage","confirmDeleteItem","deleteItem","confirmDeleteMessage","name","getItemName","getItemId","deleteAction","handleDeleteItemSuccess","handleDeleteItemFailure","deleteFailMessage","removeItems","onDeleteItem","deleteSuccessMessage","escapeHtml","nameAttribute","hide","show","$moveButtons","newItemBtnSelector","noop","AssetImageEditor","Modal","$body","$footer","$imageTools","$buttons","$cancelBtn","$replaceBtn","$saveBtn","$focalPointBtn","$editorContainer","$straighten","$croppingCanvas","$spinner","$constraintContainer","$constraintRadioInputs","$customConstraints","canvas","image","viewport","focalPoint","grid","croppingCanvas","clipper","croppingRectangle","cropperHandles","cropperGrid","croppingShade","imageStraightenAngle","viewportRotation","originalWidth","originalHeight","imageVerticeCoords","zoomRatio","animationInProgress","currentView","assetId","cacheBust","draggingCropper","scalingCropper","draggingFocal","previousMouseX","previousMouseY","shiftKeyHeld","editorHeight","editorWidth","cropperState","scaleFactor","flipData","focalPointState","maxImageSize","lastLoadedDimensions","imageIsLoading","mouseMoveEvent","croppingConstraint","constraintOrientation","showingCustomConstraint","saving","renderImage","renderCropper","_queue","Queue","Date","now","allowDegreeFractions","isImagick","prefersReducedMotion","animationDuration","x","y","$bod","type","class","text","allowSavingAsNew","ui","createButton","label","spinner","saveImage","createSubmitButton","removeListener","$shade","getMaxImageSize","loadEditor","browserViewportWidth","$doc","get","documentElement","clientWidth","browserViewportHeight","clientHeight","Math","max","window","devicePixelRatio","alert","$tabs","$viewsContainer","$views","innerHeight","innerWidth","_showSpinner","updateSizeAndPosition","$customConstraintWrapper","filter","parent","append","size","value","val","test","fabric","StaticCanvas","width","enableRetinaScaling","requestAnimationFrame","renderAll","imageUrl","getActionUrl","Image","fromURL","imageObject","set","originX","originY","left","top","getHeight","getWidth","getScaledImageDimensions","_setFittedImageVerticeCoordinates","_repositionEditorElements","focalState","imageDimensions","offsetX","offsetY","focal","focalData","adjustedX","adjustedY","storeFocalPointState","_createFocalPoint","_createViewport","storeCropperState","_addControlListeners","_handleMouseMove","_handleMouseDown","_handleMouseUp","_handleMouseOut","_hideSpinner","first","_reloadImage","setSrc","outerHeight","previousEditorDimensions","setDimensions","currentScaledDimensions","getZoomToFitRatio","previouslyOccupiedArea","_getBoundingRectangle","_repositionCropper","getZoomToCoverRatio","_repositionImage","_repositionViewport","_repositionFocalPoint","_zoomImage","Rect","fill","globalCompositeOperation","sizeFactor","focalX","focalY","deltaX","deltaY","Group","Circle","radius","strokeWidth","stroke","toggleFocalPoint","dimensions","state","currentWidth","ratio","hasOrientationChanged","_","imageRatio","editorRatio","min","round","_getPrevTab","newTabIndex","activeTabIndex","_getActiveTabIndex","_getNextTab","_getActiveTab","$activeTab","index","_handleTabClick","LEFT_KEY","UP_KEY","$prevTab","activateTab","RIGHT_KEY","DOWN_KEY","$nextTab","rotateImage","flipImage","straighteningInput","SlideRuleInput","onStart","_showGrid","onChange","slider","straighten","onEnd","_hideGrid","_cleanupFocalPointAfterStraighten","SHIFT_KEY","_handleConstraintChange","_handleOrientationClick","_applyCustomConstraint","_handleConstraintClick","constraint","currentTarget","siblings","_showCustomConstraint","_hideCustomConstraint","setCroppingConstraint","enforceCroppingConstraint","$constraints","$constraint","labelSelector","$label","split","reverse","join","replace","_getCustomConstraint","w","h","parseFloat","isNaN","_setCustomConstraint","$tab","tab","view","tabindex","showView","enableSlider","disableSlider","Promise","resolve","reject","disableCropMode","enableCropMode","zoomFactor","degrees","parseInt","imageZoomRatio","newAngle","angle","scaledImageDimensions","viewportProperties","imageProperties","angleInRadians","PI","newDeltaX","cos","sin","newDeltaY","modifiedDeltaX","modifiedDeltaY","temp","animate","duration","onComplete","cleanAngle","_adjustFocalPointByAngle","_resetFocalPointPosition","axis","editorCenter","setValue","properties","scaleY","scaleX","previousAngle","_adjustEditorElementsOnStraighten","newCenterX","newCenterY","angleDelta","currentZoomRatio","adjustmentRatio","cropperCenterX","cropperCenterY","imageVertices","getImageVerticeCoords","rectangle","_getZoomRatioToFitRectangle","_isCenterInside","opacity","object","containingObject","newFocalX","newFocalY","adjustedFocalX","adjustedFocalY","containingVertices","vertex","rectangleVertices","_getRectangleVertices","verticeIndex","arePointsInsideRectangle","edge","_getEdgeCrossed","rectangleCenter","distanceFromVertexToEdge","abs","sqrt","pow","distanceFromCenterToEdge","$button","postData","imageRotation","cropData","zoom","onSave","broadcaster","postMessage","runQueue","Preview","refresh","message","scaledWidth","scaledHeight","boundingBox","_getImageBoundingBox","scale","vertScale","horiScale","getCombinedZoomRatio","strokeOptions","gridWidth","gridHeight","xStep","yStep","Line","onFadeOut","removeAllListeners","_editorModeTransition","cropperData","_showCropper","_hideCropper","targetZoom","inverseZoomFactor","imageOffsetX","imageOffsetY","callback","pause","resume","clipperData","_setupCropperLayer","_redrawCropperElements","backgroundColor","hoverCursor","selection","position","rectangleRatio","rectWidth","rectHeight","lineOptions","gridOptions","pathGroup","Path","cropTextTop","cropTextBackgroundColor","previousImageArea","currentOffset","areaFactor","coordinateSet","a","b","c","d","_isMouseOver","move","handle","_cropperHandleHitTest","pageX","pageY","_handleMouseMoveInternal","_handleFocalDrag","_handleCropperDrag","_handleCropperResize","_setMouseCursor","vertices","dxi","dyi","furthest","furthestDeltas","newX","newY","previousHeight","previousWidth","startingRectangle","_calculateNewCropperSizeByDeltas","cropperDirection","topDelta","leftDelta","change","match","isMobileBrowser","cursor","parentOffset","offset","mouseX","mouseY","lb","rb","tb","bb","topLeft","topRight","bottomRight","bottomLeft","zoomMode","topVerticalSegment","bottomVerticalSegment","rightHorizontalSegment","leftHorizontalSegment","verticalOffset","horizontalOffset","_debug","fabricObj","points","ab","_getVector","bc","scalarAbAb","_getScalarProduct","scalarBcBc","point","ap","bp","scalarAbAp","scalarBcBp","projectsOnAB","projectsOnBC","_getVectorMagnitude","vector","_getAngleBetweenVectors","acos","edgePoints","centerPoint","smallestDiff","edgeCrossed","edgeIndex","toCenter","edgeVector","toVertex","diff","box","proportion","AssetIndex","BaseElementIndex","$includeSubfoldersContainer","$includeSubfoldersCheckbox","showingIncludeSubfoldersCheckbox","$uploadButton","$uploadInput","$progressBar","$folders","uploader","promptHandler","progressBar","_uploadTotalFiles","_uploadFileProgress","_currentUploaderSettings","_assetDrag","_folderDrag","_expandDropTargetFolderTimeout","_tempExpandedFolders","_fileConflictTemplate","choices","title","_folderConflictTemplate","context","_initIndexPageMode","$main","modal","_positionProgressBar","initSources","initSource","$source","_createFolderContextMenu","getSourceLevel","updateDropTargets","deinitSource","contextMenu","selectable","multiSelect","DragDrop","activeDropTargetClass","helperOpacity","getSelectedElements","has","helper","$file","_getFileDragHelper","dropTargets","$draggee","targets","$sources","hasAttr","onDragStart","_onDragStart","onDropTargetChange","_onDropTargetChange","onDragStop","_onFileDragStop","helperBaseZindex","$draggeeHelper","$helperSidebar","$helperNav","$helperUl","draggedSourceIds","each","_getVolumeOrFolderUidFromSourceKey","inArray","_onFolderDragStop","$activeDropTarget","originatingSource","targetFolderId","originalAssetIds","originalAssetId","getElementInfo","setIndexBusy","resetProgressBar","setItemCount","showProgressBar","parameterArray","action","params","folderId","_performBatchRequests","onMoveFinish","responseArray","resetPrompts","conflict","addPrompt","suggestedFilename","prompt","error","setIndexAvailable","hideProgressBar","reloadIndex","performAfterMoveActions","sourceSelect","selectItem","_totalVisible","deselectAllElements","_collapseExtraExpandedFolders","updateElements","getPromptCount","fadeOutHelpers","showBatchPrompts","returnData","newParameterArray","choice","filename","force","apply","returnHelpersToDraggees","folderIds","sort","parentId","requestId","fileMoveList","newSourceKey","success","transferList","newFolderId","newFolderUid","merge","_performActualFolderMove","folderDeleteList","moveCallback","counter","limit","setInstanceState","refreshSources","_selectSourceByFolderId","$targetSource","_getSourceByKey","$parentSources","parents","$parentSource","selectSource","afterInit","style","addButton","PromptHandler","ProgressBar","options","url","fileInput","dropZone","events","fileuploadstart","_onUploadStart","fileuploadprogressall","_onUploadProgress","fileuploaddone","_onUploadSuccess","fileuploadalways","_onUploadAlways","fileuploadfail","_onUploadFailure","criteria","kind","allowedKinds","Uploader","isIndexBusy","getDefaultSourceKey","defaultSource","defaultSourceParts","volumeSource","toArray","s","subfolderSource","_getChildSources","_expandSource","onSelectSource","sourceKey","setParams","_updateUrl","$parent","nestedSources","$thisSource","getParentSource","unshift","uri","forEach","$s","setPath","m","startSearching","hideSidebar","floor","random","insertAfter","$search","$subContainer","setSelecetedSourceState","checked","getSelectedSourceState","marginBottom","stopSearching","complete","getViewParams","includeSubfolders","progress","loaded","total","setProgressPercentage","result","selectElementAfterUpdate","file","isLastUpload","_uploadFollowup","_updateAfterUpload","jqXHR","responseJSON","clearSearch","setSelectedSortAttribute","doFollowup","parameterIndex","followupAlways","incrementProcessedItemCount","updateProgressBar","followupSuccess","sourceAssetId","conflictingAssetId","targetFilename","followupFailure","onUpdateElements","_onUpdateElements","getAllElements","newElements","$newElements","removeAllItems","$elements","_onKeyDown","elementSelect","_onElementFocus","shiftKey","PreviewFileModal","openInstance","selfDestruct","$element","$focusedItem","_loadPreview","item","startingWidth","startingHeight","$outerContainer","$innerContainer","_$firstRowCells","$helperCells","$helperCell","$firstRowCell","$dropTarget","clearTimeout","dropTargetFolder","_hasSubfolders","_isExpanded","setTimeout","_expandFolder","dropTargetFolderId","$excludedSources","_collapseFolder","splice","getSourceActions","actions","onSelect","_createSubfolder","_renameFolder","destructive","_deleteFolder","menuOptions","onClick","ContextMenu","menuClass","$parentFolder","subfolderName","folderName","_prepareParentForChildren","$subfolder","folderUid","$a","_appendSubfolder","displayNotice","$targetFolder","folder","trim","_cleanUpTree","oldName","newName","initSourceToggle","$existingChildren","subfolderLabel","folderInserted","$existingChild","before","deinitSourceToggle","scrollTop","windowHeight","finalCallback","activeRequests","parameters","shift","registerElementIndexClass","AssetSelectInput","BaseElementSelectInput","hud","$uploadBtn","openPreviewTimeout","arguments","canUpload","_attachUploader","updateAddElementsBtn","$elementsContainer","openPreview","onAddElements","clearOpenPreviewTimeout","minGutter","formData","fieldId","sourceElementId","siteId","$addElementBtn","describedBy","multiple","csrfTokenName","csrfTokenValue","canAddMoreFiles","_onUploadComplete","next","enableAddElementsBtn","disableAddElementsBtn","selectUploadedFile","canAddMoreElements","$newElement","prepend","margin","outerWidth","animateCss","addElements","thumbSize","viewMode","appendHeadHtml","headHtml","slotsTaken","AssetSelectorModal","BaseElementSelectorModal","$selectTransformBtn","_selectedTransform","transforms","createSelectTransformButton","$btnGroup","$primaryButtons","$selectBtn","$menuList","MenuButton","MenuBtn","onOptionSelect","onSelectTransform","disable","onSelectionChange","$selectedElements","elementIndex","allowTransforms","enable","option","transform","selectImagesWithTransform","transformUrls","imageIdsWithMissingUrls","$item","showFooterSpinner","fetchMissingTransformUrls","hideFooterSpinner","selectElements","pop","info","elementInfo","canSelectImageTransforms","registerElementSelectorModalClass","AuthManager","remainingSessionTime","checkRemainingSessionTimer","showLoginModalTimer","decrementLogoutWarningInterval","showingLogoutWarningModal","showingLoginModal","logoutWarningModal","loginModal","$logoutWarningPara","$passwordInput","$loginBtn","$loginErrorPara","submitLoginIfLoggedOut","username","updateRemainingSessionTime","setCheckRemainingSessionTimer","seconds","checkRemainingSessionTime","extendSession","ajax","dataType","textStatus","timeout","minSafeSessionTime","showLogoutWarningModal","checkInterval","showLoginModal","submitLogin","hideLogoutWarningModal","hideLoginModal","quickShow","$form","$logoutBtn","$renewSessionBtn","prependTo","autoShow","closeOtherModals","hideOnEsc","hideOnShadeClick","shadeClass","onFadeIn","updateLogoutWarningMessage","setInterval","decrementLogoutWarning","time","secondsToHumanTimeDuration","clearInterval","quick","quickHide","$inputContainer","$inputsFlexContainer","$passwordContainer","$buttonContainer","$passwordWrapper","PasswordInput","onToggleInput","$newPasswordInput","logout","redirectTo","renewSession","validatePassword","removeAttr","login","clearLoginError","loginName","password","showLoginError","shake","initialized","idPrefix","instanceState","sourceStates","sourceStatesStorageKey","searchTimeout","$sidebar","showingSidebar","rootSourceKey","sourceViewModes","$rootSource","sourcesByKey","$visibleSources","$sourceActionsContainer","$sourceActionsBtn","$toolbar","toolbarOffset","$searchContainer","$filterBtn","searching","searchText","sortByScore","trashed","drafts","$clearSearchBtn","$statusMenuBtn","$statusMenuContainer","statusMenu","status","$siteMenuBtn","siteMenu","$updateSpinner","$viewModeBtnContainer","viewModeBtns","_autoSelectElements","$countSpinner","$countContainer","$actionsContainer","page","resultSet","totalResults","$exportBtn","actionsHeadHtml","actionsBodyHtml","$selectAllContainer","$selectAllCheckbox","showingActionTriggers","exporters","exportersByType","_$triggers","_ignoreFailedRequest","_cancelToken","viewMenus","activeViewMenu","filterHuds","randomString","getDefaultInstanceState","storageKey","getLocalStorage","toolbarSelector","menubtn","_handleStatusChange","$option","$options","_setSite","_handleSiteChange","defaultSiteId","getSiteId","$storedSiteOption","updateElementsIfSearchTextChanged","queryParams","getQueryParams","selector","selectOption","setQueryParam","selectDefaultSource","lastDashPos","lastIndexOf","substring","dir","setPage","pageNum","onAfterInit","_createCancelToken","axios","CancelToken","source","token","_cancelRequests","cancel","getSourceContainer","getSite","sites","_getSourcesInList","Select","multi","allowEmpty","vertical","_handleSourceSelectionChange","getQueryParam","getSourceByKey","refreshSourcesAction","expandedSources","indexOf","$toggle","_getSourceToggle","selectedSource","paths","path","getDefaultExpandedSources","updateSortField","storeInstanceState","setLocalStorage","getSourceState","defaultValue","viewState","k","hasOwnProperty","includes","storeSortAttributeAndDirection","getPageUrl","history","replaceState","_resetCount","updateSourceMenu","empty","groupedActions","administrative","group","_buildActionList","$ul","userIsAdmin","allowAdminChanges","createCustomizeSourcesModal","updateViewMenu","hideTrigger","ViewMenu","showTrigger","search","batchSize","canHaveDrafts","savedDraftsOnly","draftOf","condition","disabledElementIds","paginated","_isViewPaginated","getSortAttributeAndDirection","sortAttribute","sortDirection","order","collapsedElementIds","serialized","filters","preservePagination","pageChanged","updateElementsAction","cancelToken","$scrollContainer","_updateView","$elementContainer","getElementContainer","firstFocusableElement","e","showActionTriggers","_createTriggers","submitAction","actionParams","selectedElementIds","getSelectedElementIds","_findAction","viewParams","expandPostArray","elementAction","elementIds","download","downloadFromUrl","submitActionsAction","badgeCounts","_updateBadgeCounts","afterAction","actionClass","onAfterAction","hideActionTriggers","detach","updateActionTriggers","totalSelected","getEnabledElements","setStatus","getSelectedSortAttribute","attribute","getSortOption","getDefaultSort","getSelectedSortDirection","direction","setSortAttribute","sortOption","defaultDir","attributes","lastAttr","oldHistory","orderHistory","setSortDirection","setSelectedSortDirection","canSortByStructure","alt","getSortOptions","getSortLabel","getSelectedViewMode","parentsUntil","getRootSource","Object","keys","updateContentHeading","$firstOption","getViewModesForSource","sourceViewMode","$viewModeBtn","className","mode","icon","selectViewMode","doesSourceHaveViewMode","updateFilterBtn","urlParams","setUrl","getUrl","selectSourceByKey","sortOptions","o","defaultSort","getTableColumnOptions","getTableColumnOption","getDefaultTableColumns","getSelectedTableColumns","setSelectedTableColumns","tableColumns","updateTableColumnField","viewModes","createView","getViewClass","TableElementIndexView","ThumbsElementIndexView","rememberDisabledElementId","forgetDisabledElementId","enableElements","onEnableElements","disableElements","onDisableElements","getElementById","enableElementsById","makeArray","disableElementsById","getButtonContainer","isShowingSidebar","buttonContainer","CustomizeSourcesModal","onHide","onSelectSite","elements","$selectedItems","_handleActionTriggerSubmit","getPostData","_handleMenuActionTriggerSubmit","selectedOption","queryParam","firstSite","updateSourceVisibility","$heading","$headings","setSiteId","toString","_handleSelectionChange","_handleSourceDblClick","_toggleSource","_handleSourceToggleClick","prev","$list","topLevel","_collapseSource","$childSources","activeElement","document","_countResults","itemLabel","elementTypeNames","elementTypeName","toLowerCase","itemsLabel","elementTypePluralName","last","countLabel","items","$paginationContainer","totalPages","ceil","$paginationNav","$prevBtn","role","disabled","$nextBtn","appendBodyHtml","bodyHtml","selectAllElements","checkboxMode","body","contains","focus","selectElementById","$badge","countElementsAction","count","$btn","triggers","safeMenuActions","destructiveMenuActions","formatInputId","$menuTrigger","$safeList","_createMenuTriggerList","$destructiveList","$div","_showExportHud","typeOptions","$typeField","createSelectField","$formatField","$typeSelect","formattable","$limitField","createTextField","placeholder","$submitBtn","HUD","submitting","format","showFilterHud","FilterHud","showing","hasRules","$sortAttributeSelect","$sortDirectionPicker","sortDirectionListbox","$tableColumnsContainer","$revertContainer","$revertBtn","$closeBtn","_buildMenu","DisclosureMenu","tidyTableColumnField","FX_DURATION","$scoreOption","select","$lastContainer","lastIndex","$checkbox","$checkboxes","_getTableColumnCheckboxes","defaultOrder","map","column","reduce","obj","checkboxA","checkboxB","revert","$metaContainer","_createSortField","_createTableColumnsField","$footerContainer","_createRevertBtn","$sortAttributeSelectContainer","createSelect","Listbox","$selectedOption","$field","createField","fieldset","columns","createCheckbox","DragSort","_onTableColumnChange","$selectedCheckboxes","compare","loading","$clearBtn","cleared","$loadingContent","hudClass","$hud","$tip","hudHtml","$btnContainer","clear","setBusy","setReady","setFocus","elem","func","setFocusWithin","updateSizeAndPositionInternal","searchOffset","getBoundingClientRect","onShow","serialize","BaseElementIndexView","$loadingMoreSpinner","$scroller","thumbLoader","loadingMore","_morePending","_handleEnableElements","_handleDisableElements","setTotalVisible","setMorePending","ElementThumbLoader","load","isVerticalList","_handleElementEditing","isTouchCapable","maybeLoadMore","selectElement","selectAll","deselectAll","getTotalVisible","totalVisible","getMorePending","morePending","canLoadMore","loadMore","loadMoreElementsAction","getLoadMoreParams","appendElements","onAppendElements","off","elementSort","elementEditor","fieldLabel","_initialized","isPlainObject","normalizedSettings","args","modalStorageKey","maintainHierarchy","getContainer","getFieldLabel","getElementsContainer","getAddElementsBtn","getSpinner","initElementSelect","initElementSort","resetElements","getElements","$targetItem","getSelectedItems","ignoreHandleSelector","getElementSortAxis","collapseDraggees","magnetStrength","helperLagBase","resetItemOrder","updateButtonContainer","showSpinner","hideSpinner","focusNextLogicalElement","focusLastRemoveBtn","$removeBtns","removeElements","editable","_handleShowElementEditor","removeElement","BACKSPACE_KEY","DELETE_KEY","assign","elementSelectInput","prevalidate","replaceElement","replacementId","$existing","$nextDeleteBtn","lastElementIndex","onRemoveElements","$allElements","_animateStructureElementAway","animateElementAway","right","REMOVE_FX_DURATION","showModal","createModal","createElementSelectorModal","getModalSettings","sources","hideOnSelect","showSiteMenu","getDisabledElementIds","onModalSelect","onModalHide","triggerElement","modalTitle","modalSettings","allowSelfRelations","selectStructuredElements","slotsLeft","slice","updateDisabledElementsInModal","createNewElement","appendElement","animateElementIntoPlace","onSelectElements","disableCancelBtn","disableSelectBtn","containerId","branchLimit","selectionLabel","onResponse","enableCancelBtn","enableSelectBtn","$newElementsContainer","filteredElements","clone","removeText","setElementSize","single","$modalElement","$inputElement","origOffset","destOffset","$helper","zIndex","ADD_FX_DURATION","$li","editorSettings","supportSidebarToggleView","$content","$sourceToggles","$sidebarToggleBtn","$sidebarCloseBtn","$mainHeading","$secondaryButtons","$headingId","fullscreen","updateModalBottomPadding","footerHeight","updateSidebarView","sidebarShouldBeHidden","buildSidebarToggleView","resetView","$mainHeader","$sidebarHeader","getActiveSourceName","toggle","controls","closeSidebar","toggleSidebar","sidebarIsOpen","openSidebar","uiLayerManager","addLayer","registerShortcut","ESC_KEY","$focusedEl","getFocusedElement","removeLayer","_createElementIndex","updateSelectBtnState","updateHeading","clearMouseUpTimeout","disableElementsOnSelect","bodyAction","createElementIndex","indexSettings","touchData","firstTap","secondTap","resizable","onCancel","BaseInputGenerator","listening","startListening","setNewSource","stopListening","onSourceTextChange","updateTarget","onTargetTextChange","onFormSubmit","is","sourceVal","targetVal","generateTargetValue","dispatchEvent","InputEvent","inputType","Event","selectFullValue","CategoryIndex","editableGroups","$newCategoryBtnGroup","$newCategoryBtn","updateButton","editableCategoryGroups","g","uid","defaultGroupHandle","selectedSourceHandle","$menuBtn","selectedGroup","menuId","visibleLabel","ariaLabel","isCtrlKeyPressed","originalEvent","button","open","_createCategory","$menuContainer","anchorRole","href","groupId","location","cpEditUrl","fresh","groupSourceKey","CategorySelectInput","selectedCategoryIds","categoryIds","$allCategories","_animateCategoryAway","charts","DataTable","rows","cellIndex","parseTime","d3","timeParse","Tip","setContent","setPosition","BaseChart","$chart","chartBaseClass","dataTable","formatLocale","timeFormatLocale","orientation","svg","globalSettings","formats","d3Formats","formatLocaleDefinition","d3FormatLocaleDefinition","timeFormatLocaleDefinition","d3TimeFormatLocaleDefinition","resize","baseSettings","draw","chartClass","onAfterDrawTicks","tickKey","tick","$tickText","numberFormat","percentFormat","currencyFormat","shortDateFormats","day","month","year","bottom","colors","Area","tip","drawingArea","getChartMargin","translateX","translateY","drawTicks","drawAxes","drawChart","drawTipTriggers","getX","xAxis","axisBottom","tickFormat","getXFormatter","ticks","call","yAxis","getY","axisLeft","getYFormatter","tickValues","getYTickValues","axisRight","showAxis","tickSizeOuter","gridlines","xLineAxis","tickSize","yLineAxis","line","datum","area","y0","y1","plots","enter","tips","chartMargin","xAxisTickInterval","node","getTotalLength","tipTriggerWidth","$xValue","$yValue","content","values","yTicksMaxWidth","computedTickWidth","formatter","padded","xDomainMin","xDomainMax","xDomain","scaleTime","range","domain","yDomain","getYMaxValue","scaleLinear","utils","getTimeFormatter","getNumberFormatter","maxValue","getDuration","secondsNum","hours","minutes","chartSettings","dataScale","ColorInput","$input","$colorContainer","$colorPreview","$colorInput","createColorInput","handleTextChange","input","createElement","setAttribute","updateColor","repeat","_browserSupportsColorInputs","doesBrowserSupportColorInputs","CpScreenSlideout","Slideout","namespace","showingLoadSpinner","hasTabs","hasCpLink","hasSidebar","$header","$tabContainer","$loadSpinner","$editLink","$sidebarBtn","$noticeContainer","tabManager","ignoreFailedRequest","fieldsWithErrors","ltr","showSidebar","$contents","containerElement","containerAttributes","method","novalidate","closeOnEsc","closeOnShadeClick","S_KEY","ctrl","handleSubmit","closeMeMaybe","refreshInitialData","showLoadSpinner","getParams","headers","requestOptions","update","deltaNames","initialDeltaValues","hideLoadSpinner","updateHeaderVisibility","forceShow","showHeader","submitButtonLabel","updateTabs","tabs","formAttributes","setElementAttributes","editUrl","sidebar","hostname","notice","Tabs","_closedSidebarStyles","offsetWidth","_openedSidebarStyles","one","trapFocusWithin","showSubmitSpinner","hideSubmitSpinner","submit","findDeltaData","handleSubmitResponse","handleSubmitError","clearErrors","notificationSettings","modelName","closeOnSubmit","close","isAxiosError","errors","showErrors","entries","fieldErrors","addErrorsToField","clearErrorsFromField","isDirty","isOpen","rxhtmlTag","jQuery","htmlPrefilter","navHeight","arr","isArray","grouped","thisKey","category","translations","formatMessage","pattern","tokens","_tokenizePattern","_parseToken","start","pos","depth","chars","param","arg","number","formatNumber","plural","selectorChars","p","formatDate","date","datepicker","datepickerOptions","dateFormat","shortcutText","clientOs","str","escapeRegex","getText","encodeUriComponent","encodeURIComponent","differences","chr","re","RegExp","setSelectionRange","inputName","rtrim","baseUrl","anchor","anchorPos","fromEntries","URLSearchParams","qsPos","isEmptyObject","pathParam","pathMatch","omitScriptNameInUrls","usePathInfo","scriptName","getCpUrl","baseCpUrl","getSiteUrl","baseSiteUrl","actionUrl","hash","origin","pathname","qs","pageTrigger","pageParam","getCsrfInput","postActionRequest","contentType","_actionHeaders","errorThrown","readyState","send","registeredAssetBundles","registeredJsFiles","toUpperCase","actionName","namespaceInputName","v","getTime","request","sendApiRequest","_getApiHeaders","apiHeaders","baseURL","baseApiUrl","apiParams","_apiHeaders","processCraftHeaders","httpProxy","proxy","apiResponse","_processApiHeaders","_loadingApiHeaders","_apiHeaderWaitlist","_rejectApiRequests","clearCachedApiHeaders","XMLHttpRequest","setRequestHeader","responseType","onload","disposition","getResponseHeader","matches","exec","blob","Blob","link","URL","createObjectURL","appendChild","click","removeChild","stringToArray","oldData","newData","modifiedDeltaNames","groupedOldParams","_groupParamsByDeltaNames","groupedNewParams","__root__","n","concat","withRoot","initialValues","encodeURIComponentExceptEqualChar","decodeURIComponent","paramLoop","paramName","serializeParam","subName","expanded","parentElem","createForm","chunks","obj1","obj2","sortObjectKeys","Array","getObjectKeys","escapeChars","escaped","ltrim","startsWith","substr","filterArray","filtered","removeFromArray","getLast","uppercaseFirst","charAt","lowercaseFirst","parseUrl","scheme","host","port","query","Proxy","searchParams","isSameHost","requestUrlInfo","urlInfo","showSeconds","secondsInWeek","weeks","days","timeComponents","asciiString","charMap","normalize","char","asciiStr","asciiCharMap","uuid","crypto","randomUUID","getRandomValues","Uint8Array","namespaceId","createErrorList","$existingCss","existingCss","regexp","$existingJs","src","existingJs","appendFootHtml","infoicon","checkboxselect","fieldtoggle","lightswitch","nicetext","formsubmit","datetime","datetimeinput","_elementIndexClasses","_elementSelectorModalClasses","_elementEditorClasses","registerElementEditorClass","ElementEditorSlideout","systemUid","localStorage","parse","removeLocalStorage","removeItem","getCookie","cookie","setCookie","defaultCookieOptions","maxAge","expires","toUTCString","secure","removeCookie","hasThumb","otherSize","$oldImg","$newImg","sizes","srcset","picturefill","submitForm","redirect","retainScroll","scrollY","filterInputVal","regex","selectionStart","newVal","filterNumberInputVal","dataAttributes","subValue","isVisible","visibilityState","useMobileStyles","pageId","BroadcastChannel","channelName","appId","messageReceiver","addEventListener","instances","elementHtml","$replacement","$inputs","fn","animateLeft","easing","animateRight","$elem","itemSelector","cols","maxCols","minColWidth","fillMode","colClass","snapToGrid","Grid","InfoIcon","CheckboxSelect","FieldToggle","settingName","settingValue","thisSettings","indeterminateValue","LightSwitch","NiceText","$anchor","customTrigger","menuAnchor","$wrapper","checkValue","hasValue","charsLeftHtml","charsLeft","ready","$elementIndexSourcesContainer","$sourcesContainer","$sourcesHeader","$sourcesHeading","$sourceSettingsContainer","$sourceSettingsHeader","$addSourceMenu","addSourceMenu","$footerBtnContainer","$loadingSpinner","sourceSort","baseSortOptions","availableTableAttributes","customFieldAttributes","conditionBuilderHtml","conditionBuilderJs","userGroups","setContainer","buildModal","defaultSortOptions","addSource","$menuBtnContainer","sourceData","scrollContainerToElement","$newHeadingBtn","focusLabelInput","$newCustomSourceBtn","tableAttributes","$labelInput","getSourceName","focusIsInside","currentLayer","isNew","$itemLabel","$itemInput","Heading","updateItemLabel","heading","Source","CustomSource","save","disabledSourceKeys","reload","appendIndexSourceItem","$sourceItem","$lastSourceItem","isHeading","$lastTopLevelSource","BaseSource","$settingsContainer","handleActivatingKeypress","isNative","isSelected","deselect","createSettings","getIndexSourceItem","$sortDirectionInput","createLightswitchField","createSortField","createTableAttributesField","handleSortAttributeChange","useDefaultDir","$columnCheckboxes","selectedAttributes","createTableColumnOption","instructions","$labelField","defaultId","swapPlaceholders","createCheckboxSelectField","showAllOption","handleLabelInputChange","table","$rows","getHelper","caboose","Y_AXIS","$helperRow","helperClass","$cells","DeleteUserModal","userId","$deleteActionRadios","$deleteSubmitBtn","userSelect","_deleting","idParam","contentSummary","_submitBtnLabel","validateDeleteInputs","withContent","num","validates","onSubmit","DynamicGenerator","EditableTable","baseName","biggestId","$addRowBtn","$tableParent","$statusMessage","rowCount","hasMaxRows","hasMinRows","radioCheckboxes","copyDraggeeInputValuesToHelper","updateAllRows","initialize","initializeIfVisible","minRows","createRowObj","updateAddRowButton","canAddRow","staticRows","updateRow","canDeleteRow","updateDeleteRowButton","rowId","updateStatusMessage","allowDelete","deleteRow","$tr","onDeleteRow","allowAdd","maxRows","rowIdPrefix","createRow","defaultValues","onAddRow","allowReorder","Row","focusOnPrevRow","tdIndex","blurTd","prevRow","$prevTr","$tds","focusOnNextRow","nextRow","$nextTr","importData","lines","j","textualColTypes","colId","$cell","col","scope","code","small","createDateInput","createLightswitch","createTimeInput","createTextInput","niceTexts","tds","$textareas","tr","td","$textarea","textareasByColId","onHeightChange","onTextareaHeightChange","radioMode","applyToggleCheckbox","autopopulate","HandleGenerator","allowNonAlphaStart","onTextareaFocus","onRadioCheckboxChange","checkbox","checkboxColId","neg","checkboxCol","colum","ignoreNextTextareaFocus","handleKeypress","charCode","handlePaste","clipboardData","getData","validateValue","safeValue","tallestTextareaHeight","tdHeight","numericKeyCodes","ElementActionTrigger","maxLevels","newChildUrl","triggerEnabled","batch","bulk","defineProperty","activate","updateTrigger","validateSelection","enableTrigger","disableTrigger","valid","handleTriggerActivation","ElementEditor","isFullPage","$contentContainer","$revisionBtn","$revisionLabel","$expandSiteStatusesBtn","$statusIcon","$previewBtn","$editMetaBtn","metaHud","$nameTextInput","$saveMetaBtn","$siteStatusPane","$globalLightswitch","$siteLightswitches","$additionalSiteField","siteIds","newSiteIds","enableAutosave","lastSerializedValue","listeningForChanges","pauseLevel","queue","submittingForm","duplicatedElements","failed","httpStatus","httpError","openingPreview","preview","activatedPreviewToken","previewTokenQueue","previewLinks","hiddenTipsStorageKey","tipDismissBtn","slideout","$primaryForm","_createQueue","autosaveDrafts","siteStatuses","$spinnerContainer","canEditMultipleSites","previewTargets","enablePreview","$previewBtnContainer","createPreviewLink","createShareMenu","revisionId","serializeForm","isProvisionalDraft","initForProvisionalDraft","isUnpublishedDraft","initForDraft","canSaveCanonical","saveShortcut","createDraft","listenForChanges","showStatusHud","handleDismissibleTips","canonicalId","canCreateDrafts","statusIcons","checkForm","stopListeningForChanges","$discardButton","initialHeight","$notice","heightDiff","hashedCpEditUrl","provisional","createEditMetaBtn","expandSiteStatuses","$enabledForSiteField","_getOtherSupportedSites","_createSiteStatusField","$globalField","_showField","siteStatusValues","hasEnabled","hasDisabled","originalEnabledValue","originalSerializedStatus","enabledForSite","_updateGlobalStatus","serializedStatuses","additionalSites","_createAddlSiteField","_updateSiteStatuses","_removeField","allEnabled","allDisabled","turnOn","turnOff","turnIndeterminate","enabled","site","fieldClass","$lightswitch","some","selectLabelId","$addlSiteSelectLabel","$addlSiteSelectContainer","labelledBy","$addlSiteSelect","addlSiteInfo","enabledByDefault","_saveFailMessage","_saveSuccessMessage","$mainContainer","spinners","statusMessage","getTokenizedPreviewUrl","targetUrl","targetLabel","activatePreviewToken","updatePreviewLinks","updatePreviewLinkHref","isLive","getPreviewTokenParams","previewToken","getPreviewToken","randoParam","asPromise","siteToken","previewUrl","tokenParam","createTokenParams","getPreview","$statusIcons","scrollTo","ensureIsDraftOrRevision","onlyIfChanged","removeActionParams","isPreviewActive","$editor","redirectName","saveDraft","isActive","modifiedFieldNames","preparedData","prepareData","deltaName","extraData","visibleLayoutElements","selectedTabId","_saveHeaders","_afterSaveDraft","createdProvisionalDraft","docTitle","draftName","revisionMenu","oldId","siteSettings","creator","timestamp","updatePreviewTargets","checkMetaValues","selectors","modifiedAttributes","$fields","noChanges","$allTabContainers","changedElements","missingElements","tabInfo","$oldElement","$placeholder","$unusedTabContainers","afterUpdate","_showFailStatus","setStatusMessage","deltaCallback","swapDuplicatedElementIds","idsRE","namespacedFields","pre","post","_filterFieldInputName","nestedNames","lastHandle","fieldsWithoutContent","newTarget","$previewLink","delay","showMetaHud","createMetaHud","onMetaHudShow","$hudBody","$nameField","$nameInputContainer","saveMeta","onMetaHudHide","onMetaHudEscape","shakeMetaHud","autosave","$confirmUnloadForms","hideTip","getHiddenTipsUids","setHiddenTipsUids","uids","targetElement","$targetParent","layoutElementUid","Storage","hiddenTips","editor","saveParams","onSaveElement","validators","ElementFieldSettings","allowMultipleSources","$maintainHierarchyField","$maintainHierarchyInput","$sourcesField","$sourceSelect","$branchLimitField","$maxRelationsField","$minRelationsField","maintainHierarchyFieldId","sourcesFieldId","branchLimitFieldId","minRelationsFieldId","maxRelationsFieldId","updateLimitFields","updateMaintainHierarchyField","showField","$checkedInputs","workers","Worker","$thumbs","$thumb","$scrollParent","scrollParent","addToQueue","invisibleThumbs","thumb","active","loadNext","scrollParentOffset","scrollParentHeight","thumbOffset","retryAll","loader","$img","ElevatedSessionForm","inputs","form","getInputPostVal","handleFormSubmit","elevatedSessionManager","fetchingTimeout","stopImmediatePropagation","inputsChanged","$currentInput","requireElevatedSession","ElevatedSessionManager","passwordModal","$errorPara","minSafeElevatedSessionTimeout","showPasswordModal","$passwordModal","focusPasswordInput","submitPassword","currentPassword","showPasswordError","EntryIndex","publishableSections","$newEntryBtnGroup","$newEntryBtn","defaultSectionHandle","selectedSection","section","_createEntry","sectionId","entry","sectionSourceKey","FieldLayoutDesigner","$configInput","$newTabBtn","$libraryToggle","$selectedLibrary","$fieldLibrary","$uiLibrary","$uiLibraryElements","$fieldSearch","$clearFieldSearchBtn","$fieldGroups","tabGrid","elementDrag","_config","$workspace","$fieldSearchContainer","initTab","ElementDrag","customizableTabs","tabDrag","TabDrag","customizableUi","$libraryPicker","$matches","$group","Tab","removeFieldByHandle","addTab","updatePositionInConfig","config","updateConfig","createSlideout","contents","js","eval","designer","destroyed","settingsNamespace","createMenu","initElement","menuBtn","onTabOptionSelect","$prev","$next","settingsHtml","settingsJs","applySettings","$indicator","hasConditions","Element","findIndex","designerConfig","newIndex","tabConfig","oldIndex","isField","requirable","hasCustomWidth","hasSettings","isRequired","showSettings","initUi","SlidePicker","step","valueLabel","pct","$fieldsContainer","selectorHtml","updateRequiredClass","required","elementConfig","BaseDrag","Drag","$insertion","showingInsertion","$caboose","findItems","createInsertion","createCaboose","removeCaboose","swapDraggeeWithInsertion","swapInsertionWithDraggee","setMidpoints","getClosestItem","_closestItem","_closestItemMouseDiff","_i","_$item","_midpoint","_mouseDiff","getDist","checkForNewClosestItem","refreshCols","display","draggeeDisplay","visibility","helpers","_showDraggee","onDrag","draggingLibraryElement","draggingField","originalTab","isDraggeeMandatory","isHoveringOverTab","hitTest","$fieldContainers","$libraryElement","targetPrefix","reverseTargetSelector","_$reverseTarget","getType","normalizeTargetSelector","findTargets","onToggleChange","nodeName","getToggleVal","boolean","postVal","_show","totalCols","colGutterDrop","colPctWidth","possibleItemColspans","possibleItemPositionsByColspan","itemPositions","itemColspansByPosition","layouts","layout","itemHeights","leftPadding","_refreshingCols","_refreshColsAfterRefresh","_forceRefreshColsAfterRefresh","handleContainerHeightProxy","setItems","oldHeight","scrollHeight","gutter","itemIndex","tallestItemHeight","colIndex","itemHeight","remainder","itemHeightsByColspan","positionRight","positionLeft","minColspan","maxColspan","colspan","getItemWidthCss","minPosition","maxPosition","colHeights","createLayouts","layoutTotalCols","highestTotalCols","layoutHeights","shortestHeight","shortestLayouts","emptySpaces","emptySpace","colspans","getItemLeftPosCss","positions","isSimpleLayout","positionItems","completeRefreshCols","onRefreshCols","getItemWidth","getItemWidthInPx","getItemLeftPosInPx","prevPositions","prevColspans","prevColHeights","prevEmptySpace","LayoutGenerator","endingCol","affectedColHeights","onItemResize","newHeight","tallestColHeightsByPosition","colHeightsForPosition","tallestColHeight","words","handleCasing","ImageUpload","initImageUpload","containerSelector","uploadAction","postParameters","fileInputSelector","uploadParamName","initButtons","uploadButtonSelector","deleteButtonSelector","refreshImage","onAfterRefreshImage","$icon","$liveRegion","wrap","previousSibling","nodeType","Node","TEXT_NODE","nodeValue","showHud","closeOtherHUDs","indeterminate","dragger","dragStartMargin","outerContainer","X_AXIS","_onDrag","_onDragStop","muteEvent","changed","_onSettle","_getOffMargin","_onMouseDown","_onMouseUp","dragging","_getMargin","mouseDistX","selectedOptionIndex","selectedClass","focusClass","LivePreview","$extraFields","$dragHandle","$previewContainer","$iframeContainer","$iframe","$fieldPlaceholder","basePostData","inPreviewMode","fields","lastPostData","updateIframeInterval","checkAgain","dragStartEditorWidth","_slideInOnIframeLoad","_scrollX","_scrollY","_editorWidth","_editorWidthInPx","protocol","previewParams","extraFields","defaultEditorWidth","moveFieldsBack","editorWidthInPx","inPx","minEditorWidthInPx","exit","$editorHeader","handleWindowResize","getIframeWidth","$clone","_getClone","updateIframe","slideIn","createToken","previewAction","submitPrimaryForm","updateWidths","$newClone","field","contentWindow","scrollLeft","xhrFields","withCredentials","crossDomain","handleSuccess","handleError","forceUpdateIframe","write","copyInputValues","livePreview","$textInput","$showPasswordToggle","showingPassword","passwordInput","initInputFocusEvents","hidePassword","setCurrentInput","updateToggleLabel","showPassword","autocapitalize","togglePassword","onInputChange","selectionEnd","$previewWrapper","$previewSkipLink","$bumperLink","$notifier","$previewHeader","$targetBtn","$targetMenu","$deviceTypeContainer","$orientationBtn","$refreshBtn","$deviceMask","$devicePreviewContainer","iframeLoaded","$tempInput","activeTarget","currentDeviceType","deviceOrientation","deviceWidth","deviceHeight","deviceMaskDimensions","phone","tablet","iframeHeight","_updateIframeProxy","previewSkipLinkText","$modalLabel","Pro","switchTarget","_buildDeviceTypeFieldset","_getDeviceTypeTranslation","translation","_getDeviceOrientationTranslation","deviceType","deviceBtnGroup","switchDeviceType","_activeTarget","_autoRefresh","previewTarget","hideModalBackgroundLayers","resetModalBackgroundLayerVisibility","_devicePreviewIsActive","updateDevicePreview","_useIframeResizer","previewIframeResizerOptions","resetScroll","sameHost","frameborder","iFrameResize","checkOrigin","scrolling","onInit","iframe","_updateNotifier","newDeviceType","switchOrientation","hZoom","wZoom","previewHeight","previewWidth","maskHeight","maskWidth","translate","rotationDeg","marginTop","marginLeft","$triggerElement","$bumperButtonStart","$bumperButtonEnd","defaultSettings","_onHide","instance","loadAsset","focusItem","_addBumperButtons","_addModalName","headingId","destruct","desiredHeight","desiredWidth","containerHeight","containerWidth","_resizeContainer","previewHtml","$innerProgressBar","$progressBarStatus","_itemCount","_processedItemCount","_displaySteps","displaySteps","setProcessedItemCount","fadeTo","incrementItemCount","percentage","$modalContainerDiv","$prompt","$promptApplyToRemainingContainer","$promptApplyToRemainingCheckbox","$promptApplyToRemainingLabel","$pomptChoices","_prompts","_promptBatchCallback","_promptBatchReturnData","_promptBatchNum","_showNextPromptInBatch","remainingInBatch","_showPrompt","_handleBatchPromptSelection","applyToRemaining","choiceData","itemsToGo","_promptCallback","$promptMessage","$promptChoices","$promptButtons","$radioButton","_selectPromptChoice","fadeOut","_cancelPrompt","running","paused","pausedForVisibility","jobs","isPaused","_resume","job","_add","qResolve","qReject","_exec","totalSteps","HOME_KEY","END_KEY","_min","_max","Number","isInteger","prevAll","triggerEvent","$activeButton","startPositionX","graduationsMin","graduationsMax","slideMin","slideMax","$overlay","$cursor","$graduations","$graduationsUl","_handleResize","_handleTapStart","_handleTapMove","_handleTapEnd","_handleKeypress","graduationsCalculatedWidth","valueToPosition","current","PAGE_UP_KEY","PAGE_DOWN_KEY","touch","startLeft","curX","positionToValue","scaleMin","scaleMax","addModalAttributes","autoOpen","setTriggerElement","_cancelTransitionListeners","addPanel","removePanel","openPanels","panel","updateStyles","totalPanels","SlugGenerator","allowUppercaseInSlug","limitAutoSlugsToAscii","XRegExp","matchChain","slugWordSeparator","Structure","structureDrag","$parents","initToggle","StructureDrag","initNewChildMenus","viewStateKey","$addBtns","onNewChildMenuClick","showMenu","getIndent","level","baseIndent","nestedIndent","addElement","$parentUl","_removeUl","structure","draggeeLevel","$helperLi","$targets","draggeeHeight","$level","cancelDrag","$lis","$closestTarget","closestTargetPos","closestTargetYDiff","closestTargetOffset","closestTargetHeight","targetOffset","targetHeight","targetYMidpoint","targetYDiff","$closestTargetLi","closestTargetLevel","$nextTargetLi","nextTargetLevel","hoveringBetweenRows","draggeeX","targetItemMouseDiffX","$parentLis","$closestParentLi","closestParentLiXDiff","closestParentLevel","$parentLi","parentLiX","parentLiXDiff","parentLevel","onMouseUp","$draggeeParent","moved","$closestSiblings","newLevel","setLevel","structureId","prevId","indent","$childLis","StructureTableSorter","tableView","_basePadding","_helperMargin","_$titleHelperCell","_titleHelperCellOuterWidth","_ancestors","_updateAncestorsFrame","_draggeeLevel","_draggeeLevelDelta","draggingLastElements","_loadingDraggeeLevelDelta","_targetLevel","_targetLevelBounds","_positionChanged","singleHelper","helperSpacingY","findDraggee","$nextRow","nextRowLevel","nextRowLevelDelta","_getAjaxBaseData","delta","drag","canInsertBefore","_getLevelBounds","canInsertAfter","_getAncestors","_setTargetLevelBounds","_updateIndent","onInsertionPointChange","_updateAncestorsBeforeRepaint","levelDiff","padding","_getLevelIndent","$prevRow","prevRowLevel","$spinnerRow","_createSpinnerRowAfter","onPositionChange","_expandElement","onReturnHelpersToDraggees","newDraggeeIndexes","oldDraggeeIndexes","$postDraggeeItems","nextAll","_minLevel","_maxLevel","forcePositionChange","_mouseDist","realMouseX","mousedownX","_indentationDist","LEVEL_INDENT","_targetLevelMouseDiff","_magnetImpact","MAX_GIVE","_closestLevelMagnetIndent","targetLevel","_level","_$prevRow","cancelAnimationFrame","_updateAncestors","_$ancestor","_newAncestors","ancestorTitle","HELPER_MARGIN","$tableCaption","$selectedSortHeader","structureTableSort","_totalVisiblePostStructureTableDraggee","_morePendingPostStructureTableDraggee","_broadcastListener","initTableHeaders","_updateScreenReaderStatus","_collapseElement","attributeHtml","selectedSortAttr","$tableHeaders","sortValue","selectedSortDir","makeColumnSortable","sorted","headerHtml","$instructions","$headerButton","_handleSelectedSortHeaderClick","_handleUnselectedSortHeaderClick","_isStructureTableDraggingLastElements","positionedAfter","updateResponsiveTables","$nextNextRow","descendantOf","$nextRows","newSortDir","_handleSortHeaderClick","_updateTableAttributes","removeEventListener","$tablist","$firstTab","$lastTab","$selectedTab","$focusableTab","selectTab","makeTabFocusable","scrollToTab","updateMenuBtn","_getTab","deselectTab","elemScrollOffset","targetScrollLeft","tabWidth","ulWidth","HTMLElement","TagSelectInput","searchMenu","$addTagInput","_ignoreBlur","searchForTags","selectTag","$hoverOption","$nextOption","focusOption","$prevOption","killSearchMenu","excludeIds","tagGroupId","tags","exclude","exactMatch","Menu","attachToElement","targetSiteId","$titleContainer","autocomplete","inputmode","maxlength","autofocus","getAutofocusValue","getDisabledValue","readonly","showCharsLeft","createCopyTextInput","buttonId","execCommand","createCopyTextBtn","copyValue","createCopyTextField","createCopyTextPrompt","createTextarea","createTextareaField","$select","optgroup","$optgroup","selected","reverseToggle","for","createCheckboxField","createCheckboxSelect","allValue","allChecked","allLabel","labelId","$colorPreviewContainer","createColorField","isMobile","getMonth","toISOString","timezone","defaultDate","hasOuterContainer","createDateField","createDateRangePicker","today","getFullYear","getDate","startDate","endDate","$allOption","firstDayOffset","getDay","firstDay","$flex","$startDate","$endDate","$dateInputs","dpDiv","setPositionRelativeToAnchor","startTime","endTime","foundOption","btnClasses","timepicker","timepickerOptions","getHours","getMinutes","getSeconds","createTimeField","warning","$warning","addErrorsToList","$errors","_rejectedFiles","_extensionList","_totalFileCounter","_validFileCounter","autoUpload","fileupload","onFileAdd","paramObject","getInProgress","validateExtension","_createExtensionList","process","done","files","pass","fileExtension","maxFileSize","originalFiles","processErrorMessages","kinds","humanFileSize","maxUploadSize","bytes","threshold","u","toFixed","allowedKind","fileKinds","extensions","ext","pasteZone","sequentialUploads","Accept","UriFormatGenerator","uriFormat","suffix","UserIndex","updateUrl","defaultSourceSlug","slug","__esModule","default","module","locals","exports","listToStyles","list","styles","newStyles","part","media","sourceMap","parts","hasDocument","DEBUG","Error","stylesInDom","head","getElementsByTagName","singletonElement","singletonCounter","isProduction","ssrIdKey","isOldIE","navigator","userAgent","addStylesClient","_isProduction","_options","addStylesToDom","newList","mayRemove","domStyle","refs","addStyle","createStyleElement","styleElement","querySelector","parentNode","styleIndex","applyToSingletonTag","applyToTag","newObj","textStore","replaceText","replacement","Boolean","styleSheet","cssText","cssNode","createTextNode","childNodes","ssrId","btoa","unescape","firstChild","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","getter","definition","enumerable","prototype","CP","authManager","$nav","$navToggle","$globalSidebar","$globalContainer","$alerts","$crumbs","$breadcrumbList","$breadcrumbItems","$notificationContainer","$headerContainer","$mainContent","$details","$sidebarContainer","$sidebarToggle","$edition","$deltaForms","$collapsibleTables","fixedHeader","breadcrumbListWidth","breadcrumbDisclosureItem","enableQueue","totalJobs","jobInfo","displayedJobInfo","displayedJobInfoUnchanged","trackJobProgressTimeout","jobProgressIcon","checkingForUpdates","forcingRefreshOnUpdatesCheck","includingDetailsOnUpdatesCheck","checkForUpdatesCallbacks","resizeTimeout","$allInstructions","updateFixedHeader","setSidebarNavAttributes","initSpecialForms","initAlerts","shortcuts","shortcut","initTabs","LOCATION_HASH","_handleInputFocus","_handleInputBlur","announcements","$unreadMessage","hasUnreads","unread","footer","IntersectionObserver","classList","intersectionRatio","rootMargin","observe","$contentHeader","$forms","confirmUnload","returnValue","updateSidebarMenuLabel","toggleNav","isExpanded","navIsExpanded","disableGlobalSidebarLinks","enableGlobalSidebarLinks","focusableItems","isAlwaysVisible","getComputedStyle","getPropertyValue","newState","toggleClass","$tabsContainer","$tabsList","selectedTabIndex","handleBreadcrumbVisibility","breadcrumbItemsWrap","listWidth","totalItemWidth","finalIndex","visibleItemWidth","shownItems","hiddenItems","_$table","_containerWidth","_check","_isCollapsed","headerHeight","displayNotification","notification","Notification","notificationType","iconLabel","fetchAlerts","alerts","displayAlerts","$shunnableAlerts","$link","checkForUpdates","forceRefresh","includeDetails","realCallback","_checkForUpdates","updateUtilitiesBadge","callbacks","updateInfo","_getUpdates","_checkForCachedUpdates","cached","onlyIfCached","updates","_cacheUpdates","$utilitiesLink","$screenReaderText","badgeCount","runQueueAutomatically","trackJobProgress","_trackJobProgressInternal","setJobInfo","oldInfo","getDisplayedJobInfo","progressLabel","updateJobIcon","statuses","JOB_STATUS_RESERVED","JOB_STATUS_FAILED","JOB_STATUS_WAITING","JobProgressIcon","hideFailMode","setDescription","description","setProgress","showFailMode","cpTrigger","notificationDuration","JOB_STATUS_DONE","closing","closeTimeout","_preventDelayedClose","originalActiveElement","$closeBtnContainer","details","_negMargin","_initDelayedClose","delayedClose","preventDelayedClose","$progressLabel","failMode","_$bgCanvas","_$staticCanvas","_$hoverCanvas","_$failCanvas","_staticCtx","_hoverCtx","_canvasSize","_arcPos","_arcRadius","_lineWidth","_arcStartPos","_arcEndPos","_arcStartStepSize","_arcEndStepSize","_arcStep","_arcStepTimeout","_arcAnimateCallback","_progressBar","canAccessQueueManager","$canvasContainer","$labelContainer","_createCanvas","getContext","_drawArc","_animateArc","_setArc","color","$canvas","ctx","strokeStyle","lineWidth","lineCap","startPos","endPos","clearRect","beginPath","arc","closePath","targetStartPos","targetEndPos","_takeNextArcStep"],"sourceRoot":""} \ No newline at end of file diff --git a/src/web/assets/cp/src/js/ElementEditor.js b/src/web/assets/cp/src/js/ElementEditor.js index 9b00b586f62..b0348dab8e9 100644 --- a/src/web/assets/cp/src/js/ElementEditor.js +++ b/src/web/assets/cp/src/js/ElementEditor.js @@ -1633,13 +1633,7 @@ Craft.ElementEditor = Garnish.Base.extend( 'g' ), (m, pre, id, post) => { - let duplicate = false; - try { - duplicate = this._filterFieldInputName(pre); - } catch (e) { - console.warn(`Unexpected input name: ${m}`); - } - if (!duplicate) { + if (!this._filterFieldInputName(pre)) { return m; } return pre + this.duplicatedElements[id] + post; @@ -1651,17 +1645,12 @@ Craft.ElementEditor = Garnish.Base.extend( (m, name, id) => { // Ignore param names that end in `[enabled]`, `[type]`, etc. // (`[sortOrder]` should pass here, which could be set to a specific order index, but *not* `[sortOrder][]`!) - let duplicate = false; - try { - duplicate = - this._filterFieldInputName(name) && - !name.match( - new RegExp(`${lb}(enabled|sortOrder|type|typeId)${rb}$`) - ); - } catch (e) { - console.warn(`Unexpected input name: ${m}`); - } - if (!duplicate) { + if ( + !this._filterFieldInputName(name) || + name.match( + new RegExp(`${lb}(enabled|sortOrder|type|typeId)${rb}$`) + ) + ) { return m; } return `&${name}=${this.duplicatedElements[id]}`; @@ -1679,13 +1668,13 @@ Craft.ElementEditor = Garnish.Base.extend( const lb = encodeURIComponent('['); const rb = encodeURIComponent(']'); const nestedNames = name.match( - new RegExp(`(\\bfields|${lb}fields${rb})${lb}[^${rb}]+${rb}`, 'g') + new RegExp(`(\\bfields|${lb}fields${rb})${lb}.+?${rb}`, 'g') ); if (!nestedNames) { throw `Unexpected input name: ${name}`; } const lastHandle = nestedNames[nestedNames.length - 1].match( - new RegExp(`(?:\\bfields|${lb}fields${rb})${lb}([^${rb}]+)${rb}`) + new RegExp(`(?:\\bfields|${lb}fields${rb})${lb}(.+?)${rb}`) )[1]; return Craft.fieldsWithoutContent.includes(lastHandle); },