From d5bfd512676850b71b96b07d5bb930f58441294a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 17 Nov 2021 23:34:01 -0500 Subject: [PATCH] fix: #10010, handle reverse sorting for topic events dont add events to dom if sort is most votes if sorting is reverse add new events after the main post or at the top instead of bottom --- public/src/client/topic/posts.js | 15 ++++++++++++++- public/src/modules/helpers.js | 9 ++++++--- src/controllers/write/topics.js | 2 +- src/topics/events.js | 6 ++++-- src/topics/index.js | 2 +- src/topics/posts.js | 25 +++++++++++++++++-------- 6 files changed, 43 insertions(+), 16 deletions(-) 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) {