From 3b1e373e7b4fb8fd09470467ad516d3300196e3e Mon Sep 17 00:00:00 2001
From: barisusakli <barisusakli@gmail.com>
Date: Thu, 12 Jun 2014 18:53:58 -0400
Subject: [PATCH] group titles

---
 public/src/forum/admin/groups.js |  4 +++
 src/controllers/admin.js         |  3 ++
 src/groups.js                    | 55 ++++++++++++++++++++++++--------
 src/posts.js                     |  3 ++
 4 files changed, 52 insertions(+), 13 deletions(-)

diff --git a/public/src/forum/admin/groups.js b/public/src/forum/admin/groups.js
index e1d945ac07..70c80ff241 100644
--- a/public/src/forum/admin/groups.js
+++ b/public/src/forum/admin/groups.js
@@ -83,11 +83,13 @@ define('forum/admin/groups', function() {
 					var formEl = detailsModal.find('form'),
 						nameEl = formEl.find('#change-group-name'),
 						descEl = formEl.find('#change-group-desc'),
+						userTitleEl = formEl.find('#change-group-user-title'),
 						numMembers = groupObj.members.length,
 						x;
 
 					nameEl.val(groupObj.name);
 					descEl.val(groupObj.description);
+					userTitleEl.val(groupObj.userTitle);
 
 					if (numMembers > 0) {
 						groupMembersEl.empty();
@@ -191,12 +193,14 @@ define('forum/admin/groups', function() {
 			var formEl = detailsModal.find('form'),
 				nameEl = formEl.find('#change-group-name'),
 				descEl = formEl.find('#change-group-desc'),
+				userTitleEl = formEl.find('#change-group-user-title'),
 				groupName = detailsModal.attr('data-groupname');
 
 			socket.emit('admin.groups.update', {
 				groupName: groupName,
 				values: {
 					name: nameEl.val(),
+					userTitle: userTitleEl.val(),
 					description: descEl.val()
 				}
 			}, function(err) {
diff --git a/src/controllers/admin.js b/src/controllers/admin.js
index 3e93f3adeb..0db5edd1f0 100644
--- a/src/controllers/admin.js
+++ b/src/controllers/admin.js
@@ -184,6 +184,9 @@ adminController.groups.get = function(req, res, next) {
 		showSystemGroups: true,
 		truncateUserList: true
 	}, function(err, groups) {
+		groups = groups.filter(function(group) {
+			return group.name !== 'registered-users' && group.name !== 'guests';
+		});
 		res.render('admin/groups', {
 			groups: groups,
 			yourid: req.user.uid
diff --git a/src/groups.js b/src/groups.js
index 1c528a6855..099949f598 100644
--- a/src/groups.js
+++ b/src/groups.js
@@ -221,21 +221,16 @@
 	};
 
 	Groups.update = function(groupName, values, callback) {
+		callback = callback || function() {};
 		db.exists('group:' + groupName, function (err, exists) {
-			if (!err && exists) {
-				// If the group was renamed, check for dupes
-				if (!values.name) {
-					db.setObject('group:' + groupName, values, callback);
-				} else {
-					if (callback) {
-						callback(new Error('[[error:group-name-change-not-allowed]]'));
-					}
-				}
-			} else {
-				if (callback) {
-					callback(new Error('[[error:no-group]]'));
-				}
+			if (err || !exists) {
+				return callback(err || new Error('[[error:no-group]]'));
 			}
+
+			db.setObject('group:' + groupName, {
+				userTitle: values.userTitle,
+				description: values.description
+			}, callback);
 		});
 	};
 
@@ -321,5 +316,39 @@
 				})
 			})
 		});
+	};
+
+	Groups.getUserGroups = function(uid, callback) {
+		var ignoredGroups = ['registered-users'];
+
+		db.getSetMembers('groups', function(err, groupNames) {
+			var groupKeys = groupNames.filter(function(groupName) {
+				return ignoredGroups.indexOf(groupName) === -1;
+			}).map(function(groupName) {
+				return 'group:' + groupName;
+			});
+
+			db.getObjectsFields(groupKeys, ['name', 'hidden', 'userTitle'], function(err, groupData) {
+
+				groupData = groupData.filter(function(group) {
+					return parseInt(group.hidden, 10) !== 1;
+				});
+
+				var groupSets = groupData.map(function(group) {
+					group.userTitle = group.userTitle || group.name;
+					return 'group:' + group.name + ':members';
+				})
+
+				db.isMemberOfSets(groupSets, uid, function(err, isMembers) {
+					for(var i=isMembers.length - 1; i>=0; --i) {
+						if (parseInt(isMembers[i], 10) !== 1) {
+							groupData.splice(i, 1);
+						}
+					}
+
+					callback(null, groupData);
+				});
+			});
+		});
 	}
 }(module.exports));
diff --git a/src/posts.js b/src/posts.js
index f00fbe06f5..f368cae828 100644
--- a/src/posts.js
+++ b/src/posts.js
@@ -212,6 +212,9 @@ var async = require('async'),
 				},
 				customProfileInfo: function(next) {
 					plugins.fireHook('filter:posts.custom_profile_info', {profile: [], uid: post.uid, pid: post.pid}, next);
+				},
+				groups: function(next) {
+					groups.getUserGroups(post.uid, next);
 				}
 			}, function(err, results) {
 				if (err) {