Packages
corex
0.1.0-rc.0
0.1.2
0.1.1
0.1.0
0.1.0-rc.1
0.1.0-rc.0
0.1.0-beta.5
0.1.0-beta.4
0.1.0-beta.3
0.1.0-beta.2
0.1.0-beta.1
0.1.0-alpha.33
0.1.0-alpha.32
0.1.0-alpha.31
0.1.0-alpha.30
0.1.0-alpha.29
0.1.0-alpha.28
0.1.0-alpha.27
0.1.0-alpha.26
0.1.0-alpha.25
0.1.0-alpha.24
0.1.0-alpha.23
0.1.0-alpha.22
0.1.0-alpha.21
0.1.0-alpha.20
0.1.0-alpha.19
0.1.0-alpha.18
0.1.0-alpha.17
0.1.0-alpha.16
0.1.0-alpha.15
0.1.0-alpha.14
0.1.0-alpha.13
0.1.0-alpha.12
0.1.0-alpha.11
0.1.0-alpha.10
0.1.0-alpha.9
0.1.0-alpha.8
0.1.0-alpha.7
0.1.0-alpha.6
0.1.0-alpha.5
0.1.0-alpha.4
0.1.0-alpha.3
0.1.0-alpha.2
0.1.0-alpha.1
Accessible and unstyled UI components library written in Elixir and TypeScript that integrates Zag.js state machines into the Phoenix Framework.
Current section
Files
Jump to
Current section
Files
lib/components/file_upload/connect.ex
defmodule Corex.FileUpload.Connect do
@moduledoc false
import Corex.Helpers, only: [get_boolean: 1]
alias Corex.Selectors
alias Corex.FormField
alias Corex.FileUpload.Anatomy.{
Dropzone,
HiddenInput,
InputSentinel,
ItemGroup,
Label,
Props,
Root,
Trigger
}
alias Phoenix.LiveView.JS
defp zid(id), do: "file:#{id}"
defp maybe_put_int(map, _key, nil), do: map
defp maybe_put_int(map, key, value) when is_integer(value) do
Map.put(map, key, Integer.to_string(value))
end
defp maybe_put_int(map, _key, _value), do: map
@spec props(Props.t()) :: map()
def props(assigns) do
%{
"id" => assigns.id,
"data-disabled" => get_boolean(assigns.disabled),
"data-invalid" => get_boolean(assigns.invalid),
"data-readonly" => get_boolean(assigns.read_only),
"data-required" => get_boolean(assigns.required),
"data-name" => assigns.name,
"data-form" => assigns.form,
"data-dir" => Map.get(assigns, :dir),
"data-max-files" => Integer.to_string(assigns.max_files),
"data-allow-drop" => if(assigns.allow_drop, do: "true", else: "false"),
"data-prevent-document-drop" =>
if(assigns.prevent_document_drop, do: "true", else: "false"),
"data-accept" => assigns.accept,
"data-directory" => get_boolean(assigns.directory),
"data-on-file-change" => assigns.on_file_change,
"data-on-file-change-client" => assigns.on_file_change_client,
"data-on-file-accept" => assigns.on_file_accept,
"data-on-file-accept-client" => assigns.on_file_accept_client,
"data-on-file-reject" => assigns.on_file_reject,
"data-on-file-reject-client" => assigns.on_file_reject_client,
"data-translation-dropzone" => assigns.dropzone
}
|> maybe_put_int("data-max-file-size", assigns.max_file_size)
|> maybe_put_int("data-min-file-size", assigns.min_file_size)
|> Map.reject(fn {_k, v} -> is_nil(v) end)
|> FormField.put_form_field_attrs(assigns)
end
def ignore_root(assigns) do
JS.ignore_attributes(Root.ignored_attrs(), to: Selectors.css_id(zid(assigns.id)))
end
def ignore_label(assigns) do
JS.ignore_attributes(Label.ignored_attrs(), to: Selectors.css_id("#{zid(assigns.id)}:label"))
end
def ignore_dropzone(assigns) do
JS.ignore_attributes(Dropzone.ignored_attrs(),
to: Selectors.css_id("#{zid(assigns.id)}:dropzone")
)
end
def ignore_hidden_input(assigns) do
JS.ignore_attributes(HiddenInput.ignored_attrs(),
to: Selectors.css_id("#{zid(assigns.id)}:input")
)
end
def ignore_input_sentinel(assigns) do
JS.ignore_attributes(InputSentinel.ignored_attrs(),
to: Selectors.css_id("#{zid(assigns.id)}:sentinel")
)
end
def ignore_trigger(assigns) do
JS.ignore_attributes(Trigger.ignored_attrs(),
to: Selectors.css_id("#{zid(assigns.id)}:trigger")
)
end
def ignore_item_group(assigns) do
JS.ignore_attributes(ItemGroup.ignored_attrs(),
to: Selectors.css_id("#{zid(assigns.id)}:item-group:#{assigns.type}")
)
end
@spec root(Root.t()) :: map()
def root(assigns) do
%{
"data-scope" => "file-upload",
"data-part" => "root",
"dir" => Map.get(assigns, :dir),
"id" => zid(assigns.id),
"data-readonly" => get_boolean(Map.get(assigns, :read_only, false))
}
end
@spec label(Label.t()) :: map()
def label(assigns) do
%{
"data-scope" => "file-upload",
"data-part" => "label",
"dir" => Map.get(assigns, :dir),
"id" => "#{zid(assigns.id)}:label",
"for" => "#{zid(assigns.id)}:input"
}
end
@spec dropzone(Dropzone.t()) :: map()
def dropzone(assigns) do
%{
"data-scope" => "file-upload",
"data-part" => "dropzone",
"id" => "#{zid(assigns.id)}:dropzone"
}
end
@spec hidden_input(HiddenInput.t()) :: map()
def hidden_input(assigns) do
base = %{
"data-scope" => "file-upload",
"data-part" => "hidden-input",
"type" => "file",
"id" => "#{zid(assigns.id)}:input",
"disabled" => get_boolean(assigns.disabled),
"name" => assigns.name,
"form" => assigns.form
}
Map.reject(base, fn {_k, v} -> is_nil(v) end)
end
@spec input_sentinel(InputSentinel.t()) :: map()
def input_sentinel(assigns) do
base = %{
"type" => "hidden",
"name" => assigns.name,
"form" => assigns.form,
"value" => "",
"id" => "#{zid(assigns.id)}:sentinel",
"data-scope" => "file-upload",
"data-part" => "hidden-input-sentinel",
"data-corex-file-upload-sentinel" => ""
}
Map.reject(base, fn {_k, v} -> is_nil(v) end)
end
@spec trigger(Trigger.t()) :: map()
def trigger(assigns) do
%{
"data-scope" => "file-upload",
"data-part" => "trigger",
"dir" => Map.get(assigns, :dir),
"type" => "button",
"id" => "#{zid(assigns.id)}:trigger"
}
end
@spec item_group(ItemGroup.t()) :: map()
def item_group(assigns) do
%{
"data-scope" => "file-upload",
"data-part" => "item-group",
"data-file-type" => assigns.type,
"data-type" => assigns.type,
"id" => "#{zid(assigns.id)}:item-group:#{assigns.type}",
"dir" => Map.get(assigns, :dir),
"data-disabled" => get_boolean(Map.get(assigns, :disabled, false))
}
|> Map.reject(fn {_k, v} -> is_nil(v) end)
end
end