issues_helper.rb 4.33 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

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

skv's avatar
skv committed
19 20
    if project.used_default_issues_tracker? || !external_issues_tracker_enabled?
      project_issues_path(project)
21
    else
skv's avatar
skv committed
22 23 24
      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)
25 26 27
    end
  end

skv's avatar
skv committed
28 29
  def url_for_new_issue(project = @project)
    return '' if project.nil?
30

skv's avatar
skv committed
31 32
    if project.used_default_issues_tracker? || !external_issues_tracker_enabled?
      url = new_project_issue_path project_id: project
33
    else
skv's avatar
skv committed
34 35 36 37
      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)
38 39 40
    end
  end

skv's avatar
skv committed
41 42
  def url_for_issue(issue_iid, project = @project)
    return '' if project.nil?
Andrew8xx8's avatar
Andrew8xx8 committed
43

skv's avatar
skv committed
44 45
    if project.used_default_issues_tracker? || !external_issues_tracker_enabled?
      url = project_issue_url project_id: project, id: issue_iid
46
    else
skv's avatar
skv committed
47 48 49 50
      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)
51 52 53
    end
  end

skv's avatar
skv committed
54 55
  def title_for_issue(issue_iid, project = @project)
    return '' if project.nil?
Andrew8xx8's avatar
Andrew8xx8 committed
56

skv's avatar
skv committed
57 58 59
    if project.used_default_issues_tracker?
      issue = project.issues.where(iid: issue_iid).first
      return issue.title if issue
60
    end
skv's avatar
skv committed
61 62

    ''
63
  end
64

65 66 67 68 69 70 71 72 73 74 75 76 77
  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

78 79
  # Checks if issues_tracker setting exists in gitlab.yml
  def external_issues_tracker_enabled?
skv's avatar
skv committed
80
    Gitlab.config.issues_tracker && Gitlab.config.issues_tracker.values.any?
81
  end
82 83

  def bulk_update_milestone_options
skv's avatar
skv committed
84 85 86
    options_for_select(['None (backlog)']) +
        options_from_collection_for_select(project_active_milestones, 'id',
                                           'title', params[:milestone_id])
87 88
  end

skv's avatar
skv committed
89 90 91 92
  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])
93
  end
94

skv's avatar
skv committed
95 96 97
  def assignee_options(object, project = @project)
    options_from_collection_for_select(project.team.members.sort_by(&:name),
                                       'id', 'name', object.assignee_id)
98 99
  end

100
  def milestone_options(object)
skv's avatar
skv committed
101 102
    options_from_collection_for_select(object.project.milestones.active,
                                       'id', 'title', object.milestone_id)
103
  end
104

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
105 106 107 108 109 110 111
  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'
112
    else
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
113
      'issue-box-open'
114 115
    end
  end
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130

  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
gitlabhq's avatar
gitlabhq committed
131
end