Module: ApplicationHelper

Included in:
Projects::NetworkController
Defined in:
app/helpers/application_helper.rb

Instance Method Summary collapse

Instance Method Details

#asciidoc?(filename) ⇒ Boolean

Returns:

  • (Boolean)

243
244
245
# File 'app/helpers/application_helper.rb', line 243

def asciidoc?(filename)
  Gitlab::MarkupHelper.asciidoc?(filename)
end

#avatar_icon(user_or_email = nil, size = nil, scale = 2) ⇒ Object


71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'app/helpers/application_helper.rb', line 71

def avatar_icon(user_or_email = nil, size = nil, scale = 2)
  if user_or_email.is_a?(User)
    user = user_or_email
  else
    user = User.find_by_any_email(user_or_email.try(:downcase))
  end

  if user
    user.avatar_url(size) || default_avatar
  else
    gravatar_icon(user_or_email, size, scale)
  end
end

#body_data_pageObject


149
150
151
152
153
154
# File 'app/helpers/application_helper.rb', line 149

def body_data_page
  path = controller.controller_path.split('/')
  namespace = path.first if path.second

  [namespace, controller.controller_name, controller.action_name].compact.join(':')
end

#current_action?(*args) ⇒ Boolean

Check if a particular action is the current one

args - One or more action names to check

Examples

# On Projects#new
current_action?(:new)           # => true
current_action?(:create)        # => false
current_action?(:new, :create)  # => true

Returns:

  • (Boolean)

31
32
33
# File 'app/helpers/application_helper.rb', line 31

def current_action?(*args)
  args.any? { |v| v.to_s.downcase == action_name }
end

#current_controller?(*args) ⇒ Boolean

Check if a particular controller is the current one

args - One or more controller names to check

Examples

# On TreeController
current_controller?(:tree)           # => true
current_controller?(:commits)        # => false
current_controller?(:commits, :tree) # => true

Returns:

  • (Boolean)

15
16
17
18
19
# File 'app/helpers/application_helper.rb', line 15

def current_controller?(*args)
  args.any? do |v|
    v.to_s.downcase == controller.controller_name || v.to_s.downcase == controller.controller_path
  end
end

#default_avatarObject


90
91
92
# File 'app/helpers/application_helper.rb', line 90

def default_avatar
  'no_avatar.png'
end

#edited_time_ago_with_tooltip(object, placement: 'top', html_class: 'time_ago', include_author: false) ⇒ Object


199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
# File 'app/helpers/application_helper.rb', line 199

def edited_time_ago_with_tooltip(object, placement: 'top', html_class: 'time_ago', include_author: false)
  return if object.updated_at == object.created_at

   :small, class: "edited-text" do
    output = (:span, "Edited ")
    output << time_ago_with_tooltip(object.updated_at, placement: placement, html_class: html_class)

    if include_author && object.updated_by && object.updated_by != object.author
      output << (:span, " by ")
      output << link_to_member(object.project, object.updated_by, avatar: false, author_class: nil)
    end

    output
  end
end

#extra_configObject

shortcut for gitlab extra config


162
163
164
# File 'app/helpers/application_helper.rb', line 162

def extra_config
  Gitlab.config.extra
end

#gitlab_configObject

shortcut for gitlab config


157
158
159
# File 'app/helpers/application_helper.rb', line 157

def gitlab_config
  Gitlab.config.gitlab
end

#gitlab_markdown?(filename) ⇒ Boolean

Returns:

  • (Boolean)

239
240
241
# File 'app/helpers/application_helper.rb', line 239

def gitlab_markdown?(filename)
  Gitlab::MarkupHelper.gitlab_markdown?(filename)
end

#gravatar_icon(user_email = '', size = nil, scale = 2) ⇒ Object


85
86
87
88
# File 'app/helpers/application_helper.rb', line 85

def gravatar_icon(user_email = '', size = nil, scale = 2)
  GravatarService.new.execute(user_email, size, scale) ||
    default_avatar
end

#grouped_options_refsObject


104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'app/helpers/application_helper.rb', line 104

def grouped_options_refs
  repository = @project.repository

  options = [
    ['Branches', repository.branch_names],
    ['Tags', VersionSorter.rsort(repository.tag_names)]
  ]

  # If reference is commit id - we should add it to branch/tag selectbox
  if(@ref && !options.flatten.include?(@ref) &&
     @ref =~ /\A[0-9a-zA-Z]{6,52}\z/)
    options << ['Commit', [@ref]]
  end

  grouped_options_for_select(options, @ref || @project.default_branch)
end

#hexdigest(string) ⇒ Object


141
142
143
# File 'app/helpers/application_helper.rb', line 141

def hexdigest(string)
  Digest::SHA1.hexdigest string
end

#last_commit(project) ⇒ Object


94
95
96
97
98
99
100
101
102
# File 'app/helpers/application_helper.rb', line 94

def last_commit(project)
  if project.repo_exists?
    time_ago_with_tooltip(project.repository.commit.committed_date)
  else
    'Never'
  end
rescue
  'Never'
end

#markup?(filename) ⇒ Boolean

Returns:

  • (Boolean)

235
236
237
# File 'app/helpers/application_helper.rb', line 235

def markup?(filename)
  Gitlab::MarkupHelper.markup?(filename)
end

#outdated_browser?Boolean

Returns:

  • (Boolean)

288
289
290
# File 'app/helpers/application_helper.rb', line 288

def outdated_browser?
  browser.ie? && browser.version.to_i < 10
end

#page_filter_path(options = {}) ⇒ Object


255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
# File 'app/helpers/application_helper.rb', line 255

def page_filter_path(options = {})
  without = options.delete(:without)
  add_label = options.delete(:label)

  exist_opts = {
    state: params[:state],
    scope: params[:scope],
    milestone_title: params[:milestone_title],
    assignee_id: params[:assignee_id],
    author_id: params[:author_id],
    sort: params[:sort],
  }

  options = exist_opts.merge(options)

  if without.present?
    without.each do |key|
      options.delete(key)
    end
  end

  path = request.path
  path << "?#{options.to_param}"
  if add_label
    if params[:label_name].present? and params[:label_name].respond_to?('any?')
      params[:label_name].each do |label|
        path << "&label_name[]=#{label}"
      end
    end
  end
  path
end

#path_to_key(key, admin = false) ⇒ Object


292
293
294
295
296
297
298
# File 'app/helpers/application_helper.rb', line 292

def path_to_key(key, admin = false)
  if admin
    admin_user_key_path(@user, key)
  else
    profile_key_path(key)
  end
end

#plain?(filename) ⇒ Boolean

Returns:

  • (Boolean)

231
232
233
# File 'app/helpers/application_helper.rb', line 231

def plain?(filename)
  Gitlab::MarkupHelper.plain?(filename)
end

#project_icon(project_id, options = {}) ⇒ Object


35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'app/helpers/application_helper.rb', line 35

def project_icon(project_id, options = {})
  project =
    if project_id.is_a?(Project)
      project_id
    else
      Project.find_with_namespace(project_id)
    end

  if project.avatar_url
    image_tag project.avatar_url, options
  else # generated icon
    project_identicon(project, options)
  end
end

#project_identicon(project, options = {}) ⇒ Object


50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'app/helpers/application_helper.rb', line 50

def project_identicon(project, options = {})
  allowed_colors = {
    red: 'FFEBEE',
    purple: 'F3E5F5',
    indigo: 'E8EAF6',
    blue: 'E3F2FD',
    teal: 'E0F2F1',
    orange: 'FBE9E7',
    gray: 'EEEEEE'
  }

  options[:class] ||= ''
  options[:class] << ' identicon'
  bg_key = project.id % 7
  style = "background-color: ##{allowed_colors.values[bg_key]}; color: #555"

  (:div, class: options[:class], style: style) do
    project.name[0, 1].upcase
  end
end

#promo_hostObject


247
248
249
# File 'app/helpers/application_helper.rb', line 247

def promo_host
  'about.gitlab.com'
end

#promo_urlObject


251
252
253
# File 'app/helpers/application_helper.rb', line 251

def promo_url
  'https://' + promo_host
end

#render_markup(file_name, file_content) ⇒ Object


215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
# File 'app/helpers/application_helper.rb', line 215

def render_markup(file_name, file_content)
  if gitlab_markdown?(file_name)
    Haml::Helpers.preserve(markdown(file_content))
  elsif asciidoc?(file_name)
    asciidoc(file_content)
  elsif plain?(file_name)
     :pre, class: 'plain-readme' do
      file_content
    end
  else
    other_markup(file_name, file_content)
  end
rescue RuntimeError
  simple_format(file_content)
end

#show_last_push_widget?(event) ⇒ Boolean

Define whenever show last push event with suggestion to create MR

Returns:

  • (Boolean)

123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'app/helpers/application_helper.rb', line 123

def show_last_push_widget?(event)
  # Skip if event is not about added or modified non-master branch
  return false unless event && event.last_push_to_non_root? && !event.rm_ref?

  project = event.project

  # Skip if project repo is empty or MR disabled
  return false unless project && !project.empty_repo? && project.merge_requests_enabled

  # Skip if user already created appropriate MR
  return false if project.merge_requests.where(source_branch: event.branch_name).opened.any?

  # Skip if user removed branch right after that
  return false unless project.repository.branch_names.include?(event.branch_name)

  true
end

#simple_sanitize(str) ⇒ Object


145
146
147
# File 'app/helpers/application_helper.rb', line 145

def simple_sanitize(str)
  sanitize(str, tags: %w(a span))
end

#state_filters_text_for(entity, project) ⇒ Object


300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
# File 'app/helpers/application_helper.rb', line 300

def state_filters_text_for(entity, project)
  titles = {
    opened: "Open"
  }

  entity_title = titles[entity] || entity.to_s.humanize

  count =
    if project.nil?
      nil
    elsif current_controller?(:issues)
      project.issues.visible_to_user(current_user).send(entity).count
    elsif current_controller?(:merge_requests)
      project.merge_requests.send(entity).count
    end

  html =  :span, entity_title

  if count.present?
    html += " "
    html +=  :span, number_with_delimiter(count), class: 'badge'
  end

  html.html_safe
end

#time_ago_with_tooltip(time, placement: 'top', html_class: 'time_ago', skip_js: false) ⇒ Object

Render a `time` element with Javascript-based relative date and tooltip

time - Time object placement - Tooltip placement String (default: “top”) html_class - Custom class for `time` element (default: “time_ago”) skip_js - When true, exclude the `script` tag (default: false)

By default also includes a `script` element with Javascript necessary to initialize the `timeago` jQuery extension. If this method is called many times, for example rendering hundreds of commits, it's advisable to disable this behavior using the `skip_js` argument and re-initializing `timeago` manually once all of the elements have been rendered.

A `js-timeago` class is always added to the element, even when a custom `html_class` argument is provided.

Returns an HTML-safe String


183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
# File 'app/helpers/application_helper.rb', line 183

def time_ago_with_tooltip(time, placement: 'top', html_class: 'time_ago', skip_js: false)
  element =  :time, time.to_s,
    class: "#{html_class} js-timeago #{"js-timeago-pending" unless skip_js}",
    datetime: time.to_time.getutc.iso8601,
    title: time.to_time.in_time_zone.to_s(:medium),
    data: { toggle: 'tooltip', placement: placement, container: 'body' }

  unless skip_js
    element << javascript_tag(
      "$('.js-timeago-pending').removeClass('js-timeago-pending').timeago()"
    )
  end

  element
end

#truncate_first_line(message, length = 50) ⇒ Object


326
327
328
# File 'app/helpers/application_helper.rb', line 326

def truncate_first_line(message, length = 50)
  truncate(message.each_line.first.chomp, length: length) if message
end