From bb36014ae41b0b440af3107fdbbbbbfe9374d353 Mon Sep 17 00:00:00 2001 From: flarum-bot Date: Mon, 20 May 2024 19:56:00 +0000 Subject: [PATCH] Bundled output for commit bf3da9a7759ee9f2b04ad3958895e00fca321030 Includes transpiled JS/TS, and Typescript declaration files (typings). [skip ci] --- js/dist/admin.js | 2 +- js/dist/admin.js.map | 2 +- js/dist/forum.js | 2 +- js/dist/forum.js.map | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/js/dist/admin.js b/js/dist/admin.js index d0bc7be..6e3cc93 100644 --- a/js/dist/admin.js +++ b/js/dist/admin.js @@ -1,2 +1,2 @@ -(()=>{var e={n:t=>{var r=t&&t.__esModule?()=>t.default:()=>t;return e.d(r,{a:r}),r},d:(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};(()=>{"use strict";e.r(t),e.d(t,{components:()=>ge,helpers:()=>ye,models:()=>ve});const r=flarum.core.compat["admin/app"];var n=e.n(r);function o(e,t){return o=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},o(e,t)}function i(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,o(e,t)}const a=flarum.core.compat["common/Model"];var s=e.n(a);const l=flarum.core.compat["common/utils/computed"];var c=e.n(l),d=function(e){function t(){for(var t,r=arguments.length,n=new Array(r),o=0;o0&&t.matches(e)})).length>0;if(e===t)return!0;if(void 0!==w(e).getConfig("connectWith")&&null!==w(e).getConfig("connectWith"))return w(e).getConfig("connectWith")===w(t).getConfig("connectWith")}return!1},U={items:null,connectWith:null,disableIEFix:null,acceptFrom:null,copy:!1,placeholder:null,placeholderClass:"sortable-placeholder",draggingClass:"sortable-dragging",hoverClass:!1,dropTargetContainerClass:!1,debounce:0,throttleTime:100,maxItems:0,itemSerializer:void 0,containerSerializer:void 0,customDragImage:null,orientation:"vertical"},X=function(e){T(e,"dragstart"),T(e,"dragend"),T(e,"dragover"),T(e,"dragenter"),T(e,"drop"),T(e,"mouseenter"),T(e,"mouseleave")},G=function(e,t){e&&T(e,"dragleave"),t&&t!==e&&T(t,"dragleave")},V=function(e){var t;(t=e).h5s&&delete t.h5s.data,C(e,"aria-dropeffect")},J=function(e){C(e,"aria-grabbed"),C(e,"aria-copied"),C(e,"draggable"),C(e,"role")};function K(e,t){if(t.composedPath)return t.composedPath().find((function(e){return e.isSortable}));for(;!0!==e.isSortable;)e=e.parentElement;return e}function Q(e,t){var r=g(e,"opts"),n=v(e.children,r.items).filter((function(e){return e.contains(t)||e.shadowRoot&&e.shadowRoot.contains(t)}));return n.length>0?n[0]:t}var Z=function(e){var t=g(e,"opts"),r=v(e.children,t.items),n=z(r,t.handle);x(e,"aria-dropeffect","move"),g(e,"_disabled","false"),x(n,"draggable","true"),!1===t.disableIEFix&&"function"==typeof(document||window.document).createElement("span").dragDrop&&E(n,"mousedown",(function(){if(-1!==r.indexOf(this))this.dragDrop();else{for(var e=this.parentElement;-1===r.indexOf(e);)e=e.parentElement;e.dragDrop()}}))};function $(e,t){var r=String(t);return t=t||{},"string"==typeof e&&(e=document.querySelectorAll(e)),e instanceof HTMLElement&&(e=[e]),e=Array.prototype.slice.call(e),/serialize/.test(r)?e.map((function(e){var t=g(e,"opts");return function(e,t,r){if(void 0===t&&(t=function(e,t){return e}),void 0===r&&(r=function(e){return e}),!(e instanceof HTMLElement)||1==!e.isSortable)throw new Error("You need to provide a sortableContainer to be serialized.");if("function"!=typeof t||"function"!=typeof r)throw new Error("You need to provide a valid serializer for items and the container.");var n=g(e,"opts").items,o=v(e.children,n),i=o.map((function(t){return{parent:e,node:t,html:t.outerHTML,index:O(t,o)}}));return{container:r({node:e,itemCount:i.length}),items:i.map((function(r){return t(r,e)}))}}(e,t.itemSerializer,t.containerSerializer)})):(e.forEach((function(e){if(/enable|disable|destroy/.test(r))return $[r](e);["connectWith","disableIEFix"].forEach((function(e){Object.prototype.hasOwnProperty.call(t,e)&&null!==t[e]&&console.warn('HTML5Sortable: You are using the deprecated configuration "'+e+'". This will be removed in an upcoming version, make sure to migrate to the new options when updating.')})),t=Object.assign({},U,w(e).config,t),w(e).config=t,g(e,"opts",t),e.isSortable=!0,function(e){var t=g(e,"opts"),r=v(e.children,t.items),n=z(r,t.handle);g(e,"_disabled","false"),X(r),G(P,D),T(n,"mousedown"),T(e,"dragover"),T(e,"dragenter"),T(e,"drop")}(e);var n,o=v(e.children,t.items);if(null!==t.placeholder&&void 0!==t.placeholder){var i=document.createElement(e.tagName);t.placeholder instanceof HTMLElement?i.appendChild(t.placeholder):i.innerHTML=t.placeholder,n=i.children[0]}w(e).placeholder=function(e,t,r){var n;if(void 0===r&&(r="sortable-placeholder"),!(e instanceof HTMLElement))throw new Error("You must provide a valid element as a sortable.");if(!(t instanceof HTMLElement)&&void 0!==t)throw new Error("You must provide a valid element as a placeholder or set ot to undefined.");return void 0===t&&(["UL","OL"].includes(e.tagName)?t=document.createElement("li"):["TABLE","TBODY"].includes(e.tagName)?(t=document.createElement("tr")).innerHTML='':t=document.createElement("div")),"string"==typeof r&&(n=t.classList).add.apply(n,r.split(" ")),t}(e,n,t.placeholderClass),g(e,"items",t.items),t.acceptFrom?g(e,"acceptFrom",t.acceptFrom):t.connectWith&&g(e,"connectWith",t.connectWith),Z(e),x(o,"role","option"),x(o,"aria-grabbed","false"),function(e,t){if("string"==typeof w(e).getConfig("hoverClass")){var r=w(e).getConfig("hoverClass").split(" ");!0===t?(E(e,"mousemove",function(e,t){var r=this;if(void 0===t&&(t=250),"number"!=typeof t)throw new Error("You must provide a number as the second argument for throttle.");var n=null;return function(){for(var o=[],i=0;i=t)&&(n=a,e.apply(r,o))}}((function(t){0===t.buttons&&v(e.children,w(e).getConfig("items")).forEach((function(e){var n,o;e!==t.target?(n=e.classList).remove.apply(n,r):(o=e.classList).add.apply(o,r)}))}),w(e).getConfig("throttleTime"))),E(e,"mouseleave",(function(){v(e.children,w(e).getConfig("items")).forEach((function(e){var t;(t=e.classList).remove.apply(t,r)}))}))):(T(e,"mousemove"),T(e,"mouseleave"))}}(e,!0),E(e,"dragstart",(function(e){var r=q(e);if(!0!==r.isSortable&&(e.stopImmediatePropagation(),(!t.handle||r.matches(t.handle))&&"false"!==r.getAttribute("draggable"))){var n=K(r,e),o=Q(n,r);M=v(n.children,t.items),S=M.indexOf(o),A=O(o,n.children),P=n,function(e,t,r){if(!(e instanceof Event))throw new Error("setDragImage requires a DragEvent as the first argument.");if(!(t instanceof HTMLElement))throw new Error("setDragImage requires the dragged element as the second argument.");if(r||(r=W),e.dataTransfer&&e.dataTransfer.setDragImage){var n=r(t,H(t),e);if(!(n.element instanceof HTMLElement)||"number"!=typeof n.posX||"number"!=typeof n.posY)throw new Error("The customDragImage function you provided must return and object with the properties element[string], posX[integer], posY[integer].");e.dataTransfer.effectAllowed="copyMove",e.dataTransfer.setData("text/plain",q(e).id),e.dataTransfer.setDragImage(n.element,n.posX,n.posY)}}(e,o,t.customDragImage),F=N(o),L=k(o),o.classList.add(t.draggingClass),_=function(e,t){var r=e;return!0===w(t).getConfig("copy")&&(x(r=e.cloneNode(!0),"aria-copied","true"),e.parentElement.appendChild(r),r.style.display="none",r.oldDisplay=e.style.display),r}(o,n),x(_,"aria-grabbed","true"),n.dispatchEvent(new CustomEvent("sortstart",{detail:{origin:{elementIndex:A,index:S,container:P},item:_,originalTarget:r}}))}})),E(e,"dragenter",(function(r){var n=q(r),o=K(n,r);o&&o!==D&&(I=v(o.children,g(o,"items")).filter((function(t){return t!==w(e).placeholder})),t.dropTargetContainerClass&&o.classList.add(t.dropTargetContainerClass),o.dispatchEvent(new CustomEvent("sortenter",{detail:{origin:{elementIndex:A,index:S,container:P},destination:{container:o,itemsBeforeUpdate:I},item:_,originalTarget:n}})),E(o,"dragleave",(function(e){var r=e.relatedTarget||e.fromElement;e.currentTarget.contains(r)||(t.dropTargetContainerClass&&o.classList.remove(t.dropTargetContainerClass),o.dispatchEvent(new CustomEvent("sortleave",{detail:{origin:{elementIndex:A,index:S,container:o},item:_,originalTarget:n}})))}))),D=o})),E(e,"dragend",(function(r){if(_){_.classList.remove(t.draggingClass),x(_,"aria-grabbed","false"),"true"===_.getAttribute("aria-copied")&&"true"!==g(_,"dropped")&&_.remove(),_.style.display=_.oldDisplay,delete _.oldDisplay;var n=Array.from(y.values()).map((function(e){return e.placeholder})).filter((function(e){return e instanceof HTMLElement})).filter(Y)[0];n&&n.remove(),e.dispatchEvent(new CustomEvent("sortstop",{detail:{origin:{elementIndex:A,index:S,container:P},item:_}})),D=null,_=null,F=null,L=null}})),E(e,"drop",(function(r){if(R(e,_.parentElement)){r.preventDefault(),r.stopPropagation(),g(_,"dropped","true");var n=Array.from(y.values()).map((function(e){return e.placeholder})).filter((function(e){return e instanceof HTMLElement})).filter(Y)[0];B(n,_),n.remove(),e.dispatchEvent(new CustomEvent("sortstop",{detail:{origin:{elementIndex:A,index:S,container:P},item:_}}));var o=w(e).placeholder,i=v(P.children,t.items).filter((function(e){return e!==o})),a=!0===this.isSortable?this:this.parentElement,s=v(a.children,g(a,"items")).filter((function(e){return e!==o})),l=O(_,Array.from(_.parentElement.children).filter((function(e){return e!==o}))),c=O(_,s);t.dropTargetContainerClass&&a.classList.remove(t.dropTargetContainerClass),A===l&&P===a||e.dispatchEvent(new CustomEvent("sortupdate",{detail:{origin:{elementIndex:A,index:S,container:P,itemsBeforeUpdate:M,items:i},destination:{index:c,elementIndex:l,container:a,itemsBeforeUpdate:I,items:s},item:_}}))}}));var a,s,l,c=(a=function(e,r,n,o){if(_)if(t.forcePlaceholderSize&&(w(e).placeholder.style.height=F+"px",w(e).placeholder.style.width=L+"px"),Array.from(e.children).indexOf(r)>-1){var i=N(r),a=k(r),s=O(w(e).placeholder,r.parentElement.children),l=O(r,r.parentElement.children);if(i>F||a>L){var c=i-F,d=a-L,u=H(r).top,f=H(r).left;if(sl&&("vertical"===t.orientation&&o>u+i-c||"horizontal"===t.orientation&&n>f+a-d))return}void 0===_.oldDisplay&&(_.oldDisplay=_.style.display),"none"!==_.style.display&&(_.style.display="none");var m=!1;try{var p=H(r).top+r.offsetHeight/2,h=H(r).left+r.offsetWidth/2;m="vertical"===t.orientation&&o>=p||"horizontal"===t.orientation&&n>=h}catch(e){m=s=parseInt(n.maxItems)&&_.parentElement!==r||(e.preventDefault(),e.stopPropagation(),e.dataTransfer.dropEffect=!0===w(r).getConfig("copy")?"copy":"move",c(r,t,e.pageX,e.pageY))}};E(o.concat(e),"dragover",d),E(o.concat(e),"dragenter",d)})),e)}$.destroy=function(e){!function(e){var t=g(e,"opts")||{},r=v(e.children,t.items),n=z(r,t.handle);T(e,"dragover"),T(e,"dragenter"),T(e,"dragstart"),T(e,"dragend"),T(e,"drop"),V(e),T(n,"mousedown"),X(r),J(r),G(P,D),e.isSortable=!1}(e)},$.enable=function(e){Z(e)},$.disable=function(e){!function(e){var t=g(e,"opts"),r=v(e.children,t.items),n=z(r,t.handle);x(e,"aria-dropeffect","none"),g(e,"_disabled","true"),x(n,"draggable","false"),T(n,"mousedown")}(e)},$.__testing={_data:g,_removeItemEvents:X,_removeItemData:J,_removeSortableData:V,_removeContainerEvents:G};const ee=$,te=flarum.core.compat["common/helpers/icon"];var re=e.n(te);const ne=flarum.core.compat["common/utils/extractText"];var oe=e.n(ne);const ie=flarum.core.compat["common/utils/ItemList"];var ae=e.n(ie);const se=flarum.core.compat["common/utils/withAttr"];var le=e.n(se);const ce=flarum.core.compat["common/components/Button"];var de=e.n(ce),ue=function(){function e(){}var t=e.prototype;return t.oninit=function(e){this.policy=e.attrs.policy,this.dirty=!1,this.processing=!1,this.toggleFields=!1,null===this.policy&&this.initNewField()},t.initNewField=function(){this.policy=n().store.createRecord("fof-terms-policies",{attributes:{name:"",url:"",update_message:"",terms_updated_at:""}})},t.boxTitle=function(){return this.policy.exists?this.policy.name():n().translator.trans("fof-terms.admin.buttons.new-policy")},t.view=function(){var e=this;return m(".FoF-Terms-Policiy-Box",[this.policy.exists?m("span.fas.fa-arrows-alt.FoF-Terms-Policiy-Box--handle.js-policy-handle"):null,m(".Button.Button--block.FoF-Terms-Policiy-Header",{onclick:function(){e.toggleFields=!e.toggleFields}},[m(".FoF-Terms-Policiy-Header-Title",this.boxTitle()),m("div",[this.policy.exists?[n().translator.trans("fof-terms.admin.buttons.edit-policy")," "]:null,re()(this.toggleFields?"fas fa-chevron-up":"fas fa-chevron-down")])]),this.toggleFields?this.viewFields():null])},t.viewFields=function(){return m("form.FoF-Terms-Policiy-Body",{onsubmit:this.savePolicy.bind(this)},[this.fields().toArray(),m(".ButtonGroup",[de().component({type:"submit",className:"Button Button--primary",loading:this.processing,disabled:!this.readyToSave()},n().translator.trans("fof-terms.admin.buttons."+(this.policy.exists?"save":"add")+"-policy")),this.policy.exists?de().component({type:"submit",className:"Button Button--danger",loading:this.processing,onclick:this.deletePolicy.bind(this)},n().translator.trans("fof-terms.admin.buttons.delete-policy")):""])])},t.fields=function(){var e=this,t=new(ae());return t.add("name",m(".Form-group",[m("label",n().translator.trans("fof-terms.admin.policies.name")),m("input.FormControl",{type:"text",value:this.policy.name(),oninput:le()("value",this.updateAttribute.bind(this,"name"))}),m(".helpText",n().translator.trans("fof-terms.admin.policies.name-help"))]),100),t.add("url",m(".Form-group",[m("label",n().translator.trans("fof-terms.admin.policies.url")),m("input.FormControl",{type:"url",value:this.policy.url(),oninput:le()("value",this.updateAttribute.bind(this,"url"))}),m(".helpText",n().translator.trans("fof-terms.admin.policies.url-help"))]),95),t.add("update-message",m(".Form-group",[m("label",n().translator.trans("fof-terms.admin.policies.update-message")),m("textarea.FormControl",{value:this.policy.update_message(),oninput:le()("value",this.updateAttribute.bind(this,"update_message"))}),m(".helpText",n().translator.trans("fof-terms.admin.policies.update-message-help"))]),90),t.add("terms-updated-at",m(".Form-group",[m("label",n().translator.trans("fof-terms.admin.policies.terms-updated-at")),m(".FoF-Terms-Input-Group",[m("input.FormControl",{type:"text",value:this.policy.terms_updated_at(),oninput:le()("value",this.updateAttribute.bind(this,"terms_updated_at")),placeholder:n().translator.trans("fof-terms.admin.policies.terms-updated-at-placeholder")}),de().component({className:"Button Button--primary",onclick:function(){e.updateAttribute("terms_updated_at",dayjs().millisecond(0).toISOString())}},n().translator.trans("fof-terms.admin.buttons.set-to-now"))]),m(".helpText",n().translator.trans("fof-terms.admin.policies.terms-updated-at-help"))]),85),this.policy.exists&&t.add("export-url",m(".Form-group",[m("label",n().translator.trans("fof-terms.admin.policies.export-url")),m(".ButtonGroup",["json","csv"].map((function(t){return m("a.Button.FoF-Terms-Export-Button",{href:n().forum.attribute("apiUrl")+"/fof/terms/policies/"+e.policy.id()+"/export."+t,target:"_blank"},t.toUpperCase())}))),m(".helpText",n().translator.trans("fof-terms.admin.policies.export-url-help",{a:m("a",{href:"https://github.com/FriendsOfFlarum/terms/wiki/Export-url",target:"_blank"})}))]),80),t},t.updateAttribute=function(e,t){var r;this.policy.pushAttributes(((r={})[e]=t,r)),this.dirty=!0},t.readyToSave=function(){return this.dirty},t.savePolicy=function(e){var t=this;e.preventDefault(),this.processing=!0;var r=!this.policy.exists;this.policy.save(this.policy.data.attributes).then((function(){r&&(t.initNewField(),t.toggleFields=!1),t.processing=!1,t.dirty=!1,m.redraw()})).catch((function(e){throw t.processing=!1,e}))},t.deletePolicy=function(){var e=this;confirm(oe()(n().translator.trans("fof-terms.admin.messages.delete-policy-confirmation",{name:this.policy.name()})))&&(this.processing=!0,this.policy.delete().then((function(){e.processing=!1,m.redraw()})).catch((function(t){throw e.processing=!1,t})))},e}();function fe(e,t){return void 0===t&&(t="sort"),e.sort((function(e,r){return e[t]()-r[t]()}))}var me=function(){function e(){}var t=e.prototype;return t.oninit=function(){n().request({method:"GET",url:n().forum.attribute("apiUrl")+"/fof/terms/policies"}).then((function(e){n().store.pushPayload(e),m.redraw()}))},t.oncreate=function(e){this.initsortable(e)},t.onupdate=function(e){this.initsortable(e)},t.initsortable=function(e){var t=this;ee(e.dom.querySelector(".js-policies-container"),{handle:".js-policy-handle"})[0].addEventListener("sortupdate",(function(){var r=[].map.call(e.dom.querySelectorAll(".js-policy-data"),(function(e){return e.dataset.id}));t.updateSort(r)}))},t.view=function(){var e=n().store.all("fof-terms-policies"),t=[];return fe(e).forEach((function(e){t.push(m(".js-policy-data",{key:e.id(),"data-id":e.id()},m(ue,{policy:e})))})),m("div",[m("h2",n().translator.trans("fof-terms.admin.titles.policies")),m(".FoF-Terms-Policies-Container",[m(".js-policies-container",t),m(ue,{policy:null})])])},t.updateSort=function(e){n().request({method:"POST",url:n().forum.attribute("apiUrl")+"/fof/terms/policies/order",body:{sort:e}}).then((function(e){n().store.pushPayload(e),m.redraw()}))},e}(),pe="fof-terms.admin.settings.",he=function(e){function t(){return e.apply(this,arguments)||this}return i(t,e),t.prototype.content=function(){return m(".ExtensionPage-settings",[m(".container",[m(".Form-group",[m("label",n().translator.trans(pe+"field.signup-legal-text")),m("textarea.FormControl",{bidi:this.setting("fof-terms.signup-legal-text")})]),m(".Form-group",[m("label",h().component({state:this.setting("fof-terms.hide-updated-at")()>0,onchange:this.setting("fof-terms.hide-updated-at")},n().translator.trans(pe+"field.hide-updated-at")))]),m(".Form-group",[m("label",n().translator.trans(pe+"field.date-format")),m("input[type=text].FormControl",{bidi:this.setting("fof-terms.date-format"),placeholder:"YYYY-MM-DD"}),m(".helpText",n().translator.trans(pe+"field.date-format-help",{a:m("a",{href:"https://day.js.org/docs/en/display/format",target:"_blank"})}))]),this.submitButton(),m(me)])])},t}(f()),ge={PolicyEdit:ue,PolicyList:me,TermsSettingsPage:he},ve={Policy:d},ye={sortByAttribute:fe};n().initializers.add("fof-terms",(function(){n().store.models["fof-terms-policies"]=d,n().extensionData.for("fof-terms").registerPermission({icon:"fas fa-paperclip",label:n().translator.trans("fof-terms.admin.permissions.see-user-policies-state"),permission:"fof-terms.see-user-policies-state"},"moderate").registerPermission({icon:"fas fa-paperclip",label:n().translator.trans("fof-terms.admin.permissions.postpone-policies-accept"),permission:"fof-terms.postpone-policies-accept"},"moderate").registerPermission({icon:"fas fa-paperclip",label:n().translator.trans("fof-terms.admin.permissions.export-policies"),permission:"fof-terms.export-policies"},"moderate").registerPage(he)}))})(),module.exports=t})(); +(()=>{var e={n:t=>{var r=t&&t.__esModule?()=>t.default:()=>t;return e.d(r,{a:r}),r},d:(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};(()=>{"use strict";e.r(t),e.d(t,{components:()=>ve,helpers:()=>be,models:()=>ye});const r=flarum.core.compat["admin/app"];var n=e.n(r);function o(e,t){return o=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},o(e,t)}function i(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,o(e,t)}const a=flarum.core.compat["common/Model"];var s=e.n(a);const l=flarum.core.compat["common/utils/computed"];var c=e.n(l),d=function(e){function t(){for(var t,r=arguments.length,n=new Array(r),o=0;o0&&t.matches(e)})).length>0;if(e===t)return!0;if(void 0!==w(e).getConfig("connectWith")&&null!==w(e).getConfig("connectWith"))return w(e).getConfig("connectWith")===w(t).getConfig("connectWith")}return!1},U={items:null,connectWith:null,disableIEFix:null,acceptFrom:null,copy:!1,placeholder:null,placeholderClass:"sortable-placeholder",draggingClass:"sortable-dragging",hoverClass:!1,dropTargetContainerClass:!1,debounce:0,throttleTime:100,maxItems:0,itemSerializer:void 0,containerSerializer:void 0,customDragImage:null,orientation:"vertical"},X=function(e){T(e,"dragstart"),T(e,"dragend"),T(e,"dragover"),T(e,"dragenter"),T(e,"drop"),T(e,"mouseenter"),T(e,"mouseleave")},G=function(e,t){e&&T(e,"dragleave"),t&&t!==e&&T(t,"dragleave")},V=function(e){var t;(t=e).h5s&&delete t.h5s.data,C(e,"aria-dropeffect")},J=function(e){C(e,"aria-grabbed"),C(e,"aria-copied"),C(e,"draggable"),C(e,"role")};function K(e,t){if(t.composedPath)return t.composedPath().find((function(e){return e.isSortable}));for(;!0!==e.isSortable;)e=e.parentElement;return e}function Q(e,t){var r=g(e,"opts"),n=v(e.children,r.items).filter((function(e){return e.contains(t)||e.shadowRoot&&e.shadowRoot.contains(t)}));return n.length>0?n[0]:t}var Z=function(e){var t=g(e,"opts"),r=v(e.children,t.items),n=z(r,t.handle);x(e,"aria-dropeffect","move"),g(e,"_disabled","false"),x(n,"draggable","true"),!1===t.disableIEFix&&"function"==typeof(document||window.document).createElement("span").dragDrop&&E(n,"mousedown",(function(){if(-1!==r.indexOf(this))this.dragDrop();else{for(var e=this.parentElement;-1===r.indexOf(e);)e=e.parentElement;e.dragDrop()}}))};function $(e,t){var r=String(t);return t=t||{},"string"==typeof e&&(e=document.querySelectorAll(e)),e instanceof HTMLElement&&(e=[e]),e=Array.prototype.slice.call(e),/serialize/.test(r)?e.map((function(e){var t=g(e,"opts");return function(e,t,r){if(void 0===t&&(t=function(e,t){return e}),void 0===r&&(r=function(e){return e}),!(e instanceof HTMLElement)||1==!e.isSortable)throw new Error("You need to provide a sortableContainer to be serialized.");if("function"!=typeof t||"function"!=typeof r)throw new Error("You need to provide a valid serializer for items and the container.");var n=g(e,"opts").items,o=v(e.children,n),i=o.map((function(t){return{parent:e,node:t,html:t.outerHTML,index:H(t,o)}}));return{container:r({node:e,itemCount:i.length}),items:i.map((function(r){return t(r,e)}))}}(e,t.itemSerializer,t.containerSerializer)})):(e.forEach((function(e){if(/enable|disable|destroy/.test(r))return $[r](e);["connectWith","disableIEFix"].forEach((function(e){Object.prototype.hasOwnProperty.call(t,e)&&null!==t[e]&&console.warn('HTML5Sortable: You are using the deprecated configuration "'+e+'". This will be removed in an upcoming version, make sure to migrate to the new options when updating.')})),t=Object.assign({},U,w(e).config,t),w(e).config=t,g(e,"opts",t),e.isSortable=!0,function(e){var t=g(e,"opts"),r=v(e.children,t.items),n=z(r,t.handle);g(e,"_disabled","false"),X(r),G(P,D),T(n,"mousedown"),T(e,"dragover"),T(e,"dragenter"),T(e,"drop")}(e);var n,o=v(e.children,t.items);if(null!==t.placeholder&&void 0!==t.placeholder){var i=document.createElement(e.tagName);t.placeholder instanceof HTMLElement?i.appendChild(t.placeholder):i.innerHTML=t.placeholder,n=i.children[0]}w(e).placeholder=function(e,t,r){var n;if(void 0===r&&(r="sortable-placeholder"),!(e instanceof HTMLElement))throw new Error("You must provide a valid element as a sortable.");if(!(t instanceof HTMLElement)&&void 0!==t)throw new Error("You must provide a valid element as a placeholder or set ot to undefined.");return void 0===t&&(["UL","OL"].includes(e.tagName)?t=document.createElement("li"):["TABLE","TBODY"].includes(e.tagName)?(t=document.createElement("tr")).innerHTML='':t=document.createElement("div")),"string"==typeof r&&(n=t.classList).add.apply(n,r.split(" ")),t}(e,n,t.placeholderClass),g(e,"items",t.items),t.acceptFrom?g(e,"acceptFrom",t.acceptFrom):t.connectWith&&g(e,"connectWith",t.connectWith),Z(e),x(o,"role","option"),x(o,"aria-grabbed","false"),function(e,t){if("string"==typeof w(e).getConfig("hoverClass")){var r=w(e).getConfig("hoverClass").split(" ");!0===t?(E(e,"mousemove",function(e,t){var r=this;if(void 0===t&&(t=250),"number"!=typeof t)throw new Error("You must provide a number as the second argument for throttle.");var n=null;return function(){for(var o=[],i=0;i=t)&&(n=a,e.apply(r,o))}}((function(t){0===t.buttons&&v(e.children,w(e).getConfig("items")).forEach((function(e){var n,o;e!==t.target?(n=e.classList).remove.apply(n,r):(o=e.classList).add.apply(o,r)}))}),w(e).getConfig("throttleTime"))),E(e,"mouseleave",(function(){v(e.children,w(e).getConfig("items")).forEach((function(e){var t;(t=e.classList).remove.apply(t,r)}))}))):(T(e,"mousemove"),T(e,"mouseleave"))}}(e,!0),E(e,"dragstart",(function(e){var r=q(e);if(!0!==r.isSortable&&(e.stopImmediatePropagation(),(!t.handle||r.matches(t.handle))&&"false"!==r.getAttribute("draggable"))){var n=K(r,e),o=Q(n,r);M=v(n.children,t.items),S=M.indexOf(o),A=H(o,n.children),P=n,function(e,t,r){if(!(e instanceof Event))throw new Error("setDragImage requires a DragEvent as the first argument.");if(!(t instanceof HTMLElement))throw new Error("setDragImage requires the dragged element as the second argument.");if(r||(r=W),e.dataTransfer&&e.dataTransfer.setDragImage){var n=r(t,O(t),e);if(!(n.element instanceof HTMLElement)||"number"!=typeof n.posX||"number"!=typeof n.posY)throw new Error("The customDragImage function you provided must return and object with the properties element[string], posX[integer], posY[integer].");e.dataTransfer.effectAllowed="copyMove",e.dataTransfer.setData("text/plain",q(e).id),e.dataTransfer.setDragImage(n.element,n.posX,n.posY)}}(e,o,t.customDragImage),F=N(o),L=k(o),o.classList.add(t.draggingClass),_=function(e,t){var r=e;return!0===w(t).getConfig("copy")&&(x(r=e.cloneNode(!0),"aria-copied","true"),e.parentElement.appendChild(r),r.style.display="none",r.oldDisplay=e.style.display),r}(o,n),x(_,"aria-grabbed","true"),n.dispatchEvent(new CustomEvent("sortstart",{detail:{origin:{elementIndex:A,index:S,container:P},item:_,originalTarget:r}}))}})),E(e,"dragenter",(function(r){var n=q(r),o=K(n,r);o&&o!==D&&(I=v(o.children,g(o,"items")).filter((function(t){return t!==w(e).placeholder})),t.dropTargetContainerClass&&o.classList.add(t.dropTargetContainerClass),o.dispatchEvent(new CustomEvent("sortenter",{detail:{origin:{elementIndex:A,index:S,container:P},destination:{container:o,itemsBeforeUpdate:I},item:_,originalTarget:n}})),E(o,"dragleave",(function(e){var r=e.relatedTarget||e.fromElement;e.currentTarget.contains(r)||(t.dropTargetContainerClass&&o.classList.remove(t.dropTargetContainerClass),o.dispatchEvent(new CustomEvent("sortleave",{detail:{origin:{elementIndex:A,index:S,container:o},item:_,originalTarget:n}})))}))),D=o})),E(e,"dragend",(function(r){if(_){_.classList.remove(t.draggingClass),x(_,"aria-grabbed","false"),"true"===_.getAttribute("aria-copied")&&"true"!==g(_,"dropped")&&_.remove(),_.style.display=_.oldDisplay,delete _.oldDisplay;var n=Array.from(y.values()).map((function(e){return e.placeholder})).filter((function(e){return e instanceof HTMLElement})).filter(j)[0];n&&n.remove(),e.dispatchEvent(new CustomEvent("sortstop",{detail:{origin:{elementIndex:A,index:S,container:P},item:_}})),D=null,_=null,F=null,L=null}})),E(e,"drop",(function(r){if(R(e,_.parentElement)){r.preventDefault(),r.stopPropagation(),g(_,"dropped","true");var n=Array.from(y.values()).map((function(e){return e.placeholder})).filter((function(e){return e instanceof HTMLElement})).filter(j)[0];B(n,_),n.remove(),e.dispatchEvent(new CustomEvent("sortstop",{detail:{origin:{elementIndex:A,index:S,container:P},item:_}}));var o=w(e).placeholder,i=v(P.children,t.items).filter((function(e){return e!==o})),a=!0===this.isSortable?this:this.parentElement,s=v(a.children,g(a,"items")).filter((function(e){return e!==o})),l=H(_,Array.from(_.parentElement.children).filter((function(e){return e!==o}))),c=H(_,s);t.dropTargetContainerClass&&a.classList.remove(t.dropTargetContainerClass),A===l&&P===a||e.dispatchEvent(new CustomEvent("sortupdate",{detail:{origin:{elementIndex:A,index:S,container:P,itemsBeforeUpdate:M,items:i},destination:{index:c,elementIndex:l,container:a,itemsBeforeUpdate:I,items:s},item:_}}))}}));var a,s,l,c=(a=function(e,r,n,o){if(_)if(t.forcePlaceholderSize&&(w(e).placeholder.style.height=F+"px",w(e).placeholder.style.width=L+"px"),Array.from(e.children).indexOf(r)>-1){var i=N(r),a=k(r),s=H(w(e).placeholder,r.parentElement.children),l=H(r,r.parentElement.children);if(i>F||a>L){var c=i-F,d=a-L,u=O(r).top,f=O(r).left;if(sl&&("vertical"===t.orientation&&o>u+i-c||"horizontal"===t.orientation&&n>f+a-d))return}void 0===_.oldDisplay&&(_.oldDisplay=_.style.display),"none"!==_.style.display&&(_.style.display="none");var p=!1;try{var m=O(r).top+r.offsetHeight/2,h=O(r).left+r.offsetWidth/2;p="vertical"===t.orientation&&o>=m||"horizontal"===t.orientation&&n>=h}catch(e){p=s=parseInt(n.maxItems)&&_.parentElement!==r||(e.preventDefault(),e.stopPropagation(),e.dataTransfer.dropEffect=!0===w(r).getConfig("copy")?"copy":"move",c(r,t,e.pageX,e.pageY))}};E(o.concat(e),"dragover",d),E(o.concat(e),"dragenter",d)})),e)}$.destroy=function(e){!function(e){var t=g(e,"opts")||{},r=v(e.children,t.items),n=z(r,t.handle);T(e,"dragover"),T(e,"dragenter"),T(e,"dragstart"),T(e,"dragend"),T(e,"drop"),V(e),T(n,"mousedown"),X(r),J(r),G(P,D),e.isSortable=!1}(e)},$.enable=function(e){Z(e)},$.disable=function(e){!function(e){var t=g(e,"opts"),r=v(e.children,t.items),n=z(r,t.handle);x(e,"aria-dropeffect","none"),g(e,"_disabled","true"),x(n,"draggable","false"),T(n,"mousedown")}(e)},$.__testing={_data:g,_removeItemEvents:X,_removeItemData:J,_removeSortableData:V,_removeContainerEvents:G};const ee=$,te=flarum.core.compat["common/helpers/icon"];var re=e.n(te);const ne=flarum.core.compat["common/utils/extractText"];var oe=e.n(ne);const ie=flarum.core.compat["common/utils/ItemList"];var ae=e.n(ie);const se=flarum.core.compat["common/utils/withAttr"];var le=e.n(se);const ce=flarum.core.compat["common/components/Button"];var de=e.n(ce),ue=function(){function e(){}var t=e.prototype;return t.oninit=function(e){this.policy=e.attrs.policy,this.dirty=!1,this.processing=!1,this.toggleFields=!1,null===this.policy&&this.initNewField()},t.initNewField=function(){this.policy=n().store.createRecord("fof-terms-policies",{attributes:{name:"",url:"",update_message:"",terms_updated_at:""}})},t.boxTitle=function(){return this.policy.exists?this.policy.name():n().translator.trans("fof-terms.admin.buttons.new-policy")},t.view=function(){var e=this;return m(".FoF-Terms-Policiy-Box",[this.policy.exists?m("span.fas.fa-arrows-alt.FoF-Terms-Policiy-Box--handle.js-policy-handle"):null,m(".Button.Button--block.FoF-Terms-Policiy-Header",{onclick:function(){e.toggleFields=!e.toggleFields}},[m(".FoF-Terms-Policiy-Header-Title",this.boxTitle()),m("div",[this.policy.exists?[n().translator.trans("fof-terms.admin.buttons.edit-policy")," "]:null,re()(this.toggleFields?"fas fa-chevron-up":"fas fa-chevron-down")])]),this.toggleFields?this.viewFields():null])},t.viewFields=function(){return m("form.FoF-Terms-Policiy-Body",{onsubmit:this.savePolicy.bind(this)},[this.fields().toArray(),m(".ButtonGroup",[de().component({type:"submit",className:"Button Button--primary",loading:this.processing,disabled:!this.readyToSave()},n().translator.trans("fof-terms.admin.buttons."+(this.policy.exists?"save":"add")+"-policy")),this.policy.exists?de().component({type:"submit",className:"Button Button--danger",loading:this.processing,onclick:this.deletePolicy.bind(this)},n().translator.trans("fof-terms.admin.buttons.delete-policy")):""])])},t.fields=function(){var e=this,t=new(ae());return t.add("name",m(".Form-group",[m("label",n().translator.trans("fof-terms.admin.policies.name")),m("input.FormControl",{type:"text",value:this.policy.name(),oninput:le()("value",this.updateAttribute.bind(this,"name"))}),m(".helpText",n().translator.trans("fof-terms.admin.policies.name-help"))]),100),t.add("url",m(".Form-group",[m("label",n().translator.trans("fof-terms.admin.policies.url")),m("input.FormControl",{type:"url",value:this.policy.url(),oninput:le()("value",this.updateAttribute.bind(this,"url"))}),m(".helpText",n().translator.trans("fof-terms.admin.policies.url-help"))]),95),t.add("update-message",m(".Form-group",[m("label",n().translator.trans("fof-terms.admin.policies.update-message")),m("textarea.FormControl",{value:this.policy.update_message(),oninput:le()("value",this.updateAttribute.bind(this,"update_message"))}),m(".helpText",n().translator.trans("fof-terms.admin.policies.update-message-help"))]),90),t.add("terms-updated-at",m(".Form-group",[m("label",n().translator.trans("fof-terms.admin.policies.terms-updated-at")),m(".FoF-Terms-Input-Group",[m("input.FormControl",{type:"text",value:this.policy.terms_updated_at(),oninput:le()("value",this.updateAttribute.bind(this,"terms_updated_at")),placeholder:n().translator.trans("fof-terms.admin.policies.terms-updated-at-placeholder")}),de().component({className:"Button Button--primary",onclick:function(){e.updateAttribute("terms_updated_at",dayjs().millisecond(0).toISOString())}},n().translator.trans("fof-terms.admin.buttons.set-to-now"))]),m(".helpText",n().translator.trans("fof-terms.admin.policies.terms-updated-at-help"))]),85),this.policy.exists&&t.add("export-url",m(".Form-group",[m("label",n().translator.trans("fof-terms.admin.policies.export-url")),m(".ButtonGroup",["json","csv"].map((function(t){return m("a.Button.FoF-Terms-Export-Button",{href:n().forum.attribute("apiUrl")+"/fof/terms/policies/"+e.policy.id()+"/export."+t,target:"_blank"},t.toUpperCase())}))),m(".helpText",n().translator.trans("fof-terms.admin.policies.export-url-help",{a:m("a",{href:"https://github.com/FriendsOfFlarum/terms/wiki/Export-url",target:"_blank"})}))]),80),t},t.updateAttribute=function(e,t){var r;this.policy.pushAttributes(((r={})[e]=t,r)),this.dirty=!0},t.readyToSave=function(){return this.dirty},t.savePolicy=function(e){var t=this;e.preventDefault(),this.processing=!0;var r=!this.policy.exists;this.policy.save(this.policy.data.attributes).then((function(){r&&(t.initNewField(),t.toggleFields=!1),t.processing=!1,t.dirty=!1,m.redraw()})).catch((function(e){throw t.processing=!1,e}))},t.deletePolicy=function(){var e=this;confirm(oe()(n().translator.trans("fof-terms.admin.messages.delete-policy-confirmation",{name:this.policy.name()})))&&(this.processing=!0,this.policy.delete().then((function(){e.processing=!1,m.redraw()})).catch((function(t){throw e.processing=!1,t})))},e}();function fe(e,t){return void 0===t&&(t="sort"),e.sort((function(e,r){return e[t]()-r[t]()}))}var pe=function(){function e(){}var t=e.prototype;return t.oninit=function(){n().request({method:"GET",url:n().forum.attribute("apiUrl")+"/fof/terms/policies"}).then((function(e){n().store.pushPayload(e),m.redraw()}))},t.oncreate=function(e){this.initsortable(e)},t.onupdate=function(e){this.initsortable(e)},t.initsortable=function(e){var t=this;ee(e.dom.querySelector(".js-policies-container"),{handle:".js-policy-handle"})[0].addEventListener("sortupdate",(function(){var r=[].map.call(e.dom.querySelectorAll(".js-policy-data"),(function(e){return e.dataset.id}));t.updateSort(r)}))},t.view=function(){var e=n().store.all("fof-terms-policies"),t=[];return fe(e).forEach((function(e){t.push(m(".js-policy-data",{key:e.id(),"data-id":e.id()},m(ue,{policy:e})))})),m("div",[m("h2",n().translator.trans("fof-terms.admin.titles.policies")),m(".FoF-Terms-Policies-Container",[m(".js-policies-container",t),m(ue,{policy:null})])])},t.updateSort=function(e){n().request({method:"POST",url:n().forum.attribute("apiUrl")+"/fof/terms/policies/order",body:{sort:e}}).then((function(e){n().store.pushPayload(e),m.redraw()}))},e}(),me="fof-terms.",he="fof-terms.admin.settings.",ge=function(e){function t(){return e.apply(this,arguments)||this}return i(t,e),t.prototype.content=function(){return m(".ExtensionPage-settings",[m(".container",[m(".Form-group",[m("label",n().translator.trans(he+"field.signup-legal-text")),m("textarea.FormControl",{bidi:this.setting(me+"signup-legal-text")})]),m(".Form-group",[m("label",h().component({state:this.setting(me+"hide-updated-at")()>0,onchange:this.setting(me+"hide-updated-at")},n().translator.trans(he+"field.hide-updated-at")))]),m(".Form-group",[m("label",n().translator.trans(he+"field.date-format")),m("input[type=text].FormControl",{bidi:this.setting(me+"date-format"),placeholder:"YYYY-MM-DD"}),m(".helpText",n().translator.trans(he+"field.date-format-help",{a:m("a",{href:"https://day.js.org/docs/en/display/format",target:"_blank"})}))]),this.submitButton(),m(pe)])])},t}(f()),ve={PolicyEdit:ue,PolicyList:pe,TermsSettingsPage:ge},ye={Policy:d},be={sortByAttribute:fe};n().initializers.add("fof-terms",(function(){n().store.models["fof-terms-policies"]=d,n().extensionData.for("fof-terms").registerPermission({icon:"fas fa-paperclip",label:n().translator.trans("fof-terms.admin.permissions.see-user-policies-state"),permission:"fof-terms.see-user-policies-state"},"moderate").registerPermission({icon:"fas fa-paperclip",label:n().translator.trans("fof-terms.admin.permissions.postpone-policies-accept"),permission:"fof-terms.postpone-policies-accept"},"moderate").registerPermission({icon:"fas fa-paperclip",label:n().translator.trans("fof-terms.admin.permissions.export-policies"),permission:"fof-terms.export-policies"},"moderate").registerPage(ge)}))})(),module.exports=t})(); //# sourceMappingURL=admin.js.map \ No newline at end of file diff --git a/js/dist/admin.js.map b/js/dist/admin.js.map index 7cadb64..d9567a4 100644 --- a/js/dist/admin.js.map +++ b/js/dist/admin.js.map @@ -1 +1 @@ -{"version":3,"file":"admin.js","mappings":"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","sources":["webpack://@fof/terms/webpack/bootstrap","webpack://@fof/terms/webpack/runtime/compat get default export","webpack://@fof/terms/webpack/runtime/define property getters","webpack://@fof/terms/webpack/runtime/hasOwnProperty shorthand","webpack://@fof/terms/webpack/runtime/make namespace object","webpack://@fof/terms/external root \"flarum.core.compat['admin/app']\"","webpack://@fof/terms/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://@fof/terms/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@fof/terms/external root \"flarum.core.compat['common/Model']\"","webpack://@fof/terms/external root \"flarum.core.compat['common/utils/computed']\"","webpack://@fof/terms/./src/common/models/Policy.js","webpack://@fof/terms/external root \"flarum.core.compat['admin/components/ExtensionPage']\"","webpack://@fof/terms/external root \"flarum.core.compat['common/components/Switch']\"","webpack://@fof/terms/./node_modules/html5sortable/dist/html5sortable.es.js","webpack://@fof/terms/external root \"flarum.core.compat['common/helpers/icon']\"","webpack://@fof/terms/external root \"flarum.core.compat['common/utils/extractText']\"","webpack://@fof/terms/external root \"flarum.core.compat['common/utils/ItemList']\"","webpack://@fof/terms/external root \"flarum.core.compat['common/utils/withAttr']\"","webpack://@fof/terms/external root \"flarum.core.compat['common/components/Button']\"","webpack://@fof/terms/./src/admin/components/PolicyEdit.js","webpack://@fof/terms/./src/common/helpers/sortByAttribute.js","webpack://@fof/terms/./src/admin/components/PolicyList.js","webpack://@fof/terms/./src/admin/components/TermsSettingsPage.js","webpack://@fof/terms/./src/admin/components/index.js","webpack://@fof/terms/./src/common/models/index.js","webpack://@fof/terms/./src/common/helpers/index.js","webpack://@fof/terms/./src/admin/index.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (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 = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/app'];","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/Model'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/computed'];","import Model from 'flarum/common/Model';\nimport computed from 'flarum/common/utils/computed';\n\nexport default class Policy extends Model {\n sort = Model.attribute('sort');\n name = Model.attribute('name');\n url = Model.attribute('url');\n update_message = Model.attribute('update_message');\n terms_updated_at = Model.attribute('terms_updated_at');\n form_key = computed('id', (id) => 'fof_terms_policy_' + id);\n\n apiEndpoint() {\n return '/fof/terms/policies' + (this.exists ? '/' + this.data.id : '');\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/components/ExtensionPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Switch'];","/*\n * HTML5Sortable package\n * https://github.com/lukasoppermann/html5sortable\n *\n * Maintained by Lukas Oppermann \n *\n * Released under the MIT license.\n */\n/**\n * Get or set data on element\n * @param {HTMLElement} element\n * @param {string} key\n * @param {any} value\n * @return {*}\n */\nfunction addData(element, key, value) {\n if (value === undefined) {\n return element && element.h5s && element.h5s.data && element.h5s.data[key];\n }\n else {\n element.h5s = element.h5s || {};\n element.h5s.data = element.h5s.data || {};\n element.h5s.data[key] = value;\n }\n}\n/**\n * Remove data from element\n * @param {HTMLElement} element\n */\nfunction removeData(element) {\n if (element.h5s) {\n delete element.h5s.data;\n }\n}\n\n/* eslint-env browser */\n/**\n * Filter only wanted nodes\n * @param {NodeList|HTMLCollection|Array} nodes\n * @param {String} selector\n * @returns {Array}\n */\nvar _filter = (function (nodes, selector) {\n if (!(nodes instanceof NodeList || nodes instanceof HTMLCollection || nodes instanceof Array)) {\n throw new Error('You must provide a nodeList/HTMLCollection/Array of elements to be filtered.');\n }\n if (typeof selector !== 'string') {\n return Array.from(nodes);\n }\n return Array.from(nodes).filter(function (item) { return item.nodeType === 1 && item.matches(selector); });\n});\n\n/* eslint-env browser */\nvar stores = new Map();\n/**\n * Stores data & configurations per Sortable\n * @param {Object} config\n */\nvar Store = /** @class */ (function () {\n function Store() {\n this._config = new Map(); // eslint-disable-line no-undef\n this._placeholder = undefined; // eslint-disable-line no-undef\n this._data = new Map(); // eslint-disable-line no-undef\n }\n Object.defineProperty(Store.prototype, \"config\", {\n /**\n * get the configuration map of a class instance\n * @method config\n * @return {object}\n */\n get: function () {\n // transform Map to object\n var config = {};\n this._config.forEach(function (value, key) {\n config[key] = value;\n });\n // return object\n return config;\n },\n /**\n * set the configuration of a class instance\n * @method config\n * @param {object} config object of configurations\n */\n set: function (config) {\n if (typeof config !== 'object') {\n throw new Error('You must provide a valid configuration object to the config setter.');\n }\n // combine config with default\n var mergedConfig = Object.assign({}, config);\n // add config to map\n this._config = new Map(Object.entries(mergedConfig));\n },\n enumerable: false,\n configurable: true\n });\n /**\n * set individual configuration of a class instance\n * @method setConfig\n * @param key valid configuration key\n * @param value any value\n * @return void\n */\n Store.prototype.setConfig = function (key, value) {\n if (!this._config.has(key)) {\n throw new Error(\"Trying to set invalid configuration item: \" + key);\n }\n // set config\n this._config.set(key, value);\n };\n /**\n * get an individual configuration of a class instance\n * @method getConfig\n * @param key valid configuration key\n * @return any configuration value\n */\n Store.prototype.getConfig = function (key) {\n if (!this._config.has(key)) {\n throw new Error(\"Invalid configuration item requested: \" + key);\n }\n return this._config.get(key);\n };\n Object.defineProperty(Store.prototype, \"placeholder\", {\n /**\n * get the placeholder for a class instance\n * @method placeholder\n * @return {HTMLElement|null}\n */\n get: function () {\n return this._placeholder;\n },\n /**\n * set the placeholder for a class instance\n * @method placeholder\n * @param {HTMLElement} placeholder\n * @return {void}\n */\n set: function (placeholder) {\n if (!(placeholder instanceof HTMLElement) && placeholder !== null) {\n throw new Error('A placeholder must be an html element or null.');\n }\n this._placeholder = placeholder;\n },\n enumerable: false,\n configurable: true\n });\n /**\n * set an data entry\n * @method setData\n * @param {string} key\n * @param {any} value\n * @return {void}\n */\n Store.prototype.setData = function (key, value) {\n if (typeof key !== 'string') {\n throw new Error('The key must be a string.');\n }\n this._data.set(key, value);\n };\n /**\n * get an data entry\n * @method getData\n * @param {string} key an existing key\n * @return {any}\n */\n Store.prototype.getData = function (key) {\n if (typeof key !== 'string') {\n throw new Error('The key must be a string.');\n }\n return this._data.get(key);\n };\n /**\n * delete an data entry\n * @method deleteData\n * @param {string} key an existing key\n * @return {boolean}\n */\n Store.prototype.deleteData = function (key) {\n if (typeof key !== 'string') {\n throw new Error('The key must be a string.');\n }\n return this._data.delete(key);\n };\n return Store;\n}());\n/**\n * @param {HTMLElement} sortableElement\n * @returns {Class: Store}\n */\nvar store = (function (sortableElement) {\n // if sortableElement is wrong type\n if (!(sortableElement instanceof HTMLElement)) {\n throw new Error('Please provide a sortable to the store function.');\n }\n // create new instance if not avilable\n if (!stores.has(sortableElement)) {\n stores.set(sortableElement, new Store());\n }\n // return instance\n return stores.get(sortableElement);\n});\n\n/**\n * @param {Array|HTMLElement} element\n * @param {Function} callback\n * @param {string} event\n */\nfunction addEventListener(element, eventName, callback) {\n if (element instanceof Array) {\n for (var i = 0; i < element.length; ++i) {\n addEventListener(element[i], eventName, callback);\n }\n return;\n }\n element.addEventListener(eventName, callback);\n store(element).setData(\"event\" + eventName, callback);\n}\n/**\n * @param {Array|HTMLElement} element\n * @param {string} eventName\n */\nfunction removeEventListener(element, eventName) {\n if (element instanceof Array) {\n for (var i = 0; i < element.length; ++i) {\n removeEventListener(element[i], eventName);\n }\n return;\n }\n element.removeEventListener(eventName, store(element).getData(\"event\" + eventName));\n store(element).deleteData(\"event\" + eventName);\n}\n\n/**\n * @param {Array|HTMLElement} element\n * @param {string} attribute\n * @param {string} value\n */\nfunction addAttribute(element, attribute, value) {\n if (element instanceof Array) {\n for (var i = 0; i < element.length; ++i) {\n addAttribute(element[i], attribute, value);\n }\n return;\n }\n element.setAttribute(attribute, value);\n}\n/**\n * @param {Array|HTMLElement} element\n * @param {string} attribute\n */\nfunction removeAttribute(element, attribute) {\n if (element instanceof Array) {\n for (var i = 0; i < element.length; ++i) {\n removeAttribute(element[i], attribute);\n }\n return;\n }\n element.removeAttribute(attribute);\n}\n\n/**\n * @param {HTMLElement} element\n * @returns {Object}\n */\nvar _offset = (function (element) {\n if (!element.parentElement || element.getClientRects().length === 0) {\n throw new Error('target element must be part of the dom');\n }\n var rect = element.getClientRects()[0];\n return {\n left: rect.left + window.pageXOffset,\n right: rect.right + window.pageXOffset,\n top: rect.top + window.pageYOffset,\n bottom: rect.bottom + window.pageYOffset\n };\n});\n\n/**\n * Creates and returns a new debounced version of the passed function which will postpone its execution until after wait milliseconds have elapsed\n * @param {Function} func to debounce\n * @param {number} time to wait before calling function with latest arguments, 0 - no debounce\n * @returns {function} - debounced function\n */\nvar _debounce = (function (func, wait) {\n if (wait === void 0) { wait = 0; }\n var timeout;\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n clearTimeout(timeout);\n timeout = setTimeout(function () {\n func.apply(void 0, args);\n }, wait);\n };\n});\n\n/* eslint-env browser */\n/**\n * Get position of the element relatively to its sibling elements\n * @param {HTMLElement} element\n * @returns {number}\n */\nvar _index = (function (element, elementList) {\n if (!(element instanceof HTMLElement) || !(elementList instanceof NodeList || elementList instanceof HTMLCollection || elementList instanceof Array)) {\n throw new Error('You must provide an element and a list of elements.');\n }\n return Array.from(elementList).indexOf(element);\n});\n\n/* eslint-env browser */\n/**\n * Test whether element is in DOM\n * @param {HTMLElement} element\n * @returns {boolean}\n */\nvar isInDom = (function (element) {\n if (!(element instanceof HTMLElement)) {\n throw new Error('Element is not a node element.');\n }\n return element.parentNode !== null;\n});\n\n/* eslint-env browser */\n/**\n * Insert node before or after target\n * @param {HTMLElement} referenceNode - reference element\n * @param {HTMLElement} newElement - element to be inserted\n * @param {String} position - insert before or after reference element\n */\nvar insertNode = function (referenceNode, newElement, position) {\n if (!(referenceNode instanceof HTMLElement) || !(referenceNode.parentElement instanceof HTMLElement)) {\n throw new Error('target and element must be a node');\n }\n referenceNode.parentElement.insertBefore(newElement, (position === 'before' ? referenceNode : referenceNode.nextElementSibling));\n};\n/**\n * Insert before target\n * @param {HTMLElement} target\n * @param {HTMLElement} element\n */\nvar insertBefore = function (target, element) { return insertNode(target, element, 'before'); };\n/**\n * Insert after target\n * @param {HTMLElement} target\n * @param {HTMLElement} element\n */\nvar insertAfter = function (target, element) { return insertNode(target, element, 'after'); };\n\n/* eslint-env browser */\n/**\n * Filter only wanted nodes\n * @param {HTMLElement} sortableContainer\n * @param {Function} customSerializer\n * @returns {Array}\n */\nvar _serialize = (function (sortableContainer, customItemSerializer, customContainerSerializer) {\n if (customItemSerializer === void 0) { customItemSerializer = function (serializedItem, sortableContainer) { return serializedItem; }; }\n if (customContainerSerializer === void 0) { customContainerSerializer = function (serializedContainer) { return serializedContainer; }; }\n // check for valid sortableContainer\n if (!(sortableContainer instanceof HTMLElement) || !sortableContainer.isSortable === true) {\n throw new Error('You need to provide a sortableContainer to be serialized.');\n }\n // check for valid serializers\n if (typeof customItemSerializer !== 'function' || typeof customContainerSerializer !== 'function') {\n throw new Error('You need to provide a valid serializer for items and the container.');\n }\n // get options\n var options = addData(sortableContainer, 'opts');\n var item = options.items;\n // serialize container\n var items = _filter(sortableContainer.children, item);\n var serializedItems = items.map(function (item) {\n return {\n parent: sortableContainer,\n node: item,\n html: item.outerHTML,\n index: _index(item, items)\n };\n });\n // serialize container\n var container = {\n node: sortableContainer,\n itemCount: serializedItems.length\n };\n return {\n container: customContainerSerializer(container),\n items: serializedItems.map(function (item) { return customItemSerializer(item, sortableContainer); })\n };\n});\n\n/* eslint-env browser */\n/**\n * create a placeholder element\n * @param {HTMLElement} sortableElement a single sortable\n * @param {string|undefined} placeholder a string representing an html element\n * @param {string} placeholderClasses a string representing the classes that should be added to the placeholder\n */\nvar _makePlaceholder = (function (sortableElement, placeholder, placeholderClass) {\n var _a;\n if (placeholderClass === void 0) { placeholderClass = 'sortable-placeholder'; }\n if (!(sortableElement instanceof HTMLElement)) {\n throw new Error('You must provide a valid element as a sortable.');\n }\n // if placeholder is not an element\n if (!(placeholder instanceof HTMLElement) && placeholder !== undefined) {\n throw new Error('You must provide a valid element as a placeholder or set ot to undefined.');\n }\n // if no placeholder element is given\n if (placeholder === undefined) {\n if (['UL', 'OL'].includes(sortableElement.tagName)) {\n placeholder = document.createElement('li');\n }\n else if (['TABLE', 'TBODY'].includes(sortableElement.tagName)) {\n placeholder = document.createElement('tr');\n // set colspan to always all rows, otherwise the item can only be dropped in first column\n placeholder.innerHTML = '';\n }\n else {\n placeholder = document.createElement('div');\n }\n }\n // add classes to placeholder\n if (typeof placeholderClass === 'string') {\n (_a = placeholder.classList).add.apply(_a, placeholderClass.split(' '));\n }\n return placeholder;\n});\n\n/* eslint-env browser */\n/**\n * Get height of an element including padding\n * @param {HTMLElement} element an dom element\n */\nvar _getElementHeight = (function (element) {\n if (!(element instanceof HTMLElement)) {\n throw new Error('You must provide a valid dom element');\n }\n // get calculated style of element\n var style = window.getComputedStyle(element);\n // get only height if element has box-sizing: border-box specified\n if (style.getPropertyValue('box-sizing') === 'border-box') {\n return parseInt(style.getPropertyValue('height'), 10);\n }\n // pick applicable properties, convert to int and reduce by adding\n return ['height', 'padding-top', 'padding-bottom']\n .map(function (key) {\n var int = parseInt(style.getPropertyValue(key), 10);\n return isNaN(int) ? 0 : int;\n })\n .reduce(function (sum, value) { return sum + value; });\n});\n\n/* eslint-env browser */\n/**\n * Get width of an element including padding\n * @param {HTMLElement} element an dom element\n */\nvar _getElementWidth = (function (element) {\n if (!(element instanceof HTMLElement)) {\n throw new Error('You must provide a valid dom element');\n }\n // get calculated style of element\n var style = window.getComputedStyle(element);\n // pick applicable properties, convert to int and reduce by adding\n return ['width', 'padding-left', 'padding-right']\n .map(function (key) {\n var int = parseInt(style.getPropertyValue(key), 10);\n return isNaN(int) ? 0 : int;\n })\n .reduce(function (sum, value) { return sum + value; });\n});\n\n/* eslint-env browser */\n/**\n * get handle or return item\n * @param {Array} items\n * @param {string} selector\n */\nvar _getHandles = (function (items, selector) {\n if (!(items instanceof Array)) {\n throw new Error('You must provide a Array of HTMLElements to be filtered.');\n }\n if (typeof selector !== 'string') {\n return items;\n }\n return items\n // remove items without handle from array\n .filter(function (item) {\n return item.querySelector(selector) instanceof HTMLElement ||\n (item.shadowRoot && item.shadowRoot.querySelector(selector) instanceof HTMLElement);\n })\n // replace item with handle in array\n .map(function (item) {\n return item.querySelector(selector) || (item.shadowRoot && item.shadowRoot.querySelector(selector));\n });\n});\n\n/**\n * @param {Event} event\n * @returns {HTMLElement}\n */\nvar getEventTarget = (function (event) {\n return (event.composedPath && event.composedPath()[0]) || event.target;\n});\n\n/* eslint-env browser */\n/**\n * defaultDragImage returns the current item as dragged image\n * @param {HTMLElement} draggedElement - the item that the user drags\n * @param {object} elementOffset - an object with the offsets top, left, right & bottom\n * @param {Event} event - the original drag event object\n * @return {object} with element, posX and posY properties\n */\nvar defaultDragImage = function (draggedElement, elementOffset, event) {\n return {\n element: draggedElement,\n posX: event.pageX - elementOffset.left,\n posY: event.pageY - elementOffset.top\n };\n};\n/**\n * attaches an element as the drag image to an event\n * @param {Event} event - the original drag event object\n * @param {HTMLElement} draggedElement - the item that the user drags\n * @param {Function} customDragImage - function to create a custom dragImage\n * @return void\n */\nvar setDragImage = (function (event, draggedElement, customDragImage) {\n // check if event is provided\n if (!(event instanceof Event)) {\n throw new Error('setDragImage requires a DragEvent as the first argument.');\n }\n // check if draggedElement is provided\n if (!(draggedElement instanceof HTMLElement)) {\n throw new Error('setDragImage requires the dragged element as the second argument.');\n }\n // set default function of none provided\n if (!customDragImage) {\n customDragImage = defaultDragImage;\n }\n // check if setDragImage method is available\n if (event.dataTransfer && event.dataTransfer.setDragImage) {\n // get the elements offset\n var elementOffset = _offset(draggedElement);\n // get the dragImage\n var dragImage = customDragImage(draggedElement, elementOffset, event);\n // check if custom function returns correct values\n if (!(dragImage.element instanceof HTMLElement) || typeof dragImage.posX !== 'number' || typeof dragImage.posY !== 'number') {\n throw new Error('The customDragImage function you provided must return and object with the properties element[string], posX[integer], posY[integer].');\n }\n // needs to be set for HTML5 drag & drop to work\n event.dataTransfer.effectAllowed = 'copyMove';\n // Firefox requires it to use the event target's id for the data\n event.dataTransfer.setData('text/plain', getEventTarget(event).id);\n // set the drag image on the event\n event.dataTransfer.setDragImage(dragImage.element, dragImage.posX, dragImage.posY);\n }\n});\n\n/**\n * Check if curList accepts items from destList\n * @param {sortable} destination the container an item is move to\n * @param {sortable} origin the container an item comes from\n */\nvar _listsConnected = (function (destination, origin) {\n // check if valid sortable\n if (destination.isSortable === true) {\n var acceptFrom = store(destination).getConfig('acceptFrom');\n // check if acceptFrom is valid\n if (acceptFrom !== null && acceptFrom !== false && typeof acceptFrom !== 'string') {\n throw new Error('HTML5Sortable: Wrong argument, \"acceptFrom\" must be \"null\", \"false\", or a valid selector string.');\n }\n if (acceptFrom !== null) {\n return acceptFrom !== false && acceptFrom.split(',').filter(function (sel) {\n return sel.length > 0 && origin.matches(sel);\n }).length > 0;\n }\n // drop in same list\n if (destination === origin) {\n return true;\n }\n // check if lists are connected with connectWith\n if (store(destination).getConfig('connectWith') !== undefined && store(destination).getConfig('connectWith') !== null) {\n return store(destination).getConfig('connectWith') === store(origin).getConfig('connectWith');\n }\n }\n return false;\n});\n\n/**\n * default configurations\n */\nvar defaultConfiguration = {\n items: null,\n // deprecated\n connectWith: null,\n // deprecated\n disableIEFix: null,\n acceptFrom: null,\n copy: false,\n placeholder: null,\n placeholderClass: 'sortable-placeholder',\n draggingClass: 'sortable-dragging',\n hoverClass: false,\n dropTargetContainerClass: false,\n debounce: 0,\n throttleTime: 100,\n maxItems: 0,\n itemSerializer: undefined,\n containerSerializer: undefined,\n customDragImage: null,\n orientation: 'vertical'\n};\n\n/**\n * make sure a function is only called once within the given amount of time\n * @param {Function} fn the function to throttle\n * @param {number} threshold time limit for throttling\n */\n// must use function to keep this context\nfunction _throttle (fn, threshold) {\n var _this = this;\n if (threshold === void 0) { threshold = 250; }\n // check function\n if (typeof fn !== 'function') {\n throw new Error('You must provide a function as the first argument for throttle.');\n }\n // check threshold\n if (typeof threshold !== 'number') {\n throw new Error('You must provide a number as the second argument for throttle.');\n }\n var lastEventTimestamp = null;\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var now = Date.now();\n if (lastEventTimestamp === null || now - lastEventTimestamp >= threshold) {\n lastEventTimestamp = now;\n fn.apply(_this, args);\n }\n };\n}\n\n/* eslint-env browser */\n/**\n * enable or disable hoverClass on mouseenter/leave if container Items\n * @param {sortable} sortableContainer a valid sortableContainer\n * @param {boolean} enable enable or disable event\n */\n// export default (sortableContainer: sortable, enable: boolean) => {\nvar enableHoverClass = (function (sortableContainer, enable) {\n if (typeof store(sortableContainer).getConfig('hoverClass') === 'string') {\n var hoverClasses_1 = store(sortableContainer).getConfig('hoverClass').split(' ');\n // add class on hover\n if (enable === true) {\n addEventListener(sortableContainer, 'mousemove', _throttle(function (event) {\n // check of no mouse button was pressed when mousemove started == no drag\n if (event.buttons === 0) {\n _filter(sortableContainer.children, store(sortableContainer).getConfig('items')).forEach(function (item) {\n var _a, _b;\n if (item !== event.target) {\n (_a = item.classList).remove.apply(_a, hoverClasses_1);\n }\n else {\n (_b = item.classList).add.apply(_b, hoverClasses_1);\n }\n });\n }\n }, store(sortableContainer).getConfig('throttleTime')));\n // remove class on leave\n addEventListener(sortableContainer, 'mouseleave', function () {\n _filter(sortableContainer.children, store(sortableContainer).getConfig('items')).forEach(function (item) {\n var _a;\n (_a = item.classList).remove.apply(_a, hoverClasses_1);\n });\n });\n // remove events\n }\n else {\n removeEventListener(sortableContainer, 'mousemove');\n removeEventListener(sortableContainer, 'mouseleave');\n }\n }\n});\n\n/* eslint-env browser */\n/*\n * variables global to the plugin\n */\nvar dragging;\nvar draggingHeight;\nvar draggingWidth;\n/*\n * Keeps track of the initialy selected list, where 'dragstart' event was triggered\n * It allows us to move the data in between individual Sortable List instances\n */\n// Origin List - data from before any item was changed\nvar originContainer;\nvar originIndex;\nvar originElementIndex;\nvar originItemsBeforeUpdate;\n// Previous Sortable Container - we dispatch as sortenter event when a\n// dragged item enters a sortableContainer for the first time\nvar previousContainer;\n// Destination List - data from before any item was changed\nvar destinationItemsBeforeUpdate;\n/**\n * remove event handlers from items\n * @param {Array|NodeList} items\n */\nvar _removeItemEvents = function (items) {\n removeEventListener(items, 'dragstart');\n removeEventListener(items, 'dragend');\n removeEventListener(items, 'dragover');\n removeEventListener(items, 'dragenter');\n removeEventListener(items, 'drop');\n removeEventListener(items, 'mouseenter');\n removeEventListener(items, 'mouseleave');\n};\n// Remove container events\nvar _removeContainerEvents = function (originContainer, previousContainer) {\n if (originContainer) {\n removeEventListener(originContainer, 'dragleave');\n }\n if (previousContainer && (previousContainer !== originContainer)) {\n removeEventListener(previousContainer, 'dragleave');\n }\n};\n/**\n * _getDragging returns the current element to drag or\n * a copy of the element.\n * Is Copy Active for sortable\n * @param {HTMLElement} draggedItem - the item that the user drags\n * @param {HTMLElement} sortable a single sortable\n */\nvar _getDragging = function (draggedItem, sortable) {\n var ditem = draggedItem;\n if (store(sortable).getConfig('copy') === true) {\n ditem = draggedItem.cloneNode(true);\n addAttribute(ditem, 'aria-copied', 'true');\n draggedItem.parentElement.appendChild(ditem);\n ditem.style.display = 'none';\n ditem.oldDisplay = draggedItem.style.display;\n }\n return ditem;\n};\n/**\n * Remove data from sortable\n * @param {HTMLElement} sortable a single sortable\n */\nvar _removeSortableData = function (sortable) {\n removeData(sortable);\n removeAttribute(sortable, 'aria-dropeffect');\n};\n/**\n * Remove data from items\n * @param {Array|HTMLElement} items\n */\nvar _removeItemData = function (items) {\n removeAttribute(items, 'aria-grabbed');\n removeAttribute(items, 'aria-copied');\n removeAttribute(items, 'draggable');\n removeAttribute(items, 'role');\n};\n/**\n * find sortable from element. travels up parent element until found or null.\n * @param {HTMLElement} element a single sortable\n * @param {Event} event - the current event. We need to pass it to be able to\n * find Sortable whith shadowRoot (document fragment has no parent)\n */\nfunction findSortable(element, event) {\n if (event.composedPath) {\n return event.composedPath().find(function (el) { return el.isSortable; });\n }\n while (element.isSortable !== true) {\n element = element.parentElement;\n }\n return element;\n}\n/**\n * Dragging event is on the sortable element. finds the top child that\n * contains the element.\n * @param {HTMLElement} sortableElement a single sortable\n * @param {HTMLElement} element is that being dragged\n */\nfunction findDragElement(sortableElement, element) {\n var options = addData(sortableElement, 'opts');\n var items = _filter(sortableElement.children, options.items);\n var itemlist = items.filter(function (ele) {\n return ele.contains(element) || (ele.shadowRoot && ele.shadowRoot.contains(element));\n });\n return itemlist.length > 0 ? itemlist[0] : element;\n}\n/**\n * Destroy the sortable\n * @param {HTMLElement} sortableElement a single sortable\n */\nvar _destroySortable = function (sortableElement) {\n var opts = addData(sortableElement, 'opts') || {};\n var items = _filter(sortableElement.children, opts.items);\n var handles = _getHandles(items, opts.handle);\n // remove event handlers & data from sortable\n removeEventListener(sortableElement, 'dragover');\n removeEventListener(sortableElement, 'dragenter');\n removeEventListener(sortableElement, 'dragstart');\n removeEventListener(sortableElement, 'dragend');\n removeEventListener(sortableElement, 'drop');\n // remove event data from sortable\n _removeSortableData(sortableElement);\n // remove event handlers & data from items\n removeEventListener(handles, 'mousedown');\n _removeItemEvents(items);\n _removeItemData(items);\n _removeContainerEvents(originContainer, previousContainer);\n // clear sortable flag\n sortableElement.isSortable = false;\n};\n/**\n * Enable the sortable\n * @param {HTMLElement} sortableElement a single sortable\n */\nvar _enableSortable = function (sortableElement) {\n var opts = addData(sortableElement, 'opts');\n var items = _filter(sortableElement.children, opts.items);\n var handles = _getHandles(items, opts.handle);\n addAttribute(sortableElement, 'aria-dropeffect', 'move');\n addData(sortableElement, '_disabled', 'false');\n addAttribute(handles, 'draggable', 'true');\n // @todo: remove this fix\n // IE FIX for ghost\n // can be disabled as it has the side effect that other events\n // (e.g. click) will be ignored\n if (opts.disableIEFix === false) {\n var spanEl = (document || window.document).createElement('span');\n if (typeof spanEl.dragDrop === 'function') {\n addEventListener(handles, 'mousedown', function () {\n if (items.indexOf(this) !== -1) {\n this.dragDrop();\n }\n else {\n var parent = this.parentElement;\n while (items.indexOf(parent) === -1) {\n parent = parent.parentElement;\n }\n parent.dragDrop();\n }\n });\n }\n }\n};\n/**\n * Disable the sortable\n * @param {HTMLElement} sortableElement a single sortable\n */\nvar _disableSortable = function (sortableElement) {\n var opts = addData(sortableElement, 'opts');\n var items = _filter(sortableElement.children, opts.items);\n var handles = _getHandles(items, opts.handle);\n addAttribute(sortableElement, 'aria-dropeffect', 'none');\n addData(sortableElement, '_disabled', 'true');\n addAttribute(handles, 'draggable', 'false');\n removeEventListener(handles, 'mousedown');\n};\n/**\n * Reload the sortable\n * @param {HTMLElement} sortableElement a single sortable\n * @description events need to be removed to not be double bound\n */\nvar _reloadSortable = function (sortableElement) {\n var opts = addData(sortableElement, 'opts');\n var items = _filter(sortableElement.children, opts.items);\n var handles = _getHandles(items, opts.handle);\n addData(sortableElement, '_disabled', 'false');\n // remove event handlers from items\n _removeItemEvents(items);\n _removeContainerEvents(originContainer, previousContainer);\n removeEventListener(handles, 'mousedown');\n // remove event handlers from sortable\n removeEventListener(sortableElement, 'dragover');\n removeEventListener(sortableElement, 'dragenter');\n removeEventListener(sortableElement, 'drop');\n};\n/**\n * Public sortable object\n * @param {Array|NodeList} sortableElements\n * @param {object|string} options|method\n */\nfunction sortable(sortableElements, options) {\n // get method string to see if a method is called\n var method = String(options);\n options = options || {};\n // check if the user provided a selector instead of an element\n if (typeof sortableElements === 'string') {\n sortableElements = document.querySelectorAll(sortableElements);\n }\n // if the user provided an element, return it in an array to keep the return value consistant\n if (sortableElements instanceof HTMLElement) {\n sortableElements = [sortableElements];\n }\n sortableElements = Array.prototype.slice.call(sortableElements);\n if (/serialize/.test(method)) {\n return sortableElements.map(function (sortableContainer) {\n var opts = addData(sortableContainer, 'opts');\n return _serialize(sortableContainer, opts.itemSerializer, opts.containerSerializer);\n });\n }\n sortableElements.forEach(function (sortableElement) {\n if (/enable|disable|destroy/.test(method)) {\n return sortable[method](sortableElement);\n }\n // log deprecation\n ['connectWith', 'disableIEFix'].forEach(function (configKey) {\n if (Object.prototype.hasOwnProperty.call(options, configKey) && options[configKey] !== null) {\n console.warn(\"HTML5Sortable: You are using the deprecated configuration \\\"\" + configKey + \"\\\". This will be removed in an upcoming version, make sure to migrate to the new options when updating.\");\n }\n });\n // merge options with default options\n options = Object.assign({}, defaultConfiguration, store(sortableElement).config, options);\n // init data store for sortable\n store(sortableElement).config = options;\n // set options on sortable\n addData(sortableElement, 'opts', options);\n // property to define as sortable\n sortableElement.isSortable = true;\n // reset sortable\n _reloadSortable(sortableElement);\n // initialize\n var listItems = _filter(sortableElement.children, options.items);\n // create element if user defined a placeholder element as a string\n var customPlaceholder;\n if (options.placeholder !== null && options.placeholder !== undefined) {\n var tempContainer = document.createElement(sortableElement.tagName);\n if (options.placeholder instanceof HTMLElement) {\n tempContainer.appendChild(options.placeholder);\n }\n else {\n tempContainer.innerHTML = options.placeholder;\n }\n customPlaceholder = tempContainer.children[0];\n }\n // add placeholder\n store(sortableElement).placeholder = _makePlaceholder(sortableElement, customPlaceholder, options.placeholderClass);\n addData(sortableElement, 'items', options.items);\n if (options.acceptFrom) {\n addData(sortableElement, 'acceptFrom', options.acceptFrom);\n }\n else if (options.connectWith) {\n addData(sortableElement, 'connectWith', options.connectWith);\n }\n _enableSortable(sortableElement);\n addAttribute(listItems, 'role', 'option');\n addAttribute(listItems, 'aria-grabbed', 'false');\n // enable hover class\n enableHoverClass(sortableElement, true);\n /*\n Handle drag events on draggable items\n Handle is set at the sortableElement level as it will bubble up\n from the item\n */\n addEventListener(sortableElement, 'dragstart', function (e) {\n // ignore dragstart events\n var target = getEventTarget(e);\n if (target.isSortable === true) {\n return;\n }\n e.stopImmediatePropagation();\n if ((options.handle && !target.matches(options.handle)) || target.getAttribute('draggable') === 'false') {\n return;\n }\n var sortableContainer = findSortable(target, e);\n var dragItem = findDragElement(sortableContainer, target);\n // grab values\n originItemsBeforeUpdate = _filter(sortableContainer.children, options.items);\n originIndex = originItemsBeforeUpdate.indexOf(dragItem);\n originElementIndex = _index(dragItem, sortableContainer.children);\n originContainer = sortableContainer;\n // add transparent clone or other ghost to cursor\n setDragImage(e, dragItem, options.customDragImage);\n // cache selsection & add attr for dragging\n draggingHeight = _getElementHeight(dragItem);\n draggingWidth = _getElementWidth(dragItem);\n dragItem.classList.add(options.draggingClass);\n dragging = _getDragging(dragItem, sortableContainer);\n addAttribute(dragging, 'aria-grabbed', 'true');\n // dispatch sortstart event on each element in group\n sortableContainer.dispatchEvent(new CustomEvent('sortstart', {\n detail: {\n origin: {\n elementIndex: originElementIndex,\n index: originIndex,\n container: originContainer\n },\n item: dragging,\n originalTarget: target\n }\n }));\n });\n /*\n We are capturing targetSortable before modifications with 'dragenter' event\n */\n addEventListener(sortableElement, 'dragenter', function (e) {\n var target = getEventTarget(e);\n var sortableContainer = findSortable(target, e);\n if (sortableContainer && sortableContainer !== previousContainer) {\n destinationItemsBeforeUpdate = _filter(sortableContainer.children, addData(sortableContainer, 'items'))\n .filter(function (item) { return item !== store(sortableElement).placeholder; });\n if (options.dropTargetContainerClass) {\n sortableContainer.classList.add(options.dropTargetContainerClass);\n }\n sortableContainer.dispatchEvent(new CustomEvent('sortenter', {\n detail: {\n origin: {\n elementIndex: originElementIndex,\n index: originIndex,\n container: originContainer\n },\n destination: {\n container: sortableContainer,\n itemsBeforeUpdate: destinationItemsBeforeUpdate\n },\n item: dragging,\n originalTarget: target\n }\n }));\n addEventListener(sortableContainer, 'dragleave', function (e) {\n // TODO: rename outTarget to be more self-explanatory\n // e.fromElement for very old browsers, similar to relatedTarget\n var outTarget = e.relatedTarget || e.fromElement;\n if (!e.currentTarget.contains(outTarget)) {\n if (options.dropTargetContainerClass) {\n sortableContainer.classList.remove(options.dropTargetContainerClass);\n }\n sortableContainer.dispatchEvent(new CustomEvent('sortleave', {\n detail: {\n origin: {\n elementIndex: originElementIndex,\n index: originIndex,\n container: sortableContainer\n },\n item: dragging,\n originalTarget: target\n }\n }));\n }\n });\n }\n previousContainer = sortableContainer;\n });\n /*\n * Dragend Event - https://developer.mozilla.org/en-US/docs/Web/Events/dragend\n * Fires each time dragEvent end, or ESC pressed\n * We are using it to clean up any draggable elements and placeholders\n */\n addEventListener(sortableElement, 'dragend', function (e) {\n if (!dragging) {\n return;\n }\n dragging.classList.remove(options.draggingClass);\n addAttribute(dragging, 'aria-grabbed', 'false');\n if (dragging.getAttribute('aria-copied') === 'true' && addData(dragging, 'dropped') !== 'true') {\n dragging.remove();\n }\n dragging.style.display = dragging.oldDisplay;\n delete dragging.oldDisplay;\n var visiblePlaceholder = Array.from(stores.values()).map(function (data) { return data.placeholder; })\n .filter(function (placeholder) { return placeholder instanceof HTMLElement; })\n .filter(isInDom)[0];\n if (visiblePlaceholder) {\n visiblePlaceholder.remove();\n }\n // dispatch sortstart event on each element in group\n sortableElement.dispatchEvent(new CustomEvent('sortstop', {\n detail: {\n origin: {\n elementIndex: originElementIndex,\n index: originIndex,\n container: originContainer\n },\n item: dragging\n }\n }));\n previousContainer = null;\n dragging = null;\n draggingHeight = null;\n draggingWidth = null;\n });\n /*\n * Drop Event - https://developer.mozilla.org/en-US/docs/Web/Events/drop\n * Fires when valid drop target area is hit\n */\n addEventListener(sortableElement, 'drop', function (e) {\n if (!_listsConnected(sortableElement, dragging.parentElement)) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n addData(dragging, 'dropped', 'true');\n // get the one placeholder that is currently visible\n var visiblePlaceholder = Array.from(stores.values()).map(function (data) {\n return data.placeholder;\n })\n // filter only HTMLElements\n .filter(function (placeholder) { return placeholder instanceof HTMLElement; })\n // filter only elements in DOM\n .filter(isInDom)[0];\n // attach element after placeholder\n insertAfter(visiblePlaceholder, dragging);\n // remove placeholder from dom\n visiblePlaceholder.remove();\n /*\n * Fires Custom Event - 'sortstop'\n */\n sortableElement.dispatchEvent(new CustomEvent('sortstop', {\n detail: {\n origin: {\n elementIndex: originElementIndex,\n index: originIndex,\n container: originContainer\n },\n item: dragging\n }\n }));\n var placeholder = store(sortableElement).placeholder;\n var originItems = _filter(originContainer.children, options.items)\n .filter(function (item) { return item !== placeholder; });\n var destinationContainer = this.isSortable === true ? this : this.parentElement;\n var destinationItems = _filter(destinationContainer.children, addData(destinationContainer, 'items'))\n .filter(function (item) { return item !== placeholder; });\n var destinationElementIndex = _index(dragging, Array.from(dragging.parentElement.children)\n .filter(function (item) { return item !== placeholder; }));\n var destinationIndex = _index(dragging, destinationItems);\n if (options.dropTargetContainerClass) {\n destinationContainer.classList.remove(options.dropTargetContainerClass);\n }\n /*\n * When a list item changed container lists or index within a list\n * Fires Custom Event - 'sortupdate'\n */\n if (originElementIndex !== destinationElementIndex || originContainer !== destinationContainer) {\n sortableElement.dispatchEvent(new CustomEvent('sortupdate', {\n detail: {\n origin: {\n elementIndex: originElementIndex,\n index: originIndex,\n container: originContainer,\n itemsBeforeUpdate: originItemsBeforeUpdate,\n items: originItems\n },\n destination: {\n index: destinationIndex,\n elementIndex: destinationElementIndex,\n container: destinationContainer,\n itemsBeforeUpdate: destinationItemsBeforeUpdate,\n items: destinationItems\n },\n item: dragging\n }\n }));\n }\n });\n var debouncedDragOverEnter = _debounce(function (sortableElement, element, pageX, pageY) {\n if (!dragging) {\n return;\n }\n // set placeholder height if forcePlaceholderSize option is set\n if (options.forcePlaceholderSize) {\n store(sortableElement).placeholder.style.height = draggingHeight + 'px';\n store(sortableElement).placeholder.style.width = draggingWidth + 'px';\n }\n // if element the draggedItem is dragged onto is within the array of all elements in list\n // (not only items, but also disabled, etc.)\n if (Array.from(sortableElement.children).indexOf(element) > -1) {\n var thisHeight = _getElementHeight(element);\n var thisWidth = _getElementWidth(element);\n var placeholderIndex = _index(store(sortableElement).placeholder, element.parentElement.children);\n var thisIndex = _index(element, element.parentElement.children);\n // Check if `element` is bigger than the draggable. If it is, we have to define a dead zone to prevent flickering\n if (thisHeight > draggingHeight || thisWidth > draggingWidth) {\n // Dead zone?\n var deadZoneVertical = thisHeight - draggingHeight;\n var deadZoneHorizontal = thisWidth - draggingWidth;\n var offsetTop = _offset(element).top;\n var offsetLeft = _offset(element).left;\n if (placeholderIndex < thisIndex &&\n ((options.orientation === 'vertical' && pageY < offsetTop) ||\n (options.orientation === 'horizontal' && pageX < offsetLeft))) {\n return;\n }\n if (placeholderIndex > thisIndex &&\n ((options.orientation === 'vertical' && pageY > offsetTop + thisHeight - deadZoneVertical) ||\n (options.orientation === 'horizontal' && pageX > offsetLeft + thisWidth - deadZoneHorizontal))) {\n return;\n }\n }\n if (dragging.oldDisplay === undefined) {\n dragging.oldDisplay = dragging.style.display;\n }\n if (dragging.style.display !== 'none') {\n dragging.style.display = 'none';\n }\n // To avoid flicker, determine where to position the placeholder\n // based on where the mouse pointer is relative to the elements\n // vertical center.\n var placeAfter = false;\n try {\n var elementMiddleVertical = _offset(element).top + element.offsetHeight / 2;\n var elementMiddleHorizontal = _offset(element).left + element.offsetWidth / 2;\n placeAfter = (options.orientation === 'vertical' && (pageY >= elementMiddleVertical)) ||\n (options.orientation === 'horizontal' && (pageX >= elementMiddleHorizontal));\n }\n catch (e) {\n placeAfter = placeholderIndex < thisIndex;\n }\n if (placeAfter) {\n insertAfter(element, store(sortableElement).placeholder);\n }\n else {\n insertBefore(element, store(sortableElement).placeholder);\n }\n // get placeholders from all stores & remove all but current one\n Array.from(stores.values())\n // remove empty values\n .filter(function (data) { return data.placeholder !== undefined; })\n // foreach placeholder in array if outside of current sorableContainer -> remove from DOM\n .forEach(function (data) {\n if (data.placeholder !== store(sortableElement).placeholder) {\n data.placeholder.remove();\n }\n });\n }\n else {\n // get all placeholders from store\n var placeholders = Array.from(stores.values())\n .filter(function (data) { return data.placeholder !== undefined; })\n .map(function (data) {\n return data.placeholder;\n });\n // check if element is not in placeholders\n if (placeholders.indexOf(element) === -1 && sortableElement === element && !_filter(element.children, options.items).length) {\n placeholders.forEach(function (element) { return element.remove(); });\n element.appendChild(store(sortableElement).placeholder);\n }\n }\n }, options.debounce);\n // Handle dragover and dragenter events on draggable items\n var onDragOverEnter = function (e) {\n var element = e.target;\n var sortableElement = element.isSortable === true ? element : findSortable(element, e);\n element = findDragElement(sortableElement, element);\n if (!dragging || !_listsConnected(sortableElement, dragging.parentElement) || addData(sortableElement, '_disabled') === 'true') {\n return;\n }\n var options = addData(sortableElement, 'opts');\n if (parseInt(options.maxItems) && _filter(sortableElement.children, addData(sortableElement, 'items')).length >= parseInt(options.maxItems) && dragging.parentElement !== sortableElement) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n e.dataTransfer.dropEffect = store(sortableElement).getConfig('copy') === true ? 'copy' : 'move';\n debouncedDragOverEnter(sortableElement, element, e.pageX, e.pageY);\n };\n addEventListener(listItems.concat(sortableElement), 'dragover', onDragOverEnter);\n addEventListener(listItems.concat(sortableElement), 'dragenter', onDragOverEnter);\n });\n return sortableElements;\n}\nsortable.destroy = function (sortableElement) {\n _destroySortable(sortableElement);\n};\nsortable.enable = function (sortableElement) {\n _enableSortable(sortableElement);\n};\nsortable.disable = function (sortableElement) {\n _disableSortable(sortableElement);\n};\n/* START.TESTS_ONLY */\nsortable.__testing = {\n // add internal methods here for testing purposes\n _data: addData,\n _removeItemEvents: _removeItemEvents,\n _removeItemData: _removeItemData,\n _removeSortableData: _removeSortableData,\n _removeContainerEvents: _removeContainerEvents\n};\n\nexport default sortable;\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/icon'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/extractText'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/ItemList'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/withAttr'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Button'];","import app from 'flarum/admin/app';\nimport icon from 'flarum/common/helpers/icon';\nimport extractText from 'flarum/common/utils/extractText';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport withAttr from 'flarum/common/utils/withAttr';\nimport Button from 'flarum/common/components/Button';\n\n/* global m, dayjs */\n\nexport default class PolicyEdit {\n oninit(vnode) {\n this.policy = vnode.attrs.policy;\n this.dirty = false;\n this.processing = false;\n this.toggleFields = false;\n\n if (this.policy === null) {\n this.initNewField();\n }\n }\n\n initNewField() {\n this.policy = app.store.createRecord('fof-terms-policies', {\n attributes: {\n name: '',\n url: '',\n update_message: '',\n terms_updated_at: '',\n },\n });\n }\n\n boxTitle() {\n if (this.policy.exists) {\n return this.policy.name();\n }\n\n return app.translator.trans('fof-terms.admin.buttons.new-policy');\n }\n\n view() {\n return m('.FoF-Terms-Policiy-Box', [\n this.policy.exists ? m('span.fas.fa-arrows-alt.FoF-Terms-Policiy-Box--handle.js-policy-handle') : null,\n m(\n '.Button.Button--block.FoF-Terms-Policiy-Header',\n {\n onclick: () => {\n this.toggleFields = !this.toggleFields;\n },\n },\n [\n m('.FoF-Terms-Policiy-Header-Title', this.boxTitle()),\n m('div', [\n this.policy.exists ? [app.translator.trans('fof-terms.admin.buttons.edit-policy'), ' '] : null,\n icon(this.toggleFields ? 'fas fa-chevron-up' : 'fas fa-chevron-down'),\n ]),\n ]\n ),\n this.toggleFields ? this.viewFields() : null,\n ]);\n }\n\n viewFields() {\n return m(\n 'form.FoF-Terms-Policiy-Body',\n {\n onsubmit: this.savePolicy.bind(this),\n },\n [\n this.fields().toArray(),\n m('.ButtonGroup', [\n Button.component(\n {\n type: 'submit',\n className: 'Button Button--primary',\n loading: this.processing,\n disabled: !this.readyToSave(),\n },\n app.translator.trans('fof-terms.admin.buttons.' + (this.policy.exists ? 'save' : 'add') + '-policy')\n ),\n this.policy.exists\n ? Button.component(\n {\n type: 'submit',\n className: 'Button Button--danger',\n loading: this.processing,\n onclick: this.deletePolicy.bind(this),\n },\n app.translator.trans('fof-terms.admin.buttons.delete-policy')\n )\n : '',\n ]),\n ]\n );\n }\n\n fields() {\n const fields = new ItemList();\n\n fields.add(\n 'name',\n m('.Form-group', [\n m('label', app.translator.trans('fof-terms.admin.policies.name')),\n m('input.FormControl', {\n type: 'text',\n value: this.policy.name(),\n oninput: withAttr('value', this.updateAttribute.bind(this, 'name')),\n }),\n m('.helpText', app.translator.trans('fof-terms.admin.policies.name-help')),\n ]),\n 100\n );\n\n fields.add(\n 'url',\n m('.Form-group', [\n m('label', app.translator.trans('fof-terms.admin.policies.url')),\n m('input.FormControl', {\n type: 'url',\n value: this.policy.url(),\n oninput: withAttr('value', this.updateAttribute.bind(this, 'url')),\n }),\n m('.helpText', app.translator.trans('fof-terms.admin.policies.url-help')),\n ]),\n 95\n );\n\n fields.add(\n 'update-message',\n m('.Form-group', [\n m('label', app.translator.trans('fof-terms.admin.policies.update-message')),\n m('textarea.FormControl', {\n value: this.policy.update_message(),\n oninput: withAttr('value', this.updateAttribute.bind(this, 'update_message')),\n }),\n m('.helpText', app.translator.trans('fof-terms.admin.policies.update-message-help')),\n ]),\n 90\n );\n\n fields.add(\n 'terms-updated-at',\n m('.Form-group', [\n m('label', app.translator.trans('fof-terms.admin.policies.terms-updated-at')),\n m('.FoF-Terms-Input-Group', [\n m('input.FormControl', {\n type: 'text',\n value: this.policy.terms_updated_at(),\n oninput: withAttr('value', this.updateAttribute.bind(this, 'terms_updated_at')),\n placeholder: app.translator.trans('fof-terms.admin.policies.terms-updated-at-placeholder'),\n }),\n Button.component(\n {\n className: 'Button Button--primary',\n onclick: () => {\n // We set the milliseconds to zero because it might otherwise give the impression\n // that we store them, when in fact the date will be stored in a MySQL TIMESTAMP column\n this.updateAttribute('terms_updated_at', dayjs().millisecond(0).toISOString());\n },\n },\n app.translator.trans('fof-terms.admin.buttons.set-to-now')\n ),\n ]),\n m('.helpText', app.translator.trans('fof-terms.admin.policies.terms-updated-at-help')),\n ]),\n 85\n );\n\n if (this.policy.exists) {\n fields.add(\n 'export-url',\n m('.Form-group', [\n m('label', app.translator.trans('fof-terms.admin.policies.export-url')),\n m(\n '.ButtonGroup',\n ['json', 'csv'].map((format) =>\n m(\n 'a.Button.FoF-Terms-Export-Button',\n {\n href: app.forum.attribute('apiUrl') + '/fof/terms/policies/' + this.policy.id() + '/export.' + format,\n target: '_blank',\n },\n format.toUpperCase()\n )\n )\n ),\n m(\n '.helpText',\n app.translator.trans('fof-terms.admin.policies.export-url-help', {\n a: m('a', {\n href: 'https://github.com/FriendsOfFlarum/terms/wiki/Export-url',\n target: '_blank',\n }),\n })\n ),\n ]),\n 80\n );\n }\n\n return fields;\n }\n\n updateAttribute(attribute, value) {\n this.policy.pushAttributes({\n [attribute]: value,\n });\n\n this.dirty = true;\n }\n\n readyToSave() {\n return this.dirty;\n }\n\n savePolicy(event) {\n event.preventDefault();\n\n this.processing = true;\n\n const createNewRecord = !this.policy.exists;\n\n this.policy\n .save(this.policy.data.attributes)\n .then(() => {\n if (createNewRecord) {\n this.initNewField();\n this.toggleFields = false;\n }\n\n this.processing = false;\n this.dirty = false;\n\n m.redraw();\n })\n .catch((err) => {\n this.processing = false;\n\n throw err;\n });\n }\n\n deletePolicy() {\n if (\n !confirm(\n extractText(\n app.translator.trans('fof-terms.admin.messages.delete-policy-confirmation', {\n name: this.policy.name(),\n })\n )\n )\n ) {\n return;\n }\n\n this.processing = true;\n\n this.policy\n .delete()\n .then(() => {\n this.processing = false;\n\n m.redraw();\n })\n .catch((err) => {\n this.processing = false;\n\n throw err;\n });\n }\n}\n","export default function (items, attr = 'sort') {\n return items.sort((a, b) => a[attr]() - b[attr]());\n}\n","import sortable from 'html5sortable/dist/html5sortable.es.js';\n\nimport app from 'flarum/admin/app';\nimport PolicyEdit from './PolicyEdit';\nimport sortByAttribute from '../../common/helpers/sortByAttribute';\n\n/* global m */\n\nexport default class PolicyList {\n oninit() {\n app\n .request({\n method: 'GET',\n url: app.forum.attribute('apiUrl') + '/fof/terms/policies',\n })\n .then((result) => {\n app.store.pushPayload(result);\n\n m.redraw();\n });\n }\n\n oncreate(vnode) {\n this.initsortable(vnode);\n }\n\n onupdate(vnode) {\n // We could do this without re-creating the sortable on every redraw, but the current system works well\n // \"If it ain't broken, don't fix it\"\n this.initsortable(vnode);\n }\n\n initsortable(vnode) {\n sortable(vnode.dom.querySelector('.js-policies-container'), {\n handle: '.js-policy-handle',\n })[0].addEventListener('sortupdate', () => {\n const sorting = [].map.call(vnode.dom.querySelectorAll('.js-policy-data'), (element) => element.dataset.id);\n\n this.updateSort(sorting);\n });\n }\n\n view() {\n const policies = app.store.all('fof-terms-policies');\n\n let fieldsList = [];\n\n sortByAttribute(policies).forEach((policy) => {\n // Build array of fields to show.\n fieldsList.push(\n m(\n '.js-policy-data',\n {\n key: policy.id(),\n 'data-id': policy.id(),\n },\n m(PolicyEdit, {\n policy,\n })\n )\n );\n });\n\n return m('div', [\n m('h2', app.translator.trans('fof-terms.admin.titles.policies')),\n m('.FoF-Terms-Policies-Container', [\n m('.js-policies-container', fieldsList),\n m(PolicyEdit, {\n policy: null,\n }),\n ]),\n ]);\n }\n\n updateSort(sorting) {\n app\n .request({\n method: 'POST',\n url: app.forum.attribute('apiUrl') + '/fof/terms/policies/order',\n body: {\n sort: sorting,\n },\n })\n .then((result) => {\n // Update sort attributes\n app.store.pushPayload(result);\n\n m.redraw();\n });\n }\n}\n","import app from 'flarum/admin/app';\nimport ExtensionPage from 'flarum/admin/components/ExtensionPage';\nimport Switch from 'flarum/common/components/Switch';\nimport PolicyList from './PolicyList';\n\nconst settingsPrefix = 'fof-terms.';\nconst translationPrefix = 'fof-terms.admin.settings.';\n\n/* global m */\n\nexport default class TermsSettingsPage extends ExtensionPage {\n content() {\n return m('.ExtensionPage-settings', [\n m('.container', [\n m('.Form-group', [\n m('label', app.translator.trans(translationPrefix + 'field.signup-legal-text')),\n m('textarea.FormControl', {\n bidi: this.setting(settingsPrefix + 'signup-legal-text'),\n }),\n ]),\n m('.Form-group', [\n m(\n 'label',\n Switch.component(\n {\n state: this.setting(settingsPrefix + 'hide-updated-at')() > 0,\n onchange: this.setting(settingsPrefix + 'hide-updated-at'),\n },\n app.translator.trans(translationPrefix + 'field.hide-updated-at')\n )\n ),\n ]),\n m('.Form-group', [\n m('label', app.translator.trans(translationPrefix + 'field.date-format')),\n m('input[type=text].FormControl', {\n bidi: this.setting(settingsPrefix + 'date-format'),\n placeholder: 'YYYY-MM-DD',\n }),\n m(\n '.helpText',\n app.translator.trans(translationPrefix + 'field.date-format-help', {\n a: m('a', {\n href: 'https://day.js.org/docs/en/display/format',\n target: '_blank',\n }),\n })\n ),\n ]),\n this.submitButton(),\n m(PolicyList),\n ]),\n ]);\n }\n}\n","import PolicyEdit from './PolicyEdit';\nimport PolicyList from './PolicyList';\nimport TermsSettingsPage from './TermsSettingsPage';\n\nexport const components = {\n PolicyEdit,\n PolicyList,\n TermsSettingsPage,\n};\n","import Policy from './Policy';\n\nexport const models = {\n Policy,\n};\n","import sortByAttribute from './sortByAttribute';\n\nexport const helpers = {\n sortByAttribute,\n};\n","import app from 'flarum/admin/app';\nimport Policy from '../common/models/Policy';\nimport TermsSettingsPage from './components/TermsSettingsPage';\n\nexport * from './components';\nexport * from '../common/models';\nexport * from '../common/helpers';\n\napp.initializers.add('fof-terms', () => {\n app.store.models['fof-terms-policies'] = Policy;\n\n app.extensionData\n .for('fof-terms')\n .registerPermission(\n {\n icon: 'fas fa-paperclip',\n label: app.translator.trans('fof-terms.admin.permissions.see-user-policies-state'),\n permission: 'fof-terms.see-user-policies-state',\n },\n 'moderate'\n )\n .registerPermission(\n {\n icon: 'fas fa-paperclip',\n label: app.translator.trans('fof-terms.admin.permissions.postpone-policies-accept'),\n permission: 'fof-terms.postpone-policies-accept',\n },\n 'moderate'\n )\n .registerPermission(\n {\n icon: 'fas fa-paperclip',\n label: app.translator.trans('fof-terms.admin.permissions.export-policies'),\n permission: 'fof-terms.export-policies',\n },\n 'moderate'\n )\n .registerPage(TermsSettingsPage);\n});\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","flarum","core","compat","_setPrototypeOf","p","setPrototypeOf","__proto__","_inheritsLoose","subClass","superClass","create","constructor","Policy","_Model","_this","_len","arguments","length","args","Array","_key","apply","concat","sort","Model","name","url","update_message","terms_updated_at","form_key","computed","id","apiEndpoint","this","exists","data","addData","element","undefined","h5s","_filter","nodes","selector","NodeList","HTMLCollection","Error","from","filter","item","nodeType","matches","stores","Map","Store","_config","_placeholder","_data","config","forEach","set","mergedConfig","assign","entries","configurable","setConfig","has","getConfig","placeholder","HTMLElement","setData","getData","deleteData","store","sortableElement","addEventListener","eventName","callback","i","removeEventListener","addAttribute","attribute","setAttribute","removeAttribute","dragging","draggingHeight","draggingWidth","originContainer","originIndex","originElementIndex","originItemsBeforeUpdate","previousContainer","destinationItemsBeforeUpdate","_offset","parentElement","getClientRects","rect","left","window","pageXOffset","right","top","pageYOffset","bottom","_index","elementList","indexOf","isInDom","parentNode","insertNode","referenceNode","newElement","position","insertBefore","nextElementSibling","insertAfter","target","_getElementHeight","style","getComputedStyle","getPropertyValue","parseInt","map","int","isNaN","reduce","sum","_getElementWidth","_getHandles","items","querySelector","shadowRoot","getEventTarget","event","composedPath","defaultDragImage","draggedElement","elementOffset","posX","pageX","posY","pageY","_listsConnected","destination","origin","isSortable","acceptFrom","split","sel","defaultConfiguration","connectWith","disableIEFix","copy","placeholderClass","draggingClass","hoverClass","dropTargetContainerClass","debounce","throttleTime","maxItems","itemSerializer","containerSerializer","customDragImage","orientation","_removeItemEvents","_removeContainerEvents","_removeSortableData","sortable","_removeItemData","findSortable","find","el","findDragElement","options","itemlist","children","ele","contains","_enableSortable","opts","handles","handle","document","createElement","dragDrop","parent","sortableElements","method","String","querySelectorAll","slice","test","sortableContainer","customItemSerializer","customContainerSerializer","serializedItem","serializedContainer","serializedItems","node","html","outerHTML","index","container","itemCount","_serialize","configKey","console","warn","_reloadSortable","customPlaceholder","listItems","tempContainer","tagName","appendChild","innerHTML","_a","includes","classList","add","_makePlaceholder","enable","hoverClasses_1","fn","threshold","lastEventTimestamp","_i","now","Date","_throttle","buttons","_b","remove","enableHoverClass","e","stopImmediatePropagation","getAttribute","dragItem","Event","dataTransfer","setDragImage","dragImage","effectAllowed","draggedItem","ditem","cloneNode","display","oldDisplay","_getDragging","dispatchEvent","CustomEvent","detail","elementIndex","originalTarget","itemsBeforeUpdate","outTarget","relatedTarget","fromElement","currentTarget","visiblePlaceholder","values","preventDefault","stopPropagation","originItems","destinationContainer","destinationItems","destinationElementIndex","destinationIndex","func","wait","timeout","debouncedDragOverEnter","forcePlaceholderSize","height","width","thisHeight","thisWidth","placeholderIndex","thisIndex","deadZoneVertical","deadZoneHorizontal","offsetTop","offsetLeft","placeAfter","elementMiddleVertical","offsetHeight","elementMiddleHorizontal","offsetWidth","placeholders","clearTimeout","setTimeout","onDragOverEnter","dropEffect","destroy","_destroySortable","disable","_disableSortable","__testing","PolicyEdit","_proto","oninit","vnode","policy","attrs","dirty","processing","toggleFields","initNewField","app","attributes","boxTitle","view","m","onclick","icon","viewFields","onsubmit","savePolicy","bind","fields","toArray","Button","type","className","loading","disabled","readyToSave","deletePolicy","_this2","ItemList","oninput","withAttr","updateAttribute","dayjs","millisecond","toISOString","format","href","toUpperCase","_this$policy$pushAttr","pushAttributes","_this3","createNewRecord","save","then","redraw","err","_this4","confirm","extractText","attr","b","PolicyList","result","oncreate","initsortable","onupdate","dom","sorting","dataset","updateSort","policies","fieldsList","sortByAttribute","push","body","translationPrefix","TermsSettingsPage","_ExtensionPage","content","bidi","setting","settingsPrefix","Switch","state","onchange","submitButton","ExtensionPage","components","models","helpers","registerPermission","label","permission","registerPage"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"admin.js","mappings":"MACA,IAAIA,EAAsB,CCA1BA,EAAyBC,IACxB,IAAIC,EAASD,GAAUA,EAAOE,WAC7B,IAAOF,EAAiB,QACxB,IAAM,EAEP,OADAD,EAAoBI,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,CAAM,ECLdF,EAAwB,CAACM,EAASC,KACjC,IAAI,IAAIC,KAAOD,EACXP,EAAoBS,EAAEF,EAAYC,KAASR,EAAoBS,EAAEH,EAASE,IAC5EE,OAAOC,eAAeL,EAASE,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,IAE1E,ECNDR,EAAwB,CAACc,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,GCClFf,EAAyBM,IACH,oBAAXa,QAA0BA,OAAOC,aAC1CV,OAAOC,eAAeL,EAASa,OAAOC,YAAa,CAAEC,MAAO,WAE7DX,OAAOC,eAAeL,EAAS,aAAc,CAAEe,OAAO,GAAO,G,uFCL9D,MAAM,EAA+BC,OAAOC,KAAKC,OAAO,a,aCAzC,SAASC,EAAgBhB,EAAGiB,GAKzC,OAJAD,EAAkBf,OAAOiB,eAAiBjB,OAAOiB,eAAeC,OAAS,SAAyBnB,EAAGiB,GAEnG,OADAjB,EAAEoB,UAAYH,EACPjB,CACT,EACOgB,EAAgBhB,EAAGiB,EAC5B,CCLe,SAASI,EAAeC,EAAUC,GAC/CD,EAASf,UAAYN,OAAOuB,OAAOD,EAAWhB,WAC9Ce,EAASf,UAAUkB,YAAcH,EACjCJ,EAAeI,EAAUC,EAC3B,CCLA,MAAM,EAA+BV,OAAOC,KAAKC,OAAO,gB,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,yB,aCGnCW,EAAM,SAAAC,GAAA,SAAAD,IAAA,QAAAE,EAAAC,EAAAC,UAAAC,OAAAC,EAAA,IAAAC,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAAF,EAAAE,GAAAJ,UAAAI,GAMkC,OANlCN,EAAAD,EAAAlB,KAAA0B,MAAAR,EAAA,OAAAS,OAAAJ,KAAA,MACzBK,KAAOC,IAAAA,UAAgB,QAAOV,EAC9BW,KAAOD,IAAAA,UAAgB,QAAOV,EAC9BY,IAAMF,IAAAA,UAAgB,OAAMV,EAC5Ba,eAAiBH,IAAAA,UAAgB,kBAAiBV,EAClDc,iBAAmBJ,IAAAA,UAAgB,oBAAmBV,EACtDe,SAAWC,IAAS,MAAM,SAACC,GAAE,MAAK,oBAAsBA,CAAE,IAACjB,CAAA,CAI1D,OAJ0DP,EAAAK,EAAAC,GAAAD,EAAAnB,UAE3DuC,YAAA,WACE,MAAO,uBAAyBC,KAAKC,OAAS,IAAMD,KAAKE,KAAKJ,GAAK,GACrE,EAACnB,CAAA,CAVwB,CAASY,KCHpC,MAAM,EAA+BzB,OAAOC,KAAKC,OAAO,kC,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,4B,aCexD,SAASmC,EAAQC,EAASpD,EAAKa,GAC3B,QAAcwC,IAAVxC,EACA,OAAOuC,GAAWA,EAAQE,KAAOF,EAAQE,IAAIJ,MAAQE,EAAQE,IAAIJ,KAAKlD,GAGtEoD,EAAQE,IAAMF,EAAQE,KAAO,CAAC,EAC9BF,EAAQE,IAAIJ,KAAOE,EAAQE,IAAIJ,MAAQ,CAAC,EACxCE,EAAQE,IAAIJ,KAAKlD,GAAOa,CAEhC,CAkBA,IAAI0C,EAAW,SAAUC,EAAOC,GAC5B,KAAMD,aAAiBE,UAAYF,aAAiBG,gBAAkBH,aAAiBtB,OACnF,MAAM,IAAI0B,MAAM,gFAEpB,MAAwB,iBAAbH,EACAvB,MAAM2B,KAAKL,GAEftB,MAAM2B,KAAKL,GAAOM,QAAO,SAAUC,GAAQ,OAAyB,IAAlBA,EAAKC,UAAkBD,EAAKE,QAAQR,EAAW,GAC5G,EAGIS,EAAS,IAAIC,IAKbC,EAAuB,WACvB,SAASA,IACLpB,KAAKqB,QAAU,IAAIF,IACnBnB,KAAKsB,kBAAejB,EACpBL,KAAKuB,MAAQ,IAAIJ,GACrB,CAwHA,OAvHAjE,OAAOC,eAAeiE,EAAM5D,UAAW,SAAU,CAM7CH,IAAK,WAED,IAAImE,EAAS,CAAC,EAKd,OAJAxB,KAAKqB,QAAQI,SAAQ,SAAU5D,EAAOb,GAClCwE,EAAOxE,GAAOa,CAClB,IAEO2D,CACX,EAMAE,IAAK,SAAUF,GACX,GAAsB,iBAAXA,EACP,MAAM,IAAIZ,MAAM,uEAGpB,IAAIe,EAAezE,OAAO0E,OAAO,CAAC,EAAGJ,GAErCxB,KAAKqB,QAAU,IAAIF,IAAIjE,OAAO2E,QAAQF,GAC1C,EACAvE,YAAY,EACZ0E,cAAc,IASlBV,EAAM5D,UAAUuE,UAAY,SAAU/E,EAAKa,GACvC,IAAKmC,KAAKqB,QAAQW,IAAIhF,GAClB,MAAM,IAAI4D,MAAM,6CAA+C5D,GAGnEgD,KAAKqB,QAAQK,IAAI1E,EAAKa,EAC1B,EAOAuD,EAAM5D,UAAUyE,UAAY,SAAUjF,GAClC,IAAKgD,KAAKqB,QAAQW,IAAIhF,GAClB,MAAM,IAAI4D,MAAM,yCAA2C5D,GAE/D,OAAOgD,KAAKqB,QAAQhE,IAAIL,EAC5B,EACAE,OAAOC,eAAeiE,EAAM5D,UAAW,cAAe,CAMlDH,IAAK,WACD,OAAO2C,KAAKsB,YAChB,EAOAI,IAAK,SAAUQ,GACX,KAAMA,aAAuBC,cAAgC,OAAhBD,EACzC,MAAM,IAAItB,MAAM,kDAEpBZ,KAAKsB,aAAeY,CACxB,EACA9E,YAAY,EACZ0E,cAAc,IASlBV,EAAM5D,UAAU4E,QAAU,SAAUpF,EAAKa,GACrC,GAAmB,iBAARb,EACP,MAAM,IAAI4D,MAAM,6BAEpBZ,KAAKuB,MAAMG,IAAI1E,EAAKa,EACxB,EAOAuD,EAAM5D,UAAU6E,QAAU,SAAUrF,GAChC,GAAmB,iBAARA,EACP,MAAM,IAAI4D,MAAM,6BAEpB,OAAOZ,KAAKuB,MAAMlE,IAAIL,EAC1B,EAOAoE,EAAM5D,UAAU8E,WAAa,SAAUtF,GACnC,GAAmB,iBAARA,EACP,MAAM,IAAI4D,MAAM,6BAEpB,OAAOZ,KAAKuB,MAAK,OAAQvE,EAC7B,EACOoE,CACX,CA9H2B,GAmIvBmB,EAAS,SAAUC,GAEnB,KAAMA,aAA2BL,aAC7B,MAAM,IAAIvB,MAAM,oDAOpB,OAJKM,EAAOc,IAAIQ,IACZtB,EAAOQ,IAAIc,EAAiB,IAAIpB,GAG7BF,EAAO7D,IAAImF,EACtB,EAOA,SAASC,EAAiBrC,EAASsC,EAAWC,GAC1C,GAAIvC,aAAmBlB,MACnB,IAAK,IAAI0D,EAAI,EAAGA,EAAIxC,EAAQpB,SAAU4D,EAClCH,EAAiBrC,EAAQwC,GAAIF,EAAWC,QAIhDvC,EAAQqC,iBAAiBC,EAAWC,GACpCJ,EAAMnC,GAASgC,QAAQ,QAAUM,EAAWC,EAChD,CAKA,SAASE,EAAoBzC,EAASsC,GAClC,GAAItC,aAAmBlB,MACnB,IAAK,IAAI0D,EAAI,EAAGA,EAAIxC,EAAQpB,SAAU4D,EAClCC,EAAoBzC,EAAQwC,GAAIF,QAIxCtC,EAAQyC,oBAAoBH,EAAWH,EAAMnC,GAASiC,QAAQ,QAAUK,IACxEH,EAAMnC,GAASkC,WAAW,QAAUI,EACxC,CAOA,SAASI,EAAa1C,EAAS2C,EAAWlF,GACtC,GAAIuC,aAAmBlB,MACnB,IAAK,IAAI0D,EAAI,EAAGA,EAAIxC,EAAQpB,SAAU4D,EAClCE,EAAa1C,EAAQwC,GAAIG,EAAWlF,QAI5CuC,EAAQ4C,aAAaD,EAAWlF,EACpC,CAKA,SAASoF,EAAgB7C,EAAS2C,GAC9B,GAAI3C,aAAmBlB,MACnB,IAAK,IAAI0D,EAAI,EAAGA,EAAIxC,EAAQpB,SAAU4D,EAClCK,EAAgB7C,EAAQwC,GAAIG,QAIpC3C,EAAQ6C,gBAAgBF,EAC5B,CAMA,IA6aIG,EACAC,EACAC,EAMAC,EACAC,EACAC,EACAC,EAGAC,EAEAC,EA7bAC,EAAW,SAAUvD,GACrB,IAAKA,EAAQwD,eAAqD,IAApCxD,EAAQyD,iBAAiB7E,OACnD,MAAM,IAAI4B,MAAM,0CAEpB,IAAIkD,EAAO1D,EAAQyD,iBAAiB,GACpC,MAAO,CACHE,KAAMD,EAAKC,KAAOC,OAAOC,YACzBC,MAAOJ,EAAKI,MAAQF,OAAOC,YAC3BE,IAAKL,EAAKK,IAAMH,OAAOI,YACvBC,OAAQP,EAAKO,OAASL,OAAOI,YAErC,EA6BIE,EAAU,SAAUlE,EAASmE,GAC7B,KAAMnE,aAAmB+B,cAAkBoC,aAAuB7D,UAAY6D,aAAuB5D,gBAAkB4D,aAAuBrF,QAC1I,MAAM,IAAI0B,MAAM,uDAEpB,OAAO1B,MAAM2B,KAAK0D,GAAaC,QAAQpE,EAC3C,EAQIqE,EAAW,SAAUrE,GACrB,KAAMA,aAAmB+B,aACrB,MAAM,IAAIvB,MAAM,kCAEpB,OAA8B,OAAvBR,EAAQsE,UACnB,EASIC,EAAa,SAAUC,EAAeC,EAAYC,GAClD,KAAMF,aAAyBzC,aAAkByC,EAAchB,yBAAyBzB,aACpF,MAAM,IAAIvB,MAAM,qCAEpBgE,EAAchB,cAAcmB,aAAaF,EAA0B,WAAbC,EAAwBF,EAAgBA,EAAcI,mBAChH,EAYIC,EAAc,SAAUC,EAAQ9E,GAAW,OAAOuE,EAAWO,EAAQ9E,EAAS,QAAU,EAuFxF+E,EAAqB,SAAU/E,GAC/B,KAAMA,aAAmB+B,aACrB,MAAM,IAAIvB,MAAM,wCAGpB,IAAIwE,EAAQpB,OAAOqB,iBAAiBjF,GAEpC,MAA6C,eAAzCgF,EAAME,iBAAiB,cAChBC,SAASH,EAAME,iBAAiB,UAAW,IAG/C,CAAC,SAAU,cAAe,kBAC5BE,KAAI,SAAUxI,GACf,IAAIyI,EAAMF,SAASH,EAAME,iBAAiBtI,GAAM,IAChD,OAAO0I,MAAMD,GAAO,EAAIA,CAC5B,IACKE,QAAO,SAAUC,EAAK/H,GAAS,OAAO+H,EAAM/H,CAAO,GAC5D,EAOIgI,EAAoB,SAAUzF,GAC9B,KAAMA,aAAmB+B,aACrB,MAAM,IAAIvB,MAAM,wCAGpB,IAAIwE,EAAQpB,OAAOqB,iBAAiBjF,GAEpC,MAAO,CAAC,QAAS,eAAgB,iBAC5BoF,KAAI,SAAUxI,GACf,IAAIyI,EAAMF,SAASH,EAAME,iBAAiBtI,GAAM,IAChD,OAAO0I,MAAMD,GAAO,EAAIA,CAC5B,IACKE,QAAO,SAAUC,EAAK/H,GAAS,OAAO+H,EAAM/H,CAAO,GAC5D,EAQIiI,EAAe,SAAUC,EAAOtF,GAChC,KAAMsF,aAAiB7G,OACnB,MAAM,IAAI0B,MAAM,4DAEpB,MAAwB,iBAAbH,EACAsF,EAEJA,EAEFjF,QAAO,SAAUC,GAClB,OAAOA,EAAKiF,cAAcvF,aAAqB0B,aAC1CpB,EAAKkF,YAAclF,EAAKkF,WAAWD,cAAcvF,aAAqB0B,WAC/E,IAEKqD,KAAI,SAAUzE,GACf,OAAOA,EAAKiF,cAAcvF,IAAcM,EAAKkF,YAAclF,EAAKkF,WAAWD,cAAcvF,EAC7F,GACJ,EAMIyF,EAAkB,SAAUC,GAC5B,OAAQA,EAAMC,cAAgBD,EAAMC,eAAe,IAAOD,EAAMjB,MACpE,EAUImB,EAAmB,SAAUC,EAAgBC,EAAeJ,GAC5D,MAAO,CACH/F,QAASkG,EACTE,KAAML,EAAMM,MAAQF,EAAcxC,KAClC2C,KAAMP,EAAMQ,MAAQJ,EAAcpC,IAE1C,EA6CIyC,EAAmB,SAAUC,EAAaC,GAE1C,IAA+B,IAA3BD,EAAYE,WAAqB,CACjC,IAAIC,EAAazE,EAAMsE,GAAa5E,UAAU,cAE9C,GAAmB,OAAf+E,IAAsC,IAAfA,GAA8C,iBAAfA,EACtD,MAAM,IAAIpG,MAAM,oGAEpB,GAAmB,OAAfoG,EACA,OAAsB,IAAfA,GAAwBA,EAAWC,MAAM,KAAKnG,QAAO,SAAUoG,GAClE,OAAOA,EAAIlI,OAAS,GAAK8H,EAAO7F,QAAQiG,EAC5C,IAAGlI,OAAS,EAGhB,GAAI6H,IAAgBC,EAChB,OAAO,EAGX,QAAoDzG,IAAhDkC,EAAMsE,GAAa5E,UAAU,gBAAgF,OAAhDM,EAAMsE,GAAa5E,UAAU,eAC1F,OAAOM,EAAMsE,GAAa5E,UAAU,iBAAmBM,EAAMuE,GAAQ7E,UAAU,cAEvF,CACA,OAAO,CACX,EAKIkF,EAAuB,CACvBpB,MAAO,KAEPqB,YAAa,KAEbC,aAAc,KACdL,WAAY,KACZM,MAAM,EACNpF,YAAa,KACbqF,iBAAkB,uBAClBC,cAAe,oBACfC,YAAY,EACZC,0BAA0B,EAC1BC,SAAU,EACVC,aAAc,IACdC,SAAU,EACVC,oBAAgBzH,EAChB0H,yBAAqB1H,EACrB2H,gBAAiB,KACjBC,YAAa,YAqGbC,EAAoB,SAAUnC,GAC9BlD,EAAoBkD,EAAO,aAC3BlD,EAAoBkD,EAAO,WAC3BlD,EAAoBkD,EAAO,YAC3BlD,EAAoBkD,EAAO,aAC3BlD,EAAoBkD,EAAO,QAC3BlD,EAAoBkD,EAAO,cAC3BlD,EAAoBkD,EAAO,aAC/B,EAEIoC,EAAyB,SAAU9E,EAAiBI,GAChDJ,GACAR,EAAoBQ,EAAiB,aAErCI,GAAsBA,IAAsBJ,GAC5CR,EAAoBY,EAAmB,YAE/C,EAuBI2E,EAAsB,SAAUC,GArtBpC,IAAoBjI,KAstBLiI,GArtBC/H,YACDF,EAAQE,IAAIJ,KAqtBvB+C,EAAgBoF,EAAU,kBAC9B,EAKIC,EAAkB,SAAUvC,GAC5B9C,EAAgB8C,EAAO,gBACvB9C,EAAgB8C,EAAO,eACvB9C,EAAgB8C,EAAO,aACvB9C,EAAgB8C,EAAO,OAC3B,EAOA,SAASwC,EAAanI,EAAS+F,GAC3B,GAAIA,EAAMC,aACN,OAAOD,EAAMC,eAAeoC,MAAK,SAAUC,GAAM,OAAOA,EAAG1B,UAAY,IAE3E,MAA8B,IAAvB3G,EAAQ2G,YACX3G,EAAUA,EAAQwD,cAEtB,OAAOxD,CACX,CAOA,SAASsI,EAAgBlG,EAAiBpC,GACtC,IAAIuI,EAAUxI,EAAQqC,EAAiB,QAEnCoG,EADQrI,EAAQiC,EAAgBqG,SAAUF,EAAQ5C,OACjCjF,QAAO,SAAUgI,GAClC,OAAOA,EAAIC,SAAS3I,IAAa0I,EAAI7C,YAAc6C,EAAI7C,WAAW8C,SAAS3I,EAC/E,IACA,OAAOwI,EAAS5J,OAAS,EAAI4J,EAAS,GAAKxI,CAC/C,CAKA,IAwBI4I,EAAkB,SAAUxG,GAC5B,IAAIyG,EAAO9I,EAAQqC,EAAiB,QAChCuD,EAAQxF,EAAQiC,EAAgBqG,SAAUI,EAAKlD,OAC/CmD,EAAUpD,EAAYC,EAAOkD,EAAKE,QACtCrG,EAAaN,EAAiB,kBAAmB,QACjDrC,EAAQqC,EAAiB,YAAa,SACtCM,EAAaoG,EAAS,YAAa,SAKT,IAAtBD,EAAK5B,cAE0B,mBADjB+B,UAAYpF,OAAOoF,UAAUC,cAAc,QACvCC,UACd7G,EAAiByG,EAAS,aAAa,WACnC,IAA6B,IAAzBnD,EAAMvB,QAAQxE,MACdA,KAAKsJ,eAEJ,CAED,IADA,IAAIC,EAASvJ,KAAK4D,eACgB,IAA3BmC,EAAMvB,QAAQ+E,IACjBA,EAASA,EAAO3F,cAEpB2F,EAAOD,UACX,CACJ,GAGZ,EAsCA,SAASjB,EAASmB,EAAkBb,GAEhC,IAAIc,EAASC,OAAOf,GAWpB,OAVAA,EAAUA,GAAW,CAAC,EAEU,iBAArBa,IACPA,EAAmBJ,SAASO,iBAAiBH,IAG7CA,aAA4BrH,cAC5BqH,EAAmB,CAACA,IAExBA,EAAmBtK,MAAM1B,UAAUoM,MAAMlM,KAAK8L,GAC1C,YAAYK,KAAKJ,GACVD,EAAiBhE,KAAI,SAAUsE,GAClC,IAAIb,EAAO9I,EAAQ2J,EAAmB,QACtC,OAtiBM,SAAUA,EAAmBC,EAAsBC,GAIjE,QAH6B,IAAzBD,IAAmCA,EAAuB,SAAUE,EAAgBH,GAAqB,OAAOG,CAAgB,QAClG,IAA9BD,IAAwCA,EAA4B,SAAUE,GAAuB,OAAOA,CAAqB,KAE/HJ,aAA6B3H,cAAkD,IAAjC2H,EAAkB/C,WAClE,MAAM,IAAInG,MAAM,6DAGpB,GAAoC,mBAAzBmJ,GAA4E,mBAA9BC,EACrD,MAAM,IAAIpJ,MAAM,uEAGpB,IACIG,EADUZ,EAAQ2J,EAAmB,QACtB/D,MAEfA,EAAQxF,EAAQuJ,EAAkBjB,SAAU9H,GAC5CoJ,EAAkBpE,EAAMP,KAAI,SAAUzE,GACtC,MAAO,CACHwI,OAAQO,EACRM,KAAMrJ,EACNsJ,KAAMtJ,EAAKuJ,UACXC,MAAOjG,EAAOvD,EAAMgF,GAE5B,IAMA,MAAO,CACHyE,UAAWR,EALC,CACZI,KAAMN,EACNW,UAAWN,EAAgBnL,SAI3B+G,MAAOoE,EAAgB3E,KAAI,SAAUzE,GAAQ,OAAOgJ,EAAqBhJ,EAAM+I,EAAoB,IAE3G,CAqgBmBY,CAAWZ,EAAmBb,EAAKnB,eAAgBmB,EAAKlB,oBACnE,KAEJyB,EAAiB/H,SAAQ,SAAUe,GAC/B,GAAI,yBAAyBqH,KAAKJ,GAC9B,OAAOpB,EAASoB,GAAQjH,GAG5B,CAAC,cAAe,gBAAgBf,SAAQ,SAAUkJ,GAC1CzN,OAAOM,UAAUC,eAAeC,KAAKiL,EAASgC,IAAqC,OAAvBhC,EAAQgC,IACpEC,QAAQC,KAAK,8DAAiEF,EAAY,yGAElG,IAEAhC,EAAUzL,OAAO0E,OAAO,CAAC,EAAGuF,EAAsB5E,EAAMC,GAAiBhB,OAAQmH,GAEjFpG,EAAMC,GAAiBhB,OAASmH,EAEhCxI,EAAQqC,EAAiB,OAAQmG,GAEjCnG,EAAgBuE,YAAa,EAvDf,SAAUvE,GAC5B,IAAIyG,EAAO9I,EAAQqC,EAAiB,QAChCuD,EAAQxF,EAAQiC,EAAgBqG,SAAUI,EAAKlD,OAC/CmD,EAAUpD,EAAYC,EAAOkD,EAAKE,QACtChJ,EAAQqC,EAAiB,YAAa,SAEtC0F,EAAkBnC,GAClBoC,EAAuB9E,EAAiBI,GACxCZ,EAAoBqG,EAAS,aAE7BrG,EAAoBL,EAAiB,YACrCK,EAAoBL,EAAiB,aACrCK,EAAoBL,EAAiB,OACzC,CA4CQsI,CAAgBtI,GAEhB,IAEIuI,EAFAC,EAAYzK,EAAQiC,EAAgBqG,SAAUF,EAAQ5C,OAG1D,GAA4B,OAAxB4C,EAAQzG,kBAAgD7B,IAAxBsI,EAAQzG,YAA2B,CACnE,IAAI+I,EAAgB7B,SAASC,cAAc7G,EAAgB0I,SACvDvC,EAAQzG,uBAAuBC,YAC/B8I,EAAcE,YAAYxC,EAAQzG,aAGlC+I,EAAcG,UAAYzC,EAAQzG,YAEtC6I,EAAoBE,EAAcpC,SAAS,EAC/C,CAEAtG,EAAMC,GAAiBN,YAliBP,SAAUM,EAAiBN,EAAaqF,GAC5D,IAAI8D,EAEJ,QADyB,IAArB9D,IAA+BA,EAAmB,0BAChD/E,aAA2BL,aAC7B,MAAM,IAAIvB,MAAM,mDAGpB,KAAMsB,aAAuBC,mBAAgC9B,IAAhB6B,EACzC,MAAM,IAAItB,MAAM,6EAoBpB,YAjBoBP,IAAhB6B,IACI,CAAC,KAAM,MAAMoJ,SAAS9I,EAAgB0I,SACtChJ,EAAckH,SAASC,cAAc,MAEhC,CAAC,QAAS,SAASiC,SAAS9I,EAAgB0I,UACjDhJ,EAAckH,SAASC,cAAc,OAEzB+B,UAAY,0BAGxBlJ,EAAckH,SAASC,cAAc,QAIb,iBAArB9B,IACN8D,EAAKnJ,EAAYqJ,WAAWC,IAAIpM,MAAMiM,EAAI9D,EAAiBN,MAAM,MAE/D/E,CACX,CAqgB6CuJ,CAAiBjJ,EAAiBuI,EAAmBpC,EAAQpB,kBAClGpH,EAAQqC,EAAiB,QAASmG,EAAQ5C,OACtC4C,EAAQ3B,WACR7G,EAAQqC,EAAiB,aAAcmG,EAAQ3B,YAE1C2B,EAAQvB,aACbjH,EAAQqC,EAAiB,cAAemG,EAAQvB,aAEpD4B,EAAgBxG,GAChBM,EAAakI,EAAW,OAAQ,UAChClI,EAAakI,EAAW,eAAgB,SA7SxB,SAAUlB,EAAmB4B,GACjD,GAAgE,iBAArDnJ,EAAMuH,GAAmB7H,UAAU,cAA4B,CACtE,IAAI0J,EAAiBpJ,EAAMuH,GAAmB7H,UAAU,cAAcgF,MAAM,MAE7D,IAAXyE,GACAjJ,EAAiBqH,EAAmB,YArChD,SAAoB8B,EAAIC,GACpB,IAAIhN,EAAQmB,KAOZ,QANkB,IAAd6L,IAAwBA,EAAY,KAMf,iBAAdA,EACP,MAAM,IAAIjL,MAAM,kEAEpB,IAAIkL,EAAqB,KACzB,OAAO,WAEH,IADA,IAAI7M,EAAO,GACF8M,EAAK,EAAGA,EAAKhN,UAAUC,OAAQ+M,IACpC9M,EAAK8M,GAAMhN,UAAUgN,GAEzB,IAAIC,EAAMC,KAAKD,OACY,OAAvBF,GAA+BE,EAAMF,GAAsBD,KAC3DC,EAAqBE,EACrBJ,EAAGxM,MAAMP,EAAOI,GAExB,CACJ,CAc6DiN,EAAU,SAAU/F,GAE3C,IAAlBA,EAAMgG,SACN5L,EAAQuJ,EAAkBjB,SAAUtG,EAAMuH,GAAmB7H,UAAU,UAAUR,SAAQ,SAAUV,GAC/F,IAAIsK,EAAIe,EACJrL,IAASoF,EAAMjB,QACdmG,EAAKtK,EAAKwK,WAAWc,OAAOjN,MAAMiM,EAAIM,IAGtCS,EAAKrL,EAAKwK,WAAWC,IAAIpM,MAAMgN,EAAIT,EAE5C,GAER,GAAGpJ,EAAMuH,GAAmB7H,UAAU,kBAEtCQ,EAAiBqH,EAAmB,cAAc,WAC9CvJ,EAAQuJ,EAAkBjB,SAAUtG,EAAMuH,GAAmB7H,UAAU,UAAUR,SAAQ,SAAUV,GAC/F,IAAIsK,GACHA,EAAKtK,EAAKwK,WAAWc,OAAOjN,MAAMiM,EAAIM,EAC3C,GACJ,MAIA9I,EAAoBiH,EAAmB,aACvCjH,EAAoBiH,EAAmB,cAE/C,CACJ,CA8QQwC,CAAiB9J,GAAiB,GAMlCC,EAAiBD,EAAiB,aAAa,SAAU+J,GAErD,IAAIrH,EAASgB,EAAeqG,GAC5B,IAA0B,IAAtBrH,EAAO6B,aAGXwF,EAAEC,6BACG7D,EAAQQ,QAAWjE,EAAOjE,QAAQ0H,EAAQQ,UAAiD,UAArCjE,EAAOuH,aAAa,cAA/E,CAGA,IAAI3C,EAAoBvB,EAAarD,EAAQqH,GACzCG,EAAWhE,EAAgBoB,EAAmB5E,GAElD1B,EAA0BjD,EAAQuJ,EAAkBjB,SAAUF,EAAQ5C,OACtEzC,EAAcE,EAAwBgB,QAAQkI,GAC9CnJ,EAAqBe,EAAOoI,EAAU5C,EAAkBjB,UACxDxF,EAAkByG,EAlcV,SAAU3D,EAAOG,EAAgB0B,GAEjD,KAAM7B,aAAiBwG,OACnB,MAAM,IAAI/L,MAAM,4DAGpB,KAAM0F,aAA0BnE,aAC5B,MAAM,IAAIvB,MAAM,qEAOpB,GAJKoH,IACDA,EAAkB3B,GAGlBF,EAAMyG,cAAgBzG,EAAMyG,aAAaC,aAAc,CAEvD,IAEIC,EAAY9E,EAAgB1B,EAFZ3C,EAAQ2C,GAEmCH,GAE/D,KAAM2G,EAAU1M,mBAAmB+B,cAA0C,iBAAnB2K,EAAUtG,MAA+C,iBAAnBsG,EAAUpG,KACtG,MAAM,IAAI9F,MAAM,uIAGpBuF,EAAMyG,aAAaG,cAAgB,WAEnC5G,EAAMyG,aAAaxK,QAAQ,aAAc8D,EAAeC,GAAOrG,IAE/DqG,EAAMyG,aAAaC,aAAaC,EAAU1M,QAAS0M,EAAUtG,KAAMsG,EAAUpG,KACjF,CACJ,CAsaYmG,CAAaN,EAAGG,EAAU/D,EAAQX,iBAElC7E,EAAiBgC,EAAkBuH,GACnCtJ,EAAgByC,EAAiB6G,GACjCA,EAASnB,UAAUC,IAAI7C,EAAQnB,eAC/BtE,EAvPO,SAAU8J,EAAa3E,GACtC,IAAI4E,EAAQD,EAQZ,OAP0C,IAAtCzK,EAAM8F,GAAUpG,UAAU,UAE1Ba,EADAmK,EAAQD,EAAYE,WAAU,GACV,cAAe,QACnCF,EAAYpJ,cAAcuH,YAAY8B,GACtCA,EAAM7H,MAAM+H,QAAU,OACtBF,EAAMG,WAAaJ,EAAY5H,MAAM+H,SAElCF,CACX,CA6OuBI,CAAaX,EAAU5C,GAClChH,EAAaI,EAAU,eAAgB,QAEvC4G,EAAkBwD,cAAc,IAAIC,YAAY,YAAa,CACzDC,OAAQ,CACJ1G,OAAQ,CACJ2G,aAAclK,EACdgH,MAAOjH,EACPkH,UAAWnH,GAEftC,KAAMmC,EACNwK,eAAgBxI,KAzBxB,CA4BJ,IAIAzC,EAAiBD,EAAiB,aAAa,SAAU+J,GACrD,IAAIrH,EAASgB,EAAeqG,GACxBzC,EAAoBvB,EAAarD,EAAQqH,GACzCzC,GAAqBA,IAAsBrG,IAC3CC,EAA+BnD,EAAQuJ,EAAkBjB,SAAU1I,EAAQ2J,EAAmB,UACzFhJ,QAAO,SAAUC,GAAQ,OAAOA,IAASwB,EAAMC,GAAiBN,WAAa,IAC9EyG,EAAQjB,0BACRoC,EAAkByB,UAAUC,IAAI7C,EAAQjB,0BAE5CoC,EAAkBwD,cAAc,IAAIC,YAAY,YAAa,CACzDC,OAAQ,CACJ1G,OAAQ,CACJ2G,aAAclK,EACdgH,MAAOjH,EACPkH,UAAWnH,GAEfwD,YAAa,CACT2D,UAAWV,EACX6D,kBAAmBjK,GAEvB3C,KAAMmC,EACNwK,eAAgBxI,MAGxBzC,EAAiBqH,EAAmB,aAAa,SAAUyC,GAGvD,IAAIqB,EAAYrB,EAAEsB,eAAiBtB,EAAEuB,YAChCvB,EAAEwB,cAAchF,SAAS6E,KACtBjF,EAAQjB,0BACRoC,EAAkByB,UAAUc,OAAO1D,EAAQjB,0BAE/CoC,EAAkBwD,cAAc,IAAIC,YAAY,YAAa,CACzDC,OAAQ,CACJ1G,OAAQ,CACJ2G,aAAclK,EACdgH,MAAOjH,EACPkH,UAAWV,GAEf/I,KAAMmC,EACNwK,eAAgBxI,MAIhC,KAEJzB,EAAoBqG,CACxB,IAMArH,EAAiBD,EAAiB,WAAW,SAAU+J,GACnD,GAAKrJ,EAAL,CAGAA,EAASqI,UAAUc,OAAO1D,EAAQnB,eAClC1E,EAAaI,EAAU,eAAgB,SACM,SAAzCA,EAASuJ,aAAa,gBAA8D,SAAjCtM,EAAQ+C,EAAU,YACrEA,EAASmJ,SAEbnJ,EAASkC,MAAM+H,QAAUjK,EAASkK,kBAC3BlK,EAASkK,WAChB,IAAIY,EAAqB9O,MAAM2B,KAAKK,EAAO+M,UAAUzI,KAAI,SAAUtF,GAAQ,OAAOA,EAAKgC,WAAa,IAC/FpB,QAAO,SAAUoB,GAAe,OAAOA,aAAuBC,WAAa,IAC3ErB,OAAO2D,GAAS,GACjBuJ,GACAA,EAAmB3B,SAGvB7J,EAAgB8K,cAAc,IAAIC,YAAY,WAAY,CACtDC,OAAQ,CACJ1G,OAAQ,CACJ2G,aAAclK,EACdgH,MAAOjH,EACPkH,UAAWnH,GAEftC,KAAMmC,MAGdO,EAAoB,KACpBP,EAAW,KACXC,EAAiB,KACjBC,EAAgB,IA5BhB,CA6BJ,IAKAX,EAAiBD,EAAiB,QAAQ,SAAU+J,GAChD,GAAK3F,EAAgBpE,EAAiBU,EAASU,eAA/C,CAGA2I,EAAE2B,iBACF3B,EAAE4B,kBACFhO,EAAQ+C,EAAU,UAAW,QAE7B,IAAI8K,EAAqB9O,MAAM2B,KAAKK,EAAO+M,UAAUzI,KAAI,SAAUtF,GAC/D,OAAOA,EAAKgC,WAChB,IAEKpB,QAAO,SAAUoB,GAAe,OAAOA,aAAuBC,WAAa,IAE3ErB,OAAO2D,GAAS,GAErBQ,EAAY+I,EAAoB9K,GAEhC8K,EAAmB3B,SAInB7J,EAAgB8K,cAAc,IAAIC,YAAY,WAAY,CACtDC,OAAQ,CACJ1G,OAAQ,CACJ2G,aAAclK,EACdgH,MAAOjH,EACPkH,UAAWnH,GAEftC,KAAMmC,MAGd,IAAIhB,EAAcK,EAAMC,GAAiBN,YACrCkM,EAAc7N,EAAQ8C,EAAgBwF,SAAUF,EAAQ5C,OACvDjF,QAAO,SAAUC,GAAQ,OAAOA,IAASmB,CAAa,IACvDmM,GAA2C,IAApBrO,KAAK+G,WAAsB/G,KAAOA,KAAK4D,cAC9D0K,EAAmB/N,EAAQ8N,EAAqBxF,SAAU1I,EAAQkO,EAAsB,UACvFvN,QAAO,SAAUC,GAAQ,OAAOA,IAASmB,CAAa,IACvDqM,EAA0BjK,EAAOpB,EAAUhE,MAAM2B,KAAKqC,EAASU,cAAciF,UAC5E/H,QAAO,SAAUC,GAAQ,OAAOA,IAASmB,CAAa,KACvDsM,EAAmBlK,EAAOpB,EAAUoL,GACpC3F,EAAQjB,0BACR2G,EAAqB9C,UAAUc,OAAO1D,EAAQjB,0BAM9CnE,IAAuBgL,GAA2BlL,IAAoBgL,GACtE7L,EAAgB8K,cAAc,IAAIC,YAAY,aAAc,CACxDC,OAAQ,CACJ1G,OAAQ,CACJ2G,aAAclK,EACdgH,MAAOjH,EACPkH,UAAWnH,EACXsK,kBAAmBnK,EACnBuC,MAAOqI,GAEXvH,YAAa,CACT0D,MAAOiE,EACPf,aAAcc,EACd/D,UAAW6D,EACXV,kBAAmBjK,EACnBqC,MAAOuI,GAEXvN,KAAMmC,KA9DlB,CAkEJ,IACA,IAj3BmBuL,EAAMC,EAEzBC,EA+2BIC,GAj3BeH,EAi3BoB,SAAUjM,EAAiBpC,EAASqG,EAAOE,GAC9E,GAAKzD,EAUL,GANIyF,EAAQkG,uBACRtM,EAAMC,GAAiBN,YAAYkD,MAAM0J,OAAS3L,EAAiB,KACnEZ,EAAMC,GAAiBN,YAAYkD,MAAM2J,MAAQ3L,EAAgB,MAIjElE,MAAM2B,KAAK2B,EAAgBqG,UAAUrE,QAAQpE,IAAY,EAAG,CAC5D,IAAI4O,EAAa7J,EAAkB/E,GAC/B6O,EAAYpJ,EAAiBzF,GAC7B8O,EAAmB5K,EAAO/B,EAAMC,GAAiBN,YAAa9B,EAAQwD,cAAciF,UACpFsG,EAAY7K,EAAOlE,EAASA,EAAQwD,cAAciF,UAEtD,GAAImG,EAAa7L,GAAkB8L,EAAY7L,EAAe,CAE1D,IAAIgM,EAAmBJ,EAAa7L,EAChCkM,EAAqBJ,EAAY7L,EACjCkM,EAAY3L,EAAQvD,GAAS+D,IAC7BoL,EAAa5L,EAAQvD,GAAS2D,KAClC,GAAImL,EAAmBC,IACO,aAAxBxG,EAAQV,aAA8BtB,EAAQ2I,GACnB,eAAxB3G,EAAQV,aAAgCxB,EAAQ8I,GACrD,OAEJ,GAAIL,EAAmBC,IACO,aAAxBxG,EAAQV,aAA8BtB,EAAQ2I,EAAYN,EAAaI,GAC5C,eAAxBzG,EAAQV,aAAgCxB,EAAQ8I,EAAaN,EAAYI,GAC9E,MAER,MAC4BhP,IAAxB6C,EAASkK,aACTlK,EAASkK,WAAalK,EAASkC,MAAM+H,SAEV,SAA3BjK,EAASkC,MAAM+H,UACfjK,EAASkC,MAAM+H,QAAU,QAK7B,IAAIqC,GAAa,EACjB,IACI,IAAIC,EAAwB9L,EAAQvD,GAAS+D,IAAM/D,EAAQsP,aAAe,EACtEC,EAA0BhM,EAAQvD,GAAS2D,KAAO3D,EAAQwP,YAAc,EAC5EJ,EAAsC,aAAxB7G,EAAQV,aAA+BtB,GAAS8I,GACjC,eAAxB9G,EAAQV,aAAiCxB,GAASkJ,CAC3D,CACA,MAAOpD,GACHiD,EAAaN,EAAmBC,CACpC,CACIK,EACAvK,EAAY7E,EAASmC,EAAMC,GAAiBN,aA52B7C,SAAUgD,EAAQ9E,GAAkBuE,EAAWO,EAAQ9E,EAAS,SAAW,CA+2B1E2E,CAAa3E,EAASmC,EAAMC,GAAiBN,aAGjDhD,MAAM2B,KAAKK,EAAO+M,UAEbnN,QAAO,SAAUZ,GAAQ,YAA4BG,IAArBH,EAAKgC,WAA2B,IAEhET,SAAQ,SAAUvB,GACfA,EAAKgC,cAAgBK,EAAMC,GAAiBN,aAC5ChC,EAAKgC,YAAYmK,QAEzB,GACJ,KACK,CAED,IAAIwD,EAAe3Q,MAAM2B,KAAKK,EAAO+M,UAChCnN,QAAO,SAAUZ,GAAQ,YAA4BG,IAArBH,EAAKgC,WAA2B,IAChEsD,KAAI,SAAUtF,GACf,OAAOA,EAAKgC,WAChB,KAEuC,IAAnC2N,EAAarL,QAAQpE,IAAmBoC,IAAoBpC,GAAYG,EAAQH,EAAQyI,SAAUF,EAAQ5C,OAAO/G,SACjH6Q,EAAapO,SAAQ,SAAUrB,GAAW,OAAOA,EAAQiM,QAAU,IACnEjM,EAAQ+K,YAAY5I,EAAMC,GAAiBN,aAEnD,CACJ,OAn8BS,KADgBwM,EAo8BtB/F,EAAQhB,YAn8BQ+G,EAAO,GAEvB,WAEH,IADA,IAAIzP,EAAO,GACF8M,EAAK,EAAGA,EAAKhN,UAAUC,OAAQ+M,IACpC9M,EAAK8M,GAAMhN,UAAUgN,GAEzB+D,aAAanB,GACbA,EAAUoB,YAAW,WACjBtB,EAAKrP,WAAM,EAAQH,EACvB,GAAGyP,EACP,GA07BQsB,EAAkB,SAAUzD,GAC5B,IAAInM,EAAUmM,EAAErH,OACZ1C,GAAyC,IAAvBpC,EAAQ2G,WAAsB3G,EAAUmI,EAAanI,EAASmM,GAEpF,GADAnM,EAAUsI,EAAgBlG,EAAiBpC,GACtC8C,GAAa0D,EAAgBpE,EAAiBU,EAASU,gBAA4D,SAA1CzD,EAAQqC,EAAiB,aAAvG,CAGA,IAAImG,EAAUxI,EAAQqC,EAAiB,QACnC+C,SAASoD,EAAQd,WAAatH,EAAQiC,EAAgBqG,SAAU1I,EAAQqC,EAAiB,UAAUxD,QAAUuG,SAASoD,EAAQd,WAAa3E,EAASU,gBAAkBpB,IAG1K+J,EAAE2B,iBACF3B,EAAE4B,kBACF5B,EAAEK,aAAaqD,YAA0D,IAA7C1N,EAAMC,GAAiBP,UAAU,QAAmB,OAAS,OACzF2M,EAAuBpM,EAAiBpC,EAASmM,EAAE9F,MAAO8F,EAAE5F,OAR5D,CASJ,EACAlE,EAAiBuI,EAAU3L,OAAOmD,GAAkB,WAAYwN,GAChEvN,EAAiBuI,EAAU3L,OAAOmD,GAAkB,YAAawN,EACrE,IACOxG,EACX,CACAnB,EAAS6H,QAAU,SAAU1N,IArdN,SAAUA,GAC7B,IAAIyG,EAAO9I,EAAQqC,EAAiB,SAAW,CAAC,EAC5CuD,EAAQxF,EAAQiC,EAAgBqG,SAAUI,EAAKlD,OAC/CmD,EAAUpD,EAAYC,EAAOkD,EAAKE,QAEtCtG,EAAoBL,EAAiB,YACrCK,EAAoBL,EAAiB,aACrCK,EAAoBL,EAAiB,aACrCK,EAAoBL,EAAiB,WACrCK,EAAoBL,EAAiB,QAErC4F,EAAoB5F,GAEpBK,EAAoBqG,EAAS,aAC7BhB,EAAkBnC,GAClBuC,EAAgBvC,GAChBoC,EAAuB9E,EAAiBI,GAExCjB,EAAgBuE,YAAa,CACjC,CAmcIoJ,CAAiB3N,EACrB,EACA6F,EAASqD,OAAS,SAAUlJ,GACxBwG,EAAgBxG,EACpB,EACA6F,EAAS+H,QAAU,SAAU5N,IAlaN,SAAUA,GAC7B,IAAIyG,EAAO9I,EAAQqC,EAAiB,QAChCuD,EAAQxF,EAAQiC,EAAgBqG,SAAUI,EAAKlD,OAC/CmD,EAAUpD,EAAYC,EAAOkD,EAAKE,QACtCrG,EAAaN,EAAiB,kBAAmB,QACjDrC,EAAQqC,EAAiB,YAAa,QACtCM,EAAaoG,EAAS,YAAa,SACnCrG,EAAoBqG,EAAS,YACjC,CA2ZImH,CAAiB7N,EACrB,EAEA6F,EAASiI,UAAY,CAEjB/O,MAAOpB,EACP+H,kBAAmBA,EACnBI,gBAAiBA,EACjBF,oBAAqBA,EACrBD,uBAAwBA,GAG5B,WCzwCM,GAA+BrK,OAAOC,KAAKC,OAAO,uB,eCAxD,MAAM,GAA+BF,OAAOC,KAAKC,OAAO,4B,eCAxD,MAAM,GAA+BF,OAAOC,KAAKC,OAAO,yB,eCAxD,MAAM,GAA+BF,OAAOC,KAAKC,OAAO,yB,eCAxD,MAAM,GAA+BF,OAAOC,KAAKC,OAAO,4B,eCSnCuS,GAAU,oBAAAA,IAAA,KAAAC,EAAAD,EAAA/S,UAoQ5B,OApQ4BgT,EAC7BC,OAAA,SAAOC,GACL1Q,KAAK2Q,OAASD,EAAME,MAAMD,OAC1B3Q,KAAK6Q,OAAQ,EACb7Q,KAAK8Q,YAAa,EAClB9Q,KAAK+Q,cAAe,EAEA,OAAhB/Q,KAAK2Q,QACP3Q,KAAKgR,cAET,EAACR,EAEDQ,aAAA,WACEhR,KAAK2Q,OAASM,IAAAA,MAAUC,aAAa,qBAAsB,CACzDC,WAAY,CACV3R,KAAM,GACNC,IAAK,GACLC,eAAgB,GAChBC,iBAAkB,KAGxB,EAAC6Q,EAEDY,SAAA,WACE,OAAIpR,KAAK2Q,OAAO1Q,OACPD,KAAK2Q,OAAOnR,OAGdyR,IAAAA,WAAeI,MAAM,qCAC9B,EAACb,EAEDc,KAAA,WAAO,IAAAzS,EAAA,KACL,OAAO0S,EAAE,yBAA0B,CACjCvR,KAAK2Q,OAAO1Q,OAASsR,EAAE,yEAA2E,KAClGA,EACE,iDACA,CACEC,QAAS,WACP3S,EAAKkS,cAAgBlS,EAAKkS,YAC5B,GAEF,CACEQ,EAAE,kCAAmCvR,KAAKoR,YAC1CG,EAAE,MAAO,CACPvR,KAAK2Q,OAAO1Q,OAAS,CAACgR,IAAAA,WAAeI,MAAM,uCAAwC,KAAO,KAC1FI,KAAKzR,KAAK+Q,aAAe,oBAAsB,2BAIrD/Q,KAAK+Q,aAAe/Q,KAAK0R,aAAe,MAE5C,EAAClB,EAEDkB,WAAA,WACE,OAAOH,EACL,8BACA,CACEI,SAAU3R,KAAK4R,WAAWxT,KAAK4B,OAEjC,CACEA,KAAK6R,SAASC,UACdP,EAAE,eAAgB,CAChBQ,KAAAA,UACE,CACEC,KAAM,SACNC,UAAW,yBACXC,QAASlS,KAAK8Q,WACdqB,UAAWnS,KAAKoS,eAElBnB,IAAAA,WAAeI,MAAM,4BAA8BrR,KAAK2Q,OAAO1Q,OAAS,OAAS,OAAS,YAE5FD,KAAK2Q,OAAO1Q,OACR8R,KAAAA,UACE,CACEC,KAAM,SACNC,UAAW,wBACXC,QAASlS,KAAK8Q,WACdU,QAASxR,KAAKqS,aAAajU,KAAK4B,OAElCiR,IAAAA,WAAeI,MAAM,0CAEvB,MAIZ,EAACb,EAEDqB,OAAA,WAAS,IAAAS,EAAA,KACDT,EAAS,IAAIU,MAuGnB,OArGAV,EAAOrG,IACL,OACA+F,EAAE,cAAe,CACfA,EAAE,QAASN,IAAAA,WAAeI,MAAM,kCAChCE,EAAE,oBAAqB,CACrBS,KAAM,OACNnU,MAAOmC,KAAK2Q,OAAOnR,OACnBgT,QAASC,KAAS,QAASzS,KAAK0S,gBAAgBtU,KAAK4B,KAAM,WAE7DuR,EAAE,YAAaN,IAAAA,WAAeI,MAAM,yCAEtC,KAGFQ,EAAOrG,IACL,MACA+F,EAAE,cAAe,CACfA,EAAE,QAASN,IAAAA,WAAeI,MAAM,iCAChCE,EAAE,oBAAqB,CACrBS,KAAM,MACNnU,MAAOmC,KAAK2Q,OAAOlR,MACnB+S,QAASC,KAAS,QAASzS,KAAK0S,gBAAgBtU,KAAK4B,KAAM,UAE7DuR,EAAE,YAAaN,IAAAA,WAAeI,MAAM,wCAEtC,IAGFQ,EAAOrG,IACL,iBACA+F,EAAE,cAAe,CACfA,EAAE,QAASN,IAAAA,WAAeI,MAAM,4CAChCE,EAAE,uBAAwB,CACxB1T,MAAOmC,KAAK2Q,OAAOjR,iBACnB8S,QAASC,KAAS,QAASzS,KAAK0S,gBAAgBtU,KAAK4B,KAAM,qBAE7DuR,EAAE,YAAaN,IAAAA,WAAeI,MAAM,mDAEtC,IAGFQ,EAAOrG,IACL,mBACA+F,EAAE,cAAe,CACfA,EAAE,QAASN,IAAAA,WAAeI,MAAM,8CAChCE,EAAE,yBAA0B,CAC1BA,EAAE,oBAAqB,CACrBS,KAAM,OACNnU,MAAOmC,KAAK2Q,OAAOhR,mBACnB6S,QAASC,KAAS,QAASzS,KAAK0S,gBAAgBtU,KAAK4B,KAAM,qBAC3DkC,YAAa+O,IAAAA,WAAeI,MAAM,2DAEpCU,KAAAA,UACE,CACEE,UAAW,yBACXT,QAAS,WAGPc,EAAKI,gBAAgB,mBAAoBC,QAAQC,YAAY,GAAGC,cAClE,GAEF5B,IAAAA,WAAeI,MAAM,yCAGzBE,EAAE,YAAaN,IAAAA,WAAeI,MAAM,qDAEtC,IAGErR,KAAK2Q,OAAO1Q,QACd4R,EAAOrG,IACL,aACA+F,EAAE,cAAe,CACfA,EAAE,QAASN,IAAAA,WAAeI,MAAM,wCAChCE,EACE,eACA,CAAC,OAAQ,OAAO/L,KAAI,SAACsN,GAAM,OACzBvB,EACE,mCACA,CACEwB,KAAM9B,IAAAA,MAAUlO,UAAU,UAAY,uBAAyBuP,EAAK3B,OAAO7Q,KAAO,WAAagT,EAC/F5N,OAAQ,UAEV4N,EAAOE,cACR,KAGLzB,EACE,YACAN,IAAAA,WAAeI,MAAM,2CAA4C,CAC/DxU,EAAG0U,EAAE,IAAK,CACRwB,KAAM,2DACN7N,OAAQ,gBAKhB,IAIG2M,CACT,EAACrB,EAEDkC,gBAAA,SAAgB3P,EAAWlF,GAAO,IAAAoV,EAChCjT,KAAK2Q,OAAOuC,iBAAcD,EAAA,IACvBlQ,GAAYlF,EAAKoV,IAGpBjT,KAAK6Q,OAAQ,CACf,EAACL,EAED4B,YAAA,WACE,OAAOpS,KAAK6Q,KACd,EAACL,EAEDoB,WAAA,SAAWzL,GAAO,IAAAgN,EAAA,KAChBhN,EAAM+H,iBAENlO,KAAK8Q,YAAa,EAElB,IAAMsC,GAAmBpT,KAAK2Q,OAAO1Q,OAErCD,KAAK2Q,OACF0C,KAAKrT,KAAK2Q,OAAOzQ,KAAKiR,YACtBmC,MAAK,WACAF,IACFD,EAAKnC,eACLmC,EAAKpC,cAAe,GAGtBoC,EAAKrC,YAAa,EAClBqC,EAAKtC,OAAQ,EAEbU,EAAEgC,QACJ,IAAE,OACK,SAACC,GAGN,MAFAL,EAAKrC,YAAa,EAEZ0C,CACR,GACJ,EAAChD,EAED6B,aAAA,WAAe,IAAAoB,EAAA,KAEVC,QACCC,KACE1C,IAAAA,WAAeI,MAAM,sDAAuD,CAC1E7R,KAAMQ,KAAK2Q,OAAOnR,aAQ1BQ,KAAK8Q,YAAa,EAElB9Q,KAAK2Q,OAAM,SAER2C,MAAK,WACJG,EAAK3C,YAAa,EAElBS,EAAEgC,QACJ,IAAE,OACK,SAACC,GAGN,MAFAC,EAAK3C,YAAa,EAEZ0C,CACR,IACJ,EAACjD,CAAA,CApQ4B,GCThB,SAAS,GAACxK,EAAO6N,GAC9B,YADkC,IAAJA,IAAAA,EAAO,QAC9B7N,EAAMzG,MAAK,SAACzC,EAAGgX,GAAC,OAAKhX,EAAE+W,KAAUC,EAAED,IAAO,GACnD,CCIA,IAEqBE,GAAU,oBAAAA,IAAA,KAAAtD,EAAAsD,EAAAtW,UAiF5B,OAjF4BgT,EAC7BC,OAAA,WACEQ,IAAAA,QACW,CACPxH,OAAQ,MACRhK,IAAKwR,IAAAA,MAAUlO,UAAU,UAAY,wBAEtCuQ,MAAK,SAACS,GACL9C,IAAAA,MAAU+C,YAAYD,GAEtBxC,EAAEgC,QACJ,GACJ,EAAC/C,EAEDyD,SAAA,SAASvD,GACP1Q,KAAKkU,aAAaxD,EACpB,EAACF,EAED2D,SAAA,SAASzD,GAGP1Q,KAAKkU,aAAaxD,EACpB,EAACF,EAED0D,aAAA,SAAaxD,GAAO,IAAA7R,EAAA,KAClBwJ,GAASqI,EAAM0D,IAAIpO,cAAc,0BAA2B,CAC1DmD,OAAQ,sBACP,GAAG1G,iBAAiB,cAAc,WACnC,IAAM4R,EAAU,GAAG7O,IAAI9H,KAAKgT,EAAM0D,IAAIzK,iBAAiB,oBAAoB,SAACvJ,GAAO,OAAKA,EAAQkU,QAAQxU,EAAE,IAE1GjB,EAAK0V,WAAWF,EAClB,GACF,EAAC7D,EAEDc,KAAA,WACE,IAAMkD,EAAWvD,IAAAA,MAAUwD,IAAI,sBAE3BC,EAAa,GAkBjB,OAhBAC,GAAgBH,GAAU/S,SAAQ,SAACkP,GAEjC+D,EAAWE,KACTrD,EACE,kBACA,CACEvU,IAAK2T,EAAO7Q,KACZ,UAAW6Q,EAAO7Q,MAEpByR,EAAEhB,GAAY,CACZI,OAAAA,KAIR,IAEOY,EAAE,MAAO,CACdA,EAAE,KAAMN,IAAAA,WAAeI,MAAM,oCAC7BE,EAAE,gCAAiC,CACjCA,EAAE,yBAA0BmD,GAC5BnD,EAAEhB,GAAY,CACZI,OAAQ,UAIhB,EAACH,EAED+D,WAAA,SAAWF,GACTpD,IAAAA,QACW,CACPxH,OAAQ,OACRhK,IAAKwR,IAAAA,MAAUlO,UAAU,UAAY,4BACrC8R,KAAM,CACJvV,KAAM+U,KAGTf,MAAK,SAACS,GAEL9C,IAAAA,MAAU+C,YAAYD,GAEtBxC,EAAEgC,QACJ,GACJ,EAACO,CAAA,CAjF4B,GCHzBgB,GAAiB,aACjBC,GAAoB,4BAILC,GAAiB,SAAAC,GAAA,SAAAD,IAAA,OAAAC,EAAA7V,MAAA,KAAAL,YAAA,KA0CnC,OA1CmCT,EAAA0W,EAAAC,GAAAD,EAAAxX,UACpC0X,QAAA,WACE,OAAO3D,EAAE,0BAA2B,CAClCA,EAAE,aAAc,CACdA,EAAE,cAAe,CACfA,EAAE,QAASN,IAAAA,WAAeI,MAAM0D,GAAoB,4BACpDxD,EAAE,uBAAwB,CACxB4D,KAAMnV,KAAKoV,QAAQN,GAAiB,yBAGxCvD,EAAE,cAAe,CACfA,EACE,QACA8D,IAAAA,UACE,CACEC,MAAOtV,KAAKoV,QAAQN,GAAiB,kBAA9B9U,GAAqD,EAC5DuV,SAAUvV,KAAKoV,QAAQN,GAAiB,oBAE1C7D,IAAAA,WAAeI,MAAM0D,GAAoB,6BAI/CxD,EAAE,cAAe,CACfA,EAAE,QAASN,IAAAA,WAAeI,MAAM0D,GAAoB,sBACpDxD,EAAE,+BAAgC,CAChC4D,KAAMnV,KAAKoV,QAAQN,GAAiB,eACpC5S,YAAa,eAEfqP,EACE,YACAN,IAAAA,WAAeI,MAAM0D,GAAoB,yBAA0B,CACjElY,EAAG0U,EAAE,IAAK,CACRwB,KAAM,4CACN7N,OAAQ,gBAKhBlF,KAAKwV,eACLjE,EAAEuC,OAGR,EAACkB,CAAA,CA1CmC,CAASS,KCNlCC,GAAa,CACxBnF,WAAAA,GACAuD,WAAAA,GACAkB,kBAAAA,ICLWW,GAAS,CACpBhX,OAAAA,GCDWiX,GAAU,CACrBjB,gBAAAA,ICKF1D,IAAAA,aAAiBzF,IAAI,aAAa,WAChCyF,IAAAA,MAAU0E,OAAO,sBAAwBhX,EAEzCsS,IAAAA,cAAiB,IACV,aACJ4E,mBACC,CACEpE,KAAM,mBACNqE,MAAO7E,IAAAA,WAAeI,MAAM,uDAC5B0E,WAAY,qCAEd,YAEDF,mBACC,CACEpE,KAAM,mBACNqE,MAAO7E,IAAAA,WAAeI,MAAM,wDAC5B0E,WAAY,sCAEd,YAEDF,mBACC,CACEpE,KAAM,mBACNqE,MAAO7E,IAAAA,WAAeI,MAAM,+CAC5B0E,WAAY,6BAEd,YAEDC,aAAahB,GAClB,G","sources":["webpack://@fof/terms/webpack/bootstrap","webpack://@fof/terms/webpack/runtime/compat get default export","webpack://@fof/terms/webpack/runtime/define property getters","webpack://@fof/terms/webpack/runtime/hasOwnProperty shorthand","webpack://@fof/terms/webpack/runtime/make namespace object","webpack://@fof/terms/external root \"flarum.core.compat['admin/app']\"","webpack://@fof/terms/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://@fof/terms/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@fof/terms/external root \"flarum.core.compat['common/Model']\"","webpack://@fof/terms/external root \"flarum.core.compat['common/utils/computed']\"","webpack://@fof/terms/./src/common/models/Policy.js","webpack://@fof/terms/external root \"flarum.core.compat['admin/components/ExtensionPage']\"","webpack://@fof/terms/external root \"flarum.core.compat['common/components/Switch']\"","webpack://@fof/terms/./node_modules/html5sortable/dist/html5sortable.es.js","webpack://@fof/terms/external root \"flarum.core.compat['common/helpers/icon']\"","webpack://@fof/terms/external root \"flarum.core.compat['common/utils/extractText']\"","webpack://@fof/terms/external root \"flarum.core.compat['common/utils/ItemList']\"","webpack://@fof/terms/external root \"flarum.core.compat['common/utils/withAttr']\"","webpack://@fof/terms/external root \"flarum.core.compat['common/components/Button']\"","webpack://@fof/terms/./src/admin/components/PolicyEdit.js","webpack://@fof/terms/./src/common/helpers/sortByAttribute.js","webpack://@fof/terms/./src/admin/components/PolicyList.js","webpack://@fof/terms/./src/admin/components/TermsSettingsPage.js","webpack://@fof/terms/./src/admin/components/index.js","webpack://@fof/terms/./src/common/models/index.js","webpack://@fof/terms/./src/common/helpers/index.js","webpack://@fof/terms/./src/admin/index.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (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 = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/app'];","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/Model'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/computed'];","import Model from 'flarum/common/Model';\nimport computed from 'flarum/common/utils/computed';\n\nexport default class Policy extends Model {\n sort = Model.attribute('sort');\n name = Model.attribute('name');\n url = Model.attribute('url');\n update_message = Model.attribute('update_message');\n terms_updated_at = Model.attribute('terms_updated_at');\n form_key = computed('id', (id) => 'fof_terms_policy_' + id);\n\n apiEndpoint() {\n return '/fof/terms/policies' + (this.exists ? '/' + this.data.id : '');\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/components/ExtensionPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Switch'];","/*\n * HTML5Sortable package\n * https://github.com/lukasoppermann/html5sortable\n *\n * Maintained by Lukas Oppermann \n *\n * Released under the MIT license.\n */\n/**\n * Get or set data on element\n * @param {HTMLElement} element\n * @param {string} key\n * @param {any} value\n * @return {*}\n */\nfunction addData(element, key, value) {\n if (value === undefined) {\n return element && element.h5s && element.h5s.data && element.h5s.data[key];\n }\n else {\n element.h5s = element.h5s || {};\n element.h5s.data = element.h5s.data || {};\n element.h5s.data[key] = value;\n }\n}\n/**\n * Remove data from element\n * @param {HTMLElement} element\n */\nfunction removeData(element) {\n if (element.h5s) {\n delete element.h5s.data;\n }\n}\n\n/* eslint-env browser */\n/**\n * Filter only wanted nodes\n * @param {NodeList|HTMLCollection|Array} nodes\n * @param {String} selector\n * @returns {Array}\n */\nvar _filter = (function (nodes, selector) {\n if (!(nodes instanceof NodeList || nodes instanceof HTMLCollection || nodes instanceof Array)) {\n throw new Error('You must provide a nodeList/HTMLCollection/Array of elements to be filtered.');\n }\n if (typeof selector !== 'string') {\n return Array.from(nodes);\n }\n return Array.from(nodes).filter(function (item) { return item.nodeType === 1 && item.matches(selector); });\n});\n\n/* eslint-env browser */\nvar stores = new Map();\n/**\n * Stores data & configurations per Sortable\n * @param {Object} config\n */\nvar Store = /** @class */ (function () {\n function Store() {\n this._config = new Map(); // eslint-disable-line no-undef\n this._placeholder = undefined; // eslint-disable-line no-undef\n this._data = new Map(); // eslint-disable-line no-undef\n }\n Object.defineProperty(Store.prototype, \"config\", {\n /**\n * get the configuration map of a class instance\n * @method config\n * @return {object}\n */\n get: function () {\n // transform Map to object\n var config = {};\n this._config.forEach(function (value, key) {\n config[key] = value;\n });\n // return object\n return config;\n },\n /**\n * set the configuration of a class instance\n * @method config\n * @param {object} config object of configurations\n */\n set: function (config) {\n if (typeof config !== 'object') {\n throw new Error('You must provide a valid configuration object to the config setter.');\n }\n // combine config with default\n var mergedConfig = Object.assign({}, config);\n // add config to map\n this._config = new Map(Object.entries(mergedConfig));\n },\n enumerable: false,\n configurable: true\n });\n /**\n * set individual configuration of a class instance\n * @method setConfig\n * @param key valid configuration key\n * @param value any value\n * @return void\n */\n Store.prototype.setConfig = function (key, value) {\n if (!this._config.has(key)) {\n throw new Error(\"Trying to set invalid configuration item: \" + key);\n }\n // set config\n this._config.set(key, value);\n };\n /**\n * get an individual configuration of a class instance\n * @method getConfig\n * @param key valid configuration key\n * @return any configuration value\n */\n Store.prototype.getConfig = function (key) {\n if (!this._config.has(key)) {\n throw new Error(\"Invalid configuration item requested: \" + key);\n }\n return this._config.get(key);\n };\n Object.defineProperty(Store.prototype, \"placeholder\", {\n /**\n * get the placeholder for a class instance\n * @method placeholder\n * @return {HTMLElement|null}\n */\n get: function () {\n return this._placeholder;\n },\n /**\n * set the placeholder for a class instance\n * @method placeholder\n * @param {HTMLElement} placeholder\n * @return {void}\n */\n set: function (placeholder) {\n if (!(placeholder instanceof HTMLElement) && placeholder !== null) {\n throw new Error('A placeholder must be an html element or null.');\n }\n this._placeholder = placeholder;\n },\n enumerable: false,\n configurable: true\n });\n /**\n * set an data entry\n * @method setData\n * @param {string} key\n * @param {any} value\n * @return {void}\n */\n Store.prototype.setData = function (key, value) {\n if (typeof key !== 'string') {\n throw new Error('The key must be a string.');\n }\n this._data.set(key, value);\n };\n /**\n * get an data entry\n * @method getData\n * @param {string} key an existing key\n * @return {any}\n */\n Store.prototype.getData = function (key) {\n if (typeof key !== 'string') {\n throw new Error('The key must be a string.');\n }\n return this._data.get(key);\n };\n /**\n * delete an data entry\n * @method deleteData\n * @param {string} key an existing key\n * @return {boolean}\n */\n Store.prototype.deleteData = function (key) {\n if (typeof key !== 'string') {\n throw new Error('The key must be a string.');\n }\n return this._data.delete(key);\n };\n return Store;\n}());\n/**\n * @param {HTMLElement} sortableElement\n * @returns {Class: Store}\n */\nvar store = (function (sortableElement) {\n // if sortableElement is wrong type\n if (!(sortableElement instanceof HTMLElement)) {\n throw new Error('Please provide a sortable to the store function.');\n }\n // create new instance if not avilable\n if (!stores.has(sortableElement)) {\n stores.set(sortableElement, new Store());\n }\n // return instance\n return stores.get(sortableElement);\n});\n\n/**\n * @param {Array|HTMLElement} element\n * @param {Function} callback\n * @param {string} event\n */\nfunction addEventListener(element, eventName, callback) {\n if (element instanceof Array) {\n for (var i = 0; i < element.length; ++i) {\n addEventListener(element[i], eventName, callback);\n }\n return;\n }\n element.addEventListener(eventName, callback);\n store(element).setData(\"event\" + eventName, callback);\n}\n/**\n * @param {Array|HTMLElement} element\n * @param {string} eventName\n */\nfunction removeEventListener(element, eventName) {\n if (element instanceof Array) {\n for (var i = 0; i < element.length; ++i) {\n removeEventListener(element[i], eventName);\n }\n return;\n }\n element.removeEventListener(eventName, store(element).getData(\"event\" + eventName));\n store(element).deleteData(\"event\" + eventName);\n}\n\n/**\n * @param {Array|HTMLElement} element\n * @param {string} attribute\n * @param {string} value\n */\nfunction addAttribute(element, attribute, value) {\n if (element instanceof Array) {\n for (var i = 0; i < element.length; ++i) {\n addAttribute(element[i], attribute, value);\n }\n return;\n }\n element.setAttribute(attribute, value);\n}\n/**\n * @param {Array|HTMLElement} element\n * @param {string} attribute\n */\nfunction removeAttribute(element, attribute) {\n if (element instanceof Array) {\n for (var i = 0; i < element.length; ++i) {\n removeAttribute(element[i], attribute);\n }\n return;\n }\n element.removeAttribute(attribute);\n}\n\n/**\n * @param {HTMLElement} element\n * @returns {Object}\n */\nvar _offset = (function (element) {\n if (!element.parentElement || element.getClientRects().length === 0) {\n throw new Error('target element must be part of the dom');\n }\n var rect = element.getClientRects()[0];\n return {\n left: rect.left + window.pageXOffset,\n right: rect.right + window.pageXOffset,\n top: rect.top + window.pageYOffset,\n bottom: rect.bottom + window.pageYOffset\n };\n});\n\n/**\n * Creates and returns a new debounced version of the passed function which will postpone its execution until after wait milliseconds have elapsed\n * @param {Function} func to debounce\n * @param {number} time to wait before calling function with latest arguments, 0 - no debounce\n * @returns {function} - debounced function\n */\nvar _debounce = (function (func, wait) {\n if (wait === void 0) { wait = 0; }\n var timeout;\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n clearTimeout(timeout);\n timeout = setTimeout(function () {\n func.apply(void 0, args);\n }, wait);\n };\n});\n\n/* eslint-env browser */\n/**\n * Get position of the element relatively to its sibling elements\n * @param {HTMLElement} element\n * @returns {number}\n */\nvar _index = (function (element, elementList) {\n if (!(element instanceof HTMLElement) || !(elementList instanceof NodeList || elementList instanceof HTMLCollection || elementList instanceof Array)) {\n throw new Error('You must provide an element and a list of elements.');\n }\n return Array.from(elementList).indexOf(element);\n});\n\n/* eslint-env browser */\n/**\n * Test whether element is in DOM\n * @param {HTMLElement} element\n * @returns {boolean}\n */\nvar isInDom = (function (element) {\n if (!(element instanceof HTMLElement)) {\n throw new Error('Element is not a node element.');\n }\n return element.parentNode !== null;\n});\n\n/* eslint-env browser */\n/**\n * Insert node before or after target\n * @param {HTMLElement} referenceNode - reference element\n * @param {HTMLElement} newElement - element to be inserted\n * @param {String} position - insert before or after reference element\n */\nvar insertNode = function (referenceNode, newElement, position) {\n if (!(referenceNode instanceof HTMLElement) || !(referenceNode.parentElement instanceof HTMLElement)) {\n throw new Error('target and element must be a node');\n }\n referenceNode.parentElement.insertBefore(newElement, (position === 'before' ? referenceNode : referenceNode.nextElementSibling));\n};\n/**\n * Insert before target\n * @param {HTMLElement} target\n * @param {HTMLElement} element\n */\nvar insertBefore = function (target, element) { return insertNode(target, element, 'before'); };\n/**\n * Insert after target\n * @param {HTMLElement} target\n * @param {HTMLElement} element\n */\nvar insertAfter = function (target, element) { return insertNode(target, element, 'after'); };\n\n/* eslint-env browser */\n/**\n * Filter only wanted nodes\n * @param {HTMLElement} sortableContainer\n * @param {Function} customSerializer\n * @returns {Array}\n */\nvar _serialize = (function (sortableContainer, customItemSerializer, customContainerSerializer) {\n if (customItemSerializer === void 0) { customItemSerializer = function (serializedItem, sortableContainer) { return serializedItem; }; }\n if (customContainerSerializer === void 0) { customContainerSerializer = function (serializedContainer) { return serializedContainer; }; }\n // check for valid sortableContainer\n if (!(sortableContainer instanceof HTMLElement) || !sortableContainer.isSortable === true) {\n throw new Error('You need to provide a sortableContainer to be serialized.');\n }\n // check for valid serializers\n if (typeof customItemSerializer !== 'function' || typeof customContainerSerializer !== 'function') {\n throw new Error('You need to provide a valid serializer for items and the container.');\n }\n // get options\n var options = addData(sortableContainer, 'opts');\n var item = options.items;\n // serialize container\n var items = _filter(sortableContainer.children, item);\n var serializedItems = items.map(function (item) {\n return {\n parent: sortableContainer,\n node: item,\n html: item.outerHTML,\n index: _index(item, items)\n };\n });\n // serialize container\n var container = {\n node: sortableContainer,\n itemCount: serializedItems.length\n };\n return {\n container: customContainerSerializer(container),\n items: serializedItems.map(function (item) { return customItemSerializer(item, sortableContainer); })\n };\n});\n\n/* eslint-env browser */\n/**\n * create a placeholder element\n * @param {HTMLElement} sortableElement a single sortable\n * @param {string|undefined} placeholder a string representing an html element\n * @param {string} placeholderClasses a string representing the classes that should be added to the placeholder\n */\nvar _makePlaceholder = (function (sortableElement, placeholder, placeholderClass) {\n var _a;\n if (placeholderClass === void 0) { placeholderClass = 'sortable-placeholder'; }\n if (!(sortableElement instanceof HTMLElement)) {\n throw new Error('You must provide a valid element as a sortable.');\n }\n // if placeholder is not an element\n if (!(placeholder instanceof HTMLElement) && placeholder !== undefined) {\n throw new Error('You must provide a valid element as a placeholder or set ot to undefined.');\n }\n // if no placeholder element is given\n if (placeholder === undefined) {\n if (['UL', 'OL'].includes(sortableElement.tagName)) {\n placeholder = document.createElement('li');\n }\n else if (['TABLE', 'TBODY'].includes(sortableElement.tagName)) {\n placeholder = document.createElement('tr');\n // set colspan to always all rows, otherwise the item can only be dropped in first column\n placeholder.innerHTML = '';\n }\n else {\n placeholder = document.createElement('div');\n }\n }\n // add classes to placeholder\n if (typeof placeholderClass === 'string') {\n (_a = placeholder.classList).add.apply(_a, placeholderClass.split(' '));\n }\n return placeholder;\n});\n\n/* eslint-env browser */\n/**\n * Get height of an element including padding\n * @param {HTMLElement} element an dom element\n */\nvar _getElementHeight = (function (element) {\n if (!(element instanceof HTMLElement)) {\n throw new Error('You must provide a valid dom element');\n }\n // get calculated style of element\n var style = window.getComputedStyle(element);\n // get only height if element has box-sizing: border-box specified\n if (style.getPropertyValue('box-sizing') === 'border-box') {\n return parseInt(style.getPropertyValue('height'), 10);\n }\n // pick applicable properties, convert to int and reduce by adding\n return ['height', 'padding-top', 'padding-bottom']\n .map(function (key) {\n var int = parseInt(style.getPropertyValue(key), 10);\n return isNaN(int) ? 0 : int;\n })\n .reduce(function (sum, value) { return sum + value; });\n});\n\n/* eslint-env browser */\n/**\n * Get width of an element including padding\n * @param {HTMLElement} element an dom element\n */\nvar _getElementWidth = (function (element) {\n if (!(element instanceof HTMLElement)) {\n throw new Error('You must provide a valid dom element');\n }\n // get calculated style of element\n var style = window.getComputedStyle(element);\n // pick applicable properties, convert to int and reduce by adding\n return ['width', 'padding-left', 'padding-right']\n .map(function (key) {\n var int = parseInt(style.getPropertyValue(key), 10);\n return isNaN(int) ? 0 : int;\n })\n .reduce(function (sum, value) { return sum + value; });\n});\n\n/* eslint-env browser */\n/**\n * get handle or return item\n * @param {Array} items\n * @param {string} selector\n */\nvar _getHandles = (function (items, selector) {\n if (!(items instanceof Array)) {\n throw new Error('You must provide a Array of HTMLElements to be filtered.');\n }\n if (typeof selector !== 'string') {\n return items;\n }\n return items\n // remove items without handle from array\n .filter(function (item) {\n return item.querySelector(selector) instanceof HTMLElement ||\n (item.shadowRoot && item.shadowRoot.querySelector(selector) instanceof HTMLElement);\n })\n // replace item with handle in array\n .map(function (item) {\n return item.querySelector(selector) || (item.shadowRoot && item.shadowRoot.querySelector(selector));\n });\n});\n\n/**\n * @param {Event} event\n * @returns {HTMLElement}\n */\nvar getEventTarget = (function (event) {\n return (event.composedPath && event.composedPath()[0]) || event.target;\n});\n\n/* eslint-env browser */\n/**\n * defaultDragImage returns the current item as dragged image\n * @param {HTMLElement} draggedElement - the item that the user drags\n * @param {object} elementOffset - an object with the offsets top, left, right & bottom\n * @param {Event} event - the original drag event object\n * @return {object} with element, posX and posY properties\n */\nvar defaultDragImage = function (draggedElement, elementOffset, event) {\n return {\n element: draggedElement,\n posX: event.pageX - elementOffset.left,\n posY: event.pageY - elementOffset.top\n };\n};\n/**\n * attaches an element as the drag image to an event\n * @param {Event} event - the original drag event object\n * @param {HTMLElement} draggedElement - the item that the user drags\n * @param {Function} customDragImage - function to create a custom dragImage\n * @return void\n */\nvar setDragImage = (function (event, draggedElement, customDragImage) {\n // check if event is provided\n if (!(event instanceof Event)) {\n throw new Error('setDragImage requires a DragEvent as the first argument.');\n }\n // check if draggedElement is provided\n if (!(draggedElement instanceof HTMLElement)) {\n throw new Error('setDragImage requires the dragged element as the second argument.');\n }\n // set default function of none provided\n if (!customDragImage) {\n customDragImage = defaultDragImage;\n }\n // check if setDragImage method is available\n if (event.dataTransfer && event.dataTransfer.setDragImage) {\n // get the elements offset\n var elementOffset = _offset(draggedElement);\n // get the dragImage\n var dragImage = customDragImage(draggedElement, elementOffset, event);\n // check if custom function returns correct values\n if (!(dragImage.element instanceof HTMLElement) || typeof dragImage.posX !== 'number' || typeof dragImage.posY !== 'number') {\n throw new Error('The customDragImage function you provided must return and object with the properties element[string], posX[integer], posY[integer].');\n }\n // needs to be set for HTML5 drag & drop to work\n event.dataTransfer.effectAllowed = 'copyMove';\n // Firefox requires it to use the event target's id for the data\n event.dataTransfer.setData('text/plain', getEventTarget(event).id);\n // set the drag image on the event\n event.dataTransfer.setDragImage(dragImage.element, dragImage.posX, dragImage.posY);\n }\n});\n\n/**\n * Check if curList accepts items from destList\n * @param {sortable} destination the container an item is move to\n * @param {sortable} origin the container an item comes from\n */\nvar _listsConnected = (function (destination, origin) {\n // check if valid sortable\n if (destination.isSortable === true) {\n var acceptFrom = store(destination).getConfig('acceptFrom');\n // check if acceptFrom is valid\n if (acceptFrom !== null && acceptFrom !== false && typeof acceptFrom !== 'string') {\n throw new Error('HTML5Sortable: Wrong argument, \"acceptFrom\" must be \"null\", \"false\", or a valid selector string.');\n }\n if (acceptFrom !== null) {\n return acceptFrom !== false && acceptFrom.split(',').filter(function (sel) {\n return sel.length > 0 && origin.matches(sel);\n }).length > 0;\n }\n // drop in same list\n if (destination === origin) {\n return true;\n }\n // check if lists are connected with connectWith\n if (store(destination).getConfig('connectWith') !== undefined && store(destination).getConfig('connectWith') !== null) {\n return store(destination).getConfig('connectWith') === store(origin).getConfig('connectWith');\n }\n }\n return false;\n});\n\n/**\n * default configurations\n */\nvar defaultConfiguration = {\n items: null,\n // deprecated\n connectWith: null,\n // deprecated\n disableIEFix: null,\n acceptFrom: null,\n copy: false,\n placeholder: null,\n placeholderClass: 'sortable-placeholder',\n draggingClass: 'sortable-dragging',\n hoverClass: false,\n dropTargetContainerClass: false,\n debounce: 0,\n throttleTime: 100,\n maxItems: 0,\n itemSerializer: undefined,\n containerSerializer: undefined,\n customDragImage: null,\n orientation: 'vertical'\n};\n\n/**\n * make sure a function is only called once within the given amount of time\n * @param {Function} fn the function to throttle\n * @param {number} threshold time limit for throttling\n */\n// must use function to keep this context\nfunction _throttle (fn, threshold) {\n var _this = this;\n if (threshold === void 0) { threshold = 250; }\n // check function\n if (typeof fn !== 'function') {\n throw new Error('You must provide a function as the first argument for throttle.');\n }\n // check threshold\n if (typeof threshold !== 'number') {\n throw new Error('You must provide a number as the second argument for throttle.');\n }\n var lastEventTimestamp = null;\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var now = Date.now();\n if (lastEventTimestamp === null || now - lastEventTimestamp >= threshold) {\n lastEventTimestamp = now;\n fn.apply(_this, args);\n }\n };\n}\n\n/* eslint-env browser */\n/**\n * enable or disable hoverClass on mouseenter/leave if container Items\n * @param {sortable} sortableContainer a valid sortableContainer\n * @param {boolean} enable enable or disable event\n */\n// export default (sortableContainer: sortable, enable: boolean) => {\nvar enableHoverClass = (function (sortableContainer, enable) {\n if (typeof store(sortableContainer).getConfig('hoverClass') === 'string') {\n var hoverClasses_1 = store(sortableContainer).getConfig('hoverClass').split(' ');\n // add class on hover\n if (enable === true) {\n addEventListener(sortableContainer, 'mousemove', _throttle(function (event) {\n // check of no mouse button was pressed when mousemove started == no drag\n if (event.buttons === 0) {\n _filter(sortableContainer.children, store(sortableContainer).getConfig('items')).forEach(function (item) {\n var _a, _b;\n if (item !== event.target) {\n (_a = item.classList).remove.apply(_a, hoverClasses_1);\n }\n else {\n (_b = item.classList).add.apply(_b, hoverClasses_1);\n }\n });\n }\n }, store(sortableContainer).getConfig('throttleTime')));\n // remove class on leave\n addEventListener(sortableContainer, 'mouseleave', function () {\n _filter(sortableContainer.children, store(sortableContainer).getConfig('items')).forEach(function (item) {\n var _a;\n (_a = item.classList).remove.apply(_a, hoverClasses_1);\n });\n });\n // remove events\n }\n else {\n removeEventListener(sortableContainer, 'mousemove');\n removeEventListener(sortableContainer, 'mouseleave');\n }\n }\n});\n\n/* eslint-env browser */\n/*\n * variables global to the plugin\n */\nvar dragging;\nvar draggingHeight;\nvar draggingWidth;\n/*\n * Keeps track of the initialy selected list, where 'dragstart' event was triggered\n * It allows us to move the data in between individual Sortable List instances\n */\n// Origin List - data from before any item was changed\nvar originContainer;\nvar originIndex;\nvar originElementIndex;\nvar originItemsBeforeUpdate;\n// Previous Sortable Container - we dispatch as sortenter event when a\n// dragged item enters a sortableContainer for the first time\nvar previousContainer;\n// Destination List - data from before any item was changed\nvar destinationItemsBeforeUpdate;\n/**\n * remove event handlers from items\n * @param {Array|NodeList} items\n */\nvar _removeItemEvents = function (items) {\n removeEventListener(items, 'dragstart');\n removeEventListener(items, 'dragend');\n removeEventListener(items, 'dragover');\n removeEventListener(items, 'dragenter');\n removeEventListener(items, 'drop');\n removeEventListener(items, 'mouseenter');\n removeEventListener(items, 'mouseleave');\n};\n// Remove container events\nvar _removeContainerEvents = function (originContainer, previousContainer) {\n if (originContainer) {\n removeEventListener(originContainer, 'dragleave');\n }\n if (previousContainer && (previousContainer !== originContainer)) {\n removeEventListener(previousContainer, 'dragleave');\n }\n};\n/**\n * _getDragging returns the current element to drag or\n * a copy of the element.\n * Is Copy Active for sortable\n * @param {HTMLElement} draggedItem - the item that the user drags\n * @param {HTMLElement} sortable a single sortable\n */\nvar _getDragging = function (draggedItem, sortable) {\n var ditem = draggedItem;\n if (store(sortable).getConfig('copy') === true) {\n ditem = draggedItem.cloneNode(true);\n addAttribute(ditem, 'aria-copied', 'true');\n draggedItem.parentElement.appendChild(ditem);\n ditem.style.display = 'none';\n ditem.oldDisplay = draggedItem.style.display;\n }\n return ditem;\n};\n/**\n * Remove data from sortable\n * @param {HTMLElement} sortable a single sortable\n */\nvar _removeSortableData = function (sortable) {\n removeData(sortable);\n removeAttribute(sortable, 'aria-dropeffect');\n};\n/**\n * Remove data from items\n * @param {Array|HTMLElement} items\n */\nvar _removeItemData = function (items) {\n removeAttribute(items, 'aria-grabbed');\n removeAttribute(items, 'aria-copied');\n removeAttribute(items, 'draggable');\n removeAttribute(items, 'role');\n};\n/**\n * find sortable from element. travels up parent element until found or null.\n * @param {HTMLElement} element a single sortable\n * @param {Event} event - the current event. We need to pass it to be able to\n * find Sortable whith shadowRoot (document fragment has no parent)\n */\nfunction findSortable(element, event) {\n if (event.composedPath) {\n return event.composedPath().find(function (el) { return el.isSortable; });\n }\n while (element.isSortable !== true) {\n element = element.parentElement;\n }\n return element;\n}\n/**\n * Dragging event is on the sortable element. finds the top child that\n * contains the element.\n * @param {HTMLElement} sortableElement a single sortable\n * @param {HTMLElement} element is that being dragged\n */\nfunction findDragElement(sortableElement, element) {\n var options = addData(sortableElement, 'opts');\n var items = _filter(sortableElement.children, options.items);\n var itemlist = items.filter(function (ele) {\n return ele.contains(element) || (ele.shadowRoot && ele.shadowRoot.contains(element));\n });\n return itemlist.length > 0 ? itemlist[0] : element;\n}\n/**\n * Destroy the sortable\n * @param {HTMLElement} sortableElement a single sortable\n */\nvar _destroySortable = function (sortableElement) {\n var opts = addData(sortableElement, 'opts') || {};\n var items = _filter(sortableElement.children, opts.items);\n var handles = _getHandles(items, opts.handle);\n // remove event handlers & data from sortable\n removeEventListener(sortableElement, 'dragover');\n removeEventListener(sortableElement, 'dragenter');\n removeEventListener(sortableElement, 'dragstart');\n removeEventListener(sortableElement, 'dragend');\n removeEventListener(sortableElement, 'drop');\n // remove event data from sortable\n _removeSortableData(sortableElement);\n // remove event handlers & data from items\n removeEventListener(handles, 'mousedown');\n _removeItemEvents(items);\n _removeItemData(items);\n _removeContainerEvents(originContainer, previousContainer);\n // clear sortable flag\n sortableElement.isSortable = false;\n};\n/**\n * Enable the sortable\n * @param {HTMLElement} sortableElement a single sortable\n */\nvar _enableSortable = function (sortableElement) {\n var opts = addData(sortableElement, 'opts');\n var items = _filter(sortableElement.children, opts.items);\n var handles = _getHandles(items, opts.handle);\n addAttribute(sortableElement, 'aria-dropeffect', 'move');\n addData(sortableElement, '_disabled', 'false');\n addAttribute(handles, 'draggable', 'true');\n // @todo: remove this fix\n // IE FIX for ghost\n // can be disabled as it has the side effect that other events\n // (e.g. click) will be ignored\n if (opts.disableIEFix === false) {\n var spanEl = (document || window.document).createElement('span');\n if (typeof spanEl.dragDrop === 'function') {\n addEventListener(handles, 'mousedown', function () {\n if (items.indexOf(this) !== -1) {\n this.dragDrop();\n }\n else {\n var parent = this.parentElement;\n while (items.indexOf(parent) === -1) {\n parent = parent.parentElement;\n }\n parent.dragDrop();\n }\n });\n }\n }\n};\n/**\n * Disable the sortable\n * @param {HTMLElement} sortableElement a single sortable\n */\nvar _disableSortable = function (sortableElement) {\n var opts = addData(sortableElement, 'opts');\n var items = _filter(sortableElement.children, opts.items);\n var handles = _getHandles(items, opts.handle);\n addAttribute(sortableElement, 'aria-dropeffect', 'none');\n addData(sortableElement, '_disabled', 'true');\n addAttribute(handles, 'draggable', 'false');\n removeEventListener(handles, 'mousedown');\n};\n/**\n * Reload the sortable\n * @param {HTMLElement} sortableElement a single sortable\n * @description events need to be removed to not be double bound\n */\nvar _reloadSortable = function (sortableElement) {\n var opts = addData(sortableElement, 'opts');\n var items = _filter(sortableElement.children, opts.items);\n var handles = _getHandles(items, opts.handle);\n addData(sortableElement, '_disabled', 'false');\n // remove event handlers from items\n _removeItemEvents(items);\n _removeContainerEvents(originContainer, previousContainer);\n removeEventListener(handles, 'mousedown');\n // remove event handlers from sortable\n removeEventListener(sortableElement, 'dragover');\n removeEventListener(sortableElement, 'dragenter');\n removeEventListener(sortableElement, 'drop');\n};\n/**\n * Public sortable object\n * @param {Array|NodeList} sortableElements\n * @param {object|string} options|method\n */\nfunction sortable(sortableElements, options) {\n // get method string to see if a method is called\n var method = String(options);\n options = options || {};\n // check if the user provided a selector instead of an element\n if (typeof sortableElements === 'string') {\n sortableElements = document.querySelectorAll(sortableElements);\n }\n // if the user provided an element, return it in an array to keep the return value consistant\n if (sortableElements instanceof HTMLElement) {\n sortableElements = [sortableElements];\n }\n sortableElements = Array.prototype.slice.call(sortableElements);\n if (/serialize/.test(method)) {\n return sortableElements.map(function (sortableContainer) {\n var opts = addData(sortableContainer, 'opts');\n return _serialize(sortableContainer, opts.itemSerializer, opts.containerSerializer);\n });\n }\n sortableElements.forEach(function (sortableElement) {\n if (/enable|disable|destroy/.test(method)) {\n return sortable[method](sortableElement);\n }\n // log deprecation\n ['connectWith', 'disableIEFix'].forEach(function (configKey) {\n if (Object.prototype.hasOwnProperty.call(options, configKey) && options[configKey] !== null) {\n console.warn(\"HTML5Sortable: You are using the deprecated configuration \\\"\" + configKey + \"\\\". This will be removed in an upcoming version, make sure to migrate to the new options when updating.\");\n }\n });\n // merge options with default options\n options = Object.assign({}, defaultConfiguration, store(sortableElement).config, options);\n // init data store for sortable\n store(sortableElement).config = options;\n // set options on sortable\n addData(sortableElement, 'opts', options);\n // property to define as sortable\n sortableElement.isSortable = true;\n // reset sortable\n _reloadSortable(sortableElement);\n // initialize\n var listItems = _filter(sortableElement.children, options.items);\n // create element if user defined a placeholder element as a string\n var customPlaceholder;\n if (options.placeholder !== null && options.placeholder !== undefined) {\n var tempContainer = document.createElement(sortableElement.tagName);\n if (options.placeholder instanceof HTMLElement) {\n tempContainer.appendChild(options.placeholder);\n }\n else {\n tempContainer.innerHTML = options.placeholder;\n }\n customPlaceholder = tempContainer.children[0];\n }\n // add placeholder\n store(sortableElement).placeholder = _makePlaceholder(sortableElement, customPlaceholder, options.placeholderClass);\n addData(sortableElement, 'items', options.items);\n if (options.acceptFrom) {\n addData(sortableElement, 'acceptFrom', options.acceptFrom);\n }\n else if (options.connectWith) {\n addData(sortableElement, 'connectWith', options.connectWith);\n }\n _enableSortable(sortableElement);\n addAttribute(listItems, 'role', 'option');\n addAttribute(listItems, 'aria-grabbed', 'false');\n // enable hover class\n enableHoverClass(sortableElement, true);\n /*\n Handle drag events on draggable items\n Handle is set at the sortableElement level as it will bubble up\n from the item\n */\n addEventListener(sortableElement, 'dragstart', function (e) {\n // ignore dragstart events\n var target = getEventTarget(e);\n if (target.isSortable === true) {\n return;\n }\n e.stopImmediatePropagation();\n if ((options.handle && !target.matches(options.handle)) || target.getAttribute('draggable') === 'false') {\n return;\n }\n var sortableContainer = findSortable(target, e);\n var dragItem = findDragElement(sortableContainer, target);\n // grab values\n originItemsBeforeUpdate = _filter(sortableContainer.children, options.items);\n originIndex = originItemsBeforeUpdate.indexOf(dragItem);\n originElementIndex = _index(dragItem, sortableContainer.children);\n originContainer = sortableContainer;\n // add transparent clone or other ghost to cursor\n setDragImage(e, dragItem, options.customDragImage);\n // cache selsection & add attr for dragging\n draggingHeight = _getElementHeight(dragItem);\n draggingWidth = _getElementWidth(dragItem);\n dragItem.classList.add(options.draggingClass);\n dragging = _getDragging(dragItem, sortableContainer);\n addAttribute(dragging, 'aria-grabbed', 'true');\n // dispatch sortstart event on each element in group\n sortableContainer.dispatchEvent(new CustomEvent('sortstart', {\n detail: {\n origin: {\n elementIndex: originElementIndex,\n index: originIndex,\n container: originContainer\n },\n item: dragging,\n originalTarget: target\n }\n }));\n });\n /*\n We are capturing targetSortable before modifications with 'dragenter' event\n */\n addEventListener(sortableElement, 'dragenter', function (e) {\n var target = getEventTarget(e);\n var sortableContainer = findSortable(target, e);\n if (sortableContainer && sortableContainer !== previousContainer) {\n destinationItemsBeforeUpdate = _filter(sortableContainer.children, addData(sortableContainer, 'items'))\n .filter(function (item) { return item !== store(sortableElement).placeholder; });\n if (options.dropTargetContainerClass) {\n sortableContainer.classList.add(options.dropTargetContainerClass);\n }\n sortableContainer.dispatchEvent(new CustomEvent('sortenter', {\n detail: {\n origin: {\n elementIndex: originElementIndex,\n index: originIndex,\n container: originContainer\n },\n destination: {\n container: sortableContainer,\n itemsBeforeUpdate: destinationItemsBeforeUpdate\n },\n item: dragging,\n originalTarget: target\n }\n }));\n addEventListener(sortableContainer, 'dragleave', function (e) {\n // TODO: rename outTarget to be more self-explanatory\n // e.fromElement for very old browsers, similar to relatedTarget\n var outTarget = e.relatedTarget || e.fromElement;\n if (!e.currentTarget.contains(outTarget)) {\n if (options.dropTargetContainerClass) {\n sortableContainer.classList.remove(options.dropTargetContainerClass);\n }\n sortableContainer.dispatchEvent(new CustomEvent('sortleave', {\n detail: {\n origin: {\n elementIndex: originElementIndex,\n index: originIndex,\n container: sortableContainer\n },\n item: dragging,\n originalTarget: target\n }\n }));\n }\n });\n }\n previousContainer = sortableContainer;\n });\n /*\n * Dragend Event - https://developer.mozilla.org/en-US/docs/Web/Events/dragend\n * Fires each time dragEvent end, or ESC pressed\n * We are using it to clean up any draggable elements and placeholders\n */\n addEventListener(sortableElement, 'dragend', function (e) {\n if (!dragging) {\n return;\n }\n dragging.classList.remove(options.draggingClass);\n addAttribute(dragging, 'aria-grabbed', 'false');\n if (dragging.getAttribute('aria-copied') === 'true' && addData(dragging, 'dropped') !== 'true') {\n dragging.remove();\n }\n dragging.style.display = dragging.oldDisplay;\n delete dragging.oldDisplay;\n var visiblePlaceholder = Array.from(stores.values()).map(function (data) { return data.placeholder; })\n .filter(function (placeholder) { return placeholder instanceof HTMLElement; })\n .filter(isInDom)[0];\n if (visiblePlaceholder) {\n visiblePlaceholder.remove();\n }\n // dispatch sortstart event on each element in group\n sortableElement.dispatchEvent(new CustomEvent('sortstop', {\n detail: {\n origin: {\n elementIndex: originElementIndex,\n index: originIndex,\n container: originContainer\n },\n item: dragging\n }\n }));\n previousContainer = null;\n dragging = null;\n draggingHeight = null;\n draggingWidth = null;\n });\n /*\n * Drop Event - https://developer.mozilla.org/en-US/docs/Web/Events/drop\n * Fires when valid drop target area is hit\n */\n addEventListener(sortableElement, 'drop', function (e) {\n if (!_listsConnected(sortableElement, dragging.parentElement)) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n addData(dragging, 'dropped', 'true');\n // get the one placeholder that is currently visible\n var visiblePlaceholder = Array.from(stores.values()).map(function (data) {\n return data.placeholder;\n })\n // filter only HTMLElements\n .filter(function (placeholder) { return placeholder instanceof HTMLElement; })\n // filter only elements in DOM\n .filter(isInDom)[0];\n // attach element after placeholder\n insertAfter(visiblePlaceholder, dragging);\n // remove placeholder from dom\n visiblePlaceholder.remove();\n /*\n * Fires Custom Event - 'sortstop'\n */\n sortableElement.dispatchEvent(new CustomEvent('sortstop', {\n detail: {\n origin: {\n elementIndex: originElementIndex,\n index: originIndex,\n container: originContainer\n },\n item: dragging\n }\n }));\n var placeholder = store(sortableElement).placeholder;\n var originItems = _filter(originContainer.children, options.items)\n .filter(function (item) { return item !== placeholder; });\n var destinationContainer = this.isSortable === true ? this : this.parentElement;\n var destinationItems = _filter(destinationContainer.children, addData(destinationContainer, 'items'))\n .filter(function (item) { return item !== placeholder; });\n var destinationElementIndex = _index(dragging, Array.from(dragging.parentElement.children)\n .filter(function (item) { return item !== placeholder; }));\n var destinationIndex = _index(dragging, destinationItems);\n if (options.dropTargetContainerClass) {\n destinationContainer.classList.remove(options.dropTargetContainerClass);\n }\n /*\n * When a list item changed container lists or index within a list\n * Fires Custom Event - 'sortupdate'\n */\n if (originElementIndex !== destinationElementIndex || originContainer !== destinationContainer) {\n sortableElement.dispatchEvent(new CustomEvent('sortupdate', {\n detail: {\n origin: {\n elementIndex: originElementIndex,\n index: originIndex,\n container: originContainer,\n itemsBeforeUpdate: originItemsBeforeUpdate,\n items: originItems\n },\n destination: {\n index: destinationIndex,\n elementIndex: destinationElementIndex,\n container: destinationContainer,\n itemsBeforeUpdate: destinationItemsBeforeUpdate,\n items: destinationItems\n },\n item: dragging\n }\n }));\n }\n });\n var debouncedDragOverEnter = _debounce(function (sortableElement, element, pageX, pageY) {\n if (!dragging) {\n return;\n }\n // set placeholder height if forcePlaceholderSize option is set\n if (options.forcePlaceholderSize) {\n store(sortableElement).placeholder.style.height = draggingHeight + 'px';\n store(sortableElement).placeholder.style.width = draggingWidth + 'px';\n }\n // if element the draggedItem is dragged onto is within the array of all elements in list\n // (not only items, but also disabled, etc.)\n if (Array.from(sortableElement.children).indexOf(element) > -1) {\n var thisHeight = _getElementHeight(element);\n var thisWidth = _getElementWidth(element);\n var placeholderIndex = _index(store(sortableElement).placeholder, element.parentElement.children);\n var thisIndex = _index(element, element.parentElement.children);\n // Check if `element` is bigger than the draggable. If it is, we have to define a dead zone to prevent flickering\n if (thisHeight > draggingHeight || thisWidth > draggingWidth) {\n // Dead zone?\n var deadZoneVertical = thisHeight - draggingHeight;\n var deadZoneHorizontal = thisWidth - draggingWidth;\n var offsetTop = _offset(element).top;\n var offsetLeft = _offset(element).left;\n if (placeholderIndex < thisIndex &&\n ((options.orientation === 'vertical' && pageY < offsetTop) ||\n (options.orientation === 'horizontal' && pageX < offsetLeft))) {\n return;\n }\n if (placeholderIndex > thisIndex &&\n ((options.orientation === 'vertical' && pageY > offsetTop + thisHeight - deadZoneVertical) ||\n (options.orientation === 'horizontal' && pageX > offsetLeft + thisWidth - deadZoneHorizontal))) {\n return;\n }\n }\n if (dragging.oldDisplay === undefined) {\n dragging.oldDisplay = dragging.style.display;\n }\n if (dragging.style.display !== 'none') {\n dragging.style.display = 'none';\n }\n // To avoid flicker, determine where to position the placeholder\n // based on where the mouse pointer is relative to the elements\n // vertical center.\n var placeAfter = false;\n try {\n var elementMiddleVertical = _offset(element).top + element.offsetHeight / 2;\n var elementMiddleHorizontal = _offset(element).left + element.offsetWidth / 2;\n placeAfter = (options.orientation === 'vertical' && (pageY >= elementMiddleVertical)) ||\n (options.orientation === 'horizontal' && (pageX >= elementMiddleHorizontal));\n }\n catch (e) {\n placeAfter = placeholderIndex < thisIndex;\n }\n if (placeAfter) {\n insertAfter(element, store(sortableElement).placeholder);\n }\n else {\n insertBefore(element, store(sortableElement).placeholder);\n }\n // get placeholders from all stores & remove all but current one\n Array.from(stores.values())\n // remove empty values\n .filter(function (data) { return data.placeholder !== undefined; })\n // foreach placeholder in array if outside of current sorableContainer -> remove from DOM\n .forEach(function (data) {\n if (data.placeholder !== store(sortableElement).placeholder) {\n data.placeholder.remove();\n }\n });\n }\n else {\n // get all placeholders from store\n var placeholders = Array.from(stores.values())\n .filter(function (data) { return data.placeholder !== undefined; })\n .map(function (data) {\n return data.placeholder;\n });\n // check if element is not in placeholders\n if (placeholders.indexOf(element) === -1 && sortableElement === element && !_filter(element.children, options.items).length) {\n placeholders.forEach(function (element) { return element.remove(); });\n element.appendChild(store(sortableElement).placeholder);\n }\n }\n }, options.debounce);\n // Handle dragover and dragenter events on draggable items\n var onDragOverEnter = function (e) {\n var element = e.target;\n var sortableElement = element.isSortable === true ? element : findSortable(element, e);\n element = findDragElement(sortableElement, element);\n if (!dragging || !_listsConnected(sortableElement, dragging.parentElement) || addData(sortableElement, '_disabled') === 'true') {\n return;\n }\n var options = addData(sortableElement, 'opts');\n if (parseInt(options.maxItems) && _filter(sortableElement.children, addData(sortableElement, 'items')).length >= parseInt(options.maxItems) && dragging.parentElement !== sortableElement) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n e.dataTransfer.dropEffect = store(sortableElement).getConfig('copy') === true ? 'copy' : 'move';\n debouncedDragOverEnter(sortableElement, element, e.pageX, e.pageY);\n };\n addEventListener(listItems.concat(sortableElement), 'dragover', onDragOverEnter);\n addEventListener(listItems.concat(sortableElement), 'dragenter', onDragOverEnter);\n });\n return sortableElements;\n}\nsortable.destroy = function (sortableElement) {\n _destroySortable(sortableElement);\n};\nsortable.enable = function (sortableElement) {\n _enableSortable(sortableElement);\n};\nsortable.disable = function (sortableElement) {\n _disableSortable(sortableElement);\n};\n/* START.TESTS_ONLY */\nsortable.__testing = {\n // add internal methods here for testing purposes\n _data: addData,\n _removeItemEvents: _removeItemEvents,\n _removeItemData: _removeItemData,\n _removeSortableData: _removeSortableData,\n _removeContainerEvents: _removeContainerEvents\n};\n\nexport default sortable;\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/icon'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/extractText'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/ItemList'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/withAttr'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Button'];","import app from 'flarum/admin/app';\nimport icon from 'flarum/common/helpers/icon';\nimport extractText from 'flarum/common/utils/extractText';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport withAttr from 'flarum/common/utils/withAttr';\nimport Button from 'flarum/common/components/Button';\n\n/* global m, dayjs */\n\nexport default class PolicyEdit {\n oninit(vnode) {\n this.policy = vnode.attrs.policy;\n this.dirty = false;\n this.processing = false;\n this.toggleFields = false;\n\n if (this.policy === null) {\n this.initNewField();\n }\n }\n\n initNewField() {\n this.policy = app.store.createRecord('fof-terms-policies', {\n attributes: {\n name: '',\n url: '',\n update_message: '',\n terms_updated_at: '',\n },\n });\n }\n\n boxTitle() {\n if (this.policy.exists) {\n return this.policy.name();\n }\n\n return app.translator.trans('fof-terms.admin.buttons.new-policy');\n }\n\n view() {\n return m('.FoF-Terms-Policiy-Box', [\n this.policy.exists ? m('span.fas.fa-arrows-alt.FoF-Terms-Policiy-Box--handle.js-policy-handle') : null,\n m(\n '.Button.Button--block.FoF-Terms-Policiy-Header',\n {\n onclick: () => {\n this.toggleFields = !this.toggleFields;\n },\n },\n [\n m('.FoF-Terms-Policiy-Header-Title', this.boxTitle()),\n m('div', [\n this.policy.exists ? [app.translator.trans('fof-terms.admin.buttons.edit-policy'), ' '] : null,\n icon(this.toggleFields ? 'fas fa-chevron-up' : 'fas fa-chevron-down'),\n ]),\n ]\n ),\n this.toggleFields ? this.viewFields() : null,\n ]);\n }\n\n viewFields() {\n return m(\n 'form.FoF-Terms-Policiy-Body',\n {\n onsubmit: this.savePolicy.bind(this),\n },\n [\n this.fields().toArray(),\n m('.ButtonGroup', [\n Button.component(\n {\n type: 'submit',\n className: 'Button Button--primary',\n loading: this.processing,\n disabled: !this.readyToSave(),\n },\n app.translator.trans('fof-terms.admin.buttons.' + (this.policy.exists ? 'save' : 'add') + '-policy')\n ),\n this.policy.exists\n ? Button.component(\n {\n type: 'submit',\n className: 'Button Button--danger',\n loading: this.processing,\n onclick: this.deletePolicy.bind(this),\n },\n app.translator.trans('fof-terms.admin.buttons.delete-policy')\n )\n : '',\n ]),\n ]\n );\n }\n\n fields() {\n const fields = new ItemList();\n\n fields.add(\n 'name',\n m('.Form-group', [\n m('label', app.translator.trans('fof-terms.admin.policies.name')),\n m('input.FormControl', {\n type: 'text',\n value: this.policy.name(),\n oninput: withAttr('value', this.updateAttribute.bind(this, 'name')),\n }),\n m('.helpText', app.translator.trans('fof-terms.admin.policies.name-help')),\n ]),\n 100\n );\n\n fields.add(\n 'url',\n m('.Form-group', [\n m('label', app.translator.trans('fof-terms.admin.policies.url')),\n m('input.FormControl', {\n type: 'url',\n value: this.policy.url(),\n oninput: withAttr('value', this.updateAttribute.bind(this, 'url')),\n }),\n m('.helpText', app.translator.trans('fof-terms.admin.policies.url-help')),\n ]),\n 95\n );\n\n fields.add(\n 'update-message',\n m('.Form-group', [\n m('label', app.translator.trans('fof-terms.admin.policies.update-message')),\n m('textarea.FormControl', {\n value: this.policy.update_message(),\n oninput: withAttr('value', this.updateAttribute.bind(this, 'update_message')),\n }),\n m('.helpText', app.translator.trans('fof-terms.admin.policies.update-message-help')),\n ]),\n 90\n );\n\n fields.add(\n 'terms-updated-at',\n m('.Form-group', [\n m('label', app.translator.trans('fof-terms.admin.policies.terms-updated-at')),\n m('.FoF-Terms-Input-Group', [\n m('input.FormControl', {\n type: 'text',\n value: this.policy.terms_updated_at(),\n oninput: withAttr('value', this.updateAttribute.bind(this, 'terms_updated_at')),\n placeholder: app.translator.trans('fof-terms.admin.policies.terms-updated-at-placeholder'),\n }),\n Button.component(\n {\n className: 'Button Button--primary',\n onclick: () => {\n // We set the milliseconds to zero because it might otherwise give the impression\n // that we store them, when in fact the date will be stored in a MySQL TIMESTAMP column\n this.updateAttribute('terms_updated_at', dayjs().millisecond(0).toISOString());\n },\n },\n app.translator.trans('fof-terms.admin.buttons.set-to-now')\n ),\n ]),\n m('.helpText', app.translator.trans('fof-terms.admin.policies.terms-updated-at-help')),\n ]),\n 85\n );\n\n if (this.policy.exists) {\n fields.add(\n 'export-url',\n m('.Form-group', [\n m('label', app.translator.trans('fof-terms.admin.policies.export-url')),\n m(\n '.ButtonGroup',\n ['json', 'csv'].map((format) =>\n m(\n 'a.Button.FoF-Terms-Export-Button',\n {\n href: app.forum.attribute('apiUrl') + '/fof/terms/policies/' + this.policy.id() + '/export.' + format,\n target: '_blank',\n },\n format.toUpperCase()\n )\n )\n ),\n m(\n '.helpText',\n app.translator.trans('fof-terms.admin.policies.export-url-help', {\n a: m('a', {\n href: 'https://github.com/FriendsOfFlarum/terms/wiki/Export-url',\n target: '_blank',\n }),\n })\n ),\n ]),\n 80\n );\n }\n\n return fields;\n }\n\n updateAttribute(attribute, value) {\n this.policy.pushAttributes({\n [attribute]: value,\n });\n\n this.dirty = true;\n }\n\n readyToSave() {\n return this.dirty;\n }\n\n savePolicy(event) {\n event.preventDefault();\n\n this.processing = true;\n\n const createNewRecord = !this.policy.exists;\n\n this.policy\n .save(this.policy.data.attributes)\n .then(() => {\n if (createNewRecord) {\n this.initNewField();\n this.toggleFields = false;\n }\n\n this.processing = false;\n this.dirty = false;\n\n m.redraw();\n })\n .catch((err) => {\n this.processing = false;\n\n throw err;\n });\n }\n\n deletePolicy() {\n if (\n !confirm(\n extractText(\n app.translator.trans('fof-terms.admin.messages.delete-policy-confirmation', {\n name: this.policy.name(),\n })\n )\n )\n ) {\n return;\n }\n\n this.processing = true;\n\n this.policy\n .delete()\n .then(() => {\n this.processing = false;\n\n m.redraw();\n })\n .catch((err) => {\n this.processing = false;\n\n throw err;\n });\n }\n}\n","export default function (items, attr = 'sort') {\n return items.sort((a, b) => a[attr]() - b[attr]());\n}\n","import sortable from 'html5sortable/dist/html5sortable.es.js';\n\nimport app from 'flarum/admin/app';\nimport PolicyEdit from './PolicyEdit';\nimport sortByAttribute from '../../common/helpers/sortByAttribute';\n\n/* global m */\n\nexport default class PolicyList {\n oninit() {\n app\n .request({\n method: 'GET',\n url: app.forum.attribute('apiUrl') + '/fof/terms/policies',\n })\n .then((result) => {\n app.store.pushPayload(result);\n\n m.redraw();\n });\n }\n\n oncreate(vnode) {\n this.initsortable(vnode);\n }\n\n onupdate(vnode) {\n // We could do this without re-creating the sortable on every redraw, but the current system works well\n // \"If it ain't broken, don't fix it\"\n this.initsortable(vnode);\n }\n\n initsortable(vnode) {\n sortable(vnode.dom.querySelector('.js-policies-container'), {\n handle: '.js-policy-handle',\n })[0].addEventListener('sortupdate', () => {\n const sorting = [].map.call(vnode.dom.querySelectorAll('.js-policy-data'), (element) => element.dataset.id);\n\n this.updateSort(sorting);\n });\n }\n\n view() {\n const policies = app.store.all('fof-terms-policies');\n\n let fieldsList = [];\n\n sortByAttribute(policies).forEach((policy) => {\n // Build array of fields to show.\n fieldsList.push(\n m(\n '.js-policy-data',\n {\n key: policy.id(),\n 'data-id': policy.id(),\n },\n m(PolicyEdit, {\n policy,\n })\n )\n );\n });\n\n return m('div', [\n m('h2', app.translator.trans('fof-terms.admin.titles.policies')),\n m('.FoF-Terms-Policies-Container', [\n m('.js-policies-container', fieldsList),\n m(PolicyEdit, {\n policy: null,\n }),\n ]),\n ]);\n }\n\n updateSort(sorting) {\n app\n .request({\n method: 'POST',\n url: app.forum.attribute('apiUrl') + '/fof/terms/policies/order',\n body: {\n sort: sorting,\n },\n })\n .then((result) => {\n // Update sort attributes\n app.store.pushPayload(result);\n\n m.redraw();\n });\n }\n}\n","import app from 'flarum/admin/app';\nimport ExtensionPage from 'flarum/admin/components/ExtensionPage';\nimport Switch from 'flarum/common/components/Switch';\nimport PolicyList from './PolicyList';\n\nconst settingsPrefix = 'fof-terms.';\nconst translationPrefix = 'fof-terms.admin.settings.';\n\n/* global m */\n\nexport default class TermsSettingsPage extends ExtensionPage {\n content() {\n return m('.ExtensionPage-settings', [\n m('.container', [\n m('.Form-group', [\n m('label', app.translator.trans(translationPrefix + 'field.signup-legal-text')),\n m('textarea.FormControl', {\n bidi: this.setting(settingsPrefix + 'signup-legal-text'),\n }),\n ]),\n m('.Form-group', [\n m(\n 'label',\n Switch.component(\n {\n state: this.setting(settingsPrefix + 'hide-updated-at')() > 0,\n onchange: this.setting(settingsPrefix + 'hide-updated-at'),\n },\n app.translator.trans(translationPrefix + 'field.hide-updated-at')\n )\n ),\n ]),\n m('.Form-group', [\n m('label', app.translator.trans(translationPrefix + 'field.date-format')),\n m('input[type=text].FormControl', {\n bidi: this.setting(settingsPrefix + 'date-format'),\n placeholder: 'YYYY-MM-DD',\n }),\n m(\n '.helpText',\n app.translator.trans(translationPrefix + 'field.date-format-help', {\n a: m('a', {\n href: 'https://day.js.org/docs/en/display/format',\n target: '_blank',\n }),\n })\n ),\n ]),\n this.submitButton(),\n m(PolicyList),\n ]),\n ]);\n }\n}\n","import PolicyEdit from './PolicyEdit';\nimport PolicyList from './PolicyList';\nimport TermsSettingsPage from './TermsSettingsPage';\n\nexport const components = {\n PolicyEdit,\n PolicyList,\n TermsSettingsPage,\n};\n","import Policy from './Policy';\n\nexport const models = {\n Policy,\n};\n","import sortByAttribute from './sortByAttribute';\n\nexport const helpers = {\n sortByAttribute,\n};\n","import app from 'flarum/admin/app';\nimport Policy from '../common/models/Policy';\nimport TermsSettingsPage from './components/TermsSettingsPage';\n\nexport * from './components';\nexport * from '../common/models';\nexport * from '../common/helpers';\n\napp.initializers.add('fof-terms', () => {\n app.store.models['fof-terms-policies'] = Policy;\n\n app.extensionData\n .for('fof-terms')\n .registerPermission(\n {\n icon: 'fas fa-paperclip',\n label: app.translator.trans('fof-terms.admin.permissions.see-user-policies-state'),\n permission: 'fof-terms.see-user-policies-state',\n },\n 'moderate'\n )\n .registerPermission(\n {\n icon: 'fas fa-paperclip',\n label: app.translator.trans('fof-terms.admin.permissions.postpone-policies-accept'),\n permission: 'fof-terms.postpone-policies-accept',\n },\n 'moderate'\n )\n .registerPermission(\n {\n icon: 'fas fa-paperclip',\n label: app.translator.trans('fof-terms.admin.permissions.export-policies'),\n permission: 'fof-terms.export-policies',\n },\n 'moderate'\n )\n .registerPage(TermsSettingsPage);\n});\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","flarum","core","compat","_setPrototypeOf","p","setPrototypeOf","bind","__proto__","_inheritsLoose","subClass","superClass","create","constructor","Policy","_Model","_this","_len","arguments","length","args","Array","_key","apply","concat","sort","Model","name","url","update_message","terms_updated_at","form_key","computed","id","apiEndpoint","this","exists","data","addData","element","undefined","h5s","_filter","nodes","selector","NodeList","HTMLCollection","Error","from","filter","item","nodeType","matches","stores","Map","Store","_config","_placeholder","_data","config","forEach","set","mergedConfig","assign","entries","configurable","setConfig","has","getConfig","placeholder","HTMLElement","setData","getData","deleteData","store","sortableElement","addEventListener","eventName","callback","i","removeEventListener","addAttribute","attribute","setAttribute","removeAttribute","dragging","draggingHeight","draggingWidth","originContainer","originIndex","originElementIndex","originItemsBeforeUpdate","previousContainer","destinationItemsBeforeUpdate","_offset","parentElement","getClientRects","rect","left","window","pageXOffset","right","top","pageYOffset","bottom","_index","elementList","indexOf","isInDom","parentNode","insertNode","referenceNode","newElement","position","insertBefore","nextElementSibling","insertAfter","target","_getElementHeight","style","getComputedStyle","getPropertyValue","parseInt","map","int","isNaN","reduce","sum","_getElementWidth","_getHandles","items","querySelector","shadowRoot","getEventTarget","event","composedPath","defaultDragImage","draggedElement","elementOffset","posX","pageX","posY","pageY","_listsConnected","destination","origin","isSortable","acceptFrom","split","sel","defaultConfiguration","connectWith","disableIEFix","copy","placeholderClass","draggingClass","hoverClass","dropTargetContainerClass","debounce","throttleTime","maxItems","itemSerializer","containerSerializer","customDragImage","orientation","_removeItemEvents","_removeContainerEvents","_removeSortableData","sortable","_removeItemData","findSortable","find","el","findDragElement","options","itemlist","children","ele","contains","_enableSortable","opts","handles","handle","document","createElement","dragDrop","parent","sortableElements","method","String","querySelectorAll","slice","test","sortableContainer","customItemSerializer","customContainerSerializer","serializedItem","serializedContainer","serializedItems","node","html","outerHTML","index","container","itemCount","_serialize","configKey","console","warn","_reloadSortable","customPlaceholder","listItems","tempContainer","tagName","appendChild","innerHTML","_a","includes","classList","add","_makePlaceholder","enable","hoverClasses_1","fn","threshold","lastEventTimestamp","_i","now","Date","_throttle","buttons","_b","remove","enableHoverClass","e","stopImmediatePropagation","getAttribute","dragItem","Event","dataTransfer","setDragImage","dragImage","effectAllowed","draggedItem","ditem","cloneNode","display","oldDisplay","_getDragging","dispatchEvent","CustomEvent","detail","elementIndex","originalTarget","itemsBeforeUpdate","outTarget","relatedTarget","fromElement","currentTarget","visiblePlaceholder","values","preventDefault","stopPropagation","originItems","destinationContainer","destinationItems","destinationElementIndex","destinationIndex","func","wait","timeout","debouncedDragOverEnter","forcePlaceholderSize","height","width","thisHeight","thisWidth","placeholderIndex","thisIndex","deadZoneVertical","deadZoneHorizontal","offsetTop","offsetLeft","placeAfter","elementMiddleVertical","offsetHeight","elementMiddleHorizontal","offsetWidth","placeholders","clearTimeout","setTimeout","onDragOverEnter","dropEffect","destroy","_destroySortable","disable","_disableSortable","__testing","PolicyEdit","_proto","oninit","vnode","policy","attrs","dirty","processing","toggleFields","initNewField","app","createRecord","attributes","boxTitle","trans","view","m","onclick","icon","viewFields","onsubmit","savePolicy","fields","toArray","Button","type","className","loading","disabled","readyToSave","deletePolicy","_this2","ItemList","oninput","withAttr","updateAttribute","dayjs","millisecond","toISOString","format","href","toUpperCase","_this$policy$pushAttr","pushAttributes","_this3","createNewRecord","save","then","redraw","err","_this4","confirm","extractText","attr","b","PolicyList","result","pushPayload","oncreate","initsortable","onupdate","dom","sorting","dataset","updateSort","policies","all","fieldsList","sortByAttribute","push","body","settingsPrefix","translationPrefix","TermsSettingsPage","_ExtensionPage","content","bidi","setting","Switch","state","onchange","submitButton","ExtensionPage","components","models","helpers","registerPermission","label","permission","registerPage"],"sourceRoot":""} \ No newline at end of file diff --git a/js/dist/forum.js b/js/dist/forum.js index 6f2cf4b..0342779 100644 --- a/js/dist/forum.js +++ b/js/dist/forum.js @@ -1,2 +1,2 @@ -(()=>{var t={n:o=>{var e=o&&o.__esModule?()=>o.default:()=>o;return t.d(e,{a:e}),e},d:(o,e)=>{for(var r in e)t.o(e,r)&&!t.o(o,r)&&Object.defineProperty(o,r,{enumerable:!0,get:e[r]})},o:(t,o)=>Object.prototype.hasOwnProperty.call(t,o),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},o={};(()=>{"use strict";t.r(o),t.d(o,{components:()=>K,helpers:()=>R,models:()=>Q});const e=flarum.core.compat["forum/app"];var r=t.n(e);const n=flarum.core.compat["common/Model"];var a=t.n(n);const s=flarum.core.compat["common/models/User"];var c=t.n(s);function i(t,o){return i=Object.setPrototypeOf||function(t,o){return t.__proto__=o,t},i(t,o)}function u(t,o){t.prototype=Object.create(o.prototype),t.prototype.constructor=t,i(t,o)}const f=flarum.core.compat["common/utils/computed"];var l=t.n(f),p=function(t){function o(){for(var o,e=arguments.length,r=new Array(e),n=0;n1?o-1:0),r=1;r{var t={n:o=>{var e=o&&o.__esModule?()=>o.default:()=>o;return t.d(e,{a:e}),e},d:(o,e)=>{for(var r in e)t.o(e,r)&&!t.o(o,r)&&Object.defineProperty(o,r,{enumerable:!0,get:e[r]})},o:(t,o)=>Object.prototype.hasOwnProperty.call(t,o),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},o={};(()=>{"use strict";t.r(o),t.d(o,{components:()=>K,helpers:()=>R,models:()=>Q});const e=flarum.core.compat["forum/app"];var r=t.n(e);const n=flarum.core.compat["common/Model"];var a=t.n(n);const s=flarum.core.compat["common/models/User"];var c=t.n(s);function i(t,o){return i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,o){return t.__proto__=o,t},i(t,o)}function f(t,o){t.prototype=Object.create(o.prototype),t.prototype.constructor=t,i(t,o)}const u=flarum.core.compat["common/utils/computed"];var l=t.n(u),p=function(t){function o(){for(var o,e=arguments.length,r=new Array(e),n=0;n1?o-1:0),r=1;r {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (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 = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/app'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/Model'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/models/User'];","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/computed'];","import Model from 'flarum/common/Model';\nimport computed from 'flarum/common/utils/computed';\n\nexport default class Policy extends Model {\n sort = Model.attribute('sort');\n name = Model.attribute('name');\n url = Model.attribute('url');\n update_message = Model.attribute('update_message');\n terms_updated_at = Model.attribute('terms_updated_at');\n form_key = computed('id', (id) => 'fof_terms_policy_' + id);\n\n apiEndpoint() {\n return '/fof/terms/policies' + (this.exists ? '/' + this.data.id : '');\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extend'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Page'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/IndexPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Modal'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Button'];","export default function (items, attr = 'sort') {\n return items.sort((a, b) => a[attr]() - b[attr]());\n}\n","import app from 'flarum/forum/app';\nimport Modal from 'flarum/common/components/Modal';\nimport Button from 'flarum/common/components/Button';\nimport sortByAttribute from '../../common/helpers/sortByAttribute';\n\n/* global m, dayjs */\n\nexport default class AcceptPoliciesModal extends Modal {\n oninit(vnode) {\n super.oninit(vnode);\n\n app.store.all('fof-terms-policies').forEach((policy) => {\n this[policy.form_key()] = false;\n });\n }\n\n title() {\n return app.translator.trans('fof-terms.forum.accept-modal.title');\n }\n\n content() {\n return m('.Modal-body', this.body());\n }\n\n body() {\n const policies = sortByAttribute(\n app.store.all('fof-terms-policies').filter((policy) => {\n const state = app.session.user.fofTermsPoliciesState()[policy.id()];\n\n return !state || state.has_update;\n })\n );\n\n if (policies.length === 0) {\n return Button.component(\n {\n className: 'Button',\n onclick() {\n app.modal.close();\n },\n },\n app.translator.trans('fof-terms.forum.accept-modal.close')\n );\n }\n\n return policies.map((policy) =>\n m('div', [\n m('h2', policy.name()),\n app.forum.attribute('fof-terms.hide-updated-at')\n ? null\n : m(\n 'p',\n policy.terms_updated_at()\n ? app.translator.trans('fof-terms.forum.accept-modal.updated-at', {\n date: dayjs(policy.terms_updated_at()).format(app.forum.attribute('fof-terms.date-format')),\n })\n : app.translator.trans('fof-terms.forum.accept-modal.updated-recently')\n ),\n policy.update_message() ? m('p', policy.update_message()) : null,\n m(\n '.Form-group',\n m(\n '.FoF-Terms-Check.FoF-Terms-Check--login',\n m('label.checkbox', [\n m('input', {\n type: 'checkbox',\n checked: this[policy.form_key()],\n onchange: () => {\n this[policy.form_key()] = !this[policy.form_key()];\n },\n }),\n app.translator.trans('fof-terms.forum.accept-modal.i-accept', {\n policy: policy.name(),\n a: policy.url()\n ? m('a', {\n href: policy.url(),\n target: '_blank',\n })\n : m('span'),\n }),\n ])\n )\n ),\n Button.component(\n {\n className: 'Button Button--primary',\n disabled: !this[policy.form_key()],\n onclick: () => {\n // We need to save the \"must accept\" property before performing the request\n // Because an updated user serializer will be returned\n const hadToAcceptToInteract = app.session.user.fofTermsPoliciesMustAccept();\n\n app\n .request({\n url: app.forum.attribute('apiUrl') + policy.apiEndpoint() + '/accept',\n method: 'POST',\n errorHandler: this.onerror.bind(this),\n })\n .then((updated) => {\n app.store.pushPayload(updated);\n\n // If this was the last policy to accept, close the modal\n if (policies.length === 1) {\n if (hadToAcceptToInteract) {\n // If the user was previously not allowed to interact with the forum,\n // we refresh to get updated permissions in the frontend\n window.location.reload();\n } else {\n app.modal.close();\n }\n }\n\n m.redraw();\n });\n },\n },\n app.translator.trans('fof-terms.forum.accept-modal.accept')\n ),\n ])\n );\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/SignUpModal'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/IndexPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/DiscussionPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/UserPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/listItems'];","import app from 'flarum/forum/app';\nimport Button from 'flarum/common/components/Button';\nimport listItems from 'flarum/common/helpers/listItems';\nimport AcceptPoliciesModal from './AcceptPoliciesModal';\n\n/* global m */\n\nlet temporarilyHidden = false;\n\n/**\n * Renders similarly to Flarum's Alert, but with an additional .container inside\n */\nexport default class UpdateAlert {\n shouldShowAlert() {\n if (temporarilyHidden) {\n return false;\n }\n\n const user = app.session.user;\n\n return user && user.fofTermsPoliciesHasUpdate();\n }\n\n view() {\n if (!this.shouldShowAlert()) {\n return m('div');\n }\n\n const controls = [\n Button.component(\n {\n className: 'Button Button--link',\n onclick: () => {\n app.modal.show(AcceptPoliciesModal);\n },\n },\n app.translator.trans('fof-terms.forum.update-alert.review')\n ),\n ];\n\n const dismissControl = [];\n\n if (!app.session.user.fofTermsPoliciesMustAccept()) {\n dismissControl.push(\n Button.component({\n icon: 'fas fa-times',\n className: 'Button Button--link Button--icon Alert-dismiss',\n onclick: () => {\n temporarilyHidden = true;\n },\n })\n );\n }\n\n return m(\n '.Alert.Alert-info',\n m('.container', [\n m(\n 'span.Alert-body',\n app.session.user.fofTermsPoliciesMustAccept()\n ? app.translator.trans('fof-terms.forum.update-alert.must-accept-message')\n : app.translator.trans('fof-terms.forum.update-alert.can-accept-message')\n ),\n m('ul.Alert-controls', listItems(controls.concat(dismissControl))),\n ])\n );\n }\n}\n","import { override } from 'flarum/common/extend';\nimport IndexPage from 'flarum/forum/components/IndexPage';\nimport DiscussionPage from 'flarum/forum/components/DiscussionPage';\nimport UserPage from 'flarum/forum/components/UserPage';\nimport UpdateAlert from './components/UpdateAlert';\n\n/* global m */\n\n// This single method will be used to inject the alert into existing components\n// If the view is already an array, we add our content at the start\n// If it isn't an array we wrap the content into a new array\nfunction addAlertToContent(original, ...originalArgs) {\n const existing = original(...originalArgs);\n const additional = m(UpdateAlert);\n\n // if the existing content is an array, add to it\n // This should only happen with the hero() override as other extensions might return an array there\n if (Array.isArray(existing)) {\n existing.unshift(additional);\n\n return existing;\n }\n\n // Otherwise return a new list of elements\n // Use a container div otherwise when extending view() this will prevent the config() method from running\n // as the Component class won't be able to bind config() to an array\n // We could also add to vnode.children but this could cause weird styling if another extension or custom styles\n // change the look of the base page content by targeting the original view root element based on its class\n // By using a new outer container we make sure the alert always stays full width and unaffected by the page view under it\n return m('div', [additional, existing]);\n}\n\nexport default function () {\n // There's no single place we can inject the banner\n // So we use a few different points so it's visible on most pages\n override(IndexPage.prototype, 'hero', addAlertToContent);\n override(DiscussionPage.prototype, 'view', addAlertToContent);\n\n // Covers user profile and settings\n override(UserPage.prototype, 'view', addAlertToContent);\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/utils/UserControls'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/humanTime'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/LoadingIndicator'];","import app from 'flarum/forum/app';\nimport humanTime from 'flarum/common/helpers/humanTime';\nimport Modal from 'flarum/common/components/Modal';\nimport sortByAttribute from '../../common/helpers/sortByAttribute';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\n\n/* global m */\n\nexport default class UserPoliciesStateModal extends Modal {\n user = null;\n loading = false;\n\n oninit(vnode) {\n super.oninit(vnode);\n\n if (this.attrs.user.fofTermsPoliciesState() === undefined) {\n this.loading = true;\n app.store.find('users', this.attrs.user.id()).then((user) => {\n this.user = user;\n this.loading = false;\n m.redraw();\n });\n } else {\n this.user = this.attrs.user;\n }\n }\n\n title() {\n return app.translator.trans('fof-terms.forum.state-modal.title', {\n username: this.attrs.user.username(),\n });\n }\n\n content() {\n if (this.loading) {\n return (\n
\n \n
\n );\n }\n\n return m(\n '.Modal-body',\n m(\n 'ul',\n sortByAttribute(app.store.all('fof-terms-policies')).map((policy) => {\n const state = this.user.fofTermsPoliciesState()[policy.id()];\n\n return m('li', [\n policy.name() + ': ',\n state && state.accepted_at\n ? app.translator.trans('fof-terms.forum.state-modal.accepted-at', {\n date: humanTime(state.accepted_at),\n })\n : app.translator.trans('fof-terms.forum.state-modal.not-accepted'),\n ]);\n })\n )\n );\n }\n}\n","import AcceptPoliciesModal from './AcceptPoliciesModal';\nimport UpdateAlert from './UpdateAlert';\nimport UserPoliciesStateModal from './UserPoliciesStateModal';\n\nexport const components = {\n AcceptPoliciesModal,\n UpdateAlert,\n UserPoliciesStateModal,\n};\n","import Policy from './Policy';\n\nexport const models = {\n Policy,\n};\n","import sortByAttribute from './sortByAttribute';\n\nexport const helpers = {\n sortByAttribute,\n};\n","import app from 'flarum/forum/app';\nimport Model from 'flarum/common/Model';\nimport User from 'flarum/common/models/User';\nimport Policy from '../common/models/Policy';\nimport addAcceptModal from './addAcceptModal';\nimport addFieldsToRegister from './addFieldsToRegister';\nimport addUpdateAlert from './addUpdateAlert';\nimport addUserPoliciesStateControl from './addUserPoliciesStateControl';\n\nexport * from './components';\nexport * from '../common/models';\nexport * from '../common/helpers';\n\napp.initializers.add('fof-terms', () => {\n app.store.models['fof-terms-policies'] = Policy;\n\n User.prototype.fofTermsPoliciesState = Model.attribute('fofTermsPoliciesState');\n User.prototype.fofTermsPoliciesHasUpdate = Model.attribute('fofTermsPoliciesHasUpdate');\n User.prototype.fofTermsPoliciesMustAccept = Model.attribute('fofTermsPoliciesMustAccept');\n User.prototype.seeFoFTermsPoliciesState = Model.attribute('seeFoFTermsPoliciesState');\n\n addAcceptModal();\n addFieldsToRegister();\n addUpdateAlert();\n addUserPoliciesStateControl();\n});\n","import app from 'flarum/forum/app';\nimport { extend } from 'flarum/common/extend';\nimport Page from 'flarum/common/components/Page';\nimport IndexPage from 'flarum/common/components/IndexPage';\nimport AcceptPoliciesModal from './components/AcceptPoliciesModal';\n\nexport default function () {\n let initialized = false;\n\n extend(Page.prototype, 'oninit', function () {\n if (initialized) {\n return;\n }\n\n // We only show the modal if the first page loaded was the index page\n // And that new updates are available\n // And that the user *must* accept them\n if (app.current.matches(IndexPage)) {\n const user = app.session.user;\n\n if (user && user.fofTermsPoliciesMustAccept()) {\n // Timeout is necessary because there is a redraw error otherwise\n setTimeout(() => {\n app.modal.show(AcceptPoliciesModal);\n }, 0);\n }\n }\n\n initialized = true;\n });\n}\n","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport SignUpModal from 'flarum/forum/components/SignUpModal';\nimport sortByAttribute from '../common/helpers/sortByAttribute';\n\n/* global m */\n\nexport default function () {\n extend(SignUpModal.prototype, 'oninit', function () {\n this.fofTermsPolicies = sortByAttribute(app.store.all('fof-terms-policies'));\n\n this.fofTermsPolicies.forEach((policy) => {\n this[policy.form_key()] = false;\n });\n });\n\n extend(SignUpModal.prototype, 'fields', function (fields) {\n const legalText = app.forum.attribute('fof-terms.signup-legal-text');\n\n if (legalText) {\n fields.add('fof-terms-legal-text', m('.Form-group', m('.FoF-Terms-SignUp-Legal.Alert', legalText)));\n }\n\n this.fofTermsPolicies.forEach((policy) => {\n fields.add(\n 'fof-terms-policy-' + policy.id(),\n m(\n '.Form-group',\n m(\n '.FoF-Terms-Check.FoF-Terms-Check--signup',\n m('label.checkbox', [\n m('input', {\n type: 'checkbox',\n checked: this[policy.form_key()],\n onchange: () => {\n this[policy.form_key()] = !this[policy.form_key()];\n },\n disabled: this.loading,\n }),\n app.translator.trans('fof-terms.forum.signup.i-accept', {\n policy: policy.name(),\n a: policy.url()\n ? m('a', {\n href: policy.url(),\n target: '_blank',\n })\n : m('span'),\n }),\n ])\n )\n )\n );\n });\n });\n\n extend(SignUpModal.prototype, 'submitData', function (data) {\n this.fofTermsPolicies.forEach((policy) => {\n data[policy.form_key()] = this[policy.form_key()];\n });\n });\n}\n","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport UserControls from 'flarum/forum/utils/UserControls';\nimport Button from 'flarum/common/components/Button';\nimport UserPoliciesStateModal from './components/UserPoliciesStateModal';\n\nexport default function () {\n extend(UserControls, 'moderationControls', (items, user) => {\n if (app.forum.attribute('fof-terms.canSeeUserPoliciesState')) {\n items.add(\n 'fof-terms.state',\n Button.component(\n {\n icon: 'fas fa-paperclip',\n onclick() {\n app.modal.show(UserPoliciesStateModal, { user });\n },\n },\n app.translator.trans('fof-terms.forum.user_controls.state_button')\n )\n );\n }\n });\n}\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","flarum","core","compat","_setPrototypeOf","p","setPrototypeOf","__proto__","_inheritsLoose","subClass","superClass","create","constructor","Policy","_Model","_this","_len","arguments","length","args","Array","_key","apply","concat","sort","Model","name","url","update_message","terms_updated_at","form_key","computed","id","apiEndpoint","this","exists","data","items","attr","b","AcceptPoliciesModal","_Modal","_proto","oninit","vnode","app","forEach","policy","title","content","m","body","_this2","policies","sortByAttribute","filter","state","has_update","Button","className","onclick","map","date","dayjs","format","type","checked","onchange","href","target","disabled","hadToAcceptToInteract","method","errorHandler","onerror","bind","then","updated","window","location","reload","redraw","Modal","temporarilyHidden","UpdateAlert","shouldShowAlert","user","fofTermsPoliciesHasUpdate","view","controls","dismissControl","push","icon","listItems","addAlertToContent","original","originalArgs","existing","additional","isArray","unshift","UserPoliciesStateModal","loading","undefined","attrs","fofTermsPoliciesState","username","_this3","LoadingIndicator","accepted_at","humanTime","components","models","helpers","initialized","User","extend","Page","IndexPage","fofTermsPoliciesMustAccept","setTimeout","SignUpModal","fofTermsPolicies","fields","legalText","add","override","DiscussionPage","UserPage","UserControls"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"forum.js","mappings":"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","sources":["webpack://@fof/terms/webpack/bootstrap","webpack://@fof/terms/webpack/runtime/compat get default export","webpack://@fof/terms/webpack/runtime/define property getters","webpack://@fof/terms/webpack/runtime/hasOwnProperty shorthand","webpack://@fof/terms/webpack/runtime/make namespace object","webpack://@fof/terms/external root \"flarum.core.compat['forum/app']\"","webpack://@fof/terms/external root \"flarum.core.compat['common/Model']\"","webpack://@fof/terms/external root \"flarum.core.compat['common/models/User']\"","webpack://@fof/terms/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://@fof/terms/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@fof/terms/external root \"flarum.core.compat['common/utils/computed']\"","webpack://@fof/terms/./src/common/models/Policy.js","webpack://@fof/terms/external root \"flarum.core.compat['common/extend']\"","webpack://@fof/terms/external root \"flarum.core.compat['common/components/Page']\"","webpack://@fof/terms/external root \"flarum.core.compat['common/components/IndexPage']\"","webpack://@fof/terms/external root \"flarum.core.compat['common/components/Modal']\"","webpack://@fof/terms/external root \"flarum.core.compat['common/components/Button']\"","webpack://@fof/terms/./src/common/helpers/sortByAttribute.js","webpack://@fof/terms/./src/forum/components/AcceptPoliciesModal.js","webpack://@fof/terms/external root \"flarum.core.compat['forum/components/SignUpModal']\"","webpack://@fof/terms/external root \"flarum.core.compat['forum/components/IndexPage']\"","webpack://@fof/terms/external root \"flarum.core.compat['forum/components/DiscussionPage']\"","webpack://@fof/terms/external root \"flarum.core.compat['forum/components/UserPage']\"","webpack://@fof/terms/external root \"flarum.core.compat['common/helpers/listItems']\"","webpack://@fof/terms/./src/forum/components/UpdateAlert.js","webpack://@fof/terms/./src/forum/addUpdateAlert.js","webpack://@fof/terms/external root \"flarum.core.compat['forum/utils/UserControls']\"","webpack://@fof/terms/external root \"flarum.core.compat['common/helpers/humanTime']\"","webpack://@fof/terms/external root \"flarum.core.compat['common/components/LoadingIndicator']\"","webpack://@fof/terms/./src/forum/components/UserPoliciesStateModal.js","webpack://@fof/terms/./src/forum/components/index.js","webpack://@fof/terms/./src/common/models/index.js","webpack://@fof/terms/./src/common/helpers/index.js","webpack://@fof/terms/./src/forum/index.js","webpack://@fof/terms/./src/forum/addAcceptModal.js","webpack://@fof/terms/./src/forum/addFieldsToRegister.js","webpack://@fof/terms/./src/forum/addUserPoliciesStateControl.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (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 = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/app'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/Model'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/models/User'];","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/computed'];","import Model from 'flarum/common/Model';\nimport computed from 'flarum/common/utils/computed';\n\nexport default class Policy extends Model {\n sort = Model.attribute('sort');\n name = Model.attribute('name');\n url = Model.attribute('url');\n update_message = Model.attribute('update_message');\n terms_updated_at = Model.attribute('terms_updated_at');\n form_key = computed('id', (id) => 'fof_terms_policy_' + id);\n\n apiEndpoint() {\n return '/fof/terms/policies' + (this.exists ? '/' + this.data.id : '');\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extend'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Page'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/IndexPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Modal'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Button'];","export default function (items, attr = 'sort') {\n return items.sort((a, b) => a[attr]() - b[attr]());\n}\n","import app from 'flarum/forum/app';\nimport Modal from 'flarum/common/components/Modal';\nimport Button from 'flarum/common/components/Button';\nimport sortByAttribute from '../../common/helpers/sortByAttribute';\n\n/* global m, dayjs */\n\nexport default class AcceptPoliciesModal extends Modal {\n oninit(vnode) {\n super.oninit(vnode);\n\n app.store.all('fof-terms-policies').forEach((policy) => {\n this[policy.form_key()] = false;\n });\n }\n\n title() {\n return app.translator.trans('fof-terms.forum.accept-modal.title');\n }\n\n content() {\n return m('.Modal-body', this.body());\n }\n\n body() {\n const policies = sortByAttribute(\n app.store.all('fof-terms-policies').filter((policy) => {\n const state = app.session.user.fofTermsPoliciesState()[policy.id()];\n\n return !state || state.has_update;\n })\n );\n\n if (policies.length === 0) {\n return Button.component(\n {\n className: 'Button',\n onclick() {\n app.modal.close();\n },\n },\n app.translator.trans('fof-terms.forum.accept-modal.close')\n );\n }\n\n return policies.map((policy) =>\n m('div', [\n m('h2', policy.name()),\n app.forum.attribute('fof-terms.hide-updated-at')\n ? null\n : m(\n 'p',\n policy.terms_updated_at()\n ? app.translator.trans('fof-terms.forum.accept-modal.updated-at', {\n date: dayjs(policy.terms_updated_at()).format(app.forum.attribute('fof-terms.date-format')),\n })\n : app.translator.trans('fof-terms.forum.accept-modal.updated-recently')\n ),\n policy.update_message() ? m('p', policy.update_message()) : null,\n m(\n '.Form-group',\n m(\n '.FoF-Terms-Check.FoF-Terms-Check--login',\n m('label.checkbox', [\n m('input', {\n type: 'checkbox',\n checked: this[policy.form_key()],\n onchange: () => {\n this[policy.form_key()] = !this[policy.form_key()];\n },\n }),\n app.translator.trans('fof-terms.forum.accept-modal.i-accept', {\n policy: policy.name(),\n a: policy.url()\n ? m('a', {\n href: policy.url(),\n target: '_blank',\n })\n : m('span'),\n }),\n ])\n )\n ),\n Button.component(\n {\n className: 'Button Button--primary',\n disabled: !this[policy.form_key()],\n onclick: () => {\n // We need to save the \"must accept\" property before performing the request\n // Because an updated user serializer will be returned\n const hadToAcceptToInteract = app.session.user.fofTermsPoliciesMustAccept();\n\n app\n .request({\n url: app.forum.attribute('apiUrl') + policy.apiEndpoint() + '/accept',\n method: 'POST',\n errorHandler: this.onerror.bind(this),\n })\n .then((updated) => {\n app.store.pushPayload(updated);\n\n // If this was the last policy to accept, close the modal\n if (policies.length === 1) {\n if (hadToAcceptToInteract) {\n // If the user was previously not allowed to interact with the forum,\n // we refresh to get updated permissions in the frontend\n window.location.reload();\n } else {\n app.modal.close();\n }\n }\n\n m.redraw();\n });\n },\n },\n app.translator.trans('fof-terms.forum.accept-modal.accept')\n ),\n ])\n );\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/SignUpModal'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/IndexPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/DiscussionPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/UserPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/listItems'];","import app from 'flarum/forum/app';\nimport Button from 'flarum/common/components/Button';\nimport listItems from 'flarum/common/helpers/listItems';\nimport AcceptPoliciesModal from './AcceptPoliciesModal';\n\n/* global m */\n\nlet temporarilyHidden = false;\n\n/**\n * Renders similarly to Flarum's Alert, but with an additional .container inside\n */\nexport default class UpdateAlert {\n shouldShowAlert() {\n if (temporarilyHidden) {\n return false;\n }\n\n const user = app.session.user;\n\n return user && user.fofTermsPoliciesHasUpdate();\n }\n\n view() {\n if (!this.shouldShowAlert()) {\n return m('div');\n }\n\n const controls = [\n Button.component(\n {\n className: 'Button Button--link',\n onclick: () => {\n app.modal.show(AcceptPoliciesModal);\n },\n },\n app.translator.trans('fof-terms.forum.update-alert.review')\n ),\n ];\n\n const dismissControl = [];\n\n if (!app.session.user.fofTermsPoliciesMustAccept()) {\n dismissControl.push(\n Button.component({\n icon: 'fas fa-times',\n className: 'Button Button--link Button--icon Alert-dismiss',\n onclick: () => {\n temporarilyHidden = true;\n },\n })\n );\n }\n\n return m(\n '.Alert.Alert-info',\n m('.container', [\n m(\n 'span.Alert-body',\n app.session.user.fofTermsPoliciesMustAccept()\n ? app.translator.trans('fof-terms.forum.update-alert.must-accept-message')\n : app.translator.trans('fof-terms.forum.update-alert.can-accept-message')\n ),\n m('ul.Alert-controls', listItems(controls.concat(dismissControl))),\n ])\n );\n }\n}\n","import { override } from 'flarum/common/extend';\nimport IndexPage from 'flarum/forum/components/IndexPage';\nimport DiscussionPage from 'flarum/forum/components/DiscussionPage';\nimport UserPage from 'flarum/forum/components/UserPage';\nimport UpdateAlert from './components/UpdateAlert';\n\n/* global m */\n\n// This single method will be used to inject the alert into existing components\n// If the view is already an array, we add our content at the start\n// If it isn't an array we wrap the content into a new array\nfunction addAlertToContent(original, ...originalArgs) {\n const existing = original(...originalArgs);\n const additional = m(UpdateAlert);\n\n // if the existing content is an array, add to it\n // This should only happen with the hero() override as other extensions might return an array there\n if (Array.isArray(existing)) {\n existing.unshift(additional);\n\n return existing;\n }\n\n // Otherwise return a new list of elements\n // Use a container div otherwise when extending view() this will prevent the config() method from running\n // as the Component class won't be able to bind config() to an array\n // We could also add to vnode.children but this could cause weird styling if another extension or custom styles\n // change the look of the base page content by targeting the original view root element based on its class\n // By using a new outer container we make sure the alert always stays full width and unaffected by the page view under it\n return m('div', [additional, existing]);\n}\n\nexport default function () {\n // There's no single place we can inject the banner\n // So we use a few different points so it's visible on most pages\n override(IndexPage.prototype, 'hero', addAlertToContent);\n override(DiscussionPage.prototype, 'view', addAlertToContent);\n\n // Covers user profile and settings\n override(UserPage.prototype, 'view', addAlertToContent);\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/utils/UserControls'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/humanTime'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/LoadingIndicator'];","import app from 'flarum/forum/app';\nimport humanTime from 'flarum/common/helpers/humanTime';\nimport Modal from 'flarum/common/components/Modal';\nimport sortByAttribute from '../../common/helpers/sortByAttribute';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\n\n/* global m */\n\nexport default class UserPoliciesStateModal extends Modal {\n user = null;\n loading = false;\n\n oninit(vnode) {\n super.oninit(vnode);\n\n if (this.attrs.user.fofTermsPoliciesState() === undefined) {\n this.loading = true;\n app.store.find('users', this.attrs.user.id()).then((user) => {\n this.user = user;\n this.loading = false;\n m.redraw();\n });\n } else {\n this.user = this.attrs.user;\n }\n }\n\n title() {\n return app.translator.trans('fof-terms.forum.state-modal.title', {\n username: this.attrs.user.username(),\n });\n }\n\n content() {\n if (this.loading) {\n return (\n
\n \n
\n );\n }\n\n return m(\n '.Modal-body',\n m(\n 'ul',\n sortByAttribute(app.store.all('fof-terms-policies')).map((policy) => {\n const state = this.user.fofTermsPoliciesState()[policy.id()];\n\n return m('li', [\n policy.name() + ': ',\n state && state.accepted_at\n ? app.translator.trans('fof-terms.forum.state-modal.accepted-at', {\n date: humanTime(state.accepted_at),\n })\n : app.translator.trans('fof-terms.forum.state-modal.not-accepted'),\n ]);\n })\n )\n );\n }\n}\n","import AcceptPoliciesModal from './AcceptPoliciesModal';\nimport UpdateAlert from './UpdateAlert';\nimport UserPoliciesStateModal from './UserPoliciesStateModal';\n\nexport const components = {\n AcceptPoliciesModal,\n UpdateAlert,\n UserPoliciesStateModal,\n};\n","import Policy from './Policy';\n\nexport const models = {\n Policy,\n};\n","import sortByAttribute from './sortByAttribute';\n\nexport const helpers = {\n sortByAttribute,\n};\n","import app from 'flarum/forum/app';\nimport Model from 'flarum/common/Model';\nimport User from 'flarum/common/models/User';\nimport Policy from '../common/models/Policy';\nimport addAcceptModal from './addAcceptModal';\nimport addFieldsToRegister from './addFieldsToRegister';\nimport addUpdateAlert from './addUpdateAlert';\nimport addUserPoliciesStateControl from './addUserPoliciesStateControl';\n\nexport * from './components';\nexport * from '../common/models';\nexport * from '../common/helpers';\n\napp.initializers.add('fof-terms', () => {\n app.store.models['fof-terms-policies'] = Policy;\n\n User.prototype.fofTermsPoliciesState = Model.attribute('fofTermsPoliciesState');\n User.prototype.fofTermsPoliciesHasUpdate = Model.attribute('fofTermsPoliciesHasUpdate');\n User.prototype.fofTermsPoliciesMustAccept = Model.attribute('fofTermsPoliciesMustAccept');\n User.prototype.seeFoFTermsPoliciesState = Model.attribute('seeFoFTermsPoliciesState');\n\n addAcceptModal();\n addFieldsToRegister();\n addUpdateAlert();\n addUserPoliciesStateControl();\n});\n","import app from 'flarum/forum/app';\nimport { extend } from 'flarum/common/extend';\nimport Page from 'flarum/common/components/Page';\nimport IndexPage from 'flarum/common/components/IndexPage';\nimport AcceptPoliciesModal from './components/AcceptPoliciesModal';\n\nexport default function () {\n let initialized = false;\n\n extend(Page.prototype, 'oninit', function () {\n if (initialized) {\n return;\n }\n\n // We only show the modal if the first page loaded was the index page\n // And that new updates are available\n // And that the user *must* accept them\n if (app.current.matches(IndexPage)) {\n const user = app.session.user;\n\n if (user && user.fofTermsPoliciesMustAccept()) {\n // Timeout is necessary because there is a redraw error otherwise\n setTimeout(() => {\n app.modal.show(AcceptPoliciesModal);\n }, 0);\n }\n }\n\n initialized = true;\n });\n}\n","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport SignUpModal from 'flarum/forum/components/SignUpModal';\nimport sortByAttribute from '../common/helpers/sortByAttribute';\n\n/* global m */\n\nexport default function () {\n extend(SignUpModal.prototype, 'oninit', function () {\n this.fofTermsPolicies = sortByAttribute(app.store.all('fof-terms-policies'));\n\n this.fofTermsPolicies.forEach((policy) => {\n this[policy.form_key()] = false;\n });\n });\n\n extend(SignUpModal.prototype, 'fields', function (fields) {\n const legalText = app.forum.attribute('fof-terms.signup-legal-text');\n\n if (legalText) {\n fields.add('fof-terms-legal-text', m('.Form-group', m('.FoF-Terms-SignUp-Legal.Alert', legalText)));\n }\n\n this.fofTermsPolicies.forEach((policy) => {\n fields.add(\n 'fof-terms-policy-' + policy.id(),\n m(\n '.Form-group',\n m(\n '.FoF-Terms-Check.FoF-Terms-Check--signup',\n m('label.checkbox', [\n m('input', {\n type: 'checkbox',\n checked: this[policy.form_key()],\n onchange: () => {\n this[policy.form_key()] = !this[policy.form_key()];\n },\n disabled: this.loading,\n }),\n app.translator.trans('fof-terms.forum.signup.i-accept', {\n policy: policy.name(),\n a: policy.url()\n ? m('a', {\n href: policy.url(),\n target: '_blank',\n })\n : m('span'),\n }),\n ])\n )\n )\n );\n });\n });\n\n extend(SignUpModal.prototype, 'submitData', function (data) {\n this.fofTermsPolicies.forEach((policy) => {\n data[policy.form_key()] = this[policy.form_key()];\n });\n });\n}\n","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport UserControls from 'flarum/forum/utils/UserControls';\nimport Button from 'flarum/common/components/Button';\nimport UserPoliciesStateModal from './components/UserPoliciesStateModal';\n\nexport default function () {\n extend(UserControls, 'moderationControls', (items, user) => {\n if (app.forum.attribute('fof-terms.canSeeUserPoliciesState')) {\n items.add(\n 'fof-terms.state',\n Button.component(\n {\n icon: 'fas fa-paperclip',\n onclick() {\n app.modal.show(UserPoliciesStateModal, { user });\n },\n },\n app.translator.trans('fof-terms.forum.user_controls.state_button')\n )\n );\n }\n });\n}\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","flarum","core","compat","_setPrototypeOf","p","setPrototypeOf","bind","__proto__","_inheritsLoose","subClass","superClass","create","constructor","Policy","_Model","_this","_len","arguments","length","args","Array","_key","apply","concat","sort","Model","name","url","update_message","terms_updated_at","form_key","computed","id","apiEndpoint","this","exists","data","items","attr","b","AcceptPoliciesModal","_Modal","_proto","oninit","vnode","app","all","forEach","policy","title","trans","content","m","body","_this2","policies","sortByAttribute","filter","state","user","fofTermsPoliciesState","has_update","Button","className","onclick","close","map","attribute","date","dayjs","format","type","checked","onchange","href","target","disabled","hadToAcceptToInteract","fofTermsPoliciesMustAccept","method","errorHandler","onerror","then","updated","pushPayload","window","location","reload","redraw","Modal","temporarilyHidden","UpdateAlert","shouldShowAlert","fofTermsPoliciesHasUpdate","view","controls","show","dismissControl","push","icon","listItems","addAlertToContent","original","originalArgs","existing","additional","isArray","unshift","UserPoliciesStateModal","loading","undefined","attrs","find","username","_this3","LoadingIndicator","accepted_at","humanTime","components","models","helpers","add","initialized","User","seeFoFTermsPoliciesState","extend","Page","matches","IndexPage","setTimeout","SignUpModal","fofTermsPolicies","fields","legalText","override","DiscussionPage","UserPage","UserControls"],"sourceRoot":""} \ No newline at end of file