diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ce6513dac..02d351b80d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,32 @@ +#### v3.1.4 (2023-05-18) + +##### Chores + +* up markdown (51bf5e95) +* incrementing version number - v3.1.3 (3b4e9d3f) +* update changelog for v3.1.3 (9924fde6) +* 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 + +* textarea on error (469aa551) +* closes #11613, closes #11614 (d8d486a6) +* closes #11612 (8f6a68ca) +* #11572 (2910cb2b) + +##### Other Changes + +* //github.com/NodeBB/NodeBB/issues/11612 (24bd9d4e) + +##### Refactors + +* remove unused require (05b58c70) +* remove log (ca2be0e8) + #### v3.1.3 (2023-05-15) ##### Chores diff --git a/install/data/welcome.md b/install/data/welcome.md index 86b61b63fd..8a6eb5e9f8 100644 --- a/install/data/welcome.md +++ b/install/data/welcome.md @@ -1,9 +1,9 @@ -# Welcome to your brand new NodeBB forum! +### Welcome to your brand new NodeBB forum! This is what a topic and post looks like. As an administrator, you can edit the post\'s title and content. To customise your forum, go to the [Administrator Control Panel](../../admin). You can modify all aspects of your forum there, including installation of third-party plugins. -## Additional Resources +#### Additional Resources * [NodeBB Documentation](https://docs.nodebb.org) * [Community Support Forum](https://community.nodebb.org) diff --git a/install/package.json b/install/package.json index 7e18187892..04991202da 100644 --- a/install/package.json +++ b/install/package.json @@ -102,8 +102,8 @@ "nodebb-rewards-essentials": "0.2.3", "nodebb-theme-harmony": "1.0.24", "nodebb-theme-lavender": "7.0.9", - "nodebb-theme-peace": "2.0.22", - "nodebb-theme-persona": "13.0.65", + "nodebb-theme-peace": "2.0.25", + "nodebb-theme-persona": "13.0.67", "nodebb-widget-essentials": "7.0.12", "nodemailer": "6.9.1", "nprogress": "0.2.0", diff --git a/public/src/client/topic.js b/public/src/client/topic.js index a0b9aba183..da5ecae1b0 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -226,7 +226,14 @@ define('forum/topic', [ const btn = $(trigger); btn.find('i').removeClass('fa-copy').addClass('fa-check'); setTimeout(() => btn.find('i').removeClass('fa-check').addClass('fa-copy'), 2000); - return btn.parent().find('code').text(); + const codeEl = btn.parent().find('code'); + if (codeEl.attr('data-lines')) { + let codeText = ''; + codeEl.find('.hljs-ln-code[data-line-number]') + .each((index, el) => { codeText += $(el).text() + '\n'; }); + return codeText; + } + return codeEl.text(); }, }); diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index 7b78bb4b58..60aacd6cf9 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -142,19 +142,21 @@ define('forum/topic/events', [ posts.addBlockquoteEllipses(editedPostEl.parent()); editedPostEl.fadeIn(250); - const editData = { - editor: data.editor, - editedISO: utils.toISOString(data.post.edited), - }; - - app.parseAndTranslate('partials/topic/post-editor', editData, function (html) { - editorEl.replaceWith(html); - postContainer.find('[component="post/edit-indicator"]') - .removeClass('hidden') - .translateAttr('title', `[[global:edited-timestamp, ${editData.editedISO}]]`); - postContainer.find('[component="post/editor"] .timeago').timeago(); - hooks.fire('action:posts.edited', data); - }); + if (data.post.edited) { + const editData = { + editor: data.editor, + editedISO: utils.toISOString(data.post.edited), + }; + + app.parseAndTranslate('partials/topic/post-editor', editData, function (html) { + editorEl.replaceWith(html); + postContainer.find('[component="post/edit-indicator"]') + .removeClass('hidden') + .translateAttr('title', `[[global:edited-timestamp, ${editData.editedISO}]]`); + postContainer.find('[component="post/editor"] .timeago').timeago(); + hooks.fire('action:posts.edited', data); + }); + } }); } else { hooks.fire('action:posts.edited', data); diff --git a/public/src/client/topic/images.js b/public/src/client/topic/images.js index 8778053821..c4c30319d8 100644 --- a/public/src/client/topic/images.js +++ b/public/src/client/topic/images.js @@ -26,8 +26,9 @@ define('forum/topic/images', [], function () { const srcExt = src.split('.').slice(1).pop(); const altFilename = alt.split('/').pop(); const altExt = altFilename.split('.').slice(1).pop(); + imageEl.wrap(''); } }; diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 0ca7493536..e0c09cb96e 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -440,7 +440,7 @@ define('forum/topic/posts', [ blockquotes.each(function () { const $this = $(this); if ($this.find(':hidden:not(br)').length && !$this.find('.toggle').length) { - $this.append(''); + $this.append(''); } }); }; diff --git a/src/middleware/csrf.js b/src/middleware/csrf.js index be5b0761fe..cf85e2a0b4 100644 --- a/src/middleware/csrf.js +++ b/src/middleware/csrf.js @@ -12,7 +12,9 @@ const { return req.headers['x-csrf-token']; } else if (req.body && req.body.csrf_token) { return req.body.csrf_token; - } else if (req.query) { + } else if (req.body && req.body._csrf) { + return req.body._csrf; + } else if (req.query && req.query._csrf) { return req.query._csrf; } }, diff --git a/src/navigation/admin.js b/src/navigation/admin.js index a620defa3e..df8241c8ba 100644 --- a/src/navigation/admin.js +++ b/src/navigation/admin.js @@ -65,7 +65,7 @@ admin.get = async function () { } const ids = await db.getSortedSetRange('navigation:enabled', 0, -1); const data = await db.getObjects(ids.map(id => `navigation:enabled:${id}`)); - cache = data.map((item) => { + cache = data.filter(Boolean).map((item) => { if (item.hasOwnProperty('groups')) { try { item.groups = JSON.parse(item.groups); diff --git a/src/user/delete.js b/src/user/delete.js index 7bf076e7e7..938e109acf 100644 --- a/src/user/delete.js +++ b/src/user/delete.js @@ -208,9 +208,6 @@ module.exports = function (User) { async function deleteImages(uid) { const folder = path.join(nconf.get('upload_path'), 'profile'); - await Promise.all([ - rimraf(path.join(folder, `${uid}-profilecover*`), { glob: true }), - rimraf(path.join(folder, `${uid}-profileavatar*`), { glob: true }), - ]); + await rimraf(`${uid}-profile{avatar,cover}*`, { glob: { cwd: folder } }); } }; diff --git a/src/views/admin/dashboard/logins.tpl b/src/views/admin/dashboard/logins.tpl index 5f135991f6..c3bdf2fd92 100644 --- a/src/views/admin/dashboard/logins.tpl +++ b/src/views/admin/dashboard/logins.tpl @@ -22,8 +22,9 @@ {{{ end }}} {{{ each sessions }}} - - {buildAvatar(./user, "sm", true)} {../username} + + {buildAvatar(./user, "18px", true)} + {./user.username} {function.userAgentIcons} {../browser} {../version} on {../platform} diff --git a/test/socket.io.js b/test/socket.io.js index 4e2292d4e5..b7fcaff935 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -107,14 +107,6 @@ describe('socket.io', () => { }); }); - it('should return error for invalid eventName type', (done) => { - const eventName = ['topics.loadMoreTags']; - io.emit(eventName, (err) => { - assert.strictEqual(err.message, `[[error:invalid-event, object]]`); - done(); - }); - }); - it('should get installed themes', (done) => { const themes = ['nodebb-theme-persona']; io.emit('admin.themes.getInstalled', (err, data) => {