');i.append(s),i.children().hover(function(){clearTimeout(n),n=setTimeout(function(){!s.hasClass("in")&&s.is(":visible")||(m.render(s[0],o.map(function(t){return m("li",{"data-number":t.number()},l.a.component({post:t,onclick:r}))})),s.show(),setTimeout(function(){return s.off("transitionend").addClass("in")}))},500)},function(){clearTimeout(n),n=setTimeout(r,250)}),i.find(".Post-mentionedBy-summary a").hover(function(){s.find('[data-number="'+$(this).data("number")+'"]').addClass("active")},function(){s.find("[data-number]").removeClass("active")})}}},m("span",{className:"Post-mentionedBy-summary"},S()("fas fa-reply"),app.translator.transChoice("flarum-mentions.forum.post.mentioned_by"+(s[0].user()===app.session.user?"_self":"")+"_text",u.length,{count:u.length,users:x()(u)}))))}}),Object(o.extend)(p.a.prototype,"actionItems",function(t){var e=this.props.post;e.isHidden()||app.session.user&&!e.discussion().canReply()||t.add("reply",j.a.component({className:"Button Button--link",children:app.translator.trans("flarum-mentions.forum.post.reply_link"),onclick:function(){return O(e)}}))}),A(),G(),i.a.notificationComponents.postMentioned=Z,i.a.notificationComponents.userMentioned=tt,Object(o.extend)(a.a.prototype,"notificationTypes",function(t){t.add("postMentioned",{name:"postMentioned",icon:"fas fa-reply",label:i.a.translator.trans("flarum-mentions.forum.settings.notify_post_mentioned_label")}),t.add("userMentioned",{name:"userMentioned",icon:"fas fa-at",label:i.a.translator.trans("flarum-mentions.forum.settings.notify_user_mentioned_label")})}),i.a.routes["user.mentions"]={path:"/u/:username/mentions",component:st.component()},Object(o.extend)(nt.a.prototype,"navItems",function(t){var e=this.user;t.add("mentions",rt.a.component({href:i.a.route("user.mentions",{username:e.username()}),name:"mentions",children:[i.a.translator.trans("flarum-mentions.forum.user.mentions_link")],icon:"fas fa-at"}),80)}),u.getPlainContent.removeSelectors.push("a.PostMention")})}]);
//# sourceMappingURL=forum.js.map
\ No newline at end of file
diff --git a/extensions/mentions/js/dist/forum.js.map b/extensions/mentions/js/dist/forum.js.map
index 7c511ac6c..01c515cea 100644
--- a/extensions/mentions/js/dist/forum.js.map
+++ b/extensions/mentions/js/dist/forum.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack://@flarum/flarum-ext-mentions/webpack/bootstrap","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['extend']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['app']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['components/CommentPost']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['helpers/username']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['utils/string']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['components/PostPreview']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['helpers/punctuateSeries']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['components/Button']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['components/Notification']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['utils/extract']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['components/NotificationGrid']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['components/LoadingIndicator']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['Model']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['models/Post']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['helpers/icon']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['utils/DiscussionControls']\"","webpack://@flarum/flarum-ext-mentions/./node_modules/textarea-caret/index.js","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['components/ComposerBody']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['helpers/avatar']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['helpers/highlight']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['utils/KeyboardNavigatable']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['Component']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['components/UserPage']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['components/LinkButton']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['components/PostsUserPage']\"","webpack://@flarum/flarum-ext-mentions/./src/forum/utils/reply.js","webpack://@flarum/flarum-ext-mentions/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@flarum/flarum-ext-mentions/./src/forum/components/PostQuoteButton.js","webpack://@flarum/flarum-ext-mentions/./src/forum/addPostQuoteButton.js","webpack://@flarum/flarum-ext-mentions/./src/forum/utils/selectedText.js","webpack://@flarum/flarum-ext-mentions/./src/forum/components/AutocompleteDropdown.js","webpack://@flarum/flarum-ext-mentions/./src/forum/addComposerAutocomplete.js","webpack://@flarum/flarum-ext-mentions/./src/forum/components/PostMentionedNotification.js","webpack://@flarum/flarum-ext-mentions/./src/forum/components/UserMentionedNotification.js","webpack://@flarum/flarum-ext-mentions/./src/forum/components/MentionsUserPage.js","webpack://@flarum/flarum-ext-mentions/./src/forum/index.js","webpack://@flarum/flarum-ext-mentions/./src/forum/addPostMentionPreviews.js","webpack://@flarum/flarum-ext-mentions/./src/forum/addMentionedByList.js","webpack://@flarum/flarum-ext-mentions/./src/forum/addPostReplyAction.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","flarum","core","compat","properties","isBrowser","window","isFirefox","mozInnerScreenX","getCaretCoordinates","element","position","options","Error","debug","el","document","querySelector","parentNode","removeChild","div","createElement","id","body","appendChild","style","computed","getComputedStyle","currentStyle","isInput","nodeName","whiteSpace","wordWrap","visibility","forEach","prop","lineHeight","height","scrollHeight","parseInt","overflowY","overflow","textContent","substring","replace","span","coordinates","top","offsetTop","left","offsetLeft","backgroundColor","insertMention","post","component","quote","user","mention","username","number","content","props","originalContent","cursorPosition","editor","getSelectionRange","preceding","slice","precedingNewlines","length","match","insertAtCursor","Array","join","trim","reply","app","composer","discussion","DiscussionControls","replyAction","then","newComponent","_inheritsLoose","subClass","superClass","constructor","__proto__","PostQuoteButton","view","_this","this","extract","className","icon","children","translator","trans","onclick","hide","onmousedown","e","stopPropagation","_Button","config","isInitialized","$","on","show","$this","parentOffset","offsetParent","offset","css","showStart","scrollTop","outerHeight","showEnd","right","bottom","outerWidth","Button","addPostQuoteButton","extend","CommentPost","original","isHidden","session","canReply","$postBody","$container","handler","setTimeout","selection","getSelection","rangeCount","range","getRangeAt","parent","commonAncestorContainer","contains","clone","append","cloneContents","find","replaceWith","alt","src","innerText","href","text","selectedText","button","render","rects","getClientRects","firstRect","clientY","clientX","lastRect","after","addEventListener","AutocompleteDropdown","init","active","index","keyWasJustPressed","items","map","item","navigate","delta","setIndex","clearTimeout","keyWasJustPressedTimeout","complete","eq","click","scrollToItem","$dropdown","$items","rangedIndex","$item","removeClass","addClass","dropdownScroll","dropdownTop","dropdownBottom","itemTop","itemBottom","stop","animate","Component","addComposerAutocomplete","ComposerBody","mentionStart","typed","searchTimeout","dropdown","$textarea","wrap","searched","navigator","KeyboardNavigatable","when","onUp","onDown","onSelect","onCancel","bindTo","indexOf","which","cursor","selectionStart","selectionEnd","substr","toLowerCase","makeSuggestion","replacement","usernameHelper","highlight","insert","setValue","setSelectionRange","applySuggestion","onmouseenter","avatar","userMatches","displayName","some","buildSuggestions","suggestions","store","all","push","composerPost","posts","filter","contentType","sort","a","b","createdAt","splice","truncate","contentPlain","width","typedLower","q","page","limit","PostMentionedNotification","notification","subject","auc","additionalUnreadCount","route","replyNumber","fromUser","transChoice","punctuateSeries","count","undefined","excerpt","Notification","UserMentionedNotification","MentionsUserPage","loadResults","type","mentioned","loadLimit","PostsUserPage","initializers","add","contentHtml","oldPostContentHtml","isEditing","parentPost","$parentPost","each","attrs","getAttribute","timeout","data","$preview","getPostElement","showPreview","$post","visible","pageYOffset","positionPreview","previewHeight","showPost","title","PostPreview","getById","LoadingIndicator","off","hidePreview","hasClass","one","preventDefault","hover","Post","mentionedBy","Model","hasMany","replies","users","repliers","overLimit","names","data-number","is","notificationComponents","postMentioned","userMentioned","NotificationGrid","label","routes","path","UserPage","LinkButton","getPlainContent","removeSelectors"],"mappings":"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","file":"forum.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 25);\n","module.exports = flarum.core.compat['extend'];","module.exports = flarum.core.compat['app'];","module.exports = flarum.core.compat['components/CommentPost'];","module.exports = flarum.core.compat['helpers/username'];","module.exports = flarum.core.compat['utils/string'];","module.exports = flarum.core.compat['components/PostPreview'];","module.exports = flarum.core.compat['helpers/punctuateSeries'];","module.exports = flarum.core.compat['components/Button'];","module.exports = flarum.core.compat['components/Notification'];","module.exports = flarum.core.compat['utils/extract'];","module.exports = flarum.core.compat['components/NotificationGrid'];","module.exports = flarum.core.compat['components/LoadingIndicator'];","module.exports = flarum.core.compat['Model'];","module.exports = flarum.core.compat['models/Post'];","module.exports = flarum.core.compat['helpers/icon'];","module.exports = flarum.core.compat['utils/DiscussionControls'];","/* jshint browser: true */\n\n(function () {\n\n// We'll copy the properties below into the mirror div.\n// Note that some browsers, such as Firefox, do not concatenate properties\n// into their shorthand (e.g. padding-top, padding-bottom etc. -> padding),\n// so we have to list every single property explicitly.\nvar properties = [\n 'direction', // RTL support\n 'boxSizing',\n 'width', // on Chrome and IE, exclude the scrollbar, so the mirror div wraps exactly as the textarea does\n 'height',\n 'overflowX',\n 'overflowY', // copy the scrollbar for IE\n\n 'borderTopWidth',\n 'borderRightWidth',\n 'borderBottomWidth',\n 'borderLeftWidth',\n 'borderStyle',\n\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/font\n 'fontStyle',\n 'fontVariant',\n 'fontWeight',\n 'fontStretch',\n 'fontSize',\n 'fontSizeAdjust',\n 'lineHeight',\n 'fontFamily',\n\n 'textAlign',\n 'textTransform',\n 'textIndent',\n 'textDecoration', // might not make a difference, but better be safe\n\n 'letterSpacing',\n 'wordSpacing',\n\n 'tabSize',\n 'MozTabSize'\n\n];\n\nvar isBrowser = (typeof window !== 'undefined');\nvar isFirefox = (isBrowser && window.mozInnerScreenX != null);\n\nfunction getCaretCoordinates(element, position, options) {\n if (!isBrowser) {\n throw new Error('textarea-caret-position#getCaretCoordinates should only be called in a browser');\n }\n\n var debug = options && options.debug || false;\n if (debug) {\n var el = document.querySelector('#input-textarea-caret-position-mirror-div');\n if (el) el.parentNode.removeChild(el);\n }\n\n // The mirror div will replicate the textarea's style\n var div = document.createElement('div');\n div.id = 'input-textarea-caret-position-mirror-div';\n document.body.appendChild(div);\n\n var style = div.style;\n var computed = window.getComputedStyle ? window.getComputedStyle(element) : element.currentStyle; // currentStyle for IE < 9\n var isInput = element.nodeName === 'INPUT';\n\n // Default textarea styles\n style.whiteSpace = 'pre-wrap';\n if (!isInput)\n style.wordWrap = 'break-word'; // only for textarea-s\n\n // Position off-screen\n style.position = 'absolute'; // required to return coordinates properly\n if (!debug)\n style.visibility = 'hidden'; // not 'display: none' because we want rendering\n\n // Transfer the element's properties to the div\n properties.forEach(function (prop) {\n if (isInput && prop === 'lineHeight') {\n // Special case for s because text is rendered centered and line height may be != height\n style.lineHeight = computed.height;\n } else {\n style[prop] = computed[prop];\n }\n });\n\n if (isFirefox) {\n // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275\n if (element.scrollHeight > parseInt(computed.height))\n style.overflowY = 'scroll';\n } else {\n style.overflow = 'hidden'; // for Chrome to not render a scrollbar; IE keeps overflowY = 'scroll'\n }\n\n div.textContent = element.value.substring(0, position);\n // The second special handling for input type=\"text\" vs textarea:\n // spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/13402035/1269037\n if (isInput)\n div.textContent = div.textContent.replace(/\\s/g, '\\u00a0');\n\n var span = document.createElement('span');\n // Wrapping must be replicated *exactly*, including when a long word gets\n // onto the next line, with whitespace at the end of the line before (#7).\n // The *only* reliable way to do that is to copy the *entire* rest of the\n // textarea's content into the created at the caret position.\n // For inputs, just '.' would be enough, but no need to bother.\n span.textContent = element.value.substring(position) || '.'; // || because a completely empty faux span doesn't render at all\n div.appendChild(span);\n\n var coordinates = {\n top: span.offsetTop + parseInt(computed['borderTopWidth']),\n left: span.offsetLeft + parseInt(computed['borderLeftWidth']),\n height: parseInt(computed['lineHeight'])\n };\n\n if (debug) {\n span.style.backgroundColor = '#aaa';\n } else {\n document.body.removeChild(div);\n }\n\n return coordinates;\n}\n\nif (typeof module != 'undefined' && typeof module.exports != 'undefined') {\n module.exports = getCaretCoordinates;\n} else if(isBrowser) {\n window.getCaretCoordinates = getCaretCoordinates;\n}\n\n}());\n","module.exports = flarum.core.compat['components/ComposerBody'];","module.exports = flarum.core.compat['helpers/avatar'];","module.exports = flarum.core.compat['helpers/highlight'];","module.exports = flarum.core.compat['utils/KeyboardNavigatable'];","module.exports = flarum.core.compat['Component'];","module.exports = flarum.core.compat['components/UserPage'];","module.exports = flarum.core.compat['components/LinkButton'];","module.exports = flarum.core.compat['components/PostsUserPage'];","import DiscussionControls from 'flarum/utils/DiscussionControls';\n\nfunction insertMention(post, component, quote) {\n const user = post.user();\n const mention = '@' + (user ? user.username() : post.number()) + '#' + post.id() + ' ';\n\n // If the composer is empty, then assume we're starting a new reply.\n // In which case we don't want the user to have to confirm if they\n // close the composer straight away.\n if (!component.content()) {\n component.props.originalContent = mention;\n }\n\n const cursorPosition = component.editor.getSelectionRange()[0];\n const preceding = component.editor.value().slice(0, cursorPosition);\n const precedingNewlines = preceding.length == 0 ? 0 : 3 - preceding.match(/(\\n{0,2})$/)[0].length;\n\n component.editor.insertAtCursor(\n Array(precedingNewlines).join('\\n') + // Insert up to two newlines, depending on preceding whitespace\n (quote\n ? '> ' + mention + quote.trim().replace(/\\n/g, '\\n> ') + '\\n\\n'\n : mention)\n );\n}\n\nexport default function reply(post, quote) {\n const component = app.composer.component;\n if (component && component.props.post && component.props.post.discussion() === post.discussion()) {\n insertMention(post, component, quote);\n } else {\n DiscussionControls.replyAction.call(post.discussion())\n .then(newComponent => insertMention(post, newComponent, quote));\n }\n}\n","export default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}","import Button from 'flarum/components/Button';\nimport extract from 'flarum/utils/extract';\n\nimport reply from '../utils/reply';\n\nexport default class PostQuoteButton extends Button {\n view() {\n const post = extract(this.props, 'post');\n const content = extract(this.props, 'content');\n\n this.props.className = 'Button PostQuoteButton';\n this.props.icon = 'fas fa-quote-left';\n this.props.children = app.translator.trans('flarum-mentions.forum.post.quote_button');\n this.props.onclick = () => {\n this.hide();\n reply(post, content);\n };\n this.props.onmousedown = (e) => e.stopPropagation();\n\n return super.view();\n }\n\n config(isInitialized) {\n if (isInitialized) return;\n\n $(document).on('mousedown', this.hide.bind(this));\n }\n\n show(left, top) {\n const $this = this.$().show();\n const parentOffset = $this.offsetParent().offset();\n\n $this\n .css('left', left - parentOffset.left)\n .css('top', top - parentOffset.top);\n }\n\n showStart(left, top) {\n const $this = this.$();\n\n this.show(left, $(window).scrollTop() + top - $this.outerHeight() - 5);\n }\n\n showEnd(right, bottom) {\n const $this = this.$();\n\n this.show(right - $this.outerWidth(), $(window).scrollTop() + bottom + 5);\n }\n\n hide() {\n this.$().hide();\n }\n}\n","import { extend } from 'flarum/extend';\nimport CommentPost from 'flarum/components/CommentPost';\n\nimport PostQuoteButton from './components/PostQuoteButton';\nimport selectedText from './utils/selectedText';\n\nexport default function addPostQuoteButton() {\n extend(CommentPost.prototype, 'config', function(original, isInitialized) {\n const post = this.props.post;\n\n if (isInitialized || post.isHidden() || (app.session.user && !post.discussion().canReply())) return;\n\n const $postBody = this.$('.Post-body');\n\n // Wrap the quote button in a wrapper element so that we can render\n // button into it.\n const $container = $('');\n\n const handler = function(e) {\n setTimeout(() => {\n const content = selectedText($postBody);\n if (content) {\n const button = new PostQuoteButton({post, content});\n m.render($container[0], button.render());\n\n const rects = window.getSelection().getRangeAt(0).getClientRects();\n const firstRect = rects[0];\n\n if (e.clientY < firstRect.bottom && e.clientX - firstRect.right < firstRect.left - e.clientX) {\n button.showStart(firstRect.left, firstRect.top);\n } else {\n const lastRect = rects[rects.length - 1];\n button.showEnd(lastRect.right, lastRect.bottom);\n }\n }\n }, 1);\n };\n\n this.$().after($container).on('mouseup', handler);\n\n if ('ontouchstart' in window) {\n document.addEventListener('selectionchange', handler, false);\n }\n });\n}\n","export default function selectedText(body) {\n const selection = window.getSelection();\n if (selection.rangeCount) {\n const range = selection.getRangeAt(0);\n const parent = range.commonAncestorContainer;\n if (body[0] === parent || $.contains(body[0], parent)) {\n const clone = $(\"
\").append(range.cloneContents());\n\n // Replace emoji images with their shortcode (found in alt attribute)\n clone.find('img.emoji').replaceWith(function() {\n return this.alt;\n });\n\n // Replace all other images with a Markdown image\n clone.find('img').replaceWith(function() {\n return '![](' + this.src + ')';\n });\n\n // Replace all links with a Markdown link\n clone.find('a').replaceWith(function() {\n return '[' + this.innerText + '](' + this.href + ')';\n });\n\n return clone.text();\n }\n }\n return \"\";\n}\n","import Component from 'flarum/Component';\n\nexport default class AutocompleteDropdown extends Component {\n init() {\n this.active = false;\n this.index = 0;\n this.keyWasJustPressed = false;\n }\n\n view() {\n return (\n
\n {this.props.items.map(item =>
{item}
)}\n
\n );\n }\n\n show(left, top) {\n this.$().show().css({\n left: left + 'px',\n top: top + 'px'\n });\n this.active = true;\n }\n\n hide() {\n this.$().hide();\n this.active = false;\n }\n\n navigate(delta) {\n this.keyWasJustPressed = true;\n this.setIndex(this.index + delta, true);\n clearTimeout(this.keyWasJustPressedTimeout);\n this.keyWasJustPressedTimeout = setTimeout(() => this.keyWasJustPressed = false, 500);\n }\n\n complete() {\n this.$('li').eq(this.index).find('button').click();\n }\n\n setIndex(index, scrollToItem) {\n if (this.keyWasJustPressed && !scrollToItem) return;\n\n const $dropdown = this.$();\n const $items = $dropdown.find('li');\n let rangedIndex = index;\n\n if (rangedIndex < 0) {\n rangedIndex = $items.length - 1;\n } else if (rangedIndex >= $items.length) {\n rangedIndex = 0;\n }\n\n this.index = rangedIndex;\n\n const $item = $items.removeClass('active').eq(rangedIndex).addClass('active');\n\n if (scrollToItem) {\n const dropdownScroll = $dropdown.scrollTop();\n const dropdownTop = $dropdown.offset().top;\n const dropdownBottom = dropdownTop + $dropdown.outerHeight();\n const itemTop = $item.offset().top;\n const itemBottom = itemTop + $item.outerHeight();\n\n let scrollTop;\n if (itemTop < dropdownTop) {\n scrollTop = dropdownScroll - dropdownTop + itemTop - parseInt($dropdown.css('padding-top'), 10);\n } else if (itemBottom > dropdownBottom) {\n scrollTop = dropdownScroll - dropdownBottom + itemBottom + parseInt($dropdown.css('padding-bottom'), 10);\n }\n\n if (typeof scrollTop !== 'undefined') {\n $dropdown.stop(true).animate({scrollTop}, 100);\n }\n }\n }\n}\n","import getCaretCoordinates from 'textarea-caret';\n\nimport { extend } from 'flarum/extend';\nimport ComposerBody from 'flarum/components/ComposerBody';\nimport avatar from 'flarum/helpers/avatar';\nimport usernameHelper from 'flarum/helpers/username';\nimport highlight from 'flarum/helpers/highlight';\nimport KeyboardNavigatable from 'flarum/utils/KeyboardNavigatable';\nimport { truncate } from 'flarum/utils/string';\n\nimport AutocompleteDropdown from './components/AutocompleteDropdown';\n\nexport default function addComposerAutocomplete() {\n extend(ComposerBody.prototype, 'config', function(original, isInitialized) {\n if (isInitialized) return;\n\n const composer = this;\n const $container = $('');\n const dropdown = new AutocompleteDropdown({items: []});\n const $textarea = this.$('textarea').wrap('');\n const searched = [];\n let mentionStart;\n let typed;\n let searchTimeout;\n\n const applySuggestion = function(replacement) {\n const insert = replacement + ' ';\n\n const content = composer.content();\n composer.editor.setValue(content.substring(0, mentionStart - 1) + insert + content.substr($textarea[0].selectionStart));\n\n const index = mentionStart - 1 + insert.length;\n composer.editor.setSelectionRange(index, index);\n\n dropdown.hide();\n };\n\n this.navigator = new KeyboardNavigatable();\n this.navigator\n .when(() => dropdown.active)\n .onUp(() => dropdown.navigate(-1))\n .onDown(() => dropdown.navigate(1))\n .onSelect(dropdown.complete.bind(dropdown))\n .onCancel(dropdown.hide.bind(dropdown))\n .bindTo($textarea);\n\n $textarea\n .after($container)\n .on('click keyup', function(e) {\n // Up, down, enter, tab, escape, left, right.\n if ([9, 13, 27, 40, 38, 37, 39].indexOf(e.which) !== -1) return;\n\n const cursor = this.selectionStart;\n\n if (this.selectionEnd - cursor > 0) return;\n\n // Search backwards from the cursor for an '@' symbol. If we find one,\n // we will want to show the autocomplete dropdown!\n const value = this.value;\n mentionStart = 0;\n for (let i = cursor - 1; i >= cursor - 30; i--) {\n const character = value.substr(i, 1);\n if (character === '@') {\n mentionStart = i + 1;\n break;\n }\n }\n\n dropdown.hide();\n dropdown.active = false;\n\n if (mentionStart) {\n typed = value.substring(mentionStart, cursor).toLowerCase();\n\n const makeSuggestion = function(user, replacement, content, className = '') {\n const username = usernameHelper(user);\n if (typed) {\n username.children[0] = highlight(username.children[0], typed);\n }\n\n return (\n \n );\n };\n\n const userMatches = function(user) {\n const names = [\n user.username(),\n user.displayName()\n ];\n\n return names.some(value => value.toLowerCase().substr(0, typed.length) === typed);\n };\n\n const buildSuggestions = () => {\n const suggestions = [];\n\n // If the user has started to type a username, then suggest users\n // matching that username.\n if (typed) {\n app.store.all('users').forEach(user => {\n if (!userMatches(user)) return;\n\n suggestions.push(\n makeSuggestion(user, '@' + user.username(), '', 'MentionsDropdown-user')\n );\n });\n }\n\n // If the user is replying to a discussion, or if they are editing a\n // post, then we can suggest other posts in the discussion to mention.\n // We will add the 5 most recent comments in the discussion which\n // match any username characters that have been typed.\n const composerPost = composer.props.post;\n const discussion = (composerPost && composerPost.discussion()) || composer.props.discussion;\n if (discussion) {\n discussion.posts()\n .filter(post => post && post.contentType() === 'comment' && (!composerPost || post.number() < composerPost.number()))\n .sort((a, b) => b.createdAt() - a.createdAt())\n .filter(post => {\n const user = post.user();\n return user && userMatches(user);\n })\n .splice(0, 5)\n .forEach(post => {\n const user = post.user();\n suggestions.push(\n makeSuggestion(user, '@' + user.username() + '#' + post.id(), [\n app.translator.trans('flarum-mentions.forum.composer.reply_to_post_text', {number: post.number()}), ' — ',\n truncate(post.contentPlain(), 200)\n ], 'MentionsDropdown-post')\n );\n });\n }\n\n if (suggestions.length) {\n dropdown.props.items = suggestions;\n m.render($container[0], dropdown.render());\n\n dropdown.show();\n const coordinates = getCaretCoordinates(this, mentionStart);\n const width = dropdown.$().outerWidth();\n const height = dropdown.$().outerHeight();\n const parent = dropdown.$().offsetParent();\n let left = coordinates.left;\n let top = coordinates.top - this.scrollTop + 15;\n if (top + height > parent.height()) {\n top = coordinates.top - this.scrollTop - height - 15;\n }\n if (left + width > parent.width()) {\n left = parent.width() - width;\n }\n dropdown.show(left, top);\n } else {\n dropdown.active = false;\n dropdown.hide();\n }\n };\n\n dropdown.active = true;\n\n buildSuggestions();\n\n dropdown.setIndex(0);\n dropdown.$().scrollTop(0);\n\n clearTimeout(searchTimeout);\n if (typed) {\n searchTimeout = setTimeout(function() {\n const typedLower = typed.toLowerCase();\n if (searched.indexOf(typedLower) === -1) {\n app.store.find('users', {filter: {q: typed}, page: {limit: 5}}).then(() => {\n if (dropdown.active) buildSuggestions();\n });\n searched.push(typedLower);\n }\n }, 250);\n }\n }\n });\n });\n}\n","import Notification from 'flarum/components/Notification';\nimport username from 'flarum/helpers/username';\nimport punctuateSeries from 'flarum/helpers/punctuateSeries';\n\nexport default class PostMentionedNotification extends Notification {\n icon() {\n return 'fas fa-reply';\n }\n\n href() {\n const notification = this.props.notification;\n const post = notification.subject();\n const auc = notification.additionalUnreadCount();\n const content = notification.content();\n\n return app.route.discussion(post.discussion(), auc ? post.number() : (content && content.replyNumber));\n }\n\n content() {\n const notification = this.props.notification;\n const auc = notification.additionalUnreadCount();\n const user = notification.fromUser();\n\n return app.translator.transChoice('flarum-mentions.forum.notifications.post_mentioned_text', auc + 1, {\n user,\n username: auc ? punctuateSeries([\n username(user),\n app.translator.transChoice('flarum-mentions.forum.notifications.others_text', auc, {count: auc})\n ]) : undefined\n });\n }\n\n excerpt() {\n return this.props.notification.subject().contentPlain();\n }\n}\n","import Notification from 'flarum/components/Notification';\n\nexport default class UserMentionedNotification extends Notification {\n icon() {\n return 'fas fa-at';\n }\n\n href() {\n const post = this.props.notification.subject();\n\n return app.route.discussion(post.discussion(), post.number());\n }\n\n content() {\n const user = this.props.notification.fromUser();\n\n return app.translator.trans('flarum-mentions.forum.notifications.user_mentioned_text', {user});\n }\n\n excerpt() {\n return this.props.notification.subject().contentPlain();\n }\n}\n","import PostsUserPage from 'flarum/components/PostsUserPage';\n\n/**\n * The `MentionsUserPage` component shows post which user Mentioned at\n */\nexport default class MentionsUserPage extends PostsUserPage {\n /**\n * Load a new page of the user's activity feed.\n *\n * @param {Integer} [offset] The position to start getting results from.\n * @return {Promise}\n * @protected\n */\n loadResults(offset) {\n return app.store.find('posts', {\n filter: {\n type: 'comment',\n mentioned: this.user.id()\n },\n page: {offset, limit: this.loadLimit},\n sort: '-time'\n });\n }\n}\n","import { extend } from 'flarum/extend';\nimport app from 'flarum/app';\nimport NotificationGrid from 'flarum/components/NotificationGrid';\nimport { getPlainContent } from 'flarum/utils/string';\n\nimport addPostMentionPreviews from './addPostMentionPreviews';\nimport addMentionedByList from './addMentionedByList';\nimport addPostReplyAction from './addPostReplyAction';\nimport addPostQuoteButton from './addPostQuoteButton';\nimport addComposerAutocomplete from './addComposerAutocomplete';\nimport PostMentionedNotification from './components/PostMentionedNotification';\nimport UserMentionedNotification from './components/UserMentionedNotification';\nimport UserPage from 'flarum/components/UserPage'\nimport LinkButton from 'flarum/components/LinkButton';\nimport MentionsUserPage from './components/MentionsUserPage';\n\napp.initializers.add('flarum-mentions', function() {\n // For every mention of a post inside a post's content, set up a hover handler\n // that shows a preview of the mentioned post.\n addPostMentionPreviews();\n\n // In the footer of each post, show information about who has replied (i.e.\n // who the post has been mentioned by).\n addMentionedByList();\n\n // Add a 'reply' control to the footer of each post. When clicked, it will\n // open up the composer and add a post mention to its contents.\n addPostReplyAction();\n\n // Show a Quote button when Post text is selected\n addPostQuoteButton();\n\n // After typing '@' in the composer, show a dropdown suggesting a bunch of\n // posts or users that the user could mention.\n addComposerAutocomplete();\n\n app.notificationComponents.postMentioned = PostMentionedNotification;\n app.notificationComponents.userMentioned = UserMentionedNotification;\n\n // Add notification preferences.\n extend(NotificationGrid.prototype, 'notificationTypes', function(items) {\n items.add('postMentioned', {\n name: 'postMentioned',\n icon: 'fas fa-reply',\n label: app.translator.trans('flarum-mentions.forum.settings.notify_post_mentioned_label')\n });\n\n items.add('userMentioned', {\n name: 'userMentioned',\n icon: 'fas fa-at',\n label: app.translator.trans('flarum-mentions.forum.settings.notify_user_mentioned_label')\n });\n });\n\n // Add mentions tab in user profile\n app.routes['user.mentions'] = {path: '/u/:username/mentions', component: MentionsUserPage.component()};\n extend(UserPage.prototype, 'navItems', function(items) {\n const user = this.user;\n items.add('mentions',\n LinkButton.component({\n href: app.route('user.mentions', {username: user.username()}),\n name: 'mentions',\n children: [app.translator.trans('flarum-mentions.forum.user.mentions_link')],\n icon: 'fas fa-at'\n }),\n 80\n );\n });\n\n // Remove post mentions when rendering post previews.\n getPlainContent.removeSelectors.push('a.PostMention');\n});\n","import { extend } from 'flarum/extend';\nimport CommentPost from 'flarum/components/CommentPost';\nimport PostPreview from 'flarum/components/PostPreview';\nimport LoadingIndicator from 'flarum/components/LoadingIndicator';\n\nexport default function addPostMentionPreviews() {\n extend(CommentPost.prototype, 'config', function() {\n const contentHtml = this.props.post.contentHtml();\n\n if (contentHtml === this.oldPostContentHtml || this.isEditing()) return;\n\n this.oldPostContentHtml = contentHtml;\n\n const parentPost = this.props.post;\n const $parentPost = this.$();\n\n this.$('.UserMention, .PostMention').each(function() {\n m.route.call(this, this, false, {}, {attrs: {href: this.getAttribute('href')}});\n });\n\n this.$('.PostMention').each(function() {\n const $this = $(this);\n const id = $this.data('id');\n let timeout;\n\n // Wrap the mention link in a wrapper element so that we can insert a\n // preview popup as its sibling and relatively position it.\n const $preview = $('
');\n $parentPost.append($preview);\n\n const getPostElement = () => {\n return $(`.PostStream-item[data-id=\"${id}\"]`);\n };\n\n const showPreview = () => {\n // When the user hovers their mouse over the mention, look for the\n // post that it's referring to in the stream, and determine if it's\n // in the viewport. If it is, we will \"pulsate\" it.\n const $post = getPostElement();\n let visible = false;\n if ($post.length) {\n const top = $post.offset().top;\n const scrollTop = window.pageYOffset;\n if (top > scrollTop && top + $post.height() < scrollTop + $(window).height()) {\n $post.addClass('pulsate');\n visible = true;\n }\n }\n\n // Otherwise, we will show a popup preview of the post. If the post\n // hasn't yet been loaded, we will need to do that.\n if (!visible) {\n // Position the preview so that it appears above the mention.\n // (The offsetParent should be .Post-body.)\n const positionPreview = () => {\n const previewHeight = $preview.outerHeight(true);\n let offset = 0;\n\n // If the preview goes off the top of the viewport, reposition it to\n // be below the mention.\n if ($this.offset().top - previewHeight < $(window).scrollTop() + $('#header').outerHeight()) {\n offset += $this.outerHeight(true);\n } else {\n offset -= previewHeight;\n }\n\n $preview.show()\n .css('top', $this.offset().top - $parentPost.offset().top + offset)\n .css('left', $this.offsetParent().offset().left - $parentPost.offset().left)\n .css('max-width', $this.offsetParent().width());\n };\n\n const showPost = post => {\n const discussion = post.discussion();\n\n m.render($preview[0], [\n discussion !== parentPost.discussion()\n ?
{discussion.title()}
\n : '',\n
{PostPreview.component({post})}
\n ]);\n positionPreview();\n };\n\n const post = app.store.getById('posts', id);\n if (post && post.discussion()) {\n showPost(post);\n } else {\n m.render($preview[0], LoadingIndicator.component());\n app.store.find('posts', id).then(showPost);\n positionPreview();\n }\n\n setTimeout(() => $preview.off('transitionend').addClass('in'));\n }\n };\n\n const hidePreview = () => {\n getPostElement().removeClass('pulsate');\n if ($preview.hasClass('in')) {\n $preview.removeClass('in').one('transitionend', () => $preview.hide());\n }\n };\n\n $this.on('touchstart', e => e.preventDefault());\n\n $this.add($preview).hover(\n () => {\n clearTimeout(timeout);\n timeout = setTimeout(showPreview, 250);\n },\n () => {\n clearTimeout(timeout);\n getPostElement().removeClass('pulsate');\n timeout = setTimeout(hidePreview, 250);\n }\n )\n .on('touchend', e => {\n showPreview();\n e.stopPropagation();\n });\n\n $(document).on('touchend', hidePreview);\n });\n });\n}\n","import { extend } from 'flarum/extend';\nimport Model from 'flarum/Model';\nimport Post from 'flarum/models/Post';\nimport CommentPost from 'flarum/components/CommentPost';\nimport PostPreview from 'flarum/components/PostPreview';\nimport punctuateSeries from 'flarum/helpers/punctuateSeries';\nimport username from 'flarum/helpers/username';\nimport icon from 'flarum/helpers/icon';\n\nexport default function addMentionedByList() {\n Post.prototype.mentionedBy = Model.hasMany('mentionedBy');\n\n extend(CommentPost.prototype, 'footerItems', function(items) {\n const post = this.props.post;\n const replies = post.mentionedBy();\n\n if (replies && replies.length) {\n // If there is only one reply, and it's adjacent to this post, we don't\n // really need to show the list.\n if (replies.length === 1 && replies[0].number() === post.number() + 1) {\n return;\n }\n\n const hidePreview = () => {\n this.$('.Post-mentionedBy-preview')\n .removeClass('in')\n .one('transitionend', function() { $(this).hide(); });\n };\n\n const config = function(element, isInitialized) {\n if (isInitialized) return;\n\n const $this = $(element);\n let timeout;\n\n const $preview = $('
');\n $this.append($preview);\n\n $this.children().hover(function() {\n clearTimeout(timeout);\n timeout = setTimeout(function() {\n if (!$preview.hasClass('in') && $preview.is(':visible')) return;\n\n // When the user hovers their mouse over the list of people who have\n // replied to the post, render a list of reply previews into a\n // popup.\n m.render($preview[0], replies.map(reply => (\n
\n )));\n $preview.show();\n setTimeout(() => $preview.off('transitionend').addClass('in'));\n }, 500);\n }, function() {\n clearTimeout(timeout);\n timeout = setTimeout(hidePreview, 250);\n });\n\n // Whenever the user hovers their mouse over a particular name in the\n // list of repliers, highlight the corresponding post in the preview\n // popup.\n $this.find('.Post-mentionedBy-summary a').hover(function() {\n $preview.find('[data-number=\"' + $(this).data('number') + '\"]').addClass('active');\n }, function() {\n $preview.find('[data-number]').removeClass('active');\n });\n };\n\n const users = [];\n const repliers = replies\n .sort(reply => reply.user() === app.session.user ? -1 : 0)\n .filter(reply => {\n const user = reply.user();\n if (users.indexOf(user) === -1) {\n users.push(user);\n return true;\n }\n });\n\n const limit = 4;\n const overLimit = repliers.length > limit;\n\n // Create a list of unique users who have replied. So even if a user has\n // replied twice, they will only be in this array once.\n const names = repliers\n .slice(0, overLimit ? limit - 1 : limit)\n .map(reply => {\n const user = reply.user();\n\n return (\n \n {app.session.user === user ? app.translator.trans('flarum-mentions.forum.post.you_text') : username(user)}\n \n );\n });\n\n // If there are more users that we've run out of room to display, add a \"x\n // others\" name to the end of the list. Clicking on it will display a modal\n // with a full list of names.\n if (overLimit) {\n const count = repliers.length - names.length;\n\n names.push(\n app.translator.transChoice('flarum-mentions.forum.post.others_text', count, {count})\n );\n }\n\n items.add('replies',\n
\n );\n }\n });\n}\n","import { extend } from 'flarum/extend';\nimport Button from 'flarum/components/Button';\nimport CommentPost from 'flarum/components/CommentPost';\n\nimport reply from './utils/reply';\n\nexport default function () {\n extend(CommentPost.prototype, 'actionItems', function (items) {\n\n const post = this.props.post;\n\n if (post.isHidden() || (app.session.user && !post.discussion().canReply())) return;\n\n items.add('reply',\n Button.component({\n className: 'Button Button--link',\n children: app.translator.trans('flarum-mentions.forum.post.reply_link'),\n onclick: () => reply(post)\n })\n );\n });\n}\n"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack://@flarum/flarum-ext-mentions/webpack/bootstrap","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['extend']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['app']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['components/CommentPost']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['utils/string']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['components/PostPreview']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['helpers/username']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['components/Button']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['components/Notification']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['utils/extract']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['components/NotificationGrid']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['components/LoadingIndicator']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['Model']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['models/Post']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['helpers/punctuateSeries']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['helpers/icon']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['utils/DiscussionControls']\"","webpack://@flarum/flarum-ext-mentions/./node_modules/textarea-caret/index.js","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['components/ComposerBody']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['helpers/avatar']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['helpers/highlight']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['utils/KeyboardNavigatable']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['Component']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['components/UserPage']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['components/LinkButton']\"","webpack://@flarum/flarum-ext-mentions/external \"flarum.core.compat['components/PostsUserPage']\"","webpack://@flarum/flarum-ext-mentions/./src/forum/utils/reply.js","webpack://@flarum/flarum-ext-mentions/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@flarum/flarum-ext-mentions/./src/forum/components/PostQuoteButton.js","webpack://@flarum/flarum-ext-mentions/./src/forum/addPostQuoteButton.js","webpack://@flarum/flarum-ext-mentions/./src/forum/utils/selectedText.js","webpack://@flarum/flarum-ext-mentions/./src/forum/components/AutocompleteDropdown.js","webpack://@flarum/flarum-ext-mentions/./src/forum/addComposerAutocomplete.js","webpack://@flarum/flarum-ext-mentions/./src/forum/components/PostMentionedNotification.js","webpack://@flarum/flarum-ext-mentions/./src/forum/components/UserMentionedNotification.js","webpack://@flarum/flarum-ext-mentions/./src/forum/components/MentionsUserPage.js","webpack://@flarum/flarum-ext-mentions/./src/forum/index.js","webpack://@flarum/flarum-ext-mentions/./src/forum/addPostMentionPreviews.js","webpack://@flarum/flarum-ext-mentions/./src/forum/addMentionedByList.js","webpack://@flarum/flarum-ext-mentions/./src/forum/addPostReplyAction.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","flarum","core","compat","properties","isBrowser","window","isFirefox","mozInnerScreenX","getCaretCoordinates","element","position","options","Error","debug","el","document","querySelector","parentNode","removeChild","div","createElement","id","body","appendChild","style","computed","getComputedStyle","currentStyle","isInput","nodeName","whiteSpace","wordWrap","visibility","forEach","prop","lineHeight","height","scrollHeight","parseInt","overflowY","overflow","textContent","substring","replace","span","coordinates","top","offsetTop","left","offsetLeft","backgroundColor","insertMention","post","component","quote","user","mention","username","number","content","props","originalContent","cursorPosition","editor","getSelectionRange","preceding","slice","precedingNewlines","length","match","insertAtCursor","Array","join","trim","reply","app","composer","discussion","DiscussionControls","replyAction","then","newComponent","_inheritsLoose","subClass","superClass","constructor","__proto__","PostQuoteButton","view","_this","this","extract","className","icon","children","translator","trans","onclick","hide","onmousedown","e","stopPropagation","_Button","config","isInitialized","$","on","show","$this","parentOffset","offsetParent","offset","css","showStart","scrollTop","outerHeight","showEnd","right","bottom","outerWidth","Button","addPostQuoteButton","extend","CommentPost","original","isHidden","session","canReply","$postBody","$container","handler","setTimeout","selection","getSelection","rangeCount","range","getRangeAt","parent","commonAncestorContainer","contains","clone","append","cloneContents","find","replaceWith","alt","src","innerText","href","text","selectedText","button","render","rects","getClientRects","firstRect","clientY","clientX","lastRect","after","addEventListener","AutocompleteDropdown","init","active","index","keyWasJustPressed","items","map","item","navigate","delta","setIndex","clearTimeout","keyWasJustPressedTimeout","complete","eq","click","scrollToItem","$dropdown","$items","rangedIndex","$item","removeClass","addClass","dropdownScroll","dropdownTop","dropdownBottom","itemTop","itemBottom","stop","animate","Component","addComposerAutocomplete","ComposerBody","mentionStart","typed","searchTimeout","dropdown","$textarea","wrap","searched","navigator","KeyboardNavigatable","when","onUp","onDown","onSelect","onCancel","bindTo","indexOf","which","cursor","selectionStart","selectionEnd","substr","toLowerCase","makeSuggestion","replacement","usernameHelper","highlight","insert","setValue","setSelectionRange","applySuggestion","onmouseenter","avatar","userMatches","displayName","some","buildSuggestions","suggestions","store","all","push","composerPost","posts","filter","contentType","sort","a","b","createdAt","splice","truncate","contentPlain","width","typedLower","q","page","limit","PostMentionedNotification","notification","subject","route","replyNumber","fromUser","transChoice","excerpt","Notification","UserMentionedNotification","MentionsUserPage","loadResults","type","mentioned","loadLimit","PostsUserPage","initializers","add","contentHtml","oldPostContentHtml","isEditing","parentPost","$parentPost","each","attrs","getAttribute","timeout","data","$preview","getPostElement","showPreview","$post","visible","pageYOffset","positionPreview","previewHeight","showPost","title","PostPreview","getById","LoadingIndicator","off","hidePreview","hasClass","one","preventDefault","hover","Post","mentionedBy","Model","hasMany","replies","users","repliers","overLimit","names","data-number","count","is","punctuateSeries","notificationComponents","postMentioned","userMentioned","NotificationGrid","label","routes","path","UserPage","LinkButton","getPlainContent","removeSelectors"],"mappings":"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","file":"forum.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 25);\n","module.exports = flarum.core.compat['extend'];","module.exports = flarum.core.compat['app'];","module.exports = flarum.core.compat['components/CommentPost'];","module.exports = flarum.core.compat['utils/string'];","module.exports = flarum.core.compat['components/PostPreview'];","module.exports = flarum.core.compat['helpers/username'];","module.exports = flarum.core.compat['components/Button'];","module.exports = flarum.core.compat['components/Notification'];","module.exports = flarum.core.compat['utils/extract'];","module.exports = flarum.core.compat['components/NotificationGrid'];","module.exports = flarum.core.compat['components/LoadingIndicator'];","module.exports = flarum.core.compat['Model'];","module.exports = flarum.core.compat['models/Post'];","module.exports = flarum.core.compat['helpers/punctuateSeries'];","module.exports = flarum.core.compat['helpers/icon'];","module.exports = flarum.core.compat['utils/DiscussionControls'];","/* jshint browser: true */\n\n(function () {\n\n// We'll copy the properties below into the mirror div.\n// Note that some browsers, such as Firefox, do not concatenate properties\n// into their shorthand (e.g. padding-top, padding-bottom etc. -> padding),\n// so we have to list every single property explicitly.\nvar properties = [\n 'direction', // RTL support\n 'boxSizing',\n 'width', // on Chrome and IE, exclude the scrollbar, so the mirror div wraps exactly as the textarea does\n 'height',\n 'overflowX',\n 'overflowY', // copy the scrollbar for IE\n\n 'borderTopWidth',\n 'borderRightWidth',\n 'borderBottomWidth',\n 'borderLeftWidth',\n 'borderStyle',\n\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/font\n 'fontStyle',\n 'fontVariant',\n 'fontWeight',\n 'fontStretch',\n 'fontSize',\n 'fontSizeAdjust',\n 'lineHeight',\n 'fontFamily',\n\n 'textAlign',\n 'textTransform',\n 'textIndent',\n 'textDecoration', // might not make a difference, but better be safe\n\n 'letterSpacing',\n 'wordSpacing',\n\n 'tabSize',\n 'MozTabSize'\n\n];\n\nvar isBrowser = (typeof window !== 'undefined');\nvar isFirefox = (isBrowser && window.mozInnerScreenX != null);\n\nfunction getCaretCoordinates(element, position, options) {\n if (!isBrowser) {\n throw new Error('textarea-caret-position#getCaretCoordinates should only be called in a browser');\n }\n\n var debug = options && options.debug || false;\n if (debug) {\n var el = document.querySelector('#input-textarea-caret-position-mirror-div');\n if (el) el.parentNode.removeChild(el);\n }\n\n // The mirror div will replicate the textarea's style\n var div = document.createElement('div');\n div.id = 'input-textarea-caret-position-mirror-div';\n document.body.appendChild(div);\n\n var style = div.style;\n var computed = window.getComputedStyle ? window.getComputedStyle(element) : element.currentStyle; // currentStyle for IE < 9\n var isInput = element.nodeName === 'INPUT';\n\n // Default textarea styles\n style.whiteSpace = 'pre-wrap';\n if (!isInput)\n style.wordWrap = 'break-word'; // only for textarea-s\n\n // Position off-screen\n style.position = 'absolute'; // required to return coordinates properly\n if (!debug)\n style.visibility = 'hidden'; // not 'display: none' because we want rendering\n\n // Transfer the element's properties to the div\n properties.forEach(function (prop) {\n if (isInput && prop === 'lineHeight') {\n // Special case for s because text is rendered centered and line height may be != height\n style.lineHeight = computed.height;\n } else {\n style[prop] = computed[prop];\n }\n });\n\n if (isFirefox) {\n // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275\n if (element.scrollHeight > parseInt(computed.height))\n style.overflowY = 'scroll';\n } else {\n style.overflow = 'hidden'; // for Chrome to not render a scrollbar; IE keeps overflowY = 'scroll'\n }\n\n div.textContent = element.value.substring(0, position);\n // The second special handling for input type=\"text\" vs textarea:\n // spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/13402035/1269037\n if (isInput)\n div.textContent = div.textContent.replace(/\\s/g, '\\u00a0');\n\n var span = document.createElement('span');\n // Wrapping must be replicated *exactly*, including when a long word gets\n // onto the next line, with whitespace at the end of the line before (#7).\n // The *only* reliable way to do that is to copy the *entire* rest of the\n // textarea's content into the created at the caret position.\n // For inputs, just '.' would be enough, but no need to bother.\n span.textContent = element.value.substring(position) || '.'; // || because a completely empty faux span doesn't render at all\n div.appendChild(span);\n\n var coordinates = {\n top: span.offsetTop + parseInt(computed['borderTopWidth']),\n left: span.offsetLeft + parseInt(computed['borderLeftWidth']),\n height: parseInt(computed['lineHeight'])\n };\n\n if (debug) {\n span.style.backgroundColor = '#aaa';\n } else {\n document.body.removeChild(div);\n }\n\n return coordinates;\n}\n\nif (typeof module != 'undefined' && typeof module.exports != 'undefined') {\n module.exports = getCaretCoordinates;\n} else if(isBrowser) {\n window.getCaretCoordinates = getCaretCoordinates;\n}\n\n}());\n","module.exports = flarum.core.compat['components/ComposerBody'];","module.exports = flarum.core.compat['helpers/avatar'];","module.exports = flarum.core.compat['helpers/highlight'];","module.exports = flarum.core.compat['utils/KeyboardNavigatable'];","module.exports = flarum.core.compat['Component'];","module.exports = flarum.core.compat['components/UserPage'];","module.exports = flarum.core.compat['components/LinkButton'];","module.exports = flarum.core.compat['components/PostsUserPage'];","import DiscussionControls from 'flarum/utils/DiscussionControls';\n\nfunction insertMention(post, component, quote) {\n const user = post.user();\n const mention = '@' + (user ? user.username() : post.number()) + '#' + post.id() + ' ';\n\n // If the composer is empty, then assume we're starting a new reply.\n // In which case we don't want the user to have to confirm if they\n // close the composer straight away.\n if (!component.content()) {\n component.props.originalContent = mention;\n }\n\n const cursorPosition = component.editor.getSelectionRange()[0];\n const preceding = component.editor.value().slice(0, cursorPosition);\n const precedingNewlines = preceding.length == 0 ? 0 : 3 - preceding.match(/(\\n{0,2})$/)[0].length;\n\n component.editor.insertAtCursor(\n Array(precedingNewlines).join('\\n') + // Insert up to two newlines, depending on preceding whitespace\n (quote\n ? '> ' + mention + quote.trim().replace(/\\n/g, '\\n> ') + '\\n\\n'\n : mention)\n );\n}\n\nexport default function reply(post, quote) {\n const component = app.composer.component;\n if (component && component.props.post && component.props.post.discussion() === post.discussion()) {\n insertMention(post, component, quote);\n } else {\n DiscussionControls.replyAction.call(post.discussion())\n .then(newComponent => insertMention(post, newComponent, quote));\n }\n}\n","export default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}","import Button from 'flarum/components/Button';\nimport extract from 'flarum/utils/extract';\n\nimport reply from '../utils/reply';\n\nexport default class PostQuoteButton extends Button {\n view() {\n const post = extract(this.props, 'post');\n const content = extract(this.props, 'content');\n\n this.props.className = 'Button PostQuoteButton';\n this.props.icon = 'fas fa-quote-left';\n this.props.children = app.translator.trans('flarum-mentions.forum.post.quote_button');\n this.props.onclick = () => {\n this.hide();\n reply(post, content);\n };\n this.props.onmousedown = (e) => e.stopPropagation();\n\n return super.view();\n }\n\n config(isInitialized) {\n if (isInitialized) return;\n\n $(document).on('mousedown', this.hide.bind(this));\n }\n\n show(left, top) {\n const $this = this.$().show();\n const parentOffset = $this.offsetParent().offset();\n\n $this\n .css('left', left - parentOffset.left)\n .css('top', top - parentOffset.top);\n }\n\n showStart(left, top) {\n const $this = this.$();\n\n this.show(left, $(window).scrollTop() + top - $this.outerHeight() - 5);\n }\n\n showEnd(right, bottom) {\n const $this = this.$();\n\n this.show(right - $this.outerWidth(), $(window).scrollTop() + bottom + 5);\n }\n\n hide() {\n this.$().hide();\n }\n}\n","import { extend } from 'flarum/extend';\nimport CommentPost from 'flarum/components/CommentPost';\n\nimport PostQuoteButton from './components/PostQuoteButton';\nimport selectedText from './utils/selectedText';\n\nexport default function addPostQuoteButton() {\n extend(CommentPost.prototype, 'config', function(original, isInitialized) {\n const post = this.props.post;\n\n if (isInitialized || post.isHidden() || (app.session.user && !post.discussion().canReply())) return;\n\n const $postBody = this.$('.Post-body');\n\n // Wrap the quote button in a wrapper element so that we can render\n // button into it.\n const $container = $('');\n\n const handler = function(e) {\n setTimeout(() => {\n const content = selectedText($postBody);\n if (content) {\n const button = new PostQuoteButton({post, content});\n m.render($container[0], button.render());\n\n const rects = window.getSelection().getRangeAt(0).getClientRects();\n const firstRect = rects[0];\n\n if (e.clientY < firstRect.bottom && e.clientX - firstRect.right < firstRect.left - e.clientX) {\n button.showStart(firstRect.left, firstRect.top);\n } else {\n const lastRect = rects[rects.length - 1];\n button.showEnd(lastRect.right, lastRect.bottom);\n }\n }\n }, 1);\n };\n\n this.$().after($container).on('mouseup', handler);\n\n if ('ontouchstart' in window) {\n document.addEventListener('selectionchange', handler, false);\n }\n });\n}\n","export default function selectedText(body) {\n const selection = window.getSelection();\n if (selection.rangeCount) {\n const range = selection.getRangeAt(0);\n const parent = range.commonAncestorContainer;\n if (body[0] === parent || $.contains(body[0], parent)) {\n const clone = $(\"
\").append(range.cloneContents());\n\n // Replace emoji images with their shortcode (found in alt attribute)\n clone.find('img.emoji').replaceWith(function() {\n return this.alt;\n });\n\n // Replace all other images with a Markdown image\n clone.find('img').replaceWith(function() {\n return '![](' + this.src + ')';\n });\n\n // Replace all links with a Markdown link\n clone.find('a').replaceWith(function() {\n return '[' + this.innerText + '](' + this.href + ')';\n });\n\n return clone.text();\n }\n }\n return \"\";\n}\n","import Component from 'flarum/Component';\n\nexport default class AutocompleteDropdown extends Component {\n init() {\n this.active = false;\n this.index = 0;\n this.keyWasJustPressed = false;\n }\n\n view() {\n return (\n
\n {this.props.items.map(item =>
{item}
)}\n
\n );\n }\n\n show(left, top) {\n this.$().show().css({\n left: left + 'px',\n top: top + 'px'\n });\n this.active = true;\n }\n\n hide() {\n this.$().hide();\n this.active = false;\n }\n\n navigate(delta) {\n this.keyWasJustPressed = true;\n this.setIndex(this.index + delta, true);\n clearTimeout(this.keyWasJustPressedTimeout);\n this.keyWasJustPressedTimeout = setTimeout(() => this.keyWasJustPressed = false, 500);\n }\n\n complete() {\n this.$('li').eq(this.index).find('button').click();\n }\n\n setIndex(index, scrollToItem) {\n if (this.keyWasJustPressed && !scrollToItem) return;\n\n const $dropdown = this.$();\n const $items = $dropdown.find('li');\n let rangedIndex = index;\n\n if (rangedIndex < 0) {\n rangedIndex = $items.length - 1;\n } else if (rangedIndex >= $items.length) {\n rangedIndex = 0;\n }\n\n this.index = rangedIndex;\n\n const $item = $items.removeClass('active').eq(rangedIndex).addClass('active');\n\n if (scrollToItem) {\n const dropdownScroll = $dropdown.scrollTop();\n const dropdownTop = $dropdown.offset().top;\n const dropdownBottom = dropdownTop + $dropdown.outerHeight();\n const itemTop = $item.offset().top;\n const itemBottom = itemTop + $item.outerHeight();\n\n let scrollTop;\n if (itemTop < dropdownTop) {\n scrollTop = dropdownScroll - dropdownTop + itemTop - parseInt($dropdown.css('padding-top'), 10);\n } else if (itemBottom > dropdownBottom) {\n scrollTop = dropdownScroll - dropdownBottom + itemBottom + parseInt($dropdown.css('padding-bottom'), 10);\n }\n\n if (typeof scrollTop !== 'undefined') {\n $dropdown.stop(true).animate({scrollTop}, 100);\n }\n }\n }\n}\n","import getCaretCoordinates from 'textarea-caret';\n\nimport { extend } from 'flarum/extend';\nimport ComposerBody from 'flarum/components/ComposerBody';\nimport avatar from 'flarum/helpers/avatar';\nimport usernameHelper from 'flarum/helpers/username';\nimport highlight from 'flarum/helpers/highlight';\nimport KeyboardNavigatable from 'flarum/utils/KeyboardNavigatable';\nimport { truncate } from 'flarum/utils/string';\n\nimport AutocompleteDropdown from './components/AutocompleteDropdown';\n\nexport default function addComposerAutocomplete() {\n extend(ComposerBody.prototype, 'config', function(original, isInitialized) {\n if (isInitialized) return;\n\n const composer = this;\n const $container = $('');\n const dropdown = new AutocompleteDropdown({items: []});\n const $textarea = this.$('textarea').wrap('');\n const searched = [];\n let mentionStart;\n let typed;\n let searchTimeout;\n\n const applySuggestion = function(replacement) {\n const insert = replacement + ' ';\n\n const content = composer.content();\n composer.editor.setValue(content.substring(0, mentionStart - 1) + insert + content.substr($textarea[0].selectionStart));\n\n const index = mentionStart - 1 + insert.length;\n composer.editor.setSelectionRange(index, index);\n\n dropdown.hide();\n };\n\n this.navigator = new KeyboardNavigatable();\n this.navigator\n .when(() => dropdown.active)\n .onUp(() => dropdown.navigate(-1))\n .onDown(() => dropdown.navigate(1))\n .onSelect(dropdown.complete.bind(dropdown))\n .onCancel(dropdown.hide.bind(dropdown))\n .bindTo($textarea);\n\n $textarea\n .after($container)\n .on('click keyup', function(e) {\n // Up, down, enter, tab, escape, left, right.\n if ([9, 13, 27, 40, 38, 37, 39].indexOf(e.which) !== -1) return;\n\n const cursor = this.selectionStart;\n\n if (this.selectionEnd - cursor > 0) return;\n\n // Search backwards from the cursor for an '@' symbol. If we find one,\n // we will want to show the autocomplete dropdown!\n const value = this.value;\n mentionStart = 0;\n for (let i = cursor - 1; i >= cursor - 30; i--) {\n const character = value.substr(i, 1);\n if (character === '@') {\n mentionStart = i + 1;\n break;\n }\n }\n\n dropdown.hide();\n dropdown.active = false;\n\n if (mentionStart) {\n typed = value.substring(mentionStart, cursor).toLowerCase();\n\n const makeSuggestion = function(user, replacement, content, className = '') {\n const username = usernameHelper(user);\n if (typed) {\n username.children[0] = highlight(username.children[0], typed);\n }\n\n return (\n \n );\n };\n\n const userMatches = function(user) {\n const names = [\n user.username(),\n user.displayName()\n ];\n\n return names.some(value => value.toLowerCase().substr(0, typed.length) === typed);\n };\n\n const buildSuggestions = () => {\n const suggestions = [];\n\n // If the user has started to type a username, then suggest users\n // matching that username.\n if (typed) {\n app.store.all('users').forEach(user => {\n if (!userMatches(user)) return;\n\n suggestions.push(\n makeSuggestion(user, '@' + user.username(), '', 'MentionsDropdown-user')\n );\n });\n }\n\n // If the user is replying to a discussion, or if they are editing a\n // post, then we can suggest other posts in the discussion to mention.\n // We will add the 5 most recent comments in the discussion which\n // match any username characters that have been typed.\n const composerPost = composer.props.post;\n const discussion = (composerPost && composerPost.discussion()) || composer.props.discussion;\n if (discussion) {\n discussion.posts()\n .filter(post => post && post.contentType() === 'comment' && (!composerPost || post.number() < composerPost.number()))\n .sort((a, b) => b.createdAt() - a.createdAt())\n .filter(post => {\n const user = post.user();\n return user && userMatches(user);\n })\n .splice(0, 5)\n .forEach(post => {\n const user = post.user();\n suggestions.push(\n makeSuggestion(user, '@' + user.username() + '#' + post.id(), [\n app.translator.trans('flarum-mentions.forum.composer.reply_to_post_text', {number: post.number()}), ' — ',\n truncate(post.contentPlain(), 200)\n ], 'MentionsDropdown-post')\n );\n });\n }\n\n if (suggestions.length) {\n dropdown.props.items = suggestions;\n m.render($container[0], dropdown.render());\n\n dropdown.show();\n const coordinates = getCaretCoordinates(this, mentionStart);\n const width = dropdown.$().outerWidth();\n const height = dropdown.$().outerHeight();\n const parent = dropdown.$().offsetParent();\n let left = coordinates.left;\n let top = coordinates.top - this.scrollTop + 15;\n if (top + height > parent.height()) {\n top = coordinates.top - this.scrollTop - height - 15;\n }\n if (left + width > parent.width()) {\n left = parent.width() - width;\n }\n dropdown.show(left, top);\n } else {\n dropdown.active = false;\n dropdown.hide();\n }\n };\n\n dropdown.active = true;\n\n buildSuggestions();\n\n dropdown.setIndex(0);\n dropdown.$().scrollTop(0);\n\n clearTimeout(searchTimeout);\n if (typed) {\n searchTimeout = setTimeout(function() {\n const typedLower = typed.toLowerCase();\n if (searched.indexOf(typedLower) === -1) {\n app.store.find('users', {filter: {q: typed}, page: {limit: 5}}).then(() => {\n if (dropdown.active) buildSuggestions();\n });\n searched.push(typedLower);\n }\n }, 250);\n }\n }\n });\n });\n}\n","import Notification from 'flarum/components/Notification';\n\nexport default class PostMentionedNotification extends Notification {\n icon() {\n return 'fas fa-reply';\n }\n\n href() {\n const notification = this.props.notification;\n const post = notification.subject();\n const content = notification.content();\n\n return app.route.discussion(post.discussion(), content && content.replyNumber);\n }\n\n content() {\n const notification = this.props.notification;\n const user = notification.fromUser();\n\n return app.translator.transChoice('flarum-mentions.forum.notifications.post_mentioned_text', 1, {user});\n }\n\n excerpt() {\n return this.props.notification.subject().contentPlain();\n }\n}\n","import Notification from 'flarum/components/Notification';\n\nexport default class UserMentionedNotification extends Notification {\n icon() {\n return 'fas fa-at';\n }\n\n href() {\n const post = this.props.notification.subject();\n\n return app.route.discussion(post.discussion(), post.number());\n }\n\n content() {\n const user = this.props.notification.fromUser();\n\n return app.translator.trans('flarum-mentions.forum.notifications.user_mentioned_text', {user});\n }\n\n excerpt() {\n return this.props.notification.subject().contentPlain();\n }\n}\n","import PostsUserPage from 'flarum/components/PostsUserPage';\n\n/**\n * The `MentionsUserPage` component shows post which user Mentioned at\n */\nexport default class MentionsUserPage extends PostsUserPage {\n /**\n * Load a new page of the user's activity feed.\n *\n * @param {Integer} [offset] The position to start getting results from.\n * @return {Promise}\n * @protected\n */\n loadResults(offset) {\n return app.store.find('posts', {\n filter: {\n type: 'comment',\n mentioned: this.user.id()\n },\n page: {offset, limit: this.loadLimit},\n sort: '-time'\n });\n }\n}\n","import { extend } from 'flarum/extend';\nimport app from 'flarum/app';\nimport NotificationGrid from 'flarum/components/NotificationGrid';\nimport { getPlainContent } from 'flarum/utils/string';\n\nimport addPostMentionPreviews from './addPostMentionPreviews';\nimport addMentionedByList from './addMentionedByList';\nimport addPostReplyAction from './addPostReplyAction';\nimport addPostQuoteButton from './addPostQuoteButton';\nimport addComposerAutocomplete from './addComposerAutocomplete';\nimport PostMentionedNotification from './components/PostMentionedNotification';\nimport UserMentionedNotification from './components/UserMentionedNotification';\nimport UserPage from 'flarum/components/UserPage'\nimport LinkButton from 'flarum/components/LinkButton';\nimport MentionsUserPage from './components/MentionsUserPage';\n\napp.initializers.add('flarum-mentions', function() {\n // For every mention of a post inside a post's content, set up a hover handler\n // that shows a preview of the mentioned post.\n addPostMentionPreviews();\n\n // In the footer of each post, show information about who has replied (i.e.\n // who the post has been mentioned by).\n addMentionedByList();\n\n // Add a 'reply' control to the footer of each post. When clicked, it will\n // open up the composer and add a post mention to its contents.\n addPostReplyAction();\n\n // Show a Quote button when Post text is selected\n addPostQuoteButton();\n\n // After typing '@' in the composer, show a dropdown suggesting a bunch of\n // posts or users that the user could mention.\n addComposerAutocomplete();\n\n app.notificationComponents.postMentioned = PostMentionedNotification;\n app.notificationComponents.userMentioned = UserMentionedNotification;\n\n // Add notification preferences.\n extend(NotificationGrid.prototype, 'notificationTypes', function(items) {\n items.add('postMentioned', {\n name: 'postMentioned',\n icon: 'fas fa-reply',\n label: app.translator.trans('flarum-mentions.forum.settings.notify_post_mentioned_label')\n });\n\n items.add('userMentioned', {\n name: 'userMentioned',\n icon: 'fas fa-at',\n label: app.translator.trans('flarum-mentions.forum.settings.notify_user_mentioned_label')\n });\n });\n\n // Add mentions tab in user profile\n app.routes['user.mentions'] = {path: '/u/:username/mentions', component: MentionsUserPage.component()};\n extend(UserPage.prototype, 'navItems', function(items) {\n const user = this.user;\n items.add('mentions',\n LinkButton.component({\n href: app.route('user.mentions', {username: user.username()}),\n name: 'mentions',\n children: [app.translator.trans('flarum-mentions.forum.user.mentions_link')],\n icon: 'fas fa-at'\n }),\n 80\n );\n });\n\n // Remove post mentions when rendering post previews.\n getPlainContent.removeSelectors.push('a.PostMention');\n});\n","import { extend } from 'flarum/extend';\nimport CommentPost from 'flarum/components/CommentPost';\nimport PostPreview from 'flarum/components/PostPreview';\nimport LoadingIndicator from 'flarum/components/LoadingIndicator';\n\nexport default function addPostMentionPreviews() {\n extend(CommentPost.prototype, 'config', function() {\n const contentHtml = this.props.post.contentHtml();\n\n if (contentHtml === this.oldPostContentHtml || this.isEditing()) return;\n\n this.oldPostContentHtml = contentHtml;\n\n const parentPost = this.props.post;\n const $parentPost = this.$();\n\n this.$('.UserMention, .PostMention').each(function() {\n m.route.call(this, this, false, {}, {attrs: {href: this.getAttribute('href')}});\n });\n\n this.$('.PostMention').each(function() {\n const $this = $(this);\n const id = $this.data('id');\n let timeout;\n\n // Wrap the mention link in a wrapper element so that we can insert a\n // preview popup as its sibling and relatively position it.\n const $preview = $('
');\n $parentPost.append($preview);\n\n const getPostElement = () => {\n return $(`.PostStream-item[data-id=\"${id}\"]`);\n };\n\n const showPreview = () => {\n // When the user hovers their mouse over the mention, look for the\n // post that it's referring to in the stream, and determine if it's\n // in the viewport. If it is, we will \"pulsate\" it.\n const $post = getPostElement();\n let visible = false;\n if ($post.length) {\n const top = $post.offset().top;\n const scrollTop = window.pageYOffset;\n if (top > scrollTop && top + $post.height() < scrollTop + $(window).height()) {\n $post.addClass('pulsate');\n visible = true;\n }\n }\n\n // Otherwise, we will show a popup preview of the post. If the post\n // hasn't yet been loaded, we will need to do that.\n if (!visible) {\n // Position the preview so that it appears above the mention.\n // (The offsetParent should be .Post-body.)\n const positionPreview = () => {\n const previewHeight = $preview.outerHeight(true);\n let offset = 0;\n\n // If the preview goes off the top of the viewport, reposition it to\n // be below the mention.\n if ($this.offset().top - previewHeight < $(window).scrollTop() + $('#header').outerHeight()) {\n offset += $this.outerHeight(true);\n } else {\n offset -= previewHeight;\n }\n\n $preview.show()\n .css('top', $this.offset().top - $parentPost.offset().top + offset)\n .css('left', $this.offsetParent().offset().left - $parentPost.offset().left)\n .css('max-width', $this.offsetParent().width());\n };\n\n const showPost = post => {\n const discussion = post.discussion();\n\n m.render($preview[0], [\n discussion !== parentPost.discussion()\n ?
{discussion.title()}
\n : '',\n
{PostPreview.component({post})}
\n ]);\n positionPreview();\n };\n\n const post = app.store.getById('posts', id);\n if (post && post.discussion()) {\n showPost(post);\n } else {\n m.render($preview[0], LoadingIndicator.component());\n app.store.find('posts', id).then(showPost);\n positionPreview();\n }\n\n setTimeout(() => $preview.off('transitionend').addClass('in'));\n }\n };\n\n const hidePreview = () => {\n getPostElement().removeClass('pulsate');\n if ($preview.hasClass('in')) {\n $preview.removeClass('in').one('transitionend', () => $preview.hide());\n }\n };\n\n $this.on('touchstart', e => e.preventDefault());\n\n $this.add($preview).hover(\n () => {\n clearTimeout(timeout);\n timeout = setTimeout(showPreview, 250);\n },\n () => {\n clearTimeout(timeout);\n getPostElement().removeClass('pulsate');\n timeout = setTimeout(hidePreview, 250);\n }\n )\n .on('touchend', e => {\n showPreview();\n e.stopPropagation();\n });\n\n $(document).on('touchend', hidePreview);\n });\n });\n}\n","import { extend } from 'flarum/extend';\nimport Model from 'flarum/Model';\nimport Post from 'flarum/models/Post';\nimport CommentPost from 'flarum/components/CommentPost';\nimport PostPreview from 'flarum/components/PostPreview';\nimport punctuateSeries from 'flarum/helpers/punctuateSeries';\nimport username from 'flarum/helpers/username';\nimport icon from 'flarum/helpers/icon';\n\nexport default function addMentionedByList() {\n Post.prototype.mentionedBy = Model.hasMany('mentionedBy');\n\n extend(CommentPost.prototype, 'footerItems', function(items) {\n const post = this.props.post;\n const replies = post.mentionedBy();\n\n if (replies && replies.length) {\n // If there is only one reply, and it's adjacent to this post, we don't\n // really need to show the list.\n if (replies.length === 1 && replies[0].number() === post.number() + 1) {\n return;\n }\n\n const hidePreview = () => {\n this.$('.Post-mentionedBy-preview')\n .removeClass('in')\n .one('transitionend', function() { $(this).hide(); });\n };\n\n const config = function(element, isInitialized) {\n if (isInitialized) return;\n\n const $this = $(element);\n let timeout;\n\n const $preview = $('
');\n $this.append($preview);\n\n $this.children().hover(function() {\n clearTimeout(timeout);\n timeout = setTimeout(function() {\n if (!$preview.hasClass('in') && $preview.is(':visible')) return;\n\n // When the user hovers their mouse over the list of people who have\n // replied to the post, render a list of reply previews into a\n // popup.\n m.render($preview[0], replies.map(reply => (\n
\n )));\n $preview.show();\n setTimeout(() => $preview.off('transitionend').addClass('in'));\n }, 500);\n }, function() {\n clearTimeout(timeout);\n timeout = setTimeout(hidePreview, 250);\n });\n\n // Whenever the user hovers their mouse over a particular name in the\n // list of repliers, highlight the corresponding post in the preview\n // popup.\n $this.find('.Post-mentionedBy-summary a').hover(function() {\n $preview.find('[data-number=\"' + $(this).data('number') + '\"]').addClass('active');\n }, function() {\n $preview.find('[data-number]').removeClass('active');\n });\n };\n\n const users = [];\n const repliers = replies\n .sort(reply => reply.user() === app.session.user ? -1 : 0)\n .filter(reply => {\n const user = reply.user();\n if (users.indexOf(user) === -1) {\n users.push(user);\n return true;\n }\n });\n\n const limit = 4;\n const overLimit = repliers.length > limit;\n\n // Create a list of unique users who have replied. So even if a user has\n // replied twice, they will only be in this array once.\n const names = repliers\n .slice(0, overLimit ? limit - 1 : limit)\n .map(reply => {\n const user = reply.user();\n\n return (\n \n {app.session.user === user ? app.translator.trans('flarum-mentions.forum.post.you_text') : username(user)}\n \n );\n });\n\n // If there are more users that we've run out of room to display, add a \"x\n // others\" name to the end of the list. Clicking on it will display a modal\n // with a full list of names.\n if (overLimit) {\n const count = repliers.length - names.length;\n\n names.push(\n app.translator.transChoice('flarum-mentions.forum.post.others_text', count, {count})\n );\n }\n\n items.add('replies',\n
\n );\n }\n });\n}\n","import { extend } from 'flarum/extend';\nimport Button from 'flarum/components/Button';\nimport CommentPost from 'flarum/components/CommentPost';\n\nimport reply from './utils/reply';\n\nexport default function () {\n extend(CommentPost.prototype, 'actionItems', function (items) {\n\n const post = this.props.post;\n\n if (post.isHidden() || (app.session.user && !post.discussion().canReply())) return;\n\n items.add('reply',\n Button.component({\n className: 'Button Button--link',\n children: app.translator.trans('flarum-mentions.forum.post.reply_link'),\n onclick: () => reply(post)\n })\n );\n });\n}\n"],"sourceRoot":""}
\ No newline at end of file