diff --git a/extensions/messages/js/dist/forum/components/MessagesPage.js b/extensions/messages/js/dist/forum/components/MessagesPage.js index 9071548c7..0b33a7b93 100644 --- a/extensions/messages/js/dist/forum/components/MessagesPage.js +++ b/extensions/messages/js/dist/forum/components/MessagesPage.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkmodule_exports=self.webpackChunkmodule_exports||[]).push([[301],{684:(e,s,t)=>{t.d(s,{A:()=>y});var a=t(488),r=t.n(a),o=t(950),i=t.n(o),l=t(336),n=t.n(l),d=t(443),c=t.n(d),u=t(88),g=t.n(u),h=t(917),p=t.n(h),f=t(521),v=t.n(f),b=t(167),N=t.n(b),_=t(906),M=t.n(_);class A extends(i()){view(e){const s=this.attrs.dialog,t=s.recipient(),a=s.lastMessage();return m("li",{className:c()("DialogListItem",{"DialogListItem--unread":s.unreadCount(),active:this.attrs.active})},m(g(),{href:r().route.dialog(s),className:c()("DialogListItem-button",{active:this.attrs.active})},m("div",{className:"DialogListItem-avatar"},m(p(),{user:t}),!!s.unreadCount()&&m("div",{className:"Bubble Bubble--primary"},s.unreadCount())),m("div",{className:"DialogListItem-content"},m("div",{className:"DialogListItem-title"},v()(t),N()(s.lastMessageAt()),this.attrs.actions&&m("div",{className:"DialogListItem-actions"},this.actionItems().toArray())),m("div",{className:"DialogListItem-lastMessage"},a?a.contentPlain()?.slice(0,80):""))))}actionItems(){const e=new(M());return e.add("markAsRead",m(n(),{className:"Notification-action Button Button--link",icon:"fas fa-check","aria-label":r().translator.trans("flarum-messages.forum.dialog_list.mark_as_read_tooltip"),onclick:e=>{e.preventDefault(),e.stopPropagation(),this.attrs.dialog.save({lastReadMessageId:(this.attrs.dialog.data.relationships?.lastMessage.data).id}).finally((()=>{0===this.attrs.dialog.unreadCount()&&r().session.user.pushAttributes({messageCount:(r().session.user.attribute("messageCount")??1)-1}),m.redraw()}))}}),100),e}}flarum.reg.add("flarum-messages","forum/components/DialogListItem",A);class y extends(i()){oninit(e){super.oninit(e)}oncreate(e){super.oncreate(e)}onupdate(e){super.onupdate(e)}view(){return m("div",{className:"DialogList"},m("ul",{className:"DialogList-list"},this.attrs.state.getAllItems().map((e=>m(A,{dialog:e,active:this.attrs.activeDialog?.id()===e.id(),actions:this.attrs.itemActions})))),this.attrs.state.hasNext()&&!this.attrs.hideMore&&m("div",{className:"DialogList-loadMore"},m(n(),{className:"Button",onclick:this.attrs.state.loadNext.bind(this.attrs.state)},r().translator.trans("flarum-messages.forum.dialog_list.load_more_button"))))}}flarum.reg.add("flarum-messages","forum/components/DialogList",y)},654:(e,s,t)=>{t.r(s),t.d(s,{default:()=>me});var a=t(805),r=t(488),o=t.n(r),i=t(859),l=t.n(i),n=t(314),d=t.n(n),c=t(801),u=t.n(c),g=t(684),h=t(661),p=t.n(h),f=t(821),v=t.n(f),b=t(500),N=t.n(b),_=t(402),M=t.n(_),A=t(336),y=t.n(A);class I extends(M()){static initAttrs(e){e.className="MessagesPage-nav"}items(){const e=super.items(),s=o().session.user.attribute("canSendAnyMessage");return e.remove("newDiscussion"),e.add("newMessage",m(y(),{icon:"fas fa-edit",className:"Button Button--primary IndexPage-newDiscussion MessagesPage-newMessage",itemClassName:"App-primaryControl",onclick:()=>this.newMessageAction(),disabled:!s},o().translator.trans("flarum-messages.forum.messages_page.new_message_button")),10),e}newMessageAction(){return flarum.reg.asyncModuleImport("flarum/forum/components/ComposerBody").then((()=>(o().composer.load((()=>t.e(451).then(t.bind(t,761))),{user:o().session.user,onsubmit:()=>{o().dialogs.refresh()}}).then((()=>o().composer.show())),o().composer)))}}flarum.reg.add("flarum-messages","forum/components/MessagesSidebar",I);var k=t(950),D=t.n(k),w=t(476),P=t.n(w),S=t(906),T=t.n(S),B=t(154),L=t.n(B),x=t(917),C=t.n(x),R=t(3),H=t.n(R),j=t(651),q=t.n(j),G=t(301),O=t.n(G),E=t(443),F=t.n(E);class V extends(L()){oninit(e){super.oninit(e)}user(){return this.attrs.message.user()}controls(){return[]}freshness(){return this.attrs.message.freshness}createdByStarter(){return!1}onbeforeupdate(e){return super.onbeforeupdate(e)}onupdate(e){super.onupdate(e)}elementAttrs(){const e=this.attrs.message,s=super.elementAttrs();return s.className=F()(s.className||null,"Message",{"Post--renderFailed":e.renderFailed(),revealContent:!1,editing:!1}),s}header(){return super.header()}content(){return super.content().concat([m(H(),{headerItems:this.headerItems(),cardVisible:!1,isEditing:!1,isHidden:!1,contentHtml:this.attrs.message.contentHtml(),user:this.attrs.message.user()})])}classes(e){return super.classes(e)}actionItems(){return super.actionItems()}footerItems(){return super.footerItems()}sideItems(){return super.sideItems()}avatar(){return this.attrs.message.user()?m(C(),{user:this.attrs.message.user()}):""}headerItems(){const e=new(T()),s=this.attrs.message;return e.add("user",m(q(),{post:s}),100),e.add("meta",m(O(),{post:s})),e}}flarum.reg.add("flarum-messages","forum/components/Message",V);class z extends(D()){constructor(){super(...arguments),(0,a.A)(this,"replyPlaceholderComponent",v()(null)),(0,a.A)(this,"loadingPostComponent",v()(null)),(0,a.A)(this,"scrollListener",void 0),(0,a.A)(this,"initialToBottomScroll",!1),(0,a.A)(this,"lastTime",null),(0,a.A)(this,"checkedRead",!1),(0,a.A)(this,"markingAsRead",!1)}oninit(e){super.oninit(e),Promise.all([flarum.reg.asyncModuleImport("flarum/forum/components/ReplyPlaceholder"),flarum.reg.asyncModuleImport("flarum/forum/components/LoadingPost")]).then((e=>{let[s,t]=e;this.replyPlaceholderComponent(s.default),this.loadingPostComponent(t.default)}))}oncreate(e){super.oncreate(e),this.scrollListener=new(P())(this.onscroll.bind(this),this.element),setTimeout((()=>{this.scrollListener.start(),this.element.addEventListener("scrollend",this.markAsRead.bind(this))}))}onupdate(e){super.onupdate(e),this.initialToBottomScroll||this.attrs.state.isLoading()||(this.scrollToBottom(),this.initialToBottomScroll=!0),this.initialToBottomScroll&&!this.checkedRead&&(this.markAsRead(),this.checkedRead=!0)}onremove(e){super.onremove(e),this.scrollListener.stop()}view(){return m("div",{className:"MessageStream"},this.attrs.state.isLoading()?m(p(),null):this.content())}content(){const e=[],s=this.attrs.state.getAllItems().sort(((e,s)=>e.createdAt().getTime()-s.createdAt().getTime())),a=this.replyPlaceholderComponent(),r=this.loadingPostComponent();return s[0].id()!==(this.attrs.dialog.data.relationships?.firstMessage.data).id&&(e.push(m("div",{className:"MessageStream-item",key:"loadPrevious"},m(y(),{onclick:()=>this.whileMaintainingScroll((()=>this.attrs.state.loadNext())),type:"button",className:"Button Button--block MessageStream-loadPrev"},o().translator.trans("flarum-messages.forum.messages_page.stream.load_previous_button")))),r&&e.push(m("div",{className:"MessageStream-item",key:"loading-prev"},m(r,null)))),s.forEach(((s,t)=>e.push(this.messageItem(s,t)))),a&&e.push(m("div",{className:"MessageStream-item",key:"reply"},m(a,{discussion:this.attrs.dialog,onclick:()=>{flarum.reg.asyncModuleImport("flarum/forum/components/ComposerBody").then((()=>{o().composer.load((()=>t.e(451).then(t.bind(t,761))),{user:o().session.user,replyingTo:this.attrs.dialog,onsubmit:()=>{this.attrs.state.refresh().then((()=>setTimeout((()=>this.scrollToBottom()),50)))}}).then((()=>o().composer.show()))}))},composingReply:()=>o().composer.composingMessageTo(this.attrs.dialog)}))),e}messageItem(e,s){return m("div",{className:"MessageStream-item",key:s,"data-id":e.id()},this.timeGap(e),m(V,{message:e}))}timeGap(e){if(e.id()===(this.attrs.dialog.data.relationships?.firstMessage.data).id)return this.lastTime=e.createdAt(),m("div",{class:"PostStream-timeGap"},m("span",null,o().translator.trans("flarum-messages.forum.messages_page.stream.start_of_the_conversation")));const s=this.lastTime,t=e.createdAt().getTime()-(s?.getTime()||0);return this.lastTime=e.createdAt(),s&&t>3456e5?m("div",{className:"PostStream-timeGap"},m("span",null,o().translator.trans("flarum-messages.forum.messages_page.stream.time_lapsed_text",{period:dayjs().add(t,"ms").fromNow(!0)}))):null}onscroll(){this.whileMaintainingScroll((()=>this.element.scrollTop<=80&&this.attrs.state.hasNext()?this.attrs.state.loadNext():this.element.scrollTop+this.element.clientHeight===this.element.scrollHeight&&this.attrs.state.hasPrev()?this.attrs.state.loadPrev():null))}scrollToBottom(){this.element.scrollTop=this.element.scrollHeight}whileMaintainingScroll(e){const s=this.element.scrollTop,t=this.element.scrollHeight,a=e();a instanceof Promise&&a.then((()=>{requestAnimationFrame((()=>{this.element.scrollTop=this.element.scrollHeight-t+s}))}))}markAsRead(){const e=Number(this.$(".MessageStream-item[data-id]").filter(((e,s)=>this.element.scrollHeight<=this.element.clientHeight||this.$().offset().top+this.element.clientHeight>$(s).offset().top)).last().data("id"));e&&o().session.user&&e>(this.attrs.dialog.lastReadMessageId()||0)&&!this.markingAsRead&&(this.markingAsRead=!0,this.attrs.dialog.save({lastReadMessageId:e}).finally((()=>{this.markingAsRead=!1,0===this.attrs.dialog.unreadCount()&&o().session.user.pushAttributes({messageCount:(o().session.user.attribute("messageCount")??1)-1}),m.redraw()})))}}flarum.reg.add("flarum-messages","forum/components/MessageStream",z);var J=t(521),K=t.n(J),Q=t(662),U=t.n(Q);class W extends(U()){constructor(e,s){void 0===s&&(s=1),super(e,s,null)}get type(){return"dialog-messages"}getAllItems(){return super.getAllItems()}}flarum.reg.add("flarum-messages","forum/states/MessageStreamState",W);var X=t(88),Y=t.n(X),Z=t(741),ee=t.n(Z),se=t(533),te=t.n(se),ae=t(653),re=t.n(ae),oe=t(819),ie=t.n(oe);class le extends(te()){className(){return"Modal--small Modal--flat DetailsModal"}title(){return o().translator.trans("flarum-messages.forum.dialog_section.details_modal.title")}content(){let e=(this.attrs.dialog.users()||[]).filter(Boolean);return m("div",{className:"Modal-body DetailsModal-infoGroups"},m("div",{className:"DetailsModal-recipients DetailsModal-info"},m("div",{className:"DetailsModal-info-title"},o().translator.trans("flarum-messages.forum.dialog_section.details_modal.recipients")),m("div",{className:"DetailsModal-recipients-list"},e?.map((e=>m("div",{className:"DetailsModal-recipient"},m(C(),{user:e}),m(Y(),{href:o().route("user",{username:e.slug()})},m("span",{className:"DetailsModal-recipient-username"},K()(e))),m("div",{className:"badges"},ie()(e.badges().toArray()))))))),this.infoItems().toArray())}infoItems(){const e=new(T());return e.add("created",m("div",{className:"DetailsModal-createdAt DetailsModal-info"},m("div",{className:"DetailsModal-info-title"},o().translator.trans("flarum-messages.forum.dialog_section.details_modal.created_at")),m("div",{className:"DetailsModal-info-content"},re()(this.attrs.dialog.createdAt())))),e}}flarum.reg.add("flarum-messages","forum/components/DetailsModal",le);class ne extends(D()){constructor(){super(...arguments),(0,a.A)(this,"loading",!1),(0,a.A)(this,"messages",void 0)}oninit(e){super.oninit(e),this.messages=new W({filter:{dialog:this.attrs.dialog.id()},sort:"-createdAt"}),this.messages.refresh()}view(){const e=this.attrs.dialog.recipient();return m("div",{className:"DialogSection"},m("div",{className:"DialogSection-header"},m(C(),{user:e}),m("div",{className:"DialogSection-header-info"},e&&m(Y(),{href:o().route.user(e)},m("h2",null,K()(e)))||m("h2",null,K()(e)),m("div",{className:"badges"},ie()(e?.badges().toArray()||[]))),m("div",{className:"DialogSection-header-actions"},this.actionItems().toArray())),m(z,{dialog:this.attrs.dialog,state:this.messages}))}actionItems(){const e=new(T());return e.add("details",m(ee(),{icon:"fas fa-ellipsis-h",className:"DialogSection-controls",buttonClassName:"Button Button--icon",accessibleToggleLabel:o().translator.trans("flarum-messages.forum.dialog_section.controls_toggle_label"),label:o().translator.trans("flarum-messages.forum.dialog_section.controls_toggle_label")},this.controlItems().toArray())),e}controlItems(){const e=new(T());return e.add("details",m(y(),{icon:"fas fa-info-circle",onclick:()=>o().modal.show(le,{dialog:this.attrs.dialog})},o().translator.trans("flarum-messages.forum.dialog_section.controls.details_button"))),e}}flarum.reg.add("flarum-messages","forum/components/DialogSection",ne);class me extends(l()){constructor(){super(...arguments),(0,a.A)(this,"selectedDialog",v()(null))}oninit(e){super.oninit(e),o().session.user?(o().current.set("noTagsList",!0),o().dialogs.hasItems()?this.initDialog():o().dialogs.refresh().then((async()=>{o().dialogs.hasItems()&&await this.initDialog()}))):m.route.set(o().route("index"))}dialogRequestParams(){return{include:"users.groups"}}async initDialog(){const e=m.route.param("id"),s=o().translator.trans("flarum-messages.forum.messages_page.title",{},!0);let t;t=e?o().store.getById("dialogs",e)||await o().store.find("dialogs",e,this.dialogRequestParams()):o().dialogs.getAllItems()[0],this.selectedDialog(t),t?(o().setTitle(t.title()),o().history.push("dialog",t.title())):(o().setTitle(s),o().history.push("messages",s)),m.redraw()}onupdate(e){super.onupdate(e);const s=this.element.querySelector(".DialogListItem.active"),t=this.element.querySelector(".DialogList");s&&$(t).offset().top+t.clientHeight<=$(s).offset().top&&s.scrollIntoView()}view(){return m(d(),{className:"MessagesPage Page--vertical",loading:!1,hero:this.hero.bind(this),sidebar:()=>m(I,null)},o().dialogs.isLoading()?m(p(),null):o().dialogs.hasItems()?m("div",{className:"MessagesPage-content"},m("div",{className:"MessagesPage-sidebar",key:"sidebar"},m("div",{className:"IndexPage-toolbar",key:"toolbar"},m("ul",{className:"IndexPage-toolbar-view"},ie()(this.viewItems().toArray())),m("ul",{className:"IndexPage-toolbar-action"},ie()(this.actionItems().toArray()))),m(g.A,{key:"list",state:o().dialogs,activeDialog:this.selectedDialog()})),this.selectedDialog()?m(ne,{key:"dialog",dialog:this.selectedDialog()}):m(p(),{key:"loading",display:"block"})):m(N(),{icon:"far fa-envelope-open"},o().translator.trans("flarum-messages.forum.messages_page.empty_text")))}hero(){return m("header",{className:"Hero MessagesPageHero"},m("div",{className:"container"},m("div",{className:"containerNarrow"},m("h1",{className:"Hero-title"},m(u(),{name:"fas fa-envelope"})," ",o().translator.trans("flarum-messages.forum.messages_page.hero.title")),m("div",{className:"Hero-subtitle"},o().translator.trans("flarum-messages.forum.messages_page.hero.subtitle")))))}viewItems(){const e=new(T()),s=o().dialogs.sortMap(),t=Object.keys(s).reduce(((e,t)=>{const a=s[t];return e[t]="string"!=typeof a?a.label:o().translator.trans(`flarum-messages.forum.index_sort.${t}_button`),e}),{});return e.add("sort",m(ee(),{buttonClassName:"Button",label:t[o().dialogs.getParams()?.sort||0]||Object.values(t)[0],accessibleToggleLabel:o().translator.trans("core.forum.index_sort.toggle_dropdown_accessible_label")},Object.keys(t).map((e=>{const a=t[e],r=(o().dialogs.getParams().sort||Object.keys(s)[0])===e;return m(y(),{icon:!r||"fas fa-check",onclick:()=>o().dialogs.changeSort(e),active:r},a)})))),e}actionItems(){const e=new(T());return e.add("refresh",m(y(),{title:o().translator.trans("flarum-messages.forum.messages_page.refresh_tooltip"),"aria-label":o().translator.trans("flarum-messages.forum.messages_page.refresh_tooltip"),icon:"fas fa-sync",className:"Button Button--icon",onclick:()=>{o().dialogs.refresh()}})),o().session.user&&e.add("markAllAsRead",m(y(),{title:o().translator.trans("flarum-messages.forum.messages_page.mark_all_as_read_tooltip"),"aria-label":o().translator.trans("flarum-messages.forum.messages_page.mark_all_as_read_tooltip"),icon:"fas fa-check",className:"Button Button--icon",onclick:()=>o().dialogs.markAllAsRead()})),e}}flarum.reg.add("flarum-messages","forum/components/MessagesPage",me)}}]); +"use strict";(self.webpackChunkmodule_exports=self.webpackChunkmodule_exports||[]).push([[301],{684:(e,s,t)=>{t.d(s,{A:()=>y});var a=t(488),r=t.n(a),o=t(950),i=t.n(o),l=t(336),n=t.n(l),d=t(443),c=t.n(d),u=t(88),g=t.n(u),h=t(917),p=t.n(h),f=t(521),v=t.n(f),b=t(167),N=t.n(b),M=t(906),_=t.n(M);class A extends(i()){view(e){const s=this.attrs.dialog,t=s.recipient(),a=s.lastMessage();return m("li",{className:c()("DialogListItem",{"DialogListItem--unread":s.unreadCount(),active:this.attrs.active})},m(g(),{href:r().route.dialog(s),className:c()("DialogListItem-button",{active:this.attrs.active})},m("div",{className:"DialogListItem-avatar"},m(p(),{user:t}),!!s.unreadCount()&&m("div",{className:"Bubble Bubble--primary"},s.unreadCount())),m("div",{className:"DialogListItem-content"},m("div",{className:"DialogListItem-title"},v()(t),N()(s.lastMessageAt()),this.attrs.actions&&m("div",{className:"DialogListItem-actions"},this.actionItems().toArray())),m("div",{className:"DialogListItem-lastMessage"},a?a.contentPlain()?.slice(0,80):""))))}actionItems(){const e=new(_());return e.add("markAsRead",m(n(),{className:"Notification-action Button Button--link",icon:"fas fa-check","aria-label":r().translator.trans("flarum-messages.forum.dialog_list.mark_as_read_tooltip"),onclick:e=>{e.preventDefault(),e.stopPropagation(),this.attrs.dialog.save({lastReadMessageId:(this.attrs.dialog.data.relationships?.lastMessage.data).id}).finally((()=>{0===this.attrs.dialog.unreadCount()&&r().session.user.pushAttributes({messageCount:(r().session.user.attribute("messageCount")??1)-1}),m.redraw()}))}}),100),e}}flarum.reg.add("flarum-messages","forum/components/DialogListItem",A);class y extends(i()){oninit(e){super.oninit(e)}oncreate(e){super.oncreate(e)}onupdate(e){super.onupdate(e)}view(){return m("div",{className:"DialogList"},m("ul",{className:"DialogList-list"},this.attrs.state.getAllItems().map((e=>m(A,{dialog:e,active:this.attrs.activeDialog?.id()===e.id(),actions:this.attrs.itemActions})))),this.attrs.state.hasNext()&&!this.attrs.hideMore&&m("div",{className:"DialogList-loadMore"},m(n(),{className:"Button",onclick:this.attrs.state.loadNext.bind(this.attrs.state)},r().translator.trans("flarum-messages.forum.dialog_list.load_more_button"))))}}flarum.reg.add("flarum-messages","forum/components/DialogList",y)},654:(e,s,t)=>{t.r(s),t.d(s,{default:()=>me});var a=t(805),r=t(488),o=t.n(r),i=t(859),l=t.n(i),n=t(314),d=t.n(n),c=t(801),u=t.n(c),g=t(684),h=t(661),p=t.n(h),f=t(821),v=t.n(f),b=t(500),N=t.n(b),M=t(402),_=t.n(M),A=t(336),y=t.n(A);class I extends(_()){static initAttrs(e){e.className="MessagesPage-nav"}items(){const e=super.items(),s=o().session.user.attribute("canSendAnyMessage");return e.remove("newDiscussion"),e.add("newMessage",m(y(),{icon:"fas fa-edit",className:"Button Button--primary IndexPage-newDiscussion MessagesPage-newMessage",itemClassName:"App-primaryControl",onclick:()=>this.newMessageAction(),disabled:!s},o().translator.trans("flarum-messages.forum.messages_page.new_message_button")),10),e}newMessageAction(){return flarum.reg.asyncModuleImport("flarum/forum/components/ComposerBody").then((()=>(o().composer.load((()=>t.e(451).then(t.bind(t,761))),{user:o().session.user,onsubmit:()=>{o().dialogs.refresh()}}).then((()=>o().composer.show())),o().composer)))}}flarum.reg.add("flarum-messages","forum/components/MessagesSidebar",I),flarum.reg.addChunkModule("451","761","flarum-messages","forum/components/MessageComposer");var k=t(950),D=t.n(k),w=t(476),P=t.n(w),S=t(906),T=t.n(S),B=t(154),L=t.n(B),C=t(917),x=t.n(C),R=t(3),H=t.n(R),j=t(651),q=t.n(j),G=t(301),O=t.n(G),E=t(443),F=t.n(E);class V extends(L()){oninit(e){super.oninit(e)}user(){return this.attrs.message.user()}controls(){return[]}freshness(){return this.attrs.message.freshness}createdByStarter(){return!1}onbeforeupdate(e){return super.onbeforeupdate(e)}onupdate(e){super.onupdate(e)}elementAttrs(){const e=this.attrs.message,s=super.elementAttrs();return s.className=F()(s.className||null,"Message",{"Post--renderFailed":e.renderFailed(),revealContent:!1,editing:!1}),s}header(){return super.header()}content(){return super.content().concat([m(H(),{headerItems:this.headerItems(),cardVisible:!1,isEditing:!1,isHidden:!1,contentHtml:this.attrs.message.contentHtml(),user:this.attrs.message.user()})])}classes(e){return super.classes(e)}actionItems(){return super.actionItems()}footerItems(){return super.footerItems()}sideItems(){return super.sideItems()}avatar(){return this.attrs.message.user()?m(x(),{user:this.attrs.message.user()}):""}headerItems(){const e=new(T()),s=this.attrs.message;return e.add("user",m(q(),{post:s}),100),e.add("meta",m(O(),{post:s})),e}}flarum.reg.add("flarum-messages","forum/components/Message",V);class z extends(D()){constructor(){super(...arguments),(0,a.A)(this,"replyPlaceholderComponent",v()(null)),(0,a.A)(this,"loadingPostComponent",v()(null)),(0,a.A)(this,"scrollListener",void 0),(0,a.A)(this,"initialToBottomScroll",!1),(0,a.A)(this,"lastTime",null),(0,a.A)(this,"checkedRead",!1),(0,a.A)(this,"markingAsRead",!1)}oninit(e){super.oninit(e),Promise.all([flarum.reg.asyncModuleImport("flarum/forum/components/ReplyPlaceholder"),flarum.reg.asyncModuleImport("flarum/forum/components/LoadingPost")]).then((e=>{let[s,t]=e;this.replyPlaceholderComponent(s.default),this.loadingPostComponent(t.default)}))}oncreate(e){super.oncreate(e),this.scrollListener=new(P())(this.onscroll.bind(this),this.element),setTimeout((()=>{this.scrollListener.start(),this.element.addEventListener("scrollend",this.markAsRead.bind(this))}))}onupdate(e){super.onupdate(e),this.initialToBottomScroll||this.attrs.state.isLoading()||(this.scrollToBottom(),this.initialToBottomScroll=!0),this.initialToBottomScroll&&!this.checkedRead&&(this.markAsRead(),this.checkedRead=!0)}onremove(e){super.onremove(e),this.scrollListener.stop()}view(){return m("div",{className:"MessageStream"},this.attrs.state.isLoading()?m(p(),null):this.content())}content(){const e=[],s=this.attrs.state.getAllItems().sort(((e,s)=>e.createdAt().getTime()-s.createdAt().getTime())),a=this.replyPlaceholderComponent(),r=this.loadingPostComponent();return s[0].id()!==(this.attrs.dialog.data.relationships?.firstMessage.data).id&&(e.push(m("div",{className:"MessageStream-item",key:"loadPrevious"},m(y(),{onclick:()=>this.whileMaintainingScroll((()=>this.attrs.state.loadNext())),type:"button",className:"Button Button--block MessageStream-loadPrev"},o().translator.trans("flarum-messages.forum.messages_page.stream.load_previous_button")))),r&&e.push(m("div",{className:"MessageStream-item",key:"loading-prev"},m(r,null)))),s.forEach(((s,t)=>e.push(this.messageItem(s,t)))),a&&e.push(m("div",{className:"MessageStream-item",key:"reply"},m(a,{discussion:this.attrs.dialog,onclick:()=>{flarum.reg.asyncModuleImport("flarum/forum/components/ComposerBody").then((()=>{o().composer.load((()=>t.e(451).then(t.bind(t,761))),{user:o().session.user,replyingTo:this.attrs.dialog,onsubmit:()=>{this.attrs.state.refresh().then((()=>setTimeout((()=>this.scrollToBottom()),50)))}}).then((()=>o().composer.show()))}))},composingReply:()=>o().composer.composingMessageTo(this.attrs.dialog)}))),e}messageItem(e,s){return m("div",{className:"MessageStream-item",key:s,"data-id":e.id()},this.timeGap(e),m(V,{message:e}))}timeGap(e){if(e.id()===(this.attrs.dialog.data.relationships?.firstMessage.data).id)return this.lastTime=e.createdAt(),m("div",{class:"PostStream-timeGap"},m("span",null,o().translator.trans("flarum-messages.forum.messages_page.stream.start_of_the_conversation")));const s=this.lastTime,t=e.createdAt().getTime()-(s?.getTime()||0);return this.lastTime=e.createdAt(),s&&t>3456e5?m("div",{className:"PostStream-timeGap"},m("span",null,o().translator.trans("flarum-messages.forum.messages_page.stream.time_lapsed_text",{period:dayjs().add(t,"ms").fromNow(!0)}))):null}onscroll(){this.whileMaintainingScroll((()=>this.element.scrollTop<=80&&this.attrs.state.hasNext()?this.attrs.state.loadNext():this.element.scrollTop+this.element.clientHeight===this.element.scrollHeight&&this.attrs.state.hasPrev()?this.attrs.state.loadPrev():null))}scrollToBottom(){this.element.scrollTop=this.element.scrollHeight}whileMaintainingScroll(e){const s=this.element.scrollTop,t=this.element.scrollHeight,a=e();a instanceof Promise&&a.then((()=>{requestAnimationFrame((()=>{this.element.scrollTop=this.element.scrollHeight-t+s}))}))}markAsRead(){const e=Number(this.$(".MessageStream-item[data-id]").filter(((e,s)=>this.element.scrollHeight<=this.element.clientHeight||this.$().offset().top+this.element.clientHeight>$(s).offset().top)).last().data("id"));e&&o().session.user&&e>(this.attrs.dialog.lastReadMessageId()||0)&&!this.markingAsRead&&(this.markingAsRead=!0,this.attrs.dialog.save({lastReadMessageId:e}).finally((()=>{this.markingAsRead=!1,0===this.attrs.dialog.unreadCount()&&o().session.user.pushAttributes({messageCount:(o().session.user.attribute("messageCount")??1)-1}),m.redraw()})))}}flarum.reg.add("flarum-messages","forum/components/MessageStream",z);var J=t(521),K=t.n(J),Q=t(662),U=t.n(Q);class W extends(U()){constructor(e,s){void 0===s&&(s=1),super(e,s,null)}get type(){return"dialog-messages"}getAllItems(){return super.getAllItems()}}flarum.reg.add("flarum-messages","forum/states/MessageStreamState",W);var X=t(88),Y=t.n(X),Z=t(741),ee=t.n(Z),se=t(533),te=t.n(se),ae=t(653),re=t.n(ae),oe=t(819),ie=t.n(oe);class le extends(te()){className(){return"Modal--small Modal--flat DetailsModal"}title(){return o().translator.trans("flarum-messages.forum.dialog_section.details_modal.title")}content(){let e=(this.attrs.dialog.users()||[]).filter(Boolean);return m("div",{className:"Modal-body DetailsModal-infoGroups"},m("div",{className:"DetailsModal-recipients DetailsModal-info"},m("div",{className:"DetailsModal-info-title"},o().translator.trans("flarum-messages.forum.dialog_section.details_modal.recipients")),m("div",{className:"DetailsModal-recipients-list"},e?.map((e=>m("div",{className:"DetailsModal-recipient"},m(x(),{user:e}),m(Y(),{href:o().route("user",{username:e.slug()})},m("span",{className:"DetailsModal-recipient-username"},K()(e))),m("div",{className:"badges"},ie()(e.badges().toArray()))))))),this.infoItems().toArray())}infoItems(){const e=new(T());return e.add("created",m("div",{className:"DetailsModal-createdAt DetailsModal-info"},m("div",{className:"DetailsModal-info-title"},o().translator.trans("flarum-messages.forum.dialog_section.details_modal.created_at")),m("div",{className:"DetailsModal-info-content"},re()(this.attrs.dialog.createdAt())))),e}}flarum.reg.add("flarum-messages","forum/components/DetailsModal",le);class ne extends(D()){constructor(){super(...arguments),(0,a.A)(this,"loading",!1),(0,a.A)(this,"messages",void 0)}oninit(e){super.oninit(e),this.messages=new W({filter:{dialog:this.attrs.dialog.id()},sort:"-createdAt"}),this.messages.refresh()}view(){const e=this.attrs.dialog.recipient();return m("div",{className:"DialogSection"},m("div",{className:"DialogSection-header"},m(x(),{user:e}),m("div",{className:"DialogSection-header-info"},e&&m(Y(),{href:o().route.user(e)},m("h2",null,K()(e)))||m("h2",null,K()(e)),m("div",{className:"badges"},ie()(e?.badges().toArray()||[]))),m("div",{className:"DialogSection-header-actions"},this.actionItems().toArray())),m(z,{dialog:this.attrs.dialog,state:this.messages}))}actionItems(){const e=new(T());return e.add("details",m(ee(),{icon:"fas fa-ellipsis-h",className:"DialogSection-controls",buttonClassName:"Button Button--icon",accessibleToggleLabel:o().translator.trans("flarum-messages.forum.dialog_section.controls_toggle_label"),label:o().translator.trans("flarum-messages.forum.dialog_section.controls_toggle_label")},this.controlItems().toArray())),e}controlItems(){const e=new(T());return e.add("details",m(y(),{icon:"fas fa-info-circle",onclick:()=>o().modal.show(le,{dialog:this.attrs.dialog})},o().translator.trans("flarum-messages.forum.dialog_section.controls.details_button"))),e}}flarum.reg.add("flarum-messages","forum/components/DialogSection",ne);class me extends(l()){constructor(){super(...arguments),(0,a.A)(this,"selectedDialog",v()(null))}oninit(e){super.oninit(e),o().session.user?(o().current.set("noTagsList",!0),o().dialogs.hasItems()?this.initDialog():o().dialogs.refresh().then((async()=>{o().dialogs.hasItems()&&await this.initDialog()}))):m.route.set(o().route("index"))}dialogRequestParams(){return{include:"users.groups"}}async initDialog(){const e=m.route.param("id"),s=o().translator.trans("flarum-messages.forum.messages_page.title",{},!0);let t;t=e?o().store.getById("dialogs",e)||await o().store.find("dialogs",e,this.dialogRequestParams()):o().dialogs.getAllItems()[0],this.selectedDialog(t),t?(o().setTitle(t.title()),o().history.push("dialog",t.title())):(o().setTitle(s),o().history.push("messages",s)),m.redraw()}onupdate(e){super.onupdate(e);const s=this.element.querySelector(".DialogListItem.active"),t=this.element.querySelector(".DialogList");s&&$(t).offset().top+t.clientHeight<=$(s).offset().top&&s.scrollIntoView()}view(){return m(d(),{className:"MessagesPage Page--vertical",loading:!1,hero:this.hero.bind(this),sidebar:()=>m(I,null)},o().dialogs.isLoading()?m(p(),null):o().dialogs.hasItems()?m("div",{className:"MessagesPage-content"},m("div",{className:"MessagesPage-sidebar",key:"sidebar"},m("div",{className:"IndexPage-toolbar",key:"toolbar"},m("ul",{className:"IndexPage-toolbar-view"},ie()(this.viewItems().toArray())),m("ul",{className:"IndexPage-toolbar-action"},ie()(this.actionItems().toArray()))),m(g.A,{key:"list",state:o().dialogs,activeDialog:this.selectedDialog()})),this.selectedDialog()?m(ne,{key:"dialog",dialog:this.selectedDialog()}):m(p(),{key:"loading",display:"block"})):m(N(),{icon:"far fa-envelope-open"},o().translator.trans("flarum-messages.forum.messages_page.empty_text")))}hero(){return m("header",{className:"Hero MessagesPageHero"},m("div",{className:"container"},m("div",{className:"containerNarrow"},m("h1",{className:"Hero-title"},m(u(),{name:"fas fa-envelope"})," ",o().translator.trans("flarum-messages.forum.messages_page.hero.title")),m("div",{className:"Hero-subtitle"},o().translator.trans("flarum-messages.forum.messages_page.hero.subtitle")))))}viewItems(){const e=new(T()),s=o().dialogs.sortMap(),t=Object.keys(s).reduce(((e,t)=>{const a=s[t];return e[t]="string"!=typeof a?a.label:o().translator.trans(`flarum-messages.forum.index_sort.${t}_button`),e}),{});return e.add("sort",m(ee(),{buttonClassName:"Button",label:t[o().dialogs.getParams()?.sort||0]||Object.values(t)[0],accessibleToggleLabel:o().translator.trans("core.forum.index_sort.toggle_dropdown_accessible_label")},Object.keys(t).map((e=>{const a=t[e],r=(o().dialogs.getParams().sort||Object.keys(s)[0])===e;return m(y(),{icon:!r||"fas fa-check",onclick:()=>o().dialogs.changeSort(e),active:r},a)})))),e}actionItems(){const e=new(T());return e.add("refresh",m(y(),{title:o().translator.trans("flarum-messages.forum.messages_page.refresh_tooltip"),"aria-label":o().translator.trans("flarum-messages.forum.messages_page.refresh_tooltip"),icon:"fas fa-sync",className:"Button Button--icon",onclick:()=>{o().dialogs.refresh()}})),o().session.user&&e.add("markAllAsRead",m(y(),{title:o().translator.trans("flarum-messages.forum.messages_page.mark_all_as_read_tooltip"),"aria-label":o().translator.trans("flarum-messages.forum.messages_page.mark_all_as_read_tooltip"),icon:"fas fa-check",className:"Button Button--icon",onclick:()=>o().dialogs.markAllAsRead()})),e}}flarum.reg.add("flarum-messages","forum/components/MessagesPage",me)}}]); //# sourceMappingURL=MessagesPage.js.map \ No newline at end of file diff --git a/extensions/messages/js/dist/forum/components/MessagesPage.js.map b/extensions/messages/js/dist/forum/components/MessagesPage.js.map index d5f129225..1323800b0 100644 --- a/extensions/messages/js/dist/forum/components/MessagesPage.js.map +++ b/extensions/messages/js/dist/forum/components/MessagesPage.js.map @@ -1 +1 @@ -{"version":3,"file":"forum/components/MessagesPage.js","mappings":"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","sources":["webpack://@flarum/messages/./src/forum/components/DialogListItem.tsx","webpack://@flarum/messages/./src/forum/components/DialogList.tsx","webpack://@flarum/messages/./src/forum/components/MessagesSidebar.tsx","webpack://@flarum/messages/./src/forum/components/Message.tsx","webpack://@flarum/messages/./src/forum/components/MessageStream.tsx","webpack://@flarum/messages/./src/forum/states/MessageStreamState.ts","webpack://@flarum/messages/./src/forum/components/DetailsModal.tsx","webpack://@flarum/messages/./src/forum/components/DialogSection.tsx","webpack://@flarum/messages/./src/forum/components/MessagesPage.tsx"],"sourcesContent":["import Component from 'flarum/common/Component';\nimport classList from 'flarum/common/utils/classList';\nimport Link from 'flarum/common/components/Link';\nimport app from 'flarum/forum/app';\nimport Avatar from 'flarum/common/components/Avatar';\nimport username from 'flarum/common/helpers/username';\nimport humanTime from 'flarum/common/helpers/humanTime';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport Button from 'flarum/common/components/Button';\nexport default class DialogListItem extends Component {\n view(vnode) {\n const dialog = this.attrs.dialog;\n const recipient = dialog.recipient();\n const lastMessage = dialog.lastMessage();\n return m(\"li\", {\n className: classList('DialogListItem', {\n 'DialogListItem--unread': dialog.unreadCount(),\n active: this.attrs.active\n })\n }, m(Link, {\n href: app.route.dialog(dialog),\n className: classList('DialogListItem-button', {\n active: this.attrs.active\n })\n }, m(\"div\", {\n className: \"DialogListItem-avatar\"\n }, m(Avatar, {\n user: recipient\n }), !!dialog.unreadCount() && m(\"div\", {\n className: \"Bubble Bubble--primary\"\n }, dialog.unreadCount())), m(\"div\", {\n className: \"DialogListItem-content\"\n }, m(\"div\", {\n className: \"DialogListItem-title\"\n }, username(recipient), humanTime(dialog.lastMessageAt()), this.attrs.actions && m(\"div\", {\n className: \"DialogListItem-actions\"\n }, this.actionItems().toArray())), m(\"div\", {\n className: \"DialogListItem-lastMessage\"\n }, lastMessage ? lastMessage.contentPlain()?.slice(0, 80) : ''))));\n }\n actionItems() {\n const items = new ItemList();\n items.add('markAsRead', m(Button, {\n className: \"Notification-action Button Button--link\",\n icon: \"fas fa-check\",\n \"aria-label\": app.translator.trans('flarum-messages.forum.dialog_list.mark_as_read_tooltip'),\n onclick: e => {\n e.preventDefault();\n e.stopPropagation();\n this.attrs.dialog.save({\n lastReadMessageId: (this.attrs.dialog.data.relationships?.lastMessage.data).id\n }).finally(() => {\n if (this.attrs.dialog.unreadCount() === 0) {\n app.session.user.pushAttributes({\n messageCount: (app.session.user.attribute('messageCount') ?? 1) - 1\n });\n }\n m.redraw();\n });\n }\n }), 100);\n return items;\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/DialogListItem', DialogListItem);","import app from 'flarum/forum/app';\nimport Component from 'flarum/common/Component';\nimport Button from 'flarum/common/components/Button';\nimport DialogListItem from './DialogListItem';\nexport default class DialogList extends Component {\n oninit(vnode) {\n super.oninit(vnode);\n }\n oncreate(vnode) {\n super.oncreate(vnode);\n }\n onupdate(vnode) {\n super.onupdate(vnode);\n }\n view() {\n return m(\"div\", {\n className: \"DialogList\"\n }, m(\"ul\", {\n className: \"DialogList-list\"\n }, this.attrs.state.getAllItems().map(dialog => m(DialogListItem, {\n dialog: dialog,\n active: this.attrs.activeDialog?.id() === dialog.id(),\n actions: this.attrs.itemActions\n }))), this.attrs.state.hasNext() && !this.attrs.hideMore && m(\"div\", {\n className: \"DialogList-loadMore\"\n }, m(Button, {\n className: \"Button\",\n onclick: this.attrs.state.loadNext.bind(this.attrs.state)\n }, app.translator.trans('flarum-messages.forum.dialog_list.load_more_button'))));\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/DialogList', DialogList);","import app from 'flarum/forum/app';\nimport IndexSidebar from 'flarum/forum/components/IndexSidebar';\nimport Button from 'flarum/common/components/Button';\nexport default class MessagesSidebar extends IndexSidebar {\n static initAttrs(attrs) {\n attrs.className = 'MessagesPage-nav';\n }\n items() {\n const items = super.items();\n const canSendAnyMessage = app.session.user.attribute('canSendAnyMessage');\n items.remove('newDiscussion');\n items.add('newMessage', m(Button, {\n icon: \"fas fa-edit\",\n className: \"Button Button--primary IndexPage-newDiscussion MessagesPage-newMessage\",\n itemClassName: \"App-primaryControl\",\n onclick: () => {\n return this.newMessageAction();\n },\n disabled: !canSendAnyMessage\n }, app.translator.trans('flarum-messages.forum.messages_page.new_message_button')), 10);\n return items;\n }\n\n /**\n * Open the composer for a new message.\n */\n newMessageAction() {\n return flarum.reg.asyncModuleImport('flarum/forum/components/ComposerBody').then(() => {\n app.composer.load(() => import(/* webpackChunkName: 'forum/components/MessageComposer', webpackMode: 'lazy-once' */ './MessageComposer'), {\n user: app.session.user,\n onsubmit: () => {\n app.dialogs.refresh();\n }\n }).then(() => app.composer.show());\n return app.composer;\n });\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/MessagesSidebar', MessagesSidebar);","import ItemList from 'flarum/common/utils/ItemList';\nimport AbstractPost from 'flarum/forum/components/AbstractPost';\nimport Avatar from 'flarum/common/components/Avatar';\nimport Comment from 'flarum/forum/components/Comment';\nimport PostUser from 'flarum/forum/components/PostUser';\nimport PostMeta from 'flarum/forum/components/PostMeta';\nimport classList from 'flarum/common/utils/classList';\n/**\n * The `Post` component displays a single post. The basic post template just\n * includes a controls dropdown; subclasses must implement `content` and `attrs`\n * methods.\n */\nexport default class Message extends AbstractPost {\n oninit(vnode) {\n super.oninit(vnode);\n }\n user() {\n return this.attrs.message.user();\n }\n controls() {\n return [];\n }\n freshness() {\n return this.attrs.message.freshness;\n }\n createdByStarter() {\n return false;\n }\n onbeforeupdate(vnode) {\n return super.onbeforeupdate(vnode);\n }\n onupdate(vnode) {\n super.onupdate(vnode);\n }\n elementAttrs() {\n const message = this.attrs.message;\n const attrs = super.elementAttrs();\n attrs.className = classList(attrs.className || null, 'Message', {\n 'Post--renderFailed': message.renderFailed(),\n revealContent: false,\n editing: false\n });\n return attrs;\n }\n header() {\n return super.header();\n }\n content() {\n return super.content().concat([m(Comment, {\n headerItems: this.headerItems(),\n cardVisible: false,\n isEditing: false,\n isHidden: false,\n contentHtml: this.attrs.message.contentHtml(),\n user: this.attrs.message.user()\n })]);\n }\n classes(existing) {\n return super.classes(existing);\n }\n actionItems() {\n return super.actionItems();\n }\n footerItems() {\n return super.footerItems();\n }\n sideItems() {\n return super.sideItems();\n }\n avatar() {\n return this.attrs.message.user() ? m(Avatar, {\n user: this.attrs.message.user()\n }) : '';\n }\n headerItems() {\n const items = new ItemList();\n const message = this.attrs.message;\n items.add('user', m(PostUser, {\n post: message\n }), 100);\n items.add('meta', m(PostMeta, {\n post: message\n }));\n return items;\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/Message', Message);","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport app from 'flarum/forum/app';\nimport Component from 'flarum/common/Component';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\nimport Stream from 'flarum/common/utils/Stream';\nimport Button from 'flarum/common/components/Button';\nimport ScrollListener from 'flarum/common/utils/ScrollListener';\nimport Message from './Message';\nexport default class MessageStream extends Component {\n constructor() {\n super(...arguments);\n _defineProperty(this, \"replyPlaceholderComponent\", Stream(null));\n _defineProperty(this, \"loadingPostComponent\", Stream(null));\n _defineProperty(this, \"scrollListener\", void 0);\n _defineProperty(this, \"initialToBottomScroll\", false);\n _defineProperty(this, \"lastTime\", null);\n _defineProperty(this, \"checkedRead\", false);\n _defineProperty(this, \"markingAsRead\", false);\n }\n oninit(vnode) {\n super.oninit(vnode);\n\n // We need the lazy ReplyPlaceholder and LoadingPost components to be loaded.\n Promise.all([flarum.reg.asyncModuleImport('flarum/forum/components/ReplyPlaceholder'), flarum.reg.asyncModuleImport('flarum/forum/components/LoadingPost')]).then(_ref => {\n let [ReplyPlaceholder, LoadingPost] = _ref;\n this.replyPlaceholderComponent(ReplyPlaceholder.default);\n this.loadingPostComponent(LoadingPost.default);\n });\n }\n oncreate(vnode) {\n super.oncreate(vnode);\n this.scrollListener = new ScrollListener(this.onscroll.bind(this), this.element);\n setTimeout(() => {\n this.scrollListener.start();\n this.element.addEventListener('scrollend', this.markAsRead.bind(this));\n });\n }\n onupdate(vnode) {\n super.onupdate(vnode);\n\n // @todo: for future versions, consider using the post stream scrubber to scroll through the messages. (big task..)\n // @todo: introduce read status, to jump to the first unread message instead.\n if (!this.initialToBottomScroll && !this.attrs.state.isLoading()) {\n this.scrollToBottom();\n this.initialToBottomScroll = true;\n }\n if (this.initialToBottomScroll && !this.checkedRead) {\n this.markAsRead();\n this.checkedRead = true;\n }\n }\n onremove(vnode) {\n super.onremove(vnode);\n this.scrollListener.stop();\n }\n view() {\n return m(\"div\", {\n className: \"MessageStream\"\n }, this.attrs.state.isLoading() ? m(LoadingIndicator, null) : this.content());\n }\n content() {\n const items = [];\n const messages = this.attrs.state.getAllItems().sort((a, b) => a.createdAt().getTime() - b.createdAt().getTime());\n const ReplyPlaceholder = this.replyPlaceholderComponent();\n const LoadingPost = this.loadingPostComponent();\n if (messages[0].id() !== (this.attrs.dialog.data.relationships?.firstMessage.data).id) {\n items.push(m(\"div\", {\n className: \"MessageStream-item\",\n key: \"loadPrevious\"\n }, m(Button, {\n onclick: () => this.whileMaintainingScroll(() => this.attrs.state.loadNext()),\n type: \"button\",\n className: \"Button Button--block MessageStream-loadPrev\"\n }, app.translator.trans('flarum-messages.forum.messages_page.stream.load_previous_button'))));\n if (LoadingPost) {\n items.push(m(\"div\", {\n className: \"MessageStream-item\",\n key: \"loading-prev\"\n }, m(LoadingPost, null)));\n }\n }\n messages.forEach((message, index) => items.push(this.messageItem(message, index)));\n if (ReplyPlaceholder) {\n items.push(m(\"div\", {\n className: \"MessageStream-item\",\n key: \"reply\" /*data-index={this.attrs.state.count()}*/\n }, m(ReplyPlaceholder, {\n discussion: this.attrs.dialog,\n onclick: () => {\n flarum.reg.asyncModuleImport('flarum/forum/components/ComposerBody').then(() => {\n app.composer.load(() => import(/* webpackChunkName: 'forum/components/MessageComposer', webpackMode: 'lazy-once' */ './MessageComposer'), {\n user: app.session.user,\n replyingTo: this.attrs.dialog,\n onsubmit: () => {\n this.attrs.state.refresh().then(() => setTimeout(() => this.scrollToBottom(), 50));\n }\n }).then(() => app.composer.show());\n });\n },\n composingReply: () => app.composer.composingMessageTo(this.attrs.dialog)\n })));\n }\n return items;\n }\n messageItem(message, index) {\n return m(\"div\", {\n className: \"MessageStream-item\",\n key: index,\n \"data-id\": message.id()\n }, this.timeGap(message), m(Message, {\n message: message\n }));\n }\n timeGap(message) {\n if (message.id() === (this.attrs.dialog.data.relationships?.firstMessage.data).id) {\n this.lastTime = message.createdAt();\n return m(\"div\", {\n class: \"PostStream-timeGap\"\n }, m(\"span\", null, app.translator.trans('flarum-messages.forum.messages_page.stream.start_of_the_conversation')));\n }\n const lastTime = this.lastTime;\n const dt = message.createdAt().getTime() - (lastTime?.getTime() || 0);\n this.lastTime = message.createdAt();\n if (lastTime && dt > 1000 * 60 * 60 * 24 * 4) {\n return m(\"div\", {\n className: \"PostStream-timeGap\"\n }, m(\"span\", null, app.translator.trans('flarum-messages.forum.messages_page.stream.time_lapsed_text', {\n period: dayjs().add(dt, 'ms').fromNow(true)\n })));\n }\n return null;\n }\n onscroll() {\n this.whileMaintainingScroll(() => {\n if (this.element.scrollTop <= 80 && this.attrs.state.hasNext()) {\n return this.attrs.state.loadNext();\n }\n if (this.element.scrollTop + this.element.clientHeight === this.element.scrollHeight && this.attrs.state.hasPrev()) {\n return this.attrs.state.loadPrev();\n }\n return null;\n });\n }\n scrollToBottom() {\n this.element.scrollTop = this.element.scrollHeight;\n }\n whileMaintainingScroll(callback) {\n const scrollTop = this.element.scrollTop;\n const scrollHeight = this.element.scrollHeight;\n const result = callback();\n if (result instanceof Promise) {\n result.then(() => {\n requestAnimationFrame(() => {\n this.element.scrollTop = this.element.scrollHeight - scrollHeight + scrollTop;\n });\n });\n }\n }\n markAsRead() {\n const lastVisibleId = Number(this.$('.MessageStream-item[data-id]').filter((_, $el) => {\n if (this.element.scrollHeight <= this.element.clientHeight) {\n return true;\n }\n return this.$().offset().top + this.element.clientHeight > $($el).offset().top;\n }).last().data('id'));\n if (lastVisibleId && app.session.user && lastVisibleId > (this.attrs.dialog.lastReadMessageId() || 0) && !this.markingAsRead) {\n this.markingAsRead = true;\n this.attrs.dialog.save({\n lastReadMessageId: lastVisibleId\n }).finally(() => {\n this.markingAsRead = false;\n if (this.attrs.dialog.unreadCount() === 0) {\n app.session.user.pushAttributes({\n messageCount: (app.session.user.attribute('messageCount') ?? 1) - 1\n });\n }\n m.redraw();\n });\n }\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/MessageStream', MessageStream);","import PaginatedListState from 'flarum/common/states/PaginatedListState';\nexport default class MessageStreamState extends PaginatedListState {\n constructor(params, page) {\n if (page === void 0) {\n page = 1;\n }\n super(params, page, null);\n }\n get type() {\n return 'dialog-messages';\n }\n getAllItems() {\n return super.getAllItems();\n }\n}\nflarum.reg.add('flarum-messages', 'forum/states/MessageStreamState', MessageStreamState);","import app from 'flarum/forum/app';\nimport Modal from 'flarum/common/components/Modal';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport Avatar from 'flarum/common/components/Avatar';\nimport fullTime from 'flarum/common/helpers/fullTime';\nimport username from 'flarum/common/helpers/username';\nimport Link from 'flarum/common/components/Link';\nimport listItems from 'flarum/common/helpers/listItems';\nexport default class DetailsModal extends Modal {\n className() {\n return 'Modal--small Modal--flat DetailsModal';\n }\n title() {\n return app.translator.trans('flarum-messages.forum.dialog_section.details_modal.title');\n }\n content() {\n let recipients = (this.attrs.dialog.users() || []).filter(Boolean);\n return m(\"div\", {\n className: \"Modal-body DetailsModal-infoGroups\"\n }, m(\"div\", {\n className: \"DetailsModal-recipients DetailsModal-info\"\n }, m(\"div\", {\n className: \"DetailsModal-info-title\"\n }, app.translator.trans('flarum-messages.forum.dialog_section.details_modal.recipients')), m(\"div\", {\n className: \"DetailsModal-recipients-list\"\n }, recipients?.map(recipient => {\n return m(\"div\", {\n className: \"DetailsModal-recipient\"\n }, m(Avatar, {\n user: recipient\n }), m(Link, {\n href: app.route('user', {\n username: recipient.slug()\n })\n }, m(\"span\", {\n className: \"DetailsModal-recipient-username\"\n }, username(recipient))), m(\"div\", {\n className: \"badges\"\n }, listItems(recipient.badges().toArray())));\n }))), this.infoItems().toArray());\n }\n infoItems() {\n const items = new ItemList();\n items.add('created', m(\"div\", {\n className: \"DetailsModal-createdAt DetailsModal-info\"\n }, m(\"div\", {\n className: \"DetailsModal-info-title\"\n }, app.translator.trans('flarum-messages.forum.dialog_section.details_modal.created_at')), m(\"div\", {\n className: \"DetailsModal-info-content\"\n }, fullTime(this.attrs.dialog.createdAt()))));\n return items;\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/DetailsModal', DetailsModal);","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport Component from 'flarum/common/Component';\nimport MessageStream from './MessageStream';\nimport username from 'flarum/common/helpers/username';\nimport MessageStreamState from '../states/MessageStreamState';\nimport Avatar from 'flarum/common/components/Avatar';\nimport Link from 'flarum/common/components/Link';\nimport app from 'flarum/forum/app';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport Button from 'flarum/common/components/Button';\nimport Dropdown from 'flarum/common/components/Dropdown';\nimport DetailsModal from './DetailsModal';\nimport listItems from 'flarum/common/helpers/listItems';\nexport default class DialogSection extends Component {\n constructor() {\n super(...arguments);\n _defineProperty(this, \"loading\", false);\n _defineProperty(this, \"messages\", void 0);\n }\n oninit(vnode) {\n super.oninit(vnode);\n this.messages = new MessageStreamState({\n filter: {\n dialog: this.attrs.dialog.id()\n },\n sort: '-createdAt'\n });\n this.messages.refresh();\n }\n view() {\n const recipient = this.attrs.dialog.recipient();\n return m(\"div\", {\n className: \"DialogSection\"\n }, m(\"div\", {\n className: \"DialogSection-header\"\n }, m(Avatar, {\n user: recipient\n }), m(\"div\", {\n className: \"DialogSection-header-info\"\n }, recipient && m(Link, {\n href: app.route.user(recipient)\n }, m(\"h2\", null, username(recipient))) || m(\"h2\", null, username(recipient)), m(\"div\", {\n className: \"badges\"\n }, listItems(recipient?.badges().toArray() || []))), m(\"div\", {\n className: \"DialogSection-header-actions\"\n }, this.actionItems().toArray())), m(MessageStream, {\n dialog: this.attrs.dialog,\n state: this.messages\n }));\n }\n actionItems() {\n const items = new ItemList();\n items.add('details', m(Dropdown, {\n icon: \"fas fa-ellipsis-h\",\n className: \"DialogSection-controls\",\n buttonClassName: \"Button Button--icon\",\n accessibleToggleLabel: app.translator.trans('flarum-messages.forum.dialog_section.controls_toggle_label'),\n label: app.translator.trans('flarum-messages.forum.dialog_section.controls_toggle_label')\n }, this.controlItems().toArray()));\n return items;\n }\n controlItems() {\n const items = new ItemList();\n items.add('details', m(Button, {\n icon: \"fas fa-info-circle\",\n onclick: () => app.modal.show(DetailsModal, {\n dialog: this.attrs.dialog\n })\n }, app.translator.trans('flarum-messages.forum.dialog_section.controls.details_button')));\n return items;\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/DialogSection', DialogSection);","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport app from 'flarum/forum/app';\nimport Page from 'flarum/common/components/Page';\nimport PageStructure from 'flarum/forum/components/PageStructure';\nimport Icon from 'flarum/common/components/Icon';\nimport DialogList from './DialogList';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\nimport Stream from 'flarum/common/utils/Stream';\nimport InfoTile from 'flarum/common/components/InfoTile';\nimport MessagesSidebar from './MessagesSidebar';\nimport DialogSection from './DialogSection';\nimport listItems from 'flarum/common/helpers/listItems';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport Dropdown from 'flarum/common/components/Dropdown';\nimport Button from 'flarum/common/components/Button';\nexport default class MessagesPage extends Page {\n constructor() {\n super(...arguments);\n _defineProperty(this, \"selectedDialog\", Stream(null));\n }\n oninit(vnode) {\n super.oninit(vnode);\n if (!app.session.user) {\n m.route.set(app.route('index'));\n return;\n }\n app.current.set('noTagsList', true);\n if (!app.dialogs.hasItems()) {\n app.dialogs.refresh().then(async () => {\n if (app.dialogs.hasItems()) {\n await this.initDialog();\n }\n });\n } else {\n this.initDialog();\n }\n }\n dialogRequestParams() {\n return {\n include: 'users.groups'\n };\n }\n async initDialog() {\n const dialogId = m.route.param('id');\n const title = app.translator.trans('flarum-messages.forum.messages_page.title', {}, true);\n let dialog;\n if (dialogId) {\n dialog = app.store.getById('dialogs', dialogId) || (await app.store.find('dialogs', dialogId, this.dialogRequestParams()));\n } else {\n dialog = app.dialogs.getAllItems()[0];\n }\n this.selectedDialog(dialog);\n if (dialog) {\n app.setTitle(dialog.title());\n app.history.push('dialog', dialog.title());\n } else {\n app.setTitle(title);\n app.history.push('messages', title);\n }\n m.redraw();\n }\n onupdate(vnode) {\n super.onupdate(vnode);\n\n // Scroll the dialog list to the active dialog item if present and not visible.\n const dialogElement = this.element.querySelector('.DialogListItem.active');\n const container = this.element.querySelector('.DialogList');\n if (dialogElement && $(container).offset().top + container.clientHeight <= $(dialogElement).offset().top) {\n dialogElement.scrollIntoView();\n }\n }\n view() {\n return m(PageStructure, {\n className: \"MessagesPage Page--vertical\",\n loading: false,\n hero: this.hero.bind(this),\n sidebar: () => m(MessagesSidebar, null)\n }, app.dialogs.isLoading() ? m(LoadingIndicator, null) : !app.dialogs.hasItems() ? m(InfoTile, {\n icon: \"far fa-envelope-open\"\n }, app.translator.trans('flarum-messages.forum.messages_page.empty_text')) : m(\"div\", {\n className: \"MessagesPage-content\"\n }, m(\"div\", {\n className: \"MessagesPage-sidebar\",\n key: \"sidebar\"\n }, m(\"div\", {\n className: \"IndexPage-toolbar\",\n key: \"toolbar\"\n }, m(\"ul\", {\n className: \"IndexPage-toolbar-view\"\n }, listItems(this.viewItems().toArray())), m(\"ul\", {\n className: \"IndexPage-toolbar-action\"\n }, listItems(this.actionItems().toArray()))), m(DialogList, {\n key: \"list\",\n state: app.dialogs,\n activeDialog: this.selectedDialog()\n })), this.selectedDialog() ? m(DialogSection, {\n key: \"dialog\",\n dialog: this.selectedDialog()\n }) : m(LoadingIndicator, {\n key: \"loading\",\n display: \"block\"\n })));\n }\n hero() {\n return m(\"header\", {\n className: \"Hero MessagesPageHero\"\n }, m(\"div\", {\n className: \"container\"\n }, m(\"div\", {\n className: \"containerNarrow\"\n }, m(\"h1\", {\n className: \"Hero-title\"\n }, m(Icon, {\n name: \"fas fa-envelope\"\n }), \" \", app.translator.trans('flarum-messages.forum.messages_page.hero.title')), m(\"div\", {\n className: \"Hero-subtitle\"\n }, app.translator.trans('flarum-messages.forum.messages_page.hero.subtitle')))));\n }\n\n /**\n * Build an item list for the part of the toolbar which is concerned with how\n * the results are displayed. By default this is just a select box to change\n * the way discussions are sorted.\n */\n viewItems() {\n const items = new ItemList();\n const sortMap = app.dialogs.sortMap();\n const sortOptions = Object.keys(sortMap).reduce((acc, sortId) => {\n const sort = sortMap[sortId];\n acc[sortId] = typeof sort !== 'string' ? sort.label : app.translator.trans(`flarum-messages.forum.index_sort.${sortId}_button`);\n return acc;\n }, {});\n items.add('sort', m(Dropdown, {\n buttonClassName: \"Button\",\n label: sortOptions[app.dialogs.getParams()?.sort || 0] || Object.values(sortOptions)[0],\n accessibleToggleLabel: app.translator.trans('core.forum.index_sort.toggle_dropdown_accessible_label')\n }, Object.keys(sortOptions).map(value => {\n const label = sortOptions[value];\n const active = (app.dialogs.getParams().sort || Object.keys(sortMap)[0]) === value;\n return m(Button, {\n icon: active ? 'fas fa-check' : true,\n onclick: () => app.dialogs.changeSort(value),\n active: active\n }, label);\n })));\n return items;\n }\n\n /**\n * Build an item list for the part of the toolbar which is about taking action\n * on the results. By default this is just a \"mark all as read\" button.\n */\n actionItems() {\n const items = new ItemList();\n items.add('refresh', m(Button, {\n title: app.translator.trans('flarum-messages.forum.messages_page.refresh_tooltip'),\n \"aria-label\": app.translator.trans('flarum-messages.forum.messages_page.refresh_tooltip'),\n icon: \"fas fa-sync\",\n className: \"Button Button--icon\",\n onclick: () => {\n app.dialogs.refresh();\n }\n }));\n if (app.session.user) {\n items.add('markAllAsRead', m(Button, {\n title: app.translator.trans('flarum-messages.forum.messages_page.mark_all_as_read_tooltip'),\n \"aria-label\": app.translator.trans('flarum-messages.forum.messages_page.mark_all_as_read_tooltip'),\n icon: \"fas fa-check\",\n className: \"Button Button--icon\",\n onclick: () => app.dialogs.markAllAsRead()\n }));\n }\n return items;\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/MessagesPage', MessagesPage);"],"names":["DialogListItem","view","vnode","dialog","this","attrs","recipient","lastMessage","m","className","unreadCount","active","href","user","lastMessageAt","actions","actionItems","toArray","contentPlain","slice","items","add","icon","trans","onclick","e","preventDefault","stopPropagation","save","lastReadMessageId","data","relationships","id","finally","pushAttributes","messageCount","attribute","redraw","flarum","reg","DialogList","oninit","super","oncreate","onupdate","state","getAllItems","map","activeDialog","itemActions","hasNext","hideMore","loadNext","bind","MessagesSidebar","initAttrs","canSendAnyMessage","remove","itemClassName","newMessageAction","disabled","asyncModuleImport","then","load","onsubmit","refresh","show","Message","message","controls","freshness","createdByStarter","onbeforeupdate","elementAttrs","renderFailed","revealContent","editing","header","content","concat","headerItems","cardVisible","isEditing","isHidden","contentHtml","classes","existing","footerItems","sideItems","avatar","post","MessageStream","constructor","arguments","Promise","all","_ref","ReplyPlaceholder","LoadingPost","replyPlaceholderComponent","default","loadingPostComponent","scrollListener","onscroll","element","setTimeout","start","addEventListener","markAsRead","initialToBottomScroll","isLoading","scrollToBottom","checkedRead","onremove","stop","messages","sort","a","b","createdAt","getTime","firstMessage","push","key","whileMaintainingScroll","type","forEach","index","messageItem","discussion","replyingTo","composingReply","composingMessageTo","timeGap","lastTime","class","dt","period","dayjs","fromNow","scrollTop","clientHeight","scrollHeight","hasPrev","loadPrev","callback","result","requestAnimationFrame","lastVisibleId","Number","$","filter","_","$el","offset","top","last","markingAsRead","MessageStreamState","params","page","DetailsModal","title","recipients","users","Boolean","username","slug","badges","infoItems","DialogSection","buttonClassName","accessibleToggleLabel","label","controlItems","MessagesPage","set","hasItems","initDialog","async","route","dialogRequestParams","include","dialogId","param","getById","find","selectedDialog","dialogElement","querySelector","container","scrollIntoView","loading","hero","sidebar","viewItems","display","name","sortMap","sortOptions","Object","keys","reduce","acc","sortId","getParams","values","value","changeSort","markAllAsRead"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"forum/components/MessagesPage.js","mappings":"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","sources":["webpack://@flarum/messages/./src/forum/components/DialogListItem.tsx","webpack://@flarum/messages/./src/forum/components/DialogList.tsx","webpack://@flarum/messages/./src/forum/components/MessagesSidebar.tsx","webpack://@flarum/messages/./src/forum/components/Message.tsx","webpack://@flarum/messages/./src/forum/components/MessageStream.tsx","webpack://@flarum/messages/./src/forum/states/MessageStreamState.ts","webpack://@flarum/messages/./src/forum/components/DetailsModal.tsx","webpack://@flarum/messages/./src/forum/components/DialogSection.tsx","webpack://@flarum/messages/./src/forum/components/MessagesPage.tsx"],"sourcesContent":["import Component from 'flarum/common/Component';\nimport classList from 'flarum/common/utils/classList';\nimport Link from 'flarum/common/components/Link';\nimport app from 'flarum/forum/app';\nimport Avatar from 'flarum/common/components/Avatar';\nimport username from 'flarum/common/helpers/username';\nimport humanTime from 'flarum/common/helpers/humanTime';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport Button from 'flarum/common/components/Button';\nexport default class DialogListItem extends Component {\n view(vnode) {\n const dialog = this.attrs.dialog;\n const recipient = dialog.recipient();\n const lastMessage = dialog.lastMessage();\n return m(\"li\", {\n className: classList('DialogListItem', {\n 'DialogListItem--unread': dialog.unreadCount(),\n active: this.attrs.active\n })\n }, m(Link, {\n href: app.route.dialog(dialog),\n className: classList('DialogListItem-button', {\n active: this.attrs.active\n })\n }, m(\"div\", {\n className: \"DialogListItem-avatar\"\n }, m(Avatar, {\n user: recipient\n }), !!dialog.unreadCount() && m(\"div\", {\n className: \"Bubble Bubble--primary\"\n }, dialog.unreadCount())), m(\"div\", {\n className: \"DialogListItem-content\"\n }, m(\"div\", {\n className: \"DialogListItem-title\"\n }, username(recipient), humanTime(dialog.lastMessageAt()), this.attrs.actions && m(\"div\", {\n className: \"DialogListItem-actions\"\n }, this.actionItems().toArray())), m(\"div\", {\n className: \"DialogListItem-lastMessage\"\n }, lastMessage ? lastMessage.contentPlain()?.slice(0, 80) : ''))));\n }\n actionItems() {\n const items = new ItemList();\n items.add('markAsRead', m(Button, {\n className: \"Notification-action Button Button--link\",\n icon: \"fas fa-check\",\n \"aria-label\": app.translator.trans('flarum-messages.forum.dialog_list.mark_as_read_tooltip'),\n onclick: e => {\n e.preventDefault();\n e.stopPropagation();\n this.attrs.dialog.save({\n lastReadMessageId: (this.attrs.dialog.data.relationships?.lastMessage.data).id\n }).finally(() => {\n if (this.attrs.dialog.unreadCount() === 0) {\n app.session.user.pushAttributes({\n messageCount: (app.session.user.attribute('messageCount') ?? 1) - 1\n });\n }\n m.redraw();\n });\n }\n }), 100);\n return items;\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/DialogListItem', DialogListItem);","import app from 'flarum/forum/app';\nimport Component from 'flarum/common/Component';\nimport Button from 'flarum/common/components/Button';\nimport DialogListItem from './DialogListItem';\nexport default class DialogList extends Component {\n oninit(vnode) {\n super.oninit(vnode);\n }\n oncreate(vnode) {\n super.oncreate(vnode);\n }\n onupdate(vnode) {\n super.onupdate(vnode);\n }\n view() {\n return m(\"div\", {\n className: \"DialogList\"\n }, m(\"ul\", {\n className: \"DialogList-list\"\n }, this.attrs.state.getAllItems().map(dialog => m(DialogListItem, {\n dialog: dialog,\n active: this.attrs.activeDialog?.id() === dialog.id(),\n actions: this.attrs.itemActions\n }))), this.attrs.state.hasNext() && !this.attrs.hideMore && m(\"div\", {\n className: \"DialogList-loadMore\"\n }, m(Button, {\n className: \"Button\",\n onclick: this.attrs.state.loadNext.bind(this.attrs.state)\n }, app.translator.trans('flarum-messages.forum.dialog_list.load_more_button'))));\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/DialogList', DialogList);","import app from 'flarum/forum/app';\nimport IndexSidebar from 'flarum/forum/components/IndexSidebar';\nimport Button from 'flarum/common/components/Button';\nexport default class MessagesSidebar extends IndexSidebar {\n static initAttrs(attrs) {\n attrs.className = 'MessagesPage-nav';\n }\n items() {\n const items = super.items();\n const canSendAnyMessage = app.session.user.attribute('canSendAnyMessage');\n items.remove('newDiscussion');\n items.add('newMessage', m(Button, {\n icon: \"fas fa-edit\",\n className: \"Button Button--primary IndexPage-newDiscussion MessagesPage-newMessage\",\n itemClassName: \"App-primaryControl\",\n onclick: () => {\n return this.newMessageAction();\n },\n disabled: !canSendAnyMessage\n }, app.translator.trans('flarum-messages.forum.messages_page.new_message_button')), 10);\n return items;\n }\n\n /**\n * Open the composer for a new message.\n */\n newMessageAction() {\n return flarum.reg.asyncModuleImport('flarum/forum/components/ComposerBody').then(() => {\n app.composer.load(() => import(/* webpackChunkName: 'forum/components/MessageComposer', webpackMode: 'lazy-once' */ './MessageComposer'), {\n user: app.session.user,\n onsubmit: () => {\n app.dialogs.refresh();\n }\n }).then(() => app.composer.show());\n return app.composer;\n });\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/MessagesSidebar', MessagesSidebar);flarum.reg.addChunkModule('451', '761', 'flarum-messages', 'forum/components/MessageComposer');","import ItemList from 'flarum/common/utils/ItemList';\nimport AbstractPost from 'flarum/forum/components/AbstractPost';\nimport Avatar from 'flarum/common/components/Avatar';\nimport Comment from 'flarum/forum/components/Comment';\nimport PostUser from 'flarum/forum/components/PostUser';\nimport PostMeta from 'flarum/forum/components/PostMeta';\nimport classList from 'flarum/common/utils/classList';\n/**\n * The `Post` component displays a single post. The basic post template just\n * includes a controls dropdown; subclasses must implement `content` and `attrs`\n * methods.\n */\nexport default class Message extends AbstractPost {\n oninit(vnode) {\n super.oninit(vnode);\n }\n user() {\n return this.attrs.message.user();\n }\n controls() {\n return [];\n }\n freshness() {\n return this.attrs.message.freshness;\n }\n createdByStarter() {\n return false;\n }\n onbeforeupdate(vnode) {\n return super.onbeforeupdate(vnode);\n }\n onupdate(vnode) {\n super.onupdate(vnode);\n }\n elementAttrs() {\n const message = this.attrs.message;\n const attrs = super.elementAttrs();\n attrs.className = classList(attrs.className || null, 'Message', {\n 'Post--renderFailed': message.renderFailed(),\n revealContent: false,\n editing: false\n });\n return attrs;\n }\n header() {\n return super.header();\n }\n content() {\n return super.content().concat([m(Comment, {\n headerItems: this.headerItems(),\n cardVisible: false,\n isEditing: false,\n isHidden: false,\n contentHtml: this.attrs.message.contentHtml(),\n user: this.attrs.message.user()\n })]);\n }\n classes(existing) {\n return super.classes(existing);\n }\n actionItems() {\n return super.actionItems();\n }\n footerItems() {\n return super.footerItems();\n }\n sideItems() {\n return super.sideItems();\n }\n avatar() {\n return this.attrs.message.user() ? m(Avatar, {\n user: this.attrs.message.user()\n }) : '';\n }\n headerItems() {\n const items = new ItemList();\n const message = this.attrs.message;\n items.add('user', m(PostUser, {\n post: message\n }), 100);\n items.add('meta', m(PostMeta, {\n post: message\n }));\n return items;\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/Message', Message);","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport app from 'flarum/forum/app';\nimport Component from 'flarum/common/Component';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\nimport Stream from 'flarum/common/utils/Stream';\nimport Button from 'flarum/common/components/Button';\nimport ScrollListener from 'flarum/common/utils/ScrollListener';\nimport Message from './Message';\nexport default class MessageStream extends Component {\n constructor() {\n super(...arguments);\n _defineProperty(this, \"replyPlaceholderComponent\", Stream(null));\n _defineProperty(this, \"loadingPostComponent\", Stream(null));\n _defineProperty(this, \"scrollListener\", void 0);\n _defineProperty(this, \"initialToBottomScroll\", false);\n _defineProperty(this, \"lastTime\", null);\n _defineProperty(this, \"checkedRead\", false);\n _defineProperty(this, \"markingAsRead\", false);\n }\n oninit(vnode) {\n super.oninit(vnode);\n\n // We need the lazy ReplyPlaceholder and LoadingPost components to be loaded.\n Promise.all([flarum.reg.asyncModuleImport('flarum/forum/components/ReplyPlaceholder'), flarum.reg.asyncModuleImport('flarum/forum/components/LoadingPost')]).then(_ref => {\n let [ReplyPlaceholder, LoadingPost] = _ref;\n this.replyPlaceholderComponent(ReplyPlaceholder.default);\n this.loadingPostComponent(LoadingPost.default);\n });\n }\n oncreate(vnode) {\n super.oncreate(vnode);\n this.scrollListener = new ScrollListener(this.onscroll.bind(this), this.element);\n setTimeout(() => {\n this.scrollListener.start();\n this.element.addEventListener('scrollend', this.markAsRead.bind(this));\n });\n }\n onupdate(vnode) {\n super.onupdate(vnode);\n\n // @todo: for future versions, consider using the post stream scrubber to scroll through the messages. (big task..)\n // @todo: introduce read status, to jump to the first unread message instead.\n if (!this.initialToBottomScroll && !this.attrs.state.isLoading()) {\n this.scrollToBottom();\n this.initialToBottomScroll = true;\n }\n if (this.initialToBottomScroll && !this.checkedRead) {\n this.markAsRead();\n this.checkedRead = true;\n }\n }\n onremove(vnode) {\n super.onremove(vnode);\n this.scrollListener.stop();\n }\n view() {\n return m(\"div\", {\n className: \"MessageStream\"\n }, this.attrs.state.isLoading() ? m(LoadingIndicator, null) : this.content());\n }\n content() {\n const items = [];\n const messages = this.attrs.state.getAllItems().sort((a, b) => a.createdAt().getTime() - b.createdAt().getTime());\n const ReplyPlaceholder = this.replyPlaceholderComponent();\n const LoadingPost = this.loadingPostComponent();\n if (messages[0].id() !== (this.attrs.dialog.data.relationships?.firstMessage.data).id) {\n items.push(m(\"div\", {\n className: \"MessageStream-item\",\n key: \"loadPrevious\"\n }, m(Button, {\n onclick: () => this.whileMaintainingScroll(() => this.attrs.state.loadNext()),\n type: \"button\",\n className: \"Button Button--block MessageStream-loadPrev\"\n }, app.translator.trans('flarum-messages.forum.messages_page.stream.load_previous_button'))));\n if (LoadingPost) {\n items.push(m(\"div\", {\n className: \"MessageStream-item\",\n key: \"loading-prev\"\n }, m(LoadingPost, null)));\n }\n }\n messages.forEach((message, index) => items.push(this.messageItem(message, index)));\n if (ReplyPlaceholder) {\n items.push(m(\"div\", {\n className: \"MessageStream-item\",\n key: \"reply\" /*data-index={this.attrs.state.count()}*/\n }, m(ReplyPlaceholder, {\n discussion: this.attrs.dialog,\n onclick: () => {\n flarum.reg.asyncModuleImport('flarum/forum/components/ComposerBody').then(() => {\n app.composer.load(() => import(/* webpackChunkName: 'forum/components/MessageComposer', webpackMode: 'lazy-once' */ './MessageComposer'), {\n user: app.session.user,\n replyingTo: this.attrs.dialog,\n onsubmit: () => {\n this.attrs.state.refresh().then(() => setTimeout(() => this.scrollToBottom(), 50));\n }\n }).then(() => app.composer.show());\n });\n },\n composingReply: () => app.composer.composingMessageTo(this.attrs.dialog)\n })));\n }\n return items;\n }\n messageItem(message, index) {\n return m(\"div\", {\n className: \"MessageStream-item\",\n key: index,\n \"data-id\": message.id()\n }, this.timeGap(message), m(Message, {\n message: message\n }));\n }\n timeGap(message) {\n if (message.id() === (this.attrs.dialog.data.relationships?.firstMessage.data).id) {\n this.lastTime = message.createdAt();\n return m(\"div\", {\n class: \"PostStream-timeGap\"\n }, m(\"span\", null, app.translator.trans('flarum-messages.forum.messages_page.stream.start_of_the_conversation')));\n }\n const lastTime = this.lastTime;\n const dt = message.createdAt().getTime() - (lastTime?.getTime() || 0);\n this.lastTime = message.createdAt();\n if (lastTime && dt > 1000 * 60 * 60 * 24 * 4) {\n return m(\"div\", {\n className: \"PostStream-timeGap\"\n }, m(\"span\", null, app.translator.trans('flarum-messages.forum.messages_page.stream.time_lapsed_text', {\n period: dayjs().add(dt, 'ms').fromNow(true)\n })));\n }\n return null;\n }\n onscroll() {\n this.whileMaintainingScroll(() => {\n if (this.element.scrollTop <= 80 && this.attrs.state.hasNext()) {\n return this.attrs.state.loadNext();\n }\n if (this.element.scrollTop + this.element.clientHeight === this.element.scrollHeight && this.attrs.state.hasPrev()) {\n return this.attrs.state.loadPrev();\n }\n return null;\n });\n }\n scrollToBottom() {\n this.element.scrollTop = this.element.scrollHeight;\n }\n whileMaintainingScroll(callback) {\n const scrollTop = this.element.scrollTop;\n const scrollHeight = this.element.scrollHeight;\n const result = callback();\n if (result instanceof Promise) {\n result.then(() => {\n requestAnimationFrame(() => {\n this.element.scrollTop = this.element.scrollHeight - scrollHeight + scrollTop;\n });\n });\n }\n }\n markAsRead() {\n const lastVisibleId = Number(this.$('.MessageStream-item[data-id]').filter((_, $el) => {\n if (this.element.scrollHeight <= this.element.clientHeight) {\n return true;\n }\n return this.$().offset().top + this.element.clientHeight > $($el).offset().top;\n }).last().data('id'));\n if (lastVisibleId && app.session.user && lastVisibleId > (this.attrs.dialog.lastReadMessageId() || 0) && !this.markingAsRead) {\n this.markingAsRead = true;\n this.attrs.dialog.save({\n lastReadMessageId: lastVisibleId\n }).finally(() => {\n this.markingAsRead = false;\n if (this.attrs.dialog.unreadCount() === 0) {\n app.session.user.pushAttributes({\n messageCount: (app.session.user.attribute('messageCount') ?? 1) - 1\n });\n }\n m.redraw();\n });\n }\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/MessageStream', MessageStream);","import PaginatedListState from 'flarum/common/states/PaginatedListState';\nexport default class MessageStreamState extends PaginatedListState {\n constructor(params, page) {\n if (page === void 0) {\n page = 1;\n }\n super(params, page, null);\n }\n get type() {\n return 'dialog-messages';\n }\n getAllItems() {\n return super.getAllItems();\n }\n}\nflarum.reg.add('flarum-messages', 'forum/states/MessageStreamState', MessageStreamState);","import app from 'flarum/forum/app';\nimport Modal from 'flarum/common/components/Modal';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport Avatar from 'flarum/common/components/Avatar';\nimport fullTime from 'flarum/common/helpers/fullTime';\nimport username from 'flarum/common/helpers/username';\nimport Link from 'flarum/common/components/Link';\nimport listItems from 'flarum/common/helpers/listItems';\nexport default class DetailsModal extends Modal {\n className() {\n return 'Modal--small Modal--flat DetailsModal';\n }\n title() {\n return app.translator.trans('flarum-messages.forum.dialog_section.details_modal.title');\n }\n content() {\n let recipients = (this.attrs.dialog.users() || []).filter(Boolean);\n return m(\"div\", {\n className: \"Modal-body DetailsModal-infoGroups\"\n }, m(\"div\", {\n className: \"DetailsModal-recipients DetailsModal-info\"\n }, m(\"div\", {\n className: \"DetailsModal-info-title\"\n }, app.translator.trans('flarum-messages.forum.dialog_section.details_modal.recipients')), m(\"div\", {\n className: \"DetailsModal-recipients-list\"\n }, recipients?.map(recipient => {\n return m(\"div\", {\n className: \"DetailsModal-recipient\"\n }, m(Avatar, {\n user: recipient\n }), m(Link, {\n href: app.route('user', {\n username: recipient.slug()\n })\n }, m(\"span\", {\n className: \"DetailsModal-recipient-username\"\n }, username(recipient))), m(\"div\", {\n className: \"badges\"\n }, listItems(recipient.badges().toArray())));\n }))), this.infoItems().toArray());\n }\n infoItems() {\n const items = new ItemList();\n items.add('created', m(\"div\", {\n className: \"DetailsModal-createdAt DetailsModal-info\"\n }, m(\"div\", {\n className: \"DetailsModal-info-title\"\n }, app.translator.trans('flarum-messages.forum.dialog_section.details_modal.created_at')), m(\"div\", {\n className: \"DetailsModal-info-content\"\n }, fullTime(this.attrs.dialog.createdAt()))));\n return items;\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/DetailsModal', DetailsModal);","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport Component from 'flarum/common/Component';\nimport MessageStream from './MessageStream';\nimport username from 'flarum/common/helpers/username';\nimport MessageStreamState from '../states/MessageStreamState';\nimport Avatar from 'flarum/common/components/Avatar';\nimport Link from 'flarum/common/components/Link';\nimport app from 'flarum/forum/app';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport Button from 'flarum/common/components/Button';\nimport Dropdown from 'flarum/common/components/Dropdown';\nimport DetailsModal from './DetailsModal';\nimport listItems from 'flarum/common/helpers/listItems';\nexport default class DialogSection extends Component {\n constructor() {\n super(...arguments);\n _defineProperty(this, \"loading\", false);\n _defineProperty(this, \"messages\", void 0);\n }\n oninit(vnode) {\n super.oninit(vnode);\n this.messages = new MessageStreamState({\n filter: {\n dialog: this.attrs.dialog.id()\n },\n sort: '-createdAt'\n });\n this.messages.refresh();\n }\n view() {\n const recipient = this.attrs.dialog.recipient();\n return m(\"div\", {\n className: \"DialogSection\"\n }, m(\"div\", {\n className: \"DialogSection-header\"\n }, m(Avatar, {\n user: recipient\n }), m(\"div\", {\n className: \"DialogSection-header-info\"\n }, recipient && m(Link, {\n href: app.route.user(recipient)\n }, m(\"h2\", null, username(recipient))) || m(\"h2\", null, username(recipient)), m(\"div\", {\n className: \"badges\"\n }, listItems(recipient?.badges().toArray() || []))), m(\"div\", {\n className: \"DialogSection-header-actions\"\n }, this.actionItems().toArray())), m(MessageStream, {\n dialog: this.attrs.dialog,\n state: this.messages\n }));\n }\n actionItems() {\n const items = new ItemList();\n items.add('details', m(Dropdown, {\n icon: \"fas fa-ellipsis-h\",\n className: \"DialogSection-controls\",\n buttonClassName: \"Button Button--icon\",\n accessibleToggleLabel: app.translator.trans('flarum-messages.forum.dialog_section.controls_toggle_label'),\n label: app.translator.trans('flarum-messages.forum.dialog_section.controls_toggle_label')\n }, this.controlItems().toArray()));\n return items;\n }\n controlItems() {\n const items = new ItemList();\n items.add('details', m(Button, {\n icon: \"fas fa-info-circle\",\n onclick: () => app.modal.show(DetailsModal, {\n dialog: this.attrs.dialog\n })\n }, app.translator.trans('flarum-messages.forum.dialog_section.controls.details_button')));\n return items;\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/DialogSection', DialogSection);","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport app from 'flarum/forum/app';\nimport Page from 'flarum/common/components/Page';\nimport PageStructure from 'flarum/forum/components/PageStructure';\nimport Icon from 'flarum/common/components/Icon';\nimport DialogList from './DialogList';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\nimport Stream from 'flarum/common/utils/Stream';\nimport InfoTile from 'flarum/common/components/InfoTile';\nimport MessagesSidebar from './MessagesSidebar';\nimport DialogSection from './DialogSection';\nimport listItems from 'flarum/common/helpers/listItems';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport Dropdown from 'flarum/common/components/Dropdown';\nimport Button from 'flarum/common/components/Button';\nexport default class MessagesPage extends Page {\n constructor() {\n super(...arguments);\n _defineProperty(this, \"selectedDialog\", Stream(null));\n }\n oninit(vnode) {\n super.oninit(vnode);\n if (!app.session.user) {\n m.route.set(app.route('index'));\n return;\n }\n app.current.set('noTagsList', true);\n if (!app.dialogs.hasItems()) {\n app.dialogs.refresh().then(async () => {\n if (app.dialogs.hasItems()) {\n await this.initDialog();\n }\n });\n } else {\n this.initDialog();\n }\n }\n dialogRequestParams() {\n return {\n include: 'users.groups'\n };\n }\n async initDialog() {\n const dialogId = m.route.param('id');\n const title = app.translator.trans('flarum-messages.forum.messages_page.title', {}, true);\n let dialog;\n if (dialogId) {\n dialog = app.store.getById('dialogs', dialogId) || (await app.store.find('dialogs', dialogId, this.dialogRequestParams()));\n } else {\n dialog = app.dialogs.getAllItems()[0];\n }\n this.selectedDialog(dialog);\n if (dialog) {\n app.setTitle(dialog.title());\n app.history.push('dialog', dialog.title());\n } else {\n app.setTitle(title);\n app.history.push('messages', title);\n }\n m.redraw();\n }\n onupdate(vnode) {\n super.onupdate(vnode);\n\n // Scroll the dialog list to the active dialog item if present and not visible.\n const dialogElement = this.element.querySelector('.DialogListItem.active');\n const container = this.element.querySelector('.DialogList');\n if (dialogElement && $(container).offset().top + container.clientHeight <= $(dialogElement).offset().top) {\n dialogElement.scrollIntoView();\n }\n }\n view() {\n return m(PageStructure, {\n className: \"MessagesPage Page--vertical\",\n loading: false,\n hero: this.hero.bind(this),\n sidebar: () => m(MessagesSidebar, null)\n }, app.dialogs.isLoading() ? m(LoadingIndicator, null) : !app.dialogs.hasItems() ? m(InfoTile, {\n icon: \"far fa-envelope-open\"\n }, app.translator.trans('flarum-messages.forum.messages_page.empty_text')) : m(\"div\", {\n className: \"MessagesPage-content\"\n }, m(\"div\", {\n className: \"MessagesPage-sidebar\",\n key: \"sidebar\"\n }, m(\"div\", {\n className: \"IndexPage-toolbar\",\n key: \"toolbar\"\n }, m(\"ul\", {\n className: \"IndexPage-toolbar-view\"\n }, listItems(this.viewItems().toArray())), m(\"ul\", {\n className: \"IndexPage-toolbar-action\"\n }, listItems(this.actionItems().toArray()))), m(DialogList, {\n key: \"list\",\n state: app.dialogs,\n activeDialog: this.selectedDialog()\n })), this.selectedDialog() ? m(DialogSection, {\n key: \"dialog\",\n dialog: this.selectedDialog()\n }) : m(LoadingIndicator, {\n key: \"loading\",\n display: \"block\"\n })));\n }\n hero() {\n return m(\"header\", {\n className: \"Hero MessagesPageHero\"\n }, m(\"div\", {\n className: \"container\"\n }, m(\"div\", {\n className: \"containerNarrow\"\n }, m(\"h1\", {\n className: \"Hero-title\"\n }, m(Icon, {\n name: \"fas fa-envelope\"\n }), \" \", app.translator.trans('flarum-messages.forum.messages_page.hero.title')), m(\"div\", {\n className: \"Hero-subtitle\"\n }, app.translator.trans('flarum-messages.forum.messages_page.hero.subtitle')))));\n }\n\n /**\n * Build an item list for the part of the toolbar which is concerned with how\n * the results are displayed. By default this is just a select box to change\n * the way discussions are sorted.\n */\n viewItems() {\n const items = new ItemList();\n const sortMap = app.dialogs.sortMap();\n const sortOptions = Object.keys(sortMap).reduce((acc, sortId) => {\n const sort = sortMap[sortId];\n acc[sortId] = typeof sort !== 'string' ? sort.label : app.translator.trans(`flarum-messages.forum.index_sort.${sortId}_button`);\n return acc;\n }, {});\n items.add('sort', m(Dropdown, {\n buttonClassName: \"Button\",\n label: sortOptions[app.dialogs.getParams()?.sort || 0] || Object.values(sortOptions)[0],\n accessibleToggleLabel: app.translator.trans('core.forum.index_sort.toggle_dropdown_accessible_label')\n }, Object.keys(sortOptions).map(value => {\n const label = sortOptions[value];\n const active = (app.dialogs.getParams().sort || Object.keys(sortMap)[0]) === value;\n return m(Button, {\n icon: active ? 'fas fa-check' : true,\n onclick: () => app.dialogs.changeSort(value),\n active: active\n }, label);\n })));\n return items;\n }\n\n /**\n * Build an item list for the part of the toolbar which is about taking action\n * on the results. By default this is just a \"mark all as read\" button.\n */\n actionItems() {\n const items = new ItemList();\n items.add('refresh', m(Button, {\n title: app.translator.trans('flarum-messages.forum.messages_page.refresh_tooltip'),\n \"aria-label\": app.translator.trans('flarum-messages.forum.messages_page.refresh_tooltip'),\n icon: \"fas fa-sync\",\n className: \"Button Button--icon\",\n onclick: () => {\n app.dialogs.refresh();\n }\n }));\n if (app.session.user) {\n items.add('markAllAsRead', m(Button, {\n title: app.translator.trans('flarum-messages.forum.messages_page.mark_all_as_read_tooltip'),\n \"aria-label\": app.translator.trans('flarum-messages.forum.messages_page.mark_all_as_read_tooltip'),\n icon: \"fas fa-check\",\n className: \"Button Button--icon\",\n onclick: () => app.dialogs.markAllAsRead()\n }));\n }\n return items;\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/MessagesPage', MessagesPage);"],"names":["DialogListItem","view","vnode","dialog","this","attrs","recipient","lastMessage","m","className","unreadCount","active","href","user","lastMessageAt","actions","actionItems","toArray","contentPlain","slice","items","add","icon","trans","onclick","e","preventDefault","stopPropagation","save","lastReadMessageId","data","relationships","id","finally","pushAttributes","messageCount","attribute","redraw","flarum","reg","DialogList","oninit","super","oncreate","onupdate","state","getAllItems","map","activeDialog","itemActions","hasNext","hideMore","loadNext","bind","MessagesSidebar","initAttrs","canSendAnyMessage","remove","itemClassName","newMessageAction","disabled","asyncModuleImport","then","load","onsubmit","refresh","show","addChunkModule","Message","message","controls","freshness","createdByStarter","onbeforeupdate","elementAttrs","renderFailed","revealContent","editing","header","content","concat","headerItems","cardVisible","isEditing","isHidden","contentHtml","classes","existing","footerItems","sideItems","avatar","post","MessageStream","constructor","arguments","Promise","all","_ref","ReplyPlaceholder","LoadingPost","replyPlaceholderComponent","default","loadingPostComponent","scrollListener","onscroll","element","setTimeout","start","addEventListener","markAsRead","initialToBottomScroll","isLoading","scrollToBottom","checkedRead","onremove","stop","messages","sort","a","b","createdAt","getTime","firstMessage","push","key","whileMaintainingScroll","type","forEach","index","messageItem","discussion","replyingTo","composingReply","composingMessageTo","timeGap","lastTime","class","dt","period","dayjs","fromNow","scrollTop","clientHeight","scrollHeight","hasPrev","loadPrev","callback","result","requestAnimationFrame","lastVisibleId","Number","$","filter","_","$el","offset","top","last","markingAsRead","MessageStreamState","params","page","DetailsModal","title","recipients","users","Boolean","username","slug","badges","infoItems","DialogSection","buttonClassName","accessibleToggleLabel","label","controlItems","MessagesPage","set","hasItems","initDialog","async","route","dialogRequestParams","include","dialogId","param","getById","find","selectedDialog","dialogElement","querySelector","container","scrollIntoView","loading","hero","sidebar","viewItems","display","name","sortMap","sortOptions","Object","keys","reduce","acc","sortId","getParams","values","value","changeSort","markAllAsRead"],"sourceRoot":""} \ No newline at end of file diff --git a/framework/core/js/dist/admin.js b/framework/core/js/dist/admin.js index 72e744d02..feb72fdcf 100644 --- a/framework/core/js/dist/admin.js +++ b/framework/core/js/dist/admin.js @@ -1,3 +1,3 @@ /*! For license information please see admin.js.LICENSE.txt */ -(()=>{var t,e,n={5710:(t,e,n)=>{"use strict";n.d(e,{A:()=>s});var r=n(8805);class s{constructor(){(0,r.A)(this,"element",void 0),(0,r.A)(this,"attrs",void 0),(0,r.A)(this,"state",void 0)}oninit(t){this.setAttrs(t.attrs)}oncreate(t){this.element=t.dom}onbeforeupdate(t){this.setAttrs(t.attrs)}onupdate(t){}onbeforeremove(t){}onremove(t){}$(t){const e=$(this.element);return t?e.find(t):e}static component(t,e){void 0===t&&(t={}),void 0===e&&(e=null);const n={...t};return m(this,n,e)}setAttrs(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}static initAttrs(t){}}flarum.reg.add("core","common/Component",s)},5420:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var r=n(8805),s=n(5114);class a{constructor(t,e){void 0===t&&(t={}),void 0===e&&(e=s.A.store),(0,r.A)(this,"data",{}),(0,r.A)(this,"freshness",new Date),(0,r.A)(this,"exists",!1),(0,r.A)(this,"store",void 0),this.data=t,this.store=e}id(){return"id"in this.data?this.data.id:void 0}attribute(t){return this.data?.attributes?.[t]}pushData(t){if("id"in t&&(this.data.id=t.id),"type"in t&&(this.data.type=t.type),"attributes"in t){this.data.attributes||={};for(const e in t.attributes){const n=t.attributes[e];n&&n instanceof a&&delete t.attributes[e]}Object.assign(this.data.attributes,t.attributes)}if("relationships"in t){const e=this.data.relationships??{};for(const n in t.relationships){const r=t.relationships[n];if(null===r){delete e[n],delete t.relationships[n];continue}let s;s=r instanceof a?{data:a.getIdentifier(r)}:r instanceof Array?{data:r.map(a.getIdentifier)}:r,t.relationships[n]=s,e[n]=s}this.data.relationships=e}return this.freshness=new Date,this}pushAttributes(t){this.pushData({attributes:t})}save(t,e){void 0===e&&(e={});const n={type:this.data.type,attributes:t};if("id"in this.data&&(n.id=this.data.id),t.relationships&&!("relationships"in this)){n.relationships={};for(const e in t.relationships){const r=t.relationships[e];null!==r&&(n.relationships[e]={data:r instanceof Array?r.map(a.getIdentifier):a.getIdentifier(r)})}delete t.relationships}const r=this.copyData();this.pushData(n);const i={data:n,meta:e.meta||void 0};return s.A.request({method:this.exists?"PATCH":"POST",url:s.A.forum.attribute("apiUrl")+this.apiEndpoint(),body:i,...e}).then((t=>this.store.pushPayload(t)),(t=>{throw this.pushData(r),m.redraw(),t}))}delete(t,e){return void 0===t&&(t={}),void 0===e&&(e={}),this.exists?s.A.request({method:"DELETE",url:s.A.forum.attribute("apiUrl")+this.apiEndpoint(),body:t,...e}).then((()=>{this.exists=!1,this.store.remove(this)})):Promise.resolve()}apiEndpoint(){return"/"+this.data.type+("id"in this.data?"/"+this.data.id:"")}copyData(){return JSON.parse(JSON.stringify(this.data))}rawRelationship(t){return this.data.relationships?.[t]?.data}static attribute(t,e){return function(){return e?e(this.attribute(t)):this.attribute(t)}}static hasOne(t){return function(){const e=this.data.relationships?.[t]?.data;if(e&&e instanceof Array)throw new Error(`Relationship ${t} on model ${this.data.type} is plural, so the hasOne method cannot be used to access it.`);return!!e&&this.store.getById(e.type,e.id)}}static hasMany(t){return function(){const e=this.data.relationships?.[t]?.data;if(e&&!(e instanceof Array))throw new Error(`Relationship ${t} on model ${this.data.type} is singular, so the hasMany method cannot be used to access it.`);return!!e&&e.map((t=>this.store.getById(t.type,t.id)))}}static transformDate(t){return null!=t?new Date(t):t}static getIdentifier(t){return t&&t.data&&"id"in t.data?{type:t.data.type,id:t.data.id}:null}}flarum.reg.add("core","common/Model",a)},3920:(t,e,n)=>{"use strict";n.d(e,{A:()=>p});var r=n(8805),s=n(5114),a=n(8631);class i extends a.px{key(){return s.A.translator.trans("core.lib.gambits.discussions.author.key",{},!0)}hint(){return s.A.translator.trans("core.lib.gambits.discussions.author.hint",{},!0)}filterKey(){return"author"}}flarum.reg.add("core","common/query/discussions/AuthorGambit",i);class o extends a.px{key(){return s.A.translator.trans("core.lib.gambits.discussions.created.key",{},!0)}hint(){return s.A.translator.trans("core.lib.gambits.discussions.created.hint",{},!0)}valuePattern(){return"(\\d{4}\\-\\d\\d\\-\\d\\d(?:\\.\\.(\\d{4}\\-\\d\\d\\-\\d\\d))?)"}filterKey(){return"created"}}flarum.reg.add("core","common/query/discussions/CreatedGambit",o);class l extends a.pm{key(){return s.A.translator.trans("core.lib.gambits.discussions.hidden.key",{},!0)}filterKey(){return"hidden"}enabled(){return!!s.A.session.user}}flarum.reg.add("core","common/query/discussions/HiddenGambit",l);class c extends a.pm{key(){return s.A.translator.trans("core.lib.gambits.discussions.unread.key",{},!0)}filterKey(){return"unread"}enabled(){return!!s.A.session.user}}flarum.reg.add("core","common/query/discussions/UnreadGambit",c);class u extends a.px{key(){return s.A.translator.trans("core.lib.gambits.users.email.key",{},!0)}hint(){return s.A.translator.trans("core.lib.gambits.users.email.hint",{},!0)}filterKey(){return"email"}enabled(){return!(!s.A.session.user||!s.A.forum.attribute("canEditUserCredentials"))}}flarum.reg.add("core","common/query/users/EmailGambit",u);class d extends a.px{key(){return s.A.translator.trans("core.lib.gambits.users.group.key",{},!0)}hint(){return s.A.translator.trans("core.lib.gambits.users.group.hint",{},!0)}filterKey(){return"group"}}flarum.reg.add("core","common/query/users/GroupGambit",d);class m extends a.px{key(){return s.A.translator.trans("core.lib.gambits.posts.discussion.key",{},!0)}hint(){return s.A.translator.trans("core.lib.gambits.posts.discussion.hint",{},!0)}filterKey(){return"discussion"}}flarum.reg.add("core","common/query/discussions/DiscussionGambit",m);class h{constructor(){(0,r.A)(this,"gambits",{discussions:[i,o,l,c],posts:[i,m],users:[u,d]})}apply(t,e){return e.q=this.match(t,e.q,((t,n,r)=>{const s=t.toFilter(n,r);Object.keys(s).forEach((n=>{n in e&&t.predicates&&Array.isArray(s[n])?e[n]=e[n].concat(s[n]):e[n]=s[n]}))})),e}match(t,e,n){const r=this.for(t).filter((t=>t.enabled()));if(0===r.length)return e;const s=e.split(" ");for(const t of r)for(const r of s){const s=new RegExp(`^(-?)${t.pattern()}$`,"i");let a=r.match(s);if(a){const s="-"===a[1];a.splice(1,1),n(t,a,s,r),e=e.replace(r,"")}}return e.trim().replace(/\s+/g," ")}from(t,e,n){const r=this.for(t);return 0===r.length||Object.keys(n).forEach((t=>{for(const s of r){const r="-"===t[0];r&&(t=t.substring(1)),s.filterKey()===t&&(e+=` ${s.fromFilter(n[t],r)}`)}})),e}for(t){return(this.gambits[t]||[]).map((t=>new t))}}flarum.reg.add("core","common/GambitManager",h);class p{constructor(t){(0,r.A)(this,"state",void 0),(0,r.A)(this,"gambits",new h),this.state=t}}(0,r.A)(p,"MIN_SEARCH_LEN",3),flarum.reg.add("core","common/SearchManager",p)},5114:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});const r=window,s=new Proxy({},{get:(t,e)=>Reflect.get(r.app,e,r.app),set:(t,e,n)=>Reflect.set(r.app,e,n,r.app)}),a=s;flarum.reg.add("core","common/app",s)},9924:(t,e,n)=>{"use strict";n.d(e,{A:()=>u});var r=n(5710),s=n(3092),a=n(5673),i=n(4586),o=n(4268),l=n(5114),c=n(7479);class u extends r.A{view(t){const e=Object.assign({},this.attrs),n=(0,i.A)(e,"type");e.className=(0,o.A)("Alert",`Alert--${n}`,e.className);const r=(0,i.A)(e,"title"),u=(0,i.A)(e,"icon"),d=(0,i.A)(e,"content")||t.children,h=(0,i.A)(e,"controls")||[],p=(0,i.A)(e,"dismissible"),f=(0,i.A)(e,"ondismiss"),g=[];return(p||void 0===p)&&g.push(m(s.A,{"aria-label":l.A.translator.trans("core.lib.alert.dismiss_a11y_label"),icon:"fas fa-times",className:"Button Button--link Button--icon Alert-dismiss",onclick:f})),m("div",e,m("div",{className:(0,o.A)("Alert-container",e.containerClassName)},m("div",{className:"Alert-content"},!!r&&m("div",{className:"Alert-title"},!!u&&m("span",{className:"Alert-title-icon"},m(c.A,{name:u})),m("span",{className:"Alert-title-text"},r)),m("span",{className:"Alert-body"},d)),m("ul",{className:"Alert-controls"},(0,a.A)(h.concat(g)))))}}flarum.reg.add("core","common/components/Alert",u)},367:(t,e,n)=>{"use strict";n.d(e,{A:()=>l});var r=n(4391),s=n(5710),a=n(4268),i=n(3288),o=n(7479);class l extends s.A{view(){const{type:t,icon:e,label:n,color:s,style:l={},...c}=this.attrs,u=(0,a.A)("Badge",[t&&`Badge--${t}`],c.className,(0,i.A)(s)),d=e?m(o.A,{name:e,className:"Badge-icon"}):m.trust(" "),h={...l};window.testing||(h["--badge-bg"]=s);const p={...c,className:u,style:h},f=m("div",p,d);return n?m(r.A,{text:n},f):f}}flarum.reg.add("core","common/components/Badge",l)},3092:(t,e,n)=>{"use strict";n.d(e,{A:()=>c});var r=n(5710),s=n(4434),a=n(4268),i=n(117),o=n(43),l=n(7479);class c extends r.A{view(t){let{type:e,"aria-label":n,icon:r,disabled:s,loading:o,className:l,class:c,...u}=this.attrs;e||="button","object"==typeof n&&(n=(0,i.A)(n)),(s||o)&&delete u.onclick,l=(0,a.A)(c,l,{hasIcon:r,disabled:s||o,loading:o});const d={disabled:s,className:l,type:e,"aria-label":n,...u};return m("button",d,this.getButtonContent(t.children))}oncreate(t){super.oncreate(t);const{"aria-label":e}=this.attrs;this.view!==c.prototype.view||e||(0,i.A)(t.children)||this.element?.getAttribute?.("aria-label")||(0,s.A)('[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',this.element)}getButtonContent(t){const e=this.attrs.icon;return[e&&m(l.A,{name:e,className:"Button-icon"}),t&&m("span",{className:"Button-label"},t),this.attrs.loading&&m(o.A,{size:"small",display:"inline"})]}}flarum.reg.add("core","common/components/Button",c)},374:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var r=n(5710),s=n(4268);class a extends r.A{view(t){const{label:e,description:n,className:r,...a}=t.attrs;return m("div",Object.assign({className:(0,s.A)("Form",r)},a),(e||n)&&m("div",{className:"Form-header"},e&&m("label",null,e),n&&m("p",{className:"helpText"},n)),m("div",{className:"Form-body"},t.children))}}flarum.reg.add("core","common/components/Form",a)},2855:(t,e,n)=>{"use strict";n.d(e,{A:()=>s});var r=n(2849);class s extends r.A{wrapper(t){return m("form",{onsubmit:this.onsubmit.bind(this)},t)}onsubmit(t){}onready(){this.$().find("input, select, textarea").first().trigger("focus").trigger("select")}onerror(t){this.alertAttrs=t.alert,m.redraw(),422===t.status&&t.response?.errors?this.$("form [name="+t.response.errors[0].source.pointer.replace("/data/attributes/","")+"]").trigger("select"):this.onready()}}flarum.reg.add("core","common/components/FormModal",s)},3550:(t,e,n)=>{"use strict";n.d(e,{A:()=>s});var r=n(367);class s extends r.A{static initAttrs(t){super.initAttrs(t),t.group&&(t.icon=t.group.icon()||"",t.color=t.group.color()||"",t.label=void 0===t.label?t.group.nameSingular():t.label,t.type="group--"+t.group.id(),delete t.group)}}flarum.reg.add("core","common/components/GroupBadge",s)},7479:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var r=n(4268),s=n(5710);class a extends s.A{view(t){const{name:e,...n}=t.attrs;return n.className=(0,r.A)("icon",e,n.className),m("i",Object.assign({"aria-hidden":"true"},n))}}flarum.reg.add("core","common/components/Icon",a)},4164:(t,e,n)=>{"use strict";n.d(e,{A:()=>i});var r=n(5710),s=n(7479),a=n(4268);class i extends r.A{view(t){const{icon:e,className:n,...r}=t.attrs;return m("div",Object.assign({className:(0,a.A)("InfoTile",n)},r),this.icon(),m("div",{className:"InfoTile-text"},t.children))}icon(){return this.attrs.iconElement?this.attrs.iconElement:this.attrs.icon?m(s.A,{name:(0,a.A)(this.attrs.icon,"InfoTile-icon")}):null}}flarum.reg.add("core","common/components/InfoTile",i)},7882:(t,e,n)=>{"use strict";n.d(e,{A:()=>c});var r=n(5114),s=n(5710),a=n(7479),i=n(43),o=n(4268),l=n(3092);class c extends s.A{oninit(t){super.oninit(t)}view(t){const{className:e,...n}=this.attrs.inputAttrs||{},s=this.attrs.value||this.attrs.stream?.()||"";return m("div",{className:(0,o.A)("Input",this.attrs.className,{"Input--withPrefix":this.attrs.prefixIcon,"Input--withClear":this.attrs.clearable})},this.attrs.prefixIcon&&m(a.A,{name:(0,o.A)(this.attrs.prefixIcon,"Input-prefix-icon")}),this.input({inputClassName:e,value:s,inputAttrs:n}),this.attrs.loading&&m(i.A,{size:"small",display:"inline",containerClassName:"Button Button--icon Button--link"}),this.attrs.clearable&&s&&!this.attrs.loading&&m(l.A,{className:"Input-clear Button Button--icon Button--link",onclick:this.clear.bind(this),"aria-label":this.attrs.clearLabel||r.A.translator.trans("core.lib.input.clear_button"),type:"button",icon:"fas fa-times-circle"}))}input(t){let{inputClassName:e,value:n,inputAttrs:r}=t;const s={className:(0,o.A)("FormControl",e),type:this.attrs.type||"text",value:n,oninput:t=>this.onchange?.(t.target.value),"aria-label":this.attrs.ariaLabel,placeholder:this.attrs.placeholder,readonly:this.attrs.readonly||void 0,disabled:this.attrs.disabled||void 0,...r};return this.attrs.renderInput?this.attrs.renderInput(s):m("input",s)}onchange(t){this.attrs.stream?this.attrs.stream(t):this.attrs.onchange?.(t)}clear(){this.onchange("")}}flarum.reg.add("core","common/components/Input",c)},43:(t,e,n)=>{"use strict";n.d(e,{A:()=>i});var r=n(5114),s=n(5710),a=n(4268);class i extends s.A{view(){const{display:t="block",size:e="medium",containerClassName:n,className:s,...i}=this.attrs,o=(0,a.A)("LoadingIndicator",s),l=(0,a.A)("LoadingIndicator-container","unset"!==t&&`LoadingIndicator-container--${t}`,e&&`LoadingIndicator-container--${e}`,n);return m("div",Object.assign({"aria-label":r.A.translator.trans("core.lib.loading_indicator.accessible_label"),role:"status"},i.containerAttrs,{"data-size":e,className:l}),m("div",Object.assign({"aria-hidden":"true",className:o},i)))}}flarum.reg.add("core","common/components/LoadingIndicator",i)},2849:(t,e,n)=>{"use strict";n.d(e,{A:()=>c});var r=n(8805),s=n(5114),a=n(5710),i=n(9924),o=n(3092),l=n(4268);class c extends a.A{constructor(){super(...arguments),(0,r.A)(this,"loading",!1),(0,r.A)(this,"alertAttrs",null)}static get dismissibleOptions(){return{viaCloseButton:this.isDismissibleViaCloseButton,viaEscKey:this.isDismissibleViaEscKey,viaBackdropClick:this.isDismissibleViaBackdropClick}}oncreate(t){super.oncreate(t),this.attrs.animateShow((()=>this.onready()))}onbeforeremove(t){if(super.onbeforeremove(t),!this.attrs.state.modal)return new Promise((t=>setTimeout(t,300)))}view(){return this.alertAttrs&&(this.alertAttrs.dismissible=!1),m("div",{className:(0,l.A)("Modal modal-dialog fade",this.className())},m("div",{className:"Modal-content"},this.dismissibleOptions.viaCloseButton&&m("div",{className:"Modal-close App-backControl"},m(o.A,{icon:"fas fa-times",onclick:()=>this.hide(),className:"Button Button--icon Button--link","aria-label":s.A.translator.trans("core.lib.modal.close")})),this.wrapper(this.inner())))}wrapper(t){return m("[",null,t)}inner(){return m("[",null,m("div",{className:"Modal-header"},m("h3",{className:"App-titleControl App-titleControl--text"},this.title())),!!this.alertAttrs&&m("div",{className:"Modal-alert"},m(i.A,this.alertAttrs)),this.content())}onready(){}hide(){this.attrs.animateHide()}loaded(){this.loading=!1,m.redraw()}get dismissibleOptions(){return this.constructor.dismissibleOptions}}(0,r.A)(c,"isDismissibleViaCloseButton",!0),(0,r.A)(c,"isDismissibleViaEscKey",!0),(0,r.A)(c,"isDismissibleViaBackdropClick",!0),flarum.reg.add("core","common/components/Modal",c)},4391:(t,e,n)=>{"use strict";n.d(e,{A:()=>o});var r=n(8805),s=n(5710),a=n(4268),i=n(117);class o extends s.A{constructor(){super(...arguments),(0,r.A)(this,"firstChild",null),(0,r.A)(this,"childDomNode",null),(0,r.A)(this,"oldText",""),(0,r.A)(this,"oldVisibility",void 0),(0,r.A)(this,"shouldRecreateTooltip",!1),(0,r.A)(this,"shouldChangeTooltipVisibility",!1)}view(t){const e=t.children,{text:n,tooltipVisible:r,showOnFocus:s=!0,position:a="top",ignoreTitleWarning:i=!1,html:o=!1,delay:l=0,...c}=this.attrs;this.attrs.title&&!i&&console.warn("`title` attribute was passed to Tooltip component. Was this intentional? Tooltip content should be passed to the `text` attr instead.");const u=this.getRealText();if(u!==this.oldText&&(this.oldText=u,this.shouldRecreateTooltip=!0),r!==this.oldVisibility&&(this.oldVisibility=this.attrs.tooltipVisible,this.shouldChangeTooltipVisibility=!0),void 0===e)throw new Error("Tooltip component was provided with no direct child DOM element. Tooltips must contain a single direct DOM node to attach to.");if(1!==e.length)throw new Error("Tooltip component was either passed more than one or no child node.\n\nPlease wrap multiple children in another element, such as a
-1)s&&s.push(a);else if(c=gt(a),i=Ct(d.appendChild(a),"script"),c&&Dt(i),n)for(u=0;a=i[u++];)Et.test(a.type||"")&&n.push(a);return d}var It=/^([^.]*)(?:\.(.+)|)/;function Ot(){return!0}function Lt(){return!1}function $t(t,e,n,r,s,a){var i,o;if("object"==typeof e){for(o in"string"!=typeof n&&(r=r||n,n=void 0),e)$t(t,o,n,r,e[o],a);return t}if(null==r&&null==s?(s=n,r=n=void 0):null==s&&("string"==typeof n?(s=r,r=void 0):(s=r,r=n,n=void 0)),!1===s)s=Lt;else if(!s)return t;return 1===a&&(i=s,s=function(t){return _().off(t),i.apply(this,arguments)},s.guid=i.guid||(i.guid=_.guid++)),t.each((function(){_.event.add(this,e,s,r,n)}))}function jt(t,e,n){n?(ot.set(t,e,!1),_.event.add(t,e,{namespace:!1,handler:function(t){var n,r=ot.get(this,e);if(1&t.isTrigger&&this[e]){if(r)(_.event.special[e]||{}).delegateType&&t.stopPropagation();else if(r=o.call(arguments),ot.set(this,e,r),this[e](),n=ot.get(this,e),ot.set(this,e,!1),r!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else r&&(ot.set(this,e,_.event.trigger(r[0],r.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Ot)}})):void 0===ot.get(t,e)&&_.event.add(t,e,Ot)}_.event={global:{},add:function(t,e,n,r,s){var a,i,o,l,c,u,d,m,h,p,f,g=ot.get(t);if(at(t))for(n.handler&&(n=(a=n).handler,s=a.selector),s&&_.find.matchesSelector(ft,s),n.guid||(n.guid=_.guid++),(l=g.events)||(l=g.events=Object.create(null)),(i=g.handle)||(i=g.handle=function(e){return void 0!==_&&_.event.triggered!==e.type?_.event.dispatch.apply(t,arguments):void 0}),c=(e=(e||"").match(V)||[""]).length;c--;)h=f=(o=It.exec(e[c])||[])[1],p=(o[2]||"").split(".").sort(),h&&(d=_.event.special[h]||{},h=(s?d.delegateType:d.bindType)||h,d=_.event.special[h]||{},u=_.extend({type:h,origType:f,data:r,handler:n,guid:n.guid,selector:s,needsContext:s&&_.expr.match.needsContext.test(s),namespace:p.join(".")},a),(m=l[h])||((m=l[h]=[]).delegateCount=0,d.setup&&!1!==d.setup.call(t,r,p,i)||t.addEventListener&&t.addEventListener(h,i)),d.add&&(d.add.call(t,u),u.handler.guid||(u.handler.guid=n.guid)),s?m.splice(m.delegateCount++,0,u):m.push(u),_.event.global[h]=!0)},remove:function(t,e,n,r,s){var a,i,o,l,c,u,d,m,h,p,f,g=ot.hasData(t)&&ot.get(t);if(g&&(l=g.events)){for(c=(e=(e||"").match(V)||[""]).length;c--;)if(h=f=(o=It.exec(e[c])||[])[1],p=(o[2]||"").split(".").sort(),h){for(d=_.event.special[h]||{},m=l[h=(r?d.delegateType:d.bindType)||h]||[],o=o[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=a=m.length;a--;)u=m[a],!s&&f!==u.origType||n&&n.guid!==u.guid||o&&!o.test(u.namespace)||r&&r!==u.selector&&("**"!==r||!u.selector)||(m.splice(a,1),u.selector&&m.delegateCount--,d.remove&&d.remove.call(t,u));i&&!m.length&&(d.teardown&&!1!==d.teardown.call(t,p,g.handle)||_.removeEvent(t,h,g.handle),delete l[h])}else for(h in l)_.event.remove(t,h+e[c],n,r,!0);_.isEmptyObject(l)&&ot.remove(t,"handle events")}},dispatch:function(t){var e,n,r,s,a,i,o=new Array(arguments.length),l=_.event.fix(t),c=(ot.get(this,"events")||Object.create(null))[l.type]||[],u=_.event.special[l.type]||{};for(o[0]=l,e=1;e1)}}),_.Tween=de,de.prototype={constructor:de,init:function(t,e,n,r,s,a){this.elem=t,this.prop=n,this.easing=s||_.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=r,this.unit=a||(_.cssNumber[n]?"":"px")},cur:function(){var t=de.propHooks[this.prop];return t&&t.get?t.get(this):de.propHooks._default.get(this)},run:function(t){var e,n=de.propHooks[this.prop];return this.options.duration?this.pos=e=_.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):de.propHooks._default.set(this),this}},de.prototype.init.prototype=de.prototype,de.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=_.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){_.fx.step[t.prop]?_.fx.step[t.prop](t):1!==t.elem.nodeType||!_.cssHooks[t.prop]&&null==t.elem.style[se(t.prop)]?t.elem[t.prop]=t.now:_.style(t.elem,t.prop,t.now+t.unit)}}},de.propHooks.scrollTop=de.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},_.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},_.fx=de.prototype.init,_.fx.step={};var me,he,pe=/^(?:toggle|show|hide)$/,fe=/queueHooks$/;function ge(){he&&(!1===y.hidden&&r.requestAnimationFrame?r.requestAnimationFrame(ge):r.setTimeout(ge,_.fx.interval),_.fx.tick())}function ve(){return r.setTimeout((function(){me=void 0})),me=Date.now()}function be(t,e){var n,r=0,s={height:t};for(e=e?1:0;r<4;r+=2-e)s["margin"+(n=pt[r])]=s["padding"+n]=t;return e&&(s.opacity=s.width=t),s}function ye(t,e,n){for(var r,s=(we.tweeners[e]||[]).concat(we.tweeners["*"]),a=0,i=s.length;a1)},removeAttr:function(t){return this.each((function(){_.removeAttr(this,t)}))}}),_.extend({attr:function(t,e,n){var r,s,a=t.nodeType;if(3!==a&&8!==a&&2!==a)return void 0===t.getAttribute?_.prop(t,e,n):(1===a&&_.isXMLDoc(t)||(s=_.attrHooks[e.toLowerCase()]||(_.expr.match.bool.test(e)?xe:void 0)),void 0!==n?null===n?void _.removeAttr(t,e):s&&"set"in s&&void 0!==(r=s.set(t,n,e))?r:(t.setAttribute(e,n+""),n):s&&"get"in s&&null!==(r=s.get(t,e))?r:null==(r=_.find.attr(t,e))?void 0:r)},attrHooks:{type:{set:function(t,e){if(!g.radioValue&&"radio"===e&&E(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,r=0,s=e&&e.match(V);if(s&&1===t.nodeType)for(;n=s[r++];)t.removeAttribute(n)}}),xe={set:function(t,e,n){return!1===e?_.removeAttr(t,n):t.setAttribute(n,n),n}},_.each(_.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=Ae[e]||_.find.attr;Ae[e]=function(t,e,r){var s,a,i=e.toLowerCase();return r||(a=Ae[i],Ae[i]=s,s=null!=n(t,e,r)?i:null,Ae[i]=a),s}}));var Ne=/^(?:input|select|textarea|button)$/i,ke=/^(?:a|area)$/i;function _e(t){return(t.match(V)||[]).join(" ")}function Se(t){return t.getAttribute&&t.getAttribute("class")||""}function Ee(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(V)||[]}_.fn.extend({prop:function(t,e){return tt(this,_.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[_.propFix[t]||t]}))}}),_.extend({prop:function(t,e,n){var r,s,a=t.nodeType;if(3!==a&&8!==a&&2!==a)return 1===a&&_.isXMLDoc(t)||(e=_.propFix[e]||e,s=_.propHooks[e]),void 0!==n?s&&"set"in s&&void 0!==(r=s.set(t,n,e))?r:t[e]=n:s&&"get"in s&&null!==(r=s.get(t,e))?r:t[e]},propHooks:{tabIndex:{get:function(t){var e=_.find.attr(t,"tabindex");return e?parseInt(e,10):Ne.test(t.nodeName)||ke.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),g.optSelected||(_.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),_.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){_.propFix[this.toLowerCase()]=this})),_.fn.extend({addClass:function(t){var e,n,r,s,a,i;return v(t)?this.each((function(e){_(this).addClass(t.call(this,e,Se(this)))})):(e=Ee(t)).length?this.each((function(){if(r=Se(this),n=1===this.nodeType&&" "+_e(r)+" "){for(a=0;a