-
Notifications
You must be signed in to change notification settings - Fork 147
/
label.ex
71 lines (54 loc) · 1.82 KB
/
label.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
defmodule Surface.Components.Form.Label do
@moduledoc """
Defines a label.
Provides similar capabilities to Phoenix's built-in `label/2`
function.
Option `class` can be set directly and will override anything in `opts`.
All given options are forwarded to the underlying tag. A default value is
provided for for attribute but can be overriden if you pass a value to the
for option. Text content would be inferred from field if not specified.
"""
use Surface.Component
use Surface.Components.Events
import Surface.Components.Utils, only: [events_to_opts: 1]
import Surface.Components.Form.Utils
alias Surface.Components.Form.Input.InputContext
@doc "The form identifier"
prop form, :form
@doc "The field name"
prop field, :any
@doc "The CSS class for the underlying tag"
prop class, :css_class
@doc """
The text for the generated `<label>` element, if no content (default slot) is provided.
"""
prop text, :any
@doc "Options list"
prop opts, :keyword, default: []
@doc """
The text for the label
"""
slot default
def render(assigns) do
helper_opts = props_to_opts(assigns)
attr_opts = props_to_attr_opts(assigns, class: get_config(:default_class))
event_opts = events_to_opts(assigns)
opts =
assigns.opts
|> Keyword.merge(helper_opts)
|> Keyword.merge(attr_opts)
|> Keyword.merge(event_opts)
assigns = assign(assigns, opts: opts)
~F"""
<InputContext assigns={assigns} :let={form: form, field: field}>
<label :attrs={input_id(form, field) ++ @opts}>
<#slot>{@text || Phoenix.Naming.humanize(field)}</#slot>
</label>
</InputContext>
"""
end
defp input_id(form, field) when is_nil(form) or is_nil(field), do: []
defp input_id(form, field) do
[for: Phoenix.HTML.Form.input_id(form, field)]
end
end