Packages
surface
0.6.1
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/time_select.ex
defmodule Surface.Components.Form.TimeSelect do
@moduledoc """
Generates select tags for time.
Provides a wrapper for Phoenix.HTML.Form's `time_select/3` function.
All options passed via `opts` will be sent to `time_select/3`,
`value`, `default`, `hour`, `minute`, `second` and `builder`
can be set directly and will override anything in `opts`.
## Examples
```
<TimeSelect form="alarm" field="time" />
<Form for={:alarm}>
<TimeSelect field={:time} />
</Form>
```
"""
use Surface.Component
import Phoenix.HTML.Form, only: [time_select: 3]
import Surface.Components.Form.Utils
alias Surface.Components.Form.Input.InputContext
@doc "The form identifier"
prop form, :form
@doc "The field name"
prop field, :string
@doc "The id prefix for underlying select fields"
prop id, :string
@doc "The name prefix for underlying select fields"
prop name, :string
@doc "Value to pre-populate the select"
prop value, :any
@doc "Default value to use when none was given in 'value' and none is available in the form data"
prop default, :any
@doc "Options passed to the underlying 'day' select"
prop hour, :keyword
@doc "Options passed to the underlying 'day' select"
prop minute, :keyword
@doc "Options passed to the underlying 'day' select"
prop second, :keyword
@doc """
Specify how the select can be build. It must be a function that receives a builder
that should be invoked with the select name and a set of options.
"""
prop builder, :fun
@doc "Options list"
prop opts, :keyword, default: []
def render(assigns) do
helper_opts =
assigns
|> props_to_opts([:value, :default, :hour, :minute, :second, :builder])
|> parse_css_class_for(:hour)
|> parse_css_class_for(:minute)
|> parse_css_class_for(:second)
opts =
assigns.opts
|> Keyword.merge(helper_opts)
assigns = assign(assigns, opts: opts)
~F"""
<InputContext assigns={assigns} :let={form: form, field: field}>
{time_select(form, field, @opts)}
</InputContext>
"""
end
end