defmodule AshHqWeb.Components.VersionPills do @moduledoc "Renders pills for selected versions" use Surface.LiveComponent prop selected_versions, :map, default: %{} prop libraries, :list, default: [] prop add_version, :event prop remove_version, :event prop change_version, :event prop editable, :boolean, default: true prop toggle, :event data adding_version, :boolean, default: false def render(assigns) do ~F"""
{#for library <- @libraries} {#if @selected_versions[library.id] not in [nil, ""]}
{library.name}{#if selected_version(library, @selected_versions[library.id]) != "latest"} | {selected_version(library, @selected_versions[library.id])} {/if} {#if @editable} {/if}
{/if} {/for} {#if @editable && can_be_added?(@selected_versions)} {#if @toggle} {#else} {/if} {/if}
""" end def update(assigns, socket) do case assigns[:action] do :close_add_version -> {:ok, assign(socket, :adding_version, false)} _ -> {:ok, assign(socket, assigns)} end end defp can_be_added?(selected_versions) do Enum.any?(selected_versions, fn {_, val} -> val in [nil, ""] end) end defp selected_version(library, selected_version) do if selected_version == "latest" do "latest" else Enum.find(library.versions, &(&1.id == selected_version)).version end end def handle_event("add-version", _, socket) do {:noreply, assign(socket, :adding_version, true)} end end