formtastic 2.0.2 → 2.1.0.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +4 -1
- data/Appraisals +11 -0
- data/CHANGELOG +2 -2
- data/Gemfile +0 -2
- data/README.textile +183 -151
- data/Rakefile +9 -5
- data/app/assets/stylesheets/formtastic.css +16 -3
- data/formtastic.gemspec +6 -2
- data/gemfiles/rails-3.0.gemfile +7 -0
- data/gemfiles/rails-3.1.gemfile +7 -0
- data/gemfiles/rails-3.2.gemfile +7 -0
- data/lib/formtastic.rb +10 -2
- data/lib/formtastic/actions.rb +11 -0
- data/lib/formtastic/actions/base.rb +156 -0
- data/lib/formtastic/actions/button_action.rb +72 -0
- data/lib/formtastic/actions/buttonish.rb +17 -0
- data/lib/formtastic/actions/input_action.rb +68 -0
- data/lib/formtastic/actions/link_action.rb +87 -0
- data/lib/formtastic/engine.rb +5 -1
- data/lib/formtastic/form_builder.rb +3 -0
- data/lib/formtastic/helpers.rb +2 -1
- data/lib/formtastic/helpers/action_helper.rb +109 -0
- data/lib/formtastic/helpers/actions_helper.rb +168 -0
- data/lib/formtastic/helpers/buttons_helper.rb +22 -9
- data/lib/formtastic/helpers/errors_helper.rb +0 -54
- data/lib/formtastic/helpers/fieldset_wrapper.rb +10 -5
- data/lib/formtastic/helpers/form_helper.rb +2 -2
- data/lib/formtastic/helpers/input_helper.rb +1 -10
- data/lib/formtastic/helpers/inputs_helper.rb +6 -3
- data/lib/formtastic/i18n.rb +3 -2
- data/lib/formtastic/inputs/base.rb +11 -3
- data/lib/formtastic/inputs/base/choices.rb +6 -1
- data/lib/formtastic/inputs/base/collections.rb +36 -13
- data/lib/formtastic/inputs/base/grouped_collections.rb +1 -1
- data/lib/formtastic/inputs/base/numeric.rb +50 -0
- data/lib/formtastic/inputs/base/options.rb +1 -1
- data/lib/formtastic/inputs/base/placeholder.rb +17 -0
- data/lib/formtastic/inputs/base/stringish.rb +2 -7
- data/lib/formtastic/inputs/base/timeish.rb +21 -5
- data/lib/formtastic/inputs/base/validations.rb +1 -1
- data/lib/formtastic/inputs/base/wrapping.rb +10 -3
- data/lib/formtastic/inputs/boolean_input.rb +10 -2
- data/lib/formtastic/inputs/check_boxes_input.rb +18 -9
- data/lib/formtastic/inputs/country_input.rb +2 -2
- data/lib/formtastic/inputs/date_input.rb +19 -1
- data/lib/formtastic/inputs/datetime_input.rb +1 -1
- data/lib/formtastic/inputs/email_input.rb +2 -1
- data/lib/formtastic/inputs/file_input.rb +1 -1
- data/lib/formtastic/inputs/hidden_input.rb +1 -1
- data/lib/formtastic/inputs/number_input.rb +6 -36
- data/lib/formtastic/inputs/password_input.rb +2 -1
- data/lib/formtastic/inputs/phone_input.rb +3 -2
- data/lib/formtastic/inputs/radio_input.rb +1 -1
- data/lib/formtastic/inputs/range_input.rb +8 -32
- data/lib/formtastic/inputs/search_input.rb +2 -1
- data/lib/formtastic/inputs/select_input.rb +56 -28
- data/lib/formtastic/inputs/string_input.rb +3 -1
- data/lib/formtastic/inputs/text_input.rb +5 -4
- data/lib/formtastic/inputs/time_input.rb +4 -8
- data/lib/formtastic/inputs/time_zone_input.rb +1 -1
- data/lib/formtastic/inputs/url_input.rb +2 -1
- data/lib/formtastic/localized_string.rb +6 -94
- data/lib/formtastic/localizer.rb +110 -0
- data/lib/formtastic/version.rb +1 -1
- data/lib/generators/formtastic/form/form_generator.rb +105 -0
- data/lib/generators/templates/_form.html.erb +2 -2
- data/lib/generators/templates/_form.html.haml +4 -4
- data/lib/generators/templates/_form.html.slim +2 -2
- data/lib/generators/templates/formtastic.rb +4 -0
- data/lib/locale/en.yml +2 -0
- data/sample/basic_inputs.html +22 -0
- data/spec/actions/button_action_spec.rb +63 -0
- data/spec/actions/generic_action_spec.rb +484 -0
- data/spec/actions/input_action_spec.rb +59 -0
- data/spec/actions/link_action_spec.rb +92 -0
- data/spec/builder/semantic_fields_for_spec.rb +14 -0
- data/spec/generators/formtastic/form/form_generator_spec.rb +118 -0
- data/spec/generators/formtastic/install/install_generator_spec.rb +47 -0
- data/spec/helpers/action_helper_spec.rb +365 -0
- data/spec/helpers/actions_helper_spec.rb +143 -0
- data/spec/helpers/buttons_helper_spec.rb +39 -23
- data/spec/helpers/commit_button_helper_spec.rb +153 -93
- data/spec/helpers/inputs_helper_spec.rb +14 -0
- data/spec/i18n_spec.rb +11 -0
- data/spec/inputs/boolean_input_spec.rb +31 -2
- data/spec/inputs/check_boxes_input_spec.rb +29 -1
- data/spec/inputs/date_input_spec.rb +95 -0
- data/spec/inputs/datetime_input_spec.rb +49 -0
- data/spec/inputs/email_input_spec.rb +28 -0
- data/spec/inputs/file_input_spec.rb +28 -0
- data/spec/inputs/hidden_input_spec.rb +28 -0
- data/spec/inputs/include_blank_spec.rb +53 -45
- data/spec/inputs/number_input_spec.rb +34 -4
- data/spec/inputs/password_input_spec.rb +28 -0
- data/spec/inputs/phone_input_spec.rb +28 -0
- data/spec/inputs/placeholder_spec.rb +10 -10
- data/spec/inputs/radio_input_spec.rb +51 -6
- data/spec/inputs/range_input_spec.rb +30 -2
- data/spec/inputs/search_input_spec.rb +27 -0
- data/spec/inputs/select_input_spec.rb +52 -6
- data/spec/inputs/string_input_spec.rb +28 -0
- data/spec/inputs/text_input_spec.rb +27 -0
- data/spec/inputs/time_input_spec.rb +67 -1
- data/spec/inputs/time_zone_input_spec.rb +28 -0
- data/spec/inputs/url_input_spec.rb +28 -0
- data/spec/inputs/with_options_spec.rb +43 -0
- data/spec/spec_helper.rb +22 -6
- data/spec/support/custom_macros.rb +6 -134
- data/spec/support/test_environment.rb +0 -1
- metadata +104 -17
- data/lib/formtastic/helpers/semantic_form_helper.rb +0 -11
- data/lib/formtastic/inputs/numeric_input.rb +0 -21
- data/lib/formtastic/railtie.rb +0 -12
- data/lib/formtastic/semantic_form_builder.rb +0 -11
- data/spec/builder/errors_spec.rb +0 -203
- data/spec/inputs/numeric_input_spec.rb +0 -41
data/Rakefile
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
require '
|
|
3
|
-
require '
|
|
4
|
-
require '
|
|
2
|
+
require 'bundler/setup'
|
|
3
|
+
require 'appraisal'
|
|
4
|
+
require 'rdoc/task'
|
|
5
5
|
require 'rspec/core/rake_task'
|
|
6
6
|
require 'tasks/verify_rcov'
|
|
7
|
-
require 'bundler'
|
|
8
7
|
|
|
9
8
|
Bundler::GemHelper.install_tasks
|
|
10
9
|
|
|
11
10
|
desc 'Default: run unit specs.'
|
|
12
|
-
task :default => :
|
|
11
|
+
task :default => :all
|
|
12
|
+
|
|
13
|
+
desc 'Test formtastic with all supported Rails versions.'
|
|
14
|
+
task :all => ["appraisal:install"] do
|
|
15
|
+
exec('rake appraisal spec')
|
|
16
|
+
end
|
|
13
17
|
|
|
14
18
|
desc 'Generate documentation for the formtastic plugin.'
|
|
15
19
|
Rake::RDocTask.new(:rdoc) do |rdoc|
|
|
@@ -18,6 +18,7 @@ This stylesheet forms part of the Formtastic Rails Plugin
|
|
|
18
18
|
.formtastic fieldset,
|
|
19
19
|
.formtastic legend,
|
|
20
20
|
.formtastic input,
|
|
21
|
+
.formtastic button,
|
|
21
22
|
.formtastic textarea,
|
|
22
23
|
.formtastic select,
|
|
23
24
|
.formtastic p {
|
|
@@ -47,6 +48,7 @@ This stylesheet forms part of the Formtastic Rails Plugin
|
|
|
47
48
|
}
|
|
48
49
|
|
|
49
50
|
.formtastic input,
|
|
51
|
+
.formtastic button,
|
|
50
52
|
.formtastic textarea {
|
|
51
53
|
font-family:sans-serif;
|
|
52
54
|
font-size:inherit;
|
|
@@ -80,18 +82,29 @@ This stylesheet forms part of the Formtastic Rails Plugin
|
|
|
80
82
|
}
|
|
81
83
|
|
|
82
84
|
|
|
83
|
-
/* BUTTONS
|
|
85
|
+
/* BUTTONS & ACTIONS
|
|
84
86
|
--------------------------------------------------------------------------------------------------*/
|
|
85
|
-
.formtastic .buttons
|
|
87
|
+
.formtastic .buttons,
|
|
88
|
+
.formtastic .actions {
|
|
86
89
|
overflow:hidden; /* clear containing floats */
|
|
87
90
|
padding-left:25%;
|
|
88
91
|
}
|
|
89
92
|
|
|
90
|
-
.formtastic .button
|
|
93
|
+
.formtastic .button,
|
|
94
|
+
.formtastic .action {
|
|
91
95
|
float:left;
|
|
92
96
|
padding-right:0.5em;
|
|
93
97
|
}
|
|
94
98
|
|
|
99
|
+
.formtastic .button_action button {
|
|
100
|
+
padding:3px 8px;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.formtastic .link_action a {
|
|
104
|
+
display:block;
|
|
105
|
+
padding:3px 0;
|
|
106
|
+
}
|
|
107
|
+
|
|
95
108
|
|
|
96
109
|
/* INPUTS
|
|
97
110
|
--------------------------------------------------------------------------------------------------*/
|
data/formtastic.gemspec
CHANGED
|
@@ -23,13 +23,17 @@ Gem::Specification.new do |s|
|
|
|
23
23
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
24
24
|
s.rubygems_version = %q{1.3.6}
|
|
25
25
|
|
|
26
|
-
s.add_dependency(%q<
|
|
26
|
+
s.add_dependency(%q<actionpack>, ["~> 3.0"])
|
|
27
27
|
|
|
28
|
-
s.add_development_dependency(%q<rspec-rails>, ["~> 2.
|
|
28
|
+
s.add_development_dependency(%q<rspec-rails>, ["~> 2.8.0"])
|
|
29
29
|
s.add_development_dependency(%q<rspec_tag_matchers>, [">= 1.0.0"])
|
|
30
30
|
s.add_development_dependency(%q<hpricot>, ["~> 0.8.3"])
|
|
31
31
|
s.add_development_dependency(%q<BlueCloth>) # for YARD
|
|
32
32
|
s.add_development_dependency(%q<yard>, ["~> 0.6"])
|
|
33
33
|
s.add_development_dependency(%q<rcov>, ["~> 0.9.9"])
|
|
34
34
|
s.add_development_dependency(%q<colored>)
|
|
35
|
+
s.add_development_dependency(%q<tzinfo>)
|
|
36
|
+
s.add_development_dependency(%q<ammeter>, ["~> 0.2.2"])
|
|
37
|
+
s.add_development_dependency(%q<appraisal>)
|
|
38
|
+
s.add_development_dependency(%q<rake>)
|
|
35
39
|
end
|
data/lib/formtastic.rb
CHANGED
|
@@ -1,25 +1,33 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
require 'formtastic/railtie' if defined?(::Rails)
|
|
3
2
|
require 'formtastic/engine' if defined?(::Rails)
|
|
4
3
|
|
|
5
4
|
module Formtastic
|
|
6
5
|
extend ActiveSupport::Autoload
|
|
7
6
|
|
|
8
7
|
autoload :FormBuilder
|
|
9
|
-
autoload :SemanticFormBuilder
|
|
10
8
|
autoload :Helpers
|
|
11
9
|
autoload :HtmlAttributes
|
|
12
10
|
autoload :I18n
|
|
13
11
|
autoload :Inputs
|
|
12
|
+
autoload :Actions
|
|
14
13
|
autoload :LocalizedString
|
|
14
|
+
autoload :Localizer
|
|
15
15
|
autoload :Util
|
|
16
16
|
|
|
17
17
|
# @private
|
|
18
18
|
class UnknownInputError < NameError
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
+
# @private
|
|
22
|
+
class UnknownActionError < NameError
|
|
23
|
+
end
|
|
24
|
+
|
|
21
25
|
# @private
|
|
22
26
|
class PolymorphicInputWithoutCollectionError < ArgumentError
|
|
23
27
|
end
|
|
24
28
|
|
|
29
|
+
# @private
|
|
30
|
+
class UnsupportedMethodForAction < ArgumentError
|
|
31
|
+
end
|
|
32
|
+
|
|
25
33
|
end
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
module Formtastic
|
|
2
|
+
module Actions
|
|
3
|
+
module Base
|
|
4
|
+
include Formtastic::LocalizedString
|
|
5
|
+
|
|
6
|
+
attr_accessor :builder, :template, :object, :object_name, :method, :options
|
|
7
|
+
|
|
8
|
+
def initialize(builder, template, object, object_name, method, options)
|
|
9
|
+
@builder = builder
|
|
10
|
+
@template = template
|
|
11
|
+
@object = object
|
|
12
|
+
@object_name = object_name
|
|
13
|
+
@method = method
|
|
14
|
+
@options = options.dup
|
|
15
|
+
|
|
16
|
+
check_supported_methods!
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def to_html
|
|
20
|
+
raise NotImplementedError
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def wrapper(&block)
|
|
24
|
+
template.content_tag(:li,
|
|
25
|
+
template.capture(&block),
|
|
26
|
+
wrapper_html_options
|
|
27
|
+
)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def wrapper_html_options
|
|
31
|
+
wrapper_html_options_from_options.merge(default_wrapper_html_options)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def wrapper_html_options_from_options
|
|
35
|
+
options[:wrapper_html] || {}
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def default_wrapper_html_options
|
|
39
|
+
{
|
|
40
|
+
:class => wrapper_class,
|
|
41
|
+
:id => wrapper_id
|
|
42
|
+
}
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def wrapper_class
|
|
46
|
+
(default_wrapper_classes << wrapper_classes_from_options).join(" ")
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def default_wrapper_classes
|
|
50
|
+
["action", "#{options[:as]}_action"]
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def wrapper_classes_from_options
|
|
54
|
+
classes = wrapper_html_options_from_options[:class] || []
|
|
55
|
+
classes = classes.split(" ") if classes.is_a? String
|
|
56
|
+
classes
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def wrapper_html_options_from_options
|
|
60
|
+
options[:wrapper_html] || {}
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def wrapper_id
|
|
64
|
+
wrapper_id_from_options || default_wrapper_id
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def wrapper_id_from_options
|
|
68
|
+
wrapper_html_options_from_options[:id]
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def default_wrapper_id
|
|
72
|
+
"#{object_name}_#{method}_action"
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def supported_methods
|
|
76
|
+
raise NotImplementedError
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def text
|
|
80
|
+
text = options[:label]
|
|
81
|
+
text = (localized_string(i18n_key, text, :action, :model => sanitized_object_name) ||
|
|
82
|
+
Formtastic::I18n.t(i18n_key, :model => sanitized_object_name)) unless text.is_a?(::String)
|
|
83
|
+
text
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def button_html
|
|
87
|
+
default_button_html.merge(button_html_from_options || {}).merge(extra_button_html_options)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def button_html_from_options
|
|
91
|
+
options[:button_html]
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def extra_button_html_options
|
|
95
|
+
{}
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def default_button_html
|
|
99
|
+
{ :accesskey => accesskey }
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def accesskey
|
|
103
|
+
# TODO could be cleaner and separated, remember that nil is an allowed value for all of these
|
|
104
|
+
return options[:accesskey] if options.key?(:accesskey)
|
|
105
|
+
return options[:button_html][:accesskey] if options.key?(:button_html) && options[:button_html].key?(:accesskey)
|
|
106
|
+
# TODO might be different for cancel, etc?
|
|
107
|
+
return builder.default_commit_button_accesskey
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
protected
|
|
112
|
+
|
|
113
|
+
def check_supported_methods!
|
|
114
|
+
raise Formtastic::UnsupportedMethodForAction unless supported_methods.include?(method)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def i18n_key
|
|
118
|
+
return submit_i18n_key if method == :submit
|
|
119
|
+
method
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def submit_i18n_key
|
|
123
|
+
if new_or_persisted_object?
|
|
124
|
+
key = @object.persisted? ? :update : :create
|
|
125
|
+
else
|
|
126
|
+
key = :submit
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def new_or_persisted_object?
|
|
131
|
+
object && (object.respond_to?(:persisted?) || object.respond_to?(:new_record?))
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def sanitized_object_name
|
|
135
|
+
if new_or_persisted_object?
|
|
136
|
+
# Deal with some complications with ActiveRecord::Base.human_name and two name models (eg UserPost)
|
|
137
|
+
# ActiveRecord::Base.human_name falls back to ActiveRecord::Base.name.humanize ("Userpost")
|
|
138
|
+
# if there's no i18n, which is pretty crappy. In this circumstance we want to detect this
|
|
139
|
+
# fall back (human_name == name.humanize) and do our own thing name.underscore.humanize ("User Post")
|
|
140
|
+
if object.class.model_name.respond_to?(:human)
|
|
141
|
+
sanitized_object_name = object.class.model_name.human
|
|
142
|
+
else
|
|
143
|
+
object_human_name = @object.class.human_name # default is UserPost => "Userpost", but i18n may do better ("User post")
|
|
144
|
+
crappy_human_name = @object.class.name.humanize # UserPost => "Userpost"
|
|
145
|
+
decent_human_name = @object.class.name.underscore.humanize # UserPost => "User post"
|
|
146
|
+
sanitized_object_name = (object_human_name == crappy_human_name) ? decent_human_name : object_human_name
|
|
147
|
+
end
|
|
148
|
+
else
|
|
149
|
+
sanitized_object_name = object_name.to_s.send(builder.label_str_method)
|
|
150
|
+
end
|
|
151
|
+
sanitized_object_name
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Outputs a `<button type="submit">` or `<button type="reset">` wrapped in the standard `<li>`
|
|
2
|
+
# wrapper. This is an alternative choice for `:submit` and `:reset` actions, which render with
|
|
3
|
+
# `<input type="submit">` and `<input type="reset">` by default.
|
|
4
|
+
#
|
|
5
|
+
# @example Full form context and output
|
|
6
|
+
#
|
|
7
|
+
# <%= semantic_form_for(@post) do |f| %>
|
|
8
|
+
# <%= f.actions do %>
|
|
9
|
+
# <%= f.action :reset, :as => :button %>
|
|
10
|
+
# <%= f.action :submit, :as => :button %>
|
|
11
|
+
# <% end %>
|
|
12
|
+
# <% end %>
|
|
13
|
+
#
|
|
14
|
+
# <form...>
|
|
15
|
+
# <fieldset class="actions">
|
|
16
|
+
# <ol>
|
|
17
|
+
# <li class="action button_action" id="post_submit_action">
|
|
18
|
+
# <button type="reset" value="Reset">
|
|
19
|
+
# </li>
|
|
20
|
+
# <li class="action button_action" id="post_reset_action">
|
|
21
|
+
# <button type="submit" value="Create Post">
|
|
22
|
+
# </li>
|
|
23
|
+
# </ol>
|
|
24
|
+
# </fieldset>
|
|
25
|
+
# </form>
|
|
26
|
+
#
|
|
27
|
+
# @example Specifying a label with a String
|
|
28
|
+
# <%= f.action :submit, :as => :button, :label => "Go" %>
|
|
29
|
+
#
|
|
30
|
+
# @example Pass HTML attributes down to the `<button>`
|
|
31
|
+
# <%= f.action :submit, :as => :button, :button_html => { :class => 'pretty', :accesskey => 'g', :disable_with => "Wait..." } %>
|
|
32
|
+
#
|
|
33
|
+
# @example Access key can also be set as a top-level option
|
|
34
|
+
# <%= f.action :submit, :as => :button, :accesskey => 'g' %>
|
|
35
|
+
#
|
|
36
|
+
# @example Pass HTML attributes down to the `<li>` wrapper (classes are appended to the existing classes)
|
|
37
|
+
# <%= f.action :submit, :as => :button, :wrapper_html => { :class => 'special', :id => 'whatever' } %>
|
|
38
|
+
# <%= f.action :submit, :as => :button, :wrapper_html => { :class => ['extra', 'special'], :id => 'whatever' } %>
|
|
39
|
+
#
|
|
40
|
+
# @option *args :label [String, Symbol]
|
|
41
|
+
# Override the label text with a String or a symbol for an i18n translation key
|
|
42
|
+
#
|
|
43
|
+
# @option *args :button_html [Hash]
|
|
44
|
+
# Override or add to the HTML attributes to be passed down to the `<input>` tag
|
|
45
|
+
#
|
|
46
|
+
# @option *args :wrapper_html [Hash]
|
|
47
|
+
# Override or add to the HTML attributes to be passed down to the wrapping `<li>` tag
|
|
48
|
+
#
|
|
49
|
+
# @todo document i18n keys
|
|
50
|
+
# @todo document i18n translation with :label (?)
|
|
51
|
+
module Formtastic
|
|
52
|
+
module Actions
|
|
53
|
+
class ButtonAction
|
|
54
|
+
include Base
|
|
55
|
+
include Buttonish
|
|
56
|
+
|
|
57
|
+
# TODO absolutely horrible hack to work-around Rails < 3.1 missing button_tag, need
|
|
58
|
+
# to figure out something more appropriate.
|
|
59
|
+
#
|
|
60
|
+
# TODO reset_action class?
|
|
61
|
+
def to_html
|
|
62
|
+
wrapper do
|
|
63
|
+
if template.respond_to?(:button_tag)
|
|
64
|
+
template.button_tag(text, button_html)
|
|
65
|
+
else
|
|
66
|
+
template.content_tag(:button, text, button_html)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Outputs an `<input type="submit">` or `<input type="reset">` wrapped in the standard `<li>`
|
|
2
|
+
# wrapper. This the default for `:submit` and `:reset` actions, but `:as => :button` is also
|
|
3
|
+
# available as an alternative.
|
|
4
|
+
#
|
|
5
|
+
# @example The `:as` can be ommitted, these are functionally equivalent
|
|
6
|
+
# <%= f.action :submit, :as => :input %>
|
|
7
|
+
# <%= f.action :submit %>
|
|
8
|
+
#
|
|
9
|
+
# @example Full form context and output
|
|
10
|
+
#
|
|
11
|
+
# <%= semantic_form_for(@post) do |f| %>
|
|
12
|
+
# <%= f.actions do %>
|
|
13
|
+
# <%= f.action :reset, :as => :input %>
|
|
14
|
+
# <%= f.action :submit, :as => :input %>
|
|
15
|
+
# <% end %>
|
|
16
|
+
# <% end %>
|
|
17
|
+
#
|
|
18
|
+
# <form...>
|
|
19
|
+
# <fieldset class="actions">
|
|
20
|
+
# <ol>
|
|
21
|
+
# <li class="action input_action" id="post_submit_action">
|
|
22
|
+
# <input type="reset" value="Reset">
|
|
23
|
+
# </li>
|
|
24
|
+
# <li class="action input_action" id="post_reset_action">
|
|
25
|
+
# <input type="submit" value="Create Post">
|
|
26
|
+
# </li>
|
|
27
|
+
# </ol>
|
|
28
|
+
# </fieldset>
|
|
29
|
+
# </form>
|
|
30
|
+
#
|
|
31
|
+
# @example Specifying a label with a String
|
|
32
|
+
# <%= f.action :submit, :as => :input, :label => "Go" %>
|
|
33
|
+
#
|
|
34
|
+
# @example Pass HTML attributes down to the `<input>`
|
|
35
|
+
# <%= f.action :submit, :as => :input, :button_html => { :class => 'pretty', :accesskey => 'g', :disable_with => "Wait..." } %>
|
|
36
|
+
#
|
|
37
|
+
# @example Access key can also be set as a top-level option
|
|
38
|
+
# <%= f.action :submit, :as => :input, :accesskey => 'g' %>
|
|
39
|
+
#
|
|
40
|
+
# @example Pass HTML attributes down to the `<li>` wrapper (classes are appended to the existing classes)
|
|
41
|
+
# <%= f.action :submit, :as => :input, :wrapper_html => { :class => 'special', :id => 'whatever' } %>
|
|
42
|
+
# <%= f.action :submit, :as => :input, :wrapper_html => { :class => ['extra', 'special'], :id => 'whatever' } %>
|
|
43
|
+
#
|
|
44
|
+
# @option *args :label [String, Symbol]
|
|
45
|
+
# Override the label text with a String or a symbol for an i18n translation key
|
|
46
|
+
#
|
|
47
|
+
# @option *args :button_html [Hash]
|
|
48
|
+
# Override or add to the HTML attributes to be passed down to the `<input>` tag
|
|
49
|
+
#
|
|
50
|
+
# @option *args :wrapper_html [Hash]
|
|
51
|
+
# Override or add to the HTML attributes to be passed down to the wrapping `<li>` tag
|
|
52
|
+
#
|
|
53
|
+
# @todo document i18n keys
|
|
54
|
+
# @todo document i18n translation with :label (?)
|
|
55
|
+
module Formtastic
|
|
56
|
+
module Actions
|
|
57
|
+
class InputAction
|
|
58
|
+
include Base
|
|
59
|
+
include Buttonish
|
|
60
|
+
|
|
61
|
+
def to_html
|
|
62
|
+
wrapper do
|
|
63
|
+
builder.submit(text, button_html)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|