Module: ActiveScaffold::Helpers::ViewHelpers

Overview

All extra helpers that should be included in the View. Also a dumping ground for uncategorized helpers.

Instance Method Summary collapse

Methods included from HumanConditionHelpers

#active_scaffold_human_condition_for, #override_human_condition, #override_human_condition?, #override_human_condition_column, #override_human_condition_column?

Methods included from SearchColumnHelpers

#active_scaffold_search_boolean, #active_scaffold_search_date, #active_scaffold_search_datetime, #active_scaffold_search_for, #active_scaffold_search_multi_select, #active_scaffold_search_null, #active_scaffold_search_options, #active_scaffold_search_range, #active_scaffold_search_range_comparator_options, #active_scaffold_search_range_string?, #active_scaffold_search_select, #active_scaffold_search_text, #active_scaffold_search_time, #field_search_datetime_value, #field_search_params_range_values, #include_null_comparators?, #override_search, #override_search_field, #searched_by?, #visibles_and_hiddens

Methods included from FormColumnHelpers

#active_scaffold_add_existing_input, #active_scaffold_add_existing_label, #active_scaffold_checkbox_list, #active_scaffold_input_boolean, #active_scaffold_input_carrierwave, #active_scaffold_input_checkbox, #active_scaffold_input_dragonfly, #active_scaffold_input_enum, #active_scaffold_input_file_column, #active_scaffold_input_for, #active_scaffold_input_options, #active_scaffold_input_paperclip, #active_scaffold_input_password, #active_scaffold_input_plural_association, #active_scaffold_input_radio, #active_scaffold_input_select, #active_scaffold_input_singular_association, #active_scaffold_input_text_options, #active_scaffold_input_textarea, #active_scaffold_input_virtual, #active_scaffold_render_input, #active_scaffold_translate_select_options, #active_scaffold_translated_option, #column_renders_as, #column_scope, #form_partial_for_column, #onsubmit, #override_form_field, #override_form_field_partial, #override_form_field_partial?, #override_input, #override_subform_partial, #override_subform_partial?, #subform_partial_for_column, #update_columns_options

Methods included from ShowColumnHelpers

#active_scaffold_show_text, #override_show_column_ui, #show_column_override, #show_column_value

Methods included from ListColumnHelpers

#action_link_to_inline_form, #active_scaffold_column_carrierwave, #active_scaffold_column_checkbox, #active_scaffold_column_download_link, #active_scaffold_column_download_link_with_filename, #active_scaffold_column_dragonfly, #active_scaffold_column_marked, #active_scaffold_column_paperclip, #active_scaffold_column_text, #active_scaffold_column_thumbnail, #active_scaffold_inplace_edit, #all_marked?, #cache_association, #clean_column_value, #column_heading_value, #column_link_authorized?, #column_override, #configure_column_link, #format_association_value, #format_column_value, #format_number_value, #format_value, #get_column_value, #inplace_edit?, #inplace_edit_cloning?, #inplace_edit_control, #inplace_edit_control_css_class, #inplace_edit_data, #mark_column_heading, #override_column_ui, #render_column_heading, #render_list_column, #render_nested_view

Methods included from PaginationHelpers

#pagination_ajax_link, #pagination_ajax_links

Methods included from AssociationHelpers

#association_options_count, #association_options_find, #options_for_association, #options_for_association_conditions, #options_for_association_count

Methods included from IdHelpers

#action_iframe_id, #action_link_id, #active_scaffold_calculations_id, #active_scaffold_column_header_id, #active_scaffold_content_id, #active_scaffold_id, #active_scaffold_messages_id, #active_scaffold_tbody_id, #association_subform_id, #before_header_id, #controller_id, #element_cell_id, #element_form_id, #element_messages_id, #element_row_id, #empty_message_id, #id_from_controller, #loading_indicator_id, #nested_id, #scope_id, #search_input_id, #sub_form_id, #sub_form_list_id, #sub_section_id

Instance Method Details



186
187
188
189
190
191
192
193
194
195
196
197
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 186

def action_link_html(link, url, html_options, record)
  # issue 260, use url_options[:link] if it exists. This prevents DB data from being localized.
  label = url.delete(:link) if url.is_a?(Hash) 
  label ||= link.label
  if link.image.nil?
    html = link_to(label, url, html_options)
  else
    html = link_to(image_tag(link.image[:name], :size => link.image[:size], :alt => label, :title => label), url, html_options)
  end
  # if url is nil we would like to generate an anchor without href attribute
  url.nil? ? html.sub(/href=".*?"/, '').html_safe : html.html_safe
end


144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 144

def action_link_html_options(link, url_options, record, html_options)
  link_id = get_action_link_id(url_options, record, link.column)
  html_options.reverse_merge! link.html_options.merge(:class => link.action.to_s)

  # Needs to be in html_options to as the adding _method to the url is no longer supported by Rails        
  html_options[:method] = link.method if link.method != :get

  html_options[:class] += ' as_action' if link.inline?
  html_options[:data] = {}
  html_options[:data][:confirm] = link.confirm(record.try(:to_label)) if link.confirm?
  html_options[:data][:position] = link.position if link.position and link.inline?
  html_options[:data][:action] = link.action if link.inline?
  html_options[:data][:'cancel-refresh'] = true if link.inline? and link.refresh_on_close
  if link.popup?
    html_options[:data][:popup] = true
    html_options[:target] = '_blank'
  end
  html_options[:id] = link_id
  html_options[:remote] = true unless link.page? || link.popup?
  if link.dhtml_confirm?
    html_options[:class] += ' as_action' if !link.inline?
    html_options[:page_link] = 'true' if !link.inline?
    html_options[:dhtml_confirm] = link.dhtml_confirm.value
    html_options[:onclick] = link.dhtml_confirm.onclick_function(controller, link_id)
  end
  html_options[:class] += " #{link.html_options[:class]}" unless link.html_options[:class].blank?
  html_options
end


120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 120

def action_link_url_options(link, url_options, record, options = {})
  url_options = url_options.clone
  url_options[:action] = link.action
  url_options[:controller] = link.controller.to_s if link.controller
  url_options.delete(:search) if link.controller and link.controller.to_s != params[:controller]
  url_options.merge! link.parameters if link.parameters
  if link.dynamic_parameters.is_a?(Proc)
    if record.nil?
      url_options.merge! link.dynamic_parameters.call
    elsif link.dynamic_parameters.arity == 0
      ActiveSupport::Deprecation.warn("dynamic_parameters must be a block with an argument for member action links, instead of using @link_record")
      @link_record = record
      url_options.merge! self.instance_eval(&(link.dynamic_parameters))
      @link_record = nil
    else
      url_options.merge! link.dynamic_parameters.call(record)
    end
  end
  url_options_for_nested_link(link.column, record, link, url_options, options) if link.nested_link?
  url_options_for_sti_link(link.column, record, link, url_options, options) unless record.nil? || active_scaffold_config.sti_children.nil?
  url_options[:_method] = link.method if !link.confirm? && link.inline? && link.method != :get
  url_options
end

#active_scaffold_configObject

access to the configuration variable



20
21
22
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 20

def active_scaffold_config
  controller.class.active_scaffold_config
end

#active_scaffold_config_for(*args) ⇒ Object



24
25
26
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 24

def active_scaffold_config_for(*args)
  controller.class.active_scaffold_config_for(*args)
end

#active_scaffold_controller_for(*args) ⇒ Object



28
29
30
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 28

def active_scaffold_controller_for(*args)
  controller.class.active_scaffold_controller_for(*args)
end

#active_scaffold_error_messages_for(*params) ⇒ Object



337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 337

def active_scaffold_error_messages_for(*params)
  options = params.extract_options!.symbolize_keys
  options.reverse_merge!(:container_tag => :div, :list_type => :ul)

  objects = Array.wrap(options.delete(:object) || params).map do |object|
    object = instance_variable_get("@#{object}") unless object.respond_to?(:to_model)
    object = convert_to_model(object)

    if object.class.respond_to?(:model_name)
      options[:object_name] ||= object.class.model_name.human.downcase
    end

    object
  end

  objects.compact!
  count = objects.inject(0) {|sum, object| sum + object.errors.count }

  unless count.zero?
    html = {}
    [:id, :class].each do |key|
      if options.include?(key)
        value = options[key]
        html[key] = value unless value.blank?
      else
        html[key] = 'errorExplanation'
      end
    end
    options[:object_name] ||= params.first

    header_message = if options.include?(:header_message)
      options[:header_message]
    else
      as_('errors.template.header', :count => count, :model => options[:object_name].to_s.gsub('_', ' '))
    end

    message = options.include?(:message) ? options[:message] : as_('errors.template.body')

    error_messages = objects.sum do |object|
      object.errors.full_messages.map do |msg|
        options[:list_type] != :br ? (:li, msg) : msg
      end
    end
    error_messages = if options[:list_type] == :br
      error_messages.join('<br/>').html_safe
    else
      (options[:list_type], error_messages.join.html_safe)
    end

    contents = []
    contents << (options[:header_tag] || :h2, header_message) unless header_message.blank?
    contents << (:p, message) unless message.blank?
    contents << error_messages
    contents = contents.join.html_safe
    options[:container_tag] ? (options[:container_tag], contents, html) : contents
  else
    ''
  end
end

#as_main_div_classObject



265
266
267
268
269
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 265

def as_main_div_class
  classes = ["active-scaffold", "active-scaffold-#{controller_id}", "#{id_from_controller params[:controller]}-view", "#{active_scaffold_config.theme}-theme"]
  classes << "as_touch" if touch_device?
  classes.join(' ')
end

#clean_class_name(name) ⇒ Object



308
309
310
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 308

def clean_class_name(name)
  name.underscore.gsub('/', '_')
end

#clean_column_name(name) ⇒ Object



304
305
306
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 304

def clean_column_name(name)
  name.to_s.gsub('?', '')
end

#column_attributes(column, record) ⇒ Object



234
235
236
237
238
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 234

def column_attributes(column, record)
  method = override_helper column, 'column_attributes'
  return send(method, record) if method
  {}
end

#column_calculation(column) ⇒ Object



278
279
280
281
282
283
284
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 278

def column_calculation(column)
  unless column.calculate.instance_of? Proc
    calculate(column)
  else
    column.calculate.call(@records)
  end
end

#column_class(column, column_value, record) ⇒ Object



240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 240

def column_class(column, column_value, record)
  classes = []
  classes << "#{column.name}-column"
  if column.css_class.is_a?(Proc)
    css_class = column.css_class.call(column_value, record)
    classes << css_class unless css_class.nil?
  else
    classes << column.css_class
  end unless column.css_class.nil?
   
  classes << 'empty' if column_empty? column_value
  classes << 'sorted' if active_scaffold_config.list.user.sorting.sorts_on?(column)
  classes << 'numeric' if column.column and [:decimal, :float, :integer].include?(column.column.type)
  classes << 'in_place_editor_field' if inplace_edit?(record, column) or column.list_ui == :marked
  classes.join(' ').rstrip
end

#column_empty?(column_value) ⇒ Boolean

Returns:

  • (Boolean)


271
272
273
274
275
276
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 271

def column_empty?(column_value)
  empty = column_value.nil?
  empty ||= column_value.blank? if column_value.respond_to? :blank?
  empty ||= ['&nbsp;', active_scaffold_config.list.empty_field_text].include? column_value if String === column_value
  return empty
end

#column_heading_class(column, sorting) ⇒ Object



257
258
259
260
261
262
263
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 257

def column_heading_class(column, sorting)
  classes = []
  classes << "#{column.name}-column_heading"
  classes << "sorted #{sorting.direction_of(column).downcase}" if sorting.sorts_on? column
  classes << column.css_class unless column.css_class.nil? || column.css_class.is_a?(Proc)
  classes.join(' ')
end

#column_show_add_existing(column) ⇒ Object



294
295
296
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 294

def column_show_add_existing(column)
  (column.allow_add_existing and options_for_association_count(column.association) > 0)
end

#column_show_add_new(column, associated, record) ⇒ Object



298
299
300
301
302
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 298

def column_show_add_new(column, associated, record)
  value = (column.plural_association? && !column.readonly_association?) || (column.singular_association? and not associated.empty?)
  value = false unless column.association.klass.authorized_for?(:crud_type => :create)
  value
end

#controller_path_for_activerecord(klass) ⇒ Object

Uncategorized



36
37
38
39
40
41
42
43
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 36

def controller_path_for_activerecord(klass)
  begin
    controller = active_scaffold_controller_for(klass)
    controller.controller_path
  rescue ActiveScaffold::ControllerNotFound
    controller = nil
  end
end

#display_message(message) ⇒ Object



324
325
326
327
328
329
330
331
332
333
334
335
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 324

def display_message(message)
  if (highlights = active_scaffold_config.highlight_messages)
    message = highlights.inject(message) do |msg, (phrases, highlighter)|
      highlight(msg, phrases, highlighter)
    end
  end
  if (format = active_scaffold_config.timestamped_messages)
    format = :short if format == true
    message = "#{ :div, l(Time.current, :format => format), :class => 'timestamp'} #{ :div, message, :class => 'message-content'}".html_safe
  end
  message
end

#form_remote_upload_tag(url_for_options = {}, options = {}) ⇒ Object



78
79
80
81
82
83
84
85
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 78

def form_remote_upload_tag(url_for_options = {}, options = {})
  options[:target] = action_iframe_id(url_for_options)
  options[:multipart] ||= true
  options[:class] = "#{options[:class]} as_remote_upload".strip 
  output=""
  output << form_tag(url_for_options, options)
  (output << "<iframe id='#{action_iframe_id(url_for_options)}' name='#{action_iframe_id(url_for_options)}' style='display:none'></iframe>").html_safe
end

#generate_temporary_idObject



51
52
53
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 51

def generate_temporary_id
  (Time.now.to_f*1000).to_i.to_s
end


173
174
175
176
177
178
179
180
181
182
183
184
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 173

def get_action_link_id(url_options, record = nil, column = nil)
  id = url_options[:id] || url_options[:parent_id]
  id = "#{column.association.name}-#{record.id}" if column && column.plural_association?
  if record.try(column.association.name.to_sym).present?
    id = "#{column.association.name}-#{record.send(column.association.name).id}-#{record.id}"
  else
    id = "#{column.association.name}-#{record.id}" unless record.nil?
  end if column && column.singular_association?
  id = "#{id}-#{url_options[:batch_scope].downcase}" if url_options[:batch_scope]
  action_id = "#{id_from_controller(url_options[:controller]) + '-' if url_options[:parent_controller] || url_options[:controller] != controller.controller_path}#{url_options[:action].to_s}"
  action_link_id(action_id, id)
end

#in_subform?(column, parent_record) ⇒ Boolean

Should this column be displayed in the subform?

Returns:

  • (Boolean)


66
67
68
69
70
71
72
73
74
75
76
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 66

def in_subform?(column, parent_record)
  return true unless column.association

  # Polymorphic associations can't appear because they *might* be the reverse association, and because you generally don't assign an association from the polymorphic side ... I think.
  return false if column.polymorphic_association?

  # A column shouldn't be in the subform if it's the reverse association to the parent
  return false if column.association.inverse_for?(parent_record.class)

  return true
end

Creates a javascript-based link that toggles the visibility of some element on the page. By default, it toggles the visibility of the sibling after the one it’s nested in. You may pass custom javascript logic in options to change that, though. For example, you could say :of => ‘$(“my_div_id”)’. You may also flag whether the other element is visible by default or not, and the initial text will adjust accordingly.



95
96
97
98
99
100
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 95

def link_to_visibility_toggle(id, options = {})
  options[:default_visible] = true if options[:default_visible].nil?
  options[:hide_label] = as_(:hide) 
  options[:show_label] = as_(:show)
  javascript_tag("ActiveScaffold.create_visibility_toggle('#{id}', #{options.to_json});")
end

#list_row_class(record) ⇒ Object



229
230
231
232
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 229

def list_row_class(record)
  class_override_helper = :"#{clean_class_name(record.class.name)}_list_row_class"
  respond_to?(class_override_helper) ? send(class_override_helper, record) : ''
end

#loading_indicator_tag(options) ⇒ Object

a general-use loading indicator (the “stuff is happening, please wait” feedback)



88
89
90
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 88

def loading_indicator_tag(options)
  image_tag "active_scaffold/indicator.gif", :style => "visibility:hidden;", :id => loading_indicator_id(options), :alt => "loading indicator", :class => "loading-indicator"
end

#option_tags_for(select_options, options = {}) ⇒ Object

Turns [[label, value]] into <option> tags Takes optional parameter of :include_blank



57
58
59
60
61
62
63
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 57

def option_tags_for(select_options, options = {})
  select_options.insert(0,[as_(:_select_),nil]) if options[:include_blank]
  select_options.collect do |option|
    label, value = option[0], option[1]
    value.nil? ? "<option value="">#{label}</option>" : "<option value=\"#{value}\">#{label}</option>"
  end
end

#override_helper(column, suffix) ⇒ Object



317
318
319
320
321
322
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 317

def override_helper(column, suffix)
  method_with_class = override_helper_name(column, suffix, true)
  return method_with_class if respond_to?(method_with_class)
  method = override_helper_name(column, suffix)
  method if respond_to?(method)
end

#override_helper_name(column, suffix, class_prefix = false) ⇒ Object

the naming convention for overriding with helpers



313
314
315
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 313

def override_helper_name(column, suffix, class_prefix = false)
  "#{clean_class_name(column.active_record_class.name) + '_' if class_prefix}#{clean_column_name(column.name)}_#{suffix}"
end


106
107
108
109
110
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 106

def render_action_link(link, url_options, record = nil, html_options = {})
  url_options = action_link_url_options(link, url_options, record)
  html_options = action_link_html_options(link, url_options, record, html_options)
  action_link_html(link, url_options, html_options, record)
end

#render_column_calculation(column) ⇒ Object



286
287
288
289
290
291
292
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 286

def render_column_calculation(column)
  calculation = column_calculation(column)
  override_formatter = "render_#{column.name}_#{column.calculate.is_a?(Proc) ? :calculate : column.calculate}"
  calculation = send(override_formatter, calculation) if respond_to? override_formatter

  "#{"#{as_(column.calculate)}: " unless column.calculate.is_a? Proc}#{format_column_value nil, column, calculation}"
end


112
113
114
115
116
117
118
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 112

def render_group_action_link(link, url_options, options, record = nil)
  if link.type == :member && !options[:authorized]
    action_link_html(link, nil, {:class => "disabled #{link.action}#{link.html_options[:class].blank? ? '' : (' ' + link.html_options[:class])}"}, record)
  else
    render_action_link(link, url_options, record)
  end
end


102
103
104
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 102

def skip_action_link(link, *args)
  (!link.ignore_method.nil? && controller.respond_to?(link.ignore_method) && controller.send(link.ignore_method, *args)) || ((link.security_method_set? or controller.respond_to? link.security_method) and !controller.send(link.security_method, *args))
end

#template_exists?(template_name, partial = false) ⇒ Boolean

This is the template finder logic, keep it updated with however we find stuff in rails currently this very similar to the logic in ActionBase::Base.render for options file

Returns:

  • (Boolean)


47
48
49
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 47

def template_exists?(template_name, partial = false)
  lookup_context.exists? template_name, '', partial
end


199
200
201
202
203
204
205
206
207
208
209
210
211
212
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 199

def url_options_for_nested_link(column, record, link, url_options, options = {})
  if column && column.association
    url_options[:parent_scaffold] = controller_path
    url_options[column.association.active_record.name.foreign_key.to_sym] = url_options.delete(:id)
    url_options[:id] = record.send(column.association.name).id if column.singular_association? && record.send(column.association.name).present?
    url_options[:eid] = nil # needed for nested scaffolds open from an embedded scaffold
  elsif link.parameters && link.parameters[:named_scope]
    url_options[:parent_scaffold] = controller_path
    url_options[active_scaffold_config.model.name.foreign_key.to_sym] = url_options.delete(:id)
    url_options[:eid] = nil # needed for nested scaffolds open from an embedded scaffold
  end
  url_options.except! *params_conditions
  url_options.except! *nested.constrained_fields if nested?
end


214
215
216
217
218
219
220
221
222
223
224
225
226
227
# File 'lib/active_scaffold/helpers/view_helpers.rb', line 214

def url_options_for_sti_link(column, record, link, url_options, options = {})
  #need to find out controller of current record type
  #and set parameters
  # its quite difficult to detect an sti link
  # if link.column.nil? we are sure that it is nt an singular association inline autolink
  # howver that will not work if a sti parent is an singular association inline autolink
  if link.column.nil?
    sti_controller_path = controller_path_for_activerecord(record.class)
    if sti_controller_path
      url_options[:controller] = sti_controller_path
      url_options[:parent_sti] = controller_path
    end
  end
end