Module: ApplicationHelper

Overview

Methods added to this helper will be available to all templates in the application.

Instance Method Summary collapse

Methods included from PathHelper

#finance_group_transactions_path

Instance Method Details

#base_errors(resource) ⇒ Object

render base errors in a form after failed validation railsapps.github.io/twitter-bootstrap-rails.html



200
201
202
203
204
205
# File 'app/helpers/application_helper.rb', line 200

def base_errors(resource)
  return '' if resource.errors.empty? || resource.errors[:base].empty?

  messages = resource.errors[:base].map { |msg| (:li, msg) }.join
  render partial: 'shared/base_errors', locals: { error_messages: messages }
end

#bootstrap_flash_patchedString

Returns flash messages html.

Use this instead of twitter-bootstrap’s bootstrap_flash method for safety, until CVE-2014-4920 is fixed.

Returns:

  • (String)

    Flash message html.

See Also:



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

def bootstrap_flash_patched
  flash_messages = []
  flash.each do |type, message|
    type = :success if type == 'notice'
    type = :error   if type == 'alert'
    text = (:div,
                       (:button, I18n.t('ui.marks.close').html_safe, :class => 'close', 'data-dismiss' => 'alert') +
                           message, class: "alert fade in alert-#{type}")
    flash_messages << text if message
  end
  flash_messages.join("\n").html_safe
end

#close_button(dismiss) ⇒ String

Returns HTML for close button dismissing.

Parameters:

  • dismiss (String, Symbol)

    Bootstrap dismiss value (modal, alert)

Returns:

  • (String)

    HTML for close button dismissing



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

def close_button(dismiss)
   :button, type: 'button', class: 'close', data: { dismiss: dismiss } do
    I18n.t('ui.marks.close').html_safe
  end
end

#expand(text, options = {}) ⇒ Object

Expand variables in text



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

def expand(text, options = {})
  Foodsoft::ExpansionVariables.expand(text, options)
end

#foodcoop_css_path(options = {}) ⇒ String

Returns path to foodcoop CSS style (with MD5 parameter for caching).

Returns:

  • (String)

    path to foodcoop CSS style (with MD5 parameter for caching)



257
258
259
# File 'app/helpers/application_helper.rb', line 257

def foodcoop_css_path(options = {})
  super(options.merge({ md5: Digest::MD5.hexdigest(FoodsoftConfig[:custom_css].to_s) }))
end

#foodcoop_css_tag(_options = {}) ⇒ String

Returns stylesheet tag for foodcoop CSS style (custom_css foodcoop config).

Returns:

  • (String)

    stylesheet tag for foodcoop CSS style (custom_css foodcoop config)

See Also:



263
264
265
266
267
# File 'app/helpers/application_helper.rb', line 263

def foodcoop_css_tag(_options = {})
  return if FoodsoftConfig[:custom_css].blank?

  stylesheet_link_tag foodcoop_css_path, media: 'all'
end

#format_currency(amount) ⇒ Object



22
23
24
25
# File 'app/helpers/application_helper.rb', line 22

def format_currency(amount)
  class_name = amount < 0 ? 'negative_amout' : 'positive_amount'
   :span, number_to_currency(amount), class: class_name
end

#format_date(time = Time.now) ⇒ Object



10
11
12
# File 'app/helpers/application_helper.rb', line 10

def format_date(time = Time.now)
  I18n.l(time.to_date) unless time.nil?
end

#format_datetime(time = Time.now) ⇒ Object



14
15
16
# File 'app/helpers/application_helper.rb', line 14

def format_datetime(time = Time.now)
  I18n.l(time) unless time.nil?
end

#format_datetime_timespec(time, format) ⇒ Object



18
19
20
# File 'app/helpers/application_helper.rb', line 18

def format_datetime_timespec(time, format)
  I18n.l(time, format: format) unless time.nil? || format.nil?
end

#format_iban(iban) ⇒ Object

Splits an IBAN into groups of 4 digits displayed with margins in between



28
29
30
# File 'app/helpers/application_helper.rb', line 28

def format_iban(iban)
  iban && iban.scan(/..?.?.?/).map { |item| (:span, item, style: 'margin-right: 0.5em;') }.join.html_safe
end

#format_roles(record, icon = false) ⇒ Object



160
161
162
163
164
165
166
167
168
169
170
171
# File 'app/helpers/application_helper.rb', line 160

def format_roles(record, icon = false)
  roles = %w[suppliers article_meta orders pickups finance invoices admin]
  roles.select! { |role| record.send "role_#{role}?" }
  names = roles.index_with { |r| I18n.t("helpers.application.role_#{r}") }
  if icon
    roles.map do |r|
      image_tag("role-#{r}.png", size: '22x22', border: 0, alt: names[r], title: names[r])
    end.join('&nbsp;').html_safe
  else
    roles.map { |r| names[r] }.join(', ')
  end
end

#format_time(time = Time.now) ⇒ Object



6
7
8
# File 'app/helpers/application_helper.rb', line 6

def format_time(time = Time.now)
  I18n.l(time, format: :foodsoft_datetime) unless time.nil?
end

#heading_helper(model, attribute, options = {}) ⇒ Object

Generates text for table heading for model attribute When the ‘short’ option is true, abbreviations will be used:

 When there is a non-empty model attribute 'foo', it looks for
 the model attribute translation 'foo_short' and use that as
 heading, with an abbreviation title of 'foo'. If a translation
 'foo_desc' is present, that is used instead, but that can be
 be overridden by the option 'desc'.
Other options are passed through to I18n.


95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'app/helpers/application_helper.rb', line 95

def heading_helper(model, attribute, options = {})
  i18nopts = { count: 2 }.merge(options.select { |a| !%w[short desc].include?(a) })
  s = model.human_attribute_name(attribute, i18nopts)
  if options[:short]
    desc = options[:desc]
    desc ||= model.human_attribute_name(:"#{attribute}_desc",
                                        options.merge({ fallback: true, default: '', count: 2 }))
    desc.blank? && desc = s
    sshort = model.human_attribute_name(:"#{attribute}_short",
                                        options.merge({ fallback: true, default: '', count: 2 }))
    s = raw "<abbr title='#{desc}'>#{sshort}</abbr>" if sshort.present?
  end
  s
end

#icon(name, options = {}) ⇒ Object



137
138
139
140
141
142
143
144
145
146
147
148
# File 'app/helpers/application_helper.rb', line 137

def icon(name, options = {})
  icons = {
    delete: { file: 'b_drop.png', alt: I18n.t('ui.delete') },
    edit: { file: 'b_edit.png', alt: I18n.t('ui.edit') },
    members: { file: 'b_users.png', alt: I18n.t('helpers.application.edit_user') }
  }
  options[:alt] ||= icons[name][:alt]
  options[:title] ||= icons[name][:title]
  options.merge!({ size: '16x16', border: '0' })

  image_tag icons[name][:file], options
end

#items_per_page(options = {}) ⇒ Object

Link-collection for per_page-options when using the pagination-plugin



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'app/helpers/application_helper.rb', line 41

def items_per_page(options = {})
  per_page_options = options[:per_page_options] || [20, 50, 100, 500]
  current = options[:current] || @per_page
  params ||= {}

  links = per_page_options.map do |per_page|
    params.merge!({ per_page: per_page })
    link_class = 'btn'
    link_class << ' disabled' if per_page == current
    link_to(per_page, params, remote: true, class: link_class)
  end

  if options[:wrap] == false
    links.join.html_safe
  else
     :div, class: 'btn-group pull-right' do
      links.join.html_safe
    end
  end
end


173
174
175
176
# File 'app/helpers/application_helper.rb', line 173

def link_to_gmaps(address)
  link_to h(address), "http://maps.google.com/?q=#{h(address)}", title: I18n.t('helpers.application.show_google_maps'),
                                                                 target: '_blank', rel: 'noopener'
end

Generates a link to the top of the website



111
112
113
114
115
# File 'app/helpers/application_helper.rb', line 111

def link_to_top
  link_to '#' do
     :i, nil, class: 'icon-arrow-up icon-large'
  end
end

Creates ajax-controlled-links for pagination



33
34
35
36
37
38
# File 'app/helpers/application_helper.rb', line 33

def pagination_links_remote(collection, options = {})
  per_page = options[:per_page] || @per_page
  params = options[:params] || {}
  params = params.merge({ per_page: per_page })
  paginate collection, params: params, remote: true
end

Remote links with default ‘loader’.gif during request



151
152
153
154
155
156
157
158
# File 'app/helpers/application_helper.rb', line 151

def remote_link_to(text, options = {})
  remote_options = {
    before: "Element.show('loader')",
    success: "Element.hide('loader')",
    method: :get
  }
  link_to(text, options[:url], remote_options.merge(options))
end

#show_title?Boolean

Returns:

  • (Boolean)


129
130
131
# File 'app/helpers/application_helper.rb', line 129

def show_title?
  @show_title
end

#show_user(user = @current_user, options = {}) ⇒ Object

show a user, depending on settings



208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
# File 'app/helpers/application_helper.rb', line 208

def show_user(user = @current_user, options = {})
  if user.nil?
    '?'
  elsif FoodsoftConfig[:use_nick]
    if options[:full] && options[:markup]
      raw "<b>#{h user.nick}</b> (#{h user.first_name} #{h user.last_name})"
    elsif options[:full]
      "#{user.nick} (#{user.first_name} #{user.last_name})"
    else
      # when use_nick was changed from false to true, users may exist without nick
      user.nick.nil? ? I18n.t('helpers.application.nick_fallback') : user.nick
    end
  else
    "#{user.first_name} #{user.last_name}" + (options[:unique] ? " (##{user.id})" : '')
  end
end

render user presentation linking to default action (plugins can override this)



226
227
228
# File 'app/helpers/application_helper.rb', line 226

def show_user_link(user = @current_user)
  show_user user
end


62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'app/helpers/application_helper.rb', line 62

def sort_link_helper(text, key, options = {})
  # Hmtl options
  remote = options[:remote].nil? ? true : options[:remote]
  class_name = case params[:sort]
               when key
                 'sortup'
               when key + '_reverse'
                 'sortdown'
               end
  html_options = {
    title: I18n.t('helpers.application.sort_by', text: text),
    remote: remote,
    class: class_name
  }

  # Url options
  key += '_reverse' if params[:sort] == key
  per_page = options[:per_page] || @per_page
  url_options = params.merge(per_page: per_page, sort: key)
  url_options.merge!({ page: params[:page] }) if params[:page]
  url_options.merge!({ query: params[:query] }) if params[:query]

  link_to(text, url_for(url_options), html_options)
end

#tab_is_active?(tab) ⇒ Boolean

Returns:

  • (Boolean)


133
134
135
# File 'app/helpers/application_helper.rb', line 133

def tab_is_active?(tab)
  tab[:active].detect { |c| controller.controller_path.match(c) }
end

#title(page_title, show_title = true) ⇒ Object

to set a title for both the h1-tag and the title in the header



124
125
126
127
# File 'app/helpers/application_helper.rb', line 124

def title(page_title, show_title = true)
  content_for(:title) { page_title.to_s }
  @show_title = show_title
end

#truncate(text, options = {}, &block) ⇒ Object

allow truncate to add title when tooltip option is given



231
232
233
234
235
236
237
238
239
240
# File 'app/helpers/application_helper.rb', line 231

def truncate(text, options = {}, &block)
  return text if !text || text.length <= (options[:length] || 30)

  text_truncated = super(text, options, &block)
  if options[:tooltip]
     :span, text_truncated, title: text
  else
    text_truncated
  end
end

#weekday(dayNumber) ⇒ Object

Returns the weekday. 0 is sunday, 1 is monday and so on



118
119
120
121
# File 'app/helpers/application_helper.rb', line 118

def weekday(dayNumber)
  weekdays = I18n.t('date.day_names')
  weekdays[dayNumber]
end