defmodule Observer.Web.Components.MultiSelectList do
@moduledoc """
Multi select list box
References:
* https://www.creative-tim.com/twcomponents/component/multi-select
"""
use Phoenix.Component
alias Observer.Web.Components.Core
alias Observer.Web.Helpers
alias Phoenix.LiveView.JS
attr :id, :string, required: true
attr :selected_text, :string, required: true
attr :selected, :list, required: true
attr :unselected, :list, required: true
attr :show_options, :boolean, required: true
attr :form_search, :map, default: %{}
def content(assigns) do
elements_to_filter = Map.keys(assigns.form_search.params)
filtered_unselected =
Enum.map(assigns.unselected, fn %{name: name, keys: keys} = element ->
if name in elements_to_filter do
key_to_find = String.downcase(assigns.form_search.params[name])
filtered_keys =
Enum.filter(keys, &String.contains?(String.downcase(&1), key_to_find))
%{element | keys: filtered_keys}
else
element
end
end)
assigns =
assigns
|> assign(elements_to_filter: elements_to_filter)
|> assign(unselected: filtered_unselected)
~H"""
{@selected_text}
<%= for item <- @selected do %>
<%= for key <- item.keys do %>
<% end %>
<% end %>
<%= for item <- @unselected do %>
<.form
for={@form_search}
id={"multi-select-list-search-form-#{@id}-#{item.name}"}
phx-change="form-multi-select-list-update-search"
class="flex"
>
<%= if item[:info] do %>
{item.name}
{item.info}:
<% else %>
{item.name}:
<% end %>
<%= if item.name in @elements_to_filter do %>
<% end %>
<%= for key <- item.keys do %>
<% end %>
<% end %>
"""
end
def border_item_color("services"), do: "border-teal-300"
def border_item_color("modules"), do: "border-red-500"
def border_item_color("functions"), do: "border-blue-400"
def border_item_color("match_spec"), do: "border-yellow-400"
# coveralls-ignore-start
def border_item_color(_), do: "border-gray-300"
# coveralls-ignore-stop
def bg_item_color("services"), do: "bg-teal-50"
def bg_item_color("modules"), do: "bg-red-50"
def bg_item_color("functions"), do: "bg-blue-50"
def bg_item_color("match_spec"), do: "bg-yellow-50"
# coveralls-ignore-start
def bg_item_color(_), do: "bg-gray-50"
# coveralls-ignore-stop
def text_item_color("services"), do: "text-teal-700"
def text_item_color("modules"), do: "text-red-500"
def text_item_color("functions"), do: "text-blue-400"
def text_item_color("match_spec"), do: "text-yellow-700"
# coveralls-ignore-start
def text_item_color(_), do: "text-teal-700"
# coveralls-ignore-stop
end