diff --git a/install/package.json b/install/package.json
index 84e3a1424b..340447d5a4 100644
--- a/install/package.json
+++ b/install/package.json
@@ -104,10 +104,10 @@
"nodebb-plugin-ntfy": "1.7.4",
"nodebb-plugin-spam-be-gone": "2.2.2",
"nodebb-rewards-essentials": "1.0.0",
- "nodebb-theme-harmony": "1.2.61",
+ "nodebb-theme-harmony": "1.2.63",
"nodebb-theme-lavender": "7.1.8",
- "nodebb-theme-peace": "2.2.5",
- "nodebb-theme-persona": "13.3.23",
+ "nodebb-theme-peace": "2.2.6",
+ "nodebb-theme-persona": "13.3.24",
"nodebb-widget-essentials": "7.0.16",
"nodemailer": "6.9.14",
"nprogress": "0.2.0",
diff --git a/public/language/en-GB/post-queue.json b/public/language/en-GB/post-queue.json
index 021ed0d83f..24b33da2e6 100644
--- a/public/language/en-GB/post-queue.json
+++ b/public/language/en-GB/post-queue.json
@@ -38,5 +38,6 @@
"remove-selected": "Remove Selected",
"remove-selected-confirm": "Do you want to remove %1 selected posts?",
"bulk-accept-success": "%1 posts accepted",
- "bulk-reject-success": "%1 posts rejected"
+ "bulk-reject-success": "%1 posts rejected",
+ "links-in-this-post": "Links in this post"
}
\ No newline at end of file
diff --git a/public/src/client/post-queue.js b/public/src/client/post-queue.js
index d7cfb9f230..ff5fa931d7 100644
--- a/public/src/client/post-queue.js
+++ b/public/src/client/post-queue.js
@@ -29,8 +29,23 @@ define('forum/post-queue', [
});
$('[component="post/content"] img:not(.not-responsive)').addClass('img-fluid');
+ showLinksInPosts();
};
+ function showLinksInPosts() {
+ $('.posts-list [data-id]').each((idx, el) => {
+ const $el = $(el);
+ const linkContainer = $el.find('[component="post-queue/link-container"]');
+ const linkList = linkContainer.find('[component="post-queue/link-container/list"]');
+ const linksInPost = $el.find('.post-content a');
+ linksInPost.each((idx, link) => {
+ const href = $(link).attr('href');
+ linkList.append(`
${href}`);
+ });
+ linkContainer.toggleClass('hidden', !linksInPost.length);
+ });
+ }
+
function confirmReject(msg) {
return new Promise((resolve) => {
bootbox.confirm(msg, resolve);
diff --git a/src/topics/events.js b/src/topics/events.js
index 5d163f4977..f63f4b32a8 100644
--- a/src/topics/events.js
+++ b/src/topics/events.js
@@ -120,7 +120,11 @@ Events.get = async (tid, uid, reverse = false) => {
const timestamps = eventIds.map(obj => obj.score);
eventIds = eventIds.map(obj => obj.value);
let events = await db.getObjects(keys);
- events = await modifyEvent({ tid, uid, eventIds, timestamps, events });
+ events.forEach((e, idx) => {
+ e.timestamp = timestamps[idx];
+ });
+ await addEventsFromPostQueue(tid, uid, events);
+ events = await modifyEvent({ uid, events });
if (reverse) {
events.reverse();
}
@@ -144,8 +148,7 @@ async function getCategoryInfo(cids) {
return _.zipObject(uniqCids, catData);
}
-async function modifyEvent({ tid, uid, eventIds, timestamps, events }) {
- // Add posts from post queue
+async function addEventsFromPostQueue(tid, uid, events) {
const isPrivileged = await user.isPrivileged(uid);
if (isPrivileged) {
const queuedPosts = await posts.getQueuedPosts({ tid }, { metadata: false });
@@ -155,11 +158,10 @@ async function modifyEvent({ tid, uid, eventIds, timestamps, events }) {
timestamp: item.data.timestamp || Date.now(),
uid: item.data.uid,
})));
- queuedPosts.forEach((item) => {
- timestamps.push(item.data.timestamp || Date.now());
- });
}
+}
+async function modifyEvent({ uid, events }) {
const [users, fromCategories, userSettings] = await Promise.all([
getUserInfo(events.map(event => event.uid).filter(Boolean)),
getCategoryInfo(events.map(event => event.fromCid).filter(Boolean)),
@@ -183,10 +185,8 @@ async function modifyEvent({ tid, uid, eventIds, timestamps, events }) {
events = events.filter(event => Events._types.hasOwnProperty(event.type));
// Add user & metadata
- events.forEach((event, idx) => {
- event.id = parseInt(eventIds[idx], 10);
- event.timestamp = timestamps[idx];
- event.timestampISO = new Date(timestamps[idx]).toISOString();
+ events.forEach((event) => {
+ event.timestampISO = utils.toISOString(event.timestamp);
if (event.hasOwnProperty('uid')) {
event.user = users.get(event.uid === 'system' ? 'system' : parseInt(event.uid, 10));
}
@@ -221,16 +221,15 @@ Events.log = async (tid, payload) => {
}
const eventId = await db.incrObjectField('global', 'nextTopicEventId');
+ payload.id = eventId;
await Promise.all([
db.setObject(`topicEvent:${eventId}`, payload),
db.sortedSetAdd(`topic:${tid}:events`, timestamp, eventId),
]);
-
+ payload.timestamp = timestamp;
let events = await modifyEvent({
uid: payload.uid,
- eventIds: [eventId],
- timestamps: [timestamp],
events: [payload],
});
diff --git a/src/upgrades/3.8.3/topic-event-ids.js b/src/upgrades/3.8.3/topic-event-ids.js
new file mode 100644
index 0000000000..b85963db6e
--- /dev/null
+++ b/src/upgrades/3.8.3/topic-event-ids.js
@@ -0,0 +1,38 @@
+/* eslint-disable no-await-in-loop */
+
+'use strict';
+
+const db = require('../../database');
+const batch = require('../../batch');
+
+module.exports = {
+ name: 'Add id field to all topic events',
+ timestamp: Date.UTC(2024, 5, 24),
+ method: async function () {
+ const { progress } = this;
+
+ let nextId = await db.getObjectField('global', 'nextTopicEventId');
+ nextId = parseInt(nextId, 10) || 0;
+ const ids = [];
+ for (let i = 1; i < nextId; i++) {
+ ids.push(i);
+ }
+ await batch.processArray(ids, async (eids) => {
+ const eventData = await db.getObjects(eids.map(eid => `topicEvent:${eid}`));
+ const bulkSet = [];
+ eventData.forEach((event, idx) => {
+ if (event && event.type) {
+ const id = eids[idx];
+ bulkSet.push(
+ [`topicEvent:${id}`, { id: id }]
+ );
+ }
+ });
+ await db.setObjectBulk(bulkSet);
+ progress.incr(eids.length);
+ }, {
+ batch: 500,
+ progress,
+ });
+ },
+};