]> git.agnieray.net Git - galette.git/blob - galette/templates/default/pages/member_form.html.twig
Fix groups selection widget on member form
[galette.git] / galette / templates / default / pages / member_form.html.twig
1 {% extends parent_tpl %}
2
3 {% block content %}
4 <form action="{% if self_adh %}{{ url_for("storeselfmembers") }}{% elseif not member.id %}{{ url_for("doAddMember") }}{% else %}{{ url_for("doEditMember", {"id": member.id}) }}{% endif %}" method="post" enctype="multipart/form-data" id="form" class="ui form{% if member.id %} edit-member{% endif %}">
5 {% if member.id or not self_adh and members.list is defined and members.list|length > 0 %}
6 <div class="ui stackable grid">
7 <div class="row">
8 <div class="sixteen wide tablet six wide computer five wide widescreen column order-2">
9 <div class="position-sticky">
10 {% if member.id %}
11 <div class="ui basic clearing horizontally fitted segment">
12
13 <div class="ui left floated basic fitted segment">
14 {% include "elements/navigate.html.twig" with {"mpath": "editMember"} %}
15 </div>
16
17 <div class="ui right floated basic fitted segment">
18 <div class="ui small spaced buttons">
19 {% if member.id %}
20 <button type="submit" name="valid" class="action ui labeled icon primary button">
21 <i class="save icon" aria-hidden="true"></i> {{ _T("Save") }}
22 </button>
23 {% endif %}
24 <a
25 href="{{ url_for("member", {"id": member.id}) }}"
26 class="ui basic labeled icon button"
27 >
28 <i class="eye outline icon" aria-hidden="true"></i>
29 {{ _T("Display") }}
30 </a>
31 </div>
32 </div>
33 </div>
34 {% include "elements/member_card.html.twig" %}
35 {% endif %}
36 {% endif %}
37
38 {% if not self_adh and members.list is defined and members.list|length > 0 %}
39 <div class="ui basic horizontally fitted segment">
40 <div class="ui segment">
41 {% if member.hasParent() and not member.isDuplicate() %}
42 <div class="field">
43 <div class="ui label">
44 <i class="linkify icon" aria-hidden="true"></i>
45 {{ _T("Attached to:") }}
46 </div>
47 <div class="ui celled list">
48 <a href="{{ url_for("member", {"id": member.parent.id}) }}" class="item">{{ member.parent.sfullname }}</a>
49 </div>
50 {% if not member.id %}
51 <input type="hidden" name="parent_id" value="{{ member.parent.id }}"/>
52 {% endif %}
53 </div>
54 {% if login.isAdmin() or login.isStaff() and (addchild is not defined or not addchild) %}
55 <div class="field">
56 <div class="ui toggle checkbox">
57 <input type="checkbox" name="detach_parent" id="detach_parent" value="1"/>
58 <label for="detach_parent">{{ _T("Detach?") }}</label>
59 </div>
60 </div>
61 {% endif %}
62 {% elseif (login.isAdmin() or login.isStaff()) and not member.hasChildren() %}
63 <div class="field">
64 <div id="attach-checkbox" class="ui{% if member.isDuplicate() %} checked{% endif %} toggle checkbox">
65 <input type="checkbox" name="attach" id="attach" value="1"{% if member.isDuplicate() %} checked="checked"{% endif %}/>
66 <label for="attach"><i class="linkify icon" aria-hidden="true"></i> {{ _T("Attach member") }}</label>
67 </div>
68 </div>
69 <span id="parent_id_elt" class="">
70 <div id="parent_id" class="jsonly search-dropdown ui input paginated">
71 <input id="parent_id_input" type="text" name="parent_id" value="{{ member.isDuplicate() and member.parent is defined and member.parent is not null ? member.parent.id }}" placeholder="{{ _T("Member ID") }}">
72 <i class="jsonly displaynone dropdown icon" aria-hidden="true"></i>
73 <span class="ui mini compact icon disabled button prev-results"><i class="jsonly displaynone chevron circle left icon disabled button tooltip" title="{{ _T("Load previous members...") }}" aria-hidden="true"></i></span>
74 <span class="ui mini compact icon disabled button next-results"><i class="jsonly displaynone chevron circle right icon disabled button tooltip" title="{{ _T("Load following members...") }}" aria-hidden="true"></i></span>
75 <div class="jsonly displaynone default text">{{ _T("Search for name or ID and pick member") }}</div>
76 <div class="jsonly displaynone menu">
77 {% for k, v in members.list %}
78 <div class="item" data-value="{{ k }}">{{ v }}</div>
79 {% endfor %}
80 </div>
81 </div>
82 </span>
83 {% if member.isDuplicate() %}
84 <input type="hidden" name="duplicate" value="1" />
85 {% endif %}
86 {% elseif member.hasChildren() %}
87 <div class="field">
88 <div class="ui label">
89 <i class="linkify icon" aria-hidden="true"></i>
90 {{ _T("Parent of:") }}
91 </div>
92 <div class="ui celled list">
93 {% for child in member.children %}
94 <a href="{{ url_for("member", {"id": child.id}) }}" class="item">{{ child.sfullname }}</a>
95 {% endfor %}
96 </div>
97 </div>
98 {% endif %}
99 </div>
100 </div>
101 {% endif %}
102
103 {% if member.id or not self_adh and members.list is defined and members.list|length > 0 %}
104 </div>
105 </div>
106 <div class="sixteen wide tablet ten wide computer eleven wide widescreen column">
107 {% endif %}
108 {# Main form entries #}
109 {% include "components/form.html.twig" %}
110
111 {# Dynamic entries #}
112 {% include "components/dynamic_fields.html.twig" with {object: member} %}
113
114 {% if not member.id and not self_adh %}
115 {% if login.isAdmin() or login.isStaff() %}
116 <div class="ui center aligned yellow segment">
117 <div class="inline field">
118 <label for="redirect_on_create">{{ _T("After member creation:") }}</label>
119 <select name="redirect_on_create" id="redirect_on_create"i class="ui search dropdown">
120 <option value="{{ constant('Galette\\Entity\\Adherent::AFTER_ADD_DEFAULT') }}"{% if preferences.pref_redirect_on_create == constant('Galette\\Entity\\Adherent::AFTER_ADD_DEFAULT') %} selected="selected"{% endif %}>{{ _T("create a new contribution (default action)") }}</option>
121 <option value="{{ constant('Galette\\Entity\\Adherent::AFTER_ADD_TRANS') }}"{% if preferences.pref_redirect_on_create == constant('Galette\\Entity\\Adherent::AFTER_ADD_TRANS') %} selected="selected"{% endif %}>{{ _T("create a new transaction") }}</option>
122 <option value="{{ constant('Galette\\Entity\\Adherent::AFTER_ADD_NEW') }}"{% if preferences.pref_redirect_on_create == constant('Galette\\Entity\\Adherent::AFTER_ADD_NEW') %} selected="selected"{% endif %}>{{ _T("create another new member") }}</option>
123 <option value="{{ constant('Galette\\Entity\\Adherent::AFTER_ADD_SHOW') }}"{% if preferences.pref_redirect_on_create == constant('Galette\\Entity\\Adherent::AFTER_ADD_SHOW') %} selected="selected"{% endif %}>{{ _T("show member") }}</option>
124 <option value="{{ constant('Galette\\Entity\\Adherent::AFTER_ADD_LIST') }}"{% if preferences.pref_redirect_on_create == constant('Galette\\Entity\\Adherent::AFTER_ADD_LIST') %} selected="selected"{% endif %}>{{ _T("go to members list") }}</option>
125 <option value="{{ constant('Galette\\Entity\\Adherent::AFTER_ADD_HOME') }}"{% if preferences.pref_redirect_on_create == constant('Galette\\Entity\\Adherent::AFTER_ADD_HOME') %} selected="selected"{% endif %}>{{ _T("go to main page") }}</option>
126 </select>
127 </div>
128 </div>
129 {% else %}
130 <input type="hidden" name="redirect_on_create" value="{{ constant('Galette\\Entity\\Adherent::AFTER_ADD_SHOW') }}"/>
131 {% endif %}
132 {% if addchild is defined and addchild %}
133 <input type="hidden" name="addchild" value="true"/>
134 {% endif %}
135 {% endif %}
136 {% if preferences.pref_mail_method != constant('Galette\\Core\\GaletteMail::METHOD_DISABLED') and (not self_adh and (login.isAdmin() or login.isStaff())) %}
137 <div class="ui center aligned yellow segment">
138 <div class="inline field">
139 <div class="ui toggle checkbox">
140 <input type="checkbox" name="mail_confirm" id="mail_confirm" value="1"{% if preferences.pref_bool_mailowner or member.sendEMail() %} checked="checked"{% endif %}/>
141 <label for="mail_confirm">
142 {% if member.id %}
143 {{ _T("Notify member his account has been modified") }}
144 {% else %}
145 {{ _T("Notify member his account has been created") }}
146 {% endif %}
147 </label>
148 <br/>
149 <span class="exemple">
150 {% if member.id %}
151 {{ _T("Member will be notified by email his account has been modified.") }}
152 {% else %}
153 {{ _T("Member will receive his username and password by email, if he has an address.") }}
154 {% endif %}
155 </span>
156 </div>
157 </div>
158 </div>
159 {% endif %}
160 <div class="ui basic center aligned fitted segment">
161 <button type="submit" name="valid" class="action ui labeled icon primary button">
162 <i class="save icon" aria-hidden="true"></i> {{ _T("Save") }}
163 </button>
164 {% for entry in hidden_elements %}
165 {% if entry.field_id != 'mdp_adh' %}
166 {% set title = null %}
167 {% set tip = null %}
168 {% set size = null %}
169 {% set propname = entry.propname %}
170 {% if entry.field_id == 'activite_adh' %}
171 {% set value = member.isActive() %}
172 {% else %}
173 {% set value = attribute(member, propname) %}
174 {% endif %}
175 {% set checked = null %}
176 {% set example = null %}
177
178 {% if value != '' and entry.field_id != 'parent_id' %}
179 {% include "components/forms/hidden.html.twig" with {
180 name: entry.field_id,
181 id: entry.field_id,
182 value: value
183 } %}
184 {% endif %}
185 {% endif %}
186 {% endfor %}
187 {% include "components/forms/csrf.html.twig" %}
188 </div>
189
190 {% if member.id or not self_adh and members.list is defined and members.list|length > 0 %}
191 </div>
192 </div>
193 </div>
194 {% endif %}
195 </form>
196 {% endblock %}
197
198 {% block javascripts %}
199 <script type="text/javascript">
200 {% include "elements/js/choose_adh.js.twig" with {"js_chosen_id": "#parent_id"} %}
201 {% include "elements/js/choose_social.js.twig" %}
202
203 $(function() {
204 $('#company_field.nocompany').addClass('displaynone');
205 $('#is_company').change(function(){
206 $('#company_field').toggleClass('displaynone');
207 });
208
209 {% if not self_adh %}
210 {# Groups popup #}
211 $('#btngroups, #btnmanagedgroups').click(function(){
212 var _managed = false;
213 if ( $(this).attr('id') == 'btnmanagedgroups' ) {
214 _managed = true;
215 }
216 var _groups = [];
217 var _form = (_managed) ? 'managed' : 'user';
218 $('#' + _form + 'groups_form input').each(function(){
219 _group = $(this).val().split('|');
220 _groups[_groups.length] = {
221 id: _group[0],
222 name: _group[1]
223 };
224 });
225 $.ajax({
226 url: '{{ url_for("ajax_groups") }}',
227 type: "POST",
228 data: {
229 ajax: true,
230 groups: _groups,
231 managed: _managed
232 },
233 {% include "elements/js/loader.js.twig" with {
234 selector: '#groups_field'
235 } %},
236 success: function(res){
237 _groups_dialog(res, _groups, _managed);
238 },
239 error: function() {
240 {% include "elements/js/modal.js.twig" with {
241 modal_title_twig: _T("An error occurred displaying groups interface :(")|e("js"),
242 modal_without_content: true,
243 modal_class: "mini",
244 modal_deny_only: true,
245 modal_cancel_text: _T("Close")|e("js"),
246 modal_classname: "redalert",
247 } %}
248 }
249 });
250 return false;
251 });
252
253 var _groups_dialog = function(res, _groups, _managed){
254 var _title = '{{ _T("Groups selection")|e('js') }}';
255 if ( _managed ) {
256 _title = '{{ _T("Managed groups selection")|e('js') }}';
257 }
258 {% include "elements/js/modal.js.twig" with {
259 modal_title: "_title",
260 modal_content: "res",
261 modal_class: "groups-selection fullscreen",
262 modal_content_class: "scrolling",
263 modal_deny_only: true,
264 modal_cancel_text: _T("Close")|e("js")
265 } %}
266 _groups_ajax_mapper(res, _groups, _managed);
267 }
268
269 var _groups_ajax_mapper = function(res, _groups, _managed){
270 $('#btnvalid').click(function(){
271 //remove actual groups
272 var _form = (_managed) ? 'managed' : 'user';
273 $('#' + _form + 'groups_form').empty();
274 var _existing_labels = $('#groups_field .labels').children().length;
275 var _new_labels = 0;
276 if ($('#groups_field .labels').length === 0) {
277 var _labels_container = '<div class="ui large labels"></div>';
278 $('#btngroups').before(_labels_container);
279 } else {
280 if (_managed) {
281 $('#groups_field .labels').find('.label.manager').remove();
282 } else {
283 $('#groups_field .labels').find('.label.member').remove();
284 }
285 }
286 var _groups = new Array();
287 var _groups_str = '';
288
289 $('li[id^="group_"]').each(function(){
290 //get group values
291 _gid = this.id.substring(6, this.id.length);
292 _gname = $(this).text();
293 _groups[_groups.length] = this.id.substring(6, this.id.length);
294 var _iname = (_managed) ? 'groups_managed_adh' : 'groups_adh';
295 $('#' + _form + 'groups_form').append(
296 '<input type="hidden" value="' +
297 _gid + '|' + _gname + '|' +
298 '" name="' + _iname + '[]">'
299 );
300 if (_managed) {
301 _groups_str += '<span class="ui orange basic label manager">';
302 _groups_str += '<i class="ui shield icon tooltip" title="' + '{{ _T("Group manager")|e('js') }}' + '" aria-hidden="true"></i>';
303 } else {
304 _groups_str += '<span class="ui orange basic label member">';
305 _groups_str += '<i class="ui tag icon tooltip" title="' + '{{ _T("Member of group")|e('js') }}' + '" aria-hidden="true"></i>';
306 }
307 _groups_str += _gname;
308 _groups_str += '</span>';
309 _new_labels += 1;
310 });
311 $('#groups_field .labels').append(_groups_str);
312 var _modified = '<div class="ui yellow tiny message with-transition">{{ _T("Items in this list have been modified. Don't forget to save your changes.")|e('js') }}</div>';
313 if (_existing_labels != _new_labels) {
314 $('#groups_field').find('.message').remove();
315 $('#groups_field').append(_modified);
316 }
317 $('.message.with-transition').transition('flash');
318 $('.groups-selection').modal('hide');
319 });
320
321 //Remap links
322 var _none = $('#none_selected').clone();
323 $('li input[type=checkbox]').click(function(e){
324 e.stopPropagation();
325 });
326 $('li[id^="group_"]').click(function(){
327 $(this).remove();
328 if ( $('#selected_groups ul li').length == 0 ) {
329 $('#selected_groups ul').append(_none);
330 }
331 });
332
333 //Select a row
334 $('#listing tbody tr').click(function(event){
335 event.preventDefault();
336 var _glink = $(this).find('.username_row a');
337 var _gid = _glink[0].href.match(/.*\/(\d+)$/)[1];
338 var _gname = _glink.text();
339 $('#none_selected').remove()
340 if ( $('#group_' + _gid).length == 0 ) {
341 var _li = '<li id="group_' + _gid + '" class="item">'
342 + '<i class="icons" aria-hidden="true"><i class="users icon"><i class="top right corner minus icon"></i></i></i>'
343 + '<span class="ui content">' + _gname + '</span></li>';
344 $('#selected_groups ul').append(_li);
345 $('#group_' + _gid).click(function(){
346 $(this).remove();
347 if ( $('#selected_groups ul li').length == 0 ) {
348 $('#selected_groups ul').append(_none);
349 }
350 });
351 }
352 return false;
353 }).css('cursor', 'pointer').attr('title', '{{ _T("Click on a row to select a group")|e('js') }}');
354 }
355
356 {% if not self_adh and not member.hasChildren() %}
357 {# Parent selection #}
358 {% if not member.isDuplicate() %}
359 $('#parent_id_elt').addClass('displaynone');
360 {% endif %}
361 $('#attach-checkbox').checkbox({
362 onChecked: function() {
363 $('#parent_id_elt').removeClass('displaynone');
364 },
365 onUnchecked: function() {
366 $('#parent_id_elt').addClass('displaynone');
367 }
368 });
369 {% endif %}
370
371 {% if not self_adh %}
372 {% if parent_fields|length > 0 %}
373 $('#detach_parent').on('change', function(){
374 var _checked = $(this).is(':checked');
375 var _changes = '';
376 {% for req in parent_fields %}
377 _changes += '#{{ req }}';
378 {% if not loop.last %}
379 _changes += ',';
380 {% endif %}
381 {% endfor %}
382 if (_checked) {
383 $(_changes).attr('required', 'required');
384 } else {
385 $(_changes).removeAttr('required');
386 }
387 });
388
389 $('#parent_id').on('change', function(){
390 var _hasParent = $(this).attr('value') != '';
391 var _changes = '';
392 {% for req in parent_fields %}
393 _changes += '#{{ req }}';
394 {% if not loop.last %}
395 _changes += ',';
396 {% endif %}
397 {% endfor %}
398 if (_hasParent) {
399 $(_changes).removeAttr('required');
400 } else {
401 $(_changes).attr('required', 'required');
402 }
403 });
404 {% endif %}
405 {% endif %}
406
407 $('#ddn_adh').on('blur', function() {
408 var _bdate = $(this).val();
409 if ('{{ _T("Y-m-d") }}' === 'Y-m-d') {
410 _bdate = new Date(_bdate);
411 } else {
412 //try for dd/mm/yyyy
413 var _dparts = _bdate.split("/");
414 _bdate = new Date(_dparts[2], _dparts[1] - 1, _dparts[0]);
415 }
416
417 if (! isNaN(_bdate.getTime())) {
418 var _today = new Date();
419 var _age = Math.floor((_today-_bdate) / (365.25 * 24 * 60 * 60 * 1000));
420 $('#member_age').html('{{ _T(" (%age years old)") }}'.replace(/%age/, _age))
421 } else {
422 $('#member_age').html('');
423 }
424 });
425
426 {% if preferences.pref_force_picture_ratio == 1 %}
427 // Show photo cropping preferences on file selection
428 let _photo_new = document.getElementById('photo_new');
429 _photo_new.addEventListener('change', function () {
430 if (_photo_new.files.length > 0) {
431 let _crop_focus = document.getElementById('crop_focus_field');
432 _crop_focus.classList.remove('displaynone');
433 $('#crop_focus_field').transition('glow');
434 return;
435 }
436 });
437 {% endif %}
438 {% endif %}
439 });
440 </script>
441 {% endblock %}