diff --git a/CHANGELOG.md b/CHANGELOG.md index 8651bcd..2a1ea4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # v0.5.5 - Update translations +- Display used-up date on used-up ammo - Make ammo index page a bit more compact - Make ammo index page filter used-up ammo - Make ammo catalog page include ammo count diff --git a/lib/cannery/ammo.ex b/lib/cannery/ammo.ex index 8ad8485..36e44f3 100644 --- a/lib/cannery/ammo.ex +++ b/lib/cannery/ammo.ex @@ -227,7 +227,7 @@ defmodule Cannery.Ammo do def list_ammo_groups_for_type( %AmmoType{id: ammo_type_id, user_id: user_id}, %User{id: user_id}, - _include_empty = true + true = _include_empty ) do Repo.all( from ag in AmmoGroup, @@ -242,7 +242,7 @@ defmodule Cannery.Ammo do def list_ammo_groups_for_type( %AmmoType{id: ammo_type_id, user_id: user_id}, %User{id: user_id}, - _include_empty = false + false = _include_empty ) do Repo.all( from ag in AmmoGroup, @@ -272,7 +272,7 @@ defmodule Cannery.Ammo do def list_ammo_groups_for_container( %Container{id: container_id, user_id: user_id}, %User{id: user_id}, - _include_empty = true + true = _include_empty ) do Repo.all( from ag in AmmoGroup, @@ -287,7 +287,7 @@ defmodule Cannery.Ammo do def list_ammo_groups_for_container( %Container{id: container_id, user_id: user_id}, %User{id: user_id}, - _include_empty = false + false = _include_empty ) do Repo.all( from ag in AmmoGroup, @@ -317,7 +317,7 @@ defmodule Cannery.Ammo do def get_ammo_groups_count_for_type( %AmmoType{id: ammo_type_id, user_id: user_id}, %User{id: user_id}, - _include_empty = true + true = _include_empty ) do Repo.one!( from ag in AmmoGroup, @@ -331,7 +331,7 @@ defmodule Cannery.Ammo do def get_ammo_groups_count_for_type( %AmmoType{id: ammo_type_id, user_id: user_id}, %User{id: user_id}, - _include_empty = false + false = _include_empty ) do Repo.one!( from ag in AmmoGroup, @@ -356,7 +356,7 @@ defmodule Cannery.Ammo do @spec list_ammo_groups(User.t(), include_empty :: boolean()) :: [AmmoGroup.t()] def list_ammo_groups(user, include_empty \\ false) - def list_ammo_groups(%User{id: user_id}, _include_empty = true) do + def list_ammo_groups(%User{id: user_id}, true = _include_empty) do Repo.all( from ag in AmmoGroup, left_join: sg in assoc(ag, :shot_groups), @@ -366,7 +366,7 @@ defmodule Cannery.Ammo do ) end - def list_ammo_groups(%User{id: user_id}, _include_empty = false) do + def list_ammo_groups(%User{id: user_id}, false = _include_empty) do Repo.all( from ag in AmmoGroup, left_join: sg in assoc(ag, :shot_groups), @@ -435,6 +435,17 @@ defmodule Cannery.Ammo do |> Enum.sum() end + @doc """ + Returns the last entered shot group for an ammo group + """ + @spec get_last_used_shot_group(AmmoGroup.t()) :: ShotGroup.t() | nil + def get_last_used_shot_group(%AmmoGroup{} = ammo_group) do + ammo_group + |> Repo.preload(:shot_groups) + |> Map.fetch!(:shot_groups) + |> Enum.max_by(fn %{date: date} -> date end, Date, fn -> nil end) + end + @doc """ Calculates the percentage remaining of an ammo group out of 100 """ diff --git a/lib/cannery_web/components/ammo_group_card.ex b/lib/cannery_web/components/ammo_group_card.ex index 596c9cf..e20842d 100644 --- a/lib/cannery_web/components/ammo_group_card.ex +++ b/lib/cannery_web/components/ammo_group_card.ex @@ -4,7 +4,7 @@ defmodule CanneryWeb.Components.AmmoGroupCard do """ use CanneryWeb, :component - alias Cannery.Repo + alias Cannery.{Ammo, Repo} alias CanneryWeb.Endpoint def ammo_group_card(%{ammo_group: ammo_group} = assigns) do @@ -47,6 +47,13 @@ defmodule CanneryWeb.Components.AmmoGroupCard do <%= @ammo_group.inserted_at |> display_datetime() %> + <%= if @ammo_group.count == 0 do %> + + <%= gettext("Used up on:") %> + <%= @ammo_group |> Ammo.get_last_used_shot_group() |> Map.get(:date) |> display_date() %> + + <% end %> + <%= if @ammo_group.price_paid do %> <%= gettext("Price paid:") %> diff --git a/lib/cannery_web/components/table_component.ex b/lib/cannery_web/components/table_component.ex index 7b4de9b..94c8a35 100644 --- a/lib/cannery_web/components/table_component.ex +++ b/lib/cannery_web/components/table_component.ex @@ -6,7 +6,7 @@ defmodule CanneryWeb.Components.TableComponent do - `:columns`: An array of maps containing the following keys - `:label`: A gettext'd or otherwise user-facing string label for the column. Can be nil - - `:key`: A string key used for sorting + - `:key`: An atom key used for sorting - `:class`: Extra classes to be applied to the column element, if desired. Optional - `:sortable`: If false, will prevent the user from sorting with it. @@ -28,13 +28,13 @@ defmodule CanneryWeb.Components.TableComponent do required(:columns) => list(%{ required(:label) => String.t() | nil, - required(:key) => String.t() | nil, + required(:key) => atom() | nil, optional(:class) => String.t(), optional(:sortable) => false }), required(:rows) => list(%{ - (key :: String.t()) => any() | {custom_sort_value :: String.t(), value :: any()} + (key :: atom()) => any() | {custom_sort_value :: String.t(), value :: any()} }), optional(any()) => any() }, @@ -56,20 +56,19 @@ defmodule CanneryWeb.Components.TableComponent do def handle_event( "sort_by", %{"sort-key" => key}, - %{assigns: %{rows: rows, last_sort_key: key, sort_mode: sort_mode}} = socket + %{assigns: %{rows: rows, last_sort_key: last_sort_key, sort_mode: sort_mode}} = socket ) do - sort_mode = if sort_mode == :asc, do: :desc, else: :asc - rows = rows |> sort_by_custom_sort_value_or_value(key, sort_mode) - {:noreply, socket |> assign(sort_mode: sort_mode, rows: rows)} - end + key = key |> String.to_existing_atom() - def handle_event( - "sort_by", - %{"sort-key" => key}, - %{assigns: %{rows: rows}} = socket - ) do - rows = rows |> sort_by_custom_sort_value_or_value(key, :asc) - {:noreply, socket |> assign(last_sort_key: key, sort_mode: :asc, rows: rows)} + sort_mode = + case {key, sort_mode} do + {^last_sort_key, :asc} -> :desc + {^last_sort_key, :desc} -> :asc + {_new_sort_key, _last_sort_mode} -> :asc + end + + rows = rows |> sort_by_custom_sort_value_or_value(key, sort_mode) + {:noreply, socket |> assign(last_sort_key: key, sort_mode: sort_mode, rows: rows)} end defp sort_by_custom_sort_value_or_value(rows, key, sort_mode) do diff --git a/lib/cannery_web/components/table_component.html.heex b/lib/cannery_web/components/table_component.html.heex index dadf158..a0f68e3 100644 --- a/lib/cannery_web/components/table_component.html.heex +++ b/lib/cannery_web/components/table_component.html.heex @@ -1,4 +1,4 @@ -
+
diff --git a/lib/cannery_web/live/ammo_group_live/index.ex b/lib/cannery_web/live/ammo_group_live/index.ex index 3e3a312..48292f3 100644 --- a/lib/cannery_web/live/ammo_group_live/index.ex +++ b/lib/cannery_web/live/ammo_group_live/index.ex @@ -73,7 +73,7 @@ defmodule CanneryWeb.AmmoGroupLive.Index do end @impl true - def handle_event("toggle_show_used", _, %{assigns: %{show_used: show_used}} = socket) do + def handle_event("toggle_show_used", _params, %{assigns: %{show_used: show_used}} = socket) do {:noreply, socket |> assign(:show_used, !show_used) |> display_ammo_groups()} end @@ -87,16 +87,24 @@ defmodule CanneryWeb.AmmoGroupLive.Index do containers_count = Containers.get_containers_count!(current_user) columns = [ - %{label: gettext("Ammo type"), key: "ammo_type"}, - %{label: gettext("Count"), key: "count"}, - %{label: gettext("Price paid"), key: "price_paid"}, - %{label: gettext("% left"), key: "remaining"}, - %{label: gettext("Range"), key: "range"}, - %{label: gettext("Container"), key: "container"}, - %{label: gettext("Added on"), key: "added_on"}, - %{label: nil, key: "actions", sortable: false} + %{label: gettext("Ammo type"), key: :ammo_type}, + %{label: gettext("Count"), key: :count}, + %{label: gettext("Price paid"), key: :price_paid}, + %{label: gettext("% left"), key: :remaining}, + %{label: gettext("Range"), key: :range}, + %{label: gettext("Container"), key: :container}, + %{label: gettext("Added on"), key: :added_on} ] + columns = + if show_used do + columns ++ [%{label: gettext("Used up on"), key: :used_up_on}] + else + columns + end + + columns = columns ++ [%{label: nil, key: :actions, sortable: false}] + rows = ammo_groups |> Enum.map(fn ammo_group -> ammo_group |> get_row_data_for_ammo_group(columns) end) @@ -119,8 +127,8 @@ defmodule CanneryWeb.AmmoGroupLive.Index do |> Enum.into(%{}, fn %{key: key} -> {key, get_value_for_key(key, ammo_group)} end) end - @spec get_value_for_key(String.t(), AmmoGroup.t()) :: any() - defp get_value_for_key("ammo_type", %{ammo_type: ammo_type}) do + @spec get_value_for_key(atom(), AmmoGroup.t()) :: any() + defp get_value_for_key(:ammo_type, %{ammo_type: ammo_type}) do {ammo_type.name, live_patch(ammo_type.name, to: Routes.ammo_type_show_path(Endpoint, :show, ammo_type), @@ -128,12 +136,12 @@ defmodule CanneryWeb.AmmoGroupLive.Index do )} end - defp get_value_for_key("price_paid", %{price_paid: nil}), do: {"a", nil} + defp get_value_for_key(:price_paid, %{price_paid: nil}), do: {"a", nil} - defp get_value_for_key("price_paid", %{price_paid: price_paid}), + defp get_value_for_key(:price_paid, %{price_paid: price_paid}), do: gettext("$%{amount}", amount: price_paid |> :erlang.float_to_binary(decimals: 2)) - defp get_value_for_key("added_on", %{inserted_at: inserted_at}) do + defp get_value_for_key(:added_on, %{inserted_at: inserted_at}) do assigns = %{inserted_at: inserted_at} {inserted_at, @@ -142,7 +150,22 @@ defmodule CanneryWeb.AmmoGroupLive.Index do """} end - defp get_value_for_key("range", %{staged: staged} = ammo_group) do + defp get_value_for_key(:used_up_on, ammo_group) do + last_shot_group_date = + case ammo_group |> Ammo.get_last_used_shot_group() do + %{date: last_shot_group_date} -> last_shot_group_date + _no_shot_groups -> nil + end + + assigns = %{last_shot_group_date: last_shot_group_date} + + {last_shot_group_date, + ~H""" + <%= @last_shot_group_date |> display_date() %> + """} + end + + defp get_value_for_key(:range, %{staged: staged} = ammo_group) do assigns = %{ammo_group: ammo_group} {staged, @@ -165,10 +188,10 @@ defmodule CanneryWeb.AmmoGroupLive.Index do """} end - defp get_value_for_key("remaining", ammo_group), + defp get_value_for_key(:remaining, ammo_group), do: "#{ammo_group |> Ammo.get_percentage_remaining()}%" - defp get_value_for_key("actions", ammo_group) do + defp get_value_for_key(:actions, ammo_group) do assigns = %{ammo_group: ammo_group} ~H""" @@ -199,9 +222,9 @@ defmodule CanneryWeb.AmmoGroupLive.Index do """ end - defp get_value_for_key("container", %{container: nil}), do: {nil, nil} + defp get_value_for_key(:container, %{container: nil}), do: {nil, nil} - defp get_value_for_key("container", %{container: %{name: container_name}} = ammo_group) do + defp get_value_for_key(:container, %{container: %{name: container_name}} = ammo_group) do assigns = %{ammo_group: ammo_group} {container_name, @@ -222,6 +245,5 @@ defmodule CanneryWeb.AmmoGroupLive.Index do """} end - defp get_value_for_key(key, ammo_group), - do: ammo_group |> Map.get(key |> String.to_existing_atom()) + defp get_value_for_key(key, ammo_group), do: ammo_group |> Map.get(key) end diff --git a/lib/cannery_web/live/ammo_group_live/show.ex b/lib/cannery_web/live/ammo_group_live/show.ex index 6c8a777..2d4f30d 100644 --- a/lib/cannery_web/live/ammo_group_live/show.ex +++ b/lib/cannery_web/live/ammo_group_live/show.ex @@ -84,10 +84,10 @@ defmodule CanneryWeb.AmmoGroupLive.Show do ammo_group = ammo_group |> Repo.preload([:container, :ammo_type, :shot_groups], force: true) columns = [ - %{label: gettext("Rounds shot"), key: "count"}, - %{label: gettext("Notes"), key: "notes"}, - %{label: gettext("Date"), key: "date"}, - %{label: nil, key: "actions", sortable: false} + %{label: gettext("Rounds shot"), key: :count}, + %{label: gettext("Notes"), key: :notes}, + %{label: gettext("Date"), key: :date}, + %{label: nil, key: :actions, sortable: false} ] rows = @@ -110,10 +110,10 @@ defmodule CanneryWeb.AmmoGroupLive.Show do |> Enum.into(%{}, fn %{key: key} -> value = case key do - "date" -> + :date -> {date, date |> display_date()} - "actions" -> + :actions -> ~H"""
<%= live_patch to: Routes.ammo_group_show_path(Endpoint, :edit_shot_group, @ammo_group, shot_group), @@ -136,7 +136,7 @@ defmodule CanneryWeb.AmmoGroupLive.Show do """ key -> - shot_group |> Map.get(key |> String.to_existing_atom()) + shot_group |> Map.get(key) end {key, value} diff --git a/lib/cannery_web/live/ammo_type_live/index.ex b/lib/cannery_web/live/ammo_type_live/index.ex index 1597a95..1da49b9 100644 --- a/lib/cannery_web/live/ammo_type_live/index.ex +++ b/lib/cannery_web/live/ammo_type_live/index.ex @@ -48,29 +48,29 @@ defmodule CanneryWeb.AmmoTypeLive.Index do columns = [ - %{label: gettext("Name"), key: "name", type: :name}, - %{label: gettext("Bullet type"), key: "bullet_type", type: :string}, - %{label: gettext("Bullet core"), key: "bullet_core", type: :string}, - %{label: gettext("Cartridge"), key: "cartridge", type: :string}, - %{label: gettext("Caliber"), key: "caliber", type: :string}, - %{label: gettext("Case material"), key: "case_material", type: :string}, - %{label: gettext("Jacket type"), key: "jacket_type", type: :string}, - %{label: gettext("Muzzle velocity"), key: "muzzle_velocity", type: :string}, - %{label: gettext("Powder type"), key: "powder_type", type: :string}, + %{label: gettext("Name"), key: :name, type: :name}, + %{label: gettext("Bullet type"), key: :bullet_type, type: :string}, + %{label: gettext("Bullet core"), key: :bullet_core, type: :string}, + %{label: gettext("Cartridge"), key: :cartridge, type: :string}, + %{label: gettext("Caliber"), key: :caliber, type: :string}, + %{label: gettext("Case material"), key: :case_material, type: :string}, + %{label: gettext("Jacket type"), key: :jacket_type, type: :string}, + %{label: gettext("Muzzle velocity"), key: :muzzle_velocity, type: :string}, + %{label: gettext("Powder type"), key: :powder_type, type: :string}, %{ label: gettext("Powder grains per charge"), - key: "powder_grains_per_charge", + key: :powder_grains_per_charge, type: :string }, - %{label: gettext("Grains"), key: "grains", type: :string}, - %{label: gettext("Pressure"), key: "pressure", type: :string}, - %{label: gettext("Primer type"), key: "primer_type", type: :string}, - %{label: gettext("Firing type"), key: "firing_type", type: :string}, - %{label: gettext("Tracer"), key: "tracer", type: :boolean}, - %{label: gettext("Incendiary"), key: "incendiary", type: :boolean}, - %{label: gettext("Blank"), key: "blank", type: :boolean}, - %{label: gettext("Corrosive"), key: "corrosive", type: :boolean}, - %{label: gettext("Manufacturer"), key: "manufacturer", type: :string}, + %{label: gettext("Grains"), key: :grains, type: :string}, + %{label: gettext("Pressure"), key: :pressure, type: :string}, + %{label: gettext("Primer type"), key: :primer_type, type: :string}, + %{label: gettext("Firing type"), key: :firing_type, type: :string}, + %{label: gettext("Tracer"), key: :tracer, type: :boolean}, + %{label: gettext("Incendiary"), key: :incendiary, type: :boolean}, + %{label: gettext("Blank"), key: :blank, type: :boolean}, + %{label: gettext("Corrosive"), key: :corrosive, type: :boolean}, + %{label: gettext("Manufacturer"), key: :manufacturer, type: :string}, %{label: gettext("UPC"), key: "upc", type: :string} ] |> Enum.filter(fn %{key: key, type: type} -> @@ -79,13 +79,13 @@ defmodule CanneryWeb.AmmoTypeLive.Index do ammo_types |> Enum.any?(fn ammo_type -> - not (ammo_type |> Map.get(key |> String.to_existing_atom()) == default_value) + not (ammo_type |> Map.get(key) == default_value) end) end) |> Kernel.++([ - %{label: gettext("Total # of rounds"), key: "round_count", type: :round_count}, - %{label: gettext("Total # of ammo"), key: "ammo_count", type: :ammo_count}, - %{label: gettext("Average Price paid"), key: "avg_price_paid", type: :avg_price_paid}, + %{label: gettext("Total # of rounds"), key: :round_count, type: :round_count}, + %{label: gettext("Total # of ammo"), key: :ammo_count, type: :ammo_count}, + %{label: gettext("Average Price paid"), key: :avg_price_paid, type: :avg_price_paid}, %{label: nil, key: "actions", type: :actions, sortable: false} ]) @@ -104,7 +104,7 @@ defmodule CanneryWeb.AmmoTypeLive.Index do end defp get_ammo_type_value(:boolean, key, ammo_type, _current_user), - do: ammo_type |> Map.get(key |> String.to_existing_atom()) |> humanize() + do: ammo_type |> Map.get(key) |> humanize() defp get_ammo_type_value(:round_count, _key, ammo_type, current_user), do: ammo_type |> Ammo.get_round_count_for_ammo_type(current_user) @@ -164,6 +164,5 @@ defmodule CanneryWeb.AmmoTypeLive.Index do defp get_ammo_type_value(nil, _key, _ammo_type, _current_user), do: nil - defp get_ammo_type_value(_other, key, ammo_type, _current_user), - do: ammo_type |> Map.get(key |> String.to_existing_atom()) + defp get_ammo_type_value(_other, key, ammo_type, _current_user), do: ammo_type |> Map.get(key) end diff --git a/lib/cannery_web/live/ammo_type_live/show.ex b/lib/cannery_web/live/ammo_type_live/show.ex index 54ff6ed..31d28c8 100644 --- a/lib/cannery_web/live/ammo_type_live/show.ex +++ b/lib/cannery_web/live/ammo_type_live/show.ex @@ -32,7 +32,7 @@ defmodule CanneryWeb.AmmoTypeLive.Show do end @impl true - def handle_event("toggle_show_used", _, %{assigns: %{show_used: show_used}} = socket) do + def handle_event("toggle_show_used", _params, %{assigns: %{show_used: show_used}} = socket) do {:noreply, socket |> assign(:show_used, !show_used) |> display_ammo_type()} end diff --git a/lib/cannery_web/live/container_live/show.ex b/lib/cannery_web/live/container_live/show.ex index 5bde711..933ee5f 100644 --- a/lib/cannery_web/live/container_live/show.ex +++ b/lib/cannery_web/live/container_live/show.ex @@ -5,7 +5,7 @@ defmodule CanneryWeb.ContainerLive.Show do use CanneryWeb, :live_view import CanneryWeb.Components.{AmmoGroupCard, TagCard} - alias Cannery.{Ammo, Accounts.User, Containers, Containers.Container, Repo, Tags} + alias Cannery.{Accounts.User, Ammo, Containers, Containers.Container, Repo, Tags} alias CanneryWeb.Endpoint alias Ecto.Changeset alias Phoenix.LiveView.Socket @@ -83,7 +83,7 @@ defmodule CanneryWeb.ContainerLive.Show do end @impl true - def handle_event("toggle_show_used", _, %{assigns: %{show_used: show_used}} = socket) do + def handle_event("toggle_show_used", _params, %{assigns: %{show_used: show_used}} = socket) do {:noreply, socket |> assign(:show_used, !show_used) |> render_container()} end diff --git a/lib/cannery_web/live/range_live/index.ex b/lib/cannery_web/live/range_live/index.ex index f9cda6f..28d25e7 100644 --- a/lib/cannery_web/live/range_live/index.ex +++ b/lib/cannery_web/live/range_live/index.ex @@ -77,11 +77,11 @@ defmodule CanneryWeb.RangeLive.Index do ammo_groups = Ammo.list_staged_ammo_groups(current_user) columns = [ - %{label: gettext("Ammo"), key: "name"}, - %{label: gettext("Rounds shot"), key: "count"}, - %{label: gettext("Notes"), key: "notes"}, - %{label: gettext("Date"), key: "date"}, - %{label: nil, key: "actions", sortable: false} + %{label: gettext("Ammo"), key: :name}, + %{label: gettext("Rounds shot"), key: :count}, + %{label: gettext("Notes"), key: :notes}, + %{label: gettext("Date"), key: :date}, + %{label: nil, key: :actions, sortable: false} ] rows = @@ -101,17 +101,17 @@ defmodule CanneryWeb.RangeLive.Index do |> Enum.into(%{}, fn %{key: key} -> value = case key do - "name" -> + :name -> {shot_group.ammo_group.ammo_type.name, live_patch(shot_group.ammo_group.ammo_type.name, to: Routes.ammo_group_show_path(Endpoint, :show, shot_group.ammo_group), class: "link" )} - "date" -> + :date -> date |> display_date() - "actions" -> + :actions -> ~H"""
<%= live_patch to: Routes.range_index_path(Endpoint, :edit, shot_group), @@ -134,7 +134,7 @@ defmodule CanneryWeb.RangeLive.Index do """ key -> - shot_group |> Map.get(key |> String.to_existing_atom()) + shot_group |> Map.get(key) end {key, value} diff --git a/priv/gettext/actions.pot b/priv/gettext/actions.pot index 0fd0428..3ec8492 100644 --- a/priv/gettext/actions.pot +++ b/priv/gettext/actions.pot @@ -156,7 +156,7 @@ msgid "Why not get some ready to shoot?" msgstr "" #, elixir-autogen, elixir-format -#: lib/cannery_web/live/ammo_group_live/index.ex:160 +#: lib/cannery_web/live/ammo_group_live/index.ex:183 #: lib/cannery_web/live/ammo_group_live/show.html.heex:91 #: lib/cannery_web/live/range_live/index.html.heex:36 msgid "Record shots" diff --git a/priv/gettext/de/LC_MESSAGES/actions.po b/priv/gettext/de/LC_MESSAGES/actions.po index f7add7f..e992b71 100644 --- a/priv/gettext/de/LC_MESSAGES/actions.po +++ b/priv/gettext/de/LC_MESSAGES/actions.po @@ -169,7 +169,7 @@ msgid "Why not get some ready to shoot?" msgstr "Warum nicht einige für den Schießstand auswählen?" #, elixir-autogen, elixir-format -#: lib/cannery_web/live/ammo_group_live/index.ex:160 +#: lib/cannery_web/live/ammo_group_live/index.ex:183 #: lib/cannery_web/live/ammo_group_live/show.html.heex:91 #: lib/cannery_web/live/range_live/index.html.heex:36 msgid "Record shots" diff --git a/priv/gettext/de/LC_MESSAGES/default.po b/priv/gettext/de/LC_MESSAGES/default.po index 7b97cf9..5b9e108 100644 --- a/priv/gettext/de/LC_MESSAGES/default.po +++ b/priv/gettext/de/LC_MESSAGES/default.po @@ -376,7 +376,7 @@ msgid "Price paid" msgstr "Kaufpreis" #, elixir-autogen, elixir-format -#: lib/cannery_web/components/ammo_group_card.ex:52 +#: lib/cannery_web/components/ammo_group_card.ex:59 msgid "Price paid:" msgstr "Kaufpreis:" @@ -601,7 +601,7 @@ msgstr "Munitionsgruppe verschieben" #, elixir-autogen, elixir-format #: lib/cannery_web/components/move_ammo_group_component.ex:80 -#: lib/cannery_web/live/ammo_group_live/index.ex:217 +#: lib/cannery_web/live/ammo_group_live/index.ex:240 msgid "Move ammo" msgstr "Munition verschieben" @@ -616,8 +616,8 @@ msgid "Shot log" msgstr "Schießkladde" #, elixir-autogen, elixir-format -#: lib/cannery_web/components/ammo_group_card.ex:53 -#: lib/cannery_web/live/ammo_group_live/index.ex:134 +#: lib/cannery_web/components/ammo_group_card.ex:60 +#: lib/cannery_web/live/ammo_group_live/index.ex:142 #: lib/cannery_web/live/ammo_group_live/show.html.heex:37 #: lib/cannery_web/live/ammo_group_live/show.html.heex:44 #: lib/cannery_web/live/ammo_type_live/index.ex:118 @@ -682,12 +682,12 @@ msgid "New password" msgstr "Neues Passwort" #, elixir-autogen, elixir-format -#: lib/cannery_web/live/ammo_group_live/index.ex:157 +#: lib/cannery_web/live/ammo_group_live/index.ex:180 msgid "Stage" msgstr "Markiert" #, elixir-autogen, elixir-format -#: lib/cannery_web/live/ammo_group_live/index.ex:157 +#: lib/cannery_web/live/ammo_group_live/index.ex:180 msgid "Unstage" msgstr "Demarkiert" @@ -942,7 +942,7 @@ msgid "Total # of ammo" msgstr "Summe aller Patronen" #, elixir-autogen, elixir-format, fuzzy -#: lib/cannery_web/components/ammo_group_card.ex:61 +#: lib/cannery_web/components/ammo_group_card.ex:68 msgid "Container:" msgstr "Behälter" @@ -952,3 +952,13 @@ msgstr "Behälter" #: lib/cannery_web/live/container_live/show.html.heex:90 msgid "Show used" msgstr "" + +#, elixir-autogen, elixir-format +#: lib/cannery_web/live/ammo_group_live/index.ex:101 +msgid "Used up on" +msgstr "" + +#, elixir-autogen, elixir-format +#: lib/cannery_web/components/ammo_group_card.ex:52 +msgid "Used up on:" +msgstr "" diff --git a/priv/gettext/de/LC_MESSAGES/errors.po b/priv/gettext/de/LC_MESSAGES/errors.po index 86902ab..6074f90 100644 --- a/priv/gettext/de/LC_MESSAGES/errors.po +++ b/priv/gettext/de/LC_MESSAGES/errors.po @@ -188,7 +188,7 @@ msgstr "" "%{multiplier}" #, elixir-autogen, elixir-format -#: lib/cannery/ammo.ex:524 +#: lib/cannery/ammo.ex:535 msgid "Invalid multiplier" msgstr "" diff --git a/priv/gettext/de/LC_MESSAGES/prompts.po b/priv/gettext/de/LC_MESSAGES/prompts.po index 4a27b94..8242ef3 100644 --- a/priv/gettext/de/LC_MESSAGES/prompts.po +++ b/priv/gettext/de/LC_MESSAGES/prompts.po @@ -100,7 +100,7 @@ msgid "Are you sure you want to delete the invite for %{name}?" msgstr "Sind Sie sicher, dass sie die Einladung für %{name} löschen möchten?" #, elixir-autogen, elixir-format -#: lib/cannery_web/live/ammo_group_live/index.ex:193 +#: lib/cannery_web/live/ammo_group_live/index.ex:216 #: lib/cannery_web/live/ammo_group_live/show.html.heex:71 msgid "Are you sure you want to delete this ammo?" msgstr "Sind Sie sicher, dass sie diese Munition löschen möchten?" diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index 03192a5..725e549 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -361,7 +361,7 @@ msgid "Price paid" msgstr "" #, elixir-autogen, elixir-format -#: lib/cannery_web/components/ammo_group_card.ex:52 +#: lib/cannery_web/components/ammo_group_card.ex:59 msgid "Price paid:" msgstr "" @@ -584,7 +584,7 @@ msgstr "" #, elixir-autogen, elixir-format #: lib/cannery_web/components/move_ammo_group_component.ex:80 -#: lib/cannery_web/live/ammo_group_live/index.ex:217 +#: lib/cannery_web/live/ammo_group_live/index.ex:240 msgid "Move ammo" msgstr "" @@ -599,8 +599,8 @@ msgid "Shot log" msgstr "" #, elixir-autogen, elixir-format -#: lib/cannery_web/components/ammo_group_card.ex:53 -#: lib/cannery_web/live/ammo_group_live/index.ex:134 +#: lib/cannery_web/components/ammo_group_card.ex:60 +#: lib/cannery_web/live/ammo_group_live/index.ex:142 #: lib/cannery_web/live/ammo_group_live/show.html.heex:37 #: lib/cannery_web/live/ammo_group_live/show.html.heex:44 #: lib/cannery_web/live/ammo_type_live/index.ex:118 @@ -665,12 +665,12 @@ msgid "New password" msgstr "" #, elixir-autogen, elixir-format -#: lib/cannery_web/live/ammo_group_live/index.ex:157 +#: lib/cannery_web/live/ammo_group_live/index.ex:180 msgid "Stage" msgstr "" #, elixir-autogen, elixir-format -#: lib/cannery_web/live/ammo_group_live/index.ex:157 +#: lib/cannery_web/live/ammo_group_live/index.ex:180 msgid "Unstage" msgstr "" @@ -925,7 +925,7 @@ msgid "Total # of ammo" msgstr "" #, elixir-autogen, elixir-format -#: lib/cannery_web/components/ammo_group_card.ex:61 +#: lib/cannery_web/components/ammo_group_card.ex:68 msgid "Container:" msgstr "" @@ -935,3 +935,13 @@ msgstr "" #: lib/cannery_web/live/container_live/show.html.heex:90 msgid "Show used" msgstr "" + +#, elixir-autogen, elixir-format +#: lib/cannery_web/live/ammo_group_live/index.ex:101 +msgid "Used up on" +msgstr "" + +#, elixir-autogen, elixir-format +#: lib/cannery_web/components/ammo_group_card.ex:52 +msgid "Used up on:" +msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/actions.po b/priv/gettext/en/LC_MESSAGES/actions.po index 182ca5d..c16327c 100644 --- a/priv/gettext/en/LC_MESSAGES/actions.po +++ b/priv/gettext/en/LC_MESSAGES/actions.po @@ -157,7 +157,7 @@ msgid "Why not get some ready to shoot?" msgstr "" #, elixir-autogen, elixir-format -#: lib/cannery_web/live/ammo_group_live/index.ex:160 +#: lib/cannery_web/live/ammo_group_live/index.ex:183 #: lib/cannery_web/live/ammo_group_live/show.html.heex:91 #: lib/cannery_web/live/range_live/index.html.heex:36 msgid "Record shots" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index d201414..6c33cbb 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -362,7 +362,7 @@ msgid "Price paid" msgstr "" #, elixir-autogen, elixir-format -#: lib/cannery_web/components/ammo_group_card.ex:52 +#: lib/cannery_web/components/ammo_group_card.ex:59 msgid "Price paid:" msgstr "" @@ -585,7 +585,7 @@ msgstr "" #, elixir-autogen, elixir-format #: lib/cannery_web/components/move_ammo_group_component.ex:80 -#: lib/cannery_web/live/ammo_group_live/index.ex:217 +#: lib/cannery_web/live/ammo_group_live/index.ex:240 msgid "Move ammo" msgstr "" @@ -600,8 +600,8 @@ msgid "Shot log" msgstr "" #, elixir-autogen, elixir-format -#: lib/cannery_web/components/ammo_group_card.ex:53 -#: lib/cannery_web/live/ammo_group_live/index.ex:134 +#: lib/cannery_web/components/ammo_group_card.ex:60 +#: lib/cannery_web/live/ammo_group_live/index.ex:142 #: lib/cannery_web/live/ammo_group_live/show.html.heex:37 #: lib/cannery_web/live/ammo_group_live/show.html.heex:44 #: lib/cannery_web/live/ammo_type_live/index.ex:118 @@ -666,12 +666,12 @@ msgid "New password" msgstr "" #, elixir-autogen, elixir-format -#: lib/cannery_web/live/ammo_group_live/index.ex:157 +#: lib/cannery_web/live/ammo_group_live/index.ex:180 msgid "Stage" msgstr "" #, elixir-autogen, elixir-format -#: lib/cannery_web/live/ammo_group_live/index.ex:157 +#: lib/cannery_web/live/ammo_group_live/index.ex:180 msgid "Unstage" msgstr "" @@ -926,7 +926,7 @@ msgid "Total # of ammo" msgstr "" #, elixir-autogen, elixir-format, fuzzy -#: lib/cannery_web/components/ammo_group_card.ex:61 +#: lib/cannery_web/components/ammo_group_card.ex:68 msgid "Container:" msgstr "" @@ -936,3 +936,13 @@ msgstr "" #: lib/cannery_web/live/container_live/show.html.heex:90 msgid "Show used" msgstr "" + +#, elixir-autogen, elixir-format +#: lib/cannery_web/live/ammo_group_live/index.ex:101 +msgid "Used up on" +msgstr "" + +#, elixir-autogen, elixir-format +#: lib/cannery_web/components/ammo_group_card.ex:52 +msgid "Used up on:" +msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/errors.po b/priv/gettext/en/LC_MESSAGES/errors.po index 1cbb6db..028ba86 100644 --- a/priv/gettext/en/LC_MESSAGES/errors.po +++ b/priv/gettext/en/LC_MESSAGES/errors.po @@ -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:524 +#: lib/cannery/ammo.ex:535 msgid "Invalid multiplier" msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/prompts.po b/priv/gettext/en/LC_MESSAGES/prompts.po index 349a00d..4ea35b0 100644 --- a/priv/gettext/en/LC_MESSAGES/prompts.po +++ b/priv/gettext/en/LC_MESSAGES/prompts.po @@ -86,7 +86,7 @@ msgid "Are you sure you want to delete the invite for %{name}?" msgstr "" #, elixir-autogen, elixir-format -#: lib/cannery_web/live/ammo_group_live/index.ex:193 +#: lib/cannery_web/live/ammo_group_live/index.ex:216 #: lib/cannery_web/live/ammo_group_live/show.html.heex:71 msgid "Are you sure you want to delete this ammo?" msgstr "" diff --git a/priv/gettext/errors.pot b/priv/gettext/errors.pot index 33ff775..86ff065 100644 --- a/priv/gettext/errors.pot +++ b/priv/gettext/errors.pot @@ -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:524 +#: lib/cannery/ammo.ex:535 msgid "Invalid multiplier" msgstr "" diff --git a/priv/gettext/es/LC_MESSAGES/actions.po b/priv/gettext/es/LC_MESSAGES/actions.po index 1479e29..05818ee 100644 --- a/priv/gettext/es/LC_MESSAGES/actions.po +++ b/priv/gettext/es/LC_MESSAGES/actions.po @@ -169,7 +169,7 @@ msgid "Why not get some ready to shoot?" msgstr "" #, elixir-autogen, elixir-format -#: lib/cannery_web/live/ammo_group_live/index.ex:160 +#: lib/cannery_web/live/ammo_group_live/index.ex:183 #: lib/cannery_web/live/ammo_group_live/show.html.heex:91 #: lib/cannery_web/live/range_live/index.html.heex:36 msgid "Record shots" diff --git a/priv/gettext/es/LC_MESSAGES/default.po b/priv/gettext/es/LC_MESSAGES/default.po index b8926c0..4e7ed1f 100644 --- a/priv/gettext/es/LC_MESSAGES/default.po +++ b/priv/gettext/es/LC_MESSAGES/default.po @@ -376,7 +376,7 @@ msgid "Price paid" msgstr "" #, elixir-autogen, elixir-format -#: lib/cannery_web/components/ammo_group_card.ex:52 +#: lib/cannery_web/components/ammo_group_card.ex:59 msgid "Price paid:" msgstr "" @@ -599,7 +599,7 @@ msgstr "" #, elixir-autogen, elixir-format #: lib/cannery_web/components/move_ammo_group_component.ex:80 -#: lib/cannery_web/live/ammo_group_live/index.ex:217 +#: lib/cannery_web/live/ammo_group_live/index.ex:240 msgid "Move ammo" msgstr "" @@ -614,8 +614,8 @@ msgid "Shot log" msgstr "" #, elixir-autogen, elixir-format -#: lib/cannery_web/components/ammo_group_card.ex:53 -#: lib/cannery_web/live/ammo_group_live/index.ex:134 +#: lib/cannery_web/components/ammo_group_card.ex:60 +#: lib/cannery_web/live/ammo_group_live/index.ex:142 #: lib/cannery_web/live/ammo_group_live/show.html.heex:37 #: lib/cannery_web/live/ammo_group_live/show.html.heex:44 #: lib/cannery_web/live/ammo_type_live/index.ex:118 @@ -680,12 +680,12 @@ msgid "New password" msgstr "" #, elixir-autogen, elixir-format -#: lib/cannery_web/live/ammo_group_live/index.ex:157 +#: lib/cannery_web/live/ammo_group_live/index.ex:180 msgid "Stage" msgstr "" #, elixir-autogen, elixir-format -#: lib/cannery_web/live/ammo_group_live/index.ex:157 +#: lib/cannery_web/live/ammo_group_live/index.ex:180 msgid "Unstage" msgstr "" @@ -940,7 +940,7 @@ msgid "Total # of ammo" msgstr "" #, elixir-autogen, elixir-format, fuzzy -#: lib/cannery_web/components/ammo_group_card.ex:61 +#: lib/cannery_web/components/ammo_group_card.ex:68 msgid "Container:" msgstr "" @@ -950,3 +950,13 @@ msgstr "" #: lib/cannery_web/live/container_live/show.html.heex:90 msgid "Show used" msgstr "" + +#, elixir-autogen, elixir-format +#: lib/cannery_web/live/ammo_group_live/index.ex:101 +msgid "Used up on" +msgstr "" + +#, elixir-autogen, elixir-format +#: lib/cannery_web/components/ammo_group_card.ex:52 +msgid "Used up on:" +msgstr "" diff --git a/priv/gettext/es/LC_MESSAGES/errors.po b/priv/gettext/es/LC_MESSAGES/errors.po index b6ba6f3..72ca8b8 100644 --- a/priv/gettext/es/LC_MESSAGES/errors.po +++ b/priv/gettext/es/LC_MESSAGES/errors.po @@ -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:524 +#: lib/cannery/ammo.ex:535 msgid "Invalid multiplier" msgstr "" diff --git a/priv/gettext/es/LC_MESSAGES/prompts.po b/priv/gettext/es/LC_MESSAGES/prompts.po index af0dd4a..80c2714 100644 --- a/priv/gettext/es/LC_MESSAGES/prompts.po +++ b/priv/gettext/es/LC_MESSAGES/prompts.po @@ -100,7 +100,7 @@ msgid "Are you sure you want to delete the invite for %{name}?" msgstr "Está seguro que quiere eliminar la invitación para %{name}?" #, elixir-autogen, elixir-format -#: lib/cannery_web/live/ammo_group_live/index.ex:193 +#: lib/cannery_web/live/ammo_group_live/index.ex:216 #: lib/cannery_web/live/ammo_group_live/show.html.heex:71 msgid "Are you sure you want to delete this ammo?" msgstr "Está seguro que desea eliminar esta munición?" diff --git a/priv/gettext/fr/LC_MESSAGES/actions.po b/priv/gettext/fr/LC_MESSAGES/actions.po index 14a77a0..e8bef04 100644 --- a/priv/gettext/fr/LC_MESSAGES/actions.po +++ b/priv/gettext/fr/LC_MESSAGES/actions.po @@ -169,7 +169,7 @@ msgid "Why not get some ready to shoot?" msgstr "Pourquoi pas en préparer pour tirer ?" #, elixir-autogen, elixir-format -#: lib/cannery_web/live/ammo_group_live/index.ex:160 +#: lib/cannery_web/live/ammo_group_live/index.ex:183 #: lib/cannery_web/live/ammo_group_live/show.html.heex:91 #: lib/cannery_web/live/range_live/index.html.heex:36 msgid "Record shots" diff --git a/priv/gettext/fr/LC_MESSAGES/default.po b/priv/gettext/fr/LC_MESSAGES/default.po index e9c2713..78b9dfd 100644 --- a/priv/gettext/fr/LC_MESSAGES/default.po +++ b/priv/gettext/fr/LC_MESSAGES/default.po @@ -376,7 +376,7 @@ msgid "Price paid" msgstr "Prix payé" #, elixir-autogen, elixir-format -#: lib/cannery_web/components/ammo_group_card.ex:52 +#: lib/cannery_web/components/ammo_group_card.ex:59 msgid "Price paid:" msgstr "Prix payé :" @@ -603,7 +603,7 @@ msgstr "Déplacer le groupe de munition" #, elixir-autogen, elixir-format #: lib/cannery_web/components/move_ammo_group_component.ex:80 -#: lib/cannery_web/live/ammo_group_live/index.ex:217 +#: lib/cannery_web/live/ammo_group_live/index.ex:240 msgid "Move ammo" msgstr "Déplacer munition" @@ -618,8 +618,8 @@ msgid "Shot log" msgstr "Évènements de tir" #, elixir-autogen, elixir-format -#: lib/cannery_web/components/ammo_group_card.ex:53 -#: lib/cannery_web/live/ammo_group_live/index.ex:134 +#: lib/cannery_web/components/ammo_group_card.ex:60 +#: lib/cannery_web/live/ammo_group_live/index.ex:142 #: lib/cannery_web/live/ammo_group_live/show.html.heex:37 #: lib/cannery_web/live/ammo_group_live/show.html.heex:44 #: lib/cannery_web/live/ammo_type_live/index.ex:118 @@ -684,12 +684,12 @@ msgid "New password" msgstr "Nouveau mot de passe" #, elixir-autogen, elixir-format -#: lib/cannery_web/live/ammo_group_live/index.ex:157 +#: lib/cannery_web/live/ammo_group_live/index.ex:180 msgid "Stage" msgstr "Sélectionné" #, elixir-autogen, elixir-format -#: lib/cannery_web/live/ammo_group_live/index.ex:157 +#: lib/cannery_web/live/ammo_group_live/index.ex:180 msgid "Unstage" msgstr "Désélectionner" @@ -944,7 +944,7 @@ msgid "Total # of ammo" msgstr "Quantité de cartouches" #, elixir-autogen, elixir-format, fuzzy -#: lib/cannery_web/components/ammo_group_card.ex:61 +#: lib/cannery_web/components/ammo_group_card.ex:68 msgid "Container:" msgstr "Conteneur" @@ -954,3 +954,13 @@ msgstr "Conteneur" #: lib/cannery_web/live/container_live/show.html.heex:90 msgid "Show used" msgstr "" + +#, elixir-autogen, elixir-format +#: lib/cannery_web/live/ammo_group_live/index.ex:101 +msgid "Used up on" +msgstr "" + +#, elixir-autogen, elixir-format +#: lib/cannery_web/components/ammo_group_card.ex:52 +msgid "Used up on:" +msgstr "" diff --git a/priv/gettext/fr/LC_MESSAGES/errors.po b/priv/gettext/fr/LC_MESSAGES/errors.po index 7106c37..6cf37cb 100644 --- a/priv/gettext/fr/LC_MESSAGES/errors.po +++ b/priv/gettext/fr/LC_MESSAGES/errors.po @@ -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:524 +#: lib/cannery/ammo.ex:535 msgid "Invalid multiplier" msgstr "" diff --git a/priv/gettext/fr/LC_MESSAGES/prompts.po b/priv/gettext/fr/LC_MESSAGES/prompts.po index c40a5cb..6fa4bca 100644 --- a/priv/gettext/fr/LC_MESSAGES/prompts.po +++ b/priv/gettext/fr/LC_MESSAGES/prompts.po @@ -101,7 +101,7 @@ msgid "Are you sure you want to delete the invite for %{name}?" msgstr "Êtes-vous certain·e de supprimer l’invitation pour %{name} ?" #, elixir-autogen, elixir-format -#: lib/cannery_web/live/ammo_group_live/index.ex:193 +#: lib/cannery_web/live/ammo_group_live/index.ex:216 #: lib/cannery_web/live/ammo_group_live/show.html.heex:71 msgid "Are you sure you want to delete this ammo?" msgstr "Êtes-vous certain·e de supprimer cette munition ?" diff --git a/priv/gettext/prompts.pot b/priv/gettext/prompts.pot index e2e9c64..0cbea26 100644 --- a/priv/gettext/prompts.pot +++ b/priv/gettext/prompts.pot @@ -85,7 +85,7 @@ msgid "Are you sure you want to delete the invite for %{name}?" msgstr "" #, elixir-autogen, elixir-format -#: lib/cannery_web/live/ammo_group_live/index.ex:193 +#: lib/cannery_web/live/ammo_group_live/index.ex:216 #: lib/cannery_web/live/ammo_group_live/show.html.heex:71 msgid "Are you sure you want to delete this ammo?" msgstr ""