mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-06-13 10:31:10 +02:00
Merge commit '7969e62d061faa1488a1bcbfdb187e586f1d6fc1' into v3.x
This commit is contained in:
61
CHANGELOG.md
61
CHANGELOG.md
@@ -1,3 +1,64 @@
|
||||
#### v3.8.1 (2024-05-15)
|
||||
|
||||
##### Chores
|
||||
|
||||
* incrementing version number - v3.8.0 (e228a6eb)
|
||||
* update changelog for v3.8.0 (2ef2750d)
|
||||
* incrementing version number - v3.7.5 (6882894d)
|
||||
* incrementing version number - v3.7.4 (6678744c)
|
||||
* incrementing version number - v3.7.3 (2d62b6f6)
|
||||
* incrementing version number - v3.7.2 (cc257e7e)
|
||||
* incrementing version number - v3.7.1 (712365a5)
|
||||
* incrementing version number - v3.7.0 (9a6153d7)
|
||||
* incrementing version number - v3.6.7 (86a17e38)
|
||||
* incrementing version number - v3.6.6 (6604bf37)
|
||||
* incrementing version number - v3.6.5 (6c653625)
|
||||
* incrementing version number - v3.6.4 (83d131b4)
|
||||
* incrementing version number - v3.6.3 (fc7d2bfd)
|
||||
* incrementing version number - v3.6.2 (0f577a57)
|
||||
* incrementing version number - v3.6.1 (f1a69468)
|
||||
* incrementing version number - v3.6.0 (4cdf85f8)
|
||||
* 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
|
||||
|
||||
* wrong mention version (1d1f499b)
|
||||
|
||||
##### Tests
|
||||
|
||||
* use node 20 (a40f54aa)
|
||||
* remove node 18 (6bd22e53)
|
||||
|
||||
#### v3.8.0 (2024-05-15)
|
||||
|
||||
##### Chores
|
||||
|
||||
11
Dockerfile
11
Dockerfile
@@ -46,15 +46,16 @@ ENV NODE_ENV=production \
|
||||
|
||||
WORKDIR /usr/src/app/
|
||||
|
||||
COPY --from=build --chown=${USER}:${USER} /usr/src/app/ /usr/src/app/install/docker/setup.json /usr/src/app/
|
||||
COPY --from=build --chown=${USER}:${USER} /usr/bin/tini /usr/src/app/install/docker/entrypoint.sh /usr/local/bin/
|
||||
|
||||
RUN corepack enable \
|
||||
&& groupadd --gid ${GID} ${USER} \
|
||||
&& useradd --uid ${UID} --gid ${GID} --home-dir /usr/src/app/ --shell /bin/bash ${USER} \
|
||||
&& mkdir -p /usr/src/app/logs/ /opt/config/ \
|
||||
&& chown -R ${USER}:${USER} /usr/src/app/ /opt/config/ \
|
||||
&& chmod +x /usr/local/bin/entrypoint.sh \
|
||||
&& chown -R ${USER}:${USER} /usr/src/app/ /opt/config/
|
||||
|
||||
COPY --from=build --chown=${USER}:${USER} /usr/src/app/ /usr/src/app/install/docker/setup.json /usr/src/app/
|
||||
COPY --from=build --chown=${USER}:${USER} /usr/bin/tini /usr/src/app/install/docker/entrypoint.sh /usr/local/bin/
|
||||
|
||||
RUN chmod +x /usr/local/bin/entrypoint.sh \
|
||||
&& chmod +x /usr/local/bin/tini
|
||||
|
||||
# TODO: Have docker-compose use environment variables to create files like setup.json and config.json.
|
||||
|
||||
@@ -51,17 +51,18 @@ ENV NODE_ENV=development \
|
||||
|
||||
WORKDIR /usr/src/app/
|
||||
|
||||
RUN corepack enable \
|
||||
&& groupadd --gid ${GID} ${USER} \
|
||||
&& useradd --uid ${UID} --gid ${GID} --home-dir /usr/src/app/ --shell /bin/bash ${USER} \
|
||||
&& mkdir -p /usr/src/app/logs/ /opt/config/ \
|
||||
&& chown -R ${USER}:${USER} /usr/src/app/ /opt/config/
|
||||
|
||||
COPY --from=build --chown=${USER}:${USER} /usr/src/app/ /usr/src/app/install/docker/setup.json /usr/src/app/
|
||||
COPY --from=build --chown=${USER}:${USER} /usr/bin/tini /usr/src/app/install/docker/entrypoint.sh /usr/local/bin/
|
||||
COPY --from=node_modules_touch --chown=${USER}:${USER} /usr/src/app/ /usr/src/app/
|
||||
COPY --from=git --chown=${USER}:${USER} /usr/src/app/ /usr/src/app/
|
||||
|
||||
RUN corepack enable \
|
||||
&& groupadd --gid ${GID} ${USER} \
|
||||
&& useradd --uid ${UID} --gid ${GID} --home-dir /usr/src/app/ --shell /bin/bash ${USER} \
|
||||
&& mkdir -p /usr/src/app/logs/ /opt/config/ \
|
||||
&& chown -R ${USER}:${USER} /usr/src/app/ /opt/config/ \
|
||||
&& chmod +x /usr/local/bin/entrypoint.sh \
|
||||
RUN chmod +x /usr/local/bin/entrypoint.sh \
|
||||
&& chmod +x /usr/local/bin/tini
|
||||
|
||||
# TODO: Have docker-compose use environment variables to create files like setup.json and config.json.
|
||||
|
||||
@@ -137,7 +137,7 @@
|
||||
"sitemapTopics": 500,
|
||||
"maintenanceMode": 0,
|
||||
"maintenanceModeStatus": 503,
|
||||
"votesArePublic": 0,
|
||||
"voteVisibility": "privileged",
|
||||
"maximumInvites": 0,
|
||||
"username:disableEdit": 0,
|
||||
"email:disableEdit": 0,
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
"multiparty": "4.2.3",
|
||||
"nconf": "0.12.1",
|
||||
"nodebb-plugin-2factor": "7.5.1",
|
||||
"nodebb-plugin-composer-default": "10.2.35",
|
||||
"nodebb-plugin-composer-default": "10.2.36",
|
||||
"nodebb-plugin-dbsearch": "6.2.3",
|
||||
"nodebb-plugin-emoji": "5.1.15",
|
||||
"nodebb-plugin-emoji-android": "4.0.0",
|
||||
@@ -103,10 +103,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.55",
|
||||
"nodebb-theme-harmony": "1.2.57",
|
||||
"nodebb-theme-lavender": "7.1.8",
|
||||
"nodebb-theme-peace": "2.2.5",
|
||||
"nodebb-theme-persona": "13.3.19",
|
||||
"nodebb-theme-persona": "13.3.20",
|
||||
"nodebb-widget-essentials": "7.0.16",
|
||||
"nodemailer": "6.9.13",
|
||||
"nprogress": "0.2.0",
|
||||
|
||||
@@ -2,7 +2,10 @@
|
||||
"reputation": "Reputation Settings",
|
||||
"disable": "Disable Reputation System",
|
||||
"disable-down-voting": "Disable Down Voting",
|
||||
"votes-are-public": "All Votes Are Public",
|
||||
"vote-visibility": "Vote visibility",
|
||||
"vote-visibility-all": "Everyone can see votes",
|
||||
"vote-visibility-loggedin": "Only logged in users can see votes",
|
||||
"vote-visibility-privileged": "Only privileged users like admins & moderators can see votes",
|
||||
"thresholds": "Activity Thresholds",
|
||||
"min-rep-upvote": "Minimum reputation to upvote posts",
|
||||
"upvotes-per-day": "Upvotes per day (set to 0 for unlimited upvotes)",
|
||||
|
||||
@@ -156,6 +156,8 @@ TopicObject:
|
||||
type: boolean
|
||||
ignored:
|
||||
type: boolean
|
||||
followed:
|
||||
type: boolean
|
||||
unread:
|
||||
type: boolean
|
||||
bookmark:
|
||||
|
||||
@@ -176,6 +176,8 @@ get:
|
||||
type: boolean
|
||||
ignored:
|
||||
type: boolean
|
||||
followed:
|
||||
type: boolean
|
||||
unread:
|
||||
type: boolean
|
||||
bookmark:
|
||||
|
||||
@@ -87,7 +87,7 @@ define('topicThumbs', [
|
||||
|
||||
Thumbs.modal.handleDelete = (payload) => {
|
||||
const modalEl = payload.modal.get(0);
|
||||
|
||||
const { id: uuid } = payload;
|
||||
modalEl.addEventListener('click', (ev) => {
|
||||
if (ev.target.closest('button[data-action="remove"]')) {
|
||||
bootbox.confirm('[[modules:thumbs.modal.confirm-remove]]', (ok) => {
|
||||
@@ -101,6 +101,9 @@ define('topicThumbs', [
|
||||
path: path,
|
||||
}).then(() => {
|
||||
Thumbs.modal.open(payload);
|
||||
require(['composer'], (composer) => {
|
||||
composer.updateThumbCount(uuid, $(`[component="composer"][data-uuid="${uuid}"]`));
|
||||
});
|
||||
}).catch(alerts.error);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -52,13 +52,21 @@ module.exports = function (middleware) {
|
||||
res.set('cache-control', 'private');
|
||||
}
|
||||
|
||||
const buildResult = await plugins.hooks.fire(`filter:${template}.build`, { req: req, res: res, templateData: options });
|
||||
const buildResult = await plugins.hooks.fire(`filter:${template}.build`, {
|
||||
req: req,
|
||||
res: res,
|
||||
templateData: options,
|
||||
});
|
||||
if (res.headersSent) {
|
||||
return;
|
||||
}
|
||||
const templateToRender = buildResult.templateData.templateToRender || template;
|
||||
|
||||
const renderResult = await plugins.hooks.fire('filter:middleware.render', { req: req, res: res, templateData: buildResult.templateData });
|
||||
const renderResult = await plugins.hooks.fire('filter:middleware.render', {
|
||||
req: req,
|
||||
res: res,
|
||||
templateData: buildResult.templateData,
|
||||
});
|
||||
if (res.headersSent) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -91,7 +91,14 @@ module.exports = function (SocketPosts) {
|
||||
]);
|
||||
const cidToAllowed = _.zipObject(uniqCids, canRead);
|
||||
const checks = cids.map(
|
||||
(cid, index) => isAdmin || isMod[index] || (cidToAllowed[cid] && !!meta.config.votesArePublic)
|
||||
(cid, index) => isAdmin || isMod[index] ||
|
||||
(
|
||||
cidToAllowed[cid] &&
|
||||
(
|
||||
meta.config.voteVisibility === 'all' ||
|
||||
(meta.config.voteVisibility === 'loggedin' && parseInt(uid, 10) > 0)
|
||||
)
|
||||
)
|
||||
);
|
||||
return isArray ? checks : checks[0];
|
||||
}
|
||||
|
||||
@@ -116,10 +116,10 @@ Topics.getTopicsByTids = async function (tids, options) {
|
||||
};
|
||||
}
|
||||
|
||||
const [result, hasRead, isIgnored, bookmarks, callerSettings] = await Promise.all([
|
||||
const [result, hasRead, followData, bookmarks, callerSettings] = await Promise.all([
|
||||
loadTopics(),
|
||||
Topics.hasReadTopics(tids, uid),
|
||||
Topics.isIgnoring(tids, uid),
|
||||
Topics.getFollowData(tids, uid),
|
||||
Topics.getUserBookmarks(tids, uid),
|
||||
user.getSettings(uid),
|
||||
]);
|
||||
@@ -136,8 +136,9 @@ Topics.getTopicsByTids = async function (tids, options) {
|
||||
}
|
||||
topic.teaser = result.teasers[i] || null;
|
||||
topic.isOwner = topic.uid === parseInt(uid, 10);
|
||||
topic.ignored = isIgnored[i];
|
||||
topic.unread = parseInt(uid, 10) <= 0 || (!hasRead[i] && !isIgnored[i]);
|
||||
topic.ignored = followData[i].ignoring;
|
||||
topic.followed = followData[i].following;
|
||||
topic.unread = parseInt(uid, 10) <= 0 || (!hasRead[i] && !topic.ignored);
|
||||
topic.bookmark = bookmarks[i] && (sortNewToOld ?
|
||||
Math.max(1, topic.postcount + 2 - bookmarks[i]) :
|
||||
Math.min(topic.postcount, bookmarks[i] + 1));
|
||||
|
||||
16
src/upgrades/3.8.2/vote-visibility-config.js
Normal file
16
src/upgrades/3.8.2/vote-visibility-config.js
Normal file
@@ -0,0 +1,16 @@
|
||||
/* eslint-disable no-await-in-loop */
|
||||
|
||||
'use strict';
|
||||
|
||||
const db = require('../../database');
|
||||
|
||||
module.exports = {
|
||||
name: 'Add vote visibility config field',
|
||||
timestamp: Date.UTC(2024, 4, 24),
|
||||
method: async function () {
|
||||
const current = await db.getObjectField('config', 'votesArePublic');
|
||||
const isPublic = parseInt(current, 10) === 1;
|
||||
await db.setObjectField('config', 'voteVisibility', isPublic ? 'all' : 'privileged');
|
||||
await db.deleteObjectField('config', 'votesArePublic');
|
||||
},
|
||||
};
|
||||
@@ -14,9 +14,13 @@
|
||||
<input type="checkbox" class="form-check-input" id="downvote:disabled" data-field="downvote:disabled">
|
||||
<label for="downvote:disabled" class="form-check-label">[[admin/settings/reputation:disable-down-voting]]</label>
|
||||
</div>
|
||||
<div class="form-check form-switch mb-3">
|
||||
<input type="checkbox" class="form-check-input" id="votesArePublic" data-field="votesArePublic">
|
||||
<label for="votesArePublic" class="form-check-label">[[admin/settings/reputation:votes-are-public]]</label>
|
||||
<div>
|
||||
<label for="voteVisibility" class="form-check-label">[[admin/settings/reputation:vote-visibility]]</label>
|
||||
<select id="voteVisibility" data-field="voteVisibility" class="form-select">
|
||||
<option value="all">[[admin/settings/reputation:vote-visibility-all]]</option>
|
||||
<option value="loggedin">[[admin/settings/reputation:vote-visibility-loggedin]]</option>
|
||||
<option value="privileged">[[admin/settings/reputation:vote-visibility-privileged]]</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user