module AbAdmin
module Views
module AdminHelpers
def admin_form_for(object, *args, &block)
record = Array(object).last
record.fallbacks_for_empty_translations = false if record.respond_to?(:fallbacks_for_empty_translations)
options = args.extract_options!
options[:remote] = true if request.xhr?
options[:html] ||= {}
options[:html][:class] ||= 'form-horizontal'
options[:builder] ||= ::AbAdmin::Views::FormBuilder
options[:html]['data-id'] = record.id
if controller_name == 'manager' && resource_class == Array(object).last.class
options[:url] ||= object.new_record? ? collection_path : resource_path
end
if options.delete(:nested)
simple_nested_form_for([:admin, object].flatten, *(args << options), &block)
else
simple_form_for([:admin, object].flatten, *(args << options), &block)
end
end
def editable_bool(item, attr, label: nil)
url = "/admin/#{item.class.model_name.plural}/#{item.id}.json"
html = check_box_tag("#{item.class.model_name.singular}[#{attr}]", '1', item.send(attr), class: 'js-auto-submit-checkbox', data: {url: url})
html = content_tag(:label, "#{label} #{html}".html_safe) if label
content_tag :div, html, class: 'auto-submit-checkbox-wrap white-space-nowrap'
end
def admin_editable(item, attr, opts=nil)
opts = {} unless opts.is_a?(Hash)
if opts[:title]
title = opts[:title]
else
assoc_name = attr.to_s.remove('_id')
title = item.class.reflect_on_association(assoc_name) ? AbAdmin.display_name(item.send(assoc_name)) : item[attr]
end
html_title = admin_pretty_data(title).to_s.html_safe
return html_title unless can?(:update, item)
if opts[:collection]
if opts[:collection].is_a?(Hash)
opts[:source] = opts[:collection]
elsif opts[:collection].is_a?(Array)
opts[:source] = opts[:collection].first.respond_to?(:id) ? opts[:collection].map {|r| [r.id, AbAdmin.display_name(r)]}.to_h : opts[:collection].map {|v| [v, v]}.to_h
end
end
unless opts[:type]
if opts[:source]
opts[:type] = 'select'
else
case attr.to_s
when /_at$/
opts[:type] ||= 'date'
opts[:title] ||= html_title
when /^is_/
opts[:type] ||= 'select'
opts[:source] ||= {1 => 'yes', 0 => 'no'}
opts[:value] ||= item[attr] ? 1 : 0
opts[:title] ||= item[attr] ? 'yes' : 'no'
when /description|body|content/
opts[:type] ||= 'textarea'
else
opts[:type] ||= 'text'
end
end
end
data = {
type: opts[:type],
source: opts[:source].try(:to_json),
model: opts[:model] || item.class.model_name.singular,
accept: opts[:accept],
url: opts[:url] || "/admin/#{item.class.model_name.plural}/#{item.id}",
name: attr,
value: opts[:value] || item[attr],
title: opts[:title] || item[attr]
}
link_to html_title, '#', class: "editable #{opts[:class]}", data: data.update(opts[:data] || {})
end
def options_for_ckeditor(options = {})
{width: 930, height: 200, toolbar: 'VeryEasy', namespace: ''}.update(options)
end
def admin_tree_item(item)
render 'tree_item', item: item, child_tree: admin_tree(item.cached_children)
end
def admin_tree(items)
return if items.blank?
items.map { |item| admin_tree_item(item) }.join.html_safe
end
def admin_layout_css
css = []
css << 'content_with_sidebar' if settings[:sidebar] || content_for?(:sidebar)
css << 'well' if settings[:well] && current_index_view != 'tree'
css << "#{current_index_view}_view"
css
end
def admin_title
base = @breadcrumbs ? @breadcrumbs.map_val(:name).reverse : []
base << @page_title || 'Ab Admin'
base.join(' - ')
end
def include_fv
"".html_safe
end
def admin_comments
render 'admin/admin_comments/comments'
end
def color_bool(val, options={})
options.reverse_merge!(true_css: 'badge-success', false_css: nil, nil_css: nil)
css = options["#{val.inspect}_css".to_sym]
text = val.nil? ? '?' : (val ? '+' : '-')
%(#{text}).html_safe
end
def icon(name, white=false)
" ".html_safe
end
def admin_pretty_data(object)
case object
when String, Integer, BigDecimal, Float
object
when TrueClass, FalseClass
color_bool(object)
when Date, DateTime, Time, ActiveSupport::TimeWithZone
I18n.l(object, format: :long)
when NilClass
''
when ActiveRecord::Base
admin_show_link(object)
else
AbAdmin.safe_display_name(object) || object
end
end
def pretty_data(object)
AbAdmin.pretty_data(object)
end
def item_image_link(item, options={})
options.reverse_merge!(assoc: :picture)
options[:url] ||= resource_path(item)
image = item.send(options[:assoc])
return nil unless image
version = options[:version] || image.class.thumb_size
image_url_method = options[:image_url_method] || :url
popover_content = "
"
popover_data = {content: popover_content, title: AbAdmin.display_name(item)}
html_options = options.delete(:html_options) || {}
html_options.reverse_merge!(rel: 'popover', remote: options[:remote], data: popover_data)
link_to image_tag(image.send(image_url_method, version)), options[:url], html_options
end
def item_image(item, assoc=:photo, size=:thumb)
image_tag_if(item.send(assoc).try(:url, size))
end
def per_page_variants
AbAdmin.per_page_variants.map{|variant| [variant, max_per_page].min }.uniq
end
# input_set 'title', legend_class: 'do_sort', label_class: 'label-info' do
def input_set(title, options={}, &block)
options.reverse_merge!(class: "inputs well well-small clearfix #{options.delete(:legend_class) || 'do_sort'}", id: options.delete(:legend_id))
html = title ? content_tag(:label, title, class: "input_set label #{options.delete(:label_class)}") : ''.html_safe
html.concat(capture(&block)) if block_given?
content_tag(:div, html, options)
end
def ha(attr)
resource_class.han(attr)
end
def admin_site_name
AbAdmin.site_name.is_a?(String) ? AbAdmin.site_name : AbAdmin.site_name.call
end
def call_method_or_proc_on(obj, symbol_or_proc, options = {})
exec = options[:exec].nil? ? true : options[:exec]
case symbol_or_proc
when String
ActiveSupport::Deprecation.warn('`call_method_or_proc_on` don\'t accept method name as String, use Symbol instead') if symbol_or_proc =~ /\A\w+\z/
symbol_or_proc
when Symbol
obj.send(symbol_or_proc.to_sym)
when Proc
exec ? instance_exec(obj, &symbol_or_proc) : symbol_or_proc.call(obj)
end
end
end
end
end