Current section

Files

Jump to
ex_admin_runtime lib ex_admin navigation.ex
Raw

lib/ex_admin/navigation.ex

defmodule ExAdmin.Navigation do
@moduledoc false
require Logger
import ExAdmin.Utils
import ExAdmin.Theme.Helpers
use Xain
def nav_view(conn, opts \\ []) do
registered = ExAdmin.get_all_registered
|> Enum.map(fn({_, resource}) -> resource end)
|> Enum.filter(fn(%{menu: menu}) -> menu[:none] != true end)
|> Enum.filter(fn(%{menu: menu} = defn) ->
case menu[:if] do
nil -> true
fun when is_function(fun, 2) -> fun.(conn, defn)
fun -> fun.(conn)
end
end)
|> Enum.filter(fn(defn) -> ExAdmin.Utils.authorized_action?(conn, :index, defn) end)
|> Enum.sort(fn(%{menu: menu1}, %{menu: menu2}) ->
menu1[:priority] < menu2[:priority]
end)
for resource <- registered do
nav_link(conn, resource, opts)
end
end
def nav_link(conn, %{controller: controller, type: :page, page_name: page_name} = registered, opts) do
controller_name = controller_name(controller)
menu = Map.get registered, :menu, %{}
path = Map.get menu, :url, admin_path(:page, [String.downcase(page_name)])
name = Map.get menu, :label, (controller_name |> titleize |> Inflex.pluralize)
theme_module(conn, Layout).link_to_active conn,
name, path, (Inflex.parameterize(controller_name, "_") |> Inflex.pluralize), opts
end
def nav_link(conn, %{controller: controller, resource_model: resource_model} = registered, opts) do
controller_name = controller_name(controller)
path = admin_resource_path(resource_model, :index)
menu = Map.get registered, :menu, %{}
name = Map.get menu, :label, (controller_name |> titleize |> Inflex.pluralize)
theme_module(conn, Layout).link_to_active conn,
name, path, (Inflex.parameterize(controller_name, "_") |> Inflex.pluralize), opts
end
def get_registered_resources do
[UcxCallout.Contact, UcxCallout.Categories]
end
def link_active?(conn, path) do
path = strip_path path
conn.path_info
|> Enum.join("/")
|> String.match?(~r/^#{path}/)
end
def strip_path(path) do
String.replace(path, ~r/(^http:\/\/)|(^\/)/, "")
end
end