From cc64f2a814802abe9ae3bb8297079b643c8774df Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Date: Mon, 7 Jan 2013 20:48:57 +0200
Subject: [PATCH] Common filtering for dashboard and group. Share partial
 search result partial

---
 app/contexts/filter_context.rb            | 31 +++++++++
 app/controllers/dashboard_controller.rb   | 23 +-----
 app/controllers/groups_controller.rb      | 12 ++--
 app/helpers/groups_helper.rb              | 17 +++++
 app/views/groups/_filter.html.haml        | 33 +++++++++
 app/views/groups/issues.html.haml         | 33 +++++----
 app/views/groups/merge_requests.html.haml | 31 +++++----
 app/views/groups/search.html.haml         | 68 +-----------------
 app/views/groups/show.html.haml           |  4 +-
 app/views/search/_result.html.haml        | 84 ++++++++++++++++++++++
 app/views/search/show.html.haml           | 85 +----------------------
 11 files changed, 214 insertions(+), 207 deletions(-)
 create mode 100644 app/contexts/filter_context.rb
 create mode 100644 app/helpers/groups_helper.rb
 create mode 100644 app/views/groups/_filter.html.haml

diff --git a/app/contexts/filter_context.rb b/app/contexts/filter_context.rb
new file mode 100644
index 0000000000..401d19b31c
--- /dev/null
+++ b/app/contexts/filter_context.rb
@@ -0,0 +1,31 @@
+class FilterContext
+  attr_accessor :items, :params
+
+  def initialize(items, params)
+    @items = items
+    @params = params
+  end
+
+  def execute
+    apply_filter(items)
+  end
+
+  def apply_filter items
+    if params[:project_id]
+      items = items.where(project_id: params[:project_id])
+    end
+
+    if params[:search].present?
+      items = items.search(params[:search])
+    end
+
+    case params[:status]
+    when 'closed'
+      items.closed
+    when 'all'
+      items
+    else
+      items.opened
+    end
+  end
+end
diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb
index 695e8cb88c..4bd840a07f 100644
--- a/app/controllers/dashboard_controller.rb
+++ b/app/controllers/dashboard_controller.rb
@@ -36,14 +36,14 @@ class DashboardController < ApplicationController
   # Get authored or assigned open merge requests
   def merge_requests
     @merge_requests = current_user.cared_merge_requests
-    @merge_requests = dashboard_filter(@merge_requests)
+    @merge_requests = FilterContext.new(@merge_requests, params).execute
     @merge_requests = @merge_requests.recent.page(params[:page]).per(20)
   end
 
   # Get only assigned issues
   def issues
     @issues = current_user.assigned_issues
-    @issues = dashboard_filter(@issues)
+    @issues = FilterContext.new(@issues, params).execute
     @issues = @issues.recent.page(params[:page]).per(20)
     @issues = @issues.includes(:author, :project)
 
@@ -62,23 +62,4 @@ class DashboardController < ApplicationController
   def event_filter
     @event_filter ||= EventFilter.new(params[:event_filter])
   end
-
-  def dashboard_filter items
-    if params[:project_id]
-      items = items.where(project_id: params[:project_id])
-    end
-
-    if params[:search].present?
-      items = items.search(params[:search])
-    end
-
-    case params[:status]
-    when 'closed'
-      items.closed
-    when 'all'
-      items
-    else
-      items.opened
-    end
-  end
 end
diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb
index 981adf061f..c25fc32a62 100644
--- a/app/controllers/groups_controller.rb
+++ b/app/controllers/groups_controller.rb
@@ -21,15 +21,16 @@ class GroupsController < ApplicationController
 
   # Get authored or assigned open merge requests
   def merge_requests
-    @merge_requests = current_user.cared_merge_requests.opened
-    @merge_requests = @merge_requests.of_group(@group).recent.page(params[:page]).per(20)
+    @merge_requests = current_user.cared_merge_requests.of_group(@group)
+    @merge_requests = FilterContext.new(@merge_requests, params).execute
+    @merge_requests = @merge_requests.recent.page(params[:page]).per(20)
   end
 
   # Get only assigned issues
   def issues
-    @user   = current_user
-    @issues = current_user.assigned_issues.opened
-    @issues = @issues.of_group(@group).recent.page(params[:page]).per(20)
+    @issues = current_user.assigned_issues.of_group(@group)
+    @issues = FilterContext.new(@issues, params).execute
+    @issues = @issues.recent.page(params[:page]).per(20)
     @issues = @issues.includes(:author, :project)
 
     respond_to do |format|
@@ -44,6 +45,7 @@ class GroupsController < ApplicationController
     @projects       = result[:projects]
     @merge_requests = result[:merge_requests]
     @issues         = result[:issues]
+    @wiki_pages     = result[:wiki_pages]
   end
 
   def people
diff --git a/app/helpers/groups_helper.rb b/app/helpers/groups_helper.rb
new file mode 100644
index 0000000000..283119bc24
--- /dev/null
+++ b/app/helpers/groups_helper.rb
@@ -0,0 +1,17 @@
+module GroupsHelper
+  def group_filter_path(entity, options={})
+    exist_opts = {
+      status: params[:status],
+      project_id: params[:project_id],
+    }
+
+    options = exist_opts.merge(options)
+
+    case entity
+    when 'issue' then
+      issues_group_path(@group, options)
+    when 'merge_request'
+      merge_requests_group_path(@group, options)
+    end
+  end
+end
diff --git a/app/views/groups/_filter.html.haml b/app/views/groups/_filter.html.haml
new file mode 100644
index 0000000000..c8b0ad0f43
--- /dev/null
+++ b/app/views/groups/_filter.html.haml
@@ -0,0 +1,33 @@
+= form_tag group_filter_path(entity), method: 'get' do
+  %fieldset.dashboard-search-filter
+    = search_field_tag "search", params[:search], { placeholder: 'Search', class: 'search-text-input' }
+    = button_tag type: 'submit', class: 'btn' do
+      %i.icon-search
+
+  %fieldset
+    %legend Status:
+    %ul.nav.nav-pills.nav-stacked
+      %li{class: ("active" if !params[:status])}
+        = link_to group_filter_path(entity, status: nil) do
+          Open
+      %li{class: ("active" if params[:status] == 'closed')}
+        = link_to group_filter_path(entity, status: 'closed') do
+          Closed
+      %li{class: ("active" if params[:status] == 'all')}
+        = link_to group_filter_path(entity, status: 'all') do
+          All
+
+  %fieldset
+    %legend Projects:
+    %ul.nav.nav-pills.nav-stacked
+      - @projects.each do |project|
+        - unless entities_per_project(project, entity).zero?
+          %li{class: ("active" if params[:project_id] == project.id.to_s)}
+            = link_to group_filter_path(entity, project_id: project.id) do
+              = project.name_with_namespace
+              %small.right= entities_per_project(project, entity)
+
+  %fieldset
+    %hr
+    = link_to "Reset", group_filter_path(entity), class: 'btn right'
+
diff --git a/app/views/groups/issues.html.haml b/app/views/groups/issues.html.haml
index ebbe4df14f..ffca2dc75e 100644
--- a/app/views/groups/issues.html.haml
+++ b/app/views/groups/issues.html.haml
@@ -3,18 +3,21 @@
   %small (assigned to you)
   %small.right #{@issues.total_count} issues
 
-%br
-.clearfix
-- if @issues.any?
-  - @issues.group_by(&:project).each do |group|
-    %div.ui-box
-      - @project = group[0]
-      %h5.title
-        = @project.name
-      %ul.well-list.issues_table
-        - group[1].each do |issue|
-          = render(partial: 'issues/show', locals: {issue: issue})
-  %hr
-  = paginate @issues, theme: "gitlab"
-- else
-  %h3.nothing_here_message Nothing to show here
+%hr
+.row
+  .span3
+    = render 'filter', entity: 'issue'
+  .span9
+    - if @issues.any?
+      - @issues.group_by(&:project).each do |group|
+        %div.ui-box
+          - @project = group[0]
+          %h5.title
+            = link_to_project @project
+          %ul.well-list.issues_table
+            - group[1].each do |issue|
+              = render(partial: 'issues/show', locals: {issue: issue})
+      %hr
+      = paginate @issues, theme: "gitlab"
+    - else
+      %p.nothing_here_message Nothing to show here
diff --git a/app/views/groups/merge_requests.html.haml b/app/views/groups/merge_requests.html.haml
index 5fac482852..c5245da731 100644
--- a/app/views/groups/merge_requests.html.haml
+++ b/app/views/groups/merge_requests.html.haml
@@ -3,17 +3,22 @@
   %small (authored by or assigned to you)
   %small.right #{@merge_requests.total_count} merge requests
 
-%br
-- if @merge_requests.any?
-  - @merge_requests.group_by(&:project).each do |group|
-    %ul.well-list.ui-box
-      - @project = group[0]
-      %h5.title
-        = @project.name
-      - group[1].each do |merge_request|
-        = render(partial: 'merge_requests/merge_request', locals: {merge_request: merge_request})
-  %hr
-  = paginate @merge_requests, theme: "gitlab"
+%hr
+.row
+  .span3
+    = render 'filter', entity: 'merge_request'
+  .span9
+    - if @merge_requests.any?
+      - @merge_requests.group_by(&:project).each do |group|
+        .ui-box
+          - @project = group[0]
+          %h5.title
+            = link_to_project @project
+          %ul.well-list
+            - group[1].each do |merge_request|
+              = render(partial: 'merge_requests/merge_request', locals: {merge_request: merge_request})
+      %hr
+      = paginate @merge_requests, theme: "gitlab"
 
-- else
-  %h3.nothing_here_message Nothing to show here
+    - else
+      %h3.nothing_here_message Nothing to show here
diff --git a/app/views/groups/search.html.haml b/app/views/groups/search.html.haml
index 6ca5630f43..1ba4707aa5 100644
--- a/app/views/groups/search.html.haml
+++ b/app/views/groups/search.html.haml
@@ -6,70 +6,4 @@
       = search_field_tag :search, params[:search], placeholder: "issue 143", class: "input-xxlarge search-text-input", id: "dashboard_search"
       = submit_tag 'Search', class: "btn primary wide"
 - if params[:search].present?
-  %br
-  %h3
-    Search results
-    %small (#{@projects.count + @merge_requests.count + @issues.count})
-  %hr
-  .search_results
-    .row
-      .span6
-        %table
-          %thead
-            %tr
-              %th Projects
-          %tbody
-            - @projects.each do |project|
-              %tr
-                %td
-                  = link_to project do
-                    %strong.term= project.name
-                    %small.cgray
-                      last activity at
-                      = project.last_activity_date.stamp("Aug 25, 2011")
-            - if @projects.blank?
-              %tr
-                %td
-                  %h4.nothing_here_message No Projects
-        %br
-        %table
-          %thead
-            %tr
-              %th Merge Requests
-          %tbody
-            - @merge_requests.each do |merge_request|
-              %tr
-                %td
-                  = link_to [merge_request.project, merge_request] do
-                    %span.badge.badge-info ##{merge_request.id}
-                    &ndash;
-                    %strong.term= truncate merge_request.title, length: 50
-                    %strong.right
-                      %span.label= merge_request.project.name
-            - if @merge_requests.blank?
-              %tr
-                %td
-                  %h4.nothing_here_message No Merge Requests
-      .span6
-        %table
-          %thead
-            %tr
-              %th Issues
-          %tbody
-            - @issues.each do |issue|
-              %tr
-                %td
-                  = link_to [issue.project, issue] do
-                    %span.badge.badge-info ##{issue.id}
-                    &ndash;
-                    %strong.term= truncate issue.title, length: 40
-                  %strong.right
-                    %span.label= issue.project.name
-            - if @issues.blank?
-              %tr
-                %td
-                  %h4.nothing_here_message No Issues
-  :javascript
-    $(function() {
-      $(".search_results .term").highlight("#{params[:search]}");
-    })
+  = render 'search/result'
diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml
index 76bc2639d6..d7d3f86989 100644
--- a/app/views/groups/show.html.haml
+++ b/app/views/groups/show.html.haml
@@ -7,7 +7,7 @@
     %span.cgray Events and projects are filtered in scope of group
     %hr
     - if @events.any?
-      .content_list= render @events
+      .content_list
     - else
       %p.nothing_here_message Projects activity will be displayed here
     .loading.hide
@@ -26,4 +26,4 @@
       = link_to "@gitlabhq", "https://twitter.com/gitlabhq"
 
 :javascript
-  $(function(){ Pager.init(20); });
+  $(function(){ Pager.init(20, true); });
diff --git a/app/views/search/_result.html.haml b/app/views/search/_result.html.haml
index 8b13789179..79bed4f737 100644
--- a/app/views/search/_result.html.haml
+++ b/app/views/search/_result.html.haml
@@ -1 +1,85 @@
+%br
+%h3.page_title
+  Search results
+  %span.cgray (#{@projects.count + @merge_requests.count + @issues.count + @wiki_pages.count})
+%hr
+.search_results
+  .row
+    .span6
+      %table
+        %thead
+          %tr
+            %th Projects
+        %tbody
+          - @projects.each do |project|
+            %tr
+              %td
+                = link_to project do
+                  %strong.term= project.name_with_namespace
+                  %small.cgray
+                    last activity at
+                    = project.last_activity_date.stamp("Aug 25, 2011")
+          - if @projects.blank?
+            %tr
+              %td
+                %h4.nothing_here_message No Projects
+      %br
+      %table
+        %thead
+          %tr
+            %th Merge Requests
+        %tbody
+          - @merge_requests.each do |merge_request|
+            %tr
+              %td
+                = link_to [merge_request.project, merge_request] do
+                  %span.badge.badge-info ##{merge_request.id}
+                  &ndash;
+                  %strong.term= truncate merge_request.title, length: 50
+                  %strong.right
+                    %span.label= merge_request.project.name
+          - if @merge_requests.blank?
+            %tr
+              %td
+                %h4.nothing_here_message No Merge Requests
+    .span6
+      %table
+        %thead
+          %tr
+            %th Issues
+        %tbody
+          - @issues.each do |issue|
+            %tr
+              %td
+                = link_to [issue.project, issue] do
+                  %span.badge.badge-info ##{issue.id}
+                  &ndash;
+                  %strong.term= truncate issue.title, length: 40
+                %strong.right
+                  %span.label= issue.project.name
+          - if @issues.blank?
+            %tr
+              %td
+                %h4.nothing_here_message No Issues
+    .span6
+      %table
+        %thead
+          %tr
+            %th Wiki
+        %tbody
+          - @wiki_pages.each do |wiki_page|
+            %tr
+              %td
+                = link_to project_wiki_path(wiki_page.project, wiki_page) do
+                  %strong.term= truncate wiki_page.title, length: 40
+                %strong.right
+                  %span.label= wiki_page.project.name
+          - if @wiki_pages.blank?
+            %tr
+              %td
+                %h4.nothing_here_message No wiki pages
+:javascript
+  $(function() {
+    $(".search_results .term").highlight("#{escape_javascript(params[:search])}");
+  })
 
diff --git a/app/views/search/show.html.haml b/app/views/search/show.html.haml
index ddcef44249..aa0d6d700d 100644
--- a/app/views/search/show.html.haml
+++ b/app/views/search/show.html.haml
@@ -6,87 +6,4 @@
       = search_field_tag :search, params[:search], placeholder: "issue 143", class: "input-xxlarge search-text-input", id: "dashboard_search"
       = submit_tag 'Search', class: "btn primary wide"
 - if params[:search].present?
-  %br
-  %h3
-    Search results
-    %small (#{@projects.count + @merge_requests.count + @issues.count + @wiki_pages.count})
-  %hr
-  .search_results
-    .row
-      .span6
-        %table
-          %thead
-            %tr
-              %th Projects
-          %tbody
-            - @projects.each do |project|
-              %tr
-                %td
-                  = link_to project do
-                    %strong.term= project.name_with_namespace
-                    %small.cgray
-                      last activity at
-                      = project.last_activity_date.stamp("Aug 25, 2011")
-            - if @projects.blank?
-              %tr
-                %td
-                  %h4.nothing_here_message No Projects
-        %br
-        %table
-          %thead
-            %tr
-              %th Merge Requests
-          %tbody
-            - @merge_requests.each do |merge_request|
-              %tr
-                %td
-                  = link_to [merge_request.project, merge_request] do
-                    %span.badge.badge-info ##{merge_request.id}
-                    &ndash;
-                    %strong.term= truncate merge_request.title, length: 50
-                    %strong.right
-                      %span.label= merge_request.project.name
-            - if @merge_requests.blank?
-              %tr
-                %td
-                  %h4.nothing_here_message No Merge Requests
-      .span6
-        %table
-          %thead
-            %tr
-              %th Issues
-          %tbody
-            - @issues.each do |issue|
-              %tr
-                %td
-                  = link_to [issue.project, issue] do
-                    %span.badge.badge-info ##{issue.id}
-                    &ndash;
-                    %strong.term= truncate issue.title, length: 40
-                  %strong.right
-                    %span.label= issue.project.name
-            - if @issues.blank?
-              %tr
-                %td
-                  %h4.nothing_here_message No Issues
-      .span6
-        %table
-          %thead
-            %tr
-              %th Wiki
-          %tbody
-            - @wiki_pages.each do |wiki_page|
-              %tr
-                %td
-                  = link_to project_wiki_path(wiki_page.project, wiki_page) do
-                    %strong.term= truncate wiki_page.title, length: 40
-                  %strong.right
-                    %span.label= wiki_page.project.name
-            - if @wiki_pages.blank?
-              %tr
-                %td
-                  %h4.nothing_here_message No wiki pages
-  :javascript
-    $(function() {
-      $(".search_results .term").highlight("#{escape_javascript(params[:search])}");
-    })
+  = render 'search/result'
-- 
2.30.9