# Controls and helpers for forms. # origin: RM ActionView::Helpers::FormBuilder.class_eval do def partial(name, locals = {}) @template.render name, locals.merge(:form => self) end def check_box_list(field, choices, options = {}) html = "" name = nil choices.each do |choice, label| html << '
' name = "#{object_name}[#{field}][]" id = "#{name}_#{choice}".gsub(/[^a-z0-9]/i, '_') checked = object.send(field).include?(choice) html << @template.check_box_tag(name, choice, checked, :id => id) html << @template.label_tag(id, ERB::Util.html_escape(label || choice)) html << '
' end html << @template.hidden_field_tag(name, '') unless options[:allow_empty] # cannot serialize an empty list html.html_safe end def error_message_on(attr) message = Error.message(object, attr) @template.content_tag(:div, message, :class => 'error_message') if message.present? end def spec_label(field, text = nil, options = {}) label_html = label(field) id = extract_element_attribute(label_html, 'for') text ||= extract_element_text(label_html) @template.spec_label_tag(id, text, options) end def image_picker(field, options = {}) image = object.send(field) image_url = image.url(*[options[:style]].compact) html = '' if image.exists? destroy_field = "destroy_#{field}" html = [@template.image_tag(image_url), check_box(destroy_field), label(destroy_field, "Bild löschen")].join(" ") else html = file_field field end @template.content_tag :span, html.html_safe, :class => 'image_picker' end def user_picker(field, choices, options = {}) collection_select(field, choices, :id, :email, { :include_blank => true }, :class => 'user_picker') end def date_picker(field, options = {}) append_class_option(options, "date_picker") value = object.send(field) if value.is_a?(Date) value = I18n.l(value, :format => :default) end options[:value] = value text_field(field, options) end def datetime_picker(field, options = {}) append_class_option(options, "datetime_picker") value = object.send(field) if value.is_a?(Time) value = I18n.l(value, :format => :default) end options[:value] = value text_field(field, options) end def money_field(field, options = {}) append_class_option(options, "money_field") number_field(field, options.reverse_merge(:unit => "€", :money => true)) end def number_field(field, options = {}) append_class_option(options, "number_field") observe_with = options.delete(:observe_with) unit = options.delete(:unit) value = object.send(field) unless value.blank? || value.is_a?(String) value = value.with_comma(options[:money] ? 2 : nil) end options[:value] = value text_field_html = text_field(field, options) + (unit.present? ? " #{unit}" : "") text_field_id = extract_element_id(text_field_html) html = '' html << text_field_html html << @template.observe_field(text_field_id, :frequency => 0.2, :function => observe_with) if observe_with html.html_safe end def combo_box(field, choices, options = {}) if RAILS_ENV == 'test' || RAILS_ENV == 'cucumber' text_field(field, options) else current_choice = object.send(field) choices << current_choice unless current_choice.blank? || choices.include?(current_choice) more_choice = "Neu..." choices << more_choice collection_select field, choices, :to_s, :to_s, { :include_blank => true }, options.merge(:class => "combo_box", 'data-combo_box_new_choice' => more_choice) end end def tag_picker(field, options = {}) tag_classes = %w(xs s m l xl) text_field_html = text_field(field, :autocomplete => 'off') text_field_id = extract_element_id(text_field_html) scope = options[:scope] || object.class #.scoped(:conditions => ["updated_at > ?", Time.now - 18.months]) cloud = '' @template.tag_cloud(scope.tag_counts_on(options[:context] || :tags), tag_classes) do |tag, klass| event = "$('##{@template.escape_javascript text_field_id}').tagPicker('add', '#{@template.escape_javascript tag.name}')" cloud << @template.link_to_function(ERB::Util.html_escape(tag.name), event, :class => "tag #{klass}") cloud << " " end html = '' html << '
' html << text_field_html html << '
' html << cloud html << '
' html << '
' #debugger #html << scope.tag_counts.inspect #html << ActsAsTaggableOn::Tag.all.inspect #html << ActsAsTaggableOn::Tagging.all.inspect html.html_safe end private def extract_element_id(html) extract_element_attribute(html, 'id') end def extract_element_attribute(html, attr) /#{attr}=[\"\'](.*?)[\"\']/.match(html)[1] end def extract_element_text(html) /^<(\w+).*?>(.*?)<\/\1.*?>$/.match(html)[2] end def append_class_option(options, klass) options[:class] ||= '' options[:class] << " #{klass}" end end ActionView::Helpers::FormTagHelper.class_eval do def spec_label_tag(id, text = nil, options = {}) @@spec_label_counts ||= Hash.new(0) count_key = "#{object_id}/#{text}" count = @@spec_label_counts[count_key] html = label_tag(id, count == 0 ? text : "#{text} (#{count + 1})", options.merge(:class => "hidden")) @@spec_label_counts[count_key] += 1 html end end