formtastic 1.2.4 → 3.1.5

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.
Files changed (189) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +46 -0
  5. data/.yardopts +1 -0
  6. data/Appraisals +43 -0
  7. data/CHANGELOG +54 -0
  8. data/DEPRECATIONS +52 -0
  9. data/Gemfile +3 -0
  10. data/README.md +629 -0
  11. data/RELEASE_PROCESS +6 -0
  12. data/Rakefile +35 -0
  13. data/app/assets/stylesheets/formtastic.css +289 -0
  14. data/app/assets/stylesheets/formtastic_ie6.css +33 -0
  15. data/app/assets/stylesheets/formtastic_ie7.css +23 -0
  16. data/formtastic.gemspec +42 -0
  17. data/gemfiles/rails_3.2.gemfile +9 -0
  18. data/gemfiles/rails_4.0.4.gemfile +8 -0
  19. data/gemfiles/rails_4.1.gemfile +8 -0
  20. data/gemfiles/rails_4.2.gemfile +8 -0
  21. data/gemfiles/rails_4.gemfile +8 -0
  22. data/gemfiles/rails_5.0.gemfile +8 -0
  23. data/gemfiles/rails_edge.gemfile +15 -0
  24. data/lib/formtastic.rb +40 -1945
  25. data/lib/formtastic/action_class_finder.rb +18 -0
  26. data/lib/formtastic/actions.rb +11 -0
  27. data/lib/formtastic/actions/base.rb +156 -0
  28. data/lib/formtastic/actions/button_action.rb +67 -0
  29. data/lib/formtastic/actions/buttonish.rb +17 -0
  30. data/lib/formtastic/actions/input_action.rb +70 -0
  31. data/lib/formtastic/actions/link_action.rb +88 -0
  32. data/lib/formtastic/deprecation.rb +42 -0
  33. data/lib/formtastic/engine.rb +11 -0
  34. data/lib/formtastic/form_builder.rb +124 -0
  35. data/lib/formtastic/helpers.rb +16 -0
  36. data/lib/formtastic/helpers/action_helper.rb +162 -0
  37. data/lib/formtastic/helpers/actions_helper.rb +168 -0
  38. data/lib/formtastic/helpers/enum.rb +13 -0
  39. data/lib/formtastic/helpers/errors_helper.rb +81 -0
  40. data/lib/formtastic/helpers/fieldset_wrapper.rb +80 -0
  41. data/lib/formtastic/helpers/file_column_detection.rb +16 -0
  42. data/lib/formtastic/helpers/form_helper.rb +203 -0
  43. data/lib/formtastic/helpers/input_helper.rb +407 -0
  44. data/lib/formtastic/helpers/inputs_helper.rb +411 -0
  45. data/lib/formtastic/helpers/reflection.rb +37 -0
  46. data/lib/formtastic/html_attributes.rb +32 -0
  47. data/lib/formtastic/i18n.rb +4 -2
  48. data/lib/formtastic/input_class_finder.rb +18 -0
  49. data/lib/formtastic/inputs.rb +39 -0
  50. data/lib/formtastic/inputs/base.rb +76 -0
  51. data/lib/formtastic/inputs/base/associations.rb +31 -0
  52. data/lib/formtastic/inputs/base/choices.rb +108 -0
  53. data/lib/formtastic/inputs/base/collections.rb +159 -0
  54. data/lib/formtastic/inputs/base/database.rb +22 -0
  55. data/lib/formtastic/inputs/base/datetime_pickerish.rb +85 -0
  56. data/lib/formtastic/inputs/base/errors.rb +58 -0
  57. data/lib/formtastic/inputs/base/fileish.rb +23 -0
  58. data/lib/formtastic/inputs/base/hints.rb +31 -0
  59. data/lib/formtastic/inputs/base/html.rb +53 -0
  60. data/lib/formtastic/inputs/base/labelling.rb +52 -0
  61. data/lib/formtastic/inputs/base/naming.rb +42 -0
  62. data/lib/formtastic/inputs/base/numeric.rb +50 -0
  63. data/lib/formtastic/inputs/base/options.rb +17 -0
  64. data/lib/formtastic/inputs/base/placeholder.rb +17 -0
  65. data/lib/formtastic/inputs/base/stringish.rb +38 -0
  66. data/lib/formtastic/inputs/base/timeish.rb +241 -0
  67. data/lib/formtastic/inputs/base/validations.rb +215 -0
  68. data/lib/formtastic/inputs/base/wrapping.rb +50 -0
  69. data/lib/formtastic/inputs/boolean_input.rb +118 -0
  70. data/lib/formtastic/inputs/check_boxes_input.rb +197 -0
  71. data/lib/formtastic/inputs/color_input.rb +42 -0
  72. data/lib/formtastic/inputs/country_input.rb +86 -0
  73. data/lib/formtastic/inputs/datalist_input.rb +41 -0
  74. data/lib/formtastic/inputs/date_picker_input.rb +93 -0
  75. data/lib/formtastic/inputs/date_select_input.rb +34 -0
  76. data/lib/formtastic/inputs/datetime_picker_input.rb +103 -0
  77. data/lib/formtastic/inputs/datetime_select_input.rb +12 -0
  78. data/lib/formtastic/inputs/email_input.rb +41 -0
  79. data/lib/formtastic/inputs/file_input.rb +42 -0
  80. data/lib/formtastic/inputs/hidden_input.rb +62 -0
  81. data/lib/formtastic/inputs/number_input.rb +88 -0
  82. data/lib/formtastic/inputs/password_input.rb +41 -0
  83. data/lib/formtastic/inputs/phone_input.rb +42 -0
  84. data/lib/formtastic/inputs/radio_input.rb +163 -0
  85. data/lib/formtastic/inputs/range_input.rb +95 -0
  86. data/lib/formtastic/inputs/search_input.rb +41 -0
  87. data/lib/formtastic/inputs/select_input.rb +235 -0
  88. data/lib/formtastic/inputs/string_input.rb +36 -0
  89. data/lib/formtastic/inputs/text_input.rb +48 -0
  90. data/lib/formtastic/inputs/time_picker_input.rb +99 -0
  91. data/lib/formtastic/inputs/time_select_input.rb +38 -0
  92. data/lib/formtastic/inputs/time_zone_input.rb +58 -0
  93. data/lib/formtastic/inputs/url_input.rb +41 -0
  94. data/lib/formtastic/localized_string.rb +17 -0
  95. data/lib/formtastic/localizer.rb +152 -0
  96. data/lib/formtastic/namespaced_class_finder.rb +99 -0
  97. data/lib/formtastic/util.rb +35 -16
  98. data/lib/formtastic/version.rb +3 -0
  99. data/lib/generators/formtastic/form/form_generator.rb +64 -37
  100. data/lib/generators/formtastic/input/input_generator.rb +46 -0
  101. data/lib/generators/formtastic/install/install_generator.rb +13 -5
  102. data/lib/generators/templates/_form.html.erb +10 -4
  103. data/lib/generators/templates/_form.html.haml +8 -4
  104. data/lib/generators/templates/_form.html.slim +8 -0
  105. data/lib/generators/templates/formtastic.rb +77 -44
  106. data/lib/generators/templates/input.rb +19 -0
  107. data/lib/locale/en.yml +3 -0
  108. data/sample/basic_inputs.html +224 -0
  109. data/sample/config.ru +69 -0
  110. data/sample/index.html +14 -0
  111. data/spec/action_class_finder_spec.rb +12 -0
  112. data/spec/actions/button_action_spec.rb +63 -0
  113. data/spec/actions/generic_action_spec.rb +521 -0
  114. data/spec/actions/input_action_spec.rb +59 -0
  115. data/spec/actions/link_action_spec.rb +92 -0
  116. data/spec/builder/custom_builder_spec.rb +116 -0
  117. data/spec/builder/error_proc_spec.rb +27 -0
  118. data/spec/builder/semantic_fields_for_spec.rb +142 -0
  119. data/spec/fast_spec_helper.rb +12 -0
  120. data/spec/generators/formtastic/form/form_generator_spec.rb +131 -0
  121. data/spec/generators/formtastic/input/input_generator_spec.rb +124 -0
  122. data/spec/generators/formtastic/install/install_generator_spec.rb +47 -0
  123. data/spec/helpers/action_helper_spec.rb +19 -0
  124. data/spec/helpers/actions_helper_spec.rb +143 -0
  125. data/spec/helpers/form_helper_spec.rb +218 -0
  126. data/spec/helpers/input_helper_spec.rb +6 -0
  127. data/spec/helpers/inputs_helper_spec.rb +655 -0
  128. data/spec/helpers/namespaced_action_helper_spec.rb +43 -0
  129. data/spec/helpers/namespaced_input_helper_spec.rb +36 -0
  130. data/spec/helpers/reflection_helper_spec.rb +32 -0
  131. data/spec/helpers/semantic_errors_helper_spec.rb +112 -0
  132. data/spec/i18n_spec.rb +210 -0
  133. data/spec/input_class_finder_spec.rb +10 -0
  134. data/spec/inputs/base/collections_spec.rb +76 -0
  135. data/spec/inputs/base/validations_spec.rb +342 -0
  136. data/spec/inputs/boolean_input_spec.rb +254 -0
  137. data/spec/inputs/check_boxes_input_spec.rb +546 -0
  138. data/spec/inputs/color_input_spec.rb +97 -0
  139. data/spec/inputs/country_input_spec.rb +133 -0
  140. data/spec/inputs/custom_input_spec.rb +55 -0
  141. data/spec/inputs/datalist_input_spec.rb +61 -0
  142. data/spec/inputs/date_picker_input_spec.rb +449 -0
  143. data/spec/inputs/date_select_input_spec.rb +235 -0
  144. data/spec/inputs/datetime_picker_input_spec.rb +490 -0
  145. data/spec/inputs/datetime_select_input_spec.rb +193 -0
  146. data/spec/inputs/email_input_spec.rb +85 -0
  147. data/spec/inputs/file_input_spec.rb +89 -0
  148. data/spec/inputs/hidden_input_spec.rb +135 -0
  149. data/spec/inputs/include_blank_spec.rb +78 -0
  150. data/spec/inputs/label_spec.rb +149 -0
  151. data/spec/inputs/number_input_spec.rb +815 -0
  152. data/spec/inputs/password_input_spec.rb +99 -0
  153. data/spec/inputs/phone_input_spec.rb +85 -0
  154. data/spec/inputs/placeholder_spec.rb +71 -0
  155. data/spec/inputs/radio_input_spec.rb +328 -0
  156. data/spec/inputs/range_input_spec.rb +505 -0
  157. data/spec/inputs/readonly_spec.rb +50 -0
  158. data/spec/inputs/search_input_spec.rb +84 -0
  159. data/spec/inputs/select_input_spec.rb +615 -0
  160. data/spec/inputs/string_input_spec.rb +260 -0
  161. data/spec/inputs/text_input_spec.rb +187 -0
  162. data/spec/inputs/time_picker_input_spec.rb +455 -0
  163. data/spec/inputs/time_select_input_spec.rb +248 -0
  164. data/spec/inputs/time_zone_input_spec.rb +143 -0
  165. data/spec/inputs/url_input_spec.rb +85 -0
  166. data/spec/inputs/with_options_spec.rb +43 -0
  167. data/spec/localizer_spec.rb +130 -0
  168. data/spec/namespaced_class_finder_spec.rb +79 -0
  169. data/spec/spec.opts +2 -0
  170. data/spec/spec_helper.rb +525 -0
  171. data/spec/support/custom_macros.rb +564 -0
  172. data/spec/support/deprecation.rb +6 -0
  173. data/spec/support/shared_examples.rb +1313 -0
  174. data/spec/support/specialized_class_finder_shared_example.rb +27 -0
  175. data/spec/support/test_environment.rb +31 -0
  176. data/spec/util_spec.rb +66 -0
  177. metadata +434 -161
  178. data/README.textile +0 -682
  179. data/generators/form/USAGE +0 -16
  180. data/generators/form/form_generator.rb +0 -111
  181. data/generators/formtastic/formtastic_generator.rb +0 -26
  182. data/init.rb +0 -5
  183. data/lib/formtastic/layout_helper.rb +0 -12
  184. data/lib/formtastic/railtie.rb +0 -14
  185. data/lib/generators/templates/formtastic.css +0 -145
  186. data/lib/generators/templates/formtastic_changes.css +0 -14
  187. data/lib/generators/templates/rails2/_form.html.erb +0 -5
  188. data/lib/generators/templates/rails2/_form.html.haml +0 -4
  189. data/rails/init.rb +0 -2
@@ -0,0 +1,41 @@
1
+ module Formtastic
2
+ module Inputs
3
+ # Outputs a label and a text field, along with a datalist tag
4
+ # datalist tag provides a list of options which drives a simple autocomplete
5
+ # on the text field. This is a HTML5 feature, more info can be found at
6
+ # {https://developer.mozilla.org/en/docs/Web/HTML/Element/datalist <datalist> at MDN}
7
+ # This input accepts a :collection option which takes data in all the usual formats accepted by
8
+ # {http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/options_for_select options_for_select}
9
+ #
10
+ # @example Input is used as follows
11
+ # f.input :fav_book, :as => :datalist, :collection => Book.pluck(:name)
12
+ #
13
+ class DatalistInput
14
+ include Base
15
+ include Base::Stringish
16
+ include Base::Collections
17
+
18
+ def to_html
19
+ @name = input_html_options[:id].gsub(/_id$/, "")
20
+ input_wrapping do
21
+ label_html <<
22
+ builder.text_field(method, input_html_options) << # standard input
23
+ data_list_html # append new datalist element
24
+ end
25
+ end
26
+
27
+ def input_html_options
28
+ super.merge(:list => html_id_of_datalist)
29
+ end
30
+
31
+ def html_id_of_datalist
32
+ "#{@name}_datalist"
33
+ end
34
+
35
+ def data_list_html
36
+ html = builder.template.options_for_select(collection)
37
+ builder.template.content_tag(:datalist,html, { :id => html_id_of_datalist }, false)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,93 @@
1
+ module Formtastic
2
+ module Inputs
3
+
4
+ # Outputs a simple `<label>` with a HTML5 `<input type="date">` wrapped in the standard
5
+ # `<li>` wrapper. This is an alternative to `:date_select` for `:date`, `:time`, `:datetime`
6
+ # database columns. You can use this input with `:as => :date_picker`.
7
+ #
8
+ # *Please note:* Formtastic only provides suitable markup for a date picker, but does not supply
9
+ # any additional CSS or Javascript to render calendar-style date pickers. Browsers that support
10
+ # this input type (such as Mobile Webkit and Opera on the desktop) will render a native widget.
11
+ # Browsers that don't will default to a plain text field`<input type="text">` and can be
12
+ # poly-filled with some Javascript and a UI library of your choice.
13
+ #
14
+ # @example Full form context and output
15
+ #
16
+ # <%= semantic_form_for(@post) do |f| %>
17
+ # <%= f.inputs do %>
18
+ # <%= f.input :publish_at, :as => :date_picker %>
19
+ # <% end %>
20
+ # <% end %>
21
+ #
22
+ # <form...>
23
+ # <fieldset>
24
+ # <ol>
25
+ # <li class="string">
26
+ # <label for="post_publish_at">First name</label>
27
+ # <input type="date" id="post_publish_at" name="post[publish_at]">
28
+ # </li>
29
+ # </ol>
30
+ # </fieldset>
31
+ # </form>
32
+ #
33
+ # @example Setting the size (defaults to 10 for YYYY-MM-DD)
34
+ # <%= f.input :publish_at, :as => :date_picker, :size => 20 %>
35
+ # <%= f.input :publish_at, :as => :date_picker, :input_html => { :size => 20 } %>
36
+ #
37
+ # @example Setting the maxlength (defaults to 10 for YYYY-MM-DD)
38
+ # <%= f.input :publish_at, :as => :date_picker, :maxlength => 20 %>
39
+ # <%= f.input :publish_at, :as => :date_picker, :input_html => { :maxlength => 20 } %>
40
+ #
41
+ # @example Setting the value (defaults to YYYY-MM-DD for Date and Time objects, otherwise renders string)
42
+ # <%= f.input :publish_at, :as => :date_picker, :input_html => { :value => "1970-01-01" } %>
43
+ #
44
+ # @example Setting the step attribute (defaults to 1)
45
+ # <%= f.input :publish_at, :as => :date_picker, :step => 7 %>
46
+ # <%= f.input :publish_at, :as => :date_picker, :input_html => { :step => 7 } %>
47
+ #
48
+ # @example Setting the step attribute with a macro
49
+ # <%= f.input :publish_at, :as => :date_picker, :step => :day %>
50
+ # <%= f.input :publish_at, :as => :date_picker, :step => :week %>
51
+ # <%= f.input :publish_at, :as => :date_picker, :step => :seven_days %>
52
+ # <%= f.input :publish_at, :as => :date_picker, :step => :fortnight %>
53
+ # <%= f.input :publish_at, :as => :date_picker, :step => :two_weeks %>
54
+ # <%= f.input :publish_at, :as => :date_picker, :step => :four_weeks %>
55
+ # <%= f.input :publish_at, :as => :date_picker, :step => :thirty_days %>
56
+ #
57
+ # @example Setting the min attribute
58
+ # <%= f.input :publish_at, :as => :date_picker, :min => "2012-01-01" %>
59
+ # <%= f.input :publish_at, :as => :date_picker, :input_html => { :min => "2012-01-01" } %>
60
+ #
61
+ # @example Setting the max attribute
62
+ # <%= f.input :publish_at, :as => :date_picker, :max => "2012-12-31" %>
63
+ # <%= f.input :publish_at, :as => :date_picker, :input_html => { :max => "2012-12-31" } %>
64
+ #
65
+ # @example Setting the placeholder attribute
66
+ # <%= f.input :publish_at, :as => :date_picker, :placeholder => 20 %>
67
+ # <%= f.input :publish_at, :as => :date_picker, :input_html => { :placeholder => "YYYY-MM-DD" } %>
68
+ #
69
+ # @see Formtastic::Helpers::InputsHelper#input InputsHelper#input for full documentation of all possible options.
70
+ class DatePickerInput
71
+ include Base
72
+ include Base::Stringish
73
+ include Base::DatetimePickerish
74
+
75
+ def html_input_type
76
+ "date"
77
+ end
78
+
79
+ def default_size
80
+ 10
81
+ end
82
+
83
+ def value
84
+ return options[:input_html][:value] if options[:input_html] && options[:input_html].key?(:value)
85
+ val = object.send(method)
86
+ return Date.new(val.year, val.month, val.day).to_s if val.is_a?(Time)
87
+ return val if val.nil?
88
+ val.to_s
89
+ end
90
+
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,34 @@
1
+ module Formtastic
2
+ module Inputs
3
+ # Outputs a series of select boxes for the fragments that make up a date (year, month, day).
4
+ #
5
+ # @see Formtastic::Inputs::Base::Timeish Timeish module for documentation of date, time and datetime input options.
6
+ class DateSelectInput
7
+ include Base
8
+ include Base::Timeish
9
+
10
+ # We don't want hour and minute fragments on a date input
11
+ def time_fragments
12
+ []
13
+ end
14
+
15
+ def hidden_date_fragments
16
+ default_date_fragments - date_fragments
17
+ end
18
+
19
+ def hidden_fragments
20
+ hidden_date_fragments.map do |fragment|
21
+ template.hidden_field_tag(hidden_field_name(fragment), fragment_value(fragment), :id => fragment_id(fragment), :disabled => input_html_options[:disabled] )
22
+ end.join.html_safe
23
+ end
24
+
25
+ def fragment_value(fragment)
26
+ if fragment == :year
27
+ Time.now.year
28
+ else
29
+ '1'
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,103 @@
1
+ module Formtastic
2
+ module Inputs
3
+
4
+ # Outputs a simple `<label>` with a HTML5 `<input type="datetime-local">` (or
5
+ # `<input type="datetime">`) wrapped in the standard `<li>` wrapper. This is an alternative to
6
+ # `:date_select` for `:date`, `:time`, `:datetime` database columns. You can use this input with
7
+ # `:as => :datetime_picker`.
8
+ #
9
+ # *Please note:* Formtastic only provides suitable markup for a date picker, but does not supply
10
+ # any additional CSS or Javascript to render calendar-style date pickers. Browsers that support
11
+ # this input type (such as Mobile Webkit and Opera on the desktop) will render a native widget.
12
+ # Browsers that don't will default to a plain text field`<input type="text">` and can be
13
+ # poly-filled with some Javascript and a UI library of your choice.
14
+ #
15
+ # @example Full form context and output
16
+ #
17
+ # <%= semantic_form_for(@post) do |f| %>
18
+ # <%= f.inputs do %>
19
+ # <%= f.input :publish_at, :as => :datetime_picker %>
20
+ # <% end %>
21
+ # <% end %>
22
+ #
23
+ # <form...>
24
+ # <fieldset>
25
+ # <ol>
26
+ # <li class="string">
27
+ # <label for="post_publish_at">First name</label>
28
+ # <input type="date" id="post_publish_at" name="post[publish_at]">
29
+ # </li>
30
+ # </ol>
31
+ # </fieldset>
32
+ # </form>
33
+ #
34
+ # @example Setting the size (defaults to 16 for YYYY-MM-DD HH:MM)
35
+ # <%= f.input :publish_at, :as => :datetime_picker, :size => 20 %>
36
+ # <%= f.input :publish_at, :as => :datetime_picker, :input_html => { :size => 20 } %>
37
+ #
38
+ # @example Setting the maxlength (defaults to 16 for YYYY-MM-DD HH:MM)
39
+ # <%= f.input :publish_at, :as => :datetime_picker, :maxlength => 20 %>
40
+ # <%= f.input :publish_at, :as => :datetime_picker, :input_html => { :maxlength => 20 } %>
41
+ #
42
+ # @example Setting the value (defaults to YYYY-MM-DD HH:MM for Date and Time objects, otherwise renders string)
43
+ # <%= f.input :publish_at, :as => :datetime_picker, :input_html => { :value => "1970-01-01 00:00" } %>
44
+ #
45
+ # @example Setting the step attribute (defaults to 1)
46
+ # <%= f.input :publish_at, :as => :datetime_picker, :step => 60 %>
47
+ # <%= f.input :publish_at, :as => :datetime_picker, :input_html => { :step => 60 } %>
48
+ #
49
+ # @example Setting the step attribute with a macro
50
+ # <%= f.input :publish_at, :as => :datetime_picker, :step => :second %>
51
+ # <%= f.input :publish_at, :as => :datetime_picker, :step => :minute %>
52
+ # <%= f.input :publish_at, :as => :datetime_picker, :step => :quarter_hour %>
53
+ # <%= f.input :publish_at, :as => :datetime_picker, :step => :fifteen_minutes %>
54
+ # <%= f.input :publish_at, :as => :datetime_picker, :step => :half_hour %>
55
+ # <%= f.input :publish_at, :as => :datetime_picker, :step => :thirty_minutes %>
56
+ # <%= f.input :publish_at, :as => :datetime_picker, :step => :hour %>
57
+ # <%= f.input :publish_at, :as => :datetime_picker, :step => :sixty_minutes %>
58
+ #
59
+ # @example Setting the min attribute
60
+ # <%= f.input :publish_at, :as => :datetime_picker, :min => "2012-01-01 09:00" %>
61
+ # <%= f.input :publish_at, :as => :datetime_picker, :input_html => { :min => "2012-01-01 09:00" } %>
62
+ #
63
+ # @example Setting the max attribute
64
+ # <%= f.input :publish_at, :as => :datetime_picker, :max => "2012-12-31 16:00" %>
65
+ # <%= f.input :publish_at, :as => :datetime_picker, :input_html => { :max => "2012-12-31 16:00" } %>
66
+ #
67
+ # @example Setting the placeholder attribute
68
+ # <%= f.input :publish_at, :as => :datetime_picker, :placeholder => "YYYY-MM-DD HH:MM" %>
69
+ # <%= f.input :publish_at, :as => :datetime_picker, :input_html => { :placeholder => "YYYY-MM-DD HH:MM" } %>
70
+ #
71
+ # @example Using `type=datetime-local` with `:local` option (this is the default, and recommended for browser support on iOS7 and Chrome)
72
+ # <%= f.input :publish_at, :as => :datetime_picker, :local => true %>
73
+ #
74
+ # @example Using `type=datetime` with `:local` option (not recommended)
75
+ # <%= f.input :publish_at, :as => :datetime_picker, :local => false %>
76
+ #
77
+ # @see Formtastic::Helpers::InputsHelper#input InputsHelper#input for full documentation of all possible options.
78
+ class DatetimePickerInput
79
+ include Base
80
+ include Base::Stringish
81
+ include Base::DatetimePickerish
82
+
83
+ def html_input_type
84
+ options[:local] = true unless options.key?(:local)
85
+ options[:local] ? "datetime-local" : "datetime"
86
+ end
87
+
88
+ def default_size
89
+ 16
90
+ end
91
+
92
+ def value
93
+ return options[:input_html][:value] if options[:input_html] && options[:input_html].key?(:value)
94
+ val = object.send(method)
95
+ return val.strftime("%Y-%m-%dT%H:%M:%S") if val.is_a?(Time)
96
+ return "#{val.year}-#{val.month}-#{val.day}T00:00:00" if val.is_a?(Date)
97
+ return val if val.nil?
98
+ val.to_s
99
+ end
100
+
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,12 @@
1
+ module Formtastic
2
+ module Inputs
3
+
4
+ # Outputs a series of select boxes for the fragments that make up a date and time (year, month, day, hour, minute, second).
5
+ #
6
+ # @see Formtastic::Inputs::Base::Timeish Timeish module for documentation of date, time and datetime input options.
7
+ class DatetimeSelectInput
8
+ include Base
9
+ include Base::Timeish
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,41 @@
1
+ module Formtastic
2
+ module Inputs
3
+
4
+ # Outputs a simple `<label>` with a HTML5 `<input type="email">` wrapped in the standard
5
+ # `<li>` wrapper. This is the default input choice for attributes with a name matching
6
+ # `/email/`, but can be applied to any text-like input with `:as => :email`.
7
+ #
8
+ # @example Full form context and output
9
+ #
10
+ # <%= semantic_form_for(@user) do |f| %>
11
+ # <%= f.inputs do %>
12
+ # <%= f.input :email_address, :as => :email %>
13
+ # <% end %>
14
+ # <% end %>
15
+ #
16
+ # <form...>
17
+ # <fieldset>
18
+ # <ol>
19
+ # <li class="email">
20
+ # <label for="user_email_address">Email address</label>
21
+ # <input type="email" id="user_email_address" name="user[email_address]">
22
+ # </li>
23
+ # </ol>
24
+ # </fieldset>
25
+ # </form>
26
+ #
27
+ # @see Formtastic::Helpers::InputsHelper#input InputsHelper#input for full documentation of all possible options.
28
+ class EmailInput
29
+ include Base
30
+ include Base::Stringish
31
+ include Base::Placeholder
32
+
33
+ def to_html
34
+ input_wrapping do
35
+ label_html <<
36
+ builder.email_field(method, input_html_options)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,42 @@
1
+ module Formtastic
2
+ module Inputs
3
+
4
+ # Outputs a simple `<label>` with a `<input type="file">` wrapped in the standard
5
+ # `<li>` wrapper. This is the default input choice for objects with attributes that appear
6
+ # to be for file uploads, by detecting some common method names used by popular file upload
7
+ # libraries such as Paperclip and CarrierWave. You can add to or alter these method names
8
+ # through the `file_methods` config, but can be applied to any input with `:as => :file`.
9
+ #
10
+ # Don't forget to set the multipart attribute in your `<form>` tag!
11
+ #
12
+ # @example Full form context and output
13
+ #
14
+ # <%= semantic_form_for(@user, :html => { :multipart => true }) do |f| %>
15
+ # <%= f.inputs do %>
16
+ # <%= f.input :avatar, :as => :file %>
17
+ # <% end %>
18
+ # <% end %>
19
+ #
20
+ # <form...>
21
+ # <fieldset>
22
+ # <ol>
23
+ # <li class="file">
24
+ # <label for="user_avatar">Avatar</label>
25
+ # <input type="file" id="user_avatar" name="user[avatar]">
26
+ # </li>
27
+ # </ol>
28
+ # </fieldset>
29
+ # </form>
30
+ #
31
+ # @see Formtastic::Helpers::InputsHelper#input InputsHelper#input for full documentation of all possible options.
32
+ class FileInput
33
+ include Base
34
+ def to_html
35
+ input_wrapping do
36
+ label_html <<
37
+ builder.file_field(method, input_html_options)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,62 @@
1
+ module Formtastic
2
+ module Inputs
3
+
4
+ # Outputs a simple `<input type="hidden">` wrapped in the standard `<li>` wrapper. This is
5
+ # provided for situations where a hidden field needs to be rendered in the flow of a form with
6
+ # many inputs that form an `<ol>`. Wrapping the hidden input inside the `<li>` maintains the
7
+ # HTML validity. The `<li>` is marked with a `class` of `hidden` so that stylesheet authors can
8
+ # hide these list items with CSS (formtastic.css does this out of the box).
9
+ #
10
+ # @example Full form context, output and CSS
11
+ #
12
+ # <%= semantic_form_for(@something) do |f| %>
13
+ # <%= f.inputs do %>
14
+ # <%= f.input :secret, :as => :hidden %>
15
+ # <% end %>
16
+ # <% end %>
17
+ #
18
+ # <form...>
19
+ # <fieldset>
20
+ # <ol>
21
+ # <li class="hidden">
22
+ # <input type="hidden" id="something_secret" name="something[secret]">
23
+ # </li>
24
+ # </ol>
25
+ # </fieldset>
26
+ # </form>
27
+ #
28
+ # form.formtastic li.hidden { display:none; }
29
+ #
30
+ # @see Formtastic::Helpers::InputsHelper#input InputsHelper#input for full documentation of all possible options.
31
+ class HiddenInput
32
+ include Base
33
+
34
+ def input_html_options
35
+ super.merge(:required => nil).merge(:autofocus => nil)
36
+ end
37
+
38
+ def to_html
39
+ input_wrapping do
40
+ builder.hidden_field(method, input_html_options)
41
+ end
42
+ end
43
+
44
+ def error_html
45
+ ""
46
+ end
47
+
48
+ def errors?
49
+ false
50
+ end
51
+
52
+ def hint_html
53
+ ""
54
+ end
55
+
56
+ def hint?
57
+ false
58
+ end
59
+
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,88 @@
1
+ module Formtastic
2
+ module Inputs
3
+
4
+ # Outputs a simple `<label>` with a HTML5 `<input type="number">` wrapped in the standard
5
+ # `<li>` wrapper. This is the default input choice for all database columns of the type `:float`
6
+ # and `:decimal`, as well as `:integer` columns that aren't used for `belongs_to` associations,
7
+ # but can be applied to any text-like input with `:as => :number`.
8
+ #
9
+ # Sensible default values for the `min`, `max` and `step` attributes are found by reflecting on
10
+ # the model's validations (when provided). An `IndeterminableMinimumAttributeError` exception
11
+ # will be raised when the following conditions are all true:
12
+ #
13
+ # * you haven't specified a `:min` or `:max` for the input
14
+ # * the model's database column type is a `:float` or `:decimal`
15
+ # * the validation uses `:less_than` or `:greater_than`
16
+ #
17
+ # The solution is to either:
18
+ #
19
+ # * manually specify the `:min` or `:max` for the input
20
+ # * change the database column type to an `:integer` (if appropriate)
21
+ # * change the validations to use `:less_than_or_equal_to` or `:greater_than_or_equal_to`
22
+ #
23
+ # @example Full form context and output
24
+ #
25
+ # <%= semantic_form_for(@user) do |f| %>
26
+ # <%= f.inputs do %>
27
+ # <%= f.input :shoe_size, :as => :number %>
28
+ # <% end %>
29
+ # <% end %>
30
+ #
31
+ # <form...>
32
+ # <fieldset>
33
+ # <ol>
34
+ # <li class="numeric">
35
+ # <label for="user_shoe_size">Shoe size</label>
36
+ # <input type="number" id="user_shoe_size" name="user[shoe_size]">
37
+ # </li>
38
+ # </ol>
39
+ # </fieldset>
40
+ # </form>
41
+ #
42
+ # @example Default HTML5 min/max/step attributes are detected from the numericality validations
43
+ #
44
+ # class Person < ActiveRecord::Base
45
+ # validates_numericality_of :age,
46
+ # :less_than_or_equal_to => 100,
47
+ # :greater_than_or_equal_to => 18,
48
+ # :only_integer => true
49
+ # end
50
+ #
51
+ # <%= f.input :age, :as => :number %>
52
+ #
53
+ # <li class="numeric">
54
+ # <label for="persom_age">Age</label>
55
+ # <input type="number" id="person_age" name="person[age]" min="18" max="100" step="1">
56
+ # </li>
57
+ #
58
+ # @example Pass attributes down to the `<input>` tag with :input_html
59
+ # <%= f.input :shoe_size, :as => :number, :input_html => { :min => 3, :max => 15, :step => 1, :class => "special" } %>
60
+ #
61
+ # @example Min/max/step also work as options
62
+ # <%= f.input :shoe_size, :as => :number, :min => 3, :max => 15, :step => 1, :input_html => { :class => "special" } %>
63
+ #
64
+ # @example Use :in with a Range as a shortcut for :min/:max
65
+ # <%= f.input :shoe_size, :as => :number, :in => 3..15, :step => 1 %>
66
+ # <%= f.input :shoe_size, :as => :number, :input_html => { :in => 3..15, :step => 1 } %>
67
+ #
68
+ # @see Formtastic::Helpers::InputsHelper#input InputsHelper#input for full documentation of all possible options.
69
+ # @see http://api.rubyonrails.org/classes/ActiveModel/Validations/HelperMethods.html#method-i-validates_numericality_of Rails' Numericality validation documentation
70
+ class NumberInput
71
+ include Base
72
+ include Base::Numeric
73
+ include Base::Placeholder
74
+
75
+ def to_html
76
+ input_wrapping do
77
+ label_html <<
78
+ builder.number_field(method, input_html_options)
79
+ end
80
+ end
81
+
82
+ def step_option
83
+ super || "any"
84
+ end
85
+
86
+ end
87
+ end
88
+ end