From 1ae62144ec2fbef20f41079b1a9f133f011dda09 Mon Sep 17 00:00:00 2001
From: VladimirCherkasov <vcherckasov@yandex.ru>
Date: Tue, 14 Jul 2015 12:51:16 +0300
Subject: [PATCH] Pagination and filter

---
 db/StoredProcedures.sql                       |  7 +++--
 media/js/reports.js                           |  3 +++
 .../classes/Controller/Admin/Requests.php     | 20 +++++++++++---
 .../application/classes/Model/Support.php     |  5 ++--
 .../views/admin/requests/errors.twig          | 26 ++++++++++++-------
 5 files changed, 43 insertions(+), 18 deletions(-)

diff --git a/db/StoredProcedures.sql b/db/StoredProcedures.sql
index 305e8dc54..6d7fa5bc6 100644
--- a/db/StoredProcedures.sql
+++ b/db/StoredProcedures.sql
@@ -1442,12 +1442,15 @@ BEGIN
 END//
 
 DROP PROCEDURE IF EXISTS RequestsNum//
-CREATE PROCEDURE `RequestsNum` () NO SQL
+CREATE PROCEDURE `RequestsNum` (
+    IN `pFilter` enum('opened','processed','closed','all')
+) NO SQL
 BEGIN
     SELECT COUNT(*)
     AS Num
     FROM requests
-    WHERE   requests.Title != '' AND
+    WHERE   IF(pFilter = 'all', TRUE, requests.Status = pFilter) AND
+            requests.Title != '' AND
             requests.Description != '';
 
 END//
diff --git a/media/js/reports.js b/media/js/reports.js
index 0fc7a484d..e0e384733 100644
--- a/media/js/reports.js
+++ b/media/js/reports.js
@@ -10,6 +10,9 @@ $(function () {
 
     $("#statusFilter").change(function () {
             console.log($(this).val());
+            //window.location = $(this).val();
+            location.href = "?filter=" + $(this).val();
+
         }
     );
 });
diff --git a/~dev_rating/application/classes/Controller/Admin/Requests.php b/~dev_rating/application/classes/Controller/Admin/Requests.php
index e4627beb9..cab904a80 100644
--- a/~dev_rating/application/classes/Controller/Admin/Requests.php
+++ b/~dev_rating/application/classes/Controller/Admin/Requests.php
@@ -9,23 +9,35 @@ class Controller_Admin_Requests extends Controller_Environment_Admin
 
     public function action_errors() {
         $itemsOnPage = 20; //$_GET['count'];
+
         $currentPage = $_GET['page'];
+        $statusFilter = $_GET['filter'];
+
+        if ($statusFilter != 'all' &&
+            $statusFilter != 'closed' &&
+            $statusFilter != 'opened' &&
+            $statusFilter != 'processed' ) {
+            $statusFilter = 'all';
+        }
+
         if ($currentPage == null) {
             $currentPage = 1;
         }
         $offset = ($currentPage - 1) * $itemsOnPage;
-        $reports = Model_Support::getReports($this->user->ID, $offset, $itemsOnPage);
+        $reports = Model_Support::getReports($this->user->ID, $offset, $itemsOnPage, $statusFilter);
         if ($reports == null) {
-            throw new HTTP_Exception_404('Picture not found');
+            throw new HTTP_Exception_404('Page not found');
         }
 
-        $requestNum = Model_Support::getNumberOfReports();
+        $requestNum = Model_Support::getNumberOfReports($statusFilter);
         $pagesNum = ceil($requestNum / $itemsOnPage);
 
         $this->twig->set([
             'Requests' => $reports,
             'PagesNum' => $pagesNum,
-            'CurrentPage' => $currentPage
+            'CurrentPage' => $currentPage,
+            'PaginationBase' => "admin/requests/errors?filter=" . $statusFilter,
+            'Filter' => $statusFilter
         ])->set_filename('admin/requests/errors');
     }
 
diff --git a/~dev_rating/application/classes/Model/Support.php b/~dev_rating/application/classes/Model/Support.php
index 9b20dba18..4f055f756 100644
--- a/~dev_rating/application/classes/Model/Support.php
+++ b/~dev_rating/application/classes/Model/Support.php
@@ -35,9 +35,10 @@ class Model_Support extends Model
             ->execute()->as_array();
     }
 
-    public static function getNumberOfReports() {
-        $query = "CALL `RequestsNum`";
+    public static function getNumberOfReports($statusFilter) {
+        $query = "CALL `RequestsNum` (:filter)";
         return DB::query(Database::SELECT, $query)
+            ->param(':filter', $statusFilter)
             ->execute()->get('Num');
     }
 }
diff --git a/~dev_rating/application/views/admin/requests/errors.twig b/~dev_rating/application/views/admin/requests/errors.twig
index 43560107b..632130ced 100644
--- a/~dev_rating/application/views/admin/requests/errors.twig
+++ b/~dev_rating/application/views/admin/requests/errors.twig
@@ -13,10 +13,10 @@
 {% block main_content %}
     <div style="padding-bottom: 10px">
         <select id="statusFilter">
-            <option value="all">all</option>
-            <option value="opened">opened</option>
-            <option value="processed">processed</option>
-            <option value="closed">closed</option>
+            <option value="all" {% if Filter == 'all'%}selected{% endif %}>all</option>
+            <option value="opened" {% if Filter == 'opened'%}selected{% endif %}>opened</option>
+            <option value="processed" {% if Filter == 'processed'%}selected{% endif %}>processed</option>
+            <option value="closed" {% if Filter == 'closed'%}selected{% endif %}>closed</option>
         </select>
     </div>
 
@@ -41,20 +41,26 @@
             </div>
         {% endfor %}
     </div>
+
     <div class="paginator">
         <div class="paginator_title">Страницы:</div>
-        {{ HTML.anchor("admin/requests/errors?page=1", "<div class=\"paginator_item selectedPageNum\"> \<\< </div>") | raw }}
-        {{ HTML.anchor("admin/requests/errors?page="~(CurrentPage-1), "<div class=\"paginator_item selectedPageNum\"> \< </div>") | raw }}
+        {{ HTML.anchor(PaginationBase~"&page=1", "<div class=\"paginator_item selectedPageNum\"> \<\< </div>") | raw }}
+        {{ HTML.anchor(PaginationBase~"&page="~max(1, CurrentPage-1), "<div class=\"paginator_item selectedPageNum\"> \< </div>") | raw }}
         <div class="paginator_item">…</div>
         {% for i in max(1,CurrentPage-2)..min(CurrentPage+2,PagesNum) %}
             {% if i == CurrentPage %}
-                {{ HTML.anchor("admin/requests/errors?page="~i, "<div class=\"paginator_item selectedPageNum\">" ~ i ~ "</div>") | raw }}
+                {{ HTML.anchor(PaginationBase~"&page="~i, "<div class=\"paginator_item selectedPageNum\">" ~ i ~ "</div>") | raw }}
             {% else %}
-                {{ HTML.anchor("admin/requests/errors?page="~i, "<div class=\"paginator_item\">" ~ i ~ "</div>") | raw }}
+                {{ HTML.anchor(PaginationBase~"&page="~i, "<div class=\"paginator_item\">" ~ i ~ "</div>") | raw }}
             {% endif %}
         {% endfor %}
         <div class="paginator_item">…</div>
-        {{ HTML.anchor("admin/requests/errors?page="~(CurrentPage+1), "<div class=\"paginator_item selectedPageNum\"> \> </div>") | raw }}
-        {{ HTML.anchor("admin/requests/errors?page="~PagesNum, "<div class=\"paginator_item selectedPageNum\"> \>\></div>") | raw }}
+        {{ HTML.anchor(PaginationBase~"&page="~min(PagesNum, CurrentPage+1), "<div class=\"paginator_item selectedPageNum\"> \> </div>") | raw }}
+        {{ HTML.anchor(PaginationBase~"&page="~PagesNum, "<div class=\"paginator_item selectedPageNum\"> \>\></div>") | raw }}
     </div>
+
 {% endblock %}
+
+
+
+
-- 
GitLab