formtastic-bootstrap 1.0.0

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 (72) hide show
  1. data/.document +5 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +12 -0
  4. data/Gemfile.lock +123 -0
  5. data/LICENSE.txt +20 -0
  6. data/README.md +159 -0
  7. data/Rakefile +49 -0
  8. data/VERSION +1 -0
  9. data/formtastic-bootstrap.gemspec +128 -0
  10. data/lib/action_view/helpers/text_field_date_helper.rb +166 -0
  11. data/lib/formtastic-bootstrap.rb +5 -0
  12. data/lib/formtastic-bootstrap/form_builder.rb +38 -0
  13. data/lib/formtastic-bootstrap/helpers.rb +19 -0
  14. data/lib/formtastic-bootstrap/helpers/buttons_helper.rb +47 -0
  15. data/lib/formtastic-bootstrap/helpers/fieldset_wrapper.rb +37 -0
  16. data/lib/formtastic-bootstrap/helpers/input_helper.rb +12 -0
  17. data/lib/formtastic-bootstrap/helpers/inputs_helper.rb +36 -0
  18. data/lib/formtastic-bootstrap/inputs.rb +28 -0
  19. data/lib/formtastic-bootstrap/inputs/base.rb +22 -0
  20. data/lib/formtastic-bootstrap/inputs/base/choices.rb +49 -0
  21. data/lib/formtastic-bootstrap/inputs/base/errors.rb +48 -0
  22. data/lib/formtastic-bootstrap/inputs/base/hints.rb +27 -0
  23. data/lib/formtastic-bootstrap/inputs/base/html.rb +21 -0
  24. data/lib/formtastic-bootstrap/inputs/base/labelling.rb +18 -0
  25. data/lib/formtastic-bootstrap/inputs/base/stringish.rb +18 -0
  26. data/lib/formtastic-bootstrap/inputs/base/timeish.rb +35 -0
  27. data/lib/formtastic-bootstrap/inputs/base/wrapping.rb +56 -0
  28. data/lib/formtastic-bootstrap/inputs/boolean_input.rb +33 -0
  29. data/lib/formtastic-bootstrap/inputs/check_boxes_input.rb +35 -0
  30. data/lib/formtastic-bootstrap/inputs/date_input.rb +16 -0
  31. data/lib/formtastic-bootstrap/inputs/datetime_input.rb +19 -0
  32. data/lib/formtastic-bootstrap/inputs/email_input.rb +15 -0
  33. data/lib/formtastic-bootstrap/inputs/file_input.rb +14 -0
  34. data/lib/formtastic-bootstrap/inputs/hidden_input.rb +12 -0
  35. data/lib/formtastic-bootstrap/inputs/number_input.rb +15 -0
  36. data/lib/formtastic-bootstrap/inputs/password_input.rb +15 -0
  37. data/lib/formtastic-bootstrap/inputs/phone_input.rb +15 -0
  38. data/lib/formtastic-bootstrap/inputs/radio_input.rb +32 -0
  39. data/lib/formtastic-bootstrap/inputs/range_input.rb +15 -0
  40. data/lib/formtastic-bootstrap/inputs/search_input.rb +15 -0
  41. data/lib/formtastic-bootstrap/inputs/select_input.rb +14 -0
  42. data/lib/formtastic-bootstrap/inputs/string_input.rb +15 -0
  43. data/lib/formtastic-bootstrap/inputs/text_input.rb +14 -0
  44. data/lib/formtastic-bootstrap/inputs/time_input.rb +16 -0
  45. data/lib/formtastic-bootstrap/inputs/url_input.rb +14 -0
  46. data/spec/builder/errors_spec.rb +214 -0
  47. data/spec/builder/semantic_fields_for_spec.rb +130 -0
  48. data/spec/helpers/input_helper_spec.rb +956 -0
  49. data/spec/helpers/inputs_helper_spec.rb +577 -0
  50. data/spec/inputs/boolean_input_spec.rb +193 -0
  51. data/spec/inputs/check_boxes_input_spec.rb +439 -0
  52. data/spec/inputs/date_input_spec.rb +147 -0
  53. data/spec/inputs/datetime_input_spec.rb +101 -0
  54. data/spec/inputs/email_input_spec.rb +59 -0
  55. data/spec/inputs/file_input_spec.rb +63 -0
  56. data/spec/inputs/hidden_input_spec.rb +122 -0
  57. data/spec/inputs/number_input_spec.rb +787 -0
  58. data/spec/inputs/password_input_spec.rb +73 -0
  59. data/spec/inputs/phone_input_spec.rb +59 -0
  60. data/spec/inputs/radio_input_spec.rb +240 -0
  61. data/spec/inputs/range_input_spec.rb +479 -0
  62. data/spec/inputs/search_input_spec.rb +59 -0
  63. data/spec/inputs/select_input_spec.rb +567 -0
  64. data/spec/inputs/string_input_spec.rb +182 -0
  65. data/spec/inputs/text_input_spec.rb +163 -0
  66. data/spec/inputs/time_input_spec.rb +206 -0
  67. data/spec/inputs/url_input_spec.rb +59 -0
  68. data/spec/spec_helper.rb +24 -0
  69. data/spec/support/custom_macros.rb +704 -0
  70. data/spec/support/depracation.rb +6 -0
  71. data/spec/support/formtastic_spec_helper.rb +382 -0
  72. metadata +204 -0
@@ -0,0 +1,48 @@
1
+ module FormtasticBootstrap
2
+ module Inputs
3
+ module Base
4
+ module Errors
5
+
6
+ include Formtastic::Inputs::Base::Errors
7
+
8
+ def error_html(inline_or_block = :inline)
9
+ errors? ? send(:"error_#{builder.inline_errors}_html", inline_or_block) : ""
10
+ end
11
+
12
+ def error_sentence_html(inline_or_block)
13
+ error_class = if inline_or_block == :inline
14
+ options[:error_class] || builder.default_inline_error_class
15
+ else
16
+ options[:error_class] || builder.default_block_error_class
17
+ end
18
+ template.content_tag(:span, Formtastic::Util.html_safe(errors.to_sentence.html_safe), :class => error_class)
19
+ end
20
+
21
+ def error_list_html(ignore)
22
+ super()
23
+ # error_class = options[:error_class] || builder.default_error_list_class
24
+ # list_elements = []
25
+ # errors.each do |error|
26
+ # list_elements << template.content_tag(:li, Formtastic::Util.html_safe(error.html_safe))
27
+ # end
28
+ # template.content_tag(:ul, Formtastic::Util.html_safe(list_elements.join("\n")), :class => error_class)
29
+ end
30
+
31
+ def error_first_html(inline_or_block = :inline)
32
+ error_class = if inline_or_block == :inline
33
+ options[:error_class] || builder.default_inline_error_class
34
+ else
35
+ options[:error_class] || builder.default_block_error_class
36
+ end
37
+ template.content_tag(:span, Formtastic::Util.html_safe(errors.first.untaint), :class => error_class)
38
+ end
39
+
40
+ def error_none_html(ignore)
41
+ # super
42
+ ""
43
+ end
44
+
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,27 @@
1
+ module FormtasticBootstrap
2
+ module Inputs
3
+ module Base
4
+ module Hints
5
+
6
+ include Formtastic::Inputs::Base::Hints
7
+
8
+ def hint_html(inline_or_block = :inline)
9
+ if hint?
10
+ hint_class = if inline_or_block == :inline
11
+ options[:hint_class] || builder.default_inline_hint_class
12
+ else
13
+ options[:hint_class] || builder.default_block_hint_class
14
+ end
15
+ template.content_tag(
16
+ :span,
17
+ Formtastic::Util.html_safe(hint_text),
18
+ :class => hint_class
19
+ )
20
+ end
21
+ end
22
+
23
+ end
24
+ end
25
+ end
26
+ end
27
+
@@ -0,0 +1,21 @@
1
+ module FormtasticBootstrap
2
+ module Inputs
3
+ module Base
4
+ module Html
5
+
6
+ include Formtastic::Inputs::Base::Html
7
+
8
+ def input_html_options
9
+ if errors?
10
+ {
11
+ :class => "error"
12
+ }.merge(super)
13
+ else
14
+ super
15
+ end
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,18 @@
1
+ module FormtasticBootstrap
2
+ module Inputs
3
+ module Base
4
+ module Labelling
5
+
6
+ include Formtastic::Inputs::Base::Labelling
7
+
8
+ def label_html_options
9
+ {}.tap do |opts|
10
+ opts[:for] ||= input_html_options[:id]
11
+ opts[:class] = [opts[:class]]
12
+ end
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # Alas, I need to duplicate code from Formtastic::Inputs::Base::Stringish because
2
+ # there's no way to re-import that module.
3
+ module FormtasticBootstrap
4
+ module Inputs
5
+ module Base
6
+ module Stringish
7
+
8
+ include Formtastic::Inputs::Base::Stringish
9
+
10
+ def wrapper_html_options
11
+ new_class = [super[:class], "stringish"].compact.join(" ")
12
+ super.merge(:class => new_class)
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,35 @@
1
+ module FormtasticBootstrap
2
+ module Inputs
3
+ module Base
4
+ module Timeish
5
+
6
+ def label_html
7
+ # TODO Supress the "for" field?
8
+ template.content_tag(:label, label_html_options) do
9
+ render_label? ? label_text : "".html_safe
10
+ end
11
+ end
12
+
13
+ def date_input_html
14
+ fragment_input_html(:date, "small")
15
+ end
16
+
17
+ def time_input_html
18
+ fragment_input_html(:time, "mini")
19
+ end
20
+
21
+ def fragment_id(fragment)
22
+ # TODO is this right?
23
+ # "#{input_html_options[:id]}_#{position(fragment)}i"
24
+ "#{input_html_options[:id]}[#{fragment}]"
25
+ end
26
+
27
+ def fragment_input_html(fragment, klass)
28
+ opts = input_options.merge(:prefix => object_name, :field_name => fragment_name(fragment), :default => value, :include_blank => include_blank?)
29
+ template.send(:"text_field_#{fragment}", value, opts, input_html_options.merge(:id => fragment_id(fragment), :class => klass))
30
+ end
31
+
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,56 @@
1
+ module FormtasticBootstrap
2
+ module Inputs
3
+ module Base
4
+ module Wrapping
5
+
6
+ include Formtastic::Inputs::Base::Wrapping
7
+
8
+ def generic_input_wrapping(&block)
9
+ clearfix_div_wrapping do
10
+ label_html <<
11
+ input_div_wrapping do
12
+ yield
13
+ end
14
+ end
15
+ end
16
+
17
+ def clearfix_div_wrapping(&block)
18
+ template.content_tag(:div, wrapper_html_options) do
19
+ yield
20
+ end
21
+ end
22
+
23
+ def input_div_wrapping(inline_or_block_errors = :inline)
24
+ template.content_tag(:div, :class => "input") do
25
+ [yield, error_html(inline_or_block_errors), hint_html(inline_or_block_errors)].join("\n").html_safe
26
+ end
27
+ end
28
+
29
+ def inline_inputs_div_wrapping(&block)
30
+ template.content_tag(:div, :class => "inline-inputs") do
31
+ yield
32
+ end
33
+ end
34
+
35
+ def wrapper_html_options
36
+ opts = options[:wrapper_html] || {}
37
+ opts[:class] ||= []
38
+ opts[:class] = [opts[:class].to_s] unless opts[:class].is_a?(Array)
39
+ opts[:class] << as
40
+ opts[:class] << "clearfix"
41
+ # opts[:class] << "input"
42
+ opts[:class] << "error" if errors?
43
+ opts[:class] << "optional" if optional?
44
+ opts[:class] << "required" if required?
45
+ opts[:class] << "autofocus" if autofocus?
46
+ opts[:class] = opts[:class].join(' ')
47
+
48
+ opts[:id] ||= wrapper_dom_id
49
+
50
+ opts
51
+ end
52
+
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,33 @@
1
+ # TODO See if this can be refactored to make use of some of the Choices code.
2
+ module FormtasticBootstrap
3
+ module Inputs
4
+ class BooleanInput < Formtastic::Inputs::BooleanInput
5
+ include Base
6
+
7
+ def to_html
8
+ clearfix_div_wrapping do
9
+ empty_label <<
10
+ hidden_field_html <<
11
+ input_div_wrapping(:block) do
12
+ template.content_tag(:ul, :class => "inputs-list") do
13
+ template.content_tag(:li) do
14
+ label_with_nested_checkbox
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ def label_text_with_embedded_checkbox
22
+ # That newline matters! Why, I do no not know.
23
+ check_box_html << "\n" << template.content_tag(:span) do label_text end
24
+ end
25
+
26
+ # Need this for formatting to work.
27
+ def empty_label
28
+ template.content_tag(:label) do end
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,35 @@
1
+ module FormtasticBootstrap
2
+ module Inputs
3
+ class CheckBoxesInput < Formtastic::Inputs::CheckBoxesInput
4
+ include Base
5
+ include Base::Choices
6
+
7
+ def to_html
8
+ clearfix_div_wrapping do
9
+ legend_html <<
10
+ hidden_field_for_all <<
11
+ input_div_wrapping do
12
+ choices_group_wrapping do
13
+ collection.map { |choice|
14
+ choice_wrapping(choice_wrapping_html_options(choice)) do
15
+ choice_html(choice)
16
+ end
17
+ }.join("\n").html_safe
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ def choice_html(choice)
24
+ template.content_tag(:label,
25
+ hidden_fields? ?
26
+ check_box_with_hidden_input(choice) :
27
+ check_box_without_hidden_input(choice) <<
28
+ choice_label(choice),
29
+ label_html_options.merge(:for => choice_input_dom_id(choice), :class => nil)
30
+ )
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,16 @@
1
+ module FormtasticBootstrap
2
+ module Inputs
3
+ class DateInput < Formtastic::Inputs::DateInput
4
+ include Base
5
+ include Base::Stringish
6
+ include Base::Timeish
7
+
8
+ def to_html
9
+ generic_input_wrapping do
10
+ date_input_html
11
+ end
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ module FormtasticBootstrap
2
+ module Inputs
3
+ class DatetimeInput < Formtastic::Inputs::DatetimeInput
4
+ include Base
5
+ include Base::Stringish
6
+ include Base::Timeish
7
+
8
+ def to_html
9
+ generic_input_wrapping do
10
+ inline_inputs_div_wrapping do
11
+ # This newline matters.
12
+ date_input_html << "\n".html_safe << time_input_html
13
+ end
14
+ end
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ module FormtasticBootstrap
2
+ module Inputs
3
+ class EmailInput < Formtastic::Inputs::EmailInput
4
+ include Base
5
+ include Base::Stringish
6
+
7
+ def to_html
8
+ generic_input_wrapping do
9
+ builder.email_field(method, input_html_options)
10
+ end
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ module FormtasticBootstrap
2
+ module Inputs
3
+ class FileInput < Formtastic::Inputs::FileInput
4
+ include Base
5
+
6
+ def to_html
7
+ generic_input_wrapping do
8
+ builder.file_field(method, input_html_options)
9
+ end
10
+ end
11
+
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ module FormtasticBootstrap
2
+ module Inputs
3
+ class HiddenInput < Formtastic::Inputs::HiddenInput
4
+ include Base
5
+ def to_html
6
+ generic_input_wrapping do
7
+ builder.hidden_field(method, input_html_options)
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ module FormtasticBootstrap
2
+ module Inputs
3
+ class NumberInput < Formtastic::Inputs::NumberInput
4
+ include Base
5
+ include Base::Stringish
6
+
7
+ def to_html
8
+ generic_input_wrapping do
9
+ builder.number_field(method, input_html_options)
10
+ end
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module FormtasticBootstrap
2
+ module Inputs
3
+ class PasswordInput < Formtastic::Inputs::PasswordInput
4
+ include Base
5
+ include Base::Stringish
6
+
7
+ def to_html
8
+ generic_input_wrapping do
9
+ builder.password_field(method, input_html_options)
10
+ end
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module FormtasticBootstrap
2
+ module Inputs
3
+ class PhoneInput < Formtastic::Inputs::PhoneInput
4
+ include Base
5
+ include Base::Stringish
6
+
7
+ def to_html
8
+ generic_input_wrapping do
9
+ builder.phone_field(method, input_html_options)
10
+ end
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,32 @@
1
+ module FormtasticBootstrap
2
+ module Inputs
3
+ class RadioInput < Formtastic::Inputs::RadioInput
4
+ include Base
5
+ include Base::Choices
6
+
7
+ def to_html
8
+ clearfix_div_wrapping do
9
+ legend_html <<
10
+ input_div_wrapping do
11
+ choices_group_wrapping do
12
+ collection.map { |choice|
13
+ choice_wrapping(choice_wrapping_html_options(choice)) do
14
+ choice_html(choice)
15
+ end
16
+ }.join("\n").html_safe
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ def choice_html(choice)
23
+ template.content_tag(:label, label_html_options.merge(:for => choice_input_dom_id(choice), :class => nil)) do
24
+ builder.radio_button(input_name, choice_value(choice), input_html_options.merge(choice_html_options(choice)).merge(:required => false)) <<
25
+
26
+ choice_label(choice)
27
+ end
28
+ end
29
+
30
+ end
31
+ end
32
+ end