defmodule AshAdmin.Components.TopNav.Dropdown do
@moduledoc false
use Surface.LiveComponent
alias Surface.Components.LiveRedirect
prop(name, :string, required: true)
prop(groups, :list, required: true)
prop(group_labels, :keyword, required: false)
prop(active, :boolean, required: true)
prop(class, :css_class)
data(open, :boolean, default: false)
def render(assigns) do
~F"""
{#if @open}
{#for group <- @groups}
<.group_label item={hd(group)} group_labels={@group_labels} />
{#for link <- group}
{link.text}
{/for}
{/for}
{/if}
"""
end
defp group_label(assigns) do
assigns = Map.put(assigns, :label_text, group_label_text(assigns))
~F"""
{#if @label_text}
{@label_text}
{/if}
"""
end
# No labels specified for the whole dropdown
defp group_label_text(assigns) when not is_map_key(assigns, :group_labels), do: nil
defp group_label_text(%{group_labels: []}), do: nil
# No label specified for this dropdown group
defp group_label_text(%{item: item}) when not is_map_key(item, :group), do: nil
# Maybe a label to display!
defp group_label_text(assigns), do: Keyword.get(assigns.group_labels, assigns.item.group)
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 single_active_group?([[%{active: true}]]), do: true
defp single_active_group?(_), do: false
end