forked from shibao/cannery
add used filtering to ammo type show page
This commit is contained in:
parent
2e0bb861f1
commit
36a0a1c6c8
@ -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
|
||||
|
||||
|
@ -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 """
|
||||
|
@ -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 %>
|
||||
|
@ -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
|
||||
|
@ -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">
|
||||
|
@ -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
|
||||
|
@ -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 ""
|
||||
|
@ -188,7 +188,7 @@ msgstr ""
|
||||
"%{multiplier}"
|
||||
|
||||
#, elixir-autogen, elixir-format
|
||||
#: lib/cannery/ammo.ex:442
|
||||
#: lib/cannery/ammo.ex:479
|
||||
msgid "Invalid multiplier"
|
||||
msgstr ""
|
||||
|
||||
|
@ -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
|
||||
|
@ -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 ""
|
||||
|
@ -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 ""
|
||||
|
@ -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 ""
|
||||
|
||||
|
@ -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
|
||||
|
@ -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 ""
|
||||
|
||||
|
@ -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 ""
|
||||
|
@ -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 ""
|
||||
|
||||
|
@ -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
|
||||
|
@ -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 ""
|
||||
|
@ -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 ""
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user