Fingertips-form-san 0.4.0 → 0.5.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 (4) hide show
  1. data/lib/form_san.rb +146 -24
  2. metadata +4 -7
  3. data/LICENSE +0 -20
  4. data/README.rdoc +0 -27
@@ -1,25 +1,74 @@
1
1
  require 'action_view/helpers'
2
2
 
3
3
  module FormSan
4
+ # = FormSan::FormBuilder
5
+ #
6
+ # FormSan has two goals:
7
+ # * Make it easier for the developer to write out a form
8
+ # * Make the resulting form more usable
9
+ #
10
+ # You can use the form builder by specifying it in the <tt>:builder</tt> option in <tt>form_for</tt>.
11
+ #
12
+ # form_for(@post, :builder => FormSan::FormBuilder)
13
+ #
14
+ # You can also make it the default form builder by specifying it in an initializer or <tt>environment.rb</tt>.
15
+ #
16
+ # ActionView::Base.default_form_builder = FormSan::FormBuilder
4
17
  class FormBuilder < ActionView::Helpers::FormBuilder
18
+ attr_reader :template
19
+ delegate :concat, :content_tag, :to => :template
20
+
21
+ # Wraps its content in a div with a fieldset class. You use it to group sets of fields.
22
+ #
23
+ # <% f.fieldset do %>
24
+ # <p>Please complete the form.</p>
25
+ # …
26
+ # <% end %>
27
+ #
28
+ # Generates
29
+ #
30
+ # <div class="fieldset">
31
+ # <p>Please complete the form.</p>
32
+ # …
33
+ # </div>
5
34
  def fieldset(&block)
6
- @template.content_tag(:div, :class => 'fieldset', &block)
35
+ content_tag(:div, :class => 'fieldset', &block)
7
36
  end
8
37
 
38
+ # Wraps its content in a div with a fields class. You use it to group fields.
39
+ #
40
+ # <% f.fields do %>
41
+ # <h4>Personal information</h4>
42
+ # …
43
+ # <% end %>
44
+ #
45
+ # Generates
46
+ #
47
+ # <div class="fields">
48
+ # <h4>Personal information</h4>
49
+ # …
50
+ # </div>
9
51
  def fields(&block)
10
- @template.content_tag(:div, :class => 'fields', &block)
52
+ content_tag(:div, :class => 'fields', &block)
11
53
  end
12
54
 
55
+ # Generates a short sentence in a paragraph describing which attributes have validation errors.
56
+ #
57
+ # <%= f.error_messages %>
58
+ #
59
+ # Generates something like
60
+ #
61
+ # <p class="errors">Sorry, there were problems with the title, published date, and description.</p>
13
62
  def error_messages
14
63
  unless @object.errors.count.zero?
15
64
  attributes_with_errors = @object.errors.map { |attribute, _| attribute } - ['base']
16
- @template.content_tag(:p, :class => 'errors') do
65
+ content_tag(:p, :class => 'errors') do
17
66
  if attributes_with_errors.size > 1
18
- @template.concat "Sorry, there were problems with the #{attributes_with_errors.to_sentence}."
67
+ concat "Sorry, there were problems with the #{attributes_with_errors.to_sentence}."
19
68
  elsif attributes_with_errors.size == 1
20
- @template.concat "Sorry, there was a problem with the #{attributes_with_errors.first}."
69
+ concat "Sorry, there was a problem with the #{attributes_with_errors.first}."
21
70
  else
22
- @template.concat "#{@object.class} #{@object.errors.on(:base)}."
71
+ concat "#{@object.class} #{@object.errors.on(:base)}."
23
72
  end
24
73
  end
25
74
  else
@@ -27,52 +76,125 @@ module FormSan
27
76
  end
28
77
  end
29
78
 
79
+ # Generates a short in a paragraph with the validation error of a specific attribute.
80
+ #
81
+ # <%= f.error_message(:title) %>
82
+ #
83
+ # Generates something like
84
+ #
85
+ # <p class="notice">Can't be blank</p>
30
86
  def error_message(attribute)
31
87
  unless @object.errors.on(attribute).blank?
32
- @template.content_tag(:p, :class => 'notice') do
33
- @template.concat ERB::Util.html_escape(@object.errors.on(attribute).mb_chars.capitalize)
88
+ content_tag(:p, :class => 'notice') do
89
+ concat ERB::Util.html_escape(@object.errors.on(attribute).mb_chars.capitalize)
34
90
  end
35
91
  else
36
92
  ''
37
93
  end
38
94
  end
39
95
 
40
- def field_without_block(attribute, extra_content=nil, *args)
96
+ # Generates a label for an attribute wrapped in a div. It allows you to specify an alternative
97
+ # humanized form of the attribute name and whether the associated field is optional or not.
98
+ #
99
+ # <%= f.label(:title) %>
100
+ # <div class="label"><label for="book_title">Title</label></div>
101
+ #
102
+ # <%= f.label(:title, 'Book title') %>
103
+ # <div class="label"><label for="book_title">Book title</label></div>
104
+ #
105
+ # <%= f.label(:title, :optional => true) %>
106
+ # <div class="label"><label for="book_title">Title <span>(optional)</span></label></div>
107
+ #
108
+ # When there is a validation error on the attribute, this will also be reflected in the HTML.
109
+ #
110
+ # <%= f.label(:title) %>
111
+ # <div class="label">
112
+ # <label for="book_title">Title <span>(optional)</span></label>
113
+ # <p class="notice">Can't be blank.</p>
114
+ # </div>
115
+ def wrapped_label(attribute, *args)
116
+ options = args.extract_options!
117
+
118
+ label_text = args.first || attribute.to_s.humanize
119
+ label_text << ' <span>(optional)</span>' if options[:optional]
120
+
121
+ content_tag(:div, :class => 'label') do
122
+ concat label(attribute, label_text)
123
+ concat error_message(attribute)
124
+ end
125
+ end
126
+
127
+ def field_with_extra_content(attribute, extra_content=nil, *args) #:nodoc:
41
128
  options = args.extract_options!
42
129
  classes = @object.errors.on(attribute) ? 'invalid field' : 'field'
43
130
 
44
- @template.content_tag(:div, :class => classes) do
45
- @template.concat(@template.content_tag(:div, :class => 'label') do
46
- label_text = args.first || attribute.to_s.humanize
47
- label_text << ' <span>(optional)</span>' if options.delete(:optional)
48
- @template.concat self.label(attribute, label_text)
49
- end)
131
+ content_tag(:div, :class => classes) do
132
+ concat wrapped_label(attribute, args.first, :optional => options.delete(:optional))
50
133
 
51
134
  case input_type = options.delete(:type).to_s
52
135
  when 'textarea'
53
- @template.concat ActionView::Helpers::InstanceTag.new(@object_name, attribute, self, @object).to_text_area_tag(options)
136
+ concat ActionView::Helpers::InstanceTag.new(@object_name, attribute, self, @object).to_text_area_tag(options)
54
137
  else
55
- @template.concat ActionView::Helpers::InstanceTag.new(@object_name, attribute, self, @object).to_input_field_tag(input_type, options)
138
+ concat ActionView::Helpers::InstanceTag.new(@object_name, attribute, self, @object).to_input_field_tag(input_type, options)
56
139
  end
57
140
 
58
- @template.concat error_message(attribute)
59
- @template.concat extra_content unless extra_content.blank?
141
+ concat extra_content unless extra_content.blank?
60
142
  @template.output_buffer # The block needs to return the current buffer
61
143
  end
62
144
  end
63
145
 
146
+ # Generates a field of a certain type wrapped in all sorts of HTML.
147
+ #
148
+ # <%= f.field(:title, :type => :text) %>
149
+ # <div class="field">
150
+ # <div class="label"><label for="book_title">Title</label></div>
151
+ # <input id="book_title" type="text" name="book[title]" value="Empire of the Sun" />
152
+ # </div>
153
+ #
154
+ # When there is a validation error on the attribute, this will also be reflected in the HTML.
155
+ #
156
+ # <div class="invalid field">
157
+ # <div class="label"><label for="book_title">Title</label></div>
158
+ # <input id="book_title" type="text" name="book[title]" value="" />
159
+ # <p class="notice">Can't be blank.</p>
160
+ # </div>
161
+ #
162
+ # You can also pass a block to field, that way you can include more HTML into the div.
163
+ #
164
+ # <% f.field(:title, :type => :text) do %>
165
+ # <p class="note">This will be shown on the overview page as the book title.</p>
166
+ # <% end %>
167
+ #
168
+ # <div class="field">
169
+ # <div class="label"><label for="book_title">Title</label></div>
170
+ # <input id="book_title" type="text" name="book[title]" value="Empire of the Sun" />
171
+ # <p class="note">This will be shown on the overview page as the book title.</p>
172
+ # </div>
173
+ #
174
+ # All options except <tt>:type</tt> are passed to the input.
175
+ #
176
+ # <%= f.field(:title, :type => :text, :class => 'small') %>
177
+ #
178
+ # <div class="field">
179
+ # <div class="label"><label for="book_title">Title</label></div>
180
+ # <input id="book_title" type="text" name="book[title]" value="Empire of the Sun" class="small" />
181
+ # </div>
64
182
  def field(attribute, *args, &block)
65
183
  if block_given?
66
- @template.concat field_without_block(attribute, @template.capture(&block), *args)
184
+ concat field_with_extra_content(attribute, @template.capture(&block), *args)
67
185
  else
68
- field_without_block(attribute, nil, *args)
186
+ field_with_extra_content(attribute, nil, *args)
69
187
  end
70
188
  end
71
189
  end
72
190
  end
73
191
 
74
- class ActionView::Helpers::InstanceTag
75
- def error_wrapping(html_tag, has_error)
76
- html_tag
192
+ module ActionView #:nodoc:
193
+ module Helpers #:nodoc:
194
+ class InstanceTag #:nodoc:
195
+ def error_wrapping(html_tag, has_error)
196
+ html_tag
197
+ end
198
+ end
77
199
  end
78
200
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: Fingertips-form-san
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Manfred Stienstra
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-03-25 00:00:00 -07:00
12
+ date: 2009-03-26 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -19,14 +19,11 @@ executables: []
19
19
 
20
20
  extensions: []
21
21
 
22
- extra_rdoc_files:
23
- - README.rdoc
24
- - LICENSE
22
+ extra_rdoc_files: []
23
+
25
24
  files:
26
25
  - lib/form_san.rb
27
26
  - rails/init.rb
28
- - README.rdoc
29
- - LICENSE
30
27
  has_rdoc: true
31
28
  homepage: http://github.com/Fingertips/form-san
32
29
  post_install_message:
data/LICENSE DELETED
@@ -1,20 +0,0 @@
1
- Copyright © 2009 Fingertips, Manfred Stienstra
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining
4
- a copy of this software and associated documentation files (the
5
- "Software"), to deal in the Software without restriction, including
6
- without limitation the rights to use, copy, modify, merge, publish,
7
- distribute, sublicense, and/or sell copies of the Software, and to
8
- permit persons to whom the Software is furnished to do so, subject to
9
- the following conditions:
10
-
11
- The above copyright notice and this permission notice shall be
12
- included in all copies or substantial portions of the Software.
13
-
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1,27 +0,0 @@
1
- = Form-San
2
-
3
- Form-San is a lean extension for the Rails form builder.
4
-
5
- <% form_for(@member, :builder => FormSan::FormBuilder) do |f| %>
6
- <% f.fieldset do %>
7
- <% f.fields do %>
8
- <%= f.error_messages %>
9
-
10
- <% f.field(:email, :type => :text, :class => 'medium') do %>
11
- <p class="hint">You’ll log in using your email address.</p>
12
- <% end %>
13
- <%= f.field(:password, :type => :password) %>
14
-
15
- <% f.fields_for(@member.artist) do |a| %>
16
- <% a.field(:name, :type => :text, :class => 'medium') do %>
17
- <p class="hint">Shown on the site.</p>
18
- <% end %>
19
- <% end %>
20
- <% end %>
21
- <% end %>
22
-
23
- <div class="submit">
24
- <%= f.submit 'Sign up' %>
25
- <%= link_to 'Cancel', root_path, :class => 'cancel' %>
26
- </div>
27
- <% end %>