events_helper.rb 7.2 KB
Newer Older
1 2
# frozen_string_literal: true

3
module EventsHelper
4
  ICON_NAMES_BY_EVENT_TYPE = {
5 6
    'pushed to' => 'commit',
    'pushed new' => 'commit',
7
    'updated' => 'commit',
8 9 10 11 12 13
    'created' => 'status_open',
    'opened' => 'status_open',
    'closed' => 'status_closed',
    'accepted' => 'fork',
    'commented on' => 'comment',
    'deleted' => 'remove',
14
    'destroyed' => 'remove',
15 16
    'imported' => 'import',
    'joined' => 'users'
17 18
  }.freeze

19
  def link_to_author(event, self_added: false)
D
Dmitriy Zaporozhets 已提交
20
    author = event.author
21

D
Dmitriy Zaporozhets 已提交
22
    if author
23 24
      name = self_added ? 'You' : author.name
      link_to name, user_path(author.username), title: name
25
    else
26
      escape_once(event.author_name)
27 28 29 30
    end
  end

  def event_action_name(event)
31 32 33 34 35 36 37 38 39
    target =  if event.target_type
                if event.note?
                  event.note_target_type
                else
                  event.target_type.titleize.downcase
                end
              else
                'project'
              end
40 41 42

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

44
  def event_filter_link(key, text, tooltip)
45
    key = key.to_s
46 47
    active = 'active' if @event_filter.active?(key)
    link_opts = {
48
      class: "event-filter-link",
49
      id:    "#{key}_event_filter",
50
      title: tooltip
51
    }
52

53 54
    content_tag :li, class: active do
      link_to request.path, link_opts do
55
        content_tag(:span, ' ' + text)
56
      end
57 58
    end
  end
59

60
  def event_filter_visible(feature_key)
61 62
    return true unless @project

63
    @project.feature_available?(feature_key, current_user)
64 65
  end

66 67 68 69 70 71
  def comments_visible?
    event_filter_visible(:repository) ||
      event_filter_visible(:merge_requests) ||
      event_filter_visible(:issues)
  end

72
  def event_preposition(event)
73 74
    if event.wiki_page?
      'in the wiki for'
75
    elsif event.milestone?
76 77 78
      'in'
    elsif event.push_action? || event.commented_action? || event.target
      'at'
79 80 81
    end
  end

82
  def event_feed_title(event)
83 84 85 86
    words = []
    words << event.author_name
    words << event_action_name(event)

87
    if event.push_action?
88 89 90
      words << event.ref_type
      words << event.ref_name
      words << "at"
91
    elsif event.commented_action?
92
      words << event.note_target_reference
93
      words << "at"
94 95 96
    elsif event.milestone?
      words << "##{event.target_iid}" if event.target_iid
      words << "in"
97
    elsif event.target
98 99 100 101 102 103 104 105
      prefix =
        if event.merge_request?
          MergeRequest.reference_prefix
        else
          Issue.reference_prefix
        end

      words << "#{prefix}#{event.target_iid}:" if event.target_iid
106 107
      words << event.target.title if event.target.respond_to?(:title)
      words << "at"
108
    end
109

J
Jan Provaznik 已提交
110
    words << event.resource_parent_name
111 112

    words.join(" ")
113 114 115 116
  end

  def event_feed_url(event)
    if event.issue?
117
      project_issue_url(event.project,
V
Vinnie Okada 已提交
118
                                  event.issue)
119
    elsif event.merge_request?
120
      project_merge_request_url(event.project, event.merge_request)
121
    elsif event.commit_note?
122
      project_commit_url(event.project,
V
Vinnie Okada 已提交
123
                                   event.note_target)
124 125
    elsif event.note?
      if event.note_target
126
        event_note_target_url(event)
127
      end
128
    elsif event.push_action?
129
      push_event_feed_url(event)
130
    elsif event.created_project_action?
131
      project_url(event.project)
132 133 134 135 136 137
    end
  end

  def push_event_feed_url(event)
    if event.push_with_commits? && event.md_ref?
      if event.commits_count > 1
138
        project_compare_url(event.project,
139 140
                                      from: event.commit_from, to:
                                      event.commit_to)
141
      else
142
        project_commit_url(event.project,
143
                                     id: event.commit_to)
144
      end
145
    else
146
      project_commits_url(event.project,
147
                                    event.ref_name)
148 149 150 151 152 153
    end
  end

  def event_feed_summary(event)
    if event.issue?
      render "events/event_issue", issue: event.issue
154
    elsif event.push_action?
155
      render "events/event_push", event: event
156 157 158 159
    elsif event.merge_request?
      render "events/event_merge_request", merge_request: event.merge_request
    elsif event.note?
      render "events/event_note", note: event.note
160 161
    end
  end
162

163
  def event_note_target_url(event)
164
    if event.commit_note?
165
      project_commit_url(event.project, event.note_target, anchor: dom_id(event.target))
166
    elsif event.project_snippet_note?
167
      project_snippet_url(event.project, event.note_target, anchor: dom_id(event.target))
168 169 170 171
    elsif event.issue_note?
      project_issue_url(event.project, id: event.note_target, anchor: dom_id(event.target))
    elsif event.merge_request_note?
      project_merge_request_url(event.project, id: event.note_target, anchor: dom_id(event.target))
172 173
    elsif event.design_note?
      design_url(event.note_target, anchor: dom_id(event.note))
174
    else
175 176
      polymorphic_url([event.project.namespace.becomes(Namespace),
                       event.project, event.note_target],
177
                        anchor: dom_id(event.target))
178 179
    end
  end
180

181 182 183 184 185 186 187 188 189 190 191 192 193
  def event_wiki_title_html(event)
    capture do
      concat content_tag(:span, _('wiki page'), class: "event-target-type append-right-4")
      concat link_to(event.target_title, event_wiki_page_target_url(event),
                     title: event.target_title,
                     class: 'has-tooltip event-target-link append-right-4')
    end
  end

  def event_wiki_page_target_url(event)
    project_wiki_url(event.project, event.target.canonical_slug)
  end

194 195
  def event_note_title_html(event)
    if event.note_target
196 197 198 199
      capture do
        concat content_tag(:span, event.note_target_type, class: "event-target-type append-right-4")
        concat link_to(event.note_target_reference, event_note_target_url(event), title: event.target_title, class: 'has-tooltip event-target-link append-right-4')
      end
200
    else
201
      content_tag(:strong, '(deleted)')
202 203
    end
  end
D
Dmitriy Zaporozhets 已提交
204

205
  def event_commit_title(message)
206
    message ||= ''
207
    (message.split("\n").first || "").truncate(70)
208 209 210
  rescue
    "--broken encoding"
  end
D
Dmitriy Zaporozhets 已提交
211

212
  def icon_for_event(note, size: 24)
213
    icon_name = ICON_NAMES_BY_EVENT_TYPE[note]
214
    sprite_icon(icon_name, size: size) if icon_name
215 216 217 218 219 220 221 222 223
  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
224 225 226 227 228 229 230 231 232
        author_avatar(event, size: 40)
      end
    end
  end

  def inline_event_icon(event)
    unless current_path?('users#show')
      content_tag :span, class: "system-note-image-inline d-none d-sm-flex append-right-4 #{event.action_name.parameterize}-icon align-self-center" do
        icon_for_event(event.action_name, size: 14)
233 234 235
      end
    end
  end
236 237 238 239 240 241 242 243

  def event_user_info(event)
    content_tag(:div, class: "event-user-info") do
      concat content_tag(:span, link_to_author(event), class: "author_name")
      concat "&nbsp;".html_safe
      concat content_tag(:span, event.author.to_reference, class: "username")
    end
  end
244 245 246 247 248 249 250 251 252 253

  private

  def design_url(design, opts)
    designs_project_issue_url(
      design.project,
      design.issue,
      opts.merge(vueroute: design.filename)
    )
  end
254
end
J
Jan Provaznik 已提交
255 256

EventsHelper.prepend_if_ee('EE::EventsHelper')