Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions lib/phoenix_html/form.ex
Original file line number Diff line number Diff line change
Expand Up @@ -1433,6 +1433,9 @@ defmodule Phoenix.HTML.Form do
"E-mail Address"
end
#=> <label class="control-label" for="user_email">E-mail Address</label>

label :user, :newsletters, "Recieve all newsletters", value: "all"
#=> <label for="user_newsletters_all">Recieve all newsletters</label>
"""
def label(form, field) do
label(form, field, humanize(field), [])
Expand All @@ -1457,15 +1460,25 @@ defmodule Phoenix.HTML.Form do
See `label/2`.
"""
def label(form, field, text, opts) when is_binary(text) and is_list(opts) do
opts = Keyword.put_new(opts, :for, input_id(form, field))
opts = label_options(form, field, opts)
content_tag(:label, text, opts)
end

def label(form, field, opts, do: block) do
opts = Keyword.put_new(opts, :for, input_id(form, field))
opts = label_options(form, field, opts)
content_tag(:label, opts, do: block)
end

defp label_options(form, field, opts) do
{opts, input_id} =
case Keyword.pop(opts, :value) do
{nil, opts} -> {opts, input_id(form, field)}
{value, opts} -> {opts, input_id(form, field, value)}
end

Keyword.put_new(opts, :for, input_id)
end

# Normalize field name to string version
defp field_to_string(field) when is_atom(field), do: Atom.to_string(field)
defp field_to_string(field) when is_binary(field), do: field
Expand Down
4 changes: 4 additions & 0 deletions test/phoenix_html/form_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -1173,6 +1173,10 @@ defmodule Phoenix.HTML.FormTest do
~s(<label class="test-label" for="search_key">Hello</label>)
end

test "label/4 with for_value option" do
assert safe_form(&label(&1, :key, value: "1")) == ~s(<label for="search_key_1">Key</label>)
end

test "label/3 with a block" do
assert safe_form(&label(&1, :key, do: "Hello")) == ~s(<label for="search_key">Hello</label>)
end
Expand Down