summaryrefslogtreecommitdiff
path: root/app/helpers/issues_helper.rb
blob: a5b393c1e3c828f9140aa9839c10c2b373b1c74b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
module IssuesHelper
  def issue_css_classes(issue)
    classes = "issue"
    classes << " closed" if issue.closed?
    classes << " today" if issue.today?
    classes
  end

  # 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
    OpenStruct.new(id: 0, title: 'None (backlog)', name: 'Unassigned')
  end

  def url_for_project_issues(project = @project)
    return '' if project.nil?

    if project.used_default_issues_tracker? || !external_issues_tracker_enabled?
      project_issues_path(project)
    else
      url = Gitlab.config.issues_tracker[project.issues_tracker]['project_url']
      url.gsub(':project_id', project.id.to_s).
          gsub(':issues_tracker_id', project.issues_tracker_id.to_s)
    end
  end

  def url_for_new_issue(project = @project)
    return '' if project.nil?

    if project.used_default_issues_tracker? || !external_issues_tracker_enabled?
      url = new_project_issue_path project_id: project
    else
      issues_tracker = Gitlab.config.issues_tracker[project.issues_tracker]
      url = issues_tracker['new_issue_url']
      url.gsub(':project_id', project.id.to_s).
          gsub(':issues_tracker_id', project.issues_tracker_id.to_s)
    end
  end

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

    if project.used_default_issues_tracker? || !external_issues_tracker_enabled?
      url = project_issue_url project_id: project, id: issue_iid
    else
      url = Gitlab.config.issues_tracker[project.issues_tracker]['issues_url']
      url.gsub(':id', issue_iid.to_s).
          gsub(':project_id', project.id.to_s).
          gsub(':issues_tracker_id', project.issues_tracker_id.to_s)
    end
  end

  def title_for_issue(issue_iid, project = @project)
    return '' if project.nil?

    if project.used_default_issues_tracker?
      issue = project.issues.where(iid: issue_iid).first
      return issue.title if issue
    end

    ''
  end

  def issue_timestamp(issue)
    # Shows the created at time and the updated at time if different
    ts = "#{time_ago_with_tooltip(issue.created_at, 'bottom', 'note_created_ago')}"
    if issue.updated_at != issue.created_at
      ts << capture_haml do
        haml_tag :small do
          haml_concat " (Edited #{time_ago_with_tooltip(issue.updated_at, 'bottom', 'issue_edited_ago')})"
        end
      end
    end
    ts.html_safe
  end

  # Checks if issues_tracker setting exists in gitlab.yml
  def external_issues_tracker_enabled?
    Gitlab.config.issues_tracker && Gitlab.config.issues_tracker.values.any?
  end

  def bulk_update_milestone_options
    options_for_select(['None (backlog)']) +
        options_from_collection_for_select(project_active_milestones, 'id',
                                           'title', params[:milestone_id])
  end

  def bulk_update_assignee_options(project = @project)
    options_for_select(['None (unassigned)']) +
        options_from_collection_for_select(project.team.members, 'id',
                                           'name', params[:assignee_id])
  end

  def assignee_options(object, project = @project)
    options_from_collection_for_select(project.team.members.sort_by(&:name),
                                       'id', 'name', object.assignee_id)
  end

  def milestone_options(object)
    options_from_collection_for_select(object.project.milestones.active,
                                       'id', 'title', object.milestone_id)
  end

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

  def issue_to_atom(xml, issue)
    xml.entry do
      xml.id      project_issue_url(issue.project, issue)
      xml.link    href: project_issue_url(issue.project, issue)
      xml.title   truncate(issue.title, length: 80)
      xml.updated issue.created_at.strftime("%Y-%m-%dT%H:%M:%SZ")
      xml.media   :thumbnail, width: "40", height: "40", 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
end