Skip to content

Commit

Permalink
fixed: member selection on group mail page
Browse files Browse the repository at this point in the history
fixes #155, #65
  • Loading branch information
jeabakker committed Aug 3, 2020
1 parent b3c438f commit f71f55a
Show file tree
Hide file tree
Showing 10 changed files with 119 additions and 103 deletions.
25 changes: 21 additions & 4 deletions actions/group_tools/mail.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,39 @@

$group_guid = (int) get_input('group_guid', 0);
$user_guids = (array) get_input('user_guids');
$all_members = (int) get_input('all_members');

$subject = get_input('title');
$body = get_input('description');

array_walk($user_guids, 'sanitise_int');

if (empty($group_guid) || empty($body) || empty($user_guids)) {
if (empty($group_guid) || empty($body) || (empty($user_guids) && empty($all_members))) {
return elgg_error_response(elgg_echo('error:missing_data'));
}

elgg_entity_gatekeeper($group_guid, 'group');
$group = get_entity($group_guid);
if (!$group instanceof ElggGroup) {
return elgg_error_response(elgg_echo('error:missing_data'));
}

if (!group_tools_group_mail_enabled($group) && !group_tools_group_mail_members_enabled($group)) {
return elgg_error_response(elgg_echo('actionunauthorized'));
}

if (!empty($all_members)) {
$user_guids = $group->getMembers([
'callback' => function($row) {
return (int) $row->guid;
},
'limit' => false,
]);
} else {
foreach ($user_guids as $index => $user_guid) {
$user_guids[$index] = (int) $user_guid;
}

$user_guids = array_filter(array_unique($user_guids));
}

$group_mail = new GroupMail();
$group_mail->container_guid = $group_guid;

Expand Down
5 changes: 2 additions & 3 deletions languages/en.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
'group_tools:add_users' => "Add users",
'group_tools:delete_selected' => "Delete selected",
'group_tools:clear_selection' => "Clear selection",
'group_tools:all_members' => "All members",
'group_tools:all_members' => "All members (%d)",

'group_tools:profile:field:group_tools_preset' => "Group Tools Preset",

Expand Down Expand Up @@ -314,8 +314,7 @@
'group_tools:mail:message:from' => "From group",

'group_tools:mail:title' => "Send a mail to the group members",
'group_tools:mail:form:recipients' => "Number of recipients",
'group_tools:mail:form:members:selection' => "Select individual members",
'group_tools:mail:form:recipients' => "Select individual recipients",

'group_tools:mail:form:title' => "Subject",
'group_tools:mail:form:description' => "Body",
Expand Down
2 changes: 1 addition & 1 deletion languages/es.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
'group_tools:add_users' => 'Agregar usuarios',
'group_tools:delete_selected' => 'Borrar usuarios',
'group_tools:clear_selection' => 'Limpiar selección',
'group_tools:all_members' => 'Todos los miembros',
'group_tools:all_members' => 'Todos los miembros (%d)',
'group_tools:joinrequest:already' => 'Cancelar pedido de incorporación a este grupo',
'group_tools:joinrequest:already:tooltip' => 'Ya has solicitado la incorporación a este grupo, haz click aquí para cancelar tu solicitud',
'group_tools:join:already:tooltip' => 'Fuiste invitado a este grupo, puedes unirte ahora.',
Expand Down
2 changes: 1 addition & 1 deletion languages/fr.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
'group_tools:add_users' => 'Ajouter des utilisateurs',
'group_tools:delete_selected' => 'Supprimer la sélection',
'group_tools:clear_selection' => 'Réinitialiser la sélection',
'group_tools:all_members' => 'Tous les membres',
'group_tools:all_members' => 'Tous les membres (%d)',
'group_tools:joinrequest:already:tooltip' => 'Vous avez déjà demandé à rejoindre ce groupe. Cliquez ici pour annuler votre demande.',
'group_tools:join:already:tooltip' => 'Vous avez été invité à rejoindre ce groupe et pouvez l\'intégrer dès à présent.',
'group_tools:menu:mail' => 'Envoyer un e-mail aux membres',
Expand Down
2 changes: 1 addition & 1 deletion languages/nl.php
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,7 @@
'group_tools:mail:form:js:members' => 'Selecteer minstens ��n lid om het bericht aan te versturen',
'group_tools:group:invite:resend' => 'Uitnodiging opnieuw versturen naar gebruikers die al zijn uitgenodigd',
'group_tools:clear_selection' => 'Selectie wissen',
'group_tools:all_members' => 'Alle leden',
'group_tools:all_members' => 'Alle leden (%d)',
'group_tools:mail:form:recipients' => 'Aantal geselecteerde ontvangers',
'group_tools:mail:form:members:selection' => 'Selecteer individuele leden',
'group_tools:mail:form:js:description' => 'Geef een bericht op',
Expand Down
2 changes: 1 addition & 1 deletion languages/pt_br.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
return array (
'group_tools:add_users' => 'Adicionar usuários',
'group_tools:clear_selection' => 'Remover seleção',
'group_tools:all_members' => 'Todos membros',
'group_tools:all_members' => 'Todos membros (%d)',
'group_tools:joinrequest:already' => 'Cancelar requisição de entrada no grupo',
'group_tools:joinrequest:already:tooltip' => 'Você já solicitou entrada neste grupo, clique aqui para cancelar a requisição',
'group_tools:menu:mail' => 'Enviar email para os membros',
Expand Down
69 changes: 37 additions & 32 deletions views/default/forms/group_tools/mail.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,45 +6,46 @@
$group = elgg_extract('entity', $vars);
$members = elgg_extract('members', $vars);

$friendpicker_value = [];
$user_guids = [];
if (!empty($members)) {
foreach ($members as $member) {
$friendpicker_value[] = $member->guid;
$user_guids[] = $member->guid;
}
}

$form_data = '<label>';
$form_data .= elgg_echo('group_tools:mail:form:recipients');
$form_data .= ': ' . elgg_format_element('span', ['id' => 'group_tools_mail_recipients_count'], count($friendpicker_value));
$form_data .= '</label>';
$form_data .= '<br />';
$form_data .= elgg_view('output/url', [
'text' => elgg_echo('group_tools:mail:form:members:selection'),
'href' => '#group_tools_mail_member_selection',
'rel' => 'toggle',
$form_data = elgg_view_field([
'#type' => 'checkbox',
'#label' => elgg_echo('group_tools:all_members', [$group->getMembers(['count' => true])]),
'name' => 'all_members',
'value' => 1,
'checked' => true,
'switch' => true,
]);

$form_data .= '<div id="group_tools_mail_member_selection" class="hidden">';
$form_data .= elgg_view('input/friendspicker', [
'entities' => $members,
'value' => $friendpicker_value,
'highlight' => 'all',
'name' => 'user_guids',
]);
$form_data .= '</div>';

$form_data .= '<div id="group_tools_mail_member_options">';
$form_data .= elgg_view('input/button', [
'class' => 'elgg-button-action mrs',
'value' => elgg_echo('group_tools:clear_selection'),
'onclick' => 'elgg.group_tools.mail_clear_members();',
]);
$form_data .= elgg_view('input/button', [
'class' => 'elgg-button-action mrs',
'value' => elgg_echo('group_tools:all_members'),
'onclick' => 'elgg.group_tools.mail_all_members();',
$form_data .= elgg_view_field([
'#type' => 'fieldset',
'#class' => 'hidden',
'id' => 'group-tools-mail-individual',
'fields' => [
[
'#type' => 'userpicker',
'#label' => elgg_echo('group_tools:mail:form:recipients'),
'name' => 'user_guids',
'value' => $user_guids,
'show_friends' => false,
'handler' => 'livesearch/group_members',
'options' => [
'match_target' => $group->guid,
],
],
[
'#type' => 'button',
'id' => 'group-tools-mail-clear',
'value' => elgg_echo('group_tools:clear_selection'),
'class' => 'elgg-button-action',
],
]
]);
$form_data .= '</div>';

$form_data .= elgg_view_field([
'#type' => 'text',
Expand All @@ -66,5 +67,9 @@

echo $form_data;

$footer = elgg_view('input/submit', ['value' => elgg_echo('send')]);
// footer
$footer = elgg_view_field([
'#type' => 'submit',
'value' => elgg_echo('send'),
]);
elgg_set_form_footer($footer);
69 changes: 15 additions & 54 deletions views/default/js/group_tools/mail.js
Original file line number Diff line number Diff line change
@@ -1,56 +1,17 @@
elgg.provide("elgg.group_tools");

elgg.group_tools.mail_form_submit = function() {
var result = false;
var error_msg = "";
var error_count = 0;

if ($('#group_tools_mail_member_selection input[name="user_guids[]"]:checked').length === 0) {
error_msg += elgg.echo("group_tools:mail:form:js:members") + '\n';
error_count++;
}

if ($(this).find('input[name="description"]').val() === "") {
error_msg += elgg.echo("group_tools:mail:form:js:description") + '\n';
error_count++;
}

if (error_count > 0) {
alert(error_msg);
} else {
result = true;
}

return result;
};

elgg.group_tools.mail_clear_members = function() {
$('#group_tools_mail_member_selection input[name="user_guids[]"]:checked').each(function() {
$(this).prop('checked', false);
define(function(require) {
var $ = require('jquery');

$(document).on('click', '#group-tools-mail-clear', function() {
var $form = $(this).closest('form');

$form.find('div.elgg-user-picker[data-name="user_guids"] > ul.elgg-user-picker-list > li').remove();
});

elgg.group_tools.mail_update_recipients();
};

elgg.group_tools.mail_all_members = function() {
$('#group_tools_mail_member_selection input[name="user_guids[]"]').each(function() {
$(this).prop('checked', true);
$(document).on('change', 'form.elgg-form-group-tools-mail input[type="checkbox"][name="all_members"]', function() {
if ($(this).is(':checked')) {
$('#group-tools-mail-individual').closest('.elgg-field').addClass('hidden');
} else {
$('#group-tools-mail-individual').closest('.elgg-field').removeClass('hidden');
}
});

elgg.group_tools.mail_update_recipients();
};

elgg.group_tools.mail_update_recipients = function() {
var count = $('#group_tools_mail_member_selection input[name="user_guids[]"]:checked').length;

$('#group_tools_mail_recipients_count').html(count);
};

elgg.group_tools.init_mail = function() {
// group mail members
$(document).on("change", '#group_tools_mail_member_selection input[type=checkbox]', elgg.group_tools.mail_update_recipients);
$('#group_tools_mail_form').submit(elgg.group_tools.mail_form_submit);
};

//register init hook
elgg.register_hook_handler("init", "system", elgg.group_tools.init_mail);
});
6 changes: 0 additions & 6 deletions views/default/resources/groups/mail.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,6 @@
elgg_push_breadcrumb($group->getDisplayName(), $group->getURL());
elgg_push_breadcrumb(elgg_echo('group_tools:menu:mail'));

// get members
$members = $group->getMembers([
'limit' => false,
]);

// build page elements
$title_text = elgg_echo('group_tools:mail:title');

Expand All @@ -38,7 +33,6 @@
];
$body_vars = [
'entity' => $group,
'members' => $members,
];
$form = elgg_view_form('group_tools/mail', $form_vars, $body_vars);

Expand Down
40 changes: 40 additions & 0 deletions views/json/resources/livesearch/group_members.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

elgg_gatekeeper();

$limit = (int) elgg_extract('limit', $vars, elgg_get_config('default_limit'));
$query = elgg_extract('term', $vars, elgg_extract('q', $vars));
$input_name = elgg_extract('name', $vars);
$target_guid = (int) elgg_extract('match_target', $vars);

$target = get_entity($target_guid);
if (!$target instanceof ElggGroup) {
throw new \Elgg\EntityNotFoundException();
}

$options = [
'query' => $query,
'type' => 'user',
'limit' => $limit,
'sort' => 'name',
'order' => 'ASC',
'fields' => ['metadata' => ['name', 'username']],
'item_view' => elgg_extract('item_view', $vars, 'search/entity'),
'input_name' => $input_name,
'relationship' => 'member',
'relationship_guid' => $target->guid,
'inverse_relationship' => true,
];

// by default search in all users,
// with 'include_banned' => false, only search in 'allowed' users
if (!(bool) elgg_extract('include_banned', $vars, true)) {
$options['metadata_name_value_pairs'][] = [
'name' => 'banned',
'value' => 'no',
];
}

$body = elgg_list_entities($options, 'elgg_search');

echo elgg_view_page('', $body);

0 comments on commit f71f55a

Please sign in to comment.