From e1828153dd50c89db0ecc415d20153c8745ea996 Mon Sep 17 00:00:00 2001 From: Tyler Renelle Date: Mon, 9 Sep 2013 17:09:45 -0400 Subject: [PATCH] [#1489] add edit-gropu server route, basic editing of group info for now (with markdown!) --- public/css/alerts.styl | 3 +-- public/js/controllers/groupsCtrl.js | 5 +++++ src/controllers/groups.js | 30 ++++++++++++++++++++++++----- src/routes/api.js | 2 +- views/options/groups/group.jade | 22 ++++++++++----------- views/options/profile.jade | 3 +-- views/shared/formatting-help.jade | 2 ++ views/shared/modals/new-stuff.jade | 8 ++++---- 8 files changed, 50 insertions(+), 25 deletions(-) create mode 100644 views/shared/formatting-help.jade diff --git a/public/css/alerts.styl b/public/css/alerts.styl index 756ce5521e..1054938f0a 100644 --- a/public/css/alerts.styl +++ b/public/css/alerts.styl @@ -13,10 +13,9 @@ padding-right: 14px display: inline-block -.bailey-modal .popover +.wide-popover max-width: 400px - // variables gpColor = #FBEFC0 diff --git a/public/js/controllers/groupsCtrl.js b/public/js/controllers/groupsCtrl.js index a3dd070974..69cb80efc6 100644 --- a/public/js/controllers/groupsCtrl.js +++ b/public/js/controllers/groupsCtrl.js @@ -10,6 +10,11 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Groups', '$http', 'A $scope.Members = Members; $scope._editing = {group:false}; + $scope.save = function(group){ + group.$save(); + group._editing = false; + } + // ------ Loading ------ $scope.groups = Groups.groups; diff --git a/src/controllers/groups.js b/src/controllers/groups.js index dd4e339447..35c4aba9ad 100644 --- a/src/controllers/groups.js +++ b/src/controllers/groups.js @@ -19,6 +19,10 @@ var api = module.exports; var usernameFields = 'auth.local.username auth.facebook.displayName auth.facebook.givenName auth.facebook.familyName auth.facebook.name'; var partyFields = 'profile preferences items stats achievements party backer flags.rest ' + usernameFields; +function removeSelf(group, user){ + group.members = _.filter(group.members, function(m){return m._id != user._id}); +} + api.getMember = function(req, res) { User.findById(req.params.uid).select(partyFields).exec(function(err, user){ if (err) return res.json(500,{err:err}); @@ -70,8 +74,7 @@ api.getGroups = function(req, res, next) { // Remove self from party (see above failing `match` directive in `populate` if (results.party) { - var i = _.findIndex(results.party.members, {_id:user._id}); - if (~i) results.party.members.splice(i,1); + removeSelf(results.party, user); } // Sort public groups by members length (not easily doable in mongoose) @@ -104,8 +107,7 @@ api.getGroup = function(req, res, next) { } // Remove self from party (see above failing `match` directive in `populate` if (group.type == 'party') { - var i = _.findIndex(group.members, {_id:user._id}); - if (~i) group.members.splice(i,1); + removeSelf(group, user); } res.json(group); @@ -121,6 +123,24 @@ api.createGroup = function(req, res, next) { }) } +api.updateGroup = function(req, res, next) { + var group = res.locals.group; + 'name description logo websites logo leaderMessage'.split(' ').forEach(function(attr){ + group[attr] = req.body[attr]; + }); + async.series([ + function(cb){group.save(cb);}, + function(cb){ + var fields = group.type == 'party' ? partyFields : usernameFields; + Group.findById(group._id).populate('members', fields).exec(cb); + } + ], function(err, results){ + if (err) return res.json(500,{err:err}); + removeSelf(results[1], res.locals.user); + res.json(results[1]); + }) +} + api.attachGroup = function(req, res, next) { Group.findById(req.params.gid, function(err, group){ if(err) return res.json(500, {err:err}); @@ -160,7 +180,7 @@ api.postChat = function(req, res, next) { // TODO This is less efficient, but see https://github.com/lefnire/habitrpg/commit/41255dc#commitcomment-4014583 var saved = results[1]; - saved.members = _.filter(saved.members, function(m){return m._id != user._id}); + removeSelf(saved, user); res.json(saved); }) diff --git a/src/routes/api.js b/src/routes/api.js index 6dedadc477..91346a424b 100644 --- a/src/routes/api.js +++ b/src/routes/api.js @@ -57,7 +57,7 @@ router['delete']('/user/tags/:tid', auth.auth, user.deleteTag); router.get('/groups', auth.auth, groups.getGroups); router.post('/groups', auth.auth, groups.createGroup); router.get('/groups/:gid', auth.auth, groups.getGroup); -//PUT /groups/:gid (edit group) +router.post('/groups/:gid', auth.auth, groups.attachGroup, groups.updateGroup); //DELETE /groups/:gid router.post('/groups/:gid/join', auth.auth, groups.attachGroup, groups.join); diff --git a/views/options/groups/group.jade b/views/options/groups/group.jade index ef502c85d9..dfefaa5776 100644 --- a/views/options/groups/group.jade +++ b/views/options/groups/group.jade @@ -9,15 +9,19 @@ a.pull-right.gem-wallet(rel='popover', data-trigger='hover', data-title='Guild B // ------ Information ------- .modal(style='position: relative;top: auto;left: auto;right: auto;margin: 0 auto 20px;z-index: 1;max-width: 100%;') .modal-header + span(ng-if='group.leader == user.id') + button.btn.btn-primary.pull-right(ng-click='save(group)', ng-show='group._editing') Save + button.btn.btn-default.pull-right(ng-click='group._editing = true', ng-hide='group._editing') Edit Group h3 {{group.name}} .modal-body - div.whatever-options(ng-show='_editing.group') + div.whatever-options(ng-show='group._editing') .control-group.option-large label.control-label Group Name input.option-content(type='text', ng-model='group.name', placeholder='Group Name') .control-group.option-large label.control-label Description textarea.option-content(style='height:15em;', placeholder='Description', ng-model='group.description') + include ../../shared/formatting-help .control-group.option-large label.control-label Logo URL input.option-content(type='url', placeholder='Logo URL', ng-model='group.logo') @@ -39,7 +43,7 @@ a.pull-right.gem-wallet(rel='popover', data-trigger='hover', data-title='Guild B i.icon-trash a(target='_blank', href='{{website}}') {{website}} - div(ng-show='!_editing.group') + div(ng-show='!group._editing') img.pull-right(ng-show='group.logo', style='max-width:150px', ng-src='{{group.logo}}') markdown(ng-model='group.description') div(ng-show='group.websites') @@ -95,20 +99,16 @@ a.pull-right.gem-wallet(rel='popover', data-trigger='hover', data-title='Guild B a.btn.btn-danger(data-id='{{group.id}}', ng-click='leave(group)') Leave .span8 - div(ng-if='group.leader == user.id') - div.blah-options(ng-show='_editing.group') - button.btn.btn-primary.pull-right(ng-click='_editing.group = false') Save - i.icon-ok - .option-large - textarea.option-content(style='height:15em;', placeholder='Message from group leader', ng-model='group.leaderMessage') - div(ng-hide='_editing.group') - button.btn.btn-default.pull-right(ng-click='_editing.group = true') Edit Group + div.blah-options(ng-show='group._editing') + .option-large + textarea.option-content(style='height:15em;', placeholder='Message from group leader', ng-model='group.leaderMessage') + include ../../shared/formatting-help table(ng-show='group.leaderMessage') tr td app:avatar:avatar(profile='{{Members.members[group.leader]}}') td - .popover.static-popover.fade.right.in + .popover.static-popover.fade.right.in.wide-popover .arrow h3.popover-title {{username(Members.members[group.leader].auth, Members.members[group.leader].profile.name)}} .popover-content diff --git a/views/options/profile.jade b/views/options/profile.jade index 4b469ad990..293e3c8e1f 100644 --- a/views/options/profile.jade +++ b/views/options/profile.jade @@ -72,8 +72,7 @@ .control-group.option-large label.control-label Blurb textarea.option-content(style='height:15em;', placeholder='Blurb', ng-model='user.profile.blurb', ng-blur='set("profile.blurb", user.profile.blurb)') - small - a(target='_blank', href='http://daringfireball.net/projects/markdown/') Use Markdown form formatting + include ../shared/formatting-help .control-group.option-large label.control-label Websites form(ng-submit='addWebsite()') diff --git a/views/shared/formatting-help.jade b/views/shared/formatting-help.jade new file mode 100644 index 0000000000..0de22cf962 --- /dev/null +++ b/views/shared/formatting-help.jade @@ -0,0 +1,2 @@ +small + a(target='_blank', href='http://daringfireball.net/projects/markdown/') Use Markdown form formatting \ No newline at end of file diff --git a/views/shared/modals/new-stuff.jade b/views/shared/modals/new-stuff.jade index 285d8f6cb3..68d01c62cc 100644 --- a/views/shared/modals/new-stuff.jade +++ b/views/shared/modals/new-stuff.jade @@ -1,13 +1,13 @@ div(modal='user.flags.rewrite !== false') .modal-header h3 Mega Ultra Update! - .modal-body.bailey-modal + .modal-body table tr td .NPC-Bailey td - .popover.static-popover.fade.right.in + .popover.static-popover.fade.right.in.wide-popover .arrow h3.popover-title a(target='_blank', href='http://www.kickstarter.com/profile/mihakuu') Bailey @@ -47,13 +47,13 @@ div(modal='user.flags.rewrite !== false') div(modal='modals.newStuff') .modal-header h3 New Stuff! - .modal-body.bailey-modal + .modal-body table tr td .NPC-Bailey td - .popover.static-popover.fade.right.in + .popover.static-popover.fade.right.in.wide-popover .arrow h3.popover-title a(target='_blank', href='http://www.kickstarter.com/profile/mihakuu') Bailey