-
Notifications
You must be signed in to change notification settings - Fork 147
/
input.ex
64 lines (49 loc) · 1.49 KB
/
input.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
defmodule Surface.Components.Form.Input do
@moduledoc false
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
@doc "An identifier for the input"
prop field, :any
@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
defmodule InputContext do
use Surface.Component
@doc "The assigns of the host component"
prop assigns, :map
slot default, args: [:form, :field]
def render(assigns) do
~F"""
<Context
get={Surface.Components.Form, form: form}
get={Surface.Components.Form.Field, field: field}>
<#slot :args={form: @assigns[:form] || form, field: @assigns[:field] || field}/>
</Context>
"""
end
end
end