mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-02 03:55:55 +01:00
closes #4012
This commit is contained in:
@@ -29,6 +29,7 @@
|
|||||||
"details.has_no_posts": "This group's members have not made any posts.",
|
"details.has_no_posts": "This group's members have not made any posts.",
|
||||||
"details.latest_posts": "Latest Posts",
|
"details.latest_posts": "Latest Posts",
|
||||||
"details.private": "Private",
|
"details.private": "Private",
|
||||||
|
"details.disableJoinRequests": "Disable join requests",
|
||||||
"details.grant": "Grant/Rescind Ownership",
|
"details.grant": "Grant/Rescind Ownership",
|
||||||
"details.kick": "Kick",
|
"details.kick": "Kick",
|
||||||
|
|
||||||
|
|||||||
@@ -157,8 +157,10 @@ define('admin/manage/group', [
|
|||||||
description: $('#change-group-desc').val(),
|
description: $('#change-group-desc').val(),
|
||||||
icon: groupIcon.attr('value'),
|
icon: groupIcon.attr('value'),
|
||||||
labelColor: changeGroupLabelColor.val(),
|
labelColor: changeGroupLabelColor.val(),
|
||||||
|
userTitleEnabled: $('#group-userTitleEnabled').is(':checked'),
|
||||||
private: $('#group-private').is(':checked'),
|
private: $('#group-private').is(':checked'),
|
||||||
hidden: $('#group-hidden').is(':checked')
|
hidden: $('#group-hidden').is(':checked'),
|
||||||
|
disableJoinRequests: $('#group-disableJoinRequests').is(':checked')
|
||||||
}
|
}
|
||||||
}, function(err) {
|
}, function(err) {
|
||||||
if (err) {
|
if (err) {
|
||||||
|
|||||||
@@ -142,8 +142,10 @@
|
|||||||
return '<button class="btn btn-warning disabled"><i class="fa fa-clock-o"></i> [[groups:membership.invitation-pending]]</button>';
|
return '<button class="btn btn-warning disabled"><i class="fa fa-clock-o"></i> [[groups:membership.invitation-pending]]</button>';
|
||||||
} else if (groupObj.isInvited) {
|
} else if (groupObj.isInvited) {
|
||||||
return '<button class="btn btn-link" data-action="rejectInvite" data-group="' + groupObj.displayName + '">[[groups:membership.reject]]</button><button class="btn btn-success" data-action="acceptInvite" data-group="' + groupObj.name + '"><i class="fa fa-plus"></i> [[groups:membership.accept-invitation]]</button>';
|
return '<button class="btn btn-link" data-action="rejectInvite" data-group="' + groupObj.displayName + '">[[groups:membership.reject]]</button><button class="btn btn-success" data-action="acceptInvite" data-group="' + groupObj.name + '"><i class="fa fa-plus"></i> [[groups:membership.accept-invitation]]</button>';
|
||||||
} else {
|
} else if (!groupObj.disableJoinRequests) {
|
||||||
return '<button class="btn btn-success" data-action="join" data-group="' + groupObj.displayName + '"><i class="fa fa-plus"></i> [[groups:membership.join-group]]</button>';
|
return '<button class="btn btn-success" data-action="join" data-group="' + groupObj.displayName + '"><i class="fa fa-plus"></i> [[groups:membership.join-group]]</button>';
|
||||||
|
} else {
|
||||||
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,16 +1,14 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var async = require('async'),
|
var async = require('async');
|
||||||
winston = require('winston'),
|
var validator = require('validator');
|
||||||
nconf = require('nconf'),
|
|
||||||
validator = require('validator'),
|
|
||||||
|
|
||||||
user = require('./user'),
|
var user = require('./user');
|
||||||
db = require('./database'),
|
var db = require('./database');
|
||||||
plugins = require('./plugins'),
|
var plugins = require('./plugins');
|
||||||
posts = require('./posts'),
|
var posts = require('./posts');
|
||||||
privileges = require('./privileges'),
|
var privileges = require('./privileges');
|
||||||
utils = require('../public/src/utils');
|
var utils = require('../public/src/utils');
|
||||||
|
|
||||||
(function(Groups) {
|
(function(Groups) {
|
||||||
|
|
||||||
@@ -184,6 +182,7 @@ var async = require('async'),
|
|||||||
results.base.hidden = !!parseInt(results.base.hidden, 10);
|
results.base.hidden = !!parseInt(results.base.hidden, 10);
|
||||||
results.base.system = !!parseInt(results.base.system, 10);
|
results.base.system = !!parseInt(results.base.system, 10);
|
||||||
results.base.private = results.base.private ? !!parseInt(results.base.private, 10) : true;
|
results.base.private = results.base.private ? !!parseInt(results.base.private, 10) : true;
|
||||||
|
results.base.disableJoinRequests = parseInt(results.base.disableJoinRequests, 10) === 1;
|
||||||
results.base.isMember = results.isMember;
|
results.base.isMember = results.isMember;
|
||||||
results.base.isPending = results.isPending;
|
results.base.isPending = results.isPending;
|
||||||
results.base.isInvited = results.isInvited;
|
results.base.isInvited = results.isInvited;
|
||||||
@@ -228,7 +227,7 @@ var async = require('async'),
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
results.members = results.members.filter(function(user, index, array) {
|
results.members = results.members.filter(function(user) {
|
||||||
return user && user.uid && ownerUids.indexOf(user.uid.toString()) === -1;
|
return user && user.uid && ownerUids.indexOf(user.uid.toString()) === -1;
|
||||||
});
|
});
|
||||||
results.members = results.owners.concat(results.members);
|
results.members = results.owners.concat(results.members);
|
||||||
@@ -369,19 +368,27 @@ var async = require('async'),
|
|||||||
], callback);
|
], callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Groups.getGroupData = function(groupName, callback) {
|
||||||
|
Groups.getGroupsData([groupName], function(err, groupsData) {
|
||||||
|
callback(err, Array.isArray(groupsData) && groupsData[0] ? groupsData[0] : null);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
Groups.getGroupsData = function(groupNames, callback) {
|
Groups.getGroupsData = function(groupNames, callback) {
|
||||||
if (!Array.isArray(groupNames) || !groupNames.length) {
|
if (!Array.isArray(groupNames) || !groupNames.length) {
|
||||||
return callback(null, []);
|
return callback(null, []);
|
||||||
}
|
}
|
||||||
|
|
||||||
var keys = groupNames.map(function(groupName) {
|
var keys = groupNames.map(function(groupName) {
|
||||||
return 'group:' + groupName;
|
return 'group:' + groupName;
|
||||||
}),
|
});
|
||||||
ephemeralIdx = groupNames.reduce(function(memo, cur, idx) {
|
|
||||||
if (ephemeralGroups.indexOf(cur) !== -1) {
|
var ephemeralIdx = groupNames.reduce(function(memo, cur, idx) {
|
||||||
memo.push(idx);
|
if (ephemeralGroups.indexOf(cur) !== -1) {
|
||||||
}
|
memo.push(idx);
|
||||||
return memo;
|
}
|
||||||
}, []);
|
return memo;
|
||||||
|
}, []);
|
||||||
|
|
||||||
db.getObjects(keys, function(err, groupData) {
|
db.getObjects(keys, function(err, groupData) {
|
||||||
if (err) {
|
if (err) {
|
||||||
@@ -403,6 +410,7 @@ var async = require('async'),
|
|||||||
group.hidden = parseInt(group.hidden, 10) === 1;
|
group.hidden = parseInt(group.hidden, 10) === 1;
|
||||||
group.system = parseInt(group.system, 10) === 1;
|
group.system = parseInt(group.system, 10) === 1;
|
||||||
group.private = parseInt(group.private, 10) === 1;
|
group.private = parseInt(group.private, 10) === 1;
|
||||||
|
group.disableJoinRequests = parseInt(group.disableJoinRequests) === 1;
|
||||||
|
|
||||||
group['cover:url'] = group['cover:url'] || require('./coverPhoto').getDefaultGroupCover(group.name);
|
group['cover:url'] = group['cover:url'] || require('./coverPhoto').getDefaultGroupCover(group.name);
|
||||||
group['cover:position'] = group['cover:position'] || '50% 50%';
|
group['cover:position'] = group['cover:position'] || '50% 50%';
|
||||||
|
|||||||
@@ -44,6 +44,10 @@ module.exports = function(Groups) {
|
|||||||
payload.private = values.private ? '1' : '0';
|
payload.private = values.private ? '1' : '0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (values.hasOwnProperty('disableJoinRequests')) {
|
||||||
|
payload.disableJoinRequests = values.disableJoinRequests ? '1' : '0';
|
||||||
|
}
|
||||||
|
|
||||||
async.series([
|
async.series([
|
||||||
async.apply(checkNameChange, groupName, values.name),
|
async.apply(checkNameChange, groupName, values.name),
|
||||||
async.apply(updatePrivacy, groupName, values.private),
|
async.apply(updatePrivacy, groupName, values.private),
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ module.exports = function(Posts) {
|
|||||||
groups: function(next) {
|
groups: function(next) {
|
||||||
groups.getUserGroups(uids, next);
|
groups.getUserGroups(uids, next);
|
||||||
},
|
},
|
||||||
userSettings: function(next){
|
userSettings: function(next) {
|
||||||
user.getMultipleUserSettings(uids, next);
|
user.getMultipleUserSettings(uids, next);
|
||||||
},
|
},
|
||||||
userData: function(next) {
|
userData: function(next) {
|
||||||
|
|||||||
@@ -37,13 +37,17 @@ SocketGroups.join = function(socket, data, callback) {
|
|||||||
|
|
||||||
async.parallel({
|
async.parallel({
|
||||||
isAdmin: async.apply(user.isAdministrator, socket.uid),
|
isAdmin: async.apply(user.isAdministrator, socket.uid),
|
||||||
isPrivate: async.apply(groups.isPrivate, data.groupName)
|
groupData: async.apply(groups.getGroupData, data.groupName)
|
||||||
}, function(err, checks) {
|
}, function(err, results) {
|
||||||
if (err) {
|
if (err) {
|
||||||
return callback(err);
|
return callback(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!checks.isPrivate || checks.isAdmin) {
|
if (results.groupData.private && results.groupData.disableJoinRequests) {
|
||||||
|
return callback(new Error('[[error:join-requests-disabled]]'));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!results.groupData.isPrivate || results.isAdmin) {
|
||||||
groups.join(data.groupName, socket.uid, callback);
|
groups.join(data.groupName, socket.uid, callback);
|
||||||
} else {
|
} else {
|
||||||
groups.requestMembership(data.groupName, socket.uid, callback);
|
groups.requestMembership(data.groupName, socket.uid, callback);
|
||||||
@@ -261,6 +265,6 @@ SocketGroups.cover.remove = function(socket, data, callback) {
|
|||||||
|
|
||||||
groups.removeCover(data, callback);
|
groups.removeCover(data, callback);
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
module.exports = SocketGroups;
|
module.exports = SocketGroups;
|
||||||
|
|||||||
@@ -28,6 +28,14 @@
|
|||||||
<input id="change-group-label-color" placeholder="#0059b2" data-name="bgColor" value="{group.labelColor}" class="form-control" /><br />
|
<input id="change-group-label-color" placeholder="#0059b2" data-name="bgColor" value="{group.labelColor}" class="form-control" /><br />
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
|
<fieldset>
|
||||||
|
<div class="checkbox">
|
||||||
|
<label>
|
||||||
|
<input id="group-userTitleEnabled" name="userTitleEnabled" type="checkbox"<!-- IF group.userTitleEnabled --> checked<!-- ENDIF group.userTitleEnabled -->> <strong>[[groups:details.userTitleEnabled]]</strong>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<div class="checkbox">
|
<div class="checkbox">
|
||||||
<label>
|
<label>
|
||||||
@@ -39,6 +47,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
|
<fieldset>
|
||||||
|
<div class="checkbox">
|
||||||
|
<label>
|
||||||
|
<input id="group-disableJoinRequests" name="disableJoinRequests" type="checkbox"<!-- IF group.disableJoinRequests --> checked<!-- ENDIF group.disableJoinRequests -->> <strong>[[groups:details.disableJoinRequests]]</strong>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<div class="checkbox">
|
<div class="checkbox">
|
||||||
<label>
|
<label>
|
||||||
|
|||||||
Reference in New Issue
Block a user