use container table component instead
This commit is contained in:
		| @@ -6,7 +6,6 @@ defmodule CanneryWeb.ContainerLive.Index do | ||||
|   use CanneryWeb, :live_view | ||||
|   import CanneryWeb.Components.ContainerCard | ||||
|   alias Cannery.{Containers, Containers.Container, Repo} | ||||
|   alias CanneryWeb.{Components.TagCard, Endpoint} | ||||
|   alias Ecto.Changeset | ||||
|  | ||||
|   @impl true | ||||
| @@ -124,133 +123,9 @@ defmodule CanneryWeb.ContainerLive.Index do | ||||
|  | ||||
|   defp display_containers(%{assigns: %{search: search, current_user: current_user}} = socket) do | ||||
|     containers = | ||||
|       Containers.list_containers(search, current_user) |> Repo.preload([:tags, :ammo_groups]) | ||||
|       Containers.list_containers(search, current_user) | ||||
|       |> Repo.preload([:tags, :ammo_groups]) | ||||
|  | ||||
|     columns = | ||||
|       [ | ||||
|         %{label: gettext("Name"), key: :name, type: :string}, | ||||
|         %{label: gettext("Description"), key: :desc, type: :string}, | ||||
|         %{label: gettext("Location"), key: :location, type: :string}, | ||||
|         %{label: gettext("Type"), key: :type, type: :string}, | ||||
|         %{label: gettext("Packs"), key: :packs, type: :integer}, | ||||
|         %{label: gettext("Rounds"), key: :rounds, type: :string}, | ||||
|         %{label: gettext("Tags"), key: :tags, type: :tags}, | ||||
|         %{label: nil, key: :actions, sortable: false, type: :actions} | ||||
|       ] | ||||
|       |> Enum.filter(fn %{key: key, type: type} -> | ||||
|         # remove columns if all values match defaults | ||||
|         default_value = | ||||
|           case type do | ||||
|             :boolean -> false | ||||
|             _other_type -> nil | ||||
|           end | ||||
|  | ||||
|         containers | ||||
|         |> Enum.any?(fn container -> | ||||
|           type in [:tags, :actions] or not (container |> Map.get(key) == default_value) | ||||
|         end) | ||||
|       end) | ||||
|  | ||||
|     rows = | ||||
|       containers | ||||
|       |> Enum.map(fn container -> container |> get_row_data_for_container(columns) end) | ||||
|  | ||||
|     socket | ||||
|     |> assign( | ||||
|       containers: containers, | ||||
|       columns: columns, | ||||
|       rows: rows | ||||
|     ) | ||||
|     socket |> assign(:containers, containers) | ||||
|   end | ||||
|  | ||||
|   @spec get_row_data_for_container(Container.t(), [map()]) :: map() | ||||
|   defp get_row_data_for_container(container, columns) do | ||||
|     container = container |> Repo.preload([:ammo_groups, :tags]) | ||||
|  | ||||
|     columns | ||||
|     |> Map.new(fn %{key: key} -> {key, get_value_for_key(key, container)} end) | ||||
|   end | ||||
|  | ||||
|   @spec get_value_for_key(atom(), Container.t()) :: any() | ||||
|   defp get_value_for_key(:name, %{id: id, name: container_name}) do | ||||
|     assigns = %{id: id, container_name: container_name} | ||||
|  | ||||
|     {container_name, | ||||
|      ~H""" | ||||
|      <div class="flex flex-wrap justify-center items-center"> | ||||
|        <.link navigate={Routes.container_show_path(Endpoint, :show, @id)} class="link"> | ||||
|          <%= @container_name %> | ||||
|        </.link> | ||||
|      </div> | ||||
|      """} | ||||
|   end | ||||
|  | ||||
|   defp get_value_for_key(:packs, container) do | ||||
|     container |> Containers.get_container_ammo_group_count!() | ||||
|   end | ||||
|  | ||||
|   defp get_value_for_key(:rounds, container) do | ||||
|     container |> Containers.get_container_rounds!() | ||||
|   end | ||||
|  | ||||
|   defp get_value_for_key(:tags, container) do | ||||
|     assigns = %{container: container} | ||||
|  | ||||
|     {container.tags |> Enum.map(fn %{name: name} -> name end), | ||||
|      ~H""" | ||||
|      <div class="flex flex-wrap justify-center items-center"> | ||||
|        <%= unless @container.tags |> Enum.empty?() do %> | ||||
|          <%= for tag <- @container.tags do %> | ||||
|            <TagCard.simple_tag_card tag={tag} /> | ||||
|          <% end %> | ||||
|        <% end %> | ||||
|  | ||||
|        <div class="mx-4 my-2"> | ||||
|          <.link | ||||
|            patch={Routes.container_index_path(Endpoint, :edit_tags, @container)} | ||||
|            class="text-primary-600 link" | ||||
|          > | ||||
|            <i class="fa-fw fa-lg fas fa-tags"></i> | ||||
|          </.link> | ||||
|        </div> | ||||
|      </div> | ||||
|      """} | ||||
|   end | ||||
|  | ||||
|   defp get_value_for_key(:actions, container) do | ||||
|     assigns = %{container: container} | ||||
|  | ||||
|     ~H""" | ||||
|     <.link | ||||
|       patch={Routes.container_index_path(Endpoint, :edit, @container)} | ||||
|       class="text-primary-600 link" | ||||
|       data-qa={"edit-#{@container.id}"} | ||||
|     > | ||||
|       <i class="fa-fw fa-lg fas fa-edit"></i> | ||||
|     </.link> | ||||
|  | ||||
|     <.link | ||||
|       patch={Routes.container_index_path(Endpoint, :clone, @container)} | ||||
|       class="text-primary-600 link" | ||||
|       data-qa={"clone-#{@container.id}"} | ||||
|     > | ||||
|       <i class="fa-fw fa-lg fas fa-copy"></i> | ||||
|     </.link> | ||||
|  | ||||
|     <.link | ||||
|       href="#" | ||||
|       class="text-primary-600 link" | ||||
|       phx-click="delete" | ||||
|       phx-value-id={@container.id} | ||||
|       data-confirm={ | ||||
|         dgettext("prompts", "Are you sure you want to delete %{name}?", name: @container.name) | ||||
|       } | ||||
|       data-qa={"delete-#{@container.id}"} | ||||
|     > | ||||
|       <i class="fa-fw fa-lg fas fa-trash"></i> | ||||
|     </.link> | ||||
|     """ | ||||
|   end | ||||
|  | ||||
|   defp get_value_for_key(key, container), do: container |> Map.get(key) | ||||
| end | ||||
|   | ||||
| @@ -51,12 +51,55 @@ | ||||
|     <% else %> | ||||
|       <%= if @view_table do %> | ||||
|         <.live_component | ||||
|           module={CanneryWeb.Components.TableComponent} | ||||
|           module={CanneryWeb.Components.ContainerTableComponent} | ||||
|           id="containers_index_table" | ||||
|           action={@live_action} | ||||
|           columns={@columns} | ||||
|           rows={@rows} | ||||
|         /> | ||||
|           containers={@containers} | ||||
|           current_user={@current_user} | ||||
|         > | ||||
|           <:tag_actions :let={container}> | ||||
|             <div class="mx-4 my-2"> | ||||
|               <.link | ||||
|                 patch={Routes.container_index_path(Endpoint, :edit_tags, container)} | ||||
|                 class="text-primary-600 link" | ||||
|               > | ||||
|                 <i class="fa-fw fa-lg fas fa-tags"></i> | ||||
|               </.link> | ||||
|             </div> | ||||
|           </:tag_actions> | ||||
|           <:actions :let={container}> | ||||
|             <.link | ||||
|               patch={Routes.container_index_path(Endpoint, :edit, container)} | ||||
|               class="text-primary-600 link" | ||||
|               data-qa={"edit-#{container.id}"} | ||||
|             > | ||||
|               <i class="fa-fw fa-lg fas fa-edit"></i> | ||||
|             </.link> | ||||
|  | ||||
|             <.link | ||||
|               patch={Routes.container_index_path(Endpoint, :clone, container)} | ||||
|               class="text-primary-600 link" | ||||
|               data-qa={"clone-#{container.id}"} | ||||
|             > | ||||
|               <i class="fa-fw fa-lg fas fa-copy"></i> | ||||
|             </.link> | ||||
|  | ||||
|             <.link | ||||
|               href="#" | ||||
|               class="text-primary-600 link" | ||||
|               phx-click="delete" | ||||
|               phx-value-id={container.id} | ||||
|               data-confirm={ | ||||
|                 dgettext("prompts", "Are you sure you want to delete %{name}?", | ||||
|                   name: container.name | ||||
|                 ) | ||||
|               } | ||||
|               data-qa={"delete-#{container.id}"} | ||||
|             > | ||||
|               <i class="fa-fw fa-lg fas fa-trash"></i> | ||||
|             </.link> | ||||
|           </:actions> | ||||
|         </.live_component> | ||||
|       <% else %> | ||||
|         <%= for container <- @containers do %> | ||||
|           <.container_card container={container}> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user