From 3b5722bca9e7e853c1428631ae21c600e17ef4a5 Mon Sep 17 00:00:00 2001
From: Marin Jankovski <marin@gitlab.com>
Date: Fri, 4 Jul 2014 11:57:24 +0200
Subject: [PATCH] Improve performance, ordering and pagination for group
 milestones.

---
 .../groups/milestones_controller.rb           | 22 ++++++++++---------
 app/views/groups/milestones/index.html.haml   |  1 +
 2 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/app/controllers/groups/milestones_controller.rb b/app/controllers/groups/milestones_controller.rb
index 8dde8e9146..860d8e0392 100644
--- a/app/controllers/groups/milestones_controller.rb
+++ b/app/controllers/groups/milestones_controller.rb
@@ -4,22 +4,22 @@ class Groups::MilestonesController < ApplicationController
   before_filter :authorize_group_milestone!, only: :update
 
   def index
-    project_milestones = Milestone.where(project_id: group.projects)
+    project_milestones = case params[:status]
+                         when 'all'; status
+                         when 'closed'; status('closed')
+                         else status('active')
+                         end
     @group_milestones = Milestones::GroupService.new(project_milestones).execute
-    @group_milestones = case params[:status]
-                        when 'all'; @group_milestones
-                        when 'closed'; status('closed')
-                        else status('active')
-                        end
+    @group_milestones = Kaminari.paginate_array(@group_milestones).page(params[:page]).per(30)
   end
 
   def show
-    project_milestones = Milestone.where(project_id: group.projects)
+    project_milestones = Milestone.where(project_id: group.projects).order("due_date ASC")
     @group_milestone = Milestones::GroupService.new(project_milestones).milestone(title)
   end
 
   def update
-    project_milestones = Milestone.where(project_id: group.projects)
+    project_milestones = Milestone.where(project_id: group.projects).order("due_date ASC")
     @group_milestones = Milestones::GroupService.new(project_milestones).milestone(title)
 
     @group_milestones.milestones.each do |milestone|
@@ -44,8 +44,10 @@ class Groups::MilestonesController < ApplicationController
     params[:title]
   end
 
-  def status(state)
-    @group_milestones.map{ |milestone| next if milestone.state != state; milestone }.compact
+  def status(state = nil)
+    conditions = { project_id: group.projects }
+    conditions.reverse_merge!(state: state) if state
+    Milestone.where(conditions).order("title ASC")
   end
 
   def authorize_group_milestone!
diff --git a/app/views/groups/milestones/index.html.haml b/app/views/groups/milestones/index.html.haml
index 18ea03b25a..54e901173f 100644
--- a/app/views/groups/milestones/index.html.haml
+++ b/app/views/groups/milestones/index.html.haml
@@ -47,3 +47,4 @@
                   - milestone.projects.each do |project|
                     %span.label.label-default
                       = project.name
+    = paginate @group_milestones, theme: "gitlab"
-- 
2.30.9