application_helper.rb 5.86 KB
Newer Older
gitlabhq's avatar
gitlabhq committed
1
require 'digest/md5'
Sergey Linnik's avatar
Sergey Linnik committed
2
require 'uri'
Robert Speicher's avatar
Robert Speicher committed
3

gitlabhq's avatar
gitlabhq committed
4
module ApplicationHelper
5 6
  COLOR_SCHEMES = {
    1 => 'white',
7
    2 => 'dark',
8 9 10 11
    3 => 'solarized-dark',
    4 => 'monokai',
  }
  COLOR_SCHEMES.default = 'white'
12

13 14 15 16 17 18 19 20 21 22 23
  # Helper method to access the COLOR_SCHEMES
  #
  # The keys are the `color_scheme_ids`
  # The values are the `name` of the scheme.
  #
  # The preview images are `name-scheme-preview.png`
  # The stylesheets should use the css class `.name`
  def color_schemes
    COLOR_SCHEMES.freeze
  end

24 25
  # Check if a particular controller is the current one
  #
26 27
  # args - One or more controller names to check
  #
28 29 30
  # Examples
  #
  #   # On TreeController
31 32 33 34 35
  #   current_controller?(:tree)           # => true
  #   current_controller?(:commits)        # => false
  #   current_controller?(:commits, :tree) # => true
  def current_controller?(*args)
    args.any? { |v| v.to_s.downcase == controller.controller_name }
36 37
  end

Johannes Schleifenbaum's avatar
Johannes Schleifenbaum committed
38
  # Check if a particular action is the current one
Robert Speicher's avatar
Robert Speicher committed
39 40 41 42 43 44 45 46 47 48 49 50 51
  #
  # 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
  def current_action?(*args)
    args.any? { |v| v.to_s.downcase == action_name }
  end

52
  def avatar_icon(user_email = '', size = nil)
skv's avatar
skv committed
53
    user = User.find_by(email: user_email)
54 55 56 57 58 59 60
    if user && user.avatar.present?
      user.avatar.url
    else
      gravatar_icon(user_email, size)
    end
  end

61 62 63
  def gravatar_icon(user_email = '', size = nil)
    size = 40 if size.nil? || size <= 0

64
    if !Gitlab.config.gravatar.enabled || user_email.blank?
65
      '/assets/no_avatar.png'
66
    else
67
      gravatar_url = request.ssl? || gitlab_config.https ? Gitlab.config.gravatar.ssl_url : Gitlab.config.gravatar.plain_url
68
      user_email.strip!
Cyril's avatar
Cyril committed
69
      sprintf gravatar_url, hash: Digest::MD5.hexdigest(user_email.downcase), size: size
70
    end
gitlabhq's avatar
gitlabhq committed
71 72 73
  end

  def last_commit(project)
Nihad Abbasov's avatar
Nihad Abbasov committed
74
    if project.repo_exists?
75
      time_ago_with_tooltip(project.repository.commit.committed_date)
Nihad Abbasov's avatar
Nihad Abbasov committed
76
    else
gitlabhq's avatar
gitlabhq committed
77 78
      "Never"
    end
79
  rescue
gitlabhq's avatar
gitlabhq committed
80
    "Never"
gitlabhq's avatar
gitlabhq committed
81 82
  end

gitlabhq's avatar
gitlabhq committed
83
  def grouped_options_refs(destination = :tree)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
84 85
    repository = @project.repository

gitlabhq's avatar
gitlabhq committed
86
    options = [
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
87 88
      ["Branches", repository.branch_names],
      ["Tags", repository.tag_names]
gitlabhq's avatar
gitlabhq committed
89 90
    ]

Andrey Vakarev's avatar
Andrey Vakarev committed
91
    # If reference is commit id -
92
    # we should add it to branch/tag selectbox
93
    if(@ref && !options.flatten.include?(@ref) &&
94 95 96 97
       @ref =~ /^[0-9a-zA-Z]{6,52}$/)
      options << ["Commit", [@ref]]
    end

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
98
    grouped_options_for_select(options, @ref || @project.default_branch)
gitlabhq's avatar
gitlabhq committed
99 100
  end

101 102 103
  def emoji_autocomplete_source
    # should be an array of strings
    # so to_s can be called, because it is sufficient and to_json is too slow
Riyad Preukschas's avatar
Riyad Preukschas committed
104
    Emoji.names.to_s
105 106
  end

107
  def app_theme
108
    Gitlab::Theme.css_class_by_id(current_user.try(:theme_id))
109
  end
randx's avatar
randx committed
110

111
  def user_color_scheme_class
112
    COLOR_SCHEMES[current_user.try(:color_scheme_id)] if defined?(current_user)
113 114
  end

115 116
  # Define whenever show last push event
  # with suggestion to create MR
randx's avatar
randx committed
117
  def show_last_push_widget?(event)
118 119 120 121 122 123 124 125 126 127 128
    # 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?

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

132
    true
randx's avatar
randx committed
133
  end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
134

135 136 137
  def hexdigest(string)
    Digest::SHA1.hexdigest string
  end
138

Florian Unglaub's avatar
Florian Unglaub committed
139
  def authbutton(provider, size = 64)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
140 141 142
    file_name = "#{provider.to_s.split('_').first}_#{size}.png"
    image_tag("authbuttons/#{file_name}",
              alt: "Sign in with #{provider.to_s.titleize}")
Florian Unglaub's avatar
Florian Unglaub committed
143
  end
144

145
  def simple_sanitize(str)
146 147 148
    sanitize(str, tags: %w(a span))
  end

149
  def image_url(source)
150 151
    # prevent relative_root_path being added twice (it's part of root_url and path_to_image)
    root_url.sub(/#{root_path}$/, path_to_image(source))
152
  end
153

154
  alias_method :url_to_image, :image_url
155

156
  def users_select_tag(id, opts = {})
157 158
    css_class = "ajax-users-select "
    css_class << "multiselect " if opts[:multiple]
159
    css_class << (opts[:class] || '')
160 161 162
    value = opts[:selected] || ''

    hidden_field_tag(id, value, class: css_class)
163
  end
164 165

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

    [namespace, controller.controller_name, controller.action_name].compact.join(":")
170
  end
171 172 173 174 175 176 177 178 179 180

  # shortcut for gitlab config
  def gitlab_config
    Gitlab.config.gitlab
  end

  # shortcut for gitlab extra config
  def extra_config
    Gitlab.config.extra
  end
181

182 183 184 185 186 187 188 189 190
  def search_placeholder
    if @project && @project.persisted?
      "Search in this project"
    elsif @group && @group.persisted?
      "Search in this group"
    else
      "Search"
    end
  end
191 192 193 194 195 196 197

  def first_line(str)
    lines = str.split("\n")
    line = lines.first
    line += "..." if lines.size > 1
    line
  end
198 199 200 201

  def broadcast_message
    BroadcastMessage.current
  end
202 203 204 205 206 207 208 209

  def highlight_js(&block)
    string = capture(&block)

    content_tag :div, class: user_color_scheme_class do
      Pygments::Lexer[:js].highlight(string).html_safe
    end
  end
210 211 212

  def time_ago_with_tooltip(date, placement = 'top', html_class = 'time_ago')
    capture_haml do
213 214
      haml_tag :time, date.to_s,
        class: html_class, datetime: date.getutc.iso8601, title: date.stamp("Aug 21, 2011 9:23pm"),
215 216
        data: { toggle: 'tooltip', placement: placement }

217
      haml_tag :script, "$('." + html_class + "').timeago().tooltip()"
218 219
    end.html_safe
  end
220 221 222 223

  def render_markup(file_name, file_content)
    GitHub::Markup.render(file_name, file_content).html_safe
  end
gitlabhq's avatar
gitlabhq committed
224
end