]> git.agnieray.net Git - galette.git/blob - galette/templates/default/pages/advanced_search.html.twig
Reactivate free search; closes #1683
[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 unstackable 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 {% 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>
386 {% endif %}
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>
396 {% endfor %}
397 </select>
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>
402 </div>
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"></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)') }}"/>
408 </div>
409 </div>
410 {% endif %}
411 </div>
412 {% endfor %}
413 </div>
414 </div>
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"></i>
419 {{ _T('Free search') }} ({{ _T('Experimental') }})
420 <a
421 href="#"
422 id="addbutton"
423 class="ui tiny compact icon green button tooltip"
424 title="{{ _T('Add new free search criteria') }}"
425 >
426 <i class="plus icon"></i>
427 <span class="displaynone">{{ _T('Add new free search criteria') }}</span>
428 </a>
429 </div>
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"></i>
437 </div>
438 <div class="inline fields">
439 <select name="free_logical_operator[]" class="operator_selector ui search dropdown origselect 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>
442 </select>
443 <select name="free_field[]" class="field_selector ui search dropdown origselect nochosen">
444 <option value="">{{ _T('Select a field') }}</option>
445 {% for key, field in search_fields %}
446 {% if fs.field == key %}
447 {% if key starts with 'date_' or key == 'ddn_adh' %}
448 {% set type = constant("Galette\\DynamicFields\\DynamicField::DATE") %}
449 {% elseif key == constant("Galette\\Entity\\Status::PK") %}
450 {% set type = constant("Galette\\DynamicFields\\DynamicField::CHOICE") %}
451 {% set fvalues = statuts %}
452 {% elseif key == 'sexe_adh' %}
453 {% set type = constant("Galette\\DynamicFields\\DynamicField::CHOICE") %}
454 {% set fvalues = {
455 (constant("Galette\\Entity\\Adherent::NC")): _T('Unspecified'),
456 (constant("Galette\\Entity\\Adherent::MAN")): _T('Man'),
457 (constant("Galette\\Entity\\Adherent::WOMAN")): _T('Woman')
458 } %}
459 {% else %}
460 {% set type = constant("Galette\\DynamicFields\\DynamicField::LINE") %}
461 {% endif %}
462 {% endif %}
463 <option value="{{ key }}"{% if fs.field == key %} selected="selected"{% endif %}>{{ field.label }}</option>
464 {% endfor %}
465 {% for field in adh_dynamics %}
466 {% if get_class(field) != "Galette\\DynamicFields\\Separator" %}
467 {% set fid = field.getId() %}
468 {% set rid = "dyn_" ~ fid %}
469 {% if fs.field == rid %}
470 {% set cur_field = field %}
471 {% endif %}
472 {% endif %}
473 <option value="dyn_{{ field.getId() }}"{% if fs.field == rid %} selected="selected"{% endif %}>{{ field.getName() }}</option>
474 {% endfor %}
475 {% for type, label in adh_socials %}
476 {% set rid = "socials_" ~ type %}
477 {% if fs.field == rid %}
478 {% set cur_field = type %}
479 {% endif %}
480 <option value="socials_{{ type }}"{% if fs.field == rid %} selected="selected"{% endif %}>{{ label }}</option>
481 {% endfor %}
482
483 </select>
484 {# may not be defined #}
485 {# #}
486 {% if type is not defined %}{% set type = null %}{% endif %}
487 <span class="data fields">
488 <input type="hidden" name="free_type[]" value="{% if cur_field is defined %}{{ cur_field.getType() }}{% endif %}"/>
489 {% if cur_field is defined and (get_class(cur_field) == "Galette\\DynamicFields\\Choice" or type == constant("Galette\\DynamicFields\\DynamicField::CHOICE")) %}
490 <select name="free_query_operator[]" class="free_operator ui search dropdown origselect nochosen">
491 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") %} selected="selected"{% endif %}>{{ _T('is') }}</option>
492 <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>
493 </select>
494 <select name="free_text[]" class="free_text ui search dropdown origselect nochosen">
495 {% if cur_field is defined and get_class(cur_field) == "Galette\\DynamicFields\\Choice" %}
496 {% for key, value in cur_field.getValues() %}
497 <option value="{{ key }}"{% if key == fs.search %} selected="selected"{% endif %}>{{ value }}</option>
498 {% endfor %}
499 {% else %}
500 {% for key, value in fvalues %}
501 <option value="{{ key }}"{% if key == fs.search %} selected="selected"{% endif %}>{{ value }}</option>
502 {% endfor %}
503 {% endif %}
504 </select>
505 {% elseif cur_field is defined and (get_class(cur_field) == "Galette\\DynamicFields\\Date" or type == constant("Galette\\DynamicFields\\DynamicField::DATE")) %}
506 <select name="free_query_operator[]" class="free_operator ui search dropdown origselect nochosen">
507 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") %} selected="selected"{% endif %}>{{ _T('is') }}</option>
508 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_BEFORE") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_BEFORE") %} selected="selected"{% endif %}>{{ _T('before') }}</option>
509 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_AFTER") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_AFTER") %} selected="selected"{% endif %}>{{ _T('after') }}</option>
510 </select>
511 <input type="text" name="free_text[]" value="{{ fs.search|date(_T('Y-m-d')) }}" class="modif_date" maxlength="10" size="10"/>
512 <span class="exemple">{{ _T('(yyyy-mm-dd format)') }}</span>
513 {% elseif cur_field is defined and (get_class(cur_field) == "Galette\\DynamicFields\\Boolean" or type == constant("Galette\\DynamicFields\\DynamicField::BOOLEAN")) %}
514 <select name="free_query_operator[]" class="free_operator ui search dropdown origselect nochosen">
515 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") %} selected="selected"{% endif %}>{{ _T('is') }}</option>
516 </select>
517 <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>
518 <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>
519 {% else %}
520 <select name="free_query_operator[]" class="free_operator ui search dropdown origselect nochosen">
521 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") %} selected="selected"{% endif %}>{{ _T('is') }}</option>
522 <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_CONTAINS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_CONTAINS") %} selected="selected"{% endif %}>{{ _T('contains') }}</option>
523 <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>
524 <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>
525 <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>
526 <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>
527 </select>
528 <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 %}/>
529 {% endif %}
530 </span>
531 <a
532 href="#"
533 class="ui small compact red icon button filtered fright tooltip delete delcriteria"
534 title="{{ _T('Remove criteria') }}"
535 >
536 <i class="trash alt icon"></i>
537 <span class="displaynone">{{ _T('Remove criteria') }}</span>
538 </a>
539
540 </div>
541 </div>
542 </li>
543 {% endfor %}
544 </ul>
545 </div>
546 </div>
547 <div class="ui basic center aligned segment">
548 <button type="submit" class="ui labeled icon primary button action">
549 <i class="search icon" aria-hidden="true"></i>
550 {{ _T('Filter') }}
551 </button>
552 <input type="hidden" name="advanced_filtering" value="true" />
553 <button type="submit" name="clear_adv_filter" class="ui labeled icon button delete">
554 <i class="trash alt red icon" aria-hidden="true"></i>
555 {{ _T('Clear filter') }}
556 </button>
557 {% include "components/forms/csrf.html.twig" %}
558 </div>
559 </form>
560 {% endblock %}
561
562 {% block javascripts %}
563 <script type="text/javascript">
564 var _operators = {
565 op_equals: {
566 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") }},
567 name: "{{ _T('is') }}"
568 },
569 op_contains: {
570 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_CONTAINS") }},
571 name: "{{ _T('contains') }}"
572 },
573 op_not_equals: {
574 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_NOT_EQUALS") }},
575 name: "{{ _T('is not') }}"
576 },
577 op_not_contains: {
578 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_NOT_CONTAINS") }},
579 name: "{{ _T('do not contains') }}"
580 },
581 op_starts_with: {
582 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_STARTS_WITH") }},
583 name: "{{ _T('starts with') }}"
584 },
585 op_ends_with: {
586 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_ENDS_WITH") }},
587 name: "{{ _T('ends with') }}"
588 },
589 op_before: {
590 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_BEFORE") }},
591 name: "{{ _T('before') }}"
592 },
593 op_after: {
594 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_AFTER") }},
595 name: "{{ _T('after') }}"
596 },
597 };
598
599 var _fields = {
600 {% for key, field in search_fields %}
601 {% if key starts with 'date_' or key == 'ddn_adh' %}
602 {% set type = constant("Galette\\DynamicFields\\DynamicField::DATE") %}
603 {% elseif key == constant("Galette\\Entity\\Status::PK") %}
604 {% set type = constant("Galette\\DynamicFields\\DynamicField::CHOICE") %}
605 {% set fvalues = statuts %}
606 {% elseif key == 'sexe_adh' %}
607 {% set type = constant("Galette\\DynamicFields\\DynamicField::CHOICE") %}
608 {% set fvalues = {
609 (constant("Galette\\Entity\\Adherent::NC")): _T('Unspecified'),
610 (constant("Galette\\Entity\\Adherent::MAN")): _T('Man'),
611 (constant("Galette\\Entity\\Adherent::WOMAN")): _T('Woman')
612 } %}
613 {% else %}
614 {% set type = constant("Galette\\DynamicFields\\DynamicField::LINE") %}
615 {% endif %}
616 {{ key }}: { type:'{{ type }}'{% if fvalues is defined %}, values: {{ fvalues|json_encode|raw }}{% endif %} },
617 {% endfor %}
618 {% for field in adh_dynamics %}
619 {% if get_class(field) == "Galette\\DynamicFields\\Separator" %}
620 {# do nothing #}
621 {% elseif get_class(field) == "Galette\\DynamicFields\\Choice" %}
622 dyn_{{ field.getId() }}: { type:'{{ field.getType() }}', values: {{ field.getValues()|json_encode|raw }} },
623 {% else %}
624 dyn_{{ field.getId() }}: { type:'{{ field.getType() }}' },
625 {% endif %}
626 {% endfor %}
627 };
628
629 {% include "elements/js/calendar.js.twig" with {selector: '.fs-calendar'} %}
630
631 var _fs_dropdown = function(selector) {
632 if ( !selector ) {
633 selector = '.origselect';
634 }
635
636 $(selector).dropdown({
637 onChange: function(value, text, option) {
638 var _field = _fields[value];
639 var _type = _field.type;
640 var _html;
641 switch(_type) {
642 /* FIXME */
643 case '{{ constant('Galette\\DynamicFields\\DynamicField::BOOLEAN') }}':
644 _html = _getOperatorSelector(['op_equals']);
645 _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>';
646 break;
647 case '{{ constant('Galette\\DynamicFields\\DynamicField::CHOICE') }}':
648 _html = _getOperatorSelector(['op_equals', 'op_not_equals']);
649 var _options = '';
650 if (Array.isArray(_field.values)) {
651 for (var i = 0; i < _field.values.length; i++) {
652 _options += '<option value="' + i + '">' + _field.values[i] + '</option>';
653 }
654 } else {
655 for (key in _field.values) {
656 _options += '<option value="' + key + '">' + _field.values[key] + '</option>';
657 }
658 }
659 _html += '<select name="free_text[]" class="ui search dropdown origselect nochosen newselect">' + _options + '</select>';
660 break;
661 case '{{ constant('Galette\\DynamicFields\\DynamicField::DATE') }}':
662 _html = _getOperatorSelector(['op_equals', 'op_before', 'op_after']);
663 _html += '<div class="ui calendar fs-calendar">'
664 _html += '<div class="ui input left icon">'
665 _html += '<i class="calendar icon"></i>'
666 _html += '<input type="text" name="free_text[]" class="modif_date" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>';
667 _html += '</div>'
668 _html += '</div>'
669 break;
670 default:
671 _html = _getOperatorSelector(['op_equals', 'op_contains', 'op_not_equals', 'op_not_contains', 'op_starts_with', 'op_ends_with']);
672 _html += '<input type="text" name="free_text[]"/>';
673 break;
674
675 }
676 _html += '<input type="hidden" name="free_type[]" value="' + _type + '"/>';
677 option.parent().parent().parent().find('span.data').html(_html);
678 _calendarWidget('.fs-calendar');
679 _fs_dropdown('.newselect');
680 $('.newselect').removeClass('newselect');
681 }
682 });
683 }
684
685 var _newFilter = function(elt) {
686 elt.find('span.data').html('');
687 elt.find('.item.active.selected').removeClass('active').removeClass('selected');
688 }
689 var _rmFilter = function(elt) {
690 if ( !elt ) {
691 elt = $('li');
692 }
693 elt.find('.delcriteria').click(function(){
694 var _this = $(this);
695 if ( _this.parents('ul').find('li').length > 1 ) {
696 _this.parent('div').parent('.item').parent('li').remove();
697 } else {
698 _newFilter(_this.parent('div').parent('.item').parent('li'));
699 }
700 return false;
701 });
702 }
703 var _getOperatorSelector = function(list) {
704 var _options = '';
705 for (var i = 0; i < list.length; i++) {
706 var _operator = _operators[list[i]];
707 _options += '<option value="' + _operator.id + '">' + _operator.name + '</option>';
708 }
709 return '<select name="free_query_operator[]" class="free_operator ui search dropdown origselect nochosen newselect">' + _options + '</select>';
710 _fs_dropdown('.newselect');
711 $('.newselect').removeClass('newselect');
712 }
713
714 var _initSortable = function(){
715 var _freesearch = document.getElementById('fs_sortable');
716 var _groupsearch = document.getElementById('gs_sortable');
717
718 new Sortable(_freesearch, {
719 animation: 150,
720 ghostClass: 'yellow',
721 filter: '.filtered',
722 onUpdate: function (evt) {
723 var _item = evt.item;
724 _item.classList.add('yellow');
725 }
726 });
727
728 new Sortable(_groupsearch, {
729 animation: 150,
730 ghostClass: 'yellow',
731 filter: '.filtered',
732 onAdd: function (evt) {
733 var _item = evt.item;
734 _item.classList.add('yellow');
735 }
736 });
737 }
738
739 $(function(){
740 _initSortable();
741 _fs_dropdown();
742 _rmFilter();
743
744 $('#addbutton_g').click(function(){
745 $('#gs_sortable li:first')
746 .clone() // copy
747 .insertAfter('#gs_sortable li:last'); // where
748 _fs_dropdown();
749 _rmFilter();
750 return false;
751 });
752
753 $('#addbutton').click(function(){
754 $('#fs_sortable li:first')
755 .clone() // copy
756 .insertAfter('#fs_sortable li:last'); // where
757 _fs_dropdown();
758 _rmFilter();
759 return false;
760 });
761 });
762 </script>
763 {% endblock %}