application_helper.rb 8.15 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 53 54 55 56 57 58 59 60
  def avatar_icon(user_email = '', size = nil)
    user = User.find_by_email(user_email)
    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 66
      'no_avatar.png'
    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_in_words(project.repository.commit.committed_date) + " ago"
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
      ["Branch", repository.branch_names ],
      [ "Tag", 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

gitlabhq's avatar
gitlabhq committed
101
  def search_autocomplete_source
102 103
    return unless current_user

104
    projects = current_user.authorized_projects.map { |p| { label: "project: #{simple_sanitize(p.name_with_namespace)}", url: project_path(p) } }
105
    groups = current_user.authorized_groups.map { |group| { label: "group: #{simple_sanitize(group.name)}", url: group_path(group) } }
106

gitlabhq's avatar
gitlabhq committed
107
    default_nav = [
108
      { label: "My Profile settings", url: profile_path },
109
      { label: "My SSH Keys", url: profile_keys_path },
110 111
      { label: "My Dashboard", url: root_path },
      { label: "Admin Section", url: admin_root_path },
gitlabhq's avatar
gitlabhq committed
112 113
    ]

114
    help_nav = [
115 116 117 118 119 120 121 122 123
      { label: "help: API Help", url: help_api_path },
      { label: "help: Markdown Help", url: help_markdown_path },
      { label: "help: Permissions Help", url: help_permissions_path },
      { label: "help: Public Access Help", url: help_public_access_path },
      { label: "help: Rake Tasks Help", url: help_raketasks_path },
      { label: "help: SSH Keys Help", url: help_ssh_path },
      { label: "help: System Hooks Help", url: help_system_hooks_path },
      { label: "help: Web Hooks Help", url: help_web_hooks_path },
      { label: "help: Workflow Help", url: help_workflow_path },
124
    ]
gitlabhq's avatar
gitlabhq committed
125

126
    project_nav = []
127
    if @project && @project.repository.exists? && @project.repository.root_ref
gitlabhq's avatar
gitlabhq committed
128
      project_nav = [
129
        { label: "#{simple_sanitize(@project.name_with_namespace)} - Files",    url: project_tree_path(@project, @ref || @project.repository.root_ref) },
130
        { label: "#{simple_sanitize(@project.name_with_namespace)} - Commits",  url: project_commits_path(@project, @ref || @project.repository.root_ref) },
131 132 133
        { label: "#{simple_sanitize(@project.name_with_namespace)} - Network",  url: project_network_path(@project, @ref || @project.repository.root_ref) },
        { label: "#{simple_sanitize(@project.name_with_namespace)} - Graph",    url: project_graph_path(@project, @ref || @project.repository.root_ref) },
        { label: "#{simple_sanitize(@project.name_with_namespace)} - Issues",   url: project_issues_path(@project) },
134 135 136 137
        { label: "#{simple_sanitize(@project.name_with_namespace)} - Merge Requests", url: project_merge_requests_path(@project) },
        { label: "#{simple_sanitize(@project.name_with_namespace)} - Milestones", url: project_milestones_path(@project) },
        { label: "#{simple_sanitize(@project.name_with_namespace)} - Snippets", url: project_snippets_path(@project) },
        { label: "#{simple_sanitize(@project.name_with_namespace)} - Team",     url: project_team_index_path(@project) },
138
        { label: "#{simple_sanitize(@project.name_with_namespace)} - Wall",     url: project_wall_path(@project) },
139
        { label: "#{simple_sanitize(@project.name_with_namespace)} - Wiki",     url: project_wikis_path(@project) },
gitlabhq's avatar
gitlabhq committed
140 141 142
      ]
    end

143
    [groups, projects, default_nav, project_nav, help_nav].flatten.to_json
gitlabhq's avatar
gitlabhq committed
144 145
  end

146 147 148
  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
149
    Emoji.names.to_s
150 151
  end

152
  def app_theme
153
    Gitlab::Theme.css_class_by_id(current_user.try(:theme_id))
154
  end
randx's avatar
randx committed
155

156
  def user_color_scheme_class
157
    COLOR_SCHEMES[current_user.try(:color_scheme_id)] if defined?(current_user)
158 159
  end

160 161
  # Define whenever show last push event
  # with suggestion to create MR
randx's avatar
randx committed
162
  def show_last_push_widget?(event)
163 164 165 166 167 168 169 170 171 172 173 174
    # 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?

    true
randx's avatar
randx committed
175
  end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
176

177 178 179
  def hexdigest(string)
    Digest::SHA1.hexdigest string
  end
180 181

  def project_last_activity project
182 183
    if project.last_activity_at
      time_ago_in_words(project.last_activity_at) + " ago"
184 185 186 187
    else
      "Never"
    end
  end
188

Florian Unglaub's avatar
Florian Unglaub committed
189
  def authbutton(provider, size = 64)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
190 191 192
    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
193
  end
194

195 196 197 198
  def simple_sanitize str
    sanitize(str, tags: %w(a span))
  end

199
  def image_url(source)
200 201
    # 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))
202
  end
203

204
  alias_method :url_to_image, :image_url
205

206
  def users_select_tag(id, opts = {})
207 208
    css_class = "ajax-users-select "
    css_class << "multiselect " if opts[:multiple]
209
    css_class << (opts[:class] || '')
210 211 212
    value = opts[:selected] || ''

    hidden_field_tag(id, value, class: css_class)
213
  end
214 215

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

    [namespace, controller.controller_name, controller.action_name].compact.join(":")
220
  end
221 222 223 224 225 226 227 228 229 230

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

  # shortcut for gitlab extra config
  def extra_config
    Gitlab.config.extra
  end
231 232 233 234 235 236 237 238 239

  def public_icon
    content_tag :i, nil, class: 'icon-globe cblue'
  end

  def private_icon
    content_tag :i, nil, class: 'icon-lock cgreen'
  end

240 241 242 243 244 245 246 247 248
  def search_placeholder
    if @project && @project.persisted?
      "Search in this project"
    elsif @group && @group.persisted?
      "Search in this group"
    else
      "Search"
    end
  end
249 250 251 252 253 254 255

  def first_line(str)
    lines = str.split("\n")
    line = lines.first
    line += "..." if lines.size > 1
    line
  end
gitlabhq's avatar
gitlabhq committed
256
end