diff --git a/js/util.js b/js/util.js index 979415c639..d8abbe398b 100644 --- a/js/util.js +++ b/js/util.js @@ -1422,6 +1422,29 @@ var SN = { // StatusNet SN.Init.NoticeFormSetup(form); }) .find('.notice_data-text').focus(); + }, + + showMoreGroupMenuItems: function(url) { + $.ajax({ + type: 'GET', + dataType: 'xml', + url: url, + success: function(data, textStatus) { + var groupmenu = $('ul#nav_group'); + $('li#nav_timeline_more_group_menu_items').remove(); + $("activity\\:object", data).each(function() { + var group = $(this); + var fullname = $('title',group).text(); + var nickname = $('poco\\:preferredUsername',group).text(); + var url = $('link[rel="alternate"][type="text/html"]',group).attr('href'); + if ($('li#nav_timeline_group_'+nickname, groupmenu).length == 0) { + groupmenu.append(''); + } + }); + } + }); } }, diff --git a/lib/groupsnav.php b/lib/groupsnav.php index 26058c2b7e..c023481a49 100644 --- a/lib/groupsnav.php +++ b/lib/groupsnav.php @@ -46,6 +46,8 @@ if (!defined('STATUSNET')) { */ class GroupsNav extends Menu { + const TOP_GROUPS = 5; + protected $user; protected $groups; @@ -53,7 +55,7 @@ class GroupsNav extends Menu { parent::__construct($action); $this->user = $user; - $this->groups = $user->getGroups(); + $this->groups = $this->getTopGroups($user); } function haveGroups() @@ -61,6 +63,21 @@ class GroupsNav extends Menu return (!empty($this->groups) && ($this->groups->N > 0)); } + function getTopGroups($user) + { + $memberships = Group_member::byMember($user->id, + 0, + self::TOP_GROUPS + 1); + + $g = array(); + + while ($memberships->fetch()) { + $g[] = User_group::staticGet('id', $memberships->group_id); + } + + return new ArrayWrapper($g); + } + /** * Show the menu * @@ -70,11 +87,21 @@ class GroupsNav extends Menu { $action = $this->actionName; - $this->out->elementStart('ul', array('class' => 'nav')); + $this->out->elementStart('ul', array('class' => 'nav', + 'id' => 'nav_group')); if (Event::handle('StartGroupsNav', array($this))) { + $cnt = 0; + while ($this->groups->fetch()) { + + $cnt++; + + if ($cnt > self::TOP_GROUPS) { + break; + } + $this->out->menuItem(($this->groups->mainpage) ? $this->groups->mainpage : common_local_url('showgroup', @@ -85,6 +112,16 @@ class GroupsNav extends Menu $this->action->arg('nickname') == $this->groups->nickname, 'nav_timeline_group_'.$this->groups->nickname); } + + if ($cnt > self::TOP_GROUPS) { + $this->out->menuItem(sprintf('javascript:SN.U.showMoreGroupMenuItems("%s")', + common_local_url('AtomPubMembershipFeed', array('profile' => $this->user->id))), + _('More ▼'), + _('More groups'), + false, + 'nav_timeline_more_group_menu_items'); + } + Event::handle('EndGroupsNav', array($this)); }