mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-02 03:55:55 +01:00
closes #6607
This commit is contained in:
@@ -75,9 +75,9 @@
|
||||
"nodebb-plugin-spam-be-gone": "0.5.4",
|
||||
"nodebb-rewards-essentials": "0.0.11",
|
||||
"nodebb-theme-lavender": "5.0.5",
|
||||
"nodebb-theme-persona": "9.0.17",
|
||||
"nodebb-theme-slick": "1.2.5",
|
||||
"nodebb-theme-vanilla": "10.0.15",
|
||||
"nodebb-theme-persona": "9.0.18",
|
||||
"nodebb-theme-slick": "1.2.6",
|
||||
"nodebb-theme-vanilla": "10.0.16",
|
||||
"nodebb-widget-essentials": "4.0.7",
|
||||
"nodemailer": "^4.6.5",
|
||||
"passport": "^0.4.0",
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
"details.grant": "Grant/Rescind Ownership",
|
||||
"details.kick": "Kick",
|
||||
"details.kick_confirm": "Are you sure you want to remove this member from the group?",
|
||||
|
||||
"details.add-member": "Add Member",
|
||||
"details.owner_options": "Group Administration",
|
||||
"details.group_name": "Group Name",
|
||||
"details.member_count": "Member Count",
|
||||
|
||||
@@ -5,20 +5,14 @@ define('admin/manage/group', [
|
||||
'forum/groups/memberlist',
|
||||
'iconSelect',
|
||||
'admin/modules/colorpicker',
|
||||
'translator',
|
||||
'benchpress',
|
||||
], function (memberList, iconSelect, colorpicker, translator, Benchpress) {
|
||||
], function (memberList, iconSelect, colorpicker) {
|
||||
var Groups = {};
|
||||
|
||||
Groups.init = function () {
|
||||
var groupDetailsSearch = $('#group-details-search');
|
||||
var groupDetailsSearchResults = $('#group-details-search-results');
|
||||
var groupIcon = $('#group-icon');
|
||||
var changeGroupUserTitle = $('#change-group-user-title');
|
||||
var changeGroupLabelColor = $('#change-group-label-color');
|
||||
var groupLabelPreview = $('#group-label-preview');
|
||||
var searchDelay;
|
||||
|
||||
|
||||
var groupName = ajaxify.data.group.name;
|
||||
|
||||
@@ -36,87 +30,6 @@ define('admin/manage/group', [
|
||||
groupLabelPreview.css('background', changeGroupLabelColor.val() || '#000000');
|
||||
});
|
||||
|
||||
groupDetailsSearch.on('keyup', function () {
|
||||
if (searchDelay) {
|
||||
clearTimeout(searchDelay);
|
||||
}
|
||||
|
||||
searchDelay = setTimeout(function () {
|
||||
var searchText = groupDetailsSearch.val();
|
||||
var foundUser;
|
||||
|
||||
socket.emit('admin.user.search', {
|
||||
query: searchText,
|
||||
}, function (err, results) {
|
||||
if (!err && results && results.users.length > 0) {
|
||||
var numResults = results.users.length;
|
||||
var x;
|
||||
if (numResults > 20) {
|
||||
numResults = 20;
|
||||
}
|
||||
|
||||
groupDetailsSearchResults.empty();
|
||||
|
||||
for (x = 0; x < numResults; x += 1) {
|
||||
foundUser = $('<li />');
|
||||
foundUser
|
||||
.attr({
|
||||
title: results.users[x].username,
|
||||
'data-uid': results.users[x].uid,
|
||||
'data-username': results.users[x].username,
|
||||
'data-userslug': results.users[x].userslug,
|
||||
'data-picture': results.users[x].picture,
|
||||
'data-usericon-bgColor': results.users[x]['icon:bgColor'],
|
||||
'data-usericon-text': results.users[x]['icon:text'],
|
||||
})
|
||||
.append(results.users[x].picture ?
|
||||
$('<img />').addClass('avatar avatar-sm').attr('src', results.users[x].picture) :
|
||||
$('<div />').addClass('avatar avatar-sm').css('background-color', results.users[x]['icon:bgColor']).html(results.users[x]['icon:text']))
|
||||
.append($('<span />').html(results.users[x].username));
|
||||
|
||||
groupDetailsSearchResults.append(foundUser);
|
||||
}
|
||||
} else {
|
||||
groupDetailsSearchResults.translateHtml('<li>[[admin/manage/groups:edit.no-users-found]]</li>');
|
||||
}
|
||||
});
|
||||
}, 200);
|
||||
});
|
||||
|
||||
groupDetailsSearchResults.on('click', 'li[data-uid]', function () {
|
||||
var userLabel = $(this);
|
||||
var uid = parseInt(userLabel.attr('data-uid'), 10);
|
||||
|
||||
socket.emit('admin.groups.join', {
|
||||
groupName: groupName,
|
||||
uid: uid,
|
||||
}, function (err) {
|
||||
if (err) {
|
||||
return app.alertError(err.message);
|
||||
}
|
||||
|
||||
var member = {
|
||||
uid: userLabel.attr('data-uid'),
|
||||
username: userLabel.attr('data-username'),
|
||||
userslug: userLabel.attr('data-userslug'),
|
||||
picture: userLabel.attr('data-picture'),
|
||||
'icon:bgColor': userLabel.attr('data-usericon-bgColor'),
|
||||
'icon:text': userLabel.attr('data-usericon-text'),
|
||||
};
|
||||
|
||||
Benchpress.parse('admin/partials/groups/memberlist', 'group.members', {
|
||||
group: {
|
||||
isOwner: ajaxify.data.group.isOwner,
|
||||
members: [member],
|
||||
},
|
||||
}, function (html) {
|
||||
translator.translate(html, function (html) {
|
||||
$('[component="groups/members"] tbody').prepend(html);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
$('[component="groups/members"]').on('click', '[data-action]', function () {
|
||||
var btnEl = $(this);
|
||||
var userRow = btnEl.parents('[data-uid]');
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
'use strict';
|
||||
|
||||
|
||||
define('forum/groups/memberlist', ['components', 'forum/infinitescroll'], function () {
|
||||
define('forum/groups/memberlist', ['autocomplete'], function (autocomplete) {
|
||||
var MemberList = {};
|
||||
var searchInterval;
|
||||
var groupName;
|
||||
@@ -11,10 +11,40 @@ define('forum/groups/memberlist', ['components', 'forum/infinitescroll'], functi
|
||||
templateName = _templateName || 'groups/details';
|
||||
groupName = ajaxify.data.group.name;
|
||||
|
||||
handleMemberAdd();
|
||||
handleMemberSearch();
|
||||
handleMemberInfiniteScroll();
|
||||
};
|
||||
|
||||
function handleMemberAdd() {
|
||||
$('[component="groups/members/add"]').on('click', function () {
|
||||
var modal = bootbox.dialog({
|
||||
title: '[[groups:details.add-member]]',
|
||||
message: '<input class="form-control" type="text" placeholder="[[global:search]]"/>',
|
||||
});
|
||||
autocomplete.user(modal.find('input'), function (ev, ui) {
|
||||
var user = ui.item.user;
|
||||
if (user) {
|
||||
addUserToGroup(user, function () {
|
||||
modal.modal('hide');
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function addUserToGroup(user, callback) {
|
||||
socket.emit('groups.addMember', { groupName: groupName, uid: user.uid }, function (err) {
|
||||
if (err) {
|
||||
return app.alertError(err);
|
||||
}
|
||||
parseAndTranslate([user], function (html) {
|
||||
$('[component="groups/members"] tbody').prepend(html);
|
||||
});
|
||||
callback();
|
||||
});
|
||||
}
|
||||
|
||||
function handleMemberSearch() {
|
||||
$('[component="groups/members/search"]').on('keyup', function () {
|
||||
var query = $(this).val();
|
||||
|
||||
@@ -71,14 +71,27 @@ SocketGroups.leave = function (socket, data, callback) {
|
||||
groups.leave(data.groupName, socket.uid, callback);
|
||||
};
|
||||
|
||||
SocketGroups.addMember = isOwner(function (socket, data, callback) {
|
||||
if (data.groupName === 'administrators' || groups.isPrivilegeGroup(data.groupName)) {
|
||||
return callback(new Error('[[error:not-allowed]]'));
|
||||
}
|
||||
groups.join(data.groupName, data.uid, callback);
|
||||
});
|
||||
|
||||
function isOwner(next) {
|
||||
return function (socket, data, callback) {
|
||||
async.parallel({
|
||||
isAdmin: async.apply(user.isAdministrator, socket.uid),
|
||||
isGlobalModerator: async.apply(user.isGlobalModerator, socket.uid),
|
||||
isOwner: async.apply(groups.ownership.isOwner, socket.uid, data.groupName),
|
||||
group: async.apply(groups.getGroupData, data.groupName),
|
||||
}, function (err, results) {
|
||||
if (err || (!results.isOwner && !results.isAdmin)) {
|
||||
return callback(err || new Error('[[error:no-privileges]]'));
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
var isOwner = results.isOwner || results.isAdmin || (results.isGlobalModerator && !results.group.system);
|
||||
if (!isOwner) {
|
||||
return callback(new Error('[[error:no-privileges]]'));
|
||||
}
|
||||
next(socket, data, callback);
|
||||
});
|
||||
|
||||
@@ -74,13 +74,6 @@
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<label for="add-member">[[admin/manage/groups:edit.add-user]]</label>
|
||||
<input type="text" class="form-control" id="group-details-search" placeholder="[[admin/manage/groups:edit.add-user-search]]" />
|
||||
<ul class="members user-list" id="group-details-search-results"></ul>
|
||||
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
|
||||
@@ -1,7 +1,16 @@
|
||||
<div class="input-group">
|
||||
<div class="row">
|
||||
<!-- IF group.isOwner -->
|
||||
<div class="col-lg-1">
|
||||
<button component="groups/members/add" type="button" class="btn btn-primary" title="[[groups:details.add-member]]"><i class="fa fa-user-plus"></i></button>
|
||||
</div>
|
||||
<!-- ENDIF group.isOwner -->
|
||||
<div class="<!-- IF group.isOwner -->col-lg-11<!-- ELSE -->col-lg-12<!-- ENDIF group.isOwner -->">
|
||||
<div class="input-group">
|
||||
<input class="form-control" type="text" component="groups/members/search" placeholder="[[global:search]]"/>
|
||||
<span class="input-group-addon search-button"><i class="fa fa-search"></i></span>
|
||||
</div><br />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table component="groups/members" class="table table-striped table-hover" data-nextstart="{group.membersNextStart}">
|
||||
<tbody>
|
||||
@@ -10,9 +19,9 @@
|
||||
<td>
|
||||
<a href="{config.relative_path}/user/{group.members.userslug}">
|
||||
<!-- IF group.members.picture -->
|
||||
<img class="avatar avatar-sm" src="{group.members.picture}" />
|
||||
<img class="avatar avatar-sm avatar-rounded" src="{group.members.picture}" />
|
||||
<!-- ELSE -->
|
||||
<div class="avatar avatar-sm" style="background-color: {group.members.icon:bgColor};">{group.members.icon:text}</div>
|
||||
<div class="avatar avatar-sm avatar-rounded" style="background-color: {group.members.icon:bgColor};">{group.members.icon:text}</div>
|
||||
<!-- ENDIF group.members.picture -->
|
||||
</a>
|
||||
</td>
|
||||
|
||||
Reference in New Issue
Block a user