Commit cc64f2a814802abe9ae3bb8297079b643c8774df

Authored by Dmitriy Zaporozhets
1 parent 0a160399

Common filtering for dashboard and group. Share partial search result partial

app/contexts/filter_context.rb 0 → 100644
@@ -0,0 +1,31 @@ @@ -0,0 +1,31 @@
  1 +class FilterContext
  2 + attr_accessor :items, :params
  3 +
  4 + def initialize(items, params)
  5 + @items = items
  6 + @params = params
  7 + end
  8 +
  9 + def execute
  10 + apply_filter(items)
  11 + end
  12 +
  13 + def apply_filter items
  14 + if params[:project_id]
  15 + items = items.where(project_id: params[:project_id])
  16 + end
  17 +
  18 + if params[:search].present?
  19 + items = items.search(params[:search])
  20 + end
  21 +
  22 + case params[:status]
  23 + when 'closed'
  24 + items.closed
  25 + when 'all'
  26 + items
  27 + else
  28 + items.opened
  29 + end
  30 + end
  31 +end
app/controllers/dashboard_controller.rb
@@ -36,14 +36,14 @@ class DashboardController < ApplicationController @@ -36,14 +36,14 @@ class DashboardController < ApplicationController
36 # Get authored or assigned open merge requests 36 # Get authored or assigned open merge requests
37 def merge_requests 37 def merge_requests
38 @merge_requests = current_user.cared_merge_requests 38 @merge_requests = current_user.cared_merge_requests
39 - @merge_requests = dashboard_filter(@merge_requests) 39 + @merge_requests = FilterContext.new(@merge_requests, params).execute
40 @merge_requests = @merge_requests.recent.page(params[:page]).per(20) 40 @merge_requests = @merge_requests.recent.page(params[:page]).per(20)
41 end 41 end
42 42
43 # Get only assigned issues 43 # Get only assigned issues
44 def issues 44 def issues
45 @issues = current_user.assigned_issues 45 @issues = current_user.assigned_issues
46 - @issues = dashboard_filter(@issues) 46 + @issues = FilterContext.new(@issues, params).execute
47 @issues = @issues.recent.page(params[:page]).per(20) 47 @issues = @issues.recent.page(params[:page]).per(20)
48 @issues = @issues.includes(:author, :project) 48 @issues = @issues.includes(:author, :project)
49 49
@@ -62,23 +62,4 @@ class DashboardController < ApplicationController @@ -62,23 +62,4 @@ class DashboardController < ApplicationController
62 def event_filter 62 def event_filter
63 @event_filter ||= EventFilter.new(params[:event_filter]) 63 @event_filter ||= EventFilter.new(params[:event_filter])
64 end 64 end
65 -  
66 - def dashboard_filter items  
67 - if params[:project_id]  
68 - items = items.where(project_id: params[:project_id])  
69 - end  
70 -  
71 - if params[:search].present?  
72 - items = items.search(params[:search])  
73 - end  
74 -  
75 - case params[:status]  
76 - when 'closed'  
77 - items.closed  
78 - when 'all'  
79 - items  
80 - else  
81 - items.opened  
82 - end  
83 - end  
84 end 65 end
app/controllers/groups_controller.rb
@@ -21,15 +21,16 @@ class GroupsController < ApplicationController @@ -21,15 +21,16 @@ class GroupsController < ApplicationController
21 21
22 # Get authored or assigned open merge requests 22 # Get authored or assigned open merge requests
23 def merge_requests 23 def merge_requests
24 - @merge_requests = current_user.cared_merge_requests.opened  
25 - @merge_requests = @merge_requests.of_group(@group).recent.page(params[:page]).per(20) 24 + @merge_requests = current_user.cared_merge_requests.of_group(@group)
  25 + @merge_requests = FilterContext.new(@merge_requests, params).execute
  26 + @merge_requests = @merge_requests.recent.page(params[:page]).per(20)
26 end 27 end
27 28
28 # Get only assigned issues 29 # Get only assigned issues
29 def issues 30 def issues
30 - @user = current_user  
31 - @issues = current_user.assigned_issues.opened  
32 - @issues = @issues.of_group(@group).recent.page(params[:page]).per(20) 31 + @issues = current_user.assigned_issues.of_group(@group)
  32 + @issues = FilterContext.new(@issues, params).execute
  33 + @issues = @issues.recent.page(params[:page]).per(20)
33 @issues = @issues.includes(:author, :project) 34 @issues = @issues.includes(:author, :project)
34 35
35 respond_to do |format| 36 respond_to do |format|
@@ -44,6 +45,7 @@ class GroupsController < ApplicationController @@ -44,6 +45,7 @@ class GroupsController < ApplicationController
44 @projects = result[:projects] 45 @projects = result[:projects]
45 @merge_requests = result[:merge_requests] 46 @merge_requests = result[:merge_requests]
46 @issues = result[:issues] 47 @issues = result[:issues]
  48 + @wiki_pages = result[:wiki_pages]
47 end 49 end
48 50
49 def people 51 def people
app/helpers/groups_helper.rb 0 → 100644
@@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
  1 +module GroupsHelper
  2 + def group_filter_path(entity, options={})
  3 + exist_opts = {
  4 + status: params[:status],
  5 + project_id: params[:project_id],
  6 + }
  7 +
  8 + options = exist_opts.merge(options)
  9 +
  10 + case entity
  11 + when 'issue' then
  12 + issues_group_path(@group, options)
  13 + when 'merge_request'
  14 + merge_requests_group_path(@group, options)
  15 + end
  16 + end
  17 +end
app/views/groups/_filter.html.haml 0 → 100644
@@ -0,0 +1,33 @@ @@ -0,0 +1,33 @@
  1 += form_tag group_filter_path(entity), method: 'get' do
  2 + %fieldset.dashboard-search-filter
  3 + = search_field_tag "search", params[:search], { placeholder: 'Search', class: 'search-text-input' }
  4 + = button_tag type: 'submit', class: 'btn' do
  5 + %i.icon-search
  6 +
  7 + %fieldset
  8 + %legend Status:
  9 + %ul.nav.nav-pills.nav-stacked
  10 + %li{class: ("active" if !params[:status])}
  11 + = link_to group_filter_path(entity, status: nil) do
  12 + Open
  13 + %li{class: ("active" if params[:status] == 'closed')}
  14 + = link_to group_filter_path(entity, status: 'closed') do
  15 + Closed
  16 + %li{class: ("active" if params[:status] == 'all')}
  17 + = link_to group_filter_path(entity, status: 'all') do
  18 + All
  19 +
  20 + %fieldset
  21 + %legend Projects:
  22 + %ul.nav.nav-pills.nav-stacked
  23 + - @projects.each do |project|
  24 + - unless entities_per_project(project, entity).zero?
  25 + %li{class: ("active" if params[:project_id] == project.id.to_s)}
  26 + = link_to group_filter_path(entity, project_id: project.id) do
  27 + = project.name_with_namespace
  28 + %small.right= entities_per_project(project, entity)
  29 +
  30 + %fieldset
  31 + %hr
  32 + = link_to "Reset", group_filter_path(entity), class: 'btn right'
  33 +
app/views/groups/issues.html.haml
@@ -3,18 +3,21 @@ @@ -3,18 +3,21 @@
3 %small (assigned to you) 3 %small (assigned to you)
4 %small.right #{@issues.total_count} issues 4 %small.right #{@issues.total_count} issues
5 5
6 -%br  
7 -.clearfix  
8 -- if @issues.any?  
9 - - @issues.group_by(&:project).each do |group|  
10 - %div.ui-box  
11 - - @project = group[0]  
12 - %h5.title  
13 - = @project.name  
14 - %ul.well-list.issues_table  
15 - - group[1].each do |issue|  
16 - = render(partial: 'issues/show', locals: {issue: issue})  
17 - %hr  
18 - = paginate @issues, theme: "gitlab"  
19 -- else  
20 - %h3.nothing_here_message Nothing to show here 6 +%hr
  7 +.row
  8 + .span3
  9 + = render 'filter', entity: 'issue'
  10 + .span9
  11 + - if @issues.any?
  12 + - @issues.group_by(&:project).each do |group|
  13 + %div.ui-box
  14 + - @project = group[0]
  15 + %h5.title
  16 + = link_to_project @project
  17 + %ul.well-list.issues_table
  18 + - group[1].each do |issue|
  19 + = render(partial: 'issues/show', locals: {issue: issue})
  20 + %hr
  21 + = paginate @issues, theme: "gitlab"
  22 + - else
  23 + %p.nothing_here_message Nothing to show here
app/views/groups/merge_requests.html.haml
@@ -3,17 +3,22 @@ @@ -3,17 +3,22 @@
3 %small (authored by or assigned to you) 3 %small (authored by or assigned to you)
4 %small.right #{@merge_requests.total_count} merge requests 4 %small.right #{@merge_requests.total_count} merge requests
5 5
6 -%br  
7 -- if @merge_requests.any?  
8 - - @merge_requests.group_by(&:project).each do |group|  
9 - %ul.well-list.ui-box  
10 - - @project = group[0]  
11 - %h5.title  
12 - = @project.name  
13 - - group[1].each do |merge_request|  
14 - = render(partial: 'merge_requests/merge_request', locals: {merge_request: merge_request})  
15 - %hr  
16 - = paginate @merge_requests, theme: "gitlab" 6 +%hr
  7 +.row
  8 + .span3
  9 + = render 'filter', entity: 'merge_request'
  10 + .span9
  11 + - if @merge_requests.any?
  12 + - @merge_requests.group_by(&:project).each do |group|
  13 + .ui-box
  14 + - @project = group[0]
  15 + %h5.title
  16 + = link_to_project @project
  17 + %ul.well-list
  18 + - group[1].each do |merge_request|
  19 + = render(partial: 'merge_requests/merge_request', locals: {merge_request: merge_request})
  20 + %hr
  21 + = paginate @merge_requests, theme: "gitlab"
17 22
18 -- else  
19 - %h3.nothing_here_message Nothing to show here 23 + - else
  24 + %h3.nothing_here_message Nothing to show here
app/views/groups/search.html.haml
@@ -6,70 +6,4 @@ @@ -6,70 +6,4 @@
6 = search_field_tag :search, params[:search], placeholder: "issue 143", class: "input-xxlarge search-text-input", id: "dashboard_search" 6 = search_field_tag :search, params[:search], placeholder: "issue 143", class: "input-xxlarge search-text-input", id: "dashboard_search"
7 = submit_tag 'Search', class: "btn primary wide" 7 = submit_tag 'Search', class: "btn primary wide"
8 - if params[:search].present? 8 - if params[:search].present?
9 - %br  
10 - %h3  
11 - Search results  
12 - %small (#{@projects.count + @merge_requests.count + @issues.count})  
13 - %hr  
14 - .search_results  
15 - .row  
16 - .span6  
17 - %table  
18 - %thead  
19 - %tr  
20 - %th Projects  
21 - %tbody  
22 - - @projects.each do |project|  
23 - %tr  
24 - %td  
25 - = link_to project do  
26 - %strong.term= project.name  
27 - %small.cgray  
28 - last activity at  
29 - = project.last_activity_date.stamp("Aug 25, 2011")  
30 - - if @projects.blank?  
31 - %tr  
32 - %td  
33 - %h4.nothing_here_message No Projects  
34 - %br  
35 - %table  
36 - %thead  
37 - %tr  
38 - %th Merge Requests  
39 - %tbody  
40 - - @merge_requests.each do |merge_request|  
41 - %tr  
42 - %td  
43 - = link_to [merge_request.project, merge_request] do  
44 - %span.badge.badge-info ##{merge_request.id}  
45 - –  
46 - %strong.term= truncate merge_request.title, length: 50  
47 - %strong.right  
48 - %span.label= merge_request.project.name  
49 - - if @merge_requests.blank?  
50 - %tr  
51 - %td  
52 - %h4.nothing_here_message No Merge Requests  
53 - .span6  
54 - %table  
55 - %thead  
56 - %tr  
57 - %th Issues  
58 - %tbody  
59 - - @issues.each do |issue|  
60 - %tr  
61 - %td  
62 - = link_to [issue.project, issue] do  
63 - %span.badge.badge-info ##{issue.id}  
64 - –  
65 - %strong.term= truncate issue.title, length: 40  
66 - %strong.right  
67 - %span.label= issue.project.name  
68 - - if @issues.blank?  
69 - %tr  
70 - %td  
71 - %h4.nothing_here_message No Issues  
72 - :javascript  
73 - $(function() {  
74 - $(".search_results .term").highlight("#{params[:search]}");  
75 - }) 9 + = render 'search/result'
app/views/groups/show.html.haml
@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
7 %span.cgray Events and projects are filtered in scope of group 7 %span.cgray Events and projects are filtered in scope of group
8 %hr 8 %hr
9 - if @events.any? 9 - if @events.any?
10 - .content_list= render @events 10 + .content_list
11 - else 11 - else
12 %p.nothing_here_message Projects activity will be displayed here 12 %p.nothing_here_message Projects activity will be displayed here
13 .loading.hide 13 .loading.hide
@@ -26,4 +26,4 @@ @@ -26,4 +26,4 @@
26 = link_to "@gitlabhq", "https://twitter.com/gitlabhq" 26 = link_to "@gitlabhq", "https://twitter.com/gitlabhq"
27 27
28 :javascript 28 :javascript
29 - $(function(){ Pager.init(20); }); 29 + $(function(){ Pager.init(20, true); });
app/views/search/_result.html.haml
  1 +%br
  2 +%h3.page_title
  3 + Search results
  4 + %span.cgray (#{@projects.count + @merge_requests.count + @issues.count + @wiki_pages.count})
  5 +%hr
  6 +.search_results
  7 + .row
  8 + .span6
  9 + %table
  10 + %thead
  11 + %tr
  12 + %th Projects
  13 + %tbody
  14 + - @projects.each do |project|
  15 + %tr
  16 + %td
  17 + = link_to project do
  18 + %strong.term= project.name_with_namespace
  19 + %small.cgray
  20 + last activity at
  21 + = project.last_activity_date.stamp("Aug 25, 2011")
  22 + - if @projects.blank?
  23 + %tr
  24 + %td
  25 + %h4.nothing_here_message No Projects
  26 + %br
  27 + %table
  28 + %thead
  29 + %tr
  30 + %th Merge Requests
  31 + %tbody
  32 + - @merge_requests.each do |merge_request|
  33 + %tr
  34 + %td
  35 + = link_to [merge_request.project, merge_request] do
  36 + %span.badge.badge-info ##{merge_request.id}
  37 + –
  38 + %strong.term= truncate merge_request.title, length: 50
  39 + %strong.right
  40 + %span.label= merge_request.project.name
  41 + - if @merge_requests.blank?
  42 + %tr
  43 + %td
  44 + %h4.nothing_here_message No Merge Requests
  45 + .span6
  46 + %table
  47 + %thead
  48 + %tr
  49 + %th Issues
  50 + %tbody
  51 + - @issues.each do |issue|
  52 + %tr
  53 + %td
  54 + = link_to [issue.project, issue] do
  55 + %span.badge.badge-info ##{issue.id}
  56 + –
  57 + %strong.term= truncate issue.title, length: 40
  58 + %strong.right
  59 + %span.label= issue.project.name
  60 + - if @issues.blank?
  61 + %tr
  62 + %td
  63 + %h4.nothing_here_message No Issues
  64 + .span6
  65 + %table
  66 + %thead
  67 + %tr
  68 + %th Wiki
  69 + %tbody
  70 + - @wiki_pages.each do |wiki_page|
  71 + %tr
  72 + %td
  73 + = link_to project_wiki_path(wiki_page.project, wiki_page) do
  74 + %strong.term= truncate wiki_page.title, length: 40
  75 + %strong.right
  76 + %span.label= wiki_page.project.name
  77 + - if @wiki_pages.blank?
  78 + %tr
  79 + %td
  80 + %h4.nothing_here_message No wiki pages
  81 +:javascript
  82 + $(function() {
  83 + $(".search_results .term").highlight("#{escape_javascript(params[:search])}");
  84 + })
1 85
app/views/search/show.html.haml
@@ -6,87 +6,4 @@ @@ -6,87 +6,4 @@
6 = search_field_tag :search, params[:search], placeholder: "issue 143", class: "input-xxlarge search-text-input", id: "dashboard_search" 6 = search_field_tag :search, params[:search], placeholder: "issue 143", class: "input-xxlarge search-text-input", id: "dashboard_search"
7 = submit_tag 'Search', class: "btn primary wide" 7 = submit_tag 'Search', class: "btn primary wide"
8 - if params[:search].present? 8 - if params[:search].present?
9 - %br  
10 - %h3  
11 - Search results  
12 - %small (#{@projects.count + @merge_requests.count + @issues.count + @wiki_pages.count})  
13 - %hr  
14 - .search_results  
15 - .row  
16 - .span6  
17 - %table  
18 - %thead  
19 - %tr  
20 - %th Projects  
21 - %tbody  
22 - - @projects.each do |project|  
23 - %tr  
24 - %td  
25 - = link_to project do  
26 - %strong.term= project.name_with_namespace  
27 - %small.cgray  
28 - last activity at  
29 - = project.last_activity_date.stamp("Aug 25, 2011")  
30 - - if @projects.blank?  
31 - %tr  
32 - %td  
33 - %h4.nothing_here_message No Projects  
34 - %br  
35 - %table  
36 - %thead  
37 - %tr  
38 - %th Merge Requests  
39 - %tbody  
40 - - @merge_requests.each do |merge_request|  
41 - %tr  
42 - %td  
43 - = link_to [merge_request.project, merge_request] do  
44 - %span.badge.badge-info ##{merge_request.id}  
45 - –  
46 - %strong.term= truncate merge_request.title, length: 50  
47 - %strong.right  
48 - %span.label= merge_request.project.name  
49 - - if @merge_requests.blank?  
50 - %tr  
51 - %td  
52 - %h4.nothing_here_message No Merge Requests  
53 - .span6  
54 - %table  
55 - %thead  
56 - %tr  
57 - %th Issues  
58 - %tbody  
59 - - @issues.each do |issue|  
60 - %tr  
61 - %td  
62 - = link_to [issue.project, issue] do  
63 - %span.badge.badge-info ##{issue.id}  
64 - –  
65 - %strong.term= truncate issue.title, length: 40  
66 - %strong.right  
67 - %span.label= issue.project.name  
68 - - if @issues.blank?  
69 - %tr  
70 - %td  
71 - %h4.nothing_here_message No Issues  
72 - .span6  
73 - %table  
74 - %thead  
75 - %tr  
76 - %th Wiki  
77 - %tbody  
78 - - @wiki_pages.each do |wiki_page|  
79 - %tr  
80 - %td  
81 - = link_to project_wiki_path(wiki_page.project, wiki_page) do  
82 - %strong.term= truncate wiki_page.title, length: 40  
83 - %strong.right  
84 - %span.label= wiki_page.project.name  
85 - - if @wiki_pages.blank?  
86 - %tr  
87 - %td  
88 - %h4.nothing_here_message No wiki pages  
89 - :javascript  
90 - $(function() {  
91 - $(".search_results .term").highlight("#{escape_javascript(params[:search])}");  
92 - }) 9 + = render 'search/result'