From e4ce1c2cdf620efc55518429f98b396cfa5c9ef0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jer=C3=B4me=20Bakker?= Date: Wed, 4 Jan 2023 14:13:37 +0100 Subject: [PATCH] added: group membership widget sort options --- languages/en.php | 5 ++ languages/nl.php | 7 +- .../widgets/a_users_groups/content.php | 68 +++++++++++++++++-- views/default/widgets/a_users_groups/edit.php | 17 +++++ 4 files changed, 89 insertions(+), 8 deletions(-) diff --git a/languages/en.php b/languages/en.php index 721f428..6d356d7 100644 --- a/languages/en.php +++ b/languages/en.php @@ -484,6 +484,11 @@ 'widgets:group_related:name' => "Related groups", 'widgets:group_related:description' => "Show a list of related groups", + // a_users_groups (group memberships) + 'widgets:a_users_groups:sort_by' => "Sort groups by", + 'widgets:a_users_groups:sort_by:activity' => "Recent personal activity", + 'widgets:a_users_groups:sort_by:join_date' => "Join date", + // welcome message 'group_tools:welcome_message:title' => "Group welcome message", 'group_tools:welcome_message:description' => "You can configure a welcome message for new users who join this group. If you don't want to send a welcome message leave this field blank.", diff --git a/languages/nl.php b/languages/nl.php index bd573e7..9f84625 100644 --- a/languages/nl.php +++ b/languages/nl.php @@ -1,10 +1,13 @@ 'Sorteer de groepen op', + 'widgets:a_users_groups:sort_by:activity' => 'Recente persoonlijke activiteit', + 'widgets:a_users_groups:sort_by:join_date' => 'Datum van lidmaatschap', 'group_tools:csv_exporter:user:group_role' => 'Rol', 'group_tools:mail:message:default_subject' => 'Bericht uit de groep %s', 'groups:tool:group_multiple_admin_allow:description' => 'Laat groepsbeheerders andere groepsbeheerders beheren. Normaal kan alleen de groepseigenaar dit beheren.', diff --git a/views/default/widgets/a_users_groups/content.php b/views/default/widgets/a_users_groups/content.php index b18e35c..7feac0d 100644 --- a/views/default/widgets/a_users_groups/content.php +++ b/views/default/widgets/a_users_groups/content.php @@ -1,21 +1,77 @@ getOwnerEntity(); +if (!$owner instanceof \ElggUser) { + $owner = elgg_get_logged_in_user_entity(); +} -$num_display = (int) $widget->num_display ?: 4; +if (!$owner instanceof \ElggUser) { + echo elgg_view_message('notice', elgg_echo('loggedinrequired'), ['title' => false]); + return; +} -$more_link = elgg_view_url(elgg_generate_url('collection:group:group:member', ['username' => $owner->username]), elgg_echo('groups:more')); +$num_display = (int) $widget->num_display ?: 4; +$sort_by = $widget->sort_by ?? 'alpha'; -echo elgg_list_entities([ +$params = [ 'type' => 'group', 'relationship' => 'member', - 'relationship_guid' => $widget->owner_guid, + 'relationship_guid' => $owner->guid, 'limit' => $num_display, 'pagination' => false, 'no_results' => elgg_echo('groups:none'), - 'widget_more' => $more_link, -]); + 'widget_more' => elgg_view_url(elgg_generate_url('collection:group:group:member', ['username' => $owner->username]), elgg_echo('groups:more')), + 'sort_by' => [ + 'property_type' => 'metadata', + 'property' => 'name', + ], +]; + +if ($widget->context !== 'profile') { + switch ($sort_by) { + case 'join_date': + $params['sort_by'] = [ + 'property_type' => 'relationship', + 'property' => 'member', + 'direction' => 'DESC', + 'relationship_guid' => $owner->guid, + ]; + break; + + case 'activity': + unset($params['sort_by']); + + // sort by latest activity + $params['select'][] = function (QueryBuilder $qb, $main_alias) use ($owner) { + $river = $qb->subquery('river', 'river'); + $river->select('river.posted'); + $river->joinEntitiesTable('river', 'object_guid', 'inner', 'ent'); + $river->where($qb->compare('river.subject_guid', '=', $owner->guid, ELGG_VALUE_GUID)); + $river->andWhere($qb->merge([ + $qb->compare("{$main_alias}.guid", '=', 'ent.container_guid'), + $qb->compare("{$main_alias}.guid", '=', 'river.object_guid'), + ], 'OR')); + $river->orderBy('river.posted', 'desc'); + $river->setMaxResults(1); + + return '('. $river->getSQL() . ') AS latest_activity'; + }; + + $params['order_by'][] = new \Elgg\Database\Clauses\OrderByClause('latest_activity', 'desc'); + $params['order_by'][] = new \Elgg\Database\Clauses\OrderByClause('e.time_created', 'desc'); + break; + } +} + +echo elgg_list_entities($params); diff --git a/views/default/widgets/a_users_groups/edit.php b/views/default/widgets/a_users_groups/edit.php index a32b065..007d889 100644 --- a/views/default/widgets/a_users_groups/edit.php +++ b/views/default/widgets/a_users_groups/edit.php @@ -1,10 +1,27 @@ context !== 'profile') { + echo elgg_view_field([ + '#type' => 'select', + '#label' => elgg_echo('widgets:a_users_groups:sort_by'), + 'name' => 'params[sort_by]', + 'value' => $widget->sort_by, + 'options_values' => [ + 'alpha' => elgg_echo('sort:alpha'), + 'activity' => elgg_echo('widgets:a_users_groups:sort_by:activity'), + 'join_date' => elgg_echo('widgets:a_users_groups:sort_by:join_date'), + ], + ]); +} + echo elgg_view('object/widget/edit/num_display', [ 'entity' => $widget, 'label' => elgg_echo('groups:widget:num_display'),