heartcombo--simple_form/lib/simple_form.rb

196 lines
6.7 KiB
Ruby
Raw Normal View History

2010-02-06 19:41:35 +00:00
require 'action_view'
2009-12-09 20:25:12 +00:00
require 'simple_form/action_view_extensions/form_helper'
require 'simple_form/action_view_extensions/builder'
2011-12-05 15:26:49 +00:00
require 'active_support/core_ext/hash/slice'
require 'active_support/core_ext/hash/except'
require 'active_support/core_ext/hash/reverse_merge'
2009-12-09 20:25:12 +00:00
module SimpleForm
autoload :Components, 'simple_form/components'
autoload :ErrorNotification, 'simple_form/error_notification'
autoload :FormBuilder, 'simple_form/form_builder'
autoload :Helpers, 'simple_form/helpers'
autoload :I18nCache, 'simple_form/i18n_cache'
autoload :Inputs, 'simple_form/inputs'
autoload :MapType, 'simple_form/map_type'
2011-09-02 18:33:03 +00:00
autoload :Wrappers, 'simple_form/wrappers'
2011-09-04 09:31:24 +00:00
## CONFIGURATION OPTIONS
# Method used to tidy up errors.
mattr_accessor :error_method
@@error_method = :first
# Default tag used for error notification helper.
mattr_accessor :error_notification_tag
@@error_notification_tag = :p
# CSS class to add for error notification helper.
mattr_accessor :error_notification_class
2010-11-07 09:18:37 +00:00
@@error_notification_class = :error_notification
# ID to add for error notification helper.
mattr_accessor :error_notification_id
@@error_notification_id = nil
# Series of attemps to detect a default label method for collection.
2009-12-10 02:22:53 +00:00
mattr_accessor :collection_label_methods
2009-12-11 01:48:29 +00:00
@@collection_label_methods = [ :to_label, :name, :title, :to_s ]
2009-12-10 02:22:53 +00:00
# Series of attemps to detect a default value method for collection.
2009-12-10 02:22:53 +00:00
mattr_accessor :collection_value_methods
@@collection_value_methods = [ :id, :to_s ]
# You can wrap a collection of radio/check boxes in a pre-defined tag, defaulting to none.
mattr_accessor :collection_wrapper_tag
@@collection_wrapper_tag = nil
# You can define the class to use on all collection wrappers. Defaulting to none.
mattr_accessor :collection_wrapper_class
@@collection_wrapper_class = nil
# You can wrap each item in a collection of radio/check boxes with a tag, defaulting to none.
mattr_accessor :item_wrapper_tag
@@item_wrapper_tag = :span
2009-12-10 22:11:15 +00:00
# How the label text should be generated altogether with the required text.
mattr_accessor :label_text
@@label_text = lambda { |label, required| "#{required} #{label}" }
2009-12-11 13:12:57 +00:00
# You can define the class to use on all labels. Default is nil.
mattr_accessor :label_class
@@label_class = nil
# You can define the class to use on all forms. Default is simple_form.
mattr_accessor :form_class
@@form_class = :simple_form
2010-07-06 09:28:23 +00:00
# Whether attributes are required by default (or not).
mattr_accessor :required_by_default
@@required_by_default = true
# Tell browsers whether to use default HTML5 validations (novalidate option).
mattr_accessor :browser_validations
@@browser_validations = true
2009-12-11 13:12:57 +00:00
# Collection of methods to detect if a file type was given.
mattr_accessor :file_methods
2009-12-13 01:05:51 +00:00
@@file_methods = [ :mounted_as, :file?, :public_filename ]
2010-11-26 00:35:38 +00:00
# Custom mappings for input types. This should be a hash containing a regexp
# to match as key, and the input type that will be used when the field name
# matches the regexp as value, such as { /count/ => :integer }.
mattr_accessor :input_mappings
@@input_mappings = nil
# Default priority for time_zone inputs.
mattr_accessor :time_zone_priority
@@time_zone_priority = nil
# Default priority for country inputs.
mattr_accessor :country_priority
@@country_priority = nil
2010-02-06 21:06:25 +00:00
# Maximum size allowed for inputs.
mattr_accessor :default_input_size
@@default_input_size = 50
# When off, do not use translations in labels. Disabling translation in
# hints and placeholders can be done manually in the wrapper API.
mattr_accessor :translate_labels
@@translate_labels = true
2011-04-27 18:55:03 +00:00
# Automatically discover new inputs in Rails' autoload path.
mattr_accessor :inputs_discovery
@@inputs_discovery = true
# Cache simple form inputs discovery
mattr_accessor :cache_discovery
@@cache_discovery = defined?(Rails) && !Rails.env.development?
2011-04-27 18:55:03 +00:00
# Adds a class to each generated button, mostly for compatiblity
mattr_accessor :button_class
@@button_class = 'button'
2011-09-04 09:31:24 +00:00
## WRAPPER CONFIGURATION
2012-01-24 18:54:28 +00:00
# The default wrapper to be used by the FormBuilder.
mattr_accessor :default_wrapper
@@default_wrapper = :default
2011-09-04 09:31:24 +00:00
@@wrappers = {}
2011-09-04 09:31:24 +00:00
# Retrieves a given wrapper
def self.wrapper(name)
2011-09-27 03:59:06 +00:00
@@wrappers[name.to_sym] or raise WrapperNotFound, "Couldn't find wrapper with name #{name}"
end
# Raised when fails to find a given wrapper name
class WrapperNotFound < StandardError
end
2011-09-04 09:31:24 +00:00
# Define a new wrapper using SimpleForm::Wrappers::Builder
# and store it in the given name.
def self.wrappers(*args, &block)
if block_given?
2011-09-27 02:41:53 +00:00
options = args.extract_options!
name = args.first || :default
@@wrappers[name.to_sym] = build(options, &block)
2011-09-04 09:31:24 +00:00
else
@@wrappers
end
end
2011-09-02 18:33:03 +00:00
2011-09-03 08:45:10 +00:00
# Builds a new wrapper using SimpleForm::Wrappers::Builder.
def self.build(options={})
options[:tag] = :div if options[:tag].nil?
builder = SimpleForm::Wrappers::Builder.new(options)
2011-09-03 08:33:57 +00:00
yield builder
2011-09-03 08:45:10 +00:00
SimpleForm::Wrappers::Root.new(builder.to_a, options)
end
wrappers :class => :input, :hint_class => :field_with_hint, :error_class => :field_with_errors do |b|
2011-12-04 15:15:27 +00:00
b.use :html5
2011-12-04 15:31:13 +00:00
b.use :min_max
2011-12-04 12:14:39 +00:00
b.use :maxlength
2011-09-03 08:33:57 +00:00
b.use :placeholder
b.optional :pattern
b.optional :readonly
2011-12-04 11:15:22 +00:00
2011-09-03 08:33:57 +00:00
b.use :label_input
b.use :hint, :tag => :span, :class => :hint
b.use :error, :tag => :span, :class => :error
end
2011-09-04 09:31:24 +00:00
## SETUP
2011-12-04 15:15:27 +00:00
DEPRECATED = %w(hint_tag hint_class error_tag error_class wrapper_tag wrapper_class wrapper_error_class components html5)
@@deprecated = []
2011-09-04 09:31:24 +00:00
DEPRECATED.each do |method|
class_eval "def self.#{method}=(*); @@deprecated << :#{method}=; end"
2011-12-04 15:15:27 +00:00
class_eval "def self.#{method}; ActiveSupport::Deprecation.warn 'SimpleForm.#{method} is deprecated and has no effect'; end"
end
def self.translate=(value)
ActiveSupport::Deprecation.warn "SimpleForm.translate= is disabled in favor of translate_labels="
self.translate_labels = value
end
def self.translate
ActiveSupport::Deprecation.warn "SimpleForm.translate is disabled in favor of translate_labels"
self.translate_labels
2011-09-04 09:31:24 +00:00
end
# Default way to setup SimpleForm. Run rails generate simple_form:install
# to create a fresh initializer with all configuration values.
def self.setup
yield self
unless @@deprecated.empty?
raise "[SIMPLE FORM] Your simple form initializer file is using the following methods: #{@@deprecated.to_sentence}. " <<
"Those methods are part of the outdated configuration API. Updating to the new API is easy and fast. " <<
"Check for more info here: https://github.com/plataformatec/simple_form/wiki/Upgrading-to-Simple-Form-2.0"
2011-09-04 09:31:24 +00:00
end
end
end