Module: IssuesHelper

Defined in:
app/helpers/issues_helper.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.url_for_issue(issue_iid, project = @project, options = {}) ⇒ Object


48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'app/helpers/issues_helper.rb', line 48

def url_for_issue(issue_iid, project = @project, options = {})
  return '' if project.nil?

  url =
    if options[:only_path]
      project.issues_tracker.issue_path(issue_iid)
    else
      project.issues_tracker.issue_url(issue_iid)
    end

  # Ensure we return a valid URL to prevent possible XSS.
  URI.parse(url).to_s
rescue URI::InvalidURIError
  ''
end

Instance Method Details

#awards_sort(awards) ⇒ Object


181
182
183
184
185
186
187
188
189
190
191
# File 'app/helpers/issues_helper.rb', line 181

def awards_sort(awards)
  awards.sort_by do |award, notes|
    if award == "thumbsup"
      0
    elsif award == "thumbsdown"
      1
    else
      2
    end
  end.to_h
end

#bulk_update_milestone_optionsObject


64
65
66
67
68
69
# File 'app/helpers/issues_helper.rb', line 64

def bulk_update_milestone_options
  milestones = @project.milestones.active.reorder(due_date: :asc, title: :asc).to_a
  milestones.unshift(Milestone::None)

  options_from_collection_for_select(milestones, 'id', 'title', params[:milestone_id])
end

#confidential_icon(issue) ⇒ Object


133
134
135
# File 'app/helpers/issues_helper.rb', line 133

def confidential_icon(issue)
  icon('eye-slash') if issue.confidential?
end

#due_date_optionsObject


193
194
195
196
197
198
199
200
201
202
203
# File 'app/helpers/issues_helper.rb', line 193

def due_date_options
  options = [
    Issue::AnyDueDate,
    Issue::NoDueDate,
    Issue::DueThisWeek,
    Issue::DueThisMonth,
    Issue::Overdue
  ]

  options_from_collection_for_select(options, 'name', 'title', params[:due_date])
end

#emoji_author_list(notes, current_user) ⇒ Object


165
166
167
168
169
170
171
# File 'app/helpers/issues_helper.rb', line 165

def emoji_author_list(notes, current_user)
  list = notes.map do |note|
           note.author == current_user ? "me" : note.author.name
         end

  list.join(", ")
end

#emoji_icon(name, unicode = nil, aliases = [], sprite: true) ⇒ Object


137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'app/helpers/issues_helper.rb', line 137

def emoji_icon(name, unicode = nil, aliases = [], sprite: true)
  unicode ||= Emoji.emoji_filename(name) rescue ""

  data = {
    aliases: aliases.join(" "),
    emoji: name,
    unicode_name: unicode
  }

  if sprite
    # Emoji icons for the emoji menu, these use a spritesheet.
     :div, "",
      class: "icon emoji-icon emoji-#{unicode}",
      title: name,
      data: data
  else
    # Emoji icons displayed separately, used for the awards already given
    # to an issue or merge request.
     :img, "",
      class: "icon emoji",
      title: name,
      height: "20px",
      width: "20px",
      src: url_to_image("#{unicode}.png"),
      data: data
  end
end

#issue_button_visibility(issue, closed) ⇒ Object


104
105
106
# File 'app/helpers/issues_helper.rb', line 104

def issue_button_visibility(issue, closed)
  return 'hidden' if issue.closed? == closed
end

#issue_css_classes(issue) ⇒ Object


2
3
4
5
6
7
# File 'app/helpers/issues_helper.rb', line 2

def issue_css_classes(issue)
  classes = "issue"
  classes << " closed" if issue.closed?
  classes << " today" if issue.today?
  classes
end

#issue_to_atom(xml, issue) ⇒ Object


108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'app/helpers/issues_helper.rb', line 108

def issue_to_atom(xml, issue)
  xml.entry do
    xml.id      namespace_project_issue_url(issue.project.namespace,
                                            issue.project, issue)
    xml.link    href: namespace_project_issue_url(issue.project.namespace,
                                                  issue.project, issue)
    xml.title   truncate(issue.title, length: 80)
    xml.updated issue.created_at.xmlschema
    xml.media   :thumbnail, width: "40", height: "40", url: image_url(avatar_icon(issue.author_email))
    xml.author do |author|
      xml.name issue.author_name
      xml.email issue.author_email
    end
    xml.summary issue.title
  end
end

#merge_requests_sentence(merge_requests) ⇒ Object


125
126
127
128
129
130
131
# File 'app/helpers/issues_helper.rb', line 125

def merge_requests_sentence(merge_requests)
  # Sorting based on the `!123` or `group/project!123` reference will sort
  # local merge requests first.
  merge_requests.map do |merge_request|
    merge_request.to_reference(@project)
  end.sort.to_sentence(last_word_connector: ', or ')
end

#milestone_options(object) ⇒ Object


71
72
73
74
75
76
77
# File 'app/helpers/issues_helper.rb', line 71

def milestone_options(object)
  milestones = object.project.milestones.active.reorder(due_date: :asc, title: :asc).to_a
  milestones.unshift(object.milestone) if object.milestone.present? && object.milestone.closed?
  milestones.unshift(Milestone::None)

  options_from_collection_for_select(milestones, 'id', 'title', object.milestone_id)
end

#note_active_class(notes, current_user) ⇒ Object


173
174
175
176
177
178
179
# File 'app/helpers/issues_helper.rb', line 173

def note_active_class(notes, current_user)
  if current_user && notes.pluck(:author_id).include?(current_user.id)
    "active"
  else
    ""
  end
end

#project_options(issuable, current_user, ability: :read_project) ⇒ Object


79
80
81
82
83
84
85
86
87
88
89
90
# File 'app/helpers/issues_helper.rb', line 79

def project_options(issuable, current_user, ability: :read_project)
  projects = current_user.authorized_projects
  projects = projects.select do |project|
    current_user.can?(ability, project)
  end

  no_project = OpenStruct.new(id: 0, name_with_namespace: 'No project')
  projects.unshift(no_project)
  projects.delete(issuable.project)

  options_from_collection_for_select(projects, :id, :name_with_namespace)
end

#status_box_class(item) ⇒ Object


92
93
94
95
96
97
98
99
100
101
102
# File 'app/helpers/issues_helper.rb', line 92

def status_box_class(item)
  if item.respond_to?(:expired?) && item.expired?
    'status-box-expired'
  elsif item.respond_to?(:merged?) && item.merged?
    'status-box-merged'
  elsif item.closed?
    'status-box-closed'
  else
    'status-box-open'
  end
end

#unassigned_filterObject

Returns an OpenStruct object suitable for use by options_from_collection_for_select to allow filtering issues by an unassigned User or Milestone


11
12
13
14
# File 'app/helpers/issues_helper.rb', line 11

def unassigned_filter
  # Milestone uses :title, Issue uses :name
  OpenStruct.new(id: 0, title: 'None (backlog)', name: 'Unassigned')
end

#url_for_new_issue(project = @project, options = {}) ⇒ Object


32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'app/helpers/issues_helper.rb', line 32

def url_for_new_issue(project = @project, options = {})
  return '' if project.nil?

  url =
    if options[:only_path]
      project.issues_tracker.new_issue_path
    else
      project.issues_tracker.new_issue_url
    end

  # Ensure we return a valid URL to prevent possible XSS.
  URI.parse(url).to_s
rescue URI::InvalidURIError
  ''
end

#url_for_project_issues(project = @project, options = {}) ⇒ Object


16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'app/helpers/issues_helper.rb', line 16

def url_for_project_issues(project = @project, options = {})
  return '' if project.nil?

  url =
    if options[:only_path]
      project.issues_tracker.project_path
    else
      project.issues_tracker.project_url
    end

  # Ensure we return a valid URL to prevent possible XSS.
  URI.parse(url).to_s
rescue URI::InvalidURIError
  ''
end