From 9b66aa6e04ab66af7ce11e26076ebf431ca938c5 Mon Sep 17 00:00:00 2001
From: Tiago Botelho <tiagonbotelho@hotmail.com>
Date: Mon, 19 Dec 2016 10:26:12 +0000
Subject: [PATCH] Prevent empty pagination when list is not empty

---
 app/controllers/concerns/kaminari_pagination.rb           | 8 ++++++++
 app/controllers/dashboard/todos_controller.rb             | 4 +++-
 app/controllers/projects/issues_controller.rb             | 3 ++-
 app/controllers/projects/merge_requests_controller.rb     | 3 ++-
 app/controllers/projects/snippets_controller.rb           | 3 ++-
 ...19988-prevent-empty-pagination-when-list-not-empty.yml | 4 ++++
 6 files changed, 21 insertions(+), 4 deletions(-)
 create mode 100644 app/controllers/concerns/kaminari_pagination.rb
 create mode 100644 changelogs/unreleased/19988-prevent-empty-pagination-when-list-not-empty.yml

diff --git a/app/controllers/concerns/kaminari_pagination.rb b/app/controllers/concerns/kaminari_pagination.rb
new file mode 100644
index 00000000000..b69340cac0e
--- /dev/null
+++ b/app/controllers/concerns/kaminari_pagination.rb
@@ -0,0 +1,8 @@
+module KaminariPagination
+  extend ActiveSupport::Concern
+
+  def bounded_pagination(items, page_number)
+    items = items.page(page_number)
+    items.to_a.empty? ? items.page(items.total_pages) : items
+  end
+end
diff --git a/app/controllers/dashboard/todos_controller.rb b/app/controllers/dashboard/todos_controller.rb
index d425d0f9014..b2333a02392 100644
--- a/app/controllers/dashboard/todos_controller.rb
+++ b/app/controllers/dashboard/todos_controller.rb
@@ -1,9 +1,11 @@
 class Dashboard::TodosController < Dashboard::ApplicationController
+  include KaminariPagination
+
   before_action :find_todos, only: [:index, :destroy_all]
 
   def index
     @sort = params[:sort]
-    @todos = @todos.page(params[:page])
+    @todos = bounded_pagination(@todos, params[:page])
   end
 
   def destroy
diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb
index 4f66e01e0f7..ec09a5297fc 100644
--- a/app/controllers/projects/issues_controller.rb
+++ b/app/controllers/projects/issues_controller.rb
@@ -5,6 +5,7 @@ class Projects::IssuesController < Projects::ApplicationController
   include ToggleAwardEmoji
   include IssuableCollections
   include SpammableActions
+  include KaminariPagination
 
   before_action :redirect_to_external_issue_tracker, only: [:index, :new]
   before_action :module_enabled
@@ -24,7 +25,7 @@ class Projects::IssuesController < Projects::ApplicationController
 
   def index
     @issues = issues_collection
-    @issues = @issues.page(params[:page])
+    @issues = bounded_pagination(@issues, params[:page])
 
     if params[:label_name].present?
       @labels = LabelsFinder.new(current_user, project_id: @project.id, title: params[:label_name]).execute
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 3abebdfd032..e25eea52723 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -6,6 +6,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
   include NotesHelper
   include ToggleAwardEmoji
   include IssuableCollections
+  include KaminariPagination
 
   before_action :module_enabled
   before_action :merge_request, only: [
@@ -37,7 +38,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
 
   def index
     @merge_requests = merge_requests_collection
-    @merge_requests = @merge_requests.page(params[:page])
+    @merge_requests = bounded_pagination(@merge_requests, params[:page])
 
     if params[:label_name].present?
       labels_params = { project_id: @project.id, title: params[:label_name] }
diff --git a/app/controllers/projects/snippets_controller.rb b/app/controllers/projects/snippets_controller.rb
index 0720be2e55d..7083b29b6a3 100644
--- a/app/controllers/projects/snippets_controller.rb
+++ b/app/controllers/projects/snippets_controller.rb
@@ -1,5 +1,6 @@
 class Projects::SnippetsController < Projects::ApplicationController
   include ToggleAwardEmoji
+  include KaminariPagination
 
   before_action :module_enabled
   before_action :snippet, only: [:show, :edit, :destroy, :update, :raw, :toggle_award_emoji]
@@ -25,7 +26,7 @@ class Projects::SnippetsController < Projects::ApplicationController
       project: @project,
       scope: params[:scope]
     )
-    @snippets = @snippets.page(params[:page])
+    @snippets = bounded_pagination(@snippets, params[:page])
   end
 
   def new
diff --git a/changelogs/unreleased/19988-prevent-empty-pagination-when-list-not-empty.yml b/changelogs/unreleased/19988-prevent-empty-pagination-when-list-not-empty.yml
new file mode 100644
index 00000000000..5570ede4a9a
--- /dev/null
+++ b/changelogs/unreleased/19988-prevent-empty-pagination-when-list-not-empty.yml
@@ -0,0 +1,4 @@
+---
+title: Prevent empty pagination when list is not empty
+merge_request: 8172
+author: 
-- 
GitLab