# Rails helper methods associated with forms for Bootstrap.
#
# @example Bootstrap form-actions
#
# <%= submit_button_tag %>
# <%= cancel_button_tag %>
#
#
module Bootstrap::FormHelper
ArgumentError = Class.new(StandardError)
InvalidButtonModifierError = Class.new(StandardError)
# Convenience method for standard "Cancel" button.
#
# The +text, type,+ and +size+ arguments are all optional.
#
# Has same semantics as calls to {Bootstrap::ButtonHelper#button} except:
# * text defaults to "Cancel"
# * +:url+ option is required
# @example
# cancel_button_tag(url: '/')
# cancel_button_tag('Go Back', url: '/')
# cancel_button_tag(:info, url: '/')
# cancel_button_tag(:large, url: '/')
# cancel_button_tag('Return', :small, :warning, url: '/', id: 'my-id')
# @overload cancel_button_tag(text, type, size, options={})
# @param [String] text text of link
# @param [Symbol] type type of button
# @param [Symbol] size size of button
# @param [Hash] options All keys except +:url+ become html attributes of the
tag
# @option options [String] :url required
# @return [String] tag styled as Bootstrap button
def cancel_button_tag(*args)
options = canonicalize_options(args.extract_options!)
raise(ArgumentError, "must pass a :url option") unless options.has_key?(:url)
options = ensure_class(options, 'btn')
args.map!(&:to_s)
args.unshift("Cancel") if args.all? { |e| ::Bootstrap::ButtonHelper::BUTTON_ALL.include?(e) }
button(*args, options)
end
# Returns similar to +#submit_tag()+ but: x
# * styled like a Bootstrap button, type :primary
# * has +:disable_with+ set to "Processing ..."
# See {Bootstrap::ButtonHelper} for documentation on button type and size
# submit_button_tag('Save')
# submit_button_tag('Delete', :danger)
# submit_button_tag('Big', :large)
# submit_button_tag('With Options', :small, :info, id: 'my-id')
# @overload submit_button_tag(text, type, size, options={})
# @param [String] text value of
# @param [String, Symbol] type type of button
# @param [String, Symbol] size size of button
# @param [Hash] options all options except +:disable_with+ become html attributes for tag
# @option options [String, false] :disable_with either override or turn off the disabling of the button
# @return [String]
def submit_button_tag(*args)
options = canonicalize_options(args.extract_options!)
value = if Bootstrap::ButtonHelper::BUTTON_ALL.include?(args.first.to_s)
"Save changes"
else
args.shift.presence || "Save changes"
end
button_classes = if args.present?
args.each { |e| raise(InvalidButtonModifierError, e.inspect) unless
Bootstrap::ButtonHelper::BUTTON_ALL.include?(e.to_s) }
['btn'] + args.map { |e| "btn-#{e}" }
else
['btn', 'btn-primary']
end
options = ensure_class(options, button_classes)
options[:disable_with] = "Processing ..." unless options.has_key?(:disable_with)
submit_tag(value, options)
end
end