defmodule AshAdmin.Components.TopNav do @moduledoc false use Surface.LiveComponent alias Surface.Components.LiveRedirect alias AshAdmin.Components.TopNav.{ActorSelect, DrawerDropdown, TenantForm, Dropdown} data(nav_collapsed, :boolean, default: true) data(open, :boolean, default: false) prop(api, :any, required: true) prop(resource, :any, required: true) prop(actor_resources, :any, required: true) prop(apis, :any, required: true) prop(tenant, :any, required: true) prop(clear_tenant, :event) prop(set_tenant, :event) prop(toggle_authorizing, :event, required: true) prop(toggle_actor_paused, :event, required: true) prop(clear_actor, :event, required: true) prop(authorizing, :boolean, required: true) prop(actor_paused, :boolean, required: true) prop(actor, :any, required: true) prop(actor_api, :any, required: true) prop(prefix, :any, required: true) def render(assigns) do ~F""" """ end defp dropdown_groups(prefix, current_resource, api) do for resource <- Ash.Api.resources(api) do %{ text: AshAdmin.Resource.name(resource), to: "#{prefix}?api=#{AshAdmin.Api.name(api)}&resource=#{AshAdmin.Resource.name(resource)}", active: resource == current_resource, group: AshAdmin.Resource.resource_group(resource) } end |> Enum.group_by(fn resource -> resource.group end) |> Enum.sort_by(fn {label, _items} -> label || "_____always_put_me_last" end) |> Keyword.values() end defp dropdown_group_labels(api) do AshAdmin.Api.resource_group_labels(api) end def handle_event("collapse_nav", _, socket) do {:noreply, assign(socket, :nav_collapsed, !socket.assigns.nav_collapsed)} end def handle_event("close", _, socket) do {:noreply, assign(socket, :open, false)} end def handle_event("toggle", _, socket) do {:noreply, assign(socket, :open, !socket.assigns.open)} end defp show_tenant_form?(apis) do Enum.any?(apis, fn api -> api |> Ash.Api.resources() |> Enum.any?(fn resource -> Ash.Resource.Info.multitenancy_strategy(resource) end) end) end end