diff --git a/framework/core/js/dist/common/components/SearchModal.js b/framework/core/js/dist/common/components/SearchModal.js index 9c090700d..46efa2511 100644 --- a/framework/core/js/dist/common/components/SearchModal.js +++ b/framework/core/js/dist/common/components/SearchModal.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkflarum_core=self.webpackChunkflarum_core||[]).push([[485],{7085:(e,t,s)=>{s.r(t),s.d(t,{default:()=>A});var r=s(8805),a=s(5114),i=s(2855),o=s(6732),c=s(3920),n=s(117),u=s(7882),l=s(3092),h=s(4311),d=s(4164),p=s(43),v=s(6064),g=s(6500);class A extends i.A{constructor(){super(...arguments),(0,r.A)(this,"searchState",void 0),(0,r.A)(this,"query",void 0),(0,r.A)(this,"sources",void 0),(0,r.A)(this,"activeSource",void 0),(0,r.A)(this,"loadingSources",[]),(0,r.A)(this,"index",0),(0,r.A)(this,"navigator",void 0),(0,r.A)(this,"searchTimeout",void 0),(0,r.A)(this,"inputScroll",(0,h.A)(0)),(0,r.A)(this,"gambitsAutocomplete",{})}oninit(e){super.oninit(e),this.searchState=this.attrs.searchState,this.sources=this.attrs.sources,this.activeSource=(0,h.A)(this.defaultActiveSource()&&this.sources.find((e=>e.resource===this.defaultActiveSource()))||this.sources[0]),this.query=(0,h.A)(this.prefill(this.searchState.getValue()||"").trim())}title(){return a.A.translator.trans("core.lib.search.title")}className(){return"SearchModal Modal--flat"}content(){this.gambitsAutocomplete[this.activeSource().resource]||=new g.A(this.activeSource().resource,(()=>this.inputElement()),this.query,(e=>this.search(e)));const e=(0,n.A)(a.A.translator.trans("core.lib.search.placeholder"));return m("div",{className:"Modal-body SearchModal-body"},m("div",{className:"SearchModal-form"},m(u.A,{key:"search",type:"search",loading:!!this.loadingSources.length,clearable:!0,clearLabel:a.A.translator.trans("core.lib.header.search_clear_button_accessible_label"),prefixIcon:"fas fa-search","aria-label":e,placeholder:e,value:this.query(),onchange:e=>{this.query(e),this.inputScroll(this.inputElement()[0]?.scrollLeft??0)},inputAttrs:{className:"SearchModal-input"},renderInput:e=>m("[",null,m("input",Object.assign({},e,{onscroll:e=>this.inputScroll(e.target.scrollLeft)})),m("div",{className:"SearchModal-visual-wrapper"},m("div",{className:"SearchModal-visual-input",style:{left:"-"+this.inputScroll()+"px"}},this.gambifyInput())))})),this.tabs())}tabs(){return m("div",{className:"Tabs"},m("div",{className:"Tabs-nav"},this.tabItems().toArray()),m("div",{className:"Tabs-content SearchModal-tabs-content"},this.activeTabItems().toArray()))}tabItems(){const e=new v.A;return this.sources?.map(((t,s)=>e.add(t.resource,m(l.A,{className:"Button Button--link",active:this.activeSource()===t,onclick:()=>this.switchSource(t)},t.title()),100-s))),e}activeTabItems(){const e=new v.A,t=this.loadingSources.includes(this.activeSource().resource),s=!!this.query()&&!t,r=this.gambits(),i=this.activeSource().fullPage(this.query()),o=this.activeSource()?.view(this.query()),c=this.activeSource().customGrouping();return s&&i&&e.add("fullPageLink",m("div",{className:"SearchModal-section"},m("hr",{className:"Modal-divider"}),m("ul",{className:"Dropdown-menu SearchModal-fullPage"},i)),80),r.length&&e.add("gambits",m("div",{className:"SearchModal-section"},m("hr",{className:"Modal-divider"}),m("ul",{className:"Dropdown-menu SearchModal-options","aria-live":r.length?"polite":void 0},m("li",{className:"Dropdown-header"},a.A.translator.trans("core.lib.search.options_heading")),r)),60),e.add("results",m("div",{className:"SearchModal-section"},m("hr",{className:"Modal-divider"}),m("ul",{className:"Dropdown-menu SearchModal-results","aria-live":s?"polite":void 0},!c&&m("li",{className:"Dropdown-header"},a.A.translator.trans("core.lib.search.preview_heading")),!s&&m("li",{className:"Dropdown-message"},m(d.A,{icon:"fas fa-search"},a.A.translator.trans("core.lib.search.no_search_text"))),s&&o,s&&!o?.length&&m("li",{className:"Dropdown-message"},m(d.A,{icon:"far fa-tired"},a.A.translator.trans("core.lib.search.no_results_text"))),t&&m("li",{className:"Dropdown-message"},m(p.A,null)))),40),e}switchSource(e){this.activeSource()!==e&&(this.activeSource(e),this.search(this.query()),this.inputElement().focus(),m.redraw())}gambits(){return this.gambitsAutocomplete[this.activeSource().resource].suggestions(this.query())}gambifyInput(){const e=this.query();let t=e;a.A.search.gambits.match(this.activeSource().resource,e,((e,s,r,a)=>{t=t.replace(a,`${a}`)}));const s=[];return t.split(/(.*?<\/mark>)/).forEach((e=>{e.startsWith("")?s.push(m("mark",null,e.replace(/<\/?mark>/g,""))):s.push(e)})),s}onupdate(e){super.onupdate(e),this.setIndex(this.getCurrentNumericIndex());const t=this;this.$(".Dropdown-menu").on("mouseenter","> li:not(.Dropdown-header):not(.Dropdown-message)",(function(){t.setIndex(t.selectableItems().index(this))})),this.sources}oncreate(e){if(super.oncreate(e),!this.sources?.length)return;const t=this.search.bind(this);this.setIndex(this.getCurrentNumericIndex());const s=this.inputElement();this.navigator=new o.A,this.navigator.onUp((()=>this.setIndex(this.getCurrentNumericIndex()-1,!0))).onDown((()=>this.setIndex(this.getCurrentNumericIndex()+1,!0))).onSelect(this.selectResult.bind(this),!0).onCancel(this.clear.bind(this)).bindTo(s),s.on("input focus",(function(){t(this.value.toLowerCase())}))}onremove(e){this.searchState.setValue(this.query()),super.onremove(e)}search(e){if(!e)return;const t=this.activeSource();this.searchTimeout&&clearTimeout(this.searchTimeout),this.searchTimeout=window.setTimeout((()=>{if(!t.isCached(e)){if(e.length>=c.A.MIN_SEARCH_LEN){if(!t.search)return;this.loadingSources.push(t.resource),t.search(e,A.LIMIT).then((()=>{this.loadingSources=this.loadingSources.filter((e=>e!==t.resource)),m.redraw()}))}this.searchState.cache(e),m.redraw()}}),250)}selectResult(){this.searchTimeout&&clearTimeout(this.searchTimeout),this.loadingSources=[];const e=this.getItem(this.index);let t=null;if(e.attr("data-id")){const s=e.attr("data-id");t=s&&this.activeSource().gotoItem(s)}else e.find("a").length&&(t=e.find("a").attr("href"));this.query()&&t?m.route.set(t):e.find("button")[0].click()}clear(){this.query("")}selectableItems(){return this.$(".Dropdown-menu > li:not(.Dropdown-header):not(.Dropdown-message)")}getCurrentNumericIndex(){return Math.max(0,this.selectableItems().index(this.getItem(this.index)))}getItem(e){const t=this.selectableItems();let s=t.filter(`[data-index="${e}"]`);return s.length||(s=t.eq(e)),s}setIndex(e,t){void 0===t&&(t=!1);const s=this.selectableItems(),r=s.parent();let a=e;e<0?a=s.length-1:e>=s.length&&(a=0);const i=s.removeClass("active").eq(a).addClass("active");if(this.index=parseInt(i.attr("data-index"))||a,t&&r){const e=r.scrollTop(),t=r.offset().top,s=t+r.outerHeight(),a=i.offset().top,o=a+i.outerHeight();let c;as&&(c=e-s+o+parseInt(r.css("padding-bottom"),10)),void 0!==c&&r.stop(!0).animate({scrollTop:c},100)}}inputElement(){return this.$(".SearchModal-input")}defaultActiveSource(){const e=a.A.current.data.routeName&&["discussion","discussion.near"].includes(a.A.current.data.routeName)&&a.A.current.data.discussion,t=a.A.current.data.routeName&&a.A.current.data.routeName.includes("user.posts")&&a.A.current.data.user,s=a.A.current.data.routeName&&"posts"===a.A.current.data.routeName;return e||t||s?"posts":null}defaultFilters(){const e={};return this.sources.forEach((t=>{e[t.resource]={}})),a.A.current.data.routeName&&["discussion","discussion.near"].includes(a.A.current.data.routeName)&&a.A.current.data.discussion&&(e.posts.discussion=a.A.current.data.discussion.id()),a.A.current.data.routeName&&a.A.current.data.routeName.includes("user.posts")&&a.A.current.data.user&&(e.posts.author=a.A.current.data.user.username()),e}prefill(e){const t=a.A.search.gambits.from(this.activeSource().resource,e,this.defaultFilters()[this.activeSource().resource]||{});return e.includes(t.replace(e,"").trim())?e:t}}(0,r.A)(A,"LIMIT",6),flarum.reg.add("core","common/components/SearchModal",A)}}]); +"use strict";(self.webpackChunkflarum_core=self.webpackChunkflarum_core||[]).push([[485],{7085:(e,t,s)=>{s.r(t),s.d(t,{default:()=>A});var r=s(8805),a=s(5114),i=s(2855),o=s(6732),c=s(3920),n=s(117),u=s(7882),l=s(3092),h=s(4311),d=s(4164),p=s(43),v=s(6064),g=s(6500);class A extends i.A{constructor(){super(...arguments),(0,r.A)(this,"searchState",void 0),(0,r.A)(this,"query",void 0),(0,r.A)(this,"sources",void 0),(0,r.A)(this,"activeSource",void 0),(0,r.A)(this,"loadingSources",[]),(0,r.A)(this,"index",0),(0,r.A)(this,"navigator",void 0),(0,r.A)(this,"searchTimeout",void 0),(0,r.A)(this,"inputScroll",(0,h.A)(0)),(0,r.A)(this,"gambitsAutocomplete",{})}oninit(e){super.oninit(e),this.searchState=this.attrs.searchState,this.sources=this.attrs.sources,this.activeSource=(0,h.A)(this.defaultActiveSource()&&this.sources.find((e=>e.resource===this.defaultActiveSource()))||this.sources[0]),this.query=(0,h.A)(this.prefill(this.searchState.getValue()||"").trim())}title(){return a.A.translator.trans("core.lib.search.title")}className(){return"SearchModal Modal--flat"}content(){this.gambitsAutocomplete[this.activeSource().resource]||=new g.A(this.activeSource().resource,(()=>this.inputElement()),this.query,(e=>this.search(e)));const e=(0,n.A)(a.A.translator.trans("core.lib.search.placeholder"));return m("div",{className:"Modal-body SearchModal-body"},m("div",{className:"SearchModal-form"},m(u.A,{key:"search",type:"search",loading:!!this.loadingSources.length,clearable:!0,clearLabel:a.A.translator.trans("core.lib.search.search_clear_button_accessible_label"),prefixIcon:"fas fa-search","aria-label":e,placeholder:e,value:this.query(),onchange:e=>{this.query(e),this.inputScroll(this.inputElement()[0]?.scrollLeft??0)},inputAttrs:{className:"SearchModal-input"},renderInput:e=>m("[",null,m("input",Object.assign({},e,{onscroll:e=>this.inputScroll(e.target.scrollLeft)})),m("div",{className:"SearchModal-visual-wrapper"},m("div",{className:"SearchModal-visual-input",style:{left:"-"+this.inputScroll()+"px"}},this.gambifyInput())))})),this.tabs())}tabs(){return m("div",{className:"Tabs"},m("div",{className:"Tabs-nav"},this.tabItems().toArray()),m("div",{className:"Tabs-content SearchModal-tabs-content"},this.activeTabItems().toArray()))}tabItems(){const e=new v.A;return this.sources?.map(((t,s)=>e.add(t.resource,m(l.A,{className:"Button Button--link",active:this.activeSource()===t,onclick:()=>this.switchSource(t)},t.title()),100-s))),e}activeTabItems(){const e=new v.A,t=this.loadingSources.includes(this.activeSource().resource),s=!!this.query()&&!t,r=this.gambits(),i=this.activeSource().fullPage(this.query()),o=this.activeSource()?.view(this.query()),c=this.activeSource().customGrouping();return s&&i&&e.add("fullPageLink",m("div",{className:"SearchModal-section"},m("hr",{className:"Modal-divider"}),m("ul",{className:"Dropdown-menu SearchModal-fullPage"},i)),80),r.length&&e.add("gambits",m("div",{className:"SearchModal-section"},m("hr",{className:"Modal-divider"}),m("ul",{className:"Dropdown-menu SearchModal-options","aria-live":r.length?"polite":void 0},m("li",{className:"Dropdown-header"},a.A.translator.trans("core.lib.search.options_heading")),r)),60),e.add("results",m("div",{className:"SearchModal-section"},m("hr",{className:"Modal-divider"}),m("ul",{className:"Dropdown-menu SearchModal-results","aria-live":s?"polite":void 0},!c&&m("li",{className:"Dropdown-header"},a.A.translator.trans("core.lib.search.preview_heading")),!s&&m("li",{className:"Dropdown-message"},m(d.A,{icon:"fas fa-search"},a.A.translator.trans("core.lib.search.no_search_text"))),s&&o,s&&!o?.length&&m("li",{className:"Dropdown-message"},m(d.A,{icon:"far fa-tired"},a.A.translator.trans("core.lib.search.no_results_text"))),t&&m("li",{className:"Dropdown-message"},m(p.A,null)))),40),e}switchSource(e){this.activeSource()!==e&&(this.activeSource(e),this.search(this.query()),this.inputElement().focus(),m.redraw())}gambits(){return this.gambitsAutocomplete[this.activeSource().resource].suggestions(this.query())}gambifyInput(){const e=this.query();let t=e;a.A.search.gambits.match(this.activeSource().resource,e,((e,s,r,a)=>{t=t.replace(a,`${a}`)}));const s=[];return t.split(/(.*?<\/mark>)/).forEach((e=>{e.startsWith("")?s.push(m("mark",null,e.replace(/<\/?mark>/g,""))):s.push(e)})),s}onupdate(e){super.onupdate(e),this.setIndex(this.getCurrentNumericIndex());const t=this;this.$(".Dropdown-menu").on("mouseenter","> li:not(.Dropdown-header):not(.Dropdown-message)",(function(){t.setIndex(t.selectableItems().index(this))})),this.sources}oncreate(e){if(super.oncreate(e),!this.sources?.length)return;const t=this.search.bind(this);this.setIndex(this.getCurrentNumericIndex());const s=this.inputElement();this.navigator=new o.A,this.navigator.onUp((()=>this.setIndex(this.getCurrentNumericIndex()-1,!0))).onDown((()=>this.setIndex(this.getCurrentNumericIndex()+1,!0))).onSelect(this.selectResult.bind(this),!0).onCancel(this.clear.bind(this)).bindTo(s),s.on("input focus",(function(){t(this.value.toLowerCase())}))}onremove(e){this.searchState.setValue(this.query()),super.onremove(e)}search(e){if(!e)return;const t=this.activeSource();this.searchTimeout&&clearTimeout(this.searchTimeout),this.searchTimeout=window.setTimeout((()=>{if(!t.isCached(e)){if(e.length>=c.A.MIN_SEARCH_LEN){if(!t.search)return;this.loadingSources.push(t.resource),t.search(e,A.LIMIT).then((()=>{this.loadingSources=this.loadingSources.filter((e=>e!==t.resource)),m.redraw()}))}this.searchState.cache(e),m.redraw()}}),250)}selectResult(){this.searchTimeout&&clearTimeout(this.searchTimeout),this.loadingSources=[];const e=this.getItem(this.index);let t=null;if(e.attr("data-id")){const s=e.attr("data-id");t=s&&this.activeSource().gotoItem(s)}else e.find("a").length&&(t=e.find("a").attr("href"));this.query()&&t?m.route.set(t):e.find("button")[0].click()}clear(){this.query("")}selectableItems(){return this.$(".Dropdown-menu > li:not(.Dropdown-header):not(.Dropdown-message)")}getCurrentNumericIndex(){return Math.max(0,this.selectableItems().index(this.getItem(this.index)))}getItem(e){const t=this.selectableItems();let s=t.filter(`[data-index="${e}"]`);return s.length||(s=t.eq(e)),s}setIndex(e,t){void 0===t&&(t=!1);const s=this.selectableItems(),r=s.parent();let a=e;e<0?a=s.length-1:e>=s.length&&(a=0);const i=s.removeClass("active").eq(a).addClass("active");if(this.index=parseInt(i.attr("data-index"))||a,t&&r){const e=r.scrollTop(),t=r.offset().top,s=t+r.outerHeight(),a=i.offset().top,o=a+i.outerHeight();let c;as&&(c=e-s+o+parseInt(r.css("padding-bottom"),10)),void 0!==c&&r.stop(!0).animate({scrollTop:c},100)}}inputElement(){return this.$(".SearchModal-input")}defaultActiveSource(){const e=a.A.current.data.routeName&&["discussion","discussion.near"].includes(a.A.current.data.routeName)&&a.A.current.data.discussion,t=a.A.current.data.routeName&&a.A.current.data.routeName.includes("user.posts")&&a.A.current.data.user,s=a.A.current.data.routeName&&"posts"===a.A.current.data.routeName;return e||t||s?"posts":null}defaultFilters(){const e={};return this.sources.forEach((t=>{e[t.resource]={}})),a.A.current.data.routeName&&["discussion","discussion.near"].includes(a.A.current.data.routeName)&&a.A.current.data.discussion&&(e.posts.discussion=a.A.current.data.discussion.id()),a.A.current.data.routeName&&a.A.current.data.routeName.includes("user.posts")&&a.A.current.data.user&&(e.posts.author=a.A.current.data.user.username()),e}prefill(e){const t=a.A.search.gambits.from(this.activeSource().resource,e,this.defaultFilters()[this.activeSource().resource]||{});return e.includes(t.replace(e,"").trim())?e:t}}(0,r.A)(A,"LIMIT",6),flarum.reg.add("core","common/components/SearchModal",A)}}]); //# sourceMappingURL=SearchModal.js.map \ No newline at end of file diff --git a/framework/core/js/dist/common/components/SearchModal.js.map b/framework/core/js/dist/common/components/SearchModal.js.map index 85ffa0903..4ae62753e 100644 --- a/framework/core/js/dist/common/components/SearchModal.js.map +++ b/framework/core/js/dist/common/components/SearchModal.js.map @@ -1 +1 @@ -{"version":3,"file":"common/components/SearchModal.js","mappings":"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","sources":["webpack://@flarum/core/./src/common/components/SearchModal.tsx"],"sourcesContent":["import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport app from '../app';\nimport FormModal from './FormModal';\nimport KeyboardNavigatable from '../utils/KeyboardNavigatable';\nimport SearchManager from '../SearchManager';\nimport extractText from '../utils/extractText';\nimport Input from './Input';\nimport Button from './Button';\nimport Stream from '../utils/Stream';\nimport InfoTile from './InfoTile';\nimport LoadingIndicator from './LoadingIndicator';\nimport ItemList from '../utils/ItemList';\nimport GambitsAutocomplete from '../utils/GambitsAutocomplete';\nexport default class SearchModal extends FormModal {\n constructor() {\n super(...arguments);\n _defineProperty(this, \"searchState\", void 0);\n _defineProperty(this, \"query\", void 0);\n /**\n * An array of SearchSources.\n */\n _defineProperty(this, \"sources\", void 0);\n /**\n * The key of the currently-active search source.\n */\n _defineProperty(this, \"activeSource\", void 0);\n /**\n * The sources that are still loading results.\n */\n _defineProperty(this, \"loadingSources\", []);\n /**\n * The index of the currently-selected
  • in the results list. This can be\n * a unique string (to account for the fact that an item's position may jump\n * around as new results load), but otherwise it will be numeric (the\n * sequential position within the list).\n */\n _defineProperty(this, \"index\", 0);\n _defineProperty(this, \"navigator\", void 0);\n _defineProperty(this, \"searchTimeout\", void 0);\n _defineProperty(this, \"inputScroll\", Stream(0));\n _defineProperty(this, \"gambitsAutocomplete\", {});\n }\n oninit(vnode) {\n super.oninit(vnode);\n this.searchState = this.attrs.searchState;\n this.sources = this.attrs.sources;\n this.activeSource = Stream(this.defaultActiveSource() ? this.sources.find(source => source.resource === this.defaultActiveSource()) || this.sources[0] : this.sources[0]);\n this.query = Stream(this.prefill(this.searchState.getValue() || '').trim());\n }\n title() {\n return app.translator.trans('core.lib.search.title');\n }\n className() {\n return 'SearchModal Modal--flat';\n }\n content() {\n this.gambitsAutocomplete[this.activeSource().resource] ||= new GambitsAutocomplete(this.activeSource().resource, () => this.inputElement(), this.query, value => this.search(value));\n const searchLabel = extractText(app.translator.trans('core.lib.search.placeholder'));\n return m(\"div\", {\n className: \"Modal-body SearchModal-body\"\n }, m(\"div\", {\n className: \"SearchModal-form\"\n }, m(Input, {\n key: \"search\",\n type: \"search\",\n loading: !!this.loadingSources.length,\n clearable: true,\n clearLabel: app.translator.trans('core.lib.header.search_clear_button_accessible_label'),\n prefixIcon: \"fas fa-search\",\n \"aria-label\": searchLabel,\n placeholder: searchLabel,\n value: this.query(),\n onchange: value => {\n this.query(value);\n this.inputScroll(this.inputElement()[0]?.scrollLeft ?? 0);\n },\n inputAttrs: {\n className: 'SearchModal-input'\n },\n renderInput: attrs => m('[', null, m(\"input\", Object.assign({}, attrs, {\n onscroll: e => this.inputScroll(e.target.scrollLeft)\n })), m(\"div\", {\n className: \"SearchModal-visual-wrapper\"\n }, m(\"div\", {\n className: \"SearchModal-visual-input\",\n style: {\n left: '-' + this.inputScroll() + 'px'\n }\n }, this.gambifyInput())))\n })), this.tabs());\n }\n tabs() {\n return m(\"div\", {\n className: \"Tabs\"\n }, m(\"div\", {\n className: \"Tabs-nav\"\n }, this.tabItems().toArray()), m(\"div\", {\n className: \"Tabs-content SearchModal-tabs-content\"\n }, this.activeTabItems().toArray()));\n }\n tabItems() {\n const items = new ItemList();\n this.sources?.map((source, index) => items.add(source.resource, m(Button, {\n className: \"Button Button--link\",\n active: this.activeSource() === source,\n onclick: () => this.switchSource(source)\n }, source.title()), 100 - index));\n return items;\n }\n activeTabItems() {\n const items = new ItemList();\n const loading = this.loadingSources.includes(this.activeSource().resource);\n const shouldShowResults = !!this.query() && !loading;\n const gambits = this.gambits();\n const fullPageLink = this.activeSource().fullPage(this.query());\n const results = this.activeSource()?.view(this.query());\n const customGrouping = this.activeSource().customGrouping();\n if (shouldShowResults && fullPageLink) {\n items.add('fullPageLink', m(\"div\", {\n className: \"SearchModal-section\"\n }, m(\"hr\", {\n className: \"Modal-divider\"\n }), m(\"ul\", {\n className: \"Dropdown-menu SearchModal-fullPage\"\n }, fullPageLink)), 80);\n }\n if (!!gambits.length) {\n items.add('gambits', m(\"div\", {\n className: \"SearchModal-section\"\n }, m(\"hr\", {\n className: \"Modal-divider\"\n }), m(\"ul\", {\n className: \"Dropdown-menu SearchModal-options\",\n \"aria-live\": gambits.length ? 'polite' : undefined\n }, m(\"li\", {\n className: \"Dropdown-header\"\n }, app.translator.trans('core.lib.search.options_heading')), gambits)), 60);\n }\n items.add('results', m(\"div\", {\n className: \"SearchModal-section\"\n }, m(\"hr\", {\n className: \"Modal-divider\"\n }), m(\"ul\", {\n className: \"Dropdown-menu SearchModal-results\",\n \"aria-live\": shouldShowResults ? 'polite' : undefined\n }, !customGrouping && m(\"li\", {\n className: \"Dropdown-header\"\n }, app.translator.trans('core.lib.search.preview_heading')), !shouldShowResults && m(\"li\", {\n className: \"Dropdown-message\"\n }, m(InfoTile, {\n icon: \"fas fa-search\"\n }, app.translator.trans('core.lib.search.no_search_text'))), shouldShowResults && results, shouldShowResults && !results?.length && m(\"li\", {\n className: \"Dropdown-message\"\n }, m(InfoTile, {\n icon: \"far fa-tired\"\n }, app.translator.trans('core.lib.search.no_results_text'))), loading && m(\"li\", {\n className: \"Dropdown-message\"\n }, m(LoadingIndicator, null)))), 40);\n return items;\n }\n switchSource(source) {\n if (this.activeSource() !== source) {\n this.activeSource(source);\n this.search(this.query());\n this.inputElement().focus();\n m.redraw();\n }\n }\n gambits() {\n return this.gambitsAutocomplete[this.activeSource().resource].suggestions(this.query());\n }\n\n /**\n * Transforms a simple search text to wrap valid gambits in a mark tag.\n * @example `lorem ipsum is:unread dolor` => `lorem ipsum is:unread dolor`\n */\n gambifyInput() {\n const query = this.query();\n let marked = query;\n app.search.gambits.match(this.activeSource().resource, query, (gambit, matches, negate, bit) => {\n marked = marked.replace(bit, `${bit}`);\n });\n const jsx = [];\n marked.split(/(.*?<\\/mark>)/).forEach(chunk => {\n if (chunk.startsWith('')) {\n jsx.push(m(\"mark\", null, chunk.replace(/<\\/?mark>/g, '')));\n } else {\n jsx.push(chunk);\n }\n });\n return jsx;\n }\n onupdate(vnode) {\n super.onupdate(vnode);\n\n // Highlight the item that is currently selected.\n this.setIndex(this.getCurrentNumericIndex());\n const component = this;\n this.$('.Dropdown-menu')\n // Whenever the mouse is hovered over a search result, highlight it.\n .on('mouseenter', '> li:not(.Dropdown-header):not(.Dropdown-message)', function () {\n component.setIndex(component.selectableItems().index(this));\n });\n\n // If there are no sources, the search view is not shown.\n if (!this.sources?.length) return;\n }\n oncreate(vnode) {\n super.oncreate(vnode);\n\n // If there are no sources, we shouldn't initialize logic for\n // search elements, as they will not be shown.\n if (!this.sources?.length) return;\n const search = this.search.bind(this);\n\n // Highlight the item that is currently selected.\n this.setIndex(this.getCurrentNumericIndex());\n const $input = this.inputElement();\n this.navigator = new KeyboardNavigatable();\n this.navigator.onUp(() => this.setIndex(this.getCurrentNumericIndex() - 1, true)).onDown(() => this.setIndex(this.getCurrentNumericIndex() + 1, true)).onSelect(this.selectResult.bind(this), true).onCancel(this.clear.bind(this)).bindTo($input);\n\n // Handle input key events on the search input, triggering results to load.\n $input.on('input focus', function () {\n search(this.value.toLowerCase());\n });\n }\n onremove(vnode) {\n this.searchState.setValue(this.query());\n super.onremove(vnode);\n }\n search(query) {\n if (!query) return;\n const source = this.activeSource();\n if (this.searchTimeout) clearTimeout(this.searchTimeout);\n this.searchTimeout = window.setTimeout(() => {\n if (source.isCached(query)) return;\n if (query.length >= SearchManager.MIN_SEARCH_LEN) {\n if (!source.search) return;\n this.loadingSources.push(source.resource);\n source.search(query, SearchModal.LIMIT).then(() => {\n this.loadingSources = this.loadingSources.filter(resource => resource !== source.resource);\n m.redraw();\n });\n }\n this.searchState.cache(query);\n m.redraw();\n }, 250);\n }\n\n /**\n * Navigate to the currently selected search result and close the list.\n */\n selectResult() {\n if (this.searchTimeout) clearTimeout(this.searchTimeout);\n this.loadingSources = [];\n const item = this.getItem(this.index);\n const isResult = !!item.attr('data-id');\n let selectedUrl = null;\n if (isResult) {\n const id = item.attr('data-id');\n selectedUrl = id && this.activeSource().gotoItem(id);\n } else if (item.find('a').length) {\n selectedUrl = item.find('a').attr('href');\n }\n const query = this.query();\n if (query && selectedUrl) {\n m.route.set(selectedUrl);\n } else {\n item.find('button')[0].click();\n }\n }\n\n /**\n * Clear the search\n */\n clear() {\n this.query('');\n }\n\n /**\n * Get all of the search result items that are selectable.\n */\n selectableItems() {\n return this.$('.Dropdown-menu > li:not(.Dropdown-header):not(.Dropdown-message)');\n }\n\n /**\n * Get the position of the currently selected search result item.\n * Returns zero if not found.\n */\n getCurrentNumericIndex() {\n return Math.max(0, this.selectableItems().index(this.getItem(this.index)));\n }\n\n /**\n * Get the
  • in the search results with the given index (numeric or named).\n */\n getItem(index) {\n const $items = this.selectableItems();\n let $item = $items.filter(`[data-index=\"${index}\"]`);\n if (!$item.length) {\n $item = $items.eq(index);\n }\n return $item;\n }\n\n /**\n * Set the currently-selected search result item to the one with the given\n * index.\n */\n setIndex(index, scrollToItem) {\n if (scrollToItem === void 0) {\n scrollToItem = false;\n }\n const $items = this.selectableItems();\n const $dropdown = $items.parent();\n let fixedIndex = index;\n if (index < 0) {\n fixedIndex = $items.length - 1;\n } else if (index >= $items.length) {\n fixedIndex = 0;\n }\n const $item = $items.removeClass('active').eq(fixedIndex).addClass('active');\n this.index = parseInt($item.attr('data-index')) || fixedIndex;\n if (scrollToItem && $dropdown) {\n const dropdownScroll = $dropdown.scrollTop();\n const dropdownTop = $dropdown.offset().top;\n const dropdownBottom = dropdownTop + $dropdown.outerHeight();\n const itemTop = $item.offset().top;\n const itemBottom = itemTop + $item.outerHeight();\n let scrollTop;\n if (itemTop < dropdownTop) {\n scrollTop = dropdownScroll - dropdownTop + itemTop - parseInt($dropdown.css('padding-top'), 10);\n } else if (itemBottom > dropdownBottom) {\n scrollTop = dropdownScroll - dropdownBottom + itemBottom + parseInt($dropdown.css('padding-bottom'), 10);\n }\n if (typeof scrollTop !== 'undefined') {\n $dropdown.stop(true).animate({\n scrollTop\n }, 100);\n }\n }\n }\n inputElement() {\n return this.$('.SearchModal-input');\n }\n defaultActiveSource() {\n const inDiscussion = app.current.data.routeName && ['discussion', 'discussion.near'].includes(app.current.data.routeName) && app.current.data.discussion;\n const inUser = app.current.data.routeName && app.current.data.routeName.includes('user.posts') && app.current.data.user;\n const inPosts = app.current.data.routeName && app.current.data.routeName === 'posts';\n if (inDiscussion || inUser || inPosts) {\n return 'posts';\n }\n return null;\n }\n defaultFilters() {\n const filters = {};\n this.sources.forEach(source => {\n filters[source.resource] = {};\n });\n if (app.current.data.routeName && ['discussion', 'discussion.near'].includes(app.current.data.routeName) && app.current.data.discussion) {\n filters.posts.discussion = app.current.data.discussion.id();\n }\n if (app.current.data.routeName && app.current.data.routeName.includes('user.posts') && app.current.data.user) {\n filters.posts.author = app.current.data.user.username();\n }\n return filters;\n }\n prefill(value) {\n const newQuery = app.search.gambits.from(this.activeSource().resource, value, this.defaultFilters()[this.activeSource().resource] || {});\n if (!value.includes(newQuery.replace(value, '').trim())) {\n return newQuery;\n }\n return value;\n }\n}\n_defineProperty(SearchModal, \"LIMIT\", 6);\nflarum.reg.add('core', 'common/components/SearchModal', SearchModal);"],"names":["SearchModal","constructor","super","arguments","this","oninit","vnode","searchState","attrs","sources","activeSource","defaultActiveSource","find","source","resource","query","prefill","getValue","trim","title","translator","trans","className","content","gambitsAutocomplete","inputElement","value","search","searchLabel","m","key","type","loading","loadingSources","length","clearable","clearLabel","prefixIcon","placeholder","onchange","inputScroll","scrollLeft","inputAttrs","renderInput","Object","assign","onscroll","e","target","style","left","gambifyInput","tabs","tabItems","toArray","activeTabItems","items","map","index","add","active","onclick","switchSource","includes","shouldShowResults","gambits","fullPageLink","fullPage","results","view","customGrouping","undefined","icon","focus","redraw","suggestions","marked","match","gambit","matches","negate","bit","replace","jsx","split","forEach","chunk","startsWith","push","onupdate","setIndex","getCurrentNumericIndex","component","$","on","selectableItems","oncreate","bind","$input","navigator","onUp","onDown","onSelect","selectResult","onCancel","clear","bindTo","toLowerCase","onremove","setValue","searchTimeout","clearTimeout","window","setTimeout","isCached","MIN_SEARCH_LEN","LIMIT","then","filter","cache","item","getItem","selectedUrl","attr","id","gotoItem","route","set","click","Math","max","$items","$item","eq","scrollToItem","$dropdown","parent","fixedIndex","removeClass","addClass","parseInt","dropdownScroll","scrollTop","dropdownTop","offset","top","dropdownBottom","outerHeight","itemTop","itemBottom","css","stop","animate","inDiscussion","current","data","routeName","discussion","inUser","user","inPosts","defaultFilters","filters","posts","author","username","newQuery","from","flarum","reg"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"common/components/SearchModal.js","mappings":"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","sources":["webpack://@flarum/core/./src/common/components/SearchModal.tsx"],"sourcesContent":["import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport app from '../app';\nimport FormModal from './FormModal';\nimport KeyboardNavigatable from '../utils/KeyboardNavigatable';\nimport SearchManager from '../SearchManager';\nimport extractText from '../utils/extractText';\nimport Input from './Input';\nimport Button from './Button';\nimport Stream from '../utils/Stream';\nimport InfoTile from './InfoTile';\nimport LoadingIndicator from './LoadingIndicator';\nimport ItemList from '../utils/ItemList';\nimport GambitsAutocomplete from '../utils/GambitsAutocomplete';\nexport default class SearchModal extends FormModal {\n constructor() {\n super(...arguments);\n _defineProperty(this, \"searchState\", void 0);\n _defineProperty(this, \"query\", void 0);\n /**\n * An array of SearchSources.\n */\n _defineProperty(this, \"sources\", void 0);\n /**\n * The key of the currently-active search source.\n */\n _defineProperty(this, \"activeSource\", void 0);\n /**\n * The sources that are still loading results.\n */\n _defineProperty(this, \"loadingSources\", []);\n /**\n * The index of the currently-selected
  • in the results list. This can be\n * a unique string (to account for the fact that an item's position may jump\n * around as new results load), but otherwise it will be numeric (the\n * sequential position within the list).\n */\n _defineProperty(this, \"index\", 0);\n _defineProperty(this, \"navigator\", void 0);\n _defineProperty(this, \"searchTimeout\", void 0);\n _defineProperty(this, \"inputScroll\", Stream(0));\n _defineProperty(this, \"gambitsAutocomplete\", {});\n }\n oninit(vnode) {\n super.oninit(vnode);\n this.searchState = this.attrs.searchState;\n this.sources = this.attrs.sources;\n this.activeSource = Stream(this.defaultActiveSource() ? this.sources.find(source => source.resource === this.defaultActiveSource()) || this.sources[0] : this.sources[0]);\n this.query = Stream(this.prefill(this.searchState.getValue() || '').trim());\n }\n title() {\n return app.translator.trans('core.lib.search.title');\n }\n className() {\n return 'SearchModal Modal--flat';\n }\n content() {\n this.gambitsAutocomplete[this.activeSource().resource] ||= new GambitsAutocomplete(this.activeSource().resource, () => this.inputElement(), this.query, value => this.search(value));\n const searchLabel = extractText(app.translator.trans('core.lib.search.placeholder'));\n return m(\"div\", {\n className: \"Modal-body SearchModal-body\"\n }, m(\"div\", {\n className: \"SearchModal-form\"\n }, m(Input, {\n key: \"search\",\n type: \"search\",\n loading: !!this.loadingSources.length,\n clearable: true,\n clearLabel: app.translator.trans('core.lib.search.search_clear_button_accessible_label'),\n prefixIcon: \"fas fa-search\",\n \"aria-label\": searchLabel,\n placeholder: searchLabel,\n value: this.query(),\n onchange: value => {\n this.query(value);\n this.inputScroll(this.inputElement()[0]?.scrollLeft ?? 0);\n },\n inputAttrs: {\n className: 'SearchModal-input'\n },\n renderInput: attrs => m('[', null, m(\"input\", Object.assign({}, attrs, {\n onscroll: e => this.inputScroll(e.target.scrollLeft)\n })), m(\"div\", {\n className: \"SearchModal-visual-wrapper\"\n }, m(\"div\", {\n className: \"SearchModal-visual-input\",\n style: {\n left: '-' + this.inputScroll() + 'px'\n }\n }, this.gambifyInput())))\n })), this.tabs());\n }\n tabs() {\n return m(\"div\", {\n className: \"Tabs\"\n }, m(\"div\", {\n className: \"Tabs-nav\"\n }, this.tabItems().toArray()), m(\"div\", {\n className: \"Tabs-content SearchModal-tabs-content\"\n }, this.activeTabItems().toArray()));\n }\n tabItems() {\n const items = new ItemList();\n this.sources?.map((source, index) => items.add(source.resource, m(Button, {\n className: \"Button Button--link\",\n active: this.activeSource() === source,\n onclick: () => this.switchSource(source)\n }, source.title()), 100 - index));\n return items;\n }\n activeTabItems() {\n const items = new ItemList();\n const loading = this.loadingSources.includes(this.activeSource().resource);\n const shouldShowResults = !!this.query() && !loading;\n const gambits = this.gambits();\n const fullPageLink = this.activeSource().fullPage(this.query());\n const results = this.activeSource()?.view(this.query());\n const customGrouping = this.activeSource().customGrouping();\n if (shouldShowResults && fullPageLink) {\n items.add('fullPageLink', m(\"div\", {\n className: \"SearchModal-section\"\n }, m(\"hr\", {\n className: \"Modal-divider\"\n }), m(\"ul\", {\n className: \"Dropdown-menu SearchModal-fullPage\"\n }, fullPageLink)), 80);\n }\n if (!!gambits.length) {\n items.add('gambits', m(\"div\", {\n className: \"SearchModal-section\"\n }, m(\"hr\", {\n className: \"Modal-divider\"\n }), m(\"ul\", {\n className: \"Dropdown-menu SearchModal-options\",\n \"aria-live\": gambits.length ? 'polite' : undefined\n }, m(\"li\", {\n className: \"Dropdown-header\"\n }, app.translator.trans('core.lib.search.options_heading')), gambits)), 60);\n }\n items.add('results', m(\"div\", {\n className: \"SearchModal-section\"\n }, m(\"hr\", {\n className: \"Modal-divider\"\n }), m(\"ul\", {\n className: \"Dropdown-menu SearchModal-results\",\n \"aria-live\": shouldShowResults ? 'polite' : undefined\n }, !customGrouping && m(\"li\", {\n className: \"Dropdown-header\"\n }, app.translator.trans('core.lib.search.preview_heading')), !shouldShowResults && m(\"li\", {\n className: \"Dropdown-message\"\n }, m(InfoTile, {\n icon: \"fas fa-search\"\n }, app.translator.trans('core.lib.search.no_search_text'))), shouldShowResults && results, shouldShowResults && !results?.length && m(\"li\", {\n className: \"Dropdown-message\"\n }, m(InfoTile, {\n icon: \"far fa-tired\"\n }, app.translator.trans('core.lib.search.no_results_text'))), loading && m(\"li\", {\n className: \"Dropdown-message\"\n }, m(LoadingIndicator, null)))), 40);\n return items;\n }\n switchSource(source) {\n if (this.activeSource() !== source) {\n this.activeSource(source);\n this.search(this.query());\n this.inputElement().focus();\n m.redraw();\n }\n }\n gambits() {\n return this.gambitsAutocomplete[this.activeSource().resource].suggestions(this.query());\n }\n\n /**\n * Transforms a simple search text to wrap valid gambits in a mark tag.\n * @example `lorem ipsum is:unread dolor` => `lorem ipsum is:unread dolor`\n */\n gambifyInput() {\n const query = this.query();\n let marked = query;\n app.search.gambits.match(this.activeSource().resource, query, (gambit, matches, negate, bit) => {\n marked = marked.replace(bit, `${bit}`);\n });\n const jsx = [];\n marked.split(/(.*?<\\/mark>)/).forEach(chunk => {\n if (chunk.startsWith('')) {\n jsx.push(m(\"mark\", null, chunk.replace(/<\\/?mark>/g, '')));\n } else {\n jsx.push(chunk);\n }\n });\n return jsx;\n }\n onupdate(vnode) {\n super.onupdate(vnode);\n\n // Highlight the item that is currently selected.\n this.setIndex(this.getCurrentNumericIndex());\n const component = this;\n this.$('.Dropdown-menu')\n // Whenever the mouse is hovered over a search result, highlight it.\n .on('mouseenter', '> li:not(.Dropdown-header):not(.Dropdown-message)', function () {\n component.setIndex(component.selectableItems().index(this));\n });\n\n // If there are no sources, the search view is not shown.\n if (!this.sources?.length) return;\n }\n oncreate(vnode) {\n super.oncreate(vnode);\n\n // If there are no sources, we shouldn't initialize logic for\n // search elements, as they will not be shown.\n if (!this.sources?.length) return;\n const search = this.search.bind(this);\n\n // Highlight the item that is currently selected.\n this.setIndex(this.getCurrentNumericIndex());\n const $input = this.inputElement();\n this.navigator = new KeyboardNavigatable();\n this.navigator.onUp(() => this.setIndex(this.getCurrentNumericIndex() - 1, true)).onDown(() => this.setIndex(this.getCurrentNumericIndex() + 1, true)).onSelect(this.selectResult.bind(this), true).onCancel(this.clear.bind(this)).bindTo($input);\n\n // Handle input key events on the search input, triggering results to load.\n $input.on('input focus', function () {\n search(this.value.toLowerCase());\n });\n }\n onremove(vnode) {\n this.searchState.setValue(this.query());\n super.onremove(vnode);\n }\n search(query) {\n if (!query) return;\n const source = this.activeSource();\n if (this.searchTimeout) clearTimeout(this.searchTimeout);\n this.searchTimeout = window.setTimeout(() => {\n if (source.isCached(query)) return;\n if (query.length >= SearchManager.MIN_SEARCH_LEN) {\n if (!source.search) return;\n this.loadingSources.push(source.resource);\n source.search(query, SearchModal.LIMIT).then(() => {\n this.loadingSources = this.loadingSources.filter(resource => resource !== source.resource);\n m.redraw();\n });\n }\n this.searchState.cache(query);\n m.redraw();\n }, 250);\n }\n\n /**\n * Navigate to the currently selected search result and close the list.\n */\n selectResult() {\n if (this.searchTimeout) clearTimeout(this.searchTimeout);\n this.loadingSources = [];\n const item = this.getItem(this.index);\n const isResult = !!item.attr('data-id');\n let selectedUrl = null;\n if (isResult) {\n const id = item.attr('data-id');\n selectedUrl = id && this.activeSource().gotoItem(id);\n } else if (item.find('a').length) {\n selectedUrl = item.find('a').attr('href');\n }\n const query = this.query();\n if (query && selectedUrl) {\n m.route.set(selectedUrl);\n } else {\n item.find('button')[0].click();\n }\n }\n\n /**\n * Clear the search\n */\n clear() {\n this.query('');\n }\n\n /**\n * Get all of the search result items that are selectable.\n */\n selectableItems() {\n return this.$('.Dropdown-menu > li:not(.Dropdown-header):not(.Dropdown-message)');\n }\n\n /**\n * Get the position of the currently selected search result item.\n * Returns zero if not found.\n */\n getCurrentNumericIndex() {\n return Math.max(0, this.selectableItems().index(this.getItem(this.index)));\n }\n\n /**\n * Get the
  • in the search results with the given index (numeric or named).\n */\n getItem(index) {\n const $items = this.selectableItems();\n let $item = $items.filter(`[data-index=\"${index}\"]`);\n if (!$item.length) {\n $item = $items.eq(index);\n }\n return $item;\n }\n\n /**\n * Set the currently-selected search result item to the one with the given\n * index.\n */\n setIndex(index, scrollToItem) {\n if (scrollToItem === void 0) {\n scrollToItem = false;\n }\n const $items = this.selectableItems();\n const $dropdown = $items.parent();\n let fixedIndex = index;\n if (index < 0) {\n fixedIndex = $items.length - 1;\n } else if (index >= $items.length) {\n fixedIndex = 0;\n }\n const $item = $items.removeClass('active').eq(fixedIndex).addClass('active');\n this.index = parseInt($item.attr('data-index')) || fixedIndex;\n if (scrollToItem && $dropdown) {\n const dropdownScroll = $dropdown.scrollTop();\n const dropdownTop = $dropdown.offset().top;\n const dropdownBottom = dropdownTop + $dropdown.outerHeight();\n const itemTop = $item.offset().top;\n const itemBottom = itemTop + $item.outerHeight();\n let scrollTop;\n if (itemTop < dropdownTop) {\n scrollTop = dropdownScroll - dropdownTop + itemTop - parseInt($dropdown.css('padding-top'), 10);\n } else if (itemBottom > dropdownBottom) {\n scrollTop = dropdownScroll - dropdownBottom + itemBottom + parseInt($dropdown.css('padding-bottom'), 10);\n }\n if (typeof scrollTop !== 'undefined') {\n $dropdown.stop(true).animate({\n scrollTop\n }, 100);\n }\n }\n }\n inputElement() {\n return this.$('.SearchModal-input');\n }\n defaultActiveSource() {\n const inDiscussion = app.current.data.routeName && ['discussion', 'discussion.near'].includes(app.current.data.routeName) && app.current.data.discussion;\n const inUser = app.current.data.routeName && app.current.data.routeName.includes('user.posts') && app.current.data.user;\n const inPosts = app.current.data.routeName && app.current.data.routeName === 'posts';\n if (inDiscussion || inUser || inPosts) {\n return 'posts';\n }\n return null;\n }\n defaultFilters() {\n const filters = {};\n this.sources.forEach(source => {\n filters[source.resource] = {};\n });\n if (app.current.data.routeName && ['discussion', 'discussion.near'].includes(app.current.data.routeName) && app.current.data.discussion) {\n filters.posts.discussion = app.current.data.discussion.id();\n }\n if (app.current.data.routeName && app.current.data.routeName.includes('user.posts') && app.current.data.user) {\n filters.posts.author = app.current.data.user.username();\n }\n return filters;\n }\n prefill(value) {\n const newQuery = app.search.gambits.from(this.activeSource().resource, value, this.defaultFilters()[this.activeSource().resource] || {});\n if (!value.includes(newQuery.replace(value, '').trim())) {\n return newQuery;\n }\n return value;\n }\n}\n_defineProperty(SearchModal, \"LIMIT\", 6);\nflarum.reg.add('core', 'common/components/SearchModal', SearchModal);"],"names":["SearchModal","constructor","super","arguments","this","oninit","vnode","searchState","attrs","sources","activeSource","defaultActiveSource","find","source","resource","query","prefill","getValue","trim","title","translator","trans","className","content","gambitsAutocomplete","inputElement","value","search","searchLabel","m","key","type","loading","loadingSources","length","clearable","clearLabel","prefixIcon","placeholder","onchange","inputScroll","scrollLeft","inputAttrs","renderInput","Object","assign","onscroll","e","target","style","left","gambifyInput","tabs","tabItems","toArray","activeTabItems","items","map","index","add","active","onclick","switchSource","includes","shouldShowResults","gambits","fullPageLink","fullPage","results","view","customGrouping","undefined","icon","focus","redraw","suggestions","marked","match","gambit","matches","negate","bit","replace","jsx","split","forEach","chunk","startsWith","push","onupdate","setIndex","getCurrentNumericIndex","component","$","on","selectableItems","oncreate","bind","$input","navigator","onUp","onDown","onSelect","selectResult","onCancel","clear","bindTo","toLowerCase","onremove","setValue","searchTimeout","clearTimeout","window","setTimeout","isCached","MIN_SEARCH_LEN","LIMIT","then","filter","cache","item","getItem","selectedUrl","attr","id","gotoItem","route","set","click","Math","max","$items","$item","eq","scrollToItem","$dropdown","parent","fixedIndex","removeClass","addClass","parseInt","dropdownScroll","scrollTop","dropdownTop","offset","top","dropdownBottom","outerHeight","itemTop","itemBottom","css","stop","animate","inDiscussion","current","data","routeName","discussion","inUser","user","inPosts","defaultFilters","filters","posts","author","username","newQuery","from","flarum","reg"],"sourceRoot":""} \ No newline at end of file diff --git a/framework/core/js/dist/forum.js b/framework/core/js/dist/forum.js index 284a7fb19..86d6381db 100644 --- a/framework/core/js/dist/forum.js +++ b/framework/core/js/dist/forum.js @@ -1,3 +1,3 @@ /*! For license information please see forum.js.LICENSE.txt */ -(()=>{var t,e,r={6997:(t,e,r)=>{"use strict";r.d(e,{A:()=>_});var n=r(8805),s=r(5114),o=r(6064),i=r(3092),a=r(1344),l=r(4519),c=r(7088),u=r(7141),d=r(3984),h=r(3957),f=r(4586),p=r(117),g=r(8781),v=r(6987),b=r(1810),A=r(2361),y=r(76),w=r(4022),x=r(281),k=r(5223),C=r(7390),N=r(2288),S=r(4583),T=r(3945),E=r(4944),M=r(2217),P=r(8286),D=r(2891),I=r(1467),L=r(2188);class _{constructor(){(0,n.A)(this,"forum",void 0),(0,n.A)(this,"routes",{}),(0,n.A)(this,"initializers",new o.A),(0,n.A)(this,"session",void 0),(0,n.A)(this,"translator",new u.A),(0,n.A)(this,"store",new d.A({"access-tokens":I.A,forums:x.A,users:k.A,discussions:C.A,posts:N.A,groups:S.A,notifications:T.A})),(0,n.A)(this,"search",void 0),(0,n.A)(this,"cache",{}),(0,n.A)(this,"booted",!1),(0,n.A)(this,"current",new E.A(null)),(0,n.A)(this,"previous",new E.A(null)),(0,n.A)(this,"modal",new M.A),(0,n.A)(this,"alerts",new P.A),(0,n.A)(this,"drawer",void 0),(0,n.A)(this,"history",null),(0,n.A)(this,"pane",null),(0,n.A)(this,"data",void 0),(0,n.A)(this,"allowUserColorScheme",void 0),(0,n.A)(this,"refs",{fontawesome:"https://fontawesome.com/v6/icons?o=r&m=free"}),(0,n.A)(this,"_title",""),(0,n.A)(this,"_titleCount",0),(0,n.A)(this,"requestErrorAlert",null),(0,n.A)(this,"initialRoute",void 0)}set title(t){this._title=t}get title(){return this._title}set titleCount(t){this._titleCount=t}get titleCount(){return this._titleCount}load(t){this.data=t,this.translator.setLocale(t.locale)}initialize(){const t=[];return this.initializers.toArray().forEach((e=>{try{e(this)}catch(r){const n=e.itemName.includes("/")?e.itemName.replace(/(\/flarum-ext-)|(\/flarum-)/g,"-"):e.itemName;t.push((()=>(0,D.A)((0,p.A)(s.A.translator.trans("core.lib.error.extension_initialiation_failed_message",{extension:n})),`${n} failed to initialize`,r)))}})),t}boot(){const t=this.initialize();this.store.pushPayload({data:this.data.resources}),this.forum=this.store.getById("forums","1"),this.session=new h.A(this.store.getById("users",String(this.data.session.userId))??null,this.data.session.csrfToken),this.beforeMount(),this.mount(),this.initialRoute=window.location.href,t.forEach((t=>t()))}beforeMount(){}bootExtensions(t){Object.keys(t).forEach((e=>{const r=t[e];if(!r.extend)return;const n=r.extend.flat(1/0);for(const t of n)t.extend(this,{name:e,exports:r})}))}mount(t){void 0===t&&(t=""),m.mount(document.getElementById("modal"),{view:()=>m(a.A,{state:this.modal})}),m.mount(document.getElementById("alerts"),{view:()=>m(l.A,{state:this.alerts})}),this.drawer=new g.A,m.route(document.getElementById("content"),t+"/",(0,v.A)(this.routes,t));const e=document.getElementById("app"),r=document.querySelector(".App-header"),n=new A.A((t=>{const n=e.getBoundingClientRect().top+document.body.scrollTop;e.classList.toggle("affix",t>=n),e.classList.toggle("scrolled",t>n),r.classList.toggle("navbar-fixed-top",t>=n)}));n.start(),n.update(),document.body.classList.add("ontouchstart"in window?"touch":"no-touch"),this.initColorScheme(),(0,y.A)()}initColorScheme(t){void 0===t&&(t=null),t??=s.A.forum.attribute("colorScheme")??"auto",this.allowUserColorScheme="auto"===t;const e=this.session.user?.preferences()?.colorScheme;let r;this.allowUserColorScheme&&(r=e),r||=t,this.setColorScheme(r),this.allowUserColorScheme&&this.watchSystemColorSchemePreference((()=>{this.initColorScheme(t)}))}getSystemColorSchemePreference(){let t=window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light";return window.matchMedia("(prefers-contrast: more)").matches&&(t+="-hc"),t}watchSystemColorSchemePreference(t){window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",t),window.matchMedia("(prefers-contrast: more)").addEventListener("change",t)}setColorScheme(t){t===L.z.Auto&&(t=this.getSystemColorSchemePreference()),document.documentElement.setAttribute("data-theme",t)}setColoredHeader(t){document.documentElement.setAttribute("data-colored-header",t?"true":"false")}preloadedApiDocument(){if(this.data.apiDocument&&window.location.href===this.initialRoute){const t=((0,d.J)(this.data.apiDocument),this.store.pushPayload(this.data.apiDocument));return this.data.apiDocument=null,t}return null}screen(){return getComputedStyle(document.documentElement).getPropertyValue("--flarum-screen")}setTitle(t){this.title=t,this.updateTitle()}setTitleCount(t){this.titleCount=t,this.updateTitle()}updateTitle(){const t=this.titleCount?`(${this.titleCount}) `:"",e=m.route.get()===this.forum.attribute("basePath")+"/",r={pageTitle:this.title,forumName:this.forum.attribute("title"),pageNumber:1};let n=e||!this.title?(0,p.A)(s.A.translator.trans("core.lib.meta_titles.without_page_title",r)):(0,p.A)(s.A.translator.trans("core.lib.meta_titles.with_page_title",r));n=t+n;const o=new DOMParser;document.title=o.parseFromString(n,"text/html").body.innerText}transformRequestOptions(t){const{background:e,deserialize:r,modifyText:n,...o}={...t},i={background:e??!0,deserialize:r??(t=>t),...o};if((0,w.X)(i,"config",((t,e)=>{e.setRequestHeader("X-CSRF-Token",this.session.csrfToken)})),i.method&&!["GET","POST"].includes(i.method)){const t=i.method;(0,w.X)(i,"config",((e,r)=>{r.setRequestHeader("X-HTTP-Method-Override",t)})),i.method="POST"}return i.extract=t=>{let e;e=n?n(t.responseText):t.responseText;const r=t.status;if(r<200||r>299)throw new b.A(r,`${e}`,i,t);if(t.getResponseHeader){const e=t.getResponseHeader("X-CSRF-Token");e&&(s.A.session.csrfToken=e)}try{return""===e?null:JSON.parse(e)}catch(r){throw new b.A(500,`${e}`,i,t)}},i}request(t){const e=this.transformRequestOptions(t);return this.requestErrorAlert&&this.alerts.dismiss(this.requestErrorAlert),m.request(e).catch((e=>this.requestErrorCatch(e,t.errorHandler)))}requestErrorCatch(t,e){const r=t.response?.errors?.map((t=>decodeURI(t.detail??"")))??[];let n;switch(t.status){case 422:n=r.map((t=>[t,m("br",null)])).flat().slice(0,-1);break;case 401:case 403:n=s.A.translator.trans("core.lib.error.permission_denied_message");break;case 404:case 410:n=s.A.translator.trans("core.lib.error.not_found_message");break;case 413:n=s.A.translator.trans("core.lib.error.payload_too_large_message");break;case 429:n=s.A.translator.trans("core.lib.error.rate_limit_exceeded_message");break;default:const e=t.response?.errors?.[0]?.code;n="db_error"===e&&s.A.session.user?.isAdmin()?s.A.translator.trans("core.lib.error.db_error_message"):this.requestWasCrossOrigin(t)?s.A.translator.trans("core.lib.error.generic_cross_origin_message"):s.A.translator.trans("core.lib.error.generic_message")}const o=s.A.forum.attribute("debug");return t.alert={type:"error",content:n,controls:o&&[m(i.A,{className:"Button Button--link",onclick:this.showDebug.bind(this,t,r)},s.A.translator.trans("core.lib.debug_button"))]},e?e(t):this.requestErrorDefaultHandler(t,o,r),Promise.reject(t)}requestWasCrossOrigin(t){return new URL(t.options.url,document.baseURI).origin!==window.location.origin}requestErrorDefaultHandler(t,e,r){if(!(t instanceof b.A))throw t;if(e&&t.xhr){const{method:e,url:n}=t.options,{status:s=""}=t.xhr;console.group(`${e} ${n} ${s}`),r.length?console.error(...r):console.error(t),console.groupEnd()}500===t.status&&e?s.A.modal.show(c.A,{error:t,formattedError:r}):t.alert&&(this.requestErrorAlert=this.alerts.show(t.alert,t.alert.content))}showDebug(t,e){null!==this.requestErrorAlert&&this.alerts.dismiss(this.requestErrorAlert),this.modal.show(c.A,{error:t,formattedError:e})}route(t,e){void 0===e&&(e={});const r=this.routes[t];if(!r)throw new Error(`Route '${t}' does not exist`);const n=r.path.replace(/:([^\/]+)/g,((t,r)=>`${(0,f.A)(e,r)}`));for(const t in e)e.hasOwnProperty(t)&&!e[t]&&delete e[t];const s=m.buildQueryString(e);return(""===m.route.prefix?this.forum.attribute("basePath"):"")+n+(s?"?"+s:"")}}flarum.reg.add("core","common/Application",_)},5710:(t,e,r)=>{"use strict";r.d(e,{A:()=>s});var n=r(8805);class s{constructor(){(0,n.A)(this,"element",void 0),(0,n.A)(this,"attrs",void 0),(0,n.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 r={...t};return m(this,r,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,r)=>{"use strict";r.d(e,{A:()=>o});var n=r(8805),s=r(5114);class o{constructor(t,e){void 0===t&&(t={}),void 0===e&&(e=s.A.store),(0,n.A)(this,"data",{}),(0,n.A)(this,"freshness",new Date),(0,n.A)(this,"exists",!1),(0,n.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 r=t.attributes[e];r&&r instanceof o&&delete t.attributes[e]}Object.assign(this.data.attributes,t.attributes)}if("relationships"in t){const e=this.data.relationships??{};for(const r in t.relationships){const n=t.relationships[r];if(null===n){delete e[r],delete t.relationships[r];continue}let s;s=n instanceof o?{data:o.getIdentifier(n)}:n instanceof Array?{data:n.map(o.getIdentifier)}:n,t.relationships[r]=s,e[r]=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 r={type:this.data.type,attributes:t};if("id"in this.data&&(r.id=this.data.id),t.relationships){r.relationships={};for(const e in t.relationships){const n=t.relationships[e];null!==n&&(r.relationships[e]={data:n instanceof Array?n.map(o.getIdentifier):o.getIdentifier(n)})}delete t.relationships}const n=this.copyData();this.pushData(r);const i={data:r,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(n),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",o)},3920:(t,e,r)=>{"use strict";r.d(e,{A:()=>f});var n=r(8805),s=r(5114),o=r(8631);class i extends o.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 a extends o.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",a);class l extends o.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 o.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 o.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 o.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 h extends o.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",h);class m{constructor(){(0,n.A)(this,"gambits",{discussions:[i,a,l,c],posts:[i,h],users:[u,d]})}apply(t,e){return e.q=this.match(t,e.q,((t,r,n)=>{const s=t.toFilter(r,n);Object.keys(s).forEach((r=>{r in e&&t.predicates&&Array.isArray(s[r])?e[r]=e[r].concat(s[r]):e[r]=s[r]}))})),e}match(t,e,r){const n=this.for(t).filter((t=>t.enabled()));if(0===n.length)return e;const s=e.split(" ");for(const t of n)for(const n of s){const s=new RegExp(`^(-?)${t.pattern()}$`,"i");let o=n.match(s);if(o){const s="-"===o[1];o.splice(1,1),r(t,o,s,n),e=e.replace(n,"")}}return e.trim().replace(/\s+/g," ")}from(t,e,r){const n=this.for(t);return 0===n.length||Object.keys(r).forEach((t=>{for(const s of n){const n="-"===t[0];n&&(t=t.substring(1)),s.filterKey()===t&&(e+=` ${s.fromFilter(r[t],n)}`)}})),e}for(t){return(this.gambits[t]||[]).map((t=>new t))}}flarum.reg.add("core","common/GambitManager",m);class f{constructor(t){(0,n.A)(this,"state",void 0),(0,n.A)(this,"gambits",new m),this.state=t}}(0,n.A)(f,"MIN_SEARCH_LEN",3),flarum.reg.add("core","common/SearchManager",f)},3957:(t,e,r)=>{"use strict";r.d(e,{A:()=>o});var n=r(8805),s=r(5114);class o{constructor(t,e){(0,n.A)(this,"user",void 0),(0,n.A)(this,"csrfToken",void 0),this.user=t,this.csrfToken=e}login(t,e){return void 0===e&&(e={}),s.A.request({method:"POST",url:`${s.A.forum.attribute("baseUrl")}/login`,body:t,...e})}logout(){window.location.href=`${s.A.forum.attribute("baseUrl")}/logout?token=${this.csrfToken}`}}flarum.reg.add("core","common/Session",o)},3984:(t,e,r)=>{"use strict";r.d(e,{A:()=>i,J:()=>o});var n=r(8805),s=r(5114);function o(t){return Array.isArray(t.data)}class i{constructor(t){(0,n.A)(this,"data",{}),(0,n.A)(this,"models",void 0),this.models=t}pushPayload(t){t.included&&t.included.map(this.pushObject.bind(this));const e=t.data instanceof Array?t.data.map((t=>this.pushObject(t))):this.pushObject(t.data);return e.payload=t,e}pushObject(t){if(!this.models[t.type])return setTimeout((()=>{throw new Error(`Pushing object of type \`${t.type}\` not allowed, as type not yet registered in the store.`)})),null;const e=this.data[t.type]=this.data[t.type]||{},r=e[t.id],n=r?r.pushData(t):this.createRecord(t.type,t);return e[t.id]=n,n.exists=!0,n}async find(t,e,r,n){void 0===r&&(r={}),void 0===n&&(n={});let i=r,a=s.A.forum.attribute("apiUrl")+"/"+t;return e instanceof Array?a+="?filter[id]="+e.join(","):"object"==typeof e?i=e:e&&(a+="/"+e),"filter"in i&&i?.filter?.q&&(i.filter=s.A.search.gambits.apply(t,i.filter)),s.A.request({method:"GET",url:a,params:i,...n}).then((t=>(o(t),this.pushPayload(t))))}getById(t,e){return this.data?.[t]?.[e]}getBy(t,e,r){return this.all(t).filter((t=>t[e]()===r))[0]}all(t){const e=this.data[t];return e?Object.values(e):[]}remove(t){delete this.data[t.data.type][t.id()]}createRecord(t,e){return void 0===e&&(e={}),e.type=e.type||t,new this.models[t](e,this)}}flarum.reg.add("core","common/Store",i)},7141:(t,e,r)=>{"use strict";r.d(e,{A:()=>d});var n=r(8805),s=r(6445),o=r(4586),i=r(3083),a=r.n(i),l=r(4434),c=r(117),u=r(6064);class d{constructor(){(0,n.A)(this,"dateTimeFormats",new u.A),(0,n.A)(this,"formatter",a())}get translations(){return this.formatter.setup().translations[this.getLocale()]??{}}setLocale(t){this.formatter.setup({locale:t,translations:{[t]:this.formatter.setup().translations[t]??{}}})}getLocale(){return Array.isArray(this.formatter.setup().locale)?this.formatter.setup().locale[0]:this.formatter.setup().locale}addTranslations(t){const e=this.getLocale();this.formatter.setup({translations:{[e]:Object.assign(this.translations,t)}})}preprocessParameters(t,e){if("user"in t){const e=(0,o.A)(t,"user");t.username||(t.username=(0,s.A)(e))}const r=(e="string"==typeof e?e:e.message).match(/<(\w+)[^>]*>.*?<\/\1>/g),n=r?.map((t=>t.match(/^<(\w+)/)[1]))||[],i=this.autoProvidedTags();for(const e of n)!t[e]&&i.includes(e)&&(t[e]=t=>{let{children:r}=t;return m(e,r)});for(const e in t){const r=t[e];n.includes(e)&&"object"==typeof r&&r.attrs&&r.tag&&(t[e]=t=>{let{children:e}=t;return m(r.tag,r.attrs,e)})}return t}trans(t,e,r){void 0===e&&(e={}),void 0===r&&(r=!1);const n=this.preprocessTranslation(this.translations[t]);if(n){e=this.preprocessParameters(e,n),this.translations[t]=n;let s=this.formatter.rich({id:t,default:t},e);return s=s instanceof Array?s.map((t=>void 0===t?"{undefined}":t)):s,r?(0,c.A)(s):s}return(0,l.A)(`Missing translation for key: "${t}"`),t}formatDateTime(t,e){const r=this.dateTimeFormats.has(e)&&this.dateTimeFormats.get(e);if(r){const t=r.apply(this,[e]);if(t)return t}return t.format(this.preprocessTranslation(this.translations[e]))}preprocessTranslation(t){if(t)return(t="string"==typeof t?t:t.message).match(/<\w+ [^>]+>/g)?((0,l.A)(`Any HTML tags used within translations must be simple tags, without attributes.\nCaught in translation: \n\n"""\n${t}\n"""`),t.replace(/<(\w+)([^>]*)>/g,"<$1>")):t}autoProvidedTags(){return["strong","code","i","s","em","sup","sub"]}}flarum.reg.add("core","common/Translator",d)},5114:(t,e,r)=>{"use strict";r.d(e,{A:()=>o});const n=window,s=new Proxy({},{get:(t,e)=>Reflect.get(n.app,e,n.app),set:(t,e,r)=>Reflect.set(n.app,e,r,n.app)}),o=s;flarum.reg.add("core","common/app",s)},9924:(t,e,r)=>{"use strict";r.d(e,{A:()=>u});var n=r(5710),s=r(3092),o=r(5673),i=r(4586),a=r(4268),l=r(5114),c=r(7479);class u extends n.A{view(t){const e=Object.assign({},this.attrs),r=(0,i.A)(e,"type");e.className=(0,a.A)("Alert",`Alert--${r}`,e.className);const n=(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")||[],f=(0,i.A)(e,"dismissible"),p=(0,i.A)(e,"ondismiss"),g=[];return(f||void 0===f)&&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:p})),m("div",e,m("div",{className:(0,a.A)("Alert-container",e.containerClassName)},m("div",{className:"Alert-content"},!!n&&m("div",{className:"Alert-title"},!!u&&m("span",{className:"Alert-title-icon"},m(c.A,{name:u})),m("span",{className:"Alert-title-text"},n)),m("span",{className:"Alert-body"},d)),m("ul",{className:"Alert-controls"},(0,o.A)(h.concat(g)))))}}flarum.reg.add("core","common/components/Alert",u)},4519:(t,e,r)=>{"use strict";r.d(e,{A:()=>s});var n=r(5710);class s extends n.A{oninit(t){super.oninit(t),this.state=this.attrs.state}view(){const t=this.state.getActiveAlerts();return m("div",{className:"AlertManager"},Object.keys(t).map(Number).map((e=>{const r=t[e],n="error"===r.attrs.type;return m("div",{className:"AlertManager-alert",role:"alert","aria-live":n?"assertive":"polite"},m(r.componentClass,Object.assign({},r.attrs,{ondismiss:this.state.dismiss.bind(this.state,e)}),r.children))})))}}flarum.reg.add("core","common/components/AlertManager",s)},7891:(t,e,r)=>{"use strict";r.d(e,{A:()=>o});var n=r(4268),s=r(5710);class o extends s.A{view(t){const{user:e,...r}=t.attrs;r.className=(0,n.A)("Avatar",r.className),r.loading??="lazy";let s="";const o="undefined"===r.title||r.title;if(o||delete r.title,e){const t=e.displayName()||"?",n=e.avatarUrl();if(o&&(r.title=r.title||t),n)return m("img",Object.assign({},r,{src:n,alt:""}));s=t.charAt(0).toUpperCase(),r.style=!window.testing&&{"--avatar-bg":e.color()}}return m("span",r,s)}}flarum.reg.add("core","common/components/Avatar",o)},367:(t,e,r)=>{"use strict";r.d(e,{A:()=>l});var n=r(4391),s=r(5710),o=r(4268),i=r(3288),a=r(7479);class l extends s.A{view(){const{type:t,icon:e,label:r,color:s,style:l={},...c}=this.attrs,u=(0,o.A)("Badge",[t&&`Badge--${t}`],c.className,(0,i.A)(s)),d=e?m(a.A,{name:e,className:"Badge-icon"}):m.trust(" "),h={...l};window.testing||(h["--badge-bg"]=s);const f={...c,className:u,style:h},p=m("div",f,d);return r?m(n.A,{text:r},p):p}}flarum.reg.add("core","common/components/Badge",l)},3092:(t,e,r)=>{"use strict";r.d(e,{A:()=>c});var n=r(5710),s=r(4434),o=r(4268),i=r(117),a=r(43),l=r(7479);class c extends n.A{view(t){let{type:e,"aria-label":r,icon:n,disabled:s,loading:a,className:l,class:c,...u}=this.attrs;e||="button","object"==typeof r&&(r=(0,i.A)(r)),(s||a)&&delete u.onclick,l=(0,o.A)(c,l,{hasIcon:n,disabled:s||a,loading:a});const d={disabled:s,className:l,type:e,"aria-label":r,...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(a.A,{size:"small",display:"inline"})]}}flarum.reg.add("core","common/components/Button",c)},5215:(t,e,r)=>{"use strict";r.d(e,{A:()=>l});var n=r(5710),s=r(43),o=r(4268),i=r(9024),a=r(7479);class l extends n.A{view(t){const e=(0,o.A)(["Checkbox",this.attrs.state?"on":"off",this.attrs.className,this.attrs.loading&&"loading",this.attrs.disabled&&"disabled"]);return m("label",{className:e},m("input",{type:"checkbox",checked:this.attrs.state,disabled:this.attrs.disabled,onchange:(0,i.A)("checked",this.onchange.bind(this))}),m("div",{className:"Checkbox-display","aria-hidden":"true"},this.getDisplay()),t.children)}getDisplay(){return this.attrs.loading?m(s.A,{display:"unset",size:"small"}):m(a.A,{name:this.attrs.state?"fas fa-check":"fas fa-times"})}onchange(t){this.attrs.onchange&&this.attrs.onchange(t,this)}}flarum.reg.add("core","common/components/Checkbox",l)},4511:(t,e,r)=>{"use strict";r.d(e,{A:()=>u});var n=r(8805),s=r(5114),o=r(5710),i=r(5673),a=r(117),l=r(4391),c=r(7479);class u extends o.A{constructor(){super(...arguments),(0,n.A)(this,"showing",!1)}static initAttrs(t){t.className||="",t.buttonClassName||="",t.menuClassName||="",t.label||="",t.caretIcon??="fas fa-caret-down",t.accessibleToggleLabel||=(0,a.A)(s.A.translator.trans("core.lib.dropdown.toggle_dropdown_accessible_label"))}view(t){const e=t.children?(0,i.A)(t.children):[],r=!this.attrs.lazyDraw||this.showing;return m("div",{className:"ButtonGroup Dropdown dropdown "+this.attrs.className+" itemCount"+e.length+(this.showing?" open":"")},this.getButton(t.children),r&&this.getMenu(e))}oncreate(t){super.oncreate(t),this.$().on("shown.bs.dropdown",(()=>{const{lazyDraw:t,onshow:e}=this.attrs;this.showing=!0,t&&m.redraw.sync(),"function"==typeof e&&e(),t||m.redraw();const r=this.$(".Dropdown-menu"),n=r.hasClass("Dropdown-menu--right"),s=r.offset()?.top??0,o=r.height()??0,i=$(window).scrollTop()??0,a=$(window).height()??0;r.removeClass("Dropdown-menu--top Dropdown-menu--right"),r.toggleClass("Dropdown-menu--top",s+o>i+a),(r.offset()?.top||0)<0&&r.removeClass("Dropdown-menu--top");const l=r.offset()?.left??0,c=r.width()??0,u=$(window).scrollLeft()??0,d=$(window).width()??0;r.toggleClass("Dropdown-menu--right",n||l+c>u+d)})),this.$().on("hidden.bs.dropdown",(()=>{this.showing=!1,this.attrs.onhide&&this.attrs.onhide(),m.redraw()}))}getButton(t){let e=m("button",Object.assign({className:"Dropdown-toggle "+this.attrs.buttonClassName,"aria-haspopup":"menu","aria-label":this.attrs.accessibleToggleLabel,"data-toggle":"dropdown",onclick:this.attrs.onclick},this.attrs.buttonAttrs),this.getButtonContent(t));return this.attrs.tooltip&&(e=m(l.A,{text:this.attrs.tooltip,position:"bottom"},e)),e}getButtonContent(t){return[this.attrs.icon?m(c.A,{name:this.attrs.icon,className:"Button-icon"}):"",m("span",{className:"Button-label"},this.attrs.label),this.attrs.caretIcon?m(c.A,{name:this.attrs.caretIcon,className:"Button-caret"}):""]}getMenu(t){return m("ul",{className:"Dropdown-menu dropdown-menu "+this.attrs.menuClassName},t)}}flarum.reg.add("core","common/components/Dropdown",u)},592:(t,e,r)=>{"use strict";r.d(e,{A:()=>o});var n=r(5710),s=r(4268);class o extends n.A{view(t){return m("div",{className:(0,s.A)("FieldSet",this.attrs.className),role:"group","aria-label":this.attrs.label,"aria-disabled":!1},m("label",{className:"FieldSet-label","aria-hidden":"true"},this.attrs.label),this.attrs.description?m("div",{className:"FieldSet-description helpText"},this.attrs.description):null,m("div",{className:"FieldSet-items"},t.children))}}flarum.reg.add("core","common/components/FieldSet",o)},374:(t,e,r)=>{"use strict";r.d(e,{A:()=>o});var n=r(5710),s=r(4268);class o extends n.A{view(t){const{label:e,description:r,className:n,...o}=t.attrs;return m("div",Object.assign({className:(0,s.A)("Form",n)},o),(e||r)&&m("div",{className:"Form-header"},e&&m("label",null,e),r&&m("p",{className:"helpText"},r)),m("div",{className:"Form-body"},t.children))}}flarum.reg.add("core","common/components/Form",o)},2855:(t,e,r)=>{"use strict";r.d(e,{A:()=>s});var n=r(2849);class s extends n.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,r)=>{"use strict";r.d(e,{A:()=>s});var n=r(367);class s extends n.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,r)=>{"use strict";r.d(e,{A:()=>o});var n=r(4268),s=r(5710);class o extends s.A{view(t){const{name:e,...r}=t.attrs;return r.className=(0,n.A)("icon",e,r.className),m("i",Object.assign({"aria-hidden":"true"},r))}}flarum.reg.add("core","common/components/Icon",o)},4164:(t,e,r)=>{"use strict";r.d(e,{A:()=>i});var n=r(5710),s=r(7479),o=r(4268);class i extends n.A{view(t){const{icon:e,className:r,...n}=t.attrs;return m("div",Object.assign({className:(0,o.A)("InfoTile",r)},n),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,o.A)(this.attrs.icon,"InfoTile-icon")}):null}}flarum.reg.add("core","common/components/InfoTile",i)},7882:(t,e,r)=>{"use strict";r.d(e,{A:()=>c});var n=r(5114),s=r(5710),o=r(7479),i=r(43),a=r(4268),l=r(3092);class c extends s.A{oninit(t){super.oninit(t)}view(t){const{className:e,...r}=this.attrs.inputAttrs||{},s=this.attrs.value||this.attrs.stream?.()||"";return m("div",{className:(0,a.A)("Input",this.attrs.className,{"Input--withPrefix":this.attrs.prefixIcon,"Input--withClear":this.attrs.clearable})},this.attrs.prefixIcon&&m(o.A,{name:(0,a.A)(this.attrs.prefixIcon,"Input-prefix-icon")}),this.input({inputClassName:e,value:s,inputAttrs:r}),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||n.A.translator.trans("core.lib.input.clear_button"),type:"button",icon:"fas fa-times-circle"}))}input(t){let{inputClassName:e,value:r,inputAttrs:n}=t;const s={className:(0,a.A)("FormControl",e),type:this.attrs.type||"text",value:r,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,...n};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,r)=>{"use strict";r.d(e,{A:()=>i});var n=r(5114),s=r(5710),o=r(4268);class i extends s.A{view(){const{display:t="block",size:e="medium",containerClassName:r,className:s,...i}=this.attrs,a=(0,o.A)("LoadingIndicator",s),l=(0,o.A)("LoadingIndicator-container","unset"!==t&&`LoadingIndicator-container--${t}`,e&&`LoadingIndicator-container--${e}`,r);return m("div",Object.assign({"aria-label":n.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:a},i)))}}flarum.reg.add("core","common/components/LoadingIndicator",i)},2849:(t,e,r)=>{"use strict";r.d(e,{A:()=>c});var n=r(8805),s=r(5114),o=r(5710),i=r(9924),a=r(3092),l=r(4268);class c extends o.A{constructor(){super(...arguments),(0,n.A)(this,"loading",!1),(0,n.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(a.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,n.A)(c,"isDismissibleViaCloseButton",!0),(0,n.A)(c,"isDismissibleViaEscKey",!0),(0,n.A)(c,"isDismissibleViaBackdropClick",!0),flarum.reg.add("core","common/components/Modal",c)},1344:(t,e,r)=>{"use strict";r.d(e,{A:()=>l});var n=r(8805),s=r(5710),o=r(8720),i=r(4945),a=r(43);class l extends s.A{constructor(){super(...arguments),(0,n.A)(this,"focusTrap",void 0),(0,n.A)(this,"lastSetFocusTrap",void 0),(0,n.A)(this,"modalClosing",!1),(0,n.A)(this,"keyUpListener",null)}view(t){return m("[",null,this.attrs.state.modalList.map(((t,e)=>{const r=t?.componentClass;return m("div",{key:t.key,className:"ModalManager modal","data-modal-key":t.key,"data-modal-number":e,role:"dialog","aria-modal":"true",style:!window.testing&&{"--modal-number":e},"aria-hidden":this.attrs.state.modal!==t&&"true"},!!r&&[m(r,Object.assign({key:t.key},t.attrs,{animateShow:this.animateShow.bind(this),animateHide:this.animateHide.bind(this),state:this.attrs.state})),m("div",{key:t.key,className:"ModalManager-invisibleBackdrop",onclick:this.handlePossibleBackdropClick.bind(this)})])})),(this.attrs.state.backdropShown||this.attrs.state.loadingModal)&&m("div",{className:"Modal-backdrop backdrop",ontransitionend:this.onBackdropTransitionEnd.bind(this),"data-showing":!!this.attrs.state.modalList.length||this.attrs.state.loadingModal,style:!window.testing&&{"--modal-count":this.attrs.state.modalList.length+Number(this.attrs.state.loadingModal)}},this.attrs.state.loadingModal&&m(a.A,null)))}oncreate(t){super.oncreate(t),this.keyUpListener=this.handleEscPress.bind(this),document.body.addEventListener("keyup",this.keyUpListener)}onbeforeremove(t){super.onbeforeremove(t),this.keyUpListener&&document.body.removeEventListener("keyup",this.keyUpListener),this.keyUpListener=null}onupdate(t){super.onupdate(t),requestAnimationFrame((()=>{try{if(!this.attrs.state.isModalOpen())return document.getElementById("app")?.removeAttribute("aria-hidden"),this.focusTrap.deactivate?.(),void(0,i.qY)();document.getElementById("app")?.setAttribute("aria-hidden","true");const t=this.attrs.state.modal.key;this.focusTrap&&this.lastSetFocusTrap!==t&&(this.focusTrap.deactivate?.(),(0,i.qY)()),this.activeDialogElement&&this.lastSetFocusTrap!==t&&(this.focusTrap=(0,o.K)(this.activeDialogElement,{allowOutsideClick:!0}),this.focusTrap.activate?.(),this.activeDialogManagerElement&&(0,i.mh)(this.activeDialogManagerElement,{reserveScrollBarGap:!0})),this.lastSetFocusTrap=t}catch{}}))}get activeDialogElement(){return document.body.querySelector(`.ModalManager[data-modal-key="${this.attrs.state.modal?.key}"] .Modal`)}get activeDialogManagerElement(){return document.body.querySelector(`.ModalManager[data-modal-key="${this.attrs.state.modal?.key}"]`)}animateShow(t){void 0===t&&(t=()=>{}),this.attrs.state.modal&&(this.activeDialogElement?.addEventListener("transitionend",(()=>{t()}),{once:!0}),requestAnimationFrame((()=>{this.activeDialogElement?.classList.add("in")})))}animateHide(t){void 0===t&&(t=()=>{}),this.modalClosing||(this.modalClosing=!0,this.activeDialogElement?.addEventListener("transitionend",(()=>{this.modalClosing=!1,this.attrs.state.close(),t()}),{once:!0}),this.activeDialogElement?.classList.remove("in"),this.activeDialogElement?.classList.add("out"))}handleEscPress(t){if(!this.attrs.state.modal)return;const e=this.attrs.state.modal.componentClass.dismissibleOptions;"Escape"===t.key&&e.viaEscKey&&(t.preventDefault(),this.animateHide())}handlePossibleBackdropClick(t){this.attrs.state.modal&&this.attrs.state.modal.componentClass.dismissibleOptions.viaBackdropClick&&this.animateHide()}onBackdropTransitionEnd(t){"opacity"===t.propertyName&&null===t.currentTarget.getAttribute("data-showing")&&(this.attrs.state.backdropShown=!1,m.redraw())}}flarum.reg.add("core","common/components/ModalManager",l)},2162:(t,e,r)=>{"use strict";r.d(e,{A:()=>l});var n=r(5114),s=r(5710),o=r(3092),i=r(6909),a=r(4268);class l extends s.A{view(){const{history:t,pane:e}=n.A;return m("div",{className:(0,a.A)("Navigation ButtonGroup",this.attrs.className),onmouseenter:e&&e.show.bind(e),onmouseleave:e&&e.onmouseleave.bind(e)},t?.canGoBack()?[this.getBackButton(),this.getPaneButton()]:this.getDrawerButton())}getBackButton(){const{history:t}=n.A,e=t?.getPrevious();return m(i.A,{className:"Button Navigation-back Button--icon",href:t?.backUrl(),icon:"fas fa-chevron-left","aria-label":e?.title,onclick:e=>{e.shiftKey||e.ctrlKey||e.metaKey||2===e.which||(e.preventDefault(),t?.back())}})}getPaneButton(){const{pane:t}=n.A;return t&&t.active?m(o.A,{className:(0,a.A)("Button Button--icon Navigation-pin",{active:t.pinned}),onclick:t.togglePinned.bind(t),icon:"fas fa-thumbtack"}):null}getDrawerButton(){if(!this.attrs.drawer)return null;const{drawer:t}=n.A,e=n.A.session.user;return m(o.A,{className:(0,a.A)("Button Button--icon Navigation-drawer",{new:e?.newNotificationCount()}),onclick:e=>{e.stopPropagation(),t.show()},icon:"fas fa-bars","aria-label":n.A.translator.trans("core.lib.nav.drawer_button")})}}flarum.reg.add("core","common/components/Navigation",l)},9377:(t,e,r)=>{"use strict";r.d(e,{A:()=>a});var n=r(8805),s=r(5114),o=r(5710),i=r(4944);class a extends o.A{constructor(){super(...arguments),(0,n.A)(this,"bodyClass",""),(0,n.A)(this,"scrollTopOnCreate",!0),(0,n.A)(this,"useBrowserScrollRestoration",!0)}oninit(t){super.oninit(t),s.A.previous=s.A.current,s.A.current=new i.A(this.constructor,{routeName:this.attrs.routeName}),s.A.drawer.hide(),s.A.modal.close()}oncreate(t){super.oncreate(t),this.bodyClass&&$("#app").addClass(this.bodyClass),this.scrollTopOnCreate&&$(window).scrollTop(0),"scrollRestoration"in history&&(history.scrollRestoration=this.useBrowserScrollRestoration?"auto":"manual")}onremove(t){super.onremove(t),this.bodyClass&&$("#app").removeClass(this.bodyClass)}}flarum.reg.add("core","common/components/Page",a)},7088:(t,e,r)=>{"use strict";r.d(e,{A:()=>s});var n=r(2849);class s extends n.A{className(){return"RequestErrorModal Modal--large"}title(){return!!this.attrs.error.xhr&&`${this.attrs.error.xhr.status} ${this.attrs.error.xhr.statusText}`}content(){const{error:t,formattedError:e}=this.attrs;let r;return r=e.length?e.join("\n\n"):t.response?JSON.stringify(t.response,null,2):t.responseText,r?.includes("