rails_bootstrap_form 0.9.0 → 0.9.2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +25 -0
- data/Gemfile.lock +1 -1
- data/README.md +97 -44
- data/demo/app/views/users/_horizontal_form.html.erb +7 -2
- data/demo/app/views/users/_vertical_form.html.erb +7 -2
- data/lib/rails_bootstrap_form/bootstrap_form_builder.rb +5 -2
- data/lib/rails_bootstrap_form/field_wrapper_builder.rb +54 -49
- data/lib/rails_bootstrap_form/helpers/buttons.rb +3 -3
- data/lib/rails_bootstrap_form/helpers/check_box.rb +26 -26
- data/lib/rails_bootstrap_form/helpers/help_text.rb +3 -3
- data/lib/rails_bootstrap_form/helpers/labels.rb +16 -16
- data/lib/rails_bootstrap_form/helpers/radio_button.rb +22 -23
- data/lib/rails_bootstrap_form/helpers.rb +2 -2
- data/lib/rails_bootstrap_form/input_group_builder.rb +14 -14
- data/lib/rails_bootstrap_form/inputs/base.rb +33 -6
- data/lib/rails_bootstrap_form/inputs/check_box.rb +11 -19
- data/lib/rails_bootstrap_form/inputs/collection_check_boxes.rb +9 -15
- data/lib/rails_bootstrap_form/inputs/collection_radio_buttons.rb +8 -16
- data/lib/rails_bootstrap_form/inputs/collection_select.rb +3 -3
- data/lib/rails_bootstrap_form/inputs/color_field.rb +3 -3
- data/lib/rails_bootstrap_form/inputs/grouped_collection_select.rb +3 -3
- data/lib/rails_bootstrap_form/inputs/radio_button.rb +11 -19
- data/lib/rails_bootstrap_form/inputs/range_field.rb +3 -3
- data/lib/rails_bootstrap_form/inputs/rich_text_area.rb +3 -3
- data/lib/rails_bootstrap_form/inputs/select.rb +3 -3
- data/lib/rails_bootstrap_form/inputs/time_zone_select.rb +3 -3
- data/lib/rails_bootstrap_form/inputs/weekday_select.rb +3 -3
- data/lib/rails_bootstrap_form/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 23429dc16ad64529ba65b78cf376ff4bb5b31134bb87b1f8808af1fd32fe0427
|
|
4
|
+
data.tar.gz: 83785c866c4705460b55cbad301971492f360407b4d91abf49e0f11d25f07070
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3be8e0f60800ddd2fabf8b6db7a5d2d996bb45c932f184578448e4525bddd85d87f798b69dbc13787e04e87d2d2ed53dcabd4f9e78f97914247379a83237bafb
|
|
7
|
+
data.tar.gz: 2ab6a13c6b251556033636c06baa061b4379b8acea6461e1b6a36ddda9fd85a8892b322c660aa7d68e2377f6271250fa28fe35691c7f35a5001e5b928597d21f
|
data/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,31 @@ You can find recent releases with docs in GitHub:
|
|
|
4
4
|
|
|
5
5
|
https://github.com/shivam091/rails_bootstrap_form/releases
|
|
6
6
|
|
|
7
|
+
## [0.9.2](https://github.com/shivam091/rails_bootstrap_form/compare/v0.9.1...v0.9.2) - 2023-06-03
|
|
8
|
+
|
|
9
|
+
### What's new
|
|
10
|
+
|
|
11
|
+
- Added support to disable wrapper by passing option `wrapper: false`.
|
|
12
|
+
|
|
13
|
+
### What's fixed
|
|
14
|
+
|
|
15
|
+
- Changes to not showing required `asterisk` in `collection_check_boxes` and `collection_radio_buttons` helper ([#34](https://github.com/shivam091/rails_bootstrap_form/issues/34)).
|
|
16
|
+
|
|
17
|
+
### What's changed
|
|
18
|
+
|
|
19
|
+
- Wrappers of `check_box`, `collection_check_boxes`, `radio_button`, and `collection_radio_buttons` helpers.
|
|
20
|
+
|
|
21
|
+
## [0.9.1](https://github.com/shivam091/rails_bootstrap_form/compare/v0.9.0...v0.9.1) - 2023-06-02
|
|
22
|
+
|
|
23
|
+
### What's new
|
|
24
|
+
|
|
25
|
+
- Allow user to configure `options[:multiple]` for `collection_check_boxes`.
|
|
26
|
+
- Added option `inline` to control inline rendering of `collection_check_boxes` and `collection_radio_buttons`.
|
|
27
|
+
|
|
28
|
+
### What's changed
|
|
29
|
+
|
|
30
|
+
- `wrapper[:class]` will now be appended to existing field wrapper CSS classes ([#29](https://github.com/shivam091/rails_bootstrap_form/issues/29))
|
|
31
|
+
|
|
7
32
|
## [0.9.0](https://github.com/shivam091/rails_bootstrap_form/compare/v0.8.3...v0.9.0) - 2023-05-31
|
|
8
33
|
|
|
9
34
|
### What's new
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
|
@@ -103,10 +103,12 @@ This generates the following HTML:
|
|
|
103
103
|
<label class="form-label required" for="user_password">Password</label>
|
|
104
104
|
<input class="form-control" aria-required="true" required="required" type="password" name="user[password]" id="user_password">
|
|
105
105
|
</div>
|
|
106
|
-
<div class="
|
|
107
|
-
<
|
|
108
|
-
|
|
109
|
-
|
|
106
|
+
<div class="mb-3">
|
|
107
|
+
<div class="form-check">
|
|
108
|
+
<input class="form-check-input" type="checkbox" value="1" name="user[terms]" id="user_terms">
|
|
109
|
+
<label class="form-check-label" for="user_terms">I accept terms and conditions</label>
|
|
110
|
+
<div class="form-text text-muted">You must first accept terms and conditions in order to continue</div>
|
|
111
|
+
</div>
|
|
110
112
|
</div>
|
|
111
113
|
<input type="submit" name="commit" value="Log In" class="btn btn-primary" data-disable-with="Log In">
|
|
112
114
|
</form>
|
|
@@ -139,10 +141,12 @@ This generates the following HTML:
|
|
|
139
141
|
<label class="form-label required" for="user_password">Password</label>
|
|
140
142
|
<input class="form-control" aria-required="true" required="required" type="password" name="user[password]" id="user_password">
|
|
141
143
|
</div>
|
|
142
|
-
<div class="
|
|
143
|
-
<
|
|
144
|
-
|
|
145
|
-
|
|
144
|
+
<div class="mb-3">
|
|
145
|
+
<div class="form-check">
|
|
146
|
+
<input class="form-check-input" type="checkbox" value="1" name="user[terms]" id="user_terms">
|
|
147
|
+
<label class="form-check-label" for="user_terms">I accept terms and conditions</label>
|
|
148
|
+
<div class="form-text text-muted">You must first accept terms and conditions in order to continue</div>
|
|
149
|
+
</div>
|
|
146
150
|
</div>
|
|
147
151
|
<input type="submit" name="commit" value="Log In" class="btn btn-primary" data-disable-with="Log In">
|
|
148
152
|
</form>
|
|
@@ -171,7 +175,7 @@ Here's a list of all possible options you can pass via `bootstrap` option that c
|
|
|
171
175
|
| `floating` | An option to control whether the field should have a floating label. | `false` |
|
|
172
176
|
| `static_field_class` | A CSS class that will be applied to all static fields. | `form-control-plaintext` |
|
|
173
177
|
| `switch` | An option to control whether the check box should look like Bootstrap switches. | `false` |
|
|
174
|
-
| `wrapper` | An option to control the HTML attributes and options that will be added to a field wrapper. | `{}` |
|
|
178
|
+
| `wrapper` | An option to control the HTML attributes and options that will be added to a field wrapper. You can set it false if you don't the field to be rendered in a wrapper. | `{}` |
|
|
175
179
|
| `size` | An option to control the size of input groups, buttons, labels, and fields. It can be `sm` or `lg`. | `nil` |
|
|
176
180
|
| `inline` | An option to group checkboxes and radio buttons on the same horizontal row. | `false` |
|
|
177
181
|
| `label_col_class` | A CSS class that will be applied to all labels when layout is `horizontal`. | `col-form-label` |
|
|
@@ -189,7 +193,7 @@ Here's an example of a form where one field uses different layout:
|
|
|
189
193
|
<%= form.text_field :name %>
|
|
190
194
|
<%= form.email_field :email %>
|
|
191
195
|
<%= form.password_field :password, bootstrap: {layout: :horizontal} %>
|
|
192
|
-
<%= form.check_box :terms
|
|
196
|
+
<%= form.check_box :terms %>
|
|
193
197
|
<%= form.primary "Register" %>
|
|
194
198
|
<% end %>
|
|
195
199
|
```
|
|
@@ -212,11 +216,12 @@ This generates the following HTML:
|
|
|
212
216
|
<input class="form-control" aria-required="true" required="required" type="password" name="user[password]" id="user_password">
|
|
213
217
|
</div>
|
|
214
218
|
</div>
|
|
215
|
-
<div class="
|
|
216
|
-
<
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
219
|
+
<div class="mb-3">
|
|
220
|
+
<div class="form-check">
|
|
221
|
+
<input class="form-check-input" type="checkbox" value="1" name="user[terms]" id="user_terms">
|
|
222
|
+
<label class="form-check-label" for="user_terms">I accept terms and conditions</label>
|
|
223
|
+
<div class="form-text text-muted">You must first accept terms and conditions in order to continue</div>
|
|
224
|
+
</div>
|
|
220
225
|
</div>
|
|
221
226
|
<input type="submit" name="commit" value="Register" class="btn btn-primary" data-disable-with="Register">
|
|
222
227
|
</form>
|
|
@@ -230,6 +235,23 @@ You can completely disable bootstrap and use default form builder by passing `di
|
|
|
230
235
|
<%= form.text_field :username, bootstrap: {disabled: true} %>
|
|
231
236
|
```
|
|
232
237
|
|
|
238
|
+
### Disabling wrapper
|
|
239
|
+
|
|
240
|
+
In some cases, you may need to disable the default wrapper. You can do this by passing 'wrapper: false':
|
|
241
|
+
|
|
242
|
+

|
|
243
|
+
|
|
244
|
+
```erb
|
|
245
|
+
<%= form.text_field :name, bootstrap: {wrapper: false} %>
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
This generates the following HTML:
|
|
249
|
+
|
|
250
|
+
```html
|
|
251
|
+
<label class="form-label required" for="user_name">Name</label>
|
|
252
|
+
<input class="form-control" aria-required="true" required="required" type="text" name="user[name]" id="user_name">
|
|
253
|
+
```
|
|
254
|
+
|
|
233
255
|
## Supported Form Helpers
|
|
234
256
|
|
|
235
257
|
This gem wraps most of the form field helpers. Here's the current list:
|
|
@@ -677,10 +699,11 @@ This helper will render check box and label for you.
|
|
|
677
699
|
This generates the following HTML:
|
|
678
700
|
|
|
679
701
|
```html
|
|
680
|
-
<div class="
|
|
681
|
-
<
|
|
682
|
-
|
|
683
|
-
|
|
702
|
+
<div class="mb-3">
|
|
703
|
+
<div class="form-check">
|
|
704
|
+
<input class="form-check-input" type="checkbox" value="1" name="user[remember_me]" id="user_remember_me">
|
|
705
|
+
<label class="form-check-label" for="user_remember_me">Keep me signed in</label>
|
|
706
|
+
</div>
|
|
684
707
|
</div>
|
|
685
708
|
```
|
|
686
709
|
|
|
@@ -695,10 +718,11 @@ You can set `switch` option to `true` if you want check box to look like switche
|
|
|
695
718
|
This generates the following HTML:
|
|
696
719
|
|
|
697
720
|
```html
|
|
698
|
-
<div class="
|
|
699
|
-
<
|
|
700
|
-
|
|
701
|
-
|
|
721
|
+
<div class="mb-3">
|
|
722
|
+
<div class="form-check form-switch">
|
|
723
|
+
<input class="form-check-input" type="checkbox" value="1" name="user[remember_me]" id="user_remember_me">
|
|
724
|
+
<label class="form-check-label" for="user_remember_me">Keep me signed in</label>
|
|
725
|
+
</div>
|
|
702
726
|
</div>
|
|
703
727
|
```
|
|
704
728
|
|
|
@@ -713,11 +737,12 @@ This helper also renders help text if `help_text` option is set or information o
|
|
|
713
737
|
This generates the following HTML:
|
|
714
738
|
|
|
715
739
|
```html
|
|
716
|
-
<div class="
|
|
717
|
-
<
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
740
|
+
<div class="mb-3">
|
|
741
|
+
<div class="form-check">
|
|
742
|
+
<input required="required" class="form-check-input" type="checkbox" value="1" name="user[terms]" id="user_terms">
|
|
743
|
+
<label class="form-check-label required" for="user_terms">I accept terms and conditions</label>
|
|
744
|
+
<div class="form-text text-muted">You must first accept terms and conditions in order to continue</div>
|
|
745
|
+
</div>
|
|
721
746
|
</div>
|
|
722
747
|
```
|
|
723
748
|
|
|
@@ -836,7 +861,6 @@ Our `fields_for` helper accepts the same arguments as the [default Rails helper]
|
|
|
836
861
|
<%= form.check_box :terms, required: true %>
|
|
837
862
|
<%= form.primary "Register" %>
|
|
838
863
|
<% end %>
|
|
839
|
-
|
|
840
864
|
```
|
|
841
865
|
|
|
842
866
|
This generates the following HTML:
|
|
@@ -873,11 +897,12 @@ This generates the following HTML:
|
|
|
873
897
|
</select>
|
|
874
898
|
</div>
|
|
875
899
|
</div>
|
|
876
|
-
<div class="
|
|
877
|
-
<
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
900
|
+
<div class="mb-3">
|
|
901
|
+
<div class="form-check">
|
|
902
|
+
<input required="required" class="form-check-input" type="checkbox" value="1" name="user[terms]" id="user_terms">
|
|
903
|
+
<label class="form-check-label required" for="user_terms">I accept terms and conditions</label>
|
|
904
|
+
<div class="form-text text-muted">You must first accept terms and conditions in order to continue</div>
|
|
905
|
+
</div>
|
|
881
906
|
</div>
|
|
882
907
|
<input type="submit" name="commit" value="Register" class="btn btn-primary" data-disable-with="Register">
|
|
883
908
|
</form>
|
|
@@ -1066,9 +1091,11 @@ This helper will render check box and label for you.
|
|
|
1066
1091
|
This generates the following HTML:
|
|
1067
1092
|
|
|
1068
1093
|
```html
|
|
1069
|
-
<div class="
|
|
1070
|
-
<
|
|
1071
|
-
|
|
1094
|
+
<div class="mb-3">
|
|
1095
|
+
<div class="form-check">
|
|
1096
|
+
<input class="form-check-input" type="radio" value="male" name="user[gender]" id="user_gender_male">
|
|
1097
|
+
<label class="form-check-label" for="user_gender_male">Male</label>
|
|
1098
|
+
</div>
|
|
1072
1099
|
</div>
|
|
1073
1100
|
```
|
|
1074
1101
|
|
|
@@ -1083,10 +1110,12 @@ This helper also renders help text if `help_text` option is set or information o
|
|
|
1083
1110
|
This generates the following HTML:
|
|
1084
1111
|
|
|
1085
1112
|
```html
|
|
1086
|
-
<div class="
|
|
1087
|
-
<
|
|
1088
|
-
|
|
1089
|
-
|
|
1113
|
+
<div class="mb-3">
|
|
1114
|
+
<div class="form-check">
|
|
1115
|
+
<input class="form-check-input" type="radio" value="male" name="user[gender]" id="user_gender_male">
|
|
1116
|
+
<label class="form-check-label" for="user_gender_male">Male</label>
|
|
1117
|
+
<div class="form-text text-muted">Please select your gender</div>
|
|
1118
|
+
</div>
|
|
1090
1119
|
</div>
|
|
1091
1120
|
```
|
|
1092
1121
|
|
|
@@ -1412,7 +1441,7 @@ an argument and takes care of rendering labels, check boxes, and wrapper for you
|
|
|
1412
1441
|

|
|
1413
1442
|
|
|
1414
1443
|
```erb
|
|
1415
|
-
<%= form.collection_check_boxes :skill_ids, ::Skill.all, :id, :name, {bootstrap: {layout: :horizontal}, onchange: "this.form.submit();"}, {} %>
|
|
1444
|
+
<%= form.collection_check_boxes :skill_ids, ::Skill.all, :id, :name, {bootstrap: {layout: :horizontal, inline: true}, onchange: "this.form.submit();"}, {} %>
|
|
1416
1445
|
```
|
|
1417
1446
|
|
|
1418
1447
|
This generates the following HTML:
|
|
@@ -1477,7 +1506,7 @@ an argument and takes care of rendering labels, radio button, and wrapper for yo
|
|
|
1477
1506
|

|
|
1478
1507
|
|
|
1479
1508
|
```erb
|
|
1480
|
-
<%= form.collection_radio_buttons :fruit_id, ::Fruit.all, :id, :name, {checked: form.object.fruit_id, bootstrap: {layout: :horizontal}}, {} %>
|
|
1509
|
+
<%= form.collection_radio_buttons :fruit_id, ::Fruit.all, :id, :name, {checked: form.object.fruit_id, bootstrap: {layout: :horizontal, inline: true}}, {} %>
|
|
1481
1510
|
```
|
|
1482
1511
|
|
|
1483
1512
|
This generates the following HTML:
|
|
@@ -1858,6 +1887,30 @@ This generates the following HTML:
|
|
|
1858
1887
|
</form>
|
|
1859
1888
|
```
|
|
1860
1889
|
|
|
1890
|
+
Inline errors are also supported if the field is wrapped inside of input group and has floating label:
|
|
1891
|
+
|
|
1892
|
+

|
|
1893
|
+
|
|
1894
|
+
```erb
|
|
1895
|
+
<%= form.text_field :expected_ctc, bootstrap: {floating: true, prepend: "$", append: "0.0"} %>
|
|
1896
|
+
```
|
|
1897
|
+
|
|
1898
|
+
This generates the following HTML:
|
|
1899
|
+
|
|
1900
|
+
```html
|
|
1901
|
+
<div class="mb-3">
|
|
1902
|
+
<div class="input-group has-validation">
|
|
1903
|
+
<span class="input-group-text">$</span>
|
|
1904
|
+
<div class="form-floating is-invalid">
|
|
1905
|
+
<input class="form-control is-invalid" aria-required="true" required="required" placeholder="Expected CTC" type="text" value="" name="user[expected_ctc]" id="user_expected_ctc">
|
|
1906
|
+
<label class="form-label required is-invalid" for="user_expected_ctc">Expected CTC</label>
|
|
1907
|
+
</div>
|
|
1908
|
+
<span class="input-group-text">0.0</span>
|
|
1909
|
+
<div class="invalid-feedback">can't be blank</div>
|
|
1910
|
+
</div>
|
|
1911
|
+
</div>
|
|
1912
|
+
```
|
|
1913
|
+
|
|
1861
1914
|
## Required Fields
|
|
1862
1915
|
|
|
1863
1916
|
A label that is associated with a mandatory field is automatically annotated with a `required` CSS class. `rails_bootstrap_form` provides styling for required fields.
|
|
@@ -1948,7 +2001,7 @@ bootstrap: {label_text: "<span></span>".html_safe}
|
|
|
1948
2001
|
|
|
1949
2002
|
## Contributing
|
|
1950
2003
|
|
|
1951
|
-
I welcome contributions. If you wish to contribute in `rails_bootstrap_form`, please review the [Contributing]() document first.
|
|
2004
|
+
I welcome contributions. If you wish to contribute in `rails_bootstrap_form`, please review the [Contributing](/CONTRIBUTING.md) document first.
|
|
1952
2005
|
|
|
1953
2006
|
## License
|
|
1954
2007
|
|
|
@@ -12,9 +12,14 @@
|
|
|
12
12
|
<%= form.date_field :birth_date %>
|
|
13
13
|
<%= form.range_field :excellence %>
|
|
14
14
|
<%= form.url_field :blog_url %>
|
|
15
|
-
<%= form.collection_radio_buttons :fruit_id, ::Fruit.all, :id, :name, {checked: form.object.fruit_id} %>
|
|
15
|
+
<%= form.collection_radio_buttons :fruit_id, ::Fruit.all, :id, :name, {checked: form.object.fruit_id, bootstrap: {inline: true}} %>
|
|
16
16
|
<%= form.color_field :favorite_color %>
|
|
17
|
-
<%= form.collection_check_boxes :skill_ids, ::Skill.all, :id, :name %>
|
|
17
|
+
<%= form.collection_check_boxes :skill_ids, ::Skill.all, :id, :name, multiple: true, bootstrap: {inline: true} %>
|
|
18
|
+
<%= form.number_field :expected_ctc, bootstrap: {prepend: "$", append: "0.0"} %>
|
|
19
|
+
<%= form.date_select :interview_date %>
|
|
20
|
+
<%= form.time_select :interview_time %>
|
|
21
|
+
<%= form.datetime_select :interview_datetime %>
|
|
22
|
+
<%= form.weekday_select :weekly_off %>
|
|
18
23
|
<%= form.fields_for :address, include_id: false do |address_form| %>
|
|
19
24
|
<%= address_form.text_area :street %>
|
|
20
25
|
<%= address_form.text_field :state %>
|
|
@@ -12,9 +12,14 @@
|
|
|
12
12
|
<%= form.date_field :birth_date %>
|
|
13
13
|
<%= form.range_field :excellence %>
|
|
14
14
|
<%= form.url_field :blog_url %>
|
|
15
|
-
<%= form.collection_radio_buttons :fruit_id, ::Fruit.all, :id, :name, {checked: form.object.fruit_id} %>
|
|
15
|
+
<%= form.collection_radio_buttons :fruit_id, ::Fruit.all, :id, :name, {checked: form.object.fruit_id, bootstrap: {inline: true}} %>
|
|
16
16
|
<%= form.color_field :favorite_color %>
|
|
17
|
-
<%= form.collection_check_boxes :skill_ids, ::Skill.all, :id, :name %>
|
|
17
|
+
<%= form.collection_check_boxes :skill_ids, ::Skill.all, :id, :name, multiple: true, bootstrap: {inline: true} %>
|
|
18
|
+
<%= form.number_field :expected_ctc, bootstrap: {prepend: "$", append: "0.0"} %>
|
|
19
|
+
<%= form.date_select :interview_date %>
|
|
20
|
+
<%= form.time_select :interview_time %>
|
|
21
|
+
<%= form.datetime_select :interview_datetime %>
|
|
22
|
+
<%= form.weekday_select :weekly_off %>
|
|
18
23
|
<%= form.fields_for :address, include_id: false do |address_form| %>
|
|
19
24
|
<%= address_form.text_area :street %>
|
|
20
25
|
<%= address_form.text_field :state %>
|
|
@@ -5,6 +5,9 @@
|
|
|
5
5
|
module RailsBootstrapForm
|
|
6
6
|
class BootstrapFormBuilder < ActionView::Helpers::FormBuilder
|
|
7
7
|
|
|
8
|
+
alias_method :check_box_without_bootstrap, :check_box
|
|
9
|
+
alias_method :radio_button_without_bootstrap, :radio_button
|
|
10
|
+
|
|
8
11
|
include RailsBootstrapForm::FieldWrapperBuilder
|
|
9
12
|
include RailsBootstrapForm::Helpers
|
|
10
13
|
include RailsBootstrapForm::InputGroupBuilder
|
|
@@ -42,8 +45,8 @@ module RailsBootstrapForm
|
|
|
42
45
|
|
|
43
46
|
def fields_for_options(record_object, fields_options)
|
|
44
47
|
fields_options = record_object if record_object.is_a?(Hash) && record_object.extractable_options?
|
|
45
|
-
|
|
46
|
-
fields_options =
|
|
48
|
+
bootstrap = {bootstrap: options.fetch(:bootstrap, {})}
|
|
49
|
+
fields_options = bootstrap.deep_merge!(fields_options)
|
|
47
50
|
fields_options
|
|
48
51
|
end
|
|
49
52
|
|
|
@@ -4,84 +4,89 @@
|
|
|
4
4
|
|
|
5
5
|
module RailsBootstrapForm
|
|
6
6
|
module FieldWrapperBuilder
|
|
7
|
-
def field_wrapper_builder(attribute,
|
|
8
|
-
field_options = field_css_options(attribute,
|
|
7
|
+
def field_wrapper_builder(attribute, bootstrap, options, html_options = nil, &block)
|
|
8
|
+
field_options = field_css_options(attribute, bootstrap, options, html_options.try(:symbolize_keys!))
|
|
9
9
|
|
|
10
|
-
field_wrapper(attribute,
|
|
10
|
+
field_wrapper(attribute, bootstrap, field_options, &block)
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
-
def field_wrapper(attribute,
|
|
14
|
-
label = draw_label(attribute, options,
|
|
15
|
-
help_text = help_text(attribute,
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
concat(help_text)
|
|
25
|
-
end)
|
|
13
|
+
def field_wrapper(attribute, bootstrap, options, &block)
|
|
14
|
+
label = draw_label(attribute, options, bootstrap)
|
|
15
|
+
help_text = help_text(attribute, bootstrap)
|
|
16
|
+
wrapper_content = ActiveSupport::SafeBuffer.new
|
|
17
|
+
|
|
18
|
+
if bootstrap.layout_horizontal?
|
|
19
|
+
wrapper_content << label
|
|
20
|
+
wrapper_content << tag.div(class: bootstrap.field_col_wrapper_class) do
|
|
21
|
+
input_group_wrapper(attribute, bootstrap) do
|
|
22
|
+
capture(&block)
|
|
23
|
+
end + help_text
|
|
26
24
|
end
|
|
27
25
|
else
|
|
28
|
-
if
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
concat(label)
|
|
34
|
-
end
|
|
35
|
-
end)
|
|
36
|
-
concat(help_text)
|
|
26
|
+
if bootstrap.floating?
|
|
27
|
+
wrapper_content << input_group_wrapper(attribute, bootstrap) do
|
|
28
|
+
tag.div(class: floating_label_classes(attribute)) do
|
|
29
|
+
capture(&block) + label
|
|
30
|
+
end
|
|
37
31
|
end
|
|
32
|
+
wrapper_content << help_text
|
|
38
33
|
else
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
capture(&block)
|
|
43
|
-
end)
|
|
44
|
-
concat(help_text)
|
|
34
|
+
wrapper_content << label
|
|
35
|
+
wrapper_content << input_group_wrapper(attribute, bootstrap) do
|
|
36
|
+
capture(&block)
|
|
45
37
|
end
|
|
38
|
+
wrapper_content << help_text
|
|
46
39
|
end
|
|
47
40
|
end
|
|
41
|
+
|
|
42
|
+
if bootstrap.wrapper
|
|
43
|
+
tag.div(**field_wrapper_options(bootstrap)) do
|
|
44
|
+
wrapper_content
|
|
45
|
+
end
|
|
46
|
+
else
|
|
47
|
+
wrapper_content
|
|
48
|
+
end
|
|
48
49
|
end
|
|
49
50
|
|
|
50
|
-
def field_wrapper_options(
|
|
51
|
+
def field_wrapper_options(bootstrap)
|
|
52
|
+
wrapper_options = bootstrap.wrapper
|
|
53
|
+
|
|
51
54
|
{}.tap do |option|
|
|
52
|
-
option[:class] = field_wrapper_classes(
|
|
53
|
-
|
|
55
|
+
option[:class] = field_wrapper_classes(bootstrap)
|
|
56
|
+
option.merge!(wrapper_options.except(:class)) if wrapper_options.is_a?(Hash)
|
|
57
|
+
end
|
|
54
58
|
end
|
|
55
59
|
|
|
56
|
-
def field_wrapper_classes(
|
|
60
|
+
def field_wrapper_classes(bootstrap)
|
|
57
61
|
classes = []
|
|
58
|
-
classes << "row" if
|
|
59
|
-
classes <<
|
|
62
|
+
classes << "row" if bootstrap.layout_horizontal?
|
|
63
|
+
classes << field_wrapper_default_class(bootstrap)
|
|
64
|
+
classes << bootstrap.wrapper[:class] if bootstrap.wrapper.is_a?(Hash)
|
|
60
65
|
classes.flatten.compact
|
|
61
66
|
end
|
|
62
67
|
|
|
63
|
-
def
|
|
64
|
-
|
|
68
|
+
def field_wrapper_default_class(bootstrap)
|
|
69
|
+
bootstrap.layout_inline? ? "col-12" : "mb-3"
|
|
65
70
|
end
|
|
66
71
|
|
|
67
|
-
def field_css_options(attribute,
|
|
72
|
+
def field_css_options(attribute, bootstrap, options, html_options)
|
|
68
73
|
css_options = (html_options || options)
|
|
69
74
|
|
|
70
75
|
field_classes = Array(options[:class])
|
|
71
76
|
field_classes << [
|
|
72
|
-
|
|
73
|
-
|
|
77
|
+
bootstrap.field_class,
|
|
78
|
+
bootstrap.additional_field_class
|
|
74
79
|
]
|
|
75
80
|
field_classes << "is-invalid" if is_invalid?(attribute)
|
|
76
|
-
if is_size_valid?(
|
|
77
|
-
field_classes << "#{
|
|
81
|
+
if is_size_valid?(bootstrap)
|
|
82
|
+
field_classes << "#{bootstrap.field_class}-#{bootstrap.size}"
|
|
78
83
|
end
|
|
79
84
|
|
|
80
85
|
css_options[:class] = field_classes.flatten.compact
|
|
81
86
|
css_options.merge!(required_field_options(attribute, options))
|
|
82
87
|
|
|
83
|
-
if placeholder_required?(
|
|
84
|
-
css_options[:placeholder] ||= label_text(attribute,
|
|
88
|
+
if placeholder_required?(bootstrap)
|
|
89
|
+
css_options[:placeholder] ||= label_text(attribute, bootstrap)
|
|
85
90
|
end
|
|
86
91
|
|
|
87
92
|
css_options
|
|
@@ -95,11 +100,11 @@ module RailsBootstrapForm
|
|
|
95
100
|
classes
|
|
96
101
|
end
|
|
97
102
|
|
|
98
|
-
def placeholder_required?(
|
|
99
|
-
(
|
|
103
|
+
def placeholder_required?(bootstrap)
|
|
104
|
+
(bootstrap.floating? && !bootstrap.layout_horizontal?) || bootstrap.layout_inline?
|
|
100
105
|
end
|
|
101
106
|
|
|
102
|
-
private :field_wrapper, :field_wrapper_classes, :
|
|
107
|
+
private :field_wrapper, :field_wrapper_classes, :field_wrapper_default_class,
|
|
103
108
|
:field_css_options, :floating_label_classes
|
|
104
109
|
end
|
|
105
110
|
end
|
|
@@ -10,15 +10,15 @@ module RailsBootstrapForm
|
|
|
10
10
|
def self.included(base_class)
|
|
11
11
|
def render_button(value = nil, options = {}, &block)
|
|
12
12
|
value, options = nil, value if value.is_a?(Hash)
|
|
13
|
-
|
|
13
|
+
bootstrap = bootstrap_form_options.scoped(options.delete(:bootstrap))
|
|
14
14
|
|
|
15
|
-
button_html = if (
|
|
15
|
+
button_html = if (bootstrap.render_as_button? || block)
|
|
16
16
|
button(value, options, &block)
|
|
17
17
|
else
|
|
18
18
|
submit(value, options)
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
-
if
|
|
21
|
+
if bootstrap.layout_inline?
|
|
22
22
|
tag.div(class: "col-12") { button_html }
|
|
23
23
|
else
|
|
24
24
|
button_html
|
|
@@ -8,10 +8,10 @@ module RailsBootstrapForm
|
|
|
8
8
|
extend ActiveSupport::Concern
|
|
9
9
|
|
|
10
10
|
def self.included(base_class)
|
|
11
|
-
def check_box_label(attribute, checked_value, options,
|
|
12
|
-
unless
|
|
11
|
+
def check_box_label(attribute, checked_value, options, bootstrap, &block)
|
|
12
|
+
unless bootstrap.skip_label?
|
|
13
13
|
label_options = {
|
|
14
|
-
class: check_box_label_class(attribute,
|
|
14
|
+
class: check_box_label_class(attribute, bootstrap, options)
|
|
15
15
|
}
|
|
16
16
|
label_options[:for] = options[:id] if options[:id].present?
|
|
17
17
|
|
|
@@ -21,20 +21,14 @@ module RailsBootstrapForm
|
|
|
21
21
|
attribute
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
label_text = check_box_label_text(attribute, options,
|
|
24
|
+
label_text = check_box_label_text(attribute, options, bootstrap, &block)
|
|
25
25
|
|
|
26
26
|
label(label_name, label_text, label_options)
|
|
27
27
|
end
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
-
def
|
|
31
|
-
|
|
32
|
-
option[:class] = check_box_wrapper_class(bootstrap_options)
|
|
33
|
-
end.merge(bootstrap_options.wrapper)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def check_box_label_text(attribute, options, bootstrap_options, &block)
|
|
37
|
-
block ? capture(&block) : label_text(attribute, bootstrap_options)
|
|
30
|
+
def check_box_label_text(attribute, options, bootstrap, &block)
|
|
31
|
+
block ? capture(&block) : label_text(attribute, bootstrap)
|
|
38
32
|
end
|
|
39
33
|
|
|
40
34
|
def check_box_value(attribute, value)
|
|
@@ -50,32 +44,38 @@ module RailsBootstrapForm
|
|
|
50
44
|
classes.flatten.compact
|
|
51
45
|
end
|
|
52
46
|
|
|
53
|
-
def check_box_label_class(attribute,
|
|
54
|
-
classes = Array("form-check-label") <<
|
|
55
|
-
classes << "required" if is_field_required?(attribute, options)
|
|
47
|
+
def check_box_label_class(attribute, bootstrap, options)
|
|
48
|
+
classes = Array("form-check-label") << bootstrap.additional_label_class
|
|
49
|
+
classes << "required" if is_field_required?(attribute, options)
|
|
56
50
|
classes << "is-invalid" if is_invalid?(attribute)
|
|
57
|
-
classes <<
|
|
51
|
+
classes << bootstrap.hide_class if bootstrap.hide_label?
|
|
58
52
|
classes.flatten.compact
|
|
59
53
|
end
|
|
60
54
|
|
|
61
|
-
def
|
|
55
|
+
def check_box_wrapper_classes(bootstrap)
|
|
62
56
|
classes = Array("form-check")
|
|
63
|
-
classes << "form-switch" if
|
|
64
|
-
classes << "form-check-inline" if
|
|
65
|
-
if (bootstrap_options.layout_vertical? && !bootstrap_options.inline?)
|
|
66
|
-
classes << "mb-3"
|
|
67
|
-
end
|
|
57
|
+
classes << "form-switch" if bootstrap.switch?
|
|
58
|
+
classes << "form-check-inline" if bootstrap.inline?
|
|
68
59
|
classes.flatten.compact
|
|
69
60
|
end
|
|
70
61
|
|
|
71
|
-
def check_box_container_classes(
|
|
72
|
-
classes = Array(
|
|
73
|
-
classes << field_offset_class(
|
|
62
|
+
def check_box_container_classes(bootstrap)
|
|
63
|
+
classes = Array(bootstrap.field_col_wrapper_class)
|
|
64
|
+
classes << field_offset_class(bootstrap.label_col_wrapper_class)
|
|
74
65
|
classes.flatten.compact
|
|
75
66
|
end
|
|
76
67
|
|
|
68
|
+
def bootstrap_check_box(attribute, value, options, bootstrap)
|
|
69
|
+
options[:class] = check_box_classes(attribute, options)
|
|
70
|
+
check_box_field = check_box_without_bootstrap(attribute, options, value, nil)
|
|
71
|
+
check_box_label = check_box_label(attribute, value, options, bootstrap)
|
|
72
|
+
|
|
73
|
+
check_box_field + check_box_label
|
|
74
|
+
end
|
|
75
|
+
|
|
77
76
|
private :check_box_label, :check_box_classes, :check_box_label_class,
|
|
78
|
-
:
|
|
77
|
+
:check_box_wrapper_classes, :check_box_container_classes,
|
|
78
|
+
:bootstrap_check_box
|
|
79
79
|
end
|
|
80
80
|
end
|
|
81
81
|
end
|
|
@@ -8,10 +8,10 @@ module RailsBootstrapForm
|
|
|
8
8
|
extend ActiveSupport::Concern
|
|
9
9
|
|
|
10
10
|
def self.included(base_class)
|
|
11
|
-
def help_text(attribute,
|
|
12
|
-
return if
|
|
11
|
+
def help_text(attribute, bootstrap)
|
|
12
|
+
return if bootstrap.help_text == false
|
|
13
13
|
|
|
14
|
-
help_text = (
|
|
14
|
+
help_text = (bootstrap.help_text || scoped_help_text(attribute))
|
|
15
15
|
|
|
16
16
|
tag.div(help_text, class: "form-text text-muted") if help_text.present?
|
|
17
17
|
end
|
|
@@ -8,42 +8,42 @@ module RailsBootstrapForm
|
|
|
8
8
|
extend ActiveSupport::Concern
|
|
9
9
|
|
|
10
10
|
def self.included(base_class)
|
|
11
|
-
def draw_label(attribute, options,
|
|
12
|
-
unless
|
|
11
|
+
def draw_label(attribute, options, bootstrap)
|
|
12
|
+
unless bootstrap.skip_label? && !bootstrap.floating?
|
|
13
13
|
label_options = {
|
|
14
|
-
class: label_classes(attribute, options,
|
|
14
|
+
class: label_classes(attribute, options, bootstrap)
|
|
15
15
|
}
|
|
16
16
|
label_options[:for] = options[:id] if options[:id].present?
|
|
17
|
-
label_text = label_text(attribute,
|
|
17
|
+
label_text = label_text(attribute, bootstrap)
|
|
18
18
|
|
|
19
19
|
label(attribute, label_text, label_options)
|
|
20
20
|
end
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
def label_classes(attribute, options,
|
|
23
|
+
def label_classes(attribute, options, bootstrap)
|
|
24
24
|
classes = []
|
|
25
|
-
classes << label_layout_classes(
|
|
26
|
-
classes <<
|
|
27
|
-
classes <<
|
|
25
|
+
classes << label_layout_classes(bootstrap)
|
|
26
|
+
classes << bootstrap.additional_label_class
|
|
27
|
+
classes << bootstrap.hide_class if hide_class_required?(bootstrap)
|
|
28
28
|
classes << "required" if is_field_required?(attribute, options)
|
|
29
29
|
classes << "is-invalid" if is_invalid?(attribute)
|
|
30
30
|
classes.flatten.compact
|
|
31
31
|
end
|
|
32
32
|
|
|
33
|
-
def label_layout_classes(
|
|
34
|
-
if
|
|
35
|
-
[
|
|
33
|
+
def label_layout_classes(bootstrap)
|
|
34
|
+
if bootstrap.layout_horizontal?
|
|
35
|
+
[bootstrap.label_col_class, bootstrap.label_col_wrapper_class]
|
|
36
36
|
else
|
|
37
|
-
|
|
37
|
+
bootstrap.label_class
|
|
38
38
|
end
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
-
def label_text(attribute,
|
|
42
|
-
|
|
41
|
+
def label_text(attribute, bootstrap)
|
|
42
|
+
bootstrap.label_text || object&.class.try(:human_attribute_name, attribute)
|
|
43
43
|
end
|
|
44
44
|
|
|
45
|
-
def hide_class_required?(
|
|
46
|
-
|
|
45
|
+
def hide_class_required?(bootstrap)
|
|
46
|
+
bootstrap.hide_label? || (bootstrap.layout_inline? && !bootstrap.floating?)
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
private :draw_label, :label_classes, :label_text, :label_layout_classes,
|
|
@@ -8,11 +8,11 @@ module RailsBootstrapForm
|
|
|
8
8
|
extend ActiveSupport::Concern
|
|
9
9
|
|
|
10
10
|
def self.included(base_class)
|
|
11
|
-
def radio_button_label(attribute, value, options,
|
|
12
|
-
unless
|
|
11
|
+
def radio_button_label(attribute, value, options, bootstrap)
|
|
12
|
+
unless bootstrap.skip_label?
|
|
13
13
|
label_options = {
|
|
14
14
|
value: value,
|
|
15
|
-
class: radio_button_label_class(attribute,
|
|
15
|
+
class: radio_button_label_class(attribute, bootstrap, options)
|
|
16
16
|
}
|
|
17
17
|
label_options[:for] = options[:id] if options[:id].present?
|
|
18
18
|
|
|
@@ -22,18 +22,12 @@ module RailsBootstrapForm
|
|
|
22
22
|
attribute
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
-
label_text = label_text(attribute,
|
|
25
|
+
label_text = label_text(attribute, bootstrap)
|
|
26
26
|
|
|
27
27
|
label(label_name, label_text, label_options)
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
-
def radio_button_wrapper_options(bootstrap_options)
|
|
32
|
-
{}.tap do |option|
|
|
33
|
-
option[:class] = radio_button_wrapper_class(bootstrap_options)
|
|
34
|
-
end.merge(bootstrap_options.wrapper)
|
|
35
|
-
end
|
|
36
|
-
|
|
37
31
|
def radio_button_value(attribute, value)
|
|
38
32
|
# label's `for` attribute needs to match checkbox tag's id,
|
|
39
33
|
# IE sanitized value, IE
|
|
@@ -47,31 +41,36 @@ module RailsBootstrapForm
|
|
|
47
41
|
classes.flatten.compact
|
|
48
42
|
end
|
|
49
43
|
|
|
50
|
-
def radio_button_label_class(attribute,
|
|
51
|
-
classes = Array("form-check-label") <<
|
|
52
|
-
classes << "required" if is_field_required?(attribute, options)
|
|
44
|
+
def radio_button_label_class(attribute, bootstrap, options)
|
|
45
|
+
classes = Array("form-check-label") << bootstrap.additional_label_class
|
|
46
|
+
classes << "required" if is_field_required?(attribute, options)
|
|
53
47
|
classes << "is-invalid" if is_invalid?(attribute)
|
|
54
|
-
classes <<
|
|
48
|
+
classes << bootstrap.hide_class if bootstrap.hide_label?
|
|
55
49
|
classes.flatten.compact
|
|
56
50
|
end
|
|
57
51
|
|
|
58
|
-
def
|
|
52
|
+
def radio_button_wrapper_classes(bootstrap)
|
|
59
53
|
classes = Array("form-check")
|
|
60
|
-
classes << "form-check-inline" if
|
|
61
|
-
if (bootstrap_options.layout_vertical? && !bootstrap_options.inline?)
|
|
62
|
-
classes << "mb-3"
|
|
63
|
-
end
|
|
54
|
+
classes << "form-check-inline" if bootstrap.inline?
|
|
64
55
|
classes.flatten.compact
|
|
65
56
|
end
|
|
66
57
|
|
|
67
|
-
def radio_button_container_classes(
|
|
68
|
-
classes = Array(
|
|
69
|
-
classes << field_offset_class(
|
|
58
|
+
def radio_button_container_classes(bootstrap)
|
|
59
|
+
classes = Array(bootstrap.field_col_wrapper_class)
|
|
60
|
+
classes << field_offset_class(bootstrap.label_col_wrapper_class)
|
|
70
61
|
classes.flatten.compact
|
|
71
62
|
end
|
|
72
63
|
|
|
64
|
+
def bootstrap_radio_button(attribute, value, options, bootstrap)
|
|
65
|
+
options[:class] = radio_button_classes(attribute, options)
|
|
66
|
+
radio_button_field = radio_button_without_bootstrap(attribute, value, options)
|
|
67
|
+
radio_button_label = radio_button_label(attribute, value, options, bootstrap)
|
|
68
|
+
|
|
69
|
+
radio_button_field + radio_button_label
|
|
70
|
+
end
|
|
71
|
+
|
|
73
72
|
private :radio_button_label, :radio_button_classes, :radio_button_label_class,
|
|
74
|
-
:
|
|
73
|
+
:radio_button_wrapper_classes, :radio_button_container_classes
|
|
75
74
|
end
|
|
76
75
|
end
|
|
77
76
|
end
|
|
@@ -33,8 +33,8 @@ module RailsBootstrapForm
|
|
|
33
33
|
"rails-bootstrap-forms-#{field_tag_name.to_s.tr("_", "-")}"
|
|
34
34
|
end
|
|
35
35
|
|
|
36
|
-
def is_size_valid?(
|
|
37
|
-
|
|
36
|
+
def is_size_valid?(bootstrap)
|
|
37
|
+
bootstrap.size && %i(sm lg).include?(bootstrap.size)
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
def field_offset_class(label_col_wrapper_class)
|
|
@@ -7,17 +7,17 @@ module RailsBootstrapForm
|
|
|
7
7
|
extend ActiveSupport::Concern
|
|
8
8
|
|
|
9
9
|
def self.included(base_class)
|
|
10
|
-
def input_group_wrapper(attribute,
|
|
10
|
+
def input_group_wrapper(attribute, bootstrap, &block)
|
|
11
11
|
input = capture(&block) || ActiveSupport::SafeBuffer.new
|
|
12
12
|
|
|
13
|
-
if input_group_required?(
|
|
14
|
-
prepend = attach_input(
|
|
15
|
-
append = attach_input(
|
|
13
|
+
if input_group_required?(bootstrap)
|
|
14
|
+
prepend = attach_input(bootstrap, :prepend)
|
|
15
|
+
append = attach_input(bootstrap, :append)
|
|
16
16
|
|
|
17
17
|
input = prepend + input + append
|
|
18
18
|
input += generate_error(attribute)
|
|
19
19
|
|
|
20
|
-
input = tag.div(input, class: input_group_classes(attribute,
|
|
20
|
+
input = tag.div(input, class: input_group_classes(attribute, bootstrap))
|
|
21
21
|
else
|
|
22
22
|
input += generate_error(attribute)
|
|
23
23
|
end
|
|
@@ -25,18 +25,18 @@ module RailsBootstrapForm
|
|
|
25
25
|
input
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
def input_group_classes(attribute,
|
|
29
|
-
classes = Array("input-group") <<
|
|
30
|
-
if is_size_valid?(
|
|
31
|
-
classes << "input-group-#{
|
|
28
|
+
def input_group_classes(attribute, bootstrap)
|
|
29
|
+
classes = Array("input-group") << bootstrap.additional_input_group_class
|
|
30
|
+
if is_size_valid?(bootstrap)
|
|
31
|
+
classes << "input-group-#{bootstrap.size}"
|
|
32
32
|
end
|
|
33
33
|
# Require `has-validation` class if field has errors.
|
|
34
34
|
classes << "has-validation" if is_invalid?(attribute)
|
|
35
35
|
classes.flatten.compact
|
|
36
36
|
end
|
|
37
37
|
|
|
38
|
-
def attach_input(
|
|
39
|
-
tags = [*
|
|
38
|
+
def attach_input(bootstrap, key)
|
|
39
|
+
tags = [*bootstrap.send(key)].map do |item|
|
|
40
40
|
input_group_content(item)
|
|
41
41
|
end
|
|
42
42
|
|
|
@@ -49,10 +49,10 @@ module RailsBootstrapForm
|
|
|
49
49
|
tag.span(content.html_safe, class: "input-group-text")
|
|
50
50
|
end
|
|
51
51
|
|
|
52
|
-
def input_group_required?(
|
|
52
|
+
def input_group_required?(bootstrap)
|
|
53
53
|
[
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
bootstrap.prepend,
|
|
55
|
+
bootstrap.append
|
|
56
56
|
].any?(&:present?)
|
|
57
57
|
end
|
|
58
58
|
|
|
@@ -7,13 +7,40 @@ module RailsBootstrapForm
|
|
|
7
7
|
module Base
|
|
8
8
|
extend ActiveSupport::Concern
|
|
9
9
|
|
|
10
|
+
included do
|
|
11
|
+
def inputs_collection(attribute, collection, value_method, text_method, bootstrap, options = {})
|
|
12
|
+
inputs = ActiveSupport::SafeBuffer.new
|
|
13
|
+
|
|
14
|
+
collection.each do |object|
|
|
15
|
+
value = object.send(value_method)
|
|
16
|
+
input_options = {
|
|
17
|
+
bootstrap: {
|
|
18
|
+
label_text: text_method.respond_to?(:call) ? text_method.call(object) : object.send(text_method),
|
|
19
|
+
inline: bootstrap.inline?
|
|
20
|
+
},
|
|
21
|
+
required: false
|
|
22
|
+
}.deep_merge!(options)
|
|
23
|
+
|
|
24
|
+
if (checked = input_options[:checked])
|
|
25
|
+
input_options[:checked] = collection_input_checked?(checked, object, value)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
input_value = value_method.respond_to?(:call) ? value_method.call(object) : value
|
|
29
|
+
|
|
30
|
+
inputs << yield(attribute, input_value, input_options)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
inputs
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
10
37
|
class_methods do
|
|
11
38
|
def bootstrap_field(field_name)
|
|
12
39
|
define_method(field_name) do |attribute, options = {}|
|
|
13
|
-
|
|
14
|
-
return super(attribute, options) if
|
|
40
|
+
bootstrap = bootstrap_form_options.scoped(options.delete(:bootstrap))
|
|
41
|
+
return super(attribute, options) if bootstrap.disabled?
|
|
15
42
|
|
|
16
|
-
field_wrapper_builder(attribute,
|
|
43
|
+
field_wrapper_builder(attribute, bootstrap, options) do
|
|
17
44
|
super(attribute, options)
|
|
18
45
|
end
|
|
19
46
|
end
|
|
@@ -23,10 +50,10 @@ module RailsBootstrapForm
|
|
|
23
50
|
define_method(field_name) do |attribute, options = {}, html_options = {}|
|
|
24
51
|
options = {bootstrap: {field_class: "form-select"}}.deep_merge!(options)
|
|
25
52
|
|
|
26
|
-
|
|
27
|
-
return super(attribute, options, html_options) if
|
|
53
|
+
bootstrap = bootstrap_form_options.scoped(options.delete(:bootstrap))
|
|
54
|
+
return super(attribute, options, html_options) if bootstrap.disabled?
|
|
28
55
|
|
|
29
|
-
field_wrapper_builder(attribute,
|
|
56
|
+
field_wrapper_builder(attribute, bootstrap, options, html_options) do
|
|
30
57
|
tag.fieldset(class: control_specific_class(field_name)) do
|
|
31
58
|
super(attribute, options, html_options)
|
|
32
59
|
end
|
|
@@ -9,31 +9,23 @@ module RailsBootstrapForm
|
|
|
9
9
|
|
|
10
10
|
included do
|
|
11
11
|
def check_box(attribute, options = {}, checked_value = "1", unchecked_value = "0", &block)
|
|
12
|
-
|
|
13
|
-
return super if
|
|
12
|
+
bootstrap = bootstrap_form_options.scoped(options.delete(:bootstrap))
|
|
13
|
+
return super if bootstrap.disabled?
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
check_box_label = check_box_label(attribute, checked_value, options, bootstrap_options, &block)
|
|
21
|
-
|
|
22
|
-
check_box_html = tag.div(**check_box_wrapper_options(bootstrap_options)) do
|
|
23
|
-
concat(check_box_field)
|
|
24
|
-
concat(check_box_label)
|
|
25
|
-
concat(check_box_help_text) unless bootstrap_options.inline?
|
|
26
|
-
concat(generate_error(attribute)) if (is_invalid?(attribute) && !bootstrap_options.inline?)
|
|
15
|
+
check_box_html = tag.div(class: check_box_wrapper_classes(bootstrap)) do
|
|
16
|
+
concat(bootstrap_check_box(attribute, checked_value, options, bootstrap))
|
|
17
|
+
concat(help_text(attribute, bootstrap))
|
|
18
|
+
concat(generate_error(attribute)) if is_invalid?(attribute)
|
|
27
19
|
end
|
|
28
20
|
|
|
29
|
-
if
|
|
30
|
-
tag.div(
|
|
31
|
-
|
|
21
|
+
if bootstrap.wrapper
|
|
22
|
+
tag.div(**field_wrapper_options(bootstrap)) do
|
|
23
|
+
if bootstrap.layout_horizontal?
|
|
24
|
+
tag.div(class: check_box_container_classes(bootstrap)) { check_box_html }
|
|
25
|
+
else
|
|
32
26
|
check_box_html
|
|
33
27
|
end
|
|
34
28
|
end
|
|
35
|
-
elsif bootstrap_options.layout_inline?
|
|
36
|
-
tag.div(class: "col-12") { check_box_html }
|
|
37
29
|
else
|
|
38
30
|
check_box_html
|
|
39
31
|
end
|
|
@@ -9,30 +9,24 @@ module RailsBootstrapForm
|
|
|
9
9
|
|
|
10
10
|
included do
|
|
11
11
|
def collection_check_boxes(attribute, collection, value_method, text_method, options = {}, html_options = {})
|
|
12
|
-
|
|
13
|
-
return super if
|
|
12
|
+
bootstrap = bootstrap_form_options.scoped(options.delete(:bootstrap))
|
|
13
|
+
return super if bootstrap.disabled?
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
inputs = inputs_collection(attribute, collection, value_method, text_method, bootstrap, options) do |attribute, value, options|
|
|
16
|
+
bootstrap_opts = bootstrap_form_options.scoped(options.delete(:bootstrap))
|
|
16
17
|
|
|
17
|
-
|
|
18
|
+
check_box_html = tag.div(class: check_box_wrapper_classes(bootstrap_opts)) do
|
|
19
|
+
bootstrap_check_box(attribute, value, options, bootstrap_opts)
|
|
20
|
+
end
|
|
18
21
|
|
|
19
|
-
|
|
20
|
-
input_value = value_method.respond_to?(:call) ? value_method.call(object) : object.send(value_method)
|
|
21
|
-
input_options = {
|
|
22
|
-
bootstrap: {
|
|
23
|
-
label_text: text_method.respond_to?(:call) ? text_method.call(object) : object.send(text_method),
|
|
24
|
-
inline: true
|
|
25
|
-
}
|
|
26
|
-
}.deep_merge!(options)
|
|
27
|
-
|
|
28
|
-
inputs << check_box(attribute, input_options, input_value, nil)
|
|
22
|
+
check_box_html
|
|
29
23
|
end
|
|
30
24
|
|
|
31
25
|
if options.delete(:include_hidden) { true }
|
|
32
26
|
inputs.prepend(hidden_field(attribute, value: "", multiple: options[:multiple]))
|
|
33
27
|
end
|
|
34
28
|
|
|
35
|
-
field_wrapper_builder(attribute,
|
|
29
|
+
field_wrapper_builder(attribute, bootstrap, options, html_options) do
|
|
36
30
|
concat(tag.div(class: control_specific_class(:collection_check_boxes)) do
|
|
37
31
|
concat(inputs)
|
|
38
32
|
end)
|
|
@@ -9,28 +9,20 @@ module RailsBootstrapForm
|
|
|
9
9
|
|
|
10
10
|
included do
|
|
11
11
|
def collection_radio_buttons(attribute, collection, value_method, text_method, options = {}, html_options = {})
|
|
12
|
-
|
|
13
|
-
return super if
|
|
12
|
+
bootstrap = bootstrap_form_options.scoped(options.delete(:bootstrap))
|
|
13
|
+
return super if bootstrap.disabled?
|
|
14
14
|
|
|
15
|
-
inputs =
|
|
15
|
+
inputs = inputs_collection(attribute, collection, value_method, text_method, bootstrap, options) do |attribute, value, options|
|
|
16
|
+
bootstrap_opts = bootstrap_form_options.scoped(options.delete(:bootstrap))
|
|
16
17
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
input_options = {
|
|
20
|
-
bootstrap: {
|
|
21
|
-
label_text: text_method.respond_to?(:call) ? text_method.call(object) : object.send(text_method),
|
|
22
|
-
inline: true
|
|
23
|
-
}
|
|
24
|
-
}.deep_merge!(options)
|
|
25
|
-
|
|
26
|
-
if (checked = input_options[:checked])
|
|
27
|
-
input_options[:checked] = collection_input_checked?(checked, object, object.send(value_method))
|
|
18
|
+
bootstrap_radio_html = tag.div(class: radio_button_wrapper_classes(bootstrap_opts)) do
|
|
19
|
+
bootstrap_radio_button(attribute, value, options, bootstrap_opts)
|
|
28
20
|
end
|
|
29
21
|
|
|
30
|
-
|
|
22
|
+
bootstrap_radio_html
|
|
31
23
|
end
|
|
32
24
|
|
|
33
|
-
field_wrapper_builder(attribute,
|
|
25
|
+
field_wrapper_builder(attribute, bootstrap, options, html_options) do
|
|
34
26
|
concat(tag.div(class: control_specific_class(:collection_radio_buttons)) do
|
|
35
27
|
concat(inputs)
|
|
36
28
|
end)
|
|
@@ -11,10 +11,10 @@ module RailsBootstrapForm
|
|
|
11
11
|
def collection_select(attribute, collection, value_method, text_method, options = {}, html_options = {})
|
|
12
12
|
options = {bootstrap: {field_class: "form-select"}}.deep_merge!(options)
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
return super if
|
|
14
|
+
bootstrap = bootstrap_form_options.scoped(options.delete(:bootstrap))
|
|
15
|
+
return super if bootstrap.disabled?
|
|
16
16
|
|
|
17
|
-
field_wrapper_builder(attribute,
|
|
17
|
+
field_wrapper_builder(attribute, bootstrap, options, html_options) do
|
|
18
18
|
super(attribute, collection, value_method, text_method, options, html_options)
|
|
19
19
|
end
|
|
20
20
|
end
|
|
@@ -11,10 +11,10 @@ module RailsBootstrapForm
|
|
|
11
11
|
def color_field(attribute, options = {})
|
|
12
12
|
options = {bootstrap: {field_class: "form-control form-control-color"}}.deep_merge!(options)
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
return super if
|
|
14
|
+
bootstrap = bootstrap_form_options.scoped(options.delete(:bootstrap))
|
|
15
|
+
return super if bootstrap.disabled?
|
|
16
16
|
|
|
17
|
-
field_wrapper_builder(attribute,
|
|
17
|
+
field_wrapper_builder(attribute, bootstrap, options) do
|
|
18
18
|
super(attribute, options)
|
|
19
19
|
end
|
|
20
20
|
end
|
|
@@ -11,10 +11,10 @@ module RailsBootstrapForm
|
|
|
11
11
|
def grouped_collection_select(attribute, collection, group_method, group_label_method, option_key_method, option_value_method, options = {}, html_options = {})
|
|
12
12
|
options = {bootstrap: {field_class: "form-select"}}.deep_merge!(options)
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
return super if
|
|
14
|
+
bootstrap = bootstrap_form_options.scoped(options.delete(:bootstrap))
|
|
15
|
+
return super if bootstrap.disabled?
|
|
16
16
|
|
|
17
|
-
field_wrapper_builder(attribute,
|
|
17
|
+
field_wrapper_builder(attribute, bootstrap, options, html_options) do
|
|
18
18
|
super(attribute, collection, group_method, group_label_method, option_key_method, option_value_method, options, html_options)
|
|
19
19
|
end
|
|
20
20
|
end
|
|
@@ -9,31 +9,23 @@ module RailsBootstrapForm
|
|
|
9
9
|
|
|
10
10
|
included do
|
|
11
11
|
def radio_button(attribute, value, options = {})
|
|
12
|
-
|
|
13
|
-
return super if
|
|
12
|
+
bootstrap = bootstrap_form_options.scoped(options.delete(:bootstrap))
|
|
13
|
+
return super if bootstrap.disabled?
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
radio_button_label = radio_button_label(attribute, value, options, bootstrap_options)
|
|
21
|
-
|
|
22
|
-
radio_button_html = tag.div(**radio_button_wrapper_options(bootstrap_options)) do
|
|
23
|
-
concat(radio_button_field)
|
|
24
|
-
concat(radio_button_label)
|
|
25
|
-
concat(radio_button_help_text) unless bootstrap_options.inline?
|
|
26
|
-
concat(generate_error(attribute)) if (is_invalid?(attribute) && !bootstrap_options.inline?)
|
|
15
|
+
radio_button_html = tag.div(class: radio_button_wrapper_classes(bootstrap)) do
|
|
16
|
+
concat(bootstrap_radio_button(attribute, value, options, bootstrap))
|
|
17
|
+
concat(help_text(attribute, bootstrap))
|
|
18
|
+
concat(generate_error(attribute)) if is_invalid?(attribute)
|
|
27
19
|
end
|
|
28
20
|
|
|
29
|
-
if
|
|
30
|
-
tag.div(
|
|
31
|
-
|
|
21
|
+
if bootstrap.wrapper
|
|
22
|
+
tag.div(**field_wrapper_options(bootstrap)) do
|
|
23
|
+
if bootstrap.layout_horizontal?
|
|
24
|
+
tag.div(class: radio_button_container_classes(bootstrap)) { radio_button_html }
|
|
25
|
+
else
|
|
32
26
|
radio_button_html
|
|
33
27
|
end
|
|
34
28
|
end
|
|
35
|
-
elsif bootstrap_options.layout_inline?
|
|
36
|
-
tag.div(class: "col-12") { radio_button_html }
|
|
37
29
|
else
|
|
38
30
|
radio_button_html
|
|
39
31
|
end
|
|
@@ -11,10 +11,10 @@ module RailsBootstrapForm
|
|
|
11
11
|
def range_field(attribute, options = {})
|
|
12
12
|
options = {bootstrap: {field_class: "form-range"}}.deep_merge!(options)
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
return super if
|
|
14
|
+
bootstrap = bootstrap_form_options.scoped(options.delete(:bootstrap))
|
|
15
|
+
return super if bootstrap.disabled?
|
|
16
16
|
|
|
17
|
-
field_wrapper_builder(attribute,
|
|
17
|
+
field_wrapper_builder(attribute, bootstrap, options) do
|
|
18
18
|
super(attribute, options)
|
|
19
19
|
end
|
|
20
20
|
end
|
|
@@ -11,10 +11,10 @@ module RailsBootstrapForm
|
|
|
11
11
|
def rich_text_area(attribute, options = {})
|
|
12
12
|
options[:class] = ["trix-content", options[:class]].compact.join(" ")
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
return super if
|
|
14
|
+
bootstrap = bootstrap_form_options.scoped(options.delete(:bootstrap))
|
|
15
|
+
return super if bootstrap.disabled?
|
|
16
16
|
|
|
17
|
-
field_wrapper_builder(attribute,
|
|
17
|
+
field_wrapper_builder(attribute, bootstrap, options) do
|
|
18
18
|
super(attribute, options)
|
|
19
19
|
end
|
|
20
20
|
end
|
|
@@ -11,10 +11,10 @@ module RailsBootstrapForm
|
|
|
11
11
|
def select(attribute, choices = nil, options = {}, html_options = {}, &block)
|
|
12
12
|
options = {bootstrap: {field_class: "form-select"}}.deep_merge!(options)
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
return super if
|
|
14
|
+
bootstrap = bootstrap_form_options.scoped(options.delete(:bootstrap))
|
|
15
|
+
return super if bootstrap.disabled?
|
|
16
16
|
|
|
17
|
-
field_wrapper_builder(attribute,
|
|
17
|
+
field_wrapper_builder(attribute, bootstrap, options, html_options) do
|
|
18
18
|
super(attribute, choices, options, html_options, &block)
|
|
19
19
|
end
|
|
20
20
|
end
|
|
@@ -11,10 +11,10 @@ module RailsBootstrapForm
|
|
|
11
11
|
def time_zone_select(attribute, priority_zones = nil, options = {}, html_options = {})
|
|
12
12
|
options = {bootstrap: {field_class: "form-select"}}.deep_merge!(options)
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
return super if
|
|
14
|
+
bootstrap = bootstrap_form_options.scoped(options.delete(:bootstrap))
|
|
15
|
+
return super if bootstrap.disabled?
|
|
16
16
|
|
|
17
|
-
field_wrapper_builder(attribute,
|
|
17
|
+
field_wrapper_builder(attribute, bootstrap, options, html_options) do
|
|
18
18
|
super(attribute, priority_zones, options, html_options)
|
|
19
19
|
end
|
|
20
20
|
end
|
|
@@ -11,10 +11,10 @@ module RailsBootstrapForm
|
|
|
11
11
|
def weekday_select(attribute, options = {}, html_options = {}, &block)
|
|
12
12
|
options = {bootstrap: {field_class: "form-select"}}.deep_merge!(options)
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
return super if
|
|
14
|
+
bootstrap = bootstrap_form_options.scoped(options.delete(:bootstrap))
|
|
15
|
+
return super if bootstrap.disabled?
|
|
16
16
|
|
|
17
|
-
field_wrapper_builder(attribute,
|
|
17
|
+
field_wrapper_builder(attribute, bootstrap, options, html_options) do
|
|
18
18
|
super(attribute, options, html_options, &block)
|
|
19
19
|
end
|
|
20
20
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rails_bootstrap_form
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.9.
|
|
4
|
+
version: 0.9.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Harshal LADHE (shivam091)
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-
|
|
11
|
+
date: 2023-06-03 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: generator_spec
|