format :html do
def success_tags opts
return "" unless opts.present?
hidden_tags success: opts
end
# convert hash into a collection of hidden tags
def hidden_tags hash, base=nil
hash ||= {}
hash.inject("") do |result, (key, val)|
new_base = base ? "#{base}[#{key}]" : key
result + process_hidden_value(val, new_base)
end
end
def process_hidden_value val, base
case val
when Hash
hidden_tags val, base
when Array
base += "[]"
val.map do |v|
hidden_field_tag base, v
end.join
else
hidden_field_tag base, val
end
end
FIELD_HELPERS =
%w[
hidden_field color_field date_field datetime_field datetime_local_field
email_field month_field number_field password_field phone_field
range_field search_field telephone_field text_area text_field time_field
url_field week_field file_field label check_box radio_button
].freeze
FIELD_HELPERS.each do |method_name|
define_method(method_name) do |*args|
form.send(method_name, *args)
end
end
# Generates an HTML submit button with optional parameters.
#
# @param [Hash] args The options for the submit button.
# @option args [String] :text ("Submit") The text displayed on the button.
# @option args [String] :situation ("primary") The visual style of the button.
# Possible values: "primary", "secondary", "success", "danger", etc.
# @option args [Hash] :data ({}) Additional data attributes for the button.
# @option args [String] :disable_with ("Submitting") Text to display on the button
# while it is being submitted/disabled.
#
# @return [String] The HTML code for the submit button.
#
# @example
# submit_button(text: "Create", situation: "success", disable_with: "Creating")
def submit_button args={}
text = args.delete(:text) || "Submit"
args.reverse_merge! situation: "primary", data: {}
args[:data][:disable_with] ||= args.delete(:disable_with) || "Submitting"
button_tag text, args
end
# redirect to *previous if no :href is given
def cancel_button args={}
return unless voo.show? :cancel_button
text = args.delete(:text) || "Cancel"
add_class args, "btn btn-#{args.delete(:situation) || 'secondary'}"
add_class args, cancel_strategy(args[:redirect], args[:href])
args[:href] ||= path_to_previous
args["data-remote"] = true
link_to text, args
end
def cancel_strategy redirect, href
redirect = href.blank? if redirect.nil?
redirect ? "redirecter" : "slotter"
end
def path_to_previous
path mark: "*previous"
end
end