Packages
surface
0.1.0-alpha.2
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.ex
defmodule Surface.Components.Form do
@moduledoc """
Defines a **form** that lets the user submit information.
Provides a wrapper for `Phoenix.HTML.Form.form_for/3`. Additionally,
adds the form instance that is returned by `form_for/3` into the context,
making it available to any child input.
All options passed via `opts` will be sent to `form_for/3`, `for`
and `action` can be set directly and will override anything in `opts`.
"""
use Surface.Component
import Phoenix.HTML.Form
alias Surface.Components.Raw
@doc "Atom or changeset to inform the form data"
property for, :any, required: true
@doc "URL to where the form is submitted"
property action, :string, default: "#"
@doc "Keyword list with options to be passed down to `form_for/3`"
property opts, :keyword, default: []
@doc "Triggered when the form is changed"
property change, :event
@doc "Triggered when the form is submitted"
property submit, :event
@doc "The content of the `<form>`"
slot default
@doc "The form instance initialized by the Form component"
context set form, :form
def init_context(assigns) do
opts =
assigns.opts ++
event_to_opts(assigns.change, :phx_change) ++
event_to_opts(assigns.submit, :phx_submit)
form = form_for(assigns.for, assigns.action, opts)
{:ok, form: form}
end
def render(assigns) do
~H"""
{{ @form }}
<slot/>
<#Raw></form></#Raw>
"""
end
end