diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 1be5080d4b..7545e2199e 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -10,7 +10,8 @@ define('forum/topic/posts', [ 'components', 'translator', 'hooks', -], function (pagination, infinitescroll, postTools, images, navigator, components, translator, hooks) { + 'helpers', +], function (pagination, infinitescroll, postTools, images, navigator, components, translator, hooks, helpers) { var Posts = { }; Posts.onNewPost = function (data) { @@ -281,56 +282,13 @@ define('forum/topic/posts', [ posts.find('[component="post/content"] img:not(.not-responsive)').addClass('img-responsive'); Posts.addBlockquoteEllipses(posts); hidePostToolsForDeletedPosts(posts); - addNecroPostMessage(Posts.addTopicEvents); + addNecroPostMessage(); }; Posts.addTopicEvents = function (events) { - events = events || ajaxify.data.events; - if (!events || !Array.isArray(events)) { - return; - } - - if (config.topicPostSort !== 'newest_to_oldest' && config.topicPostSort !== 'oldest_to_newest') { - return; - } - - // Filter out events already in DOM - const eventIdsInDOM = Array.from(document.querySelectorAll('[component="topic/event"]')).map(el => parseInt(el.getAttribute('data-topic-event-id'), 10)); - events = events.filter(event => !eventIdsInDOM.includes(event.id)); - - let postTimestamps = ajaxify.data.posts.map(post => post.timestamp); - - const reverse = config.topicPostSort === 'newest_to_oldest'; - events = events.slice(0); - if (reverse) { - events.reverse(); - postTimestamps = postTimestamps.slice(1); // OP is always at top, so exclude from calculations - } - - Promise.all(events.map((event) => { - const beforeIdx = postTimestamps.findIndex( - timestamp => (reverse ? (timestamp < event.timestamp) : (timestamp > event.timestamp)) - ); - let postEl; - if (beforeIdx > -1) { - postEl = document.querySelector(`[component="post"][data-pid="${ajaxify.data.posts[beforeIdx + (reverse ? 1 : 0)].pid}"]`); - } - - return new Promise((resolve) => { - event.isAdminOrMod = ajaxify.data.privileges.isAdminOrMod; - app.parseAndTranslate('partials/topic/event', event, function (html) { - html = html.get(0); - - if (postEl) { - document.querySelector('[component="topic"]').insertBefore(html, postEl); - } else { - document.querySelector('[component="topic"]').append(html); - } - - resolve(); - }); - }); - })).then(() => { + const html = helpers.renderEvents.call(ajaxify.data, events); + translator.translate(html, (translated) => { + document.querySelector('[component="topic"]').insertAdjacentHTML('beforeend', translated); $('[component="topic/event"] .timeago').timeago(); }); }; diff --git a/public/src/modules/helpers.js b/public/src/modules/helpers.js index 5ac03464f6..c70e4aa281 100644 --- a/public/src/modules/helpers.js +++ b/public/src/modules/helpers.js @@ -14,23 +14,25 @@ Benchpress.setGlobal('false', false); var helpers = { - displayMenuItem: displayMenuItem, - buildMetaTag: buildMetaTag, - buildLinkTag: buildLinkTag, - stringify: stringify, - escape: escape, - stripTags: stripTags, - generateCategoryBackground: generateCategoryBackground, - generateChildrenCategories: generateChildrenCategories, - generateTopicClass: generateTopicClass, - membershipBtn: membershipBtn, - spawnPrivilegeStates: spawnPrivilegeStates, - localeToHTML: localeToHTML, - renderTopicImage: renderTopicImage, - renderDigestAvatar: renderDigestAvatar, - userAgentIcons: userAgentIcons, - buildAvatar: buildAvatar, - register: register, + displayMenuItem, + buildMetaTag, + buildLinkTag, + stringify, + escape, + stripTags, + generateCategoryBackground, + generateChildrenCategories, + generateTopicClass, + membershipBtn, + spawnPrivilegeStates, + localeToHTML, + renderTopicImage, + renderTopicEvents, + renderEvents, + renderDigestAvatar, + userAgentIcons, + buildAvatar, + register, __escape: identity, }; @@ -208,6 +210,46 @@ return ''; } + function renderTopicEvents(index) { + const start = this.posts[index].timestamp; + const end = this.posts[index + 1] ? this.posts[index + 1].timestamp : Date.now(); + const events = this.events.filter(event => event.timestamp >= start && event.timestamp < end); + if (!events.length) { + return ''; + } + + return renderEvents.call(this, events); + } + + function renderEvents(events) { + return events.reduce((html, event) => { + html += `
  • +
    + +
    + + ${event.href ? `${buildAvatar(event.user, 'xs', true)} ${event.user.username} `; + } else { + html += `[[global:system-user]] `; + } + } + + html += ``; + + if (this.privileges.isAdminOrMod) { + html += ` `; + } + + return html; + }, ''); + } + function renderDigestAvatar(block) { if (block.teaser) { if (block.teaser.user.picture) {