issues_helper.rb 3.87 KB
Newer Older
gitlabhq's avatar
gitlabhq committed
1
module IssuesHelper
2
  def issue_css_classes(issue)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
3
    classes = "issue"
Andrew8xx8's avatar
Andrew8xx8 committed
4
    classes << " closed" if issue.closed?
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
5 6 7
    classes << " today" if issue.today?
    classes
  end
8

9 10 11 12
  # Returns an OpenStruct object suitable for use by <tt>options_from_collection_for_select</tt>
  # to allow filtering issues by an unassigned User or Milestone
  def unassigned_filter
    # Milestone uses :title, Issue uses :name
13
    OpenStruct.new(id: 0, title: 'None (backlog)', name: 'Unassigned')
14
  end
15

16
  def url_for_project_issues(project = @project, options = {})
skv's avatar
skv committed
17
    return '' if project.nil?
18

19 20 21 22 23
    if options[:only_path]
      project.issues_tracker.project_path
    else
      project.issues_tracker.project_url
    end
24 25
  end

26
  def url_for_new_issue(project = @project, options = {})
skv's avatar
skv committed
27
    return '' if project.nil?
28

29 30 31 32 33
    if options[:only_path]
      project.issues_tracker.new_issue_path
    else
      project.issues_tracker.new_issue_url
    end
34 35
  end

36
  def url_for_issue(issue_iid, project = @project, options = {})
skv's avatar
skv committed
37
    return '' if project.nil?
Andrew8xx8's avatar
Andrew8xx8 committed
38

39 40 41 42 43
    if options[:only_path]
      project.issues_tracker.issue_path(issue_iid)
    else
      project.issues_tracker.issue_url(issue_iid)
    end
44 45
  end

46
  def bulk_update_milestone_options
47 48 49 50
    milestones = project_active_milestones.to_a
    milestones.unshift(Milestone::None)

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

53
  def milestone_options(object)
54 55 56 57
    milestones = object.project.milestones.active.to_a
    milestones.unshift(Milestone::None)

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

60
  def status_box_class(item)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
61
    if item.respond_to?(:expired?) && item.expired?
62
      'status-box-expired'
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
63
    elsif item.respond_to?(:merged?) && item.merged?
64
      'status-box-merged'
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
65
    elsif item.closed?
66
      'status-box-closed'
67
    else
68
      'status-box-open'
69 70
    end
  end
71

72 73 74 75
  def issue_button_visibility(issue, closed)    
    return 'hidden' if issue.closed? == closed
  end

76 77
  def issue_to_atom(xml, issue)
    xml.entry do
Vinnie Okada's avatar
Vinnie Okada committed
78 79 80 81
      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)
82 83
      xml.title   truncate(issue.title, length: 80)
      xml.updated issue.created_at.strftime("%Y-%m-%dT%H:%M:%SZ")
84
      xml.media   :thumbnail, width: "40", height: "40", url: image_url(avatar_icon(issue.author_email))
85 86 87 88 89 90 91
      xml.author do |author|
        xml.name issue.author_name
        xml.email issue.author_email
      end
      xml.summary issue.title
    end
  end
92

93
  def merge_requests_sentence(merge_requests)
94 95 96 97 98
    # 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 ')
99 100
  end

101
  def emoji_icon(name, unicode = nil, aliases = [])
102 103
    unicode ||= Emoji.emoji_filename(name)

Valery Sizov's avatar
Valery Sizov committed
104 105 106
    content_tag :div, "",
      class: "icon emoji-icon emoji-#{unicode}",
      "data-emoji" => name,
107
      "data-aliases" => aliases.join(" "),
Valery Sizov's avatar
Valery Sizov committed
108
      "data-unicode-name" => unicode
Valery Sizov's avatar
Valery Sizov committed
109 110
  end

Valery Sizov's avatar
Valery Sizov committed
111 112
  def emoji_author_list(notes, current_user)
    list = notes.map do |note|
113
             note.author == current_user ? "me" : note.author.name
Valery Sizov's avatar
Valery Sizov committed
114 115 116 117 118
           end

    list.join(", ")
  end

Valery Sizov's avatar
Valery Sizov committed
119
  def note_active_class(notes, current_user)
Valery Sizov's avatar
Valery Sizov committed
120 121 122 123 124
    if current_user && notes.pluck(:author_id).include?(current_user.id)
      "active"
    else
      ""
    end
Valery Sizov's avatar
Valery Sizov committed
125 126
  end

Valery Sizov's avatar
Valery Sizov committed
127 128 129 130 131 132 133 134 135 136 137 138
  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

139
  # Required for Banzai::Filter::IssueReferenceFilter
140
  module_function :url_for_issue
gitlabhq's avatar
gitlabhq committed
141
end