v1.18.x
Barış Soner Uşaklı 7 years ago
parent 12a7e57117
commit 57b7c7ede4

@ -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">
<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 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>
</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>

Loading…
Cancel
Save