Current section

Files

Jump to
corex lib components signature_pad connect.ex
Raw

lib/components/signature_pad/connect.ex

defmodule Corex.SignaturePad.Connect do
@moduledoc false
alias Corex.SignaturePad.Anatomy.{
ClearTrigger,
Control,
Guide,
HiddenInput,
Label,
Props,
Root,
Segment
}
defp data_attr(true), do: ""
defp data_attr(false), do: nil
defp data_attr(nil), do: nil
defp encode_paths(paths) when is_binary(paths), do: paths
defp encode_paths(paths) when is_list(paths), do: Corex.Json.encode!(paths)
defp encode_paths(_), do: nil
defp build_paths_attrs(controlled, paths) do
cond do
controlled && paths ->
%{"data-paths" => encode_paths(paths), "data-default-paths" => nil}
!controlled && paths ->
%{"data-paths" => nil, "data-default-paths" => encode_paths(paths)}
true ->
%{"data-paths" => nil, "data-default-paths" => nil}
end
end
@spec props(Props.t()) :: map()
def props(assigns) do
base_attrs = %{
"id" => assigns.id,
"data-controlled" => data_attr(assigns.controlled),
"data-drawing-fill" => assigns.drawing_fill,
"data-drawing-size" => Integer.to_string(assigns.drawing_size),
"data-drawing-simulate-pressure" => data_attr(assigns.drawing_simulate_pressure),
"data-dir" => assigns.dir,
"data-on-draw-end" => assigns.on_draw_end,
"data-on-draw-end-client" => assigns.on_draw_end_client
}
paths_attrs = build_paths_attrs(assigns.controlled, assigns.paths)
base_attrs
|> Map.merge(paths_attrs)
|> maybe_put_name(assigns.name)
|> maybe_put_drawing_option("data-drawing-smoothing", assigns.drawing_smoothing, &to_string/1)
|> maybe_put_drawing_option("data-drawing-easing", assigns.drawing_easing, & &1)
|> maybe_put_drawing_option("data-drawing-thinning", assigns.drawing_thinning, &to_string/1)
|> maybe_put_drawing_option(
"data-drawing-streamline",
assigns.drawing_streamline,
&to_string/1
)
end
defp maybe_put_drawing_option(attrs, _key, nil, _fun), do: attrs
defp maybe_put_drawing_option(attrs, key, value, fun) when value != nil,
do: Map.put(attrs, key, fun.(value))
defp maybe_put_name(attrs, nil), do: attrs
defp maybe_put_name(attrs, name), do: Map.put(attrs, "data-name", name)
@spec root(Root.t()) :: map()
def root(assigns) do
%{
"data-scope" => "signature-pad",
"data-part" => "root",
"dir" => assigns.dir,
"id" => "signature-pad:#{assigns.id}"
}
end
@spec label(Label.t()) :: map()
def label(assigns) do
%{
"data-scope" => "signature-pad",
"data-part" => "label",
"dir" => assigns.dir,
"id" => "signature-pad:#{assigns.id}:label"
}
end
@spec control(Control.t()) :: map()
def control(assigns) do
%{
"data-scope" => "signature-pad",
"data-part" => "control",
"dir" => assigns.dir,
"id" => "signature-pad:#{assigns.id}:control"
}
end
@spec segment(Segment.t()) :: map()
def segment(assigns) do
%{
"data-scope" => "signature-pad",
"data-part" => "segment",
"dir" => assigns.dir,
"id" => "signature-pad:#{assigns.id}:segment"
}
end
@spec guide(Guide.t()) :: map()
def guide(assigns) do
%{
"data-scope" => "signature-pad",
"data-part" => "guide",
"dir" => assigns.dir,
"id" => "signature-pad:#{assigns.id}:guide"
}
end
@spec clear_trigger(ClearTrigger.t()) :: map()
def clear_trigger(assigns) do
base = %{
"data-scope" => "signature-pad",
"data-part" => "clear-trigger",
"type" => "button",
"dir" => assigns.dir,
"id" => "signature-pad:#{assigns.id}:clear-trigger",
"aria-label" => assigns.aria_label || "Clear signature"
}
if assigns.has_paths do
base
else
Map.put(base, "hidden", "true")
end
end
@spec hidden_input(HiddenInput.t()) :: map()
def hidden_input(assigns) do
attrs = %{
"data-scope" => "signature-pad",
"data-part" => "hidden-input",
"type" => "hidden",
"dir" => assigns.dir,
"id" => "signature-pad:#{assigns.id}:hidden-input"
}
if assigns.name do
Map.put(attrs, "name", assigns.name)
else
attrs
end
end
end