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);