diff --git a/extensions/likes/js/dist/forum.js b/extensions/likes/js/dist/forum.js index 0526e5bdd..ced91923b 100644 --- a/extensions/likes/js/dist/forum.js +++ b/extensions/likes/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 n in e)t.o(e,n)&&!t.o(o,n)&&Object.defineProperty(o,n,{enumerable:!0,get:e[n]})},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,{extend:()=>H});const e=flarum.core.compat["common/extend"],n=flarum.core.compat["forum/app"];var r=t.n(n);const s=flarum.core.compat["forum/components/NotificationGrid"];var a=t.n(s);const i=flarum.core.compat["common/components/Button"];var u=t.n(i);const c=flarum.core.compat["forum/components/CommentPost"];var l=t.n(c);const f=flarum.core.compat["common/components/Link"];var p=t.n(f);const d=flarum.core.compat["common/helpers/punctuateSeries"];var k=t.n(d);const h=flarum.core.compat["common/helpers/username"];var v=t.n(h);const y=flarum.core.compat["common/helpers/icon"];var b=t.n(y);function _(t,o){return _=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,o){return t.__proto__=o,t},_(t,o)}function g(t,o){t.prototype=Object.create(o.prototype),t.prototype.constructor=t,_(t,o)}const P=flarum.core.compat["common/components/Modal"];var x=t.n(P);const L=flarum.core.compat["common/helpers/avatar"];var M=t.n(L),O=function(t){function o(){return t.apply(this,arguments)||this}g(o,t);var e=o.prototype;return e.className=function(){return"PostLikesModal Modal--small"},e.title=function(){return r().translator.trans("flarum-likes.forum.post_likes.title")},e.content=function(){return m("div",{className:"Modal-body"},m("ul",{className:"PostLikesModal-list"},this.attrs.post.likes().map((function(t){return m("li",null,m(p(),{href:r().route.user(t)},M()(t)," ",v()(t)))}))))},o}(x());const j=flarum.core.compat["forum/components/Notification"];var N=t.n(j);const B=flarum.core.compat["common/utils/string"];var S=function(t){function o(){return t.apply(this,arguments)||this}g(o,t);var e=o.prototype;return e.icon=function(){return"far fa-thumbs-up"},e.href=function(){return r().route.post(this.attrs.notification.subject())},e.content=function(){var t=this.attrs.notification.fromUser();return r().translator.trans("flarum-likes.forum.notifications.post_liked_text",{user:t,count:1})},e.excerpt=function(){return(0,B.truncate)(this.attrs.notification.subject().contentPlain(),200)},o}(N());const w=flarum.core.compat["forum/components/UserPage"];var I=t.n(w);const T=flarum.core.compat["common/components/LinkButton"];var U=t.n(T);const C=flarum.core.compat["common/extenders"];var R=t.n(C);const z=flarum.core.compat["common/models/Post"];var A=t.n(z);const D=flarum.core.compat["forum/components/PostsUserPage"];var G=function(t){function o(){return t.apply(this,arguments)||this}return g(o,t),o.prototype.loadResults=function(t){return r().store.find("posts",{filter:{type:"comment",likedBy:this.user.id()},page:{offset:t,limit:this.loadLimit},sort:"-createdAt"})},o}(t.n(D)());const H=[(new(R().Routes)).add("user.likes","/u/:username/likes",G),new(R().Model)(A()).hasMany("likes").attribute("canLike")];r().initializers.add("flarum-likes",(function(){r().notificationComponents.postLiked=S,(0,e.extend)(l().prototype,"actionItems",(function(t){var o=this.attrs.post;if(!o.isHidden()&&o.canLike()){var e=o.likes(),n=r().session.user&&e&&e.some((function(t){return t===r().session.user}));t.add("like",u().component({className:"Button Button--link",onclick:function(){n=!n,o.save({isLiked:n});var t=o.data.relationships.likes.data;t.some((function(o,e){if(o.id===r().session.user.id())return t.splice(e,1),!0})),n&&t.unshift({type:"users",id:r().session.user.id()})}},r().translator.trans(n?"flarum-likes.forum.post.unlike_link":"flarum-likes.forum.post.like_link")))}})),(0,e.extend)(l().prototype,"footerItems",(function(t){var o=this.attrs.post,e=o.likes();if(e&&e.length){var n=e.length>4,s=e.sort((function(t){return t===r().session.user?-1:1})).slice(0,n?3:4).map((function(t){return m(p(),{href:r().route.user(t)},t===r().session.user?r().translator.trans("flarum-likes.forum.post.you_text"):v()(t))}));if(n){var a=e.length-s.length;s.push(m("a",{href:"#",onclick:function(t){t.preventDefault(),r().modal.show(O,{post:o})}},r().translator.trans("flarum-likes.forum.post.others_link",{count:a})))}t.add("liked",m("div",{className:"Post-likedBy"},b()("far fa-thumbs-up"),r().translator.trans("flarum-likes.forum.post.liked_by"+(e[0]===r().session.user?"_self":"")+"_text",{count:s.length,users:k()(s)})))}})),(0,e.extend)(I().prototype,"navItems",(function(t){var o=this.user;t.add("likes",m(U(),{href:r().route("user.likes",{username:null==o?void 0:o.slug()}),icon:"far fa-thumbs-up"},r().translator.trans("flarum-likes.forum.user.likes_link")),88)})),(0,e.extend)(a().prototype,"notificationTypes",(function(t){t.add("postLiked",{name:"postLiked",icon:"far fa-thumbs-up",label:r().translator.trans("flarum-likes.forum.settings.notify_post_liked_label")})}))}))})(),module.exports=o})(); +(()=>{var t={n:e=>{var n=e&&e.__esModule?()=>e.default:()=>e;return t.d(n,{a:n}),n},d:(e,n)=>{for(var r in n)t.o(n,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:n[r]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};(()=>{"use strict";t.r(e),t.d(e,{extend:()=>nt});const n=flarum.core.compat["common/extend"],r=flarum.core.compat["forum/app"];var i=t.n(r);const o=flarum.core.compat["forum/components/NotificationGrid"];var a=t.n(o);const s=flarum.core.compat["common/components/Button"];var u=t.n(s);const l=flarum.core.compat["forum/components/CommentPost"];var c=t.n(l);const f=flarum.core.compat["common/components/Link"];var p=t.n(f);const d=flarum.core.compat["common/helpers/punctuateSeries"];var h=t.n(d);const g=flarum.core.compat["common/helpers/username"];var v=t.n(g);const b=flarum.core.compat["common/helpers/icon"];var y=t.n(b);function k(t,e){return k=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},k(t,e)}function N(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,k(t,e)}const P=flarum.core.compat["common/components/Modal"];var x=t.n(P);const L=flarum.core.compat["common/helpers/avatar"];var _=t.n(L);function j(){return j=Object.assign?Object.assign.bind():function(t){for(var e=1;ethis.getNextPageNumber()-1?this.pages.push(o):this.pages.unshift(o),this.location={page:r},m.redraw()},e.loadPage=function(t){void 0===t&&(t=1);var e=this.requestParams(),n=Array.isArray(e.include)?e.include.join(","):e.include,r=j({},e,{page:j({},e.page,{offset:this.pageSize*(t-1)}),include:n});return A.store.find(this.type,r)},e.requestParams=function(){return this.params},e.refreshParams=function(t,e){return this.isEmpty()||this.paramsChanged(t)?(this.params=t,this.refresh(e)):Promise.resolve()},e.refresh=function(t){var e=this;return void 0===t&&(t=1),this.initialLoading=!0,this.loadingPrev=!1,this.loadingNext=!1,this.clear(),this.location={page:t},this.loadPage().then((function(t){e.pages=[],e.parseResults(e.location.page,t)})).finally((function(){return e.initialLoading=!1}))},e.getPages=function(){return this.pages},e.getLocation=function(){return this.location},e.isLoading=function(){return this.initialLoading||this.loadingNext||this.loadingPrev},e.isInitialLoading=function(){return this.initialLoading},e.isLoadingPrev=function(){return this.loadingPrev},e.isLoadingNext=function(){return this.loadingNext},e.hasItems=function(){return!!this.getAllItems().length},e.isEmpty=function(){return!this.isInitialLoading()&&!this.hasItems()},e.hasPrev=function(){var t;return!(null==(t=this.pages[0])||!t.hasPrev)},e.hasNext=function(){var t;return!(null==(t=this.pages[this.pages.length-1])||!t.hasNext)},e.getParams=function(){return this.params},e.getNextPageNumber=function(){var t,e=null==(t=this.pages[this.pages.length-1])?void 0:t.number;return e&&!isNaN(e)?e+1:this.location.page},e.getPrevPageNumber=function(){var t,e=null==(t=this.pages[0])?void 0:t.number;return e&&!isNaN(e)?Math.max(e-1,1):this.location.page},e.paramsChanged=function(t){var e=this;return Object.keys(t).some((function(n){return e.getParams()[n]!==t[n]}))},e.getAllItems=function(){return this.getPages().map((function(t){return t.items})).flat()},t}());function I(t,e){if(null==t)return{};var n,r,i={},o=Object.keys(t);for(r=0;r=0||(i[n]=t[n]);return i}var S=function(){function t(){this.element=void 0,this.attrs=void 0,this.state=void 0}var e=t.prototype;return e.oninit=function(t){this.setAttrs(t.attrs)},e.oncreate=function(t){this.element=t.dom},e.onbeforeupdate=function(t){this.setAttrs(t.attrs)},e.onupdate=function(t){},e.onbeforeremove=function(t){},e.onremove=function(t){},e.$=function(t){function e(e){return t.apply(this,arguments)}return e.toString=function(){return t.toString()},e}((function(t){var e=$(this.element);return t?e.find(t):e})),t.component=function(t,e){void 0===t&&(t={}),void 0===e&&(e=null);var n=j({},t);return m(this,n,e)},e.setAttrs=function(t){if(void 0===t&&(t={}),this.constructor.initAttrs(t),t){if("children"in t)throw new Error("["+this.constructor.name+'] The "children" attribute of attrs should never be used. Either pass children in as the vnode children or rename the attribute');if("tag"in t)throw new Error("["+this.constructor.name+'] You cannot use the "tag" attribute name with Mithril 2.')}this.attrs=t},t.initAttrs=function(t){},t}();function M(t){var e,n,r="";if("string"==typeof t||"number"==typeof t)r+=t;else if("object"==typeof t)if(Array.isArray(t))for(e=0;e4,o=n.sort((function(t){return t===i().session.user?-1:1})).slice(0,r?3:4).map((function(t){return m(p(),{href:i().route.user(t)},t===i().session.user?i().translator.trans("flarum-likes.forum.post.you_text"):v()(t))}));if(r){var a=e.likesCount()-o.length,s=i().translator.trans("flarum-likes.forum.post.others_link",{count:a});i().forum.attribute("canSearchUsers")?o.push(m(F,{className:"Button Button--ua-reset Button--text",onclick:function(t){t.preventDefault(),i().modal.show(U,{post:e})}},s)):o.push(m("span",null,s))}t.add("liked",m("div",{className:"Post-likedBy"},y()("far fa-thumbs-up"),i().translator.trans("flarum-likes.forum.post.liked_by"+(n[0]===i().session.user?"_self":"")+"_text",{count:o.length,users:h()(o)})))}})),(0,n.extend)(Y().prototype,"navItems",(function(t){var e=this.user;t.add("likes",m(K(),{href:i().route("user.likes",{username:null==e?void 0:e.slug()}),icon:"far fa-thumbs-up"},i().translator.trans("flarum-likes.forum.user.likes_link")),88)})),(0,n.extend)(a().prototype,"notificationTypes",(function(t){t.add("postLiked",{name:"postLiked",icon:"far fa-thumbs-up",label:i().translator.trans("flarum-likes.forum.settings.notify_post_liked_label")})}))}))})(),module.exports=e})(); //# sourceMappingURL=forum.js.map \ No newline at end of file diff --git a/extensions/likes/js/dist/forum.js.map b/extensions/likes/js/dist/forum.js.map index cb56b278e..611dbb17b 100644 --- a/extensions/likes/js/dist/forum.js.map +++ b/extensions/likes/js/dist/forum.js.map @@ -1 +1 @@ -{"version":3,"file":"forum.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,qDCL9D,MAAM,EAA+BC,OAAOC,KAAKC,OAAO,iBCAlD,EAA+BF,OAAOC,KAAKC,OAAO,a,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,qC,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,4B,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,gC,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,0B,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,kC,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,2B,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,uB,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,2B,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,yB,aCMnCW,EAAc,uFAuBhC,OAvBgC,EACjCC,UAAA,WACE,MAAO,6BACT,EAAC,EAEDC,MAAA,WACE,OAAOC,IAAAA,WAAAA,MAAqB,sCAC9B,EAAC,EAEDC,QAAA,WACE,OACE,SAAKH,UAAU,cACb,QAAIA,UAAU,uBACXI,KAAKC,MAAMC,KAAKC,QAAQC,KAAI,SAACC,GAAI,OAChC,YACE,EAAC,IAAI,CAACC,KAAMR,IAAAA,MAAAA,KAAeO,IACxBE,IAAOF,GAAK,IAAGG,IAASH,IAExB,KAKf,EAAC,EAvBgC,CAASI,KCN5C,MAAM,EAA+B3B,OAAOC,KAAKC,OAAO,iC,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,uBCEF,IAEjC0B,EAAqB,uFAkBvC,OAlBuC,EACxCC,KAAA,WACE,MAAO,kBACT,EAAC,EAEDL,KAAA,WACE,OAAOR,IAAAA,MAAAA,KAAeE,KAAKC,MAAMW,aAAaC,UAChD,EAAC,EAEDd,QAAA,WACE,IACMM,EADeL,KAAKC,MAAMW,aACNE,WAE1B,OAAOhB,IAAAA,WAAAA,MAAqB,mDAAoD,CAAEO,KAAAA,EAAMU,MAAO,GACjG,EAAC,EAEDC,QAAA,WACE,OAAOC,EAAAA,EAAAA,UAASjB,KAAKC,MAAMW,aAAaC,UAAUK,eAAgB,IACpE,EAAC,EAlBuC,CAASC,KCJnD,MAAM,EAA+BrC,OAAOC,KAAKC,OAAO,6B,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,gC,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,oB,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,sB,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,kC,ICMnCoC,EAAa,8DAgB/B,OAhB+B,mBAOhCC,YAAA,SAAYC,GACV,OAAOxB,IAAAA,MAAAA,KAAe,QAAS,CAC7ByB,OAAQ,CACNC,KAAM,UACNC,QAASzB,KAAKK,KAAKqB,MAErBC,KAAM,CAAEL,OAAAA,EAAQM,MAAO5B,KAAK6B,WAC5BC,KAAM,cAEV,EAAC,EAhB+B,C,MAASC,ICD3C,UACE,IAAIC,IAAAA,SACDC,IAAI,aAAc,qBAAsBb,GAE3C,IAAIY,IAAAA,OAAaE,KACdC,QAAc,SACdC,UAAmB,YCAxBtC,IAAAA,aAAAA,IAAqB,gBAAgB,WACnCA,IAAAA,uBAAAA,UAAuCY,GCNvC2B,EAAAA,EAAAA,QAAOC,IAAAA,UAAuB,eAAe,SAAUC,GACrD,IAAMrC,EAAOF,KAAKC,MAAMC,KAExB,IAAIA,EAAKsC,YAAetC,EAAKuC,UAA7B,CAEA,IAAMtC,EAAQD,EAAKC,QAEfuC,EAAU5C,IAAAA,QAAAA,MAAoBK,GAASA,EAAMwC,MAAK,SAACtC,GAAI,OAAKA,IAASP,IAAAA,QAAAA,IAAgB,IAEzFyC,EAAMN,IACJ,OACAW,IAAAA,UACE,CACEhD,UAAW,sBACXiD,QAAS,WACPH,GAAWA,EAEXxC,EAAK4C,KAAK,CAAEJ,QAAAA,IAKZ,IAAMK,EAAO7C,EAAK6C,KAAKC,cAAc7C,MAAM4C,KAC3CA,EAAKJ,MAAK,SAACM,EAAMC,GACf,GAAID,EAAKvB,KAAO5B,IAAAA,QAAAA,KAAAA,KAEd,OADAiD,EAAKI,OAAOD,EAAG,IACR,CAEX,IAEIR,GACFK,EAAKK,QAAQ,CAAE5B,KAAM,QAASE,GAAI5B,IAAAA,QAAAA,KAAAA,MAEtC,GAEFA,IAAAA,WAAAA,MAAqB4C,EAAU,sCAAwC,sCAhC7B,CAmChD,KCjCAL,EAAAA,EAAAA,QAAOC,IAAAA,UAAuB,eAAe,SAAUC,GACrD,IAAMrC,EAAOF,KAAKC,MAAMC,KAClBC,EAAQD,EAAKC,QAEnB,GAAIA,GAASA,EAAMkD,OAAQ,CACzB,IACMC,EAAYnD,EAAMkD,OADV,EAKRE,EAAQpD,EACX2B,MAAK,SAACjE,GAAC,OAAMA,IAAMiC,IAAAA,QAAAA,MAAoB,EAAI,CAAC,IAC5C0D,MAAM,EAAGF,EAAY1B,EAPV,GAQXxB,KAAI,SAACC,GACJ,OACE,EAAC,IAAI,CAACC,KAAMR,IAAAA,MAAAA,KAAeO,IACxBA,IAASP,IAAAA,QAAAA,KAAmBA,IAAAA,WAAAA,MAAqB,oCAAsCU,IAASH,GAGvG,IAKF,GAAIiD,EAAW,CACb,IAAMvC,EAAQZ,EAAMkD,OAASE,EAAMF,OAEnCE,EAAME,KACJ,OACEnD,KAAK,IACLuC,QAAS,SAACa,GACRA,EAAEC,iBACF7D,IAAAA,MAAAA,KAAeH,EAAgB,CAAEO,KAAAA,GACnC,GAECJ,IAAAA,WAAAA,MAAqB,sCAAuC,CAAEiB,MAAAA,KAGrE,CAEAwB,EAAMN,IACJ,QACA,SAAKrC,UAAU,gBACZe,IAAK,oBACLb,IAAAA,WAAAA,MAAqB,oCAAsCK,EAAM,KAAOL,IAAAA,QAAAA,KAAmB,QAAU,IAAM,QAAS,CACnHiB,MAAOwC,EAAMF,OACbO,MAAOC,IAAgBN,MAI/B,CACF,KCtDAlB,EAAAA,EAAAA,QAAOyB,IAAAA,UAAoB,YAAY,SAAUvB,GAC/C,IAAMlC,EAAOL,KAAKK,KAClBkC,EAAMN,IACJ,QACA,EAAC,IAAU,CAAC3B,KAAMR,IAAAA,MAAU,aAAc,CAAEU,SAAc,MAAJH,OAAI,EAAJA,EAAM0D,SAAWpD,KAAK,oBACzEb,IAAAA,WAAAA,MAAqB,uCAExB,GAEJ,KHCAuC,EAAAA,EAAAA,QAAO2B,IAAAA,UAA4B,qBAAqB,SAAUzB,GAChEA,EAAMN,IAAI,YAAa,CACrBgC,KAAM,YACNtD,KAAM,mBACNuD,MAAOpE,IAAAA,WAAAA,MAAqB,wDAEhC,GACF,G","sources":["webpack://@flarum/likes/webpack/bootstrap","webpack://@flarum/likes/webpack/runtime/compat get default export","webpack://@flarum/likes/webpack/runtime/define property getters","webpack://@flarum/likes/webpack/runtime/hasOwnProperty shorthand","webpack://@flarum/likes/webpack/runtime/make namespace object","webpack://@flarum/likes/external root \"flarum.core.compat['common/extend']\"","webpack://@flarum/likes/external root \"flarum.core.compat['forum/app']\"","webpack://@flarum/likes/external root \"flarum.core.compat['forum/components/NotificationGrid']\"","webpack://@flarum/likes/external root \"flarum.core.compat['common/components/Button']\"","webpack://@flarum/likes/external root \"flarum.core.compat['forum/components/CommentPost']\"","webpack://@flarum/likes/external root \"flarum.core.compat['common/components/Link']\"","webpack://@flarum/likes/external root \"flarum.core.compat['common/helpers/punctuateSeries']\"","webpack://@flarum/likes/external root \"flarum.core.compat['common/helpers/username']\"","webpack://@flarum/likes/external root \"flarum.core.compat['common/helpers/icon']\"","webpack://@flarum/likes/../../../node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://@flarum/likes/../../../node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@flarum/likes/external root \"flarum.core.compat['common/components/Modal']\"","webpack://@flarum/likes/external root \"flarum.core.compat['common/helpers/avatar']\"","webpack://@flarum/likes/./src/forum/components/PostLikesModal.js","webpack://@flarum/likes/external root \"flarum.core.compat['forum/components/Notification']\"","webpack://@flarum/likes/external root \"flarum.core.compat['common/utils/string']\"","webpack://@flarum/likes/./src/forum/components/PostLikedNotification.js","webpack://@flarum/likes/external root \"flarum.core.compat['forum/components/UserPage']\"","webpack://@flarum/likes/external root \"flarum.core.compat['common/components/LinkButton']\"","webpack://@flarum/likes/external root \"flarum.core.compat['common/extenders']\"","webpack://@flarum/likes/external root \"flarum.core.compat['common/models/Post']\"","webpack://@flarum/likes/external root \"flarum.core.compat['forum/components/PostsUserPage']\"","webpack://@flarum/likes/./src/forum/components/LikesUserPage.tsx","webpack://@flarum/likes/./src/forum/extend.ts","webpack://@flarum/likes/./src/forum/index.js","webpack://@flarum/likes/./src/forum/addLikeAction.js","webpack://@flarum/likes/./src/forum/addLikesList.js","webpack://@flarum/likes/./src/forum/addLikesTabToUserProfile.tsx"],"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['common/extend'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/app'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/NotificationGrid'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Button'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/CommentPost'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Link'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/punctuateSeries'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/username'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/icon'];","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/components/Modal'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/avatar'];","import app from 'flarum/forum/app';\nimport Modal from 'flarum/common/components/Modal';\nimport Link from 'flarum/common/components/Link';\nimport avatar from 'flarum/common/helpers/avatar';\nimport username from 'flarum/common/helpers/username';\n\nexport default class PostLikesModal extends Modal {\n className() {\n return 'PostLikesModal Modal--small';\n }\n\n title() {\n return app.translator.trans('flarum-likes.forum.post_likes.title');\n }\n\n content() {\n return (\n
\n
    \n {this.attrs.post.likes().map((user) => (\n
  • \n \n {avatar(user)} {username(user)}\n \n
  • \n ))}\n
\n
\n );\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/Notification'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/string'];","import app from 'flarum/forum/app';\nimport Notification from 'flarum/forum/components/Notification';\nimport { truncate } from 'flarum/common/utils/string';\n\nexport default class PostLikedNotification extends Notification {\n icon() {\n return 'far fa-thumbs-up';\n }\n\n href() {\n return app.route.post(this.attrs.notification.subject());\n }\n\n content() {\n const notification = this.attrs.notification;\n const user = notification.fromUser();\n\n return app.translator.trans('flarum-likes.forum.notifications.post_liked_text', { user, count: 1 });\n }\n\n excerpt() {\n return truncate(this.attrs.notification.subject().contentPlain(), 200);\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/UserPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/LinkButton'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extenders'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/models/Post'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/PostsUserPage'];","import app from 'flarum/forum/app';\nimport PostsUserPage from 'flarum/forum/components/PostsUserPage';\n\n/**\n * The `LikesUserPage` component shows posts which user the user liked.\n */\nexport default class LikesUserPage extends PostsUserPage {\n /**\n * Load a new page of the user's activity feed.\n *\n * @param offset The position to start getting results from.\n * @protected\n */\n loadResults(offset: number) {\n return app.store.find('posts', {\n filter: {\n type: 'comment',\n likedBy: this.user.id(),\n },\n page: { offset, limit: this.loadLimit },\n sort: '-createdAt',\n });\n }\n}\n","import Extend from 'flarum/common/extenders';\nimport Post from 'flarum/common/models/Post';\nimport User from 'flarum/common/models/User';\nimport LikesUserPage from './components/LikesUserPage';\n\nexport default [\n new Extend.Routes() //\n .add('user.likes', '/u/:username/likes', LikesUserPage),\n\n new Extend.Model(Post) //\n .hasMany('likes')\n .attribute('canLike'),\n];\n","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport NotificationGrid from 'flarum/forum/components/NotificationGrid';\n\nimport addLikeAction from './addLikeAction';\nimport addLikesList from './addLikesList';\nimport PostLikedNotification from './components/PostLikedNotification';\nimport addLikesTabToUserProfile from './addLikesTabToUserProfile';\n\nexport { default as extend } from './extend';\n\napp.initializers.add('flarum-likes', () => {\n app.notificationComponents.postLiked = PostLikedNotification;\n\n addLikeAction();\n addLikesList();\n addLikesTabToUserProfile();\n\n extend(NotificationGrid.prototype, 'notificationTypes', function (items) {\n items.add('postLiked', {\n name: 'postLiked',\n icon: 'far fa-thumbs-up',\n label: app.translator.trans('flarum-likes.forum.settings.notify_post_liked_label'),\n });\n });\n});\n","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport Button from 'flarum/common/components/Button';\nimport CommentPost from 'flarum/forum/components/CommentPost';\n\nexport default function () {\n extend(CommentPost.prototype, 'actionItems', function (items) {\n const post = this.attrs.post;\n\n if (post.isHidden() || !post.canLike()) return;\n\n const likes = post.likes();\n\n let isLiked = app.session.user && likes && likes.some((user) => user === app.session.user);\n\n items.add(\n 'like',\n Button.component(\n {\n className: 'Button Button--link',\n onclick: () => {\n isLiked = !isLiked;\n\n post.save({ isLiked });\n\n // We've saved the fact that we do or don't like the post, but in order\n // to provide instantaneous feedback to the user, we'll need to add or\n // remove the like from the relationship data manually.\n const data = post.data.relationships.likes.data;\n data.some((like, i) => {\n if (like.id === app.session.user.id()) {\n data.splice(i, 1);\n return true;\n }\n });\n\n if (isLiked) {\n data.unshift({ type: 'users', id: app.session.user.id() });\n }\n },\n },\n app.translator.trans(isLiked ? 'flarum-likes.forum.post.unlike_link' : 'flarum-likes.forum.post.like_link')\n )\n );\n });\n}\n","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport CommentPost from 'flarum/forum/components/CommentPost';\nimport Link from 'flarum/common/components/Link';\nimport punctuateSeries from 'flarum/common/helpers/punctuateSeries';\nimport username from 'flarum/common/helpers/username';\nimport icon from 'flarum/common/helpers/icon';\n\nimport PostLikesModal from './components/PostLikesModal';\n\nexport default function () {\n extend(CommentPost.prototype, 'footerItems', function (items) {\n const post = this.attrs.post;\n const likes = post.likes();\n\n if (likes && likes.length) {\n const limit = 4;\n const overLimit = likes.length > limit;\n\n // Construct a list of names of users who have liked this post. Make sure the\n // current user is first in the list, and cap a maximum of 4 items.\n const names = likes\n .sort((a) => (a === app.session.user ? -1 : 1))\n .slice(0, overLimit ? limit - 1 : limit)\n .map((user) => {\n return (\n \n {user === app.session.user ? app.translator.trans('flarum-likes.forum.post.you_text') : username(user)}\n \n );\n });\n\n // If there are more users that we've run out of room to display, add a \"x\n // others\" name to the end of the list. Clicking on it will display a modal\n // with a full list of names.\n if (overLimit) {\n const count = likes.length - names.length;\n\n names.push(\n {\n e.preventDefault();\n app.modal.show(PostLikesModal, { post });\n }}\n >\n {app.translator.trans('flarum-likes.forum.post.others_link', { count })}\n \n );\n }\n\n items.add(\n 'liked',\n
\n {icon('far fa-thumbs-up')}\n {app.translator.trans('flarum-likes.forum.post.liked_by' + (likes[0] === app.session.user ? '_self' : '') + '_text', {\n count: names.length,\n users: punctuateSeries(names),\n })}\n
\n );\n }\n });\n}\n","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport UserPage from 'flarum/forum/components/UserPage';\nimport LinkButton from 'flarum/common/components/LinkButton';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport type Mithril from 'mithril';\n\nexport default function addLikesTabToUserProfile() {\n extend(UserPage.prototype, 'navItems', function (items: ItemList) {\n const user = this.user;\n items.add(\n 'likes',\n \n {app.translator.trans('flarum-likes.forum.user.likes_link')}\n ,\n 88\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","PostLikesModal","className","title","app","content","this","attrs","post","likes","map","user","href","avatar","username","Modal","PostLikedNotification","icon","notification","subject","fromUser","count","excerpt","truncate","contentPlain","Notification","LikesUserPage","loadResults","offset","filter","type","likedBy","id","page","limit","loadLimit","sort","PostsUserPage","Extend","add","Post","hasMany","attribute","extend","CommentPost","items","isHidden","canLike","isLiked","some","Button","onclick","save","data","relationships","like","i","splice","unshift","length","overLimit","names","slice","push","e","preventDefault","users","punctuateSeries","UserPage","slug","NotificationGrid","name","label"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"forum.js","mappings":"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","sources":["webpack://@flarum/likes/webpack/bootstrap","webpack://@flarum/likes/webpack/runtime/compat get default export","webpack://@flarum/likes/webpack/runtime/define property getters","webpack://@flarum/likes/webpack/runtime/hasOwnProperty shorthand","webpack://@flarum/likes/webpack/runtime/make namespace object","webpack://@flarum/likes/external root \"flarum.core.compat['common/extend']\"","webpack://@flarum/likes/external root \"flarum.core.compat['forum/app']\"","webpack://@flarum/likes/external root \"flarum.core.compat['forum/components/NotificationGrid']\"","webpack://@flarum/likes/external root \"flarum.core.compat['common/components/Button']\"","webpack://@flarum/likes/external root \"flarum.core.compat['forum/components/CommentPost']\"","webpack://@flarum/likes/external root \"flarum.core.compat['common/components/Link']\"","webpack://@flarum/likes/external root \"flarum.core.compat['common/helpers/punctuateSeries']\"","webpack://@flarum/likes/external root \"flarum.core.compat['common/helpers/username']\"","webpack://@flarum/likes/external root \"flarum.core.compat['common/helpers/icon']\"","webpack://@flarum/likes/../../../node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://@flarum/likes/../../../node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@flarum/likes/external root \"flarum.core.compat['common/components/Modal']\"","webpack://@flarum/likes/external root \"flarum.core.compat['common/helpers/avatar']\"","webpack://@flarum/likes/../../../node_modules/@babel/runtime/helpers/esm/extends.js","webpack://@flarum/likes/../../../node_modules/@babel/runtime/helpers/esm/createClass.js","webpack://@flarum/likes/../../../framework/core/js/src/common/app.ts","webpack://@flarum/likes/../../../framework/core/js/src/common/states/PaginatedListState.ts","webpack://@flarum/likes/./src/forum/states/PostLikesModalState.ts","webpack://@flarum/likes/../../../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","webpack://@flarum/likes/../../../framework/core/js/src/common/Component.ts","webpack://@flarum/likes/../../../node_modules/clsx/dist/clsx.m.js","webpack://@flarum/likes/../../../framework/core/js/src/common/utils/classList.ts","webpack://@flarum/likes/../../../framework/core/js/src/common/utils/extractText.ts","webpack://@flarum/likes/../../../framework/core/js/src/common/components/LoadingIndicator.tsx","webpack://@flarum/likes/../../../framework/core/js/src/common/components/Button.tsx","webpack://@flarum/likes/../../../framework/core/js/src/common/helpers/fireDebugWarning.ts","webpack://@flarum/likes/../../../framework/core/js/src/common/helpers/icon.tsx","webpack://@flarum/likes/./src/forum/components/PostLikesModal.tsx","webpack://@flarum/likes/external root \"flarum.core.compat['forum/components/Notification']\"","webpack://@flarum/likes/external root \"flarum.core.compat['common/utils/string']\"","webpack://@flarum/likes/./src/forum/components/PostLikedNotification.js","webpack://@flarum/likes/external root \"flarum.core.compat['forum/components/UserPage']\"","webpack://@flarum/likes/external root \"flarum.core.compat['common/components/LinkButton']\"","webpack://@flarum/likes/external root \"flarum.core.compat['common/extenders']\"","webpack://@flarum/likes/external root \"flarum.core.compat['common/models/Post']\"","webpack://@flarum/likes/external root \"flarum.core.compat['forum/components/PostsUserPage']\"","webpack://@flarum/likes/./src/forum/components/LikesUserPage.tsx","webpack://@flarum/likes/./src/forum/extend.ts","webpack://@flarum/likes/./src/forum/index.js","webpack://@flarum/likes/./src/forum/addLikeAction.js","webpack://@flarum/likes/./src/forum/addLikesList.js","webpack://@flarum/likes/./src/forum/addLikesTabToUserProfile.tsx"],"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['common/extend'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/app'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/NotificationGrid'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Button'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/CommentPost'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Link'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/punctuateSeries'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/username'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/icon'];","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/components/Modal'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/avatar'];","export default function _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}","import type Application from './Application';\n\n// Used to fix typings\nconst w = window as any;\n\n/**\n * Proxy app. Common JS is run first, at which point `window.app` is not\n * set as this is done by the namespaced JS.\n *\n * When the corrent value is set, this code would retain the reference to\n * the original invalid value.\n *\n * By using a proxy, we can ensure that our `window.app` value is always\n * up-to-date with the latest reference.\n */\nconst appProxy = new Proxy(\n {},\n {\n get(_, properties) {\n return Reflect.get(w.app, properties, w.app);\n },\n set(_, properties, value) {\n return Reflect.set(w.app, properties, value, w.app);\n },\n }\n);\n\n/**\n * The instance of Application within the common namespace.\n */\nexport default appProxy as Application;\n","import app from '../../common/app';\nimport Model from '../Model';\nimport { ApiQueryParamsPlural, ApiResponsePlural } from '../Store';\n\nexport interface Page {\n number: number;\n items: TModel[];\n\n hasPrev?: boolean;\n hasNext?: boolean;\n}\n\nexport interface PaginationLocation {\n page: number;\n startIndex?: number;\n endIndex?: number;\n}\n\nexport interface PaginatedListParams {\n [key: string]: any;\n}\n\nexport interface PaginatedListRequestParams extends Omit {\n include?: string | string[];\n}\n\nexport default abstract class PaginatedListState {\n protected location!: PaginationLocation;\n protected pageSize: number;\n\n protected pages: Page[] = [];\n protected params: P = {} as P;\n\n protected initialLoading: boolean = false;\n protected loadingPrev: boolean = false;\n protected loadingNext: boolean = false;\n\n protected constructor(params: P = {} as P, page: number = 1, pageSize: number = 20) {\n this.params = params;\n\n this.location = { page };\n this.pageSize = pageSize;\n }\n\n abstract get type(): string;\n\n public clear(): void {\n this.pages = [];\n\n m.redraw();\n }\n\n public loadPrev(): Promise {\n if (this.loadingPrev || this.getLocation().page === 1) return Promise.resolve();\n\n this.loadingPrev = true;\n\n const page: number = this.getPrevPageNumber();\n\n return this.loadPage(page)\n .then(this.parseResults.bind(this, page))\n .finally(() => (this.loadingPrev = false));\n }\n\n public loadNext(): Promise {\n if (this.loadingNext) return Promise.resolve();\n\n this.loadingNext = true;\n\n const page: number = this.getNextPageNumber();\n\n return this.loadPage(page)\n .then(this.parseResults.bind(this, page))\n .finally(() => (this.loadingNext = false));\n }\n\n protected parseResults(pg: number, results: ApiResponsePlural): void {\n const pageNum = Number(pg);\n\n const links = results.payload?.links;\n const page = {\n number: pageNum,\n items: results,\n hasNext: !!links?.next,\n hasPrev: !!links?.prev,\n };\n\n if (this.isEmpty() || pageNum > this.getNextPageNumber() - 1) {\n this.pages.push(page);\n } else {\n this.pages.unshift(page);\n }\n\n this.location = { page: pageNum };\n\n m.redraw();\n }\n\n /**\n * Load a new page of results.\n */\n protected loadPage(page = 1): Promise> {\n const reqParams = this.requestParams();\n\n const include = Array.isArray(reqParams.include) ? reqParams.include.join(',') : reqParams.include;\n\n const params: ApiQueryParamsPlural = {\n ...reqParams,\n page: {\n ...reqParams.page,\n offset: this.pageSize * (page - 1),\n },\n include,\n };\n\n return app.store.find(this.type, params);\n }\n\n /**\n * Get the parameters that should be passed in the API request.\n * Do not include page offset unless subclass overrides loadPage.\n *\n * @abstract\n * @see loadPage\n */\n protected requestParams(): PaginatedListRequestParams {\n return this.params;\n }\n\n /**\n * Update the `this.params` object, calling `refresh` if they have changed.\n * Use `requestParams` for converting `this.params` into API parameters\n *\n * @param newParams\n * @param page\n * @see requestParams\n */\n public refreshParams(newParams: P, page: number): Promise {\n if (this.isEmpty() || this.paramsChanged(newParams)) {\n this.params = newParams;\n\n return this.refresh(page);\n }\n\n return Promise.resolve();\n }\n\n public refresh(page: number = 1): Promise {\n this.initialLoading = true;\n this.loadingPrev = false;\n this.loadingNext = false;\n\n this.clear();\n\n this.location = { page };\n\n return this.loadPage()\n .then((results) => {\n this.pages = [];\n this.parseResults(this.location.page, results);\n })\n .finally(() => (this.initialLoading = false));\n }\n\n public getPages(): Page[] {\n return this.pages;\n }\n public getLocation(): PaginationLocation {\n return this.location;\n }\n\n public isLoading(): boolean {\n return this.initialLoading || this.loadingNext || this.loadingPrev;\n }\n public isInitialLoading(): boolean {\n return this.initialLoading;\n }\n public isLoadingPrev(): boolean {\n return this.loadingPrev;\n }\n public isLoadingNext(): boolean {\n return this.loadingNext;\n }\n\n /**\n * Returns true when the number of items across all loaded pages is not 0.\n *\n * @see isEmpty\n */\n public hasItems(): boolean {\n return !!this.getAllItems().length;\n }\n\n /**\n * Returns true when there aren't any items *and* the state has already done its initial loading.\n * If you want to know whether there are items regardless of load state, use `hasItems()` instead\n *\n * @see hasItems\n */\n public isEmpty(): boolean {\n return !this.isInitialLoading() && !this.hasItems();\n }\n\n public hasPrev(): boolean {\n return !!this.pages[0]?.hasPrev;\n }\n public hasNext(): boolean {\n return !!this.pages[this.pages.length - 1]?.hasNext;\n }\n\n /**\n * Stored state parameters.\n */\n public getParams(): P {\n return this.params;\n }\n\n protected getNextPageNumber(): number {\n const pg = this.pages[this.pages.length - 1]?.number;\n\n if (pg && !isNaN(pg)) {\n return pg + 1;\n } else {\n return this.location.page;\n }\n }\n protected getPrevPageNumber(): number {\n const pg = this.pages[0]?.number;\n\n if (pg && !isNaN(pg)) {\n // If the calculated page number is less than 1,\n // return 1 as the prev page (first possible page number)\n return Math.max(pg - 1, 1);\n } else {\n return this.location.page;\n }\n }\n\n protected paramsChanged(newParams: P): boolean {\n return Object.keys(newParams).some((key) => this.getParams()[key] !== newParams[key]);\n }\n\n protected getAllItems(): T[] {\n return this.getPages()\n .map((pg) => pg.items)\n .flat();\n }\n}\n","import PaginatedListState, { PaginatedListParams } from '@flarum/core/src/common/states/PaginatedListState';\nimport User from 'flarum/common/models/User';\n\nexport interface PostLikesModalListParams extends PaginatedListParams {\n filter: {\n liked: string;\n };\n page?: {\n offset?: number;\n limit: number;\n };\n}\n\nexport default class PostLikesModalState

extends PaginatedListState {\n constructor(params: P, page: number = 1) {\n const limit = 10;\n\n params.page = { ...(params.page || {}), limit };\n\n super(params, page, limit);\n }\n\n get type(): string {\n return 'users';\n }\n}\n","export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}","import type Mithril from 'mithril';\n\nexport interface ComponentAttrs extends Mithril.Attributes {}\n\n/**\n * The `Component` class defines a user interface 'building block'. A component\n * generates a virtual DOM to be rendered on each redraw.\n *\n * Essentially, this is a wrapper for Mithril's components that adds several useful features:\n *\n * - In the `oninit` and `onbeforeupdate` lifecycle hooks, we store vnode attrs in `this.attrs.\n * This allows us to use attrs across components without having to pass the vnode to every single\n * method.\n * - The static `initAttrs` method allows a convenient way to provide defaults (or to otherwise modify)\n * the attrs that have been passed into a component.\n * - When the component is created in the DOM, we store its DOM element under `this.element`; this lets\n * us use jQuery to modify child DOM state from internal methods via the `this.$()` method.\n * - A convenience `component` method, which serves as an alternative to hyperscript and JSX.\n *\n * As with other Mithril components, components extending Component can be initialized\n * and nested using JSX, hyperscript, or a combination of both. The `component` method can also\n * be used.\n *\n * @example\n * return m('div',

Hello World

);\n *\n * @example\n * return m('div', MyComponent.component({foo: 'bar'), m('p', 'Hello World!'));\n *\n * @see https://mithril.js.org/components.html\n */\nexport default abstract class Component implements Mithril.ClassComponent {\n /**\n * The root DOM element for the component.\n */\n element!: Element;\n\n /**\n * The attributes passed into the component.\n *\n * @see https://mithril.js.org/components.html#passing-data-to-components\n */\n attrs!: Attrs;\n\n /**\n * Class component state that is persisted between redraws.\n *\n * Updating this will **not** automatically trigger a redraw, unlike\n * other frameworks.\n *\n * This is different to Vnode state, which is always an instance of your\n * class component.\n *\n * This is `undefined` by default.\n */\n state!: State;\n\n /**\n * @inheritdoc\n */\n abstract view(vnode: Mithril.Vnode): Mithril.Children;\n\n /**\n * @inheritdoc\n */\n oninit(vnode: Mithril.Vnode) {\n this.setAttrs(vnode.attrs);\n }\n\n /**\n * @inheritdoc\n */\n oncreate(vnode: Mithril.VnodeDOM) {\n this.element = vnode.dom;\n }\n\n /**\n * @inheritdoc\n */\n onbeforeupdate(vnode: Mithril.VnodeDOM) {\n this.setAttrs(vnode.attrs);\n }\n\n /**\n * @inheritdoc\n */\n onupdate(vnode: Mithril.VnodeDOM) {}\n\n /**\n * @inheritdoc\n */\n onbeforeremove(vnode: Mithril.VnodeDOM) {}\n\n /**\n * @inheritdoc\n */\n onremove(vnode: Mithril.VnodeDOM) {}\n\n /**\n * Returns a jQuery object for this component's element. If you pass in a\n * selector string, this method will return a jQuery object, using the current\n * element as its buffer.\n *\n * For example, calling `component.$('li')` will return a jQuery object\n * containing all of the `li` elements inside the DOM element of this\n * component.\n *\n * @param [selector] a jQuery-compatible selector string\n * @returns the jQuery object for the DOM node\n * @final\n */\n $(selector?: string): JQuery {\n const $element = $(this.element) as JQuery;\n\n return selector ? $element.find(selector) : $element;\n }\n\n /**\n * Convenience method to attach a component without JSX.\n * Has the same effect as calling `m(THIS_CLASS, attrs, children)`.\n *\n * @see https://mithril.js.org/hyperscript.html#mselector,-attributes,-children\n */\n static component(attrs: SAttrs = {} as SAttrs, children: Mithril.Children = null): Mithril.Vnode {\n const componentAttrs = { ...attrs };\n\n return m(this as any, componentAttrs, children);\n }\n\n /**\n * Saves a reference to the vnode attrs after running them through initAttrs,\n * and checking for common issues.\n */\n private setAttrs(attrs: Attrs = {} as Attrs): void {\n (this.constructor as typeof Component).initAttrs(attrs);\n\n if (attrs) {\n if ('children' in attrs) {\n throw new Error(\n `[${\n (this.constructor as typeof Component).name\n }] The \"children\" attribute of attrs should never be used. Either pass children in as the vnode children or rename the attribute`\n );\n }\n\n if ('tag' in attrs) {\n throw new Error(`[${(this.constructor as typeof Component).name}] You cannot use the \"tag\" attribute name with Mithril 2.`);\n }\n }\n\n this.attrs = attrs;\n }\n\n /**\n * Initialize the component's attrs.\n *\n * This can be used to assign default values for missing, optional attrs.\n */\n static initAttrs(attrs: unknown): void {}\n}\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e))for(t=0;t extractText(element)).join('');\n } else if (typeof vdom === 'object' && vdom !== null) {\n return vdom.children ? extractText(vdom.children) : String(vdom.text);\n } else {\n return String(vdom);\n }\n}\n","import app from '../../common/app';\nimport Component, { ComponentAttrs } from '../Component';\nimport classList from '../utils/classList';\n\nexport interface LoadingIndicatorAttrs extends ComponentAttrs {\n /**\n * Custom classes for the loading indicator's container.\n */\n className?: string;\n /**\n * Custom classes for the loading indicator's container.\n */\n containerClassName?: string;\n /**\n * Optional size for the loading indicator.\n */\n size?: 'large' | 'medium' | 'small';\n /**\n * Optional attributes to apply to the loading indicator's container.\n */\n containerAttrs?: Partial;\n /**\n * Display type of the spinner.\n *\n * @default 'block'\n */\n display?: 'block' | 'inline' | 'unset';\n}\n\n/**\n * The `LoadingIndicator` component displays a simple CSS-based loading spinner.\n *\n * To set a custom color, use the CSS `color` property.\n *\n * To increase spacing around the spinner, use the CSS `height` property on the\n * spinner's **container**. Setting the `display` attribute to `block` will set\n * a height of `100px` by default.\n *\n * To apply a custom size to the loading indicator, set the `--size` and\n * `--thickness` CSS custom properties on the loading indicator container.\n *\n * If you *really* want to change how this looks as part of your custom theme,\n * you can override the `border-radius` and `border` then set either a\n * background image, or use `content: \"\\\"` (e.g. `content: \"\\f1ce\"`)\n * and `font-family: 'Font Awesome 5 Free'` to set an FA icon if you'd rather.\n *\n * ### Attrs\n *\n * - `containerClassName` Class name(s) to apply to the indicator's parent\n * - `className` Class name(s) to apply to the indicator itself\n * - `display` Determines how the spinner should be displayed (`inline`, `block` (default) or `unset`)\n * - `size` Size of the loading indicator (`small`, `medium` or `large`)\n * - `containerAttrs` Optional attrs to be applied to the container DOM element\n *\n * All other attrs will be assigned as attributes on the DOM element.\n */\nexport default class LoadingIndicator extends Component {\n view() {\n const { display = 'block', size = 'medium', containerClassName, className, ...attrs } = this.attrs;\n\n const completeClassName = classList('LoadingIndicator', className);\n const completeContainerClassName = classList(\n 'LoadingIndicator-container',\n display !== 'unset' && `LoadingIndicator-container--${display}`,\n size && `LoadingIndicator-container--${size}`,\n containerClassName\n );\n\n return (\n \n
\n
\n );\n }\n}\n","import type Mithril from 'mithril';\nimport Component, { ComponentAttrs } from '../Component';\nimport fireDebugWarning from '../helpers/fireDebugWarning';\nimport icon from '../helpers/icon';\nimport classList from '../utils/classList';\nimport extractText from '../utils/extractText';\nimport LoadingIndicator from './LoadingIndicator';\n\nexport interface IButtonAttrs extends ComponentAttrs {\n /**\n * Class(es) of an optional icon to be rendered within the button.\n *\n * If provided, the button will gain a `has-icon` class.\n */\n icon?: string;\n /**\n * Disables button from user input.\n *\n * Default: `false`\n */\n disabled?: boolean;\n /**\n * Show a loading spinner within the button.\n *\n * If `true`, also disables the button.\n *\n * Default: `false`\n */\n loading?: boolean;\n /**\n * **DEPRECATED:** Please use the `aria-label` attribute instead. For tooltips, use\n * the `` component.\n *\n * Accessible text for the button. This should always be present if the button only\n * contains an icon.\n *\n * The textual content of this attribute is passed to the DOM element as `aria-label`.\n *\n * @deprecated\n */\n title?: string | Mithril.ChildArray;\n /**\n * Accessible text for the button. This should always be present if the button only\n * contains an icon.\n *\n * The textual content of this attribute is passed to the DOM element as `aria-label`.\n */\n 'aria-label'?: string | Mithril.ChildArray;\n /**\n * Button type.\n *\n * Default: `\"button\"`\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attr-type\n */\n type?: string;\n}\n\n/**\n * The `Button` component defines an element which, when clicked, performs an\n * action.\n *\n * Other attrs will be assigned as attributes on the `;\n }\n\n oncreate(vnode: Mithril.VnodeDOM) {\n super.oncreate(vnode);\n\n const { 'aria-label': ariaLabel } = this.attrs;\n\n if (this.view === Button.prototype.view && !ariaLabel && !extractText(vnode.children) && !this.element?.getAttribute?.('aria-label')) {\n fireDebugWarning(\n '[Flarum Accessibility Warning] Button has no content and no accessible label. This means that screen-readers will not be able to interpret its meaning and just read \"Button\". Consider providing accessible text via the `aria-label` attribute. https://web.dev/button-name',\n this.element\n );\n }\n }\n\n /**\n * Get the template for the button's content.\n */\n protected getButtonContent(children: Mithril.Children): Mithril.ChildArray {\n const iconName = this.attrs.icon;\n\n return [\n iconName && icon(iconName, { className: 'Button-icon' }),\n children && {children},\n this.attrs.loading && ,\n ];\n }\n}\n","import app from '../app';\n\n/**\n * Calls `console.warn` with the provided arguments, but only if the forum is in debug mode.\n *\n * This function is intended to provide warnings to extension developers about issues with\n * their extensions that may not be easily noticed when testing, such as accessibility\n * issues.\n *\n * These warnings should be hidden on production forums to ensure webmasters are not\n * inundated with do-gooders telling them they have an issue when it isn't something they\n * can fix.\n */\nexport default function fireDebugWarning(...args: Parameters): void {\n if (!app.forum.attribute('debug')) return;\n\n console.warn(...args);\n}\n\n/**\n * Fire a Flarum deprecation warning which is shown in the JS console.\n *\n * These warnings are only shown when the forum is in debug mode, and the function exists to\n * reduce bundle size caused by multiple warnings across our JavaScript.\n *\n * @param message The message to display. (Short, but sweet, please!)\n * @param githubId The PR or Issue ID with more info in relation to this change.\n * @param [removedFrom] The version in which this feature will be completely removed. (default: 2.0)\n * @param [repo] The repo which the issue or PR is located in. (default: flarum/core)\n *\n * @see {@link fireDebugWarning}\n */\nexport function fireDeprecationWarning(message: string, githubId: string, removedFrom: string = '2.0', repo: string = 'flarum/core'): void {\n // GitHub auto-redirects between `/pull` and `/issues` for us, so using `/pull` saves 2 bytes!\n fireDebugWarning(`[Flarum ${removedFrom} Deprecation] ${message}\\n\\nSee: https://github.com/${repo}/pull/${githubId}`);\n}\n","import type Mithril from 'mithril';\n\n/**\n * The `icon` helper displays an icon.\n *\n * @param fontClass The full icon class, prefix and the icon’s name.\n * @param attrs Any other attributes to apply.\n */\nexport default function icon(fontClass: string, attrs: Mithril.Attributes = {}): Mithril.Vnode {\n attrs.className = 'icon ' + fontClass + ' ' + (attrs.className || '');\n\n return ;\n}\n","import app from 'flarum/forum/app';\nimport Modal from 'flarum/common/components/Modal';\nimport Link from 'flarum/common/components/Link';\nimport avatar from 'flarum/common/helpers/avatar';\nimport username from 'flarum/common/helpers/username';\nimport type { IInternalModalAttrs } from 'flarum/common/components/Modal';\nimport type Post from 'flarum/common/models/Post';\nimport type Mithril from 'mithril';\nimport PostLikesModalState from '../states/PostLikesModalState';\nimport Button from '@flarum/core/src/common/components/Button';\nimport LoadingIndicator from '@flarum/core/src/common/components/LoadingIndicator';\n\nexport interface IPostLikesModalAttrs extends IInternalModalAttrs {\n post: Post;\n}\n\nexport default class PostLikesModal extends Modal {\n oninit(vnode: Mithril.VnodeDOM) {\n super.oninit(vnode);\n\n this.state = new PostLikesModalState({\n filter: {\n liked: this.attrs.post.id()!,\n },\n });\n\n this.state.refresh();\n }\n\n className() {\n return 'PostLikesModal Modal--small';\n }\n\n title() {\n return app.translator.trans('flarum-likes.forum.post_likes.title');\n }\n\n content() {\n return (\n <>\n
\n {this.state.isInitialLoading() ? (\n \n ) : (\n
    \n {this.state.getPages().map((page) =>\n page.items.map((user) => (\n
  • \n \n {avatar(user)} {username(user)}\n \n
  • \n ))\n )}\n
\n )}\n
\n {this.state.hasNext() ? (\n
\n
\n
\n \n
\n
\n
\n ) : null}\n \n );\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/Notification'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/string'];","import app from 'flarum/forum/app';\nimport Notification from 'flarum/forum/components/Notification';\nimport { truncate } from 'flarum/common/utils/string';\n\nexport default class PostLikedNotification extends Notification {\n icon() {\n return 'far fa-thumbs-up';\n }\n\n href() {\n return app.route.post(this.attrs.notification.subject());\n }\n\n content() {\n const notification = this.attrs.notification;\n const user = notification.fromUser();\n\n return app.translator.trans('flarum-likes.forum.notifications.post_liked_text', { user, count: 1 });\n }\n\n excerpt() {\n return truncate(this.attrs.notification.subject().contentPlain(), 200);\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/UserPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/LinkButton'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extenders'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/models/Post'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/PostsUserPage'];","import app from 'flarum/forum/app';\nimport PostsUserPage from 'flarum/forum/components/PostsUserPage';\n\n/**\n * The `LikesUserPage` component shows posts which user the user liked.\n */\nexport default class LikesUserPage extends PostsUserPage {\n /**\n * Load a new page of the user's activity feed.\n *\n * @param offset The position to start getting results from.\n * @protected\n */\n loadResults(offset: number) {\n return app.store.find('posts', {\n filter: {\n type: 'comment',\n likedBy: this.user.id(),\n },\n page: { offset, limit: this.loadLimit },\n sort: '-createdAt',\n });\n }\n}\n","import Extend from 'flarum/common/extenders';\nimport Post from 'flarum/common/models/Post';\nimport User from 'flarum/common/models/User';\nimport LikesUserPage from './components/LikesUserPage';\n\nexport default [\n new Extend.Routes() //\n .add('user.likes', '/u/:username/likes', LikesUserPage),\n\n new Extend.Model(Post) //\n .hasMany('likes')\n .attribute('likesCount')\n .attribute('canLike'),\n];\n","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport NotificationGrid from 'flarum/forum/components/NotificationGrid';\n\nimport addLikeAction from './addLikeAction';\nimport addLikesList from './addLikesList';\nimport PostLikedNotification from './components/PostLikedNotification';\nimport addLikesTabToUserProfile from './addLikesTabToUserProfile';\n\nexport { default as extend } from './extend';\n\napp.initializers.add('flarum-likes', () => {\n app.notificationComponents.postLiked = PostLikedNotification;\n\n addLikeAction();\n addLikesList();\n addLikesTabToUserProfile();\n\n extend(NotificationGrid.prototype, 'notificationTypes', function (items) {\n items.add('postLiked', {\n name: 'postLiked',\n icon: 'far fa-thumbs-up',\n label: app.translator.trans('flarum-likes.forum.settings.notify_post_liked_label'),\n });\n });\n});\n","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport Button from 'flarum/common/components/Button';\nimport CommentPost from 'flarum/forum/components/CommentPost';\n\nexport default function () {\n extend(CommentPost.prototype, 'actionItems', function (items) {\n const post = this.attrs.post;\n\n if (post.isHidden() || !post.canLike()) return;\n\n const likes = post.likes();\n\n let isLiked = app.session.user && likes && likes.some((user) => user === app.session.user);\n\n items.add(\n 'like',\n Button.component(\n {\n className: 'Button Button--link',\n onclick: () => {\n isLiked = !isLiked;\n\n post.save({ isLiked });\n\n // We've saved the fact that we do or don't like the post, but in order\n // to provide instantaneous feedback to the user, we'll need to add or\n // remove the like from the relationship data manually.\n const data = post.data.relationships.likes.data;\n data.some((like, i) => {\n if (like.id === app.session.user.id()) {\n data.splice(i, 1);\n return true;\n }\n });\n\n if (isLiked) {\n data.unshift({ type: 'users', id: app.session.user.id() });\n }\n },\n },\n app.translator.trans(isLiked ? 'flarum-likes.forum.post.unlike_link' : 'flarum-likes.forum.post.like_link')\n )\n );\n });\n}\n","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport CommentPost from 'flarum/forum/components/CommentPost';\nimport Link from 'flarum/common/components/Link';\nimport punctuateSeries from 'flarum/common/helpers/punctuateSeries';\nimport username from 'flarum/common/helpers/username';\nimport icon from 'flarum/common/helpers/icon';\n\nimport PostLikesModal from './components/PostLikesModal';\nimport Button from '@flarum/core/src/common/components/Button';\n\nexport default function () {\n extend(CommentPost.prototype, 'footerItems', function (items) {\n const post = this.attrs.post;\n const likes = post.likes();\n\n if (likes && likes.length) {\n const limit = 4;\n const overLimit = post.likesCount() > limit;\n\n // Construct a list of names of users who have liked this post. Make sure the\n // current user is first in the list, and cap a maximum of 4 items.\n const names = likes\n .sort((a) => (a === app.session.user ? -1 : 1))\n .slice(0, overLimit ? limit - 1 : limit)\n .map((user) => {\n return (\n \n {user === app.session.user ? app.translator.trans('flarum-likes.forum.post.you_text') : username(user)}\n \n );\n });\n\n // If there are more users that we've run out of room to display, add a \"x\n // others\" name to the end of the list. Clicking on it will display a modal\n // with a full list of names.\n if (overLimit) {\n const count = post.likesCount() - names.length;\n const label = app.translator.trans('flarum-likes.forum.post.others_link', { count });\n\n if (app.forum.attribute('canSearchUsers')) {\n names.push(\n {\n e.preventDefault();\n app.modal.show(PostLikesModal, { post });\n }}\n >\n {label}\n \n );\n } else {\n names.push({label});\n }\n }\n\n items.add(\n 'liked',\n
\n {icon('far fa-thumbs-up')}\n {app.translator.trans('flarum-likes.forum.post.liked_by' + (likes[0] === app.session.user ? '_self' : '') + '_text', {\n count: names.length,\n users: punctuateSeries(names),\n })}\n
\n );\n }\n });\n}\n","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport UserPage from 'flarum/forum/components/UserPage';\nimport LinkButton from 'flarum/common/components/LinkButton';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport type Mithril from 'mithril';\n\nexport default function addLikesTabToUserProfile() {\n extend(UserPage.prototype, 'navItems', function (items: ItemList) {\n const user = this.user;\n items.add(\n 'likes',\n \n {app.translator.trans('flarum-likes.forum.user.likes_link')}\n ,\n 88\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","_extends","assign","target","i","arguments","length","source","apply","this","_defineProperties","props","descriptor","configurable","writable","w","window","Proxy","_","properties","Reflect","app","set","PostLikesModalState","params","page","limit","Constructor","protoProps","pageSize","location","pages","initialLoading","loadingPrev","loadingNext","clear","m","redraw","loadPrev","getLocation","Promise","resolve","getPrevPageNumber","loadPage","then","parseResults","loadNext","getNextPageNumber","pg","results","pageNum","Number","links","payload","number","items","hasNext","next","hasPrev","prev","isEmpty","push","unshift","reqParams","requestParams","include","Array","isArray","join","offset","store","find","type","refreshParams","newParams","paramsChanged","refresh","getPages","isLoading","isInitialLoading","isLoadingPrev","isLoadingNext","hasItems","getAllItems","getParams","isNaN","Math","max","keys","some","map","flat","_objectWithoutPropertiesLoose","excluded","sourceKeys","indexOf","Component","element","attrs","state","oninit","vnode","setAttrs","oncreate","dom","onbeforeupdate","onupdate","onbeforeremove","onremove","$","selector","$element","component","children","componentAttrs","initAttrs","Error","name","r","e","t","f","n","extractText","vdom","String","text","LoadingIndicator","view","display","size","containerClassName","className","completeClassName","classList","completeContainerClassName","translator","trans","role","containerAttrs","Button","title","ariaLabel","iconName","icon","disabled","loading","_class","onclick","buttonAttrs","hasIcon","getButtonContent","getAttribute","forum","attribute","console","warn","fireDebugWarning","fontClass","PostLikesModal","filter","liked","post","id","content","user","href","avatar","username","Modal","PostLikedNotification","notification","subject","fromUser","count","excerpt","truncate","contentPlain","Notification","LikesUserPage","loadResults","likedBy","loadLimit","sort","PostsUserPage","Extend","add","Post","hasMany","extend","CommentPost","isHidden","canLike","likes","isLiked","save","data","relationships","like","splice","overLimit","likesCount","names","slice","label","preventDefault","users","punctuateSeries","UserPage","slug","NotificationGrid"],"sourceRoot":""} \ No newline at end of file diff --git a/extensions/mentions/js/dist/forum.js.map b/extensions/mentions/js/dist/forum.js.map index b3b7df1a7..88dc9a8df 100644 --- a/extensions/mentions/js/dist/forum.js.map +++ b/extensions/mentions/js/dist/forum.js.map @@ -1 +1 @@ -{"version":3,"file":"forum.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,wSCL9D,MAAM,EAA+BC,OAAOC,KAAKC,OAAO,iBCAlD,EAA+BF,OAAOC,KAAKC,OAAO,a,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,qC,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,uBCAlD,EAA+BF,OAAOC,KAAKC,OAAO,oC,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,yB,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,gC,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,gC,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,sC,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,0B,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,kC,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,2B,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,uB,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,4B,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,2B,aCAzC,SAASW,IAYtB,OAXAA,EAAWzB,OAAO0B,OAAS1B,OAAO0B,OAAOR,OAAS,SAAUS,GAC1D,IAAK,IAAIC,EAAI,EAAGA,EAAIC,UAAUC,OAAQF,IAAK,CACzC,IAAIG,EAASF,UAAUD,GACvB,IAAK,IAAI9B,KAAOiC,EACV/B,OAAOM,UAAUC,eAAeC,KAAKuB,EAAQjC,KAC/C6B,EAAO7B,GAAOiC,EAAOjC,GAG3B,CACA,OAAO6B,CACT,EACOF,EAASO,MAAMC,KAAMJ,UAC9B,CCbA,SAASK,EAAkBP,EAAQQ,GACjC,IAAK,IAAIP,EAAI,EAAGA,EAAIO,EAAML,OAAQF,IAAK,CACrC,IAAIQ,EAAaD,EAAMP,GACvBQ,EAAWlC,WAAakC,EAAWlC,aAAc,EACjDkC,EAAWC,cAAe,EACtB,UAAWD,IAAYA,EAAWE,UAAW,GACjDtC,OAAOC,eAAe0B,EAAQS,EAAWtC,IAAKsC,EAChD,CACF,CCRA,MAAM,EAA+BxB,OAAOC,KAAKC,OAAO,oC,ICcnCyB,EAAqB,YACxC,WAAYC,EAAWC,GAG2B,YAHf,IAAZA,IAAAA,EAAe,GAGpCD,EAAOC,KAAO,KAAMD,EAAOC,MAAQ,CAAC,EAAC,CAAGC,MAF1B,KAId,YAAMF,EAAQC,EAJA,KAIY,IAC5B,CFZa,IAAsBE,EAAaC,EEgB/C,OAXuC,OFLLD,EEYlC,GFZ+CC,EEY/C,iBAED,WACE,MAAO,OACT,MFfgBV,EAAkBS,EAAYrC,UAAWsC,GAEzD5C,OAAOC,eAAe0C,EAAa,YAAa,CAC9CL,UAAU,IEYX,EAXuC,C,MAAoEO,ICDzFC,EAAgB,uFA0DlC,OA1DkC,EAInCC,OAAA,SAAOC,GACL,YAAMD,OAAM,UAACC,GAEbf,KAAKgB,MAAQ,IAAIV,EAAsB,CACrCW,OAAQ,CACNC,cAAelB,KAAKmB,MAAMC,KAAKC,MAEjCC,KAAM,WAGRtB,KAAKgB,MAAMO,SACb,EAAC,EAEDC,UAAA,WACE,MAAO,kBACT,EAAC,EAEDC,MAAA,WACE,OAAOC,IAAAA,WAAAA,MAAqB,2CAC9B,EAAC,EAEDC,QAAA,WAA4B,WAC1B,OACE,WACE,SAAKH,UAAU,cACZxB,KAAKgB,MAAMY,mBACV,EAAC,IAAgB,MAEjB,WACE,QAAIJ,UAAU,sFACXxB,KAAKgB,MAAMa,WAAWC,KAAI,SAACtB,GAAI,OAC9BA,EAAKuB,MAAMD,KAAI,SAACE,GAAK,OACnB,QAAI,cAAaA,EAAMC,UACrB,EAAC,IAAW,CAACb,KAAMY,EAAOE,QAAS,kBAAMR,IAAAA,MAAAA,OAAiB,IACvD,GACL,OAMX1B,KAAKgB,MAAMmB,WACV,SAAKX,UAAU,gBACb,SAAKA,UAAU,uBACb,SAAKA,UAAU,cACb,EAAC,IAAM,CAACA,UAAU,uBAAuBU,QAAS,kBAAM,EAAKlB,MAAMoB,UAAU,EAAEC,QAASrC,KAAKgB,MAAMsB,iBAChGZ,IAAAA,WAAAA,MAAqB,2DAQtC,EAAC,EA1DkC,CAA8Ea,KCbnH,MAAM,EAA+B5D,OAAOC,KAAKC,OAAO,kC,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,qC,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,4B,aCUlD2D,EAAqB,WAAH,OAASC,IAAYf,IAAAA,WAAAA,MAAqB,kCAAkC,EAUrF,SAASgB,EAAoBC,EAAMC,GAChD,YAD8D,IAAdA,IAAAA,GAAiB,GAC5DD,IAESC,EAAiBD,EAAKE,cAAgBF,EAAKG,aAAeN,KAE5DO,QAAQ,qBAAsB,KAJxBP,IAAqBO,QAAQ,qBAAsB,IAKvE,CCFe,SAASC,EAAeL,EAAMM,EAAQC,GACnD,QAAaC,IAATR,QAAiCQ,IAAXF,EACxB,ODlBoCvB,IAAAA,MAAAA,UAAoB,8BCqB/C,IADWgB,EAAoBC,GAAM,GAKvC,KADWD,EAAoBC,GACjB,KAAKA,EAAKtB,KAC1B,QAAa8B,IAATR,QAAiCQ,IAAXF,EAG/B,MAAO,KADWP,EAAoBC,GACjB,MAAMM,EACtB,QAAcE,IAAVD,EAET,MAAO,KAAKA,EAAME,aAAY,MAAMF,EAAM7B,KAE1C,KAAM,2BAEV,CCvCO,SAASgC,EAAcjC,EAAMkC,EAAUC,GAC5C,OAAO,IAAIC,SAAQ,SAACC,GAClB,IACMC,EAAUV,EADH5B,EAAKuB,OACmBvB,EAAKC,MAAQ,IAK7CiC,EAASK,OAAOhC,YACnB2B,EAASM,KAAKzC,MAAM0C,gBAAkBH,GAGxC,IAAMI,EAAiBR,EAASS,OAAOC,oBAAoB,GACrDC,EAAYX,EAASK,OAAOhC,UAAUuC,MAAM,EAAGJ,GAC/CK,EAAwC,GAApBF,EAAUpE,OAAc,EAAI,EAAIoE,EAAUG,MAAM,cAAc,GAAGvE,OAO3F,OALAyD,EAASS,OAAOM,eACdC,MAAMH,GAAmBI,KAAK,OAC3BhB,EAAQ,KAAOG,EAAUH,EAAMiB,OAAOzB,QAAQ,MAAO,QAAU,OAASW,IAC3E,GAEKD,EAAQH,EACjB,GACF,CAEe,SAAStB,EAAMZ,EAAMmC,GAClC,OAAI7B,IAAAA,SAAAA,YAAyB+C,MAAqB/C,IAAAA,SAAAA,KAAAA,MAAAA,KAAAA,eAA8CN,EAAKsD,aAG5FrB,EAAcjC,EAAMM,IAAAA,SAAc6B,GAKlCoB,IAAAA,YAAAA,KAAoCvD,EAAKsD,cAAcE,MAAK,SAACtB,GAAQ,OAAKD,EAAcjC,EAAMkC,EAAUC,EAAM,GAEzH,CCzCA,MAAM,EAA+B5E,OAAOC,KAAKC,OAAO,mB,aCMnCgG,GAAe,YAClC,WAAYzD,GAAM,MAGC,OAFjB,gBAAO,MAEFA,KAAOA,EAAK,CACnB,CALkC,OAKjC,kBAyCA,OAzCA,EAED0D,KAAA,WAAO,WACL,OACE,YACEC,MAAM,yBACN7C,QAAS,WACPF,EAAM,EAAKZ,KAAM,EAAKO,QACxB,GAECqD,IAAK,oBAAqB,CAAExD,UAAW,gBACvCE,IAAAA,WAAAA,MAAqB,2CAG5B,EAAC,EAEDuD,KAAA,SAAKC,EAAMC,GACT,IAAMC,EAAQpF,KAAKqF,IAAIJ,OACjBK,EAAeF,EAAMG,eAAeC,SAE1CJ,EAAMK,IAAI,OAAQP,EAAOI,EAAaJ,MAAMO,IAAI,MAAON,EAAMG,EAAaH,KAE1EnF,KAAK0F,YAAc1F,KAAK2F,KAAK1G,KAAKe,MAClCqF,EAAEO,UAAUC,GAAG,UAAW7F,KAAK0F,YACjC,EAAC,EAEDI,UAAA,SAAUZ,EAAMC,GACd,IAAMC,EAAQpF,KAAKqF,IAEnBrF,KAAKiF,KAAKC,EAAMG,EAAEU,QAAQC,YAAcb,EAAMC,EAAMa,cAAgB,EACtE,EAAC,EAEDC,QAAA,SAAQC,EAAOC,GACb,IAAMhB,EAAQpF,KAAKqF,IAEnBrF,KAAKiF,KAAKkB,EAAQf,EAAMiB,aAAchB,EAAEU,QAAQC,YAAcI,EAAS,EACzE,EAAC,EAEDT,KAAA,WACE3F,KAAKqF,IAAIM,OACTN,EAAEO,UAAUU,IAAI,UAAWtG,KAAK0F,YAClC,EAAC,EA9CiC,CAASa,KCH9B,SAASC,GAAa5C,GACnC,IAAM6C,EAAYV,OAAOW,eAEzB,IAAKD,EAAUE,YAAa,CAC1B,IAAMC,EAAQH,EAAUI,WAAW,GAC7BC,EAASF,EAAMG,wBAErB,GAAInD,EAAK,KAAOkD,GAAUzB,EAAE2B,SAASpD,EAAK,GAAIkD,GAAS,CACrD,IAAMG,EAAQ5B,EAAE,SAAS6B,OAAON,EAAMO,iBAiBtC,OAdAF,EAAMG,KAAK,aAAaC,aAAY,WAClC,OAAOrH,KAAKsH,GACd,IAGAL,EAAMG,KAAK,OAAOC,aAAY,WAC5B,MAAO,OAAOrH,KAAKuH,IAAG,GACxB,IAGAN,EAAMG,KAAK,KAAKC,aAAY,WAC1B,MAAO,IAAIrH,KAAKwH,UAAS,KAAKxH,KAAKyH,KAAI,GACzC,IAEOR,EAAMS,MACf,CACF,CACA,MAAO,EACT,CChCA,MAAM,GAA+B/I,OAAOC,KAAKC,OAAO,gC,eCAxD,MAAM,GAA+BF,OAAOC,KAAKC,OAAO,sC,eCAxD,MAAM,GAA+BF,OAAOC,KAAKC,OAAO,kC,eCAxD,MAAM,GAA+BF,OAAOC,KAAKC,OAAO,yB,eCAxD,MAAM,GAA+BF,OAAOC,KAAKC,OAAO,4B,eCAxD,MAAM,GAA+BF,OAAOC,KAAKC,OAAO,oC,eCAxD,MAAM,GAA+BF,OAAOC,KAAKC,OAAO,iCCAlD,GAA+BF,OAAOC,KAAKC,OAAO,2B,eCAxD,MAAM,GAA+BF,OAAOC,KAAKC,OAAO,uB,eCEnC8I,GAAoB,mGAId,OAJc,0CACvC5F,MAAQ,GAAE,EACV6F,QAAS,EAAK,EACdC,MAAQ,EAAC,EACTC,mBAAoB,EAAK,EAJc,OAId,kBAyExB,OAzEwB,EAEzBhD,KAAA,WACE,OACE,QAAItD,UAAU,kCACXxB,KAAK+B,MAAMD,KAAI,SAACiG,GAAI,OACnB,YAAKA,EAAU,IAIvB,EAAC,EAED9C,KAAA,SAAKC,EAAMC,GACTnF,KAAKqF,IACFJ,OACAQ,IAAI,CACHP,KAAMA,EAAO,KACbC,IAAKA,EAAM,OAEfnF,KAAK4H,QAAS,CAChB,EAAC,EAEDjC,KAAA,WACE3F,KAAKqF,IAAIM,OACT3F,KAAK4H,QAAS,CAChB,EAAC,EAEDI,SAAA,SAASC,GAAO,WACdjI,KAAK8H,mBAAoB,EACzB9H,KAAKkI,SAASlI,KAAK6H,MAAQI,GAAO,GAClCE,aAAanI,KAAKoI,0BAClBpI,KAAKoI,yBAA2BC,YAAW,kBAAO,EAAKP,mBAAoB,CAAK,GAAG,IACrF,EAAC,EAEDQ,SAAA,WACEtI,KAAKqF,EAAE,MAAMkD,GAAGvI,KAAK6H,OAAOT,KAAK,UAAUoB,OAC7C,EAAC,EAEDN,SAAA,SAASL,EAAOY,GACd,IAAIzI,KAAK8H,mBAAsBW,EAA/B,CAEA,IAAMC,EAAY1I,KAAKqF,IACjBsD,EAASD,EAAUtB,KAAK,MAC1BwB,EAAcf,EAEde,EAAc,EAChBA,EAAcD,EAAO9I,OAAS,EACrB+I,GAAeD,EAAO9I,SAC/B+I,EAAc,GAGhB5I,KAAK6H,MAAQe,EAEb,IAAMC,EAAQF,EAAOG,YAAY,UAAUP,GAAGK,GAAaG,SAAS,UAEpE,GAAIN,EAAc,CAChB,IAMIzC,EANEgD,EAAiBN,EAAU1C,YAC3BiD,EAAcP,EAAUlD,SAASL,IACjC+D,EAAiBD,EAAcP,EAAUzC,cACzCkD,EAAUN,EAAMrD,SAASL,IACzBiE,EAAaD,EAAUN,EAAM5C,cAG/BkD,EAAUF,EACZjD,EAAYgD,EAAiBC,EAAcE,EAAUE,SAASX,EAAUjD,IAAI,eAAgB,IACnF2D,EAAaF,IACtBlD,EAAYgD,EAAiBE,EAAiBE,EAAaC,SAASX,EAAUjD,IAAI,kBAAmB,UAG9E,IAAdO,GACT0C,EAAUY,MAAK,GAAMC,QAAQ,CAAEvD,UAAAA,GAAa,IAEhD,CAjCmD,CAkCrD,EAAC,EA7EsC,CAASO,KCgB5CiD,IAAkBC,EAAAA,GAAAA,UACtB,KACA,SAAUC,EAAOC,EAAUC,EAAeC,EAAiBC,EAAUC,GACnE,IAAMC,EAAaN,EAAMO,cACpBN,EAASO,SAASF,KACrBtI,IAAAA,MAAAA,KAAe,QAAS,CAAET,OAAQ,CAAEkJ,EAAGT,GAASlJ,KAAM,CAAEC,MAAO,KAAOmE,MAAK,SAACwF,GAC1EA,EAAQC,SAAQ,SAACC,GACVT,EAAgBU,IAAID,EAAEjJ,QACzBwI,EAAgBW,IAAIF,EAAEjJ,MACtBuI,EAAca,KAAKH,GAEvB,IAEAP,GACF,IAEAJ,EAASc,KAAKT,GAElB,ICpCF,MAAM,GAA+BrL,OAAOC,KAAKC,OAAO,iC,eCInC6L,GAAyB,uFAsB3C,OAtB2C,EAC5C1F,KAAA,WACE,MAAO,cACT,EAAC,EAEDyC,KAAA,WACE,IAAMkD,EAAe3K,KAAKmB,MAAMwJ,aAC1BvJ,EAAOuJ,EAAaC,UACpBjJ,EAAUgJ,EAAahJ,UAE7B,OAAOD,IAAAA,MAAAA,WAAqBN,EAAKsD,aAAc/C,GAAWA,EAAQkJ,YACpE,EAAC,EAEDlJ,QAAA,WACE,IACMgB,EADe3C,KAAKmB,MAAMwJ,aACNG,WAE1B,OAAOpJ,IAAAA,WAAAA,MAAqB,0DAA2D,CAAEiB,KAAAA,EAAMoI,MAAO,GACxG,EAAC,EAEDC,QAAA,WACE,OAAOC,EAAAA,EAAAA,UAASjL,KAAKmB,MAAMwJ,aAAaC,UAAUM,gBAAkB,GAAI,IAC1E,EAAC,EAtB2C,CAASC,MCAlCC,GAAyB,uFAmB3C,OAnB2C,EAC5CpG,KAAA,WACE,MAAO,WACT,EAAC,EAEDyC,KAAA,WACE,IAAMrG,EAAOpB,KAAKmB,MAAMwJ,aAAaC,UAErC,OAAOlJ,IAAAA,MAAAA,WAAqBN,EAAKsD,aAActD,EAAKa,SACtD,EAAC,EAEDN,QAAA,WACE,IAAMgB,EAAO3C,KAAKmB,MAAMwJ,aAAaG,WAErC,OAAOpJ,IAAAA,WAAAA,MAAqB,0DAA2D,CAAEiB,KAAAA,GAC3F,EAAC,EAEDqI,QAAA,WACE,OAAOC,EAAAA,EAAAA,UAASjL,KAAKmB,MAAMwJ,aAAaC,UAAUM,eAAgB,IACpE,EAAC,EAnB2C,CAASC,MCAlCE,GAA0B,uFAmB5C,OAnB4C,EAC7CrG,KAAA,WACE,MAAO,WACT,EAAC,EAEDyC,KAAA,WACE,IAAMrG,EAAOpB,KAAKmB,MAAMwJ,aAAaC,UAErC,OAAOlJ,IAAAA,MAAAA,WAAqBN,EAAKsD,aAActD,EAAKa,SACtD,EAAC,EAEDN,QAAA,WACE,IAAMgB,EAAO3C,KAAKmB,MAAMwJ,aAAaG,WAErC,OAAOpJ,IAAAA,WAAAA,MAAqB,2DAA4D,CAAEiB,KAAAA,GAC5F,EAAC,EAEDqI,QAAA,WACE,OAAOC,EAAAA,EAAAA,UAASjL,KAAKmB,MAAMwJ,aAAaC,UAAUM,eAAgB,IACpE,EAAC,EAnB4C,CAASC,MCJxD,MAAM,GAA+BxM,OAAOC,KAAKC,OAAO,6B,eCAxD,MAAM,GAA+BF,OAAOC,KAAKC,OAAO,gC,eCAxD,MAAM,GAA+BF,OAAOC,KAAKC,OAAO,sB,eCAnBF,OAAOC,KAAKC,OAAO,gBAAxD,MCAM,GAA+BF,OAAOC,KAAKC,OAAO,oB,eCAxD,MAAM,GAA+BF,OAAOC,KAAKC,OAAO,sB,eCAxD,MAAM,GAA+BF,OAAOC,KAAKC,OAAO,kC,ICMnCyM,GAAgB,8DAiBlC,OAjBkC,mBAQnCC,YAAA,SAAY/F,GACV,OAAO9D,IAAAA,MAAAA,KAAe,QAAS,CAC7BT,OAAQ,CACNuK,KAAM,UACNC,UAAWzL,KAAK2C,KAAKtB,MAEvBb,KAAM,CAAEgF,OAAAA,EAAQ/E,MAAOT,KAAK0L,WAC5BpK,KAAM,cAEV,EAAC,EAjBkC,C,OAASqK,ICD9C,WACE,IAAIC,KAAAA,SACDpB,IAAI,gBAAiB,wBAAyBc,IAEjD,IAAIM,KAAAA,OAAaC,MACdC,QAAc,eACdC,UAAkB,oBAErB,IAAIH,KAAAA,OAAaI,MACdD,UAAmB,qBCVjB,SAASE,GAAmBC,GACjC,IAAIvJ,EAMJ,GAJIjB,IAAAA,MAAAA,UAAoB,+BAAiCwK,EAAIC,aAAa,YACxExJ,EAAOjB,IAAAA,MAAAA,MAAgB,QAAS,WAAYwK,EAAIE,aAAa,aACtDF,EAAIC,aAAa,QAAOxJ,EAAOjB,IAAAA,MAAAA,QAAkB,QAASwK,EAAIE,aAAa,QAEhFzJ,EAKF,OAJAuJ,EAAIG,aAAa,KAAM1J,EAAKtB,MAC5B6K,EAAIG,aAAa,OAAQ1J,EAAK2J,QAC9BJ,EAAIG,aAAa,cAAe5J,IAAYK,IAASH,MAE9C,EAGTuJ,EAAIK,YACN,CAEO,SAASC,GAAmBN,GACjC,IAAM9K,EAAOM,IAAAA,MAAAA,QAAkB,QAASwK,EAAIE,aAAa,OAEzD,GAAIhL,EAKF,OAJA8K,EAAIG,aAAa,eAAgBjL,EAAKsD,aAAarD,MACnD6K,EAAIG,aAAa,SAAUjL,EAAKa,UAChCiK,EAAIG,aAAa,cAAe5J,IAAYK,IAAS1B,EAAKuB,WAEnD,CAEX,CAEO,SAAS8J,GAAoBP,GAAK,QACvC,GAAe,OAAf,EAAIxK,IAAAA,UAAiB,OAAN,EAAX,EAAaiB,OAAb,EAAmB+J,mBAAoB,CACzC,IAAMxJ,EAAQxB,IAAAA,MAAAA,QAAkB,SAAUwK,EAAIE,aAAa,OAE3D,GAAIlJ,EAKF,OAJAgJ,EAAIG,aAAa,YAAa5J,IAAYS,EAAME,eAChD8I,EAAIG,aAAa,OAAQnJ,EAAM8B,QAC/BkH,EAAIG,aAAa,QAASnJ,EAAMyJ,UAEzB,CAEX,CAEAT,EAAIK,YACN,CCpCA,UACE,uCAAwCjB,GACxC,gDAAiDZ,GACjD,gDAAiDU,GACjD,iDAAkDC,GAClD,0CAA2C1D,GAC3C,qCAAsC9C,GACtC,qCAAsCnC,EACtC,gCAAiCM,EACjC,uBAAwBhB,EACxB,8BAA+BwE,GAC/B,+BAAgCoG,GCvB5B,GAA+BjO,OAAOC,KCsB5C8C,IAAAA,aAAAA,IAAqB,mBAAmB,WjBiBzB,IACPmL,EACA/C,GkBpCO,WACb,SAASgD,IACP,IAAMC,EAAc/M,KAAKmB,MAAMC,KAAK2L,cAEpC,GAAIA,IAAgB/M,KAAKgN,qBAAsBhN,KAAKiN,YAApD,CAEAjN,KAAKgN,mBAAqBD,EAE1B,IAAMG,EAAalN,KAAKmB,MAAMC,KACxB+L,EAAcnN,KAAKqF,IAEzBrF,KAAKqF,IAAIQ,GAAG,QAAS,oFAAoF,SAAUuH,GACjHC,EAAEC,MAAMC,IAAIvN,KAAKoM,aAAa,SAC9BgB,EAAEI,gBACJ,IAEAxN,KAAKqF,EAAE,2CAA2CoI,MAAK,WACrD,IAEIC,EAFEtI,EAAQC,EAAErF,MACVqB,EAAK+D,EAAMuI,KAAK,MAKhBC,EAAWvI,EAAE,wDACnB8H,EAAYjG,OAAO0G,GAEnB,IAAMC,EAAiB,WACrB,OAAOxI,EAAE,6BAA6BhE,EAAE,KAC1C,EAEMyM,EAAc,WAIlB,IAAMC,EAAQF,IACVG,GAAU,EACd,GAAID,EAAMlO,OAAQ,CAChB,IAAMsF,EAAM4I,EAAMvI,SAASL,IACrBa,EAAYD,OAAOkI,YACrB9I,EAAMa,GAAab,EAAM4I,EAAMG,SAAWlI,EAAYX,EAAEU,QAAQmI,WAClEH,EAAMhF,SAAS,WACfiF,GAAU,EAEd,CAIA,IAAKA,EAAS,CAGZ,IAAMG,EAAkB,WACtB,IAAMC,EAAgBR,EAAS3H,aAAY,GACvCT,EAAS,EAITJ,EAAMI,SAASL,IAAMiJ,EAAgB/I,EAAEU,QAAQC,YAAcX,EAAE,WAAWY,cAC5ET,GAAUJ,EAAMa,aAAY,GAE5BT,GAAU4I,EAGZR,EACG3I,OACAQ,IAAI,MAAOL,EAAMI,SAASL,IAAMgI,EAAY3H,SAASL,IAAMK,GAC3DC,IAAI,OAAQL,EAAMG,eAAeC,SAASN,KAAOiI,EAAY3H,SAASN,MACtEO,IAAI,YAAaL,EAAMG,eAAe8I,QAC3C,EAEMC,EAAW,SAAClN,GAChB,IAAMsD,EAAatD,EAAKsD,aAExB2I,EAAEkB,OAAOX,EAAS,GAAI,CACpBlJ,IAAewI,EAAWxI,aACxB,YACE,UAAMlD,UAAU,kCAAkCkD,EAAWjD,UAG/D,GAEF,YAAK+M,IAAAA,UAAsB,CAAEpN,KAAAA,OAE/B+M,GACF,EAEM/M,EAAOM,IAAI+M,MAAMC,QAAQ,QAASrN,GACpCD,GAAQA,EAAKsD,aACf4J,EAASlN,IAETiM,EAAEkB,OAAOX,EAAS,GAAIe,IAAAA,aACtBjN,IAAI+M,MAAMrH,KAAK,QAAS/F,GAAIuD,KAAK0J,GACjCH,KAGF9F,YAAW,kBAAMuF,EAAStH,IAAI,iBAAiByC,SAAS,KAAK,GAC/D,CACF,EAEM6F,EAAc,WAClBf,IAAiB/E,YAAY,WACzB8E,EAASiB,SAAS,OACpBjB,EAAS9E,YAAY,MAAMgG,IAAI,iBAAiB,kBAAMlB,EAASjI,MAAM,GAEzE,EAKAP,EAAMS,GAAG,YAAY,SAACuH,GAChBA,EAAE2B,YACJ3B,EAAEI,gBAEN,IAEApI,EACGoF,IAAIoD,GACJoB,OACC,WACE7G,aAAauF,GACbA,EAAUrF,WAAWyF,EAAa,IACpC,IACA,WACE3F,aAAauF,GACbG,IAAiB/E,YAAY,WAC7B4E,EAAUrF,WAAWuG,EAAa,IACpC,IAED/I,GAAG,YAAY,SAACuH,GACfU,IACAV,EAAE6B,iBACJ,IAEF5J,EAAEO,UAAUC,GAAG,WAAY+I,EAC7B,GAjIuE,CAkIzE,EAEAM,EAAAA,EAAAA,QAAOC,IAAAA,UAAuB,WAAYrC,IAC1CoC,EAAAA,EAAAA,QAAOC,IAAAA,UAAuB,WAAYrC,EAC5C,CDtHEsC,GEda,WACb,SAASR,IACP5O,KAAKqF,EAAE,6BACJyD,YAAY,MACZgG,IAAI,iBAAiB,WACpBzJ,EAAErF,MAAM2F,MACV,GACJ,EAEAuJ,EAAAA,EAAAA,QAAOC,IAAAA,UAAuB,YAAY,WAAY,IAChDzB,EADgD,OAE9CtM,EAAOpB,KAAKmB,MAAMC,KAClBiO,EAAUjO,EAAKkO,cAErB,GAAID,GAAWA,EAAQxP,OAAQ,CAC7B,IAAM+N,EAAWvI,EAAE,6DACnBrF,KAAKqF,IAAI6B,OAAO0G,GAEhB,IAAMT,EAAcnN,KAAKqF,IACnBD,EAAQpF,KAAKqF,EAAE,qBAEfyI,EAAc,YACbF,EAASiB,SAAS,OAASjB,EAAS2B,GAAG,cAK5ClC,EAAEkB,OACAX,EAAS,GACT,WACGyB,EAAQvN,KAAI,SAACE,GAAK,OACjB,QAAI,cAAaA,EAAMC,UACpBuM,IAAAA,UAAsB,CACrBpN,KAAMY,EACNE,QAAS0M,EAAY3P,KAAK,KAEzB,IAENoQ,EAAQxP,OAASuB,EAAKoO,mBACrB,QAAIhO,UAAU,iCACZ,EAAC,IAAM,CACLA,UAAU,qBACVU,QAAS,WACP0M,EAAYrQ,KAAK,GACjBmD,IAAAA,MAAAA,KAAeb,EAAkB,CAAEO,KAAAA,GACrC,GAEA,UAAMI,UAAU,uBACd,UAAMA,UAAU,4BAA4BwD,IAAK,qBACjD,cACGtD,IAAAA,WAAAA,MAAqB,oDAAqD,CAAEqJ,MAAO3J,EAAKoO,mBAAqBH,EAAQxP,aAK5H,OAIR+N,EACG3I,OACAQ,IAAI,MAAOL,EAAMI,SAASL,IAAMgI,EAAY3H,SAASL,IAAMC,EAAMa,aAAY,IAC7ER,IAAI,OAAQL,EAAMG,eAAeC,SAASN,KAAOiI,EAAY3H,SAASN,MACtEO,IAAI,YAAa0H,EAAYkB,SAEhChG,YAAW,kBAAMuF,EAAStH,IAAI,iBAAiByC,SAAS,KAAK,IAC/D,EAEA3D,EAAMoF,IAAIoD,GAAUoB,OAClB,WACE7G,aAAauF,GACbA,EAAUrF,WAAWyF,EAAa,IACpC,IACA,WACE3F,aAAauF,GACbA,EAAUrF,WAAWuG,EAAa,IACpC,IAMF5O,KAAKqF,IACF+B,KAAK,+BACL4H,OACC,WACEpB,EAASxG,KAAK,iBAAmB/B,EAAErF,MAAM2N,KAAK,UAAY,MAAM5E,SAAS,SAC3E,IACA,WACE6E,EAASxG,KAAK,iBAAiB0B,YAAY,SAC7C,GAEN,CACF,KAEAoG,EAAAA,EAAAA,QAAOC,IAAAA,UAAuB,eAAe,SAAUpN,GAAO,WAEtDsN,EADOrP,KAAKmB,MAAMC,KACHkO,cAErB,GAAID,GAAWA,EAAQxP,OAAQ,CAC7B,IAAM4P,EAAQ,GACRC,EAAWL,EACd/N,MAAK,SAACU,GAAK,OAAMA,EAAMW,SAAWjB,IAAAA,QAAAA,MAAoB,EAAI,CAAC,IAC3DT,QAAO,SAACe,GACP,IAAMW,EAAOX,EAAMW,OACnB,IAA6B,IAAzB8M,EAAME,QAAQhN,GAEhB,OADA8M,EAAMhF,KAAK9H,IACJ,CAEX,IAGIiN,EAAYF,EAAS7P,OADb,EAKRgQ,EAAQH,EAASxL,MAAM,EAAG0L,EAAYnP,EAL9B,GAKiDqB,KAAI,SAACE,GAClE,IAAMW,EAAOX,EAAMW,OAEnB,OACE,EAAC,IAAI,CAAC8E,KAAM/F,IAAAA,MAAAA,KAAeM,GAAQE,QAAS0M,EAAY3P,KAAK,GAAO,cAAa+C,EAAMC,UACpFP,IAAAA,QAAAA,OAAqBiB,EAAOjB,IAAAA,WAAAA,MAAqB,uCAAyCoB,IAASH,GAG1G,IAKA,GAAIiN,EAAW,CACb,IAAM7E,EAAQ2E,EAAS7P,OAASgQ,EAAMhQ,OAEtCgQ,EAAMpF,KAAK/I,IAAAA,WAAAA,MAAqB,yCAA0C,CAAEqJ,MAAAA,IAC9E,CAEAhJ,EAAMyI,IACJ,UACA,SAAKhJ,UAAU,oBACb,UAAMA,UAAU,4BACbwD,IAAK,gBACLtD,IAAAA,WAAAA,MAAqB,2CAA6CgO,EAAS,GAAG/M,SAAWjB,IAAAA,QAAAA,KAAmB,QAAU,IAAM,QAAS,CACpIqJ,MAAO8E,EAAMhQ,OACb4P,MAAOK,IAAgBD,OAKjC,CACF,GACF,CFnIEE,IGrBAb,EAAAA,EAAAA,QAAOC,IAAAA,UAAuB,eAAe,SAAUpN,GACrD,IAAMX,EAAOpB,KAAKmB,MAAMC,KAEpBA,EAAK4O,YAAetO,IAAAA,QAAAA,OAAqBN,EAAKsD,aAAauL,YAE/DlO,EAAMyI,IACJ,QACA,EAAC,IAAM,CAAChJ,UAAU,sBAAsBU,QAAS,kBAAMF,EAAMZ,EAAK,GAC/DM,IAAAA,WAAAA,MAAqB,0CAG5B,KCXAwN,EAAAA,EAAAA,QAAOC,IAAAA,UAAuB,YAAY,WACxC,IAAM/N,EAAOpB,KAAKmB,MAAMC,KAExB,KAAIA,EAAK4O,YAAetO,IAAAA,QAAAA,OAAqBN,EAAKsD,aAAauL,YAA/D,CAEA,IAAMC,EAAYlQ,KAAKqF,EAAE,cAInBwH,EAAaxH,EAAE,iDAEf8K,EAAS,IAAItL,GAAgBzD,GAE7BgP,EAAU,SAAUhD,GACxB/E,YAAW,WACT,IAAM1G,EAAU6E,GAAa0J,GAC7B,GAAIvO,EAAS,CACXwO,EAAOxO,QAAUA,EACjB0L,EAAEkB,OAAO1B,EAAW,GAAIsD,EAAO5B,UAE/B,IAAM8B,EAAQtK,OAAOW,eAAeG,WAAW,GAAGyJ,iBAC5CC,EAAYF,EAAM,GAExB,GAAIjD,EAAEoD,QAAUD,EAAUnK,QAAUgH,EAAEqD,QAAUF,EAAUpK,MAAQoK,EAAUrL,KAAOkI,EAAEqD,QACnFN,EAAOrK,UAAUyK,EAAUrL,KAAMqL,EAAUpL,SACtC,CACL,IAAMuL,EAAWL,EAAMA,EAAMxQ,OAAS,GACtCsQ,EAAOjK,QAAQwK,EAASvK,MAAOuK,EAAStK,OAC1C,CACF,CACF,GAAG,EACL,EAEApG,KAAKqF,IAAIsL,MAAM9D,GAAYhH,GAAG,UAAWuK,GAErC,iBAAkBrK,QACpBH,SAASgL,iBAAiB,kBAAmBR,GAAS,EAjC0B,CAmCpF,IrBNMvD,EAAaxH,EAAE,8DACfyE,EAAW,IAAInC,IAErBuH,EAAAA,EAAAA,QAAO2B,KAAAA,UAAsB,YAAY,WACvC,IAAMC,EAAU9Q,KAAKqF,EAAE,sBAAsB0L,KAAK,oDAElD/Q,KAAKgR,UAAY,IAAIC,MACrBjR,KAAKgR,UACFE,MAAK,kBAAMpH,EAASlC,MAAM,IAC1BuJ,MAAK,kBAAMrH,EAAS9B,UAAU,EAAE,IAChCoJ,QAAO,kBAAMtH,EAAS9B,SAAS,EAAE,IACjCqJ,SAASvH,EAASxB,SAASrJ,KAAK6K,IAChCwH,SAASxH,EAASnE,KAAK1G,KAAK6K,IAC5ByH,OAAOT,GAEVA,EAAQH,MAAM9D,EAChB,KAEAqC,EAAAA,EAAAA,QAAO2B,KAAAA,UAAsB,qBAAqB,SAAUtQ,GAAQ,IAE9DiR,EACAC,EACA/H,EACAgI,EAL8D,OAC5D/H,EAAW,GASXC,EAAgBtF,MAAMqN,KAAKjQ,IAAAA,MAAAA,IAAc,UACzCmI,EAAkB,IAAI+H,IAAIhI,EAAc9H,KAAI,SAACwI,GAAC,OAAKA,EAAEjJ,IAAI,KAGzDwQ,EAAiBvN,MAAMqN,KAC3BjQ,IAAAA,MAAAA,IAAc,UAAUT,QAAO,SAACiC,GAC9B,OAAOA,EAAM7B,MAAQyQ,KAAAA,UAAkB5O,EAAM7B,MAAQyQ,KAAAA,SACvD,KAGIC,EAAkB,SAACC,GACvB,EAAK7Q,MAAMmC,SAASS,OAAOkO,oBAAoBR,EAAkB,EAAGO,EAAc,KAElFlI,EAASnE,MACX,EAEApF,EAAO2R,eAAezH,MAAK,WACzB,IAAMhE,EAAY,EAAKtF,MAAMmC,SAASS,OAAOC,oBAEvCmO,EAAS1L,EAAU,GAEzB,KAAIA,EAAU,GAAK0L,EAAS,GAA5B,CAIA,IAAMC,EAAY,EAAKjR,MAAMmC,SAASS,OAAOsO,cAAc,IAC3DZ,EAAkB,EAClB,IAAK,IAAI9R,EAAIyS,EAAUvS,OAAS,EAAGF,GAAK,EAAGA,IAEzC,GAAkB,MADAyS,EAAUE,OAAO3S,EAAG,KACP,GAALA,GAAU,KAAK4S,KAAKH,EAAUE,OAAO3S,EAAI,EAAG,KAAM,CAC1E6R,EAAkB7R,EAAI,EACtB8R,EAAkBU,EAASC,EAAUvS,OAASF,EAAI,EAClD,KACF,CAMF,GAHAmK,EAASnE,OACTmE,EAASlC,QAAS,EAEd6J,EAAiB,CACnB/H,EAAQ0I,EAAUI,UAAUhB,GAAiBvH,cAC7CyH,EAAahI,EAAMtF,MAAM,yBACzBsF,EAASgI,GAAcA,EAAW,IAAOhI,EAEzC,IAAM+I,EAAiB,SAAU9P,EAAMqP,EAAarQ,EAASH,QAAS,IAATA,IAAAA,EAAY,IACvE,IAAMsB,EAAW4P,IAAe/P,GAOhC,OALI+G,IACF5G,EAAS6P,SAAW,CAACC,KAAU9P,EAAS4E,KAAMgC,WACvC5G,EAAS4E,MAIhB,YACElG,UAAW,eAAiBA,EAC5BU,QAAS,kBAAM6P,EAAgBC,EAAY,EAC3Ca,aAAc,WACZ/I,EAAS5B,SAAS7C,EAAErF,MAAM8G,SAASe,QACrC,GAEA,UAAMrG,UAAU,uBACbsR,KAAOnQ,GACPG,EAAQ,IAAGnB,GAIpB,EAyBMoR,EAAc,SAAUpQ,GAG5B,MAFc,CAACA,EAAKG,WAAYH,EAAKE,eAExBmQ,MAAK,SAACC,GAAI,OAAKA,EAAKhJ,cAAcqI,OAAO,EAAG5I,EAAM7J,UAAY6J,CAAK,GAClF,EAQMK,EAAmB,WACvB,IAIW,IAJLmJ,EAAc,GAyBpB,GArBIxJ,IACFE,EAAcS,SAAQ,SAAC1H,GAChBoQ,EAAYpQ,IAEjBuQ,EAAYzI,KAAKgI,EAAe9P,EAAMK,EAAeL,GAAO,GAAI,yBAClE,IAGe,OAAf,EAAIjB,IAAAA,UAAiB,OAAN,EAAX,EAAaiB,OAAb,EAAmB+J,oBACrBmF,EAAexH,SAAQ,SAACnH,IApBT,SAAUA,GAG7B,MAFc,CAACA,EAAMiQ,eAAgBjQ,EAAME,cAE9B4P,MAAK,SAACC,GAAI,OAAKA,EAAKhJ,cAAcqI,OAAO,EAAG5I,EAAM7J,UAAY6J,CAAK,GAClF,EAiBa0J,CAAalQ,IAElBgQ,EAAYzI,KApDQ,SAAUvH,EAAO8O,EAAarQ,EAASH,QAAS,IAATA,IAAAA,EAAY,IAC7E,IAAI6R,EAAYnQ,EAAME,aAAa6G,cAMnC,OAJIP,IACF2J,EAAYT,KAAUS,EAAW3J,IAIjC,YACElI,UAAW,eAAiBA,EAC5BU,QAAS,kBAAM6P,EAAgBC,EAAY,EAC3Ca,aAAc,WACZ/I,EAAS5B,SAAS7C,EAAErF,MAAM8G,SAASe,QACrC,GAEA,UAAMrG,UAAU,uBACd,EAAC,KAAK,CAACuD,MAAA,8BAAqC7B,EAAM7B,KAAI,eAAgBsL,MAAOzJ,EAAMyJ,QAASnB,KAAK,QAAQxG,KAAM9B,EAAM8B,SACrH,UAAMxD,UAAU,YAAY6R,IAIpC,CA+ByBC,CAAoBpQ,EAAOF,OAAeG,OAAWA,EAAWD,GAAQ,EAAI,0BAC/F,KAQA,EAAK/B,MAAMmC,SAASiQ,YAAYC,OAAkB,EAAKrS,MAAMmC,SAASiQ,YAAY9O,KAAmB,CACvG,IAAMgP,EAAgB,EAAKtS,MAAMmC,SAASM,KAAKzC,MACzCuS,EAAeD,EAAcrS,KAC7BsD,EAAcgP,GAAgBA,EAAahP,cAAiB+O,EAAc/O,WAE5EA,GACFA,EACGiP,QAEA1S,QAAO,SAACG,GAAI,OAAKA,GAA+B,YAAvBA,EAAKwS,iBAAiCF,GAAgBtS,EAAKa,SAAWyR,EAAazR,SAAS,IAErHX,MAAK,SAAC5D,EAAGmW,GAAC,OAAKA,EAAEC,YAAcpW,EAAEoW,WAAW,IAE5C7S,QAAO,SAACG,GACP,IAAMuB,EAAOvB,EAAKuB,OAClB,OAAOA,GAAQoQ,EAAYpQ,EAC7B,IAECoR,OAAO,EAAG,GAEV1J,SAAQ,SAACjJ,GACR,IAAMuB,EAAOvB,EAAKuB,OAClBuQ,EAAYzI,KACVgI,EACE9P,EACAK,EAAeL,EAAMvB,EAAKC,MAC1B,CACEK,IAAAA,WAAAA,MAAqB,oDAAqD,CAAEO,OAAQb,EAAKa,WACzF,OACAgJ,EAAAA,EAAAA,UAAS7J,EAAK8J,eAAgB,MAEhC,yBAGN,GAEN,CAEA,GAAIgI,EAAYrT,OAAQ,CACtBiK,EAAS/H,MAAQmR,EACjB7F,EAAEkB,OAAO1B,EAAW,GAAI/C,EAASyE,UAEjCzE,EAAS7E,OACT,IAAM+O,EAAc,EAAK7S,MAAMmC,SAASS,OAAOkQ,oBAAoBxC,GAC7DpD,EAAQvE,EAASzE,IAAIgB,aACrB6H,EAASpE,EAASzE,IAAIY,cACtBa,EAASgD,EAASzE,IAAIE,eACxBL,EAAO8O,EAAY9O,KACnBC,EAAM6O,EAAY7O,IAAM,GAGxBA,EAAM+I,EAASpH,EAAOoH,WACxB/I,EAAM6O,EAAY7O,IAAM+I,EAAS,IAE/BhJ,EAAOmJ,EAAQvH,EAAOuH,UACxBnJ,EAAO4B,EAAOuH,QAAUA,GAI1BlJ,EAAM+O,KAAKC,MAAMrN,EAAOtB,SAASL,IAAME,EAAEO,UAAUI,aAAcb,GACjED,EAAOgP,KAAKC,KAAKrN,EAAOtB,SAASN,KAAMA,GAEvC4E,EAAS7E,KAAKC,EAAMC,EACtB,MACE2E,EAASlC,QAAS,EAClBkC,EAASnE,MAEb,EAEAmE,EAASlC,QAAS,EAElBmC,IAEAD,EAAS5B,SAAS,GAClB4B,EAASzE,IAAIW,UAAU,GAInB0D,EAAM7J,OAAS,GAAK6B,IAAAA,MAAAA,UAAoB,mBAC1C8H,GAAgBE,EAAOC,EAAUC,EAAeC,EAAiBC,EAAUC,EAE/E,CA7LqC,CA8LvC,GACF,KAEAmF,EAAAA,EAAAA,QAAO2B,KAAAA,UAAsB,gBAAgB,SAAU9O,GAAO,WAC5DA,EAAMyI,IACJ,UACA,EAAC,KAAgB,CAACtI,QAAS,kBAAM,EAAKf,MAAMmC,SAASS,OAAOM,eAAe,KAAK,EAAEW,KAAK,aACpFtD,IAAAA,WAAAA,MAAqB,mDAG5B,IiBvPAA,IAAAA,uBAAAA,cAA2CgJ,GAC3ChJ,IAAAA,uBAAAA,cAA2C0J,GAC3C1J,IAAAA,uBAAAA,eAA4C2J,IAG5C6D,EAAAA,EAAAA,QAAOkF,IAAAA,UAA4B,qBAAqB,SAAUrS,GAChEA,EAAMyI,IAAI,gBAAiB,CACzByI,KAAM,gBACNjO,KAAM,eACNqP,MAAO3S,IAAAA,WAAAA,MAAqB,gEAG9BK,EAAMyI,IAAI,gBAAiB,CACzByI,KAAM,gBACNjO,KAAM,YACNqP,MAAO3S,IAAAA,WAAAA,MAAqB,gEAG9BK,EAAMyI,IAAI,iBAAkB,CAC1ByI,KAAM,iBACNjO,KAAM,YACNqP,MAAO3S,IAAAA,WAAAA,MAAqB,gEAEhC,KAGAwN,EAAAA,EAAAA,QAAOoF,KAAAA,UAAoB,YAAY,SAAUvS,GAC/C,IAAMY,EAAO3C,KAAK2C,KAClBZ,EAAMyI,IACJ,WACA+J,KAAAA,UACE,CACE9M,KAAM/F,IAAAA,MAAU,gBAAiB,CAAEoB,SAAUH,EAAK2J,SAClD2G,KAAM,WACNjO,KAAM,aAERtD,IAAAA,WAAAA,MAAqB,6CAEvB,GAEJ,IAGA8S,EAAAA,gBAAAA,gBAAAA,KAAqC,kBAGrCtF,EAAAA,EAAAA,QAAOrD,IAAAA,UAAgB,YAAY,WACjC7L,KAAKqF,EAAE,0BAA0BoI,MAAK,WACpCzN,KAAKyU,UAAUjK,IAAIkK,IAAkBC,iBAAiB3U,MAAM4U,iBAAiB,kBAC/E,GACF,GACF,IAQA7W,OAAO0B,OAAOZ,GAAAA,OAAQgW,G","sources":["webpack://@flarum/mentions/webpack/bootstrap","webpack://@flarum/mentions/webpack/runtime/compat get default export","webpack://@flarum/mentions/webpack/runtime/define property getters","webpack://@flarum/mentions/webpack/runtime/hasOwnProperty shorthand","webpack://@flarum/mentions/webpack/runtime/make namespace object","webpack://@flarum/mentions/external root \"flarum.core.compat['common/extend']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['forum/app']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['forum/components/NotificationGrid']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/utils/string']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/helpers/textContrastClass']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['forum/components/Post']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['forum/components/CommentPost']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['forum/components/PostPreview']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/components/LoadingIndicator']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/components/Link']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/helpers/punctuateSeries']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/helpers/username']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/helpers/icon']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/components/Button']\"","webpack://@flarum/mentions/../../../node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://@flarum/mentions/../../../node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@flarum/mentions/external root \"flarum.core.compat['common/components/Modal']\"","webpack://@flarum/mentions/../../../node_modules/@babel/runtime/helpers/esm/extends.js","webpack://@flarum/mentions/../../../node_modules/@babel/runtime/helpers/esm/createClass.js","webpack://@flarum/mentions/external root \"flarum.core.compat['common/states/PaginatedListState']\"","webpack://@flarum/mentions/./src/forum/state/MentionedByModalState.ts","webpack://@flarum/mentions/./src/forum/components/MentionedByModal.tsx","webpack://@flarum/mentions/external root \"flarum.core.compat['forum/utils/DiscussionControls']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['forum/components/EditPostComposer']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/utils/extractText']\"","webpack://@flarum/mentions/./src/forum/utils/getCleanDisplayName.js","webpack://@flarum/mentions/./src/forum/utils/getMentionText.js","webpack://@flarum/mentions/./src/forum/utils/reply.js","webpack://@flarum/mentions/external root \"flarum.core.compat['common/Fragment']\"","webpack://@flarum/mentions/./src/forum/fragments/PostQuoteButton.js","webpack://@flarum/mentions/./src/forum/utils/selectedText.js","webpack://@flarum/mentions/external root \"flarum.core.compat['common/components/TextEditor']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/components/TextEditorButton']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['forum/components/ReplyComposer']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/helpers/avatar']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/helpers/highlight']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/utils/KeyboardNavigatable']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/utils/throttleDebounce']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/components/Badge']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/models/Group']\"","webpack://@flarum/mentions/./src/forum/fragments/AutocompleteDropdown.js","webpack://@flarum/mentions/./src/forum/addComposerAutocomplete.js","webpack://@flarum/mentions/external root \"flarum.core.compat['forum/components/Notification']\"","webpack://@flarum/mentions/./src/forum/components/PostMentionedNotification.js","webpack://@flarum/mentions/./src/forum/components/UserMentionedNotification.js","webpack://@flarum/mentions/./src/forum/components/GroupMentionedNotification.js","webpack://@flarum/mentions/external root \"flarum.core.compat['forum/components/UserPage']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/components/LinkButton']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/models/User']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/Model']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/extenders']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/models/Post']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['forum/components/PostsUserPage']\"","webpack://@flarum/mentions/./src/forum/components/MentionsUserPage.js","webpack://@flarum/mentions/./src/forum/extend.ts","webpack://@flarum/mentions/./src/forum/utils/textFormatter.js","webpack://@flarum/mentions/./src/forum/compat.js","webpack://@flarum/mentions/external assign \"flarum.core\"","webpack://@flarum/mentions/./src/forum/index.js","webpack://@flarum/mentions/./src/forum/addPostMentionPreviews.js","webpack://@flarum/mentions/./src/forum/addMentionedByList.js","webpack://@flarum/mentions/./src/forum/addPostReplyAction.js","webpack://@flarum/mentions/./src/forum/addPostQuoteButton.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['common/extend'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/app'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/NotificationGrid'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/string'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/textContrastClass'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/Post'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/CommentPost'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/PostPreview'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/LoadingIndicator'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Link'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/punctuateSeries'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/username'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/icon'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Button'];","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/components/Modal'];","export default function _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/states/PaginatedListState'];","import PaginatedListState, { PaginatedListParams } from 'flarum/common/states/PaginatedListState';\nimport Post from 'flarum/common/models/Post';\n\nexport interface MentionedByModalParams extends PaginatedListParams {\n filter: {\n mentionedPost: string;\n };\n sort?: string;\n page?: {\n offset?: number;\n limit: number;\n };\n}\n\nexport default class MentionedByModalState

extends PaginatedListState {\n constructor(params: P, page: number = 1) {\n const limit = 10;\n\n params.page = { ...(params.page || {}), limit };\n\n super(params, page, limit);\n }\n\n get type(): string {\n return 'posts';\n }\n}\n","import app from 'flarum/forum/app';\nimport PostPreview from 'flarum/forum/components/PostPreview';\nimport Modal, { IInternalModalAttrs } from 'flarum/common/components/Modal';\nimport type Mithril from 'mithril';\nimport type Post from 'flarum/common/models/Post';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\nimport Button from 'flarum/common/components/Button';\nimport MentionedByModalState from '../state/MentionedByModalState';\n\nexport interface IMentionedByModalAttrs extends IInternalModalAttrs {\n post: Post;\n}\n\nexport default class MentionedByModal extends Modal<\n CustomAttrs,\n MentionedByModalState\n> {\n oninit(vnode: Mithril.Vnode) {\n super.oninit(vnode);\n\n this.state = new MentionedByModalState({\n filter: {\n mentionedPost: this.attrs.post.id()!,\n },\n sort: 'number',\n });\n\n this.state.refresh();\n }\n\n className(): string {\n return 'MentionedByModal';\n }\n\n title(): Mithril.Children {\n return app.translator.trans('flarum-mentions.forum.mentioned_by.title');\n }\n\n content(): Mithril.Children {\n return (\n <>\n

\n {this.state.isInitialLoading() ? (\n \n ) : (\n <>\n
    \n {this.state.getPages().map((page) =>\n page.items.map((reply) => (\n
  • \n app.modal.close()} />\n
  • \n ))\n )}\n
\n \n )}\n
\n {this.state.hasNext() && (\n
\n
\n
\n \n
\n
\n
\n )}\n \n );\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/utils/DiscussionControls'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/EditPostComposer'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/extractText'];","import app from 'flarum/forum/app';\nimport extractText from 'flarum/common/utils/extractText';\n\n/**\n * Whether to use the old mentions format.\n *\n * `'@username'` or `'@\"Display name\"'`\n */\nexport const shouldUseOldFormat = () => app.forum.attribute('allowUsernameMentionFormat') || false;\n\nconst getDeletedUserText = () => extractText(app.translator.trans('core.lib.username.deleted_text'));\n\n/**\n * Fetches a user's username or display name.\n *\n * Chooses based on the format option set in the admin settings page.\n *\n * @param user An instance of the User model to fetch the username for\n * @param useDisplayName If `true`, uses `user.displayName()`, otherwise, uses `user.username()`\n */\nexport default function getCleanDisplayName(user, useDisplayName = true) {\n if (!user) return getDeletedUserText().replace(/\"#[a-z]{0,3}[0-9]+/, '_');\n\n const text = (useDisplayName ? user.displayName() : user.username()) || getDeletedUserText();\n\n return text.replace(/\"#[a-z]{0,3}[0-9]+/, '_');\n}\n","import getCleanDisplayName, { shouldUseOldFormat } from './getCleanDisplayName';\n\n/**\n * Fetches the mention text for a specified user (and optionally a post ID for replies, or group).\n *\n * Automatically determines which mention syntax to be used based on the option in the\n * admin dashboard. Also performs display name clean-up automatically.\n *\n * @example New display name syntax\n * // '@\"User\"#1'\n * getMentionText(User) // User is ID 1, display name is 'User'\n *\n * @example Replying\n * // '@\"User\"#p13'\n * getMentionText(User, 13) // User display name is 'User', post ID is 13\n *\n * @example Using old syntax\n * // '@username'\n * getMentionText(User) // User's username is 'username'\n *\n * @example Group mention\n * // '@\"Mods\"#g4'\n * getMentionText(undefined, undefined, group) // Group display name is 'Mods', group ID is 4\n */\nexport default function getMentionText(user, postId, group) {\n if (user !== undefined && postId === undefined) {\n if (shouldUseOldFormat()) {\n // Plain @username\n const cleanText = getCleanDisplayName(user, false);\n return `@${cleanText}`;\n }\n // @\"Display name\"#UserID\n const cleanText = getCleanDisplayName(user);\n return `@\"${cleanText}\"#${user.id()}`;\n } else if (user !== undefined && postId !== undefined) {\n // @\"Display name\"#pPostID\n const cleanText = getCleanDisplayName(user);\n return `@\"${cleanText}\"#p${postId}`;\n } else if (group !== undefined) {\n // @\"Name Plural\"#gGroupID\n return `@\"${group.namePlural()}\"#g${group.id()}`;\n } else {\n throw 'No parameters were passed';\n }\n}\n","import app from 'flarum/forum/app';\nimport DiscussionControls from 'flarum/forum/utils/DiscussionControls';\nimport EditPostComposer from 'flarum/forum/components/EditPostComposer';\nimport getMentionText from './getMentionText';\n\nexport function insertMention(post, composer, quote) {\n return new Promise((resolve) => {\n const user = post.user();\n const mention = getMentionText(user, post.id()) + ' ';\n\n // If the composer is empty, then assume we're starting a new reply.\n // In which case we don't want the user to have to confirm if they\n // close the composer straight away.\n if (!composer.fields.content()) {\n composer.body.attrs.originalContent = mention;\n }\n\n const cursorPosition = composer.editor.getSelectionRange()[0];\n const preceding = composer.fields.content().slice(0, cursorPosition);\n const precedingNewlines = preceding.length == 0 ? 0 : 3 - preceding.match(/(\\n{0,2})$/)[0].length;\n\n composer.editor.insertAtCursor(\n Array(precedingNewlines).join('\\n') + // Insert up to two newlines, depending on preceding whitespace\n (quote ? '> ' + mention + quote.trim().replace(/\\n/g, '\\n> ') + '\\n\\n' : mention),\n false\n );\n return resolve(composer);\n });\n}\n\nexport default function reply(post, quote) {\n if (app.composer.bodyMatches(EditPostComposer) && app.composer.body.attrs.post.discussion() === post.discussion()) {\n // If we're already editing a post in the discussion of post we're quoting,\n // insert the mention directly.\n return insertMention(post, app.composer, quote);\n } else {\n // The default \"Reply\" action behavior will only open a new composer if\n // necessary, but it will always be a ReplyComposer, hence the exceptional\n // case above.\n return DiscussionControls.replyAction.call(post.discussion()).then((composer) => insertMention(post, composer, quote));\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/Fragment'];","import app from 'flarum/forum/app';\nimport Fragment from 'flarum/common/Fragment';\nimport icon from 'flarum/common/helpers/icon';\n\nimport reply from '../utils/reply';\n\nexport default class PostQuoteButton extends Fragment {\n constructor(post) {\n super();\n\n this.post = post;\n }\n\n view() {\n return (\n {\n reply(this.post, this.content);\n }}\n >\n {icon('fas fa-quote-left', { className: 'Button-icon' })}\n {app.translator.trans('flarum-mentions.forum.post.quote_button')}\n \n );\n }\n\n show(left, top) {\n const $this = this.$().show();\n const parentOffset = $this.offsetParent().offset();\n\n $this.css('left', left - parentOffset.left).css('top', top - parentOffset.top);\n\n this.hideHandler = this.hide.bind(this);\n $(document).on('mouseup', this.hideHandler);\n }\n\n showStart(left, top) {\n const $this = this.$();\n\n this.show(left, $(window).scrollTop() + top - $this.outerHeight() - 5);\n }\n\n showEnd(right, bottom) {\n const $this = this.$();\n\n this.show(right - $this.outerWidth(), $(window).scrollTop() + bottom + 5);\n }\n\n hide() {\n this.$().hide();\n $(document).off('mouseup', this.hideHandler);\n }\n}\n","/**\n * Finds the selected text in the provided composer body.\n */\nexport default function selectedText(body) {\n const selection = window.getSelection();\n\n if (!selection.isCollapsed) {\n const range = selection.getRangeAt(0);\n const parent = range.commonAncestorContainer;\n\n if (body[0] === parent || $.contains(body[0], parent)) {\n const clone = $('
').append(range.cloneContents());\n\n // Replace emoji images with their shortcode (found in alt attribute)\n clone.find('img.emoji').replaceWith(function () {\n return this.alt;\n });\n\n // Replace all other images with a Markdown image\n clone.find('img').replaceWith(function () {\n return `![](${this.src})`;\n });\n\n // Replace all links with a Markdown link\n clone.find('a').replaceWith(function () {\n return `[${this.innerText}](${this.href})`;\n });\n\n return clone.text();\n }\n }\n return '';\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/TextEditor'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/TextEditorButton'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/ReplyComposer'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/avatar'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/highlight'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/KeyboardNavigatable'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/throttleDebounce'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Badge'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/models/Group'];","import Fragment from 'flarum/common/Fragment';\n\nexport default class AutocompleteDropdown extends Fragment {\n items = [];\n active = false;\n index = 0;\n keyWasJustPressed = false;\n\n view() {\n return (\n
    \n {this.items.map((item) => (\n
  • {item}
  • \n ))}\n
\n );\n }\n\n show(left, top) {\n this.$()\n .show()\n .css({\n left: left + 'px',\n top: top + 'px',\n });\n this.active = true;\n }\n\n hide() {\n this.$().hide();\n this.active = false;\n }\n\n navigate(delta) {\n this.keyWasJustPressed = true;\n this.setIndex(this.index + delta, true);\n clearTimeout(this.keyWasJustPressedTimeout);\n this.keyWasJustPressedTimeout = setTimeout(() => (this.keyWasJustPressed = false), 500);\n }\n\n complete() {\n this.$('li').eq(this.index).find('button').click();\n }\n\n setIndex(index, scrollToItem) {\n if (this.keyWasJustPressed && !scrollToItem) return;\n\n const $dropdown = this.$();\n const $items = $dropdown.find('li');\n let rangedIndex = index;\n\n if (rangedIndex < 0) {\n rangedIndex = $items.length - 1;\n } else if (rangedIndex >= $items.length) {\n rangedIndex = 0;\n }\n\n this.index = rangedIndex;\n\n const $item = $items.removeClass('active').eq(rangedIndex).addClass('active');\n\n if (scrollToItem) {\n const dropdownScroll = $dropdown.scrollTop();\n const dropdownTop = $dropdown.offset().top;\n const dropdownBottom = dropdownTop + $dropdown.outerHeight();\n const itemTop = $item.offset().top;\n const itemBottom = itemTop + $item.outerHeight();\n\n let scrollTop;\n if (itemTop < dropdownTop) {\n scrollTop = dropdownScroll - dropdownTop + itemTop - parseInt($dropdown.css('padding-top'), 10);\n } else if (itemBottom > dropdownBottom) {\n scrollTop = dropdownScroll - dropdownBottom + itemBottom + parseInt($dropdown.css('padding-bottom'), 10);\n }\n\n if (typeof scrollTop !== 'undefined') {\n $dropdown.stop(true).animate({ scrollTop }, 100);\n }\n }\n }\n}\n","import app from 'flarum/forum/app';\nimport { extend } from 'flarum/common/extend';\nimport TextEditor from 'flarum/common/components/TextEditor';\nimport TextEditorButton from 'flarum/common/components/TextEditorButton';\nimport ReplyComposer from 'flarum/forum/components/ReplyComposer';\nimport EditPostComposer from 'flarum/forum/components/EditPostComposer';\nimport avatar from 'flarum/common/helpers/avatar';\nimport usernameHelper from 'flarum/common/helpers/username';\nimport highlight from 'flarum/common/helpers/highlight';\nimport KeyboardNavigatable from 'flarum/common/utils/KeyboardNavigatable';\nimport { truncate } from 'flarum/common/utils/string';\nimport { throttle } from 'flarum/common/utils/throttleDebounce';\nimport Badge from 'flarum/common/components/Badge';\nimport Group from 'flarum/common/models/Group';\n\nimport AutocompleteDropdown from './fragments/AutocompleteDropdown';\nimport getMentionText from './utils/getMentionText';\n\nconst throttledSearch = throttle(\n 250, // 250ms timeout\n function (typed, searched, returnedUsers, returnedUserIds, dropdown, buildSuggestions) {\n const typedLower = typed.toLowerCase();\n if (!searched.includes(typedLower)) {\n app.store.find('users', { filter: { q: typed }, page: { limit: 5 } }).then((results) => {\n results.forEach((u) => {\n if (!returnedUserIds.has(u.id())) {\n returnedUserIds.add(u.id());\n returnedUsers.push(u);\n }\n });\n\n buildSuggestions();\n });\n\n searched.push(typedLower);\n }\n }\n);\n\nexport default function addComposerAutocomplete() {\n const $container = $('
');\n const dropdown = new AutocompleteDropdown();\n\n extend(TextEditor.prototype, 'oncreate', function () {\n const $editor = this.$('.TextEditor-editor').wrap('
');\n\n this.navigator = new KeyboardNavigatable();\n this.navigator\n .when(() => dropdown.active)\n .onUp(() => dropdown.navigate(-1))\n .onDown(() => dropdown.navigate(1))\n .onSelect(dropdown.complete.bind(dropdown))\n .onCancel(dropdown.hide.bind(dropdown))\n .bindTo($editor);\n\n $editor.after($container);\n });\n\n extend(TextEditor.prototype, 'buildEditorParams', function (params) {\n const searched = [];\n let relMentionStart;\n let absMentionStart;\n let typed;\n let matchTyped;\n\n // We store users returned from an API here to preserve order in which they are returned\n // This prevents the user list jumping around while users are returned.\n // We also use a hashset for user IDs to provide O(1) lookup for the users already in the list.\n const returnedUsers = Array.from(app.store.all('users'));\n const returnedUserIds = new Set(returnedUsers.map((u) => u.id()));\n\n // Store groups, but exclude the two virtual groups - 'Guest' and 'Member'.\n const returnedGroups = Array.from(\n app.store.all('groups').filter((group) => {\n return group.id() != Group.GUEST_ID && group.id() != Group.MEMBER_ID;\n })\n );\n\n const applySuggestion = (replacement) => {\n this.attrs.composer.editor.replaceBeforeCursor(absMentionStart - 1, replacement + ' ');\n\n dropdown.hide();\n };\n\n params.inputListeners.push(() => {\n const selection = this.attrs.composer.editor.getSelectionRange();\n\n const cursor = selection[0];\n\n if (selection[1] - cursor > 0) return;\n\n // Search backwards from the cursor for an '@' symbol. If we find one,\n // we will want to show the autocomplete dropdown!\n const lastChunk = this.attrs.composer.editor.getLastNChars(30);\n absMentionStart = 0;\n for (let i = lastChunk.length - 1; i >= 0; i--) {\n const character = lastChunk.substr(i, 1);\n if (character === '@' && (i == 0 || /\\s/.test(lastChunk.substr(i - 1, 1)))) {\n relMentionStart = i + 1;\n absMentionStart = cursor - lastChunk.length + i + 1;\n break;\n }\n }\n\n dropdown.hide();\n dropdown.active = false;\n\n if (absMentionStart) {\n typed = lastChunk.substring(relMentionStart).toLowerCase();\n matchTyped = typed.match(/^[\"|“]((?:(?!\"#).)+)$/);\n typed = (matchTyped && matchTyped[1]) || typed;\n\n const makeSuggestion = function (user, replacement, content, className = '') {\n const username = usernameHelper(user);\n\n if (typed) {\n username.children = [highlight(username.text, typed)];\n delete username.text;\n }\n\n return (\n applySuggestion(replacement)}\n onmouseenter={function () {\n dropdown.setIndex($(this).parent().index());\n }}\n >\n \n {avatar(user)}\n {username} {content}\n \n \n );\n };\n\n const makeGroupSuggestion = function (group, replacement, content, className = '') {\n let groupName = group.namePlural().toLowerCase();\n\n if (typed) {\n groupName = highlight(groupName, typed);\n }\n\n return (\n applySuggestion(replacement)}\n onmouseenter={function () {\n dropdown.setIndex($(this).parent().index());\n }}\n >\n \n \n {groupName}\n \n \n );\n };\n\n const userMatches = function (user) {\n const names = [user.username(), user.displayName()];\n\n return names.some((name) => name.toLowerCase().substr(0, typed.length) === typed);\n };\n\n const groupMatches = function (group) {\n const names = [group.nameSingular(), group.namePlural()];\n\n return names.some((name) => name.toLowerCase().substr(0, typed.length) === typed);\n };\n\n const buildSuggestions = () => {\n const suggestions = [];\n\n // If the user has started to type a username, then suggest users\n // matching that username.\n if (typed) {\n returnedUsers.forEach((user) => {\n if (!userMatches(user)) return;\n\n suggestions.push(makeSuggestion(user, getMentionText(user), '', 'MentionsDropdown-user'));\n });\n\n // ... or groups.\n if (app.session?.user?.canMentionGroups()) {\n returnedGroups.forEach((group) => {\n if (!groupMatches(group)) return;\n\n suggestions.push(makeGroupSuggestion(group, getMentionText(undefined, undefined, group), '', 'MentionsDropdown-group'));\n });\n }\n }\n\n // If the user is replying to a discussion, or if they are editing a\n // post, then we can suggest other posts in the discussion to mention.\n // We will add the 5 most recent comments in the discussion which\n // match any username characters that have been typed.\n if (this.attrs.composer.bodyMatches(ReplyComposer) || this.attrs.composer.bodyMatches(EditPostComposer)) {\n const composerAttrs = this.attrs.composer.body.attrs;\n const composerPost = composerAttrs.post;\n const discussion = (composerPost && composerPost.discussion()) || composerAttrs.discussion;\n\n if (discussion) {\n discussion\n .posts()\n // Filter to only comment posts, and replies before this message\n .filter((post) => post && post.contentType() === 'comment' && (!composerPost || post.number() < composerPost.number()))\n // Sort by new to old\n .sort((a, b) => b.createdAt() - a.createdAt())\n // Filter to where the user matches what is being typed\n .filter((post) => {\n const user = post.user();\n return user && userMatches(user);\n })\n // Get the first 5\n .splice(0, 5)\n // Make the suggestions\n .forEach((post) => {\n const user = post.user();\n suggestions.push(\n makeSuggestion(\n user,\n getMentionText(user, post.id()),\n [\n app.translator.trans('flarum-mentions.forum.composer.reply_to_post_text', { number: post.number() }),\n ' — ',\n truncate(post.contentPlain(), 200),\n ],\n 'MentionsDropdown-post'\n )\n );\n });\n }\n }\n\n if (suggestions.length) {\n dropdown.items = suggestions;\n m.render($container[0], dropdown.render());\n\n dropdown.show();\n const coordinates = this.attrs.composer.editor.getCaretCoordinates(absMentionStart);\n const width = dropdown.$().outerWidth();\n const height = dropdown.$().outerHeight();\n const parent = dropdown.$().offsetParent();\n let left = coordinates.left;\n let top = coordinates.top + 15;\n\n // Keep the dropdown inside the editor.\n if (top + height > parent.height()) {\n top = coordinates.top - height - 15;\n }\n if (left + width > parent.width()) {\n left = parent.width() - width;\n }\n\n // Prevent the dropdown from going off screen on mobile\n top = Math.max(-(parent.offset().top - $(document).scrollTop()), top);\n left = Math.max(-parent.offset().left, left);\n\n dropdown.show(left, top);\n } else {\n dropdown.active = false;\n dropdown.hide();\n }\n };\n\n dropdown.active = true;\n\n buildSuggestions();\n\n dropdown.setIndex(0);\n dropdown.$().scrollTop(0);\n\n // Don't send API calls searching for users until at least 2 characters have been typed.\n // This focuses the mention results on users and posts in the discussion.\n if (typed.length > 1 && app.forum.attribute('canSearchUsers')) {\n throttledSearch(typed, searched, returnedUsers, returnedUserIds, dropdown, buildSuggestions);\n }\n }\n });\n });\n\n extend(TextEditor.prototype, 'toolbarItems', function (items) {\n items.add(\n 'mention',\n this.attrs.composer.editor.insertAtCursor(' @')} icon=\"fas fa-at\">\n {app.translator.trans('flarum-mentions.forum.composer.mention_tooltip')}\n \n );\n });\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/Notification'];","import app from 'flarum/forum/app';\nimport Notification from 'flarum/forum/components/Notification';\nimport { truncate } from 'flarum/common/utils/string';\n\nexport default class PostMentionedNotification extends Notification {\n icon() {\n return 'fas fa-reply';\n }\n\n href() {\n const notification = this.attrs.notification;\n const post = notification.subject();\n const content = notification.content();\n\n return app.route.discussion(post.discussion(), content && content.replyNumber);\n }\n\n content() {\n const notification = this.attrs.notification;\n const user = notification.fromUser();\n\n return app.translator.trans('flarum-mentions.forum.notifications.post_mentioned_text', { user, count: 1 });\n }\n\n excerpt() {\n return truncate(this.attrs.notification.subject().contentPlain() || '', 200);\n }\n}\n","import app from 'flarum/forum/app';\nimport Notification from 'flarum/forum/components/Notification';\nimport { truncate } from 'flarum/common/utils/string';\n\nexport default class UserMentionedNotification extends Notification {\n icon() {\n return 'fas fa-at';\n }\n\n href() {\n const post = this.attrs.notification.subject();\n\n return app.route.discussion(post.discussion(), post.number());\n }\n\n content() {\n const user = this.attrs.notification.fromUser();\n\n return app.translator.trans('flarum-mentions.forum.notifications.user_mentioned_text', { user });\n }\n\n excerpt() {\n return truncate(this.attrs.notification.subject().contentPlain(), 200);\n }\n}\n","import app from 'flarum/forum/app';\nimport Notification from 'flarum/forum/components/Notification';\nimport { truncate } from 'flarum/common/utils/string';\n\nexport default class GroupMentionedNotification extends Notification {\n icon() {\n return 'fas fa-at';\n }\n\n href() {\n const post = this.attrs.notification.subject();\n\n return app.route.discussion(post.discussion(), post.number());\n }\n\n content() {\n const user = this.attrs.notification.fromUser();\n\n return app.translator.trans('flarum-mentions.forum.notifications.group_mentioned_text', { user });\n }\n\n excerpt() {\n return truncate(this.attrs.notification.subject().contentPlain(), 200);\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/UserPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/LinkButton'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/models/User'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/Model'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extenders'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/models/Post'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/PostsUserPage'];","import app from 'flarum/forum/app';\nimport PostsUserPage from 'flarum/forum/components/PostsUserPage';\n\n/**\n * The `MentionsUserPage` component shows post which user Mentioned at\n */\nexport default class MentionsUserPage extends PostsUserPage {\n /**\n * Load a new page of the user's activity feed.\n *\n * @param {Integer} [offset] The position to start getting results from.\n * @return {Promise}\n * @protected\n */\n loadResults(offset) {\n return app.store.find('posts', {\n filter: {\n type: 'comment',\n mentioned: this.user.id(),\n },\n page: { offset, limit: this.loadLimit },\n sort: '-createdAt',\n });\n }\n}\n","import Extend from 'flarum/common/extenders';\nimport Post from 'flarum/common/models/Post';\nimport User from 'flarum/common/models/User';\nimport MentionsUserPage from './components/MentionsUserPage';\n\nexport default [\n new Extend.Routes() //\n .add('user.mentions', '/u/:username/mentions', MentionsUserPage),\n\n new Extend.Model(Post) //\n .hasMany('mentionedBy')\n .attribute('mentionedByCount'),\n\n new Extend.Model(User) //\n .attribute('canMentionGroups'),\n];\n","import app from 'flarum/forum/app';\nimport username from 'flarum/common/helpers/username';\nimport extractText from 'flarum/common/utils/extractText';\n\nexport function filterUserMentions(tag) {\n let user;\n\n if (app.forum.attribute('allowUsernameMentionFormat') && tag.hasAttribute('username'))\n user = app.store.getBy('users', 'username', tag.getAttribute('username'));\n else if (tag.hasAttribute('id')) user = app.store.getById('users', tag.getAttribute('id'));\n\n if (user) {\n tag.setAttribute('id', user.id());\n tag.setAttribute('slug', user.slug());\n tag.setAttribute('displayname', extractText(username(user)));\n\n return true;\n }\n\n tag.invalidate();\n}\n\nexport function filterPostMentions(tag) {\n const post = app.store.getById('posts', tag.getAttribute('id'));\n\n if (post) {\n tag.setAttribute('discussionid', post.discussion().id());\n tag.setAttribute('number', post.number());\n tag.setAttribute('displayname', extractText(username(post.user())));\n\n return true;\n }\n}\n\nexport function filterGroupMentions(tag) {\n if (app.session?.user?.canMentionGroups()) {\n const group = app.store.getById('groups', tag.getAttribute('id'));\n\n if (group) {\n tag.setAttribute('groupname', extractText(group.namePlural()));\n tag.setAttribute('icon', group.icon());\n tag.setAttribute('color', group.color());\n\n return true;\n }\n }\n\n tag.invalidate();\n}\n","import GroupMentionedNotification from './components/GroupMentionedNotification';\nimport MentionsUserPage from './components/MentionsUserPage';\nimport PostMentionedNotification from './components/PostMentionedNotification';\nimport UserMentionedNotification from './components/UserMentionedNotification';\nimport AutocompleteDropdown from './fragments/AutocompleteDropdown';\nimport PostQuoteButton from './fragments/PostQuoteButton';\nimport getCleanDisplayName from './utils/getCleanDisplayName';\nimport getMentionText from './utils/getMentionText';\nimport * as reply from './utils/reply';\nimport selectedText from './utils/selectedText';\nimport * as textFormatter from './utils/textFormatter';\n\nexport default {\n 'mentions/components/MentionsUserPage': MentionsUserPage,\n 'mentions/components/PostMentionedNotification': PostMentionedNotification,\n 'mentions/components/UserMentionedNotification': UserMentionedNotification,\n 'mentions/components/GroupMentionedNotification': GroupMentionedNotification,\n 'mentions/fragments/AutocompleteDropdown': AutocompleteDropdown,\n 'mentions/fragments/PostQuoteButton': PostQuoteButton,\n 'mentions/utils/getCleanDisplayName': getCleanDisplayName,\n 'mentions/utils/getMentionText': getMentionText,\n 'mentions/utils/reply': reply,\n 'mentions/utils/selectedText': selectedText,\n 'mentions/utils/textFormatter': textFormatter,\n};\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core;","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport NotificationGrid from 'flarum/forum/components/NotificationGrid';\nimport { getPlainContent } from 'flarum/common/utils/string';\nimport textContrastClass from 'flarum/common/helpers/textContrastClass';\nimport Post from 'flarum/forum/components/Post';\n\nimport addPostMentionPreviews from './addPostMentionPreviews';\nimport addMentionedByList from './addMentionedByList';\nimport addPostReplyAction from './addPostReplyAction';\nimport addPostQuoteButton from './addPostQuoteButton';\nimport addComposerAutocomplete from './addComposerAutocomplete';\nimport PostMentionedNotification from './components/PostMentionedNotification';\nimport UserMentionedNotification from './components/UserMentionedNotification';\nimport GroupMentionedNotification from './components/GroupMentionedNotification';\nimport UserPage from 'flarum/forum/components/UserPage';\nimport LinkButton from 'flarum/common/components/LinkButton';\nimport User from 'flarum/common/models/User';\nimport Model from 'flarum/common/Model';\n\nexport { default as extend } from './extend';\n\napp.initializers.add('flarum-mentions', function () {\n // For every mention of a post inside a post's content, set up a hover handler\n // that shows a preview of the mentioned post.\n addPostMentionPreviews();\n\n // In the footer of each post, show information about who has replied (i.e.\n // who the post has been mentioned by).\n addMentionedByList();\n\n // Add a 'reply' control to the footer of each post. When clicked, it will\n // open up the composer and add a post mention to its contents.\n addPostReplyAction();\n\n // Show a Quote button when Post text is selected\n addPostQuoteButton();\n\n // After typing '@' in the composer, show a dropdown suggesting a bunch of\n // posts or users that the user could mention.\n addComposerAutocomplete();\n\n app.notificationComponents.postMentioned = PostMentionedNotification;\n app.notificationComponents.userMentioned = UserMentionedNotification;\n app.notificationComponents.groupMentioned = GroupMentionedNotification;\n\n // Add notification preferences.\n extend(NotificationGrid.prototype, 'notificationTypes', function (items) {\n items.add('postMentioned', {\n name: 'postMentioned',\n icon: 'fas fa-reply',\n label: app.translator.trans('flarum-mentions.forum.settings.notify_post_mentioned_label'),\n });\n\n items.add('userMentioned', {\n name: 'userMentioned',\n icon: 'fas fa-at',\n label: app.translator.trans('flarum-mentions.forum.settings.notify_user_mentioned_label'),\n });\n\n items.add('groupMentioned', {\n name: 'groupMentioned',\n icon: 'fas fa-at',\n label: app.translator.trans('flarum-mentions.forum.settings.notify_group_mentioned_label'),\n });\n });\n\n // Add mentions tab in user profile\n extend(UserPage.prototype, 'navItems', function (items) {\n const user = this.user;\n items.add(\n 'mentions',\n LinkButton.component(\n {\n href: app.route('user.mentions', { username: user.slug() }),\n name: 'mentions',\n icon: 'fas fa-at',\n },\n app.translator.trans('flarum-mentions.forum.user.mentions_link')\n ),\n 80\n );\n });\n\n // Remove post mentions when rendering post previews.\n getPlainContent.removeSelectors.push('a.PostMention');\n\n // Apply color contrast fix on group mentions.\n extend(Post.prototype, 'oncreate', function () {\n this.$('.GroupMention--colored').each(function () {\n this.classList.add(textContrastClass(getComputedStyle(this).getPropertyValue('--group-color')));\n });\n });\n});\n\nexport * from './utils/textFormatter';\n\n// Expose compat API\nimport mentionsCompat from './compat';\nimport { compat } from '@flarum/core/forum';\n\nObject.assign(compat, mentionsCompat);\n","import { extend } from 'flarum/common/extend';\nimport CommentPost from 'flarum/forum/components/CommentPost';\nimport PostPreview from 'flarum/forum/components/PostPreview';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\n\nexport default function addPostMentionPreviews() {\n function addPreviews() {\n const contentHtml = this.attrs.post.contentHtml();\n\n if (contentHtml === this.oldPostContentHtml || this.isEditing()) return;\n\n this.oldPostContentHtml = contentHtml;\n\n const parentPost = this.attrs.post;\n const $parentPost = this.$();\n\n this.$().on('click', '.UserMention:not(.UserMention--deleted), .PostMention:not(.PostMention--deleted)', function (e) {\n m.route.set(this.getAttribute('href'));\n e.preventDefault();\n });\n\n this.$('.PostMention:not(.PostMention--deleted)').each(function () {\n const $this = $(this);\n const id = $this.data('id');\n let timeout;\n\n // Wrap the mention link in a wrapper element so that we can insert a\n // preview popup as its sibling and relatively position it.\n const $preview = $('
    ');\n $parentPost.append($preview);\n\n const getPostElement = () => {\n return $(`.PostStream-item[data-id=\"${id}\"]`);\n };\n\n const showPreview = () => {\n // When the user hovers their mouse over the mention, look for the\n // post that it's referring to in the stream, and determine if it's\n // in the viewport. If it is, we will \"pulsate\" it.\n const $post = getPostElement();\n let visible = false;\n if ($post.length) {\n const top = $post.offset().top;\n const scrollTop = window.pageYOffset;\n if (top > scrollTop && top + $post.height() < scrollTop + $(window).height()) {\n $post.addClass('pulsate');\n visible = true;\n }\n }\n\n // Otherwise, we will show a popup preview of the post. If the post\n // hasn't yet been loaded, we will need to do that.\n if (!visible) {\n // Position the preview so that it appears above the mention.\n // (The offsetParent should be .Post-body.)\n const positionPreview = () => {\n const previewHeight = $preview.outerHeight(true);\n let offset = 0;\n\n // If the preview goes off the top of the viewport, reposition it to\n // be below the mention.\n if ($this.offset().top - previewHeight < $(window).scrollTop() + $('#header').outerHeight()) {\n offset += $this.outerHeight(true);\n } else {\n offset -= previewHeight;\n }\n\n $preview\n .show()\n .css('top', $this.offset().top - $parentPost.offset().top + offset)\n .css('left', $this.offsetParent().offset().left - $parentPost.offset().left)\n .css('max-width', $this.offsetParent().width());\n };\n\n const showPost = (post) => {\n const discussion = post.discussion();\n\n m.render($preview[0], [\n discussion !== parentPost.discussion() ? (\n
  • \n {discussion.title()}\n
  • \n ) : (\n ''\n ),\n
  • {PostPreview.component({ post })}
  • ,\n ]);\n positionPreview();\n };\n\n const post = app.store.getById('posts', id);\n if (post && post.discussion()) {\n showPost(post);\n } else {\n m.render($preview[0], LoadingIndicator.component());\n app.store.find('posts', id).then(showPost);\n positionPreview();\n }\n\n setTimeout(() => $preview.off('transitionend').addClass('in'));\n }\n };\n\n const hidePreview = () => {\n getPostElement().removeClass('pulsate');\n if ($preview.hasClass('in')) {\n $preview.removeClass('in').one('transitionend', () => $preview.hide());\n }\n };\n\n // On a touch (mobile) device we cannot hover the link to reveal the preview.\n // Instead we cancel the navigation so that a click reveals the preview.\n // Users can then click on the preview to go to the post if desired.\n $this.on('touchend', (e) => {\n if (e.cancelable) {\n e.preventDefault();\n }\n });\n\n $this\n .add($preview)\n .hover(\n () => {\n clearTimeout(timeout);\n timeout = setTimeout(showPreview, 250);\n },\n () => {\n clearTimeout(timeout);\n getPostElement().removeClass('pulsate');\n timeout = setTimeout(hidePreview, 250);\n }\n )\n .on('touchend', (e) => {\n showPreview();\n e.stopPropagation();\n });\n\n $(document).on('touchend', hidePreview);\n });\n }\n\n extend(CommentPost.prototype, 'oncreate', addPreviews);\n extend(CommentPost.prototype, 'onupdate', addPreviews);\n}\n","import app from 'flarum/forum/app';\nimport { extend } from 'flarum/common/extend';\nimport CommentPost from 'flarum/forum/components/CommentPost';\nimport Link from 'flarum/common/components/Link';\nimport PostPreview from 'flarum/forum/components/PostPreview';\nimport punctuateSeries from 'flarum/common/helpers/punctuateSeries';\nimport username from 'flarum/common/helpers/username';\nimport icon from 'flarum/common/helpers/icon';\nimport Button from 'flarum/common/components/Button';\nimport MentionedByModal from './components/MentionedByModal';\n\nexport default function addMentionedByList() {\n function hidePreview() {\n this.$('.Post-mentionedBy-preview')\n .removeClass('in')\n .one('transitionend', function () {\n $(this).hide();\n });\n }\n\n extend(CommentPost.prototype, 'oncreate', function () {\n let timeout;\n const post = this.attrs.post;\n const replies = post.mentionedBy();\n\n if (replies && replies.length) {\n const $preview = $('
      ');\n this.$().append($preview);\n\n const $parentPost = this.$();\n const $this = this.$('.Post-mentionedBy');\n\n const showPreview = () => {\n if (!$preview.hasClass('in') && $preview.is(':visible')) return;\n\n // When the user hovers their mouse over the list of people who have\n // replied to the post, render a list of reply previews into a\n // popup.\n m.render(\n $preview[0],\n <>\n {replies.map((reply) => (\n
    • \n {PostPreview.component({\n post: reply,\n onclick: hidePreview.bind(this),\n })}\n
    • \n ))}\n {replies.length < post.mentionedByCount() ? (\n
    • \n {\n hidePreview.call(this);\n app.modal.show(MentionedByModal, { post });\n }}\n >\n \n {icon('fas fa-reply-all')}\n \n {app.translator.trans('flarum-mentions.forum.post.mentioned_by_more_text', { count: post.mentionedByCount() - replies.length })}\n \n \n \n
    • \n ) : null}\n \n );\n\n $preview\n .show()\n .css('top', $this.offset().top - $parentPost.offset().top + $this.outerHeight(true))\n .css('left', $this.offsetParent().offset().left - $parentPost.offset().left)\n .css('max-width', $parentPost.width());\n\n setTimeout(() => $preview.off('transitionend').addClass('in'));\n };\n\n $this.add($preview).hover(\n () => {\n clearTimeout(timeout);\n timeout = setTimeout(showPreview, 250);\n },\n () => {\n clearTimeout(timeout);\n timeout = setTimeout(hidePreview, 250);\n }\n );\n\n // Whenever the user hovers their mouse over a particular name in the\n // list of repliers, highlight the corresponding post in the preview\n // popup.\n this.$()\n .find('.Post-mentionedBy-summary a')\n .hover(\n function () {\n $preview.find('[data-number=\"' + $(this).data('number') + '\"]').addClass('active');\n },\n function () {\n $preview.find('[data-number]').removeClass('active');\n }\n );\n }\n });\n\n extend(CommentPost.prototype, 'footerItems', function (items) {\n const post = this.attrs.post;\n const replies = post.mentionedBy();\n\n if (replies && replies.length) {\n const users = [];\n const repliers = replies\n .sort((reply) => (reply.user() === app.session.user ? -1 : 0))\n .filter((reply) => {\n const user = reply.user();\n if (users.indexOf(user) === -1) {\n users.push(user);\n return true;\n }\n });\n\n const limit = 4;\n const overLimit = repliers.length > limit;\n\n // Create a list of unique users who have replied. So even if a user has\n // replied twice, they will only be in this array once.\n const names = repliers.slice(0, overLimit ? limit - 1 : limit).map((reply) => {\n const user = reply.user();\n\n return (\n \n {app.session.user === user ? app.translator.trans('flarum-mentions.forum.post.you_text') : username(user)}\n \n );\n });\n\n // If there are more users that we've run out of room to display, add a \"x\n // others\" name to the end of the list. Clicking on it will display a modal\n // with a full list of names.\n if (overLimit) {\n const count = repliers.length - names.length;\n\n names.push(app.translator.trans('flarum-mentions.forum.post.others_text', { count }));\n }\n\n items.add(\n 'replies',\n
      \n \n {icon('fas fa-reply')}\n {app.translator.trans('flarum-mentions.forum.post.mentioned_by' + (repliers[0].user() === app.session.user ? '_self' : '') + '_text', {\n count: names.length,\n users: punctuateSeries(names),\n })}\n \n
      \n );\n }\n });\n}\n","import app from 'flarum/forum/app';\nimport { extend } from 'flarum/common/extend';\nimport Button from 'flarum/common/components/Button';\nimport CommentPost from 'flarum/forum/components/CommentPost';\n\nimport reply from './utils/reply';\n\nexport default function () {\n extend(CommentPost.prototype, 'actionItems', function (items) {\n const post = this.attrs.post;\n\n if (post.isHidden() || (app.session.user && !post.discussion().canReply())) return;\n\n items.add(\n 'reply',\n \n );\n });\n}\n","import app from 'flarum/forum/app';\nimport { extend } from 'flarum/common/extend';\nimport CommentPost from 'flarum/forum/components/CommentPost';\n\nimport PostQuoteButton from './fragments/PostQuoteButton';\nimport selectedText from './utils/selectedText';\n\nexport default function addPostQuoteButton() {\n extend(CommentPost.prototype, 'oncreate', function () {\n const post = this.attrs.post;\n\n if (post.isHidden() || (app.session.user && !post.discussion().canReply())) return;\n\n const $postBody = this.$('.Post-body');\n\n // Wrap the quote button in a wrapper element so that we can render\n // button into it.\n const $container = $('
      ');\n\n const button = new PostQuoteButton(post);\n\n const handler = function (e) {\n setTimeout(() => {\n const content = selectedText($postBody);\n if (content) {\n button.content = content;\n m.render($container[0], button.render());\n\n const rects = window.getSelection().getRangeAt(0).getClientRects();\n const firstRect = rects[0];\n\n if (e.clientY < firstRect.bottom && e.clientX - firstRect.right < firstRect.left - e.clientX) {\n button.showStart(firstRect.left, firstRect.top);\n } else {\n const lastRect = rects[rects.length - 1];\n button.showEnd(lastRect.right, lastRect.bottom);\n }\n }\n }, 1);\n };\n\n this.$().after($container).on('mouseup', handler);\n\n if ('ontouchstart' in window) {\n document.addEventListener('selectionchange', handler, false);\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","_extends","assign","target","i","arguments","length","source","apply","this","_defineProperties","props","descriptor","configurable","writable","MentionedByModalState","params","page","limit","Constructor","protoProps","PaginatedListState","MentionedByModal","oninit","vnode","state","filter","mentionedPost","attrs","post","id","sort","refresh","className","title","app","content","isInitialLoading","getPages","map","items","reply","number","onclick","hasNext","loadNext","loading","isLoadingNext","Modal","getDeletedUserText","extractText","getCleanDisplayName","user","useDisplayName","displayName","username","replace","getMentionText","postId","group","undefined","namePlural","insertMention","composer","quote","Promise","resolve","mention","fields","body","originalContent","cursorPosition","editor","getSelectionRange","preceding","slice","precedingNewlines","match","insertAtCursor","Array","join","trim","EditPostComposer","discussion","DiscussionControls","then","PostQuoteButton","view","class","icon","show","left","top","$this","$","parentOffset","offsetParent","offset","css","hideHandler","hide","document","on","showStart","window","scrollTop","outerHeight","showEnd","right","bottom","outerWidth","off","Fragment","selectedText","selection","getSelection","isCollapsed","range","getRangeAt","parent","commonAncestorContainer","contains","clone","append","cloneContents","find","replaceWith","alt","src","innerText","href","text","AutocompleteDropdown","active","index","keyWasJustPressed","item","navigate","delta","setIndex","clearTimeout","keyWasJustPressedTimeout","setTimeout","complete","eq","click","scrollToItem","$dropdown","$items","rangedIndex","$item","removeClass","addClass","dropdownScroll","dropdownTop","dropdownBottom","itemTop","itemBottom","parseInt","stop","animate","throttledSearch","throttle","typed","searched","returnedUsers","returnedUserIds","dropdown","buildSuggestions","typedLower","toLowerCase","includes","q","results","forEach","u","has","add","push","PostMentionedNotification","notification","subject","replyNumber","fromUser","count","excerpt","truncate","contentPlain","Notification","UserMentionedNotification","GroupMentionedNotification","MentionsUserPage","loadResults","type","mentioned","loadLimit","PostsUserPage","Extend","Post","hasMany","attribute","User","filterUserMentions","tag","hasAttribute","getAttribute","setAttribute","slug","invalidate","filterPostMentions","filterGroupMentions","canMentionGroups","color","textFormatter","$container","addPreviews","contentHtml","oldPostContentHtml","isEditing","parentPost","$parentPost","e","m","route","set","preventDefault","each","timeout","data","$preview","getPostElement","showPreview","$post","visible","pageYOffset","height","positionPreview","previewHeight","width","showPost","render","PostPreview","store","getById","LoadingIndicator","hidePreview","hasClass","one","cancelable","hover","stopPropagation","extend","CommentPost","addPostMentionPreviews","replies","mentionedBy","is","mentionedByCount","users","repliers","indexOf","overLimit","names","punctuateSeries","addMentionedByList","isHidden","canReply","$postBody","button","handler","rects","getClientRects","firstRect","clientY","clientX","lastRect","after","addEventListener","TextEditor","$editor","wrap","navigator","KeyboardNavigatable","when","onUp","onDown","onSelect","onCancel","bindTo","relMentionStart","absMentionStart","matchTyped","from","Set","returnedGroups","Group","applySuggestion","replacement","replaceBeforeCursor","inputListeners","cursor","lastChunk","getLastNChars","substr","test","substring","makeSuggestion","usernameHelper","children","highlight","onmouseenter","avatar","userMatches","some","name","suggestions","nameSingular","groupMatches","groupName","makeGroupSuggestion","bodyMatches","ReplyComposer","composerAttrs","composerPost","posts","contentType","b","createdAt","splice","coordinates","getCaretCoordinates","Math","max","NotificationGrid","label","UserPage","LinkButton","getPlainContent","classList","textContrastClass","getComputedStyle","getPropertyValue","mentionsCompat"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"forum.js","mappings":"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","sources":["webpack://@flarum/mentions/webpack/bootstrap","webpack://@flarum/mentions/webpack/runtime/compat get default export","webpack://@flarum/mentions/webpack/runtime/define property getters","webpack://@flarum/mentions/webpack/runtime/hasOwnProperty shorthand","webpack://@flarum/mentions/webpack/runtime/make namespace object","webpack://@flarum/mentions/external root \"flarum.core.compat['common/extend']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['forum/app']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['forum/components/NotificationGrid']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/utils/string']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/helpers/textContrastClass']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['forum/components/Post']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['forum/components/CommentPost']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['forum/components/PostPreview']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/components/LoadingIndicator']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/components/Link']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/helpers/punctuateSeries']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/helpers/username']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/helpers/icon']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/components/Button']\"","webpack://@flarum/mentions/../../../node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://@flarum/mentions/../../../node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@flarum/mentions/external root \"flarum.core.compat['common/components/Modal']\"","webpack://@flarum/mentions/../../../node_modules/@babel/runtime/helpers/esm/extends.js","webpack://@flarum/mentions/../../../node_modules/@babel/runtime/helpers/esm/createClass.js","webpack://@flarum/mentions/external root \"flarum.core.compat['common/states/PaginatedListState']\"","webpack://@flarum/mentions/./src/forum/state/MentionedByModalState.ts","webpack://@flarum/mentions/./src/forum/components/MentionedByModal.tsx","webpack://@flarum/mentions/external root \"flarum.core.compat['forum/utils/DiscussionControls']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['forum/components/EditPostComposer']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/utils/extractText']\"","webpack://@flarum/mentions/./src/forum/utils/getCleanDisplayName.js","webpack://@flarum/mentions/./src/forum/utils/getMentionText.js","webpack://@flarum/mentions/./src/forum/utils/reply.js","webpack://@flarum/mentions/external root \"flarum.core.compat['common/Fragment']\"","webpack://@flarum/mentions/./src/forum/fragments/PostQuoteButton.js","webpack://@flarum/mentions/./src/forum/utils/selectedText.js","webpack://@flarum/mentions/external root \"flarum.core.compat['common/components/TextEditor']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/components/TextEditorButton']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['forum/components/ReplyComposer']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/helpers/avatar']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/helpers/highlight']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/utils/KeyboardNavigatable']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/utils/throttleDebounce']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/components/Badge']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/models/Group']\"","webpack://@flarum/mentions/./src/forum/fragments/AutocompleteDropdown.js","webpack://@flarum/mentions/./src/forum/addComposerAutocomplete.js","webpack://@flarum/mentions/external root \"flarum.core.compat['forum/components/Notification']\"","webpack://@flarum/mentions/./src/forum/components/PostMentionedNotification.js","webpack://@flarum/mentions/./src/forum/components/UserMentionedNotification.js","webpack://@flarum/mentions/./src/forum/components/GroupMentionedNotification.js","webpack://@flarum/mentions/external root \"flarum.core.compat['forum/components/UserPage']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/components/LinkButton']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/models/User']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/Model']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/extenders']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['common/models/Post']\"","webpack://@flarum/mentions/external root \"flarum.core.compat['forum/components/PostsUserPage']\"","webpack://@flarum/mentions/./src/forum/components/MentionsUserPage.js","webpack://@flarum/mentions/./src/forum/extend.ts","webpack://@flarum/mentions/./src/forum/utils/textFormatter.js","webpack://@flarum/mentions/./src/forum/compat.js","webpack://@flarum/mentions/external assign \"flarum.core\"","webpack://@flarum/mentions/./src/forum/index.js","webpack://@flarum/mentions/./src/forum/addPostMentionPreviews.js","webpack://@flarum/mentions/./src/forum/addMentionedByList.js","webpack://@flarum/mentions/./src/forum/addPostReplyAction.js","webpack://@flarum/mentions/./src/forum/addPostQuoteButton.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['common/extend'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/app'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/NotificationGrid'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/string'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/textContrastClass'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/Post'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/CommentPost'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/PostPreview'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/LoadingIndicator'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Link'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/punctuateSeries'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/username'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/icon'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Button'];","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/components/Modal'];","export default function _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/states/PaginatedListState'];","import PaginatedListState, { PaginatedListParams } from 'flarum/common/states/PaginatedListState';\nimport Post from 'flarum/common/models/Post';\n\nexport interface MentionedByModalListParams extends PaginatedListParams {\n filter: {\n mentionedPost: string;\n };\n sort?: string;\n page?: {\n offset?: number;\n limit: number;\n };\n}\n\nexport default class MentionedByModalState

      extends PaginatedListState {\n constructor(params: P, page: number = 1) {\n const limit = 10;\n\n params.page = { ...(params.page || {}), limit };\n\n super(params, page, limit);\n }\n\n get type(): string {\n return 'posts';\n }\n}\n","import app from 'flarum/forum/app';\nimport PostPreview from 'flarum/forum/components/PostPreview';\nimport Modal, { IInternalModalAttrs } from 'flarum/common/components/Modal';\nimport type Mithril from 'mithril';\nimport type Post from 'flarum/common/models/Post';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\nimport Button from 'flarum/common/components/Button';\nimport MentionedByModalState from '../state/MentionedByModalState';\n\nexport interface IMentionedByModalAttrs extends IInternalModalAttrs {\n post: Post;\n}\n\nexport default class MentionedByModal extends Modal<\n CustomAttrs,\n MentionedByModalState\n> {\n oninit(vnode: Mithril.Vnode) {\n super.oninit(vnode);\n\n this.state = new MentionedByModalState({\n filter: {\n mentionedPost: this.attrs.post.id()!,\n },\n sort: 'number',\n });\n\n this.state.refresh();\n }\n\n className(): string {\n return 'MentionedByModal';\n }\n\n title(): Mithril.Children {\n return app.translator.trans('flarum-mentions.forum.mentioned_by.title');\n }\n\n content(): Mithril.Children {\n return (\n <>\n

      \n {this.state.isInitialLoading() ? (\n \n ) : (\n <>\n
        \n {this.state.getPages().map((page) =>\n page.items.map((reply) => (\n
      • \n app.modal.close()} />\n
      • \n ))\n )}\n
      \n \n )}\n
      \n {this.state.hasNext() && (\n
      \n
      \n
      \n \n
      \n
      \n
      \n )}\n \n );\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/utils/DiscussionControls'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/EditPostComposer'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/extractText'];","import app from 'flarum/forum/app';\nimport extractText from 'flarum/common/utils/extractText';\n\n/**\n * Whether to use the old mentions format.\n *\n * `'@username'` or `'@\"Display name\"'`\n */\nexport const shouldUseOldFormat = () => app.forum.attribute('allowUsernameMentionFormat') || false;\n\nconst getDeletedUserText = () => extractText(app.translator.trans('core.lib.username.deleted_text'));\n\n/**\n * Fetches a user's username or display name.\n *\n * Chooses based on the format option set in the admin settings page.\n *\n * @param user An instance of the User model to fetch the username for\n * @param useDisplayName If `true`, uses `user.displayName()`, otherwise, uses `user.username()`\n */\nexport default function getCleanDisplayName(user, useDisplayName = true) {\n if (!user) return getDeletedUserText().replace(/\"#[a-z]{0,3}[0-9]+/, '_');\n\n const text = (useDisplayName ? user.displayName() : user.username()) || getDeletedUserText();\n\n return text.replace(/\"#[a-z]{0,3}[0-9]+/, '_');\n}\n","import getCleanDisplayName, { shouldUseOldFormat } from './getCleanDisplayName';\n\n/**\n * Fetches the mention text for a specified user (and optionally a post ID for replies, or group).\n *\n * Automatically determines which mention syntax to be used based on the option in the\n * admin dashboard. Also performs display name clean-up automatically.\n *\n * @example New display name syntax\n * // '@\"User\"#1'\n * getMentionText(User) // User is ID 1, display name is 'User'\n *\n * @example Replying\n * // '@\"User\"#p13'\n * getMentionText(User, 13) // User display name is 'User', post ID is 13\n *\n * @example Using old syntax\n * // '@username'\n * getMentionText(User) // User's username is 'username'\n *\n * @example Group mention\n * // '@\"Mods\"#g4'\n * getMentionText(undefined, undefined, group) // Group display name is 'Mods', group ID is 4\n */\nexport default function getMentionText(user, postId, group) {\n if (user !== undefined && postId === undefined) {\n if (shouldUseOldFormat()) {\n // Plain @username\n const cleanText = getCleanDisplayName(user, false);\n return `@${cleanText}`;\n }\n // @\"Display name\"#UserID\n const cleanText = getCleanDisplayName(user);\n return `@\"${cleanText}\"#${user.id()}`;\n } else if (user !== undefined && postId !== undefined) {\n // @\"Display name\"#pPostID\n const cleanText = getCleanDisplayName(user);\n return `@\"${cleanText}\"#p${postId}`;\n } else if (group !== undefined) {\n // @\"Name Plural\"#gGroupID\n return `@\"${group.namePlural()}\"#g${group.id()}`;\n } else {\n throw 'No parameters were passed';\n }\n}\n","import app from 'flarum/forum/app';\nimport DiscussionControls from 'flarum/forum/utils/DiscussionControls';\nimport EditPostComposer from 'flarum/forum/components/EditPostComposer';\nimport getMentionText from './getMentionText';\n\nexport function insertMention(post, composer, quote) {\n return new Promise((resolve) => {\n const user = post.user();\n const mention = getMentionText(user, post.id()) + ' ';\n\n // If the composer is empty, then assume we're starting a new reply.\n // In which case we don't want the user to have to confirm if they\n // close the composer straight away.\n if (!composer.fields.content()) {\n composer.body.attrs.originalContent = mention;\n }\n\n const cursorPosition = composer.editor.getSelectionRange()[0];\n const preceding = composer.fields.content().slice(0, cursorPosition);\n const precedingNewlines = preceding.length == 0 ? 0 : 3 - preceding.match(/(\\n{0,2})$/)[0].length;\n\n composer.editor.insertAtCursor(\n Array(precedingNewlines).join('\\n') + // Insert up to two newlines, depending on preceding whitespace\n (quote ? '> ' + mention + quote.trim().replace(/\\n/g, '\\n> ') + '\\n\\n' : mention),\n false\n );\n return resolve(composer);\n });\n}\n\nexport default function reply(post, quote) {\n if (app.composer.bodyMatches(EditPostComposer) && app.composer.body.attrs.post.discussion() === post.discussion()) {\n // If we're already editing a post in the discussion of post we're quoting,\n // insert the mention directly.\n return insertMention(post, app.composer, quote);\n } else {\n // The default \"Reply\" action behavior will only open a new composer if\n // necessary, but it will always be a ReplyComposer, hence the exceptional\n // case above.\n return DiscussionControls.replyAction.call(post.discussion()).then((composer) => insertMention(post, composer, quote));\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/Fragment'];","import app from 'flarum/forum/app';\nimport Fragment from 'flarum/common/Fragment';\nimport icon from 'flarum/common/helpers/icon';\n\nimport reply from '../utils/reply';\n\nexport default class PostQuoteButton extends Fragment {\n constructor(post) {\n super();\n\n this.post = post;\n }\n\n view() {\n return (\n {\n reply(this.post, this.content);\n }}\n >\n {icon('fas fa-quote-left', { className: 'Button-icon' })}\n {app.translator.trans('flarum-mentions.forum.post.quote_button')}\n \n );\n }\n\n show(left, top) {\n const $this = this.$().show();\n const parentOffset = $this.offsetParent().offset();\n\n $this.css('left', left - parentOffset.left).css('top', top - parentOffset.top);\n\n this.hideHandler = this.hide.bind(this);\n $(document).on('mouseup', this.hideHandler);\n }\n\n showStart(left, top) {\n const $this = this.$();\n\n this.show(left, $(window).scrollTop() + top - $this.outerHeight() - 5);\n }\n\n showEnd(right, bottom) {\n const $this = this.$();\n\n this.show(right - $this.outerWidth(), $(window).scrollTop() + bottom + 5);\n }\n\n hide() {\n this.$().hide();\n $(document).off('mouseup', this.hideHandler);\n }\n}\n","/**\n * Finds the selected text in the provided composer body.\n */\nexport default function selectedText(body) {\n const selection = window.getSelection();\n\n if (!selection.isCollapsed) {\n const range = selection.getRangeAt(0);\n const parent = range.commonAncestorContainer;\n\n if (body[0] === parent || $.contains(body[0], parent)) {\n const clone = $('
      ').append(range.cloneContents());\n\n // Replace emoji images with their shortcode (found in alt attribute)\n clone.find('img.emoji').replaceWith(function () {\n return this.alt;\n });\n\n // Replace all other images with a Markdown image\n clone.find('img').replaceWith(function () {\n return `![](${this.src})`;\n });\n\n // Replace all links with a Markdown link\n clone.find('a').replaceWith(function () {\n return `[${this.innerText}](${this.href})`;\n });\n\n return clone.text();\n }\n }\n return '';\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/TextEditor'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/TextEditorButton'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/ReplyComposer'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/avatar'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/highlight'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/KeyboardNavigatable'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/throttleDebounce'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Badge'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/models/Group'];","import Fragment from 'flarum/common/Fragment';\n\nexport default class AutocompleteDropdown extends Fragment {\n items = [];\n active = false;\n index = 0;\n keyWasJustPressed = false;\n\n view() {\n return (\n
        \n {this.items.map((item) => (\n
      • {item}
      • \n ))}\n
      \n );\n }\n\n show(left, top) {\n this.$()\n .show()\n .css({\n left: left + 'px',\n top: top + 'px',\n });\n this.active = true;\n }\n\n hide() {\n this.$().hide();\n this.active = false;\n }\n\n navigate(delta) {\n this.keyWasJustPressed = true;\n this.setIndex(this.index + delta, true);\n clearTimeout(this.keyWasJustPressedTimeout);\n this.keyWasJustPressedTimeout = setTimeout(() => (this.keyWasJustPressed = false), 500);\n }\n\n complete() {\n this.$('li').eq(this.index).find('button').click();\n }\n\n setIndex(index, scrollToItem) {\n if (this.keyWasJustPressed && !scrollToItem) return;\n\n const $dropdown = this.$();\n const $items = $dropdown.find('li');\n let rangedIndex = index;\n\n if (rangedIndex < 0) {\n rangedIndex = $items.length - 1;\n } else if (rangedIndex >= $items.length) {\n rangedIndex = 0;\n }\n\n this.index = rangedIndex;\n\n const $item = $items.removeClass('active').eq(rangedIndex).addClass('active');\n\n if (scrollToItem) {\n const dropdownScroll = $dropdown.scrollTop();\n const dropdownTop = $dropdown.offset().top;\n const dropdownBottom = dropdownTop + $dropdown.outerHeight();\n const itemTop = $item.offset().top;\n const itemBottom = itemTop + $item.outerHeight();\n\n let scrollTop;\n if (itemTop < dropdownTop) {\n scrollTop = dropdownScroll - dropdownTop + itemTop - parseInt($dropdown.css('padding-top'), 10);\n } else if (itemBottom > dropdownBottom) {\n scrollTop = dropdownScroll - dropdownBottom + itemBottom + parseInt($dropdown.css('padding-bottom'), 10);\n }\n\n if (typeof scrollTop !== 'undefined') {\n $dropdown.stop(true).animate({ scrollTop }, 100);\n }\n }\n }\n}\n","import app from 'flarum/forum/app';\nimport { extend } from 'flarum/common/extend';\nimport TextEditor from 'flarum/common/components/TextEditor';\nimport TextEditorButton from 'flarum/common/components/TextEditorButton';\nimport ReplyComposer from 'flarum/forum/components/ReplyComposer';\nimport EditPostComposer from 'flarum/forum/components/EditPostComposer';\nimport avatar from 'flarum/common/helpers/avatar';\nimport usernameHelper from 'flarum/common/helpers/username';\nimport highlight from 'flarum/common/helpers/highlight';\nimport KeyboardNavigatable from 'flarum/common/utils/KeyboardNavigatable';\nimport { truncate } from 'flarum/common/utils/string';\nimport { throttle } from 'flarum/common/utils/throttleDebounce';\nimport Badge from 'flarum/common/components/Badge';\nimport Group from 'flarum/common/models/Group';\n\nimport AutocompleteDropdown from './fragments/AutocompleteDropdown';\nimport getMentionText from './utils/getMentionText';\n\nconst throttledSearch = throttle(\n 250, // 250ms timeout\n function (typed, searched, returnedUsers, returnedUserIds, dropdown, buildSuggestions) {\n const typedLower = typed.toLowerCase();\n if (!searched.includes(typedLower)) {\n app.store.find('users', { filter: { q: typed }, page: { limit: 5 } }).then((results) => {\n results.forEach((u) => {\n if (!returnedUserIds.has(u.id())) {\n returnedUserIds.add(u.id());\n returnedUsers.push(u);\n }\n });\n\n buildSuggestions();\n });\n\n searched.push(typedLower);\n }\n }\n);\n\nexport default function addComposerAutocomplete() {\n const $container = $('
      ');\n const dropdown = new AutocompleteDropdown();\n\n extend(TextEditor.prototype, 'oncreate', function () {\n const $editor = this.$('.TextEditor-editor').wrap('
      ');\n\n this.navigator = new KeyboardNavigatable();\n this.navigator\n .when(() => dropdown.active)\n .onUp(() => dropdown.navigate(-1))\n .onDown(() => dropdown.navigate(1))\n .onSelect(dropdown.complete.bind(dropdown))\n .onCancel(dropdown.hide.bind(dropdown))\n .bindTo($editor);\n\n $editor.after($container);\n });\n\n extend(TextEditor.prototype, 'buildEditorParams', function (params) {\n const searched = [];\n let relMentionStart;\n let absMentionStart;\n let typed;\n let matchTyped;\n\n // We store users returned from an API here to preserve order in which they are returned\n // This prevents the user list jumping around while users are returned.\n // We also use a hashset for user IDs to provide O(1) lookup for the users already in the list.\n const returnedUsers = Array.from(app.store.all('users'));\n const returnedUserIds = new Set(returnedUsers.map((u) => u.id()));\n\n // Store groups, but exclude the two virtual groups - 'Guest' and 'Member'.\n const returnedGroups = Array.from(\n app.store.all('groups').filter((group) => {\n return group.id() != Group.GUEST_ID && group.id() != Group.MEMBER_ID;\n })\n );\n\n const applySuggestion = (replacement) => {\n this.attrs.composer.editor.replaceBeforeCursor(absMentionStart - 1, replacement + ' ');\n\n dropdown.hide();\n };\n\n params.inputListeners.push(() => {\n const selection = this.attrs.composer.editor.getSelectionRange();\n\n const cursor = selection[0];\n\n if (selection[1] - cursor > 0) return;\n\n // Search backwards from the cursor for an '@' symbol. If we find one,\n // we will want to show the autocomplete dropdown!\n const lastChunk = this.attrs.composer.editor.getLastNChars(30);\n absMentionStart = 0;\n for (let i = lastChunk.length - 1; i >= 0; i--) {\n const character = lastChunk.substr(i, 1);\n if (character === '@' && (i == 0 || /\\s/.test(lastChunk.substr(i - 1, 1)))) {\n relMentionStart = i + 1;\n absMentionStart = cursor - lastChunk.length + i + 1;\n break;\n }\n }\n\n dropdown.hide();\n dropdown.active = false;\n\n if (absMentionStart) {\n typed = lastChunk.substring(relMentionStart).toLowerCase();\n matchTyped = typed.match(/^[\"|“]((?:(?!\"#).)+)$/);\n typed = (matchTyped && matchTyped[1]) || typed;\n\n const makeSuggestion = function (user, replacement, content, className = '') {\n const username = usernameHelper(user);\n\n if (typed) {\n username.children = [highlight(username.text, typed)];\n delete username.text;\n }\n\n return (\n applySuggestion(replacement)}\n onmouseenter={function () {\n dropdown.setIndex($(this).parent().index());\n }}\n >\n \n {avatar(user)}\n {username} {content}\n \n \n );\n };\n\n const makeGroupSuggestion = function (group, replacement, content, className = '') {\n let groupName = group.namePlural().toLowerCase();\n\n if (typed) {\n groupName = highlight(groupName, typed);\n }\n\n return (\n applySuggestion(replacement)}\n onmouseenter={function () {\n dropdown.setIndex($(this).parent().index());\n }}\n >\n \n \n {groupName}\n \n \n );\n };\n\n const userMatches = function (user) {\n const names = [user.username(), user.displayName()];\n\n return names.some((name) => name.toLowerCase().substr(0, typed.length) === typed);\n };\n\n const groupMatches = function (group) {\n const names = [group.nameSingular(), group.namePlural()];\n\n return names.some((name) => name.toLowerCase().substr(0, typed.length) === typed);\n };\n\n const buildSuggestions = () => {\n const suggestions = [];\n\n // If the user has started to type a username, then suggest users\n // matching that username.\n if (typed) {\n returnedUsers.forEach((user) => {\n if (!userMatches(user)) return;\n\n suggestions.push(makeSuggestion(user, getMentionText(user), '', 'MentionsDropdown-user'));\n });\n\n // ... or groups.\n if (app.session?.user?.canMentionGroups()) {\n returnedGroups.forEach((group) => {\n if (!groupMatches(group)) return;\n\n suggestions.push(makeGroupSuggestion(group, getMentionText(undefined, undefined, group), '', 'MentionsDropdown-group'));\n });\n }\n }\n\n // If the user is replying to a discussion, or if they are editing a\n // post, then we can suggest other posts in the discussion to mention.\n // We will add the 5 most recent comments in the discussion which\n // match any username characters that have been typed.\n if (this.attrs.composer.bodyMatches(ReplyComposer) || this.attrs.composer.bodyMatches(EditPostComposer)) {\n const composerAttrs = this.attrs.composer.body.attrs;\n const composerPost = composerAttrs.post;\n const discussion = (composerPost && composerPost.discussion()) || composerAttrs.discussion;\n\n if (discussion) {\n discussion\n .posts()\n // Filter to only comment posts, and replies before this message\n .filter((post) => post && post.contentType() === 'comment' && (!composerPost || post.number() < composerPost.number()))\n // Sort by new to old\n .sort((a, b) => b.createdAt() - a.createdAt())\n // Filter to where the user matches what is being typed\n .filter((post) => {\n const user = post.user();\n return user && userMatches(user);\n })\n // Get the first 5\n .splice(0, 5)\n // Make the suggestions\n .forEach((post) => {\n const user = post.user();\n suggestions.push(\n makeSuggestion(\n user,\n getMentionText(user, post.id()),\n [\n app.translator.trans('flarum-mentions.forum.composer.reply_to_post_text', { number: post.number() }),\n ' — ',\n truncate(post.contentPlain(), 200),\n ],\n 'MentionsDropdown-post'\n )\n );\n });\n }\n }\n\n if (suggestions.length) {\n dropdown.items = suggestions;\n m.render($container[0], dropdown.render());\n\n dropdown.show();\n const coordinates = this.attrs.composer.editor.getCaretCoordinates(absMentionStart);\n const width = dropdown.$().outerWidth();\n const height = dropdown.$().outerHeight();\n const parent = dropdown.$().offsetParent();\n let left = coordinates.left;\n let top = coordinates.top + 15;\n\n // Keep the dropdown inside the editor.\n if (top + height > parent.height()) {\n top = coordinates.top - height - 15;\n }\n if (left + width > parent.width()) {\n left = parent.width() - width;\n }\n\n // Prevent the dropdown from going off screen on mobile\n top = Math.max(-(parent.offset().top - $(document).scrollTop()), top);\n left = Math.max(-parent.offset().left, left);\n\n dropdown.show(left, top);\n } else {\n dropdown.active = false;\n dropdown.hide();\n }\n };\n\n dropdown.active = true;\n\n buildSuggestions();\n\n dropdown.setIndex(0);\n dropdown.$().scrollTop(0);\n\n // Don't send API calls searching for users until at least 2 characters have been typed.\n // This focuses the mention results on users and posts in the discussion.\n if (typed.length > 1 && app.forum.attribute('canSearchUsers')) {\n throttledSearch(typed, searched, returnedUsers, returnedUserIds, dropdown, buildSuggestions);\n }\n }\n });\n });\n\n extend(TextEditor.prototype, 'toolbarItems', function (items) {\n items.add(\n 'mention',\n this.attrs.composer.editor.insertAtCursor(' @')} icon=\"fas fa-at\">\n {app.translator.trans('flarum-mentions.forum.composer.mention_tooltip')}\n \n );\n });\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/Notification'];","import app from 'flarum/forum/app';\nimport Notification from 'flarum/forum/components/Notification';\nimport { truncate } from 'flarum/common/utils/string';\n\nexport default class PostMentionedNotification extends Notification {\n icon() {\n return 'fas fa-reply';\n }\n\n href() {\n const notification = this.attrs.notification;\n const post = notification.subject();\n const content = notification.content();\n\n return app.route.discussion(post.discussion(), content && content.replyNumber);\n }\n\n content() {\n const notification = this.attrs.notification;\n const user = notification.fromUser();\n\n return app.translator.trans('flarum-mentions.forum.notifications.post_mentioned_text', { user, count: 1 });\n }\n\n excerpt() {\n return truncate(this.attrs.notification.subject().contentPlain() || '', 200);\n }\n}\n","import app from 'flarum/forum/app';\nimport Notification from 'flarum/forum/components/Notification';\nimport { truncate } from 'flarum/common/utils/string';\n\nexport default class UserMentionedNotification extends Notification {\n icon() {\n return 'fas fa-at';\n }\n\n href() {\n const post = this.attrs.notification.subject();\n\n return app.route.discussion(post.discussion(), post.number());\n }\n\n content() {\n const user = this.attrs.notification.fromUser();\n\n return app.translator.trans('flarum-mentions.forum.notifications.user_mentioned_text', { user });\n }\n\n excerpt() {\n return truncate(this.attrs.notification.subject().contentPlain(), 200);\n }\n}\n","import app from 'flarum/forum/app';\nimport Notification from 'flarum/forum/components/Notification';\nimport { truncate } from 'flarum/common/utils/string';\n\nexport default class GroupMentionedNotification extends Notification {\n icon() {\n return 'fas fa-at';\n }\n\n href() {\n const post = this.attrs.notification.subject();\n\n return app.route.discussion(post.discussion(), post.number());\n }\n\n content() {\n const user = this.attrs.notification.fromUser();\n\n return app.translator.trans('flarum-mentions.forum.notifications.group_mentioned_text', { user });\n }\n\n excerpt() {\n return truncate(this.attrs.notification.subject().contentPlain(), 200);\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/UserPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/LinkButton'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/models/User'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/Model'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extenders'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/models/Post'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/PostsUserPage'];","import app from 'flarum/forum/app';\nimport PostsUserPage from 'flarum/forum/components/PostsUserPage';\n\n/**\n * The `MentionsUserPage` component shows post which user Mentioned at\n */\nexport default class MentionsUserPage extends PostsUserPage {\n /**\n * Load a new page of the user's activity feed.\n *\n * @param {Integer} [offset] The position to start getting results from.\n * @return {Promise}\n * @protected\n */\n loadResults(offset) {\n return app.store.find('posts', {\n filter: {\n type: 'comment',\n mentioned: this.user.id(),\n },\n page: { offset, limit: this.loadLimit },\n sort: '-createdAt',\n });\n }\n}\n","import Extend from 'flarum/common/extenders';\nimport Post from 'flarum/common/models/Post';\nimport User from 'flarum/common/models/User';\nimport MentionsUserPage from './components/MentionsUserPage';\n\nexport default [\n new Extend.Routes() //\n .add('user.mentions', '/u/:username/mentions', MentionsUserPage),\n\n new Extend.Model(Post) //\n .hasMany('mentionedBy')\n .attribute('mentionedByCount'),\n\n new Extend.Model(User) //\n .attribute('canMentionGroups'),\n];\n","import app from 'flarum/forum/app';\nimport username from 'flarum/common/helpers/username';\nimport extractText from 'flarum/common/utils/extractText';\n\nexport function filterUserMentions(tag) {\n let user;\n\n if (app.forum.attribute('allowUsernameMentionFormat') && tag.hasAttribute('username'))\n user = app.store.getBy('users', 'username', tag.getAttribute('username'));\n else if (tag.hasAttribute('id')) user = app.store.getById('users', tag.getAttribute('id'));\n\n if (user) {\n tag.setAttribute('id', user.id());\n tag.setAttribute('slug', user.slug());\n tag.setAttribute('displayname', extractText(username(user)));\n\n return true;\n }\n\n tag.invalidate();\n}\n\nexport function filterPostMentions(tag) {\n const post = app.store.getById('posts', tag.getAttribute('id'));\n\n if (post) {\n tag.setAttribute('discussionid', post.discussion().id());\n tag.setAttribute('number', post.number());\n tag.setAttribute('displayname', extractText(username(post.user())));\n\n return true;\n }\n}\n\nexport function filterGroupMentions(tag) {\n if (app.session?.user?.canMentionGroups()) {\n const group = app.store.getById('groups', tag.getAttribute('id'));\n\n if (group) {\n tag.setAttribute('groupname', extractText(group.namePlural()));\n tag.setAttribute('icon', group.icon());\n tag.setAttribute('color', group.color());\n\n return true;\n }\n }\n\n tag.invalidate();\n}\n","import GroupMentionedNotification from './components/GroupMentionedNotification';\nimport MentionsUserPage from './components/MentionsUserPage';\nimport PostMentionedNotification from './components/PostMentionedNotification';\nimport UserMentionedNotification from './components/UserMentionedNotification';\nimport AutocompleteDropdown from './fragments/AutocompleteDropdown';\nimport PostQuoteButton from './fragments/PostQuoteButton';\nimport getCleanDisplayName from './utils/getCleanDisplayName';\nimport getMentionText from './utils/getMentionText';\nimport * as reply from './utils/reply';\nimport selectedText from './utils/selectedText';\nimport * as textFormatter from './utils/textFormatter';\n\nexport default {\n 'mentions/components/MentionsUserPage': MentionsUserPage,\n 'mentions/components/PostMentionedNotification': PostMentionedNotification,\n 'mentions/components/UserMentionedNotification': UserMentionedNotification,\n 'mentions/components/GroupMentionedNotification': GroupMentionedNotification,\n 'mentions/fragments/AutocompleteDropdown': AutocompleteDropdown,\n 'mentions/fragments/PostQuoteButton': PostQuoteButton,\n 'mentions/utils/getCleanDisplayName': getCleanDisplayName,\n 'mentions/utils/getMentionText': getMentionText,\n 'mentions/utils/reply': reply,\n 'mentions/utils/selectedText': selectedText,\n 'mentions/utils/textFormatter': textFormatter,\n};\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core;","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport NotificationGrid from 'flarum/forum/components/NotificationGrid';\nimport { getPlainContent } from 'flarum/common/utils/string';\nimport textContrastClass from 'flarum/common/helpers/textContrastClass';\nimport Post from 'flarum/forum/components/Post';\n\nimport addPostMentionPreviews from './addPostMentionPreviews';\nimport addMentionedByList from './addMentionedByList';\nimport addPostReplyAction from './addPostReplyAction';\nimport addPostQuoteButton from './addPostQuoteButton';\nimport addComposerAutocomplete from './addComposerAutocomplete';\nimport PostMentionedNotification from './components/PostMentionedNotification';\nimport UserMentionedNotification from './components/UserMentionedNotification';\nimport GroupMentionedNotification from './components/GroupMentionedNotification';\nimport UserPage from 'flarum/forum/components/UserPage';\nimport LinkButton from 'flarum/common/components/LinkButton';\nimport User from 'flarum/common/models/User';\nimport Model from 'flarum/common/Model';\n\nexport { default as extend } from './extend';\n\napp.initializers.add('flarum-mentions', function () {\n // For every mention of a post inside a post's content, set up a hover handler\n // that shows a preview of the mentioned post.\n addPostMentionPreviews();\n\n // In the footer of each post, show information about who has replied (i.e.\n // who the post has been mentioned by).\n addMentionedByList();\n\n // Add a 'reply' control to the footer of each post. When clicked, it will\n // open up the composer and add a post mention to its contents.\n addPostReplyAction();\n\n // Show a Quote button when Post text is selected\n addPostQuoteButton();\n\n // After typing '@' in the composer, show a dropdown suggesting a bunch of\n // posts or users that the user could mention.\n addComposerAutocomplete();\n\n app.notificationComponents.postMentioned = PostMentionedNotification;\n app.notificationComponents.userMentioned = UserMentionedNotification;\n app.notificationComponents.groupMentioned = GroupMentionedNotification;\n\n // Add notification preferences.\n extend(NotificationGrid.prototype, 'notificationTypes', function (items) {\n items.add('postMentioned', {\n name: 'postMentioned',\n icon: 'fas fa-reply',\n label: app.translator.trans('flarum-mentions.forum.settings.notify_post_mentioned_label'),\n });\n\n items.add('userMentioned', {\n name: 'userMentioned',\n icon: 'fas fa-at',\n label: app.translator.trans('flarum-mentions.forum.settings.notify_user_mentioned_label'),\n });\n\n items.add('groupMentioned', {\n name: 'groupMentioned',\n icon: 'fas fa-at',\n label: app.translator.trans('flarum-mentions.forum.settings.notify_group_mentioned_label'),\n });\n });\n\n // Add mentions tab in user profile\n extend(UserPage.prototype, 'navItems', function (items) {\n const user = this.user;\n items.add(\n 'mentions',\n LinkButton.component(\n {\n href: app.route('user.mentions', { username: user.slug() }),\n name: 'mentions',\n icon: 'fas fa-at',\n },\n app.translator.trans('flarum-mentions.forum.user.mentions_link')\n ),\n 80\n );\n });\n\n // Remove post mentions when rendering post previews.\n getPlainContent.removeSelectors.push('a.PostMention');\n\n // Apply color contrast fix on group mentions.\n extend(Post.prototype, 'oncreate', function () {\n this.$('.GroupMention--colored').each(function () {\n this.classList.add(textContrastClass(getComputedStyle(this).getPropertyValue('--group-color')));\n });\n });\n});\n\nexport * from './utils/textFormatter';\n\n// Expose compat API\nimport mentionsCompat from './compat';\nimport { compat } from '@flarum/core/forum';\n\nObject.assign(compat, mentionsCompat);\n","import { extend } from 'flarum/common/extend';\nimport CommentPost from 'flarum/forum/components/CommentPost';\nimport PostPreview from 'flarum/forum/components/PostPreview';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\n\nexport default function addPostMentionPreviews() {\n function addPreviews() {\n const contentHtml = this.attrs.post.contentHtml();\n\n if (contentHtml === this.oldPostContentHtml || this.isEditing()) return;\n\n this.oldPostContentHtml = contentHtml;\n\n const parentPost = this.attrs.post;\n const $parentPost = this.$();\n\n this.$().on('click', '.UserMention:not(.UserMention--deleted), .PostMention:not(.PostMention--deleted)', function (e) {\n m.route.set(this.getAttribute('href'));\n e.preventDefault();\n });\n\n this.$('.PostMention:not(.PostMention--deleted)').each(function () {\n const $this = $(this);\n const id = $this.data('id');\n let timeout;\n\n // Wrap the mention link in a wrapper element so that we can insert a\n // preview popup as its sibling and relatively position it.\n const $preview = $('
        ');\n $parentPost.append($preview);\n\n const getPostElement = () => {\n return $(`.PostStream-item[data-id=\"${id}\"]`);\n };\n\n const showPreview = () => {\n // When the user hovers their mouse over the mention, look for the\n // post that it's referring to in the stream, and determine if it's\n // in the viewport. If it is, we will \"pulsate\" it.\n const $post = getPostElement();\n let visible = false;\n if ($post.length) {\n const top = $post.offset().top;\n const scrollTop = window.pageYOffset;\n if (top > scrollTop && top + $post.height() < scrollTop + $(window).height()) {\n $post.addClass('pulsate');\n visible = true;\n }\n }\n\n // Otherwise, we will show a popup preview of the post. If the post\n // hasn't yet been loaded, we will need to do that.\n if (!visible) {\n // Position the preview so that it appears above the mention.\n // (The offsetParent should be .Post-body.)\n const positionPreview = () => {\n const previewHeight = $preview.outerHeight(true);\n let offset = 0;\n\n // If the preview goes off the top of the viewport, reposition it to\n // be below the mention.\n if ($this.offset().top - previewHeight < $(window).scrollTop() + $('#header').outerHeight()) {\n offset += $this.outerHeight(true);\n } else {\n offset -= previewHeight;\n }\n\n $preview\n .show()\n .css('top', $this.offset().top - $parentPost.offset().top + offset)\n .css('left', $this.offsetParent().offset().left - $parentPost.offset().left)\n .css('max-width', $this.offsetParent().width());\n };\n\n const showPost = (post) => {\n const discussion = post.discussion();\n\n m.render($preview[0], [\n discussion !== parentPost.discussion() ? (\n
      • \n {discussion.title()}\n
      • \n ) : (\n ''\n ),\n
      • {PostPreview.component({ post })}
      • ,\n ]);\n positionPreview();\n };\n\n const post = app.store.getById('posts', id);\n if (post && post.discussion()) {\n showPost(post);\n } else {\n m.render($preview[0], LoadingIndicator.component());\n app.store.find('posts', id).then(showPost);\n positionPreview();\n }\n\n setTimeout(() => $preview.off('transitionend').addClass('in'));\n }\n };\n\n const hidePreview = () => {\n getPostElement().removeClass('pulsate');\n if ($preview.hasClass('in')) {\n $preview.removeClass('in').one('transitionend', () => $preview.hide());\n }\n };\n\n // On a touch (mobile) device we cannot hover the link to reveal the preview.\n // Instead we cancel the navigation so that a click reveals the preview.\n // Users can then click on the preview to go to the post if desired.\n $this.on('touchend', (e) => {\n if (e.cancelable) {\n e.preventDefault();\n }\n });\n\n $this\n .add($preview)\n .hover(\n () => {\n clearTimeout(timeout);\n timeout = setTimeout(showPreview, 250);\n },\n () => {\n clearTimeout(timeout);\n getPostElement().removeClass('pulsate');\n timeout = setTimeout(hidePreview, 250);\n }\n )\n .on('touchend', (e) => {\n showPreview();\n e.stopPropagation();\n });\n\n $(document).on('touchend', hidePreview);\n });\n }\n\n extend(CommentPost.prototype, 'oncreate', addPreviews);\n extend(CommentPost.prototype, 'onupdate', addPreviews);\n}\n","import app from 'flarum/forum/app';\nimport { extend } from 'flarum/common/extend';\nimport CommentPost from 'flarum/forum/components/CommentPost';\nimport Link from 'flarum/common/components/Link';\nimport PostPreview from 'flarum/forum/components/PostPreview';\nimport punctuateSeries from 'flarum/common/helpers/punctuateSeries';\nimport username from 'flarum/common/helpers/username';\nimport icon from 'flarum/common/helpers/icon';\nimport Button from 'flarum/common/components/Button';\nimport MentionedByModal from './components/MentionedByModal';\n\nexport default function addMentionedByList() {\n function hidePreview() {\n this.$('.Post-mentionedBy-preview')\n .removeClass('in')\n .one('transitionend', function () {\n $(this).hide();\n });\n }\n\n extend(CommentPost.prototype, 'oncreate', function () {\n let timeout;\n const post = this.attrs.post;\n const replies = post.mentionedBy();\n\n if (replies && replies.length) {\n const $preview = $('
          ');\n this.$().append($preview);\n\n const $parentPost = this.$();\n const $this = this.$('.Post-mentionedBy');\n\n const showPreview = () => {\n if (!$preview.hasClass('in') && $preview.is(':visible')) return;\n\n // When the user hovers their mouse over the list of people who have\n // replied to the post, render a list of reply previews into a\n // popup.\n m.render(\n $preview[0],\n <>\n {replies.map((reply) => (\n
        • \n {PostPreview.component({\n post: reply,\n onclick: hidePreview.bind(this),\n })}\n
        • \n ))}\n {replies.length < post.mentionedByCount() ? (\n
        • \n {\n hidePreview.call(this);\n app.modal.show(MentionedByModal, { post });\n }}\n >\n \n {icon('fas fa-reply-all')}\n \n {app.translator.trans('flarum-mentions.forum.post.mentioned_by_more_text', { count: post.mentionedByCount() - replies.length })}\n \n \n \n
        • \n ) : null}\n \n );\n\n $preview\n .show()\n .css('top', $this.offset().top - $parentPost.offset().top + $this.outerHeight(true))\n .css('left', $this.offsetParent().offset().left - $parentPost.offset().left)\n .css('max-width', $parentPost.width());\n\n setTimeout(() => $preview.off('transitionend').addClass('in'));\n };\n\n $this.add($preview).hover(\n () => {\n clearTimeout(timeout);\n timeout = setTimeout(showPreview, 250);\n },\n () => {\n clearTimeout(timeout);\n timeout = setTimeout(hidePreview, 250);\n }\n );\n\n // Whenever the user hovers their mouse over a particular name in the\n // list of repliers, highlight the corresponding post in the preview\n // popup.\n this.$()\n .find('.Post-mentionedBy-summary a')\n .hover(\n function () {\n $preview.find('[data-number=\"' + $(this).data('number') + '\"]').addClass('active');\n },\n function () {\n $preview.find('[data-number]').removeClass('active');\n }\n );\n }\n });\n\n extend(CommentPost.prototype, 'footerItems', function (items) {\n const post = this.attrs.post;\n const replies = post.mentionedBy();\n\n if (replies && replies.length) {\n const users = [];\n const repliers = replies\n .sort((reply) => (reply.user() === app.session.user ? -1 : 0))\n .filter((reply) => {\n const user = reply.user();\n if (users.indexOf(user) === -1) {\n users.push(user);\n return true;\n }\n });\n\n const limit = 4;\n const overLimit = repliers.length > limit;\n\n // Create a list of unique users who have replied. So even if a user has\n // replied twice, they will only be in this array once.\n const names = repliers.slice(0, overLimit ? limit - 1 : limit).map((reply) => {\n const user = reply.user();\n\n return (\n \n {app.session.user === user ? app.translator.trans('flarum-mentions.forum.post.you_text') : username(user)}\n \n );\n });\n\n // If there are more users that we've run out of room to display, add a \"x\n // others\" name to the end of the list. Clicking on it will display a modal\n // with a full list of names.\n if (overLimit) {\n const count = repliers.length - names.length;\n\n names.push(app.translator.trans('flarum-mentions.forum.post.others_text', { count }));\n }\n\n items.add(\n 'replies',\n
          \n \n {icon('fas fa-reply')}\n {app.translator.trans('flarum-mentions.forum.post.mentioned_by' + (repliers[0].user() === app.session.user ? '_self' : '') + '_text', {\n count: names.length,\n users: punctuateSeries(names),\n })}\n \n
          \n );\n }\n });\n}\n","import app from 'flarum/forum/app';\nimport { extend } from 'flarum/common/extend';\nimport Button from 'flarum/common/components/Button';\nimport CommentPost from 'flarum/forum/components/CommentPost';\n\nimport reply from './utils/reply';\n\nexport default function () {\n extend(CommentPost.prototype, 'actionItems', function (items) {\n const post = this.attrs.post;\n\n if (post.isHidden() || (app.session.user && !post.discussion().canReply())) return;\n\n items.add(\n 'reply',\n \n );\n });\n}\n","import app from 'flarum/forum/app';\nimport { extend } from 'flarum/common/extend';\nimport CommentPost from 'flarum/forum/components/CommentPost';\n\nimport PostQuoteButton from './fragments/PostQuoteButton';\nimport selectedText from './utils/selectedText';\n\nexport default function addPostQuoteButton() {\n extend(CommentPost.prototype, 'oncreate', function () {\n const post = this.attrs.post;\n\n if (post.isHidden() || (app.session.user && !post.discussion().canReply())) return;\n\n const $postBody = this.$('.Post-body');\n\n // Wrap the quote button in a wrapper element so that we can render\n // button into it.\n const $container = $('
          ');\n\n const button = new PostQuoteButton(post);\n\n const handler = function (e) {\n setTimeout(() => {\n const content = selectedText($postBody);\n if (content) {\n button.content = content;\n m.render($container[0], button.render());\n\n const rects = window.getSelection().getRangeAt(0).getClientRects();\n const firstRect = rects[0];\n\n if (e.clientY < firstRect.bottom && e.clientX - firstRect.right < firstRect.left - e.clientX) {\n button.showStart(firstRect.left, firstRect.top);\n } else {\n const lastRect = rects[rects.length - 1];\n button.showEnd(lastRect.right, lastRect.bottom);\n }\n }\n }, 1);\n };\n\n this.$().after($container).on('mouseup', handler);\n\n if ('ontouchstart' in window) {\n document.addEventListener('selectionchange', handler, false);\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","_extends","assign","target","i","arguments","length","source","apply","this","_defineProperties","props","descriptor","configurable","writable","MentionedByModalState","params","page","limit","Constructor","protoProps","PaginatedListState","MentionedByModal","oninit","vnode","state","filter","mentionedPost","attrs","post","id","sort","refresh","className","title","app","content","isInitialLoading","getPages","map","items","reply","number","onclick","hasNext","loadNext","loading","isLoadingNext","Modal","getDeletedUserText","extractText","getCleanDisplayName","user","useDisplayName","displayName","username","replace","getMentionText","postId","group","undefined","namePlural","insertMention","composer","quote","Promise","resolve","mention","fields","body","originalContent","cursorPosition","editor","getSelectionRange","preceding","slice","precedingNewlines","match","insertAtCursor","Array","join","trim","EditPostComposer","discussion","DiscussionControls","then","PostQuoteButton","view","class","icon","show","left","top","$this","$","parentOffset","offsetParent","offset","css","hideHandler","hide","document","on","showStart","window","scrollTop","outerHeight","showEnd","right","bottom","outerWidth","off","Fragment","selectedText","selection","getSelection","isCollapsed","range","getRangeAt","parent","commonAncestorContainer","contains","clone","append","cloneContents","find","replaceWith","alt","src","innerText","href","text","AutocompleteDropdown","active","index","keyWasJustPressed","item","navigate","delta","setIndex","clearTimeout","keyWasJustPressedTimeout","setTimeout","complete","eq","click","scrollToItem","$dropdown","$items","rangedIndex","$item","removeClass","addClass","dropdownScroll","dropdownTop","dropdownBottom","itemTop","itemBottom","parseInt","stop","animate","throttledSearch","throttle","typed","searched","returnedUsers","returnedUserIds","dropdown","buildSuggestions","typedLower","toLowerCase","includes","q","results","forEach","u","has","add","push","PostMentionedNotification","notification","subject","replyNumber","fromUser","count","excerpt","truncate","contentPlain","Notification","UserMentionedNotification","GroupMentionedNotification","MentionsUserPage","loadResults","type","mentioned","loadLimit","PostsUserPage","Extend","Post","hasMany","attribute","User","filterUserMentions","tag","hasAttribute","getAttribute","setAttribute","slug","invalidate","filterPostMentions","filterGroupMentions","canMentionGroups","color","textFormatter","$container","addPreviews","contentHtml","oldPostContentHtml","isEditing","parentPost","$parentPost","e","m","route","set","preventDefault","each","timeout","data","$preview","getPostElement","showPreview","$post","visible","pageYOffset","height","positionPreview","previewHeight","width","showPost","render","PostPreview","store","getById","LoadingIndicator","hidePreview","hasClass","one","cancelable","hover","stopPropagation","extend","CommentPost","addPostMentionPreviews","replies","mentionedBy","is","mentionedByCount","users","repliers","indexOf","overLimit","names","punctuateSeries","addMentionedByList","isHidden","canReply","$postBody","button","handler","rects","getClientRects","firstRect","clientY","clientX","lastRect","after","addEventListener","TextEditor","$editor","wrap","navigator","KeyboardNavigatable","when","onUp","onDown","onSelect","onCancel","bindTo","relMentionStart","absMentionStart","matchTyped","from","Set","returnedGroups","Group","applySuggestion","replacement","replaceBeforeCursor","inputListeners","cursor","lastChunk","getLastNChars","substr","test","substring","makeSuggestion","usernameHelper","children","highlight","onmouseenter","avatar","userMatches","some","name","suggestions","nameSingular","groupMatches","groupName","makeGroupSuggestion","bodyMatches","ReplyComposer","composerAttrs","composerPost","posts","contentType","b","createdAt","splice","coordinates","getCaretCoordinates","Math","max","NotificationGrid","label","UserPage","LinkButton","getPlainContent","classList","textContrastClass","getComputedStyle","getPropertyValue","mentionsCompat"],"sourceRoot":""} \ No newline at end of file