mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 08:36:12 +01:00
feat: add visibility option to, closes #12942
This commit is contained in:
@@ -20,5 +20,9 @@
|
||||
"minimum-reputation": "Minimum reputation",
|
||||
"minimum-reputation-help": "If a user has less than this value they won't be able to use this field",
|
||||
"delete-field-confirm-x": "Do you really want to delete custom field \"%1\"?",
|
||||
"custom-fields-saved": "Custom fields saved"
|
||||
"custom-fields-saved": "Custom fields saved",
|
||||
"visibility": "Visibility",
|
||||
"visibility-all": "Everyone can see the field",
|
||||
"visibility-loggedin": "Only logged in users can see the field",
|
||||
"visibility-privileged": "Only privileged users like admins & moderators can see the field"
|
||||
}
|
||||
@@ -51,6 +51,7 @@ define('admin/manage/user/custom-fields', [
|
||||
icon: el.attr('data-icon'),
|
||||
type: el.attr('data-type'),
|
||||
'select-options': el.attr('data-select-options'),
|
||||
visibility: el.attr('data-visibility'),
|
||||
'min:rep': el.attr('data-min-rep'),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ editController.get = async function (req, res, next) {
|
||||
const [canUseSignature, canManageUsers, customUserFields] = await Promise.all([
|
||||
privileges.global.can('signature', req.uid),
|
||||
privileges.admin.can('admin:users', req.uid),
|
||||
accountHelpers.getCustomUserFields(userData),
|
||||
accountHelpers.getCustomUserFields(req.uid, userData),
|
||||
]);
|
||||
|
||||
userData.customUserFields = customUserFields;
|
||||
|
||||
@@ -129,13 +129,26 @@ helpers.getUserDataByUserSlug = async function (userslug, callerUID, query = {})
|
||||
return hookData.userData;
|
||||
};
|
||||
|
||||
helpers.getCustomUserFields = async function (userData) {
|
||||
helpers.getCustomUserFields = async function (callerUID, userData) {
|
||||
const keys = await db.getSortedSetRange('user-custom-fields', 0, -1);
|
||||
const allFields = (await db.getObjects(keys.map(k => `user-custom-field:${k}`))).filter(Boolean);
|
||||
|
||||
const isSelf = String(callerUID) === String(userData.uid);
|
||||
const [isAdmin, isModOfAny] = await Promise.all([
|
||||
privileges.users.isAdministrator(callerUID),
|
||||
user.isModeratorOfAnyCategory(callerUID),
|
||||
]);
|
||||
|
||||
const fields = allFields.filter((field) => {
|
||||
const visibilityCheck = isAdmin || isModOfAny || isSelf || field.visibility === 'all' ||
|
||||
(
|
||||
field.visibility === 'loggedin' &&
|
||||
String(callerUID) !== '0' &&
|
||||
String(callerUID) !== '-1'
|
||||
);
|
||||
const minRep = field['min:rep'] || 0;
|
||||
return userData.reputation >= minRep || meta.config['reputation:disabled'];
|
||||
const repCheck = userData.reputation >= minRep || meta.config['reputation:disabled'];
|
||||
return visibilityCheck && repCheck;
|
||||
});
|
||||
|
||||
fields.forEach((f) => {
|
||||
|
||||
@@ -25,7 +25,7 @@ profileController.get = async function (req, res, next) {
|
||||
const [latestPosts, bestPosts, customUserFields] = await Promise.all([
|
||||
getLatestPosts(req.uid, userData),
|
||||
getBestPosts(req.uid, userData),
|
||||
accountHelpers.getCustomUserFields(userData),
|
||||
accountHelpers.getCustomUserFields(req.uid, userData),
|
||||
posts.parseSignature(userData, req.uid),
|
||||
]);
|
||||
userData.customUserFields = customUserFields;
|
||||
|
||||
@@ -310,6 +310,7 @@ usersController.customFields = async function (req, res) {
|
||||
field.selectOptionsFormatted = field['select-options'].trim().split('\n').join(', ');
|
||||
}
|
||||
field['min:rep'] = field['min:rep'] || 0;
|
||||
field.visibility = field.visibility || 'all';
|
||||
});
|
||||
res.render('admin/manage/users/custom-fields', { fields: fields });
|
||||
};
|
||||
|
||||
@@ -21,13 +21,14 @@
|
||||
<th class="text-muted">[[admin/manage/user-custom-fields:key]]</th>
|
||||
<th class="text-muted">[[admin/manage/user-custom-fields:name]]</th>
|
||||
<th class="text-muted">[[admin/manage/user-custom-fields:type]]</th>
|
||||
<th class="text-muted">[[admin/manage/user-custom-fields:visibility]]</th>
|
||||
<th class="text-muted text-end">[[admin/manage/user-custom-fields:min-rep]]</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{{ each fields }}}
|
||||
<tr data-key="{./key}" data-name="{./name}" data-icon="{./icon}" data-type="{./type}" data-min-rep="{./min:rep}" data-select-options="{./select-options}" class="align-middle">
|
||||
<tr data-key="{./key}" data-name="{./name}" data-icon="{./icon}" data-type="{./type}" data-min-rep="{./min:rep}" data-select-options="{./select-options}" data-visibility="{./visibility}" class="align-middle">
|
||||
<td style="width: 32px;">
|
||||
<a href="#" component="sort/handle" class="btn btn-light btn-sm d-none d-md-block ui-sortable-handle" style="cursor:grab;"><i class="fa fa-arrows-up-down text-muted"></i></a>
|
||||
</td>
|
||||
@@ -41,6 +42,9 @@
|
||||
</div>
|
||||
{{{ end }}}
|
||||
</td>
|
||||
<td>
|
||||
{./visibility}
|
||||
</td>
|
||||
<td class="text-end">
|
||||
{./min:rep}
|
||||
</td>
|
||||
|
||||
@@ -29,6 +29,15 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="form-label">[[admin/manage/user-custom-fields:visibility]]</label>
|
||||
<select name="visibility" class="form-select">
|
||||
<option value="all">[[admin/manage/user-custom-fields:visibility-all]]</option>
|
||||
<option value="loggedin">[[admin/manage/user-custom-fields:visibility-loggedin]]</option>
|
||||
<option value="privileged">[[admin/manage/user-custom-fields:visibility-privileged]]</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="form-label">[[admin/manage/user-custom-fields:minimum-reputation]]</label>
|
||||
<input class="form-control" type="number" name="min:rep" value="{./min:rep}" placeholder="0">
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<label for="downvote:disabled" class="form-check-label">[[admin/settings/reputation:disable-down-voting]]</label>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="upvoteVisibility" class="form-check-label">[[admin/settings/reputation:upvote-visibility]]</label>
|
||||
<label for="upvoteVisibility" class="form-label">[[admin/settings/reputation:upvote-visibility]]</label>
|
||||
<select id="upvoteVisibility" data-field="upvoteVisibility" class="form-select">
|
||||
<option value="all">[[admin/settings/reputation:upvote-visibility-all]]</option>
|
||||
<option value="loggedin">[[admin/settings/reputation:upvote-visibility-loggedin]]</option>
|
||||
@@ -23,7 +23,7 @@
|
||||
</select>
|
||||
</div>
|
||||
<div>
|
||||
<label for="downvoteVisibility" class="form-check-label">[[admin/settings/reputation:downvote-visibility]]</label>
|
||||
<label for="downvoteVisibility" class="form-label">[[admin/settings/reputation:downvote-visibility]]</label>
|
||||
<select id="downvoteVisibility" data-field="downvoteVisibility" class="form-select">
|
||||
<option value="all">[[admin/settings/reputation:downvote-visibility-all]]</option>
|
||||
<option value="loggedin">[[admin/settings/reputation:downvote-visibility-loggedin]]</option>
|
||||
|
||||
Reference in New Issue
Block a user