]> git.agnieray.net Git - galette.git/commitdiff
Finalize migration to a controller of "members" routes
authorJohan Cwiklinski <johan@x-tnd.be>
Fri, 8 May 2020 05:34:48 +0000 (07:34 +0200)
committerJohan Cwiklinski <johan@x-tnd.be>
Fri, 8 May 2020 05:34:57 +0000 (07:34 +0200)
refs #1354

galette/includes/routes/members.routes.php
galette/lib/Galette/Controllers/Crud/GroupsController.php
galette/lib/Galette/Controllers/Crud/MembersController.php
galette/lib/Galette/Controllers/GaletteController.php
galette/lib/Galette/Controllers/PdfController.php

index bd7e0e6bde7031bfe8fdec82ad99989bebeea6ce..f4b0e3def18a6a3a37498e80b01ce837b8471cc6 100644 (file)
  * @since     0.8.2dev 2014-11-27
  */
 
-use Galette\Controllers\PdfController;
-use Galette\Controllers\CsvController;
 use Galette\Controllers\Crud;
+use Galette\Controllers\CsvController;
+use Galette\Controllers\GaletteController;
+use Galette\Controllers\PdfController;
 
 use Analog\Analog;
 use Galette\Core\Password;
@@ -179,194 +180,23 @@ $app->post(
 //reminders
 $app->get(
     '/reminders',
-    function ($request, $response) {
-        $texts = new Texts($this->preferences, $this->router);
-
-        $previews = array(
-            'impending' => $texts->getTexts('impendingduedate', $this->preferences->pref_lang),
-            'late'      => $texts->getTexts('lateduedate', $this->preferences->pref_lang)
-        );
-
-        $members = new Members();
-        $reminders = $members->getRemindersCount();
-
-        // display page
-        $this->view->render(
-            $response,
-            'reminder.tpl',
-            [
-                'page_title'                => _T("Reminders"),
-                'previews'                  => $previews,
-                'count_impending'           => $reminders['impending'],
-                'count_impending_nomail'    => $reminders['nomail']['impending'],
-                'count_late'                => $reminders['late'],
-                'count_late_nomail'         => $reminders['nomail']['late']
-            ]
-        );
-        return $response;
-    }
+    GaletteController::class . ':reminders'
 )->setName('reminders')->add($authenticate);
 
 $app->post(
     '/reminders',
-    function ($request, $response) {
-        $error_detected = [];
-        $warning_detected = [];
-        $success_detected = [];
-
-        $post = $request->getParsedBody();
-        $texts = new Texts($this->preferences, $this->router);
-        $selected = null;
-        if (isset($post['reminders'])) {
-            $selected = $post['reminders'];
-        }
-        $reminders = new Reminders($selected);
-
-        $labels = false;
-        $labels_members = array();
-        if (isset($post['reminder_wo_mail'])) {
-            $labels = true;
-        }
-
-        $list_reminders = $reminders->getList($this->zdb, $labels);
-        if (count($list_reminders) == 0) {
-            $warning_detected[] = _T("No reminder to send for now.");
-        } else {
-            foreach ($list_reminders as $reminder) {
-                if ($labels === false) {
-                    //send reminders by email
-                    $sent = $reminder->send($texts, $this->history, $this->zdb);
-
-                    if ($sent === true) {
-                        $success_detected[] = $reminder->getMessage();
-                    } else {
-                        $error_detected[] = $reminder->getMessage();
-                    }
-                } else {
-                    //generate labels for members without email address
-                    $labels_members[] = $reminder->member_id;
-                }
-            }
-
-            if ($labels === true) {
-                if (count($labels_members) > 0) {
-                    $labels_filters = new MembersList();
-                    $labels_filters->selected = $labels_members;
-                    $this->session->filters_reminders_labels = $labels_filters;
-                    return $response
-                        ->withStatus(301)
-                        ->withHeader('Location', $this->router->pathFor('pdf-member-labels'));
-                } else {
-                    $error_detected[] = _T("There are no member to proceed.");
-                }
-            }
-
-            if (count($error_detected) > 0) {
-                array_unshift(
-                    $error_detected,
-                    _T("Reminder has not been sent:")
-                );
-            }
-
-            if (count($success_detected) > 0) {
-                array_unshift(
-                    $success_detected,
-                    _T("Sent reminders:")
-                );
-            }
-        }
-
-        //flash messages if any
-        if (count($error_detected) > 0) {
-            foreach ($error_detected as $error) {
-                $this->flash->addMessage('error_detected', $error);
-            }
-        }
-        if (count($warning_detected) > 0) {
-            foreach ($warning_detected as $warning) {
-                $this->flash->addMessage('warning_detected', $warning);
-            }
-        }
-        if (count($success_detected) > 0) {
-            foreach ($success_detected as $success) {
-                $this->flash->addMessage('success_detected', $success);
-            }
-        }
-
-        return $response
-            ->withStatus(301)
-            ->withHeader('Location', $this->router->pathFor('reminders'));
-    }
+    GaletteController::class . ':doReminders'
 )->setName('doReminders')->add($authenticate);
 
 $app->get(
     '/members/reminder-filter/{membership:nearly|late}/{mail:withmail|withoutmail}',
-    function ($request, $response, $args) {
-        //always reset filters
-        $filters = new MembersList();
-        $filters->filter_account = Members::ACTIVE_ACCOUNT;
-
-        $membership = ($args['membership'] === 'nearly' ?
-            Members::MEMBERSHIP_NEARLY :
-            Members::MEMBERSHIP_LATE);
-        $filters->membership_filter = $membership;
-
-        //TODO: filter on reminder may take care of parent email as well
-        $mail = ($args['mail'] === 'withmail' ?
-            Members::FILTER_W_EMAIL :
-            Members::FILTER_WO_EMAIL);
-        $filters->email_filter = $mail;
-
-        $this->session->filter_members = $filters;
-
-        return $response
-            ->withStatus(301)
-            ->withHeader('Location', $this->router->pathFor('members'));
-    }
+    GaletteController::class . ':filterReminders'
 )->setName('reminders-filter')->add($authenticate);
 
 $app->map(
     ['GET', 'POST'],
     '/attendance-sheet/details',
-    function ($request, $response) {
-        $post = $request->getParsedBody();
-
-        if ($this->session->filter_members !== null) {
-            $filters = $this->session->filter_members;
-        } else {
-            $filters = new MembersList();
-        }
-
-        // check for ajax mode
-        $ajax = false;
-        if ($request->isXhr()
-            || isset($post['ajax'])
-            && $post['ajax'] == 'true'
-        ) {
-            $ajax = true;
-
-            //retrieve selected members
-            $selection = (isset($post['selection']) ) ? $post['selection'] : array();
-
-            $filters->selected = $selection;
-            $this->session->filter_members = $filters;
-        } else {
-            $selection = $filters->selected;
-        }
-
-
-        // display page
-        $this->view->render(
-            $response,
-            'attendance_sheet_details.tpl',
-            [
-                'page_title'    => _T("Attendance sheet configuration"),
-                'ajax'          => $ajax,
-                'selection'     => $selection
-            ]
-        );
-        return $response;
-    }
+    PdfController::class . ':attendanceSheetConfig'
 )->setName('attendance_sheet_details')->add($authenticate);
 
 $app->post(
@@ -376,166 +206,12 @@ $app->post(
 
 $app->post(
     '/ajax/members[/{option:page|order}/{value:\d+}]',
-    function ($request, $response, $args) {
-        $post = $request->getParsedBody();
-
-        if (isset($this->session->ajax_members_filters)) {
-            $filters = $this->session->ajax_members_filters;
-        } else {
-            $filters = new MembersList();
-        }
-
-        if (isset($args['option']) && $args['option'] == 'page') {
-            $filters->current_page = (int)$args['value'];
-        }
-
-        //numbers of rows to display
-        if (isset($post['nbshow']) && is_numeric($post['nbshow'])) {
-            $filters->show = $post['nbshow'];
-        }
-
-        $members = new Members($filters);
-        if (!$this->login->isAdmin() && !$this->login->isStaff()) {
-            if ($this->login->isGroupManager()) {
-                $members_list = $members->getManagedMembersList(true);
-            } else {
-                Analog::log(
-                    str_replace(
-                        ['%id', '%login'],
-                        [$this->login->id, $this->login->login],
-                        'Trying to list group members without access from #%id (%login)'
-                    ),
-                    Analog::ERROR
-                );
-                throw new Exception('Access denied.');
-            }
-        } else {
-            $members_list = $members->getMembersList(true);
-        }
-
-        //assign pagination variables to the template and add pagination links
-        $filters->setSmartyPagination($this->router, $this->view->getSmarty(), false);
-
-        $this->session->ajax_members_filters = $filters;
-
-        $selected_members = null;
-        $unreachables_members = null;
-        if (!isset($post['from'])) {
-            $mailing = $this->session->mailing;
-            if (!isset($post['members'])) {
-                $selected_members = $mailing->recipients;
-                $unreachables_members = $mailing->unreachables;
-            } else {
-                $m = new Members();
-                $selected_members = $m->getArrayList($post['members']);
-                if (isset($post['unreachables']) && is_array($post['unreachables'])) {
-                    $unreachables_members = $m->getArrayList($post['unreachables']);
-                }
-            }
-        } else {
-            switch ($post['from']) {
-                case 'groups':
-                    if (!isset($post['gid'])) {
-                        Analog::log(
-                            'Trying to list group members with no group id provided',
-                            Analog::ERROR
-                        );
-                        throw new Exception('A group id is required.');
-                        exit(0);
-                    }
-                    if (!isset($post['members'])) {
-                        $group = new Group((int)$post['gid']);
-                        $selected_members = array();
-                        if (!isset($post['mode']) || $post['mode'] == 'members') {
-                            $selected_members = $group->getMembers();
-                        } elseif ($post['mode'] == 'managers') {
-                            $selected_members = $group->getManagers();
-                        } else {
-                            Analog::log(
-                                'Trying to list group members with unknown mode',
-                                Analog::ERROR
-                            );
-                            throw new Exception('Unknown mode.');
-                            exit(0);
-                        }
-                    } else {
-                        $m = new Members();
-                        $selected_members = $m->getArrayList($post['members']);
-                        if (isset($post['unreachables']) && is_array($post['unreachables'])) {
-                            $unreachables_members = $m->getArrayList($post['unreachables']);
-                        }
-                    }
-                    break;
-                case 'attach':
-                    if (!isset($post['id_adh'])) {
-                        throw new \RuntimeException(
-                            'Current selected member must be excluded while attaching!'
-                        );
-                        exit(0);
-                    }
-                    break;
-            }
-        }
-
-        $params = [
-            'filters'               => $filters,
-            'members_list'          => $members_list,
-            'selected_members'      => $selected_members,
-            'unreachables_members'  => $unreachables_members
-        ];
-
-        if (isset($post['multiple'])) {
-            $params['multiple'] = true;
-        }
-
-        if (isset($post['gid'])) {
-            $params['the_id'] = $post['gid'];
-        }
-
-        if (isset($post['id_adh'])) {
-            $params['excluded'] = $post['id_adh'];
-        }
-
-        // display page
-        $this->view->render(
-            $response,
-            'ajax_members.tpl',
-            $params
-        );
-        return $response;
-    }
+    Crud\MembersController::class . ':ajaxList'
 )->setName('ajaxMembers')->add($authenticate);
 
 $app->post(
     '/ajax/group/members',
-    function ($request, $response) {
-        $post = $request->getParsedBody();
-
-        $ids = $post['persons'];
-        $mode = $post['person_mode'];
-
-        if (!$ids || !$mode) {
-            Analog::log(
-                'Missing persons and mode for ajaxGroupMembers',
-                Analog::INFO
-            );
-            die();
-        }
-
-        $m = new Members;
-        $persons = $m->getArrayList($ids);
-
-        // display page
-        $this->view->render(
-            $response,
-            'group_persons.tpl',
-            [
-                'persons'       => $persons,
-                'person_mode'   => $mode
-            ]
-        );
-        return $response;
-    }
+    Crud\GroupsController::class . ':ajaxMembers'
 )->setName('ajaxGroupMembers')->add($authenticate);
 
 $app->get(
index 20ee4a545f94ec9c881fa668aa53934e7d470d98..10f22f5731f84e64b0632fc38b3cc019b83b2d8e 100644 (file)
@@ -253,6 +253,45 @@ class GroupsController extends CrudController
         return $response;
     }
 
+    /**
+     * Groups list page for ajax calls
+     *
+     * @param Request  $request  PSR Request
+     * @param Response $response PSR Response
+     * @param array    $args     Request arguments
+     *
+     * @return Response
+     */
+    public function ajaxMembers(Request $request, Response $response, array $args = []) :Response
+    {
+        $post = $request->getParsedBody();
+
+        $ids = $post['persons'];
+        $mode = $post['person_mode'];
+
+        if (!$ids || !$mode) {
+            Analog::log(
+                'Missing persons and mode for ajaxGroupMembers',
+                Analog::INFO
+            );
+            die();
+        }
+
+        $m = new Members;
+        $persons = $m->getArrayList($ids);
+
+        // display page
+        $this->view->render(
+            $response,
+            'group_persons.tpl',
+            [
+                'persons'       => $persons,
+                'person_mode'   => $mode
+            ]
+        );
+        return $response;
+    }
+
     /**
      * Filtering
      *
@@ -280,19 +319,7 @@ class GroupsController extends CrudController
      */
     public function edit(Request $request, Response $response, array $args = []) :Response
     {
-        /*$id = (int)$args['id'];
-        $ptype = new PaymentType($this->zdb, $id);
-
-        // display page
-        $this->view->render(
-            $response,
-            'edit_paymenttype.tpl',
-            [
-                'page_title'    => _T("Edit payment type"),
-                'ptype'         => $ptype
-            ]
-        );
-        return $response;*/
+        //no edit page (included on list), just to satisfy inheritance
     }
 
     /**
index 7af62e64860d18b9b395ff11f53f48cd83a592b9..f4936daa4042831e910e21ebc717a8278f77dead 100644 (file)
@@ -49,6 +49,7 @@ use Galette\Entity\Adherent;
 use Galette\Entity\Contribution;
 use Galette\Entity\ContributionsTypes;
 use Galette\Entity\DynamicFieldsHandle;
+use Galette\Entity\Group;
 use Galette\Entity\Status;
 use Galette\Entity\FieldsConfig;
 use Galette\Entity\Texts;
@@ -723,6 +724,145 @@ class MembersController extends CrudController
         return $response;
     }
 
+    /**
+     * Members list for ajax
+     *
+     * @param Request  $request  PSR Request
+     * @param Response $response PSR Response
+     * @param array    $args     Request arguments
+     *
+     * @return Response
+     */
+    public function ajaxList(Request $request, Response $response, array $args = []) :Response
+    {
+        $post = $request->getParsedBody();
+
+        if (isset($this->session->ajax_members_filters)) {
+            $filters = $this->session->ajax_members_filters;
+        } else {
+            $filters = new MembersList();
+        }
+
+        if (isset($args['option']) && $args['option'] == 'page') {
+            $filters->current_page = (int)$args['value'];
+        }
+
+        //numbers of rows to display
+        if (isset($post['nbshow']) && is_numeric($post['nbshow'])) {
+            $filters->show = $post['nbshow'];
+        }
+
+        $members = new Members($filters);
+        if (!$this->login->isAdmin() && !$this->login->isStaff()) {
+            if ($this->login->isGroupManager()) {
+                $members_list = $members->getManagedMembersList(true);
+            } else {
+                Analog::log(
+                    str_replace(
+                        ['%id', '%login'],
+                        [$this->login->id, $this->login->login],
+                        'Trying to list group members without access from #%id (%login)'
+                    ),
+                    Analog::ERROR
+                );
+                throw new \Exception('Access denied.');
+            }
+        } else {
+            $members_list = $members->getMembersList(true);
+        }
+
+        //assign pagination variables to the template and add pagination links
+        $filters->setSmartyPagination($this->router, $this->view->getSmarty(), false);
+
+        $this->session->ajax_members_filters = $filters;
+
+        $selected_members = null;
+        $unreachables_members = null;
+        if (!isset($post['from'])) {
+            $mailing = $this->session->mailing;
+            if (!isset($post['members'])) {
+                $selected_members = $mailing->recipients;
+                $unreachables_members = $mailing->unreachables;
+            } else {
+                $m = new Members();
+                $selected_members = $m->getArrayList($post['members']);
+                if (isset($post['unreachables']) && is_array($post['unreachables'])) {
+                    $unreachables_members = $m->getArrayList($post['unreachables']);
+                }
+            }
+        } else {
+            switch ($post['from']) {
+                case 'groups':
+                    if (!isset($post['gid'])) {
+                        Analog::log(
+                            'Trying to list group members with no group id provided',
+                            Analog::ERROR
+                        );
+                        throw new \Exception('A group id is required.');
+                        exit(0);
+                    }
+                    if (!isset($post['members'])) {
+                        $group = new Group((int)$post['gid']);
+                        $selected_members = array();
+                        if (!isset($post['mode']) || $post['mode'] == 'members') {
+                            $selected_members = $group->getMembers();
+                        } elseif ($post['mode'] == 'managers') {
+                            $selected_members = $group->getManagers();
+                        } else {
+                            Analog::log(
+                                'Trying to list group members with unknown mode',
+                                Analog::ERROR
+                            );
+                            throw new \Exception('Unknown mode.');
+                            exit(0);
+                        }
+                    } else {
+                        $m = new Members();
+                        $selected_members = $m->getArrayList($post['members']);
+                        if (isset($post['unreachables']) && is_array($post['unreachables'])) {
+                            $unreachables_members = $m->getArrayList($post['unreachables']);
+                        }
+                    }
+                    break;
+                case 'attach':
+                    if (!isset($post['id_adh'])) {
+                        throw new \RuntimeException(
+                            'Current selected member must be excluded while attaching!'
+                        );
+                        exit(0);
+                    }
+                    break;
+            }
+        }
+
+        $params = [
+            'filters'               => $filters,
+            'members_list'          => $members_list,
+            'selected_members'      => $selected_members,
+            'unreachables_members'  => $unreachables_members
+        ];
+
+        if (isset($post['multiple'])) {
+            $params['multiple'] = true;
+        }
+
+        if (isset($post['gid'])) {
+            $params['the_id'] = $post['gid'];
+        }
+
+        if (isset($post['id_adh'])) {
+            $params['excluded'] = $post['id_adh'];
+        }
+
+        // display page
+        $this->view->render(
+            $response,
+            'ajax_members.tpl',
+            $params
+        );
+        return $response;
+    }
+
     /**
      * Batch actions handler
      *
index d5e2eea01366a1607da204c18773304861372b1f..30893de3efcabc091a234448d7eba485fbe4f599 100644 (file)
@@ -45,9 +45,12 @@ use Galette\Core\GaletteMail;
 use Galette\Core\SysInfos;
 use Galette\Entity\FieldsCategories;
 use Galette\Entity\Status;
+use Galette\Entity\Texts;
+use Galette\Filters\MembersList;
 use Galette\IO\News;
 use Galette\IO\Charts;
 use Galette\Repository\Members;
+use Galette\Repository\Reminders;
 use Analog\Analog;
 
 /**
@@ -644,4 +647,171 @@ class GaletteController extends AbstractController
             ->withStatus(301)
             ->withHeader('Location', $this->router->pathFor('slash'));
     }
+
+    /**
+     * Reminders page
+     *
+     * @param Request  $request  PSR Request
+     * @param Response $response PSR Response
+     *
+     * @return Response
+     */
+    public function reminders(Request $request, Response $response) :Response
+    {
+        $texts = new Texts($this->preferences, $this->router);
+
+        $previews = array(
+            'impending' => $texts->getTexts('impendingduedate', $this->preferences->pref_lang),
+            'late'      => $texts->getTexts('lateduedate', $this->preferences->pref_lang)
+        );
+
+        $members = new Members();
+        $reminders = $members->getRemindersCount();
+
+        // display page
+        $this->view->render(
+            $response,
+            'reminder.tpl',
+            [
+                'page_title'                => _T("Reminders"),
+                'previews'                  => $previews,
+                'count_impending'           => $reminders['impending'],
+                'count_impending_nomail'    => $reminders['nomail']['impending'],
+                'count_late'                => $reminders['late'],
+                'count_late_nomail'         => $reminders['nomail']['late']
+            ]
+        );
+        return $response;
+    }
+
+    /**
+     * Main route
+     *
+     * @param Request  $request  PSR Request
+     * @param Response $response PSR Response
+     *
+     * @return Response
+     */
+    public function doReminders(Request $request, Response $response) :Response
+    {
+        $error_detected = [];
+        $warning_detected = [];
+        $success_detected = [];
+
+        $post = $request->getParsedBody();
+        $texts = new Texts($this->preferences, $this->router);
+        $selected = null;
+        if (isset($post['reminders'])) {
+            $selected = $post['reminders'];
+        }
+        $reminders = new Reminders($selected);
+
+        $labels = false;
+        $labels_members = array();
+        if (isset($post['reminder_wo_mail'])) {
+            $labels = true;
+        }
+
+        $list_reminders = $reminders->getList($this->zdb, $labels);
+        if (count($list_reminders) == 0) {
+            $warning_detected[] = _T("No reminder to send for now.");
+        } else {
+            foreach ($list_reminders as $reminder) {
+                if ($labels === false) {
+                    //send reminders by email
+                    $sent = $reminder->send($texts, $this->history, $this->zdb);
+
+                    if ($sent === true) {
+                        $success_detected[] = $reminder->getMessage();
+                    } else {
+                        $error_detected[] = $reminder->getMessage();
+                    }
+                } else {
+                    //generate labels for members without email address
+                    $labels_members[] = $reminder->member_id;
+                }
+            }
+
+            if ($labels === true) {
+                if (count($labels_members) > 0) {
+                    $labels_filters = new MembersList();
+                    $labels_filters->selected = $labels_members;
+                    $this->session->filters_reminders_labels = $labels_filters;
+                    return $response
+                        ->withStatus(301)
+                        ->withHeader('Location', $this->router->pathFor('pdf-member-labels'));
+                } else {
+                    $error_detected[] = _T("There are no member to proceed.");
+                }
+            }
+
+            if (count($error_detected) > 0) {
+                array_unshift(
+                    $error_detected,
+                    _T("Reminder has not been sent:")
+                );
+            }
+
+            if (count($success_detected) > 0) {
+                array_unshift(
+                    $success_detected,
+                    _T("Sent reminders:")
+                );
+            }
+        }
+
+        //flash messages if any
+        if (count($error_detected) > 0) {
+            foreach ($error_detected as $error) {
+                $this->flash->addMessage('error_detected', $error);
+            }
+        }
+        if (count($warning_detected) > 0) {
+            foreach ($warning_detected as $warning) {
+                $this->flash->addMessage('warning_detected', $warning);
+            }
+        }
+        if (count($success_detected) > 0) {
+            foreach ($success_detected as $success) {
+                $this->flash->addMessage('success_detected', $success);
+            }
+        }
+
+        return $response
+            ->withStatus(301)
+            ->withHeader('Location', $this->router->pathFor('reminders'));
+    }
+
+    /**
+     * Main route
+     *
+     * @param Request  $request  PSR Request
+     * @param Response $response PSR Response
+     * @param array    $args     Request arguments
+     *
+     * @return Response
+     */
+    public function filterReminders(Request $request, Response $response, array $args = []) :Response
+    {
+        //always reset filters
+        $filters = new MembersList();
+        $filters->filter_account = Members::ACTIVE_ACCOUNT;
+
+        $membership = ($args['membership'] === 'nearly' ?
+            Members::MEMBERSHIP_NEARLY :
+            Members::MEMBERSHIP_LATE);
+        $filters->membership_filter = $membership;
+
+        //TODO: filter on reminder may take care of parent email as well
+        $mail = ($args['mail'] === 'withmail' ?
+            Members::FILTER_W_EMAIL :
+            Members::FILTER_WO_EMAIL);
+        $filters->email_filter = $mail;
+
+        $this->session->filter_members = $filters;
+
+        return $response
+            ->withStatus(301)
+            ->withHeader('Location', $this->router->pathFor('members'));
+    }
 }
index 1a13c688610d277294b0c18b1d315f36ab28e1b0..6d5a1f4cc8700166cbd772fb88f88e53b1a305ac 100644 (file)
@@ -304,6 +304,55 @@ class PdfController extends AbstractController
         return $this->sendResponse($response, $pdf);
     }
 
+    /**
+     * PDF attendance sheet configuration page
+     *
+     * @param Request  $request  PSR Request
+     * @param Response $response PSR Response
+     * @param array    $args     Request arguments
+     *
+     * @return Response
+     */
+    public function attendanceSheetConfig(Request $request, Response $response, array $args = []) :Response
+    {
+        $post = $request->getParsedBody();
+
+        if ($this->session->filter_members !== null) {
+            $filters = $this->session->filter_members;
+        } else {
+            $filters = new MembersList();
+        }
+
+        // check for ajax mode
+        $ajax = false;
+        if ($request->isXhr()
+            || isset($post['ajax'])
+            && $post['ajax'] == 'true'
+        ) {
+            $ajax = true;
+
+            //retrieve selected members
+            $selection = (isset($post['selection']) ) ? $post['selection'] : array();
+
+            $filters->selected = $selection;
+            $this->session->filter_members = $filters;
+        } else {
+            $selection = $filters->selected;
+        }
+
+        // display page
+        $this->view->render(
+            $response,
+            'attendance_sheet_details.tpl',
+            [
+                'page_title'    => _T("Attendance sheet configuration"),
+                'ajax'          => $ajax,
+                'selection'     => $selection
+            ]
+        );
+        return $response;
+    }
+
     /**
      * PDF attendance sheet
      *