defmodule LiveAdmin do @moduledoc docout: [LiveAdmin.READMECompiler] defmodule InvalidResourceError do defexception message: "invalid resource", plug_status: 404 end def route_with_params(socket, segments, params \\ %{}) do params = Enum.flat_map(params, fn {:prefix, nil} -> [] pair -> [pair] end) path = segments |> List.wrap() |> Enum.map(&Phoenix.Param.to_param/1) |> Path.join() encoded_params = params |> Enum.into(%{}) |> Enum.empty?() |> case do true -> "" false -> "?" <> Plug.Conn.Query.encode(params) end socket.router.__live_admin_path__() |> Path.join(path) |> Kernel.<>(encoded_params) end def repo, do: Application.fetch_env!(:live_admin, :ecto_repo) def session_store, do: Application.get_env(:live_admin, :session_store, __MODULE__.Session.Agent) def get_resource!(%{resources: resources, key: key}), do: get_resource!(resources, key) def get_resource!(resources, key) when is_binary(key), do: Map.get(resources, key) || raise(InvalidResourceError) def get_resource!(resources, schema) when is_atom(schema), do: Enum.find(resources, &(&1.schema == schema)) || raise(InvalidResourceError) def associated_resource(schema, field_name, resources, elem \\ :resource) 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.schema == assoc_schema end) do elem(config, if(elem == :key, do: 0, else: 1)) 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 case get_config(resource, :title_with) do nil -> resource.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 case get_config(resource, :label_with, :id) do {m, f, a} -> apply(m, f, [record | a]) label when is_atom(label) -> Map.fetch!(record, label) end end def get_config(resource_or_config, key, default \\ nil) def get_config(%{config: config}, key, default), do: get_config(config, key, default) def get_config(config, key, default), do: Map.get(config, key, Application.get_env(:live_admin, key, default)) end