formatted_form 1.1.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. data/Gemfile +7 -0
  2. data/{LICENSE.txt → LICENSE} +1 -1
  3. data/README.md +121 -29
  4. data/Rakefile +29 -10
  5. data/VERSION +1 -1
  6. data/app/assets/javascripts/formatted_form.js +12 -0
  7. data/app/assets/stylesheets/formatted_form.css +0 -0
  8. data/app/views/formatted_form/_check_box.html.erb +1 -0
  9. data/app/views/formatted_form/_date_select.html.erb +1 -0
  10. data/app/views/formatted_form/_datetime_select.html.erb +1 -0
  11. data/app/views/formatted_form/_element.html.erb +1 -0
  12. data/app/views/formatted_form/_email_field.html.erb +1 -0
  13. data/app/views/formatted_form/_file_field.html.erb +1 -0
  14. data/app/views/formatted_form/_number_field.html.erb +1 -0
  15. data/app/views/formatted_form/_password_field.html.erb +1 -0
  16. data/app/views/formatted_form/_phone_field.html.erb +1 -0
  17. data/app/views/formatted_form/_radio_button.html.erb +1 -0
  18. data/app/views/formatted_form/_range_field.html.erb +1 -0
  19. data/app/views/formatted_form/_search_field.html.erb +1 -0
  20. data/app/views/formatted_form/_select.html.erb +1 -0
  21. data/app/views/formatted_form/_submit.html.erb +1 -0
  22. data/app/views/formatted_form/_telephone_field.html.erb +1 -0
  23. data/app/views/formatted_form/_text_area.html.erb +1 -0
  24. data/app/views/formatted_form/_text_field.html.erb +1 -0
  25. data/app/views/formatted_form/_time_select.html.erb +1 -0
  26. data/app/views/formatted_form/_time_zone_select.html.erb +1 -0
  27. data/app/views/formatted_form/templates/_choices.html.erb +35 -0
  28. data/app/views/formatted_form/templates/_field.html.erb +34 -0
  29. data/formatted_form.gemspec +76 -26
  30. data/lib/formatted_form/engine.rb +6 -11
  31. data/lib/formatted_form/form_builder.rb +125 -0
  32. data/lib/formatted_form/view_helper.rb +49 -0
  33. data/lib/formatted_form.rb +3 -20
  34. data/test/dummy/README.rdoc +261 -0
  35. data/test/dummy/Rakefile +7 -0
  36. data/test/dummy/app/assets/javascripts/application.js +15 -0
  37. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  38. data/test/dummy/app/controllers/application_controller.rb +3 -0
  39. data/test/dummy/app/helpers/application_helper.rb +2 -0
  40. data/test/dummy/app/mailers/.gitkeep +0 -0
  41. data/test/dummy/app/models/.gitkeep +0 -0
  42. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  43. data/test/dummy/config/application.rb +65 -0
  44. data/test/dummy/config/boot.rb +10 -0
  45. data/test/dummy/config/environment.rb +5 -0
  46. data/test/dummy/config/environments/development.rb +31 -0
  47. data/test/dummy/config/environments/production.rb +64 -0
  48. data/test/dummy/config/environments/test.rb +35 -0
  49. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  50. data/test/dummy/config/initializers/inflections.rb +15 -0
  51. data/test/dummy/config/initializers/mime_types.rb +5 -0
  52. data/test/dummy/config/initializers/secret_token.rb +7 -0
  53. data/test/dummy/config/initializers/session_store.rb +8 -0
  54. data/test/dummy/config/initializers/wrap_parameters.rb +10 -0
  55. data/test/dummy/config/locales/en.yml +5 -0
  56. data/test/dummy/config/routes.rb +58 -0
  57. data/test/dummy/config.ru +4 -0
  58. data/test/dummy/lib/assets/.gitkeep +0 -0
  59. data/test/dummy/log/.gitkeep +0 -0
  60. data/test/dummy/public/404.html +26 -0
  61. data/test/dummy/public/422.html +26 -0
  62. data/test/dummy/public/500.html +25 -0
  63. data/test/dummy/public/favicon.ico +0 -0
  64. data/test/dummy/script/rails +6 -0
  65. data/test/form_builder_test.rb +391 -0
  66. data/test/test_helper.rb +47 -0
  67. metadata +105 -25
  68. data/app/views/formatted_form/_check_box.html.haml +0 -14
  69. data/app/views/formatted_form/_default_field.html.haml +0 -17
  70. data/app/views/formatted_form/_radio_button.html.haml +0 -17
  71. data/app/views/formatted_form/_submit.html.haml +0 -3
  72. data/app/views/twitter_bootstrap/_check_box.html.haml +0 -18
  73. data/app/views/twitter_bootstrap/_default_field.html.haml +0 -10
  74. data/app/views/twitter_bootstrap/_radio_button.html.haml +0 -24
  75. data/app/views/twitter_bootstrap/_submit.html.haml +0 -3
  76. data/lib/formatted_form/builder.rb +0 -178
  77. data/lib/formatted_form/configuration.rb +0 -16
  78. data/lib/formatted_form/helper.rb +0 -10
  79. data/lib/generators/formatted_form/javascripts/javascripts_generator.rb +0 -11
  80. data/lib/generators/formatted_form/stylesheets/stylesheets_generator.rb +0 -11
  81. data/templates/javascripts/formatted_form.js +0 -17
  82. data/templates/stylesheets/formatted_form.sass +0 -121
@@ -1,10 +0,0 @@
1
- .clearfix{:class => ('error' if error_messages.present?)}
2
-
3
- = builder.label(method, label_text)
4
-
5
- .input
6
- = field
7
- - if error_messages.present?
8
- %span.help-inline= error_messages
9
- - if description.present?
10
- %span.help-block= description
@@ -1,24 +0,0 @@
1
- .clearfix{:class => ('error' if error_messages.present?)}
2
-
3
- %label
4
- = label_text
5
- - if required
6
- %span.required *
7
-
8
- .input
9
- %ul.inputs-list
10
- - choices.each do |choice|
11
- %li
12
- %label{:for => choice[:label_for]}
13
- = choice[:field]
14
- %span= choice[:label]
15
-
16
-
17
-
18
- - if description.present?
19
- %span.help-block= description
20
-
21
- - if error_messages.present?
22
- %span.help-inline= error_messages
23
-
24
-
@@ -1,3 +0,0 @@
1
- .actions
2
- = field
3
- = after_text
@@ -1,178 +0,0 @@
1
- module FormattedForm
2
- class Builder < ActionView::Helpers::FormBuilder
3
-
4
- %w(text_field password_field text_area file_field datetime_select date_select).each do |field_name|
5
- define_method field_name do |method, *args|
6
- options = args.detect { |a| a.is_a?(Hash) } || {}
7
- render_field(field_name, method, options) { super(method, options) }
8
- end
9
- end
10
-
11
- def select(method, choices, options = {}, html_options = {})
12
- render_field('select', method, options) { super(method, choices, options, html_options) }
13
- end
14
-
15
- def hidden_field(method, options = {}, html_options = {})
16
- super(method, options)
17
- end
18
-
19
- def check_box(method, options = {}, checked_value = "1", unchecked_value = "0")
20
- render_field('check_box', method, options) do
21
- super(method, options, checked_value, unchecked_value)
22
- end
23
- end
24
-
25
- def radio_button(method, tag_value, options = {})
26
- case tag_value
27
- when Array
28
- choices = tag_value.collect do |choice|
29
- if !choice.is_a?(Array)
30
- choice = [choice, choice]
31
- elsif choice.length == 1
32
- choice << choice[0]
33
- end
34
- {
35
- :field => super(method, choice[1], options),
36
- :label => choice[0],
37
- :label_for => "#{object_name}_#{method}_#{choice[1].to_s.gsub(' ', '_').underscore}"
38
- }
39
- end
40
- else
41
- choices = [{
42
- :field => super(method, tag_value),
43
- :label => tag_value,
44
- :label_for => "#{object_name}_#{method}_#{tag_value.to_s.gsub(' ', '_').underscore}"
45
- }]
46
- end
47
-
48
- @template.render(:partial => "#{FormattedForm.config.template}/radio_button", :locals => {
49
- :builder => self,
50
- :method => method,
51
- :field_name => 'radio_button',
52
- :label_text => label_text(method, options.delete(:label)),
53
- :choices => choices,
54
- :required => options.delete(:required),
55
- :before_text => @template.raw(options.delete(:before_text)),
56
- :after_text => @template.raw(options.delete(:after_text)),
57
- :description => @template.raw(options.delete(:desc)),
58
- :error_messages => error_messages_for(method)
59
- })
60
-
61
- end
62
-
63
- # f.submit 'Log In', :change_to_text => 'Logging you in ...'
64
- def submit(value, options={}, &block)
65
- after_text = @template.capture(&block) if block_given?
66
-
67
-
68
-
69
- case FormattedForm.config.template
70
- when :formatted_form
71
- # Set the script to change the text
72
- if change_to_text = options.delete(:change_to_text)
73
- options[:onclick] ||= ''
74
- options[:onclick] = "$(this).closest('.form_element').hide();$(this).closest('.form_element').after($('<div class=form_element><div class=value>#{change_to_text}</div></div>'))"
75
- end
76
-
77
- when :twitter_bootstrap
78
- # Add specific bootstrap class
79
- options[:class] ||= ''
80
- options[:class] += ' btn primary'
81
-
82
- # Set the script to change the text
83
- if change_to_text = options.delete(:change_to_text)
84
- options[:onclick] ||= ''
85
- options[:onclick] = "$(this).closest('.actions').hide();$(this).closest('.actions').after($('<div class=actions>#{change_to_text}</div>'))"
86
- end
87
- end
88
-
89
- @template.render(:partial => "#{FormattedForm.config.template}/submit", :locals => {
90
- :field_name => 'submit',
91
- :field => super(value, options),
92
- :after_text => after_text,
93
- :change_to_text => change_to_text
94
- })
95
-
96
-
97
- # out = @template.content_tag(:div, :class => "form_element submit#{' change_to_text' if change_to_text}") do
98
- # if options.delete(:image)
99
- # content = super(value, options.merge(:style=>'visibility:hidden;position: absolute'))
100
- # content << @template.link_to(@template.content_tag(:span, value), "#", :class => 'submit_image')
101
- # content << cancel_link.html_safe
102
- # else
103
- # super(value, options) + cancel_link.html_safe
104
- # end
105
- # end
106
- #
107
- # if change_to_text
108
- # out << @template.content_tag(:div, change_to_text, :class => 'form_element submit_text')
109
- # end
110
- # out.html_safe
111
-
112
- end
113
-
114
- # generic container for all things form
115
- def element(label = '&nbsp;', value = '', type = 'text_field', &block)
116
- value += @template.capture(&block) if block_given?
117
- %{
118
- <div class='form_element #{type}'>
119
- <div class='label'>
120
- #{label}
121
- </div>
122
- <div class='value'>
123
- #{value}
124
- </div>
125
- </div>
126
- }.html_safe
127
- end
128
-
129
- def error_messages
130
- if object && !object.errors.empty?
131
- message = object.errors[:base].present? ? object.errors[:base]: 'There were some problems submitting this form. Please correct all the highlighted fields and try again'
132
- @template.content_tag(:div, message, :class => 'form_error')
133
- end
134
- end
135
-
136
- def error_messages_for(method)
137
- if (object and object.respond_to?(:errors) and errors = object.errors[method] and !errors.empty?)
138
- errors.is_a?(Array) ? errors.first : errors
139
- end
140
- end
141
-
142
- def fields_for(record_or_name_or_array, *args, &block)
143
- options = args.extract_options!
144
- options.merge!(:builder => FormattedForm::Builder)
145
- super(record_or_name_or_array, *(args << options), &block)
146
- end
147
-
148
-
149
- protected
150
-
151
- # Main rendering method
152
- def render_field(field_name, method, options={}, &block)
153
- case field_name
154
- when 'check_box'
155
- template = field_name
156
- else
157
- template = 'default_field'
158
- end
159
- @template.render(:partial => "#{FormattedForm.config.template}/#{template}", :locals => {
160
- :builder => self,
161
- :method => method,
162
- :field_name => field_name,
163
- :field => @template.capture(&block),
164
- :label_text => label_text(method, options.delete(:label)),
165
- :required => options.delete(:required),
166
- :before_text => @template.raw(options.delete(:before_text)),
167
- :after_text => @template.raw(options.delete(:after_text)),
168
- :description => @template.raw(options.delete(:desc)),
169
- :error_messages => error_messages_for(method)
170
- })
171
- end
172
-
173
- def label_text(method, text = nil)
174
- text.blank? ? method.to_s.titleize.capitalize : @template.raw(text)
175
- end
176
-
177
- end
178
- end
@@ -1,16 +0,0 @@
1
- module FormattedForm
2
- class Configuration
3
-
4
- # The templates used to use the views.
5
- # Options are
6
- # :formatted_form - the default rendering template
7
- # :twitter_bootstrap - Twitter Bootstrap templates
8
- attr_accessor :template
9
-
10
- # Configuration defaults
11
- def initialize
12
- @template = :formatted_form
13
- end
14
-
15
- end
16
- end
@@ -1,10 +0,0 @@
1
- module FormattedForm::Helper
2
-
3
- def formatted_form_for(record_or_name_or_array, *args, &proc)
4
- options = args.extract_options!
5
- options.merge!(:builder => FormattedForm::Builder)
6
- (options[:html] ||= { }).merge!(:class => "#{options[:html][:class]} formatted")
7
- form_for(record_or_name_or_array, *(args << options), &proc)
8
- end
9
-
10
- end
@@ -1,11 +0,0 @@
1
- module FormattedForm
2
- class JavascriptsGenerator < Rails::Generators::Base
3
-
4
- source_root File.expand_path('../../../../..', __FILE__)
5
-
6
- def generate_javascripts
7
- copy_file 'templates/javascripts/formatted_form.js', 'public/javascripts/formatted_form.js'
8
- end
9
-
10
- end
11
- end
@@ -1,11 +0,0 @@
1
- module FormattedForm
2
- class StylesheetsGenerator < Rails::Generators::Base
3
-
4
- source_root File.expand_path('../../../../..', __FILE__)
5
-
6
- def generate_stylesheets
7
- copy_file 'templates/stylesheets/formatted_form.sass', 'app/views/stylesheets/formatted_form.sass'
8
- end
9
-
10
- end
11
- end
@@ -1,17 +0,0 @@
1
- // Reset the state of the submit button
2
- $(document).ready(function() {
3
- $('.form_element.submit.change_to_text').show();
4
- $('.submit_text').hide();
5
- });
6
-
7
- // Shows the submit button replacement text on click
8
- $('.form_element.submit.change_to_text input[type=submit]').live('click', function(){
9
- $(this).parent().next().show();
10
- $(this).parent().hide();
11
- })
12
-
13
- // Activates the submit button click when clicking the image button
14
- $('.form_element.submit a.submit_image').live('click', function(){
15
- $(this).prev().click();
16
- return false;
17
- })
@@ -1,121 +0,0 @@
1
- form.formatted
2
- font: 13px/20px Trebuchet MS,serif
3
- margin: auto
4
- background: #eee
5
- border: solid #ddd 2px
6
- color: #000
7
- width: 50%
8
- padding: 10px 20px
9
- -webkit-box-shadow: 0 1px 4px rgba(0,0,0,0.3)
10
- -moz-box-shadow: 0 1px 4px rgba(0,0,0,0.3)
11
- box-shadow: 0 1px 4px rgba(0,0,0,0.3)
12
-
13
- // --- Form element container ---
14
- .form_element
15
- overflow: hidden
16
- _height: 1%
17
- margin-bottom: 1px
18
- padding: 5px 0px
19
- .label
20
- font: 10px/30px Trebuchet MS,serif
21
- color: #6E666E
22
- text-transform: uppercase
23
- letter-spacing: 1px
24
- float: left
25
- width: 120px
26
- text-align: right
27
- .value
28
- margin-left: 130px
29
- .errors
30
- font: 9px/12px Trebuchet MS, serif
31
- color: #BE1E2D
32
- clear: both
33
- .description
34
- clear: both
35
- font: italic 10px/12px Trebuchet MS, serif
36
-
37
- // --- Text and password fields ---
38
- .form_element.text_field, .form_element.password_field
39
- input
40
- width: 250px
41
- border: 1px solid #a6a8ab
42
- padding: 5px
43
- width: 90%
44
-
45
- // --- Text area ---
46
- .form_element.text_area
47
- textarea
48
- width: 250px
49
- height: 150px
50
-
51
- // --- Check box and Radio button ---
52
- .form_element.check_box, .form_element.radio_button
53
- .value
54
- label
55
- font: 10px/20px Trebuchet MS,serif
56
- color: #6E666E
57
- text-transform: uppercase
58
- margin-right: 10px
59
- letter-spacing: 0.1em
60
- input
61
- margin-right: 5px
62
- .field_with_errors
63
- float: left
64
-
65
- .form_element.radio_button
66
- .value
67
- .option
68
- float: left
69
- .option + .option
70
- margin-left: 10px
71
-
72
-
73
- // --- Submit button ---
74
- .form_element.submit
75
- padding-left: 130px
76
- a.submit_image
77
- padding: 5px 10px
78
- font: bold 12px/20px helvetica,arial,freesans,clean,sans-serif
79
- text-decoration: none
80
- color: #333
81
- text-shadow: 1px 1px 0 #fff
82
- white-space: nowrap
83
- border: none
84
- overflow: visible
85
- background: #ddd
86
- filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#ffffff',endColorstr='#e1e1e1')
87
- background: -webkit-gradient(linear,0% 0,0% 100%,from(#fff),to(#e1e1e1))
88
- background: -moz-linear-gradient(-90deg,#fff,#e1e1e1)
89
- border-bottom: 1px solid #ebebeb
90
- -webkit-border-radius: 4px
91
- -moz-border-radius: 4px
92
- border-radius: 4px
93
- -webkit-box-shadow: 0 1px 4px rgba(0,0,0,0.3)
94
- -moz-box-shadow: 0 1px 4px rgba(0,0,0,0.3)
95
- box-shadow: 0 1px 4px rgba(0,0,0,0.3)
96
- cursor: pointer
97
- -webkit-font-smoothing: subpixel-antialiased!important
98
- a.submit_image:hover
99
- color: #fff
100
- text-decoration: none
101
- text-shadow: -1px -1px 0 rgba(0,0,0,0.3)
102
- border-color: #518cc6
103
- border-bottom-color: #2a65a0
104
- background: #599bdc
105
- filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#599bdc',endColorstr='#3072b3')
106
- background: -webkit-gradient(linear,left top,left bottom,from(#599bdc),to(#3072b3))
107
- background: -moz-linear-gradient(top,#599bdc,#3072b3)
108
-
109
-
110
- .form_element.submit_text
111
- padding-left: 130px
112
- font: normal 12px/20px Trebuchet MS,serif
113
-
114
- // --- Form error ---
115
- .form_error
116
- background-color: #BE1E2D
117
- color: #fff
118
- text-align: center
119
- padding: 10px
120
- margin-bottom: 1px
121
- font-size: 14px