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 += `