]> git.agnieray.net Git - galette.git/blob - galette/templates/default/pages/advanced_search.html.twig
Forms accessibility improvements
[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" aria-hidden="true"></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 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 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 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 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" aria-hidden="true"></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" 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)') }}" />
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" 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)') }}"/>
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" 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)') }}"/>
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" 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)') }}"/>
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" 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)') }}"/>
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" 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)') }}"/>
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" 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)') }}"/>
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" 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)') }}"/>
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 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>
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" aria-hidden="true"></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" aria-hidden="true"></i>
223 <span class="visually-hidden">{{ _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 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" aria-hidden="true"></i>
239 </div>
240 <div>
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>
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" aria-hidden="true"></i>
253 <span class="visually-hidden">{{ _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" aria-hidden="true"></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" 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)') }}"/>
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" 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)') }}"/>
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" 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)') }}"/>
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" 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)') }}"/>
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" 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)') }}"/>
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" 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)') }}"/>
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" 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)') }}"/>
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" aria-hidden="true"></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" aria-hidden="true"></i>
427 <span class="visually-hidden">{{ _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" aria-hidden="true"></i>
437 </div>
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>
442 </select>
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>
447 <div class="menu">
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") %}
457 {% set fvalues = {
458 (constant("Galette\\Entity\\Adherent::NC")): _T('Unspecified'),
459 (constant("Galette\\Entity\\Adherent::MAN")): _T('Man'),
460 (constant("Galette\\Entity\\Adherent::WOMAN")): _T('Woman')
461 } %}
462 {% else %}
463 {% set type = constant("Galette\\DynamicFields\\DynamicField::LINE") %}
464 {% endif %}
465 {% endif %}
466 <div class="item{% if fs.field == key %} active selected{% endif %}" data-value="{{ key }}">{{ field.label }}</div>
467 {% endfor %}
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 %}
474 {% endif %}
475 {% endif %}
476 <div class="item{% if fs.field == rid %} active selected{% endif %}" data-value="dyn_{{ field.getId() }}">{{ field.getName() }}</div>
477 {% endfor %}
478 {% for type, label in adh_socials %}
479 {% set rid = "socials_" ~ type %}
480 {% if fs.field == rid %}
481 {% set cur_field = type %}
482 {% endif %}
483 <div class="item{% if fs.field == rid %} active selected{% endif %}" data-value="socials_{{ type }}">{{ label }}</div>
484 {% endfor %}
485 </div>
486 </div>
487 {# may not be defined #}
488 {# #}
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>
496 </select>
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>
501 {% endfor %}
502 {% else %}
503 {% for key, value in fvalues %}
504 <option value="{{ key }}"{% if key == fs.search %} selected="selected"{% endif %}>{{ value }}</option>
505 {% endfor %}
506 {% endif %}
507 </select>
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>
513 </select>
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>
519 </select>
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>
522 {% else %}
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>
530 </select>
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 %}/>
532 {% endif %}
533 </div>
534 <a
535 href="#"
536 class="ui small compact red icon button filtered fright tooltip delete delcriteria"
537 title="{{ _T('Remove criteria') }}"
538 >
539 <i class="trash alt icon" aria-hidden="true"></i>
540 <span class="visually-hidden">{{ _T('Remove criteria') }}</span>
541 </a>
542
543 </div>
544 </div>
545 </li>
546 {% endfor %}
547 </ul>
548 </div>
549 </div>
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>
553 {{ _T('Filter') }}
554 </button>
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') }}
559 </button>
560 {% include "components/forms/csrf.html.twig" %}
561 </div>
562 </form>
563 {% endblock %}
564
565 {% block javascripts %}
566 <script type="text/javascript">
567 var _operators = {
568 op_equals: {
569 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") }},
570 name: "{{ _T('is') }}"
571 },
572 op_contains: {
573 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_CONTAINS") }},
574 name: "{{ _T('contains') }}"
575 },
576 op_not_equals: {
577 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_NOT_EQUALS") }},
578 name: "{{ _T('is not') }}"
579 },
580 op_not_contains: {
581 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_NOT_CONTAINS") }},
582 name: "{{ _T('do not contains') }}"
583 },
584 op_starts_with: {
585 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_STARTS_WITH") }},
586 name: "{{ _T('starts with') }}"
587 },
588 op_ends_with: {
589 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_ENDS_WITH") }},
590 name: "{{ _T('ends with') }}"
591 },
592 op_before: {
593 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_BEFORE") }},
594 name: "{{ _T('before') }}"
595 },
596 op_after: {
597 id: {{ constant("Galette\\Filters\\AdvancedMembersList::OP_AFTER") }},
598 name: "{{ _T('after') }}"
599 },
600 };
601
602 var _fields = {
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") %}
611 {% set fvalues = {
612 (constant("Galette\\Entity\\Adherent::NC")): _T('Unspecified'),
613 (constant("Galette\\Entity\\Adherent::MAN")): _T('Man'),
614 (constant("Galette\\Entity\\Adherent::WOMAN")): _T('Woman')
615 } %}
616 {% else %}
617 {% set type = constant("Galette\\DynamicFields\\DynamicField::LINE") %}
618 {% endif %}
619 {{ key }}: { type:'{{ type }}'{% if fvalues is defined %}, values: {{ fvalues|json_encode|raw }}{% endif %} },
620 {% endfor %}
621 {% for field in adh_dynamics %}
622 {% if get_class(field) == "Galette\\DynamicFields\\Separator" %}
623 {# do nothing #}
624 {% elseif get_class(field) == "Galette\\DynamicFields\\Choice" %}
625 dyn_{{ field.getId() }}: { type:'{{ field.getType() }}', values: {{ field.getValues()|json_encode|raw }} },
626 {% else %}
627 dyn_{{ field.getId() }}: { type:'{{ field.getType() }}' },
628 {% endif %}
629 {% endfor %}
630 };
631
632 {% include "elements/js/calendar.js.twig" with {selector: '.fs-calendar'} %}
633
634 var _fs_dropdown = function(selector) {
635 if ( !selector ) {
636 selector = '.origselect';
637 }
638
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');
646
647 var _field = _fields[value];
648 var _type = _field.type;
649 var _html;
650 switch(_type) {
651 /* FIXME */
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>';
655 break;
656 case '{{ constant('Galette\\DynamicFields\\DynamicField::CHOICE') }}':
657 _html = _getOperatorSelector(['op_equals', 'op_not_equals']);
658 var _options = '';
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>';
662 }
663 } else {
664 for (key in _field.values) {
665 _options += '<option value="' + key + '">' + _field.values[key] + '</option>';
666 }
667 }
668 _html += '<select name="free_text[]" class="ui search selection dropdown nochosen">' + _options + '</select>';
669 break;
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)') }}"/>';
676 _html += '</div>'
677 _html += '</div>'
678 break;
679 default:
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[]"/>';
682 break;
683
684 }
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');
690 }
691 });
692 }
693
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") }}');
699 }
700 var _rmFilter = function(elt) {
701 if ( !elt ) {
702 elt = $('li');
703 }
704 elt.find('.delcriteria').click(function(){
705 var _this = $(this);
706 if ( _this.parents('ul').find('li').length > 1 ) {
707 _this.parent('div').parent('.item').parent('li').remove();
708 } else {
709 _newFilter(_this.parent('div').parent('.item').parent('li'));
710 }
711 return false;
712 });
713 }
714 var _getOperatorSelector = function(list) {
715 var _options = '';
716 for (var i = 0; i < list.length; i++) {
717 var _operator = _operators[list[i]];
718 _options += '<option value="' + _operator.id + '">' + _operator.name + '</option>';
719 }
720 return '<select name="free_query_operator[]" class="free_operator ui selection dropdown nochosen">' + _options + '</select>';
721 }
722
723 var _initSortable = function(){
724 var _freesearch = document.getElementById('fs_sortable');
725 var _groupsearch = document.getElementById('gs_sortable');
726
727 new Sortable(_freesearch, {
728 animation: 150,
729 ghostClass: 'yellow',
730 filter: '.filtered',
731 onUpdate: function (evt) {
732 var _item = evt.item;
733 _item.classList.add('yellow');
734 }
735 });
736
737 new Sortable(_groupsearch, {
738 animation: 150,
739 ghostClass: 'yellow',
740 filter: '.filtered',
741 onAdd: function (evt) {
742 var _item = evt.item;
743 _item.classList.add('yellow');
744 }
745 });
746 }
747
748 $(function(){
749 _initSortable();
750 _fs_dropdown();
751 _rmFilter();
752
753 $('#addbutton_g').click(function(){
754 $('#gs_sortable li:first')
755 .clone() // copy
756 .insertAfter('#gs_sortable li:last'); // where
757 $('#gs_sortable li:last .ui.dropdown').dropdown('refresh');
758 _fs_dropdown();
759 _rmFilter();
760 return false;
761 });
762
763 $('#addbutton').click(function(){
764 $('#fs_sortable li:first')
765 .clone() // copy
766 .insertAfter('#fs_sortable li:last'); // where
767 $('#fs_sortable li:last .ui.dropdown:not(.origselect)').dropdown('refresh');
768 _fs_dropdown();
769 _rmFilter();
770 return false;
771 });
772 });
773 </script>
774 {% endblock %}