module Formtastic
module Helpers
# ActionsHelper encapsulates the responsibilties of the {#actions} DSL for acting on
# (submitting, cancelling, resetting) forms.
#
# {#actions} is a block helper used to wrap the form's actions (buttons, links) in a
# `
` and ``, with each item in the list containing the markup representing a
# single action.
#
# <%= semantic_form_for @post do |f| %>
# ...
# <%= f.actions do %>
# <%= f.action :submit
# <%= f.action :cancel
# <% end %>
# <% end %>
#
# The HTML output will be something like:
#
#
#
# It's important to note that the `semantic_form_for` and {#actions} blocks wrap the
# standard Rails `form_for` helper and form builder, so you have full access to every standard
# Rails form helper, with any HTML markup and ERB syntax, allowing you to "break free" from
# Formtastic when it doesn't suit to create your own buttons, links and actions:
#
# <%= semantic_form_for @post do |f| %>
# ...
# <%= f.actions do %>
#
# <%= f.submit "Save" %>
#
#
# Or <%= link_to "Cancel", posts_url %>
#
# <% end %>
# <% end %>
#
# There are many other syntax variations and arguments to customize your form. See the
# full documentation of {#actions} and {#action} for details.
module ActionsHelper
include Formtastic::Helpers::FieldsetWrapper
# Creates a fieldset and ol tag wrapping for use around a set of buttons. It can be
# called either with a block (in which you can do the usual Rails form stuff, HTML, ERB, etc),
# or with a list of named actions. These two examples are functionally equivalent:
#
# # With a block:
# <% semantic_form_for @post do |f| %>
# ...
# <% f.actions do %>
# <%= f.action :submit %>
# <%= f.action :cancel %>
# <% end %>
# <% end %>
#
# # With a list of fields:
# <% semantic_form_for @post do |f| %>
# <%= f.actions :submit, :cancel %>
# <% end %>
#
# # Output:
#
#
# All options except `:name` and `:title` are passed down to the fieldset as HTML
# attributes (`id`, `class`, `style`...). If provided, the `:name` or `:title` option is
# passed into a `` inside the ` ` to name the set of buttons.
#
# @example Quickly add button(s) to the form, accepting all default values, options and behaviors
# <% semantic_form_for @post do |f| %>
# ...
# <%= f.actions %>
# <% end %>
#
# @example Specify which named buttons you want, accepting all default values, options and behaviors
# <% semantic_form_for @post do |f| %>
# ...
# <%= f.actions :commit %>
# <% end %>
#
# @example Specify which named buttons you want, and name the fieldset
# <% semantic_form_for @post do |f| %>
# ...
# <%= f.actions :commit, :name => "Actions" %>
# or
# <%= f.actions :commit, :label => "Actions" %>
# <% end %>
#
# @example Get full control over the action options
# <% semantic_form_for @post do |f| %>
# ...
# <%= f.actions do %>
# <%= f.action :label => "Go", :button_html => { :class => "pretty" :disable_with => "Wait..." }, :wrapper_html => { ... }
# <% end %>
# <% end %>
#
# @example Make your own actions with standard Rails helpers or HTML
# <% semantic_form_for @post do |f| %>
# <%= f.actions do %>
#
# ...
#
# <% end %>
# <% end %>
#
# @example Add HTML attributes to the fieldset
# <% semantic_form_for @post do |f| %>
# ...
# <%= f.actions :commit, :style => "border:1px;" %>
# or
# <%= f.actions :style => "border:1px;" do %>
# ...
# <% end %>
# <% end %>
#
# @option *args :label [String, Symbol]
# Optionally specify text for the legend of the fieldset
#
# @option *args :name [String, Symbol]
# Optionally specify text for the legend of the fieldset (alias for `:label`)
#
# @todo document i18n keys
def actions(*args, &block)
html_options = args.extract_options!
html_options[:class] ||= "actions"
if block_given?
field_set_and_list_wrapping(html_options, &block)
else
args = default_actions if args.empty?
contents = args.map { |action_name| action(action_name) }
field_set_and_list_wrapping(html_options, contents)
end
end
protected
def default_actions
[:submit]
end
end
end
end