lib/live_admin/view.ex

defmodule LiveAdmin.View do
  use Phoenix.Component
  import Phoenix.HTML
  use PhoenixHTMLHelpers

  js_path = Path.join(__DIR__, "../../dist/js/app.js")
  css_path = Path.join(__DIR__, "../../dist/css/app.css")
  default_css_overrides_path = Path.join(__DIR__, "../../dist/css/default_overrides.css")

  @external_resource js_path
  @external_resource css_path
  @external_resource default_css_overrides_path

  @app_js File.read!(js_path)
  @app_css File.read!(css_path)
  @default_css_overrides File.read!(default_css_overrides_path)

  @env Mix.env()

  @supported_primitive_types [
    :string,
    :boolean,
    :date,
    :integer,
    :naive_datetime,
    :utc_datetime,
    :id,
    :binary_id,
    :float
  ]

  embed_templates("components/layout/*")

  def render("layout.html", assigns), do: layout(assigns)

  def render_js, do: "var ENV = \"#{@env}\";" <> @app_js

  def render_css(session) do
    Application.get_env(:live_admin, :css_overrides, @default_css_overrides)
    |> case do
      {m, f, a} -> @app_css <> apply(m, f, [session | a])
      override_css -> @app_css <> override_css
    end
  end

  def sort_param_name(field), do: :"#{field}_sort"
  def drop_param_name(field), do: :"#{field}_drop"

  def field_class(type) when type in @supported_primitive_types, do: to_string(type)
  def field_class(:map), do: "map"
  def field_class({:array, _}), do: "array"
  def field_class({_, Ecto.Embedded, _}), do: "embed"
  def field_class({_, Ecto.Enum, _}), do: "enum"
  def field_class(_), do: "other"

  def supported_type?(type) when type in @supported_primitive_types, do: true
  def supported_type?(:map), do: true
  def supported_type?({:array, _}), do: true
  def supported_type?({_, Ecto.Embedded, _}), do: true
  def supported_type?({_, Ecto.Enum, _}), do: true
  def supported_type?(_), do: false
end