From b981082dd706f508b9654bba01cd94439d0e3cc9 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 16 Dec 2025 14:21:51 -0500 Subject: [PATCH] fix: removed ajaxify refresh on crosspost commit, dynamically update post stats in template, logic fix --- public/language/en-GB/aria.json | 3 ++- public/language/en-GB/global.json | 1 + public/src/client/topic.js | 18 ++++++++++++++++++ src/controllers/write/topics.js | 5 +++++ src/routes/write/topics.js | 1 + src/topics/crossposts.js | 2 +- 6 files changed, 28 insertions(+), 2 deletions(-) diff --git a/public/language/en-GB/aria.json b/public/language/en-GB/aria.json index 8e2c565c82..ec7889d2f4 100644 --- a/public/language/en-GB/aria.json +++ b/public/language/en-GB/aria.json @@ -5,5 +5,6 @@ "profile-page-for": "Profile page for user %1", "user-watched-tags": "User watched tags", "delete-upload-button": "Delete upload button", - "group-page-link-for": "Group page link for %1" + "group-page-link-for": "Group page link for %1", + "show-crossposts": "Show Cross-posts" } \ No newline at end of file diff --git a/public/language/en-GB/global.json b/public/language/en-GB/global.json index 7e66953d0a..8c76edde4c 100644 --- a/public/language/en-GB/global.json +++ b/public/language/en-GB/global.json @@ -81,6 +81,7 @@ "users": "Users", "topics": "Topics", "posts": "Posts", + "crossposts": "Cross-posts", "x-posts": "%1 posts", "x-topics": "%1 topics", "x-reputation": "%1 reputation", diff --git a/public/src/client/topic.js b/public/src/client/topic.js index bdebc50264..97787e749e 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -69,6 +69,7 @@ define('forum/topic', [ setupQuickReply(); handleBookmark(tid); handleThumbs(); + addCrosspostsHandler(); $(window).on('scroll', utils.debounce(updateTopicTitle, 250)); @@ -406,6 +407,23 @@ define('forum/topic', [ }); } + function addCrosspostsHandler() { + const anchorEl = document.getElementById('show-crossposts'); + if (anchorEl) { + anchorEl.addEventListener('click', async () => { + const { crossposts } = ajaxify.data; + const html = await app.parseAndTranslate('modals/crossposts', { crossposts }); + bootbox.dialog({ + size: 'sm', + onEscape: true, + backdrop: true, + title: '[[global:crossposts]]', + message: html, + }); + }); + } + } + function setupQuickReply() { if (config.enableQuickReply || (config.theme && config.theme.enableQuickReply)) { quickreply.init(); diff --git a/src/controllers/write/topics.js b/src/controllers/write/topics.js index 2dea5dff5d..5bca992074 100644 --- a/src/controllers/write/topics.js +++ b/src/controllers/write/topics.js @@ -214,6 +214,11 @@ Topics.move = async (req, res) => { helpers.formatApiResponse(200, res); }; +Topics.getCrossposts = async (req, res) => { + const crossposts = await topics.crossposts.get(req.params.tid); + helpers.formatApiResponse(200, res, { crossposts }); +}; + Topics.crosspost = async (req, res) => { const { cid } = req.body; const crossposts = await topics.crossposts.add(req.params.tid, cid, req.uid); diff --git a/src/routes/write/topics.js b/src/routes/write/topics.js index 0ec6fc2509..a1c7810558 100644 --- a/src/routes/write/topics.js +++ b/src/routes/write/topics.js @@ -54,6 +54,7 @@ module.exports = function () { setupApiRoute(router, 'put', '/:tid/move', [...middlewares, middleware.assert.topic], controllers.write.topics.move); + setupApiRoute(router, 'get', '/:tid/crossposts', [...middlewares, middleware.assert.topic], controllers.write.topics.getCrossposts); setupApiRoute(router, 'post', '/:tid/crossposts', [...middlewares, middleware.assert.topic], controllers.write.topics.crosspost); setupApiRoute(router, 'delete', '/:tid/crossposts', [...middlewares, middleware.assert.topic], controllers.write.topics.uncrosspost); diff --git a/src/topics/crossposts.js b/src/topics/crossposts.js index ca07aadd7c..20ed086d71 100644 --- a/src/topics/crossposts.js +++ b/src/topics/crossposts.js @@ -17,7 +17,7 @@ Crossposts.get = async function (tid) { return cids; }, new Set()); let categoriesData = await categories.getCategoriesFields( - cids, ['cid', 'name', 'icon', 'bgColor', 'color', 'slug'] + Array.from(cids), ['cid', 'name', 'icon', 'bgColor', 'color', 'slug'] ); categoriesData = categoriesData.reduce((map, category) => { map.set(parseInt(category.cid, 10), category);