diff --git a/CHANGELOG-EE.md b/CHANGELOG-EE.md index f3ef0ed43ec3742a834bcd5dbdf46eba1cffaeed..608565504bc31188401ec33c8f391d1d3c5afdd5 100644 --- a/CHANGELOG-EE.md +++ b/CHANGELOG-EE.md @@ -1,5 +1,9 @@ Please view this file on the master branch, on stable branches it's out of date. +## 8.15.0 (unreleased) + +- User can now filter merge requests by approver (Jan Heijmans) !620 + ## 8.14.0 (2016-11-22) - Gracefully recover from previously failed rebase. diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb index f420e35bdca16e40ad290923790b1fc21458b092..19d8f5e66642554b1b136bd656283185635432b1 100644 --- a/app/finders/issuable_finder.rb +++ b/app/finders/issuable_finder.rb @@ -37,6 +37,7 @@ def execute items = by_search(items) items = by_milestone(items) items = by_assignee(items) + items = by_approver(items) items = by_author(items) items = by_label(items) items = by_weight(items) @@ -143,6 +144,21 @@ def assignee end end + def approver? + params[:approver_id].present? + end + + def approver + return @approver if defined?(@approver) + + @approver = + if approver? && params[:approver_id] != NONE + User.find(params[:approver_id]) + else + nil + end + end + def author? params[:author_id].present? end @@ -230,6 +246,14 @@ def by_assignee(items) items end + def by_approver(items) + if approver? + items = items.includes(:approvers).where("approvers.user_id" => approver.try(:id)) + end + + items + end + def by_author(items) if author? items = items.where(author_id: author.try(:id)) diff --git a/app/views/shared/issuable/_filter.html.haml b/app/views/shared/issuable/_filter.html.haml index 9508d24dea05a4ef16a2eba43dfb1bedce6b06e8..0577b7c9e05be78416a5d3b0628fa8da1eefc0c5 100644 --- a/app/views/shared/issuable/_filter.html.haml +++ b/app/views/shared/issuable/_filter.html.haml @@ -23,6 +23,13 @@ = dropdown_tag(user_dropdown_label(params[:assignee_id], "Assignee"), options: { toggle_class: "js-user-search js-filter-submit js-assignee-search", title: "Filter by assignee", filter: true, dropdown_class: "dropdown-menu-user dropdown-menu-selectable dropdown-menu-assignee js-filter-submit", placeholder: "Search assignee", data: { any_user: "Any Assignee", first_user: current_user.try(:username), null_user: true, current_user: true, project_id: @project.try(:id), selected: params[:assignee_id], field_name: "assignee_id", default_label: "Assignee" } }) + - if controller.controller_name == 'merge_requests' || controller.action_name == 'merge_requests' + .filter-item.inline + - if params[:approver_id].present? + = hidden_field_tag(:approver_id, params[:approver_id]) + = dropdown_tag(user_dropdown_label(params[:approver_id], "Approver"), options: { toggle_class: "js-user-search js-filter-submit js-approver-search", title: "Filter by approver", filter: true, dropdown_class: "dropdown-menu-user dropdown-menu-selectable dropdown-menu-approver js-filter-submit", + placeholder: "Search approver", data: { any_user: "Any Approver", first_user: (current_user.username if current_user), null_user: true, current_user: true, project_id: (@project.id if @project), selected: params[:approver_id], field_name: "approver_id", default_label: "Approver" } }) + .filter-item.inline.milestone-filter = render "shared/issuable/milestone_dropdown", selected: finder.milestones.try(:first), name: :milestone_title, show_any: true, show_upcoming: true diff --git a/spec/finders/merge_requests_finder_spec.rb b/spec/finders/merge_requests_finder_spec.rb index 952ac5fdbda84dde78909e0b93704562896364ef..1b60b3dd58c9ffba1bdb6546173cd101cfdb0456 100644 --- a/spec/finders/merge_requests_finder_spec.rb +++ b/spec/finders/merge_requests_finder_spec.rb @@ -35,5 +35,12 @@ merge_requests = MergeRequestsFinder.new(user, params).execute expect(merge_requests.size).to eq(1) end + + it 'should filter by approver' do + create(:approver, target: merge_request3, target_type: 'MergeRequest', user: user) + params = { approver_id: user.id, scope: 'authored', state: 'opened' } + merge_requests = MergeRequestsFinder.new(user, params).execute + expect(merge_requests.size).to eq(1) + end end end