gitlab-org--gitlab-foss/app/helpers/labels_helper.rb

195 lines
5.4 KiB
Ruby
Raw Normal View History

module LabelsHelper
2015-04-16 16:41:59 +00:00
include ActionView::Helpers::TagHelper
2015-05-22 03:40:25 +00:00
# Link to a Label
#
# label - Label object to link to
# project - Project object which will be used as the context for the label's
# link. If omitted, defaults to `@project`, or the label's own
# project.
# type - The type of item the link will point to (:issue or
# :merge_request). If omitted, defaults to :issue.
2015-05-22 03:40:25 +00:00
# block - An optional block that will be passed to `link_to`, forming the
# body of the link element. If omitted, defaults to
# `render_colored_label`.
#
# Examples:
#
# # Allow the generated link to use the label's own project
# link_to_label(label)
#
# # Force the generated link to use @project
# @project = Project.first
# link_to_label(label)
#
# # Force the generated link to use a provided project
# link_to_label(label, project: Project.last)
#
# # Force the generated link to point to merge requests instead of issues
# link_to_label(label, type: :merge_request)
#
2015-05-22 03:40:25 +00:00
# # Customize link body with a block
# link_to_label(label) { "My Custom Label Text" }
#
# Returns a String
2016-05-24 13:16:22 +00:00
def link_to_label(label, project: nil, type: :issue, tooltip: true, css_class: nil, &block)
2015-05-22 03:40:25 +00:00
project ||= @project || label.project
link = label_filter_path(project, label, type: type)
2015-05-22 03:40:25 +00:00
if block_given?
2016-05-24 09:29:26 +00:00
link_to link, class: css_class, &block
2015-05-22 03:40:25 +00:00
else
2016-05-24 09:29:26 +00:00
link_to render_colored_label(label, tooltip: tooltip), link, class: css_class
2015-05-22 03:40:25 +00:00
end
end
2016-09-19 19:49:08 +00:00
def link_to_group_label(label, group: nil, type: :issue, tooltip: true, css_class: nil, &block)
group ||= @group || label.group
link = label_filter_path(group, label, type: type)
if block_given?
link_to link, class: css_class, &block
else
link_to render_colored_label(label, tooltip: tooltip), link, class: css_class
end
end
def label_filter_path(subject, label, type: issue)
case subject
when Project
send("namespace_project_#{type.to_s.pluralize}_path",
subject.namespace,
subject,
label_name: [label.name])
when Group
send("#{type.to_s.pluralize}_group_path",
subject,
label_name: [label.name])
end
end
def can_admin_label(label)
subject =
case label
when GroupLabel then label.group
else label.project
end
can?(current_user, :admin_label, subject)
end
def edit_label_path(label)
case label
when GroupLabel then edit_group_label_path(label.group, label)
else edit_namespace_project_label_path(label.project.namespace, label.project, label)
end
end
def destroy_label_path(label)
case label
when GroupLabel then group_label_path(label.group, label)
else namespace_project_label_path(label.project.namespace, label.project, label)
end
end
def label_type_icon(label, options = {})
title, icon =
case label
when GroupLabel then ['Group', 'folder-open']
else ['Project', 'bookmark']
end
options[:class] ||= ''
options[:class] << ' has-tooltip js-label-type'
content_tag :span,
class: options[:class],
data: { 'placement' => 'top' },
title: title,
aria: { label: title } do
icon(icon, base: true)
end
end
def render_colored_label(label, label_suffix = '', tooltip: true)
label_color = label.color || Label::DEFAULT_COLOR
text_color = text_color_for_bg(label_color)
# Intentionally not using content_tag here so that this method can be called
# by LabelReferenceFilter
span = %(<span class="label color-label #{"has-tooltip" if tooltip}" ) +
%(style="background-color: #{label_color}; color: #{text_color}" ) +
%(title="#{escape_once(label.description)}" data-container="body">) +
%(#{escape_once(label.name)}#{label_suffix}</span>)
span.html_safe
end
def render_colored_cross_project_label(label, tooltip: true)
2016-03-03 08:31:07 +00:00
label_suffix = label.project.name_with_namespace
label_suffix = " <i>in #{escape_once(label_suffix)}</i>"
render_colored_label(label, label_suffix, tooltip: tooltip)
end
def suggested_colors
[
2015-01-13 13:09:19 +00:00
'#0033CC',
'#428BCA',
2015-01-13 13:09:19 +00:00
'#44AD8E',
'#A8D695',
'#5CB85C',
2015-01-13 13:09:19 +00:00
'#69D100',
'#004E00',
'#34495E',
'#7F8C8D',
2015-01-13 13:09:19 +00:00
'#A295D6',
'#5843AD',
'#8E44AD',
2015-01-13 13:09:19 +00:00
'#FFECDB',
'#AD4363',
'#D10069',
'#CC0033',
'#FF0000',
'#D9534F',
'#D1D100',
'#F0AD4E',
'#AD8D43'
]
end
def text_color_for_bg(bg_color)
if bg_color.length == 4
r, g, b = bg_color[1, 4].scan(/./).map { |v| (v * 2).hex }
else
r, g, b = bg_color[1, 7].scan(/.{2}/).map(&:hex)
end
if (r + g + b) > 500
'#333333'
else
'#FFFFFF'
end
end
def labels_filter_path
project = @target_project || @project
if project
namespace_project_labels_path(project.namespace, project, :json)
else
dashboard_labels_path(:json)
end
end
def label_subscription_status(label)
label.subscribed?(current_user) ? 'subscribed' : 'unsubscribed'
end
def label_subscription_toggle_button_text(label)
label.subscribed?(current_user) ? 'Unsubscribe' : 'Subscribe'
end
# Required for Banzai::Filter::LabelReferenceFilter
module_function :render_colored_label, :render_colored_cross_project_label,
:text_color_for_bg, :escape_once
end