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

279 lines
8 KiB
Ruby
Raw Normal View History

2018-12-05 23:21:45 +05:30
# frozen_string_literal: true
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
2019-10-12 21:52:04 +05:30
def show_label_issuables_link?(label, issuables_type, current_user: nil)
2019-07-31 22:56:46 +05:30
return true unless label.project_label?
2018-03-17 18:26:18 +05:30
2019-10-12 21:52:04 +05:30
label.project.feature_available?(issuables_type, current_user)
2018-03-17 18:26:18 +05:30
end
2015-09-11 14:41:01 +05:30
# Link to a Label
#
2019-07-31 22:56:46 +05:30
# label - LabelPresenter object to link to
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
2021-01-03 14:25:43 +05:30
def link_to_label(label, type: :issue, tooltip: true, small: false, css_class: nil, &block)
2019-07-31 22:56:46 +05:30
link = label.filter_path(type: type)
2015-09-11 14:41:01 +05:30
if block_given?
2021-01-03 14:25:43 +05:30
link_to link, class: css_class, &block
2015-09-11 14:41:01 +05:30
else
2020-04-08 14:13:33 +05:30
render_label(label, link: link, tooltip: tooltip, small: small)
2015-09-11 14:41:01 +05:30
end
end
2020-04-08 14:13:33 +05:30
def render_label(label, link: nil, tooltip: true, dataset: nil, small: false)
html = render_colored_label(label)
2019-07-07 11:18:12 +05:30
2020-04-08 14:13:33 +05:30
if link
title = label_tooltip_title(label) if tooltip
html = render_label_link(html, link: link, title: title, dataset: dataset)
end
wrap_label_html(html, small: small, label: label)
2019-07-07 11:18:12 +05:30
end
2020-04-08 14:13:33 +05:30
def render_colored_label(label, suffix: '')
render_label_text(
label.name,
suffix: suffix,
2021-01-03 14:25:43 +05:30
css_class: "gl-label-text #{text_color_class_for_bg(label.color)}",
2020-04-08 14:13:33 +05:30
bg_color: label.color
)
end
2014-09-02 18:07:02 +05:30
2020-04-08 14:13:33 +05:30
# We need the `label` argument here for EE
def wrap_label_html(label_html, small:, label:)
wrapper_classes = %w(gl-label)
wrapper_classes << 'gl-label-sm' if small
2015-09-11 14:41:01 +05:30
2020-04-08 14:13:33 +05:30
%(<span class="#{wrapper_classes.join(' ')}">#{label_html}</span>).html_safe
2014-09-02 18:07:02 +05:30
end
2019-07-07 11:18:12 +05:30
def label_tooltip_title(label)
2019-09-04 21:01:54 +05:30
Sanitize.clean(label.description)
2019-07-07 11:18:12 +05:30
end
2014-09-02 18:07:02 +05:30
def suggested_colors
2019-09-04 21:01:54 +05:30
{
2021-03-11 19:13:27 +05:30
'#009966' => s_('SuggestedColors|Green-cyan'),
'#8fbc8f' => s_('SuggestedColors|Dark sea green'),
'#3cb371' => s_('SuggestedColors|Medium sea green'),
'#00b140' => s_('SuggestedColors|Green screen'),
'#013220' => s_('SuggestedColors|Dark green'),
'#6699cc' => s_('SuggestedColors|Blue-gray'),
'#0000ff' => s_('SuggestedColors|Blue'),
'#e6e6fa' => s_('SuggestedColors|Lavendar'),
'#9400d3' => s_('SuggestedColors|Dark violet'),
'#330066' => s_('SuggestedColors|Deep violet'),
'#808080' => s_('SuggestedColors|Gray'),
'#36454f' => s_('SuggestedColors|Charcoal grey'),
'#f7e7ce' => s_('SuggestedColors|Champagne'),
'#c21e56' => s_('SuggestedColors|Rose red'),
'#cc338b' => s_('SuggestedColors|Magenta-pink'),
'#dc143c' => s_('SuggestedColors|Crimson'),
'#ff0000' => s_('SuggestedColors|Red'),
'#cd5b45' => s_('SuggestedColors|Dark coral'),
'#eee600' => s_('SuggestedColors|Titanium yellow'),
'#ed9121' => s_('SuggestedColors|Carrot orange'),
'#c39953' => s_('SuggestedColors|Aztec Gold')
2019-09-04 21:01:54 +05:30
}
end
def render_suggested_colors
colors_html = suggested_colors.map do |color_hex_value, color_name|
link_to('', '#', class: "has-tooltip", style: "background-color: #{color_hex_value}", data: { color: color_hex_value }, title: color_name)
end
content_tag(:div, class: 'suggest-colors') do
colors_html.join.html_safe
end
2014-09-02 18:07:02 +05:30
end
2020-04-08 14:13:33 +05:30
def text_color_class_for_bg(bg_color)
if light_color?(bg_color)
'gl-label-text-dark'
2016-04-02 18:10:28 +05:30
else
2020-04-08 14:13:33 +05:30
'gl-label-text-light'
2016-04-02 18:10:28 +05:30
end
2020-04-08 14:13:33 +05:30
end
2014-09-02 18:07:02 +05:30
2020-04-08 14:13:33 +05:30
def text_color_for_bg(bg_color)
if light_color?(bg_color)
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
2020-04-08 14:13:33 +05:30
def light_color?(color)
if color.length == 4
r, g, b = color[1, 4].scan(/./).map { |v| (v * 2).hex }
else
r, g, b = color[1, 7].scan(/.{2}/).map(&:hex)
end
(r + g + b) > 500
end
2018-12-05 23:21:45 +05:30
def labels_filter_path_with_defaults(only_group_labels: false, include_ancestor_groups: true, include_descendant_groups: false)
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
2018-12-05 23:21:45 +05:30
options[:only_group_labels] = only_group_labels if only_group_labels && @group
options[:format] = :json
labels_filter_path(options)
end
def labels_filter_path(options = {})
project = @target_project || @project
2018-12-13 13:39:08 +05:30
format = options.delete(:format)
2018-05-09 12:01:36 +05:30
2016-11-03 12:29:30 +05:30
if project
2018-12-05 23:21:45 +05:30
project_labels_path(project, format, options)
2018-03-17 18:26:18 +05:30
elsif @group
2018-12-05 23:21:45 +05:30
group_labels_path(@group, format, options)
2016-06-02 11:05:42 +05:30
else
2018-12-05 23:21:45 +05:30
dashboard_labels_path(format, options)
2016-06-02 11:05:42 +05:30
end
end
2015-10-24 18:46:33 +05:30
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
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)
2019-07-31 22:56:46 +05:30
type = label.project_label? ? 'project' : 'group'
2018-11-08 19:23:39 +05:30
level = status.unsubscribed? ? type : status.sub('-level', '')
action = status.unsubscribed? ? 'Subscribe' : 'Unsubscribe'
"#{action} at #{level} level"
end
2019-07-31 22:56:46 +05:30
def presented_labels_sorted_by_title(labels, subject)
labels.sort_by(&:title).map { |label| label.present(issuable_subject: subject) }
2019-07-07 11:18:12 +05:30
end
def label_dropdown_data(project, opts = {})
{
toggle: "dropdown",
field_name: opts[:field_name] || "label_name[]",
show_no: "true",
show_any: "true",
project_id: project&.try(:id),
namespace_path: project&.try(:namespace)&.try(:full_path),
project_path: project&.try(:path)
}.merge(opts)
end
2019-07-31 22:56:46 +05:30
def issuable_types
['issues', 'merge requests']
end
2021-01-03 14:25:43 +05:30
def show_labels_full_path?(project, group)
project || group&.subgroup?
end
2020-04-08 14:13:33 +05:30
private
def render_label_link(label_html, link:, title:, dataset:)
classes = %w(gl-link gl-label-link)
dataset ||= {}
if title.present?
classes << 'has-tooltip'
dataset.merge!(html: true, title: title)
end
link_to(label_html, link, class: classes.join(' '), data: dataset)
end
def render_label_text(name, suffix: '', css_class: nil, bg_color: nil)
<<~HTML.chomp.html_safe
<span
2021-01-03 14:25:43 +05:30
class="#{css_class}"
2020-04-08 14:13:33 +05:30
data-container="body"
data-html="true"
#{"style=\"background-color: #{bg_color}\"" if bg_color}
>#{ERB::Util.html_escape_once(name)}#{suffix}</span>
HTML
end
2014-09-02 18:07:02 +05:30
end
2019-12-04 20:38:33 +05:30
2021-06-08 01:23:25 +05:30
LabelsHelper.prepend_mod_with('LabelsHelper')