]> git.agnieray.net Git - galette.git/commitdiff
Massive modifications of members; fixes #696
authorJohan Cwiklinski <johan@x-tnd.be>
Thu, 21 Sep 2017 05:03:56 +0000 (07:03 +0200)
committerJohan Cwiklinski <johan@x-tnd.be>
Sat, 23 Dec 2017 07:43:20 +0000 (08:43 +0100)
12 files changed:
galette/includes/dependencies.php
galette/includes/routes/members.routes.php
galette/lib/Galette/Entity/FieldsConfig.php
galette/templates/default/forms_types.tpl [new file with mode: 0644]
galette/templates/default/forms_types/gender.tpl
galette/templates/default/forms_types/input.tpl
galette/templates/default/gestion_adherents.tpl
galette/templates/default/mass_change_members.tpl [new file with mode: 0644]
galette/templates/default/member.tpl
galette/templates/default/page.tpl
galette/webroot/js/mass_changes.js [new file with mode: 0644]
galette/webroot/themes/default/galette.css

index f20ba5d7f1ac64f609a86ee1ad87fa5691dd4d93..7e8e27cb86720319ef1ed572d9800451e7af8f87 100644 (file)
@@ -139,6 +139,7 @@ $container['view'] = function ($c) {
     $smarty->assign('require_tree', null);
     $smarty->assign('html_editor', null);
     $smarty->assign('require_charts', null);
+    $smarty->assign('require_mass', null);
     if ($c->login->isAdmin() && $c->preferences->pref_telemetry_date) {
         $now = new \DateTime();
         $sent = new \DateTime($c->preferences->pref_telemetry_date);
@@ -326,7 +327,10 @@ $container['acls'] = function ($c) {
         'doAdminTools'              => 'superadmin',
         'telemetryInfos'            => 'admin',
         'telemetrySend'             => 'admin',
-        'setRegistered'             => 'admin'
+        'setRegistered'             => 'admin',
+        'masschangeMembers'         => 'groupmanager',
+        'massstoremembers'          => 'groupmanager',
+        'masschangeMembersReview'   => 'groupmanager'
     ];
 
     foreach ($c['plugins']->getModules() as $plugin) {
index 0569931a5fcf327551fac3d5a0fed0aaa6b81b97..15011193c434f8e9fb14a86b2b227dc44472a3e6 100644 (file)
@@ -364,6 +364,7 @@ $app->get(
                 'page_title'            => _T("Members management"),
                 'require_dialog'        => true,
                 'require_calendar'      => true,
+                'require_mass'          => true,
                 'members'               => $members_list,
                 'filter_groups_options' => $groups_list,
                 'nb_members'            => $members->getCount(),
@@ -1585,6 +1586,11 @@ $app->post(
                     ->withHeader('Location', $this->router->pathFor('removeMembers'));
             }
 
+            if (isset($post['masschange'])) {
+                return $response
+                    ->withStatus(301)
+                    ->withHeader('Location', $this->router->pathFor('masschangeMembers'));
+            }
         } else {
             $this->flash->addMessage(
                 'error_detected',
@@ -2761,3 +2767,244 @@ $app->get(
         }
     }
 )->setName('getDynamicFile')->add($authenticate);
+
+$app->get(
+    __('/members', 'routes') . __('/mass-change', 'routes'),
+    function ($request, $response) {
+        $filters =  $this->session->filter_members;
+
+        $data = [
+            'id'            => $filters->selected,
+            'redirect_uri'  => $this->router->pathFor('members')
+        ];
+
+        $fc = $this->fields_config;
+        $form_elements = $fc->getMassiveFormElements($this->members_fields, $this->login);
+
+        //dynamic fields
+        $deps = array(
+            'picture'   => false,
+            'groups'    => false,
+            'dues'      => false,
+            'parent'    => false,
+            'children'  => false,
+            'dynamics'  => false
+        );
+        $member = new Adherent($this->zdb, null, $deps);
+
+        //Status
+        $statuts = new Status($this->zdb);
+
+        // display page
+        $this->view->render(
+            $response,
+            'mass_change_members.tpl',
+            array(
+                'mode'          => $request->isXhr() ? 'ajax' : '',
+                'page_title'    => str_replace(
+                    '%count',
+                    count($data['id']),
+                    _T('Mass change %count members')
+                ),
+                'form_url'      => $this->router->pathFor('masschangeMembersReview'),
+                'cancel_uri'    => $this->router->pathFor('members'),
+                'data'          => $data,
+                'member'        => $member,
+                'fieldsets'     => $form_elements['fieldsets'],
+                'titles_list'   => Titles::getList($this->zdb),
+                'statuts'       => $statuts->getList(),
+                'require_mass'  => true
+            )
+        );
+        return $response;
+    }
+)->setName('masschangeMembers')->add($authenticate);
+
+$app->post(
+    __('/members', 'routes') . __('/mass-change', 'routes') . __('/validate', 'routes'),
+    function ($request, $response) {
+        $post = $request->getParsedBody();
+
+        if (!isset($post['confirm'])) {
+            $this->flash->addMessage(
+                'error_detected',
+                _T("Mass changes has not been confirmed!")
+            );
+        } else {
+            //we want only visibles fields
+            $fc = $this->fields_config;
+            $form_elements = $fc->getMassiveFormElements($this->members_fields, $this->login);
+
+            $changes = [];
+            foreach ($form_elements['fieldsets'] as $form_element) {
+                foreach ($form_element->elements as $field) {
+                    if (isset($post[$field->field_id]) && isset($post['mass_' . $field->field_id])) {
+                        $changes[$field->field_id] = [
+                            'label' => $field->label,
+                            'value' => $post[$field->field_id]
+                        ];
+                    }
+                }
+            }
+        }
+
+        $filters =  $this->session->filter_members;
+        $data = [
+            'id'            => $filters->selected,
+            'redirect_uri'  => $this->router->pathFor('members')
+        ];
+
+        //Status
+        $statuts = new Status($this->zdb);
+
+        // display page
+        $this->view->render(
+            $response,
+            'mass_change_members.tpl',
+            array(
+                'mode'          => $request->isXhr() ? 'ajax' : '',
+                'page_title'    => str_replace(
+                    '%count',
+                    count($data['id']),
+                    _T('Review mass change %count members')
+                ),
+                'form_url'      => $this->router->pathFor('massstoremembers'),
+                'cancel_uri'    => $this->router->pathFor('members'),
+                'data'          => $data,
+                'titles_list'   => Titles::getList($this->zdb),
+                'statuts'       => $statuts->getList(),
+                'changes'       => $changes
+            )
+        );
+        return $response;
+    }
+)->setName('masschangeMembersReview')->add($authenticate);
+
+$app->post(
+    __('/members', 'routes') . __('/mass-change', 'routes'),
+    function ($request, $response, $args) {
+        $post = $request->getParsedBody();
+        $redirect_url = $post['redirect_uri'];
+        $error_detected = [];
+        $mass = 0;
+
+        unset($post['redirect_uri']);
+        if (!isset($post['confirm'])) {
+            $error_detected[] = _T("Mass changes has not been confirmed!");
+        } else {
+            unset($post['confirm']);
+            $ids = $post['id'];
+            unset($post['id']);
+
+            $fc = $this->fields_config;
+            $form_elements = $fc->getMassiveFormElements($this->members_fields, $this->login);
+            $disabled = $this->members_fields;
+            foreach (array_keys($post) as $key) {
+                $found = false;
+                foreach ($form_elements['fieldsets'] as $fieldset) {
+                    if (isset($fieldset->elements[$key])) {
+                        $found = true;
+                        continue;
+                    }
+                }
+                if (!$found) {
+                    Analog::log(
+                        'Permission issue mass editing field ' . $key,
+                        Analog::WARNING
+                    );
+                    unset($post[$key]);
+                } else {
+                    unset($disabled[$key]);
+                }
+            }
+
+            if (!count($post)) {
+                $error_detected[] = _T("Nothing to do!");
+            } else {
+                $is_manager = !$this->login->isAdmin() && !$this->login->isStaff() && $this->login->isGroupManager();
+                foreach ($ids as $id) {
+                    $deps = array(
+                        'picture'   => false,
+                        'groups'    => $is_manager,
+                        'dues'      => false,
+                        'parent'    => false,
+                        'children'  => false,
+                        'dynamics'  => false
+                    );
+                    $member = new Adherent($this->zdb, (int)$id, $deps);
+                    $member->setDependencies(
+                        $this->preferences,
+                        $this->members_fields,
+                        $this->history
+                    );
+
+                    if ($is_manager) {
+                        $groups = $member->groups;
+                        $is_managed = false;
+                        foreach ($groups as $g) {
+                            if ($this->login->isGroupManager($g->getId())) {
+                                $is_managed = true;
+                                break;
+                            }
+                        }
+                        if (!$is_managed) {
+                            Analog::log(
+                                'Trying to edit member #' . $id . ' without appropriate ACLs',
+                                Analog::WARNING
+                            );
+                            $error_detected[] = _T('No permission to edit member');
+                            continue;
+                        }
+                    }
+
+                    $valid = $member->check($post, [], $disabled);
+                    if ($valid === true) {
+                        $done = $member->store();
+                        if (!$done) {
+                            $error_detected[] = _T("An error occured while storing the member.");
+                        } else {
+                            ++$mass;
+                        }
+                    } else {
+                        $error_detected = array_merge($error_detected, $valid);
+                    }
+
+                }
+            }
+        }
+
+        if ($mass == 0 && !count($error_detected)) {
+            $error_detected[] = _T('Something went wront during mass edition!');
+        } else {
+            $this->flash->addMessage(
+                'success_detected',
+                str_replace(
+                    '%count',
+                    $mass,
+                    _T('%count members has been changed successfully!')
+                )
+            );
+        }
+
+        if (count($error_detected) > 0) {
+            foreach ($error_detected as $error) {
+                $this->flash->addMessage(
+                    'error_detected',
+                    $error
+                );
+            }
+        }
+
+        if (!$request->isXhr()) {
+            return $response
+                ->withStatus(301)
+                ->withHeader('Location', $redirect_url);
+        } else {
+            return $response->withJson(
+                [
+                    'success'   => count($error_detected) === 0
+                ]
+            );
+        }
+    }
+)->setName('massstoremembers')->add($authenticate);
index fef7e98097d9309b9d12bb0c010722a22ee59c3d..27068d9cf2c2690dc6a1acf028d772c3730c7945 100644 (file)
@@ -890,4 +890,61 @@ class FieldsConfig
             )
         );
     }
+
+    /**
+     * Get fields for massive changes
+     * @see FieldsConfig::getFormElements
+     *
+     * @param array $fields Member fields
+     * @param Login $login  Login instance
+     *
+     * @return array
+     */
+    public function getMassiveFormElements(array $fields, Login $login)
+    {
+        $visibles = $this->getVisibilities();
+        $access_level = $login->getAccessLevel();
+
+        //remove not searchable fields
+        unset($fields['mdp_adh']);
+
+        foreach ($fields as $k => $f) {
+            if ($visibles[$k] == FieldsConfig::NOBODY ||
+                ($visibles[$k] == FieldsConfig::ADMIN &&
+                    $access_level < Authentication::ACCESS_ADMIN) ||
+                ($visibles[$k] == FieldsConfig::STAFF &&
+                    $access_level < Authentication::ACCESS_STAFF) ||
+                ($visibles[$k] == FieldsConfig::MANAGER &&
+                    $access_level < Authentication::ACCESS_MANAGER)
+            ) {
+                unset($fields[$k]);
+            }
+        }
+
+        $mass_fields = [
+            'titre_adh',
+            'sexe_adh',
+            'pref_lang',
+            'cp_adh',
+            'ville_adh',
+            'pays_adh',
+            'bool_display_info',
+            'activite_adh',
+            Status::PK,
+            'bool_admin_adh',
+            'bool_exempt_adh',
+        ];
+        $mass_fields = array_intersect(array_keys($fields), $mass_fields);
+
+        foreach ($mass_fields as $mass_field) {
+            $this->setNotRequired($mass_field);
+        }
+        $form_elements = $this->getFormElements($login, false);
+        unset($form_elements['hiddens']);
+
+        foreach ($form_elements['fieldsets'] as &$form_element) {
+            $form_element->elements = array_intersect_key($form_element->elements, array_flip($mass_fields));
+        }
+        return $form_elements;
+    }
 }
diff --git a/galette/templates/default/forms_types.tpl b/galette/templates/default/forms_types.tpl
new file mode 100644 (file)
index 0000000..4243ada
--- /dev/null
@@ -0,0 +1,130 @@
+            {foreach item=fieldset from=$fieldsets}
+            <fieldset class="galette_form">
+                <legend>{$fieldset->label}</legend>
+                <div>
+                {if !$self_adh and $fieldset@first && !isset($masschange)}
+                    {include file="forms_types/picture.tpl"}
+                {/if}
+                {foreach item=entry from=$fieldset->elements}
+                    {if $entry->field_id neq 'adresse2_adh'}
+                        {assign var="template" value="text.tpl"}
+                        {assign var="title" value=null}
+                        {assign var="tip" value=null}
+                        {assign var="size" value=null}
+                        {assign var="propname" value=$entry->propname}
+                        {assign var="value" value=null}
+                        {assign var="checked" value=null}
+                        {assign var="example" value=null}
+
+                        {if $entry->type eq constant('Galette\Entity\FieldsConfig::TYPE_BOOL')}
+                            {assign var="template" value="checkbox.tpl"}
+                            {assign var="value" value="1"}
+                        {/if}
+                        {if $entry->field_id eq 'titre_adh'}
+                            {assign var="template" value="titles.tpl"}
+                            {assign var="value" value=$member->title}
+                        {/if}
+                        {if $entry->field_id eq 'pref_lang'}
+                            {assign var="template" value="lang.tpl"}
+                        {/if}
+                        {if $entry->field_id eq 'sexe_adh'}
+                            {assign var="template" value="gender.tpl"}
+                        {/if}
+                        {if $entry->field_id eq 'societe_adh'}
+                            {assign var="template" value="company.tpl"}
+                        {/if}
+                        {if $entry->field_id|strpos:'date_' === 0 or $entry->field_id eq 'ddn_adh'}
+                            {assign var="template" value="date.tpl"}
+                        {/if}
+                        {if $entry->field_id eq 'adresse_adh'}
+                            {assign var="template" value="address.tpl"}
+                        {/if}
+                        {if $entry->field_id eq 'mdp_adh'}
+                            {if !$self_adh}
+                                {assign var="template" value="password.tpl"}
+                            {else}
+                                {assign var="template" value="captcha.tpl"}
+                            {/if}
+                        {/if}
+                        {if $entry->field_id eq 'info_adh'
+                            or $entry->field_id eq 'info_public_adh'}
+                            {assign var="template" value="textarea.tpl"}
+                            {if $entry->field_id eq 'info_adh'}
+                                {assign var="example" value={_T string="This comment is only displayed for admins and staff members."}}
+                            {else}
+                                {if $login->isAdmin() or $login->isStaff()}
+                                    {assign var="example" value={_T string="This comment is reserved to the member."}}
+                                {/if}
+                            {/if}
+                        {/if}
+                        {if $entry->field_id eq 'activite_adh'}
+                            {assign var="template" value="account.tpl"}
+                        {/if}
+                        {if $entry->field_id eq 'id_statut'}
+                            {assign var="template" value="status.tpl"}
+                        {/if}
+
+                        {if $entry->field_id eq 'gpgid'}
+                            {assign var="size" value="8"}
+                        {/if}
+                        {if $entry->field_id eq 'email_adh'
+                            or $entry->field_id eq 'msn_adh'
+                            or $entry->field_id eq 'jabber_adh'
+                            or $entry->field_id eq 'url_adh'}
+                            {assign var="size" value="30"}
+                        {/if}
+                        {if $entry->field_id eq 'fingerprint'}
+                            {assign var="size" value="40"}
+                        {/if}
+                        {if $entry->field_id eq 'bool_display_info'}
+                            {assign var="title" value={_T string="Do member want to appear publically?"}}
+                            {assign var="tip" value={_T string="If you check this box (and if you are up to date with your contributions), your full name, website address ad other informations will be publically visible on the members list.<br/>If you've uploaded a photo, it will be displayed on the trombinoscope page.<br/>Note that administrators can disabled public pages, this setting will have no effect in that case."}}
+                            {assign var="checked" value=$member->appearsInMembersList()}
+                        {/if}
+                        {if $entry->field_id eq 'login_adh'}
+                            {assign var="example" value={_T string="(at least %i characters)" pattern="/%i/" replace=2}}
+                        {/if}
+
+                        {if $entry->field_id eq 'bool_admin_adh'}
+                            {assign var="checked" value=$member->isAdmin()}
+                        {/if}
+                        {if $entry->field_id eq 'bool_exempt_adh'}
+                            {assign var="checked" value=$member->isDueFree()}
+                        {/if}
+                        {if $entry->field_id eq 'parent_id'}
+                            {assign var="value" value=$member->parent->id}
+                        {/if}
+
+                        {* If value has not been set, take the generic value *}
+                        {if !$value}
+                            {assign var="value" value=$member->$propname}
+                        {/if}
+
+                        {if !isset($masschange)}
+                           {assign var="masschange" value=false}
+                        {/if}
+
+                        {include
+                            file="forms_types/$template"
+                            name=$entry->field_id
+                            id=$entry->field_id
+                            value=$value
+                            required=$entry->required
+                            readonly=$entry->readonly
+                            disabled=$entry->disabled
+                            label=$entry->label
+                            title=$title
+                            size=$size
+                            tip=$tip
+                            compile_id="input_{$entry->field_id}"
+                            checked=$checked
+                            masschange=$masschange
+                        }
+                    {/if}
+                {/foreach}
+                {if isset($groups) and $groups|@count != 0 and $fieldset@last and !isset($masschange)}
+                    {include file="forms_types/groups.tpl"}
+                {/if}
+                </div>
+            </fieldset>
+            {/foreach}
index 4dd7ff17e4ef8bc43de7867e6a360b86a1974e06..3447bcf0ed0738dc2580ffda67948562f707bd48 100644 (file)
@@ -3,7 +3,13 @@
 {block name="component"}
     <p class="radios">
         {block name="label"}
-            <span class="bline">{$label}</span>
+            <span class="bline">
+            {if $masschange}
+                {* Add a checkbox for fields to change on mass edition *}
+                <input type="checkbox" name="mass_{$entry->field_id}" class="mass_checkbox"/>
+            {/if}
+                {$label}
+            </span>
         {/block}
 
         {block name="element"}
index ea774f5a593c85692dc6ffcb6ea576b805b834d4..1b35cb682a8012f89497cd8783c0f2c4d90443b5 100644 (file)
@@ -4,6 +4,10 @@
 {/if}
     {block name="label"}
         <label for="{$id}"{if isset($title)} title="{$title}"{/if}{if isset($tip) or isset($labelclass)} class="{if isset($tip)}tooltip{/if} {if isset($labelclass)}{$labelclass}{/if}"{/if}>
+        {if $masschange}
+            {* Add a checkbox for fields to change on mass edition *}
+            <input type="checkbox" name="mass_{$entry->field_id}" class="mass_checkbox"/>
+        {/if}
             {$label}
         </label>
     {/block}
index a9ff649a224ac2ec28b02859c479322f36dba426..81a299c519c83ac9f0ad11300f88aba0e285bd7c 100644 (file)
             <li>{_T string="For the selection:"}</li>
     {if $login->isAdmin() or $login->isStaff()}
             <li><input type="submit" id="delete" name="delete" value="{_T string="Delete"}"/></li>
+            <li><input type="submit" id="masschange" class="button" name="masschange" value="{_T string="Mass change"}"/></li>
         {if $pref_mail_method neq constant('Galette\Core\GaletteMail::METHOD_DISABLED')}
             <li><input type="submit" id="sendmail" name="mailing" value="{_T string="Mail"}"/></li>
         {/if}
         {include file="js_removal.tpl"}
         {include file="js_removal.tpl" selector="#delete" deleteurl="'{path_for name="batch-memberslist"}'" extra_check="if (!_checkselection()) {ldelim}return false;{rdelim}" extra_data="delete: true, member_sel: $('#listform input[type=\"checkbox\"]:checked').map(function(){ return $(this).val(); }).get()" method="POST"}
 
+        var _bindmassres = function(res) {
+            res.find('#btncancel')
+                .button()
+                .on('click', function(e) {
+                    e.preventDefault();
+                    res.dialog('close');
+                });
+
+            res.find('input[type=submit]')
+                .button();
+        }
+
+        $('#masschange').off('click').on('click', function(event) {
+            event.preventDefault();
+            var _this = $(this);
+
+            if (!_checkselection()) {
+                return false;
+            }
+            $.ajax({
+                url: '{path_for name="batch-memberslist"}',
+                type: "POST",
+                data: {
+                    ajax: true,
+                    masschange: true,
+                    member_sel: $('#listform input[type=\"checkbox\"]:checked').map(function(){
+                        return $(this).val();
+                    }).get()
+                },
+                datatype: 'json',
+                {include file="js_loader.tpl"},
+                success: function(res){
+                    var _res = $(res);
+                    _bindmassres(_res);
+
+                    _res.find('form').on('submit', function(e) {
+                        e.preventDefault();
+                        var _form = $(this);
+                        var _data = _form.serialize();
+                        $.ajax({
+                            url: _form.attr('action'),
+                            type: "POST",
+                            data: _data,
+                            datatype: 'json',
+                            {include file="js_loader.tpl"},
+                            success: function(html) {
+                                var _html = $(html);
+                                _bindmassres(_html);
+
+                                $('#mass_change').remove();
+                                $('body').append(_html);
+
+                                _initTooltips('#mass_change');
+                                //_massCheckboxes('#mass_change');
+
+                                _html.dialog({
+                                    width: 'auto',
+                                    modal: true,
+                                    close: function(event, ui){
+                                        $(this).dialog('destroy').remove()
+                                    }
+                                });
+
+                                _html.find('form').on('submit', function(e) {
+                                    e.preventDefault();
+                                    var _form = $(this);
+                                    var _data = _form.serialize();
+                                    $.ajax({
+                                        url: _form.attr('action'),
+                                        type: "POST",
+                                        data: _data,
+                                        datatype: 'json',
+                                        {include file="js_loader.tpl"},
+                                        success: function(res) {
+                                            if (res.success) {
+                                                window.location.href = _form.find('input[name=redirect_uri]').val();
+                                            } else {
+                                                $.ajax({
+                                                    url: '{path_for name="ajaxMessages"}',
+                                                    method: "GET",
+                                                    success: function (message) {
+                                                        $('#asso_name').after(message);
+                                                    }
+                                                });
+                                            }
+                                        }
+                                    });
+                                });
+                            },
+                            error: function() {
+                                alert("{_T string="An error occured :(" escape="js"}");
+                            }
+                        });
+                    });
+
+                    $('body').append(_res);
+
+                    _initTooltips('#mass_change');
+                    _massCheckboxes('#mass_change');
+
+                    _res.dialog({
+                        width: 'auto',
+                        modal: true,
+                        close: function(event, ui){
+                            $(this).dialog('destroy').remove()
+                        }
+                    });
+                },
+                error: function() {
+                    alert("{_T string="An error occured :(" escape="js"}");
+                }
+            });
+        });
+
         var _attendance_sheet_details = function(){
             var _selecteds = [];
             $('table.listing').find('input[type=checkbox]:checked').each(function(){
diff --git a/galette/templates/default/mass_change_members.tpl b/galette/templates/default/mass_change_members.tpl
new file mode 100644 (file)
index 0000000..1bba708
--- /dev/null
@@ -0,0 +1,63 @@
+{if $mode eq 'ajax'}
+    {assign var="extend" value='ajax.tpl'}
+{else}
+    {assign var="extend" value='page.tpl'}
+{/if}
+{extends file=$extend}
+{block name="content"}
+    <div id="mass_change"{if $mode neq 'ajax'} class="center"{else} title="{$page_title}"{/if}>
+    <form action="{$form_url}" method="post">
+        {if $mode neq 'ajax'}<h2>{$page_title}</h2>{/if}
+    {if !isset($changes)}
+        <p>{_T string="Only checked fields will be updated."}</p>
+    {else}
+        <p>{_T string="You are about to proceed following changes for selected members:"}</p>
+        <ul>
+        {foreach $changes as $field => $change}
+            {assign var="display_value" value=$change.value}
+            {if $field eq 'id_statut'}
+                {assign var="display_value" value=$statuts[$display_value]}
+            {/if}
+            {if $field eq 'titre_adh'}
+                {assign var="display_value" value=$titles_list[$display_value]->long}
+            {/if}
+            {if $field eq 'sexe_adh'}
+                {if $display_value eq {Galette\Entity\Adherent::NC}}
+                    {assign var="display_value" value={_T string="Unspecified"}}
+                {/if}
+                {if $display_value eq {Galette\Entity\Adherent::WOMAN}}
+                    {assign var="display_value" value={_T string="Woman"}}
+                {/if}
+                {if $display_value eq {Galette\Entity\Adherent::MAN}}
+                    {assign var="display_value" value={_T string="Man"}}
+                {/if}
+            {/if}
+            <li>
+                <input type="hidden" name="{$field}" value="{$change.value}"/>
+                {$change.label} {$display_value}
+            </li>
+        {/foreach}
+        </ul>
+    {/if}
+        <div class="button-container">
+    {if !isset($changes)}
+        {* Form entries*}
+        {include file="forms_types.tpl" 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>
+            <input type="hidden" name="confirm" value="1"/>
+            {if $mode eq 'ajax'}<input type="hidden" name="ajax" value="true"/>{/if}
+            {foreach $data as $key=>$value}
+                {if is_array($value)}
+                    {foreach $value as $val}
+                <input type="hidden" name="{$key}[]" value="{$val}"/>
+                    {/foreach}
+                {else}
+                <input type="hidden" name="{$key}" value="{$value}"/>
+                {/if}
+            {/foreach}
+        </div>
+    </form>
+    </div>
+{/block}
index 2e4f41c75c771d613be51a6378d3131f5f145a4d..59b095256916e1ab0196e8e10e25123b426c8121 100644 (file)
         {/if}
             </div>
     {/if}
-            {foreach item=fieldset from=$fieldsets}
-            <fieldset class="galette_form">
-                <legend>{$fieldset->label}</legend>
-                <div>
-                {if !$self_adh and $fieldset@first}
-                    {include file="forms_types/picture.tpl"}
-                {/if}
-                {foreach item=entry from=$fieldset->elements}
-                    {if $entry->field_id neq 'adresse2_adh'}
-                        {assign var="template" value="text.tpl"}
-                        {assign var="title" value=null}
-                        {assign var="tip" value=null}
-                        {assign var="size" value=null}
-                        {assign var="propname" value=$entry->propname}
-                        {assign var="value" value=null}
-                        {assign var="checked" value=null}
-                        {assign var="example" value=null}
-
-                        {if $entry->type eq constant('Galette\Entity\FieldsConfig::TYPE_BOOL')}
-                            {assign var="template" value="checkbox.tpl"}
-                            {assign var="value" value="1"}
-                        {/if}
-                        {if $entry->field_id eq 'titre_adh'}
-                            {assign var="template" value="titles.tpl"}
-                            {assign var="value" value=$member->title}
-                        {/if}
-                        {if $entry->field_id eq 'pref_lang'}
-                            {assign var="template" value="lang.tpl"}
-                        {/if}
-                        {if $entry->field_id eq 'sexe_adh'}
-                            {assign var="template" value="gender.tpl"}
-                        {/if}
-                        {if $entry->field_id eq 'societe_adh'}
-                            {assign var="template" value="company.tpl"}
-                        {/if}
-                        {if $entry->field_id|strpos:'date_' === 0 or $entry->field_id eq 'ddn_adh'}
-                            {assign var="template" value="date.tpl"}
-                        {/if}
-                        {if $entry->field_id eq 'adresse_adh'}
-                            {assign var="template" value="address.tpl"}
-                        {/if}
-                        {if $entry->field_id eq 'mdp_adh'}
-                            {if !$self_adh}
-                                {assign var="template" value="password.tpl"}
-                            {else}
-                                {assign var="template" value="captcha.tpl"}
-                            {/if}
-                        {/if}
-                        {if $entry->field_id eq 'info_adh'
-                            or $entry->field_id eq 'info_public_adh'}
-                            {assign var="template" value="textarea.tpl"}
-                            {if $entry->field_id eq 'info_adh'}
-                                {assign var="example" value={_T string="This comment is only displayed for admins and staff members."}}
-                            {else}
-                                {if $login->isAdmin() or $login->isStaff()}
-                                    {assign var="example" value={_T string="This comment is reserved to the member."}}
-                                {/if}
-                            {/if}
-                        {/if}
-                        {if $entry->field_id eq 'activite_adh'}
-                            {assign var="template" value="account.tpl"}
-                        {/if}
-                        {if $entry->field_id eq 'id_statut'}
-                            {assign var="template" value="status.tpl"}
-                        {/if}
-
-                        {if $entry->field_id eq 'gpgid'}
-                            {assign var="size" value="8"}
-                        {/if}
-                        {if $entry->field_id eq 'email_adh'
-                            or $entry->field_id eq 'msn_adh'
-                            or $entry->field_id eq 'jabber_adh'
-                            or $entry->field_id eq 'url_adh'}
-                            {assign var="size" value="30"}
-                        {/if}
-                        {if $entry->field_id eq 'fingerprint'}
-                            {assign var="size" value="40"}
-                        {/if}
-                        {if $entry->field_id eq 'bool_display_info'}
-                            {assign var="title" value={_T string="Do member want to appear publically?"}}
-                            {assign var="tip" value={_T string="If you check this box (and if you are up to date with your contributions), your full name, website address ad other informations will be publically visible on the members list.<br/>If you've uploaded a photo, it will be displayed on the trombinoscope page.<br/>Note that administrators can disabled public pages, this setting will have no effect in that case."}}
-                            {assign var="checked" value=$member->appearsInMembersList()}
-                        {/if}
-                        {if $entry->field_id eq 'login_adh'}
-                            {assign var="example" value={_T string="(at least %i characters)" pattern="/%i/" replace=2}}
-                        {/if}
-
-                        {if $entry->field_id eq 'bool_admin_adh'}
-                            {assign var="checked" value=$member->isAdmin()}
-                        {/if}
-                        {if $entry->field_id eq 'bool_exempt_adh'}
-                            {assign var="checked" value=$member->isDueFree()}
-                        {/if}
-                        {if $entry->field_id eq 'parent_id'}
-                            {assign var="value" value=$member->parent->id}
-                        {/if}
-
-                        {* If value has not been set, take the generic value *}
-                        {if !$value}
-                            {assign var="value" value=$member->$propname}
-                        {/if}
-
-                        {include
-                            file="forms_types/$template"
-                            name=$entry->field_id
-                            id=$entry->field_id
-                            value=$value
-                            required=$entry->required
-                            readonly=$entry->readonly
-                            disabled=$entry->disabled
-                            label=$entry->label
-                            title=$title
-                            size=$size
-                            tip=$tip
-                            compile_id="input_{$entry->field_id}"
-                            checked=$checked
-                        }
-                    {/if}
-                {/foreach}
-                {if isset($groups) and $groups|@count != 0 and $fieldset@last}
-                    {include file="forms_types/groups.tpl"}
-                {/if}
-                </div>
-            </fieldset>
-            {/foreach}
 
+    {* Main form entries*}
+    {include file="forms_types.tpl"}
+    {* Dynamic entries *}
     {include file="edit_dynamic_fields.tpl" object=$member}
+
     {if $pref_mail_method neq constant('Galette\Core\GaletteMail::METHOD_DISABLED') and (!$self_adh and ($login->isAdmin() or $login->isStaff()))}
                     <p>
                         <label for="mail_confirm">
index 40bb9d38cf9b87465415587bdaba825db7a1b281..a9d187027024054be75bf6bc74f7985e5f69a125 100644 (file)
@@ -89,6 +89,9 @@
         });
     </script>
 {/if}
+{if $require_mass}
+    <script type="text/javascript" src="{base_url}/{$scripts_dir}mass_changes.js"></script>
+{/if}
 {* If some additionnals headers should be added from plugins, we load the relevant template file
 We have to use a template file, so Smarty will do its work (like replacing variables). *}
 {if $headers|@count != 0}
diff --git a/galette/webroot/js/mass_changes.js b/galette/webroot/js/mass_changes.js
new file mode 100644 (file)
index 0000000..cf7a97e
--- /dev/null
@@ -0,0 +1,16 @@
+var _massCheckboxes = function(selector) {
+    if (typeof(selector) == 'undefined') {
+        selector = '';
+    } else {
+        selector = selector + ' ';
+    }
+
+    $(selector + 'select, ' + selector + 'textarea, ' + selector + 'input:not(.mass_checkbox)')
+        .off().on('change', function() {
+           $(this).parent().find('.mass_checkbox').prop('checked', true);
+        });
+}
+
+$(function() {
+    _massCheckboxes('#mass_change');
+});
index b4ffa0ab614a7bacfc3c0d8833809b4644b24a39..da1fb9929af3cb2f645c61f15bc6c5914f60823b 100644 (file)
@@ -649,6 +649,14 @@ h1 #sendmail .ui-button-text {
     background-image:url(images/icon-trash.png), url("jquery-ui/images/ui-bg_glass_75_ffb619_1x400.png");
 }
 
+#masschange {
+    background-image: url(images/icon-edit.png), url("jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png");
+}
+#masschange.ui-state-hover {
+    background-image:url(images/icon-edit.png), url("jquery-ui/images/ui-bg_glass_75_ffb619_1x400.png");
+}
+
+
 #subscribe {
     background-image:url(images/subscribe.png), url("jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png");
 }