1 {extends file="page.tpl"}
4 {function name=draw_actions}
5 <td class="{$rclass} center nowrap actions_row">
7 href="{path_for name="editMember" data=["id" => $member->id]}"
10 <i class="fas fa-user-edit fa-fw" aria-hidden="true"></i>
11 <span class="sr-only">{_T string="%membername: edit information" pattern="/%membername/" replace=$member->sname}</span>
13 {if $login->isAdmin() or $login->isStaff()}
15 href="{path_for name="contributions" data=["type" => "contributions", "option" => "member", "value" => $member->id]}"
18 <i class="fas fa-cookie fa-fw" aria-hidden="true"></i>
19 <span class="sr-only">{_T string="%membername: contributions" pattern="/%membername/" replace=$member->sname}</span>
22 href="{path_for name="removeMember" data=["id" => $member->id]}"
23 class="delete tooltip"
25 <i class="fas fa-user-times fa-fw" aria-hidden="true"></i>
26 <span class="sr-only">{_T string="%membername: remove from database" pattern="/%membername/" replace=$member->sname}</span>
29 {if $login->isSuperAdmin()}
31 href="{path_for name="impersonate" data=["id" => $member->id]}"
34 <i class="fas fa-user-secret fa-fw" aria-hidden="true"></i>
35 <span class="sr-only">{_T string="Log in in as %membername" pattern="/%membername/" replace=$member->sname}</span>
38 {* If some additionnals actions should be added from plugins, we load the relevant template file
39 We have to use a template file, so Smarty will do its work (like replacing variables). *}
40 {if $plugin_actions|@count != 0}
41 {foreach from=$plugin_actions key=plugin_name item=action}
42 {include file=$action module_id=$plugin_name|replace:'actions_':''}
48 {block name="content"}
49 <form action="{path_for name="filter-memberslist"}" method="post" id="filtre">
51 {if !isset($adv_filters) || !$adv_filters}
52 <label for="filter_str">{_T string="Search:"} </label>
53 <input type="text" name="filter_str" id="filter_str" value="{$filters->filter_str}" type="search" placeholder="{_T string="Enter a value"}"/>
54 {_T string="in:"}
55 <select name="field_filter">
56 {html_options options=$field_filter_options selected=$filters->field_filter}
58 {_T string="among:"}
59 <select name="membership_filter" onchange="form.submit()">
60 {html_options options=$membership_filter_options selected=$filters->membership_filter}
62 <select name="filter_account" onchange="form.submit()">
63 {html_options options=$filter_accounts_options selected=$filters->filter_account}
65 <select name="group_filter" onchange="form.submit()">
66 <option value="0">{_T string="Select a group"}</option>
67 {foreach from=$filter_groups_options item=group}
68 <option value="{$group->getId()}"{if $filters->group_filter eq $group->getId()} selected="selected"{/if}>{$group->getIndentName()}</option>
71 <button type="submit" class="tooltip action" title="{_T string="Apply filters"}" name="filter">
72 <i class="fa fa-search"></i>
75 <button type="submit" class="tooltip action" title="{_T string="Save selected criteria"}" name="savesearch" id="savesearch">
76 <i class="fa fa-fw fa-save"></i>
79 <input type="submit" name="clear_filter" class="inline tooltip" value="{_T string="Clear filter"}" title="{_T string="Reset all filters to defaults"}"/>
81 {_T string="Members that have an email address:"}
82 <input type="radio" name="email_filter" id="filter_dc_email" value="{Galette\Repository\Members::FILTER_DC_EMAIL}"{if $filters->email_filter eq constant('Galette\Repository\Members::FILTER_DC_EMAIL')} checked="checked"{/if}>
83 <label for="filter_dc_email" >{_T string="Don't care"}</label>
84 <input type="radio" name="email_filter" id="filter_with_email" value="{Galette\Repository\Members::FILTER_W_EMAIL}"{if $filters->email_filter eq constant('Galette\Repository\Members::FILTER_W_EMAIL')} checked="checked"{/if}>
85 <label for="filter_with_email" >{_T string="With"}</label>
86 <input type="radio" name="email_filter" id="filter_without_email" value="{Galette\Repository\Members::FILTER_WO_EMAIL}"{if $filters->email_filter eq constant('Galette\Repository\Members::FILTER_WO_EMAIL')} checked="checked"{/if}>
87 <label for="filter_without_email" >{_T string="Without"}</label>
91 <strong>{_T string="Advanced search mode"}</strong>
92 <button type="submit" class="tooltip action" title="{_T string="Change search criteria"}" name="adv_criteria">
93 <i class="fa fa-edit"></i>
94 {_T string="Change criteria"}
96 <button type="submit" class="tooltip action" title="{_T string="Save current advanced search criteria"}" name="savesearch" id="savesearch">
97 <i class="fa fa-fw fa-save"></i>
100 <input type="hidden" name="advanced_search" value="1"/>
101 <input type="submit" name="clear_filter" class="inline tooltip" value="{_T string="Clear filter"}" title="{_T string="Reset all filters to defaults"}"/>
103 <a href="#" id="showhideqry">{_T string="Show/hide query"}</a>
105 <pre id="sql_qry" class="hidden">{$filters->query}</pre>
108 <div class="infoline">
109 {_T string="%count member" plural="%count members" count=$nb_members pattern="/%count/" replace=$nb_members}
111 <label for="nbshow">{_T string="Records per page:"}</label>
112 <select name="nbshow" id="nbshow">
113 {html_options options=$nbshow_options selected=$numrows}
115 <noscript> <span><input type="submit" value="{_T string="Change"}" /></span></noscript>
119 <form action="{path_for name="batch-memberslist"}" method="post" id="listform">
121 <table class="listing">
124 {foreach item=column from=$galette_list}
125 {if $column->field_id eq 'id_adh'}
126 {if $preferences->pref_show_id}
128 <a href="{path_for name="members" data=["option" => "order", "value" => "Galette\Repository\Members::ORDERBY_ID"|constant]}">
129 {_T string="Mbr num"}
130 {if $filters->orderby eq constant('galette\Repository\Members::ORDERBY_ID')}
131 {if $filters->ordered eq constant('Galette\Filters\MembersList::ORDER_ASC')}
132 <img src="{base_url}/{$template_subdir}images/down.png" width="10" height="6" alt=""/>
134 <img src="{base_url}/{$template_subdir}images/up.png" width="10" height="6" alt=""/>
140 <th class="id_row">#</th>
144 <a href="{path_for name="members" data=["option" => "order", "value" => $column->field_id]}">
146 {if $filters->orderby eq $column->field_id}
147 {if $filters->ordered eq constant('Galette\Filters\MembersList::ORDER_ASC')}
148 <img src="{base_url}/{$template_subdir}images/down.png" width="10" height="6" alt=""/>
150 <img src="{base_url}/{$template_subdir}images/up.png" width="10" height="6" alt=""/>
157 <th class="actions_row">{_T string="Actions"}</th>
161 {foreach from=$members item=member key=ordre}
162 {assign var=rclass value=$member->getRowClass() }
164 {foreach item=column from=$galette_list}
165 {if $column->field_id eq 'id_adh'}
166 <td class="{$rclass} right" data-scope="id">
167 {if $preferences->pref_show_id}
170 {$ordre+1+($filters->current_page - 1)*$numrows}
173 {elseif $column->field_id eq 'list_adh_name'}
174 <td class="{$rclass} nowrap username_row" data-scope="row">
175 <input type="checkbox" name="member_sel[]" value="{$member->id}"/>
176 {if $member->isCompany()}
177 <span class="tooltip">
178 <img src="{base_url}/{$template_subdir}images/icon-company.png" alt="" width="16" height="16"/>
179 <span class="sr-only">{_T string="Is a company"}</span>
181 {elseif $member->isMan()}
182 <span class="tooltip">
183 <img src="{base_url}/{$template_subdir}images/icon-male.png" alt="" width="16" height="16"/>
184 <span class="sr-only">{_T string="Is a man"}</span>
186 {elseif $member->isWoman()}
187 <span class="tooltip">
188 <img src="{base_url}/{$template_subdir}images/icon-female.png" alt="" width="16" height="16"/>
189 <span class="sr-only">{_T string="Is a woman"}</span>
192 <img src="{base_url}/{$template_subdir}images/icon-empty.png" alt="" width="16" height="16"/>
194 {if $member->email != ''}
195 <a href="mailto:{$member->email}" class="tooltip">
196 <img src="{base_url}/{$template_subdir}images/icon-mail.png" alt="" width="16" height="16"/>
197 <span class="sr-only">{_T string="Mail"}</span>
200 <img src="{base_url}/{$template_subdir}images/icon-empty.png" alt="" width="16" height="16"/>
202 {if $member->website != ''}
203 <a href="{$member->website}" class="tooltip">
204 <img src="{base_url}/{$template_subdir}images/icon-website.png" alt="" width="16" height="16"/>
205 <span class="sr-only">{_T string="Website"}<span>
208 <img src="{base_url}/{$template_subdir}images/icon-empty.png" alt="" width="16" height="16"/>
210 {if $member->isAdmin()}
211 <span class="tooltip">
212 <img src="{base_url}/{$template_subdir}images/icon-star.png" alt="" width="16" height="16"/>
213 <span class="sr-only">{_T string="Admin"}</span>
215 {elseif $member->isStaff()}
216 <span class="tooltip">
217 <img src="{base_url}/{$template_subdir}images/icon-staff.png" alt="" width="16" height="16"/>
218 <span class="sr-only">{_T string="Staff member"}</span>
221 <img src="{base_url}/{$template_subdir}images/icon-empty.png" alt="" width="16" height="16"/>
223 {assign var="mid" value=$member->id}
224 <a href="{path_for name="member" data=["id" => $member->id]}">{$member->sname}{if $member->company_name} ({$member->company_name|escape}){/if}</a>
227 {assign var="lrclass" value=$rclass}
228 {assign var="propname" value=$column->propname}
229 {assign var=value value=$member->$propname|escape}
231 {if $column->field_id eq 'nom_adh'}
232 {assign var="value" value=$member->sfullname}
233 {elseif $column->field_id eq 'pseudo_adh'}
234 {assign var="lrclass" value="$rclass nowrap"}
235 {assign var=value value=$member->$propname|escape}
236 {elseif $column->field_id eq 'tel_adh' or $column->field_id eq 'gsm_adh'}
237 {assign var="lrclass" value="$rclass nowrap"}
238 {elseif $column->field_id eq 'id_statut'}
239 {assign var="lrclass" value="$rclass nowrap"}
240 {assign var=value value={statusLabel id=$member->$propname}}
241 {elseif $column->field_id eq 'titre_adh'}
242 {if is_object($member->title)}
243 {assign var=value value=$member->title->long}
245 {elseif $column->field_id eq 'pref_lang'}
246 {assign var="value" value=$i18n->getNameFromId($member->language)}
247 {elseif $column->field_id eq 'adresse_adh'}
248 {assign var="value" value=$member->saddress|nl2br}
249 {elseif $column->field_id eq 'bool_display_info'}
250 {assign var="value" value=$member->sappears_in_list}
251 {elseif $column->field_id eq 'activite_adh'}
252 {assign var="value" value=$member->sactive}
253 {elseif $column->field_id eq 'id_statut'}
254 {assign var="value" value=$member->sstatus}
255 {elseif $column->field_id eq 'bool_admin_adh'}
256 {assign var="value" value=$member->sadmin}
257 {elseif $column->field_id eq 'bool_exempt_adh'}
258 {assign var="value" value=$member->sdue_free}
259 {elseif $column->field_id eq 'sexe_adh'}
260 {assign var="value" value=$member->sgender}
262 <td class="{$lrclass}" data-title="{$column->label}">
264 A check is done here to adapt display, this is may not the best way to go
265 but for notw, that works as excpected.
267 {if not empty($value)}
268 {if $column->field_id eq 'email_adh' or $column->field_id eq 'msn_adh'}
269 <a href="mailto:{$value}">{$value}</a>
270 {elseif $column->field_id eq 'tel_adh' or $column->field_id eq 'gsm_adh'}
271 <a href="tel:{$value}">{$value}</a>
272 {elseif $column->field_id eq 'url_adh'}
273 <a href="{$value}">{$value}</a>
274 {elseif $column->field_id eq 'parent_id'}
275 <a href="{path_for name="member" data=["id" => $member->parent]}">{memberName id=$member->parent}</a>
276 {elseif $column->field_id eq 'ddn_adh'}
277 {$value} {$member->getAge()}
285 {draw_actions class=$rclass member=$member login=$login plugin_actions=$plugin_actions}
288 {* colspan +1 for actions column *}
289 <tr><td colspan="{$galette_list|count + 1}" class="emptylist">{_T string="No member has been found"}</td></tr>
293 {if $nb_members != 0}
294 <div class="center cright">
295 {_T string="Pages:"}<br/>
296 <ul class="pages">{$pagination}</ul>
298 <ul class="selection_menu">
299 <li>{_T string="For the selection:"}</li>
300 {if $login->isAdmin() or $login->isStaff()}
302 <button type="submit" id="delete" name="delete">
303 <i class="fas fa-user-times fa-fw"></i> {_T string="Delete"}
307 <button type="submit" id="masschange" name="masschange" class="action">
308 <i class="fas fa-user-edit fa-fw"></i> {_T string="Mass change"}
311 {if $pref_mail_method neq constant('Galette\Core\GaletteMail::METHOD_DISABLED')}
313 <button type="submit" id="sendmail" name="mailing">
314 <i class="fas fa-mail-bulk fa-fw"></i> {_T string="Mail"}
320 <button type="submit" id="attendance_sheet" name="attendance_sheet">
321 <i class="fas fa-file-alt fa-fw"></i> {_T string="Attendance sheet"}
325 <button type="submit" id="labels" name="labels">
326 <i class="far fa-address-card fa-fw"></i> {_T string="Generate labels"}
330 <button type="submit" id="cards" name="cards">
331 <i class="fas fa-id-badge fa-fw"></i> {_T string="Generate Member Cards"}
334 {if $login->isAdmin() or $login->isStaff()}
336 <button type="submit" id="csv" name="csv">
337 <i class="fas fa-file-csv fa-fw"></i> {_T string="Export as CSV"}
341 {if $plugin_batch_actions|@count != 0}
342 {foreach from=$plugin_batch_actions key=plugin_name item=action}
343 {include file=$action module_id=$plugin_name|replace:'batch_action_':''}
350 {if $nb_members != 0}
351 <div id="legende" title="{_T string="Legend"}">
352 <h1>{_T string="Legend"}</h1>
356 <th class="" colspan="4">{_T string="Reading the list"}</th>
359 <th class="back">{_T string="Name"}</th>
360 <td class="back">{_T string="Active account"}</td>
361 <th class="inactif back">{_T string="Name"}</th>
362 <td class="back">{_T string="Inactive account"}</td>
365 <th class="cotis-ok color-sample"> </th>
366 <td class="back">{_T string="Membership in order"}</td>
367 <th class="cotis-soon color-sample"> </th>
368 <td class="back">{_T string="Membership will expire soon (<30d)"}</td>
371 <th class="cotis-never color-sample"> </th>
372 <td class="back">{_T string="Never contributed"}</td>
373 <th class="cotis-late color-sample"> </th>
374 <td class="back">{_T string="Lateness in fee"}</td>
379 <th class="" colspan="4">{_T string="Actions"}</th>
383 <i class="fas fa-user-edit fa-fw"></i>
385 <td class="back">{_T string="Modification"}</td>
387 <i class="fas fa-cookie fa-fw"></i>
389 <td class="back">{_T string="Contributions"}</td>
393 <i class="fas fa-user-times fa-fw"></i>
395 <td class="back">{_T string="Deletion"}</td>
400 <th colspan="4">{_T string="User status/interactions"}</th>
403 <th><img src="{base_url}/{$template_subdir}images/icon-mail.png" alt="{_T string="Mail"}" width="16" height="16"/></th>
404 <td class="back">{_T string="Send an email"}</td>
405 <th><img src="{base_url}/{$template_subdir}images/icon-website.png" alt="{_T string="Website"}" width="16" height="16"/></th>
406 <td class="back">{_T string="Visit website"}</td>
410 <th><img src="{base_url}/{$template_subdir}images/icon-male.png" alt="{_T string="Is a man"}" width="16" height="16"/></th>
411 <td class="back">{_T string="Is a man"}</td>
412 <th><img src="{base_url}/{$template_subdir}images/icon-female.png" alt="{_T string="Is a woman"}" width="16" height="16"/></th>
413 <td class="back">{_T string="Is a woman"}</td>
416 <th><img src="{base_url}/{$template_subdir}images/icon-company.png" alt="{_T string="Is a company"}" width="16" height="16"/></th>
417 <td class="back">{_T string="Is a company"}</td>
420 <th><img src="{base_url}/{$template_subdir}images/icon-star.png" alt="{_T string="Admin"}" width="16" height="16"/></th>
421 <td class="back">{_T string="Admin"}</td>
422 <th><img src="{base_url}/{$template_subdir}images/icon-staff.png" alt="{_T string="Staff member"}" width="16" height="16"/></th>
423 <td class="back">{_T string="Staff member"}</td>
432 {block name="javascripts"}
433 <script type="text/javascript">
434 {if $nb_members != 0}
435 var _checkselection = function() {
436 var _checkeds = $('table.listing').find('input[type=checkbox]:checked').length;
437 if ( _checkeds == 0 ) {
438 var _el = $('<div id="pleaseselect" title="{_T string="No member selected" escape="js"}">{_T string="Please make sure to select at least one member from the list to perform this action." escape="js"}</div>');
439 _el.appendTo('body').dialog({
443 $(this).dialog( "close" );
446 close: function(event, ui){
455 {* Use of Javascript to draw specific elements that are not relevant is JS is inactive *}
457 {if $nb_members != 0}
458 var _checklinks = '<div class="checkboxes"><span class="fleft"><a href="#" class="checkall tooltip"><i class="fas fa-check-square"></i> {_T string="(Un)Check all" escape="js"}</a> | <a href="#" class="checkinvert tooltip"><i class="fas fa-exchange-alt"></i> {_T string="Invert selection" escape="js"}</a></span><a href="#" class="show_legend fright">{_T string="Show legend" escape="js"}</a></div>';
459 $('.listing').before(_checklinks);
460 $('.listing').after(_checklinks);
464 $('.selection_menu *[type="submit"], .selection_menu *[type="button"]').click(function(){
465 if ( this.id == 'delete' ) {
466 //mass removal is handled from 2 steps removal
470 if (!_checkselection()) {
473 {if $existing_mailing eq true}
474 if (this.id == 'sendmail') {
475 var _el = $('<div id="existing_mailing" title="{_T string="Existing mailing" escape="js"}">{_T string="A mailing already exists. Do you want to create a new one or resume the existing?" escape="js"}</div>');
476 _el.appendTo('body').dialog({
481 close: function(event, ui){
485 '{_T string="Resume"}': function() {
486 $(this).dialog( "close" );
487 location.href = '{path_for name="mailing"}';
489 '{_T string="New"}': function() {
490 $(this).dialog( "close" );
491 //add required controls to the form, change its action URI, and send it.
492 var _form = $('#listform');
493 _form.append($('<input type="hidden" name="mailing_new" value="true"/>'));
494 _form.append($('<input type="hidden" name="mailing" value="true"/>'));
502 if (this.id == 'attendance_sheet') {
503 _attendance_sheet_details();
510 if ( _shq = $('#showhideqry') ) {
511 _shq.click(function(){
512 $('#sql_qry').toggleClass('hidden');
517 $('#savesearch').on('click', function(e) {
520 var _el = $('<div id="savedsearch_details" title="{_T string="Search title" escape="js"}"><input type="text" name="search_title" id="search_title"/></div>');
521 _el.appendTo('body').dialog({
526 close: function(event, ui){
530 '{_T string="Ok" escape="js"}': function() {
531 var _form = $('#filtre');
532 var _data = _form.serialize();
533 _data = _data + "&search_title=" + $('#search_title').val();
535 url: '{path_for name="saveSearch"}',
539 {include file="js_loader.tpl"},
540 success: function(res) {
542 url: '{path_for name="ajaxMessages"}',
544 success: function (message) {
545 $('#asso_name').after(message);
551 $(this).dialog( "close" );
553 '{_T string="Cancel" escape="js"}': function() {
554 $(this).dialog( "close" );
561 {if $nb_members != 0}
562 {include file="js_removal.tpl"}
563 {include file="js_removal.tpl" selector="#delete" deleteurl="'{path_for name="batch-memberslist"}'" extra_check="if (!_checkselection()) {ldelim}return false;{rdelim}" extra_data="delete: true, member_sel: $('#listform input[type=\"checkbox\"]:checked').map(function(){ return $(this).val(); }).get()" method="POST"}
565 var _bindmassres = function(res) {
566 res.find('#btncancel')
568 .on('click', function(e) {
573 res.find('input[type=submit]')
577 $('#masschange').off('click').on('click', function(event) {
578 event.preventDefault();
581 if (!_checkselection()) {
585 url: '{path_for name="batch-memberslist"}',
590 member_sel: $('#listform input[type=\"checkbox\"]:checked').map(function(){
591 return $(this).val();
595 {include file="js_loader.tpl"},
596 success: function(res){
600 _res.find('form').on('submit', function(e) {
603 var _data = _form.serialize();
605 url: _form.attr('action'),
609 {include file="js_loader.tpl"},
610 success: function(html) {
614 $('#mass_change').remove();
615 $('body').append(_html);
617 _initTooltips('#mass_change');
618 //_massCheckboxes('#mass_change');
623 close: function(event, ui){
624 $(this).dialog('destroy').remove()
628 _html.find('form').on('submit', function(e) {
631 var _data = _form.serialize();
633 url: _form.attr('action'),
637 {include file="js_loader.tpl"},
638 success: function(res) {
640 window.location.href = _form.find('input[name=redirect_uri]').val();
643 url: '{path_for name="ajaxMessages"}',
645 success: function (message) {
646 $('#asso_name').after(message);
655 alert("{_T string="An error occurred :(" escape="js"}");
660 $('body').append(_res);
662 _initTooltips('#mass_change');
663 _massCheckboxes('#mass_change');
668 close: function(event, ui){
669 $(this).dialog('destroy').remove()
674 alert("{_T string="An error occurred :(" escape="js"}");
679 var _attendance_sheet_details = function(){
681 $('table.listing').find('input[type=checkbox]:checked').each(function(){
682 _selecteds.push($(this).val());
685 url: '{path_for name="attendance_sheet_details"}',
689 selection: _selecteds
692 success: function(res){
693 var _el = $('<div id="attendance_sheet_details" title="{_T string="Attendance sheet details" escape="js"}"> </div>');
694 _el.appendTo('body').dialog({
699 close: function(event, ui){
704 $('#sheet_details_form').submit();
705 $(this).dialog( "close" );
708 $(this).dialog( "close" );
712 $('#sheet_date').datepicker({
717 buttonText: '<i class="far fa-calendar-alt"></i> <span class="sr-only">{_T string="Select a date" escape="js"}</span>'
721 alert("{_T string="An error occurred displaying attendance sheet details interface :(" escape="js"}");