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