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 %>
{"#{item.name}:#{key}"}
<% 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