]> git.agnieray.net Git - galette.git/blob - galette/templates/default/pages/advanced_search.html.twig
6dee3cc963b8204b1b3e8a5c6fcc2c44c3227025
[galette.git] / galette / templates / default / pages / advanced_search.html.twig
1 {% extends 'page.html.twig' %}
2
3 {% block content %}
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"></i>
8 {{ _T('Simple search') }}
9 </div>
10 <div class="active content">
11 <div class="four fields">
12 <div class="field">
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') }}"/>
15 </div>
16 <div class="field">
17 <label for="field_filter">{{ _T('in:') }}</label>
18 <select name="field_filter" class="ui search dropdown origselect nochosen">
19 {% for key, value in field_filter_options %}
20 <option value="{{ key }}"{% if key == filters.field_filter %} selected="selected"{% endif %}>{{ value }}</option>
21 {% endfor %}
22 </select>
23 </div>
24 <div class="field">
25 <label for="membership_filter">{{ _T('Membership status') }}</label>
26 <select id="membership_filter" name="membership_filter" class="ui search dropdown origselect nochosen">
27 {% for key, value in membership_filter_options %}
28 <option value="{{ key }}"{% if key == filters.membership_filter %} selected="selected"{% endif %}>{{ value }}</option>
29 {% endfor %}
30 </select>
31 </div>
32 <div class="field">
33 <label for="filter_account">{{ _T('Account activity') }}</label>
34 <select id="filter_account" name="filter_account" class="ui search dropdown origselect nochosen">
35 {% for key, value in filter_accounts_options %}
36 <option value="{{ key }}"{% if key == filters.filter_account %} selected="selected"{% endif %}>{{ value }}</option>
37 {% endfor %}
38 </select>
39 </div>
40 <div class="field">
41 <label for="group_filter">{{ _T('Member of group') }}</label>
42 <select name="group_filter" id="group_filter" class="ui search dropdown origselect 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>
46 {% endfor %}
47 </select>
48 </div>
49 </div>
50 <div class="inline fields">
51 <label for="email_filter">{{ _T('With email:') }}</label>
52 <div class="field">
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>
56 </div>
57 </div>
58 <div class="field">
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>
62 </div>
63 </div>
64 <div class="field">
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>
68 </div>
69 </div>
70 </div>
71 </div>
72 </div>
73 <div class="galetteform ui styled fluid accordion field">
74 <div class="active ui title">
75 <i class="jsonly displaynone dropdown icon"></i>
76 {{ _T('Advanced search') }}
77 </div>
78 <div class="active content">
79 <div class="two fields">
80 <div class="field">
81 <label>{{ _T('Birth date') }}</label>
82 <div class="two fields">
83 <div class="field">
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"></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)') }}" />
89 </div>
90 </div>
91 </div>
92 <div class="field">
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"></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)') }}"/>
98 </div>
99 </div>
100 </div>
101 </div>
102 </div>
103 <div class="field">
104 <label>{{ _T('Creation date') }}</label>
105 <div class="two fields">
106 <div class="field">
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"></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)') }}"/>
112 </div>
113 </div>
114 </div>
115 <div class="field">
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"></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)') }}"/>
121 </div>
122 </div>
123 </div>
124 </div>
125 </div>
126 </div>
127 <div class="two fields">
128 <div class="field">
129 <label>{{ _T('Modification date') }}</label>
130 <div class="two fields">
131 <div class="field">
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"></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)') }}"/>
137 </div>
138 </div>
139 </div>
140 <div class="field">
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"></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)') }}"/>
146 </div>
147 </div>
148 </div>
149 </div>
150 </div>
151 <div class="field">
152 <label>{{ _T('Due date') }}</label>
153 <div class="two fields">
154 <div class="field">
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"></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)') }}"/>
160 </div>
161 </div>
162 </div>
163 <div class="field">
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"></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)') }}"/>
169 </div>
170 </div>
171 </div>
172 </div>
173 </div>
174 </div>
175 <div class="two fields">
176 <div class="field">
177 <div class="grouped fields">
178 <label for="show_public_infos">{{ _T('Show public infos') }}</label>
179 <div class="field">
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>
183 </div>
184 </div>
185 <div class="field">
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>
189 </div>
190 </div>
191 <div class="field">
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>
195 </div>
196 </div>
197 </div>
198 </div>
199 <div class="field">
200 <label for="status">{{ _T('Status') }}</label>
201 <select name="status[]" id="status" multiple="" class="ui search dropdown origselect nochosen">
202 <option value="">{{ _T('Status') }}</option>
203 {% for key, value in statuts %}
204 <option value="{{ key }}"{% if key == filters.status %} selected="selected"{% endif %}>{{ value }}</option>
205 {% endfor %}
206 </select>
207 </div>
208 </div>
209 </div>
210 </div>
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"></i>
215 {{ _T('Advanced groups search') }} ({{ _T('Experimental') }})
216 <a
217 href="#"
218 id="addbutton_g"
219 class="ui tiny compact icon green button tooltip"
220 title="{{ _T('Add new group search criteria') }}"
221 >
222 <i class="plus icon"></i>
223 <span class="displaynone">{{ _T('Add new group search criteria') }}</span>
224 </a>
225 </div>
226 <div class="active content">
227 <div class="field">
228 <select name="groups_logical_operator" class="operator_selector ui search dropdown origselect 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>
231 </select>
232 </div>
233 <ul id="gs_sortable" class="sortable-items">
234 {% for gs in filters.groups_search %}
235 <li class="even ui segment items">
236 <div class="ui item">
237 <div class="ui image">
238 <i class="arrows alternate icon"></i>
239 </div>
240 <div>
241 <select name="groups_search[]" class="group_selector ui search dropdown origselect 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>
245 {% endfor %}
246 </select>
247 <a
248 href="#"
249 class="ui small compact red icon button filtered fright tooltip delete delcriteria"
250 title="{{ _T('Remove criteria') }}"
251 >
252 <i class="trash alt icon"></i>
253 <span class="displaynone">{{ _T('Remove criteria') }}</span>
254 </a>
255 </div>
256 </div>
257 </li>
258 {% endfor %}
259 </ul>
260 </div>
261 </div>
262
263 <div class="galetteform ui styled fluid accordion field">
264 <div class="active ui title">
265 <i class="jsonly displaynone dropdown icon"></i>
266 {{ _T('Within contributions') }}
267 </div>
268 <div class="active content">
269 <div class="two fields">
270 <div class="field">
271 <label>{{ _T('Creation date') }}</label>
272 <div class="two fields">
273 <div class="field">
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"></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)') }}"/>
279 </div>
280 </div>
281 </div>
282 <div class="field">
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"></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)') }}"/>
288 </div>
289 </div>
290 </div>
291 </div>
292 </div>
293 <div class="field">
294 <label>{{ _T('Begin date') }}</label>
295 <div class="two fields">
296 <div class="field">
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"></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)') }}"/>
302 </div>
303 </div>
304 </div>
305 <div class="field">
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"></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)') }}"/>
311 </div>
312 </div>
313 </div>
314 </div>
315 </div>
316 </div>
317 <div class="two fields">
318 <div class="field">
319 <label>{{ _T('End date') }}</label>
320 <div class="two fields">
321 <div class="field">
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"></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)') }}"/>
327 </div>
328 </div>
329 </div>
330 <div class="field">
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"></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)') }}"/>
336 </div>
337 </div>
338 </div>
339 </div>
340 </div>
341 <div class="field">
342 <label>{{ _T('Amount') }}</label>
343 <div class="two fields">
344 <div class="field">
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 }}"/>
347 </div>
348 <div class="field">
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 }}"/>
351 </div>
352 </div>
353 </div>
354 </div>
355 <div class="two fields">
356 <div class="field">
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>
360
361 {% for key, value in contributions_types %}
362 <option value="{{ key }}"{% if key == filters.contributions_types %} selected="selected"{% endif %}>{{ value }}</option>
363 {% endfor %}
364 </select>
365 </div>
366 <div class="field">
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>
372 {% endfor %}
373 </select>
374 </div>
375 </div>
376 {% for field in contrib_dynamics %}
377 <div class="field">
378 {% set fid = field.getId() %}
379 {% if get_class(field) == "Galette\\DynamicFields\\Choice" %}
380 {% set rid = "cdsc_" ~ fid %}
381 {% else %}
382 {% set rid = "cds_" ~ fid %}
383 {% endif %}
384 <label for="cds{% if get_class(field) == "Galette\\DynamicFields\\Choice" %}c{% endif %}_{{ field.getId() }}">{{ field.getName() }}</label>
385 {% if get_class(field) == "Galette\\DynamicFields\\Line" %}
386 <input type="text" name="cds_{{ field.getId() }}" id="cds_{{ field.getId() }}" value="{% if attribute(filters.contrib_dynamic, rid) is defined %}{{ attribute(filters.contrib_dynamic, rid) }}{% endif %}" />
387 {% elseif get_class(field) == "Galette\\DynamicFields\\Text" %}
388 <textarea name="cds_{{ field.getId() }}" id="cds_{{ field.getId() }}">{% if attribute(filters.contrib_dynamic, rid) is defined %}{{ attribute(filters.contrib_dynamic, rid) }}{% endif %}</textarea>
389 {% elseif get_class(field) == "Galette\\DynamicFields\\Choice" %}
390 <select name="cdsc_{{ field.getId() }}[]" id="cdsc_{{ field.getId() }}" multiple="multiple" class="ui dropdown nochosen">
391 <option value="">{{ _T('Select') }}</option>
392 {% for k, choice in field.getValues() %}
393 <option value="{{ k }}"{% if cds.field is defined and cds.field == rid %} selected="selected"{% endif %}>{{ choice }}</option>
394 {% endfor %}
395 </select>
396 {% endif %}
397 </div>
398 {% endfor %}
399 </div>
400 </div>
401 {# Disable free search; see https://bugs.galette.eu/issues/1684
402 <noscript><div class="ui message">{{ _T("This feature requires javascript.") }}</div></noscript>
403 <div class="jsonly disabled galetteform ui styled fluid accordion field">
404 <div class="active ui title">
405 <i class="jsonly displaynone dropdown icon"></i>
406 {{ _T('Free search') }}
407 <a
408 href="#"
409 id="addbutton"
410 class="ui tiny compact icon green button tooltip"
411 title="{{ _T('Add new free search criteria') }}"
412 >
413 <i class="plus icon"></i>
414 <span class="displaynone">{{ _T('Add new free search criteria') }}</span>
415 </a>
416 </div>
417 <div class="active content">
418 <ul id="fs_sortable" class="sortable-items">
419 {% for fs in filters.free_search %}
420 <li class="even ui segment items">
421 <div class="ui item">
422 <div class="ui image">
423 <i class="arrows alternate icon"></i>
424 </div>
425 <div class="inline fields">
426 <select name="free_logical_operator[]" class="operator_selector ui search dropdown origselect nochosen">
427 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_AND") }}"{% if fs.log_op == constant("Galette\\Filters\\AdvancedMembersList::OP_AND") %} selected="selected"{% endif %}>{{ _T('and') }}</option>
428 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_OR") }}"{% if fs.log_op == constant("Galette\\Filters\\AdvancedMembersList::OP_OR") %} selected="selected"{% endif %}>{{ _T('or') }}</option>
429 </select>
430 <select name="free_field[]" class="field_selector ui search dropdown origselect nochosen">
431 <option value="">{{ _T('Select a field') }}</option>
432 {% for key, field in search_fields %}
433 {% if fs.field == key %}
434 {% if key starts with 'date_' or key == 'ddn_adh' %}
435 {% set type = constant("Galette\\DynamicFields\\DynamicField::DATE") %}
436 {% elseif key == constant("Galette\\Entity\\Status::PK") %}
437 {% set type = constant("Galette\\DynamicFields\\DynamicField::CHOICE") %}
438 {% set fvalues = statuts %}
439 {% elseif key == 'sexe_adh' %}
440 {% set type = constant("Galette\\DynamicFields\\DynamicField::CHOICE") %}
441 {% set fvalues = {
442 (constant("Galette\\Entity\\Adherent::NC")): _T('Unspecified'),
443 (constant("Galette\\Entity\\Adherent::MAN")): _T('Man'),
444 (constant("Galette\\Entity\\Adherent::WOMAN")): _T('Woman')
445 } %}
446 {% else %}
447 {% set type = constant("Galette\\DynamicFields\\DynamicField::LINE") %}
448 {% endif %}
449 {% endif %}
450 <option value="{{ key }}"{% if fs.field == key %} selected="selected"{% endif %}>{{ field.label }}</option>
451 {% endfor %}
452 {% for field in adh_dynamics %}
453 {% if get_class(field) != "Galette\\DynamicFields\\Separator" %}
454 {% set fid = field.getId() %}
455 {% set rid = "dyn_" ~ fid %}
456 {% if fs.field == rid %}
457 {% set cur_field = field %}
458 {% endif %}
459 {% endif %}
460 <option value="dyn_{{ field.getId() }}"{% if fs.field == rid %} selected="selected"{% endif %}>{{ field.getName() }}</option>
461 {% endfor %}
462 {% for type, label in adh_socials %}
463 {% set rid = "socials_" ~ type %}
464 {% if fs.field == rid %}
465 {% set cur_field = type %}
466 {% endif %}
467 <option value="socials_{{ type }}"{% if fs.field == rid %} selected="selected"{% endif %}>{{ label }}</option>
468 {% endfor %}
469
470 </select>
471 {% if type is not defined %}{% set type = null %}{% endif %}
472 <span class="data fields">
473 <input type="hidden" name="free_type[]" value="{% if cur_field is defined %}{{ cur_field.getType() }}{% endif %}"/>
474 {% if cur_field is defined and (get_class(cur_field) == "Galette\\DynamicFields\\Choice" or type == constant("Galette\\DynamicFields\\DynamicField::CHOICE")) %}
475 <select name="free_query_operator[]" class="free_operator ui search dropdown origselect nochosen">
476 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") %} selected="selected"{% endif %}>{{ _T('is') }}</option>
477 <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>
478 </select>
479 <select name="free_text[]" class="free_text ui search dropdown origselect nochosen">
480 {% if cur_field is defined and get_class(cur_field) == "Galette\\DynamicFields\\Choice" %}
481 {% for key, value in cur_field.getValues() %}
482 <option value="{{ key }}"{% if key == fs.search %} selected="selected"{% endif %}>{{ value }}</option>
483 {% endfor %}
484 {% else %}
485 {% for key, value in fvalues %}
486 <option value="{{ key }}"{% if key == fs.search %} selected="selected"{% endif %}>{{ value }}</option>
487 {% endfor %}
488 {% endif %}
489 </select>
490 {% elseif cur_field is defined and (get_class(cur_field) == "Galette\\DynamicFields\\Date" or type == constant("Galette\\DynamicFields\\DynamicField::DATE")) %}
491 <select name="free_query_operator[]" class="free_operator ui search dropdown origselect nochosen">
492 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") %} selected="selected"{% endif %}>{{ _T('is') }}</option>
493 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_BEFORE") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_BEFORE") %} selected="selected"{% endif %}>{{ _T('before') }}</option>
494 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_AFTER") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_AFTER") %} selected="selected"{% endif %}>{{ _T('after') }}</option>
495 </select>
496 <input type="text" name="free_text[]" value="{{ fs.search|date(_T('Y-m-d')) }}" class="modif_date" maxlength="10" size="10"/>
497 <span class="exemple">{{ _T('(yyyy-mm-dd format)') }}</span>
498 {% elseif cur_field is defined and (get_class(cur_field) == "Galette\\DynamicFields\\Boolean" or type == constant("Galette\\DynamicFields\\DynamicField::BOOLEAN")) %}
499 <select name="free_query_operator[]" class="free_operator ui search dropdown origselect nochosen">
500 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") %} selected="selected"{% endif %}>{{ _T('is') }}</option>
501 </select>
502 <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>
503 <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>
504 {% else %}
505 <select name="free_query_operator[]" class="free_operator ui search dropdown origselect nochosen">
506 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") %} selected="selected"{% endif %}>{{ _T('is') }}</option>
507 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_CONTAINS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_CONTAINS") %} selected="selected"{% endif %}>{{ _T('contains') }}</option>
508 <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>
509 <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>
510 <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>
511 <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>
512 </select>
513 <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 %}/>
514 {% endif %}
515 </span>
516 <a
517 href="#"
518 class="ui small compact red icon button filtered fright tooltip delete delcriteria"
519 title="{{ _T('Remove criteria') }}"
520 >
521 <i class="trash alt icon"></i>
522 <span class="displaynone">{{ _T('Remove criteria') }}</span>
523 </a>
524
525 </div>
526 </div>
527 </li>
528 {% endfor %}
529 </ul>
530 </div>
531 </div>
532 #}
533 <div class="ui basic center aligned segment">
534 <button type="submit" class="ui labeled icon primary button action">
535 <i class="search icon" aria-hidden="true"></i>
536 {{ _T('Filter') }}
537 </button>
538 <input type="hidden" name="advanced_filtering" value="true" />
539 <button type="submit" name="clear_adv_filter" class="ui labeled icon button delete">
540 <i class="trash alt red icon" aria-hidden="true"></i>
541 {{ _T('Clear filter') }}
542 </button>
543 {% include "components/forms/csrf.html.twig" %}
544 </div>
545 </form>
546 {% endblock %}
547
548 {% block javascripts %}
549 <script type="text/javascript">
550 var _operators = {
551 op_equals: {
552 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") }},
553 name: "{{ _T('is') }}"
554 },
555 op_contains: {
556 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_CONTAINS") }},
557 name: "{{ _T('contains') }}"
558 },
559 op_not_equals: {
560 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_NOT_EQUALS") }},
561 name: "{{ _T('is not') }}"
562 },
563 op_not_contains: {
564 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_NOT_CONTAINS") }},
565 name: "{{ _T('do not contains') }}"
566 },
567 op_starts_with: {
568 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_STARTS_WITH") }},
569 name: "{{ _T('starts with') }}"
570 },
571 op_ends_with: {
572 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_ENDS_WITH") }},
573 name: "{{ _T('ends with') }}"
574 },
575 op_before: {
576 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_BEFORE") }},
577 name: "{{ _T('before') }}"
578 },
579 op_after: {
580 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_AFTER") }},
581 name: "{{ _T('after') }}"
582 },
583 };
584
585 var _fields = {
586 {% for key, field in search_fields %}
587 {% if key starts with 'date_' or key == 'ddn_adh' %}
588 {% set type = constant("Galette\\DynamicFields\\DynamicField::DATE") %}
589 {% elseif key == constant("Galette\\Entity\\Status::PK") %}
590 {% set type = constant("Galette\\DynamicFields\\DynamicField::CHOICE") %}
591 {% set fvalues = statuts %}
592 {% elseif key == 'sexe_adh' %}
593 {% set type = constant("Galette\\DynamicFields\\DynamicField::CHOICE") %}
594 {% set fvalues = {
595 (constant("Galette\\Entity\\Adherent::NC")): _T('Unspecified'),
596 (constant("Galette\\Entity\\Adherent::MAN")): _T('Man'),
597 (constant("Galette\\Entity\\Adherent::WOMAN")): _T('Woman')
598 } %}
599 {% else %}
600 {% set type = constant("Galette\\DynamicFields\\DynamicField::LINE") %}
601 {% endif %}
602 {{ key }}: { type:'{{ type }}'{% if fvalues is defined %}, values: {{ fvalues|json_encode|raw }}{% endif %} },
603 {% endfor %}
604 {% for field in adh_dynamics %}
605 {% if get_class(field) == "Galette\\DynamicFields\\Separator" %}
606 {# do nothing #}
607 {% elseif get_class(field) == "Galette\\DynamicFields\\Choice" %}
608 dyn_{{ field.getId() }}: { type:'{{ field.getType() }}', values: {{ field.getValues()|json_encode|raw }} },
609 {% else %}
610 dyn_{{ field.getId() }}: { type:'{{ field.getType() }}' },
611 {% endif %}
612 {% endfor %}
613 };
614
615 {% include "elements/js/calendar.js.twig" with {selector: '.fs-calendar'} %}
616
617 var _fs_dropdown = function(selector) {
618 if ( !selector ) {
619 selector = '.origselect';
620 }
621
622 $(selector).dropdown({
623 onChange: function(value, text, option) {
624 var _field = _fields[value];
625 var _type = _field.type;
626 var _html;
627 switch(_type) {
628 /* FIXME */
629 case '{{ constant('Galette\\DynamicFields\\DynamicField::BOOLEAN') }}':
630 _html = _getOperatorSelector(['op_equals']);
631 _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>';
632 break;
633 case '{{ constant('Galette\\DynamicFields\\DynamicField::CHOICE') }}':
634 _html = _getOperatorSelector(['op_equals', 'op_not_equals']);
635 var _options = '';
636 if (Array.isArray(_field.values)) {
637 for (var i = 0; i < _field.values.length; i++) {
638 _options += '<option value="' + i + '">' + _field.values[i] + '</option>';
639 }
640 } else {
641 for (key in _field.values) {
642 _options += '<option value="' + key + '">' + _field.values[key] + '</option>';
643 }
644 }
645 _html += '<select name="free_text[]" class="ui search dropdown origselect nochosen newselect">' + _options + '</select>';
646 break;
647 case '{{ constant('Galette\\DynamicFields\\DynamicField::DATE') }}':
648 _html = _getOperatorSelector(['op_equals', 'op_before', 'op_after']);
649 _html += '<div class="ui calendar fs-calendar">'
650 _html += '<div class="ui input left icon">'
651 _html += '<i class="calendar icon"></i>'
652 _html += '<input type="text" name="free_text[]" class="modif_date" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>';
653 _html += '</div>'
654 _html += '</div>'
655 break;
656 default:
657 _html = _getOperatorSelector(['op_equals', 'op_contains', 'op_not_equals', 'op_not_contains', 'op_starts_with', 'op_ends_with']);
658 _html += '<input type="text" name="free_text[]"/>';
659 break;
660
661 }
662 _html += '<input type="hidden" name="free_type[]" value="' + _type + '"/>';
663 option.parent().parent().parent().find('span.data').html(_html);
664 _calendarWidget('.fs-calendar');
665 _fs_dropdown('.newselect');
666 $('.newselect').removeClass('newselect');
667 }
668 });
669 }
670
671 var _newFilter = function(elt) {
672 elt.find('span.data').html('');
673 elt.find('.item.active.selected').removeClass('active').removeClass('selected');
674 }
675 var _rmFilter = function(elt) {
676 if ( !elt ) {
677 elt = $('li');
678 }
679 elt.find('.delcriteria').click(function(){
680 var _this = $(this);
681 if ( _this.parents('ul').find('li').length > 1 ) {
682 _this.parent('div').parent('.item').parent('li').remove();
683 } else {
684 _newFilter(_this.parent('div').parent('.item').parent('li'));
685 }
686 return false;
687 });
688 }
689 var _getOperatorSelector = function(list) {
690 var _options = '';
691 for (var i = 0; i < list.length; i++) {
692 var _operator = _operators[list[i]];
693 _options += '<option value="' + _operator.id + '">' + _operator.name + '</option>';
694 }
695 return '<select name="free_query_operator[]" class="free_operator ui search dropdown origselect nochosen newselect">' + _options + '</select>';
696 _fs_dropdown('.newselect');
697 $('.newselect').removeClass('newselect');
698 }
699
700 var _initSortable = function(){
701 var _freesearch = document.getElementById('fs_sortable');
702 var _groupsearch = document.getElementById('gs_sortable');
703
704 new Sortable(_freesearch, {
705 animation: 150,
706 ghostClass: 'yellow',
707 filter: '.filtered',
708 onUpdate: function (evt) {
709 var _item = evt.item;
710 _item.classList.add('yellow');
711 }
712 });
713
714 new Sortable(_groupsearch, {
715 animation: 150,
716 ghostClass: 'yellow',
717 filter: '.filtered',
718 onAdd: function (evt) {
719 var _item = evt.item;
720 _item.classList.add('yellow');
721 }
722 });
723 }
724
725 $(function(){
726 _initSortable();
727 _fs_dropdown();
728 _rmFilter();
729
730 $('#addbutton_g').click(function(){
731 $('#gs_sortable li:first')
732 .clone() // copy
733 .insertAfter('#gs_sortable li:last'); // where
734 _fs_dropdown();
735 _rmFilter();
736 return false;
737 });
738
739 $('#addbutton').click(function(){
740 $('#fs_sortable li:first')
741 .clone() // copy
742 .insertAfter('#fs_sortable li:last'); // where
743 _fs_dropdown();
744 _rmFilter();
745 return false;
746 });
747 });
748 </script>
749 {% endblock %}