defmodule AshAdmin.Components.TopNav.ActorSelect do @moduledoc false use Phoenix.Component import AshAdmin.Helpers attr :authorizing, :boolean, required: true attr :actor_paused, :boolean, required: true attr :actor, :any, required: true attr :actor_resources, :any, required: true attr :toggle_authorizing, :string, required: true attr :toggle_actor_paused, :string, required: true attr :clear_actor, :string, required: true attr :api, :any, required: true attr :actor_api, :any, required: true attr :prefix, :any, required: true def actor_select(assigns) do ~H"""
<.link :if={@actor} class="hover:text-blue-400 hover:underline" target={"#{@prefix}?api=#{AshAdmin.Api.name(@actor_api)}&resource=#{AshAdmin.Resource.name(@actor.__struct__)}&tab=show&primary_key=#{encode_primary_key(@actor)}"} > <%= user_display(@actor) %>
<%= render_actor_link(assigns, @actor_resources) %>
""" end defp render_actor_link(assigns, [{api, resource}]) do assigns = assign(assigns, api: api, resource: resource) ~H""" <.link navigate={"#{@prefix}?api=#{AshAdmin.Api.name(@api)}&resource=#{AshAdmin.Resource.name(@resource)}&action_type=read"}> Set <%= AshAdmin.Resource.name(@resource) %> """ end defp render_actor_link(assigns, apis_and_resources) do assigns = assign(assigns, apis_and_resources: apis_and_resources) ~H"""
<.link :for={{{api, resource}, i} <- Enum.with_index(@apis_and_resources)} navigate={"#{@prefix}?api=#{AshAdmin.Api.name(api)}&resource=#{AshAdmin.Resource.name(resource)}&action_type=read"} > Set <%= AshAdmin.Resource.name(resource) %> |
""" end defp user_display(actor) do name = AshAdmin.Resource.name(actor.__struct__) case Ash.Resource.Info.primary_key(actor.__struct__) do [field] -> "#{name}: #{Map.get(actor, field)}" fields -> Enum.map_join(fields, ", ", fn field -> "#{field}: #{Map.get(actor, field)}" end) end end end