mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-01 11:35:55 +01:00
@@ -1,7 +1,7 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
/* globals app, define, ajaxify, socket, bootbox, utils, templates */
|
/* globals app, define, ajaxify, socket, bootbox, utils, templates */
|
||||||
|
|
||||||
define('forum/groups/list', function() {
|
define('forum/groups/list', ['forum/infinitescroll'], function(infinitescroll) {
|
||||||
var Groups = {};
|
var Groups = {};
|
||||||
|
|
||||||
Groups.init = function() {
|
Groups.init = function() {
|
||||||
@@ -13,6 +13,8 @@ define('forum/groups/list', function() {
|
|||||||
ajaxify.go('groups/' + groupSlug);
|
ajaxify.go('groups/' + groupSlug);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
infinitescroll.init(Groups.loadMoreGroups);
|
||||||
|
|
||||||
// Group creation
|
// Group creation
|
||||||
$('button[data-action="new"]').on('click', function() {
|
$('button[data-action="new"]').on('click', function() {
|
||||||
bootbox.prompt('Group Name:', function(name) {
|
bootbox.prompt('Group Name:', function(name) {
|
||||||
@@ -29,13 +31,41 @@ define('forum/groups/list', function() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
var params = utils.params();
|
||||||
|
$('#search-sort').val(params.sort || 'alpha');
|
||||||
|
|
||||||
// Group searching
|
// Group searching
|
||||||
$('#search-text').on('keyup', Groups.search);
|
$('#search-text').on('keyup', Groups.search);
|
||||||
$('#search-button').on('click', Groups.search);
|
$('#search-button').on('click', Groups.search);
|
||||||
$('#search-sort').on('change', Groups.search);
|
$('#search-sort').on('change', function() {
|
||||||
|
ajaxify.go('groups?sort=' + $('#search-sort').val());
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Groups.loadMoreGroups = function(direction) {
|
||||||
|
if (direction < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
infinitescroll.loadMore('groups.loadMore', {
|
||||||
|
sort: $('#search-sort').val(),
|
||||||
|
after: $('[component="groups/container"]').attr('data-nextstart')
|
||||||
|
}, function(data, done) {
|
||||||
|
console.log(data);
|
||||||
|
if (data && data.groups.length) {
|
||||||
|
templates.parse('partials/groups/list', {
|
||||||
|
groups: data.groups
|
||||||
|
}, function(html) {
|
||||||
|
$('#groups-list').append(html);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
$('[component="groups/container"]').attr('data-nextstart', data.nextStart);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
Groups.search = function() {
|
Groups.search = function() {
|
||||||
var groupsEl = $('#groups-list'),
|
var groupsEl = $('#groups-list'),
|
||||||
queryEl = $('#search-text'),
|
queryEl = $('#search-text'),
|
||||||
@@ -44,8 +74,6 @@ define('forum/groups/list', function() {
|
|||||||
socket.emit('groups.search', {
|
socket.emit('groups.search', {
|
||||||
query: queryEl.val(),
|
query: queryEl.val(),
|
||||||
options: {
|
options: {
|
||||||
expand: true,
|
|
||||||
truncateUserList: true,
|
|
||||||
sort: sortEl.val()
|
sort: sortEl.val()
|
||||||
}
|
}
|
||||||
}, function(err, groups) {
|
}, function(err, groups) {
|
||||||
|
|||||||
@@ -397,11 +397,15 @@ adminController.extend.rewards = function(req, res, next) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
adminController.groups.get = function(req, res, next) {
|
adminController.groups.get = function(req, res, next) {
|
||||||
groups.list(req.uid, 0, -1, function(err, groups) {
|
groups.getGroupsFromSet('groups:createtime', req.uid, 0, -1, function(err, groups) {
|
||||||
if (err) {
|
if (err) {
|
||||||
return next(err);
|
return next(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
groups = groups.filter(function(group) {
|
||||||
|
return group && group.name.indexOf(':privileges:') === -1 && group.name !== 'registered-users';
|
||||||
|
});
|
||||||
|
|
||||||
res.render('admin/manage/groups', {
|
res.render('admin/manage/groups', {
|
||||||
groups: groups,
|
groups: groups,
|
||||||
yourid: req.user.uid
|
yourid: req.user.uid
|
||||||
|
|||||||
@@ -2,25 +2,42 @@
|
|||||||
|
|
||||||
var async = require('async'),
|
var async = require('async'),
|
||||||
nconf = require('nconf'),
|
nconf = require('nconf'),
|
||||||
|
db = require('../database'),
|
||||||
meta = require('../meta'),
|
meta = require('../meta'),
|
||||||
groups = require('../groups'),
|
groups = require('../groups'),
|
||||||
user = require('../user'),
|
user = require('../user'),
|
||||||
helpers = require('./helpers'),
|
helpers = require('./helpers'),
|
||||||
|
pagination = require('../pagination'),
|
||||||
groupsController = {};
|
groupsController = {};
|
||||||
|
|
||||||
groupsController.list = function(req, res, next) {
|
groupsController.list = function(req, res, next) {
|
||||||
groups.list(req.uid, 0, -1, function(err, groups) {
|
var sort = req.query.sort || 'alpha';
|
||||||
|
|
||||||
|
groupsController.getGroupsFromSet(req.uid, sort, 0, 8, function(err, data) {
|
||||||
if (err) {
|
if (err) {
|
||||||
return next(err);
|
return next(err);
|
||||||
}
|
}
|
||||||
|
res.render('groups/list', data);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
groups = groups.filter(function(group) {
|
groupsController.getGroupsFromSet = function(uid, sort, start, stop, callback) {
|
||||||
return group && !group.hidden && !group.system;
|
var set = 'groups:visible:name';
|
||||||
});
|
if (sort === 'count') {
|
||||||
|
set = 'groups:visible:memberCount';
|
||||||
|
} else if (sort === 'date') {
|
||||||
|
set = 'groups:visible:createtime';
|
||||||
|
}
|
||||||
|
|
||||||
res.render('groups/list', {
|
groups.getGroupsFromSet(set, uid, start, stop, function(err, groups) {
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
callback(null, {
|
||||||
groups: groups,
|
groups: groups,
|
||||||
allowGroupCreation: parseInt(meta.config.allowGroupCreation, 10) === 1
|
allowGroupCreation: parseInt(meta.config.allowGroupCreation, 10) === 1,
|
||||||
|
nextStart: stop + 1
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -57,15 +57,28 @@ var async = require('async'),
|
|||||||
return ephemeralGroups;
|
return ephemeralGroups;
|
||||||
};
|
};
|
||||||
|
|
||||||
Groups.list = function(uid, start, stop, callback) {
|
Groups.getGroupsFromSet = function(set, uid, start, stop, callback) {
|
||||||
db.getSortedSetRevRange('groups:createtime', start, stop, function (err, groupNames) {
|
var method;
|
||||||
|
var args;
|
||||||
|
if (set === 'groups:visible:name') {
|
||||||
|
method = db.getSortedSetRangeByLex;
|
||||||
|
args = [set, '-', '+', start, stop - start + 1, done];
|
||||||
|
} else {
|
||||||
|
method = db.getSortedSetRevRange;
|
||||||
|
args = [set, start, stop, done];
|
||||||
|
}
|
||||||
|
method.apply(null, args);
|
||||||
|
|
||||||
|
function done(err, groupNames) {
|
||||||
if (err) {
|
if (err) {
|
||||||
return callback(err);
|
return callback(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
groupNames = groupNames.filter(function(groupName) {
|
if (set === 'groups:visible:name') {
|
||||||
return groupName && groupName.indexOf(':privileges:') === -1 && groupName !== 'registered-users' && groupName !== 'guests';
|
groupNames = groupNames.map(function(name) {
|
||||||
});
|
return name.split(':')[1];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
async.parallel({
|
async.parallel({
|
||||||
groups: function(next) {
|
groups: function(next) {
|
||||||
@@ -89,7 +102,7 @@ var async = require('async'),
|
|||||||
|
|
||||||
callback(null, data.groups);
|
callback(null, data.groups);
|
||||||
});
|
});
|
||||||
});
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Groups.getGroups = function(start, stop, callback) {
|
Groups.getGroups = function(start, stop, callback) {
|
||||||
|
|||||||
@@ -49,6 +49,12 @@ module.exports = function(Groups) {
|
|||||||
groupData.ownerUid = data.ownerUid;
|
groupData.ownerUid = data.ownerUid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!data.hidden && !system) {
|
||||||
|
tasks.push(async.apply(db.sortedSetAdd, 'groups:visible:createtime', timestamp, data.name));
|
||||||
|
tasks.push(async.apply(db.sortedSetAdd, 'groups:visible:memberCount', memberCount, data.name));
|
||||||
|
tasks.push(async.apply(db.sortedSetAdd, 'groups:visible:name', 0, data.name.toLowerCase() + ':' + data.name));
|
||||||
|
}
|
||||||
|
|
||||||
if (!data.hidden) {
|
if (!data.hidden) {
|
||||||
tasks.push(async.apply(db.setObjectField, 'groupslug:groupname', slug, data.name));
|
tasks.push(async.apply(db.setObjectField, 'groupslug:groupname', slug, data.name));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,9 @@ module.exports = function(Groups) {
|
|||||||
async.parallel([
|
async.parallel([
|
||||||
async.apply(db.delete, 'group:' + groupName),
|
async.apply(db.delete, 'group:' + groupName),
|
||||||
async.apply(db.sortedSetRemove, 'groups:createtime', groupName),
|
async.apply(db.sortedSetRemove, 'groups:createtime', groupName),
|
||||||
|
async.apply(db.sortedSetRemove, 'groups:visible:createtime', groupName),
|
||||||
|
async.apply(db.sortedSetRemove, 'groups:visible:memberCount', groupName),
|
||||||
|
async.apply(db.sortedSetRemove, 'groups:visible:name', groupName.toLowerCase() + ':' + groupName),
|
||||||
async.apply(db.delete, 'group:' + groupName + ':members'),
|
async.apply(db.delete, 'group:' + groupName + ':members'),
|
||||||
async.apply(db.delete, 'group:' + groupName + ':pending'),
|
async.apply(db.delete, 'group:' + groupName + ':pending'),
|
||||||
async.apply(db.delete, 'group:' + groupName + ':invited'),
|
async.apply(db.delete, 'group:' + groupName + ':invited'),
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ var async = require('async'),
|
|||||||
|
|
||||||
plugins = require('../plugins'),
|
plugins = require('../plugins'),
|
||||||
utils = require('../../public/src/utils'),
|
utils = require('../../public/src/utils'),
|
||||||
db = require('./../database'),
|
db = require('../database'),
|
||||||
|
|
||||||
uploadsController = require('../controllers/uploads');
|
uploadsController = require('../controllers/uploads');
|
||||||
|
|
||||||
@@ -46,6 +46,7 @@ module.exports = function(Groups) {
|
|||||||
|
|
||||||
async.series([
|
async.series([
|
||||||
async.apply(updatePrivacy, groupName, values.private),
|
async.apply(updatePrivacy, groupName, values.private),
|
||||||
|
async.apply(updateVisibility, groupName, values.hidden),
|
||||||
async.apply(db.setObject, 'group:' + groupName, payload),
|
async.apply(db.setObject, 'group:' + groupName, payload),
|
||||||
async.apply(renameGroup, groupName, values.name)
|
async.apply(renameGroup, groupName, values.name)
|
||||||
], function(err) {
|
], function(err) {
|
||||||
@@ -62,6 +63,27 @@ module.exports = function(Groups) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function updateVisibility(groupName, hidden, callback) {
|
||||||
|
if (hidden) {
|
||||||
|
async.parallel([
|
||||||
|
async.apply(db.sortedSetRemove, 'groups:visible:createtime', groupName),
|
||||||
|
async.apply(db.sortedSetRemove, 'groups:visible:memberCount', groupName),
|
||||||
|
async.apply(db.sortedSetRemove, 'groups:visible:name', groupName.toLowerCase() + ':' + groupName)
|
||||||
|
], callback);
|
||||||
|
} else {
|
||||||
|
db.getObjectFields('group:' + groupName, ['createtime', 'memberCount'], function(err, groupData) {
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
async.parallel([
|
||||||
|
async.apply(db.sortedSetAdd, 'groups:visible:createtime', groupData.createtime, groupName),
|
||||||
|
async.apply(db.sortedSetAdd, 'groups:visible:memberCount', groupData.memberCount, groupName),
|
||||||
|
async.apply(db.sortedSetAdd, 'groups:visible:name', 0, groupName.toLowerCase() + ':' + groupName)
|
||||||
|
], callback);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Groups.hide = function(groupName, callback) {
|
Groups.hide = function(groupName, callback) {
|
||||||
callback = callback || function() {};
|
callback = callback || function() {};
|
||||||
db.setObjectField('group:' + groupName, 'hidden', 1, callback);
|
db.setObjectField('group:' + groupName, 'hidden', 1, callback);
|
||||||
@@ -195,7 +217,11 @@ module.exports = function(Groups) {
|
|||||||
async.apply(db.rename, 'group:' + oldName + ':owners', 'group:' + newName + ':owners'),
|
async.apply(db.rename, 'group:' + oldName + ':owners', 'group:' + newName + ':owners'),
|
||||||
async.apply(db.rename, 'group:' + oldName + ':pending', 'group:' + newName + ':pending'),
|
async.apply(db.rename, 'group:' + oldName + ':pending', 'group:' + newName + ':pending'),
|
||||||
async.apply(db.rename, 'group:' + oldName + ':invited', 'group:' + newName + ':invited'),
|
async.apply(db.rename, 'group:' + oldName + ':invited', 'group:' + newName + ':invited'),
|
||||||
|
|
||||||
async.apply(renameGroupMember, 'groups:createtime', oldName, newName),
|
async.apply(renameGroupMember, 'groups:createtime', oldName, newName),
|
||||||
|
async.apply(renameGroupMember, 'groups:visible:createtime', oldName, newName),
|
||||||
|
async.apply(renameGroupMember, 'groups:visible:memberCount', oldName, newName),
|
||||||
|
async.apply(renameGroupMember, 'groups:visible:name', oldName.toLowerCase() + ':' + oldName, newName.toLowerCase() + ':' + newName),
|
||||||
function(next) {
|
function(next) {
|
||||||
plugins.fireHook('action:group.rename', {
|
plugins.fireHook('action:group.rename', {
|
||||||
old: oldName,
|
old: oldName,
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var groups = require('../groups'),
|
var async = require('async'),
|
||||||
|
|
||||||
|
groups = require('../groups'),
|
||||||
meta = require('../meta'),
|
meta = require('../meta'),
|
||||||
user = require('../user'),
|
user = require('../user'),
|
||||||
|
groupsController = require('../controllers/groups'),
|
||||||
async = require('async'),
|
|
||||||
|
|
||||||
SocketGroups = {};
|
SocketGroups = {};
|
||||||
|
|
||||||
@@ -181,7 +182,26 @@ SocketGroups.search = function(socket, data, callback) {
|
|||||||
return callback(null, []);
|
return callback(null, []);
|
||||||
}
|
}
|
||||||
|
|
||||||
groups.search(data.query || '', data.options || {}, callback);
|
if (!data.query) {
|
||||||
|
var groupsPerPage = 9;
|
||||||
|
groupsController.getGroupsFromSet(socket.uid, data.options.sort, 0, groupsPerPage - 1, function(err, data) {
|
||||||
|
callback(err, !err ? data.groups : null);
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
groups.search(data.query, data.options || {}, callback);
|
||||||
|
};
|
||||||
|
|
||||||
|
SocketGroups.loadMore = function(socket, data, callback) {
|
||||||
|
if (!data || !data.sort || !data.after) {
|
||||||
|
return callback();
|
||||||
|
}
|
||||||
|
|
||||||
|
var groupsPerPage = 9;
|
||||||
|
var start = parseInt(data.after);
|
||||||
|
var stop = start + groupsPerPage - 1;
|
||||||
|
groupsController.getGroupsFromSet(socket.uid, data.sort, start, stop, callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
SocketGroups.searchMembers = function(socket, data, callback) {
|
SocketGroups.searchMembers = function(socket, data, callback) {
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ var db = require('./database'),
|
|||||||
schemaDate, thisSchemaDate,
|
schemaDate, thisSchemaDate,
|
||||||
|
|
||||||
// IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema
|
// IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema
|
||||||
latestSchema = Date.UTC(2015, 4, 20);
|
latestSchema = Date.UTC(2015, 5, 2);
|
||||||
|
|
||||||
Upgrade.check = function(callback) {
|
Upgrade.check = function(callback) {
|
||||||
db.get('schemaDate', function(err, value) {
|
db.get('schemaDate', function(err, value) {
|
||||||
@@ -377,8 +377,52 @@ Upgrade.upgrade = function(callback) {
|
|||||||
winston.info('[2015/05/20] Adding username:sorted and email:sorted skipped');
|
winston.info('[2015/05/20] Adding username:sorted and email:sorted skipped');
|
||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
function(next) {
|
||||||
|
thisSchemaDate = Date.UTC(2015, 5, 2);
|
||||||
|
if (schemaDate < thisSchemaDate) {
|
||||||
|
updatesMade = true;
|
||||||
|
winston.info('[2015/06/02] Creating group sorted sets');
|
||||||
|
|
||||||
|
db.getSortedSetRange('groups:createtime', 0, -1, function(err, groupNames) {
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
async.eachLimit(groupNames, 500, function(groupName, next) {
|
||||||
|
if (!groupName) {
|
||||||
|
return next();
|
||||||
|
}
|
||||||
|
db.getObjectFields('group:' + groupName, ['hidden', 'system', 'createtime', 'memberCount'], function(err, groupData) {
|
||||||
|
if (err) {
|
||||||
|
return next(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parseInt(groupData.hidden, 10) === 1 || parseInt(groupData.system, 10) === 1) {
|
||||||
|
return next();
|
||||||
|
}
|
||||||
|
async.parallel([
|
||||||
|
async.apply(db.sortedSetAdd, 'groups:visible:createtime', groupData.createtime, groupName),
|
||||||
|
async.apply(db.sortedSetAdd, 'groups:visible:memberCount', groupData.memberCount, groupName),
|
||||||
|
async.apply(db.sortedSetAdd, 'groups:visible:name', 0, groupName.toLowerCase() + ':' + groupName)
|
||||||
|
], next);
|
||||||
|
});
|
||||||
|
}, function(err) {
|
||||||
|
if (err) {
|
||||||
|
return next(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
winston.info('[2015/06/02] Creating group sorted sets done');
|
||||||
|
Upgrade.update(thisSchemaDate, next);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
winston.info('[2015/06/02] Creating group sorted sets skipped');
|
||||||
|
next();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Add new schema updates here
|
// Add new schema updates here
|
||||||
// IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema IN LINE 24!!!
|
// IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema IN LINE 24!!!
|
||||||
], function(err) {
|
], function(err) {
|
||||||
|
|||||||
Reference in New Issue
Block a user