]> git.agnieray.net Git - galette.git/blob - galette/templates/default/pages/members_list.html.twig
No longer need for a short text for birthdate
[galette.git] / galette / templates / default / pages / members_list.html.twig
1 {% extends 'elements/list.html.twig' %}
2
3 {% import "macros.twig" as macros %}
4
5 {% set basic_table = true %}
6
7 {% set nb = nb_members %}
8
9 {% set form = {
10 'order': {
11 'name': 'members'
12 },
13 'route': {
14 'name': 'batch-memberslist'
15 }
16 } %}
17
18 {% macro draw_actions(rclass, member, login) %}
19 <td class="{{ rclass }} center actions_row">
20 {% set actions = callstatic('\\Galette\\Core\\Galette', 'getListActions', member) %}
21 {% for action in actions %}
22 {{ macros.drawListAction(action.label, action.route, action.icon, action.extra_class ?? null) }}
23 {% endfor %}
24 </td>
25 {% endmacro %}
26
27 {% block infoline %}
28 {% set infoline = {
29 'label': _Tn("%count member", "%count members", nb_members)|replace({'%count': nb_members}),
30 'route': {
31 'name': 'filter-memberslist'
32 }
33 } %}
34 {{ parent() }}
35 {% endblock %}
36
37 {% block infoline_actions %}
38 {% if login.isAdmin() or login.isStaff() or (login.isGroupManager() and preferences.pref_bool_groupsmanagers_create_member) %}
39 <a
40 class="ui tiny labeled icon button"
41 href="{{ url_for("addMember") }}"
42 >
43 <i class="plus circle green icon" aria-hidden="true"></i>
44 {{ _T("Add a member") }}
45 </a>
46 {% endif %}
47 {% endblock %}
48
49 {% block header %}
50 {% set columns = [] %}
51 {% for column in galette_list %}
52 {% if column.field_id == 'id_adh' %}
53 {% if preferences.pref_show_id %}
54 {% set columns = columns|merge([
55 {
56 label: _T('Mbr id'),
57 order: constant("Galette\\Repository\\Members::ORDERBY_ID")
58 }
59 ]) %}
60 {% else %}
61 {% set columns = columns|merge([
62 {label: '#'}
63 ]) %}
64 {% endif %}
65 {% else %}
66 {% set columns = columns|merge([
67 {
68 label: column.label,
69 order: column.field_id
70 }
71 ]) %}
72 {% endif %}
73 {% endfor %}
74
75 {{ parent() }}
76 {% endblock %}
77
78 {% block search %}
79 <form action="{{ url_for('filter-memberslist') }}" method="post" id="members_list_search_filter" class="ui form filters">
80 <div class="ui secondary yellow segment">
81 {% if adv_filters is not defined or not adv_filters %}
82 <div class="five fields">
83 <div class="field">
84 <label for="filter_str">{{ _T('Search:') }}</label>
85 <input type="text" name="filter_str" id="filter_str" value="{{ filters.filter_str }}" type="search" placeholder="{{ _T('Enter a value') }}"/>
86 </div>
87 <div class="field">
88 <label for="field_filter">{{ _T('in:') }}</label>
89 <select name="field_filter" id="field_filter" class="ui search dropdown nochosen">
90 {% for key, value in field_filter_options %}
91 <option value="{{ key }}"{% if key == filters.field_filter %} selected="selected"{% endif %}>{{ value }}</option>
92 {% endfor %}
93 </select>
94 </div>
95 <div class="field">
96 <label for="filter_str">{{ _T('among:') }}</label>
97 <select name="membership_filter" onchange="form.submit()" class="ui search dropdown nochosen">
98 {% for key, value in membership_filter_options %}
99 <option value="{{ key }}"{% if key == filters.membership_filter %} selected="selected"{% endif %}>{{ value }}</option>
100 {% endfor %}
101 </select>
102 </div>
103 <div class="flexend field">
104 <label for="filter_account" class="displaynone">{{ _T('among:') }}</label>
105 <select name="filter_account" onchange="form.submit()" class="ui search dropdown nochosen">
106 {% for key, value in filter_accounts_options %}
107 <option value="{{ key }}"{% if key == filters.filter_account %} selected="selected"{% endif %}>{{ value }}</option>
108 {% endfor %}
109 </select>
110 </div>
111 <div class="flexend field">
112 <label for="group_filter" class="displaynone">{{ _T('among:') }}</label>
113 <select name="group_filter" onchange="form.submit()" class="ui search dropdown nochosen">
114 <option value="0">{{ _T('Select a group') }}</option>
115 {% for group in filter_groups_options %}
116 <option value="{{ group.getId() }}"{% if filters.group_filter == group.getId() %} selected="selected"{% endif %}>{{ group.getIndentName()|raw }}</option>
117 {% endfor %}
118 </select>
119 </div>
120 </div>
121 <div class="two fields">
122 <div class="field">
123 <div class="inline fields">
124 <label for="email_filter">{{ _T('Members that have an email address:') }}</label>
125 <div class="field inline">
126 <div class="ui radio checkbox">
127 <input type="radio" name="email_filter" id="filter_dc_email" value="{{ constant('Galette\\Repository\\Members::FILTER_DC_EMAIL') }}"{% if filters.email_filter == constant('Galette\\Repository\\Members::FILTER_DC_EMAIL') %} checked="checked"{% endif %}>
128 <label for="filter_dc_email">{{ _T("Don't care") }}</label>
129 </div>
130 </div>
131 <div class="field inline">
132 <div class="ui radio checkbox">
133 <input type="radio" name="email_filter" id="filter_with_email" value="{{ constant('Galette\\Repository\\Members::FILTER_W_EMAIL') }}"{% if filters.email_filter == constant('Galette\\Repository\\Members::FILTER_W_EMAIL') %} checked="checked"{% endif %}>
134 <label for="filter_with_email">{{ _T('With') }}</label>
135 </div>
136 </div>
137 <div class="field inline">
138 <div class="ui radio checkbox">
139 <input type="radio" name="email_filter" id="filter_without_email" value="{{ constant('Galette\\Repository\\Members::FILTER_WO_EMAIL') }}"{% if filters.email_filter == constant('Galette\\Repository\\Members::FILTER_WO_EMAIL') %} checked="checked"{% endif %}>
140 <label for="filter_without_email">{{ _T('Without') }}</label>
141 </div>
142 </div>
143 </div>
144 </div>
145 <div class="ui right aligned basic fitted segment field">
146 <button type="submit" class="tooltip action ui labeled icon primary button" title="{{ _T('Apply filters') }}" name="filter">
147 <i class="search icon" aria-hidden="true"></i>
148 {{ _T('Filter') }}
149 </button>
150 <button type="submit" class="tooltip action ui labeled icon button" title="{{ _T('Save selected criteria') }}" name="savesearch" id="savesearch">
151 <i class="save blue icon" aria-hidden="true"></i>
152 {{ _T('Save') }}
153 </button>
154 <button type="submit" name="clear_filter" class="tooltip ui labeled icon button" title="{{ _T('Reset all filters to defaults') }}">
155 <i class="trash alt red icon" aria-hidden="true"></i>
156 {{ _T('Clear filter') }}
157 </button>
158 </div>
159 </div>
160 {% else %}
161 <div class="field">
162 <span class="ui primary ribbon label">{{ _T('Advanced search mode') }}</span>
163 <button type="submit" class="tooltip action ui labeled icon primary button" title="{{ _T('Save current advanced search criteria') }}" name="savesearch" id="savesearch">
164 <i class="save icon" aria-hidden="true"></i>
165 {{ _T('Save') }}
166 </button>
167 <button type="submit" class="tooltip action ui labeled icon button" title="{{ _T('Change search criteria') }}" name="adv_criteria">
168 <i class="edit blue icon" aria-hidden="true"></i>
169 {{ _T('Change criteria') }}
170 </button>
171 <input type="hidden" name="advanced_search" value="1" class="ui button"/>
172 <button type="submit" name="clear_filter" class="tooltip ui labeled icon button" title="{{ _T('Reset all filters to defaults') }}">
173 <i class="trash alt red icon" aria-hidden="true"></i>
174 {{ _T('Clear filter') }}
175 </button>
176 <div class="ui basic fluid accordion">
177 <div class="title">
178 <i class="dropdown icon" aria-hidden="true"></i>
179 {{ _T('Show/hide query') }}
180 </div>
181 <div class="content">
182 <div id="sql_qry" class="ui grey inverted segment">{{ filters.query }}</div>
183 </div>
184 </div>
185 </div>
186 {% endif %}
187 {% include "components/forms/csrf.html.twig" %}
188 </div>
189 </form>
190 {% endblock %}
191
192 {% block legend %}
193 {% if nb_members != 0 %}
194 <div id="legende" title="{{ _T('Legend') }}" class="ui modal">
195 <div class="header">{{ _T('Legend') }}</div>
196 <div class="content">
197 <table class="ui stripped table">
198 <thead>
199 <tr>
200 <th class="" colspan="4">{{ _T('Reading the list') }}</th>
201 </tr>
202 <thead>
203 <tbody>
204 <tr>
205 <th class="back">{{ _T('Name') }}</th>
206 <td class="back">{{ _T('Active account') }}</td>
207 <th class="inactive-account back">{{ _T('Name') }}</th>
208 <td class="back">{{ _T('Inactive account') }}</td>
209 </tr>
210 <tr>
211 <th class="cotis-ok color-sample">&nbsp;</th>
212 <td class="back">{{ _T('Membership in order') }}</td>
213 <th class="cotis-soon color-sample">&nbsp;</th>
214 <td class="back">{{ _T('Membership will expire soon (&lt;30d)') }}</td>
215 </tr>
216 <tr>
217 <th class="cotis-never color-sample">&nbsp;</th>
218 <td class="back">{{ _T('Never contributed') }}</td>
219 <th class="cotis-late color-sample">&nbsp;</th>
220 <td class="back">{{ _T('Lateness in fee') }}</td>
221 </tr>
222 </tbody>
223 </table>
224 <table class="ui stripped table">
225 <thead>
226 <tr>
227 <th class="" colspan="4">{{ _T('Actions') }}</th>
228 </tr>
229 <thead>
230 <tbody>
231 <tr>
232 <th class="action">
233 <i class="ui user edit blue icon" aria-hidden="true"></i>
234 </th>
235 <td class="back">{{ _T('Modification') }}</td>
236 <th>
237 <i class="ui receipt green icon" aria-hidden="true"></i>
238 </th>
239 <td class="back">{{ _T('Contributions') }}</td>
240 </tr>
241 <tr>
242 <th class="delete">
243 <i class="ui user times red icon" aria-hidden="true"></i>
244 </th>
245 <td class="back">{{ _T('Deletion') }}</td>
246 </tr>
247 </tbody>
248 </table>
249 <table class="ui stripped table">
250 <thead>
251 <tr>
252 <th colspan="4">{{ _T('User status/interactions') }}</th>
253 </tr>
254 <thead>
255 <tbody>
256 <tr>
257 <th><i class="ui envelope outline teal icon" aria-hidden="true"></i></th>
258 <td class="back">{{ _T('Send an email') }}</td>
259 <th><i class="ui building icon" aria-hidden="true"></i></th>
260 <td class="back">{{ _T('Is a company') }}</td>
261 </tr>
262
263 <tr>
264 <th><i class="ui male icon" aria-hidden="true"></i></th>
265 <td class="back">{{ _T('Is a man') }}</td>
266 <th><i class="ui female icon" aria-hidden="true"></i></th>
267 <td class="back">{{ _T('Is a woman') }}</td>
268 </tr>
269 <tr>
270 <th><i class="ui user shield red icon" aria-hidden="true"></i></th>
271 <td class="back">{{ _T('Admin') }}</td>
272 <th><i class="ui user tie orange icon" aria-hidden="true"></i></th>
273 <td class="back">{{ _T('Staff member') }}</td>
274 </tr>
275 <tr>
276 <th><i class="ui users cog orange icon" aria-hidden="true"></i></th>
277 <td class="back">{{ _T('Group manager') }}</td>
278
279 </tr>
280 </tbody>
281 </table>
282 </div>
283 <div class="actions"><div class="ui labeled icon deny button"><i class="times icon" aria-hidden="true"></i> {{ _T('Close') }}</div></div>
284 </div>
285 {% endif %}
286 {% endblock %}
287
288 {% block body %}
289 {% for ordre, member in members %}
290 {% set rclass = member.getRowClass() %}
291 <tr>
292 {% for column in galette_list %}
293 {% if column.field_id == 'id_adh' %}
294 <td class="{{ rclass }} right" data-scope="id">
295 {% if preferences.pref_show_id %}
296 {{ member.id }}
297 {% else %}
298 {{ ordre + 1 + (filters.current_page - 1) * numrows }}
299 {% endif %}
300 </td>
301 {% elseif column.field_id == 'list_adh_name' %}
302 <td class="{{ rclass }} username_row" data-scope="row">
303 <input type="checkbox" name="entries_sel[]" value="{{ member.__get('id') }}"/>
304 {% if member.isCompany() %}
305 <span>
306 <i class="ui building outline icon tooltip" aria-hidden="true"></i>
307 <span class="ui special popup">{{ _T('Is a company') }}</span>
308 </span>
309 {% elseif member.isMan() %}
310 <span>
311 <i class="ui male icon tooltip" aria-hidden="true"></i>
312 <span class="ui special popup">{{ _T('Is a man') }}</span>
313 </span>
314 {% elseif member.isWoman() %}
315 <span>
316 <i class="ui female icon tooltip" aria-hidden="true"></i>
317 <span class="ui special popup">{{ _T('Is a woman') }}</span>
318 </span>
319 {% else %}
320 <i class="ui icon" aria-hidden="true"></i>
321 {% endif %}
322 {% if member.email != '' %}
323 <a href="mailto:{{ member.email }}">
324 <i class="ui envelope outline teal icon tooltip" aria-hidden="true"></i>
325 <span class="ui special popup">{{ _T('Mail') }}</span>
326 </a>
327
328 {% else %}
329 <i class="ui icon" aria-hidden="true"></i>
330 {% endif %}
331 {% if member.isAdmin() %}
332 <span>
333 <i class="ui user shield red icon tooltip" aria-hidden="true"></i>
334 <span class="ui special popup">{{ _T('Admin') }}</span>
335 </span>
336 {% elseif member.isStaff() %}
337 <span>
338 <i class="ui user tie orange icon tooltip" aria-hidden="true"></i>
339 <span class="ui special popup">{{ _T('Staff member') }}</span>
340 </span>
341 {% elseif member.getManagedGroups() %}
342 <span>
343 <i class="ui users cog orange icon tooltip" aria-hidden="true"></i>
344 <span class="ui special popup">{{ _T('Group manager') }}</span>
345 </span>
346 {% else %}
347 <i class="ui icon" aria-hidden="true"></i>
348 {% endif %}
349 {% set mid = member.id %}
350 <a href="{{ url_for("member", {"id": member.id}) }}">{{ member.sname }}{% if member.company_name %} ({{ member.company_name }}){% endif %}</a>
351 </td>
352 {% else %}
353 {% set lrclass = rclass %}
354 {% set propname = column.propname %}
355 {% set value = null %}
356
357 {% if column.field_id == 'nom_adh' %}
358 {% set value = member.sfullname %}
359 {% elseif column.field_id == 'pseudo_adh' %}
360 {% set lrclass = rclass %}
361 {% set value = attribute(member, propname) %}
362 {% elseif column.field_id == 'tel_adh' or column.field_id == 'gsm_adh' %}
363 {% set lrclass = rclass %}
364 {% elseif column.field_id == 'id_statut' %}
365 {% set lrclass = rclass %}
366 {% set value = member.sstatus %}
367 {% elseif column.field_id == 'titre_adh' %}
368 {% if member.title is iterable %}
369 {% set value = member.title.long %}
370 {% endif %}
371 {% elseif column.field_id == 'pref_lang' %}
372 {% set value = i18n.getNameFromId(member.language) %}
373 {% elseif column.field_id == 'adresse_adh' %}
374 {% set value = member.saddress|e('html')|nl2br %}
375 {% set escaped = true %}
376 {% elseif column.field_id == 'bool_display_info' %}
377 {% set value = member.sappears_in_list %}
378 {% elseif column.field_id == 'activite_adh' %}
379 {% set value = member.sactive %}
380 {% elseif column.field_id == 'id_statut' %}
381 {% set value = member.sstatus %}
382 {% elseif column.field_id == 'bool_admin_adh' %}
383 {% set value = member.sadmin %}
384 {% elseif column.field_id == 'bool_exempt_adh' %}
385 {% set value = member.sdue_free %}
386 {% elseif column.field_id == 'sexe_adh' %}
387 {% set value = member.sgender %}
388 {% elseif column.field_id == 'ddn_adh' %}
389 {% set lrclass = lrclass ~ ' collapsing' %}
390 {% endif %}
391
392 {# If value has not been set, take the generic value #}
393 {% if not value %}
394 {% set propvalue = attribute(member, propname) %}
395 {% if propvalue %}
396 {% set value = propvalue|e('html') %}
397 {% else %}
398 {% set value = propvalue %}
399 {% endif %}
400 {% elseif escaped is not defined %}
401 {% set value = value|e('html') %}
402 {% endif %}
403
404 <td class="{{ lrclass }}" data-title="{{ column.label }}">
405 {# Display column.
406 A check is done here to adapt display, this is may not the best way to go
407 but for now, that works as expected.
408 #}
409 {% if value %}
410 {% if column.field_id == 'email_adh' %}
411 <a href="mailto:{{ value }}">{{ value }}</a>
412 {% elseif column.field_id == 'tel_adh' or column.field_id == 'gsm_adh' %}
413 <a href="tel:{{ value }}">{{ value }}</a>
414 {% elseif column.field_id == 'parent_id' %}
415 <a href="{{ url_for("member", {"id": member.parent}) }}">{{ memberName({"id": member.parent}) }}</a>
416 {% elseif column.field_id == 'ddn_adh' %}
417 {{ value }} {{ member.getAge() }}
418 {% else %}
419 {{ value|raw }}
420 {% endif %}
421 {% endif %}
422 </td>
423 {% endif %}
424 {% endfor %}
425 {{ _self.draw_actions(rclass, member, login) }}
426 </tr>
427 {% else %}
428 <tr><td colspan="{{ galette_list|length + 1 }}" class="emptylist">{{ _T('No member has been found') }}</td></tr>
429 {% endfor %}
430 {% endblock %}
431
432 {% if nb_members != 0 and (login.isGroupManager() and (preferences.pref_bool_groupsmanagers_exports or preferences.pref_bool_groupsmanagers_mailings) or login.isAdmin() or login.isStaff()) %}
433 {% set batch = {
434 'route': {
435 'name': 'batch-memberslist'
436 },
437 'modal': {
438 'title': _T("No member selected"),
439 'content': _T("Please make sure to select at least one member from the list to perform this action.")
440 }
441 } %}
442 {% set batch_actions = callstatic('\\Galette\\Core\\Galette', 'getBatchActions') %}
443 {% endif %}
444
445 {% block batch_selection %}
446 else if (value == 'sendmail') {
447 {% if existing_mailing == true %}
448 _sendmail(true);
449 {% else %}
450 _sendmail();
451 {% endif %}
452 }
453 else if (value == 'attendance_sheet') {
454 _attendance_sheet_details();
455 }
456
457 else if (value == 'masscontributions') {
458 _masscontributions();
459 }
460
461 else if (value == 'masschange') {
462 _masschange();
463 }
464 {% endblock %}
465
466 {% block javascripts %}
467 {% set batch_selection = ['masschange', 'masscontributions', 'sendmail', 'attendance_sheet_details'] %}
468 {{ parent() }}
469 <script type="text/javascript">
470 {# Use of Javascript to draw specific elements that are not relevant is JS is inactive #}
471 $(function(){
472 $('#savesearch').on('click', function(e) {
473 e.preventDefault();
474
475 $('body').modal({
476 title: '{{ _T("Search title")|e('js') }}',
477 class: 'tiny',
478 content: '<div class="ui input"><input type="text" name="search_title" id="search_title"/></div>',
479 onApprove: function() {
480 var _form = $('#members_list_search_filter');
481 var _data = _form.serialize();
482 _data = _data + "&search_title=" + $('#search_title').val();
483 $.ajax({
484 url: '{{ url_for('saveSearch') }}',
485 type: "POST",
486 data: _data,
487 datatype: 'json',
488 {% include "elements/js/loader.js.twig" with {
489 loader: "action",
490 selector: ".loader_selector"
491 } %},
492 success: function(res) {
493 $.ajax({
494 url: '{{ url_for('ajaxMessages') }}',
495 method: "GET",
496 success: function (message) {
497 $('#asso_name').after(message);
498 }
499 });
500 }
501 });
502 },
503 actions: [{
504 text : '{{ _T("Save")|e('js') }}',
505 icon : 'save',
506 class : 'icon labeled primary approve'
507 }, {
508 text : '{{ _T("Cancel")|e('js') }}',
509 icon : 'times',
510 class : 'icon labeled cancel'
511 }]
512 }).modal('show');
513 });
514
515 });
516 {% if nb_members != 0 %}
517 var _sendmail = function(existing){
518 var _form = $('#listform');
519 _form.append($('<input type="hidden" name="sendmail" value="true"/>'));
520 _form.append($('<input type="hidden" name="mailing_new" value="true"/>'));
521 _form.append($('<input type="hidden" name="mailing" value="true"/>'));
522 var _redirect = '{{ url_for('mailing') }}';
523
524 if (existing) {
525 {% include "elements/js/modal.js.twig" with {
526 modal_title_twig: _T("Existing mailing")|e("js"),
527 modal_content_twig: _T("A mailing already exists. Do you want to create a new one or resume the existing?")|e("js"),
528 modal_class: "tiny",
529 modal_onapprove: "_form.submit();",
530 modal_approve_text: _T("New")|e("js"),
531 modal_approve_icon: "plus",
532 modal_approve_color: "green",
533 modal_additional_button: {
534 text: _T("Resume")|e("js"),
535 icon: "edit",
536 class: "blue",
537 click: "function() { location.href = _redirect; }"
538 }
539 } %}
540 } else {
541 _form.submit();
542 }
543 }
544 var _attendance_sheet_details = function(){
545 $.ajax({
546 url: '{{ url_for('attendance_sheet_details') }}',
547 type: "POST",
548 data: {
549 ajax: true,
550 selection: $('#listform input[type=\"checkbox\"]:checked').map(function(){
551 return $(this).val();
552 }).get()
553 },
554 dataType: 'html',
555 {% include "elements/js/loader.js.twig" with {
556 loader: "action",
557 selector: ".loader_selector"
558 } %},
559 success: function(res){
560 var _res = $(res);
561
562 $('body').append(_res);
563
564 {% include "elements/js/modal.js.twig" with {
565 modal_selector: "#attendance_sheet_details",
566 modal_without_title: true,
567 modal_class: "tiny",
568 modal_onshow: "_batchAjaxMapper();",
569 modal_onapprove: "$('#attendance_sheet_details form').submit();"
570 } %}
571 },
572 error: function() {
573 {% include "elements/js/modal.js.twig" with {
574 modal_title_twig: _T("An error occurred displaying attendance sheet details interface :(")|e("js"),
575 modal_without_content: true,
576 modal_class: "mini",
577 modal_deny_only: true,
578 modal_cancel_text: _T("Close")|e("js"),
579 modal_classname: "redalert",
580 } %}
581 }
582 });
583 }
584 var _masscontributions = function(){
585 $.ajax({
586 url: '{{ url_for('batch-memberslist') }}',
587 type: "POST",
588 data: {
589 ajax: true,
590 masscontributions: true,
591 entries_sel: $('#listform input[type=\"checkbox\"]:checked').map(function(){
592 return $(this).val();
593 }).get()
594 },
595 datatype: 'html',
596 {% include "elements/js/loader.js.twig" with {
597 loader: "action",
598 selector: ".loader_selector"
599 } %},
600 success: function(res){
601 var _res = $(res);
602
603 $('body').append(_res);
604
605 _res.find('form').on('submit', function(e) {
606 e.preventDefault();
607 var _form = $(this);
608 var _data = _form.serialize();
609
610 $.ajax({
611 url: _form.attr('action'),
612 type: "POST",
613 data: _data,
614 datatype: 'json',
615 {% include "elements/js/loader.js.twig" with {
616 loader: "action",
617 selector: ".loader_selector"
618 } %},
619 success: function(data, status, xhr) {
620 var _res = $(data);
621
622 $('#mass_contributions').remove();
623 $('body').append(_res);
624
625 _res.find('form').on('submit', function(e) {
626 e.preventDefault();
627 var _form = $(this);
628 var _data = _form.serialize();
629 $.ajax({
630 url: _form.attr('action'),
631 type: "POST",
632 data: _data,
633 datatype: 'json',
634 {% include "elements/js/loader.js.twig" with {
635 loader: "action",
636 selector: ".loader_selector"
637 } %},
638 success: function(res) {
639 window.location.href = _form.find('input[name=redirect_uri]').val();
640 },
641 error: function() {
642 $('#mass_contributions').modal('hide dimmer').remove();
643 {% include "elements/js/modal.js.twig" with {
644 modal_title_twig: _T("An error occurred :(")|e("js"),
645 modal_without_content: true,
646 modal_class: "mini",
647 modal_deny_only: true,
648 modal_cancel_text: _T("Close")|e("js"),
649 modal_classname: "redalert",
650 } %}
651 }
652 });
653 });
654
655 {% include "elements/js/modal.js.twig" with {
656 modal_selector: "#mass_contributions",
657 modal_without_title: true,
658 modal_content_class: "scrolling",
659 modal_onshow: "_batchAjaxMapper();_formValidationInModal('#mass_contributions');",
660 modal_onapprove: "var submitted = _formSubmitInModal('#mass_contributions');if (!submitted){return false;}"
661 } %}
662 },
663 error: function() {
664 {% include "elements/js/modal.js.twig" with {
665 modal_title_twig: _T("An error occurred :(")|e("js"),
666 modal_without_content: true,
667 modal_class: "mini",
668 modal_deny_only: true,
669 modal_cancel_text: _T("Close")|e("js"),
670 modal_classname: "redalert",
671 } %}
672 }
673 });
674 });
675
676 {% include "elements/js/modal.js.twig" with {
677 modal_selector: "#mass_contributions",
678 modal_without_title: true,
679 modal_class: "mini",
680 modal_onshow: "_batchAjaxMapper();",
681 modal_onapprove: "$('#mass_contributions form').submit();"
682 } %}
683 },
684 error: function() {
685 {% include "elements/js/modal.js.twig" with {
686 modal_title_twig: _T("An error occurred :(")|e("js"),
687 modal_without_content: true,
688 modal_class: "mini",
689 modal_deny_only: true,
690 modal_cancel_text: _T("Close")|e("js"),
691 modal_classname: "redalert",
692 } %}
693 }
694 });
695 }
696 var _masschange = function(){
697 $.ajax({
698 url: '{{ url_for('batch-memberslist') }}',
699 type: "POST",
700 data: {
701 ajax: true,
702 masschange: true,
703 entries_sel: $('#listform input[type=\"checkbox\"]:checked').map(function(){
704 return $(this).val();
705 }).get()
706 },
707 datatype: 'json',
708 {% include "elements/js/loader.js.twig" with {
709 loader: "action",
710 selector: ".loader_selector"
711 } %},
712 success: function(res){
713 var _res = $(res);
714
715 $('body').append(_res);
716
717 _res.find('form').on('submit', function(e) {
718 e.preventDefault();
719 var _form = $(this);
720 var _data = _form.serialize();
721 $.ajax({
722 url: _form.attr('action'),
723 type: "POST",
724 data: _data,
725 datatype: 'json',
726 {% include "elements/js/loader.js.twig" with {
727 loader: "action",
728 selector: ".loader_selector"
729 } %},
730 success: function(data, status, xhr) {
731 var _res = $(data);
732
733 $('#mass_change').remove();
734 $('body').append(_res);
735
736 _res.find('form').on('submit', function(e) {
737 e.preventDefault();
738 var _form = $(this);
739 var _data = _form.serialize();
740 $.ajax({
741 url: _form.attr('action'),
742 type: "POST",
743 data: _data,
744 datatype: 'json',
745 {% include "elements/js/loader.js.twig" with {
746 loader: "action",
747 selector: ".loader_selector"
748 } %},
749 success: function(res) {
750 window.location.href = _form.find('input[name=redirect_uri]').val();
751 },
752 error: function() {
753 {% include "elements/js/modal.js.twig" with {
754 modal_title_twig: _T("An error occurred :(")|e("js"),
755 modal_without_content: true,
756 modal_class: "mini",
757 modal_deny_only: true,
758 modal_cancel_text: _T("Close")|e("js"),
759 modal_classname: "redalert",
760 } %}
761 }
762 });
763 });
764
765 {% include "elements/js/modal.js.twig" with {
766 modal_selector: "#mass_change",
767 modal_without_title: true,
768 modal_onapprove: "$('#mass_change form').submit();"
769 } %}
770 },
771 error: function() {
772 {% include "elements/js/modal.js.twig" with {
773 modal_title_twig: _T("An error occurred :(")|e("js"),
774 modal_without_content: true,
775 modal_class: "mini",
776 modal_deny_only: true,
777 modal_cancel_text: _T("Close")|e("js"),
778 modal_classname: "redalert",
779 } %}
780 }
781 });
782 });
783
784 {% include "elements/js/modal.js.twig" with {
785 modal_selector: "#mass_change",
786 modal_without_title: true,
787 modal_content_class: "scrolling",
788 modal_onshow: "_massCheckboxes('#mass_change');_batchAjaxMapper();",
789 modal_onapprove: "$('#mass_change form').submit();"
790 } %}
791 },
792 error: function() {
793 {% include "elements/js/modal.js.twig" with {
794 modal_title_twig: _T("An error occurred :(")|e("js"),
795 modal_without_content: true,
796 modal_class: "mini",
797 modal_deny_only: true,
798 modal_cancel_text: _T("Close")|e("js"),
799 modal_classname: "redalert",
800 } %}
801 }
802 });
803 }
804 var _batchAjaxMapper = function(){
805 $('.modal-form .ui.dropdown, .modal-form select:not(.nochosen)').dropdown();
806 $('.modal-form .ui.checkbox, .modal-form .ui.radio.checkbox').checkbox();
807 $('.no-touch .modal-form a[title], .no-touch .modal-form .tooltip').popup({
808 variation: 'inverted',
809 inline: false
810 });
811 {% include 'elements/js/calendar.js.twig' with {
812 selector: ".modal-form [id$='rangestart'], .modal-form [id$='rangeend']"
813 } %}
814 }
815 var _formValidationInModal = function(modal){
816 $(modal +' form').form({
817 inline: true,
818 autoCheckRequired: true,
819 prompt: {
820 empty: '{{ _T("Required field!")|e("js") }}'
821 }
822 })
823 }
824 var _formSubmitInModal = function(modal){
825 var validated = $(modal +' form').form('is valid');
826 if(validated) {
827 $(modal +' form').submit();
828 $(modal).modal('hide dimmer').remove();
829 } else {
830 $(modal +' form').form('validate form');
831 return false;
832 }
833 }
834 {% endif %}
835 </script>
836 {% endblock %}