events_helper.rb 6.2 KB
Newer Older
1
module EventsHelper
2 3 4 5 6 7 8 9 10 11 12
  ICON_NAMES_BY_EVENT_TYPE = {
    'pushed to' => 'icon_commit',
    'pushed new' => 'icon_commit',
    'created' => 'icon_status_open',
    'opened' => 'icon_status_open',
    'closed' => 'icon_status_closed',
    'accepted' => 'icon_code_fork',
    'commented on' => 'icon_comment_o',
    'deleted' => 'icon_trash_o'
  }.freeze

13
  def link_to_author(event, self_added: false)
D
Dmitriy Zaporozhets 已提交
14
    author = event.author
15

D
Dmitriy Zaporozhets 已提交
16
    if author
17 18
      name = self_added ? 'You' : author.name
      link_to name, user_path(author.username), title: name
19 20 21 22 23 24
    else
      event.author_name
    end
  end

  def event_action_name(event)
25 26 27 28 29 30 31 32 33
    target =  if event.target_type
                if event.note?
                  event.note_target_type
                else
                  event.target_type.titleize.downcase
                end
              else
                'project'
              end
34 35 36

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

38
  def event_filter_link(key, tooltip)
39
    key = key.to_s
40 41
    active = 'active' if @event_filter.active?(key)
    link_opts = {
42
      class: "event-filter-link",
43
      id:    "#{key}_event_filter",
44
      title: "Filter by #{tooltip.downcase}"
45
    }
46

47 48 49 50
    content_tag :li, class: active do
      link_to request.path, link_opts do
        content_tag(:span, ' ' + tooltip)
      end
51 52
    end
  end
53

54
  def event_filter_visible(feature_key)
55 56
    return true unless @project

57
    @project.feature_available?(feature_key, current_user)
58 59
  end

60 61 62 63 64 65
  def comments_visible?
    event_filter_visible(:repository) ||
      event_filter_visible(:merge_requests) ||
      event_filter_visible(:issues)
  end

66 67 68 69 70 71 72 73
  def event_preposition(event)
    if event.push? || event.commented? || event.target
      "at"
    elsif event.milestone?
      "in"
    end
  end

74
  def event_feed_title(event)
75 76 77 78 79 80 81 82 83
    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?
84
      words << event.note_target_reference
85
      words << "at"
86 87 88
    elsif event.milestone?
      words << "##{event.target_iid}" if event.target_iid
      words << "in"
89
    elsif event.target
90
      words << "##{event.target_iid}:"
91 92
      words << event.target.title if event.target.respond_to?(:title)
      words << "at"
93
    end
94 95 96 97

    words << event.project_name

    words.join(" ")
98 99 100 101
  end

  def event_feed_url(event)
    if event.issue?
V
Vinnie Okada 已提交
102 103
      namespace_project_issue_url(event.project.namespace, event.project,
                                  event.issue)
104
    elsif event.merge_request?
V
Vinnie Okada 已提交
105 106
      namespace_project_merge_request_url(event.project.namespace,
                                          event.project, event.merge_request)
107
    elsif event.commit_note?
V
Vinnie Okada 已提交
108 109
      namespace_project_commit_url(event.project.namespace, event.project,
                                   event.note_target)
110 111
    elsif event.note?
      if event.note_target
112
        event_note_target_path(event)
113
      end
114
    elsif event.push?
115 116 117 118 119 120 121 122 123 124
      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)
125
      else
126 127
        namespace_project_commit_url(event.project.namespace, event.project,
                                     id: event.commit_to)
128
      end
129 130 131
    else
      namespace_project_commits_url(event.project.namespace, event.project,
                                    event.ref_name)
132 133 134 135 136 137 138 139
    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
140 141 142 143
    elsif event.merge_request?
      render "events/event_merge_request", merge_request: event.merge_request
    elsif event.note?
      render "events/event_note", note: event.note
144 145
    end
  end
146 147

  def event_note_target_path(event)
148
    if event.commit_note?
149 150 151 152 153 154 155 156 157
      namespace_project_commit_path(event.project.namespace,
                                    event.project,
                                    event.note_target,
                                    anchor: dom_id(event.target))
    elsif event.project_snippet_note?
      namespace_project_snippet_path(event.project.namespace,
                                     event.project,
                                     event.note_target,
                                     anchor: dom_id(event.target))
158
    else
V
Vinnie Okada 已提交
159 160
      polymorphic_path([event.project.namespace.becomes(Namespace),
                        event.project, event.note_target],
161
                        anchor: dom_id(event.target))
162 163
    end
  end
164 165 166

  def event_note_title_html(event)
    if event.note_target
167 168 169 170 171 172 173 174
      text = raw("#{event.note_target_type} ") +
        if event.commit_note?
          content_tag(:span, event.note_target_reference, class: 'commit-sha')
        else
          event.note_target_reference
        end

      link_to(text, event_note_target_path(event), title: event.target_title, class: 'has-tooltip')
175
    else
176
      content_tag(:strong, '(deleted)')
177 178
    end
  end
D
Dmitriy Zaporozhets 已提交
179

180 181
  def event_note(text, options = {})
    text = first_line_in_markdown(text, 150, options)
182 183 184

    sanitize(
      text,
185 186
      tags: %w(a img gl-emoji b pre code p span),
      attributes: Rails::Html::WhiteListSanitizer.allowed_attributes + ['style', 'data-name', 'data-unicode-version']
187
    )
D
Dmitriy Zaporozhets 已提交
188
  end
189 190

  def event_commit_title(message)
191
    (message.split("\n").first || "").truncate(70)
192 193 194
  rescue
    "--broken encoding"
  end
D
Dmitriy Zaporozhets 已提交
195

196
  def event_row_class(event)
197
    if event.body?
198 199 200 201 202
      "event-block"
    else
      "event-inline"
    end
  end
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219

  def icon_for_event(note)
    icon_name = ICON_NAMES_BY_EVENT_TYPE[note]
    custom_icon(icon_name) if icon_name
  end

  def icon_for_profile_event(event)
    if current_path?('users#show')
      content_tag :div, class: "system-note-image #{event.action_name.parameterize}-icon" do
        icon_for_event(event.action_name)
      end
    else
      content_tag :div, class: 'system-note-image user-avatar' do
        author_avatar(event, size: 32)
      end
    end
  end
220
end