Packages
surface
0.7.4
0.12.3
0.12.2
0.12.1
0.12.0
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.1
0.1.0
0.1.0-alpha.2
0.1.0-alpha.1
0.1.0-alpha.0
A component based library for Phoenix LiveView
Current section
Files
Jump to
Current section
Files
lib/surface/components/form/label.ex
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 overridden 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