simple-form-builder 0.0.2.rails3
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/CHANGELOG.md +0 -0
- data/README.md +1 -0
- data/ROADMAP.md +0 -0
- data/lib/simple_form_builder.rb +2 -0
- data/lib/simple_form_builder/form_builder.rb +249 -0
- data/lib/simple_form_builder/form_helper.rb +20 -0
- data/lib/simple_form_builder/version.rb +3 -0
- metadata +78 -0
data/CHANGELOG.md
ADDED
|
File without changes
|
data/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Not ready for prime time.
|
data/ROADMAP.md
ADDED
|
File without changes
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
module SimpleFormBuilder
|
|
2
|
+
class FormBuilder < ActionView::Helpers::FormBuilder
|
|
3
|
+
|
|
4
|
+
SFBOptions = %w(wrapper_el no_colon label_text label_class label img input_val hint).collect { |o| o.to_sym }
|
|
5
|
+
InputOptions = %w(required checked rows type).collect { |o| o.to_sym }
|
|
6
|
+
|
|
7
|
+
def initialize(*args)
|
|
8
|
+
@tab_index = 0
|
|
9
|
+
super
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def error_messages
|
|
13
|
+
if @object.errors.any?
|
|
14
|
+
@template.content_tag(:div,
|
|
15
|
+
@template.content_tag(:ul,
|
|
16
|
+
@object.errors.full_messages.collect do |msg|
|
|
17
|
+
@template.content_tag(:li, msg)
|
|
18
|
+
end.join("\n").html_safe
|
|
19
|
+
),
|
|
20
|
+
:class => "errors"
|
|
21
|
+
)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def date_select(method, options={})
|
|
26
|
+
sfb_options = extract_sfb_options(options)
|
|
27
|
+
list_item(label(method, sfb_options, options) + super, sfb_options, options.merge(:class => "dates"))
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def time_select(method, options={})
|
|
31
|
+
sfb_options = extract_sfb_options(options)
|
|
32
|
+
list_item(label(method, sfb_options, options) + super, sfb_options, options.merge(:class => "dates"))
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def text_field(method, options={})
|
|
36
|
+
sfb_options = extract_sfb_options(options)
|
|
37
|
+
labelled_field(method, sfb_options, options, super)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def password_field(method, options={})
|
|
41
|
+
sfb_options = extract_sfb_options(options)
|
|
42
|
+
labelled_field(method, sfb_options, options, super)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def text_area(method, options={})
|
|
46
|
+
sfb_options = extract_sfb_options(options)
|
|
47
|
+
labelled_field(method, sfb_options, options, super)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def check_box(method, options={}, checked_value="1", unchecked_value="0")
|
|
51
|
+
sfb_options = extract_sfb_options(options)
|
|
52
|
+
|
|
53
|
+
options[:class] = "checkbox"
|
|
54
|
+
|
|
55
|
+
list_item(super + label(method, sfb_options, options.merge(:no_colon => true)), sfb_options, options)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def radio_button(method, tag_value, options={})
|
|
59
|
+
sfb_options = extract_sfb_options(options)
|
|
60
|
+
label_text = sfb_options.delete(:label_text) || tag_value
|
|
61
|
+
sfb_options[:input_val] = tag_value
|
|
62
|
+
super + radio_label(method, label_text, sfb_options, options)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def select(method, choices, options={}, html_options={})
|
|
66
|
+
sfb_options = extract_sfb_options(options)
|
|
67
|
+
labelled_field(method, sfb_options, options, super)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def collection_select(method, collection, value_method=:id, text_method=:name, options={}, html_options={})
|
|
71
|
+
sfb_options = extract_sfb_options(options)
|
|
72
|
+
list_item(label(method, sfb_options, options) + super, sfb_options, options)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def country_select(method, priority_countries=nil, options={}, html_options={})
|
|
76
|
+
sfb_options = extract_sfb_options(options)
|
|
77
|
+
labelled_field(method, sfb_options, options, super)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def time_zone_select(method, priority_zones=nil, options={}, html_options={})
|
|
81
|
+
sfb_options = extract_sfb_options(options)
|
|
82
|
+
labelled_field(method, sfb_options, options, super)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def file_field(method, options={})
|
|
86
|
+
sfb_options = extract_sfb_options(options)
|
|
87
|
+
labelled_field(method, sfb_options, options, super)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def title(text)
|
|
91
|
+
@template.content_tag(:h3, text)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def hint(text)
|
|
95
|
+
@template.content_tag(:p, text)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def fieldset(options={}, &block)
|
|
99
|
+
sfb_options = extract_sfb_options(options)
|
|
100
|
+
contents = capture(&block)
|
|
101
|
+
@template.content_tag(
|
|
102
|
+
:fieldset,
|
|
103
|
+
@template.content_tag(:ol, contents),
|
|
104
|
+
options
|
|
105
|
+
)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def buttons(&block)
|
|
109
|
+
contents = capture(&block)
|
|
110
|
+
@template.content_tag(
|
|
111
|
+
:fieldset,
|
|
112
|
+
@template.content_tag(:ol, contents)
|
|
113
|
+
)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def button(options={})
|
|
117
|
+
sfb_options = extract_sfb_options(options)
|
|
118
|
+
prefix = @object.respond_to?(:new_record?) && @object.new_record? ? "Create" : "Save"
|
|
119
|
+
label = sfb_options.delete(:label) || "#{prefix @object_name.humanize}"
|
|
120
|
+
button_content = sfb_options.delete(:img) ? @template.content_tag(:img, nil, :src => button_content, :alt => label) + label : label
|
|
121
|
+
list_item(@template.content_tag(:button, button_content, options.merge(:type => "submit")), sfb_options, options.merge(:class => "button"))
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def inner_fieldset(legend=nil, &block)
|
|
125
|
+
contents = capture(&block)
|
|
126
|
+
@template.content_tag(
|
|
127
|
+
:li,
|
|
128
|
+
@template.content_tag(
|
|
129
|
+
:fieldset,
|
|
130
|
+
@template.content_tag(:h3, "#{legend}:") +
|
|
131
|
+
@template.content_tag(:ol, contents)
|
|
132
|
+
)
|
|
133
|
+
)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def submit(value="Save Changes", options={})
|
|
137
|
+
sfb_options = extract_sfb_options(options)
|
|
138
|
+
@template.content_tag(:fieldset, super, :class => "button")
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def fieldgroup(options={}, &block)
|
|
142
|
+
sfb_options = extract_sfb_options(options)
|
|
143
|
+
contents = capture(&block)
|
|
144
|
+
@already_grouping = true
|
|
145
|
+
@template.content_tag(
|
|
146
|
+
:li,
|
|
147
|
+
contents,
|
|
148
|
+
options
|
|
149
|
+
)
|
|
150
|
+
@already_grouping = false
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def labelled_field(method, sfb_options, options, markup)
|
|
154
|
+
if @already_grouping
|
|
155
|
+
markup + label(method, sfb_options, options)
|
|
156
|
+
else
|
|
157
|
+
list_item(label(method, sfb_options, options) + markup, sfb_options, options)
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def reversed_labelled_field(method, sfb_options, options, markup)
|
|
162
|
+
if @already_grouping
|
|
163
|
+
markup + label(method, sfb_options, options)
|
|
164
|
+
else
|
|
165
|
+
list_item(markup + label(method, sfb_options, options), sfb_options, options)
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def simple_fields_for(record_or_name_or_array, *args, &proc)
|
|
170
|
+
options = args.extract_options!
|
|
171
|
+
fields_for(record_or_name_or_array, *(args << options.merge(:builder => self.class)), &proc)
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
private
|
|
175
|
+
def extract_sfb_options(options={})
|
|
176
|
+
SFBOptions.inject({}) do |h, k|
|
|
177
|
+
h[k] = options.delete(k)
|
|
178
|
+
h
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def strip_input_options(options={})
|
|
183
|
+
options.tap do |o|
|
|
184
|
+
InputOptions.each do |k|
|
|
185
|
+
o.delete(k)
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def capture(&block)
|
|
191
|
+
if block_given?
|
|
192
|
+
contents = if @template.respond_to?(:is_haml?) && @template.is_haml?
|
|
193
|
+
@template.capture_haml(&block)
|
|
194
|
+
else
|
|
195
|
+
@template.capture(&block)
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def list_item(markup, sfb_options, options={})
|
|
201
|
+
container_element = sfb_options[:wrapper_el] || :li
|
|
202
|
+
@template.content_tag(container_element, markup, strip_input_options(options))
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def label(method, sfb_options, options={})
|
|
206
|
+
text = sfb_options[:label] || (@already_grouping ? method.to_s.titleize.upcase : method.to_s.titleize)
|
|
207
|
+
text += ":" unless sfb_options[:no_colon]
|
|
208
|
+
|
|
209
|
+
hint = sfb_options[:hint]
|
|
210
|
+
|
|
211
|
+
text = text + " <span class='hint'>#{hint}</span>" if hint
|
|
212
|
+
|
|
213
|
+
dom_class = sfb_options[:label_class] || method
|
|
214
|
+
|
|
215
|
+
ActionView::Helpers::InstanceTag.new(
|
|
216
|
+
object_name, method, self, object
|
|
217
|
+
).to_label_tag(text.html_safe, :class => dom_class)
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
def radio_label(method, value, sfb_options, options={})
|
|
221
|
+
for_val = sfb_options[:input_val] || value
|
|
222
|
+
@template.content_tag :label,
|
|
223
|
+
value.humanize,
|
|
224
|
+
options.merge(:for => radio_button_id(method, for_val, strip_input_options(options)))
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
def radio_button_id(method, value, options)
|
|
228
|
+
pretty_value = value.to_s.gsub(/\s/, "_").gsub(/\W/, "").downcase
|
|
229
|
+
|
|
230
|
+
options[:id] || defined?(@auto_index) ?
|
|
231
|
+
"#{object_name}_#{@auto_index}_#{method}_#{pretty_value}" :
|
|
232
|
+
"#{object_name}_#{method}_#{pretty_value}"
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
def cancel_link(options_or_url)
|
|
236
|
+
if options_or_url.is_a? Hash
|
|
237
|
+
cancel_url = options_or_url.delete(:url)
|
|
238
|
+
dom_class = options_or_url.delete(:class)
|
|
239
|
+
cancel_label = options_or_url.delete(:label)
|
|
240
|
+
else
|
|
241
|
+
cancel_url = options_or_url
|
|
242
|
+
dom_class = nil
|
|
243
|
+
cancel_label = nil
|
|
244
|
+
end
|
|
245
|
+
@template.link_to cancel_label || "Cancel", cancel_url || :back, :class => "cancel #{dom_class}"
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require 'simple_form_builder/form_builder'
|
|
2
|
+
|
|
3
|
+
module SimpleFormBuilder
|
|
4
|
+
module FormHelper
|
|
5
|
+
def simple_form_for(record_or_name_or_array, *args, &proc)
|
|
6
|
+
options = args.extract_options!
|
|
7
|
+
# Remove any nils if we received an array, this allows for common forms to be built
|
|
8
|
+
# that can be used for both edit and new actions but that don't require the edit action
|
|
9
|
+
# to be nested within a parent resource
|
|
10
|
+
record_or_name_or_array.reject! {|a| a.nil? } if record_or_name_or_array.is_a? Array
|
|
11
|
+
# Now build the form
|
|
12
|
+
form_for(record_or_name_or_array, *(args << options.merge(:builder => SimpleFormBuilder::FormBuilder)), &proc)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def simple_fields_for(record_or_name_or_array, *args, &proc)
|
|
16
|
+
options = args.extract_options!
|
|
17
|
+
fields_for(record_or_name_or_array, *(args << options.merge(:builder => SimpleFormBuilder::FormBuilder)), &proc)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: simple-form-builder
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
hash: 708262389
|
|
5
|
+
prerelease: 6
|
|
6
|
+
segments:
|
|
7
|
+
- 0
|
|
8
|
+
- 0
|
|
9
|
+
- 2
|
|
10
|
+
- rails
|
|
11
|
+
- 3
|
|
12
|
+
version: 0.0.2.rails3
|
|
13
|
+
platform: ruby
|
|
14
|
+
authors:
|
|
15
|
+
- Ben Askins
|
|
16
|
+
autorequire:
|
|
17
|
+
bindir: bin
|
|
18
|
+
cert_chain: []
|
|
19
|
+
|
|
20
|
+
date: 2011-01-13 00:00:00 +11:00
|
|
21
|
+
default_executable:
|
|
22
|
+
dependencies: []
|
|
23
|
+
|
|
24
|
+
description: Extends ActionView::Helpers::FormBuilder with simple, best practices markup.
|
|
25
|
+
email:
|
|
26
|
+
- ben.askins@plus2.com.au
|
|
27
|
+
executables: []
|
|
28
|
+
|
|
29
|
+
extensions: []
|
|
30
|
+
|
|
31
|
+
extra_rdoc_files: []
|
|
32
|
+
|
|
33
|
+
files:
|
|
34
|
+
- lib/simple_form_builder/form_builder.rb
|
|
35
|
+
- lib/simple_form_builder/form_helper.rb
|
|
36
|
+
- lib/simple_form_builder/version.rb
|
|
37
|
+
- lib/simple_form_builder.rb
|
|
38
|
+
- CHANGELOG.md
|
|
39
|
+
- README.md
|
|
40
|
+
- ROADMAP.md
|
|
41
|
+
has_rdoc: true
|
|
42
|
+
homepage: http://github.com/plustwo/simple-form-builder
|
|
43
|
+
licenses: []
|
|
44
|
+
|
|
45
|
+
post_install_message:
|
|
46
|
+
rdoc_options: []
|
|
47
|
+
|
|
48
|
+
require_paths:
|
|
49
|
+
- lib
|
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
51
|
+
none: false
|
|
52
|
+
requirements:
|
|
53
|
+
- - ">="
|
|
54
|
+
- !ruby/object:Gem::Version
|
|
55
|
+
hash: 3
|
|
56
|
+
segments:
|
|
57
|
+
- 0
|
|
58
|
+
version: "0"
|
|
59
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
60
|
+
none: false
|
|
61
|
+
requirements:
|
|
62
|
+
- - ">="
|
|
63
|
+
- !ruby/object:Gem::Version
|
|
64
|
+
hash: 23
|
|
65
|
+
segments:
|
|
66
|
+
- 1
|
|
67
|
+
- 3
|
|
68
|
+
- 6
|
|
69
|
+
version: 1.3.6
|
|
70
|
+
requirements: []
|
|
71
|
+
|
|
72
|
+
rubyforge_project: simple-form-builder
|
|
73
|
+
rubygems_version: 1.4.2
|
|
74
|
+
signing_key:
|
|
75
|
+
specification_version: 3
|
|
76
|
+
summary: A best-practice FormBuilder
|
|
77
|
+
test_files: []
|
|
78
|
+
|