diff --git a/public/src/app.js b/public/src/app.js index e24e2500dd..35037c8033 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -253,11 +253,8 @@ app.uid = null; app.replaceSelfLinks(); - setTimeout(function () { - if (window.scrollY === 0) { - window.scrollTo(0, 1); // rehide address bar on mobile after page load completes. - } - }, 100); + // Scroll back to top of page + window.scrollTo(0, 0); }; app.showLoginMessage = function () { diff --git a/public/src/modules/settings.js b/public/src/modules/settings.js index b31975c1ab..8c7d74a448 100644 --- a/public/src/modules/settings.js +++ b/public/src/modules/settings.js @@ -457,6 +457,17 @@ define('settings', function () { console.log('[settings] Unable to load settings for hash: ', hash); return callback(err); } + + // Parse all values. If they are json, return json + for(var key in values) { + if (values.hasOwnProperty(key)) { + try { + values[key] = JSON.parse(values[key]); + } catch (e) { + // Leave the value as is + } + } + } $(formEl).deserialize(values); @@ -471,9 +482,16 @@ define('settings', function () { formEl.find('input[type="checkbox"]').each(function (idx, inputEl) { inputEl = $(inputEl); if (!inputEl.is(':checked')) { - values[inputEl.attr('id')] = 'off'; + values[inputEl.attr('name')] = 'off'; } }); + + // Normalizing value of multiple selects + formEl.find('select[multiple]').each(function(idx, selectEl) { + selectEl = $(selectEl); + values[selectEl.attr('name')] = JSON.stringify(selectEl.val()); + }); + socket.emit('admin.settings.set', { hash: hash, values: values diff --git a/public/vendor/colorpicker/colorpicker.css b/public/vendor/colorpicker/colorpicker.css index 5ee96ba682..6f8ed782b9 100644 --- a/public/vendor/colorpicker/colorpicker.css +++ b/public/vendor/colorpicker/colorpicker.css @@ -139,7 +139,6 @@ left: 282px; } .colorpicker_submit { - display: none; position: absolute; width: 22px; height: 22px; diff --git a/src/controllers/groups.js b/src/controllers/groups.js index d6307b8daf..f72d7ed1d4 100644 --- a/src/controllers/groups.js +++ b/src/controllers/groups.js @@ -32,7 +32,7 @@ groupsController.details = function(req, res, next) { }, next); }, posts: function(next) { - groups.getLatestMemberPosts(req.params.name, 10, uid, next); + groups.getLatestMemberPosts(req.params.slug, 10, uid, next); } }, function(err, results) { if (err) { diff --git a/src/controllers/users.js b/src/controllers/users.js index 107c64a166..f7765ca469 100644 --- a/src/controllers/users.js +++ b/src/controllers/users.js @@ -48,32 +48,32 @@ usersController.getOnlineUsers = function(req, res, next) { }; usersController.getUsersSortedByPosts = function(req, res, next) { - getUsers('users:postcount', res, next); + usersController.getUsers('users:postcount', 50, res, next); }; usersController.getUsersSortedByReputation = function(req, res, next) { - getUsers('users:reputation', res, next); + usersController.getUsers('users:reputation', 50, res, next); }; usersController.getUsersSortedByJoinDate = function(req, res, next) { - getUsers('users:joindate', res, next); + usersController.getUsers('users:joindate', 50, res, next); }; -function getUsers(set, res, next) { - getUsersAndCount(set, 50, function(err, data) { +usersController.getUsers = function(set, count, res, next) { + getUsersAndCount(set, count, function(err, data) { if (err) { return next(err); } var userData = { search_display: 'hidden', - loadmore_display: data.count > 50 ? 'block' : 'hide', + loadmore_display: data.count > count ? 'block' : 'hide', users: data.users, show_anon: 'hide' }; res.render('users', userData); }); -} +}; function getUsersAndCount(set, count, callback) { async.parallel({ diff --git a/src/groups.js b/src/groups.js index 0e3f1ed066..e228ffbcf0 100644 --- a/src/groups.js +++ b/src/groups.js @@ -758,11 +758,10 @@ var async = require('async'), }); }; - Groups.getLatestMemberPosts = function(groupName, max, uid, callback) { + Groups.getLatestMemberPosts = function(groupSlug, max, uid, callback) { async.waterfall([ - function(next) { - Groups.getMembers(groupName, next); - }, + async.apply(Groups.getGroupNameByGroupSlug, groupSlug), + Groups.getMembers, function(uids, next) { if (!Array.isArray(uids) || !uids.length) { return callback(null, []); diff --git a/src/topics/unread.js b/src/topics/unread.js index 4683395f6f..a12f1c4d77 100644 --- a/src/topics/unread.js +++ b/src/topics/unread.js @@ -154,11 +154,9 @@ module.exports = function(Topics) { return callback(); } tids = tids.filter(Boolean); - - var now = Date.now(); - var scores = tids.map(function(tid) { - return now; - }); + if (!tids.length) { + return callback(); + } async.parallel({ topicScores: function(next) { @@ -180,6 +178,11 @@ module.exports = function(Topics) { return callback(); } + var now = Date.now(); + var scores = tids.map(function(tid) { + return now; + }); + async.parallel({ markRead: function(next) { db.sortedSetAdd('uid:' + uid + ':tids_read', scores, tids, next); diff --git a/src/upgrade.js b/src/upgrade.js index 506639c463..d433c9c06f 100644 --- a/src/upgrade.js +++ b/src/upgrade.js @@ -688,11 +688,22 @@ Upgrade.upgrade = function(callback) { updatesMade = true; winston.info('[2015/01/19] Generating group slugs'); - Groups.list({}, function(err, groups) { + async.waterfall([ + async.apply(db.getSetMembers, 'groups'), + function(groups, next) { + async.filter(groups, function(groupName, next) { + db.getObjectField('group:' + groupName, 'hidden', function(err, hidden) { + next((err || parseInt(hidden, 10)) ? false : true); + }); + }, function(groups) { + next(null, groups); + }); + } + ], function(err, groups) { var tasks = []; - groups.forEach(function(groupObj) { - tasks.push(async.apply(db.setObjectField, 'group:' + groupObj.name, 'slug', Utils.slugify(groupObj.name))); - tasks.push(async.apply(db.setObjectField, 'groupslug:groupname', Utils.slugify(groupObj.name), groupObj.name)); + groups.forEach(function(groupName) { + tasks.push(async.apply(db.setObjectField, 'group:' + groupName, 'slug', Utils.slugify(groupName))); + tasks.push(async.apply(db.setObjectField, 'groupslug:groupname', Utils.slugify(groupName), groupName)); }); // Administrator group diff --git a/src/user/settings.js b/src/user/settings.js index 9f3e1166eb..3daa3db869 100644 --- a/src/user/settings.js +++ b/src/user/settings.js @@ -101,6 +101,7 @@ module.exports = function(User) { followTopicsOnCreate: data.followTopicsOnCreate, followTopicsOnReply: data.followTopicsOnReply, sendChatNotifications: data.sendChatNotifications, + sendPostNotifications: data.sendPostNotifications, restrictChat: data.restrictChat, topicSearchEnabled: data.topicSearchEnabled }, next);