debian-mirror-gitlab/app/helpers/labels_helper.rb

225 lines
6.5 KiB
Ruby
Raw Normal View History

2014-09-02 18:07:02 +05:30
module LabelsHelper
2018-03-27 19:54:05 +05:30
extend self
2015-09-11 14:41:01 +05:30
include ActionView::Helpers::TagHelper
2018-03-17 18:26:18 +05:30
def show_label_issuables_link?(label, issuables_type, current_user: nil, project: nil)
return true if label.is_a?(GroupLabel)
return true unless project
project.feature_available?(issuables_type, current_user)
end
2015-09-11 14:41:01 +05:30
# Link to a Label
#
# label - Label object to link to
2016-11-03 12:29:30 +05:30
# subject - Project/Group object which will be used as the context for the
# label's link. If omitted, defaults to the label's own group/project.
2016-04-02 18:10:28 +05:30
# type - The type of item the link will point to (:issue or
# :merge_request). If omitted, defaults to :issue.
2015-09-11 14:41:01 +05:30
# 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:
#
2016-11-03 12:29:30 +05:30
# # Allow the generated link to use the label's own subject
2015-09-11 14:41:01 +05:30
# link_to_label(label)
#
2016-11-03 12:29:30 +05:30
# # Force the generated link to use a provided group
# link_to_label(label, subject: Group.last)
2015-09-11 14:41:01 +05:30
#
# # Force the generated link to use a provided project
2016-11-03 12:29:30 +05:30
# link_to_label(label, subject: Project.last)
2015-09-11 14:41:01 +05:30
#
2016-04-02 18:10:28 +05:30
# # Force the generated link to point to merge requests instead of issues
# link_to_label(label, type: :merge_request)
#
2015-09-11 14:41:01 +05:30
# # Customize link body with a block
# link_to_label(label) { "My Custom Label Text" }
#
# Returns a String
2016-11-03 12:29:30 +05:30
def link_to_label(label, subject: nil, type: :issue, tooltip: true, css_class: nil, &block)
link = label_filter_path(subject || label.subject, label, type: type)
2015-09-11 14:41:01 +05:30
if block_given?
link_to link, class: css_class, &block
2015-09-11 14:41:01 +05:30
else
link_to render_colored_label(label, tooltip: tooltip), link, class: css_class
2015-09-11 14:41:01 +05:30
end
end
2016-11-03 12:29:30 +05:30
def label_filter_path(subject, label, type: :issue)
case subject
when Group
2018-03-17 18:26:18 +05:30
send("#{type.to_s.pluralize}_group_path", # rubocop:disable GitlabSecurity/PublicSend
2016-11-03 12:29:30 +05:30
subject,
label_name: [label.name])
when Project
2018-03-17 18:26:18 +05:30
send("namespace_project_#{type.to_s.pluralize}_path", # rubocop:disable GitlabSecurity/PublicSend
2016-11-03 12:29:30 +05:30
subject.namespace,
subject,
label_name: [label.name])
end
end
def edit_label_path(label)
case label
when GroupLabel then edit_group_label_path(label.group, label)
2017-09-10 17:25:29 +05:30
when ProjectLabel then edit_project_label_path(label.project, label)
2016-11-03 12:29:30 +05:30
end
end
def destroy_label_path(label)
case label
when GroupLabel then group_label_path(label.group, label)
2017-09-10 17:25:29 +05:30
when ProjectLabel then project_label_path(label.project, label)
2016-11-03 12:29:30 +05:30
end
2016-08-24 12:49:21 +05:30
end
2016-06-02 11:05:42 +05:30
def render_colored_label(label, label_suffix = '', tooltip: true)
2017-08-17 22:00:37 +05:30
text_color = text_color_for_bg(label.color)
2014-09-02 18:07:02 +05:30
2015-09-11 14:41:01 +05:30
# Intentionally not using content_tag here so that this method can be called
# by LabelReferenceFilter
2018-11-08 19:23:39 +05:30
span = %(<span class="badge color-label #{"has-tooltip" if tooltip}" ) +
2017-08-17 22:00:37 +05:30
%(style="background-color: #{label.color}; color: #{text_color}" ) +
2016-06-02 11:05:42 +05:30
%(title="#{escape_once(label.description)}" data-container="body">) +
%(#{escape_once(label.name)}#{label_suffix}</span>)
2015-09-11 14:41:01 +05:30
span.html_safe
2014-09-02 18:07:02 +05:30
end
def suggested_colors
[
2015-04-26 12:48:37 +05:30
'#0033CC',
2014-09-02 18:07:02 +05:30
'#428BCA',
2015-04-26 12:48:37 +05:30
'#44AD8E',
'#A8D695',
2014-09-02 18:07:02 +05:30
'#5CB85C',
2015-04-26 12:48:37 +05:30
'#69D100',
'#004E00',
2014-09-02 18:07:02 +05:30
'#34495E',
'#7F8C8D',
2015-04-26 12:48:37 +05:30
'#A295D6',
'#5843AD',
2014-09-02 18:07:02 +05:30
'#8E44AD',
2015-04-26 12:48:37 +05:30
'#FFECDB',
'#AD4363',
'#D10069',
'#CC0033',
'#FF0000',
'#D9534F',
'#D1D100',
'#F0AD4E',
'#AD8D43'
2014-09-02 18:07:02 +05:30
]
end
def text_color_for_bg(bg_color)
2016-04-02 18:10:28 +05:30
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
2014-09-02 18:07:02 +05:30
if (r + g + b) > 500
2015-09-11 14:41:01 +05:30
'#333333'
2014-09-02 18:07:02 +05:30
else
2015-09-11 14:41:01 +05:30
'#FFFFFF'
2014-09-02 18:07:02 +05:30
end
end
2015-04-26 12:48:37 +05:30
2018-05-09 12:01:36 +05:30
def labels_filter_path(only_group_labels = false, include_ancestor_groups: true, include_descendant_groups: false)
2016-11-03 12:29:30 +05:30
project = @target_project || @project
2018-05-09 12:01:36 +05:30
options = {}
options[:include_ancestor_groups] = include_ancestor_groups if include_ancestor_groups
options[:include_descendant_groups] = include_descendant_groups if include_descendant_groups
2016-11-03 12:29:30 +05:30
if project
2018-05-09 12:01:36 +05:30
project_labels_path(project, :json, options)
2018-03-17 18:26:18 +05:30
elsif @group
2018-05-09 12:01:36 +05:30
options[:only_group_labels] = only_group_labels if only_group_labels
2018-03-17 18:26:18 +05:30
group_labels_path(@group, :json, options)
2016-06-02 11:05:42 +05:30
else
dashboard_labels_path(:json)
end
end
2015-10-24 18:46:33 +05:30
2017-09-10 17:25:29 +05:30
def can_subscribe_to_label_in_different_levels?(label)
defined?(@project) && label.is_a?(GroupLabel)
end
2017-08-17 22:00:37 +05:30
def label_subscription_status(label, project)
return 'group-level' if label.subscribed?(current_user)
2017-09-10 17:25:29 +05:30
return 'project-level' if label.subscribed?(current_user, project)
2017-08-17 22:00:37 +05:30
'unsubscribed'
2016-06-02 11:05:42 +05:30
end
2015-10-24 18:46:33 +05:30
2017-09-10 17:25:29 +05:30
def toggle_subscription_label_path(label, project)
return toggle_subscription_group_label_path(label.group, label) unless project
2017-08-17 22:00:37 +05:30
case label_subscription_status(label, project)
when 'group-level' then toggle_subscription_group_label_path(label.group, label)
2017-09-10 17:25:29 +05:30
when 'project-level' then toggle_subscription_project_label_path(project, label)
when 'unsubscribed' then toggle_subscription_project_label_path(project, label)
2016-11-03 12:29:30 +05:30
end
end
2017-09-10 17:25:29 +05:30
def label_subscription_toggle_button_text(label, project = nil)
2017-08-17 22:00:37 +05:30
label.subscribed?(current_user, project) ? 'Unsubscribe' : 'Subscribe'
end
2016-11-03 12:29:30 +05:30
def label_deletion_confirm_text(label)
case label
when GroupLabel then 'Remove this label? This will affect all projects within the group. Are you sure?'
when ProjectLabel then 'Remove this label? Are you sure?'
end
2015-04-26 12:48:37 +05:30
end
2015-09-11 14:41:01 +05:30
2018-05-09 12:01:36 +05:30
def create_label_title(subject)
case subject
when Group
_('Create group label')
when Project
_('Create project label')
else
_('Create new label')
end
end
def manage_labels_title(subject)
case subject
when Group
_('Manage group labels')
when Project
_('Manage project labels')
else
_('Manage labels')
end
end
def view_labels_title(subject)
case subject
when Group
_('View group labels')
when Project
_('View project labels')
else
_('View labels')
end
end
2018-11-08 19:23:39 +05:30
def label_status_tooltip(label, status)
type = label.is_a?(ProjectLabel) ? 'project' : 'group'
level = status.unsubscribed? ? type : status.sub('-level', '')
action = status.unsubscribed? ? 'Subscribe' : 'Unsubscribe'
"#{action} at #{level} level"
end
2015-12-23 02:04:40 +05:30
# Required for Banzai::Filter::LabelReferenceFilter
2017-08-17 22:00:37 +05:30
module_function :render_colored_label, :text_color_for_bg, :escape_once
2014-09-02 18:07:02 +05:30
end