Packages
surface
0.11.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/input.ex
defmodule Surface.Components.Form.Input do
@moduledoc false
alias Surface.Components.Context
defmacro __using__(_) do
quote do
use Surface.Component
use Surface.Components.Events
import unquote(__MODULE__)
alias Surface.Components.Form.Input.InputContext
@doc "An identifier for the form"
prop form, :form, from_context: {Surface.Components.Form, :form}
@doc "An identifier for the input"
prop field, :any, from_context: {Surface.Components.Form.Field, :field}
@doc "The id of the corresponding input field"
prop id, :string
@doc "The name of the corresponding input field"
prop name, :string
@doc "Value to pre-populated the input"
prop value, :string
@doc "Class or classes to apply to the input"
prop class, :css_class
@doc "Options list"
prop opts, :keyword, default: []
end
end
defmacro get_default_class() do
quote do
unquote(__MODULE__).get_default_class(__MODULE__)
end
end
def get_default_class(component) do
config = Surface.get_components_config()
config[component][:default_class] || config[__MODULE__][:default_class]
end
# TODO: deprecate this component in favor of `from_context` option
defmodule InputContext do
use Surface.Component
@doc "The assigns of the host component"
prop assigns, :map
@doc "The code containing the input control"
slot default, arg: %{form: :form, field: :any}
@impl Surface.BaseComponent
def transform(node) do
message = """
Component <InputContext> has been deprecated.
Use option `from_context` instead. Example:
prop form, :form, from_context: {Form, :form}
"""
Surface.IOHelper.warn(message, node.meta.caller, node.meta.file, node.meta.line)
node
end
def render(assigns) do
form = Context.get(assigns, Surface.Components.Form, :form)
field = Context.get(assigns, Surface.Components.Form.Field, :field)
~F"""
<#slot {@default, form: @assigns[:form] || form, field: @assigns[:field] || field}/>
"""
end
end
end