events_helper.rb 6.8 KB
Newer Older
1 2
module EventsHelper
  def link_to_author(event)
D
Dmitriy Zaporozhets 已提交
3
    author = event.author
4

D
Dmitriy Zaporozhets 已提交
5
    if author
J
Escape!  
Josh Frye 已提交
6
      link_to author.name, user_path(author.username), title: h(author.name)
7 8 9 10 11 12
    else
      event.author_name
    end
  end

  def event_action_name(event)
13 14 15 16 17 18 19 20 21
    target =  if event.target_type
                if event.note?
                  event.note_target_type
                else
                  event.target_type.titleize.downcase
                end
              else
                'project'
              end
22 23 24

    [event.action_name, target].join(" ")
  end
D
Dmitriy Zaporozhets 已提交
25

26
  def event_filter_link(key, tooltip)
27
    key = key.to_s
28 29
    active = 'active' if @event_filter.active?(key)
    link_opts = {
30
      class: "event-filter-link",
31 32 33
      id:    "#{key}_event_filter",
      title: "Filter by #{tooltip.downcase}",
    }
34

35 36 37 38
    content_tag :li, class: active do
      link_to request.path, link_opts do
        content_tag(:span, ' ' + tooltip)
      end
39 40
    end
  end
41 42 43

  def icon_for_event
    {
44 45 46 47
      EventFilter.push     => 'upload',
      EventFilter.merged   => 'check-square-o',
      EventFilter.comments => 'comments',
      EventFilter.team     => 'user',
48 49
    }
  end
50

51 52 53 54 55 56 57 58
  def event_preposition(event)
    if event.push? || event.commented? || event.target
      "at"
    elsif event.milestone?
      "in"
    end
  end

59
  def event_feed_title(event)
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
    words = []
    words << event.author_name
    words << event_action_name(event)

    if event.push?
      words << event.ref_type
      words << event.ref_name
      words << "at"
    elsif event.commented?
      if event.note_commit?
        words << event.note_short_commit_id
      else
        words << "##{truncate event.note_target_iid}"
      end
      words << "at"
75 76 77
    elsif event.milestone?
      words << "##{event.target_iid}" if event.target_iid
      words << "in"
78
    elsif event.target
79
      words << "##{event.target_iid}:"
80 81
      words << event.target.title if event.target.respond_to?(:title)
      words << "at"
82
    end
83 84 85 86

    words << event.project_name

    words.join(" ")
87 88 89 90
  end

  def event_feed_url(event)
    if event.issue?
V
Vinnie Okada 已提交
91 92
      namespace_project_issue_url(event.project.namespace, event.project,
                                  event.issue)
93
    elsif event.merge_request?
V
Vinnie Okada 已提交
94 95
      namespace_project_merge_request_url(event.project.namespace,
                                          event.project, event.merge_request)
96
    elsif event.note? && event.note_commit?
V
Vinnie Okada 已提交
97 98
      namespace_project_commit_url(event.project.namespace, event.project,
                                   event.note_target)
99 100 101
    elsif event.note?
      if event.note_target
        if event.note_commit?
V
Vinnie Okada 已提交
102 103 104
          namespace_project_commit_path(event.project.namespace, event.project,
                                        event.note_commit_id,
                                        anchor: dom_id(event.target))
105
        elsif event.note_project_snippet?
V
Vinnie Okada 已提交
106 107
          namespace_project_snippet_path(event.project.namespace,
                                         event.project, event.note_target)
108 109 110 111
        else
          event_note_target_path(event)
        end
      end
112
    elsif event.push?
113 114 115 116 117 118 119 120 121 122
      push_event_feed_url(event)
    end
  end

  def push_event_feed_url(event)
    if event.push_with_commits? && event.md_ref?
      if event.commits_count > 1
        namespace_project_compare_url(event.project.namespace, event.project,
                                      from: event.commit_from, to:
                                      event.commit_to)
123
      else
124 125
        namespace_project_commit_url(event.project.namespace, event.project,
                                     id: event.commit_to)
126
      end
127 128 129
    else
      namespace_project_commits_url(event.project.namespace, event.project,
                                    event.ref_name)
130 131 132 133 134 135 136 137
    end
  end

  def event_feed_summary(event)
    if event.issue?
      render "events/event_issue", issue: event.issue
    elsif event.push?
      render "events/event_push", event: event
138 139 140 141
    elsif event.merge_request?
      render "events/event_merge_request", merge_request: event.merge_request
    elsif event.note?
      render "events/event_note", note: event.note
142 143
    end
  end
144 145 146

  def event_note_target_path(event)
    if event.note? && event.note_commit?
V
Vinnie Okada 已提交
147 148
      namespace_project_commit_path(event.project.namespace, event.project,
                                    event.note_target)
149
    else
V
Vinnie Okada 已提交
150 151 152
      polymorphic_path([event.project.namespace.becomes(Namespace),
                        event.project, event.note_target],
                       anchor: dom_id(event.target))
153 154
    end
  end
155 156 157 158

  def event_note_title_html(event)
    if event.note_target
      if event.note_commit?
V
Vinnie Okada 已提交
159 160 161
        link_to(
          namespace_project_commit_path(event.project.namespace, event.project,
                                        event.note_commit_id,
J
Escape!  
Josh Frye 已提交
162
                                        anchor: dom_id(event.target), title: h(event.target_title)),
V
Vinnie Okada 已提交
163 164
          class: "commit_short_id"
        ) do
165 166 167
          "#{event.note_target_type} #{event.note_short_commit_id}"
        end
      elsif event.note_project_snippet?
V
Vinnie Okada 已提交
168 169
        link_to(namespace_project_snippet_path(event.project.namespace,
                                               event.project,
J
Escape!  
Josh Frye 已提交
170
                                               event.note_target), title: h(event.project.name)) do
171
          "#{event.note_target_type} #{truncate event.note_target.to_reference}"
172 173
        end
      else
J
Josh Frye 已提交
174
        link_to event_note_target_path(event) do
175
          "#{event.note_target_type} #{truncate event.note_target.to_reference}"
176 177 178 179 180 181 182 183
        end
      end
    else
      content_tag :strong do
        "(deleted)"
      end
    end
  end
D
Dmitriy Zaporozhets 已提交
184

185 186
  def event_note(text, options = {})
    text = first_line_in_markdown(text, 150, options)
187
    sanitize(text, tags: %w(a img b pre code p span))
D
Dmitriy Zaporozhets 已提交
188
  end
189 190 191 192 193 194

  def event_commit_title(message)
    escape_once(truncate(message.split("\n").first, length: 70))
  rescue
    "--broken encoding"
  end
D
Dmitriy Zaporozhets 已提交
195 196

  def event_to_atom(xml, event)
197
    if event.visible_to_user?(current_user)
D
Dmitriy Zaporozhets 已提交
198 199 200 201 202 203 204 205
      xml.entry do
        event_link = event_feed_url(event)
        event_title = event_feed_title(event)
        event_summary = event_feed_summary(event)

        xml.id      "tag:#{request.host},#{event.created_at.strftime("%Y-%m-%d")}:#{event.id}"
        xml.link    href: event_link
        xml.title   truncate(event_title, length: 80)
206
        xml.updated event.created_at.xmlschema
207
        xml.media   :thumbnail, width: "40", height: "40", url: image_url(avatar_icon(event.author_email))
D
Dmitriy Zaporozhets 已提交
208 209 210 211 212 213 214 215 216
        xml.author do |author|
          xml.name event.author_name
          xml.email event.author_email
        end

        xml.summary(type: "xhtml") { |x| x << event_summary unless event_summary.nil? }
      end
    end
  end
217 218 219 220 221 222 223 224

  def event_row_class(event)
    if event.body? || event.created_project?
      "event-block"
    else
      "event-inline"
    end
  end
225
end