defmodule LiveAdmin do
@moduledoc docout: [LiveAdmin.READMECompiler]
def route_with_params(assigns, parts \\ []) do
resource_path = parts[:resource_path] || assigns.key
encoded_params =
parts
|> Keyword.get(:params, %{})
|> Enum.into(%{})
|> then(fn params ->
if assigns[:prefix] do
Map.put_new(params, :prefix, assigns[:prefix])
else
params
end
end)
|> Enum.into(%{})
|> Enum.flat_map(fn
{_, nil} -> []
{:sort_attr, val} -> [{:"sort-attr", val}]
{:sort_dir, val} -> [{:"sort-dir", val}]
{:search, val} -> [{:s, val}]
pair -> [pair]
end)
|> Enum.into(%{})
|> case do
params when map_size(params) > 0 -> "?" <> Plug.Conn.Query.encode(params)
_ -> ""
end
Path.join(
[assigns.base_path, resource_path] ++
Enum.map(parts[:segments] || [], &Phoenix.Param.to_param/1)
) <>
encoded_params
end
def session_store,
do: Application.get_env(:live_admin, :session_store, __MODULE__.Session.Agent)
def associated_resource(schema, field_name, resources, part \\ nil) do
with %{related: assoc_schema} <-
schema |> parent_associations() |> Enum.find(&(&1.owner_key == field_name)),
config when not is_nil(config) <-
Enum.find(resources, fn {_, resource} ->
resource.__live_admin_config__(:schema) == assoc_schema
end) do
case part do
nil -> config
:key -> elem(config, 0)
:resource -> elem(config, 1)
end
else
_ -> nil
end
end
def parent_associations(schema) do
Enum.flat_map(schema.__schema__(:associations), fn assoc_name ->
case schema.__schema__(:association, assoc_name) do
assoc = %{relationship: :parent} -> [assoc]
_ -> []
end
end)
end
def resource_title(resource) do
:title_with
|> resource.__live_admin_config__()
|> case do
nil -> resource.__live_admin_config__(:schema) |> Module.split() |> Enum.at(-1)
{m, f, a} -> apply(m, f, a)
title when is_binary(title) -> title
end
end
def record_label(nil, _), do: nil
def record_label(record, resource) do
:label_with
|> resource.__live_admin_config__()
|> case do
{m, f, a} -> apply(m, f, [record | a])
label when is_atom(label) -> Map.fetch!(record, label)
end
end
def use_i18n?, do: gettext_backend() != LiveAdmin.Gettext
def trans(string, opts \\ []) do
args =
[gettext_backend(), string]
|> then(fn base_args ->
if opts[:inter], do: base_args ++ [opts[:inter]], else: base_args
end)
apply(Gettext, :gettext, args)
end
def gettext_backend, do: Application.get_env(:live_admin, :gettext_backend, LiveAdmin.Gettext)
def resources(router, base_path) do
router
|> Phoenix.Router.routes()
|> Enum.flat_map(fn
%{metadata: %{base_path: ^base_path, resource: resource}} -> [resource]
_ -> []
end)
end
end