]> git.agnieray.net Git - galette.git/commitdiff
Continue conversion
authorJohan Cwiklinski <johan@x-tnd.be>
Thu, 27 Jan 2022 06:03:13 +0000 (07:03 +0100)
committerJohan Cwiklinski <johan@x-tnd.be>
Wed, 8 Jun 2022 05:51:21 +0000 (07:51 +0200)
62 files changed:
galette/config/paths.inc.php
galette/includes/dependencies.php
galette/lib/Galette/Controllers/Crud/MembersController.php
galette/lib/Galette/Core/Pagination.php
galette/lib/Galette/Core/Preferences.php
galette/lib/Galette/Filters/MembersList.php
galette/templates/default/advanced_search.tpl [deleted file]
galette/templates/default/edit_dynamic_fields.tpl [deleted file]
galette/templates/default/forms_types.tpl [deleted file]
galette/templates/default/forms_types/account.tpl [deleted file]
galette/templates/default/forms_types/address.tpl [deleted file]
galette/templates/default/forms_types/captcha.tpl [deleted file]
galette/templates/default/forms_types/checkbox.tpl [deleted file]
galette/templates/default/forms_types/company.tpl [deleted file]
galette/templates/default/forms_types/date.tpl [deleted file]
galette/templates/default/forms_types/gender.tpl [deleted file]
galette/templates/default/forms_types/groups.tpl [deleted file]
galette/templates/default/forms_types/hidden.tpl [deleted file]
galette/templates/default/forms_types/input.tpl [deleted file]
galette/templates/default/forms_types/lang.tpl [deleted file]
galette/templates/default/forms_types/password.tpl [deleted file]
galette/templates/default/forms_types/payment_types.tpl [deleted file]
galette/templates/default/forms_types/picture.tpl [deleted file]
galette/templates/default/forms_types/select.tpl [deleted file]
galette/templates/default/forms_types/status.tpl [deleted file]
galette/templates/default/forms_types/text.tpl [deleted file]
galette/templates/default/forms_types/textarea.tpl [deleted file]
galette/templates/default/forms_types/titles.tpl [deleted file]
galette/templates/default/gestion_adherents.tpl [deleted file]
galette/templates/default/mass_change_members.tpl [deleted file]
galette/templates/default/sysinfos.tpl [deleted file]
galette/templates/gtwig/components/edit_dynamic_fields.html.twig [new file with mode: 0644]
galette/templates/gtwig/components/form.html.twig [new file with mode: 0644]
galette/templates/gtwig/components/forms/account.html.twig [new file with mode: 0644]
galette/templates/gtwig/components/forms/address.html.twig [new file with mode: 0644]
galette/templates/gtwig/components/forms/captcha.html.twig [new file with mode: 0644]
galette/templates/gtwig/components/forms/checkbox.html.twig [new file with mode: 0644]
galette/templates/gtwig/components/forms/company.html.twig [new file with mode: 0644]
galette/templates/gtwig/components/forms/date.html.twig [new file with mode: 0644]
galette/templates/gtwig/components/forms/gender.html.twig [new file with mode: 0644]
galette/templates/gtwig/components/forms/groups.html.twig [new file with mode: 0644]
galette/templates/gtwig/components/forms/hidden.html.twig [new file with mode: 0644]
galette/templates/gtwig/components/forms/input.html.twig [new file with mode: 0644]
galette/templates/gtwig/components/forms/lang.html.twig [new file with mode: 0644]
galette/templates/gtwig/components/forms/password.html.twig [new file with mode: 0644]
galette/templates/gtwig/components/forms/payment_types.html.twig [new file with mode: 0644]
galette/templates/gtwig/components/forms/picture.html.twig [new file with mode: 0644]
galette/templates/gtwig/components/forms/select.html.twig [new file with mode: 0644]
galette/templates/gtwig/components/forms/status.html.twig [new file with mode: 0644]
galette/templates/gtwig/components/forms/text.html.twig [new file with mode: 0644]
galette/templates/gtwig/components/forms/textarea.html.twig [new file with mode: 0644]
galette/templates/gtwig/components/forms/titles.html.twig [new file with mode: 0644]
galette/templates/gtwig/elements/header.html.twig
galette/templates/gtwig/elements/js/pwdcheck.html.twig [deleted file]
galette/templates/gtwig/elements/js/pwdcheck.js.twig [new file with mode: 0644]
galette/templates/gtwig/elements/scripts.html.twig
galette/templates/gtwig/modals/mass_change_members.html.twig [new file with mode: 0644]
galette/templates/gtwig/page.html.twig
galette/templates/gtwig/pages/advanced_search.html.twig [new file with mode: 0644]
galette/templates/gtwig/pages/members_list.html.twig [new file with mode: 0644]
galette/templates/gtwig/pages/preferences.html.twig
galette/templates/gtwig/public_page.html.twig

index 1f22aa8821b9159f646477e02b2beb52a43ccd1d..513dd557214f61315c1a77d2d70154fcc8182351 100644 (file)
@@ -122,5 +122,5 @@ if (!defined('GALETTE_TELEMETRY_URI')) {
 }
 
 if (!defined('GALETTE_TPL_THEME_DIR')) {
-    define('GALETTE_TPL_THEME_DIR', GALETTE_ROOT . 'templates/default/');
+    define('GALETTE_TPL_THEME_DIR', GALETTE_ROOT . 'templates/gtwig/'/*'templates/default/'*/);
 }
index 5ce12920bf5566b695ea4d1bab5853de2d48d581..0982c683797cbf835968f95db9c6e96131ef70ae 100644 (file)
@@ -67,11 +67,22 @@ $container->set(
 );
 
 $container->set('Slim\Views\Twig', function (ContainerInterface $c) {
+
+    $templates = ['__main__' => GALETTE_TPL_THEME_DIR];
+    foreach ($c->get('plugins')->getModules() as $module_id => $module) {
+        $dir = $module['root'] . '/templates/' . $c->get('preferences')->pref_theme;
+        if (!is_dir($dir)) {
+            continue;
+        }
+        $templates[$module['route']] = $dir;
+    }
+
     $view = new \Slim\Views\Twig(
-        GALETTE_ROOT . 'templates/gtwig/', //GALETTE_TPL_THEME_DIR //FIXME
+        $templates,
         [
             'cache' => rtrim(GALETTE_CACHE_DIR, DIRECTORY_SEPARATOR),
-            'debug' => true //FIXME
+            'debug' => (GALETTE_MODE === \Galette\Core\Galette::MODE_DEV),
+            'strict_variables' => (GALETTE_MODE == \Galette\Core\Galette::MODE_DEV)
         ]
     );
 
@@ -84,13 +95,28 @@ $container->set('Slim\Views\Twig', function (ContainerInterface $c) {
     //End Twig extensions
 
     //Twig functions
-    $function = new \Twig\TwigFunction('__', function ($string) {
-        return __($string);
+    $function = new \Twig\TwigFunction('__', function ($string, $domain = 'galette') {
+        return __($string, $domain);
+    });
+    $view->getEnvironment()->addFunction($function);
+
+    $function = new \Twig\TwigFunction('_T', function ($string, $domain = 'galette') {
+        return _T($string, $domain);
+    });
+    $view->getEnvironment()->addFunction($function);
+
+    $function = new \Twig\TwigFunction('_Tn', function ($singular, $plural, $count, $domain = 'galette') {
+        return _Tn($singular, $plural, $count, $domain);
     });
     $view->getEnvironment()->addFunction($function);
 
-    $function = new \Twig\TwigFunction('_T', function ($string) {
-        return _T($string);
+    $function = new \Twig\TwigFunction('_Tx', function ($context, $string, $domain = 'galette') {
+        return _Tx($context, $string, $domain);
+    });
+    $view->getEnvironment()->addFunction($function);
+
+    $function = new \Twig\TwigFunction('_Tnx', function ($context, $singular, $plural, $count, $domain = 'galette') {
+        return _Tnx($context, $singular, $plural, $count, $domain);
     });
     $view->getEnvironment()->addFunction($function);
 
@@ -119,20 +145,21 @@ $container->set('Slim\Views\Twig', function (ContainerInterface $c) {
     //End Twig functions
 
     //Twig globals
-    //$smarty->assign('flash', $c->get('flash'));
+    $view->getEnvironment()->addGlobal('flash', $c->get('flash'));
     $view->getEnvironment()->addGlobal('login', $c->get('login'));
     $view->getEnvironment()->addGlobal('logo', $c->get('logo'));
+
     //$smarty->assign('tpl', $smarty);
     //$smarty->assign('headers', $c->get('plugins')->getTplHeaders());
-    //$smarty->assign('plugin_actions', $c->get('plugins')->getTplAdhActions());
-    /*$smarty->assign(
+    $view->getEnvironment()->addGlobal('plugin_actions', $c->get('plugins')->getTplAdhActions());
+    $view->getEnvironment()->addGlobal(
         'plugin_batch_actions',
         $c->get('plugins')->getTplAdhBatchActions()
-    );*/
-    /*$smarty->assign(
+    );
+    $view->getEnvironment()->addGlobal(
         'plugin_detailled_actions',
         $c->get('plugins')->getTplAdhDetailledActions()
-    );*/
+    );
     //$smarty->assign('scripts_dir', 'js/');
     //$smarty->assign('jquery_dir', 'js/jquery/');
     //$smarty->assign('jquery_markitup_version', JQUERY_MARKITUP_VERSION);
@@ -148,7 +175,7 @@ $container->set('Slim\Views\Twig', function (ContainerInterface $c) {
     $view->getEnvironment()->addGlobal('galette_lang_name', $c->get('i18n')->getName());
     $view->getEnvironment()->addGlobal('languages', $c->get('i18n')->getList());
     $view->getEnvironment()->addGlobal('i18n', $c->get('i18n'));
-    //$smarty->assign('plugins', $c->get('plugins'));
+    $view->getEnvironment()->addGlobal('plugins', $c->get('plugins'));
     $view->getEnvironment()->addGlobal('preferences', $c->get('preferences'));
     /*
     $smarty->assign('pref_slogan', $c->get('preferences')->pref_slogan);
@@ -158,18 +185,17 @@ $container->set('Slim\Views\Twig', function (ContainerInterface $c) {
         'pref_editor_enabled',
         $c->get('preferences')->pref_editor_enabled
     );
-    $smarty->assign('pref_mail_method', $c->get('preferences')->pref_mail_method);
-    $smarty->assign('existing_mailing', $c->get('session')->mailing !== null);
-    $smarty->assign('contentcls', null);
-    $smarty->assign('additionnal_html_class', null);
+    $smarty->assign('pref_mail_method', $c->get('preferences')->pref_mail_method);*/
+    $view->getEnvironment()->addGlobal('existing_mailing', $c->get('session')->mailing !== null);
+    /*$smarty->assign('contentcls', null);
     $smarty->assign('error_detected', null);
     $smarty->assign('warning_detected', null);
-    $smarty->assign('success_detected', null);
-    $smarty->assign('html_editor', null);
-    $smarty->assign('require_charts', null);
-    $smarty->assign('require_mass', null);
-    $smarty->assign('autocomplete', null);
-    if ($c->get('login')->isAdmin() && $c->get('preferences')->pref_telemetry_date) {
+    $smarty->assign('success_detected', null);*/
+    $view->getEnvironment()->addGlobal('html_editor', false);
+    $view->getEnvironment()->addGlobal('require_charts', false);
+    $view->getEnvironment()->addGlobal('require_mass', false);
+    $view->getEnvironment()->addGlobal('autocomplete', false);
+    /*if ($c->get('login')->isAdmin() && $c->get('preferences')->pref_telemetry_date) {
         $now = new \DateTime();
         $sent = new \DateTime($c->get('preferences')->pref_telemetry_date);
         $sent->add(new \DateInterval('P1Y')); // ask to resend telemetry after one year
@@ -178,12 +204,6 @@ $container->set('Slim\Views\Twig', function (ContainerInterface $c) {
         }
     }
 
-    foreach ($c->get('plugins')->getModules() as $module_id => $module) {
-        $smarty->addTemplateDir(
-            $module['root'] . '/templates/' . $c->get('preferences')->pref_theme,
-            $module['route']
-        );
-    }
     */
     //End Twig globals
 
index 1061009e2e94a7553cd1678ab9e7357818986c28..f8d5087ffc775b60e5346aaabb51a4eaeebe04ec 100644 (file)
@@ -7,7 +7,7 @@
  *
  * PHP version 5
  *
- * Copyright © 2019-2021 The Galette Team
+ * Copyright © 2019-2022 The Galette Team
  *
  * This file is part of Galette (http://galette.tuxfamily.org).
  *
@@ -28,7 +28,7 @@
  * @package   Galette
  *
  * @author    Johan Cwiklinski <johan@x-tnd.be>
- * @copyright 2019-2021 The Galette Team
+ * @copyright 2019-2022 The Galette Team
  * @license   http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
  * @link      http://galette.tuxfamily.org
  * @since     Available since 0.9.4dev - 2019-12-02
@@ -66,7 +66,7 @@ use Analog\Analog;
  * @name      GaletteController
  * @package   Galette
  * @author    Johan Cwiklinski <johan@x-tnd.be>
- * @copyright 2019-2021 The Galette Team
+ * @copyright 2019-2022 The Galette Team
  * @license   http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
  * @link      http://galette.tuxfamily.org
  * @since     Available since 0.9.4dev - 2019-12-02
@@ -560,15 +560,15 @@ class MembersController extends CrudController
         $groups_list = $groups->getList();
 
         //assign pagination variables to the template and add pagination links
-        $filters->setSmartyPagination($this->router, $this->view->getSmarty(), false);
-        $filters->setViewCommonsFilters($this->preferences, $this->view->getSmarty());
+        $filters->setSmartyPagination($this->router, $this->view, false);
+        $filters->setViewCommonsFilters($this->preferences, $this->view);
 
         $this->session->filter_members = $filters;
 
         // display page
         $this->view->render(
             $response,
-            'gestion_adherents.tpl',
+            'pages/members_list.html.twig',
             array(
                 'page_title'            => _T("Members management"),
                 'require_mass'          => true,
@@ -802,7 +802,7 @@ class MembersController extends CrudController
         );
         $ptlist = $ptypes->getList();
 
-        $filters->setViewCommonsFilters($this->preferences, $this->view->getSmarty());
+        $filters->setViewCommonsFilters($this->preferences, $this->view);
 
         $social = new Social($this->zdb);
         $types = $member->getMemberRegisteredTypes();
@@ -814,7 +814,7 @@ class MembersController extends CrudController
         // display page
         $this->view->render(
             $response,
-            'advanced_search.tpl',
+            'pages/advanced_search.html.twig',
             array(
                 'page_title'            => _T("Advanced search"),
                 'filter_groups_options' => $groups_list,
@@ -1239,7 +1239,7 @@ class MembersController extends CrudController
         // display page
         $this->view->render(
             $response,
-            'mass_change_members.tpl',
+            'modals/mass_change_members.html.twig',
             array(
                 'mode'          => $request->isXhr() ? 'ajax' : '',
                 'page_title'    => str_replace(
@@ -1334,7 +1334,7 @@ class MembersController extends CrudController
         // display page
         $this->view->render(
             $response,
-            'mass_change_members.tpl',
+            'modals/mass_change_members.html.twig',
             array(
                 'mode'          => $request->isXhr() ? 'ajax' : '',
                 'page_title'    => str_replace(
index 3a9734e6407dbe20a76a9277622a2d64460bad2a..4d7da8b8f9b4ad1eae7adc3f235b87f5e63b76b3 100644 (file)
@@ -36,6 +36,7 @@
 
 namespace Galette\Core;
 
+use Slim\Router;
 use Slim\Slim;
 use Analog\Analog;
 use Laminas\Db\Sql\Select;
@@ -225,16 +226,15 @@ abstract class Pagination
     }
 
     /**
-     * Creates pagination links and assign some usefull variables to the
-     * Smarty template
+     * Creates pagination links and assign some useful variables to the template
      *
      * @param Router  $router     Application instance
-     * @param Smarty  $view       View instance
+     * @param mixed   $view       View instance
      * @param boolean $restricted Do not permit to display all
      *
      * @return void
      */
-    public function setSmartyPagination(\Slim\Router $router, \Smarty $view, $restricted = true)
+    public function setSmartyPagination(Router $router, $view, $restricted = true)
     {
         $paginate = null;
         $this->view = $view;
@@ -314,12 +314,12 @@ abstract class Pagination
             $options[0] = _T("All");
         }
 
-        //Now, we assign common variables to Smarty template
-        $view->assign('nb_pages', $this->pages);
-        $view->assign('page', $this->current_page);
-        $view->assign('numrows', $this->show);
-        $view->assign('pagination', $paginate);
-        $view->assign('nbshow_options', $options);
+        //Now, we assign common variables to template
+        $view->getEnvironment()->addGlobal('nb_pages', $this->pages);
+        $view->getEnvironment()->addGlobal('page', $this->current_page);
+        $view->getEnvironment()->addGlobal('numrows', $this->show);
+        $view->getEnvironment()->addGlobal('pagination', $paginate);
+        $view->getEnvironment()->addGlobal('nbshow_options', $options);
 
         $this->view = null;
         $this->router = null;
@@ -362,12 +362,12 @@ abstract class Pagination
             'value'     => $page
         ];
 
-        if ($this->view->getTemplateVars('cur_subroute')) {
+        if ($this->view->getEnvironment()->getGlobals()['cur_subroute']) {
             $args['type'] = $this->view->getTemplateVars('cur_subroute');
         }
 
         $href = $this->router->pathFor(
-            $this->view->getTemplateVars('cur_route'),
+            $this->view->getEnvironment()->getGlobals()['cur_route'],
             $args
         );
         return $href;
index ded4f71cb276bf6e5aff182e5b3068202210f19e..ec90d2d9ea2d7f6de1fdeea4b8531481a3abbdb4 100644 (file)
@@ -146,6 +146,7 @@ use Galette\Repository\Members;
  * @property boolean $pref_bool_groupsmanagers_mailings
  * @property boolean $pref_bool_groupsmanagers_exports
  * @property-read string $vpref_email_newadh Comma separated list of mail senders
+ * @property-read string $vpref_email Comma separated list of mail senders
  */
 class Preferences
 {
@@ -966,7 +967,7 @@ class Preferences
     public function __get($name)
     {
         $forbidden = array('defaults');
-        $virtuals = array('vpref_email_newadh');
+        $virtuals = array('vpref_email', 'vpref_email_newadh');
 
         if (!in_array($name, $forbidden) && isset($this->prefs[$name])) {
             if (
@@ -987,7 +988,7 @@ class Preferences
                     }
                 }
 
-                if (in_array($name, ['pref_email_newadh'])) {
+                if (in_array($name, ['vpref_email', 'pref_email_newadh'])) {
                     $values = explode(',', $value);
                     $value = $values[0]; //take first as default
                 }
@@ -1019,7 +1020,7 @@ class Preferences
     public function __isset($name)
     {
         $forbidden = array('defaults');
-        $virtuals = array('vpref_email_newadh');
+        $virtuals = array('vpref_email', 'vpref_email_newadh');
 
         if (!in_array($name, $forbidden) && isset($this->prefs[$name])) {
             return true;
index b896bdbeadda5ad0f5ac7adf7e2fbe8a8b611a9f..cfdf92a823084afd5fb796e10990c54368462e90 100644 (file)
@@ -281,11 +281,11 @@ class MembersList extends Pagination
      * Set commons filters for templates
      *
      * @param Preferences $prefs Preferences instance
-     * @param Smarty      $view  Smarty template reference
+     * @param mixed       $view  Template reference
      *
      * @return void
      */
-    public function setViewCommonsFilters($prefs, \Smarty $view)
+    public function setViewCommonsFilters($prefs, $view)
     {
         $filter_options = array(
             Members::FILTER_NAME            => _T("Name"),
@@ -301,12 +301,12 @@ class MembersList extends Pagination
             $filter_options[Members::FILTER_ID] = _T("Member ID");
         }
 
-        $view->assign(
+        $view->getEnvironment()->addGlobal(
             'field_filter_options',
             $filter_options
         );
 
-        $view->assign(
+        $view->getEnvironment()->addGlobal(
             'membership_filter_options',
             array(
                 Members::MEMBERSHIP_ALL     => _T("All members"),
@@ -320,7 +320,7 @@ class MembersList extends Pagination
             )
         );
 
-        $view->assign(
+        $view->getEnvironment()->addGlobal(
             'filter_accounts_options',
             array(
                 Members::ALL_ACCOUNTS       => _T("All accounts"),
diff --git a/galette/templates/default/advanced_search.tpl b/galette/templates/default/advanced_search.tpl
deleted file mode 100644 (file)
index 648a407..0000000
+++ /dev/null
@@ -1,704 +0,0 @@
-{extends file="page.tpl"}
-
-{block name="content"}
-        <form action="{path_for name="filter-memberslist"}" method="post" id="filtre" class="ui form">
-            <div class="galetteform ui styled fluid accordion field">
-                <div class="active ui title">
-                    <i class="dropdown icon"></i>
-                    {_T string="Simple search"}
-                </div>
-                <div class="active content">
-                    <div class="four fields">
-                        <div class="field">
-                            <label for="filter_str">{_T string="Search:"}</label>
-                            <input type="text" name="filter_str" id="filter_str" value="{$filters->filter_str}" type="search" placeholder="{_T string="Enter a value"}"/>&nbsp;
-                        </div>
-                        <div class="field">
-                            <label for="field_filter">{_T string="in:"}</label>
-                            <select name="field_filter" class="ui search dropdown nochosen">
-                                {html_options options=$field_filter_options selected=$filters->field_filter}
-                            </select>
-                        </div>
-                        <div class="field">
-                            <label for="membership_filter">{_T string="Membership status"}</label>
-                            <select id="membership_filter" name="membership_filter" class="ui search dropdown nochosen">
-                                {html_options options=$membership_filter_options selected=$filters->membership_filter}
-                            </select>
-                        </div>
-                        <div class="field">
-                            <label for="filter_account">{_T string="Account activity"}</label>
-                            <select id="filter_account" name="filter_account" class="ui search dropdown nochosen">
-                                {html_options options=$filter_accounts_options selected=$filters->filter_account}
-                            </select>
-                        </div>
-                        <div class="field">
-                            <label for="group_filter">{_T string="Member of group"}</label>
-                            <select name="group_filter" id="group_filter" class="ui search dropdown nochosen">
-                                <option value="0">{_T string="Select a group"}</option>
-{foreach from=$filter_groups_options item=group}
-                                <option value="{$group->getId()}"{if $filters->group_filter eq $group->getId()} selected="selected"{/if}>{$group->getIndentName()}</option>
-{/foreach}
-                            </select>
-                        </div>
-                    </div>
-                    <div class="inline fields">
-                        <label for="email_filter">{_T string="With email:"}</label>
-                        <div class="field">
-                            <div class="ui radio checkbox">
-                                <input type="radio" name="email_filter" id="filter_dc_email" value="{Galette\Repository\Members::FILTER_DC_EMAIL}"{if $filters->email_filter eq constant('Galette\Repository\Members::FILTER_DC_EMAIL')} checked="checked"{/if}>
-                                <label for="filter_dc_email">{_T string="Don't care"}</label>
-                            </div>
-                        </div>
-                        <div class="field">
-                            <div class="ui radio checkbox">
-                                <input type="radio" name="email_filter" id="filter_with_email" value="{Galette\Repository\Members::FILTER_W_EMAIL}"{if $filters->email_filter eq constant('Galette\Repository\Members::FILTER_W_EMAIL')} checked="checked"{/if}>
-                                <label for="filter_with_email">{_T string="With"}</label>
-                            </div>
-                        </div>
-                        <div class="field">
-                            <div class="ui radio checkbox">
-                                <input type="radio" name="email_filter" id="filter_without_email" value="{Galette\Repository\Members::FILTER_WO_EMAIL}"{if $filters->email_filter eq constant('Galette\Repository\Members::FILTER_WO_EMAIL')} checked="checked"{/if}>
-                                <label for="filter_without_email">{_T string="Without"}</label>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="galetteform ui styled fluid accordion field">
-                <div class="active ui title">
-                    <i class="dropdown icon"></i>
-                    {_T string="Advanced search"}
-                </div>
-                <div class="active content">
-                    <div class="two fields">
-                        <div class="field">
-                            <label>{_T string="Birth date"}</label>
-                            <div class="two fields">
-                                <div class="field">
-                                    <label for="birth_date_begin">{_T string="beetween"}</label>
-                                    <div class="ui calendar" id="birth-rangestart">
-                                        <div class="ui input left icon">
-                                            <i class="calendar icon"></i>
-                                                <input id="birth_date_begin" name="birth_date_begin" type="text" class="birth_date" maxlength="10" size="10" value="{$filters->birth_date_begin}" placeholder="{_T string="(yyyy-mm-dd format)"}" />
-                                        </div>
-                                    </div>
-                                </div>
-                                <div class="field">
-                                    <label for="birth_date_end">{_T string="and"}</label>
-                                    <div class="ui calendar" id="birth-rangeend">
-                                        <div class="ui input left icon">
-                                            <i class="calendar icon"></i>
-                                                <input id="birth_date_end" name="birth_date_end" type="text" class="birth_date" maxlength="10" size="10" value="{$filters->birth_date_end}" placeholder="{_T string="(yyyy-mm-dd format)"}"/>
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="field">
-                            <label>{_T string="Creation date"}</label>
-                            <div class="two fields">
-                                <div class="field">
-                                    <label for="creation_date_begin">{_T string="beetween"}</label>
-                                    <div class="ui calendar" id="creation-rangestart">
-                                        <div class="ui input left icon">
-                                            <i class="calendar icon"></i>
-                                                <input id="creation_date_begin" name="creation_date_begin" type="text" class="modif_date" maxlength="10" size="10" value="{$filters->creation_date_begin}" placeholder="{_T string="(yyyy-mm-dd format)"}"/>
-                                        </div>
-                                    </div>
-                                </div>
-                                <div class="field">
-                                    <label for="creation_date_end">{_T string="and"}</label>
-                                    <div class="ui calendar" id="creation-rangeend">
-                                        <div class="ui input left icon">
-                                            <i class="calendar icon"></i>
-                                                <input id="creation_date_end" name="creation_date_end" type="text" class="modif_date" maxlength="10" size="10" value="{$filters->creation_date_end}" placeholder="{_T string="(yyyy-mm-dd format)"}"/>
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="two fields">
-                        <div class="field">
-                            <label>{_T string="Modification date"}</label>
-                            <div class="two fields">
-                                <div class="field">
-                                    <label for="modif_date_begin">{_T string="beetween"}</label>
-                                    <div class="ui calendar" id="modification-rangestart">
-                                        <div class="ui input left icon">
-                                            <i class="calendar icon"></i>
-                                                <input id="modif_date_begin" name="modif_date_begin" type="text" class="modif_date" maxlength="10" size="10" value="{$filters->modif_date_begin}" placeholder="{_T string="(yyyy-mm-dd format)"}"/>
-                                        </div>
-                                    </div>
-                                </div>
-                                <div class="field">
-                                    <label for="modif_date_end">{_T string="and"}</label>
-                                    <div class="ui calendar" id="modification-rangeend">
-                                        <div class="ui input left icon">
-                                            <i class="calendar icon"></i>
-                                                <input id="modif_date_end" name="modif_date_end" type="text" class="modif_date" maxlength="10" size="10" value="{$filters->modif_date_end}" placeholder="{_T string="(yyyy-mm-dd format)"}"/>
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="field">
-                            <label>{_T string="Due date"}</label>
-                            <div class="two fields">
-                                <div class="field">
-                                    <label for="due_date_begin">{_T string="beetween"}</label>
-                                    <div class="ui calendar" id="due-rangestart">
-                                        <div class="ui input left icon">
-                                            <i class="calendar icon"></i>
-                                                <input id="due_date_begin" name="due_date_begin" type="text" class="due_date" maxlength="10" size="10" value="{$filters->due_date_begin}" placeholder="{_T string="(yyyy-mm-dd format)"}"/>
-                                        </div>
-                                    </div>
-                                </div>
-                                <div class="field">
-                                    <label for="due_date_end">{_T string="and"}</label>
-                                    <div class="ui calendar" id="due-rangeend">
-                                        <div class="ui input left icon">
-                                            <i class="calendar icon"></i>
-                                                <input id="due_date_end" name="due_date_end" type="text" class="due_date" maxlength="10" size="10" value="{$filters->due_date_end}" placeholder="{_T string="(yyyy-mm-dd format)"}"/>
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="two fields">
-                        <div class="field">
-                            <div class="grouped fields">
-                                <label for="show_public_infos">{_T string="Show public infos"}</label>
-                                <div class="field">
-                                    <div class="ui radio checkbox">
-                                        <input type="radio" name="show_public_infos" id="show_public_infos_dc" value="{Galette\Repository\Members::FILTER_DC_PUBINFOS}"{if $filters->show_public_infos eq constant('Galette\Repository\Members::FILTER_DC_PUBINFOS')} checked="checked"{/if}>
-                                        <label for="show_public_infos_dc" >{_T string="Don't care"}</label>
-                                    </div>
-                                </div>
-                                <div class="field">
-                                    <div class="ui radio checkbox">
-                                        <input type="radio" name="show_public_infos" id="show_public_infos_yes" value="{Galette\Repository\Members::FILTER_W_PUBINFOS}"{if $filters->show_public_infos eq constant('Galette\Repository\Members::FILTER_W_PUBINFOS')} checked="checked"{/if}>
-                                        <label for="show_public_infos_yes" >{_T string="Yes"}</label>
-                                    </div>
-                                </div>
-                                <div class="field">
-                                    <div class="ui radio checkbox">
-                                        <input type="radio" name="show_public_infos" id="show_public_infos_no" value="{Galette\Repository\Members::FILTER_WO_PUBINFOS}"{if $filters->show_public_infos eq constant('Galette\Repository\Members::FILTER_WO_PUBINFOS')} checked="checked"{/if}>
-                                        <label for="show_public_infos_no" >{_T string="No"}</label>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="field">
-                            <label for="status">{_T string="Status"}</label>
-                            <select name="status[]" id="status" multiple="" class="ui search dropdown nochosen">
-                                <option value="">{_T string="Status"}</option>
-                                {html_options options=$statuts selected=$filters->status}
-                            </select>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="galetteform ui styled fluid accordion field">
-                <div class="active ui title">
-                    <i class="dropdown icon"></i>
-                    {_T string="Advanced groups search"} ({_T string="Experimental"})
-                    <a
-                        href="#"
-                        id="addbutton_g"
-                        class="ui tiny compact icon green button tab-button tooltip"
-                    >
-                        <i class="plus icon"></i>
-                        <span class="hidden">{_T string="Add new group search criteria"}</span>
-                    </a>
-                </div>
-                <div class="active content">
-                    <select name="groups_logical_operator" class="operator_selector nochosen">
-                      <option value="{Galette\Filters\AdvancedMembersList::OP_AND}"{if $filters->groups_search_log_op eq constant('Galette\Filters\AdvancedMembersList::OP_AND')} selected="selected"{/if}>{_T string="In all selected groups"}</option>
-                      <option value="{Galette\Filters\AdvancedMembersList::OP_OR}"{if $filters->groups_search_log_op eq constant('Galette\Filters\AdvancedMembersList::OP_OR')} selected="selected"{/if}>{_T string="In any of selected groups"}</option>
-                    </select>
-                    <ul id="groups_search_list" class="fields_list">
-                    {foreach from=$filters->groups_search item=gs}
-                             <li>
-                                <select name="groups_search[]" class="group_selector nochosen">
-                                        <option value="">{_T string="Select a group"}</option>
-                                        {foreach from=$filter_groups_options item=group}
-                                        <option value="{$group->getId()}"{if $gs.group eq $group->getId()} selected="selected"{/if}>{$group->getName()}</option>
-                                        {/foreach}
-                                </select>
-                                <a
-                                    href="#"
-                                    class="ui small compact red icon button fright tooltip delete delcriteria"
-                                >
-                                    <i class="trash alt icon"></i>
-                                    <span class="sr-only">{_T string="Remove criteria"}</span>
-                                </a>
-                            </li>
-                     {/foreach}
-                     </ul>
-                </div>
-            </div>
-
-            <div class="galetteform ui styled fluid accordion field">
-                <div class="active ui title">
-                    <i class="dropdown icon"></i>
-                    {_T string="Within contributions"}
-                </div>
-                <div class="active content">
-                    <div class="two fields">
-                        <div class="field">
-                            <label>{_T string="Creation date"}</label>
-                            <div class="two fields">
-                                <div class="field">
-                                    <label for="contrib_creation_date_begin">{_T string="beetween"}</label>
-                                    <div class="ui calendar" id="contrib-creation-rangestart">
-                                        <div class="ui input left icon">
-                                            <i class="calendar icon"></i>
-                                            <input id="contrib_creation_date_begin" name="contrib_creation_date_begin" type="text" class="modif_date" maxlength="10" size="10" value="{$filters->contrib_creation_date_begin}" placeholder="{_T string="(yyyy-mm-dd format)"}"/>
-                                        </div>
-                                    </div>
-                                </div>
-                                <div class="field">
-                                    <label for="contrib_creation_date_end">{_T string="and"}</label>
-                                    <div class="ui calendar" id="contrib-creation-rangeend">
-                                        <div class="ui input left icon">
-                                            <i class="calendar icon"></i>
-                                            <input id="contrib_creation_date_end" name="contrib_creation_date_end" type="text" class="modif_date" maxlength="10" size="10" value="{$filters->contrib_creation_date_end}" placeholder="{_T string="(yyyy-mm-dd format)"}"/>
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="field">
-                            <label>{_T string="Begin date"}</label>
-                            <div class="two fields">
-                                <div class="field">
-                                    <label for="contrib_begin_date_begin">{_T string="beetween"}</label>
-                                    <div class="ui calendar" id="contrib-begin-rangestart">
-                                        <div class="ui input left icon">
-                                            <i class="calendar icon"></i>
-                                            <input id="contrib_begin_date_begin" name="contrib_begin_date_begin" type="text" class="modif_date" maxlength="10" size="10" value="{$filters->contrib_begin_date_begin}" placeholder="{_T string="(yyyy-mm-dd format)"}"/>
-                                        </div>
-                                    </div>
-                                </div>
-                                <div class="field">
-                                    <label for="contrib_begin_date_end">{_T string="and"}</label>
-                                    <div class="ui calendar" id="contrib-begin-rangeend">
-                                        <div class="ui input left icon">
-                                            <i class="calendar icon"></i>
-                                            <input id="contrib_begin_date_end" name="contrib_begin_date_end" type="text" class="modif_date" maxlength="10" size="10" value="{$filters->contrib_begin_date_end}" placeholder="{_T string="(yyyy-mm-dd format)"}"/>
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="two fields">
-                        <div class="field">
-                            <label>{_T string="End date"}</label>
-                            <div class="two fields">
-                                <div class="field">
-                                    <label for="contrib_end_date_begin">{_T string="beetween"}</label>
-                                    <div class="ui calendar" id="contrib-end-rangestart">
-                                        <div class="ui input left icon">
-                                            <i class="calendar icon"></i>
-                                            <input id="contrib_end_date_begin" name="contrib_end_date_begin" type="text" class="due_date" maxlength="10" size="10" value="{$filters->contrib_end_date_begin}" placeholder="{_T string="(yyyy-mm-dd format)"}"/>
-                                        </div>
-                                    </div>
-                                </div>
-                                <div class="field">
-                                    <label for="contrib_end_date_end">{_T string="and"}</label>
-                                    <div class="ui calendar" id="contrib-end-rangeend">
-                                        <div class="ui input left icon">
-                                            <i class="calendar icon"></i>
-                                                <input id="contrib_end_date_end" name="contrib_end_date_end" type="text" class="due_date" maxlength="10" size="10" value="{$filters->contrib_end_date_end}" placeholder="{_T string="(yyyy-mm-dd format)"}"/>
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="field">
-                            <label>{_T string="Amount"}</label>
-                            <div class="two fields">
-                                <div class="field">
-                                    <label for="contrib_min_amount">{_T string="beetween"}</label>
-                                    <input id="contrib_min_amount" name="contrib_min_amount" type="text" maxlength="10" size="10" value="{$filters->contrib_min_amount}"/>
-                                </div>
-                                <div class="field">
-                                    <label for="contrib_max_amount">{_T string="and"}</label>
-                                    <input id="contrib_max_amount" name="contrib_max_amount" type="text" maxlength="10" size="10" value="{$filters->contrib_max_amount}"/>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="two fields">
-                        <div class="field">
-                            <label for="contributions_types">{_T string="Type"}</label>
-                            <select name="contributions_types[]" id="contributions_types" multiple="" class="ui dropdown nochosen">
-                                <option value="">{_T string="Type"}</option>
-                                {html_options options=$contributions_types selected=$filters->contributions_types}
-                            </select>
-                        </div>
-                        <div class="field">
-                            <label for="payments_types">{_T string="Payment type"}</label>
-                            <select name="payments_types[]" id="payments_types" multiple="" class="ui dropdown nochosen">
-                                <option value="">{_T string="Payment type"}</option>
-                                {html_options options=$payments_types selected=$filters->payments_types}
-                            </select>
-                        </div>
-                    </div>
-{foreach $contrib_dynamics as $field}
-                    <div class="field">
-    {assign var=fid value=$field->getId()}
-    {if $field|is_a:'Galette\DynamicFields\Choice'}
-        {assign var=rid value="cdsc_$fid"}
-    {else}
-        {assign var=rid value="cds_$fid"}
-    {/if}
-                        <label for="cds{if $field|is_a:'Galette\DynamicFields\Choice'}c{/if}_{$field->getId()}">{$field->getName()}</label>
-    {if $field|is_a:'Galette\DynamicFields\Line'}
-                        <input type="text" name="cds_{$field->getId()}" id="cds_{$field->getId()}" value="{if isset($filters->contrib_dynamic.$rid)}{$filters->contrib_dynamic.$rid}{/if}" />
-    {elseif $field|is_a:'Galette\DynamicFields\Text'}
-                        <textarea name="cds_{$field->getId()}" id="cds_{$field->getId()}">{if isset($filters->contrib_dynamic.$rid)}{$filters->contrib_dynamic.$rid}{/if}</textarea>
-    {elseif $field|is_a:'Galette\DynamicFields\Choice'}
-                        <select name="cdsc_{$field->getId()}[]" id="cdsc_{$field->getId()}" multiple="multiple" class="ui dropdown nochosen">
-                            <option value="">{_T string="Select"}</option>
-        {foreach $field->getValues() item=choice key=k}
-                            <option value="{$k}"{if isset($cds.field) and  $cds.field eq $rid} selected="selected"{/if}>{$choice}</option>
-        {/foreach}
-                        </select>
-    {/if}
-                    </div>
-{/foreach}
-                </div>
-            </div>
-                <div class="galetteform ui styled fluid accordion field">
-                    <div class="active ui title">
-                        <i class="dropdown icon"></i>
-                        {_T string="Free search"}
-                        <a
-                            href="#"
-                            id="addbutton"
-                            class="ui tiny compact icon green button tab-button tooltip"
-                        >
-                            <i class="plus icon"></i>
-                            <span class="hidden">{_T string="Add new free search criteria"}</span>
-                        </a>
-                    </div>
-                    <div class="active content">
-                        <ul id="fs_sortable" class="fields_list connectedSortable">
-{foreach from=$filters->free_search item=fs}
-                            <li>
-                                <select name="free_logical_operator[]" class="operator_selector nochosen">
-                                    <option value="{Galette\Filters\AdvancedMembersList::OP_AND}"{if $fs.log_op eq constant('Galette\Filters\AdvancedMembersList::OP_AND')} selected="selected"{/if}>{_T string="and"}</option>
-                                    <option value="{Galette\Filters\AdvancedMembersList::OP_OR}"{if $fs.log_op eq constant('Galette\Filters\AdvancedMembersList::OP_OR')} selected="selected"{/if}>{_T string="or"}</option>
-                                </select>
-                                <select name="free_field[]" class="field_selector nochosen">
-                                    <option value="">{_T string="Select a field"}</option>
-    {foreach $search_fields as $field}
-        {if $fs.field eq $field@key}
-            {if $field@key|strpos:'date_' === 0 or $field@key eq 'ddn_adh'}
-                {assign var=type value=constant('Galette\DynamicFields\DynamicField::DATE')}
-            {else if $field@key === {Galette\Entity\Status::PK}}
-                {assign var=type value=constant('Galette\DynamicFields\DynamicField::CHOICE')}
-                {assign var=fvalues value=$statuts}
-            {else if $field@key === 'sexe_adh'}
-                {assign var=type value=constant('Galette\DynamicFields\DynamicField::CHOICE')}
-                {assign var=fvalues value=[Galette\Entity\Adherent::NC => {_T string="Unspecified"}, Galette\Entity\Adherent::MAN => {_T string="Man"}, Galette\Entity\Adherent::WOMAN => {_T string="Woman"}]}
-            {else}
-                {assign var=type value=constant('Galette\DynamicFields\DynamicField::LINE')}
-            {/if}
-        {/if}
-                                    <option value="{$field@key}"{if $fs.field eq $field@key} selected="selected"{/if}>{$field.label}</option>
-    {/foreach}
-    {foreach $adh_dynamics as $field}
-        {if $field|is_a:'Galette\DynamicFields\Separator'}
-                {continue}
-        {/if}
-        {assign var=fid value=$field->getId()}
-        {assign var=rid value="dyn_$fid"}
-        {if $fs.field eq $rid}
-            {assign var=cur_field value=$field}
-        {/if}
-                                    <option value="dyn_{$field->getId()}"{if $fs.field eq $rid} selected="selected"{/if}>{$field->getName()}</option>
-    {/foreach}
-    {foreach from=$adh_socials item=$label key=$type}
-        {assign var=rid value="socials_$type"}
-        {if $fs.field eq $rid}
-            {assign var=cur_field value=$type}
-        {/if}
-        <option value="socials_{$type}"{if $fs.field eq $rid} selected="selected"{/if}>{$label}</option>
-    {/foreach}
-
-                        </select>
-    {* may not be defined *}
-    {if !isset($cur_field)}{assign var=cur_field value=null}{/if}
-    {if !isset($type)}{assign var=type value=null}{/if}
-                                <span class="data">
-                                    <input type="hidden" name="free_type[]" value="{if isset($cur_field)}{$cur_field->getType()}{/if}"/>
-    {if $cur_field|is_a:'Galette\DynamicFields\Choice' || $type eq constant('Galette\DynamicFields\DynamicField::CHOICE')}
-                                    <select name="free_query_operator[]" class="free_operator nochosen">
-                                        <option value="{Galette\Filters\AdvancedMembersList::OP_EQUALS}"{if $fs.qry_op eq constant('Galette\Filters\AdvancedMembersList::OP_EQUALS')} selected="selected"{/if}>{_T string="is"}</option>
-                                        <option value="{Galette\Filters\AdvancedMembersList::OP_NOT_EQUALS}"{if $fs.qry_op eq constant('Galette\Filters\AdvancedMembersList::OP_NOT_EQUALS')} selected="selected"{/if}>{_T string="is not"}</option>
-                                    </select>
-                                    <select name="free_text[]" class="free_text nochosen">
-        {if $cur_field|is_a:'Galette\DynamicFields\Choice'}
-                        {html_options options=$cur_field->getValues() selected=$fs.search}
-        {else}
-                        {html_options options=$fvalues selected=$fs.search}
-        {/if}
-                                    </select>
-    {elseif $cur_field|is_a:'Galette\DynamicFields\Date' || $type == constant('Galette\DynamicFields\DynamicField::DATE')}
-                                    <select name="free_query_operator[]" class="free_operator nochosen">
-                                        <option value="{Galette\Filters\AdvancedMembersList::OP_EQUALS}"{if $fs.qry_op eq constant('Galette\Filters\AdvancedMembersList::OP_EQUALS')} selected="selected"{/if}>{_T string="is"}</option>
-                                        <option value="{Galette\Filters\AdvancedMembersList::OP_BEFORE}"{if $fs.qry_op eq constant('Galette\Filters\AdvancedMembersList::OP_BEFORE')} selected="selected"{/if}>{_T string="before"}</option>
-                                        <option value="{Galette\Filters\AdvancedMembersList::OP_AFTER}"{if $fs.qry_op eq constant('Galette\Filters\AdvancedMembersList::OP_AFTER')} selected="selected"{/if}>{_T string="after"}</option>
-                                    </select>
-                                    <input type="text" name="free_text[]" value="{$fs.search|date_format:{_T string="Y-m-d"}}" class="modif_date" maxlength="10" size="10"/>
-                                    <span class="exemple">{_T string="(yyyy-mm-dd format)"}</span>
-    {elseif $cur_field|is_a:'Galette\DynamicFields\Boolean' || $type == constant('Galette\DynamicFields\DynamicField::BOOLEAN')}
-                                    <select name="free_query_operator[]" class="free_operator nochosen">
-                                        <option value="{Galette\Filters\AdvancedMembersList::OP_EQUALS}"{if $fs.qry_op eq constant('Galette\Filters\AdvancedMembersList::OP_EQUALS')} selected="selected"{/if}>{_T string="is"}</option>
-                                    </select>
-                                    <input type="radio" name="free_text[]" id="free_text_yes" value="1"{if $fs.search eq 1} checked="checked"{/if}/><label for="free_text_yes">{_T string="Yes"}</label>
-                                    <input type="radio" name="free_text[]" id="free_text_no" value="0"{if $fs.search eq 0} checked="checked"{/if}/><label for="free_text_no">{_T string="No"}</label>
-    {else}
-                                    <select name="free_query_operator[]" class="free_operator nochosen">
-                                        <option value="{Galette\Filters\AdvancedMembersList::OP_EQUALS}"{if $fs.qry_op eq constant('Galette\Filters\AdvancedMembersList::OP_EQUALS')} selected="selected"{/if}>{_T string="is"}</option>
-                                        <option value="{Galette\Filters\AdvancedMembersList::OP_CONTAINS}"{if $fs.qry_op eq constant('Galette\Filters\AdvancedMembersList::OP_CONTAINS')} selected="selected"{/if}>{_T string="contains"}</option>
-                                        <option value="{Galette\Filters\AdvancedMembersList::OP_NOT_EQUALS}"{if $fs.qry_op eq constant('Galette\Filters\AdvancedMembersList::OP_NOT_EQUALS')} selected="selected"{/if}>{_T string="is not"}</option>
-                                        <option value="{Galette\Filters\AdvancedMembersList::OP_NOT_CONTAINS}"{if $fs.qry_op eq constant('Galette\Filters\AdvancedMembersList::OP_NOT_CONTAINS')} selected="selected"{/if}>{_T string="do not contains"}</option>
-                                        <option value="{Galette\Filters\AdvancedMembersList::OP_STARTS_WITH}"{if $fs.qry_op eq constant('Galette\Filters\AdvancedMembersList::OP_STARTS_WITH')} selected="selected"{/if}>{_T string="starts with"}</option>
-                                        <option value="{Galette\Filters\AdvancedMembersList::OP_ENDS_WITH}"{if $fs.qry_op eq constant('Galette\Filters\AdvancedMembersList::OP_ENDS_WITH')} selected="selected"{/if}>{_T string="ends with"}</option>
-                                    </select>
-                                    <input type="text" name="free_text[]" value="{$fs.search}"{if $cur_field|is_a:'Galette\DynamicFields\Text'} class="large"{/if}/>
-    {/if}
-                                </span>
-                                <a
-                                    href="#"
-                                    class="ui small compact red icon button fright tooltip delete delcriteria"
-                                >
-                                    <i class="trash alt icon"></i>
-                                    <span class="sr-only">{_T string="Remove criteria"}</span>
-                                </a>
-                            </li>
-{/foreach}
-                        </ul>
-                    </div>
-                </div>
-            <div class="ui basic center aligned segment">
-                <input type="submit" class="ui primary button" value="{_T string="Filter"}"/>
-                <input type="hidden" name="advanced_filtering" value="true" />
-                <input type="submit" name="clear_adv_filter" class="ui button" value="{_T string="Clear filter"}"/>
-                {include file="forms_types/csrf.tpl"}
-            </div>
-        </form>
-{/block}
-
-{block name="javascripts"}
-        <script type="text/javascript">
-            var _operators = {
-                op_equals: { id: {Galette\Filters\AdvancedMembersList::OP_EQUALS}, name: "{_T string='is'}" },
-                op_contains: { id: {Galette\Filters\AdvancedMembersList::OP_CONTAINS}, name: "{_T string='contains'}" },
-                op_not_equals: { id: {Galette\Filters\AdvancedMembersList::OP_NOT_EQUALS}, name: "{_T string='is not'}" },
-                op_not_contains: { id: {Galette\Filters\AdvancedMembersList::OP_NOT_CONTAINS}, name: "{_T string='do not contains'}" },
-                op_starts_with: { id: {Galette\Filters\AdvancedMembersList::OP_STARTS_WITH}, name: "{_T string='starts with'}" },
-                op_ends_with: { id: {Galette\Filters\AdvancedMembersList::OP_ENDS_WITH}, name: "{_T string='ends with'}" },
-                op_before: { id: {Galette\Filters\AdvancedMembersList::OP_BEFORE}, name: "{_T string='before'}" },
-                op_after: { id: {Galette\Filters\AdvancedMembersList::OP_AFTER}, name: "{_T string='after'}" },
-            };
-
-            var _fields = {
-{foreach $search_fields as $field}
-    {if $field@key|strpos:'date_' === 0 or $field@key eq 'ddn_adh'}
-        {assign var=type value=constant('Galette\DynamicFields\DynamicField::DATE')}
-    {else if $field@key === {Galette\Entity\Status::PK}}
-        {assign var=type value=constant('Galette\DynamicFields\DynamicField::CHOICE')}
-        {assign var=fvalues value=$statuts}
-    {else if $field@key === 'sexe_adh'}
-        {assign var=type value=constant('Galette\DynamicFields\DynamicField::CHOICE')}
-        {assign var=fvalues value=[Galette\Entity\Adherent::NC => {_T string="Unspecified"}, Galette\Entity\Adherent::MAN => {_T string="Man"}, Galette\Entity\Adherent::WOMAN => {_T string="Woman"}]}
-    {else}
-        {assign var=type value=constant('Galette\DynamicFields\DynamicField::LINE')}
-    {/if}
-                {$field@key}: { type:'{$type}'{if isset($fvalues)}, values: {$fvalues|@json_encode}{/if} },
-{/foreach}
-{foreach $adh_dynamics as $field}
-    {if $field|is_a:'Galette\DynamicFields\Separator'}
-        {continue}
-    {else if $field|is_a:'Galette\DynamicFields\Choice'}
-                dyn_{$field->getId()}: { type:'{$field->getType()}', values: {$field->getValues()|@json_encode} },
-    {else}
-                dyn_{$field->getId()}: { type:'{$field->getType()}' },
-    {/if}
-{/foreach}
-            };
-
-            var _newFilter = function(elt) {
-                elt.find('span').html('');
-                elt.find('select.operator_selector').val(0);
-                elt.find('select.field_selector').val('');
-            }
-            var _rmFilter = function(elt) {
-                if ( !elt ) {
-                    elt = $('li');
-                }
-                elt.find('.delcriteria').click(function(){
-                    var _this = $(this);
-                    if ( _this.parents('ul').find('li').length > 1 ) {
-                        _this.parent('li').remove();
-                    } else {
-                        _newFilter(_this.parent('li'));
-                    }
-                    return false;
-                });
-            }
-            var _getOperatorSelector = function(list) {
-                var _options = '';
-                for (var i = 0; i < list.length; i++) {
-                    var _operator = _operators[list[i]];
-                    _options += '<option value="' + _operator.id + '">' + _operator.name + '</option>';
-                }
-                return '<select name="free_query_operator[]" class="free_operator newselectize">' + _options + '</select>';
-            }
-
-            /*var _datePickers = function() {
-                $('.modif_date').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 string="Select a date" escape="js"}</span>'
-                });
-                $('.due_date').datepicker({
-                    changeMonth: true,
-                    changeYear: true,
-                    showOn: 'button',
-                    yearRange: 'c-10:c+5',
-                    buttonText: '<i class="ui calendar alt icon"></i> <span class="sr-only">{_T string="Select a date" escape="js"}</span>'
-                });
-            }*/
-
-            var _selectize = function(selector) {
-                if ( !selector ) {
-                    selector = '.operator_selector,.field_selector,.free_operator,.free_text,.group_selector';
-                }
-
-                $(selector).selectize({
-                    maxItems: 1
-                });
-            }
-
-            var _initFieldSelector = function(parent) {
-                if (typeof parent == 'undefined') {
-                    parent = '';
-                }
-                $(parent + '.field_selector').change(function () {
-                    var _field_id = $(this).val();
-                    var _field    = _fields[_field_id];
-                    var _type     = _field.type;
-
-                    if (!_type) {
-                        return false;
-                    }
-
-                    var _html;
-                    switch(_type) {
-                        case '{constant('Galette\DynamicFields\DynamicField::BOOLEAN')}':
-                            _html  = _getOperatorSelector(['op_equals']);
-
-                            _html += '<input type="radio" name="free_text[]" id="free_text_yes" value="1"{if $fs.search eq 1} checked="checked"{/if}/><label for="free_text_yes">{_T string="Yes"}</label><input type="radio" name="free_text[]" id="free_text_no" value="0"{if $fs.search eq 0} checked="checked"{/if}/><label for="free_text_no">{_T string="No"}</label>';
-                            break;
-                        case '{constant('Galette\DynamicFields\DynamicField::CHOICE')}':
-                            _html = _getOperatorSelector(['op_equals', 'op_not_equals']);
-                            var _options = '';
-                            if (Array.isArray(_field.values)) {
-                                for (var i = 0; i < _field.values.length; i++) {
-                                    _options += '<option value="' + i + '">' + _field.values[i] + '</option>';
-                                }
-                            } else {
-                                for (key in _field.values) {
-                                    _options += '<option value="' + key + '">' + _field.values[key] + '</option>';
-                                }
-                            }
-                            _html += '<select name="free_text[]" class="newselectize">' + _options + '</select>';
-                            break;
-                        case '{constant('Galette\DynamicFields\DynamicField::DATE')}':
-                            _html  = _getOperatorSelector(['op_equals', 'op_before', 'op_after']);
-                            _html += '<input type="text" name="free_text[]" class="modif_date" maxlength="10" size="10"/>';
-                            _html += '<span class="exemple">{_T string="(yyyy-mm-dd format)"}</span>';
-                            break;
-                        default:
-                            _html  = _getOperatorSelector(['op_equals', 'op_contains', 'op_not_equals', 'op_not_contains', 'op_starts_with', 'op_ends_with']);
-                            _html += '<input type="text" name="free_text[]"';
-                            if (_type == 'text') {
-                                _html += ' class="large"';
-                            }
-                            _html += '/>';
-                            break;
-
-                    }
-                    _html += '<input type="hidden" name="free_type[]" value="' + _type + '"/>';
-                    $(this).parent().find('span.data').html(_html);
-                    _selectize('.newselectize');
-                    $('.newselectize').removeClass('newselectize');
-                    //_datePickers();
-                    _fieldsInSortable();
-                });
-                _rmFilter();
-            }
-
-            $(function(){
-                _initSortable();
-                //_datePickers();
-                _selectize();
-
-               $('#addbutton_g').click(function(){
-                    $('.operator_selector,.group_selector').each(function(){ // do this for every select with the 'combobox' class
-                        if ($(this)[0].selectize) { // requires [0] to select the proper object
-                            var value = $(this).val(); // store the current value of the select/input
-                            $(this)[0].selectize.destroy(); // destroys selectize()
-                            $(this).val(value);  // set back the value of the select/input
-                        }
-                    });
-
-                    $('#groups_search_list li:first')
-                            .clone() // copy
-                            .insertAfter('#groups_search_list li:last'); // where
-                    _selectize();
-                    return false;
-                });
-
-                $('#addbutton').click(function(){
-                    $('.operator_selector,.field_selector,.free_operator').each(function(){ // do this for every select with the 'combobox' class
-                        if ($(this)[0].selectize) { // requires [0] to select the proper object
-                            var value = $(this).val(); // store the current value of the select/input
-                            $(this)[0].selectize.destroy(); // destroys selectize()
-                            $(this).val(value);  // set back the value of the select/input
-                        }
-                    });
-                    $('#fs_sortable li:first')
-                            .clone() // copy
-                            .insertAfter('#fs_sortable li:last'); // where
-                    _selectize();
-                    //_datePickers();
-                    _fieldsInSortable();
-                    _initFieldSelector();
-                    return false;
-                });
-
-                _initFieldSelector();
-
-                /*$('.birth_date').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 string="Select a date" escape="js"}</span>'
-                });*/
-            });
-        </script>
-{/block}
diff --git a/galette/templates/default/edit_dynamic_fields.tpl b/galette/templates/default/edit_dynamic_fields.tpl
deleted file mode 100644 (file)
index 14993d3..0000000
+++ /dev/null
@@ -1,239 +0,0 @@
-{if !empty($object->getDynamicFields())}
-    {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'}
-    <label>{$field->getName()|escape}</label>
-    {else}
-    <label 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}
-            {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}
-            {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}
-        </select>
-    {elseif $field|is_a:'Galette\DynamicFields\Date'}
-        <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>
-    {elseif $field|is_a:'Galette\DynamicFields\Boolean'}
-        <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'}
-        {if $object->id}
-        <label class="labelalign" for="info_field_{$field->getId()}_{$loop}_new">{_T string="new"}</label>
-        {/if}
-        <input
-            type="file"
-            name="info_field_{$field->getId()}_{$loop}"
-            id="info_field_{$field->getId()}_{$loop}_new"
-            {if $field->isRequired() and $valuedata eq ''} required="required"{/if}
-            {if $disabled} disabled="disabled"{/if}
-        />
-        {if $object->id}
-        <label class="labelalign" for="info_field_{$field->getId()}_{$loop}_current">{_T string="current"}</label>
-        <a href="{path_for name="getDynamicFile" data=["id" => $object->id, "fid" => $field->getId(), "pos" => $loop, "name" => $valuedata]}">
-            {$valuedata}
-        </a>
-        - <label class="labelalign" for="info_field_{$field->getId()}_{$loop}_delete">
-            {_T string="delete"}
-        </label>
-        <input
-            type="checkbox"
-            name="info_field_{$field->getId()}_{$loop}"
-            id="info_field_{$field->getId()}_{$loop}_delete"
-            onclick="this.form.info_field_{$field->getId()}_{$loop}_new.disabled = this.checked;"
-        />
-        {/if}
-    {/if}
-{/function}
-
-<div class="ui styled fluid accordion field">
-    <div class="active title">
-        <i class="icon dropdown"></i>
-        {_T string="Additionnal fields:"}
-    </div>
-    <div class="active content field">
-    {assign var=access_level value=$login->getAccessLevel()}
-    {foreach from=$fields item=field}
-        {if $field->getInformation()}
-            <div>{$field->getInformation()}</div>
-        {/if}
-
-        {assign var=perm value=$field->getPerm()}
-        {if $field|is_a:'Galette\DynamicFields\Separator'}
-        <div class="ui horizontal divider">{$field->getName()|escape}</div>
-        {elseif ($field|is_a:'Galette\DynamicFields\File' || $field->isRepeatable())  && $masschange}
-            <!-- File and repeatable fields not shown in mass changes form -->
-        {else}
-        <div class="field{if $field->isRepeatable()} repetable{/if}">
-            {assign var=disabled value=false}
-            {if $perm eq constant('Galette\DynamicFields\DynamicField::PERM_USER_READ') && $access_level eq constant('Galette\Core\Authentication::ACCESS_USER')}
-                {assign var=disabled value=true}
-            {/if}
-            {assign var=values value=$object->getDynamicFields()->getValues($field->getId())}
-            {assign var=can_add value=false}
-            {if $field->getRepeat() === 0 || !is_array($values) || $values|@count < $field->getRepeat() || $values|@count === 0}
-                {assign var=can_add value=true}
-            {/if}
-            {foreach from=$values item=field_data}
-                {if not $field_data@first}<br/>{/if}
-                {draw_field field=$field field_data=$field_data disabled=$disabled loop=$field_data@iteration}
-            {/foreach}
-            {if !is_array($values) || $values|@count === 0}
-                {$field_data = ['field_val' => '']}
-                {if (is_array($values))}
-                    {assign var="current_count" value=$values|@count}
-                {else}
-                    {assign var="current_count" value=0}
-                {/if}
-                {draw_field field=$field field_data=$field_data disabled=$disabled loop=$current_count + 1}
-            {/if}
-        </div>
-            {if $field->isRepeatable()}
-                {if $field->getRepeat() === 0}
-        <p class="exemple" id="repeat_msg">{_T string="Enter as many occurences you want."}</p>
-                {elseif !is_array($values) || $values|@count < $field->getRepeat() || $values|@count === 0}
-                    {if (is_array($values))}
-                        {assign var="current_count" value=$values|@count}
-                    {else}
-                        {assign var="current_count" value=1}
-                    {/if}
-                    {assign var=remaining value=$field->getRepeat() - $current_count}
-        <p class="exemple" id="repeat_msg">{_T string="Enter up to %count more occurences." pattern="/%count/" replace=$remaining}</p>
-                {/if}
-            {/if}
-        {/if}
-    {/foreach}
-    </div>
-</div>
-<script type="text/javascript">
-    {if !$masschange}
-    var _addLnk = function(){
-        return $('<a class="ui small compact icon green button" href="#"><i class="plus icon" title="{_T string="New occurence"}"></i> <span class="sr-only">{_T string="New occurence"}"</span></a>');
-    };
-
-    var _lnkEvent = function(_a, _input, _parent) {
-        var _vals = _input[0].id.split(/_/);
-        var _total = $(_input[0]).data('maxrepeat'); //max number of occurences
-        var _current = _vals[_vals.length-1]; //current occurrence
-
-       _a.click(function(e) {
-            var _new = _input.clone();
-
-            var _id = '';
-
-            for ( var i = 0 ; i < _vals.length -1 ; i++ ) {
-                _id += _vals[i] + '_';
-            }
-
-            _current = Number(_current) + 1;
-            _new.attr('id', _id + _current);
-            _new.attr('name', _id + _current);
-            _new.val('');
-            _a.remove();
-            _parent.append('<br/>');
-            _parent.append(_new);
-            _new.focus();
-            if( _total == '0' || _current < _total ) {
-                var _b = _addLnk();
-                _lnkEvent(_b, _new, _parent);
-                _parent.append(_b);
-                if (_current < _total) {
-                    $('#repeat_msg').html('{_T string="Enter up to %count more occurences." pattern="/%count/" replace="COUNT" escape="js"}'.replace(/COUNT/, _total - _current));
-                }
-            } else if (_current == _total) {
-                $('#repeat_msg').remove();
-            }
-            return false;
-        });
-    }
-    {/if}
-
-    $(function(){
-    {if !$masschange}
-        $('.repetable').each(function(){
-            var _total;
-            var _current;
-            var _parent = $(this);
-
-            var _input = $(this).find('input:last');
-            if ( _input.length > 0 ) {
-                while ( $(this).find('input').length > 1 && _input.val() == '' ) {
-                    _input.prev('br').remove();
-                    _input.remove();
-                    _input = $(this).find('input:last')
-                }
-                var _vals = _input[0].id.split(/_/);
-                var _total = $(_input[0]).data('maxrepeat'); //max number of occurences
-                var _current = _vals[_vals.length-1]; //current occurrence
-
-                if ( _total == '0' || _current < _total ) {
-                    var _a = _addLnk();
-                    $(this).append(_a);
-                    _lnkEvent(_a, _input, _parent);
-                }
-            }
-        });
-    {/if}
-        /*$('.dynamic_date').datepicker({
-            changeMonth: true,
-            changeYear: true,
-            showOn: 'button',
-            buttonText: '<i class="ui calendar alt icon"></i> <span class="sr-only">{_T string="Select a date" escape="js"}</span>'
-        });*/
-    });
-</script>
-    {/if}
-{/if}
diff --git a/galette/templates/default/forms_types.tpl b/galette/templates/default/forms_types.tpl
deleted file mode 100644 (file)
index ed638ec..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-            {foreach item=fieldset from=$fieldsets}
-            <div class="galetteform ui styled fluid accordion field">
-                <div class="active title">
-                    <i class="icon dropdown"></i>
-                    {_T string=$fieldset->label}
-                </div>
-                <div class="active content field">
-                {if !isset($masschange) && !$self_adh and $fieldset@first}
-                    {include file="forms_types/picture.tpl"}
-                {/if}
-                {foreach item=entry from=$fieldset->elements}
-                    {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'}
-                        {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 and other information 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 $entry->field_id eq 'activite_adh'}
-                        {assign var="value" value=$member->isActive()}
-                    {/if}
-
-                    {* If value has not been set, take the generic value *}
-                    {if !$value and $propname != 'password'}
-                        {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
-                    }
-
-                {/foreach}
-                {if isset($groups) and $groups|@count != 0 and $fieldset@last and (!isset($masschange) or $masschange == false)}
-                    {include file="forms_types/groups.tpl"}
-                {/if}
-                </div>
-            </div>
-            {/foreach}
diff --git a/galette/templates/default/forms_types/account.tpl b/galette/templates/default/forms_types/account.tpl
deleted file mode 100644 (file)
index 6cf7be7..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{extends file="forms_types/select.tpl"}
-
-{block name="element"}
-    <select name="activite_adh" id="activite_adh" class="ui dropdown nochosen"{if isset($disabled) and $disabled == true} disabled="disabled"{/if}{if isset($required.activite_adh) and $required.activite_adh eq 1} required="required"{/if}>
-        <option value="1" {if $member->isActive() eq 1}selected="selected"{/if}>{_T string="Active"}</option>
-        <option value="0" {if $member->isActive() eq 0}selected="selected"{/if}>{_T string="Inactive"}</option>
-    </select>
-{/block}
diff --git a/galette/templates/default/forms_types/address.tpl b/galette/templates/default/forms_types/address.tpl
deleted file mode 100644 (file)
index 9a1c6aa..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<div class="grouped fields">
-    <div class="field required">
-{include
-    file="forms_types/textarea.tpl"
-    name=$entry->field_id
-    id=$entry->field_id
-    value=$member->address|escape
-    required=$entry->required
-    disabled=$entry->disabled
-    label=$entry->label
-    notag=true
-    elt_class="large"
-}
-    </div>
-</div>
diff --git a/galette/templates/default/forms_types/captcha.tpl b/galette/templates/default/forms_types/captcha.tpl
deleted file mode 100644 (file)
index c9baee7..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-{extends file="forms_types/input.tpl"}
-
-{block name="component"}
-    {assign var="required" value=true}
-    {assign var="type" value="gaptcha"}
-    {assign var="name" value="gaptcha"}
-    {assign var="id" value="gaptcha"}
-    {assign var="value" value=null}
-    {assign var="example" value={_T string="(numbers only)"}}
-    {assign var="tip" value={_T string="This field is required trying to avoid registration spam. We are sorry for the inconvennience."}}
-    {assign var="component_class" value="field required"}
-    {$smarty.block.parent}
-{/block}
-
-{block name="label"}
-    {assign var="label" value="Captcha"}
-    {$smarty.block.parent}
-    {$gaptcha->generateQuestion()}
-{/block}
diff --git a/galette/templates/default/forms_types/checkbox.tpl b/galette/templates/default/forms_types/checkbox.tpl
deleted file mode 100644 (file)
index c4f8269..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-{extends file="forms_types/input.tpl"}
-{assign var="inline" value=true}
-
-{block name="component"}
-    {assign var="type" value="checkbox"}
-    {if isset($masschange) and $masschange == true}
-        {assign var="component_class" value="inline field"}
-    {else}
-        {assign var="component_class" value="field"}
-    {/if}
-    {$smarty.block.parent}
-{/block}
diff --git a/galette/templates/default/forms_types/company.tpl b/galette/templates/default/forms_types/company.tpl
deleted file mode 100644 (file)
index d28b253..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<div class="grouped fields">
-{include
-    file="forms_types/checkbox.tpl"
-    name="is_company"
-    id="is_company"
-    value="1"
-    label={_T string="Is company?"}
-    title={_T string="Is member a company?"}
-    tip={_T string="Do you manage a non profit organization, or a company? If you do so, check the box, and then enter its name in the field that will appear."}
-    checked=$member->isCompany()
-    component_class="field"
-}
-    <div class="field">
-{include
-    file="forms_types/text.tpl"
-    name=$entry->field_id
-    id=$entry->field_id
-    value=$member->company_name
-    required=$entry->required
-    disabled=$entry->disabled
-    label=$entry->label
-    component_id="company_field"
-    component_class="{if not $member->isCompany()}hidden{/if}"
-}
-    </div>
-</div>
diff --git a/galette/templates/default/forms_types/date.tpl b/galette/templates/default/forms_types/date.tpl
deleted file mode 100644 (file)
index 7c64deb..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-{extends file="forms_types/input.tpl"}
-
-{block name="component"}
-    {assign var="type" value="text"}
-    {assign var="example" value={_T string="(yyyy-mm-dd format)"}}
-    {if $id eq 'ddn_adh'}
-        {assign var="example" value={_T string="(yyyy-mm-dd format)"}|cat:"<span id=\"member_age\">{$member->getAge()}</span>"}
-    {/if}
-    {assign var="component_class" value="field"}
-    {$smarty.block.parent}
-{/block}
-
-{block name="element"}
-    <div class="ui calendar" id="birth-rangestart">
-        <div class="ui input left icon">
-            <i class="calendar icon"></i>
-            {$smarty.block.parent}
-        </div>
-    </div>
-{/block}
diff --git a/galette/templates/default/forms_types/gender.tpl b/galette/templates/default/forms_types/gender.tpl
deleted file mode 100644 (file)
index 1dfdb70..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-{extends file="forms_types/input.tpl"}
-
-{block name="component"}
-    <div class="grouped fields">
-        {block name="label"}
-            <label>
-            {if $masschange}
-                {* Add a checkbox for fields to change on mass edition *}
-                {* FIXME: use SUI capacitie to display that well *}
-                <input type="checkbox" name="mass_{$entry->field_id}" class="mass_checkbox"/>
-            {/if}
-                {$label}
-            </label>
-        {/block}
-
-        {block name="element"}
-        <div class="field inline">
-            <input type="radio" name="sexe_adh" id="gender_nc" value="{Galette\Entity\Adherent::NC}"{if !$member->isMan() and !$member->isWoman()} checked="checked"{/if}{if isset($disabled) and $disabled == true} disabled="disabled"{/if}/>
-            <label for="gender_nc">{_T string="Unspecified"}</label>
-        </div>
-        <div class="field inline">
-            <input type="radio" name="sexe_adh" id="gender_man" value="{Galette\Entity\Adherent::MAN}"{if $member->isMan()} checked="checked"{/if}{if isset($disabled) and $disabled == true} disabled="disabled"{/if}/>
-            <label for="gender_man">{_T string="Man"}</label>
-        </div>
-        <div class="field inline">
-            <input type="radio" name="sexe_adh" id="gender_woman" value="{Galette\Entity\Adherent::WOMAN}"{if $member->isWoman()} checked="checked"{/if}{if isset($disabled) and $disabled == true} disabled="disabled"{/if}/>
-            <label for="gender_woman">{_T string="Woman"}</label>
-        </div>
-        {/block}
-    </div>
-{/block}
diff --git a/galette/templates/default/forms_types/groups.tpl b/galette/templates/default/forms_types/groups.tpl
deleted file mode 100644 (file)
index 95a55ed..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-<div class="field">
-    <label>{_T string="Groups:"}</label>
-    {if $login->isGroupManager()}
-    <a class="ui icon button" id="btngroups">
-        <i class="user tag icon" aria-hidden="true"></i>
-        {_T string="Manage user's groups"}
-    </a>
-    {/if}
-    {if $login->isAdmin() or $login->isStaff()}
-    <a class="ui icon button" id="btnmanagedgroups">
-        <i class="user shield icon" aria-hidden="true"></i>
-        {_T string="Manage user's managed groups"}
-    </a>
-    {/if}
-    <span id="usergroups_form">
-    {if $member->id}
-        {foreach from=$groups item=group}
-            {if $member->isGroupMember($group->getName())}
-            <input type="hidden" name="groups_adh[]" value="{$group->getId()}|{$group->getName()}"/>
-            {/if}
-        {/foreach}
-    {/if}
-    </span>
-    {if $login->isAdmin() or $login->isStaff() or $login->isGroupManager()}
-    <span id="managedgroups_form">
-    {if $member->id}
-        {foreach from=$groups item=group}
-            {if $member->isGroupManager($group->getName())}
-        <input type="hidden" name="groups_managed_adh[]" value="{$group->getId()}|{$group->getName()}"/>
-            {/if}
-        {/foreach}
-    {/if}
-    </span>
-    {/if}
-    {if $login->isAdmin() or $login->isStaff() or $login->isGroupManager()}<br/>{/if}
-    <span id="usergroups">
-    {if $member->id}
-        {foreach from=$groups item=group name=groupsiterate}
-            {if $member->isGroupMember($group->getName())}
-                {if isset($isnotfirst)}, {else}<strong>{_T string="Member of:"}</strong>{/if}
-                {assign var=isnotfirst value=true}
-                {$group->getName()}
-            {/if}
-        {/foreach}
-    {/if}
-    </span>
-    {if isset($isnotfirst)}<br/>{/if}
-    <span id="managedgroups">
-    {if $member->id}
-        {foreach from=$groups item=group name=groupsmiterate}
-            {if $member->isGroupManager($group->getName())}
-                {if isset($isnotfirstm)}, {else}<strong>{_T string="Manager for:"}</strong>{/if}
-                {assign var=isnotfirstm value=true}
-                {$group->getName()}
-            {/if}
-        {/foreach}
-    {/if}
-    </span>
-</div>
diff --git a/galette/templates/default/forms_types/hidden.tpl b/galette/templates/default/forms_types/hidden.tpl
deleted file mode 100644 (file)
index 7c5345e..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{extends file="forms_types/input.tpl"}
-
-{block name="component"}
-    {assign var="type" value="hidden"}
-    {assign var="notag" value="true"}
-    {assign var="title" value=""}
-    {assign var="required" value=""}
-    {assign var="disabled" value=""}
-    {$smarty.block.parent}
-{/block}
-{block name="label"}{/block}
diff --git a/galette/templates/default/forms_types/input.tpl b/galette/templates/default/forms_types/input.tpl
deleted file mode 100644 (file)
index c11380f..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-{block component}
-{if not isset($notag)}
-<div{if isset($component_id)} id="{$component_id}"{/if}{if isset($component_class)} class="{$component_class}"{/if}>
-{/if}
-    {block name="label"}
-        <label for="{$id}"{if isset($title)} title="{$title}"{/if}{if isset($tip) or isset($labelclass)} class="{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}
-    {block name="element"}<input
-        type="{$type}"
-        name="{$name}"
-        id="{$id}"
-        value="{if null !== $value}{$value}{/if}"
-        {if isset($required) and $required == true} required="required"{/if}
-        {if isset($readonly) and $readonly == true} readonly="readonly"{/if}
-        {if isset($disabled) and $disabled == true} disabled="disabled"{/if}
-        {if isset($title)} title="{$title}"{/if}
-        {if isset($maxlength)} maxlength="{$maxlength}"{/if}
-        {if isset($elt_class)} class="{$elt_class}"{/if}
-        {if isset($autocomplete)} autocomplete="{$autocomplete}"{/if}
-        {if isset($size)} size="{$size}"{/if}
-        {if isset($checked) and $checked eq true} checked="checked"{/if}
-        />
-    {/block}
-    {if isset($tip)}<i class="circular inverted primary small icon info tooltip" data-html="{$tip}"></i>{/if}
-    {if isset($example)}<span class="exemple">{$example}</span>{/if}
-{if not isset($notag)}
-</div>
-{/if}
-{/block}
diff --git a/galette/templates/default/forms_types/lang.tpl b/galette/templates/default/forms_types/lang.tpl
deleted file mode 100644 (file)
index c6c7975..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-{extends file="forms_types/select.tpl"}
-
-{block name="element"}
-    <select name="pref_lang" id="pref_lang" class="ui dropdown nochosen lang"{if isset($disabled) and $disabled == true} disabled="disabled"{/if}{if isset($required.pref_lang) and $required.pref_lang eq 1} required="required"{/if}>
-        {foreach item=langue from=$languages}
-            <option value="{$langue->getID()}"{if $member->language eq $langue->getID()} selected="selected"{/if}>{$langue->getName()}</option>
-        {/foreach}
-    </select>
-{/block}
diff --git a/galette/templates/default/forms_types/password.tpl b/galette/templates/default/forms_types/password.tpl
deleted file mode 100644 (file)
index 844a5b0..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-{include
-    file="forms_types/input.tpl"
-    type="password"
-    name=$entry->field_id
-    id=$entry->field_id
-    required=$entry->required
-    disabled=$entry->disabled
-    label=$entry->label
-    autocomplete="off"
-    value=null
-    component_class="field"
-}
-{include
-    file="forms_types/input.tpl"
-    type="password"
-    name="mdp_adh2"
-    id="mdp_adh2"
-    required=$entry->required
-    disabled=$entry->disabled
-    label={_T string="Password confirmation:"}
-    autocomplete="off"
-    elt_class="labelalign"
-    value=null
-    component_class="field"
-}
-<script type="text/javascript">
-    $(function() {
-        {% include "elements/js/pwdcheck.html.twig" with { selector: '#' ~ entry.field_id } %}
-    });
-</script>
diff --git a/galette/templates/default/forms_types/payment_types.tpl b/galette/templates/default/forms_types/payment_types.tpl
deleted file mode 100644 (file)
index 812d4ae..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-{if !isset($show_inline)}
-<div class="field">
-{else}
-<div class="field inline">
-{/if}
-    <label for="{$varname}">{if isset($label)}{$label}{else}{_T string="Payment type:"}{/if}</label>
-    <select name="{$varname}" id="{$varname}" class="ui search dropdown nochosen">
-{if isset($empty)}
-        <option value="{$empty.value}">{$empty.label}</option>
-{/if}
-{assign var="ptypes" value=\Galette\Repository\PaymentTypes::getAll()}
-{foreach from=$ptypes item=ptype}
-        <option value="{$ptype->id}"{if $current eq $ptype->id} selected="selected"{/if}>{$ptype->getName()}</option>
-{/foreach}
-    </select>
-</div>
diff --git a/galette/templates/default/forms_types/picture.tpl b/galette/templates/default/forms_types/picture.tpl
deleted file mode 100644 (file)
index ce081a7..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<div class="field">
-    <label>{_T string="Picture:"}</label>
-    {if $member->id}
-        {assign var="photo_id" value=$member->id}
-    {else}
-        {assign var="photo_id" value=0}
-    {/if}
-    <img id="photo_adh" src="{path_for name="photo" data=["id" => $photo_id, "rand" => $time]}" class="picture" width="{$member->picture->getOptimalWidth()}" height="{$member->picture->getOptimalHeight()}" alt="{_T string="Picture"}"/><br/>
-{if $member->hasPicture() eq 1 }
-    <label for="del_photo" class="labelalign">{_T string="Delete image"}</label> <input type="checkbox" name="del_photo" id="del_photo" value="1"/><br/>
-{/if}
-    <input class="labelalign" type="file" name="photo"/>
-</div>
diff --git a/galette/templates/default/forms_types/select.tpl b/galette/templates/default/forms_types/select.tpl
deleted file mode 100644 (file)
index 8060bad..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-{extends file="forms_types/input.tpl"}
-
-{block name="component"}
-    {if isset($masschange) and $masschange == true}
-        {assign var="component_class" value="inline field{if $entry->required} required{/if}"}
-    {else}
-        {assign var="component_class" value="field{if $entry->required} required{/if}"}
-    {/if}
-    {$smarty.block.parent}
-{/block}
-
-{block name="element"}
-    <select
-        name="{$name}"
-        id="{$id}"
-        {if isset($required) and $required == true} required="required"{/if}
-        {if isset($disabled) and $disabled == true} disabled="disabled"{/if}
-        class="ui search dropdown nochosen"
-        >
-        {foreach item=label from=$values key=value}
-        <option value="{$value}">{$label}</option>
-        {/foreach}
-    </select>
-{/block}
diff --git a/galette/templates/default/forms_types/status.tpl b/galette/templates/default/forms_types/status.tpl
deleted file mode 100644 (file)
index 212dda0..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-{extends file="forms_types/select.tpl"}
-
-{block name="element"}
-    <select name="id_statut" id="id_statut" class="ui dropdown nochosen"{if isset($disabled) and $disabled == true} disabled="disabled"{/if}{if isset($required.id_statut) and $required.id_statut eq 1} required="required"{/if}>
-        {html_options options=$statuts selected=$member->status}
-    </select>
-{/block}
diff --git a/galette/templates/default/forms_types/text.tpl b/galette/templates/default/forms_types/text.tpl
deleted file mode 100644 (file)
index c2151c9..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{extends file="forms_types/input.tpl"}
-
-{block name="component"}
-    {assign var="type" value="text"}
-    {if isset($masschange) and $masschange == true}
-        {assign var="component_class" value="inline field{if $entry->required} required{/if}"}
-    {else}
-        {assign var="component_class" value="field{if $entry->required} required{/if}"}
-    {/if}
-    {$smarty.block.parent}
-{/block}
diff --git a/galette/templates/default/forms_types/textarea.tpl b/galette/templates/default/forms_types/textarea.tpl
deleted file mode 100644 (file)
index 128b1c7..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-{extends file="forms_types/input.tpl"}
-
-{block name="component"}
-    {assign var="component_class" value="field"}
-    {$smarty.block.parent}
-{/block}
-
-{block name="label"}
-    {*assign var="labelclass" value="vtop"*}
-    {$smarty.block.parent}
-{/block}
-
-{block name="element"}
-    <textarea
-        name="{$name}"
-        id="{$id}"
-        cols="50"
-        rows="6"
-        {if isset($required) and $required == true} required="required"{/if}
-        {if isset($disabled) and $disabled == true} disabled="disabled"{/if}
-        {if isset($title)} title="{$title}"{/if}
-        {if isset($maxlength)} maxlength="{$maxlength}"{/if}
-        {if isset($elt_class)} class="{$elt_class}"{/if}
-        {if isset($autocomplete)} autocomplete="{$autocomplete}"{/if}
-        {if isset($size)} size="{$size}"{/if}
-        >{if null !== $value}{$value}{/if}</textarea><br/>
-{/block}
diff --git a/galette/templates/default/forms_types/titles.tpl b/galette/templates/default/forms_types/titles.tpl
deleted file mode 100644 (file)
index 1944115..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{extends file="forms_types/select.tpl"}
-
-{block name="element"}
-    {assign var="values" value=""}
-    <select name="titre_adh" id="titre_adh" class="ui dropdown nochosen"{if isset($disabled) and $disabled == true} disabled="disabled"{/if}{if isset($required) and $required == true} required="required"{/if}>
-        <option value="{if isset($required) and $required == true}-1{/if}">{_T string="Not supplied"}</option>
-{foreach item=title from=$titles_list}
-        <option value="{$title->id}"{if $member->title neq null and $member->title->id eq $title->id} selected="selected"{/if}>{$title->long}</option>
-{/foreach}
-    </select>
-{/block}
diff --git a/galette/templates/default/gestion_adherents.tpl b/galette/templates/default/gestion_adherents.tpl
deleted file mode 100644 (file)
index fed7fd6..0000000
+++ /dev/null
@@ -1,836 +0,0 @@
-{extends file="page.tpl"}
-
-
-{function name=draw_actions}
-                    <td class="{$rclass} center actions_row">
-{if $member->canEdit($login)}
-                        <a
-                            href="{path_for name="editMember" data=["id" => $member->id]}"
-                            class="tooltip action"
-                        >
-                            <i class="ui user edit icon" aria-hidden="true"></i>
-                            <span class="sr-only">{_T string="%membername: edit information" pattern="/%membername/" replace=$member->sname}</span>
-                        </a>
-{/if}
-{if $login->isAdmin() or $login->isStaff()}
-                        <a
-                            href="{path_for name="contributions" data=["type" => "contributions", "option" => "member", "value" => $member->id]}"
-                            class="tooltip"
-                        >
-                            <i class="ui cookie green icon" aria-hidden="true"></i>
-                            <span class="sr-only">{_T string="%membername: contributions" pattern="/%membername/" replace=$member->sname}</span>
-                        </a>
-                        <a
-                            href="{path_for name="removeMember" data=["id" => $member->id]}"
-                            class="delete tooltip"
-                        >
-                            <i class="ui user times red icon" aria-hidden="true"></i>
-                            <span class="sr-only">{_T string="%membername: remove from database" pattern="/%membername/" replace=$member->sname}</span>
-                        </a>
-{/if}
-{if $login->isSuperAdmin()}
-                        <a
-                            href="{path_for name="impersonate" data=["id" => $member->id]}"
-                            class="tooltip"
-                        >
-                            <i class="ui user secret grey icon" aria-hidden="true"></i>
-                            <span class="sr-only">{_T string="Log in in as %membername" pattern="/%membername/" replace=$member->sname}</span>
-                        </a>
-{/if}
-{* If some additionnals actions 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 $plugin_actions|@count != 0}
-    {foreach from=$plugin_actions key=plugin_name item=action}
-        {include file=$action module_id=$plugin_name|replace:'actions_':''}
-    {/foreach}
-{/if}
-                    </td>
-{/function}
-
-{block name="content"}
-        <form action="{path_for name="filter-memberslist"}" method="post" id="filtre" class="ui form">
-            <div class="ui segment">
-{if !isset($adv_filters) || !$adv_filters}
-            <div class="five fields">
-                <div class="field">
-                    <label for="filter_str">{_T string="Search:"}</label>
-                    <input type="text" name="filter_str" id="filter_str" value="{$filters->filter_str}" type="search" placeholder="{_T string="Enter a value"}"/>
-                </div>
-                <div class="field">
-                    <label for="field_filter">{_T string="in:"}</label>
-                    <select name="field_filter" id"=field_filter" class="ui search dropdown nochosen">
-                        {html_options options=$field_filter_options selected=$filters->field_filter}
-                    </select>
-                </div>
-                <div class="field">
-                    <label for="filter_str">{_T string="among:"}</label>
-                    <select name="membership_filter" onchange="form.submit()" class="ui search dropdown nochosen">
-                        {html_options options=$membership_filter_options selected=$filters->membership_filter}
-                    </select>
-                </div>
-                <div class="flexend field">
-                    <label for="filter_account" class="hidden">{_T string="among:"}</label>
-                    <select name="filter_account" onchange="form.submit()" class="ui search dropdown nochosen">
-                        {html_options options=$filter_accounts_options selected=$filters->filter_account}
-                    </select>
-                </div>
-                <div class="flexend field">
-                    <label for="group_filter" class="hidden">{_T string="among:"}</label>
-                    <select name="group_filter" onchange="form.submit()" class="ui search dropdown nochosen">
-                        <option value="0">{_T string="Select a group"}</option>
-    {foreach from=$filter_groups_options item=group}
-                        <option value="{$group->getId()}"{if $filters->group_filter eq $group->getId()} selected="selected"{/if}>{$group->getIndentName()}</option>
-    {/foreach}
-                    </select>
-                </div>
-            </div>
-            <div class="two fields">
-                <div class="field">
-                    <div class="inline fields">
-                        <label for="email_filter">{_T string="Members that have an email address:"}</label>
-                        <div class="field inline">
-                            <div class="ui radio checkbox">
-                                <input type="radio" name="email_filter" id="filter_dc_email" value="{Galette\Repository\Members::FILTER_DC_EMAIL}"{if $filters->email_filter eq constant('Galette\Repository\Members::FILTER_DC_EMAIL')} checked="checked"{/if}>
-                                <label for="filter_dc_email">{_T string="Don't care"}</label>
-                            </div>
-                        </div>
-                        <div class="field inline">
-                            <div class="ui radio checkbox">
-                                <input type="radio" name="email_filter" id="filter_with_email" value="{Galette\Repository\Members::FILTER_W_EMAIL}"{if $filters->email_filter eq constant('Galette\Repository\Members::FILTER_W_EMAIL')} checked="checked"{/if}>
-                                <label for="filter_with_email">{_T string="With"}</label>
-                            </div>
-                        </div>
-                        <div class="field inline">
-                            <div class="ui radio checkbox">
-                                <input type="radio" name="email_filter" id="filter_without_email" value="{Galette\Repository\Members::FILTER_WO_EMAIL}"{if $filters->email_filter eq constant('Galette\Repository\Members::FILTER_WO_EMAIL')} checked="checked"{/if}>
-                                <label for="filter_without_email">{_T string="Without"}</label>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-                <div class="right aligned field">
-                    <button type="submit"  class="tooltip action ui primary button" title="{_T string="Apply filters"}" name="filter">
-                        <i class="search icon"></i>
-                        {_T string="Filter"}
-                    </button>
-                    <button type="submit"  class="tooltip action ui button" title="{_T string="Save selected criteria"}" name="savesearch" id="savesearch">
-                        <i class="save blue icon"></i>
-                        {_T string="Save"}
-                    </button>
-                    <input type="submit" name="clear_filter" class="tooltip ui button" value="{_T string="Clear filter"}" title="{_T string="Reset all filters to defaults"}"/>
-                </div>
-            </div>
-{else}
-            <div class="field">
-                <span class="ui primary ribbon label">{_T string="Advanced search mode"}</span>
-                <button type="submit"  class="tooltip action ui primary button" title="{_T string="Save current advanced search criteria"}" name="savesearch" id="savesearch">
-                    <i class="save icon"></i>
-                    {_T string="Save"}
-                </button>
-                <button type="submit" class="tooltip action ui button" title="{_T string="Change search criteria"}" name="adv_criteria">
-                    <i class="edit blue icon"></i>
-                    {_T string="Change criteria"}
-                </button>
-                <input type="hidden" name="advanced_search" value="1" class="ui button"/>
-                <input type="submit" name="clear_filter" class="tooltip ui button" value="{_T string="Clear filter"}" title="{_T string="Reset all filters to defaults"}"/>
-                <div class="ui basic fluid accordion">
-                    <div class="title">
-                        <i class="dropdown icon"></i>
-                        {_T string="Show/hide query"}
-                    </div>
-                    <div class="content">
-                        <pre id="sql_qry" class="hidden">{$filters->query}</pre>
-                    </div>
-                </div>
-            </div>
-{/if}
-            {include file="forms_types/csrf.tpl"}
-        </div>
-
-
-        <div class="infoline">
-            <div class="ui basic horizontal segments">
-                <div class="ui basic fitted segment">
-                    <div class="ui label">{_T string="%count member" plural="%count members" count=$nb_members pattern="/%count/" replace=$nb_members}</div>
-                </div>
-                <div class="ui basic right aligned fitted segment">
-                    <div class="inline field">
-                        <label for="nbshow">{_T string="Records per page:"}</label>
-                        <select name="nbshow" id="nbshow" class="ui dropdown nochosen">
-                            {html_options options=$nbshow_options selected=$numrows}
-                        </select>
-                        <noscript> <span><input type="submit" value="{_T string="Change"}" /></span></noscript>
-                    </div>
-                </div>
-            </div>
-        </div>
-        </form>
-        <form action="{path_for name="batch-memberslist"}" method="post" id="listform" class="ui form">
-        <div class="ui basic fitted segment">
-            <table class="listing ui celled table">
-                <thead>
-                    <tr>
-{foreach item=column from=$galette_list}
-    {if $column->field_id eq 'id_adh'}
-        {if $preferences->pref_show_id}
-                        <th class="id_row">
-                            <a href="{path_for name="members" data=["option" => "order", "value" => "Galette\Repository\Members::ORDERBY_ID"|constant]}">
-                            {_T string="Mbr id"}
-                            {if $filters->orderby eq constant('galette\Repository\Members::ORDERBY_ID')}
-                                {if $filters->ordered eq constant('Galette\Filters\MembersList::ORDER_ASC')}
-                                <i class="ui angle down icon tooltip"></i>
-                                {else}
-                                <i class="ui angle up icon tooltip"></i>
-                                {/if}
-                            {/if}
-                            </a>
-                        </th>
-        {else}
-                        <th class="id_row">#</th>
-        {/if}
-    {else}
-                        <th class="left">
-                            <a href="{path_for name="members" data=["option" => "order", "value" => $column->field_id]}">
-                            {$column->label}
-                            {if $filters->orderby eq $column->field_id}
-                                {if $filters->ordered eq constant('Galette\Filters\MembersList::ORDER_ASC')}
-                                <i class="ui angle down icon tooltip"></i>
-                                {else}
-                                <i class="ui angle up icon tooltip"></i>
-                                {/if}
-                            {/if}
-                            </a>
-                        </th>
-    {/if}
-{/foreach}
-                        <th class="actions_row">{_T string="Actions"}</th>
-                    </tr>
-                </thead>
-                <tbody>
-{foreach from=$members item=member key=ordre}
-    {assign var=rclass value=$member->getRowClass() }
-                    <tr>
-    {foreach item=column from=$galette_list}
-        {if $column->field_id eq 'id_adh'}
-                        <td class="{$rclass} right" data-scope="id">
-            {if $preferences->pref_show_id}
-                        {$member->id}
-            {else}
-                        {$ordre+1+($filters->current_page - 1)*$numrows}
-            {/if}
-                        </td>
-        {elseif $column->field_id eq 'list_adh_name'}
-                        <td class="{$rclass} username_row" data-scope="row">
-                            <input type="checkbox" name="member_sel[]" value="{$member->id}"/>
-            {if $member->isCompany()}
-                            <i class="ui building outline icon tooltip"><span class="sr-only">{_T string="Is a company"}</span></i>
-            {elseif $member->isMan()}
-                            <i class="ui male icon tooltip"><span class="sr-only">{_T string="Is a man"}</span></i>
-            {elseif $member->isWoman()}
-                            <i class="ui female icon tooltip"><span class="sr-only">{_T string="Is a woman"}</span></i>
-            {else}
-                            <i class="ui icon"></i>
-            {/if}
-            {if $member->email != ''}
-                            <a href="mailto:{$member->email}" class="tooltip">
-                                <i class="ui envelope outline teal icon" aria-hidden="true"></i>
-                                <span class="sr-only">{_T string="Mail"}</span>
-                            </a>
-            {else}
-                            <i class="ui icon"></i>
-            {/if}
-            {if $member->isAdmin()}
-                            <span class="tooltip">
-                                <i class="ui user shield red icon" aria-hidden="true"></i>
-                                <span class="sr-only">{_T string="Admin"}</span>
-                            </span>
-            {elseif $member->isStaff()}
-                            <span class="tooltip">
-                                <i class="ui id card alternate orange icon" aria-hidden="true"></i>
-                                <span class="sr-only">{_T string="Staff member"}</span>
-                            </span>
-            {else}
-                            <i class="ui icon"></i>
-            {/if}
-                        {assign var="mid" value=$member->id}
-                            <a href="{path_for name="member" data=["id" => $member->id]}">{$member->sname}{if $member->company_name} ({$member->company_name}){/if}</a>
-                        </td>
-        {else}
-            {assign var="lrclass" value=$rclass}
-            {assign var="propname" value=$column->propname}
-            {assign var="propvalue" value=$member->$propname}
-            {assign var="value" value=null}
-
-            {if $column->field_id eq 'nom_adh'}
-                {assign var="value" value=$member->sfullname}
-            {elseif $column->field_id eq 'pseudo_adh'}
-                {assign var="lrclass" value="$rclass"}
-                {assign var=value value=$member->$propname}
-            {elseif $column->field_id eq 'tel_adh' or $column->field_id eq 'gsm_adh'}
-                {assign var="lrclass" value="$rclass"}
-            {elseif $column->field_id eq 'id_statut'}
-                {assign var="lrclass" value="$rclass"}
-                {assign var=value value={statusLabel id=$member->$propname}}
-            {elseif $column->field_id eq 'titre_adh'}
-                {if is_object($member->title)}
-                    {assign var=value value=$member->title->long}
-                {/if}
-            {elseif $column->field_id eq 'pref_lang'}
-                {assign var="value" value=$i18n->getNameFromId($member->language)}
-            {elseif $column->field_id eq 'adresse_adh'}
-                {assign var="value" value=$member->saddress|escape|nl2br}
-                {assign var="escaped" value=true}
-            {elseif $column->field_id eq 'bool_display_info'}
-                {assign var="value" value=$member->sappears_in_list}
-            {elseif $column->field_id eq 'activite_adh'}
-                {assign var="value" value=$member->sactive}
-            {elseif $column->field_id eq 'id_statut'}
-                {assign var="value" value=$member->sstatus}
-            {elseif $column->field_id eq 'bool_admin_adh'}
-                {assign var="value" value=$member->sadmin}
-            {elseif $column->field_id eq 'bool_exempt_adh'}
-                {assign var="value" value=$member->sdue_free}
-            {elseif $column->field_id eq 'sexe_adh'}
-                {assign var="value" value=$member->sgender}
-            {/if}
-
-            {* If value has not been set, take the generic value *}
-            {if !$value}
-                {if $propvalue}
-                    {assign var=value value=$propvalue|escape}
-                {else}
-                    {assign var=value value=$propvalue}
-                {/if}
-            {elseif !isset($escaped)}
-                {assign var=value value=$value|escape}
-            {/if}
-
-                        <td class="{$lrclass}" data-title="{$column->label}">
-            {* Display column.
-                A check is done here to adapt display, this is may not the best way to go
-                but for notw, that works as excpected.
-            *}
-            {if not empty($value)}
-                {if $column->field_id eq 'email_adh'}
-                                <a href="mailto:{$value}">{$value}</a>
-                {elseif $column->field_id eq 'tel_adh' or $column->field_id eq 'gsm_adh'}
-                                <a href="tel:{$value}">{$value}</a>
-                {elseif $column->field_id eq 'parent_id'}
-                                <a href="{path_for name="member" data=["id" => $member->parent]}">{memberName id=$member->parent}</a>
-                {elseif $column->field_id eq 'ddn_adh'}
-                                {$value} {$member->getAge()}
-                {else}
-                                {$value}
-                {/if}
-            {/if}
-                        </td>
-        {/if}
-    {/foreach}
-                    {draw_actions class=$rclass member=$member login=$login plugin_actions=$plugin_actions}
-                    </tr>
-{foreachelse}
-                    <tr><td colspan="{$galette_list|count}" class="emptylist">{_T string="No member has been found"}</td></tr>
-{/foreach}
-                </tbody>
-            </table>
-        </div>
-{if $nb_members != 0 && ($login->isGroupManager() && $preferences->pref_bool_groupsmanagers_exports || $login->isAdmin() || $login->isStaff())}
-        <div class="ui bottom attached segment screen-only">
-            <div class="ui horizontal list">
-                <span class="ui primary ribbon label">{_T string="For the selection:"}</span>
-    {if $login->isAdmin() or $login->isStaff()}
-                <div class="item">
-                    <button type="submit" id="masschange" name="masschange" class="action ui labeled icon tiny button">
-                        <i class="user edit blue icon"></i> {_T string="Mass change"}
-                    </button>
-                </div>
-                <div class="item">
-                    <button type="submit" id="masscontributions" name="masscontributions" class="action ui labeled icon tiny button">
-                        <i class="ui cookie bite green icon"></i> {_T string="Mass add contributions"}
-                    </button>
-                </div>
-                <div class="item">
-                    <button type="submit" id="delete" name="delete" class="ui labeled icon tiny button">
-                        <i class="user times red icon"></i> {_T string="Delete"}
-                    </button>
-                </div>
-    {/if}
-    {if $login->isAdmin() or $login->isStaff() or $login->isGroupManager() and $preferences->pref_bool_groupsmanagers_mailings}
-        {if $pref_mail_method neq constant('Galette\Core\GaletteMail::METHOD_DISABLED')}
-                <div class="item">
-                    <button type="submit" id="sendmail" name="mailing" class="ui labeled icon tiny button">
-                        <i class="mail bulk icon"></i> {_T string="Mail"}
-                    </button>
-                </div>
-        {/if}
-    {/if}
-
-    {if $login->isGroupManager() && $preferences->pref_bool_groupsmanagers_exports || $login->isAdmin() || $login->isStaff()}
-                <div class="item">
-                    <button type="submit" id="attendance_sheet" name="attendance_sheet" class="ui labeled icon tiny button">
-                        <i class="file alternate icon"></i> {_T string="Attendance sheet"}
-                    </button>
-                </div>
-                <div class="item">
-                    <button type="submit" id="labels" name="labels" class="ui labeled icon tiny button">
-                        <i class="address card icon"></i> {_T string="Generate labels"}
-                    </button>
-                </div>
-                <div class="item">
-                    <button type="submit" id="cards" name="cards" class="ui labeled icon tiny button">
-                        <i class="id badge icon"></i> {_T string="Generate Member Cards"}
-                    </button>
-                </div>
-                <div class="item">
-                    <button type="submit" id="csv" name="csv" class="ui labeled icon tiny button">
-                        <i class="file csv icon"></i> {_T string="Export as CSV"}
-                    </button>
-                </div>
-    {/if}
-    {if $plugin_batch_actions|@count != 0}
-        {foreach from=$plugin_batch_actions key=plugin_name item=action}
-            {include file=$action module_id=$plugin_name|replace:'batch_action_':''}
-        {/foreach}
-    {/if}
-            </div>
-        </div>
-        <div class="ui basic center aligned fitted segment">
-            <div class="ui inverted pagination menu">
-                <div class="header item">
-                    {_T string="Pages:"}
-                </div>
-                {$pagination}
-            </div>
-        </div>
-{/if}
-            {include file="forms_types/csrf.tpl"}
-        </form>
-{if $nb_members != 0}
-        <div id="legende" title="{_T string="Legend"}" class="ui modal">
-            <div class="header">{_T string="Legend"}</div>
-            <div class="content">
-                <table class="ui stripped table">
-                    <thead>
-                        <tr>
-                            <th class="" colspan="4">{_T string="Reading the list"}</th>
-                        </tr>
-                    <thead>
-                    <tbody>
-                        <tr>
-                            <th class="back">{_T string="Name"}</th>
-                            <td class="back">{_T string="Active account"}</td>
-                            <th class="inactif back">{_T string="Name"}</th>
-                            <td class="back">{_T string="Inactive account"}</td>
-                        </tr>
-                        <tr>
-                            <th class="cotis-ok color-sample">&nbsp;</th>
-                            <td class="back">{_T string="Membership in order"}</td>
-                            <th class="cotis-soon color-sample">&nbsp;</th>
-                            <td class="back">{_T string="Membership will expire soon (&lt;30d)"}</td>
-                        </tr>
-                        <tr>
-                            <th class="cotis-never color-sample">&nbsp;</th>
-                            <td class="back">{_T string="Never contributed"}</td>
-                            <th class="cotis-late color-sample">&nbsp;</th>
-                            <td class="back">{_T string="Lateness in fee"}</td>
-                        </tr>
-                    </tbody>
-                </table>
-                <table class="ui stripped table">
-                    <thead>
-                        <tr>
-                            <th class="" colspan="4">{_T string="Actions"}</th>
-                        </tr>
-                    <thead>
-                    <tbody>
-                        <tr>
-                            <th class="action">
-                                <i class="ui user edit icon"></i>
-                            </th>
-                            <td class="back">{_T string="Modification"}</td>
-                            <th>
-                                <i class="ui cookie icon"></i>
-                            </th>
-                            <td class="back">{_T string="Contributions"}</td>
-                        </tr>
-                        <tr>
-                            <th class="delete">
-                                <i class="ui user times red icon"></i>
-                            </th>
-                            <td class="back">{_T string="Deletion"}</td>
-                        </tr>
-                    </tbody>
-                </table>
-                <table class="ui stripped table">
-                    <thead>
-                        <tr>
-                            <th colspan="4">{_T string="User status/interactions"}</th>
-                        </tr>
-                    <thead>
-                    <tbody>
-                        <tr>
-                            <th><i class="ui envelope outline teal icon"></i></th>
-                            <td class="back">{_T string="Send an email"}</td>
-                            <th><i class="ui building icon"></i></th>
-                            <td class="back">{_T string="Is a company"}</td>
-                        </tr>
-
-                        <tr>
-                            <th><i class="ui male icon"></i></th>
-                            <td class="back">{_T string="Is a man"}</td>
-                            <th><i class="ui female icon"></i></th>
-                            <td class="back">{_T string="Is a woman"}</td>
-                        </tr>
-                        <tr>
-                            <th><i class="ui user shield red icon"></i></th>
-                            <td class="back">{_T string="Admin"}</td>
-                            <th><i class="ui id card alternate orange icon"></i></th>
-                            <td class="back">{_T string="Staff member"}</td>
-
-                        </tr>
-                    </tbody>
-                </table>
-            </div>
-            <div class="actions"><div class="ui labeled icon deny button"><i class="times icon"></i> {_T string="Close"}</div></div>
-        </div>
-{/if}
-{/block}
-
-{block name="javascripts"}
-        <script type="text/javascript">
-{if $nb_members != 0}
-        var _checkselection = function() {
-            var _checkeds = $('table.listing').find('input[type=checkbox]:checked').length;
-            if ( _checkeds == 0 ) {
-                var _el = $('<div id="pleaseselect" title="{_T string="No member selected" escape="js"}">{_T string="Please make sure to select at least one member from the list to perform this action." escape="js"}</div>');
-                _el.appendTo('body').dialog({
-                    modal: true,
-                    buttons: {
-                        Ok: function() {
-                            $(this).dialog( "close" );
-                        }
-                    },
-                    close: function(event, ui){
-                        _el.remove();
-                    }
-                });
-                return false;
-            }
-            return true;
-        }
-{/if}
-        {* Use of Javascript to draw specific elements that are not relevant is JS is inactive *}
-        $(function(){
-{if $nb_members != 0}
-            var _checklinks = '<div class="checkboxes ui basic horizontal segments"><div class="ui basic fitted segment"><a href="#" class="checkall ui blue tertiary button">{_T string="(Un)Check all" escape="js"}</a> | <a href="#" class="checkinvert ui blue tertiary button">{_T string="Invert selection" escape="js"}</a></div><div class="ui basic right aligned fitted segment"><a href="#" class="show_legend ui blue tertiary button">{_T string="Show legend" escape="js"}</a></div></div>';
-            $('.listing').before(_checklinks);
-            $('.listing').after(_checklinks);
-            _bind_check();
-            _bind_legend();
-
-            $('.selection_menu *[type="submit"], .selection_menu *[type="button"]').click(function(event){
-                if ( this.id == 'delete' || this.id == 'masschange' ) {
-                    //mass removal is handled from 2 steps removal
-                    //mass change is specifically handled below
-                    return;
-                }
-
-                if (!_checkselection()) {
-                    return false;
-                } else {
-    {if $existing_mailing eq true}
-                    if (this.id == 'sendmail') {
-                        var _el = $('<div id="existing_mailing" title="{_T string="Existing mailing" escape="js"}">{_T string="A mailing already exists. Do you want to create a new one or resume the existing?" escape="js"}</div>');
-                        _el.appendTo('body').dialog({
-                            modal: true,
-                            hide: 'fold',
-                            width: '25em',
-                            height: 150,
-                            close: function(event, ui){
-                                _el.remove();
-                            },
-                            buttons: {
-                                '{_T string="Resume"}': function() {
-                                    $(this).dialog( "close" );
-                                    location.href = '{path_for name="mailing"}';
-                                },
-                                '{_T string="New"}': function() {
-                                    $(this).dialog( "close" );
-                                    //add required controls to the form, change its action URI, and send it.
-                                    var _form = $('#listform');
-                                    _form.append($('<input type="hidden" name="mailing_new" value="true"/>'));
-                                    _form.append($('<input type="hidden" name="mailing" value="true"/>'));
-                                    _form.submit();
-                                }
-                            }
-                        });
-                        return false;
-                    }
-    {/if}
-                    if (this.id == 'attendance_sheet') {
-                        _attendance_sheet_details();
-                        return false;
-                    }
-
-                    if (this.id == 'masscontributions') {
-                        event.preventDefault();
-                        $.ajax({
-                            url: '{path_for name="batch-memberslist"}',
-                            type: "POST",
-                            data: {
-                                ajax: true,
-                                masscontributions: 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);
-                                $('body').append(_res);
-
-                                _initTooltips('#mass_contributions');
-                                _massCheckboxes('#mass_contributions');
-
-                                _res.dialog({
-                                    width: 'auto',
-                                    modal: true,
-                                    close: function(event, ui){
-                                        $(this).dialog('destroy').remove()
-                                    }
-                                });
-                            },
-                            error: function() {
-                                alert("{_T string="An error occurred :(" escape="js"}");
-                            }
-                        });
-                    }
-
-                    return true;
-                }
-            });
-{/if}
-            if ( _shq = $('#showhideqry') ) {
-                _shq.click(function(){
-                    $('#sql_qry').toggleClass('hidden');
-                    return false;
-                });
-            }
-
-            $('#savesearch').on('click', function(e) {
-                e.preventDefault();
-
-                var _el = $('<div id="savedsearch_details" title="{_T string="Search title" escape="js"}"><input type="text" name="search_title" id="search_title"/></div>');
-                _el.appendTo('body').dialog({
-                    modal: true,
-                    hide: 'fold',
-                    width: '40%',
-                    height: 200,
-                    close: function(event, ui){
-                        _el.remove();
-                    },
-                    buttons: {
-                        '{_T string="Ok" escape="js"}': function() {
-                            var _form = $('#filtre');
-                            var _data = _form.serialize();
-                            _data = _data + "&search_title=" + $('#search_title').val();
-                            $.ajax({
-                                url: '{path_for name="saveSearch"}',
-                                type: "POST",
-                                data: _data,
-                                datatype: 'json',
-                                {include file="js_loader.tpl"},
-                                success: function(res) {
-                                    $.ajax({
-                                        url: '{path_for name="ajaxMessages"}',
-                                        method: "GET",
-                                        success: function (message) {
-                                            $('#asso_name').after(message);
-                                        }
-                                    });
-                                }
-                            });
-
-                            $(this).dialog( "close" );
-                        },
-                        '{_T string="Cancel" escape="js"}': function() {
-                            $(this).dialog( "close" );
-                        }
-                    }
-                });
-            });
-
-        });
-{if $nb_members != 0}
-        {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();
-
-            res.find('select:not(.nochosen)').selectize({
-                maxItems: 1
-            });
-        }
-
-        $('#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 occurred :(" 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 occurred :(" escape="js"}");
-                }
-            });
-        });
-
-        var _attendance_sheet_details = function(){
-            var _selecteds = [];
-            $('table.listing').find('input[type=checkbox]:checked').each(function(){
-                _selecteds.push($(this).val());
-            });
-            $.ajax({
-                url: '{path_for name="attendance_sheet_details"}',
-                type: "POST",
-                data: {
-                    ajax: true,
-                    selection: _selecteds
-                },
-                dataType: 'html',
-                success: function(res){
-                    var _el = $('<div id="attendance_sheet_details" title="{_T string="Attendance sheet details" escape="js"}"> </div>');
-                    _el.appendTo('body').dialog({
-                        modal: true,
-                        hide: 'fold',
-                        width: '60%',
-                        height: 400,
-                        close: function(event, ui){
-                            _el.remove();
-                        },
-                        buttons: {
-                            Ok: function() {
-                                $('#sheet_details_form').submit();
-                                $(this).dialog( "close" );
-                            },
-                            Cancel: function() {
-                                $(this).dialog( "close" );
-                            }
-                        }
-                    }).append(res);
-                    /*$('#sheet_date').datepicker({
-                        changeMonth: true,
-                        changeYear: true,
-                        showOn: 'button',
-                        yearRange: 'c:c+5',
-                        buttonText: '<i class="ui calendar alt icon"></i> <span class="sr-only">{_T string="Select a date" escape="js"}</span>'
-                    });*/
-                },
-                error: function() {
-                    alert("{_T string="An error occurred displaying attendance sheet details interface :(" escape="js"}");
-                }
-            });
-        }
-{/if}
-    </script>
-{/block}
diff --git a/galette/templates/default/mass_change_members.tpl b/galette/templates/default/mass_change_members.tpl
deleted file mode 100644 (file)
index 40690ae..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-{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" class="ui form">
-        {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}
-    {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}
-        <div class="button-container">
-            <input type="submit" id="masschange" class="ui button" value="{if !isset($changes)}{_T string="Edit"}{else}{_T string="OK"}{/if}"/>
-            <a href="{$cancel_uri}" class="ui 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}
-            {include file="forms_types/csrf.tpl"}
-        </div>
-    </form>
-    </div>
-{/block}
diff --git a/galette/templates/default/sysinfos.tpl b/galette/templates/default/sysinfos.tpl
deleted file mode 100644 (file)
index 2609a5d..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-{extends file="page.tpl"}
-{block name="content"}
-    <div id="sysinfos">
-        <pre>{$rawinfos}</pre>
-    </div>
-{/block}
diff --git a/galette/templates/gtwig/components/edit_dynamic_fields.html.twig b/galette/templates/gtwig/components/edit_dynamic_fields.html.twig
new file mode 100644 (file)
index 0000000..3ae9274
--- /dev/null
@@ -0,0 +1,242 @@
+{% if object.getDynamicFields() is not empty %}
+    {% set fields = object.getDynamicFields().getFields() %}
+
+    {% if masschange is not defined %}
+        {% set masschange = false %}
+    {% endif %}
+
+    {% if fields is not empty %}
+
+{% macro draw_field(field, field_data, disabled, loop, object, masschange) %}
+    {% set valuedata = field_data.field_val|escape %}
+    {% if get_class(field) == 'Galette\\DynamicFields\\File' %}
+    <label>{{ field.getName()|escape }}</label>
+    {% else %}
+    <label for="info_field_{{ field.getId() }}_{{ loop }}">
+        {% if masschange is defined %}
+            {# Add a checkbox for fields to change on mass edition #}
+            <input type="checkbox" name="mass_info_field_{{ field.getId() }}" class="mass_checkbox"/>
+        {% endif %}
+        {{ field.getName()|escape }}
+    </label>
+    {% endif %}
+    {% if get_class(field) == '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{% endif %}"
+            rows="{% if field.getHeight() > 0 %}{{ field.getHeight() }}{else}6{% endif %}"
+            {% if field.isRepeatable() %} data-maxrepeat="{{ field.getRepeat() }}"{% endif %}
+        {% if not masschange %}
+            {% if field.isRequired() %} required="required"{% endif %}
+        {% endif %}
+            {% if disabled %} disabled="disabled"{% endif %}>{{ valuedata }}</textarea>
+    {% elseif get_class(field) == '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() }}"{% endif %}
+            {% if field.getSize() > 0 %}maxlength="{{ field.getSize() }}"{% endif %}
+            value="{{ valuedata }}"
+        {% if not masschange %}
+            {% if field.isRequired() %} required="required"{% endif %}
+        {% endif %}
+            {% if field.isRepeatable() %} data-maxrepeat="{{ field.getRepeat() }}"{% endif %}
+            {% if disabled %} disabled="disabled"{% endif %}
+        />
+    {% elseif get_class(field) == 'Galette\\DynamicFields\\Choice' %}
+        <select name="info_field_{{ field.getId() }}_{{ loop }}" id="info_field_{{ field.getId() }}_{{ loop }}"
+        {% if not masschange %}
+            {% if field.isRequired() %} required="required"{% endif %}
+        {% endif %}
+            {% if field.isRepeatable() %} data-maxrepeat="{{ field.getRepeat() }}"{% endif %}
+            {% if disabled %} disabled="disabled"{% endif %}
+            >
+            <!-- If no option is present, page is not XHTML compliant -->
+            <option value="">{{ _T("Select an option") }}</option>
+            {% for key, value in field.getValues() %}
+                <option value="{{ key }}"{% if key == valuedata %} selected="selected"{% endif %}>{{ value }}</option>
+            {% endfor %}
+        </select>
+    {% elseif get_class(field) == 'Galette\\DynamicFields\\Date' %}
+        <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()}"{% endif %}
+        {% if not masschange %}
+            {% if field.isRequired() %} required="required"{% endif %}
+        {% endif %}
+            {% if disabled %} disabled="disabled"{% endif %}
+        />
+        <span class="exemple">{{ _T("(yyyy-mm-dd format)") }}</span>
+    {% elseif get_class(field) == 'Galette\\DynamicFields\\Boolean' %}
+        <input type="checkbox" name="info_field_{{ field.getId() }}_{{ loop }}" id="info_field_{{ field.getId() }}_{{ loop }}" value="1"
+            {% if valuedata == 1%} checked="checked"{% endif %}
+            {% if field.isRepeatable() %} data-maxrepeat="{{ field.getRepeat() }}"{% endif %}
+        {% if not masschange %}
+            {% if field.isRequired() %} required="required"{% endif %}
+        {% endif %}
+            {% if disabled %} disabled="disabled"{% endif %}
+        />
+    {% elseif get_class(field) == 'Galette\\DynamicFields\\File' %}
+        {% if object.id %}
+        <label class="labelalign" for="info_field_{{ field.getId() }}_{{ loop }}_new">{{ _T("new") }}</label>
+        {% endif %}
+        <input
+            type="file"
+            name="info_field_{{ field.getId() }}_{{ loop }}"
+            id="info_field_{{ field.getId() }}_{{ loop }}_new"
+            {% if field.isRequired() and valuedata == '' %} required="required"{% endif %}
+            {% if disabled %} disabled="disabled"{% endif %}
+        />
+        {% if object.id %}
+        <label class="labelalign" for="info_field_{{ field.getId() }}_{{ loop }}_current">{{ _T("current") }}</label>
+        <a href="{{ path_for("getDynamicFile", { "id": object.id, "fid": field.getId(), "pos": loop, "name": valuedata }) }}">
+            {{ valuedata }}
+        </a>
+        - <label class="labelalign" for="info_field_{{ field.getId() }}_{{ loop }}_delete">
+            {{ _T("delete") }}
+        </label>
+        <input
+            type="checkbox"
+            name="info_field_{{ field.getId() }}_{{ loop }}"
+            id="info_field_{{ field.getId() }}_{{ loop }}_delete"
+            onclick="this.form.info_field_{{ field.getId() }}_{{ loop }}_new.disabled = this.checked;"
+        />
+        {% endif %}
+    {% endif %}
+{% endmacro %}
+
+<div class="ui styled fluid accordion field">
+    <div class="active title">
+        <i class="icon dropdown"></i>
+        {{ _T("Additionnal fields:") }}
+    </div>
+    <div class="active content field">
+    {% set access_level = login.getAccessLevel() %}
+    {% for field in fields %}
+        {% if field.getInformation() %}
+            <div>{{ field.getInformation()|raw }}</div>
+        {% endif %}
+
+        {% set perm = field.getPerm() %}
+        {% if get_class(field) == 'Galette\\DynamicFields\\Separator' %}
+        <div class="ui horizontal divider">{{ field.getName()|escape }}</div>
+        {% elseif (get_class(field) == 'Galette\\DynamicFields\\File' or field.isRepeatable()) and masschange %}
+            <!-- File and repeatable fields not shown in mass changes form -->
+        {% else %}
+        <div class="field{% if field.isRepeatable() %} repetable{% endif %}">
+            {% set disabled = false %}
+            {% if perm == constant('Galette\\DynamicFields\\DynamicField::PERM_USER_READ') and access_level == constant('Galette\\Core\\Authentication::ACCESS_USER') %}
+                {% set disabled = true %}
+            {% endif %}
+            {% set values = object.getDynamicFields().getValues(field.getId()) %}
+            {% set can_add = false %}
+            {% if field.getRepeat() == 0 or values is not iterable or values|length < field.getRepeat() or values|length == 0 %}
+                {% set can_add = true %}
+            {% endif %}
+            {% for field_data in values %}
+                {% if not loop.first %}<br/>{% endif %}
+                {{ _self.draw_field(field, field_data, disabled, loop.index, object, masschange) }}
+            {% endfor %}
+            {% if values is not iterable or values|length == 0 %}
+                {% set field_data = { 'field_val': ''} %}
+                {% if values is iterable %}
+                    {% set current_count = values|length %}
+                {% else %}
+                    {% set current_count = 0 %}
+                {% endif %}
+                {{ _self.draw_field(field, field_data, disabled, current_count + 1, object, masschange) }}
+            {% endif %}
+        </div>
+            {% if field.isRepeatable() %}
+                {% if field.getRepeat() == 0 %}
+        <p class="exemple" id="repeat_msg">{{ _T("Enter as many occurences you want.") }}</p>
+                {% elseif values is not iterable or values|length < field.getRepeat() or values|length == 0 %}
+                    {% if values is iterable %}
+                        {% set current_count = values|length %}
+                    {% else %}
+                        {% set current_count = 1 %}
+                    {% endif %}
+                    {% set remaining = field.getRepeat() - current_count %}
+        <p class="exemple" id="repeat_msg">{{ _T("Enter up to %count more occurences.")|replace({ "%count": remaining}) }}</p>
+                {% endif %}
+            {% endif %}
+        {% endif %}
+    {% endfor %}
+    </div>
+</div>
+<script type="text/javascript">
+    {% if not masschange %}
+    var _addLnk = function(){
+        return $('<a class="ui small compact icon green button" href="#"><i class="plus icon" title="{{ _T("New occurrence") }}"></i> <span class="sr-only">{{ _T("New occurrence") }}"</span></a>');
+    };
+
+    var _lnkEvent = function(_a, _input, _parent) {
+        var _vals = _input[0].id.split(/_/);
+        var _total = $(_input[0]).data('maxrepeat'); //max number of occurrences
+        var _current = _vals[_vals.length-1]; //current occurrence
+
+       _a.click(function(e) {
+            var _new = _input.clone();
+
+            var _id = '';
+
+            for ( var i = 0 ; i < _vals.length -1 ; i++ ) {
+                _id += _vals[i] + '_';
+            }
+
+            _current = Number(_current) + 1;
+            _new.attr('id', _id + _current);
+            _new.attr('name', _id + _current);
+            _new.val('');
+            _a.remove();
+            _parent.append('<br/>');
+            _parent.append(_new);
+            _new.focus();
+            if( _total == '0' || _current < _total ) {
+                var _b = _addLnk();
+                _lnkEvent(_b, _new, _parent);
+                _parent.append(_b);
+                if (_current < _total) {
+                    $('#repeat_msg').html('{{ _T("Enter up to %count more occurrences.")|replace({ "%count": "COUNT"})|e('js') }}'.replace(/COUNT/, _total - _current));
+                }
+            } else if (_current == _total) {
+                $('#repeat_msg').remove();
+            }
+            return false;
+        });
+    }
+    {% endif %}
+
+    $(function(){
+    {% if not masschange %}
+        $('.repetable').each(function(){
+            var _total;
+            var _current;
+            var _parent = $(this);
+
+            var _input = $(this).find('input:last');
+            if ( _input.length > 0 ) {
+                while ( $(this).find('input').length > 1 && _input.val() == '' ) {
+                    _input.prev('br').remove();
+                    _input.remove();
+                    _input = $(this).find('input:last')
+                }
+                var _vals = _input[0].id.split(/_/);
+                var _total = $(_input[0]).data('maxrepeat'); //max number of occurrences
+                var _current = _vals[_vals.length-1]; //current occurrence
+
+                if ( _total == '0' || _current < _total ) {
+                    var _a = _addLnk();
+                    $(this).append(_a);
+                    _lnkEvent(_a, _input, _parent);
+                }
+            }
+        });
+    {% endif %}
+        /*$('.dynamic_date').datepicker({
+            changeMonth: true,
+            changeYear: true,
+            showOn: 'button',
+            buttonText: '<i class="ui calendar alt icon"></i> <span class="sr-only">{{ _T("Select a date")|e('js') }}</span>'
+        });*/
+    });
+</script>
+    {% endif %}
+{% endif %}
diff --git a/galette/templates/gtwig/components/form.html.twig b/galette/templates/gtwig/components/form.html.twig
new file mode 100644 (file)
index 0000000..b684a0f
--- /dev/null
@@ -0,0 +1,130 @@
+            {% for fieldset in fieldsets %}
+            <div class="galetteform ui styled fluid accordion field">
+                <div class="active title">
+                    <i class="icon dropdown"></i>
+                    {{ _T(fieldset.label) }}
+                </div>
+                <div class="active content field">
+                {% if masschange is not defined and not self_adh and loop.first %}
+                    {% include "components/forms/picture.html.twig" %}
+                {% endif %}
+                {% for entry in fieldset.elements %}
+                    {% set template = "text.html.twig" %}
+                    {% set title = null %}
+                    {% set tip = null %}
+                    {% set size = null %}
+                    {% set propname = entry.propname %}
+                    {% set value = null %}
+                    {% set checked = null %}
+                    {% set example = null %}
+
+                    {% if entry.type == constant('Galette\\Entity\\FieldsConfig::TYPE_BOOL') %}
+                        {% set template = "checkbox.html.twig" %}
+                        {% set value = "1" %}
+                    {% endif %}
+                    {% if entry.field_id == 'titre_adh' %}
+                        {% set template = "titles.html.twig" %}
+                        {% set value = member.title %}
+                    {% endif %}
+                    {% if entry.field_id == 'pref_lang' %}
+                        {% set template = "lang.html.twig" %}
+                    {% endif %}
+                    {% if entry.field_id == 'sexe_adh' %}
+                        {% set template = "gender.html.twig" %}
+                    {% endif %}
+                    {% if entry.field_id == 'societe_adh' %}
+                        {% set template = "company.html.twig" %}
+                    {% endif %}
+                    {% if entry.field_id starts with 'date_' or entry.field_id == 'ddn_adh' %}
+                        {% set template = "date.html.twig" %}
+                    {% endif %}
+                    {% if entry.field_id == 'adresse_adh' %}
+                        {% set template = "address.html.twig" %}
+                    {% endif %}
+                    {% if entry.field_id == 'mdp_adh' %}
+                        {% if not self_adh %}
+                            {% set template = "password.html.twig" %}
+                        {% else %}
+                            {% set template = "captcha.html.twig" %}
+                        {% endif %}
+                    {% endif %}
+                    {% if entry.field_id == 'info_adh' or entry.field_id == 'info_public_adh' %}
+                        {% set template = "textarea.html.twig" %}
+                        {% if entry.field_id == 'info_adh' %}
+                            {% set example = _T("This comment is only displayed for admins and staff members.") %}
+                        {% else %}
+                            {% if login.isAdmin() or login.isStaff() %}
+                                {% set example = _T("This comment is reserved to the member.") %}
+                            {% endif %}
+                        {% endif %}
+                    {% endif %}
+                    {% if entry.field_id == 'activite_adh' %}
+                        {% set template = "account.html.twig" %}
+                    {% endif %}
+                    {% if entry.field_id == 'id_statut' %}
+                        {% set template = "status.html.twig" %}
+                    {% endif %}
+
+                    {% if entry.field_id == 'gpgid' %}
+                        {% set size = "8" %}
+                    {% endif %}
+                    {% if entry.field_id == 'email_adh' %}
+                        {% set size = "30" %}
+                    {% endif %}
+                    {% if entry.field_id == 'fingerprint' %}
+                        {% set size = "40" %}
+                    {% endif %}
+                    {% if entry.field_id == 'bool_display_info' %}
+                        {% set title = _T("Do member want to appear publically?") %}
+                        {% set tip = _T("If you check this box (and if you are up to date with your contributions), your full name and other information 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.") %}
+                        {% set checked = member.appearsInMembersList() %}
+                    {% endif %}
+                    {% if entry.field_id == 'login_adh' %}
+                        {% set example = _T("(at least %i characters)")|replace({ "%i": 2}) %}
+                    {% endif %}
+
+                    {% if entry.field_id == 'bool_admin_adh' %}
+                        {% set checked = member.isAdmin() %}
+                    {% endif %}
+                    {% if entry.field_id == 'bool_exempt_adh' %}
+                        {% set checked = member.isDueFree() %}
+                    {% endif %}
+                    {% if entry.field_id == 'parent_id' %}
+                        {% set value = member.parent.id %}
+                    {% endif %}
+                    {% if entry.field_id == 'activite_adh' %}
+                        {% set value = member.isActive() %}
+                    {% endif %}
+
+                    {# If value has not been set, take the generic value #}
+                    {% if not value and propname != 'password' %}
+                        {% set value = attribute(member, propname) %}
+                    {% endif %}
+
+                    {% if masschange is not defined %}
+                       {% set masschange = false %}
+                    {% endif %}
+
+                    {% include "components/forms/" ~ template with {
+                            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
+                        }
+                    %}
+                {% endfor %}
+                {% if groups is defined and groups|length != 0 and loop.last and (masschange is not defined or masschange == false) %}
+                    {% include "components/forms/groups.html.twig" %}
+                {% endif  %}
+                </div>
+            </div>
+            {% endfor %}
diff --git a/galette/templates/gtwig/components/forms/account.html.twig b/galette/templates/gtwig/components/forms/account.html.twig
new file mode 100644 (file)
index 0000000..6014ada
--- /dev/null
@@ -0,0 +1,8 @@
+{% extends "components/forms/select.html.twig" %}
+
+{% block element %}
+    <select name="activite_adh" id="activite_adh" class="ui dropdown nochosen"{% if disabled is defined and disabled == true %} disabled="disabled"{% endif %}{% if required is defined and required == 1 %} required="required"{% endif %}>
+        <option value="1" {% if member.isActive() == 1 %}selected="selected"{% endif %}>{{ _T("Active") }}</option>
+        <option value="0" {% if member.isActive() == 0 %}selected="selected"{% endif %}>{{ _T("Inactive") }}</option>
+    </select>
+{% endblock %}
diff --git a/galette/templates/gtwig/components/forms/address.html.twig b/galette/templates/gtwig/components/forms/address.html.twig
new file mode 100644 (file)
index 0000000..bc22cd3
--- /dev/null
@@ -0,0 +1,14 @@
+<div class="grouped fields">
+    <div class="field required">
+{% include "components/forms/textarea.html.twig"
+    name: entry.field_id,
+    id: entry.field_id,
+    value: member.address|escape,
+    required: entry.required,
+    disabled: entry.disabled,
+    label: entry.label,
+    notag: true,
+    elt_class: "large",
+%}
+    </div>
+</div>
diff --git a/galette/templates/gtwig/components/forms/captcha.html.twig b/galette/templates/gtwig/components/forms/captcha.html.twig
new file mode 100644 (file)
index 0000000..3a860b6
--- /dev/null
@@ -0,0 +1,19 @@
+{% extends "components/forms/input.html.twig" %}
+
+{% block component %}
+    {% set required = true %}
+    {% set type = "gaptcha" %}
+    {% set name = "gaptcha" %}
+    {% set id = "gaptcha" %}
+    {% set value = null %}
+    {% set example = _T("(numbers only)") %}
+    {% set tip = _T("This field is required trying to avoid registration spam. We are sorry for the inconvennience.") %}
+    {% set component_class = "field required" %}
+    {{  parent() }}
+{% endblock %}
+
+{% block label %}
+    {% set label = _T("Captcha") %}
+    {{ parent() }}
+    {{ gaptcha.generateQuestion() }}
+{% endblock %}
diff --git a/galette/templates/gtwig/components/forms/checkbox.html.twig b/galette/templates/gtwig/components/forms/checkbox.html.twig
new file mode 100644 (file)
index 0000000..bbd43e1
--- /dev/null
@@ -0,0 +1,12 @@
+{% extends "components/forms/input.html.twig" %}
+{% set inline = true %}
+
+{% block component %}
+    {% set type = "checkbox" %}
+    {% if masschange is defined and masschange == true %}
+        {% set component_class = "inline field" %}
+    {% else %}
+        {% set component_class = "field" %}
+    {% endif %}
+    {{ parent() }}
+{% endblock %}
diff --git a/galette/templates/gtwig/components/forms/company.html.twig b/galette/templates/gtwig/components/forms/company.html.twig
new file mode 100644 (file)
index 0000000..d28b253
--- /dev/null
@@ -0,0 +1,26 @@
+<div class="grouped fields">
+{include
+    file="forms_types/checkbox.tpl"
+    name="is_company"
+    id="is_company"
+    value="1"
+    label={_T string="Is company?"}
+    title={_T string="Is member a company?"}
+    tip={_T string="Do you manage a non profit organization, or a company? If you do so, check the box, and then enter its name in the field that will appear."}
+    checked=$member->isCompany()
+    component_class="field"
+}
+    <div class="field">
+{include
+    file="forms_types/text.tpl"
+    name=$entry->field_id
+    id=$entry->field_id
+    value=$member->company_name
+    required=$entry->required
+    disabled=$entry->disabled
+    label=$entry->label
+    component_id="company_field"
+    component_class="{if not $member->isCompany()}hidden{/if}"
+}
+    </div>
+</div>
diff --git a/galette/templates/gtwig/components/forms/date.html.twig b/galette/templates/gtwig/components/forms/date.html.twig
new file mode 100644 (file)
index 0000000..4d89bf1
--- /dev/null
@@ -0,0 +1,20 @@
+{% extends "components/forms/input.html.twig" %}
+
+{% block component %}
+    {% set type = "text" %}
+    {% set example = _T("(yyyy-mm-dd format)") %}
+    {% if id == 'ddn_adh' %}
+        {% set example = _T("(yyyy-mm-dd format)") ~ "<span id=\"member_age\">" ~ member.getAge() ~ "</span>" %}
+    {% endif %}
+    {% set component_class = "field" %}
+    {{ parent() }}
+{% endblock %}
+
+{% block element %}
+    <div class="ui calendar" id="birth-rangestart">
+        <div class="ui input left icon">
+            <i class="calendar icon"></i>
+            {{ parent() }}
+        </div>
+    </div>
+{% endblock %}
diff --git a/galette/templates/gtwig/components/forms/gender.html.twig b/galette/templates/gtwig/components/forms/gender.html.twig
new file mode 100644 (file)
index 0000000..c9790b3
--- /dev/null
@@ -0,0 +1,31 @@
+{% extends "components/forms/input.html.twig" %}
+
+{% block component %}
+    <div class="grouped fields">
+        {% block label %}
+            <label>
+            {% if masschange %}
+                {# Add a checkbox for fields to change on mass edition #}
+                {# FIXME: use SUI capacitie to display that well #}
+                <input type="checkbox" name="mass_{{ entry.field_id }}" class="mass_checkbox"/>
+            {% endif %}
+                {{ label }}
+            </label>
+        {% endblock %}
+
+        {% block element %}
+        <div class="field inline">
+            <input type="radio" name="sexe_adh" id="gender_nc" value="{{ constant("Galette\\Entity\\Adherent::NC") }}"{% if not member.isMan() and not member.isWoman() %} checked="checked"{% endif %}{% if disabled is defined and disabled == true %} disabled="disabled"{% endif %}/>
+            <label for="gender_nc">{{ _T("Unspecified") }}</label>
+        </div>
+        <div class="field inline">
+            <input type="radio" name="sexe_adh" id="gender_man" value="{{ constant("Galette\\Entity\\Adherent::MAN") }}"{% if member.isMan() %} checked="checked"{% endif %}{% if disabled is defined and disabled == true %} disabled="disabled"{% endif %}/>
+            <label for="gender_man">{{ _T("Man") }}</label>
+        </div>
+        <div class="field inline">
+            <input type="radio" name="sexe_adh" id="gender_woman" value="{{ constant("Galette\\Entity\\Adherent::WOMAN") }}"{% if member.isWoman() %} checked="checked"{% endif %}{% if disabled is defined and disabled == true %} disabled="disabled"{% endif %}/>
+            <label for="gender_woman">{{ _T("Woman") }}</label>
+        </div>
+        {% endblock %}
+    </div>
+{% endblock %}
diff --git a/galette/templates/gtwig/components/forms/groups.html.twig b/galette/templates/gtwig/components/forms/groups.html.twig
new file mode 100644 (file)
index 0000000..95a55ed
--- /dev/null
@@ -0,0 +1,59 @@
+<div class="field">
+    <label>{_T string="Groups:"}</label>
+    {if $login->isGroupManager()}
+    <a class="ui icon button" id="btngroups">
+        <i class="user tag icon" aria-hidden="true"></i>
+        {_T string="Manage user's groups"}
+    </a>
+    {/if}
+    {if $login->isAdmin() or $login->isStaff()}
+    <a class="ui icon button" id="btnmanagedgroups">
+        <i class="user shield icon" aria-hidden="true"></i>
+        {_T string="Manage user's managed groups"}
+    </a>
+    {/if}
+    <span id="usergroups_form">
+    {if $member->id}
+        {foreach from=$groups item=group}
+            {if $member->isGroupMember($group->getName())}
+            <input type="hidden" name="groups_adh[]" value="{$group->getId()}|{$group->getName()}"/>
+            {/if}
+        {/foreach}
+    {/if}
+    </span>
+    {if $login->isAdmin() or $login->isStaff() or $login->isGroupManager()}
+    <span id="managedgroups_form">
+    {if $member->id}
+        {foreach from=$groups item=group}
+            {if $member->isGroupManager($group->getName())}
+        <input type="hidden" name="groups_managed_adh[]" value="{$group->getId()}|{$group->getName()}"/>
+            {/if}
+        {/foreach}
+    {/if}
+    </span>
+    {/if}
+    {if $login->isAdmin() or $login->isStaff() or $login->isGroupManager()}<br/>{/if}
+    <span id="usergroups">
+    {if $member->id}
+        {foreach from=$groups item=group name=groupsiterate}
+            {if $member->isGroupMember($group->getName())}
+                {if isset($isnotfirst)}, {else}<strong>{_T string="Member of:"}</strong>{/if}
+                {assign var=isnotfirst value=true}
+                {$group->getName()}
+            {/if}
+        {/foreach}
+    {/if}
+    </span>
+    {if isset($isnotfirst)}<br/>{/if}
+    <span id="managedgroups">
+    {if $member->id}
+        {foreach from=$groups item=group name=groupsmiterate}
+            {if $member->isGroupManager($group->getName())}
+                {if isset($isnotfirstm)}, {else}<strong>{_T string="Manager for:"}</strong>{/if}
+                {assign var=isnotfirstm value=true}
+                {$group->getName()}
+            {/if}
+        {/foreach}
+    {/if}
+    </span>
+</div>
diff --git a/galette/templates/gtwig/components/forms/hidden.html.twig b/galette/templates/gtwig/components/forms/hidden.html.twig
new file mode 100644 (file)
index 0000000..369da22
--- /dev/null
@@ -0,0 +1,11 @@
+{% extends "components/forms/input.html.twig" %}
+
+{% block component %}
+    {% set type = "hidden" %}
+    {% set notag = true %}
+    {% set title = "" %}
+    {% set required = "" %}
+    {% set disabled = "" %}
+    {{ parent() }}
+{% endblock %}
+{% block label %}{% endblock %}
diff --git a/galette/templates/gtwig/components/forms/input.html.twig b/galette/templates/gtwig/components/forms/input.html.twig
new file mode 100644 (file)
index 0000000..0534626
--- /dev/null
@@ -0,0 +1,35 @@
+{% block component %}
+{% if notag is not defined %}
+<div{% if component_id is defined %} id="{{ component_id }}"{% endif %}{% if component_class is defined %} class="{{ component_class }}"{% endif %}>
+{% endif %}
+    {% block label %}
+        <label for="{{ id }}"{% if title is defined %} title="{{ title }}"{% endif %}{% if labelclass is defined %} class="{% if labelclass is defined %}{{ labelclass }}{% endif %}"{% endif %}>
+        {% if masschange %}
+            {# Add a checkbox for fields to change on mass edition #}
+            <input type="checkbox" name="mass_{{ entry.field_id }}" class="mass_checkbox"/>
+        {% endif %}
+            {{ label }}
+        </label>
+    {% endblock %}
+    {% block element %}<input
+        type="{{ type }}"
+        name="{{ name }}"
+        id="{{ id }}"
+        value="{% if value is same as null %}{{ value }}{% endif %}"
+        {% if required is defined and required == true %} required="required"{% endif %}
+        {% if readonly is defined and readonly == true %} readonly="readonly"{% endif %}
+        {% if disabled is defined and disabled == true %} disabled="disabled"{% endif %}
+        {% if title is defined %} title="{{ title }}"{% endif %}
+        {% if maxlength is defined %} maxlength="{{ maxlength }}"{% endif %}
+        {% if elt_class is defined %} class="{{ elt_class }}"{% endif %}
+        {% if autocomplete is defined %} autocomplete="{{ autocomplete }}"{% endif %}
+        {% if size is defined %} size="{{ size }}"{% endif %}
+        {% if checked is defined and checked == true %} checked="checked"{% endif %}
+        />
+    {% endblock %}
+    {% if tip is defined %}<i class="circular inverted primary small icon info tooltip" data-html="{{ tip }}"></i>{% endif %}
+    {% if example is defined %}<span class="exemple">{{ example }}</span>{% endif %}
+{% if notag is not defined %}
+</div>
+{% endif %}
+{% endblock %}
diff --git a/galette/templates/gtwig/components/forms/lang.html.twig b/galette/templates/gtwig/components/forms/lang.html.twig
new file mode 100644 (file)
index 0000000..14c8ec4
--- /dev/null
@@ -0,0 +1,9 @@
+{% extends "components/forms/select.html.twig" %}
+
+{% block element %}
+    <select name="pref_lang" id="pref_lang" class="ui dropdown nochosen lang"{% if disabled is defined and disabled == true %} disabled="disabled"{% endif %}{% if required.pref_lang is defined and required.pref_lang == 1 %} required="required"{% endif %}>
+        {% for langue in languages %}
+            <option value="{{ langue.getID() }}"{% if member.language == langue.getID() %} selected="selected"{% endif %}>{{ langue.getName() }}</option>
+        {% endfor %}
+    </select>
+{% endblock %}
diff --git a/galette/templates/gtwig/components/forms/password.html.twig b/galette/templates/gtwig/components/forms/password.html.twig
new file mode 100644 (file)
index 0000000..61d7c6e
--- /dev/null
@@ -0,0 +1,30 @@
+{include
+    file="forms_types/input.tpl"
+    type="password"
+    name=$entry->field_id
+    id=$entry->field_id
+    required=$entry->required
+    disabled=$entry->disabled
+    label=$entry->label
+    autocomplete="off"
+    value=null
+    component_class="field"
+}
+{include
+    file="forms_types/input.tpl"
+    type="password"
+    name="mdp_adh2"
+    id="mdp_adh2"
+    required=$entry->required
+    disabled=$entry->disabled
+    label={_T string="Password confirmation:"}
+    autocomplete="off"
+    elt_class="labelalign"
+    value=null
+    component_class="field"
+}
+<script type="text/javascript">
+    $(function() {
+        {% include "elements/js/pwdcheck.js.twig" with { selector: '#' ~ entry.field_id } %}
+    });
+</script>
diff --git a/galette/templates/gtwig/components/forms/payment_types.html.twig b/galette/templates/gtwig/components/forms/payment_types.html.twig
new file mode 100644 (file)
index 0000000..812d4ae
--- /dev/null
@@ -0,0 +1,16 @@
+{if !isset($show_inline)}
+<div class="field">
+{else}
+<div class="field inline">
+{/if}
+    <label for="{$varname}">{if isset($label)}{$label}{else}{_T string="Payment type:"}{/if}</label>
+    <select name="{$varname}" id="{$varname}" class="ui search dropdown nochosen">
+{if isset($empty)}
+        <option value="{$empty.value}">{$empty.label}</option>
+{/if}
+{assign var="ptypes" value=\Galette\Repository\PaymentTypes::getAll()}
+{foreach from=$ptypes item=ptype}
+        <option value="{$ptype->id}"{if $current eq $ptype->id} selected="selected"{/if}>{$ptype->getName()}</option>
+{/foreach}
+    </select>
+</div>
diff --git a/galette/templates/gtwig/components/forms/picture.html.twig b/galette/templates/gtwig/components/forms/picture.html.twig
new file mode 100644 (file)
index 0000000..7be7312
--- /dev/null
@@ -0,0 +1,13 @@
+<div class="field">
+    <label>{{ _T("Picture:") }}</label>
+    {% if member.id %}
+        {% set photo_id = member.id %}
+    {% else %}
+        {% set photo_id = 0 %}
+    {% endif %}
+    <img id="photo_adh" src="{{ path_for("photo", {"id": photo_id, "rand": time}) }}" class="picture" width="{{ member.picture.getOptimalWidth() }}" height="{{ member.picture.getOptimalHeight() }}" alt="{{ _T("Picture") }}"/><br/>
+{% if member.hasPicture() == 1 %}
+    <label for="del_photo" class="labelalign">{{ _T("Delete image") }}</label> <input type="checkbox" name="del_photo" id="del_photo" value="1"/><br/>
+{% endif %}
+    <input class="labelalign" type="file" name="photo"/>
+</div>
diff --git a/galette/templates/gtwig/components/forms/select.html.twig b/galette/templates/gtwig/components/forms/select.html.twig
new file mode 100644 (file)
index 0000000..4af2e2d
--- /dev/null
@@ -0,0 +1,27 @@
+{% extends "components/forms/input.html.twig" %}
+
+{% block component %}
+    {% if masschange is defined and masschange == true %}
+        {% set component_class = "inline field" %}
+    {% else %}
+        {% set component_class = "field" %}
+    {% endif %}
+    {% if entry.required %}
+        {% set component_class = component_class ~ ' required' %}
+    {% endif %}
+    {{ parent() }}
+{% endblock %}
+
+{% block element %}
+    <select
+        name="{{ name }}"
+        id="{{ id }}"
+        {% if required is defined and required == true %} required="required"{% endif %}
+        {% if disabled is defined and disabled == true %} disabled="disabled"{% endif %}
+        class="ui search dropdown nochosen"
+    >
+    {% for value, label in values %}
+        <option value="{{ value }}">{{ label }}</option>
+    {% endfor %}
+    </select>
+{% endblock %}
diff --git a/galette/templates/gtwig/components/forms/status.html.twig b/galette/templates/gtwig/components/forms/status.html.twig
new file mode 100644 (file)
index 0000000..3d7b59e
--- /dev/null
@@ -0,0 +1,9 @@
+{% extends "components/forms/select.html.twig" %}
+
+{% block element %}
+    <select name="id_statut" id="id_statut" class="ui dropdown nochosen"{% if disabled is defined and disabled == true %} disabled="disabled"{% endif %}{% if required.id_statut is defined and required.id_statut == 1 %} required="required"{% endif %}>
+        {% for key, value in statuts %}
+            <option value="{{ key }}"{% if key == member.status %} selected="selected"{% endif %}>{{ value }}</option>
+        {% endfor %}
+    </select>
+{% endblock %}
diff --git a/galette/templates/gtwig/components/forms/text.html.twig b/galette/templates/gtwig/components/forms/text.html.twig
new file mode 100644 (file)
index 0000000..3579eb5
--- /dev/null
@@ -0,0 +1,14 @@
+{% extends "components/forms/input.html.twig" %}
+
+{% block component %}
+    {% set type = "text" %}
+    {% if masschange is defined and masschange == true %}
+        {% set component_class = "inline field" %}
+    {% else %}
+        {% set component_class = 'field' %}
+    {% endif %}
+    {% if entry.required %}
+        {% set component_class = component_class ~ ' required' %}
+    {% endif %}
+    {{ parent() }}
+{% endblock %}
diff --git a/galette/templates/gtwig/components/forms/textarea.html.twig b/galette/templates/gtwig/components/forms/textarea.html.twig
new file mode 100644 (file)
index 0000000..a73a919
--- /dev/null
@@ -0,0 +1,27 @@
+{% extends "components/forms/input.html.twig" %}
+
+{% block component %}
+    {% set component_class = "field" %}
+    {{ parent() }}
+{% endblock %}
+
+{% block label %}
+    {# assign var="labelclass" value="vtop" #}
+    {{ parent() }}
+{% endblock %}
+
+{% block element %}
+    <textarea
+        name="{{ name }}"
+        id="{{ id }}"
+        cols="50"
+        rows="6"
+        {% if required is defined and required == true %} required="required"{% endif %}
+        {% if disabled is defined and disabled == true %} disabled="disabled"{% endif %}
+        {% if title is defined %} title="{{ title }}"{% endif %}
+        {% if maxlength is defined %} maxlength="{{ maxlength }}"{% endif %}
+        {% if elt_class is defined %} class="{{ elt_class }}"{% endif %}
+        {% if autocomplete is defined %} autocomplete="{{ autocomplete }}"{% endif %}
+        {% if size is defined %} size="{$size}"{% endif %}
+        >{% if value is not sameas(null) %}{{ value }}{% endif %}</textarea><br/>
+{% endblock %}
diff --git a/galette/templates/gtwig/components/forms/titles.html.twig b/galette/templates/gtwig/components/forms/titles.html.twig
new file mode 100644 (file)
index 0000000..8b8e738
--- /dev/null
@@ -0,0 +1,11 @@
+{% extends "components/forms/select.html.twig" %}
+
+{% block element %}
+    {% set values = "" %}
+    <select name="titre_adh" id="titre_adh" class="ui dropdown nochosen"{% if disabled is defined and disabled == true %} disabled="disabled"{% endif %}{% if required is defined and required == true %} required="required"{% endif %}>
+        <option value="{% if required is defined and required == true %}-1{% endif %}">{{ _T("Not supplied") }}</option>
+{% for title in titles_list %}
+        <option value="{{ title.id }}"{% if member.title != null and member.title.id == title.id %} selected="selected"{% endif %}>{{ title.long }}</option>
+{% endfor %}
+    </select>
+{% endblock %}
index 2c6632423faa23d2abbeac0be32e661272c0eaf3..db2d55310963d71523cfbcce539b2fecba8ba03c 100644 (file)
@@ -1,26 +1,26 @@
 {# This file contains common html headers to include for Galette Twig rendering. #}
-        <title>{% if pref_slogan != "" %}{{ pref_slogan }} - {% endif %}{% if page_title != "" %}{{ page_title }} - {% endif %}Galette {{ constant('GALETTE_VERSION') }}</title>
+        <title>{% if preferences.pref_slogan != "" %}{{ preferences.pref_slogan }} - {% endif %}{% if page_title != "" %}{{ page_title }} - {% endif %}Galette {{ constant('GALETTE_VERSION') }}</title>
         <meta charset="UTF-8" />
         <meta name="viewport" content="width=device-width" />
-        <link rel="stylesheet" type="text/css" href="{{ base_url }}/assets/css/galette-main.bundle.min.css" />
-        <link rel="stylesheet" type="text/css" href="{{ base_url }}/assets/ui/semantic.min.css" />
+        <link rel="stylesheet" type="text/css" href="{{ base_url() }}/assets/css/galette-main.bundle.min.css" />
+        <link rel="stylesheet" type="text/css" href="{{ base_url() }}/assets/ui/semantic.min.css" />
     {# Let's see if a local CSS exists and include it #}
     {% set localstylesheet = constant('_CURRENT_THEME_PATH') ~ "galette_local.css" %}
     {% if file_exists(localstylesheet) %}
-        <link rel="stylesheet" type="text/css" href="{{ base_url }}/{{ constant('GALETTE_THEME') }}/galette_local.css" />
+        <link rel="stylesheet" type="text/css" href="{{ base_url() }}/{{ constant('GALETTE_THEME') }}/galette_local.css" />
     {% endif %}
-        <script type="text/javascript" src="{{ base_url }}/assets/js/galette-main.bundle.min.js"></script>
+        <script type="text/javascript" src="{{ base_url() }}/assets/js/galette-main.bundle.min.js"></script>
     {% if require_charts %}
-        <link rel="stylesheet" type="text/css" href="{{ base_url }}/assets/css/galette-jqplot.bundle.min.css" />
+        <link rel="stylesheet" type="text/css" href="{{ base_url() }}/assets/css/galette-jqplot.bundle.min.css" />
     {% endif %}
-        <script type="text/javascript" src="{{ base_url }}/assets/ui/semantic.min.js"></script>
-        <link rel="stylesheet" type="text/css" href="{{ base_url }}/{{ constant('GALETTE_THEME') }}galette_print.css" media="print" />
+        <script type="text/javascript" src="{{ base_url() }}/assets/ui/semantic.min.js"></script>
+        <link rel="stylesheet" type="text/css" href="{{ base_url() }}/{{ constant('GALETTE_THEME') }}galette_print.css" media="print" />
     {# Let's see if a local print CSS exists and include it #}
     {% set localprintstylesheet = constant('_CURRENT_THEME_PATH') ~ "galette_print_local.css" %}
     {% if file_exists(localprintstylesheet) %}
-        <link rel="stylesheet" type="text/css" href="{{ base_url }}/{{ constant('GALETTE_THEME') }}/galette_print_local.css" media="print" />
+        <link rel="stylesheet" type="text/css" href="{{ base_url() }}/{{ constant('GALETTE_THEME') }}/galette_print_local.css" media="print" />
     {% endif %}
-        <link rel="shortcut icon" href="{{ base_url }}/{{ constant('GALETTE_THEME') }}images/favicon.png" />
+        <link rel="shortcut icon" href="{{ base_url() }}/{{ constant('GALETTE_THEME') }}images/favicon.png" />
 {#
 {* If some additional headers should be added from plugins, we load the relevant template file
    We have to use a template file, so Twig will do its work (like replacing variables). *}
diff --git a/galette/templates/gtwig/elements/js/pwdcheck.html.twig b/galette/templates/gtwig/elements/js/pwdcheck.html.twig
deleted file mode 100644 (file)
index bd3e96a..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-{% if extra_data is not defined %}
-    {%  set extra_data = '' %}
-{% endif %}
-$('{{ selector }}').parent('p').append($('<meter max="4" class="password-strength-meter"></meter><span class="password-strength-text"></span>'));
-$('{{ selector }}').on('keyup', function() {
-    var _this = $(this);
-    $.ajax({
-        url: '{{ path_for("checkPassword") }}',
-        type: 'POST',
-        data: {
-            value: $('{{ selector }}').val(),
-            {{ extra_data|raw }}
-        },
-        {% include "elements/js/loader.js.twig" %},
-        success: function(res) {
-            var _p = _this.parent('p');
-            var _meter = _p.find('.password-strength-meter');
-
-            _meter.val(res.score);
-            var _txt = _p.find('span.password-strength-text');
-
-            //reset
-            _p.find('.passtips').remove();
-            _txt.attr('class', 'password-strength-text');
-            _txt.html('');
-            _meter.attr('class', 'password-strength-meter');
-            _meter.attr('title', '');
-
-            if (res.valid) {
-                _txt.append($('<i class="ui check circle green icon"></i> <span>{{ _T("Password is valid :)")|e('js') }}</span>'));
-                _txt.addClass('use');
-            } else {
-                _txt.append($('<i class="ui times circle red icon"></i> <span>{{ _T("Password is not valid!")|e('js') }}</span>'));
-
-                _txt.append(' (');
-                for (i = 0; i < res.errors.length; i++) {
-                    if (i > 0) {
-                        _txt.append(', ');
-                    }
-                    _txt.append(res.errors[i]);
-                }
-                _txt.append(')');
-                _txt.addClass('delete');
-            }
-
-            if (res.warnings) {
-                _meter.addClass('tooltip');
-                var _tip = $('<span class="passtips tip"></span>');
-                _tip.hide();
-                for (i = 0; i < res.warnings.length; i++) {
-                    if (i > 0) {
-                        _tip.append('<br/>');
-                    }
-                    _tip.append(res.warnings[i]);
-                }
-                _meter.after(_tip);
-            }
-        },
-        error: function () {
-            alert('{{ _T("An error occured checking password :(")|e('js') }}');
-        }
-    });
-
-});
-
diff --git a/galette/templates/gtwig/elements/js/pwdcheck.js.twig b/galette/templates/gtwig/elements/js/pwdcheck.js.twig
new file mode 100644 (file)
index 0000000..bd3e96a
--- /dev/null
@@ -0,0 +1,65 @@
+{% if extra_data is not defined %}
+    {%  set extra_data = '' %}
+{% endif %}
+$('{{ selector }}').parent('p').append($('<meter max="4" class="password-strength-meter"></meter><span class="password-strength-text"></span>'));
+$('{{ selector }}').on('keyup', function() {
+    var _this = $(this);
+    $.ajax({
+        url: '{{ path_for("checkPassword") }}',
+        type: 'POST',
+        data: {
+            value: $('{{ selector }}').val(),
+            {{ extra_data|raw }}
+        },
+        {% include "elements/js/loader.js.twig" %},
+        success: function(res) {
+            var _p = _this.parent('p');
+            var _meter = _p.find('.password-strength-meter');
+
+            _meter.val(res.score);
+            var _txt = _p.find('span.password-strength-text');
+
+            //reset
+            _p.find('.passtips').remove();
+            _txt.attr('class', 'password-strength-text');
+            _txt.html('');
+            _meter.attr('class', 'password-strength-meter');
+            _meter.attr('title', '');
+
+            if (res.valid) {
+                _txt.append($('<i class="ui check circle green icon"></i> <span>{{ _T("Password is valid :)")|e('js') }}</span>'));
+                _txt.addClass('use');
+            } else {
+                _txt.append($('<i class="ui times circle red icon"></i> <span>{{ _T("Password is not valid!")|e('js') }}</span>'));
+
+                _txt.append(' (');
+                for (i = 0; i < res.errors.length; i++) {
+                    if (i > 0) {
+                        _txt.append(', ');
+                    }
+                    _txt.append(res.errors[i]);
+                }
+                _txt.append(')');
+                _txt.addClass('delete');
+            }
+
+            if (res.warnings) {
+                _meter.addClass('tooltip');
+                var _tip = $('<span class="passtips tip"></span>');
+                _tip.hide();
+                for (i = 0; i < res.warnings.length; i++) {
+                    if (i > 0) {
+                        _tip.append('<br/>');
+                    }
+                    _tip.append(res.warnings[i]);
+                }
+                _meter.after(_tip);
+            }
+        },
+        error: function () {
+            alert('{{ _T("An error occured checking password :(")|e('js') }}');
+        }
+    });
+
+});
+
index b7ec5272d7e4239a6ecbbfd054fef62854a6a149..fd2e2f56f6fcc5eeb7668a1ab460d9536664f7ae 100644 (file)
             });
         </script>
     {% if require_charts %}
-        <script type="text/javascript" src="{{ base_url }}/assets/js/galette-jqplot.bundle.min.js"></script>
+        <script type="text/javascript" src="{{ base_url() }}/assets/js/galette-jqplot.bundle.min.js"></script>
     {% endif %}
     {% if require_mass %}
-        <script type="text/javascript" src="{{ base_url }}/{$scripts_dir}mass_changes.js"></script>
+        <script type="text/javascript" src="{{ base_url() }}/{$scripts_dir}mass_changes.js"></script>
     {% endif %}
     {% if html_editor %}
-        <script src="{{ base_url }}/assets/js/lang/summernote-{$i18n->getID()|replace:'_':'-'}.min.js"></script>
+        <script src="{{ base_url() }}/assets/js/lang/summernote-{$i18n->getID()|replace:'_':'-'}.min.js"></script>
         <script language="javascript">
             function activateMailingEditor(id) {
                 if(!$('#mailing_html').attr('checked')){
     {% endif %}
     {% set localjstracking = constant('_CURRENT_THEME_PATH') ~ "tracking.js" %}
     {% if file_exists(localjstracking) %}
-        <script type="text/javascript" src="{{ base_url }}/{{ constant('GALETTE_THEME') }}/tracking.js"></script>
+        <script type="text/javascript" src="{{ base_url() }}/{{ constant('GALETTE_THEME') }}/tracking.js"></script>
     {% endif %}
diff --git a/galette/templates/gtwig/modals/mass_change_members.html.twig b/galette/templates/gtwig/modals/mass_change_members.html.twig
new file mode 100644 (file)
index 0000000..8ea02dc
--- /dev/null
@@ -0,0 +1,60 @@
+{% extends (mode == 'ajax') ? "ajax.html.twig" : "page.html.twig" %}
+
+{% block content %}
+    <div id="mass_change"{% if mode != 'ajax' %} class="center"{% else %} title="{{ page_title }}"{% endif %}>
+    <form action="{{ form_url }}" method="post" class="ui form">
+        {% if mode != 'ajax' %}<h2>{{ page_title }}</h2>{% endif %}
+    {% if changes is not defined %}
+        <p>{{ _T("Only checked fields will be updated.") }}</p>
+        {# Form entries #}
+        {% include "components/form.html.twig" with { masschange: true } %}
+        {# Dynamic entries #}
+        {% include "components/edit_dynamic_fields.html.twig" with { object: member, masschange: true} %}
+    {% else %}
+        <p>{{ _T("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("Unspecified") }}}
+                {/if}
+                {if $display_value eq {Galette\Entity\Adherent::WOMAN}}
+                    {assign var="display_value" value={{ _T("Woman") }}}
+                {/if}
+                {if $display_value eq {Galette\Entity\Adherent::MAN}}
+                    {assign var="display_value" value={{ _T("Man") }}}
+                {/if}
+            {/if}
+            <li>
+                <input type="hidden" name="{$field}" value="{$change.value}"/>
+                {$change.label} {$display_value}
+            </li>
+        {/foreach}
+        </ul>
+    {% endif %}
+        <div class="button-container">
+            <input type="submit" id="masschange" class="ui button" value="{% if changes is not defined %}{{ _T("Edit") }}{% else %}{{ _T("OK") }}{% endif %}"/>
+            <a href="{{ cancel_uri }}" class="ui button" id="btncancel">{{ _T("Cancel") }}</a>
+            <input type="hidden" name="confirm" value="1"/>
+            {% if mode == 'ajax' %}<input type="hidden" name="ajax" value="true"/>{% endif %}
+            {% for key, value in data %}
+                {% if value is iterable %}
+                    {% for val in value %}
+                <input type="hidden" name="{{ key }}[]" value="{{ val }}"/>
+                    {% endfor %}
+                {% else %}
+                <input type="hidden" name="{{ key }}" value="{{ value }}"/>
+                {% endif %}
+            {% endfor %}
+            {% include "components/forms/csrf.html.twig" %}
+        </div>
+    </form>
+    </div>
+{% endblock %}
index fa8892a6844f7f0e912b48462b7b090a85631882..0cb447915c07ae39279c9347202347f2e118a31b 100644 (file)
@@ -12,7 +12,7 @@
 {%  if login.isLogged() %}
     {% include 'elements/navigation/navigation_aside.html.twig' %}
 {% endif %}
-                <section class="content{% if contentcls %} {{ contentcls }}{% endif %}">
+                <section class="content{% if contentcls is defined %} {{ contentcls }}{% endif %}">
 {% if not login.isLogged() %}
                     <div class="ui basic center aligned fitted segment">
                         <img src="{path_for name="logo"}" width="{{ logo.getOptimalWidth() }}" height="{{ logo.getOptimalHeight() }}" alt="{{ preferences.pref_nom }}" class="icon"/>
diff --git a/galette/templates/gtwig/pages/advanced_search.html.twig b/galette/templates/gtwig/pages/advanced_search.html.twig
new file mode 100644 (file)
index 0000000..f54b566
--- /dev/null
@@ -0,0 +1,754 @@
+{% extends 'page.html.twig' %}
+
+{% block content %}
+        <form action="{{ path_for('filter-memberslist') }}" method="post" id="filtre" class="ui form">
+            <div class="galetteform ui styled fluid accordion field">
+                <div class="active ui title">
+                    <i class="dropdown icon"></i>
+                    {{ _T('Simple search') }}
+                </div>
+                <div class="active content">
+                    <div class="four fields">
+                        <div class="field">
+                            <label for="filter_str">{{ _T('Search:') }}</label>
+                            <input type="text" name="filter_str" id="filter_str" value="{{ filters.filter_str }}" type="search" placeholder="{{ _T('Enter a value') }}"/>
+                        </div>
+                        <div class="field">
+                            <label for="field_filter">{{ _T('in:') }}</label>
+                            <select name="field_filter" class="ui search dropdown nochosen">
+    {% for key, value in field_filter_options %}
+                                <option value="{{ key }}"{% if key == filters.field_filter %} selected="selected"{% endif %}>{{ value }}</option>
+    {% endfor %}
+                            </select>
+                        </div>
+                        <div class="field">
+                            <label for="membership_filter">{{ _T('Membership status') }}</label>
+                            <select id="membership_filter" name="membership_filter" class="ui search dropdown nochosen">
+    {% for key, value in membership_filter_options %}
+                                    <option value="{{ key }}"{% if key == filters.membership_filter %} selected="selected"{% endif %}>{{ value }}</option>
+    {% endfor %}
+                            </select>
+                        </div>
+                        <div class="field">
+                            <label for="filter_account">{{ _T('Account activity') }}</label>
+                            <select id="filter_account" name="filter_account" class="ui search dropdown nochosen">
+    {% for key, value in filter_accounts_options %}
+                                    <option value="{{ key }}"{% if key == filters.filter_account %} selected="selected"{% endif %}>{{ value }}</option>
+    {% endfor %}
+                            </select>
+                        </div>
+                        <div class="field">
+                            <label for="group_filter">{{ _T('Member of group') }}</label>
+                            <select name="group_filter" id="group_filter" class="ui search dropdown nochosen">
+                                <option value="0">{{ _T('Select a group') }}</option>
+{% for group in filter_groups_options %}
+                                <option value="{{ group.getId() }}"{% if filters.group_filter == group.getId() %} selected="selected"{% endif %}>{{ group.getIndentName()|raw }}</option>
+{% endfor %}
+                            </select>
+                        </div>
+                    </div>
+                    <div class="inline fields">
+                        <label for="email_filter">{{ _T('With email:') }}</label>
+                        <div class="field">
+                            <div class="ui radio checkbox">
+                                <input type="radio" name="email_filter" id="filter_dc_email" value="{{ constant("Galette\\Repository\\Members::FILTER_DC_EMAIL") }}"{% if filters.email_filter == constant('Galette\\Repository\\Members::FILTER_DC_EMAIL') %} checked="checked"{% endif %}>
+                                <label for="filter_dc_email">{{ _T("Don't care") }}</label>
+                            </div>
+                        </div>
+                        <div class="field">
+                            <div class="ui radio checkbox">
+                                <input type="radio" name="email_filter" id="filter_with_email" value="{{ constant("Galette\\Repository\\Members::FILTER_W_EMAIL") }}"{% if filters.email_filter == constant("Galette\\Repository\\Members::FILTER_W_EMAIL") %} checked="checked"{% endif %}>
+                                <label for="filter_with_email">{{ _T('With') }}</label>
+                            </div>
+                        </div>
+                        <div class="field">
+                            <div class="ui radio checkbox">
+                                <input type="radio" name="email_filter" id="filter_without_email" value="{{ constant("Galette\\Repository\\Members::FILTER_WO_EMAIL") }}"{% if filters.email_filter == constant("Galette\\Repository\\Members::FILTER_WO_EMAIL") %} checked="checked"{% endif %}>
+                                <label for="filter_without_email">{{ _T('Without') }}</label>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="galetteform ui styled fluid accordion field">
+                <div class="active ui title">
+                    <i class="dropdown icon"></i>
+                    {{ _T('Advanced search') }}
+                </div>
+                <div class="active content">
+                    <div class="two fields">
+                        <div class="field">
+                            <label>{{ _T('Birth date') }}</label>
+                            <div class="two fields">
+                                <div class="field">
+                                    <label for="birth_date_begin">{{ _T('beetween') }}</label>
+                                    <div class="ui calendar" id="birth-rangestart">
+                                        <div class="ui input left icon">
+                                            <i class="calendar icon"></i>
+                                                <input id="birth_date_begin" name="birth_date_begin" type="text" class="birth_date" maxlength="10" size="10" value="{$filters->birth_date_begin}" placeholder="{{ _T('(yyyy-mm-dd format)') }}" />
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="field">
+                                    <label for="birth_date_end">{{ _T('and') }}</label>
+                                    <div class="ui calendar" id="birth-rangeend">
+                                        <div class="ui input left icon">
+                                            <i class="calendar icon"></i>
+                                                <input id="birth_date_end" name="birth_date_end" type="text" class="birth_date" maxlength="10" size="10" value="{$filters->birth_date_end}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="field">
+                            <label>{{ _T('Creation date') }}</label>
+                            <div class="two fields">
+                                <div class="field">
+                                    <label for="creation_date_begin">{{ _T('beetween') }}</label>
+                                    <div class="ui calendar" id="creation-rangestart">
+                                        <div class="ui input left icon">
+                                            <i class="calendar icon"></i>
+                                                <input id="creation_date_begin" name="creation_date_begin" type="text" class="modif_date" maxlength="10" size="10" value="{$filters->creation_date_begin}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="field">
+                                    <label for="creation_date_end">{{ _T('and') }}</label>
+                                    <div class="ui calendar" id="creation-rangeend">
+                                        <div class="ui input left icon">
+                                            <i class="calendar icon"></i>
+                                                <input id="creation_date_end" name="creation_date_end" type="text" class="modif_date" maxlength="10" size="10" value="{$filters->creation_date_end}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="two fields">
+                        <div class="field">
+                            <label>{{ _T('Modification date') }}</label>
+                            <div class="two fields">
+                                <div class="field">
+                                    <label for="modif_date_begin">{{ _T('beetween') }}</label>
+                                    <div class="ui calendar" id="modification-rangestart">
+                                        <div class="ui input left icon">
+                                            <i class="calendar icon"></i>
+                                                <input id="modif_date_begin" name="modif_date_begin" type="text" class="modif_date" maxlength="10" size="10" value="{$filters->modif_date_begin}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="field">
+                                    <label for="modif_date_end">{{ _T('and') }}</label>
+                                    <div class="ui calendar" id="modification-rangeend">
+                                        <div class="ui input left icon">
+                                            <i class="calendar icon"></i>
+                                                <input id="modif_date_end" name="modif_date_end" type="text" class="modif_date" maxlength="10" size="10" value="{$filters->modif_date_end}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="field">
+                            <label>{{ _T('Due date') }}</label>
+                            <div class="two fields">
+                                <div class="field">
+                                    <label for="due_date_begin">{{ _T('beetween') }}</label>
+                                    <div class="ui calendar" id="due-rangestart">
+                                        <div class="ui input left icon">
+                                            <i class="calendar icon"></i>
+                                                <input id="due_date_begin" name="due_date_begin" type="text" class="due_date" maxlength="10" size="10" value="{$filters->due_date_begin}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="field">
+                                    <label for="due_date_end">{{ _T('and') }}</label>
+                                    <div class="ui calendar" id="due-rangeend">
+                                        <div class="ui input left icon">
+                                            <i class="calendar icon"></i>
+                                                <input id="due_date_end" name="due_date_end" type="text" class="due_date" maxlength="10" size="10" value="{$filters->due_date_end}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="two fields">
+                        <div class="field">
+                            <div class="grouped fields">
+                                <label for="show_public_infos">{{ _T('Show public infos') }}</label>
+                                <div class="field">
+                                    <div class="ui radio checkbox">
+                                        <input type="radio" name="show_public_infos" id="show_public_infos_dc" value="{{ constant("Galette\\Repository\\Members::FILTER_DC_PUBINFOS") }}"{% if filters.show_public_infos == constant("Galette\\Repository\\Members::FILTER_DC_PUBINFOS") %} checked="checked"{% endif %}>
+                                        <label for="show_public_infos_dc" >{{ _T("Don't care") }}</label>
+                                    </div>
+                                </div>
+                                <div class="field">
+                                    <div class="ui radio checkbox">
+                                        <input type="radio" name="show_public_infos" id="show_public_infos_yes" value="{{ constant("Galette\\Repository\\Members::FILTER_W_PUBINFOS") }}"{% if filters.show_public_infos == constant("Galette\\Repository\\Members::FILTER_W_PUBINFOS") %} checked="checked"{% endif %}>
+                                        <label for="show_public_infos_yes" >{{ _T('Yes') }}</label>
+                                    </div>
+                                </div>
+                                <div class="field">
+                                    <div class="ui radio checkbox">
+                                        <input type="radio" name="show_public_infos" id="show_public_infos_no" value="{{ constant("Galette\\Repository\\Members::FILTER_WO_PUBINFOS") }}"{% if filters.show_public_infos == constant("Galette\\Repository\\Members::FILTER_WO_PUBINFOS") %} checked="checked"{% endif %}>
+                                        <label for="show_public_infos_no" >{{ _T('No') }}</label>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="field">
+                            <label for="status">{{ _T('Status') }}</label>
+                            <select name="status[]" id="status" multiple="" class="ui search dropdown nochosen">
+                                <option value="">{{ _T('Status') }}</option>
+    {% for key, value in statuts %}
+                                    <option value="{{ key }}"{% if key == filters.status %} selected="selected"{% endif %}>{{ value }}</option>
+    {% endfor %}
+                            </select>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="galetteform ui styled fluid accordion field">
+                <div class="active ui title">
+                    <i class="dropdown icon"></i>
+                    {{ _T('Advanced groups search') }} ({{ _T('Experimental') }})
+                    <a
+                        href="#"
+                        id="addbutton_g"
+                        class="ui tiny compact icon green button tab-button tooltip"
+                    >
+                        <i class="plus icon"></i>
+                        <span class="hidden">{{ _T('Add new group search criteria') }}</span>
+                    </a>
+                </div>
+                <div class="active content">
+                    <select name="groups_logical_operator" class="operator_selector nochosen">
+                      <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_AND") }}"{% if filters.groups_search_log_op == constant("Galette\\Filters\\AdvancedMembersList::OP_AND") %} selected="selected"{% endif %}>{{ _T('In all selected groups') }}</option>
+                      <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_OR") }}"{% if filters.groups_search_log_op == constant("Galette\\Filters\\AdvancedMembersList::OP_OR") %} selected="selected"{% endif %}>{{ _T('In any of selected groups') }}</option>
+                    </select>
+                    <ul id="groups_search_list" class="fields_list">
+                    {% for gs in filters.groups_search %}
+                             <li>
+                                <select name="groups_search[]" class="group_selector nochosen">
+                                        <option value="">{{ _T('Select a group') }}</option>
+                                        {% for group in filter_groups_options %}
+                                        <option value="{{ group.getId() }}"{% if gs.group == group.getId() %} selected="selected"{% endif %}>{{ group.getName() }}</option>
+                                        {% endfor %}
+                                </select>
+                                <a
+                                    href="#"
+                                    class="ui small compact red icon button fright tooltip delete delcriteria"
+                                >
+                                    <i class="trash alt icon"></i>
+                                    <span class="sr-only">{{ _T('Remove criteria') }}</span>
+                                </a>
+                            </li>
+                        {% endfor %}
+                     </ul>
+                </div>
+            </div>
+
+            <div class="galetteform ui styled fluid accordion field">
+                <div class="active ui title">
+                    <i class="dropdown icon"></i>
+                    {{ _T('Within contributions') }}
+                </div>
+                <div class="active content">
+                    <div class="two fields">
+                        <div class="field">
+                            <label>{{ _T('Creation date') }}</label>
+                            <div class="two fields">
+                                <div class="field">
+                                    <label for="contrib_creation_date_begin">{{ _T('beetween') }}</label>
+                                    <div class="ui calendar" id="contrib-creation-rangestart">
+                                        <div class="ui input left icon">
+                                            <i class="calendar icon"></i>
+                                            <input id="contrib_creation_date_begin" name="contrib_creation_date_begin" type="text" class="modif_date" maxlength="10" size="10" value="{{ filters.contrib_creation_date_begin }}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="field">
+                                    <label for="contrib_creation_date_end">{{ _T('and') }}</label>
+                                    <div class="ui calendar" id="contrib-creation-rangeend">
+                                        <div class="ui input left icon">
+                                            <i class="calendar icon"></i>
+                                            <input id="contrib_creation_date_end" name="contrib_creation_date_end" type="text" class="modif_date" maxlength="10" size="10" value="{{ filters.contrib_creation_date_end }}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="field">
+                            <label>{{ _T('Begin date') }}</label>
+                            <div class="two fields">
+                                <div class="field">
+                                    <label for="contrib_begin_date_begin">{{ _T('beetween') }}</label>
+                                    <div class="ui calendar" id="contrib-begin-rangestart">
+                                        <div class="ui input left icon">
+                                            <i class="calendar icon"></i>
+                                            <input id="contrib_begin_date_begin" name="contrib_begin_date_begin" type="text" class="modif_date" maxlength="10" size="10" value="{{ filters.contrib_begin_date_begin }}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="field">
+                                    <label for="contrib_begin_date_end">{{ _T('and') }}</label>
+                                    <div class="ui calendar" id="contrib-begin-rangeend">
+                                        <div class="ui input left icon">
+                                            <i class="calendar icon"></i>
+                                            <input id="contrib_begin_date_end" name="contrib_begin_date_end" type="text" class="modif_date" maxlength="10" size="10" value="{{ filters.contrib_begin_date_end }}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="two fields">
+                        <div class="field">
+                            <label>{{ _T('End date') }}</label>
+                            <div class="two fields">
+                                <div class="field">
+                                    <label for="contrib_end_date_begin">{{ _T('beetween') }}</label>
+                                    <div class="ui calendar" id="contrib-end-rangestart">
+                                        <div class="ui input left icon">
+                                            <i class="calendar icon"></i>
+                                            <input id="contrib_end_date_begin" name="contrib_end_date_begin" type="text" class="due_date" maxlength="10" size="10" value="{{ filters.contrib_end_date_begin }}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="field">
+                                    <label for="contrib_end_date_end">{{ _T('and') }}</label>
+                                    <div class="ui calendar" id="contrib-end-rangeend">
+                                        <div class="ui input left icon">
+                                            <i class="calendar icon"></i>
+                                                <input id="contrib_end_date_end" name="contrib_end_date_end" type="text" class="due_date" maxlength="10" size="10" value="{{ filters.contrib_end_date_end }}" placeholder="{{ _T('(yyyy-mm-dd format)') }}"/>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="field">
+                            <label>{{ _T('Amount') }}</label>
+                            <div class="two fields">
+                                <div class="field">
+                                    <label for="contrib_min_amount">{{ _T('beetween') }}</label>
+                                    <input id="contrib_min_amount" name="contrib_min_amount" type="text" maxlength="10" size="10" value="{{ filters.contrib_min_amount }}"/>
+                                </div>
+                                <div class="field">
+                                    <label for="contrib_max_amount">{{ _T('and') }}</label>
+                                    <input id="contrib_max_amount" name="contrib_max_amount" type="text" maxlength="10" size="10" value="{{ filters.contrib_max_amount }}"/>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="two fields">
+                        <div class="field">
+                            <label for="contributions_types">{{ _T('Type') }}</label>
+                            <select name="contributions_types[]" id="contributions_types" multiple="" class="ui dropdown nochosen">
+                                <option value="">{{ _T('Type') }}</option>
+
+                            {% for key, value in contributions_types %}
+                                    <option value="{{ key }}"{% if key == filters.contributions_types %} selected="selected"{% endif %}>{{ value }}</option>
+                            {% endfor %}
+                            </select>
+                        </div>
+                        <div class="field">
+                            <label for="payments_types">{{ _T('Payment type') }}</label>
+                            <select name="payments_types[]" id="payments_types" multiple="" class="ui dropdown nochosen">
+                                <option value="">{{ _T('Payment type') }}</option>
+                            {% for key, value in payments_types %}
+                                <option value="{{ key }}"{% if key == filters.payments_types %} selected="selected"{% endif %}>{{ value }}</option>
+                            {% endfor %}
+                            </select>
+                        </div>
+                    </div>
+{% for field in contrib_dynamics %}
+                    <div class="field">
+    {% set fid = field.getId() %}
+    {% if get_class(field) == "Galette\\DynamicFields\\Choice" %}
+        {% set rid = "cdsc_" ~ fid %}
+    {% else %}
+        {% set rid = "cds_" ~ fid %}
+    {% endif %}
+                        <label for="cds{% if get_class(field) == "Galette\\DynamicFields\\Choice" %}c{% endif %}_{{ field.getId() }}">{{ field.getName() }}</label>
+    {% if get_class(field) == "Galette\\DynamicFields\\Line" %}
+                        <input type="text" name="cds_{{ field.getId() }}" id="cds_{{ field.getId() }}" value="{% if attribute(filters.contrib_dynamic, rid) is defined %}{{ attribute(filters.contrib_dynamic, rid) }}{% endif %}" />
+    {% elseif get_class(field) == "Galette\\DynamicFields\\Text" %}
+                        <textarea name="cds_{{ field.getId() }}" id="cds_{{ field.getId() }}">{% if attribute(filters.contrib_dynamic, rid) is defined %}{{ attribute(filters.contrib_dynamic, rid) }}{% endif %}</textarea>
+    {% elseif get_class(field) == "Galette\\DynamicFields\\Choice" %}
+                        <select name="cdsc_{{ field.getId() }}[]" id="cdsc_{{ field.getId() }}" multiple="multiple" class="ui dropdown nochosen">
+                            <option value="">{{ _T('Select') }}</option>
+        {% for k, choice in field.getValues() %}
+                            <option value="{{ k }}"{% if cds.field is defined and  cds.field == rid %} selected="selected"{% endif %}>{{ choice }}</option>
+        {% endfor %}
+                        </select>
+    {% endif %}
+                    </div>
+{% endfor %}
+                </div>
+            </div>
+                <div class="galetteform ui styled fluid accordion field">
+                    <div class="active ui title">
+                        <i class="dropdown icon"></i>
+                        {{ _T('Free search') }}
+                        <a
+                            href="#"
+                            id="addbutton"
+                            class="ui tiny compact icon green button tab-button tooltip"
+                        >
+                            <i class="plus icon"></i>
+                            <span class="hidden">{{ _T('Add new free search criteria') }}</span>
+                        </a>
+                    </div>
+                    <div class="active content">
+                        <ul id="fs_sortable" class="fields_list connectedSortable">
+{% for fs in filters.free_search %}
+                            <li>
+                                <select name="free_logical_operator[]" class="operator_selector nochosen">
+                                    <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_AND") }}"{if $fs.log_op eq constant("Galette\\Filters\\AdvancedMembersList::OP_AND")} selected="selected"{/if}>{{ _T('and') }}</option>
+                                    <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_OR") }}"{if $fs.log_op eq constant("Galette\\Filters\\AdvancedMembersList::OP_OR")} selected="selected"{/if}>{{ _T('or') }}</option>
+                                </select>
+                                <select name="free_field[]" class="field_selector nochosen">
+                                    <option value="">{{ _T('Select a field') }}</option>
+    {% for key, field in search_fields %}
+        {% if fs.field == key %}
+            {% if key starts with 'date_' or key == 'ddn_adh' %}
+                {% set type = constant("Galette\\DynamicFields\\DynamicField::DATE") %}
+            {% elseif key == constant("Galette\\Entity\\Status::PK") %}
+                {% set type = constant("Galette\\DynamicFields\\DynamicField::CHOICE") %}
+                {% set fvalues = statuts %}
+            {% elseif key == 'sexe_adh' %}
+                {% set type = constant("Galette\\DynamicFields\\DynamicField::CHOICE") %}
+                {% set fvalues = {
+                        (constant("Galette\\Entity\\Adherent::NC")): _T('Unspecified'),
+                        (constant("Galette\\Entity\\Adherent::MAN")): _T('Man'),
+                        (constant("Galette\\Entity\\Adherent::WOMAN")): _T('Woman')
+                    }
+                %}
+            {% else %}
+                {% set type = constant("Galette\\DynamicFields\\DynamicField::LINE") %}
+            {% endif %}
+        {% endif %}
+                                    <option value="{{ key }}"{% if fs.field == key %} selected="selected"{% endif %}>{{ field.label }}</option>
+    {% endfor %}
+    {% for field in adh_dynamics %}
+        {% if get_class(field) != "Galette\\DynamicFields\\Separator" %}
+            {% set fid = field.getId() %}
+            {% set rid = "dyn_" ~ fid %}
+            {% if fs.field == rid %}
+                {% set cur_field = field %}
+            {% endif %}
+        {% endif %}
+        <option value="dyn_{{ field.getId() }}"{% if fs.field == rid %} selected="selected"{% endif %}>{{ field.getName() }}</option>
+    {% endfor %}
+    {% for type, label in adh_socials %}
+        {% set rid = "socials_" ~ type %}
+        {% if fs.field == rid %}
+            {% set cur_field = type %}
+        {% endif %}
+        <option value="socials_{{ type }}"{% if fs.field == rid %} selected="selected"{% endif %}>{{ label }}</option>
+    {% endfor %}
+
+                        </select>
+    {# may not be defined #}
+    {#  #}
+    {% if type is not defined %}{% set type = null %}{% endif %}
+                                <span class="data">
+                                    <input type="hidden" name="free_type[]" value="{if isset($cur_field)}{$cur_field->getType()}{/if}"/>
+    {% if cur_field is defined and (get_class(cur_field) == "Galette\\DynamicFields\\Choice" or type == constant("Galette\\DynamicFields\\DynamicField::CHOICE")) %}
+                                    <select name="free_query_operator[]" class="free_operator nochosen">
+                                        <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") %} selected="selected"{% endif %}>{{ _T('is') }}</option>
+                                        <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_NOT_EQUALS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_NOT_EQUALS") %} selected="selected"{% endif %}>{{ _T('is not') }}</option>
+                                    </select>
+                                    <select name="free_text[]" class="free_text nochosen">
+        {% if cur_field is defined and get_class(cur_field) == "Galette\\DynamicFields\\Choice" %}
+            {% for key, value in cur_field.getValues() %}
+                                        <option value="{{ key }}"{% if key == fs.search %} selected="selected"{% endif %}>{{ value }}</option>
+            {% endfor %}
+        {% else %}
+            {% for key, value in fvalues %}
+                <option value="{{ key }}"{% if key == fs.search %} selected="selected"{% endif %}>{{ value }}</option>
+            {% endfor %}
+        {% endif %}
+                                    </select>
+    {% elseif cur_field is defined and (get_class(cur_field) == "Galette\\DynamicFields\\Date" or type == constant("Galette\\DynamicFields\\DynamicField::DATE")) %}
+                                    <select name="free_query_operator[]" class="free_operator nochosen">
+                                        <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") %} selected="selected"{% endif %}>{{ _T('is') }}</option>
+                                        <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_BEFORE") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_BEFORE") %} selected="selected"{% endif %}>{{ _T('before') }}</option>
+                                        <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_AFTER") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_AFTER") %} selected="selected"{% endif %}>{{ _T('after') }}</option>
+                                    </select>
+                                    <input type="text" name="free_text[]" value="{{ fs.search|date(_T('Y-m-d')) }}" class="modif_date" maxlength="10" size="10"/>
+                                    <span class="exemple">{{ _T('(yyyy-mm-dd format)') }}</span>
+    {% elseif cur_field is defined and (get_class(cur_field) == "Galette\\DynamicFields\\Boolean" or type == constant("Galette\\DynamicFields\\DynamicField::BOOLEAN")) %}
+                                    <select name="free_query_operator[]" class="free_operator nochosen">
+                                        <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") %} selected="selected"{% endif %}>{{ _T('is') }}</option>
+                                    </select>
+                                    <input type="radio" name="free_text[]" id="free_text_yes" value="1"{% if fs.search == 1 %} checked="checked"{% endif %}/><label for="free_text_yes">{{ _T('Yes') }}</label>
+                                    <input type="radio" name="free_text[]" id="free_text_no" value="0"{% if fs.search == 0 %} checked="checked"{% endif %}/><label for="free_text_no">{{ _T('No') }}</label>
+    {% else %}
+                                    <select name="free_query_operator[]" class="free_operator nochosen">
+                                        <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") %} selected="selected"{% endif %}>{{ _T('is') }}</option>
+                                        <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_CONTAINS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_CONTAINS") %} selected="selected"{% endif %}>{{ _T('contains') }}</option>
+                                        <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_NOT_EQUALS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_NOT_EQUALS") %} selected="selected"{% endif %}>{{ _T('is not') }}</option>
+                                        <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_NOT_CONTAINS") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_NOT_CONTAINS") %} selected="selected"{% endif %}>{{ _T('do not contains') }}</option>
+                                        <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_STARTS_WITH") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_STARTS_WITH") %} selected="selected"{% endif %}>{{ _T('starts with') }}</option>
+                                        <option value="{{ constant("Galette\\Filters\\AdvancedMembersList::OP_ENDS_WITH") }}"{% if fs.qry_op == constant("Galette\\Filters\\AdvancedMembersList::OP_ENDS_WITH") %} selected="selected"{% endif %}>{{ _T('ends with') }}</option>
+                                    </select>
+                                    <input type="text" name="free_text[]" value="{{ fs.search }}"{% if cur_field is defined and get_class(cur_field) == "Galette\\DynamicFields\\Text" %} class="large"{% endif %}/>
+    {% endif %}
+                                </span>
+                                <a
+                                    href="#"
+                                    class="ui small compact red icon button fright tooltip delete delcriteria"
+                                >
+                                    <i class="trash alt icon"></i>
+                                    <span class="sr-only">{{ _T('Remove criteria') }}</span>
+                                </a>
+                            </li>
+{% endfor %}
+                        </ul>
+                    </div>
+                </div>
+            <div class="ui basic center aligned segment">
+                <input type="submit" class="ui primary button" value="{{ _T('Filter') }}"/>
+                <input type="hidden" name="advanced_filtering" value="true" />
+                <input type="submit" name="clear_adv_filter" class="ui button" value="{{ _T('Clear filter') }}"/>
+                {% include "components/forms/csrf.html.twig" %}
+            </div>
+        </form>
+{% endblock %}
+
+{% block javascripts %}
+        <script type="text/javascript">
+            var _operators = {
+                op_equals: {
+                    id: {{ constant ("Galette\\Filters\\AdvancedMembersList::OP_EQUALS") }},
+                    name: "{{ _T('is') }}"
+                },
+                op_contains: {
+                    id: {{ constant ("Galette\\Filters\\AdvancedMembersList::OP_CONTAINS") }},
+                    name: "{{ _T('contains') }}"
+                },
+                op_not_equals: {
+                    id: {{ constant ("Galette\\Filters\\AdvancedMembersList::OP_NOT_EQUALS") }},
+                    name: "{{ _T('is not') }}"
+                },
+                op_not_contains: {
+                    id: {{ constant ("Galette\\Filters\\AdvancedMembersList::OP_NOT_CONTAINS") }},
+                    name: "{{ _T('do not contains') }}"
+                },
+                op_starts_with: {
+                    id: {{ constant ("Galette\\Filters\\AdvancedMembersList::OP_STARTS_WITH") }},
+                    name: "{{ _T('starts with') }}"
+                },
+                op_ends_with: {
+                    id: {{ constant ("Galette\\Filters\\AdvancedMembersList::OP_ENDS_WITH") }},
+                    name: "{{ _T('ends with') }}"
+                },
+                op_before: {
+                    id: {{ constant ("Galette\\Filters\\AdvancedMembersList::OP_BEFORE") }},
+                    name: "{{ _T('before') }}"
+                },
+                op_after: {
+                    id: {{ constant ("Galette\\Filters\\AdvancedMembersList::OP_AFTER") }},
+                    name: "{{ _T('after') }}"
+                },
+            };
+
+            var _fields = {
+{% for key, field in search_fields %}
+    {% if key starts with 'date_' or key == 'ddn_adh' %}
+        {% set type = constant("Galette\\DynamicFields\\DynamicField::DATE") %}
+    {% elseif key == constant("Galette\\Entity\\Status::PK") %}
+        {% set type = constant("Galette\\DynamicFields\\DynamicField::CHOICE") %}
+        {% set fvalues = statuts %}
+    {% elseif key == 'sexe_adh' %}
+        {% set type = constant("Galette\\DynamicFields\\DynamicField::CHOICE") %}
+        {% set fvalues = {
+                (constant("Galette\\Entity\\Adherent::NC")): _T('Unspecified'),
+                (constant("Galette\\Entity\\Adherent::MAN")): _T('Man'),
+                (constant("Galette\\Entity\\Adherent::WOMAN")): _T('Woman')
+            }
+        %}
+    {% else %}
+        {% set type = constant("Galette\\DynamicFields\\DynamicField::LINE") %}
+    {% endif %}
+                {{ key }}: { type:'{{ type }}'{% if fvalues is defined %}, values: {{ fvalues|json_encode }}{% endif %} },
+{% endfor %}
+{% for field in adh_dynamics %}
+    {% if get_class(field) == "Galette\\DynamicFields\\Separator" %}
+            {# do nothing #}
+    {% elseif get_class(field) == "Galette\\DynamicFields\\Choice" %}
+                dyn_{{ field.getId() }}: { type:'{{ field.getType() }}', values: {{ field.getValues()|json_encode }} },
+    {% else %}
+                dyn_{{ field.getId() }}: { type:'{{ field.getType() }}' },
+    {% endif %}
+{% endfor %}
+            };
+
+            var _newFilter = function(elt) {
+                elt.find('span').html('');
+                elt.find('select.operator_selector').val(0);
+                elt.find('select.field_selector').val('');
+            }
+            var _rmFilter = function(elt) {
+                if ( !elt ) {
+                    elt = $('li');
+                }
+                elt.find('.delcriteria').click(function(){
+                    var _this = $(this);
+                    if ( _this.parents('ul').find('li').length > 1 ) {
+                        _this.parent('li').remove();
+                    } else {
+                        _newFilter(_this.parent('li'));
+                    }
+                    return false;
+                });
+            }
+            var _getOperatorSelector = function(list) {
+                var _options = '';
+                for (var i = 0; i < list.length; i++) {
+                    var _operator = _operators[list[i]];
+                    _options += '<option value="' + _operator.id + '">' + _operator.name + '</option>';
+                }
+                return '<select name="free_query_operator[]" class="free_operator newselectize">' + _options + '</select>';
+            }
+
+            /*var _datePickers = function() {
+                $('.modif_date').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>'
+                });
+                $('.due_date').datepicker({
+                    changeMonth: true,
+                    changeYear: true,
+                    showOn: 'button',
+                    yearRange: 'c-10:c+5',
+                    buttonText: '<i class="ui calendar alt icon"></i> <span class="sr-only">{{ _T("Select a date")|e('js') }}</span>'
+                });
+            }*/
+
+            var _selectize = function(selector) {
+                if ( !selector ) {
+                    selector = '.operator_selector,.field_selector,.free_operator,.free_text,.group_selector';
+                }
+
+                $(selector).selectize({
+                    maxItems: 1
+                });
+            }
+
+            var _initFieldSelector = function(parent) {
+                if (typeof parent == 'undefined') {
+                    parent = '';
+                }
+                $(parent + '.field_selector').change(function () {
+                    var _field_id = $(this).val();
+                    var _field    = _fields[_field_id];
+                    var _type     = _field.type;
+
+                    if (!_type) {
+                        return false;
+                    }
+
+                    var _html;
+                    switch(_type) {
+                        case '{{ constant('Galette\\DynamicFields\\DynamicField::BOOLEAN') }}':
+                            _html  = _getOperatorSelector(['op_equals']);
+
+                            _html += '<input type="radio" name="free_text[]" id="free_text_yes" value="1"{if fs.search eq 1} checked="checked"{/if}/><label for="free_text_yes">{{ _T('Yes') }}</label><input type="radio" name="free_text[]" id="free_text_no" value="0"{if fs.search eq 0} checked="checked"{/if}/><label for="free_text_no">{{ _T('No') }}</label>';
+                            break;
+                        case '{{ constant('Galette\\DynamicFields\\DynamicField::CHOICE') }}':
+                            _html = _getOperatorSelector(['op_equals', 'op_not_equals']);
+                            var _options = '';
+                            if (Array.isArray(_field.values)) {
+                                for (var i = 0; i < _field.values.length; i++) {
+                                    _options += '<option value="' + i + '">' + _field.values[i] + '</option>';
+                                }
+                            } else {
+                                for (key in _field.values) {
+                                    _options += '<option value="' + key + '">' + _field.values[key] + '</option>';
+                                }
+                            }
+                            _html += '<select name="free_text[]" class="newselectize">' + _options + '</select>';
+                            break;
+                        case '{{ constant('Galette\\DynamicFields\\DynamicField::DATE') }}':
+                            _html  = _getOperatorSelector(['op_equals', 'op_before', 'op_after']);
+                            _html += '<input type="text" name="free_text[]" class="modif_date" maxlength="10" size="10"/>';
+                            _html += '<span class="exemple">{{ _T('(yyyy-mm-dd format)') }}</span>';
+                            break;
+                        default:
+                            _html  = _getOperatorSelector(['op_equals', 'op_contains', 'op_not_equals', 'op_not_contains', 'op_starts_with', 'op_ends_with']);
+                            _html += '<input type="text" name="free_text[]"';
+                            if (_type == 'text') {
+                                _html += ' class="large"';
+                            }
+                            _html += '/>';
+                            break;
+
+                    }
+                    _html += '<input type="hidden" name="free_type[]" value="' + _type + '"/>';
+                    $(this).parent().find('span.data').html(_html);
+                    _selectize('.newselectize');
+                    $('.newselectize').removeClass('newselectize');
+                    //_datePickers();
+                    _fieldsInSortable();
+                });
+                _rmFilter();
+            }
+
+            $(function(){
+                _initSortable();
+                //_datePickers();
+                _selectize();
+
+               $('#addbutton_g').click(function(){
+                    $('.operator_selector,.group_selector').each(function(){ // do this for every select with the 'combobox' class
+                        if ($(this)[0].selectize) { // requires [0] to select the proper object
+                            var value = $(this).val(); // store the current value of the select/input
+                            $(this)[0].selectize.destroy(); // destroys selectize()
+                            $(this).val(value);  // set back the value of the select/input
+                        }
+                    });
+
+                    $('#groups_search_list li:first')
+                            .clone() // copy
+                            .insertAfter('#groups_search_list li:last'); // where
+                    _selectize();
+                    return false;
+                });
+
+                $('#addbutton').click(function(){
+                    $('.operator_selector,.field_selector,.free_operator').each(function(){ // do this for every select with the 'combobox' class
+                        if ($(this)[0].selectize) { // requires [0] to select the proper object
+                            var value = $(this).val(); // store the current value of the select/input
+                            $(this)[0].selectize.destroy(); // destroys selectize()
+                            $(this).val(value);  // set back the value of the select/input
+                        }
+                    });
+                    $('#fs_sortable li:first')
+                            .clone() // copy
+                            .insertAfter('#fs_sortable li:last'); // where
+                    _selectize();
+                    //_datePickers();
+                    _fieldsInSortable();
+                    _initFieldSelector();
+                    return false;
+                });
+
+                _initFieldSelector();
+
+                /*$('.birth_date').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>'
+                });*/
+            });
+        </script>
+{% endblock %}
diff --git a/galette/templates/gtwig/pages/members_list.html.twig b/galette/templates/gtwig/pages/members_list.html.twig
new file mode 100644 (file)
index 0000000..1e6d95d
--- /dev/null
@@ -0,0 +1,841 @@
+{% extends 'page.html.twig' %}
+
+{% macro draw_actions(rclass, member, login, plugin_actions) %}
+                    <td class="{$rclass} center actions_row">
+    {% if member.canEdit(login) %}
+                        <a
+                            href="{{ path_for("editMember", { "id": member.id }) }}"
+                            class="tooltip action"
+                        >
+                            <i class="ui user edit icon" aria-hidden="true"></i>
+                            <span class="sr-only">{{ _T("%membername: edit information")|replace({ "%membername": member.sname }) }}</span>
+                        </a>
+    {% endif %}
+    {% if login.isAdmin() or login.isStaff() %}
+                        <a
+                            href="{{ path_for("contributions", { "type": "contributions", "option": "member", "value": member.id }) }}"
+                            class="tooltip"
+                        >
+                            <i class="ui cookie green icon" aria-hidden="true"></i>
+                            <span class="sr-only">{{ _T("%membername: contributions")|replace({ "%membername": member.sname }) }}</span>
+                        </a>
+                        <a
+                            href="{{ path_for("removeMember",  { "id": member.id }) }}"
+                            class="delete tooltip"
+                        >
+                            <i class="ui user times red icon" aria-hidden="true"></i>
+                            <span class="sr-only">{{ _T("%membername: remove from database")|replace({ "%membername": member.sname }) }}</span>
+                        </a>
+    {% endif %}
+    {% if login.isSuperAdmin() %}
+                        <a
+                            href="{{ path_for("impersonate", { "id": member.id }) }}"
+                            class="tooltip"
+                        >
+                            <i class="ui user secret grey icon" aria-hidden="true"></i>
+                            <span class="sr-only">{{ _T("Log in in as %membername")|replace({ "%membername": member.sname }) }}</span>
+                        </a>
+    {% endif %}
+    {# If some additionnals actions 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 plugin_actions|length != 0 %}
+        {% for plugin_name, action in plugin_actions %}
+            {% include action with { module_id: plugin_name|replace({'actions_': ''}) } %}
+        {% endfor %}
+    {% endif %}
+                    </td>
+{% endmacro %}
+
+{% block content %}
+        <form action="{{ path_for('filter-memberslist') }}" method="post" id="filtre" class="ui form">
+            <div class="ui segment">
+{% if adv_filters is not defined or not adv_filters %}
+            <div class="five fields">
+                <div class="field">
+                    <label for="filter_str">{{ _T('Search:') }}</label>
+                    <input type="text" name="filter_str" id="filter_str" value="{{ filters.filter_str }}" type="search" placeholder="{{ _T('Enter a value') }}"/>
+                </div>
+                <div class="field">
+                    <label for="field_filter">{{ _T('in:') }}</label>
+                    <select name="field_filter" id="field_filter" class="ui search dropdown nochosen">
+    {% for key, value in field_filter_options %}
+                        <option value="{{ key }}"{% if key == filters.field_filter %} selected="selected"{% endif %}>{{ value }}</option>
+    {% endfor %}
+                    </select>
+                </div>
+                <div class="field">
+                    <label for="filter_str">{{ _T('among:') }}</label>
+                    <select name="membership_filter" onchange="form.submit()" class="ui search dropdown nochosen">
+                        {% for key, value in membership_filter_options %}
+                            <option value="{{ key }}"{% if key == filters.membership_filter %} selected="selected"{% endif %}>{{ value }}</option>
+                        {% endfor %}
+                    </select>
+                </div>
+                <div class="flexend field">
+                    <label for="filter_account" class="hidden">{{ _T('among:') }}</label>
+                    <select name="filter_account" onchange="form.submit()" class="ui search dropdown nochosen">
+                        {% for key, value in filter_accounts_options %}
+                            <option value="{{ key }}"{% if key == filters.filter_account %} selected="selected"{% endif %}>{{ value }}</option>
+                        {% endfor %}
+                    </select>
+                </div>
+                <div class="flexend field">
+                    <label for="group_filter" class="hidden">{{ _T('among:') }}</label>
+                    <select name="group_filter" onchange="form.submit()" class="ui search dropdown nochosen">
+                        <option value="0">{{ _T('Select a group') }}</option>
+    {% for group in filter_groups_options %}
+                        <option value="{{ group.getId() }}"{% if filters.group_filter == group.getId() %} selected="selected"{% endif %}>{{ group.getIndentName()|raw }}</option>
+    {% endfor %}
+                    </select>
+                </div>
+            </div>
+            <div class="two fields">
+                <div class="field">
+                    <div class="inline fields">
+                        <label for="email_filter">{{ _T('Members that have an email address:') }}</label>
+                        <div class="field inline">
+                            <div class="ui radio checkbox">
+                                <input type="radio" name="email_filter" id="filter_dc_email" value="{{ constant('Galette\\Repository\\Members::FILTER_DC_EMAIL') }}"{% if filters.email_filter == constant('Galette\\Repository\\Members::FILTER_DC_EMAIL') %} checked="checked"{% endif %}>
+                                <label for="filter_dc_email">{{ _T("Don't care") }}</label>
+                            </div>
+                        </div>
+                        <div class="field inline">
+                            <div class="ui radio checkbox">
+                                <input type="radio" name="email_filter" id="filter_with_email" value="{{ constant('Galette\\Repository\\Members::FILTER_W_EMAIL') }}"{% if filters.email_filter == constant('Galette\\Repository\\Members::FILTER_W_EMAIL') %} checked="checked"{% endif %}>
+                                <label for="filter_with_email">{{ _T('With') }}</label>
+                            </div>
+                        </div>
+                        <div class="field inline">
+                            <div class="ui radio checkbox">
+                                <input type="radio" name="email_filter" id="filter_without_email" value="{{ constant('Galette\\Repository\\Members::FILTER_WO_EMAIL') }}"{% if filters.email_filter == constant('Galette\\Repository\\Members::FILTER_WO_EMAIL') %} checked="checked"{% endif %}>
+                                <label for="filter_without_email">{{ _T('Without') }}</label>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="right aligned field">
+                    <button type="submit"  class="tooltip action ui primary button" title="{{ _T('Apply filters') }}" name="filter">
+                        <i class="search icon"></i>
+                        {{ _T('Filter') }}
+                    </button>
+                    <button type="submit"  class="tooltip action ui button" title="{{ _T('Save selected criteria') }}" name="savesearch" id="savesearch">
+                        <i class="save blue icon"></i>
+                        {{ _T('Save') }}
+                    </button>
+                    <input type="submit" name="clear_filter" class="tooltip ui button" value="{{ _T('Clear filter') }}" title="{{ _T('Reset all filters to defaults') }}"/>
+                </div>
+            </div>
+{% else %}
+            <div class="field">
+                <span class="ui primary ribbon label">{{ _T('Advanced search mode') }}</span>
+                <button type="submit"  class="tooltip action ui primary button" title="{{ _T('Save current advanced search criteria') }}" name="savesearch" id="savesearch">
+                    <i class="save icon"></i>
+                    {{ _T('Save') }}
+                </button>
+                <button type="submit" class="tooltip action ui button" title="{{ _T('Change search criteria') }}" name="adv_criteria">
+                    <i class="edit blue icon"></i>
+                    {{ _T('Change criteria') }}
+                </button>
+                <input type="hidden" name="advanced_search" value="1" class="ui button"/>
+                <input type="submit" name="clear_filter" class="tooltip ui button" value="{{ _T('Clear filter') }}" title="{{ _T('Reset all filters to defaults') }}"/>
+                <div class="ui basic fluid accordion">
+                    <div class="title">
+                        <i class="dropdown icon"></i>
+                        {{ _T('Show/hide query') }}
+                    </div>
+                    <div class="content">
+                        <pre id="sql_qry" class="hidden">{{ filters.query }}</pre>
+                    </div>
+                </div>
+            </div>
+{% endif %}
+            {% include "components/forms/csrf.html.twig" %}
+        </div>
+
+        <div class="infoline">
+            <div class="ui basic horizontal segments">
+                <div class="ui basic fitted segment">
+                    <div class="ui label">{{ _Tn("%count member", "%count members", nb_members)|replace({ '%count': nb_members }) }}</div>
+                </div>
+                <div class="ui basic right aligned fitted segment">
+                    <div class="inline field">
+                        <label for="nbshow">{{ _T('Records per page:') }}</label>
+                        <select name="nbshow" id="nbshow" class="ui dropdown nochosen">
+                            {html_options options=$nbshow_options selected=$numrows}
+                        </select>
+                        <noscript> <span><input type="submit" value="{{ _T('Change') }}" /></span></noscript>
+                    </div>
+                </div>
+            </div>
+        </div>
+        </form>
+        <form action="{{ path_for('batch-memberslist') }}" method="post" id="listform" class="ui form">
+        <div class="ui basic fitted segment">
+            <table class="listing ui celled table">
+                <thead>
+                    <tr>
+{% for column in galette_list %}
+    {% if column.field_id == 'id_adh' %}
+        {% if preferences.pref_show_id %}
+                        <th class="id_row">
+                            <a href="{{ path_for("members", { "option": "order", "value": constant("Galette\\Repository\\Members::ORDERBY_ID") }) }}">
+                            {{ _T('Mbr id') }}
+                            {% if filters.orderby == constant('Galette\\Repository\\Members::ORDERBY_ID') %}
+                                {% if filters.ordered == constant('Galette\Filters\MembersList::ORDER_ASC') %}
+                                <i class="ui angle down icon tooltip"></i>
+                                {% else %}
+                                <i class="ui angle up icon tooltip"></i>
+                                {% endif %}
+                            {% endif %}
+                            </a>
+                        </th>
+        {% else %}
+                        <th class="id_row">#</th>
+        {% endif %}
+    {% else %}
+                        <th class="left">
+                            <a href="{{ path_for("members", {"option": "order", "value": column.field_id}) }}">
+                            {{ column.label }}
+                            {% if filters.orderby == column.field_id %}
+                                {% if filters.ordered == constant('Galette\Filters\MembersList::ORDER_ASC') %}
+                                <i class="ui angle down icon tooltip"></i>
+                                {% else %}
+                                <i class="ui angle up icon tooltip"></i>
+                                {% endif %}
+                            {% endif %}
+                            </a>
+                        </th>
+    {% endif %}
+{% endfor %}
+                        <th class="actions_row">{{ _T('Actions') }}</th>
+                    </tr>
+                </thead>
+                <tbody>
+{% for ordre, member in members %}
+    {% set rclass = member.getRowClass() %}
+                    <tr>
+    {% for column in galette_list %}
+        {% if column.field_id == 'id_adh' %}
+                        <td class="{{ rclass }} right" data-scope="id">
+            {% if preferences.pref_show_id %}
+                        {{ member.id }}
+            {% else %}
+                        {{ ordre + 1 + (filters.current_page - 1) * numrows }}
+            {% endif %}
+                        </td>
+        {% elseif column.field_id == 'list_adh_name' %}
+                        <td class="{{ rclass }} username_row" data-scope="row">
+                            <input type="checkbox" name="member_sel[]" value="{$member->id}"/>
+            {% if member.isCompany() %}
+                            <i class="ui building outline icon tooltip"><span class="sr-only">{{ _T('Is a company') }}</span></i>
+            {%  elseif member.isMan() %}
+                            <i class="ui male icon tooltip"><span class="sr-only">{{ _T('Is a man') }}</span></i>
+            {%  elseif member.isWoman() %}
+                            <i class="ui female icon tooltip"><span class="sr-only">{{ _T('Is a woman') }}</span></i>
+            {% else %}
+                            <i class="ui icon"></i>
+            {% endif %}
+            {% if member.email != '' %}
+                            <a href="mailto:{$member->email}" class="tooltip">
+                                <i class="ui envelope outline teal icon" aria-hidden="true"></i>
+                                <span class="sr-only">{{ _T('Mail') }}</span>
+                            </a>
+            {% else %}
+                            <i class="ui icon"></i>
+            {% endif %}
+            {% if member.isAdmin() %}
+                            <span class="tooltip">
+                                <i class="ui user shield red icon" aria-hidden="true"></i>
+                                <span class="sr-only">{{ _T('Admin') }}</span>
+                            </span>
+            {% elseif member.isStaff() %}
+                            <span class="tooltip">
+                                <i class="ui id card alternate orange icon" aria-hidden="true"></i>
+                                <span class="sr-only">{{ _T('Staff member') }}</span>
+                            </span>
+                {# TODO: display for group managers #}
+            {% else %}
+                            <i class="ui icon"></i>
+            {% endif %}
+                        {% set mid = member.id %}
+                            <a href="{{ path_for("member", {"id": member.id}) }}">{{ member.sname }}{% if member.company_name %} ({{ member.company_name }}){% endif %}</a>
+                        </td>
+        {% else %}
+            {% set lrclass = rclass %}
+            {% set propname = column.propname %}
+            {% set propvalue =  attribute(member, propname) %}
+            {% set value = null %}
+
+            {% if column.field_id == 'nom_adh' %}
+                {% set value = member.sfullname %}
+            {% elseif column.field_id == 'pseudo_adh' %}
+                {% set lrclass = rclass %}
+                {% set value = attribute(member, propname) %}
+            {% elseif column.field_id == 'tel_adh' or column.field_id == 'gsm_adh' %}
+                {% set lrclass = rclass %}
+            {% elseif column.field_id == 'id_statut' %}
+                {% set lrclass = rclass %}
+                {% set value = member.sstatus %}
+            {% elseif column.field_id == 'titre_adh' %}
+                {% if member.title is iterable %}
+                    {% set value = member.title.long %}
+                {% endif %}
+            {% elseif column.field_id == 'pref_lang' %}
+                {% set value = i18n.getNameFromId(member.language) %}
+            {% elseif column.field_id == 'adresse_adh' %}
+                {% set value = member.saddress|e('html')|nl2br %}
+                {% set escaped = true %}
+            {% elseif column.field_id == 'bool_display_info' %}
+                {% set value = member.sappears_in_list %}
+            {% elseif column.field_id == 'activite_adh' %}
+                {% set value = member.sactive %}
+            {% elseif column.field_id == 'id_statut' %}
+                {% set value = member.sstatus %}
+            {% elseif column.field_id == 'bool_admin_adh' %}
+                {% set value = member.sadmin %}
+            {% elseif column.field_id == 'bool_exempt_adh' %}
+                {% set value = member.sdue_free %}
+            {% elseif column.field_id == 'sexe_adh' %}
+                {% set value = member.sgender %}
+            {% endif %}
+
+            {# If value has not been set, take the generic value #}
+            {% if not value %}
+                {% if propvalue %}
+                    {% set value = propvalue|e('html') %}
+                {% else %}
+                    {% set value = propvalue %}
+                {% endif %}
+            {% elseif escaped is not defined %}
+                {% set value = value|e('html') %}
+            {% endif %}
+
+                        <td class="{{ lrclass }}" data-title="{{ column.label }}">
+            {# Display column.
+                A check is done here to adapt display, this is may not the best way to go
+                but for now, that works as expected.
+            #}
+            {% if value %}
+                {% if column.field_id == 'email_adh' %}
+                                <a href="mailto:{{ value }}">{{ value }}</a>
+                {% elseif column.field_id == 'tel_adh' or column.field_id == 'gsm_adh' %}
+                                <a href="tel:{{ value }}">{{ value }}</a>
+                {% elseif column.field_id == 'parent_id' %}
+                                <a href="{{ path_for("member", {"id": member.parent}) }}">{{ memberName(member.parent) }}</a>
+                {% elseif column.field_id == 'ddn_adh' %}
+                                {{ value }} {{ member.getAge() }}
+                {% else %}
+                                {{ value }}
+                {% endif %}
+            {% endif %}
+                        </td>
+        {% endif %}
+    {% endfor %}
+                    {{ _self.draw_actions(rclass, member, login, plugin_actions) }}
+                    </tr>
+{% else %}
+                    <tr><td colspan="{{ galette_list|length }}" class="emptylist">{{ _T('No member has been found') }}</td></tr>
+{% endfor %}
+                </tbody>
+            </table>
+        </div>
+{% if nb_members != 0 and (login.isGroupManager() and preferences.pref_bool_groupsmanagers_exports or login.isAdmin() or login.isStaff()) %}
+        <div class="ui bottom attached segment screen-only">
+            <div class="ui horizontal list">
+                <span class="ui primary ribbon label">{{ _T('For the selection:') }}</span>
+    {% if login.isAdmin() or login.isStaff() %}
+                <div class="item">
+                    <button type="submit" id="masschange" name="masschange" class="action ui labeled icon tiny button">
+                        <i class="user edit blue icon"></i> {{ _T('Mass change') }}
+                    </button>
+                </div>
+                <div class="item">
+                    <button type="submit" id="masscontributions" name="masscontributions" class="action ui labeled icon tiny button">
+                        <i class="ui cookie bite green icon"></i> {{ _T('Mass add contributions') }}
+                    </button>
+                </div>
+                <div class="item">
+                    <button type="submit" id="delete" name="delete" class="ui labeled icon tiny button">
+                        <i class="user times red icon"></i> {{ _T('Delete') }}
+                    </button>
+                </div>
+    {% endif %}
+    {% if login.isAdmin() or login.isStaff() or login.isGroupManager() and preferences.pref_bool_groupsmanagers_mailings %}
+        {% if preferences.pref_mail_method != constant('Galette\\Core\\GaletteMail::METHOD_DISABLED') %}
+                <div class="item">
+                    <button type="submit" id="sendmail" name="mailing" class="ui labeled icon tiny button">
+                        <i class="mail bulk icon"></i> {{ _T('Mail') }}
+                    </button>
+                </div>
+        {% endif %}
+    {% endif %}
+
+    {% if login.isGroupManager() and preferences.pref_bool_groupsmanagers_exports or login.isAdmin() or login.isStaff() %}
+                <div class="item">
+                    <button type="submit" id="attendance_sheet" name="attendance_sheet" class="ui labeled icon tiny button">
+                        <i class="file alternate icon"></i> {{ _T('Attendance sheet') }}
+                    </button>
+                </div>
+                <div class="item">
+                    <button type="submit" id="labels" name="labels" class="ui labeled icon tiny button">
+                        <i class="address card icon"></i> {{ _T('Generate labels') }}
+                    </button>
+                </div>
+                <div class="item">
+                    <button type="submit" id="cards" name="cards" class="ui labeled icon tiny button">
+                        <i class="id badge icon"></i> {{ _T('Generate Member Cards') }}
+                    </button>
+                </div>
+                <div class="item">
+                    <button type="submit" id="csv" name="csv" class="ui labeled icon tiny button">
+                        <i class="file csv icon"></i> {{ _T('Export as CSV') }}
+                    </button>
+                </div>
+    {% endif %}
+    {% if plugin_batch_actions|length != 0 %}
+        {foreach from=$plugin_batch_actions key=plugin_name item=action}
+            {include file=$action module_id=$plugin_name|replace:'batch_action_':''}
+        {/foreach}
+    {% endif %}
+            </div>
+        </div>
+        <div class="ui basic center aligned fitted segment">
+            <div class="ui inverted pagination menu">
+                <div class="header item">
+                    {{ _T('Pages:') }}
+                </div>
+                {{ pagination|raw }}
+            </div>
+        </div>
+{% endif %}
+            {% include "components/forms/csrf.html.twig" %}
+        </form>
+    {% if nb_members != 0 %}
+        <div id="legende" title="{{ _T('Legend') }}" class="ui modal">
+            <div class="header">{{ _T('Legend') }}</div>
+            <div class="content">
+                <table class="ui stripped table">
+                    <thead>
+                        <tr>
+                            <th class="" colspan="4">{{ _T('Reading the list') }}</th>
+                        </tr>
+                    <thead>
+                    <tbody>
+                        <tr>
+                            <th class="back">{{ _T('Name') }}</th>
+                            <td class="back">{{ _T('Active account') }}</td>
+                            <th class="inactif back">{{ _T('Name') }}</th>
+                            <td class="back">{{ _T('Inactive account') }}</td>
+                        </tr>
+                        <tr>
+                            <th class="cotis-ok color-sample">&nbsp;</th>
+                            <td class="back">{{ _T('Membership in order') }}</td>
+                            <th class="cotis-soon color-sample">&nbsp;</th>
+                            <td class="back">{{ _T('Membership will expire soon (&lt;30d)') }}</td>
+                        </tr>
+                        <tr>
+                            <th class="cotis-never color-sample">&nbsp;</th>
+                            <td class="back">{{ _T('Never contributed') }}</td>
+                            <th class="cotis-late color-sample">&nbsp;</th>
+                            <td class="back">{{ _T('Lateness in fee') }}</td>
+                        </tr>
+                    </tbody>
+                </table>
+                <table class="ui stripped table">
+                    <thead>
+                        <tr>
+                            <th class="" colspan="4">{{ _T('Actions') }}</th>
+                        </tr>
+                    <thead>
+                    <tbody>
+                        <tr>
+                            <th class="action">
+                                <i class="ui user edit icon"></i>
+                            </th>
+                            <td class="back">{{ _T('Modification') }}</td>
+                            <th>
+                                <i class="ui cookie icon"></i>
+                            </th>
+                            <td class="back">{{ _T('Contributions') }}</td>
+                        </tr>
+                        <tr>
+                            <th class="delete">
+                                <i class="ui user times red icon"></i>
+                            </th>
+                            <td class="back">{{ _T('Deletion') }}</td>
+                        </tr>
+                    </tbody>
+                </table>
+                <table class="ui stripped table">
+                    <thead>
+                        <tr>
+                            <th colspan="4">{{ _T('User status/interactions') }}</th>
+                        </tr>
+                    <thead>
+                    <tbody>
+                        <tr>
+                            <th><i class="ui envelope outline teal icon"></i></th>
+                            <td class="back">{{ _T('Send an email') }}</td>
+                            <th><i class="ui building icon"></i></th>
+                            <td class="back">{{ _T('Is a company') }}</td>
+                        </tr>
+
+                        <tr>
+                            <th><i class="ui male icon"></i></th>
+                            <td class="back">{{ _T('Is a man') }}</td>
+                            <th><i class="ui female icon"></i></th>
+                            <td class="back">{{ _T('Is a woman') }}</td>
+                        </tr>
+                        <tr>
+                            <th><i class="ui user shield red icon"></i></th>
+                            <td class="back">{{ _T('Admin') }}</td>
+                            <th><i class="ui id card alternate orange icon"></i></th>
+                            <td class="back">{{ _T('Staff member') }}</td>
+
+                        </tr>
+                    </tbody>
+                </table>
+            </div>
+            <div class="actions"><div class="ui labeled icon deny button"><i class="times icon"></i> {{ _T('Close') }}</div></div>
+        </div>
+    {% endif %}
+{% endblock %}
+
+{% block javascripts %}
+        <script type="text/javascript">
+{if $nb_members != 0}
+        var _checkselection = function() {
+            var _checkeds = $('table.listing').find('input[type=checkbox]:checked').length;
+            if ( _checkeds == 0 ) {
+                var _el = $('<div id="pleaseselect" title="{_T string="No member selected" escape="js"}">{_T string="Please make sure to select at least one member from the list to perform this action." escape="js"}</div>');
+                _el.appendTo('body').dialog({
+                    modal: true,
+                    buttons: {
+                        Ok: function() {
+                            $(this).dialog( "close" );
+                        }
+                    },
+                    close: function(event, ui){
+                        _el.remove();
+                    }
+                });
+                return false;
+            }
+            return true;
+        }
+{/if}
+        {# Use of Javascript to draw specific elements that are not relevant is JS is inactive #}
+        $(function(){
+{if $nb_members != 0}
+            var _checklinks = '<div class="checkboxes ui basic horizontal segments"><div class="ui basic fitted segment"><a href="#" class="checkall ui blue tertiary button">{_T string="(Un)Check all" escape="js"}</a> | <a href="#" class="checkinvert ui blue tertiary button">{_T string="Invert selection" escape="js"}</a></div><div class="ui basic right aligned fitted segment"><a href="#" class="show_legend ui blue tertiary button">{_T string="Show legend" escape="js"}</a></div></div>';
+            $('.listing').before(_checklinks);
+            $('.listing').after(_checklinks);
+            _bind_check();
+            _bind_legend();
+
+            $('.selection_menu *[type="submit"], .selection_menu *[type="button"]').click(function(event){
+                if ( this.id == 'delete' || this.id == 'masschange' ) {
+                    //mass removal is handled from 2 steps removal
+                    //mass change is specifically handled below
+                    return;
+                }
+
+                if (!_checkselection()) {
+                    return false;
+                } else {
+    {if $existing_mailing eq true}
+                    if (this.id == 'sendmail') {
+                        var _el = $('<div id="existing_mailing" title="{_T string="Existing mailing" escape="js"}">{_T string="A mailing already exists. Do you want to create a new one or resume the existing?" escape="js"}</div>');
+                        _el.appendTo('body').dialog({
+                            modal: true,
+                            hide: 'fold',
+                            width: '25em',
+                            height: 150,
+                            close: function(event, ui){
+                                _el.remove();
+                            },
+                            buttons: {
+                                '{{ _T('Resume') }}': function() {
+                                    $(this).dialog( "close" );
+                                    location.href = '{{ path_for('mailing') }}';
+                                },
+                                '{{ _T('New') }}': function() {
+                                    $(this).dialog( "close" );
+                                    //add required controls to the form, change its action URI, and send it.
+                                    var _form = $('#listform');
+                                    _form.append($('<input type="hidden" name="mailing_new" value="true"/>'));
+                                    _form.append($('<input type="hidden" name="mailing" value="true"/>'));
+                                    _form.submit();
+                                }
+                            }
+                        });
+                        return false;
+                    }
+    {/if}
+                    if (this.id == 'attendance_sheet') {
+                        _attendance_sheet_details();
+                        return false;
+                    }
+
+                    if (this.id == 'masscontributions') {
+                        event.preventDefault();
+                        $.ajax({
+                            url: '{{ path_for('batch-memberslist') }}',
+                            type: "POST",
+                            data: {
+                                ajax: true,
+                                masscontributions: 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);
+                                $('body').append(_res);
+
+                                _initTooltips('#mass_contributions');
+                                _massCheckboxes('#mass_contributions');
+
+                                _res.dialog({
+                                    width: 'auto',
+                                    modal: true,
+                                    close: function(event, ui){
+                                        $(this).dialog('destroy').remove()
+                                    }
+                                });
+                            },
+                            error: function() {
+                                alert("{_T string="An error occurred :(" escape="js"}");
+                            }
+                        });
+                    }
+
+                    return true;
+                }
+            });
+{/if}
+            if ( _shq = $('#showhideqry') ) {
+                _shq.click(function(){
+                    $('#sql_qry').toggleClass('hidden');
+                    return false;
+                });
+            }
+
+            $('#savesearch').on('click', function(e) {
+                e.preventDefault();
+
+                var _el = $('<div id="savedsearch_details" title="{_T string="Search title" escape="js"}"><input type="text" name="search_title" id="search_title"/></div>');
+                _el.appendTo('body').dialog({
+                    modal: true,
+                    hide: 'fold',
+                    width: '40%',
+                    height: 200,
+                    close: function(event, ui){
+                        _el.remove();
+                    },
+                    buttons: {
+                        '{_T string="Ok" escape="js"}': function() {
+                            var _form = $('#filtre');
+                            var _data = _form.serialize();
+                            _data = _data + "&search_title=" + $('#search_title').val();
+                            $.ajax({
+                                url: '{{ path_for('saveSearch') }}',
+                                type: "POST",
+                                data: _data,
+                                datatype: 'json',
+                                {include file="js_loader.tpl"},
+                                success: function(res) {
+                                    $.ajax({
+                                        url: '{{ path_for('ajaxMessages') }}',
+                                        method: "GET",
+                                        success: function (message) {
+                                            $('#asso_name').after(message);
+                                        }
+                                    });
+                                }
+                            });
+
+                            $(this).dialog( "close" );
+                        },
+                        '{_T string="Cancel" escape="js"}': function() {
+                            $(this).dialog( "close" );
+                        }
+                    }
+                });
+            });
+
+        });
+{if $nb_members != 0}
+        {include file="js_removal.tpl"}
+        {include file="js_removal.tpl" selector="#delete" deleteurl="'{{ path_for('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();
+
+            res.find('select:not(.nochosen)').selectize({
+                maxItems: 1
+            });
+        }
+
+        $('#masschange').off('click').on('click', function(event) {
+            event.preventDefault();
+            var _this = $(this);
+
+            if (!_checkselection()) {
+                return false;
+            }
+            $.ajax({
+                url: '{{ path_for('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('ajaxMessages') }}',
+                                                    method: "GET",
+                                                    success: function (message) {
+                                                        $('#asso_name').after(message);
+                                                    }
+                                                });
+                                            }
+                                        }
+                                    });
+                                });
+                            },
+                            error: function() {
+                                alert("{_T string="An error occurred :(" 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 occurred :(" escape="js"}");
+                }
+            });
+        });
+
+        var _attendance_sheet_details = function(){
+            var _selecteds = [];
+            $('table.listing').find('input[type=checkbox]:checked').each(function(){
+                _selecteds.push($(this).val());
+            });
+            $.ajax({
+                url: '{{ path_for('attendance_sheet_details') }}',
+                type: "POST",
+                data: {
+                    ajax: true,
+                    selection: _selecteds
+                },
+                dataType: 'html',
+                success: function(res){
+                    var _el = $('<div id="attendance_sheet_details" title="{_T string="Attendance sheet details" escape="js"}"> </div>');
+                    _el.appendTo('body').dialog({
+                        modal: true,
+                        hide: 'fold',
+                        width: '60%',
+                        height: 400,
+                        close: function(event, ui){
+                            _el.remove();
+                        },
+                        buttons: {
+                            Ok: function() {
+                                $('#sheet_details_form').submit();
+                                $(this).dialog( "close" );
+                            },
+                            Cancel: function() {
+                                $(this).dialog( "close" );
+                            }
+                        }
+                    }).append(res);
+                    /*$('#sheet_date').datepicker({
+                        changeMonth: true,
+                        changeYear: true,
+                        showOn: 'button',
+                        yearRange: 'c:c+5',
+                        buttonText: '<i class="ui calendar alt icon"></i> <span class="sr-only">{_T string="Select a date" escape="js"}</span>'
+                    });*/
+                },
+                error: function() {
+                    alert("{_T string="An error occurred displaying attendance sheet details interface :(" escape="js"}");
+                }
+            });
+        }
+{/if}
+    </script>
+{% endblock %}
\ No newline at end of file
index 553ce1cfbef4b05cf5894ea1c37f3e38f50311d1..51e789cd0547d3995cc297f65e11e9bec73eecd0 100644 (file)
@@ -48,7 +48,7 @@
                         <img src="{{ path_for('logo') }}" class="picture" width="{{ logo.getOptimalWidth() }}" height="{{ logo.getOptimalHeight() }}" alt="{{ _T("Current logo") }}"/><br/>
                         <label for="del_logo">{{ _T("Delete image") }}</label><input type="checkbox" name="del_logo" id="del_logo" value="1" /><br />
         {% endif %}
-                        <input type="file" name="logo" id="logo_picture"{% if GALETTE_MODE == 'DEMO' %} disabled="disabled"{% endif %}/>
+                        <input type="file" name="logo" id="logo_picture"{% if constant('GALETTE_MODE') == constant('\\Galette\\Core\\Galette::MODE_DEMO') %} disabled="disabled"{% endif %}/>
                     </div>
                 </div>
             </div>
                         <label for="pref_galette_url" class="tooltip">{{ _T("Galette base URL") }}</label>
                         <div class="ui right corner labeled input">
                             <div class="ui corner label">
-                                <i class="circular inverted primary link icon info tooltip" data-html="{{ _T("Enter the base URL to your Galette instance. You should only change this parameter if the current page URL is not:<br/>%galette_url")|replace({ "%galette_url": preferences.getDefaultURL() }) }}"></i> {# |cat:{path_for name="preferences")#}
+                                <i class="circular inverted primary link icon info tooltip" data-html="{{ _T("Enter the base URL to your Galette instance. You should only change this parameter if the current page URL is not:<br/>%galette_url")|replace({ "%galette_url": preferences.getDefaultURL() ~ path_for('preferences') }) }}"></i>
                             </div>
                             <input type="text" name="pref_galette_url" id="pref_galette_url" placeholder="{{ preferences.getDefaultURL() }}" value="{{ pref.pref_galette_url }}"{% if required.pref_galette_url is defined and required.pref_galette_url == 1 %} required="required"{% endif %}/>
                         </div>
         <div class="ui tab segment" data-tab="mail">
             <div class="ui stackable two column grid">
                 <div class="column">
-    {% if constant('GALETTE_MODE') == 'DEMO' %}
+    {% if constant('GALETTE_MODE') == constant('\\Galette\\Core\\Galette::MODE_DEMO') %}
                     <div class="ui negative message">
                         <p>{{ _T("Application runs under demo mode. This functionnality is not enabled, sorry.") }}</p>
                     </div>
                             <div class="ui corner label">
                                 <i class="circular inverted primary link icon info tooltip" data-html="{{ _T("Recipient of new online registation and edition emails") }}"></i>
                             </div>
-                            <input type="text" name="pref_email_newadh" id="pref_email_newadh" value="{{ pref_email_newadh }}" maxlength="100" size="30"{% if required.pref_email_newadh is defined and required.pref_email_newadh == 1 %} required="required"{% endif %}/>
+                            <input type="text" name="pref_email_newadh" id="pref_email_newadh" value="{{ pref.pref_email_newadh }}" maxlength="100" size="30"{% if required.pref_email_newadh is defined and required.pref_email_newadh == 1 %} required="required"{% endif %}/>
                         </div>
                         <span class="exemple">{{ _T("(You can enter several emails separated with a comma. First address will be the default one.)") }}</span>
                     </div>
                         <img src="{{ path_for('printLogo') }}" class="picture" width="{{ print_logo.getOptimalWidth() }}" height="{{ print_logo.getOptimalHeight() }}" alt="{{ _T("Current logo for printing") }}"/><br/>
                         <label for="del_card_logo">{{ _T("Delete image") }}</label><input type="checkbox" name="del_card_logo" id="del_card_logo" value="1" /><br />
     {% endif %}
-                        <input type="file" name="card_logo" id="card_logo"{% if GALETTE_MODE == 'DEMO' %} disabled="disabled"{% endif %}/>
+                        <input type="file" name="card_logo" id="card_logo"{% if constant('GALETTE_MODE') == constant('\\Galette\\Core\\Galette::MODE_DEMO') %} disabled="disabled"{% endif %}/>
                     </div>
                 </div>{# /column #}
                 <div class="column">
 {% endif %}
 {% if login.isSuperAdmin() %}
         <div class="ui tab red inverted segment" data-tab="admin">
-    {% if GALETTE_MODE == 'DEMO' %}
+    {% if constant('GALETTE_MODE') == constant('\\Galette\\Core\\Galette::MODE_DEMO') %}
                 <div class="ui negative message">
                     {{ _T("Application runs under demo mode. This functionnality is not enabled, sorry.") }}
                 </div>
                 _addLegenButton('#mail_sign');
                 _handleLegend();
 
-                {% include "elements/js/pwdcheck.html.twig" with { selector: "#pref_admin_pass" } %}
-                {% include "elements/js/pwdcheck.html.twig" with {
+                {% include "elements/js/pwdcheck.js.twig" with { selector: "#pref_admin_pass" } %}
+                {% include "elements/js/pwdcheck.js.twig" with {
                         selector: "#test_password_strength",
                         extra_data: "pref_password_length: \$('#pref_password_length').val(),pref_password_blacklist: \$('#pref_password_blacklist').is(':checked'),pref_password_strength: \$('#pref_password_strength').val(),"
                     }
index f0587c0e16e92a7a339162025395148676b4b7ff..ec375e6907485227df4a49a0bb9202fa5c8e179d 100644 (file)
@@ -1,6 +1,6 @@
 <!DOCTYPE html>
 
-<html lang="{{ galette_lang }}" class="public_page{% if additionnal_html_class %} {{ additionnal_html_class }}{% endif %}">
+<html lang="{{ galette_lang }}" class="public_page{% if additionnal_html_class is defined %} {{ additionnal_html_class }}{% endif %}">
     <head>
         {% include 'elements/header.html.twig' %}
     </head>