diff --git a/CHANGELOG.md b/CHANGELOG.md index 84f0853701..1d0b8e2fc1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,47 @@ +#### v3.6.1 (2023-12-22) + +##### Chores + +* incrementing version number - v3.6.0 (4cdf85f8) +* update changelog for v3.6.0 (eb92cee6) +* incrementing version number - v3.5.3 (ed0e8783) +* incrementing version number - v3.5.2 (52fbb2da) +* incrementing version number - v3.5.1 (4c543488) +* incrementing version number - v3.5.0 (d06fb4f0) +* incrementing version number - v3.4.3 (5c984250) +* incrementing version number - v3.4.2 (3f0dac38) +* incrementing version number - v3.4.1 (01e69574) +* incrementing version number - v3.4.0 (fd9247c5) +* incrementing version number - v3.3.9 (5805e770) +* incrementing version number - v3.3.8 (a5603565) +* incrementing version number - v3.3.7 (b26f1744) +* incrementing version number - v3.3.6 (7fb38792) +* incrementing version number - v3.3.4 (a67f84ea) +* incrementing version number - v3.3.3 (f94d239b) +* incrementing version number - v3.3.2 (ec9dac97) +* incrementing version number - v3.3.1 (151cc68f) +* incrementing version number - v3.3.0 (fc1ad70f) +* incrementing version number - v3.2.3 (b06d3e63) +* incrementing version number - v3.2.2 (758ecfcd) +* incrementing version number - v3.2.1 (20145074) +* incrementing version number - v3.2.0 (9ecac38e) +* incrementing version number - v3.1.7 (0b4e81ab) +* incrementing version number - v3.1.6 (b3a3b130) +* incrementing version number - v3.1.5 (ec19343a) +* incrementing version number - v3.1.4 (2452783c) +* incrementing version number - v3.1.3 (3b4e9d3f) +* incrementing version number - v3.1.2 (40fa3489) +* incrementing version number - v3.1.1 (40250733) +* incrementing version number - v3.1.0 (0cb386bd) +* incrementing version number - v3.0.1 (26f6ea49) +* incrementing version number - v3.0.0 (224e08cd) + +##### Bug Fixes + +* #12243, don' set process.env.config if it doesnt exist (788404c1) +* lang key for move notification closes #12241 (48a2b5f7) +* dont send topic notification to poster (e72b26f5) + #### v3.6.0 (2023-12-20) ##### Chores diff --git a/install/package.json b/install/package.json index a28c43414e..a8c3e80048 100644 --- a/install/package.json +++ b/install/package.json @@ -94,7 +94,7 @@ "multiparty": "4.2.3", "nconf": "0.12.1", "nodebb-plugin-2factor": "7.4.0", - "nodebb-plugin-composer-default": "10.2.29", + "nodebb-plugin-composer-default": "10.2.31", "nodebb-plugin-dbsearch": "6.2.3", "nodebb-plugin-emoji": "5.1.13", "nodebb-plugin-emoji-android": "4.0.0", @@ -103,10 +103,10 @@ "nodebb-plugin-ntfy": "1.7.3", "nodebb-plugin-spam-be-gone": "2.2.0", "nodebb-rewards-essentials": "1.0.0", - "nodebb-theme-harmony": "1.1.105", - "nodebb-theme-lavender": "7.1.5", - "nodebb-theme-peace": "2.1.25", - "nodebb-theme-persona": "13.2.49", + "nodebb-theme-harmony": "1.1.108", + "nodebb-theme-lavender": "7.1.7", + "nodebb-theme-peace": "2.1.26", + "nodebb-theme-persona": "13.2.50", "nodebb-widget-essentials": "7.0.14", "nodemailer": "6.9.7", "nprogress": "0.2.0", diff --git a/public/src/client/category.js b/public/src/client/category.js index c452273761..b4f0bb50cb 100644 --- a/public/src/client/category.js +++ b/public/src/client/category.js @@ -127,7 +127,6 @@ define('forum/category', [ hooks.fire('action:topics.loading'); const params = utils.params(); infinitescroll.loadMore(`/categories/${ajaxify.data.cid}/topics`, { - cid: ajaxify.data.cid, after: after, direction: direction, query: params, diff --git a/public/src/client/chats/recent.js b/public/src/client/chats/recent.js index 02da563286..b9b7e1b678 100644 --- a/public/src/client/chats/recent.js +++ b/public/src/client/chats/recent.js @@ -35,7 +35,7 @@ define('forum/chats/recent', ['alerts', 'api', 'chat'], function (alerts, api, c return; } recentChats.attr('loading', 1); - app.get(`/chats`, { + api.get(`/chats`, { uid: ajaxify.data.uid, after: recentChats.attr('data-nextstart'), }).then(({ rooms, nextStart }) => { diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index 7dd6b5c08f..e091dd69c8 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -10,7 +10,8 @@ define('forum/topic/events', [ 'components', 'translator', 'hooks', -], function (postTools, threadTools, posts, images, components, translator, hooks) { + 'helpers', +], function (postTools, threadTools, posts, images, components, translator, hooks, helpers) { const Events = {}; const events = { @@ -152,7 +153,7 @@ define('forum/topic/events', [ editorEl.replaceWith(html); postContainer.find('[component="post/edit-indicator"]') .removeClass('hidden') - .translateAttr('title', `[[global:edited-timestamp, ${editData.editedISO}]]`); + .translateAttr('title', `[[global:edited-timestamp, ${helpers.isoTimeToLocaleString(editData.editedISO, config.userLang)}]]`); postContainer.find('[component="post/editor"] .timeago').timeago(); hooks.fire('action:posts.edited', data); }); diff --git a/public/src/modules/sort.js b/public/src/modules/sort.js index c7e5e8900a..2fcbb67897 100644 --- a/public/src/modules/sort.js +++ b/public/src/modules/sort.js @@ -12,8 +12,8 @@ define('sort', ['components'], function (components) { currentSetting.find('i').addClass('fa-check'); $('body') - .off('click', '[component="thread/sort"] a') - .on('click', '[component="thread/sort"] a', function () { + .off('click', '[component="thread/sort"] a[data-sort]') + .on('click', '[component="thread/sort"] a[data-sort]', function () { const newSetting = $(this).attr('data-sort'); const urlParams = utils.params(); urlParams.sort = newSetting; diff --git a/src/api/categories.js b/src/api/categories.js index 892c8e3d6a..db682fb245 100644 --- a/src/api/categories.js +++ b/src/api/categories.js @@ -128,7 +128,7 @@ categoriesAPI.getTopics = async (caller, data) => { let start = Math.max(0, parseInt(data.after || 0, 10)); - if (data.direction === -1) { + if (parseInt(data.direction, 10) === -1) { start -= infScrollTopicsPerPage; } diff --git a/src/socket.io/topics/infinitescroll.js b/src/socket.io/topics/infinitescroll.js index 2e9e95948e..cb0814d329 100644 --- a/src/socket.io/topics/infinitescroll.js +++ b/src/socket.io/topics/infinitescroll.js @@ -30,7 +30,7 @@ module.exports = function (SocketTopics) { parseInt(data.count, 10) || meta.config.postsPerPage || 20 )); - if (data.direction === -1) { + if (parseInt(data.direction, 10) === -1) { start -= infScrollPostsPerPage; } diff --git a/src/topics/sorted.js b/src/topics/sorted.js index a1d809fb48..8348f4ceaa 100644 --- a/src/topics/sorted.js +++ b/src/topics/sorted.js @@ -49,7 +49,7 @@ module.exports = function (Topics) { tids = await Topics.filterWatchedTids(tids, params.uid); } } else if (params.filter === 'watched') { - tids = await db.getSortedSetRevRange(`uid:${params.uid}:followed_tids`, 0, -1); + tids = await getWatchedTopics(params); } else if (params.cids) { tids = await getCidTids(params); } else if (params.tags.length) { @@ -63,6 +63,17 @@ module.exports = function (Topics) { return tids; } + async function getWatchedTopics(params) { + const sortSet = ['recent', 'old'].includes(params.sort) ? 'topics:recent' : `topics:${params.sort}`; + const method = params.sort === 'old' ? 'getSortedSetIntersect' : 'getSortedSetRevIntersect'; + return await db[method]({ + sets: [sortSet, `uid:${params.uid}:followed_tids`], + weights: [1, 0], + start: 0, + stop: meta.config.recentMaxTopics - 1, + }); + } + async function getTagTids(params) { const sets = [ params.sort === 'old' ? diff --git a/src/topics/unread.js b/src/topics/unread.js index 9c54445233..bb8e207163 100644 --- a/src/topics/unread.js +++ b/src/topics/unread.js @@ -210,15 +210,13 @@ module.exports = function (Topics) { } async function getFollowedTids(params) { - let tids = await db.getSortedSetMembers(`uid:${params.uid}:followed_tids`); - const filterCids = params.cid && params.cid.map(cid => parseInt(cid, 10)); - if (filterCids) { - const topicData = await Topics.getTopicsFields(tids, ['tid', 'cid']); - tids = topicData.filter(t => filterCids.includes(t.cid)).map(t => t.tid); - } - const scores = await db.sortedSetScores('topics:recent', tids); - const data = tids.map((tid, index) => ({ value: String(tid), score: scores[index] })); - return data.filter(item => item.score > params.cutoff); + const keys = params.cid ? + params.cid.map(cid => `cid:${cid}:tids:lastposttime`) : + 'topics:recent'; + + const recentTopicData = await db.getSortedSetRevRangeByScoreWithScores(keys, 0, -1, '+inf', params.cutoff); + const isFollowed = await db.isSortedSetMembers(`uid:${params.uid}:followed_tids`, recentTopicData.map(t => t.tid)); + return recentTopicData.filter((t, i) => isFollowed[i]); } async function filterTidsThatHaveBlockedPosts(params) {