1 {% extends 'page.html.twig' %}
4 <form action="{{ url_for('filter-memberslist') }}" method="post" class="ui form advanced-search">
5 <div class="galetteform ui styled fluid accordion field">
6 <div class="active ui title">
7 <i class="jsonly displaynone dropdown icon" aria-hidden="true"></i>
8 {{ _T('Simple search') }}
10 <div class="active content">
11 <div class="four fields">
13 <label for="filter_str">{{ _T('Search:') }}</label>
14 <input type="text" name="filter_str" id="filter_str" value="{{ filters.filter_str }}" type="search" placeholder="{{ _T('Enter a value') }}"/>
17 <label for="field_filter">{{ _T('in:') }}</label>
18 <select name="field_filter" class="ui search dropdown nochosen">
19 {% for key, value in field_filter_options %}
20 <option value="{{ key }}"{% if key == filters.field_filter %} selected="selected"{% endif %}>{{ value }}</option>
25 <label for="membership_filter">{{ _T('Membership status') }}</label>
26 <select id="membership_filter" name="membership_filter" class="ui search dropdown nochosen">
27 {% for key, value in membership_filter_options %}
28 <option value="{{ key }}"{% if key == filters.membership_filter %} selected="selected"{% endif %}>{{ value }}</option>
33 <label for="filter_account">{{ _T('Account activity') }}</label>
34 <select id="filter_account" name="filter_account" class="ui search dropdown nochosen">
35 {% for key, value in filter_accounts_options %}
36 <option value="{{ key }}"{% if key == filters.filter_account %} selected="selected"{% endif %}>{{ value }}</option>
41 <label for="group_filter">{{ _T('Member of group') }}</label>
42 <select name="group_filter" id="group_filter" class="ui search dropdown nochosen">
43 <option value="0">{{ _T('Select a group') }}</option>
44 {% for group in filter_groups_options %}
45 <option value="{{ group.getId() }}"{% if filters.group_filter == group.getId() %} selected="selected"{% endif %}>{{ group.getIndentName()|raw }}</option>
50 <div class="inline fields">
51 <label for="email_filter">{{ _T('With email:') }}</label>
53 <div class="ui radio checkbox">
54 <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 %}>
55 <label for="filter_dc_email">{{ _T("Don't care") }}</label>
59 <div class="ui radio checkbox">
60 <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 %}>
61 <label for="filter_with_email">{{ _T('With') }}</label>
65 <div class="ui radio checkbox">
66 <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 %}>
67 <label for="filter_without_email">{{ _T('Without') }}</label>
73 <div class="galetteform ui styled fluid accordion field">
74 <div class="active ui title">
75 <i class="jsonly displaynone dropdown icon" aria-hidden="true"></i>
76 {{ _T('Advanced search') }}
78 <div class="active content">
79 <div class="two fields">
81 <label>{{ _T('Birth date') }}</label>
82 <div class="two fields">
84 <label for="birth_date_begin">{{ _T('beetween') }}</label>
85 <div class="ui calendar" id="birth-rangestart">
86 <div class="ui input left icon">
87 <i class="calendar icon" aria-hidden="true"></i>
88 <input id="birth_date_begin" name="birth_date_begin" type="text" class="birth_date" maxlength="10" size="10" value="{{ filters.birth_date_begin }}" placeholder="{{ _T('(yyyy-mm-dd format)') }}" />
93 <label for="birth_date_end">{{ _T('and') }}</label>
94 <div class="ui calendar" id="birth-rangeend">
95 <div class="ui input left icon">
96 <i class="calendar icon" aria-hidden="true"></i>
97 <input id="birth_date_end" name="birth_date_end" type="text" class="birth_date" maxlength="10" size="10" value="{{ filters.birth_date_end }}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
104 <label>{{ _T('Creation date') }}</label>
105 <div class="two fields">
107 <label for="creation_date_begin">{{ _T('beetween') }}</label>
108 <div class="ui calendar" id="creation-rangestart">
109 <div class="ui input left icon">
110 <i class="calendar icon" aria-hidden="true"></i>
111 <input id="creation_date_begin" name="creation_date_begin" type="text" class="modif_date" maxlength="10" size="10" value="{{ filters.creation_date_begin }}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
116 <label for="creation_date_end">{{ _T('and') }}</label>
117 <div class="ui calendar" id="creation-rangeend">
118 <div class="ui input left icon">
119 <i class="calendar icon" aria-hidden="true"></i>
120 <input id="creation_date_end" name="creation_date_end" type="text" class="modif_date" maxlength="10" size="10" value="{{ filters.creation_date_end }}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
127 <div class="two fields">
129 <label>{{ _T('Modification date') }}</label>
130 <div class="two fields">
132 <label for="modif_date_begin">{{ _T('beetween') }}</label>
133 <div class="ui calendar" id="modification-rangestart">
134 <div class="ui input left icon">
135 <i class="calendar icon" aria-hidden="true"></i>
136 <input id="modif_date_begin" name="modif_date_begin" type="text" class="modif_date" maxlength="10" size="10" value="{{ filters.modif_date_begin }}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
141 <label for="modif_date_end">{{ _T('and') }}</label>
142 <div class="ui calendar" id="modification-rangeend">
143 <div class="ui input left icon">
144 <i class="calendar icon" aria-hidden="true"></i>
145 <input id="modif_date_end" name="modif_date_end" type="text" class="modif_date" maxlength="10" size="10" value="{{ filters.modif_date_end }}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
152 <label>{{ _T('Due date') }}</label>
153 <div class="two fields">
155 <label for="due_date_begin">{{ _T('beetween') }}</label>
156 <div class="ui calendar" id="due-rangestart">
157 <div class="ui input left icon">
158 <i class="calendar icon" aria-hidden="true"></i>
159 <input id="due_date_begin" name="due_date_begin" type="text" class="due_date" maxlength="10" size="10" value="{{ filters.due_date_begin }}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
164 <label for="due_date_end">{{ _T('and') }}</label>
165 <div class="ui calendar" id="due-rangeend">
166 <div class="ui input left icon">
167 <i class="calendar icon" aria-hidden="true"></i>
168 <input id="due_date_end" name="due_date_end" type="text" class="due_date" maxlength="10" size="10" value="{{ filters.due_date_end }}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
175 <div class="two fields">
177 <div class="grouped fields">
178 <label for="show_public_infos">{{ _T('Show public infos') }}</label>
180 <div class="ui radio checkbox">
181 <input type="radio" name="show_public_infos" id="show_public_infos_dc" value="{{ constant("Galette\\Repository\\Members::FILTER_DC_PUBINFOS") }}"{% if filters.show_public_infos == constant("Galette\\Repository\\Members::FILTER_DC_PUBINFOS") %} checked="checked"{% endif %}>
182 <label for="show_public_infos_dc" >{{ _T("Don't care") }}</label>
186 <div class="ui radio checkbox">
187 <input type="radio" name="show_public_infos" id="show_public_infos_yes" value="{{ constant("Galette\\Repository\\Members::FILTER_W_PUBINFOS") }}"{% if filters.show_public_infos == constant("Galette\\Repository\\Members::FILTER_W_PUBINFOS") %} checked="checked"{% endif %}>
188 <label for="show_public_infos_yes" >{{ _T('Yes') }}</label>
192 <div class="ui radio checkbox">
193 <input type="radio" name="show_public_infos" id="show_public_infos_no" value="{{ constant("Galette\\Repository\\Members::FILTER_WO_PUBINFOS") }}"{% if filters.show_public_infos == constant("Galette\\Repository\\Members::FILTER_WO_PUBINFOS") %} checked="checked"{% endif %}>
194 <label for="show_public_infos_no" >{{ _T('No') }}</label>
200 <label for="status">{{ _T('Status') }}</label>
201 <select name="status[]" id="status" multiple="" class="ui search dropdown nochosen">
202 <option value="">{{ _T('Status') }}</option>
203 {% for key, value in statuts %}
204 <option value="{{ key }}"{% if key in filters.status %} selected="selected"{% endif %}>{{ value }}</option>
211 <noscript><div class="ui message">{{ _T("This feature requires javascript.") }}</div></noscript>
212 <div class="jsonly disabled galetteform ui styled fluid accordion field">
213 <div class="active ui title">
214 <i class="jsonly displaynone dropdown icon" aria-hidden="true"></i>
215 {{ _T('Advanced groups search') }} ({{ _T('Experimental') }})
219 class="ui tiny compact icon green button tooltip"
220 title="{{ _T('Add new group search criteria') }}"
222 <i class="plus icon" aria-hidden="true"></i>
223 <span class="visually-hidden">{{ _T('Add new group search criteria') }}</span>
226 <div class="active content">
228 <select name="groups_logical_operator" class="operator_selector ui search dropdown nochosen">
229 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_AND") }}"{% if filters.groups_search_log_op == constant("Galette\\Filters\\AdvancedMembersList::OP_AND") %} selected="selected"{% endif %}>{{ _T('In all selected groups') }}</option>
230 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_OR") }}"{% if filters.groups_search_log_op == constant("Galette\\Filters\\AdvancedMembersList::OP_OR") %} selected="selected"{% endif %}>{{ _T('In any of selected groups') }}</option>
233 <ul id="gs_sortable" class="sortable-items">
234 {% for gs in filters.groups_search %}
235 <li class="even ui segment unstackable items">
236 <div class="ui item">
237 <div class="ui image">
238 <i class="arrows alternate icon" aria-hidden="true"></i>
241 <select name="groups_search[]" class="group_selector ui search dropdown nochosen">
242 <option value="">{{ _T('Select a group') }}</option>
243 {% for group in filter_groups_options %}
244 <option value="{{ group.getId() }}"{% if gs.group == group.getId() %} selected="selected"{% endif %}>{{ group.getName() }}</option>
249 class="ui small compact red icon button filtered fright tooltip delete delcriteria"
250 title="{{ _T('Remove criteria') }}"
252 <i class="trash alt icon" aria-hidden="true"></i>
253 <span class="visually-hidden">{{ _T('Remove criteria') }}</span>
263 <div class="galetteform ui styled fluid accordion field">
264 <div class="active ui title">
265 <i class="jsonly displaynone dropdown icon" aria-hidden="true"></i>
266 {{ _T('Within contributions') }}
268 <div class="active content">
269 <div class="two fields">
271 <label>{{ _T('Creation date') }}</label>
272 <div class="two fields">
274 <label for="contrib_creation_date_begin">{{ _T('beetween') }}</label>
275 <div class="ui calendar" id="contrib-creation-rangestart">
276 <div class="ui input left icon">
277 <i class="calendar icon" aria-hidden="true"></i>
278 <input id="contrib_creation_date_begin" name="contrib_creation_date_begin" type="text" class="modif_date" maxlength="10" size="10" value="{{ filters.contrib_creation_date_begin }}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
283 <label for="contrib_creation_date_end">{{ _T('and') }}</label>
284 <div class="ui calendar" id="contrib-creation-rangeend">
285 <div class="ui input left icon">
286 <i class="calendar icon" aria-hidden="true"></i>
287 <input id="contrib_creation_date_end" name="contrib_creation_date_end" type="text" class="modif_date" maxlength="10" size="10" value="{{ filters.contrib_creation_date_end }}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
294 <label>{{ _T('Begin date') }}</label>
295 <div class="two fields">
297 <label for="contrib_begin_date_begin">{{ _T('beetween') }}</label>
298 <div class="ui calendar" id="contrib-begin-rangestart">
299 <div class="ui input left icon">
300 <i class="calendar icon" aria-hidden="true"></i>
301 <input id="contrib_begin_date_begin" name="contrib_begin_date_begin" type="text" class="modif_date" maxlength="10" size="10" value="{{ filters.contrib_begin_date_begin }}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
306 <label for="contrib_begin_date_end">{{ _T('and') }}</label>
307 <div class="ui calendar" id="contrib-begin-rangeend">
308 <div class="ui input left icon">
309 <i class="calendar icon" aria-hidden="true"></i>
310 <input id="contrib_begin_date_end" name="contrib_begin_date_end" type="text" class="modif_date" maxlength="10" size="10" value="{{ filters.contrib_begin_date_end }}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
317 <div class="two fields">
319 <label>{{ _T('End date') }}</label>
320 <div class="two fields">
322 <label for="contrib_end_date_begin">{{ _T('beetween') }}</label>
323 <div class="ui calendar" id="contrib-end-rangestart">
324 <div class="ui input left icon">
325 <i class="calendar icon" aria-hidden="true"></i>
326 <input id="contrib_end_date_begin" name="contrib_end_date_begin" type="text" class="due_date" maxlength="10" size="10" value="{{ filters.contrib_end_date_begin }}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
331 <label for="contrib_end_date_end">{{ _T('and') }}</label>
332 <div class="ui calendar" id="contrib-end-rangeend">
333 <div class="ui input left icon">
334 <i class="calendar icon" aria-hidden="true"></i>
335 <input id="contrib_end_date_end" name="contrib_end_date_end" type="text" class="due_date" maxlength="10" size="10" value="{{ filters.contrib_end_date_end }}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
342 <label>{{ _T('Amount') }}</label>
343 <div class="two fields">
345 <label for="contrib_min_amount">{{ _T('beetween') }}</label>
346 <input id="contrib_min_amount" name="contrib_min_amount" type="text" maxlength="10" size="10" value="{{ filters.contrib_min_amount }}"/>
349 <label for="contrib_max_amount">{{ _T('and') }}</label>
350 <input id="contrib_max_amount" name="contrib_max_amount" type="text" maxlength="10" size="10" value="{{ filters.contrib_max_amount }}"/>
355 <div class="two fields">
357 <label for="contributions_types">{{ _T('Type') }}</label>
358 <select name="contributions_types[]" id="contributions_types" multiple="" class="ui dropdown nochosen">
359 <option value="">{{ _T('Type') }}</option>
361 {% for key, value in contributions_types %}
362 <option value="{{ key }}"{% if key == filters.contributions_types %} selected="selected"{% endif %}>{{ value }}</option>
367 <label for="payments_types">{{ _T('Payment type') }}</label>
368 <select name="payments_types[]" id="payments_types" multiple="" class="ui dropdown nochosen">
369 <option value="">{{ _T('Payment type') }}</option>
370 {% for key, value in payments_types %}
371 <option value="{{ key }}"{% if key == filters.payments_types %} selected="selected"{% endif %}>{{ value }}</option>
376 {% for field in contrib_dynamics %}
378 {% set fid = field.getId() %}
379 {% if get_class(field) == "Galette\\DynamicFields\\Choice" %}
380 {% set rid = "cdsc_" ~ fid %}
382 {% set rid = "cds_" ~ fid %}
384 {% if get_class(field) != "Galette\\DynamicFields\\Boolean" %}
385 <label for="cds{% if get_class(field) == "Galette\\DynamicFields\\Choice" %}c{% endif %}_{{ field.getId() }}">{{ field.getName() }}</label>
387 {% if get_class(field) == "Galette\\DynamicFields\\Line" %}
388 <input type="text" name="cds_{{ field.getId() }}" id="cds_{{ field.getId() }}" value="{% if attribute(filters.contrib_dynamic, fid) is defined %}{{ attribute(filters.contrib_dynamic, fid) }}{% endif %}" />
389 {% elseif get_class(field) == "Galette\\DynamicFields\\Text" %}
390 <textarea name="cds_{{ field.getId() }}" id="cds_{{ field.getId() }}">{% if attribute(filters.contrib_dynamic, fid) is defined %}{{ attribute(filters.contrib_dynamic, fid) }}{% endif %}</textarea>
391 {% elseif get_class(field) == "Galette\\DynamicFields\\Choice" %}
392 <select name="cdsc_{{ field.getId() }}[]" id="cdsc_{{ field.getId() }}" multiple="multiple" class="ui dropdown nochosen">
393 <option value="">{{ _T('Select') }}</option>
394 {% for k, choice in field.getValues() %}
395 <option value="{{ k }}"{% if attribute(filters.contrib_dynamic, fid) is defined and k in attribute(filters.contrib_dynamic, fid) %} selected="selected"{% endif %}>{{ choice }}</option>
398 {% elseif get_class(field) == "Galette\\DynamicFields\\Boolean" %}
399 <div class="ui right aligned toggle checkbox">
400 <input type="checkbox" name="cds_{{ field.getId() }}" id="cds_{{ field.getId() }}" value="1" {% if attribute(filters.contrib_dynamic, fid) is defined %} checked="checked"{% endif %}/>
401 <label for="cds_{{ field.getId() }}">{{ field.getName() }}</label>
403 {% elseif get_class(field) == "Galette\\DynamicFields\\Date" %}
404 <div class="ui calendar" id="cds_{{ field.getId() }}-rangeend">
405 <div class="ui input left icon">
406 <i class="calendar icon" aria-hidden="true"></i>
407 <input id="cds_{{ field.getId() }}" name="cds_{{ field.getId() }}" type="text" class="due_date" maxlength="10" size="10" value="{% if attribute(filters.contrib_dynamic, fid) is defined %}{{ attribute(filters.contrib_dynamic, fid) }}{% endif %}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
415 <noscript><div class="ui message">{{ _T("This feature requires javascript.") }}</div></noscript>
416 <div class="jsonly disabled galetteform ui styled fluid accordion field">
417 <div class="active ui title">
418 <i class="jsonly displaynone dropdown icon" aria-hidden="true"></i>
419 {{ _T('Free search') }} ({{ _T('Experimental') }})
423 class="ui tiny compact icon green button tooltip"
424 title="{{ _T('Add new free search criteria') }}"
426 <i class="plus icon" aria-hidden="true"></i>
427 <span class="visually-hidden">{{ _T('Add new free search criteria') }}</span>
430 <div class="active content">
431 <ul id="fs_sortable" class="sortable-items">
432 {% for fs in filters.free_search %}
433 <li class="even ui segment unstackable items">
434 <div class="ui item">
435 <div class="ui image">
436 <i class="arrows alternate icon" aria-hidden="true"></i>
438 <div class="inline fields">
439 <select name="free_logical_operator[]" class="operator_selector ui selection dropdown nochosen">
440 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_AND") }}"{% if fs.log_op == constant("Galette\\Filters\\AdvancedMembersList::OP_AND") %} selected="selected"{% endif %}>{{ _T('and') }}</option>
441 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_OR") }}"{% if fs.log_op == constant("Galette\\Filters\\AdvancedMembersList::OP_OR") %} selected="selected"{% endif %}>{{ _T('or') }}</option>
443 <div class="field_selector ui search selection dropdown origselect nochosen">
444 <input type="hidden" name="free_field[]" value="{{ fs.field }}">
445 <i class="dropdown icon"></i>
446 <div class="text">{{ _T('Select a field') }}</div>
448 {% for key, field in search_fields %}
449 {% if fs.field == key %}
450 {% if key starts with 'date_' or key == 'ddn_adh' %}
451 {% set type = constant("Galette\\DynamicFields\\DynamicField::DATE") %}
452 {% elseif key == constant("Galette\\Entity\\Status::PK") %}
453 {% set type = constant("Galette\\DynamicFields\\DynamicField::CHOICE") %}
454 {% set fvalues = statuts %}
455 {% elseif key == 'sexe_adh' %}
456 {% set type = constant("Galette\\DynamicFields\\DynamicField::CHOICE") %}
458 (constant("Galette\\Entity\\Adherent::NC")): _T('Unspecified'),
459 (constant("Galette\\Entity\\Adherent::MAN")): _T('Man'),
460 (constant("Galette\\Entity\\Adherent::WOMAN")): _T('Woman')
463 {% set type = constant("Galette\\DynamicFields\\DynamicField::LINE") %}
466 <div class="item{% if fs.field == key %} active selected{% endif %}" data-value="{{ key }}">{{ field.label }}</div>
468 {% for field in adh_dynamics %}
469 {% if get_class(field) != "Galette\\DynamicFields\\Separator" %}
470 {% set fid = field.getId() %}
471 {% set rid = "dyn_" ~ fid %}
472 {% if fs.field == rid %}
473 {% set cur_field = field %}
476 <div class="item{% if fs.field == rid %} active selected{% endif %}" data-value="dyn_{{ field.getId() }}">{{ field.getName() }}</div>
478 {% for type, label in adh_socials %}
479 {% set rid = "socials_" ~ type %}
480 {% if fs.field == rid %}
481 {% set cur_field = type %}
483 <div class="item{% if fs.field == rid %} active selected{% endif %}" data-value="socials_{{ type }}">{{ label }}</div>
487 {# may not be defined #}
489 {% if type is not defined %}{% set type = null %}{% endif %}
490 <div class="data inline fields">
491 <input type="hidden" name="free_type[]" value="{% if cur_field is defined %}{{ cur_field.getType() }}{% endif %}"/>
492 {% if cur_field is defined and (get_class(cur_field) == "Galette\\DynamicFields\\Choice" or type == constant("Galette\\DynamicFields\\DynamicField::CHOICE")) %}
493 <select name="free_query_operator[]" class="free_operator ui selection dropdown nochosen">
494 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") %} selected="selected"{% endif %}>{{ _T('is') }}</option>
495 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_NOT_EQUALS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_NOT_EQUALS") %} selected="selected"{% endif %}>{{ _T('is not') }}</option>
497 <select name="free_text[]" class="free_text ui search dropdown nochosen">
498 {% if cur_field is defined and get_class(cur_field) == "Galette\\DynamicFields\\Choice" %}
499 {% for key, value in cur_field.getValues() %}
500 <option value="{{ key }}"{% if key == fs.search %} selected="selected"{% endif %}>{{ value }}</option>
503 {% for key, value in fvalues %}
504 <option value="{{ key }}"{% if key == fs.search %} selected="selected"{% endif %}>{{ value }}</option>
508 {% elseif cur_field is defined and (get_class(cur_field) == "Galette\\DynamicFields\\Date" or type == constant("Galette\\DynamicFields\\DynamicField::DATE")) %}
509 <select name="free_query_operator[]" class="free_operator ui selection dropdown nochosen">
510 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") %} selected="selected"{% endif %}>{{ _T('is') }}</option>
511 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_BEFORE") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_BEFORE") %} selected="selected"{% endif %}>{{ _T('before') }}</option>
512 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_AFTER") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_AFTER") %} selected="selected"{% endif %}>{{ _T('after') }}</option>
514 <input type="text" name="free_text[]" value="{{ fs.search|date(_T('Y-m-d')) }}" class="modif_date" maxlength="10" size="10"/>
515 <span class="exemple">{{ _T('(yyyy-mm-dd format)') }}</span>
516 {% elseif cur_field is defined and (get_class(cur_field) == "Galette\\DynamicFields\\Boolean" or type == constant("Galette\\DynamicFields\\DynamicField::BOOLEAN")) %}
517 <select name="free_query_operator[]" class="free_operator ui selection dropdown nochosen">
518 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") %} selected="selected"{% endif %}>{{ _T('is') }}</option>
520 <input type="radio" name="free_text[]" id="free_text_yes" value="1"{% if fs.search == 1 %} checked="checked"{% endif %}/><label for="free_text_yes">{{ _T('Yes') }}</label>
521 <input type="radio" name="free_text[]" id="free_text_no" value="0"{% if fs.search == 0 %} checked="checked"{% endif %}/><label for="free_text_no">{{ _T('No') }}</label>
523 <select name="free_query_operator[]" class="free_operator ui selection dropdown nochosen">
524 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") %} selected="selected"{% endif %}>{{ _T('is') }}</option>
525 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_CONTAINS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_CONTAINS") %} selected="selected"{% endif %}>{{ _T('contains') }}</option>
526 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_NOT_EQUALS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_NOT_EQUALS") %} selected="selected"{% endif %}>{{ _T('is not') }}</option>
527 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_NOT_CONTAINS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_NOT_CONTAINS") %} selected="selected"{% endif %}>{{ _T('do not contains') }}</option>
528 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_STARTS_WITH") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_STARTS_WITH") %} selected="selected"{% endif %}>{{ _T('starts with') }}</option>
529 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_ENDS_WITH") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_ENDS_WITH") %} selected="selected"{% endif %}>{{ _T('ends with') }}</option>
531 <input type="text" name="free_text[]" value="{{ fs.search }}"{% if cur_field is defined and get_class(cur_field) == "Galette\\DynamicFields\\Text" %} class="large"{% endif %}/>
536 class="ui small compact red icon button filtered fright tooltip delete delcriteria"
537 title="{{ _T('Remove criteria') }}"
539 <i class="trash alt icon" aria-hidden="true"></i>
540 <span class="visually-hidden">{{ _T('Remove criteria') }}</span>
550 <div class="ui basic center aligned segment">
551 <button type="submit" class="ui labeled icon primary button action">
552 <i class="search icon" aria-hidden="true"></i>
555 <input type="hidden" name="advanced_filtering" value="true" />
556 <button type="submit" name="clear_adv_filter" class="ui labeled icon button delete">
557 <i class="trash alt red icon" aria-hidden="true"></i>
558 {{ _T('Clear filter') }}
560 {% include "components/forms/csrf.html.twig" %}
565 {% block javascripts %}
566 <script type="text/javascript">
569 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") }},
570 name: "{{ _T('is') }}"
573 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_CONTAINS") }},
574 name: "{{ _T('contains') }}"
577 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_NOT_EQUALS") }},
578 name: "{{ _T('is not') }}"
581 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_NOT_CONTAINS") }},
582 name: "{{ _T('do not contains') }}"
585 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_STARTS_WITH") }},
586 name: "{{ _T('starts with') }}"
589 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_ENDS_WITH") }},
590 name: "{{ _T('ends with') }}"
593 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_BEFORE") }},
594 name: "{{ _T('before') }}"
597 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_AFTER") }},
598 name: "{{ _T('after') }}"
603 {% for key, field in search_fields %}
604 {% if key starts with 'date_' or key == 'ddn_adh' %}
605 {% set type = constant("Galette\\DynamicFields\\DynamicField::DATE") %}
606 {% elseif key == constant("Galette\\Entity\\Status::PK") %}
607 {% set type = constant("Galette\\DynamicFields\\DynamicField::CHOICE") %}
608 {% set fvalues = statuts %}
609 {% elseif key == 'sexe_adh' %}
610 {% set type = constant("Galette\\DynamicFields\\DynamicField::CHOICE") %}
612 (constant("Galette\\Entity\\Adherent::NC")): _T('Unspecified'),
613 (constant("Galette\\Entity\\Adherent::MAN")): _T('Man'),
614 (constant("Galette\\Entity\\Adherent::WOMAN")): _T('Woman')
617 {% set type = constant("Galette\\DynamicFields\\DynamicField::LINE") %}
619 {{ key }}: { type:'{{ type }}'{% if fvalues is defined %}, values: {{ fvalues|json_encode|raw }}{% endif %} },
621 {% for field in adh_dynamics %}
622 {% if get_class(field) == "Galette\\DynamicFields\\Separator" %}
624 {% elseif get_class(field) == "Galette\\DynamicFields\\Choice" %}
625 dyn_{{ field.getId() }}: { type:'{{ field.getType() }}', values: {{ field.getValues()|json_encode|raw }} },
627 dyn_{{ field.getId() }}: { type:'{{ field.getType() }}' },
632 {% include "elements/js/calendar.js.twig" with {selector: '.fs-calendar'} %}
634 var _fs_dropdown = function(selector) {
636 selector = '.origselect';
639 $(selector).dropdown({
640 action: function(text, value, element) {
641 var element = element.parentElement !== undefined ? element : element[0];
642 var dropdown = element.parentElement.parentElement;
643 $(dropdown).find('div.text').html(text);
644 $(dropdown).dropdown('set selected', value);
645 $(dropdown).dropdown('hide');
647 var _field = _fields[value];
648 var _type = _field.type;
652 case '{{ constant('Galette\\DynamicFields\\DynamicField::BOOLEAN') }}':
653 _html = _getOperatorSelector(['op_equals']);
654 _html += '<input type="radio" name="free_text[]" id="free_text_yes" value="1"/><label for="free_text_yes">{{ _T('Yes') }}</label><input type="radio" name="free_text[]" id="free_text_no" value="0"/><label for="free_text_no">{{ _T('No') }}</label>';
656 case '{{ constant('Galette\\DynamicFields\\DynamicField::CHOICE') }}':
657 _html = _getOperatorSelector(['op_equals', 'op_not_equals']);
659 if (Array.isArray(_field.values)) {
660 for (var i = 0; i < _field.values.length; i++) {
661 _options += '<option value="' + i + '">' + _field.values[i] + '</option>';
664 for (key in _field.values) {
665 _options += '<option value="' + key + '">' + _field.values[key] + '</option>';
668 _html += '<select name="free_text[]" class="ui search selection dropdown nochosen">' + _options + '</select>';
670 case '{{ constant('Galette\\DynamicFields\\DynamicField::DATE') }}':
671 _html = _getOperatorSelector(['op_equals', 'op_before', 'op_after']);
672 _html += '<div class="ui calendar fs-calendar">'
673 _html += '<div class="ui input left icon">'
674 _html += '<i class="calendar icon" aria-hidden="true"></i>'
675 _html += '<input type="text" name="free_text[]" class="modif_date" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>';
680 _html = _getOperatorSelector(['op_equals', 'op_contains', 'op_not_equals', 'op_not_contains', 'op_starts_with', 'op_ends_with']);
681 _html += '<input type="text" name="free_text[]"/>';
685 _html += '<input type="hidden" name="free_type[]" value="' + _type + '"/>';
686 _current_fields = element.parentElement.parentElement.parentElement;
687 $(_current_fields).find('div.data').html(_html);
688 $(_current_fields).find('div.data .ui.dropdown').dropdown('refresh');
689 _calendarWidget('.fs-calendar');
694 var _newFilter = function(elt) {
695 elt.find('div.data').html('');
696 elt.find('.item.selected').removeClass('active').removeClass('selected');
697 elt.find('.origselect').dropdown('set value', '');
698 elt.find('.origselect').find('div.text').html('{{ _T("Select a field") }}');
700 var _rmFilter = function(elt) {
704 elt.find('.delcriteria').click(function(){
706 if ( _this.parents('ul').find('li').length > 1 ) {
707 _this.parent('div').parent('.item').parent('li').remove();
709 _newFilter(_this.parent('div').parent('.item').parent('li'));
714 var _getOperatorSelector = function(list) {
716 for (var i = 0; i < list.length; i++) {
717 var _operator = _operators[list[i]];
718 _options += '<option value="' + _operator.id + '">' + _operator.name + '</option>';
720 return '<select name="free_query_operator[]" class="free_operator ui selection dropdown nochosen">' + _options + '</select>';
723 var _initSortable = function(){
724 var _freesearch = document.getElementById('fs_sortable');
725 var _groupsearch = document.getElementById('gs_sortable');
727 new Sortable(_freesearch, {
729 ghostClass: 'yellow',
731 onUpdate: function (evt) {
732 var _item = evt.item;
733 _item.classList.add('yellow');
737 new Sortable(_groupsearch, {
739 ghostClass: 'yellow',
741 onAdd: function (evt) {
742 var _item = evt.item;
743 _item.classList.add('yellow');
753 $('#addbutton_g').click(function(){
754 $('#gs_sortable li:first')
756 .insertAfter('#gs_sortable li:last'); // where
757 $('#gs_sortable li:last .ui.dropdown').dropdown('refresh');
763 $('#addbutton').click(function(){
764 $('#fs_sortable li:first')
766 .insertAfter('#fs_sortable li:last'); // where
767 $('#fs_sortable li:last .ui.dropdown:not(.origselect)').dropdown('refresh');