]> git.agnieray.net Git - galette.git/blobdiff - 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
index 280770b6f348d402a4ed3d8048bdfef7647ca781..cbd0e0bc4bceedb9e14bd64a5859edc800599187 100644 (file)
 {% extends parent_tpl %}
 
 {% block content %}
-    {% if member.id %}
-        {% include "elements/navigate.html.twig" with {"mpath": "editMember"} %}
-        {% include "elements/member_card.html.twig" %}
+<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 %}">
+    {% if member.id or not self_adh and members.list is defined and members.list|length > 0 %}
+<div class="ui stackable grid">
+    <div class="row">
+        <div class="sixteen wide tablet six wide computer five wide widescreen column order-2">
+            <div class="position-sticky">
+        {% if member.id %}
+                <div class="ui basic clearing horizontally fitted segment">
+
+                    <div class="ui left floated basic fitted segment">
+                        {% include "elements/navigate.html.twig" with {"mpath": "editMember"} %}
+                    </div>
+
+                    <div class="ui right floated basic fitted segment">
+                        <div class="ui small spaced buttons">
+                    {% if member.id %}
+                            <button type="submit" name="valid" class="action ui labeled icon primary button">
+                                <i class="save icon" aria-hidden="true"></i> {{ _T("Save") }}
+                            </button>
+                    {% endif %}
+                            <a
+                                href="{{ url_for("member", {"id": member.id}) }}"
+                                class="ui basic labeled icon button"
+                            >
+                                <i class="eye outline icon" aria-hidden="true"></i>
+                                {{ _T("Display") }}
+                            </a>
+                        </div>
+                    </div>
+                </div>
+                {% include "elements/member_card.html.twig" %}
+        {% endif %}
     {% endif %}
 
-    <form action="{% if self_adh %}{{ path_for("storeselfmembers") }}{% elseif not member.id %}{{ path_for("doAddMember") }}{% else %}{{ path_for("doEditMember", {"id": member.id}) }}{% endif %}" method="post" enctype="multipart/form-data" id="form" class="ui form">
-    {% if not self_adh %}
-            <div class="ui compact segment">
+    {% if not self_adh and members.list is defined and members.list|length > 0 %}
+                <div class="ui basic horizontally fitted segment">
+                    <div class="ui segment">
         {% if member.hasParent() and not member.isDuplicate() %}
-                <div class="inline field">
-                    <span class="ui primary ribbon label">{{ _T("Attached to:") }}</span>
-                    <a href="{{ path_for("member", {"id": member.parent.id}) }}" class="ui label">{{ member.parent.sfullname }}</a>
+                        <div class="field">
+                            <div class="ui label">
+                                <i class="linkify icon" aria-hidden="true"></i>
+                                {{ _T("Attached to:") }}
+                            </div>
+                            <div class="ui celled list">
+                                <a href="{{ url_for("member", {"id": member.parent.id}) }}" class="item">{{ member.parent.sfullname }}</a>
+                            </div>
             {% if not member.id %}
-                    <input type="hidden" name="parent_id" value="{{ member.parent.id }}"/>
+                            <input type="hidden" name="parent_id" value="{{ member.parent.id }}"/>
             {% endif %}
-                </div>
+                        </div>
             {% if login.isAdmin() or login.isStaff() and (addchild is not defined or not addchild) %}
-                <div class="inline field">
-                    <div class="ui toggle checkbox">
-                        <input type="checkbox" name="detach_parent" id="detach_parent" value="1"/>
-                        <label for="detach_parent">{{ _T("Detach?") }}</label>
-                    </div>
-                </div>
+                        <div class="field">
+                            <div class="ui toggle checkbox">
+                                <input type="checkbox" name="detach_parent" id="detach_parent" value="1"/>
+                                <label for="detach_parent">{{ _T("Detach?") }}</label>
+                            </div>
+                        </div>
             {% endif %}
-        {% elseif (login.isAdmin() or login.isStaff()) and not member.hasChildren() and members.list is defined %}
-            <input type="checkbox" name="attach" id="attach" value="1"{% if member.isDuplicate() %} checked="checked"{% endif %}/>
-            <label for="attach"><i class="linkify icon"></i> {{ _T("Attach member") }}</label>
-            <span id="parent_id_elt" class="sr-only">
-                <select name="parent_id" id="parent_id" class="nochosen">
-                    <option value="">{{ _T("-- select a name --") }}</option>
-                    {% for k, v in members.list %}
-                        <option value="{{ k }}"{% if member.isDuplicate() and member.parent is defined and member.parent.id == k %} selected="selected"{% endif %}>{{ v }}</option>
-                    {% endfor %}
-                </select>
-            </span>
+        {% elseif (login.isAdmin() or login.isStaff()) and not member.hasChildren() %}
+                        <div class="field">
+                            <div id="attach-checkbox" class="ui{% if member.isDuplicate() %} checked{% endif %} toggle checkbox">
+                                <input type="checkbox" name="attach" id="attach" value="1"{% if member.isDuplicate() %} checked="checked"{% endif %}/>
+                                <label for="attach"><i class="linkify icon" aria-hidden="true"></i> {{ _T("Attach member") }}</label>
+                            </div>
+                        </div>
+                        <span id="parent_id_elt" class="">
+                            <div id="parent_id" class="jsonly search-dropdown ui input paginated">
+                                <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") }}">
+                                <i class="jsonly displaynone dropdown icon" aria-hidden="true"></i>
+                                <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>
+                                <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>
+                                <div class="jsonly displaynone default text">{{ _T("Search for name or ID and pick member") }}</div>
+                                <div class="jsonly displaynone menu">
+            {% for k, v in members.list %}
+                                    <div class="item" data-value="{{ k }}">{{ v }}</div>
+            {% endfor %}
+                                </div>
+                            </div>
+                        </span>
             {% if member.isDuplicate() %}
-                <input type="hidden" name="duplicate" value="1" />
+                        <input type="hidden" name="duplicate" value="1" />
             {% endif %}
         {% elseif member.hasChildren() %}
-                <div class="inline field">
-                    <span class="ui primary ribbon label">{{ _T("Parent of:") }}</span>
+                        <div class="field">
+                            <div class="ui label">
+                                <i class="linkify icon" aria-hidden="true"></i>
+                                {{ _T("Parent of:") }}
+                            </div>
+                            <div class="ui celled list">
             {% for child in member.children %}
-                    <a href="{{ path_for("member", {"id": child.id}) }}" class="ui label">{{ child.sfullname }}</a>{% if not loop.last %}, {% endif %}
+                                <a href="{{ url_for("member", {"id": child.id}) }}" class="item">{{ child.sfullname }}</a>
             {% endfor %}
-                </div>
+                            </div>
+                        </div>
         {% endif %}
+                    </div>
+                </div>
+    {% endif %}
+
+    {% if member.id or not self_adh and members.list is defined and members.list|length > 0 %}
             </div>
+        </div>
+        <div class="sixteen wide tablet ten wide computer eleven wide widescreen column">
     {% endif %}
             {# Main form entries #}
             {% include "components/form.html.twig" %}
+
             {# Dynamic entries #}
             {% include "components/dynamic_fields.html.twig" with {object: member} %}
-            {% include "elements/edit_socials.html.twig" with {socials: member.socials, social_fieldset_class: "galette_form", social_fieldset_legend_class: "ui-state-active ui-corner-top"} %}
 
     {% if not member.id and not self_adh %}
         {% if login.isAdmin() or login.isStaff() %}
             <div class="ui center aligned yellow segment">
                 <div class="inline field">
                     <label for="redirect_on_create">{{ _T("After member creation:") }}</label>
-                    <select name="redirect_on_create" id="redirect_on_create"i class="ui search dropdown nochosen">
+                    <select name="redirect_on_create" id="redirect_on_create"i class="ui search dropdown">
                         <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>
                         <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>
                         <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>
                 </div>
             </div>
         {% else %}
-            <input type="hidden" name="redirect_on_create" value="{constant('Galette\\Entity\\Adherent::AFTER_ADD_SHOW')}"/>
+            <input type="hidden" name="redirect_on_create" value="{{ constant('Galette\\Entity\\Adherent::AFTER_ADD_SHOW') }}"/>
         {% endif %}
         {% if addchild is defined and addchild %}
             <input type="hidden" name="addchild" value="true"/>
         {% endif %}
     {% endif %}
-        {% if preferences.pref_mail_method != constant('Galette\\Core\\GaletteMail::METHOD_DISABLED') and (not self_adh and (login.isAdmin() or login.isStaff())) %}
+    {% if preferences.pref_mail_method != constant('Galette\\Core\\GaletteMail::METHOD_DISABLED') and (not self_adh and (login.isAdmin() or login.isStaff())) %}
             <div class="ui center aligned yellow segment">
                 <div class="inline field">
                     <div class="ui toggle checkbox">
-                        <input type="checkbox" name="mail_confirm" id="mail_confirm" value="1" {# if isset($smarty.post.mail_confirm) and $smarty.post.mail_confirm != ""}checked="checked"{/if#}/>
+                        <input type="checkbox" name="mail_confirm" id="mail_confirm" value="1"{% if preferences.pref_bool_mailowner or member.sendEMail() %} checked="checked"{% endif %}/>
                         <label for="mail_confirm">
-            {% if member.id %}
+        {% if member.id %}
                             {{ _T("Notify member his account has been modified") }}
-            {% else %}
+        {% else %}
                             {{ _T("Notify member his account has been created") }}
-            {% endif %}
+        {% endif %}
                         </label>
                         <br/>
                         <span class="exemple">
-            {% if member.id %}
+        {% if member.id %}
                             {{ _T("Member will be notified by email his account has been modified.") }}
-            {% else %}
+        {% else %}
                             {{ _T("Member will receive his username and password by email, if he has an address.") }}
-            {% endif %}
+        {% endif %}
                         </span>
                     </div>
                 </div>
             </div>
-        {% endif %}
+    {% endif %}
             <div class="ui basic center aligned fitted segment">
                 <button type="submit" name="valid" class="action ui labeled icon primary button">
-                    <i class="save icon"></i> {{ _T("Save") }}
+                    <i class="save icon" aria-hidden="true"></i> {{ _T("Save") }}
                 </button>
             {% for entry in hidden_elements %}
                 {% if entry.field_id != 'mdp_adh' %}
             {% endfor %}
             {% include "components/forms/csrf.html.twig" %}
             </div>
-        </form>
+
+    {% if member.id or not self_adh and members.list is defined and members.list|length > 0 %}
+        </div>
+    </div>
+</div>
+    {% endif %}
+</form>
 {% endblock %}
 
 {% block javascripts %}
         <script type="text/javascript">
             {% include "elements/js/choose_adh.js.twig" with {"js_chosen_id": "#parent_id"} %}
+            {% include "elements/js/choose_social.js.twig" %}
+
             $(function() {
+                $('#company_field.nocompany').addClass('displaynone');
                 $('#is_company').change(function(){
-                    $('#company_field').toggleClass('hidden');
-                    $('#company_field').backgroundFade(
-                        {
-                            sColor:'#ffffff',
-                            eColor:'#DDDDFF',
-                            steps:10
-                        },
-                        function() {
-                            $(this).backgroundFade(
-                                {
-                                    sColor:'#DDDDFF',
-                                    eColor:'#ffffff'
-                                }
-                            );
-                        });
+                    $('#company_field').toggleClass('displaynone');
                 });
 
-                /*$('#ddn_adh').datepicker({
-                    changeMonth: true,
-                    changeYear: true,
-                    showOn: 'button',
-                    maxDate: '-0d',
-                    yearRange: '-200:+0',
-                    buttonText: '<i class="ui calendar alt icon"></i> <span class="sr-only">{{ _T("Select a date")|e('js') }}</span>'
-                });
-                $('#date_crea_adh').datepicker({
-                    changeMonth: true,
-                    changeYear: true,
-                    showOn: 'button',
-                    maxDate: '-0d',
-                    yearRange: 'c-10:c+0',
-                    buttonText: '<i class="ui calendar alt icon"></i> <span class="sr-only">{{ _T("Select a date")|e('js') }}</span>'
-                });*/
-
 {% if not self_adh %}
                 {# Groups popup #}
                 $('#btngroups, #btnmanagedgroups').click(function(){
                         };
                     });
                     $.ajax({
-                        url: '{{ path_for("ajax_groups") }}',
+                        url: '{{ url_for("ajax_groups") }}',
                         type: "POST",
                         data: {
                             ajax: true,
                             groups: _groups,
                             managed: _managed
                         },
-                        {% include "elements/js/loader.js.twig" %},
+                        {% include "elements/js/loader.js.twig" with {
+                            selector: '#groups_field'
+                        } %},
                         success: function(res){
                             _groups_dialog(res, _groups, _managed);
                         },
                         error: function() {
-                            alert("{{ _T("An error occurred displaying groups interface :(")|e('js') }}");
+                            {% include "elements/js/modal.js.twig" with {
+                                modal_title_twig: _T("An error occurred displaying groups interface :(")|e("js"),
+                                modal_without_content: true,
+                                modal_class: "mini",
+                                modal_deny_only: true,
+                                modal_cancel_text: _T("Close")|e("js"),
+                                modal_classname: "redalert",
+                            } %}
                         }
                     });
                     return false;
                     if ( _managed ) {
                         _title = '{{ _T("Managed groups selection")|e('js') }}';
                     }
-                    $('body').modal({
-                        title: _title,
-                        class: 'fullscreen scrolling',
-                        content: res,
-                        actions: [{
-                            text    : '{{ _T("Close")|e('js') }}',
-                            class   : 'cancel'
-                        }]
-                    }).modal('show');
+                    {% include "elements/js/modal.js.twig" with {
+                        modal_title: "_title",
+                        modal_content: "res",
+                        modal_class: "groups-selection fullscreen",
+                        modal_content_class: "scrolling",
+                        modal_deny_only: true,
+                        modal_cancel_text: _T("Close")|e("js")
+                    } %}
                     _groups_ajax_mapper(res, _groups, _managed);
                 }
 
                 var _groups_ajax_mapper = function(res, _groups, _managed){
-                    $('#btnvalid').button().click(function(){
+                    $('#btnvalid').click(function(){
                         //remove actual groups
                         var _form = (_managed) ? 'managed' : 'user';
                         $('#' + _form + 'groups_form').empty();
-                        var _groups = new Array();
-                        var _groups_str = '<br/><strong>';
-                        if ( _managed ) {
-                            _groups_str += '{{ _T("Manager for:")|e('js') }}';
+                        var _existing_labels = $('#groups_field .labels').children().length;
+                        var _new_labels = 0;
+                        if ($('#groups_field .labels').length === 0) {
+                            var _labels_container = '<div class="ui large labels"></div>';
+                            $('#btngroups').before(_labels_container);
                         } else {
-                            _groups_str += '{{ _T("Member of:")|e('js') }}';
+                            if (_managed) {
+                                $('#groups_field .labels').find('.label.manager').remove();
+                            } else {
+                                $('#groups_field .labels').find('.label.member').remove();
+                            }
                         }
-                        _groups_str += '</strong> ';
+                        var _groups = new Array();
+                        var _groups_str = '';
 
                         $('li[id^="group_"]').each(function(){
                             //get group values
                                 _gid + '|' + _gname + '|' +
                                 '" name="' + _iname + '[]">'
                             );
-                            if ( _groups.length > 1 ) {
-                                _groups_str += ', ';
+                            if (_managed) {
+                                _groups_str += '<span class="ui orange basic label manager">';
+                                _groups_str += '<i class="ui shield icon tooltip" title="' + '{{ _T("Group manager")|e('js') }}' + '" aria-hidden="true"></i>';
+                            } else {
+                                _groups_str += '<span class="ui orange basic label member">';
+                                _groups_str += '<i class="ui tag icon tooltip" title="' + '{{ _T("Member of group")|e('js') }}' + '" aria-hidden="true"></i>';
                             }
                             _groups_str += _gname;
+                            _groups_str += '</span>';
+                            _new_labels += 1;
                         });
-                        $('#' + _form + 'groups').html(_groups_str);
-                        $('#ajax_groups_list').modal('hide');
+                        $('#groups_field .labels').append(_groups_str);
+                        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>';
+                        if (_existing_labels != _new_labels) {
+                            $('#groups_field').find('.message').remove();
+                            $('#groups_field').append(_modified);
+                        }
+                        $('.message.with-transition').transition('flash');
+                        $('.groups-selection').modal('hide');
                     });
+
                     //Remap links
                     var _none = $('#none_selected').clone();
                     $('li input[type=checkbox]').click(function(e){
                             $('#selected_groups ul').append(_none);
                         }
                     });
-                    $('#listing a').click(function(e){
-                        e.preventDefault();
-                        var _gid = this.href.match(/.*\/(\d+)$/)[1];
-                        var _gname = $(this).text();
+
+                    //Select a row
+                    $('#listing tbody tr').click(function(event){
+                        event.preventDefault();
+                        var _glink = $(this).find('.username_row a');
+                        var _gid = _glink[0].href.match(/.*\/(\d+)$/)[1];
+                        var _gname = _glink.text();
                         $('#none_selected').remove()
                         if ( $('#group_' + _gid).length == 0 ) {
-                            var _li = '<li id="group_' + _gid + '"><i class="ui user minus icon"></i> ' + _gname + '</li>';
+                            var _li = '<li id="group_' + _gid + '" class="item">'
+                                    + '<i class="icons" aria-hidden="true"><i class="users icon"><i class="top right corner minus icon"></i></i></i>'
+                                    + '<span class="ui content">' + _gname + '</span></li>';
                             $('#selected_groups ul').append(_li);
                             $('#group_' + _gid).click(function(){
                                 $(this).remove();
                             });
                         }
                         return false;
-                    });
-
+                    }).css('cursor', 'pointer').attr('title', '{{ _T("Click on a row to select a group")|e('js') }}');
                 }
 
     {% if not self_adh and not member.hasChildren() %}
                 {# Parent selection #}
-                $('#parent_id_elt').removeClass('sr-only');
         {% if not member.isDuplicate() %}
-                $('#parent_id_elt').hide();
+                $('#parent_id_elt').addClass('displaynone');
         {% endif %}
-                $('#attach').on('click', function() {
-                    var _checked = $(this).is(':checked');
-                    $('#parent_id_elt').toggle();
+                $('#attach-checkbox').checkbox({
+                    onChecked: function() {
+                        $('#parent_id_elt').removeClass('displaynone');
+                    },
+                    onUnchecked: function() {
+                        $('#parent_id_elt').addClass('displaynone');
+                    }
                 });
     {% endif %}
 
                 });
         {% endif %}
     {% endif %}
-                {% include "elements/js/photo_dnd.js.twig" %}
 
                 $('#ddn_adh').on('blur', function() {
                     var _bdate = $(this).val();
                         $('#member_age').html('');
                     }
                 });
+
+    {% if preferences.pref_force_picture_ratio == 1 %}
+                // Show photo cropping preferences on file selection
+                let _photo_new = document.getElementById('photo_new');
+                _photo_new.addEventListener('change', function () {
+                    if (_photo_new.files.length > 0) {
+                        let _crop_focus = document.getElementById('crop_focus_field');
+                        _crop_focus.classList.remove('displaynone');
+                        $('#crop_focus_field').transition('glow');
+                        return;
+                    }
+                });
+    {% endif %}
 {% endif %}
             });
         </script>