Skip to content

Commit e3f14d8

Browse files
author
José Valim
committed
Add label/1 (without form)
1 parent 7541059 commit e3f14d8

File tree

2 files changed

+84
-35
lines changed

2 files changed

+84
-35
lines changed

lib/phoenix_html/form.ex

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -367,10 +367,14 @@ defmodule Phoenix.HTML.Form do
367367
"""
368368
@spec input_id(t | atom, field) :: String.t()
369369
def input_id(%{id: nil}, _field), do: nil
370-
def input_id(%{id: id}, field) when is_atom(field) or is_binary(field), do: "#{id}_#{field}"
371370

372-
def input_id(name, field) when (is_atom(name) and is_atom(field)) or is_binary(field),
373-
do: "#{name}_#{field}"
371+
def input_id(%{id: id}, field) when is_atom(field) or is_binary(field) do
372+
"#{id}_#{field}"
373+
end
374+
375+
def input_id(name, field) when (is_atom(name) and is_atom(field)) or is_binary(field) do
376+
"#{name}_#{field}"
377+
end
374378

375379
@doc """
376380
Returns an id of a corresponding form field and value attached to it.
@@ -1263,7 +1267,7 @@ defmodule Phoenix.HTML.Form do
12631267
"""
12641268
def date_select(form, field, opts \\ []) do
12651269
value = Keyword.get(opts, :value, input_value(form, field) || Keyword.get(opts, :default))
1266-
builder = Keyword.get(opts, :builder) || &date_builder(&1, opts)
1270+
builder = Keyword.get(opts, :builder) || (&date_builder(&1, opts))
12671271
builder.(datetime_builder(form, field, date_value(value), nil, opts))
12681272
end
12691273

@@ -1290,7 +1294,7 @@ defmodule Phoenix.HTML.Form do
12901294
"""
12911295
def time_select(form, field, opts \\ []) do
12921296
value = Keyword.get(opts, :value, input_value(form, field) || Keyword.get(opts, :default))
1293-
builder = Keyword.get(opts, :builder) || &time_builder(&1, opts)
1297+
builder = Keyword.get(opts, :builder) || (&time_builder(&1, opts))
12941298
builder.(datetime_builder(form, field, nil, time_value(value), opts))
12951299
end
12961300

@@ -1401,6 +1405,34 @@ defmodule Phoenix.HTML.Form do
14011405
@doc """
14021406
Generates a label tag.
14031407
1408+
Useful when wrapping another input inside a label.
1409+
1410+
## Examples
1411+
1412+
label do
1413+
radio_button :user, :choice, "Choice"
1414+
end
1415+
#=> <label class="control-label">...</label>
1416+
1417+
label class: "control-label" do
1418+
radio_button :user, :choice, "Choice"
1419+
end
1420+
#=> <label class="control-label">...</label>
1421+
1422+
"""
1423+
def label(do_block)
1424+
1425+
def label(do: block) do
1426+
content_tag(:label, block, [])
1427+
end
1428+
1429+
def label(opts, do: block) when is_list(opts) do
1430+
content_tag(:label, block, opts)
1431+
end
1432+
1433+
@doc """
1434+
Generates a label tag for the given field.
1435+
14041436
The form should either be a `Phoenix.HTML.Form` emitted
14051437
by `form_for` or an atom.
14061438
@@ -1409,6 +1441,8 @@ defmodule Phoenix.HTML.Form do
14091441
be overriden if you pass a value to the `for` option.
14101442
Text content would be inferred from `field` if not specified.
14111443
1444+
To wrap a label around an input, see `label/1`.
1445+
14121446
## Examples
14131447
14141448
# Assuming form contains a User schema
@@ -1433,14 +1467,17 @@ defmodule Phoenix.HTML.Form do
14331467
"E-mail Address"
14341468
end
14351469
#=> <label class="control-label" for="user_email">E-mail Address</label>
1470+
14361471
"""
1437-
def label(form, field) do
1472+
def label(form, field) when is_atom(field) or is_binary(field) do
14381473
label(form, field, humanize(field), [])
14391474
end
14401475

14411476
@doc """
14421477
See `label/2`.
14431478
"""
1479+
def label(form, field, text_or_do_block_or_attributes)
1480+
14441481
def label(form, field, text) when is_binary(text) do
14451482
label(form, field, text, [])
14461483
end
@@ -1456,14 +1493,16 @@ defmodule Phoenix.HTML.Form do
14561493
@doc """
14571494
See `label/2`.
14581495
"""
1496+
def label(form, field, text, do_block_or_attributes)
1497+
14591498
def label(form, field, text, opts) when is_binary(text) and is_list(opts) do
14601499
opts = Keyword.put_new(opts, :for, input_id(form, field))
14611500
content_tag(:label, text, opts)
14621501
end
14631502

1464-
def label(form, field, opts, do: block) do
1503+
def label(form, field, opts, do: block) when is_list(opts) do
14651504
opts = Keyword.put_new(opts, :for, input_id(form, field))
1466-
content_tag(:label, opts, do: block)
1505+
content_tag(:label, block, opts)
14671506
end
14681507

14691508
# Normalize field name to string version

test/phoenix_html/form_test.exs

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1138,43 +1138,53 @@ defmodule Phoenix.HTML.FormTest do
11381138
assert content =~ ~s(Sec: <select class="sec" id="sec" name="search[datetime][second]">)
11391139
end
11401140

1141-
## label/4
1141+
describe "label" do
1142+
test "with block" do
1143+
assert safe_to_string(
1144+
label do
1145+
"Block"
1146+
end
1147+
) == ~s(<label>Block</label>)
1148+
1149+
assert safe_to_string(
1150+
label class: "foo" do
1151+
"Block"
1152+
end
1153+
) == ~s(<label class="foo">Block</label>)
1154+
end
11421155

1143-
test "label/4" do
1144-
assert safe_to_string(label(:search, :key, "Search")) ==
1145-
~s(<label for="search_key">Search</label>)
1156+
test "with field but no content" do
1157+
assert safe_to_string(label(:search, :key)) == ~s(<label for="search_key">Key</label>)
11461158

1147-
assert safe_to_string(label(:search, :key, "Search", for: "test_key")) ==
1148-
~s(<label for="test_key">Search</label>)
1149-
end
1159+
assert safe_to_string(label(:search, :key, for: "test_key")) ==
1160+
~s(<label for="test_key">Key</label>)
11501161

1151-
test "label/4 with form" do
1152-
assert safe_form(&label(&1, :key, "Search")) == ~s(<label for="search_key">Search</label>)
1162+
assert safe_to_string(label(:search, :key, for: "test_key", class: "foo")) ==
1163+
~s(<label class="foo" for="test_key">Key</label>)
1164+
end
11531165

1154-
assert safe_form(&label(&1, :key, "Search", for: "test_key")) ==
1155-
~s(<label for="test_key">Search</label>)
1156-
end
1166+
test "with field and inline content" do
1167+
assert safe_to_string(label(:search, :key, "Search")) ==
1168+
~s(<label for="search_key">Search</label>)
11571169

1158-
test "label/4 with default value" do
1159-
assert safe_to_string(label(:search, :key)) == ~s(<label for="search_key">Key</label>)
1170+
assert safe_to_string(label(:search, :key, "Search", for: "test_key")) ==
1171+
~s(<label for="test_key">Search</label>)
11601172

1161-
assert safe_to_string(label(:search, :key, for: "test_key")) ==
1162-
~s(<label for="test_key">Key</label>)
1163-
end
1173+
assert safe_form(&label(&1, :key, "Search")) == ~s(<label for="search_key">Search</label>)
11641174

1165-
test "label/4 with form and default value" do
1166-
assert safe_form(&label(&1, :key)) == ~s(<label for="search_key">Key</label>)
1175+
assert safe_form(&label(&1, :key, "Search", for: "test_key")) ==
1176+
~s(<label for="test_key">Search</label>)
11671177

1168-
assert safe_form(&label(&1, :key, for: "test_key")) == ~s(<label for="test_key">Key</label>)
1169-
end
1178+
assert safe_form(&label(&1, :key, "Search", for: "test_key", class: "foo")) ==
1179+
~s(<label class="foo" for="test_key">Search</label>)
1180+
end
11701181

1171-
test "label/4 with a block" do
1172-
assert safe_form(&label(&1, :key, [class: "test-label"], do: "Hello")) ==
1173-
~s(<label class="test-label" for="search_key">Hello</label>)
1174-
end
1182+
test "with field and block content" do
1183+
assert safe_form(&label(&1, :key, do: "Hello")) == ~s(<label for="search_key">Hello</label>)
11751184

1176-
test "label/3 with a block" do
1177-
assert safe_form(&label(&1, :key, do: "Hello")) == ~s(<label for="search_key">Hello</label>)
1185+
assert safe_form(&label(&1, :key, [class: "test-label"], do: "Hello")) ==
1186+
~s(<label class="test-label" for="search_key">Hello</label>)
1187+
end
11781188
end
11791189

11801190
## input_value/2

0 commit comments

Comments
 (0)