Packages
surface
0.7.0
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/directive/events.ex
defmodule Surface.Directive.Events do
use Surface.Directive
@events [
"click",
"click-away",
"capture-click",
"blur",
"focus",
"change",
"submit",
"keydown",
"keyup",
"window-focus",
"window-blur",
"window-keydown",
"window-keyup"
]
@phx_events Enum.map(@events, &"phx-#{&1}")
def phx_events(), do: @phx_events
def extract({":on-" <> event_name, value, attr_meta}, meta)
when event_name in @events do
name = String.to_atom(event_name)
%AST.Directive{
module: __MODULE__,
name: name,
value: to_quoted_expr(name, value, meta),
meta: Helpers.to_meta(attr_meta, meta)
}
end
def extract(_, _), do: []
def process(
%AST.Directive{
name: event_name,
value: %AST.AttributeExpr{value: value} = expr,
meta: meta
},
%type{attributes: attributes} = node
)
when type in [AST.Tag, AST.VoidTag] do
value =
quote generated: true do
[{unquote("phx-#{event_name}"), {:event, unquote(value)}}]
end
%{
node
| attributes: [
%AST.DynamicAttribute{name: event_name, meta: meta, expr: %{expr | value: value}}
| attributes
]
}
end
defp to_quoted_expr(_name, [], meta) do
AST.AttributeExpr.new(nil, "", meta)
end
defp to_quoted_expr(name, value, meta) when is_list(value) do
to_quoted_expr(name, to_string(value), meta)
end
defp to_quoted_expr(name, event, meta) when is_binary(event) or is_bitstring(event) do
quoted = Surface.TypeHandler.expr_to_quoted!(Macro.to_string(event), name, :event, meta)
AST.AttributeExpr.new(quoted, event, meta)
end
defp to_quoted_expr(name, {:attribute_expr, original, expr_meta}, meta) do
expr_meta = Helpers.to_meta(expr_meta, meta)
quoted = Surface.TypeHandler.expr_to_quoted!(original, name, :event, expr_meta)
expr = AST.AttributeExpr.new(quoted, original, expr_meta)
# We force the value to be avaluated at runtime
%Surface.AST.AttributeExpr{expr | constant?: false}
end
end