2022-08-31 20:11:15 +12:00
|
|
|
defmodule AshHqWeb.Components.VersionPills do
|
2022-09-09 16:31:50 +12:00
|
|
|
@moduledoc "Renders pills for selected versions"
|
2022-08-31 20:11:15 +12:00
|
|
|
use Surface.LiveComponent
|
|
|
|
|
|
|
|
alias Surface.Components.Form
|
|
|
|
alias Surface.Components.Form.Select
|
|
|
|
|
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-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}
|
|
|
|
{#if @editable && can_be_added?(@selected_versions) && !@adding_version}
|
|
|
|
<button :on-click="add-version">
|
|
|
|
<Heroicons.Solid.PlusIcon class="h-4 w-4" />
|
|
|
|
</button>
|
|
|
|
{/if}
|
|
|
|
{#if @adding_version}
|
|
|
|
<Form for={:add_version} change={@add_version}>
|
|
|
|
<Select
|
2022-09-09 15:23:57 +12:00
|
|
|
class="rounded-lg text-primary-dark-900"
|
2022-08-31 20:11:15 +12:00
|
|
|
name={:library}
|
|
|
|
options={packages_to_add(@libraries, @selected_versions)}
|
|
|
|
/>
|
|
|
|
</Form>
|
|
|
|
{/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 packages_to_add(libraries, selected_versions) do
|
|
|
|
Enum.concat(
|
|
|
|
[{"", ""}],
|
|
|
|
libraries
|
|
|
|
|> Enum.filter(&(selected_versions[&1.id] in [nil, ""]))
|
|
|
|
|> Enum.map(&{&1.name, &1.id})
|
|
|
|
)
|
|
|
|
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
|