mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-02-28 01:21:13 +01:00
feat: option to allow auto-joining of groups (optionally skip the "request membership" step)
This commit is contained in:
@@ -34,6 +34,8 @@
|
|||||||
"edit.hidden-details": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
|
"edit.hidden-details": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
|
||||||
"edit.add-user": "Add User to Group",
|
"edit.add-user": "Add User to Group",
|
||||||
"edit.add-user-search": "Search Users",
|
"edit.add-user-search": "Search Users",
|
||||||
|
"edit.autojoin": "Enable Auto-Join",
|
||||||
|
"edit.autojoin-details": "Allow any user with access to the group to join without confirmation",
|
||||||
"edit.members": "Member List",
|
"edit.members": "Member List",
|
||||||
"control-panel": "Groups Control Panel",
|
"control-panel": "Groups Control Panel",
|
||||||
"revert": "Revert",
|
"revert": "Revert",
|
||||||
|
|||||||
@@ -53,6 +53,8 @@
|
|||||||
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
|
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
|
||||||
"details.delete_group": "Delete Group",
|
"details.delete_group": "Delete Group",
|
||||||
"details.private_system_help": "Private groups is disabled at system level, this option does not do anything",
|
"details.private_system_help": "Private groups is disabled at system level, this option does not do anything",
|
||||||
|
"details.autojoin": "Enable Auto-Join",
|
||||||
|
"details.autojoin_help": "Allow any user with access to the group to join without confirmation",
|
||||||
|
|
||||||
"event.updated": "Group details have been updated",
|
"event.updated": "Group details have been updated",
|
||||||
"event.deleted": "The group \"%1\" has been deleted",
|
"event.deleted": "The group \"%1\" has been deleted",
|
||||||
|
|||||||
@@ -83,6 +83,7 @@ define('admin/manage/group', [
|
|||||||
memberPostCids: $('#memberPostCids').val(),
|
memberPostCids: $('#memberPostCids').val(),
|
||||||
disableJoinRequests: $('#group-disableJoinRequests').is(':checked'),
|
disableJoinRequests: $('#group-disableJoinRequests').is(':checked'),
|
||||||
disableLeave: $('#group-disableLeave').is(':checked'),
|
disableLeave: $('#group-disableLeave').is(':checked'),
|
||||||
|
autojoin: $('#group-autojoin').is(':checked'),
|
||||||
},
|
},
|
||||||
}, function (err) {
|
}, function (err) {
|
||||||
if (err) {
|
if (err) {
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ module.exports = function (Groups) {
|
|||||||
disableJoinRequests = 1;
|
disableJoinRequests = 1;
|
||||||
}
|
}
|
||||||
const disableLeave = parseInt(data.disableLeave, 10) === 1 ? 1 : 0;
|
const disableLeave = parseInt(data.disableLeave, 10) === 1 ? 1 : 0;
|
||||||
|
const autojoin = parseInt(data.autojoin, 10) === 1 ? 1 : 0;
|
||||||
const isHidden = parseInt(data.hidden, 10) === 1;
|
const isHidden = parseInt(data.hidden, 10) === 1;
|
||||||
|
|
||||||
Groups.validateGroupName(data.name);
|
Groups.validateGroupName(data.name);
|
||||||
@@ -38,6 +39,7 @@ module.exports = function (Groups) {
|
|||||||
private: isPrivate ? 1 : 0,
|
private: isPrivate ? 1 : 0,
|
||||||
disableJoinRequests: disableJoinRequests,
|
disableJoinRequests: disableJoinRequests,
|
||||||
disableLeave: disableLeave,
|
disableLeave: disableLeave,
|
||||||
|
autojoin: autojoin,
|
||||||
};
|
};
|
||||||
|
|
||||||
await plugins.hooks.fire('filter:group.create', { group: groupData, data: data });
|
await plugins.hooks.fire('filter:group.create', { group: groupData, data: data });
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ const translator = require('../translator');
|
|||||||
|
|
||||||
const intFields = [
|
const intFields = [
|
||||||
'createtime', 'memberCount', 'hidden', 'system', 'private',
|
'createtime', 'memberCount', 'hidden', 'system', 'private',
|
||||||
'userTitleEnabled', 'disableJoinRequests', 'disableLeave',
|
'userTitleEnabled', 'disableJoinRequests', 'disableLeave', 'autojoin',
|
||||||
];
|
];
|
||||||
|
|
||||||
module.exports = function (Groups) {
|
module.exports = function (Groups) {
|
||||||
|
|||||||
@@ -67,11 +67,12 @@ module.exports = function (Groups) {
|
|||||||
async function inviteOrRequestMembership(groupName, uids, type) {
|
async function inviteOrRequestMembership(groupName, uids, type) {
|
||||||
uids = Array.isArray(uids) ? uids : [uids];
|
uids = Array.isArray(uids) ? uids : [uids];
|
||||||
uids = uids.filter(uid => parseInt(uid, 10) > 0);
|
uids = uids.filter(uid => parseInt(uid, 10) > 0);
|
||||||
const [exists, isMember, isPending, isInvited] = await Promise.all([
|
const [exists, isMember, isPending, isInvited, canAutojoin] = await Promise.all([
|
||||||
Groups.exists(groupName),
|
Groups.exists(groupName),
|
||||||
Groups.isMembers(uids, groupName),
|
Groups.isMembers(uids, groupName),
|
||||||
Groups.isPending(uids, groupName),
|
Groups.isPending(uids, groupName),
|
||||||
Groups.isInvited(uids, groupName),
|
Groups.isInvited(uids, groupName),
|
||||||
|
Groups.getGroupField(groupName, 'autojoin'),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if (!exists) {
|
if (!exists) {
|
||||||
@@ -80,6 +81,11 @@ module.exports = function (Groups) {
|
|||||||
|
|
||||||
uids = uids.filter((uid, i) => !isMember[i] && ((type === 'invite' && !isInvited[i]) || (type === 'request' && !isPending[i])));
|
uids = uids.filter((uid, i) => !isMember[i] && ((type === 'invite' && !isInvited[i]) || (type === 'request' && !isPending[i])));
|
||||||
|
|
||||||
|
if (canAutojoin) {
|
||||||
|
await Promise.all(uids.map(uid => Groups.join([groupName], uid)));
|
||||||
|
return uids;
|
||||||
|
}
|
||||||
|
|
||||||
const set = type === 'invite' ? 'group:' + groupName + ':invited' : 'group:' + groupName + ':pending';
|
const set = type === 'invite' ? 'group:' + groupName + ':invited' : 'group:' + groupName + ':pending';
|
||||||
await db.setAdd(set, uids);
|
await db.setAdd(set, uids);
|
||||||
const hookName = type === 'invite' ? 'action:group.inviteMember' : 'action:group.requestMembership';
|
const hookName = type === 'invite' ? 'action:group.inviteMember' : 'action:group.requestMembership';
|
||||||
|
|||||||
@@ -55,6 +55,10 @@ module.exports = function (Groups) {
|
|||||||
payload.disableLeave = values.disableLeave ? '1' : '0';
|
payload.disableLeave = values.disableLeave ? '1' : '0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (values.hasOwnProperty('autojoin')) {
|
||||||
|
payload.autojoin = values.autojoin ? '1' : '0';
|
||||||
|
}
|
||||||
|
|
||||||
if (values.hasOwnProperty('name')) {
|
if (values.hasOwnProperty('name')) {
|
||||||
await checkNameChange(groupName, values.name);
|
await checkNameChange(groupName, values.name);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -95,6 +95,18 @@
|
|||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
|
<fieldset>
|
||||||
|
<div class="checkbox">
|
||||||
|
<label>
|
||||||
|
<input id="group-autojoin" name="hidden" data-property type="checkbox"<!-- IF group.autojoin --> checked<!-- ENDIF group.autojoin -->>
|
||||||
|
<strong>[[admin/manage/groups:edit.autojoin]]</strong>
|
||||||
|
<p class="help-block">
|
||||||
|
[[admin/manage/groups:edit.autojoin-details]]
|
||||||
|
</p>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
|
||||||
<hr />
|
<hr />
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
|||||||
Reference in New Issue
Block a user