ash_hq/lib/ash_hq_web/components/version_pills.ex

71 lines
2.3 KiB
Elixir
Raw Normal View History

2022-08-31 20:11:15 +12:00
defmodule AshHqWeb.Components.VersionPills do
@moduledoc "Renders pills for selected versions"
2022-08-31 20:11:15 +12:00
use Surface.LiveComponent
2022-09-13 11:36:28 +12:00
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
2022-09-28 16:18:05 +13:00
prop toggle, :event
2022-08-31 20:11:15 +12:00
2022-09-13 11:36:28 +12:00
data adding_version, :boolean, default: false
2022-08-31 20:11:15 +12:00
def render(assigns) do
~F"""
<div class="flex flex-row flex-wrap align-center items-center ml-2 justify-star gap-2 flex-grow">
{#for library <- @libraries}
2022-09-13 11:36:28 +12:00
{#if @selected_versions[library.id] not in [nil, ""]}
2022-09-08 15:02:18 +12:00
<div class="flex flex-row flex-wrap contents-center px-2 py-1 bg-primary-light-500 dark:bg-primary-light-400 hover:bg-primary-light-600 text-black text-xs font-medium rounded-full">
2022-09-13 11:36:28 +12:00
{library.name}{#if selected_version(library, @selected_versions[library.id]) != "latest"}
| {selected_version(library, @selected_versions[library.id])}
2022-08-31 20:11:15 +12:00
{/if}
{#if @editable}
<button :on-click={@remove_version} phx-value-library={library.id}><Heroicons.Outline.XIcon class="h-3 w-3 ml-1" /></button>
{/if}
</div>
{/if}
{/for}
2022-09-28 16:18:05 +13:00
{#if @editable && can_be_added?(@selected_versions)}
{#if @toggle}
<button :on-click={@toggle}>
<Heroicons.Solid.PlusIcon class="h-4 w-4" />
</button>
{#else}
<button phx-click={AshHqWeb.AppViewLive.toggle_catalogue()}>
<Heroicons.Solid.PlusIcon class="h-4 w-4" />
</button>
{/if}
2022-08-31 20:11:15 +12:00
{/if}
</div>
"""
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