Skip to content

Commit 23dd6d4

Browse files
committed
Improve checkbox layout
Indent checkbox into second column for horizontal layout. Override with layout: :default Align label with the top of the first check box in a collection in horizontal layout Vertically align check boxes and labels in inline layout. Allow overriding the label class, not just add more classes. Avoid duplicate form label classes.
1 parent f53e024 commit 23dd6d4

18 files changed

+165
-112
lines changed

README.md

Lines changed: 57 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ This generates:
258258

259259
```html
260260
<div class="mb-3">
261-
<label class="form-label visually-hidden" for="user_comment">Comment</label>
261+
<label class="visually-hidden" for="user_comment">Comment</label>
262262
<textarea class="form-control" id="user_comment" name="user[comment]" placeholder="Leave a comment...">
263263
</textarea>
264264
</div>
@@ -275,7 +275,7 @@ This generates:
275275

276276
```html
277277
<div class="mb-3">
278-
<label class="form-label custom-class required" for="user_email">Email</label>
278+
<label class="custom-class required" for="user_email">Email</label>
279279
<input aria-required="true" class="form-control" id="user_email" name="user[email]" required="required" type="text" value="steve@example.com">
280280
</div>
281281
```
@@ -291,7 +291,7 @@ This generates:
291291

292292
```html
293293
<div class="mb-3">
294-
<label class="form-label visually-hidden required" for="user_email">Email</label>
294+
<label class="visually-hidden required" for="user_email">Email</label>
295295
<input aria-required="true" class="form-control" id="user_email" name="user[email]" placeholder="Email" required="required" type="text" value="">
296296
</div>
297297
```
@@ -787,7 +787,7 @@ This generates:
787787
```html
788788
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
789789
<div class="mb-3 row">
790-
<label class="form-label col-form-label col-sm-2 required" for="user_email">Email</label>
790+
<label class="col-form-label col-sm-2 required" for="user_email">Email</label>
791791
<div class="col-sm-10">
792792
<input aria-required="true" class="form-control-plaintext" id="user_email" name="user[email]" readonly required="required" type="text" value="steve@example.com">
793793
</div>
@@ -1049,17 +1049,19 @@ This generates:
10491049
```html
10501050
<form accept-charset="UTF-8" action="/users" class="new_user row row-cols-auto g-3 align-items-center" id="new_user" method="post">
10511051
<div class="col">
1052-
<label class="form-label visually-hidden me-sm-2 required" for="user_email">Email</label>
1052+
<label class="visually-hidden required" for="user_email">Email</label>
10531053
<input aria-required="true" class="form-control" id="user_email" name="user[email]" required="required" type="email" value="steve@example.com">
10541054
</div>
10551055
<div class="col">
1056-
<label class="form-label visually-hidden me-sm-2" for="user_password">Password</label>
1056+
<label class="visually-hidden" for="user_password">Password</label>
10571057
<input class="form-control" id="user_password" name="user[password]" type="password">
10581058
</div>
1059-
<div class="form-check form-check-inline mb-3">
1060-
<input autocomplete="off" name="user[remember_me]" type="hidden" value="0">
1061-
<input class="form-check-input" id="user_remember_me" name="user[remember_me]" type="checkbox" value="1">
1062-
<label class="form-check-label" for="user_remember_me">Remember me</label>
1059+
<div class="col">
1060+
<div class="form-check form-check-inline">
1061+
<input autocomplete="off" name="user[remember_me]" type="hidden" value="0">
1062+
<input class="form-check-input" id="user_remember_me" name="user[remember_me]" type="checkbox" value="1">
1063+
<label class="form-check-label" for="user_remember_me">Remember me</label>
1064+
</div>
10631065
</div>
10641066
<div class="col">
10651067
<input class="btn btn-secondary" data-disable-with="Create User" name="commit" type="submit" value="Create User">
@@ -1088,17 +1090,15 @@ To use a horizontal-layout form with labels to the left of the control, use the
10881090
`layout: :horizontal` option. You should specify both `label_col` and
10891091
`control_col` css classes as well (they default to `col-sm-2` and `col-sm-10`).
10901092

1091-
In the example below, the checkbox and submit button have been wrapped in a
1092-
`form_group` to keep them properly aligned.
1093+
In the example below, the submit button has been wrapped in a `form_group` to
1094+
keep it properly aligned.
10931095

10941096
![Example 38](demo/doc/screenshots/bootstrap/readme/38_example.png "Example 38")
10951097
```erb
10961098
<%= bootstrap_form_for(@user, layout: :horizontal, label_col: "col-sm-2", control_col: "col-sm-10") do |f| %>
10971099
<%= f.email_field :email %>
10981100
<%= f.password_field :password %>
1099-
<%= f.form_group do %>
1100-
<%= f.check_box :remember_me %>
1101-
<% end %>
1101+
<%= f.check_box :remember_me %>
11021102
<%= f.form_group do %>
11031103
<%= f.submit %>
11041104
<% end %>
@@ -1110,13 +1110,13 @@ This generates:
11101110
```html
11111111
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
11121112
<div class="mb-3 row">
1113-
<label class="form-label col-form-label col-sm-2 required" for="user_email">Email</label>
1113+
<label class="col-form-label col-sm-2 required" for="user_email">Email</label>
11141114
<div class="col-sm-10">
11151115
<input aria-required="true" class="form-control" id="user_email" name="user[email]" required="required" type="email" value="steve@example.com">
11161116
</div>
11171117
</div>
11181118
<div class="mb-3 row">
1119-
<label class="form-label col-form-label col-sm-2" for="user_password">Password</label>
1119+
<label class="col-form-label col-sm-2" for="user_password">Password</label>
11201120
<div class="col-sm-10">
11211121
<input class="form-control" id="user_password" name="user[password]" type="password">
11221122
</div>
@@ -1144,7 +1144,8 @@ The `label_col` and `control_col` css classes can also be changed per control:
11441144
```erb
11451145
<%= bootstrap_form_for(@user, layout: :horizontal) do |f| %>
11461146
<%= f.email_field :email %>
1147-
<%= f.text_field :age, control_col: "col-sm-3" %>
1147+
<%= f.text_field :age, label_col: "col-sm-3", control_col: "col-sm-3" %>
1148+
<%= f.check_box :terms, label_col: "", control_col: "col-sm-11" %>
11481149
<%= f.form_group do %>
11491150
<%= f.submit %>
11501151
<% end %>
@@ -1156,17 +1157,26 @@ This generates:
11561157
```html
11571158
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
11581159
<div class="mb-3 row">
1159-
<label class="form-label col-form-label col-sm-2 required" for="user_email">Email</label>
1160+
<label class="col-form-label col-sm-2 required" for="user_email">Email</label>
11601161
<div class="col-sm-10">
11611162
<input aria-required="true" class="form-control" id="user_email" name="user[email]" required="required" type="email" value="steve@example.com">
11621163
</div>
11631164
</div>
11641165
<div class="mb-3 row">
1165-
<label class="form-label col-form-label col-sm-2" for="user_age">Age</label>
1166+
<label class="col-form-label col-sm-3" for="user_age">Age</label>
11661167
<div class="col-sm-3">
11671168
<input class="form-control" id="user_age" name="user[age]" type="text" value="42">
11681169
</div>
11691170
</div>
1171+
<div class="mb-3 row">
1172+
<div class="col-sm-10">
1173+
<div class="form-check">
1174+
<input autocomplete="off" name="user[terms]" type="hidden" value="0">
1175+
<input class="form-check-input" control_col="col-sm-11" id="user_terms" label_col="" name="user[terms]" type="checkbox" value="1">
1176+
<label class="form-check-label" for="user_terms">Terms</label>
1177+
</div>
1178+
</div>
1179+
</div>
11701180
<div class="mb-3 row">
11711181
<div class="col-sm-10 offset-sm-2">
11721182
<input class="btn btn-secondary" data-disable-with="Create User" name="commit" type="submit" value="Create User">
@@ -1213,13 +1223,13 @@ This generates:
12131223
```html
12141224
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
12151225
<div class="mb-3 row">
1216-
<label class="form-label col-form-label col-sm-2 required" for="user_email">Email</label>
1226+
<label class="col-form-label col-sm-2 required" for="user_email">Email</label>
12171227
<div class="col-sm-10">
12181228
<input aria-required="true" class="form-control" id="user_email" name="user[email]" required="required" type="email" value="steve@example.com">
12191229
</div>
12201230
</div>
12211231
<div class="mb-3 row">
1222-
<label class="form-label col-form-label col-sm-2" for="user_age">Age</label>
1232+
<label class="col-form-label col-sm-2" for="user_age">Age</label>
12231233
<div class="col-sm-10 additional-control-col-class">
12241234
<input class="form-control" id="user_age" name="user[age]" type="text" value="42">
12251235
</div>
@@ -1240,11 +1250,12 @@ The form-level `layout` can be overridden per field, unless the form-level layou
12401250
```erb
12411251
<%= bootstrap_form_for(@user, layout: :horizontal) do |f| %>
12421252
<%= f.email_field :email %>
1243-
<%= f.text_field :feet, layout: :default %>
1244-
<%= f.text_field :inches, layout: :default %>
1245-
<%= f.form_group do %>
1246-
<%= f.submit %>
1247-
<% end %>
1253+
<div class="row">
1254+
<div class="col"><%= f.text_field :feet, layout: :default %></div>
1255+
<div class="col"><%= f.text_field :inches, layout: :default %></div>
1256+
</div>
1257+
<%= f.check_box :terms, layout: :default %>
1258+
<%= f.submit %>
12481259
<% end %>
12491260
```
12501261

@@ -1253,24 +1264,33 @@ This generates:
12531264
```html
12541265
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
12551266
<div class="mb-3 row">
1256-
<label class="form-label col-form-label col-sm-2 required" for="user_email">Email</label>
1267+
<label class="col-form-label col-sm-2 required" for="user_email">Email</label>
12571268
<div class="col-sm-10">
12581269
<input aria-required="true" class="form-control" id="user_email" name="user[email]" required="required" type="email" value="steve@example.com">
12591270
</div>
12601271
</div>
1261-
<div class="mb-3">
1262-
<label class="form-label" for="user_feet">Feet</label>
1263-
<input class="form-control" id="user_feet" name="user[feet]" type="text" value="5">
1272+
<div class="row">
1273+
<div class="col">
1274+
<div class="mb-3">
1275+
<label class="form-label" for="user_feet">Feet</label>
1276+
<input class="form-control" id="user_feet" name="user[feet]" type="text" value="5">
1277+
</div>
1278+
</div>
1279+
<div class="col">
1280+
<div class="mb-3">
1281+
<label class="form-label" for="user_inches">Inches</label>
1282+
<input class="form-control" id="user_inches" name="user[inches]" type="text" value="7">
1283+
</div>
1284+
</div>
12641285
</div>
12651286
<div class="mb-3">
1266-
<label class="form-label" for="user_inches">Inches</label>
1267-
<input class="form-control" id="user_inches" name="user[inches]" type="text" value="7">
1268-
</div>
1269-
<div class="mb-3 row">
1270-
<div class="col-sm-10 offset-sm-2">
1271-
<input class="btn btn-secondary" data-disable-with="Create User" name="commit" type="submit" value="Create User">
1287+
<div class="form-check">
1288+
<input autocomplete="off" name="user[terms]" type="hidden" value="0">
1289+
<input class="form-check-input" id="user_terms" layout="default" name="user[terms]" type="checkbox" value="1">
1290+
<label class="form-check-label" for="user_terms">Terms</label>
12721291
</div>
12731292
</div>
1293+
<input class="btn btn-secondary" data-disable-with="Create User" name="commit" type="submit" value="Create User">
12741294
</form>
12751295
```
12761296

24 Bytes
Loading
-5 Bytes
Loading
-71 Bytes
Loading
-28 Bytes
Loading
-81 Bytes
Loading
1.27 KB
Loading
215 Bytes
Loading

lib/bootstrap_form/components/labels.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ def generate_label(id, name, options, custom_label_col, group_layout)
2323
end
2424

2525
def label_classes(name, options, custom_label_col, group_layout)
26-
classes = ["form-label", options[:class], label_layout_classes(custom_label_col, group_layout)]
26+
classes = [options[:class] || label_layout_classes(custom_label_col, group_layout)]
27+
add_class = options.delete(:add_class)
28+
classes.prepend(add_class) if add_class
2729
classes << "required" if required_field_options(options, name)[:required]
2830
options.delete(:required)
2931
classes << "text-danger" if label_errors && error?(name)
@@ -34,7 +36,9 @@ def label_layout_classes(custom_label_col, group_layout)
3436
if layout_horizontal?(group_layout)
3537
["col-form-label", (custom_label_col || label_col)]
3638
elsif layout_inline?(group_layout)
37-
["me-sm-2"]
39+
%w[form-label me-sm-2]
40+
else
41+
"form-label"
3842
end
3943
end
4044

lib/bootstrap_form/form_group.rb

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,8 @@ def form_group(*args, &block)
1313
tag.div(**options.except(:append, :id, :label, :help, :icon,
1414
:input_group_class, :label_col, :control_col,
1515
:add_control_col_class, :layout, :prepend, :floating)) do
16-
form_group_content(
17-
generate_label(options[:id], name, options[:label], options[:label_col], options[:layout]),
18-
generate_help(name, options[:help]), options, &block
19-
)
16+
label = generate_label(options[:id], name, options[:label], options[:label_col], options[:layout])
17+
form_group_content(label, generate_help(name, options[:help]), options, &block)
2018
end
2119
end
2220

0 commit comments

Comments
 (0)