]> git.agnieray.net Git - galette.git/commitdiff
Use selectize to attach members
authorJohan Cwiklinski <jcwiklinski@teclib.com>
Sun, 20 Jan 2019 10:45:19 +0000 (11:45 +0100)
committerJohan Cwiklinski <jcwiklinski@teclib.com>
Sun, 20 Oct 2019 17:46:53 +0000 (19:46 +0200)
galette/includes/routes/members.routes.php
galette/lib/Galette/Entity/Adherent.php
galette/templates/default/member.tpl
galette/webroot/themes/default/galette.css

index d962c9386d0d31c1700904ec9a60af476f432566..3a3dc8d37cce3d51b9d0abab626ea0b4c4ef9281 100644 (file)
@@ -97,6 +97,45 @@ $app->get(
         $spam_pass = $spam->newImage();
         $spam_img = $spam->getImage();
 
+        // members
+        $members = [];
+        $m = new Members();
+        $required_fields = array(
+            'id_adh',
+            'nom_adh',
+            'prenom_adh'
+        );
+        $list_members = $m->getList(false, $required_fields, true);
+
+        if (count($list_members) > 0) {
+            foreach ($list_members as $lmember) {
+                $pk = Adherent::PK;
+                $sname = mb_strtoupper($lmember->nom_adh, 'UTF-8') .
+                    ' ' . ucwords(mb_strtolower($lmember->prenom_adh, 'UTF-8')) .
+                    ' (' . $lmember->id_adh . ')';
+                $members[$lmember->$pk] = $sname;
+            }
+        }
+
+        $params['members'] = [
+            'filters'   => $m->getFilters(),
+            'count'     => $m->getCount()
+        ];
+
+        //check if current attached member is part of the list
+        if ($member->hasParent()) {
+            if (!isset($members[$member->parent->id])) {
+                $members =
+                    [$member->parent->id => $member->parent->getSName()] +
+                    $members
+                ;
+            }
+        }
+
+        if (count($members)) {
+            $params['members']['list'] = $members;
+        }
+
         // display page
         $this->view->render(
             $response,
@@ -117,7 +156,7 @@ $app->get(
                 'spam_img'          => $spam_img,
                 'fieldsets'         => $form_elements['fieldsets'],
                 'hidden_elements'   => $form_elements['hiddens']
-            )
+            ) + $params
         );
         return $response;
     }
@@ -783,6 +822,45 @@ $app->get(
             $member->id == ''
         );
 
+        // members
+        $members = [];
+        $m = new Members();
+        $required_fields = array(
+            'id_adh',
+            'nom_adh',
+            'prenom_adh'
+        );
+        $list_members = $m->getList(false, $required_fields, true);
+
+        if (count($list_members) > 0) {
+            foreach ($list_members as $lmember) {
+                $pk = Adherent::PK;
+                $sname = mb_strtoupper($lmember->nom_adh, 'UTF-8') .
+                    ' ' . ucwords(mb_strtolower($lmember->prenom_adh, 'UTF-8')) .
+                    ' (' . $lmember->id_adh . ')';
+                $members[$lmember->$pk] = $sname;
+            }
+        }
+
+        $route_params['members'] = [
+            'filters'   => $m->getFilters(),
+            'count'     => $m->getCount()
+        ];
+
+        //check if current attached member is part of the list
+        if ($member->hasParent()) {
+            if (!isset($members[$member->parent->id])) {
+                $members =
+                    [$member->parent->id => $member->parent->getSName()] +
+                    $members
+                ;
+            }
+        }
+
+        if (count($members)) {
+            $route_params['members']['list'] = $members;
+        }
+
         // display page
         $this->view->render(
             $response,
@@ -922,7 +1000,7 @@ $app->post(
                     $disabled[$field->field_id] = true;
                 } elseif (!isset($post[$field->field_id])) {
                     switch ($field->field_id) {
-                        //uncheckd booleans are not sent from form
+                        //unchecked booleans are not sent from form
                         case 'bool_admin_adh':
                         case 'bool_exempt_adh':
                         case 'bool_display_info':
index 4afaa1db27c0a4c4bd53691fbc53c72c8a6a8a25..ee73648c9da906e2d1e06a06582a7a4a61ece057 100644 (file)
@@ -958,6 +958,14 @@ class Adherent
             $values['societe_adh'] = '';
         }
 
+        //no parent if checkbox was unchecked
+        if (!isset($values['attach'])
+            && empty($this->_id)
+            && isset($values['parent_id'])
+        ) {
+            unset($values['parent_id']);
+        }
+
         foreach ($fields as $key) {
             //first of all, let's sanitize values
             $key = strtolower($key);
index 029fcb14a640a83612951f55d59f65ce6f85e007..7d51255883d8c96065463514b8fc0b6824edc290 100644 (file)
                 <input type="checkbox" name="detach_parent" id="detach_parent" value="1"/>
             {/if}
         {else if ($login->isAdmin() or $login->isStaff()) and !$member->hasChildren()}
-            <a href="#" class="button" id="btnattach">
-                <i class="fas fa-link"></i>
-                {_T string="Attach member"}
-            </a>
+            <input type="checkbox" name="attach" id="attach" value="1"/>
+            <label for="attach"><i class="fas fa-link"></i> {_T string="Attach member"}<label>
+            <span id="parent_id_elt" class="sr-only">
+                <select name="parent_id" id="parent_id" class="nochosen">
+                    {if $adh_selected eq 0}
+                    <option value="">{_T string="-- select a name --"}</option>
+                    {/if}
+                    {foreach $members.list as $k=>$v}
+                        <option value="{$k}"{if $contribution->member == $k} selected="selected"{/if}>{$v}</option>
+                    {/foreach}
+                </select>
+            </span>
         {else if $member->hasChildren()}
             <strong>{_T string="Parent of:"}</strong>
             {foreach from=$member->children item=child}
                     {assign var="tip" value=null}
                     {assign var="size" value=null}
                     {assign var="propname" value=$entry->propname}
-                    {if $entry->field_id eq 'parent_id' }
-                        {if $member->$propname}
-                            {assign var="value" value=$member->$propname->id}
-                        {else}
-                            {assign var="value" value=""}
-                        {/if}
-                    {elseif $entry->field_id eq 'activite_adh'}
+                    {if $entry->field_id eq 'activite_adh'}
                         {assign var="value" value=$member->isActive()}
                     {else}
                         {assign var="value" value=$member->$propname}
                     {assign var="checked" value=null}
                     {assign var="example" value=null}
 
-                    {if $value neq '' or $entry->field_id eq 'parent_id'}
+                    {if $value neq '' and $entry->field_id neq 'parent_id'}
                         {include
                             file="forms_types/hidden.tpl"
                             name=$entry->field_id
 
 {block name="javascripts"}
         <script type="text/javascript">
+            {include file="js_chosen_adh.tpl" js_chosen_id="#parent_id"}
             $(function() {
                 $('#is_company').change(function(){
                     //console.log(this.checked);
                 }
 
     {if !$self_adh and !$member->hasChildren()}
-                {* Members popup *}
-                var _btnattach_mapping = function(){
-                    $('#btnattach').click(function(){
-                        _mode = ($(this).attr('id') == 'btnusers_small') ? 'members' : 'managers';
-                        var _persons = $('input[name="' + _mode + '[]"]').map(function() {
-                            return $(this).val();
-                        }).get();
-                        $.ajax({
-                            url: '{path_for name="ajaxMembers"}',
-                            type: "POST",
-                            data: {
-                                from: 'attach',
-                                id_adh: {if isset($member->id) and $member->id neq ''}{$member->id}{else}'new'{/if}
-                            },
-                            {include file="js_loader.tpl"},
-                            success: function(res){
-                                _members_dialog(res, _mode);
-                            },
-                            error: function() {
-                                alert("{_T string="An error occurred displaying members interface :(" escape="js"}");
-                            }
-                        });
-                        return false;
-                    });
-                }
-                _btnattach_mapping();
-
-                var _members_dialog = function(res, mode){
-                    var _title = '{_T string="Attached member selection" escape="js"}';
-                    var _el = $('<div id="members_list" title="' + _title  + '"> </div>');
-                    _el.appendTo('body').dialog({
-                        modal: true,
-                        hide: 'fold',
-                        width: '60%',
-                        height: 400,
-                        close: function(event, ui){
-                            _el.remove();
-                        },
-                        create: function (event, ui) {
-                            if ($(window ).width() < 767) {
-                                $(this).dialog('option', {
-                                        'width': '95%',
-                                        'draggable': false
-                                });
-                            }
-                        }
-                    });
-                    _members_ajax_mapper(res);
-                }
-
-                var _members_ajax_mapper = function(res){
-                    $('#members_list').append(res);
-
-
-                    $('#members_list tbody').find('a').each(function(){
-                        $(this).click(function(){
-                            var _id = this.href.match(/.*\/(\d+)$/)[1];
-                            $('#parent_id').attr('value', _id);
-                            var _parent_name;
-                            if ($('#parent_name').length > 0) {
-                                _parent_name = $('#parent_name');
-                            } else {
-                                _parent_name = $('<div id="parent_name"/>');
-                                $('#btnattach').after(_parent_name);
-                            }
-                            _parent_name.html($(this).html());
-
-                            //remove required attribute on address and mail fields if member has a parent
-                            var _parentfields = '';
-        {if $parent_fields|@count gt 0}
-            {foreach item=req from=$parent_fields}
-                            _parentfields += '#{$req}';
-                {if !$req@last}
-                            _parentfields += ',';
-                {/if}
-            {/foreach}
-        {/if}
-                            $(_parentfields).removeAttr('required');
-
-                            $('#members_list').dialog('close');
-                            return false;
-                        }).attr('title', '{_T string="Click to choose this member as parent"}');
-                    });
-                    //Remap links
-                    $('#members_list .pages a').click(function(){
-                        var gid = $('#the_id').val();
-
-                        $.ajax({
-                            url: this.href,
-                            type: "POST",
-                            data: {
-                                from: 'attach',
-                                id_adh: {if isset($member->id) and $member->id neq ''}{$member->id}{else}'new'{/if}
-                            },
-                            {include file="js_loader.tpl"},
-                            success: function(res){
-                                $('#members_list').empty();
-                                _members_ajax_mapper(res);
-                            },
-                            error: function() {
-                                alert("{_T string="An error occurred displaying members interface :(" escape="js"}");
-                            }
-                        });
-                        return false;
-                    });
-                }
+                {* Parent selection *}
+                $('#parent_id_elt').hide().removeClass('sr-only');
+                $('#attach').on('click', function() {
+                    var _checked = $(this).is(':checked');
+                    $('#parent_id_elt').toggle();
+                });
     {/if}
 
     {if !$self_adh and $member->hasParent()}
index ae361e2117c0c0311ba1604f1c2aad53e9f4f75c..9f2ed712f9f53c4a91767697b20680faa5180bd8 100644 (file)
@@ -2148,7 +2148,7 @@ td.photo img{
     width:20em;
 }
 
-label > i, span.bline > i {
+.galette_form label > i, label.bline > i, span.bline > i {
     float: right;
     font-size: 1.1em;
     color: rgba(0, 0, 255, .5);