diff --git a/app/decorators/label_with_milestone.rb b/app/decorators/label_with_milestone.rb new file mode 100644 index 0000000000..a70a4e2f50 --- /dev/null +++ b/app/decorators/label_with_milestone.rb @@ -0,0 +1,19 @@ +class LabelWithMilestone + attr_reader :milestone + + def initialize(label, milestone) + @label, @milestone = label, milestone + end + + def method_missing(meth, *args) + if @label.respond_to?(meth) + @label.send(meth, *args) + else + super + end + end + + def respond_to?(meth) + @label.respond_to?(meth) + end +end diff --git a/app/models/global_milestone.rb b/app/models/global_milestone.rb index 40193a6f05..e13aaf1673 100644 --- a/app/models/global_milestone.rb +++ b/app/models/global_milestone.rb @@ -87,6 +87,12 @@ class GlobalMilestone @participants ||= milestones.map(&:participants).flatten.compact.uniq end + def labels + @labels ||= milestones.map do |ms| + ms.labels.map { |label| LabelWithMilestone.new(label, ms) } + end.flatten.sort_by!(&:title) + end + def opened_issues issues.opened end diff --git a/app/views/groups/milestones/show.html.haml b/app/views/groups/milestones/show.html.haml index 0a15f49ff1..7ffa3f2d51 100644 --- a/app/views/groups/milestones/show.html.haml +++ b/app/views/groups/milestones/show.html.haml @@ -67,13 +67,17 @@ = link_to '#tab-participants', 'data-toggle' => 'tab' do Participants %span.badge= @milestone.participants.count + %li + = link_to '#tab-labels', 'data-toggle' => 'tab', 'data-show' => '.tab-issues-buttons' do + Labels + %span.badge= @milestone.labels.count .tab-content.milestone-content .tab-pane.active#tab-issues = render 'shared/milestones/issues_tab', unassigned: @milestone.opened_issues.unassigned, assigned: @milestone.opened_issues.assigned, closed: @milestone.closed_issues - .tab-pane#tab-merge-requests = render 'shared/milestones/merge_requests_tab', unassigned: @milestone.opened_merge_requests.unassigned, assigned: @milestone.opened_merge_requests.assigned, closed: @milestone.merge_requests.closed, merged: @milestone.merge_requests.merged - .tab-pane#tab-participants = render 'shared/milestones/participants_tab', users: @milestone.participants + .tab-pane#tab-labels + = render 'shared/milestones/labels_tab', labels: @milestone.labels diff --git a/app/views/projects/milestones/show.html.haml b/app/views/projects/milestones/show.html.haml index 6ca66885eb..4aa1a53e87 100644 --- a/app/views/projects/milestones/show.html.haml +++ b/app/views/projects/milestones/show.html.haml @@ -100,16 +100,4 @@ .tab-pane#tab-participants = render 'shared/milestones/participants_tab', users: @users .tab-pane#tab-labels - %ul.bordered-list.manage-labels-list - - @labels.each do |label| - %li - = render_colored_label(label) - - args = [@milestone.project.namespace, @milestone.project, milestone_title: @milestone.title, label_name: label.title] - - options = args.extract_options! - - %span.issues-count - = link_to namespace_project_issues_path(*args, options.merge(state: 'opened')) do - = pluralize label.open_issues_count, 'open issue' - %span.issues-count - = link_to namespace_project_issues_path(*args, options.merge(state: 'closed')) do - = pluralize label.closed_issues_count, 'closed issue' + = render 'shared/milestones/labels_tab', labels: @labels diff --git a/app/views/shared/milestones/_labels_tab.html.haml b/app/views/shared/milestones/_labels_tab.html.haml new file mode 100644 index 0000000000..bb6ce0afb4 --- /dev/null +++ b/app/views/shared/milestones/_labels_tab.html.haml @@ -0,0 +1,15 @@ +%ul.bordered-list.manage-labels-list + - labels.each do |label| + - milestone = @milestone.is_a?(Milestone) ? @milestone : label.milestone + + %li + = render_colored_label(label) + - args = [milestone.project.namespace, milestone.project, milestone_title: milestone.title, label_name: label.title] + - options = args.extract_options! + + %span.issues-count + = link_to namespace_project_issues_path(*args, options.merge(state: 'opened')) do + = pluralize label.open_issues_count, 'open issue' + %span.issues-count + = link_to namespace_project_issues_path(*args, options.merge(state: 'closed')) do + = pluralize label.closed_issues_count, 'closed issue' diff --git a/config/application.rb b/config/application.rb index 28684a3e57..fee8637a4c 100644 --- a/config/application.rb +++ b/config/application.rb @@ -15,6 +15,7 @@ module Gitlab # Custom directories with classes and modules you want to be autoloadable. config.autoload_paths.push(*%W(#{config.root}/lib + #{config.root}/app/decorators #{config.root}/app/models/hooks #{config.root}/app/models/concerns #{config.root}/app/models/project_services