diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 1301e7289a..3b03b950cb 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -289,9 +289,22 @@ define('forum/topic/posts', [ }; Posts.addTopicEvents = function (events) { + if (config.topicPostSort === 'most_votes') { + return; + } const html = helpers.renderEvents.call(ajaxify.data, events); translator.translate(html, (translated) => { - document.querySelector('[component="topic"]').insertAdjacentHTML('beforeend', translated); + if (config.topicPostSort === 'oldest_to_newest') { + $('[component="topic"]').append(translated); + } else if (config.topicPostSort === 'newest_to_oldest') { + const mainPost = $('[component="topic"] [component="post"][data-index="0"]'); + if (mainPost.length) { + $(translated).insertAfter(mainPost); + } else { + $('[component="topic"]').prepend(translated); + } + } + $('[component="topic/event"] .timeago').timeago(); }); }; diff --git a/public/src/modules/helpers.js b/public/src/modules/helpers.js index 34781ba92d..4ec6763e94 100644 --- a/public/src/modules/helpers.js +++ b/public/src/modules/helpers.js @@ -210,9 +210,12 @@ return ''; } - function renderTopicEvents(index) { - const start = this.posts[index].timestamp; - const end = this.posts[index].nextPostTimestamp; + function renderTopicEvents(index, sort) { + if (sort === 'most_votes') { + return ''; + } + const start = this.posts[index].eventStart; + const end = this.posts[index].eventEnd; const events = this.events.filter(event => event.timestamp >= start && event.timestamp < end); if (!events.length) { return ''; diff --git a/src/controllers/write/topics.js b/src/controllers/write/topics.js index 3cbef43311..1a6b8a342f 100644 --- a/src/controllers/write/topics.js +++ b/src/controllers/write/topics.js @@ -209,7 +209,7 @@ Topics.getEvents = async (req, res) => { return helpers.formatApiResponse(403, res); } - helpers.formatApiResponse(200, res, await topics.events.get(req.params.tid)); + helpers.formatApiResponse(200, res, await topics.events.get(req.params.tid, req.uid)); }; Topics.deleteEvent = async (req, res) => { diff --git a/src/topics/events.js b/src/topics/events.js index 1d2688e5fd..dcbf414e27 100644 --- a/src/topics/events.js +++ b/src/topics/events.js @@ -66,7 +66,7 @@ Events.init = async () => { Events._types = types; }; -Events.get = async (tid, uid) => { +Events.get = async (tid, uid, reverse = false) => { const topics = require('.'); if (!await topics.exists(tid)) { @@ -79,7 +79,9 @@ Events.get = async (tid, uid) => { eventIds = eventIds.map(obj => obj.value); let events = await db.getObjects(keys); events = await modifyEvent({ tid, uid, eventIds, timestamps, events }); - + if (reverse) { + events.reverse(); + } return events; }; diff --git a/src/topics/index.js b/src/topics/index.js index 9584b8d7cf..56e047dbc5 100644 --- a/src/topics/index.js +++ b/src/topics/index.js @@ -179,7 +179,7 @@ Topics.getTopicWithPosts = async function (topicData, set, uid, start, stop, rev getMerger(topicData), Topics.getRelatedTopics(topicData, uid), Topics.thumbs.load([topicData]), - Topics.events.get(topicData.tid, uid), + Topics.events.get(topicData.tid, uid, reverse), ]); topicData.thumbs = thumbs[0]; diff --git a/src/topics/posts.js b/src/topics/posts.js index 5185ce4066..97c3ebbb87 100644 --- a/src/topics/posts.js +++ b/src/topics/posts.js @@ -56,7 +56,7 @@ module.exports = function (Topics) { Topics.calculatePostIndices(replies, repliesStart); - await Topics.addNextPostTimestamp(postData, set, reverse); + await addEventStartEnd(postData, set, reverse, topicOrTid); const result = await plugins.hooks.fire('filter:topic.getPosts', { topic: topicOrTid, uid: uid, @@ -65,24 +65,33 @@ module.exports = function (Topics) { return result.posts; }; - Topics.addNextPostTimestamp = async function (postData, set, reverse) { + async function addEventStartEnd(postData, set, reverse, topicData) { if (!postData.length) { return; } postData.forEach((p, index) => { - if (p && postData[index + 1]) { - p.nextPostTimestamp = postData[index + 1].timestamp; + if (p && p.index === 0 && reverse) { + p.eventStart = topicData.lastposttime; + p.eventEnd = Date.now(); + } else if (p && postData[index + 1]) { + p.eventStart = reverse ? postData[index + 1].timestamp : p.timestamp; + p.eventEnd = reverse ? p.timestamp : postData[index + 1].timestamp; } }); const lastPost = postData[postData.length - 1]; if (lastPost) { - lastPost.nextPostTimestamp = Date.now(); + lastPost.eventStart = reverse ? topicData.timestamp : lastPost.timestamp; + lastPost.eventEnd = reverse ? lastPost.timestamp : Date.now(); if (lastPost.index) { - const data = await db[reverse ? 'getSortedSetRevRangeWithScores' : 'getSortedSetRangeWithScores'](set, lastPost.index, lastPost.index); - lastPost.nextPostTimestamp = data.length ? data[0].score : lastPost.nextPostTimestamp; + const nextPost = await db[reverse ? 'getSortedSetRevRangeWithScores' : 'getSortedSetRangeWithScores'](set, lastPost.index, lastPost.index); + if (reverse) { + lastPost.eventStart = nextPost.length ? nextPost[0].score : lastPost.eventStart; + } else { + lastPost.eventEnd = nextPost.length ? nextPost[0].score : lastPost.eventEnd; + } } } - }; + } Topics.addPostData = async function (postData, uid) { if (!Array.isArray(postData) || !postData.length) {