]> git.agnieray.net Git - galette.git/commitdiff
Mass edition of dynamic fields; closes #1194
authorJohan Cwiklinski <johan@x-tnd.be>
Tue, 28 Sep 2021 12:02:05 +0000 (14:02 +0200)
committerJohan Cwiklinski <johan@x-tnd.be>
Tue, 28 Sep 2021 15:56:47 +0000 (17:56 +0200)
galette/lib/Galette/Controllers/Crud/MembersController.php
galette/lib/Galette/Entity/FieldsConfig.php
galette/templates/default/edit_dynamic_fields.tpl
galette/templates/default/mass_change_members.tpl

index 20932f4e3bb511a32f204ae944d3f490c085a2b4..b9ae3082439067167fe45215b5962084c90860d7 100644 (file)
@@ -37,6 +37,7 @@
 namespace Galette\Controllers\Crud;
 
 use Galette\Controllers\CrudController;
+use Galette\DynamicFields\Boolean;
 use Slim\Http\Request;
 use Slim\Http\Response;
 use Galette\Core\Authentication;
@@ -1224,7 +1225,7 @@ class MembersController extends CrudController
             'dues'      => false,
             'parent'    => false,
             'children'  => false,
-            'dynamics'  => false
+            'dynamics'  => true
         );
         $member = new Adherent($this->zdb, null, $deps);
 
@@ -1291,6 +1292,36 @@ class MembersController extends CrudController
                     }
                 }
             }
+
+            //handle dynamic fields
+            $deps = array(
+                'picture'   => true,
+                'groups'    => true,
+                'dues'      => true,
+                'parent'    => true,
+                'children'  => true,
+                'dynamics'  => true
+            );
+            $member = new Adherent($this->zdb, null, $deps);
+            $member->setDependencies(
+                $this->preferences,
+                $this->members_fields,
+                $this->history
+            );
+            $dynamic_fields = $member->getDynamicFields()->getFields();
+            foreach ($dynamic_fields as $field) {
+                $mass_id = 'mass_info_field_' . $field->getId();
+                $field_id = 'info_field_' . $field->getId() . '_1';
+                if (
+                    isset($post[$mass_id])
+                    && (isset($post[$field_id]) || $field instanceof Boolean)
+                ) {
+                    $changes[$field_id] = [
+                        'label' => $field->getName(),
+                        'value' => $post[$field_id] ?? 0
+                    ];
+                }
+            }
         }
 
         $filters = $this->session->filter_members;
@@ -1338,6 +1369,7 @@ class MembersController extends CrudController
         $redirect_url = $post['redirect_uri'];
         $error_detected = [];
         $mass = 0;
+        $dynamic_fields = null;
 
         unset($post['redirect_uri']);
         if (!isset($post['confirm'])) {
@@ -1355,9 +1387,39 @@ class MembersController extends CrudController
                 foreach ($form_elements['fieldsets'] as $fieldset) {
                     if (isset($fieldset->elements[$key])) {
                         $found = true;
-                        continue;
+                        break;
                     }
                 }
+
+                if (!$found) {
+                    //try on dynamic fields
+                    if ($dynamic_fields === null) {
+                        //handle dynamic fields
+                        $deps = array(
+                            'picture' => true,
+                            'groups' => true,
+                            'dues' => true,
+                            'parent' => true,
+                            'children' => true,
+                            'dynamics' => true
+                        );
+                        $member = new Adherent($this->zdb, null, $deps);
+                        $member->setDependencies(
+                            $this->preferences,
+                            $this->members_fields,
+                            $this->history
+                        );
+                        $dynamic_fields = $member->getDynamicFields()->getFields();
+                    }
+                    foreach ($dynamic_fields as $field) {
+                        $field_id = 'info_field_' . $field->getId() . '_1';
+                        if ($key == $field_id) {
+                            $found = true;
+                            break;
+                        }
+                    }
+                }
+
                 if (!$found) {
                     Analog::log(
                         'Permission issue mass editing field ' . $key,
index 46e9c0ac88ce265f7e257b636dbbe1a1d7b7753c..656973f32be935b5193da7f9b17e6241c65a66d4 100644 (file)
@@ -989,7 +989,6 @@ class FieldsConfig
                 unset($fields[$k]);
             }
         }
-
     }
 
     /**
index c0386c794df6cfaaec296d68f03390d9ba579a27..a4bea2f83ceab52d84e600f911cfee16ce27e536 100644 (file)
@@ -1,35 +1,52 @@
 {if !empty($object->getDynamicFields())}
-    {if !empty($object->getDynamicFields()->getFields())}
+    {assign var=fields value=$object->getDynamicFields()->getFields()}
+    {if !isset($masschange)}
+        {assign var="masschange" value=false}
+    {/if}
+
+    {if !empty($fields)}
 
 {function name=draw_field}
     {assign var=valuedata value=$field_data.field_val|escape}
     {if $field|is_a:'Galette\DynamicFields\File'}
     <span class="bline libelle">{$field->getName()|escape}</span>
     {else}
-    <label class="bline libelle" for="info_field_{$field->getId()}_{$loop}">{$field->getName()|escape}</label>
+    <label class="bline libelle" for="info_field_{$field->getId()}_{$loop}">
+        {if $masschange}
+            {* Add a checkbox for fields to change on mass edition *}
+            <input type="checkbox" name="mass_info_field_{$field->getId()}" class="mass_checkbox"/>
+        {/if}
+        {$field->getName()|escape}
+    </label>
     {/if}
     {if $field|is_a:'Galette\DynamicFields\Text'}
         <textarea name="info_field_{$field->getId()}_{$loop}" id="info_field_{$field->getId()}_{$loop}"
             cols="{if $field->getWidth() > 0}{$field->getWidth()}{else}61{/if}"
             rows="{if $field->getHeight() > 0}{$field->getHeight()}{else}6{/if}"
             {if $field->isRepeatable()} data-maxrepeat="{$field->getRepeat()}"{/if}
+        {if !$masschange}
             {if $field->isRequired()} required="required"{/if}
+        {/if}
             {if $disabled} disabled="disabled"{/if}>{$valuedata}</textarea>
     {elseif $field|is_a:'Galette\DynamicFields\Line'}
         <input type="text" name="info_field_{$field->getId()}_{$loop}" id="info_field_{$field->getId()}_{$loop}"
             {if $field->getWidth() > 0}size="{$field->getWidth()}"{/if}
             {if $field->getSize() > 0}maxlength="{$field->getSize()}"{/if}
             value="{$valuedata}"
+    {if !$masschange}
             {if $field->isRequired()} required="required"{/if}
-            {if $disabled} disabled="disabled"{/if}
+    {/if}
             {if $field->isRepeatable()} data-maxrepeat="{$field->getRepeat()}"{/if}
+            {if $disabled} disabled="disabled"{/if}
         />
     {elseif $field|is_a:'Galette\DynamicFields\Choice'}
         <select name="info_field_{$field->getId()}_{$loop}" id="info_field_{$field->getId()}_{$loop}"
+        {if !$masschange}
             {if $field->isRequired()} required="required"{/if}
-            {if $disabled} disabled="disabled"{/if}
+        {/if}
             {if $field->isRepeatable()} data-maxrepeat="{$field->getRepeat()}"{/if}
-        >
+            {if $disabled} disabled="disabled"{/if}
+            >
             <!-- If no option is present, page is not XHTML compliant -->
             <option value="">{_T string="Select an option"}</option>
             {html_options options=$field->getValues() selected=$valuedata}
@@ -38,7 +55,9 @@
         <input type="text" name="info_field_{$field->getId()}_{$loop}" id="info_field_{$field->getId()}_{$loop}" maxlength="10"
             value="{$valuedata}" class="dynamic_date modif_date"
             {if $field->isRepeatable()} data-maxrepeat="{$field->getRepeat()}"{/if}
+        {if !$masschange}
             {if $field->isRequired()} required="required"{/if}
+        {/if}
             {if $disabled} disabled="disabled"{/if}
         />
         <span class="exemple">{_T string="(yyyy-mm-dd format)"}</span>
@@ -46,7 +65,9 @@
         <input type="checkbox" name="info_field_{$field->getId()}_{$loop}" id="info_field_{$field->getId()}_{$loop}" value="1"
             {if $valuedata eq 1} checked="checked"{/if}
             {if $field->isRepeatable()} data-maxrepeat="{$field->getRepeat()}"{/if}
+        {if !$masschange}
             {if $field->isRequired()} required="required"{/if}
+        {/if}
             {if $disabled} disabled="disabled"{/if}
         />
     {elseif $field|is_a:'Galette\DynamicFields\File'}
     <legend class="ui-state-active ui-corner-top">{_T string="Additionnal fields:"}</legend>
     <div>
     {assign var=access_level value=$login->getAccessLevel()}
-    {foreach from=$object->getDynamicFields()->getFields() item=field}
+    {foreach from=$fields item=field}
         {assign var=perm value=$field->getPerm()}
         {if $field|is_a:'Galette\DynamicFields\Separator'}
         <div class="separator">{$field->getName()|escape}</div>
+        {elseif ($field|is_a:'Galette\DynamicFields\File' || $field->isRepeatable())  && $masschange}
+            <!-- File and repetable fields not shown in mass changes form -->
         {else}
         <p{if $field->isRepeatable()} class="repetable"{/if}>
             {assign var=disabled value=false}
     </div>
 </fieldset>
 <script type="text/javascript">
+    {if !$masschange}
     var _addLnk = function(){
         return $('<a class="button" href="#"><i class="fas fa-plus" title="{_T string="New occurence"}"></i> <span class="sr-only">{_T string="New occurence"}"</span></a>');
     };
             return false;
         });
     }
+    {/if}
 
     $(function(){
+    {if !$masschange}
         $('.repetable').each(function(){
             var _total;
             var _current;
                 }
             }
         });
+    {/if}
         $('.dynamic_date').datepicker({
             changeMonth: true,
             changeYear: true,
index 1bba7081cd578fd2159c22838965ba8af2a07983..e4edf532fd87c91c539413cc94824527cd678c92 100644 (file)
@@ -43,6 +43,8 @@
     {if !isset($changes)}
         {* Form entries*}
         {include file="forms_types.tpl" masschange=true}
+        {* Dynamic entries *}
+        {include file="edit_dynamic_fields.tpl" object=$member masschange=true}
     {/if}
             <input type="submit" id="masschange" class="button" value="{if !isset($changes)}{_T string="Edit"}{else}{_T string="OK"}{/if}"/>
             <a href="{$cancel_uri}" class="button" id="btncancel">{_T string="Cancel"}</a>