labels_helper.rb 4.8 KB
Newer Older
1
module LabelsHelper
2 3
  include ActionView::Helpers::TagHelper

R
Robert Speicher 已提交
4 5 6
  # Link to a Label
  #
  # label   - Label object to link to
7 8
  # 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.
9 10
  # type    - The type of item the link will point to (:issue or
  #           :merge_request). If omitted, defaults to :issue.
R
Robert Speicher 已提交
11 12 13 14 15 16
  # 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:
  #
17
  #   # Allow the generated link to use the label's own subject
R
Robert Speicher 已提交
18 19
  #   link_to_label(label)
  #
20 21
  #   # Force the generated link to use a provided group
  #   link_to_label(label, subject: Group.last)
R
Robert Speicher 已提交
22 23
  #
  #   # Force the generated link to use a provided project
24
  #   link_to_label(label, subject: Project.last)
R
Robert Speicher 已提交
25
  #
26 27 28
  #   # Force the generated link to point to merge requests instead of issues
  #   link_to_label(label, type: :merge_request)
  #
R
Robert Speicher 已提交
29 30 31 32
  #   # Customize link body with a block
  #   link_to_label(label) { "My Custom Label Text" }
  #
  # Returns a String
33
  def link_to_label(label, subject: nil, type: :issue, tooltip: true, css_class: nil, &block)
34
    link = label_filter_path(subject || label.subject, label, type: type)
R
Robert Speicher 已提交
35 36

    if block_given?
P
Phil Hughes 已提交
37
      link_to link, class: css_class, &block
R
Robert Speicher 已提交
38
    else
P
Phil Hughes 已提交
39
      link_to render_colored_label(label, tooltip: tooltip), link, class: css_class
R
Robert Speicher 已提交
40 41 42
    end
  end

43
  def label_filter_path(subject, label, type: :issue)
44 45
    case subject
    when Group
46
      send("#{type.to_s.pluralize}_group_path",
47
                  subject,
48
                  label_name: [label.name])
49
    when Project
50
      send("namespace_project_#{type.to_s.pluralize}_path",
51 52
                  subject.namespace,
                  subject,
53 54
                  label_name: [label.name])
    end
55 56
  end

57 58 59
  def edit_label_path(label)
    case label
    when GroupLabel then edit_group_label_path(label.group, label)
D
Douglas Barbosa Alexandre 已提交
60
    when ProjectLabel then edit_namespace_project_label_path(label.project.namespace, label.project, label)
61 62 63 64 65 66
    end
  end

  def destroy_label_path(label)
    case label
    when GroupLabel then group_label_path(label.group, label)
D
Douglas Barbosa Alexandre 已提交
67
    when ProjectLabel then namespace_project_label_path(label.project.namespace, label.project, label)
68 69 70
    end
  end

71
  def render_colored_label(label, label_suffix = '', tooltip: true)
D
Dmitriy Zaporozhets 已提交
72
    label_color = label.color || Label::DEFAULT_COLOR
73
    text_color = text_color_for_bg(label_color)
74

R
Robert Speicher 已提交
75 76
    # Intentionally not using content_tag here so that this method can be called
    # by LabelReferenceFilter
77
    span = %(<span class="label color-label #{"has-tooltip" if tooltip}" ) +
78 79
      %(style="background-color: #{label_color}; color: #{text_color}" ) +
      %(title="#{escape_once(label.description)}" data-container="body">) +
80
      %(#{escape_once(label.name)}#{label_suffix}</span>)
R
Robert Speicher 已提交
81 82

    span.html_safe
83
  end
84

85 86
  def render_colored_cross_project_label(label, source_project = nil, tooltip: true)
    label_suffix = source_project ? source_project.name_with_namespace : label.project.name_with_namespace
87
    label_suffix = " <i>in #{escape_once(label_suffix)}</i>"
88
    render_colored_label(label, label_suffix, tooltip: tooltip)
89 90
  end

91 92
  def suggested_colors
    [
P
phortx 已提交
93
      '#0033CC',
94
      '#428BCA',
P
phortx 已提交
95 96
      '#44AD8E',
      '#A8D695',
97
      '#5CB85C',
P
phortx 已提交
98 99
      '#69D100',
      '#004E00',
100 101
      '#34495E',
      '#7F8C8D',
P
phortx 已提交
102 103
      '#A295D6',
      '#5843AD',
104
      '#8E44AD',
P
phortx 已提交
105
      '#FFECDB',
106 107 108 109 110 111 112 113
      '#AD4363',
      '#D10069',
      '#CC0033',
      '#FF0000',
      '#D9534F',
      '#D1D100',
      '#F0AD4E',
      '#AD8D43'
114 115
    ]
  end
116 117

  def text_color_for_bg(bg_color)
118 119 120 121 122
    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
123 124

    if (r + g + b) > 500
R
Robert Speicher 已提交
125
      '#333333'
126
    else
R
Robert Speicher 已提交
127
      '#FFFFFF'
128 129
    end
  end
130

P
Phil Hughes 已提交
131
  def labels_filter_path
132 133
    return group_labels_path(@group, :json) if @group

134
    project = @target_project || @project
135

136
    if project
137
      namespace_project_labels_path(project.namespace, project, :json)
P
Phil Hughes 已提交
138
    else
139
      dashboard_labels_path(:json)
P
Phil Hughes 已提交
140
    end
141
  end
R
Robert Speicher 已提交
142

143
  def label_subscription_status(label, project)
144
    label.subscribed?(current_user, project) ? 'subscribed' : 'unsubscribed'
145 146
  end

147
  def label_subscription_toggle_button_text(label, project)
148
    label.subscribed?(current_user, project) ? 'Unsubscribe' : 'Subscribe'
149 150
  end

151 152 153 154 155 156 157
  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
  end

158
  # Required for Banzai::Filter::LabelReferenceFilter
159 160
  module_function :render_colored_label, :render_colored_cross_project_label,
                  :text_color_for_bg, :escape_once
161
end