add used filtering to ammo type show page

This commit is contained in:
shibao 2022-11-07 00:25:34 -05:00
parent 2e0bb861f1
commit 36a0a1c6c8
21 changed files with 165 additions and 44 deletions

View File

@ -4,6 +4,7 @@
- Make ammo catalog page include ammo count
- Make ammo type show page a bit more compact
- Make ammo type show page include container names for each ammo
- Make ammo type show page filter used-up ammo
- Make container show page a bit more compact
- Forgot to add the logo as the favicon whoops

View File

@ -220,7 +220,15 @@ defmodule Cannery.Ammo do
"""
@spec list_ammo_groups_for_type(AmmoType.t(), User.t()) :: [AmmoGroup.t()]
def list_ammo_groups_for_type(%AmmoType{id: ammo_type_id, user_id: user_id}, %User{id: user_id}) do
@spec list_ammo_groups_for_type(AmmoType.t(), User.t(), include_empty :: boolean()) ::
[AmmoGroup.t()]
def list_ammo_groups_for_type(ammo_type, user, include_empty \\ false)
def list_ammo_groups_for_type(
%AmmoType{id: ammo_type_id, user_id: user_id},
%User{id: user_id},
_include_empty = true
) do
Repo.all(
from ag in AmmoGroup,
left_join: sg in assoc(ag, :shot_groups),
@ -231,6 +239,22 @@ defmodule Cannery.Ammo do
)
end
def list_ammo_groups_for_type(
%AmmoType{id: ammo_type_id, user_id: user_id},
%User{id: user_id},
_include_empty = false
) do
Repo.all(
from ag in AmmoGroup,
left_join: sg in assoc(ag, :shot_groups),
where: ag.ammo_type_id == ^ammo_type_id,
where: ag.user_id == ^user_id,
where: not (ag.count == 0),
preload: [shot_groups: sg],
order_by: ag.id
)
end
@doc """
Returns the count of ammo_groups for an ammo type.
@ -285,22 +309,27 @@ defmodule Cannery.Ammo do
"""
@spec list_ammo_groups(User.t()) :: [AmmoGroup.t()]
@spec list_ammo_groups(User.t(), include_empty :: boolean()) :: [AmmoGroup.t()]
def list_ammo_groups(%User{id: user_id}, include_empty \\ false) do
if include_empty do
def list_ammo_groups(user, include_empty \\ false)
def list_ammo_groups(%User{id: user_id}, _include_empty = true) do
Repo.all(
from ag in AmmoGroup,
left_join: sg in assoc(ag, :shot_groups),
where: ag.user_id == ^user_id,
preload: [shot_groups: sg],
order_by: ag.id
else
)
end
def list_ammo_groups(%User{id: user_id}, _include_empty = false) do
Repo.all(
from ag in AmmoGroup,
left_join: sg in assoc(ag, :shot_groups),
where: ag.user_id == ^user_id,
where: not (ag.count == 0),
preload: [shot_groups: sg],
order_by: ag.id
end
|> Repo.all()
)
end
@doc """

View File

@ -32,7 +32,7 @@ defmodule CanneryWeb.Components.AmmoGroupCard do
<div class="flex flex-col justify-center items-center">
<span class="rounded-lg title text-lg">
<%= gettext("Count:") %>
<%= @ammo_group.count %>
<%= if @ammo_group.count == 0, do: "Empty", else: @ammo_group.count %>
</span>
<%= if @ammo_group.notes do %>

View File

@ -9,22 +9,12 @@ defmodule CanneryWeb.AmmoTypeLive.Show do
alias CanneryWeb.Endpoint
@impl true
def mount(_params, _session, socket), do: {:ok, socket}
def mount(_params, _session, socket), do: {:ok, socket |> assign(show_used: false)}
@impl true
def handle_params(%{"id" => id}, _params, %{assigns: %{current_user: current_user}} = socket) do
ammo_type = Ammo.get_ammo_type!(id, current_user)
socket =
socket
|> assign(
page_title: page_title(socket.assigns.live_action),
ammo_type: ammo_type,
ammo_groups: ammo_type |> Ammo.list_ammo_groups_for_type(current_user),
avg_cost_per_round: ammo_type |> Ammo.get_average_cost_for_ammo_type!(current_user)
)
{:noreply, socket}
{:noreply, socket |> display_ammo_type(ammo_type)}
end
@impl true
@ -41,6 +31,34 @@ defmodule CanneryWeb.AmmoTypeLive.Show do
{:noreply, socket |> put_flash(:info, prompt) |> push_redirect(to: redirect_to)}
end
@impl true
def handle_event("toggle_show_used", _, %{assigns: %{show_used: show_used}} = socket) do
{:noreply, socket |> assign(:show_used, !show_used) |> display_ammo_type()}
end
defp display_ammo_type(
%{
assigns: %{
live_action: live_action,
current_user: current_user,
show_used: show_used
}
} = socket,
ammo_type
) do
socket
|> assign(
page_title: page_title(live_action),
ammo_type: ammo_type,
ammo_groups: ammo_type |> Ammo.list_ammo_groups_for_type(current_user, show_used),
avg_cost_per_round: ammo_type |> Ammo.get_average_cost_for_ammo_type!(current_user)
)
end
defp display_ammo_type(%{assigns: %{ammo_type: ammo_type}} = socket) do
socket |> display_ammo_type(ammo_type)
end
defp page_title(:show), do: gettext("Show Ammo type")
defp page_title(:edit), do: gettext("Edit Ammo type")
end

View File

@ -113,6 +113,14 @@
<hr class="hr" />
<div class="flex flex-col justify-center items-center">
<.toggle_button action="toggle_show_used" value={@show_used}>
<span class="title text-lg text-primary-600">
<%= gettext("Show used") %>
</span>
</.toggle_button>
</div>
<div>
<%= if @ammo_groups |> Enum.empty?() do %>
<h2 class="mx-8 my-4 title text-lg text-primary-600">

View File

@ -5,6 +5,7 @@ defmodule CanneryWeb.ViewHelpers do
:view`
"""
import Phoenix.LiveView
import Phoenix.LiveView.Helpers
@id_length 16
@ -65,4 +66,43 @@ defmodule CanneryWeb.ViewHelpers do
if(Application.get_env(:cannery, CanneryWeb.ViewHelpers)[:shibao_mode], do: "q_q", else: "😔")
def display_emoji(other_emoji), do: other_emoji
@doc """
A toggle button element that can be directed to a liveview or a
live_component's `handle_event/3`.
## Examples
<.toggle_button action="my_liveview_action" value={@some_value}>
<span>Toggle me!</span>
</.toggle_button>
<.toggle_button action="my_live_component_action" target={@myself} value={@some_value}>
<span>Whatever you want</span>
</.toggle_button>
"""
def toggle_button(assigns) do
assigns = assigns |> assign_new(:id, fn -> assigns.action end)
~H"""
<label for={@id} class="inline-flex relative items-center cursor-pointer">
<input
type="checkbox"
value={@value}
checked={@value}
id={@id}
class="sr-only peer"
{
if assigns |> Map.has_key?(:target),
do: %{"phx-click" => @action, "phx-value-value" => @value, "phx-target" => @target},
else: %{"phx-click" => @action, "phx-value-value" => @value}
}
/>
<div class="w-11 h-6 bg-gray-200 rounded-full peer dark:bg-gray-700 peer-focus:ring-4 peer-focus:ring-teal-300 dark:peer-focus:ring-teal-800 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-1 after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-teal-600">
</div>
<span class="ml-3 text-sm font-medium text-gray-900 dark:text-gray-300">
<%= render_slot(@inner_block) %>
</span>
</label>
"""
end
end

View File

@ -178,7 +178,7 @@ msgstr "Munitionsgruppe bearbeiten"
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/index.ex:23
#: lib/cannery_web/live/ammo_type_live/show.ex:45
#: lib/cannery_web/live/ammo_type_live/show.ex:63
msgid "Edit Ammo type"
msgstr "Munitionstyp bearbeiten"
@ -322,7 +322,7 @@ msgid "No Ammo Types"
msgstr "Keine Munitionsarten"
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/show.html.heex:119
#: lib/cannery_web/live/ammo_type_live/show.html.heex:127
msgid "No ammo for this type"
msgstr "Keine Munition dieser Art"
@ -416,7 +416,7 @@ msgid "Settings"
msgstr "Einstellungen"
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/show.ex:44
#: lib/cannery_web/live/ammo_type_live/show.ex:62
msgid "Show Ammo type"
msgstr "Zeige Munitionsarten"
@ -945,3 +945,8 @@ msgstr "Summe aller Patronen"
#: lib/cannery_web/components/ammo_group_card.ex:61
msgid "Container:"
msgstr "Behälter"
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/show.html.heex:119
msgid "Show used"
msgstr ""

View File

@ -188,7 +188,7 @@ msgstr ""
"%{multiplier}"
#, elixir-autogen, elixir-format
#: lib/cannery/ammo.ex:442
#: lib/cannery/ammo.ex:479
msgid "Invalid multiplier"
msgstr ""

View File

@ -33,7 +33,7 @@ msgstr "%{name} erfolgreich erstellt"
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/index.ex:41
#: lib/cannery_web/live/ammo_type_live/show.ex:38
#: lib/cannery_web/live/ammo_type_live/show.ex:28
#: lib/cannery_web/live/invite_live/index.ex:53
#: lib/cannery_web/live/invite_live/index.ex:133
#: lib/cannery_web/live/tag_live/index.ex:38

View File

@ -163,7 +163,7 @@ msgstr ""
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/index.ex:23
#: lib/cannery_web/live/ammo_type_live/show.ex:45
#: lib/cannery_web/live/ammo_type_live/show.ex:63
msgid "Edit Ammo type"
msgstr ""
@ -307,7 +307,7 @@ msgid "No Ammo Types"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/show.html.heex:119
#: lib/cannery_web/live/ammo_type_live/show.html.heex:127
msgid "No ammo for this type"
msgstr ""
@ -399,7 +399,7 @@ msgid "Settings"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/show.ex:44
#: lib/cannery_web/live/ammo_type_live/show.ex:62
msgid "Show Ammo type"
msgstr ""
@ -928,3 +928,8 @@ msgstr ""
#: lib/cannery_web/components/ammo_group_card.ex:61
msgid "Container:"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/show.html.heex:119
msgid "Show used"
msgstr ""

View File

@ -164,7 +164,7 @@ msgstr ""
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/index.ex:23
#: lib/cannery_web/live/ammo_type_live/show.ex:45
#: lib/cannery_web/live/ammo_type_live/show.ex:63
msgid "Edit Ammo type"
msgstr ""
@ -308,7 +308,7 @@ msgid "No Ammo Types"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/show.html.heex:119
#: lib/cannery_web/live/ammo_type_live/show.html.heex:127
msgid "No ammo for this type"
msgstr ""
@ -400,7 +400,7 @@ msgid "Settings"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/show.ex:44
#: lib/cannery_web/live/ammo_type_live/show.ex:62
msgid "Show Ammo type"
msgstr ""
@ -929,3 +929,8 @@ msgstr ""
#: lib/cannery_web/components/ammo_group_card.ex:61
msgid "Container:"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/show.html.heex:119
msgid "Show used"
msgstr ""

View File

@ -171,7 +171,7 @@ msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}
msgstr ""
#, elixir-autogen, elixir-format
#: lib/cannery/ammo.ex:442
#: lib/cannery/ammo.ex:479
msgid "Invalid multiplier"
msgstr ""

View File

@ -21,7 +21,7 @@ msgstr ""
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/index.ex:41
#: lib/cannery_web/live/ammo_type_live/show.ex:38
#: lib/cannery_web/live/ammo_type_live/show.ex:28
#: lib/cannery_web/live/invite_live/index.ex:53
#: lib/cannery_web/live/invite_live/index.ex:133
#: lib/cannery_web/live/tag_live/index.ex:38

View File

@ -170,7 +170,7 @@ msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}
msgstr ""
#, elixir-autogen, elixir-format
#: lib/cannery/ammo.ex:442
#: lib/cannery/ammo.ex:479
msgid "Invalid multiplier"
msgstr ""

View File

@ -178,7 +178,7 @@ msgstr ""
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/index.ex:23
#: lib/cannery_web/live/ammo_type_live/show.ex:45
#: lib/cannery_web/live/ammo_type_live/show.ex:63
msgid "Edit Ammo type"
msgstr ""
@ -322,7 +322,7 @@ msgid "No Ammo Types"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/show.html.heex:119
#: lib/cannery_web/live/ammo_type_live/show.html.heex:127
msgid "No ammo for this type"
msgstr ""
@ -414,7 +414,7 @@ msgid "Settings"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/show.ex:44
#: lib/cannery_web/live/ammo_type_live/show.ex:62
msgid "Show Ammo type"
msgstr ""
@ -943,3 +943,8 @@ msgstr ""
#: lib/cannery_web/components/ammo_group_card.ex:61
msgid "Container:"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/show.html.heex:119
msgid "Show used"
msgstr ""

View File

@ -186,7 +186,7 @@ msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}
msgstr ""
#, elixir-autogen, elixir-format
#: lib/cannery/ammo.ex:442
#: lib/cannery/ammo.ex:479
msgid "Invalid multiplier"
msgstr ""

View File

@ -33,7 +33,7 @@ msgstr "%{name} creado exitosamente"
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/index.ex:41
#: lib/cannery_web/live/ammo_type_live/show.ex:38
#: lib/cannery_web/live/ammo_type_live/show.ex:28
#: lib/cannery_web/live/invite_live/index.ex:53
#: lib/cannery_web/live/invite_live/index.ex:133
#: lib/cannery_web/live/tag_live/index.ex:38

View File

@ -178,7 +178,7 @@ msgstr "Éditer le groupe de munition"
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/index.ex:23
#: lib/cannery_web/live/ammo_type_live/show.ex:45
#: lib/cannery_web/live/ammo_type_live/show.ex:63
msgid "Edit Ammo type"
msgstr "Éditer le type de munition"
@ -322,7 +322,7 @@ msgid "No Ammo Types"
msgstr "Aucun type de munition"
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/show.html.heex:119
#: lib/cannery_web/live/ammo_type_live/show.html.heex:127
msgid "No ammo for this type"
msgstr "Aucune munition pour ce type"
@ -416,7 +416,7 @@ msgid "Settings"
msgstr "Paramètres"
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/show.ex:44
#: lib/cannery_web/live/ammo_type_live/show.ex:62
msgid "Show Ammo type"
msgstr "Montrer le type de munition"
@ -947,3 +947,8 @@ msgstr "Quantité de cartouches"
#: lib/cannery_web/components/ammo_group_card.ex:61
msgid "Container:"
msgstr "Conteneur"
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/show.html.heex:119
msgid "Show used"
msgstr ""

View File

@ -187,7 +187,7 @@ msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}
msgstr "Nombre de copies invalide, doit être 1 et %{max}. Été %{multiplier}"
#, elixir-autogen, elixir-format
#: lib/cannery/ammo.ex:442
#: lib/cannery/ammo.ex:479
msgid "Invalid multiplier"
msgstr ""

View File

@ -33,7 +33,7 @@ msgstr "%{name} créé· avec succès"
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/index.ex:41
#: lib/cannery_web/live/ammo_type_live/show.ex:38
#: lib/cannery_web/live/ammo_type_live/show.ex:28
#: lib/cannery_web/live/invite_live/index.ex:53
#: lib/cannery_web/live/invite_live/index.ex:133
#: lib/cannery_web/live/tag_live/index.ex:38

View File

@ -20,7 +20,7 @@ msgstr ""
#, elixir-autogen, elixir-format
#: lib/cannery_web/live/ammo_type_live/index.ex:41
#: lib/cannery_web/live/ammo_type_live/show.ex:38
#: lib/cannery_web/live/ammo_type_live/show.ex:28
#: lib/cannery_web/live/invite_live/index.ex:53
#: lib/cannery_web/live/invite_live/index.ex:133
#: lib/cannery_web/live/tag_live/index.ex:38