bootstrap_form_helper 2.0.2.0.beta1
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.
@@ -0,0 +1,183 @@
|
|
1
|
+
require 'action_view/helpers/form_helper'
|
2
|
+
require 'bootstrap_form_helper'
|
3
|
+
|
4
|
+
class BootstrapFormHelper::FormBuilder < ActionView::Helpers::FormBuilder
|
5
|
+
|
6
|
+
INPUTS = (%w(select collection_select grouped_collection_select time_zone_select).map(&:to_sym) +
|
7
|
+
field_helpers -
|
8
|
+
%w(label check_box radio_button fields_for hidden_field).map(&:to_sym))
|
9
|
+
|
10
|
+
##
|
11
|
+
# Wraps the contents of the block passed to the method in a +fieldset+ tag with
|
12
|
+
# a optional +legend+ text.
|
13
|
+
#
|
14
|
+
def fieldset(legend = nil, options = {})
|
15
|
+
@template.content_tag(:fieldset, options) do
|
16
|
+
@template.concat @template.content_tag(:legend, legend) unless legend.nil?
|
17
|
+
yield
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
##
|
22
|
+
# Wraps action buttons into their own styled container.
|
23
|
+
#
|
24
|
+
def actions(&block)
|
25
|
+
@template.content_tag(:div, class: 'form-actions', &block)
|
26
|
+
end
|
27
|
+
|
28
|
+
INPUTS.each do |input|
|
29
|
+
define_method input do |attribute, *args, &block|
|
30
|
+
options = args.extract_options!
|
31
|
+
text = args.any? ? args.shift : ''
|
32
|
+
|
33
|
+
label attribute, text do |builder|
|
34
|
+
builder.send input, attribute, *(args << options), &block
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
##
|
40
|
+
# Attaches a label to the inputs rendered inside of the block passed to it.
|
41
|
+
# Associates the label with the input for the +attribute+ given. If +text+
|
42
|
+
# is passed, uses that as the text for the label; otherwise humanizes the
|
43
|
+
# +attribute+ name.
|
44
|
+
#
|
45
|
+
def label(attribute, text = '', options = {}, &block)
|
46
|
+
text, attribute = attribute, nil if attribute.kind_of? String
|
47
|
+
|
48
|
+
options = { class: 'control-label' }.merge(options)
|
49
|
+
id = wrapper_id attribute, 'control_group'
|
50
|
+
classes = wrapper_classes attribute, 'control-group'
|
51
|
+
fields_options = options.merge(builder: BootstrapFormHelper::FormControls)
|
52
|
+
|
53
|
+
@template.content_tag(:div, id: id, class: classes) do
|
54
|
+
@template.concat case
|
55
|
+
when attribute && text then super(attribute, text, options, &nil)
|
56
|
+
when attribute then super(attribute, nil, options, &nil)
|
57
|
+
when text then @template.label_tag(nil, text, options, &nil)
|
58
|
+
end
|
59
|
+
|
60
|
+
@template.concat @template.content_tag(:div, class: 'controls') {
|
61
|
+
@template.fields_for object_name, object, fields_options, &block
|
62
|
+
}
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
##
|
67
|
+
# Renders a button with default classes to style it as a form button.
|
68
|
+
#
|
69
|
+
def button(value = nil, options = {})
|
70
|
+
super value, { type: 'button', class: 'btn' }.merge(options)
|
71
|
+
end
|
72
|
+
|
73
|
+
##
|
74
|
+
# Renders a submit tag with default classes to style it as a primary form
|
75
|
+
# button.
|
76
|
+
#
|
77
|
+
def submit(value = nil, options = {})
|
78
|
+
button value, { type: 'submit', class: 'btn btn-primary' }.merge(options)
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def errors_on?(attribute)
|
84
|
+
object.errors[attribute].present? if object.respond_to?(:errors)
|
85
|
+
end
|
86
|
+
|
87
|
+
def wrapper_id(attribute, suffix = nil)
|
88
|
+
[
|
89
|
+
bootstrap_object_name + object_index,
|
90
|
+
attribute_name(attribute),
|
91
|
+
suffix,
|
92
|
+
].compact.join('_') if attribute
|
93
|
+
end
|
94
|
+
|
95
|
+
def wrapper_classes(attribute, *classes)
|
96
|
+
classes.push 'error' if attribute and errors_on? attribute
|
97
|
+
classes.join(' ')
|
98
|
+
end
|
99
|
+
|
100
|
+
def attribute_name(attribute)
|
101
|
+
attribute.to_s.sub(/[\?\/\-]$/, '')
|
102
|
+
end
|
103
|
+
|
104
|
+
def bootstrap_object_name
|
105
|
+
object_name.to_s.gsub(/\]\[|[^-a-zA-Z0-9:.]/, '_').sub(/_$/, '')
|
106
|
+
end
|
107
|
+
|
108
|
+
def object_index
|
109
|
+
case
|
110
|
+
when options.has_key?(:index) then options[:index]
|
111
|
+
when defined?(@auto_index) then @auto_index
|
112
|
+
else nil
|
113
|
+
end.to_s
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
class BootstrapFormHelper::FormControls < ActionView::Helpers::FormBuilder
|
118
|
+
BootstrapFormHelper::FormBuilder::INPUTS.each do |input|
|
119
|
+
define_method input do |attribute, *args, &block|
|
120
|
+
options = args.extract_options!
|
121
|
+
input_prepend = options.delete :input_prepend
|
122
|
+
input_append = options.delete :input_append
|
123
|
+
|
124
|
+
@template.capture do
|
125
|
+
if input_prepend.present? || input_append.present?
|
126
|
+
classes = []
|
127
|
+
classes << 'input-prepend' if input_prepend.present?
|
128
|
+
classes << 'input-append' if input_append.present?
|
129
|
+
classes = classes.join(' ')
|
130
|
+
@template.concat @template.content_tag(:div, class: classes) {
|
131
|
+
if input_prepend.present?
|
132
|
+
@template.concat @template.content_tag(:span, input_prepend, class: 'add-on')
|
133
|
+
end
|
134
|
+
@template.concat super(attribute, *(args << options))
|
135
|
+
if input_append.present?
|
136
|
+
@template.concat @template.content_tag(:span, input_append, class: 'add-on')
|
137
|
+
end
|
138
|
+
}
|
139
|
+
else
|
140
|
+
@template.concat super(attribute, *(args << options))
|
141
|
+
end
|
142
|
+
@template.concat error_span(attribute) if errors_on? attribute
|
143
|
+
block.call if block.present?
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def check_box(attribute, text, options = {}, checked_value = 1, unchecked_value = 0)
|
149
|
+
klasses = 'checkbox'
|
150
|
+
klasses += ' inline' if options.delete :inline
|
151
|
+
|
152
|
+
label attribute, class: klasses do
|
153
|
+
template.concat super(attribute, options, checked_value, unchecked_value)
|
154
|
+
template.concat text
|
155
|
+
yield if block_given?
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def radio_button(attribute, value, text = nil, options = {})
|
160
|
+
klasses = 'radio'
|
161
|
+
klasses += ' inline' if options.delete :inline
|
162
|
+
|
163
|
+
label attribute, class: klasses do
|
164
|
+
template.concat super(attribute, value, options)
|
165
|
+
template.concat text || value.to_s.humanize.titleize
|
166
|
+
yield if block_given?
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
private
|
171
|
+
|
172
|
+
def error_span(attribute)
|
173
|
+
@template.content_tag :span, errors_for(attribute), class: 'help-inline'
|
174
|
+
end
|
175
|
+
|
176
|
+
def errors_for(attribute)
|
177
|
+
object.errors[attribute].try(:join, ', ')
|
178
|
+
end
|
179
|
+
|
180
|
+
def errors_on?(attribute)
|
181
|
+
object.errors[attribute].present? if object.respond_to?(:errors)
|
182
|
+
end
|
183
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'active_support/core_ext/array/extract_options'
|
2
|
+
require 'bootstrap_form_helper'
|
3
|
+
|
4
|
+
module BootstrapFormHelper::FormHelper
|
5
|
+
def bootstrap_form_for(*args, &proc)
|
6
|
+
options = args.extract_options!
|
7
|
+
options.merge!(builder: BootstrapFormHelper::FormBuilder)
|
8
|
+
set_noop_field_error_proc do
|
9
|
+
form_for(*(args << options), &proc)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def bootstrap_fields_for(*args, &proc)
|
14
|
+
options = args.extract_options!
|
15
|
+
options.merge!(builder: BootstrapFormHelper::FormBuilder)
|
16
|
+
set_noop_field_error_proc do
|
17
|
+
fields_for(*(args << options), &proc)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
NOOP_FIELD_ERROR_PROC = Proc.new { |x| x }
|
24
|
+
|
25
|
+
def set_noop_field_error_proc
|
26
|
+
saved = ActionView::Base.field_error_proc
|
27
|
+
ActionView::Base.field_error_proc = NOOP_FIELD_ERROR_PROC
|
28
|
+
yield
|
29
|
+
ensure
|
30
|
+
ActionView::Base.field_error_proc = saved
|
31
|
+
end
|
32
|
+
end
|
metadata
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bootstrap_form_helper
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.2.0.beta1
|
5
|
+
prerelease: 8
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Ehren Kret
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-04-30 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: railties
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3'
|
22
|
+
- - <
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: '4'
|
25
|
+
type: :runtime
|
26
|
+
prerelease: false
|
27
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '3'
|
33
|
+
- - <
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '4'
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: actionpack
|
38
|
+
requirement: !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '3'
|
44
|
+
- - <
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '4'
|
47
|
+
type: :runtime
|
48
|
+
prerelease: false
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3'
|
55
|
+
- - <
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '4'
|
58
|
+
description: ! 'A rails form helper and builder for use with Twitter''s Bootstrap.
|
59
|
+
It wraps
|
60
|
+
|
61
|
+
form elements with the DOM necessary to render them correctly using
|
62
|
+
|
63
|
+
Bootstrap and automatically renders validation errors using Bootstrap.
|
64
|
+
|
65
|
+
'
|
66
|
+
email: ehren.kret@gmail.com
|
67
|
+
executables: []
|
68
|
+
extensions: []
|
69
|
+
extra_rdoc_files: []
|
70
|
+
files:
|
71
|
+
- lib/bootstrap_form_helper.rb
|
72
|
+
- lib/bootstrap_form_helper/form_builder.rb
|
73
|
+
- lib/bootstrap_form_helper/form_helper.rb
|
74
|
+
- lib/bootstrap_form_helper/railtie.rb
|
75
|
+
homepage: https://github.com/eakret/bootstrap_form_helper
|
76
|
+
licenses: []
|
77
|
+
post_install_message:
|
78
|
+
rdoc_options: []
|
79
|
+
require_paths:
|
80
|
+
- lib
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '1.9'
|
87
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
|
+
none: false
|
89
|
+
requirements:
|
90
|
+
- - ! '>'
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: 1.3.1
|
93
|
+
requirements: []
|
94
|
+
rubyforge_project:
|
95
|
+
rubygems_version: 1.8.23
|
96
|
+
signing_key:
|
97
|
+
specification_version: 3
|
98
|
+
summary: Rails form helper for Twitter's Bootstrap
|
99
|
+
test_files: []
|