module FormHelper
def form_setup_simple_form simple_form
(params[:return_to] ? hidden_field_tag(:return_to, params[:return_to]) : '') +
simple_form.error_notification.to_s
end
def form_display_base_errors resource
resource = resource.last if resource.is_a? Array
return '' if resource.errors.empty? or resource.errors[:base].empty?
messages = resource.errors[:base].map { |msg| content_tag(:p, msg) }.join
html = <<-HTML
#{messages}
HTML
html.html_safe
end
def form_hash_to_hidden_fields(hash)
cleaned_hash = hash.reject { |k, v| v.nil? }
pairs = cleaned_hash.to_query.split(Rack::Utils::DEFAULT_SEP)
tags = pairs.map do |pair|
key, value = pair.split('=', 2).map { |str| Rack::Utils.unescape(str) }
hidden_field_tag(key, value)
end
tags.join("\n").html_safe
end
def form_render(form, &block)
form.view = self
block ? capture(form, &block) : form.render
end
def form_field_id(form, field)
field = field.respond_to?(:to_str) ? field : field.method_name
"#{form.object_name}[#{field}".gsub(/(\])?\[/, "_")
end
def form_field_show(field)
classes = "#{field.type_css_class} #{field.css_class}"
content_tag(:dt, field.label, class: classes, title: field.label) +
content_tag(:dd, class: classes) do
content_tag(:span, "data-toggle" => "tooltip", "data-placement" => "top", "data-delay" => "500",
title: field.label # field.help.present? ? "#{field.label} (#{field.help})" : field.label
) do
field.pretty_value.presence.to_s || "-"
end
end
end
def form_field_show_association(field)
try_url = true
value = Array.wrap(field.value).select(&:present?).map do |associated|
url = nil
if try_url and can?(:show, associated)
begin
url = url_for(associated)
rescue
try_url = false
end
end
if url
link_to(associated.to_label, url)
else
html_escape(associated.to_label)
end
end.to_sentence
value.blank? ? ' - ' : value.html_safe
end
def form_sort_link(search, field, url_params = nil, html_options = {})
raise TypeError, "First argument must be a Ransack::Search!" unless Ransack::Search === search
columns = Basepack::Utils.field_sortable_columns(field)
return field.label.to_s if columns.blank?
current = Hash[search.sorts.map {|s| [ s.name, s.dir == 'desc' ] }]
s = if columns.size == 1
name, dir = columns.first
"#{name} #{dir ^ (current[name] == dir) ? 'desc': 'asc'}"
else
Hash[columns.map.with_index do |c, i|
n, d = c
[ i, { name: n, dir: d ^ (current[n] == d)? 'desc' : 'asc' } ]
end]
end
url_params = url_params ? url_params.dup : {}
url_params[search.context.search_key] = url_params.fetch(search.context.search_key, {}).merge(s: s)
current_dir = case current[columns.first[0]]
when true then 'desc'
when false then 'asc'
else nil
end
link_to [html_escape(field.label.to_s), order_indicator_for(current_dir)].compact.join(' ').html_safe,
url_for(url_params),
html_options.dup.merge( class: ['sort_link', current_dir, html_options[:class]].compact.join(' ') )
end
# Forms a json represenation of available filters
def query_menu2metadata(form)
form.visible_groups.map do |group|
fields = group.visible_fields.select {|f| f.filterable? }
next unless fields.present?
fields_metadata = fields.map do |field|
if field.association?
unless form.nested_in or form.inverse_of_nested_in?(field) or field.polymorphic? # TODO - polymorphic
{
type: 'query-menu-item',
fields: query_menu2metadata(field.nform),
label: field.label,
}
end
else
{
nested_label: field.nested_label,
name: form.field_nested_name(field),
type: "query-menu-#{field.type}",
field_type: field.type,
template: field.render,
value: "",
label: field.label
}
end
end.compact
{
fields: fields_metadata,
label: group.label,
type: 'query-menu-group'
}
end.compact
end
end