Add merge request count to each issue on issues list
This commit is contained in:
parent
f02210ca06
commit
905fdfba92
|
@ -0,0 +1 @@
|
||||||
|
<svg width="12" height="15" viewBox="0 0 12 15" xmlns="http://www.w3.org/2000/svg"><path d="M10.267 11.028V5.167c-.028-.728-.318-1.372-.878-1.923-.56-.55-1.194-.85-1.922-.877h-.934V.5l-2.8 2.8 2.8 2.8V4.233h.934a.976.976 0 0 1 .644.29.88.88 0 0 1 .289.644v5.861a1.86 1.86 0 0 0 .933 3.472 1.86 1.86 0 0 0 .934-3.472zM3.733 3.3a1.86 1.86 0 0 0-1.866-1.867 1.86 1.86 0 0 0-.934 3.472v6.123a1.86 1.86 0 0 0 .933 3.472 1.86 1.86 0 0 0 .934-3.472V4.905c.55-.317.933-.914.933-1.605z" fill-rule="nonzero"/></svg>
|
After Width: | Height: | Size: 506 B |
|
@ -10,6 +10,11 @@
|
||||||
.issue-labels {
|
.issue-labels {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.icon-merge-request-unmerged {
|
||||||
|
height: 13px;
|
||||||
|
margin-bottom: 3px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,24 +9,32 @@ module IssuableCollections
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def issuable_meta_data(issuable_collection)
|
def issuable_meta_data(issuable_collection, collection_type)
|
||||||
# map has to be used here since using pluck or select will
|
# map has to be used here since using pluck or select will
|
||||||
# throw an error when ordering issuables by priority which inserts
|
# throw an error when ordering issuables by priority which inserts
|
||||||
# a new order into the collection.
|
# a new order into the collection.
|
||||||
# We cannot use reorder to not mess up the paginated collection.
|
# We cannot use reorder to not mess up the paginated collection.
|
||||||
issuable_ids = issuable_collection.map(&:id)
|
issuable_ids = issuable_collection.map(&:id)
|
||||||
issuable_note_count = Note.count_for_collection(issuable_ids, @collection_type)
|
issuable_note_count = Note.count_for_collection(issuable_ids, @collection_type)
|
||||||
issuable_votes_count = AwardEmoji.votes_for_collection(issuable_ids, @collection_type)
|
issuable_votes_count = AwardEmoji.votes_for_collection(issuable_ids, @collection_type)
|
||||||
|
issuable_merge_requests_count =
|
||||||
|
if collection_type == 'Issue'
|
||||||
|
MergeRequestsClosingIssues.count_for_collection(issuable_ids)
|
||||||
|
else
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
|
||||||
issuable_ids.each_with_object({}) do |id, issuable_meta|
|
issuable_ids.each_with_object({}) do |id, issuable_meta|
|
||||||
downvotes = issuable_votes_count.find { |votes| votes.awardable_id == id && votes.downvote? }
|
downvotes = issuable_votes_count.find { |votes| votes.awardable_id == id && votes.downvote? }
|
||||||
upvotes = issuable_votes_count.find { |votes| votes.awardable_id == id && votes.upvote? }
|
upvotes = issuable_votes_count.find { |votes| votes.awardable_id == id && votes.upvote? }
|
||||||
notes = issuable_note_count.find { |notes| notes.noteable_id == id }
|
notes = issuable_note_count.find { |notes| notes.noteable_id == id }
|
||||||
|
merge_requests = issuable_merge_requests_count.find { |mr| mr.issue_id == id }
|
||||||
|
|
||||||
issuable_meta[id] = Issuable::IssuableMeta.new(
|
issuable_meta[id] = Issuable::IssuableMeta.new(
|
||||||
upvotes.try(:count).to_i,
|
upvotes.try(:count).to_i,
|
||||||
downvotes.try(:count).to_i,
|
downvotes.try(:count).to_i,
|
||||||
notes.try(:count).to_i
|
notes.try(:count).to_i,
|
||||||
|
merge_requests.try(:count).to_i
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -26,7 +26,7 @@ class Projects::IssuesController < Projects::ApplicationController
|
||||||
@collection_type = "Issue"
|
@collection_type = "Issue"
|
||||||
@issues = issues_collection
|
@issues = issues_collection
|
||||||
@issues = @issues.page(params[:page])
|
@issues = @issues.page(params[:page])
|
||||||
@issuable_meta_data = issuable_meta_data(@issues)
|
@issuable_meta_data = issuable_meta_data(@issues, @collection_type)
|
||||||
|
|
||||||
if @issues.out_of_range? && @issues.total_pages != 0
|
if @issues.out_of_range? && @issues.total_pages != 0
|
||||||
return redirect_to url_for(params.merge(page: @issues.total_pages))
|
return redirect_to url_for(params.merge(page: @issues.total_pages))
|
||||||
|
|
|
@ -39,7 +39,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
|
||||||
@collection_type = "MergeRequest"
|
@collection_type = "MergeRequest"
|
||||||
@merge_requests = merge_requests_collection
|
@merge_requests = merge_requests_collection
|
||||||
@merge_requests = @merge_requests.page(params[:page])
|
@merge_requests = @merge_requests.page(params[:page])
|
||||||
@issuable_meta_data = issuable_meta_data(@merge_requests)
|
@issuable_meta_data = issuable_meta_data(@merge_requests, @collection_type)
|
||||||
|
|
||||||
if @merge_requests.out_of_range? && @merge_requests.total_pages != 0
|
if @merge_requests.out_of_range? && @merge_requests.total_pages != 0
|
||||||
return redirect_to url_for(params.merge(page: @merge_requests.total_pages))
|
return redirect_to url_for(params.merge(page: @merge_requests.total_pages))
|
||||||
|
|
|
@ -16,9 +16,9 @@ module Issuable
|
||||||
include TimeTrackable
|
include TimeTrackable
|
||||||
|
|
||||||
# This object is used to gather issuable meta data for displaying
|
# This object is used to gather issuable meta data for displaying
|
||||||
# upvotes, downvotes and notes count for issues and merge requests
|
# upvotes, downvotes, notes and closing merge requests count for issues and merge requests
|
||||||
# lists avoiding n+1 queries and improving performance.
|
# lists avoiding n+1 queries and improving performance.
|
||||||
IssuableMeta = Struct.new(:upvotes, :downvotes, :notes_count)
|
IssuableMeta = Struct.new(:upvotes, :downvotes, :notes_count, :merge_requests_count)
|
||||||
|
|
||||||
included do
|
included do
|
||||||
cache_markdown_field :title, pipeline: :single_line
|
cache_markdown_field :title, pipeline: :single_line
|
||||||
|
|
|
@ -4,4 +4,12 @@ class MergeRequestsClosingIssues < ActiveRecord::Base
|
||||||
|
|
||||||
validates :merge_request_id, uniqueness: { scope: :issue_id }, presence: true
|
validates :merge_request_id, uniqueness: { scope: :issue_id }, presence: true
|
||||||
validates :issue_id, presence: true
|
validates :issue_id, presence: true
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def count_for_collection(ids)
|
||||||
|
select('issue_id', 'COUNT(*) as count').
|
||||||
|
group(:issue_id).
|
||||||
|
where(issue_id: ids)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,6 +2,12 @@
|
||||||
- issue_votes = @issuable_meta_data[issuable.id]
|
- issue_votes = @issuable_meta_data[issuable.id]
|
||||||
- upvotes, downvotes = issue_votes.upvotes, issue_votes.downvotes
|
- upvotes, downvotes = issue_votes.upvotes, issue_votes.downvotes
|
||||||
- issuable_url = @collection_type == "Issue" ? issue_path(issuable, anchor: 'notes') : merge_request_path(issuable, anchor: 'notes')
|
- issuable_url = @collection_type == "Issue" ? issue_path(issuable, anchor: 'notes') : merge_request_path(issuable, anchor: 'notes')
|
||||||
|
- issuable_mr = @issuable_meta_data[issuable.id].merge_requests_count
|
||||||
|
|
||||||
|
- if issuable_mr > 0
|
||||||
|
%li
|
||||||
|
= image_tag('icon-merge-request-unmerged', class: 'icon-merge-request-unmerged')
|
||||||
|
= issuable_mr
|
||||||
|
|
||||||
- if upvotes > 0
|
- if upvotes > 0
|
||||||
%li
|
%li
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
title: Add merge request count to each issue on issues list
|
||||||
|
merge_request: 9252
|
||||||
|
author: blackst0ne
|
Loading…
Reference in New Issue