diff --git a/CHANGELOG.md b/CHANGELOG.md
index c6b9565e..83bf1d1e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+# v0.8.4
+- Improve accessibility
+
# v0.8.3
- Improve some styles
- Improve server log
diff --git a/lib/cannery/activity_log/shot_group.ex b/lib/cannery/activity_log/shot_group.ex
index c0efb709..3cb4bdf8 100644
--- a/lib/cannery/activity_log/shot_group.ex
+++ b/lib/cannery/activity_log/shot_group.ex
@@ -79,7 +79,9 @@ defmodule Cannery.ActivityLog.ShotGroup do
defp validate_create_shot_group_count(changeset, %AmmoGroup{count: ammo_group_count}) do
if changeset |> Changeset.get_field(:count) > ammo_group_count do
- error = dgettext("errors", "Count must be less than %{count}", count: ammo_group_count)
+ error =
+ dgettext("errors", "Count must be less than %{count} shots", count: ammo_group_count)
+
changeset |> Changeset.add_error(:count, error)
else
changeset
@@ -115,7 +117,9 @@ defmodule Cannery.ActivityLog.ShotGroup do
cond do
shot_diff_to_add > ammo_group_count ->
- error = dgettext("errors", "Count must be less than %{count}", count: ammo_group_count)
+ error =
+ dgettext("errors", "Count must be less than %{count} shots", count: ammo_group_count)
+
changeset |> Changeset.add_error(:count, error)
new_shot_group_count <= 0 ->
diff --git a/lib/cannery_web/components/ammo_type_table_component.ex b/lib/cannery_web/components/ammo_type_table_component.ex
index fa366410..ef818f5b 100644
--- a/lib/cannery_web/components/ammo_type_table_component.ex
+++ b/lib/cannery_web/components/ammo_type_table_component.ex
@@ -185,11 +185,7 @@ defmodule CanneryWeb.Components.AmmoTypeTableComponent do
assigns = %{ammo_type: ammo_type}
~H"""
- <.link
- navigate={Routes.ammo_type_show_path(Endpoint, :show, @ammo_type)}
- class="link"
- data-qa={"view-name-#{@ammo_type.id}"}
- >
+ <.link navigate={Routes.ammo_type_show_path(Endpoint, :show, @ammo_type)} class="link">
<%= @ammo_type.name %>
"""
diff --git a/lib/cannery_web/live/ammo_group_live/index.html.heex b/lib/cannery_web/live/ammo_group_live/index.html.heex
index 19120b40..b1981eca 100644
--- a/lib/cannery_web/live/ammo_group_live/index.html.heex
+++ b/lib/cannery_web/live/ammo_group_live/index.html.heex
@@ -49,7 +49,6 @@
phx-change="search"
phx-submit="search"
class="grow self-stretch flex flex-col items-stretch"
- data-qa="ammo_group_search"
>
<%= text_input(f, :search_term,
class: "input input-primary",
@@ -124,7 +123,11 @@
<.link
navigate={Routes.ammo_group_show_path(Endpoint, :show, ammo_group)}
class="text-primary-600 link"
- data-qa={"view-#{ammo_group.id}"}
+ aria-label={
+ gettext("View ammo group of %{ammo_group_count} bullets",
+ ammo_group_count: ammo_group.count
+ )
+ }
>
@@ -132,7 +135,11 @@
<.link
patch={Routes.ammo_group_index_path(Endpoint, :edit, ammo_group)}
class="text-primary-600 link"
- data-qa={"edit-#{ammo_group.id}"}
+ aria-label={
+ gettext("Edit ammo group of %{ammo_group_count} bullets",
+ ammo_group_count: ammo_group.count
+ )
+ }
>
@@ -140,7 +147,11 @@
<.link
patch={Routes.ammo_group_index_path(Endpoint, :clone, ammo_group)}
class="text-primary-600 link"
- data-qa={"clone-#{ammo_group.id}"}
+ aria-label={
+ gettext("Clone ammo group of %{ammo_group_count} bullets",
+ ammo_group_count: ammo_group.count
+ )
+ }
>
@@ -151,7 +162,11 @@
phx-click="delete"
phx-value-id={ammo_group.id}
data-confirm={dgettext("prompts", "Are you sure you want to delete this ammo?")}
- data-qa={"delete-#{ammo_group.id}"}
+ aria-label={
+ gettext("Delete ammo group of %{ammo_group_count} bullets",
+ ammo_group_count: ammo_group.count
+ )
+ }
>
diff --git a/lib/cannery_web/live/ammo_group_live/show.ex b/lib/cannery_web/live/ammo_group_live/show.ex
index 06de2eb7..3303b0a0 100644
--- a/lib/cannery_web/live/ammo_group_live/show.ex
+++ b/lib/cannery_web/live/ammo_group_live/show.ex
@@ -129,7 +129,9 @@ defmodule CanneryWeb.AmmoGroupLive.Show do
<.link
patch={Routes.ammo_group_show_path(Endpoint, :edit_shot_group, @ammo_group, @shot_group)}
class="text-primary-600 link"
- data-qa={"edit-#{@shot_group.id}"}
+ aria-label={
+ gettext("Edit shot group of %{shot_group_count} shots", shot_group_count: @shot_group.count)
+ }
>
@@ -140,7 +142,11 @@ defmodule CanneryWeb.AmmoGroupLive.Show do
phx-click="delete_shot_group"
phx-value-id={@shot_group.id}
data-confirm={dgettext("prompts", "Are you sure you want to delete this shot record?")}
- data-qa={"delete-#{@shot_group.id}"}
+ aria-label={
+ gettext("Delete shot record of %{shot_group_count} shots",
+ shot_group_count: @shot_group.count
+ )
+ }
>
diff --git a/lib/cannery_web/live/ammo_group_live/show.html.heex b/lib/cannery_web/live/ammo_group_live/show.html.heex
index 147b68dd..c9e9b633 100644
--- a/lib/cannery_web/live/ammo_group_live/show.html.heex
+++ b/lib/cannery_web/live/ammo_group_live/show.html.heex
@@ -55,7 +55,6 @@
<.link
navigate={Routes.ammo_type_show_path(Endpoint, :show, @ammo_group.ammo_type)}
class="mx-4 my-2 btn btn-primary"
- data-qa="details"
>
<%= dgettext("actions", "View in Catalog") %>
@@ -63,7 +62,11 @@
<.link
patch={Routes.ammo_group_show_path(Endpoint, :edit, @ammo_group)}
class="mx-4 my-2 text-primary-600 link"
- data-qa="edit"
+ aria-label={
+ gettext("Edit ammo group of %{ammo_group_count} bullets",
+ ammo_group_count: @ammo_group.count
+ )
+ }
>
@@ -73,7 +76,11 @@
class="mx-4 my-2 text-primary-600 link"
phx-click="delete"
data-confirm={dgettext("prompts", "Are you sure you want to delete this ammo?")}
- data-qa="delete"
+ aria-label={
+ gettext("Delete ammo group of %{ammo_group_count} bullets",
+ ammo_group_count: @ammo_group.count
+ )
+ }
>
@@ -89,7 +96,6 @@
<.link
patch={Routes.ammo_group_show_path(Endpoint, :move, @ammo_group)}
class="btn btn-primary"
- data-qa="move"
>
<%= dgettext("actions", "Move containers") %>
diff --git a/lib/cannery_web/live/ammo_type_live/index.html.heex b/lib/cannery_web/live/ammo_type_live/index.html.heex
index 955da69c..4cc5c9b8 100644
--- a/lib/cannery_web/live/ammo_type_live/index.html.heex
+++ b/lib/cannery_web/live/ammo_type_live/index.html.heex
@@ -24,7 +24,6 @@
phx-change="search"
phx-submit="search"
class="grow self-stretch flex flex-col items-stretch"
- data-qa="ammo_type_search"
>
<%= text_input(f, :search_term,
class: "input input-primary",
@@ -60,7 +59,7 @@
<.link
navigate={Routes.ammo_type_show_path(Endpoint, :show, ammo_type)}
class="text-primary-600 link"
- data-qa={"view-#{ammo_type.id}"}
+ aria-label={gettext("View %{ammo_type_name}", ammo_type_name: ammo_type.name)}
>
@@ -68,7 +67,7 @@
<.link
patch={Routes.ammo_type_index_path(Endpoint, :edit, ammo_type)}
class="text-primary-600 link"
- data-qa={"edit-#{ammo_type.id}"}
+ aria-label={gettext("Edit %{ammo_type_name}", ammo_type_name: ammo_type.name)}
>
@@ -76,7 +75,7 @@
<.link
patch={Routes.ammo_type_index_path(Endpoint, :clone, ammo_type)}
class="text-primary-600 link"
- data-qa={"clone-#{ammo_type.id}"}
+ aria-label={gettext("Clone %{ammo_type_name}", ammo_type_name: ammo_type.name)}
>
@@ -93,7 +92,7 @@
name: ammo_type.name
)
}
- data-qa={"delete-#{ammo_type.id}"}
+ aria-label={gettext("Delete %{ammo_type_name}", ammo_type_name: ammo_type.name)}
>
diff --git a/lib/cannery_web/live/ammo_type_live/show.html.heex b/lib/cannery_web/live/ammo_type_live/show.html.heex
index 894bc19f..4ef1b129 100644
--- a/lib/cannery_web/live/ammo_type_live/show.html.heex
+++ b/lib/cannery_web/live/ammo_type_live/show.html.heex
@@ -16,7 +16,7 @@
<.link
patch={Routes.ammo_type_show_path(Endpoint, :edit, @ammo_type)}
class="text-primary-600 link"
- data-qa="edit"
+ aria-label={gettext("Edit %{ammo_type_name}", ammo_type_name: @ammo_type.name)}
>
@@ -32,7 +32,7 @@
name: @ammo_type.name
)
}
- data-qa="delete"
+ aria-label={gettext("Delete %{ammo_type_name}", ammo_type_name: @ammo_type.name)}
>
diff --git a/lib/cannery_web/live/container_live/index.html.heex b/lib/cannery_web/live/container_live/index.html.heex
index 2de82590..0c26b9f3 100644
--- a/lib/cannery_web/live/container_live/index.html.heex
+++ b/lib/cannery_web/live/container_live/index.html.heex
@@ -24,7 +24,6 @@
phx-change="search"
phx-submit="search"
class="grow self-stretch flex flex-col items-stretch"
- data-qa="container_search"
>
<%= text_input(f, :search_term,
class: "input input-primary",
@@ -61,6 +60,7 @@
<.link
patch={Routes.container_index_path(Endpoint, :edit_tags, container)}
class="text-primary-600 link"
+ aria-label={gettext("Tag %{container_name}", container_name: container.name)}
>
@@ -70,7 +70,7 @@
<.link
patch={Routes.container_index_path(Endpoint, :edit, container)}
class="text-primary-600 link"
- data-qa={"edit-#{container.id}"}
+ aria-label={gettext("Edit %{container_name}", container_name: container.name)}
>
@@ -78,7 +78,7 @@
<.link
patch={Routes.container_index_path(Endpoint, :clone, container)}
class="text-primary-600 link"
- data-qa={"clone-#{container.id}"}
+ aria-label={gettext("Clone %{container_name}", container_name: container.name)}
>
@@ -91,7 +91,7 @@
data-confirm={
dgettext("prompts", "Are you sure you want to delete %{name}?", name: container.name)
}
- data-qa={"delete-#{container.id}"}
+ aria-label={gettext("Delete %{container_name}", container_name: container.name)}
>
@@ -105,6 +105,7 @@
<.link
patch={Routes.container_index_path(Endpoint, :edit_tags, container)}
class="text-primary-600 link"
+ aria-label={gettext("Tag %{container_name}", container_name: container.name)}
>
@@ -113,7 +114,7 @@
<.link
patch={Routes.container_index_path(Endpoint, :edit, container)}
class="text-primary-600 link"
- data-qa={"edit-#{container.id}"}
+ aria-label={gettext("Edit %{container_name}", container_name: container.name)}
>
@@ -121,7 +122,7 @@
<.link
patch={Routes.container_index_path(Endpoint, :clone, container)}
class="text-primary-600 link"
- data-qa={"clone-#{container.id}"}
+ aria-label={gettext("Clone %{container_name}", container_name: container.name)}
>
@@ -134,7 +135,7 @@
data-confirm={
dgettext("prompts", "Are you sure you want to delete %{name}?", name: container.name)
}
- data-qa={"delete-#{container.id}"}
+ aria-label={gettext("Delete %{container_name}", container_name: container.name)}
>
diff --git a/lib/cannery_web/live/container_live/show.html.heex b/lib/cannery_web/live/container_live/show.html.heex
index a892e163..e4efe8eb 100644
--- a/lib/cannery_web/live/container_live/show.html.heex
+++ b/lib/cannery_web/live/container_live/show.html.heex
@@ -42,7 +42,7 @@
<.link
patch={Routes.container_show_path(Endpoint, :edit, @container)}
class="text-primary-600 link"
- data-qa="edit"
+ aria-label={gettext("Edit %{container_name}", container_name: @container.name)}
>
@@ -54,7 +54,7 @@
data-confirm={
dgettext("prompts", "Are you sure you want to delete %{name}?", name: @container.name)
}
- data-qa="delete"
+ aria-label={gettext("Delete %{container_name}", container_name: @container.name)}
>
diff --git a/lib/cannery_web/live/invite_live/index.html.heex b/lib/cannery_web/live/invite_live/index.html.heex
index b4880853..0ebe52b1 100644
--- a/lib/cannery_web/live/invite_live/index.html.heex
+++ b/lib/cannery_web/live/invite_live/index.html.heex
@@ -26,6 +26,7 @@
type="submit"
class="mx-2 my-1 btn btn-primary"
phx-click={JS.dispatch("cannery:clipcopy", to: "#code-#{invite.id}")}
+ aria-label={gettext("Copy invite link for %{invite_name}", invite_name: invite.name)}
>
<%= dgettext("actions", "Copy to clipboard") %>
@@ -34,7 +35,7 @@
<.link
patch={Routes.invite_index_path(Endpoint, :edit, invite)}
class="text-primary-600 link"
- data-qa={"edit-#{invite.id}"}
+ aria-label={gettext("Edit invite for %{invite_name}", invite_name: invite.name)}
>
@@ -49,7 +50,7 @@
invite_name: invite.name
)
}
- data-qa={"delete-#{invite.id}"}
+ aria-label={gettext("Delete invite for %{invite_name}", invite_name: invite.name)}
>
diff --git a/lib/cannery_web/live/live_helpers.ex b/lib/cannery_web/live/live_helpers.ex
index 0b4b34db..44223168 100644
--- a/lib/cannery_web/live/live_helpers.ex
+++ b/lib/cannery_web/live/live_helpers.ex
@@ -103,7 +103,7 @@ defmodule CanneryWeb.LiveHelpers do
value={@value}
checked={@value}
class="sr-only peer"
- data-qa={@id}
+ aria-labelledby={"#{@id}-label"}
{
if assigns |> Map.has_key?(:target),
do: %{"phx-click": @action, "phx-value-value": @value, "phx-target": @target},
@@ -119,7 +119,7 @@ defmodule CanneryWeb.LiveHelpers do
after:transition-all after:duration-250 after:ease-in-out
transition-colors duration-250 ease-in-out">
-
+
<%= render_slot(@inner_block) %>
diff --git a/lib/cannery_web/live/range_live/index.html.heex b/lib/cannery_web/live/range_live/index.html.heex
index 46e78706..e1bcbc2e 100644
--- a/lib/cannery_web/live/range_live/index.html.heex
+++ b/lib/cannery_web/live/range_live/index.html.heex
@@ -74,7 +74,6 @@
phx-change="search"
phx-submit="search"
class="grow self-stretch flex flex-col items-stretch"
- data-qa="shot_group_search"
>
<%= text_input(f, :search_term,
class: "input input-primary",
@@ -102,7 +101,11 @@
<.link
patch={Routes.range_index_path(Endpoint, :edit, shot_group)}
class="text-primary-600 link"
- data-qa={"edit-#{shot_group.id}"}
+ aria-label={
+ gettext("Edit shot record of %{shot_group_count} shots",
+ shot_group_count: shot_group.count
+ )
+ }
>
@@ -115,7 +118,11 @@
data-confirm={
dgettext("prompts", "Are you sure you want to delete this shot record?")
}
- data-qa={"delete-#{shot_group.id}"}
+ aria-label={
+ gettext("Delete shot record of %{shot_group_count} shots",
+ shot_group_count: shot_group.count
+ )
+ }
>
diff --git a/lib/cannery_web/live/tag_live/index.html.heex b/lib/cannery_web/live/tag_live/index.html.heex
index d9fff26f..e14e861b 100644
--- a/lib/cannery_web/live/tag_live/index.html.heex
+++ b/lib/cannery_web/live/tag_live/index.html.heex
@@ -27,7 +27,6 @@
phx-change="search"
phx-submit="search"
class="grow self-stretch flex flex-col items-stretch"
- data-qa="tag_search"
>
<%= text_input(f, :search_term,
class: "input input-primary",
@@ -49,7 +48,7 @@
<.link
patch={Routes.tag_index_path(Endpoint, :edit, tag)}
class="text-primary-600 link"
- data-qa={"edit-#{tag.id}"}
+ aria-label={gettext("Edit %{tag_name}", tag_name: tag.name)}
>
@@ -62,7 +61,7 @@
data-confirm={
dgettext("prompts", "Are you sure you want to delete %{name}?", name: tag.name)
}
- data-qa={"delete-#{tag.id}"}
+ aria-label={gettext("Delete %{tag_name}", tag_name: tag.name)}
>
diff --git a/mix.exs b/mix.exs
index 4e781667..7c4f1701 100644
--- a/mix.exs
+++ b/mix.exs
@@ -4,7 +4,7 @@ defmodule Cannery.MixProject do
def project do
[
app: :cannery,
- version: "0.8.3",
+ version: "0.8.4",
elixir: "1.14.1",
elixirc_paths: elixirc_paths(Mix.env()),
compilers: Mix.compilers(),
diff --git a/priv/gettext/actions.pot b/priv/gettext/actions.pot
index cdca96a4..ae708a4b 100644
--- a/priv/gettext/actions.pot
+++ b/priv/gettext/actions.pot
@@ -156,8 +156,8 @@ msgstr ""
msgid "Why not get some ready to shoot?"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:101
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:101
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:100
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:107
#: lib/cannery_web/live/range_live/index.html.heex:38
#, elixir-autogen, elixir-format
msgid "Record shots"
@@ -168,7 +168,7 @@ msgstr ""
msgid "Add another container!"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:94
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:100
#, elixir-autogen, elixir-format
msgid "Move containers"
msgstr ""
@@ -178,7 +178,7 @@ msgstr ""
msgid "Select"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:30
+#: lib/cannery_web/live/invite_live/index.html.heex:31
#, elixir-autogen, elixir-format
msgid "Copy to clipboard"
msgstr ""
@@ -203,7 +203,7 @@ msgstr ""
msgid "Change language"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:60
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:59
#, elixir-autogen, elixir-format
msgid "View in Catalog"
msgstr ""
@@ -218,18 +218,18 @@ msgstr ""
msgid "Move ammo"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:78
+#: lib/cannery_web/live/invite_live/index.html.heex:79
#, elixir-autogen, elixir-format
msgid "Set Unlimited"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:86
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:93
#: lib/cannery_web/live/range_live/index.html.heex:31
#, elixir-autogen, elixir-format
msgid "Stage for range"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:85
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:92
#: lib/cannery_web/live/range_live/index.html.heex:30
#, elixir-autogen, elixir-format
msgid "Unstage from range"
diff --git a/priv/gettext/de/LC_MESSAGES/actions.po b/priv/gettext/de/LC_MESSAGES/actions.po
index 5008c7b2..8ea7a7c3 100644
--- a/priv/gettext/de/LC_MESSAGES/actions.po
+++ b/priv/gettext/de/LC_MESSAGES/actions.po
@@ -169,8 +169,8 @@ msgstr "Munition markieren"
msgid "Why not get some ready to shoot?"
msgstr "Warum nicht einige für den Schießstand auswählen?"
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:101
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:101
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:100
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:107
#: lib/cannery_web/live/range_live/index.html.heex:38
#, elixir-autogen, elixir-format
msgid "Record shots"
@@ -181,7 +181,7 @@ msgstr "Schüsse dokumentieren"
msgid "Add another container!"
msgstr "Einen weiteren Behälter hinzufügen!"
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:94
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:100
#, elixir-autogen, elixir-format
msgid "Move containers"
msgstr "Behälter verschieben"
@@ -191,7 +191,7 @@ msgstr "Behälter verschieben"
msgid "Select"
msgstr "Markieren"
-#: lib/cannery_web/live/invite_live/index.html.heex:30
+#: lib/cannery_web/live/invite_live/index.html.heex:31
#, elixir-autogen, elixir-format
msgid "Copy to clipboard"
msgstr "In die Zwischenablage kopieren"
@@ -216,7 +216,7 @@ msgstr "Sprache wechseln"
msgid "Change language"
msgstr "Sprache wechseln"
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:60
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:59
#, elixir-autogen, elixir-format
msgid "View in Catalog"
msgstr ""
@@ -231,18 +231,18 @@ msgstr ""
msgid "Move ammo"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:78
+#: lib/cannery_web/live/invite_live/index.html.heex:79
#, elixir-autogen, elixir-format
msgid "Set Unlimited"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:86
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:93
#: lib/cannery_web/live/range_live/index.html.heex:31
#, elixir-autogen, elixir-format
msgid "Stage for range"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:85
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:92
#: lib/cannery_web/live/range_live/index.html.heex:30
#, elixir-autogen, elixir-format
msgid "Unstage from range"
diff --git a/priv/gettext/de/LC_MESSAGES/default.po b/priv/gettext/de/LC_MESSAGES/default.po
index f528ff15..8f1acc00 100644
--- a/priv/gettext/de/LC_MESSAGES/default.po
+++ b/priv/gettext/de/LC_MESSAGES/default.po
@@ -19,7 +19,7 @@ msgstr ""
msgid "Access from any internet-capable device"
msgstr "Zugriff von jedem Internet-fähigen Gerät"
-#: lib/cannery_web/live/invite_live/index.html.heex:87
+#: lib/cannery_web/live/invite_live/index.html.heex:88
#, elixir-autogen, elixir-format
msgid "Admins"
msgstr "Admins"
@@ -267,7 +267,7 @@ msgid "New Tag"
msgstr "Neuer Tag"
#: lib/cannery_web/live/ammo_group_live/index.html.heex:10
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:71
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:70
#, elixir-autogen, elixir-format
msgid "No Ammo"
msgstr "Keine Munition"
@@ -278,7 +278,7 @@ msgid "No ammo for this type"
msgstr "Keine Munition dieser Art"
#: lib/cannery_web/live/container_live/index.html.heex:8
-#: lib/cannery_web/live/container_live/index.html.heex:47
+#: lib/cannery_web/live/container_live/index.html.heex:46
#, elixir-autogen, elixir-format
msgid "No containers"
msgstr "Kein Behälter"
@@ -290,7 +290,7 @@ msgstr "Keine Einladung"
#: lib/cannery_web/live/container_live/edit_tags_component.html.heex:29
#: lib/cannery_web/live/tag_live/index.html.heex:10
-#: lib/cannery_web/live/tag_live/index.html.heex:43
+#: lib/cannery_web/live/tag_live/index.html.heex:42
#, elixir-autogen, elixir-format
msgid "No tags"
msgstr "Keine Tags"
@@ -372,7 +372,7 @@ msgstr "Einfach:"
msgid "Steel"
msgstr "Stahl"
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:111
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:117
#, elixir-autogen, elixir-format
msgid "Stored in"
msgstr "Gelagert in"
@@ -420,7 +420,7 @@ msgstr "Art"
msgid "Type:"
msgstr "Art:"
-#: lib/cannery_web/live/invite_live/index.html.heex:115
+#: lib/cannery_web/live/invite_live/index.html.heex:116
#, elixir-autogen, elixir-format
msgid "Users"
msgstr "Benutzer"
@@ -487,7 +487,7 @@ msgid "New Shot Records"
msgstr "Neue Schießkladde"
#: lib/cannery_web/live/range_live/index.html.heex:48
-#: lib/cannery_web/live/range_live/index.html.heex:90
+#: lib/cannery_web/live/range_live/index.html.heex:89
#, elixir-autogen, elixir-format
msgid "No shots recorded"
msgstr "Keine Schüsse dokumentiert"
@@ -512,7 +512,7 @@ msgid "Shot Records"
msgstr "Schießkladde"
#: lib/cannery_web/live/ammo_group_live/index.ex:38
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:118
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:117
#, elixir-autogen, elixir-format
msgid "Move ammo"
msgstr "Munition verschieben"
@@ -592,12 +592,12 @@ msgstr "Derzeitiges Passwort"
msgid "New password"
msgstr "Neues Passwort"
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:94
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:93
#, elixir-autogen, elixir-format
msgid "Stage"
msgstr "Markiert"
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:94
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:93
#, elixir-autogen, elixir-format
msgid "Unstage"
msgstr "Demarkiert"
@@ -664,7 +664,7 @@ msgstr "Ursprüngliche Anzahl:"
msgid "Percentage left:"
msgstr "Prozent verbleibend:"
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:124
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:130
#, elixir-autogen, elixir-format
msgid "Rounds used"
msgstr "Patronen verbraucht"
@@ -779,7 +779,7 @@ msgstr "Keine Munitionsgruppe in diesem Behälter"
msgid "Show Ammo"
msgstr "Zeige Munitionsarten"
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:116
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:122
#, elixir-autogen, elixir-format, fuzzy
msgid "This ammo is not in a container"
msgstr "Diese Munitionsgruppe ist nicht in einem Behälter"
@@ -812,8 +812,8 @@ msgstr ""
msgid "Container:"
msgstr "Behälter"
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:64
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:39
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:63
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:38
#: lib/cannery_web/live/ammo_type_live/show.html.heex:153
#: lib/cannery_web/live/container_live/show.html.heex:99
#, elixir-autogen, elixir-format
@@ -844,7 +844,7 @@ msgid "Rounds"
msgstr "Patronen:"
#: lib/cannery_web/live/ammo_type_live/show.html.heex:159
-#: lib/cannery_web/live/container_live/index.html.heex:39
+#: lib/cannery_web/live/container_live/index.html.heex:38
#: lib/cannery_web/live/container_live/show.html.heex:105
#, elixir-autogen, elixir-format
msgid "View as table"
@@ -1002,7 +1002,9 @@ msgid "Average CPR"
msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:28
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:70
#: lib/cannery_web/live/ammo_type_live/show.ex:120
+#: lib/cannery_web/live/ammo_type_live/show.html.heex:19
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit %{ammo_type_name}"
msgstr "%{name} bearbeiten"
@@ -1081,32 +1083,32 @@ msgid "Edit ammo"
msgstr "Munitionstyp bearbeiten"
#: lib/cannery_web/live/ammo_type_live/index.html.heex:8
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:46
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:45
#, elixir-autogen, elixir-format, fuzzy
msgid "No Ammo types"
msgstr "Keine Munitionsarten"
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:33
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:32
#, elixir-autogen, elixir-format
msgid "Search catalog"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:58
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:57
#, elixir-autogen, elixir-format, fuzzy
msgid "Search ammo"
msgstr ""
-#: lib/cannery_web/live/container_live/index.html.heex:33
+#: lib/cannery_web/live/container_live/index.html.heex:32
#, elixir-autogen, elixir-format
msgid "Search containers"
msgstr ""
-#: lib/cannery_web/live/tag_live/index.html.heex:36
+#: lib/cannery_web/live/tag_live/index.html.heex:35
#, elixir-autogen, elixir-format, fuzzy
msgid "Search tags"
msgstr ""
-#: lib/cannery_web/live/range_live/index.html.heex:83
+#: lib/cannery_web/live/range_live/index.html.heex:82
#, elixir-autogen, elixir-format
msgid "Search shot records"
msgstr ""
@@ -1180,12 +1182,12 @@ msgstr ""
msgid "Welcome to Cannery"
msgstr "Willkommen %{name}"
-#: lib/cannery_web/live/invite_live/index.html.heex:63
+#: lib/cannery_web/live/invite_live/index.html.heex:64
#, elixir-autogen, elixir-format
msgid "Disable"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:63
+#: lib/cannery_web/live/invite_live/index.html.heex:64
#, elixir-autogen, elixir-format
msgid "Enable"
msgstr ""
@@ -1214,3 +1216,108 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "Password"
msgstr ""
+
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:78
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Clone %{ammo_type_name}"
+msgstr "%{name} bearbeiten"
+
+#: lib/cannery_web/live/container_live/index.html.heex:81
+#: lib/cannery_web/live/container_live/index.html.heex:125
+#, elixir-autogen, elixir-format
+msgid "Clone %{container_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:151
+#, elixir-autogen, elixir-format
+msgid "Clone ammo group of %{ammo_group_count} bullets"
+msgstr ""
+
+#: lib/cannery_web/live/invite_live/index.html.heex:29
+#, elixir-autogen, elixir-format
+msgid "Copy invite link for %{invite_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:95
+#: lib/cannery_web/live/ammo_type_live/show.html.heex:35
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Delete %{ammo_type_name}"
+msgstr "%{name} bearbeiten"
+
+#: lib/cannery_web/live/container_live/index.html.heex:94
+#: lib/cannery_web/live/container_live/index.html.heex:138
+#: lib/cannery_web/live/container_live/show.html.heex:57
+#, elixir-autogen, elixir-format
+msgid "Delete %{container_name}"
+msgstr ""
+
+#: lib/cannery_web/live/tag_live/index.html.heex:64
+#, elixir-autogen, elixir-format
+msgid "Delete %{tag_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:166
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:80
+#, elixir-autogen, elixir-format
+msgid "Delete ammo group of %{ammo_group_count} bullets"
+msgstr ""
+
+#: lib/cannery_web/live/invite_live/index.html.heex:53
+#, elixir-autogen, elixir-format
+msgid "Delete invite for %{invite_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/show.ex:146
+#: lib/cannery_web/live/range_live/index.html.heex:122
+#, elixir-autogen, elixir-format
+msgid "Delete shot record of %{shot_group_count} shots"
+msgstr ""
+
+#: lib/cannery_web/live/container_live/index.html.heex:73
+#: lib/cannery_web/live/container_live/index.html.heex:117
+#: lib/cannery_web/live/container_live/show.html.heex:45
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Edit %{container_name}"
+msgstr "%{name} bearbeiten"
+
+#: lib/cannery_web/live/tag_live/index.html.heex:51
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Edit %{tag_name}"
+msgstr "%{name} bearbeiten"
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:139
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:66
+#, elixir-autogen, elixir-format
+msgid "Edit ammo group of %{ammo_group_count} bullets"
+msgstr ""
+
+#: lib/cannery_web/live/invite_live/index.html.heex:38
+#, elixir-autogen, elixir-format
+msgid "Edit invite for %{invite_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/show.ex:133
+#, elixir-autogen, elixir-format
+msgid "Edit shot group of %{shot_group_count} shots"
+msgstr ""
+
+#: lib/cannery_web/live/range_live/index.html.heex:105
+#, elixir-autogen, elixir-format
+msgid "Edit shot record of %{shot_group_count} shots"
+msgstr ""
+
+#: lib/cannery_web/live/container_live/index.html.heex:63
+#: lib/cannery_web/live/container_live/index.html.heex:108
+#, elixir-autogen, elixir-format
+msgid "Tag %{container_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:62
+#, elixir-autogen, elixir-format, fuzzy
+msgid "View %{ammo_type_name}"
+msgstr "%{name} bearbeiten"
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:127
+#, elixir-autogen, elixir-format
+msgid "View ammo group of %{ammo_group_count} bullets"
+msgstr ""
diff --git a/priv/gettext/de/LC_MESSAGES/errors.po b/priv/gettext/de/LC_MESSAGES/errors.po
index 94e01754..ad3637b7 100644
--- a/priv/gettext/de/LC_MESSAGES/errors.po
+++ b/priv/gettext/de/LC_MESSAGES/errors.po
@@ -152,17 +152,11 @@ msgstr "Tag nicht gefunden"
msgid "Tag could not be added"
msgstr "Tag konnte nicht hinzugefügt werden"
-#: lib/cannery/activity_log/shot_group.ex:122
+#: lib/cannery/activity_log/shot_group.ex:126
#, elixir-autogen, elixir-format
msgid "Count must be at least 1"
msgstr "Anzahl muss mindestens 1 sein"
-#: lib/cannery/activity_log/shot_group.ex:82
-#: lib/cannery/activity_log/shot_group.ex:118
-#, elixir-autogen, elixir-format
-msgid "Count must be less than %{count}"
-msgstr "Anzahl muss weniger als %{count} betragen"
-
#: lib/cannery_web/controllers/user_auth.ex:39
#: lib/cannery_web/controllers/user_auth.ex:161
#, elixir-autogen, elixir-format
@@ -207,3 +201,9 @@ msgstr ""
#, elixir-autogen, elixir-format, fuzzy
msgid "Please select a valid user and ammo pack"
msgstr ""
+
+#: lib/cannery/activity_log/shot_group.ex:83
+#: lib/cannery/activity_log/shot_group.ex:121
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Count must be less than %{count} shots"
+msgstr "Anzahl muss weniger als %{count} betragen"
diff --git a/priv/gettext/de/LC_MESSAGES/prompts.po b/priv/gettext/de/LC_MESSAGES/prompts.po
index e785c903..510a1c3a 100644
--- a/priv/gettext/de/LC_MESSAGES/prompts.po
+++ b/priv/gettext/de/LC_MESSAGES/prompts.po
@@ -57,8 +57,8 @@ msgstr "%{name} erfolgreich aktualisiert"
msgid "A link to confirm your email change has been sent to the new address."
msgstr "Eine Mail zum Bestätigen ihre Mailadresse wurde Ihnen zugesandt."
-#: lib/cannery_web/live/invite_live/index.html.heex:98
-#: lib/cannery_web/live/invite_live/index.html.heex:126
+#: lib/cannery_web/live/invite_live/index.html.heex:99
+#: lib/cannery_web/live/invite_live/index.html.heex:127
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{email}? This action is permanent!"
msgstr ""
@@ -66,15 +66,15 @@ msgstr ""
"zurückgenommen werden!"
#: lib/cannery_web/live/container_live/index.html.heex:92
-#: lib/cannery_web/live/container_live/index.html.heex:135
+#: lib/cannery_web/live/container_live/index.html.heex:136
#: lib/cannery_web/live/container_live/show.html.heex:55
-#: lib/cannery_web/live/tag_live/index.html.heex:63
+#: lib/cannery_web/live/tag_live/index.html.heex:62
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}?"
msgstr "Sind Sie sicher, dass sie %{name} löschen möchten?"
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:153
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:75
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:164
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:78
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this ammo?"
msgstr "Sind Sie sicher, dass sie diese Munition löschen möchten?"
@@ -176,8 +176,8 @@ msgstr "Schüsse erfolgreich dokumentiert"
msgid "Are you sure you want to unstage this ammo?"
msgstr "Sind sie sicher, dass Sie diese Munition demarkieren möchten?"
-#: lib/cannery_web/live/ammo_group_live/show.ex:142
-#: lib/cannery_web/live/range_live/index.html.heex:116
+#: lib/cannery_web/live/ammo_group_live/show.ex:144
+#: lib/cannery_web/live/range_live/index.html.heex:119
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?"
msgstr "Sind sie sicher, dass sie die Schießkladde löschen möchten?"
@@ -257,7 +257,7 @@ msgid_plural "Ammo added successfully"
msgstr[0] "Munitionsgruppe erfolgreich aktualisiert"
msgstr[1] "Munitionsgruppe erfolgreich aktualisiert"
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:90
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:89
#: lib/cannery_web/live/ammo_type_live/show.html.heex:29
#, elixir-autogen, elixir-format, fuzzy
msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!"
@@ -293,12 +293,12 @@ msgstr "%{name} erfolgreich aktualisiert"
msgid "%{user_email} deleted succesfully"
msgstr "%{name} erfolgreich gelöscht"
-#: lib/cannery_web/live/invite_live/index.html.heex:48
+#: lib/cannery_web/live/invite_live/index.html.heex:49
#, elixir-autogen, elixir-format, fuzzy
msgid "Are you sure you want to delete the invite for %{invite_name}?"
msgstr "Sind Sie sicher, dass sie die Einladung für %{name} löschen möchten?"
-#: lib/cannery_web/live/invite_live/index.html.heex:73
+#: lib/cannery_web/live/invite_live/index.html.heex:74
#, elixir-autogen, elixir-format, fuzzy
msgid "Are you sure you want to make %{invite_name} unlimited?"
msgstr "Sind Sie sicher, dass sie %{name} auf unbegrenzt setzen möchten?"
diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot
index 2e7d5da6..722c39dc 100644
--- a/priv/gettext/default.pot
+++ b/priv/gettext/default.pot
@@ -15,7 +15,7 @@ msgstr ""
msgid "Access from any internet-capable device"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:87
+#: lib/cannery_web/live/invite_live/index.html.heex:88
#, elixir-autogen, elixir-format
msgid "Admins"
msgstr ""
@@ -263,7 +263,7 @@ msgid "New Tag"
msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.html.heex:10
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:71
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:70
#, elixir-autogen, elixir-format
msgid "No Ammo"
msgstr ""
@@ -274,7 +274,7 @@ msgid "No ammo for this type"
msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:8
-#: lib/cannery_web/live/container_live/index.html.heex:47
+#: lib/cannery_web/live/container_live/index.html.heex:46
#, elixir-autogen, elixir-format
msgid "No containers"
msgstr ""
@@ -286,7 +286,7 @@ msgstr ""
#: lib/cannery_web/live/container_live/edit_tags_component.html.heex:29
#: lib/cannery_web/live/tag_live/index.html.heex:10
-#: lib/cannery_web/live/tag_live/index.html.heex:43
+#: lib/cannery_web/live/tag_live/index.html.heex:42
#, elixir-autogen, elixir-format
msgid "No tags"
msgstr ""
@@ -366,7 +366,7 @@ msgstr ""
msgid "Steel"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:111
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:117
#, elixir-autogen, elixir-format
msgid "Stored in"
msgstr ""
@@ -414,7 +414,7 @@ msgstr ""
msgid "Type:"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:115
+#: lib/cannery_web/live/invite_live/index.html.heex:116
#, elixir-autogen, elixir-format
msgid "Users"
msgstr ""
@@ -481,7 +481,7 @@ msgid "New Shot Records"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:48
-#: lib/cannery_web/live/range_live/index.html.heex:90
+#: lib/cannery_web/live/range_live/index.html.heex:89
#, elixir-autogen, elixir-format
msgid "No shots recorded"
msgstr ""
@@ -506,7 +506,7 @@ msgid "Shot Records"
msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.ex:38
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:118
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:117
#, elixir-autogen, elixir-format
msgid "Move ammo"
msgstr ""
@@ -586,12 +586,12 @@ msgstr ""
msgid "New password"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:94
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:93
#, elixir-autogen, elixir-format
msgid "Stage"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:94
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:93
#, elixir-autogen, elixir-format
msgid "Unstage"
msgstr ""
@@ -658,7 +658,7 @@ msgstr ""
msgid "Percentage left:"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:124
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:130
#, elixir-autogen, elixir-format
msgid "Rounds used"
msgstr ""
@@ -773,7 +773,7 @@ msgstr ""
msgid "Show Ammo"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:116
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:122
#, elixir-autogen, elixir-format
msgid "This ammo is not in a container"
msgstr ""
@@ -806,8 +806,8 @@ msgstr ""
msgid "Container:"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:64
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:39
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:63
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:38
#: lib/cannery_web/live/ammo_type_live/show.html.heex:153
#: lib/cannery_web/live/container_live/show.html.heex:99
#, elixir-autogen, elixir-format
@@ -838,7 +838,7 @@ msgid "Rounds"
msgstr ""
#: lib/cannery_web/live/ammo_type_live/show.html.heex:159
-#: lib/cannery_web/live/container_live/index.html.heex:39
+#: lib/cannery_web/live/container_live/index.html.heex:38
#: lib/cannery_web/live/container_live/show.html.heex:105
#, elixir-autogen, elixir-format
msgid "View as table"
@@ -996,7 +996,9 @@ msgid "Average CPR"
msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:28
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:70
#: lib/cannery_web/live/ammo_type_live/show.ex:120
+#: lib/cannery_web/live/ammo_type_live/show.html.heex:19
#, elixir-autogen, elixir-format
msgid "Edit %{ammo_type_name}"
msgstr ""
@@ -1075,32 +1077,32 @@ msgid "Edit ammo"
msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.html.heex:8
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:46
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:45
#, elixir-autogen, elixir-format
msgid "No Ammo types"
msgstr ""
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:33
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:32
#, elixir-autogen, elixir-format
msgid "Search catalog"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:58
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:57
#, elixir-autogen, elixir-format
msgid "Search ammo"
msgstr ""
-#: lib/cannery_web/live/container_live/index.html.heex:33
+#: lib/cannery_web/live/container_live/index.html.heex:32
#, elixir-autogen, elixir-format
msgid "Search containers"
msgstr ""
-#: lib/cannery_web/live/tag_live/index.html.heex:36
+#: lib/cannery_web/live/tag_live/index.html.heex:35
#, elixir-autogen, elixir-format
msgid "Search tags"
msgstr ""
-#: lib/cannery_web/live/range_live/index.html.heex:83
+#: lib/cannery_web/live/range_live/index.html.heex:82
#, elixir-autogen, elixir-format
msgid "Search shot records"
msgstr ""
@@ -1163,12 +1165,12 @@ msgstr ""
msgid "Welcome to Cannery"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:63
+#: lib/cannery_web/live/invite_live/index.html.heex:64
#, elixir-autogen, elixir-format
msgid "Disable"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:63
+#: lib/cannery_web/live/invite_live/index.html.heex:64
#, elixir-autogen, elixir-format
msgid "Enable"
msgstr ""
@@ -1197,3 +1199,108 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "Password"
msgstr ""
+
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:78
+#, elixir-autogen, elixir-format
+msgid "Clone %{ammo_type_name}"
+msgstr ""
+
+#: lib/cannery_web/live/container_live/index.html.heex:81
+#: lib/cannery_web/live/container_live/index.html.heex:125
+#, elixir-autogen, elixir-format
+msgid "Clone %{container_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:151
+#, elixir-autogen, elixir-format
+msgid "Clone ammo group of %{ammo_group_count} bullets"
+msgstr ""
+
+#: lib/cannery_web/live/invite_live/index.html.heex:29
+#, elixir-autogen, elixir-format
+msgid "Copy invite link for %{invite_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:95
+#: lib/cannery_web/live/ammo_type_live/show.html.heex:35
+#, elixir-autogen, elixir-format
+msgid "Delete %{ammo_type_name}"
+msgstr ""
+
+#: lib/cannery_web/live/container_live/index.html.heex:94
+#: lib/cannery_web/live/container_live/index.html.heex:138
+#: lib/cannery_web/live/container_live/show.html.heex:57
+#, elixir-autogen, elixir-format
+msgid "Delete %{container_name}"
+msgstr ""
+
+#: lib/cannery_web/live/tag_live/index.html.heex:64
+#, elixir-autogen, elixir-format
+msgid "Delete %{tag_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:166
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:80
+#, elixir-autogen, elixir-format
+msgid "Delete ammo group of %{ammo_group_count} bullets"
+msgstr ""
+
+#: lib/cannery_web/live/invite_live/index.html.heex:53
+#, elixir-autogen, elixir-format
+msgid "Delete invite for %{invite_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/show.ex:146
+#: lib/cannery_web/live/range_live/index.html.heex:122
+#, elixir-autogen, elixir-format
+msgid "Delete shot record of %{shot_group_count} shots"
+msgstr ""
+
+#: lib/cannery_web/live/container_live/index.html.heex:73
+#: lib/cannery_web/live/container_live/index.html.heex:117
+#: lib/cannery_web/live/container_live/show.html.heex:45
+#, elixir-autogen, elixir-format
+msgid "Edit %{container_name}"
+msgstr ""
+
+#: lib/cannery_web/live/tag_live/index.html.heex:51
+#, elixir-autogen, elixir-format
+msgid "Edit %{tag_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:139
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:66
+#, elixir-autogen, elixir-format
+msgid "Edit ammo group of %{ammo_group_count} bullets"
+msgstr ""
+
+#: lib/cannery_web/live/invite_live/index.html.heex:38
+#, elixir-autogen, elixir-format
+msgid "Edit invite for %{invite_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/show.ex:133
+#, elixir-autogen, elixir-format
+msgid "Edit shot group of %{shot_group_count} shots"
+msgstr ""
+
+#: lib/cannery_web/live/range_live/index.html.heex:105
+#, elixir-autogen, elixir-format
+msgid "Edit shot record of %{shot_group_count} shots"
+msgstr ""
+
+#: lib/cannery_web/live/container_live/index.html.heex:63
+#: lib/cannery_web/live/container_live/index.html.heex:108
+#, elixir-autogen, elixir-format
+msgid "Tag %{container_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:62
+#, elixir-autogen, elixir-format
+msgid "View %{ammo_type_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:127
+#, elixir-autogen, elixir-format
+msgid "View ammo group of %{ammo_group_count} bullets"
+msgstr ""
diff --git a/priv/gettext/en/LC_MESSAGES/actions.po b/priv/gettext/en/LC_MESSAGES/actions.po
index 8aa4362a..a2aae009 100644
--- a/priv/gettext/en/LC_MESSAGES/actions.po
+++ b/priv/gettext/en/LC_MESSAGES/actions.po
@@ -156,8 +156,8 @@ msgstr ""
msgid "Why not get some ready to shoot?"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:101
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:101
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:100
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:107
#: lib/cannery_web/live/range_live/index.html.heex:38
#, elixir-autogen, elixir-format
msgid "Record shots"
@@ -168,7 +168,7 @@ msgstr ""
msgid "Add another container!"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:94
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:100
#, elixir-autogen, elixir-format
msgid "Move containers"
msgstr ""
@@ -178,7 +178,7 @@ msgstr ""
msgid "Select"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:30
+#: lib/cannery_web/live/invite_live/index.html.heex:31
#, elixir-autogen, elixir-format
msgid "Copy to clipboard"
msgstr ""
@@ -203,7 +203,7 @@ msgstr ""
msgid "Change language"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:60
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:59
#, elixir-autogen, elixir-format
msgid "View in Catalog"
msgstr ""
@@ -218,18 +218,18 @@ msgstr ""
msgid "Move ammo"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:78
+#: lib/cannery_web/live/invite_live/index.html.heex:79
#, elixir-autogen, elixir-format
msgid "Set Unlimited"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:86
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:93
#: lib/cannery_web/live/range_live/index.html.heex:31
#, elixir-autogen, elixir-format
msgid "Stage for range"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:85
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:92
#: lib/cannery_web/live/range_live/index.html.heex:30
#, elixir-autogen, elixir-format
msgid "Unstage from range"
diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po
index c657e18e..1980a6f9 100644
--- a/priv/gettext/en/LC_MESSAGES/default.po
+++ b/priv/gettext/en/LC_MESSAGES/default.po
@@ -15,7 +15,7 @@ msgstr ""
msgid "Access from any internet-capable device"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:87
+#: lib/cannery_web/live/invite_live/index.html.heex:88
#, elixir-autogen, elixir-format
msgid "Admins"
msgstr ""
@@ -263,7 +263,7 @@ msgid "New Tag"
msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.html.heex:10
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:71
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:70
#, elixir-autogen, elixir-format
msgid "No Ammo"
msgstr ""
@@ -274,7 +274,7 @@ msgid "No ammo for this type"
msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:8
-#: lib/cannery_web/live/container_live/index.html.heex:47
+#: lib/cannery_web/live/container_live/index.html.heex:46
#, elixir-autogen, elixir-format
msgid "No containers"
msgstr ""
@@ -286,7 +286,7 @@ msgstr ""
#: lib/cannery_web/live/container_live/edit_tags_component.html.heex:29
#: lib/cannery_web/live/tag_live/index.html.heex:10
-#: lib/cannery_web/live/tag_live/index.html.heex:43
+#: lib/cannery_web/live/tag_live/index.html.heex:42
#, elixir-autogen, elixir-format
msgid "No tags"
msgstr ""
@@ -366,7 +366,7 @@ msgstr ""
msgid "Steel"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:111
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:117
#, elixir-autogen, elixir-format
msgid "Stored in"
msgstr ""
@@ -414,7 +414,7 @@ msgstr ""
msgid "Type:"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:115
+#: lib/cannery_web/live/invite_live/index.html.heex:116
#, elixir-autogen, elixir-format
msgid "Users"
msgstr ""
@@ -481,7 +481,7 @@ msgid "New Shot Records"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:48
-#: lib/cannery_web/live/range_live/index.html.heex:90
+#: lib/cannery_web/live/range_live/index.html.heex:89
#, elixir-autogen, elixir-format
msgid "No shots recorded"
msgstr ""
@@ -506,7 +506,7 @@ msgid "Shot Records"
msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.ex:38
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:118
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:117
#, elixir-autogen, elixir-format
msgid "Move ammo"
msgstr ""
@@ -586,12 +586,12 @@ msgstr ""
msgid "New password"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:94
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:93
#, elixir-autogen, elixir-format
msgid "Stage"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:94
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:93
#, elixir-autogen, elixir-format
msgid "Unstage"
msgstr ""
@@ -658,7 +658,7 @@ msgstr ""
msgid "Percentage left:"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:124
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:130
#, elixir-autogen, elixir-format, fuzzy
msgid "Rounds used"
msgstr ""
@@ -773,7 +773,7 @@ msgstr ""
msgid "Show Ammo"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:116
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:122
#, elixir-autogen, elixir-format, fuzzy
msgid "This ammo is not in a container"
msgstr ""
@@ -806,8 +806,8 @@ msgstr ""
msgid "Container:"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:64
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:39
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:63
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:38
#: lib/cannery_web/live/ammo_type_live/show.html.heex:153
#: lib/cannery_web/live/container_live/show.html.heex:99
#, elixir-autogen, elixir-format
@@ -838,7 +838,7 @@ msgid "Rounds"
msgstr ""
#: lib/cannery_web/live/ammo_type_live/show.html.heex:159
-#: lib/cannery_web/live/container_live/index.html.heex:39
+#: lib/cannery_web/live/container_live/index.html.heex:38
#: lib/cannery_web/live/container_live/show.html.heex:105
#, elixir-autogen, elixir-format
msgid "View as table"
@@ -996,7 +996,9 @@ msgid "Average CPR"
msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:28
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:70
#: lib/cannery_web/live/ammo_type_live/show.ex:120
+#: lib/cannery_web/live/ammo_type_live/show.html.heex:19
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit %{ammo_type_name}"
msgstr ""
@@ -1075,32 +1077,32 @@ msgid "Edit ammo"
msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.html.heex:8
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:46
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:45
#, elixir-autogen, elixir-format, fuzzy
msgid "No Ammo types"
msgstr ""
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:33
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:32
#, elixir-autogen, elixir-format
msgid "Search catalog"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:58
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:57
#, elixir-autogen, elixir-format, fuzzy
msgid "Search ammo"
msgstr ""
-#: lib/cannery_web/live/container_live/index.html.heex:33
+#: lib/cannery_web/live/container_live/index.html.heex:32
#, elixir-autogen, elixir-format
msgid "Search containers"
msgstr ""
-#: lib/cannery_web/live/tag_live/index.html.heex:36
+#: lib/cannery_web/live/tag_live/index.html.heex:35
#, elixir-autogen, elixir-format, fuzzy
msgid "Search tags"
msgstr ""
-#: lib/cannery_web/live/range_live/index.html.heex:83
+#: lib/cannery_web/live/range_live/index.html.heex:82
#, elixir-autogen, elixir-format
msgid "Search shot records"
msgstr ""
@@ -1163,12 +1165,12 @@ msgstr ""
msgid "Welcome to Cannery"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:63
+#: lib/cannery_web/live/invite_live/index.html.heex:64
#, elixir-autogen, elixir-format
msgid "Disable"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:63
+#: lib/cannery_web/live/invite_live/index.html.heex:64
#, elixir-autogen, elixir-format
msgid "Enable"
msgstr ""
@@ -1197,3 +1199,108 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "Password"
msgstr ""
+
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:78
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Clone %{ammo_type_name}"
+msgstr ""
+
+#: lib/cannery_web/live/container_live/index.html.heex:81
+#: lib/cannery_web/live/container_live/index.html.heex:125
+#, elixir-autogen, elixir-format
+msgid "Clone %{container_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:151
+#, elixir-autogen, elixir-format
+msgid "Clone ammo group of %{ammo_group_count} bullets"
+msgstr ""
+
+#: lib/cannery_web/live/invite_live/index.html.heex:29
+#, elixir-autogen, elixir-format
+msgid "Copy invite link for %{invite_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:95
+#: lib/cannery_web/live/ammo_type_live/show.html.heex:35
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Delete %{ammo_type_name}"
+msgstr ""
+
+#: lib/cannery_web/live/container_live/index.html.heex:94
+#: lib/cannery_web/live/container_live/index.html.heex:138
+#: lib/cannery_web/live/container_live/show.html.heex:57
+#, elixir-autogen, elixir-format
+msgid "Delete %{container_name}"
+msgstr ""
+
+#: lib/cannery_web/live/tag_live/index.html.heex:64
+#, elixir-autogen, elixir-format
+msgid "Delete %{tag_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:166
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:80
+#, elixir-autogen, elixir-format
+msgid "Delete ammo group of %{ammo_group_count} bullets"
+msgstr ""
+
+#: lib/cannery_web/live/invite_live/index.html.heex:53
+#, elixir-autogen, elixir-format
+msgid "Delete invite for %{invite_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/show.ex:146
+#: lib/cannery_web/live/range_live/index.html.heex:122
+#, elixir-autogen, elixir-format
+msgid "Delete shot record of %{shot_group_count} shots"
+msgstr ""
+
+#: lib/cannery_web/live/container_live/index.html.heex:73
+#: lib/cannery_web/live/container_live/index.html.heex:117
+#: lib/cannery_web/live/container_live/show.html.heex:45
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Edit %{container_name}"
+msgstr ""
+
+#: lib/cannery_web/live/tag_live/index.html.heex:51
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Edit %{tag_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:139
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:66
+#, elixir-autogen, elixir-format
+msgid "Edit ammo group of %{ammo_group_count} bullets"
+msgstr ""
+
+#: lib/cannery_web/live/invite_live/index.html.heex:38
+#, elixir-autogen, elixir-format
+msgid "Edit invite for %{invite_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/show.ex:133
+#, elixir-autogen, elixir-format
+msgid "Edit shot group of %{shot_group_count} shots"
+msgstr ""
+
+#: lib/cannery_web/live/range_live/index.html.heex:105
+#, elixir-autogen, elixir-format
+msgid "Edit shot record of %{shot_group_count} shots"
+msgstr ""
+
+#: lib/cannery_web/live/container_live/index.html.heex:63
+#: lib/cannery_web/live/container_live/index.html.heex:108
+#, elixir-autogen, elixir-format
+msgid "Tag %{container_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:62
+#, elixir-autogen, elixir-format, fuzzy
+msgid "View %{ammo_type_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:127
+#, elixir-autogen, elixir-format
+msgid "View ammo group of %{ammo_group_count} bullets"
+msgstr ""
diff --git a/priv/gettext/en/LC_MESSAGES/errors.po b/priv/gettext/en/LC_MESSAGES/errors.po
index 0c81b9ab..93166b47 100644
--- a/priv/gettext/en/LC_MESSAGES/errors.po
+++ b/priv/gettext/en/LC_MESSAGES/errors.po
@@ -139,17 +139,11 @@ msgstr ""
msgid "Tag could not be added"
msgstr ""
-#: lib/cannery/activity_log/shot_group.ex:122
+#: lib/cannery/activity_log/shot_group.ex:126
#, elixir-autogen, elixir-format
msgid "Count must be at least 1"
msgstr ""
-#: lib/cannery/activity_log/shot_group.ex:82
-#: lib/cannery/activity_log/shot_group.ex:118
-#, elixir-autogen, elixir-format
-msgid "Count must be less than %{count}"
-msgstr ""
-
#: lib/cannery_web/controllers/user_auth.ex:39
#: lib/cannery_web/controllers/user_auth.ex:161
#, elixir-autogen, elixir-format
@@ -190,3 +184,9 @@ msgstr ""
#, elixir-autogen, elixir-format, fuzzy
msgid "Please select a valid user and ammo pack"
msgstr ""
+
+#: lib/cannery/activity_log/shot_group.ex:83
+#: lib/cannery/activity_log/shot_group.ex:121
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Count must be less than %{count} shots"
+msgstr ""
diff --git a/priv/gettext/en/LC_MESSAGES/prompts.po b/priv/gettext/en/LC_MESSAGES/prompts.po
index cd96e27c..4a8e323a 100644
--- a/priv/gettext/en/LC_MESSAGES/prompts.po
+++ b/priv/gettext/en/LC_MESSAGES/prompts.po
@@ -44,22 +44,22 @@ msgstr ""
msgid "A link to confirm your email change has been sent to the new address."
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:98
-#: lib/cannery_web/live/invite_live/index.html.heex:126
+#: lib/cannery_web/live/invite_live/index.html.heex:99
+#: lib/cannery_web/live/invite_live/index.html.heex:127
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{email}? This action is permanent!"
msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:92
-#: lib/cannery_web/live/container_live/index.html.heex:135
+#: lib/cannery_web/live/container_live/index.html.heex:136
#: lib/cannery_web/live/container_live/show.html.heex:55
-#: lib/cannery_web/live/tag_live/index.html.heex:63
+#: lib/cannery_web/live/tag_live/index.html.heex:62
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}?"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:153
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:75
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:164
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:78
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this ammo?"
msgstr ""
@@ -155,8 +155,8 @@ msgstr ""
msgid "Are you sure you want to unstage this ammo?"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.ex:142
-#: lib/cannery_web/live/range_live/index.html.heex:116
+#: lib/cannery_web/live/ammo_group_live/show.ex:144
+#: lib/cannery_web/live/range_live/index.html.heex:119
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?"
msgstr ""
@@ -236,7 +236,7 @@ msgid_plural "Ammo added successfully"
msgstr[0] ""
msgstr[1] ""
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:90
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:89
#: lib/cannery_web/live/ammo_type_live/show.html.heex:29
#, elixir-autogen, elixir-format, fuzzy
msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!"
@@ -272,12 +272,12 @@ msgstr ""
msgid "%{user_email} deleted succesfully"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:48
+#: lib/cannery_web/live/invite_live/index.html.heex:49
#, elixir-autogen, elixir-format, fuzzy
msgid "Are you sure you want to delete the invite for %{invite_name}?"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:73
+#: lib/cannery_web/live/invite_live/index.html.heex:74
#, elixir-autogen, elixir-format, fuzzy
msgid "Are you sure you want to make %{invite_name} unlimited?"
msgstr ""
diff --git a/priv/gettext/errors.pot b/priv/gettext/errors.pot
index c8ba4b76..1314d3d9 100644
--- a/priv/gettext/errors.pot
+++ b/priv/gettext/errors.pot
@@ -138,17 +138,11 @@ msgstr ""
msgid "Tag could not be added"
msgstr ""
-#: lib/cannery/activity_log/shot_group.ex:122
+#: lib/cannery/activity_log/shot_group.ex:126
#, elixir-autogen, elixir-format
msgid "Count must be at least 1"
msgstr ""
-#: lib/cannery/activity_log/shot_group.ex:82
-#: lib/cannery/activity_log/shot_group.ex:118
-#, elixir-autogen, elixir-format
-msgid "Count must be less than %{count}"
-msgstr ""
-
#: lib/cannery_web/controllers/user_auth.ex:39
#: lib/cannery_web/controllers/user_auth.ex:161
#, elixir-autogen, elixir-format
@@ -189,3 +183,9 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "Please select a valid user and ammo pack"
msgstr ""
+
+#: lib/cannery/activity_log/shot_group.ex:83
+#: lib/cannery/activity_log/shot_group.ex:121
+#, elixir-autogen, elixir-format
+msgid "Count must be less than %{count} shots"
+msgstr ""
diff --git a/priv/gettext/es/LC_MESSAGES/actions.po b/priv/gettext/es/LC_MESSAGES/actions.po
index c741b726..0cff4de0 100644
--- a/priv/gettext/es/LC_MESSAGES/actions.po
+++ b/priv/gettext/es/LC_MESSAGES/actions.po
@@ -169,8 +169,8 @@ msgstr "Preparar munición"
msgid "Why not get some ready to shoot?"
msgstr "¿Por qué no preparar parte para disparar?"
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:101
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:101
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:100
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:107
#: lib/cannery_web/live/range_live/index.html.heex:38
#, elixir-autogen, elixir-format
msgid "Record shots"
@@ -181,7 +181,7 @@ msgstr "Tiros récord"
msgid "Add another container!"
msgstr "¡Añade otro contenedor!"
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:94
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:100
#, elixir-autogen, elixir-format
msgid "Move containers"
msgstr "Mover contenedores"
@@ -191,7 +191,7 @@ msgstr "Mover contenedores"
msgid "Select"
msgstr "Seleccionar"
-#: lib/cannery_web/live/invite_live/index.html.heex:30
+#: lib/cannery_web/live/invite_live/index.html.heex:31
#, elixir-autogen, elixir-format
msgid "Copy to clipboard"
msgstr "Copiar al portapapeles"
@@ -216,7 +216,7 @@ msgstr "Cambiar Lenguaje"
msgid "Change language"
msgstr "Cambiar lenguaje"
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:60
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:59
#, elixir-autogen, elixir-format
msgid "View in Catalog"
msgstr "Ver en Catalogo"
@@ -231,18 +231,18 @@ msgstr "añade primero un tipo de munición"
msgid "Move ammo"
msgstr "Mover munición"
-#: lib/cannery_web/live/invite_live/index.html.heex:78
+#: lib/cannery_web/live/invite_live/index.html.heex:79
#, elixir-autogen, elixir-format
msgid "Set Unlimited"
msgstr "Activar ilimitados"
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:86
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:93
#: lib/cannery_web/live/range_live/index.html.heex:31
#, elixir-autogen, elixir-format
msgid "Stage for range"
msgstr "Preparar para el campo de tiro"
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:85
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:92
#: lib/cannery_web/live/range_live/index.html.heex:30
#, elixir-autogen, elixir-format
msgid "Unstage from range"
diff --git a/priv/gettext/es/LC_MESSAGES/default.po b/priv/gettext/es/LC_MESSAGES/default.po
index b88ec258..5fb6593f 100644
--- a/priv/gettext/es/LC_MESSAGES/default.po
+++ b/priv/gettext/es/LC_MESSAGES/default.po
@@ -19,7 +19,7 @@ msgstr ""
msgid "Access from any internet-capable device"
msgstr "Acceso desde cualquier dispositivo con conexión a internet"
-#: lib/cannery_web/live/invite_live/index.html.heex:87
+#: lib/cannery_web/live/invite_live/index.html.heex:88
#, elixir-autogen, elixir-format
msgid "Admins"
msgstr "Administradores"
@@ -267,7 +267,7 @@ msgid "New Tag"
msgstr "Nueva Etiqueta"
#: lib/cannery_web/live/ammo_group_live/index.html.heex:10
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:71
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:70
#, elixir-autogen, elixir-format
msgid "No Ammo"
msgstr "Sin Munición"
@@ -278,7 +278,7 @@ msgid "No ammo for this type"
msgstr "Sin munición para este tipo"
#: lib/cannery_web/live/container_live/index.html.heex:8
-#: lib/cannery_web/live/container_live/index.html.heex:47
+#: lib/cannery_web/live/container_live/index.html.heex:46
#, elixir-autogen, elixir-format
msgid "No containers"
msgstr "Sin contenedores"
@@ -290,7 +290,7 @@ msgstr "Sin invitaciones"
#: lib/cannery_web/live/container_live/edit_tags_component.html.heex:29
#: lib/cannery_web/live/tag_live/index.html.heex:10
-#: lib/cannery_web/live/tag_live/index.html.heex:43
+#: lib/cannery_web/live/tag_live/index.html.heex:42
#, elixir-autogen, elixir-format
msgid "No tags"
msgstr "Sin etiquetas"
@@ -372,7 +372,7 @@ msgstr "Simple:"
msgid "Steel"
msgstr "Acero"
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:111
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:117
#, elixir-autogen, elixir-format
msgid "Stored in"
msgstr "Guardado en"
@@ -421,7 +421,7 @@ msgstr "Tipo"
msgid "Type:"
msgstr "Tipo:"
-#: lib/cannery_web/live/invite_live/index.html.heex:115
+#: lib/cannery_web/live/invite_live/index.html.heex:116
#, elixir-autogen, elixir-format
msgid "Users"
msgstr "Usuarios"
@@ -488,7 +488,7 @@ msgid "New Shot Records"
msgstr "Nuevos Tiros Récord"
#: lib/cannery_web/live/range_live/index.html.heex:48
-#: lib/cannery_web/live/range_live/index.html.heex:90
+#: lib/cannery_web/live/range_live/index.html.heex:89
#, elixir-autogen, elixir-format
msgid "No shots recorded"
msgstr "No se han grabado tiros"
@@ -513,7 +513,7 @@ msgid "Shot Records"
msgstr "Récords de Tiro"
#: lib/cannery_web/live/ammo_group_live/index.ex:38
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:118
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:117
#, elixir-autogen, elixir-format
msgid "Move ammo"
msgstr "Mover munición"
@@ -593,12 +593,12 @@ msgstr "Contraseña actual"
msgid "New password"
msgstr "Nueva contraseña"
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:94
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:93
#, elixir-autogen, elixir-format
msgid "Stage"
msgstr "Preparar"
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:94
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:93
#, elixir-autogen, elixir-format
msgid "Unstage"
msgstr "Retirar"
@@ -665,7 +665,7 @@ msgstr "Cantidad original:"
msgid "Percentage left:"
msgstr "Pocentaje restante:"
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:124
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:130
#, elixir-autogen, elixir-format
msgid "Rounds used"
msgstr "Balas usadas"
@@ -780,7 +780,7 @@ msgstr "No hay munición en este contenedor"
msgid "Show Ammo"
msgstr "Mostrar Munición"
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:116
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:122
#, elixir-autogen, elixir-format
msgid "This ammo is not in a container"
msgstr "Esta munición no está en un contenedor"
@@ -814,8 +814,8 @@ msgstr ""
msgid "Container:"
msgstr "Contenedor:"
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:64
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:39
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:63
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:38
#: lib/cannery_web/live/ammo_type_live/show.html.heex:153
#: lib/cannery_web/live/container_live/show.html.heex:99
#, elixir-autogen, elixir-format
@@ -846,7 +846,7 @@ msgid "Rounds"
msgstr "Balas"
#: lib/cannery_web/live/ammo_type_live/show.html.heex:159
-#: lib/cannery_web/live/container_live/index.html.heex:39
+#: lib/cannery_web/live/container_live/index.html.heex:38
#: lib/cannery_web/live/container_live/show.html.heex:105
#, elixir-autogen, elixir-format
msgid "View as table"
@@ -1004,7 +1004,9 @@ msgid "Average CPR"
msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:28
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:70
#: lib/cannery_web/live/ammo_type_live/show.ex:120
+#: lib/cannery_web/live/ammo_type_live/show.html.heex:19
#, elixir-autogen, elixir-format
msgid "Edit %{ammo_type_name}"
msgstr "Editar %{ammo_type_name}"
@@ -1083,32 +1085,32 @@ msgid "Edit ammo"
msgstr "Editar munición"
#: lib/cannery_web/live/ammo_type_live/index.html.heex:8
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:46
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:45
#, elixir-autogen, elixir-format, fuzzy
msgid "No Ammo types"
msgstr "Sin tipo de Munición"
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:33
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:32
#, elixir-autogen, elixir-format
msgid "Search catalog"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:58
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:57
#, elixir-autogen, elixir-format, fuzzy
msgid "Search ammo"
msgstr ""
-#: lib/cannery_web/live/container_live/index.html.heex:33
+#: lib/cannery_web/live/container_live/index.html.heex:32
#, elixir-autogen, elixir-format
msgid "Search containers"
msgstr ""
-#: lib/cannery_web/live/tag_live/index.html.heex:36
+#: lib/cannery_web/live/tag_live/index.html.heex:35
#, elixir-autogen, elixir-format, fuzzy
msgid "Search tags"
msgstr ""
-#: lib/cannery_web/live/range_live/index.html.heex:83
+#: lib/cannery_web/live/range_live/index.html.heex:82
#, elixir-autogen, elixir-format
msgid "Search shot records"
msgstr ""
@@ -1182,12 +1184,12 @@ msgstr ""
msgid "Welcome to Cannery"
msgstr "Bienvenide a %{name}"
-#: lib/cannery_web/live/invite_live/index.html.heex:63
+#: lib/cannery_web/live/invite_live/index.html.heex:64
#, elixir-autogen, elixir-format
msgid "Disable"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:63
+#: lib/cannery_web/live/invite_live/index.html.heex:64
#, elixir-autogen, elixir-format
msgid "Enable"
msgstr ""
@@ -1216,3 +1218,108 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "Password"
msgstr ""
+
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:78
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Clone %{ammo_type_name}"
+msgstr "Editar %{ammo_type_name}"
+
+#: lib/cannery_web/live/container_live/index.html.heex:81
+#: lib/cannery_web/live/container_live/index.html.heex:125
+#, elixir-autogen, elixir-format
+msgid "Clone %{container_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:151
+#, elixir-autogen, elixir-format
+msgid "Clone ammo group of %{ammo_group_count} bullets"
+msgstr ""
+
+#: lib/cannery_web/live/invite_live/index.html.heex:29
+#, elixir-autogen, elixir-format
+msgid "Copy invite link for %{invite_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:95
+#: lib/cannery_web/live/ammo_type_live/show.html.heex:35
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Delete %{ammo_type_name}"
+msgstr "Editar %{ammo_type_name}"
+
+#: lib/cannery_web/live/container_live/index.html.heex:94
+#: lib/cannery_web/live/container_live/index.html.heex:138
+#: lib/cannery_web/live/container_live/show.html.heex:57
+#, elixir-autogen, elixir-format
+msgid "Delete %{container_name}"
+msgstr ""
+
+#: lib/cannery_web/live/tag_live/index.html.heex:64
+#, elixir-autogen, elixir-format
+msgid "Delete %{tag_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:166
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:80
+#, elixir-autogen, elixir-format
+msgid "Delete ammo group of %{ammo_group_count} bullets"
+msgstr ""
+
+#: lib/cannery_web/live/invite_live/index.html.heex:53
+#, elixir-autogen, elixir-format
+msgid "Delete invite for %{invite_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/show.ex:146
+#: lib/cannery_web/live/range_live/index.html.heex:122
+#, elixir-autogen, elixir-format
+msgid "Delete shot record of %{shot_group_count} shots"
+msgstr ""
+
+#: lib/cannery_web/live/container_live/index.html.heex:73
+#: lib/cannery_web/live/container_live/index.html.heex:117
+#: lib/cannery_web/live/container_live/show.html.heex:45
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Edit %{container_name}"
+msgstr "Editar %{name}"
+
+#: lib/cannery_web/live/tag_live/index.html.heex:51
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Edit %{tag_name}"
+msgstr "Editar %{name}"
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:139
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:66
+#, elixir-autogen, elixir-format
+msgid "Edit ammo group of %{ammo_group_count} bullets"
+msgstr ""
+
+#: lib/cannery_web/live/invite_live/index.html.heex:38
+#, elixir-autogen, elixir-format
+msgid "Edit invite for %{invite_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/show.ex:133
+#, elixir-autogen, elixir-format
+msgid "Edit shot group of %{shot_group_count} shots"
+msgstr ""
+
+#: lib/cannery_web/live/range_live/index.html.heex:105
+#, elixir-autogen, elixir-format
+msgid "Edit shot record of %{shot_group_count} shots"
+msgstr ""
+
+#: lib/cannery_web/live/container_live/index.html.heex:63
+#: lib/cannery_web/live/container_live/index.html.heex:108
+#, elixir-autogen, elixir-format
+msgid "Tag %{container_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:62
+#, elixir-autogen, elixir-format, fuzzy
+msgid "View %{ammo_type_name}"
+msgstr "Editar %{ammo_type_name}"
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:127
+#, elixir-autogen, elixir-format
+msgid "View ammo group of %{ammo_group_count} bullets"
+msgstr ""
diff --git a/priv/gettext/es/LC_MESSAGES/errors.po b/priv/gettext/es/LC_MESSAGES/errors.po
index b9f261be..0ba8f9d8 100644
--- a/priv/gettext/es/LC_MESSAGES/errors.po
+++ b/priv/gettext/es/LC_MESSAGES/errors.po
@@ -154,17 +154,11 @@ msgstr "Etiqueta no encontrada"
msgid "Tag could not be added"
msgstr "No se ha podido añadir la etiqueta"
-#: lib/cannery/activity_log/shot_group.ex:122
+#: lib/cannery/activity_log/shot_group.ex:126
#, elixir-autogen, elixir-format
msgid "Count must be at least 1"
msgstr "El recuento debe dar al menos 1"
-#: lib/cannery/activity_log/shot_group.ex:82
-#: lib/cannery/activity_log/shot_group.ex:118
-#, elixir-autogen, elixir-format
-msgid "Count must be less than %{count}"
-msgstr "El recuento debe ser menos de %{count}"
-
#: lib/cannery_web/controllers/user_auth.ex:39
#: lib/cannery_web/controllers/user_auth.ex:161
#, elixir-autogen, elixir-format
@@ -205,3 +199,9 @@ msgstr "Su navegador no es compatible con el elemento lienzo."
#, elixir-autogen, elixir-format
msgid "Please select a valid user and ammo pack"
msgstr "Por favor escoja un usuario y tipo de munición valido"
+
+#: lib/cannery/activity_log/shot_group.ex:83
+#: lib/cannery/activity_log/shot_group.ex:121
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Count must be less than %{count} shots"
+msgstr "El recuento debe ser menos de %{count}"
diff --git a/priv/gettext/es/LC_MESSAGES/prompts.po b/priv/gettext/es/LC_MESSAGES/prompts.po
index aad94478..96a09d06 100644
--- a/priv/gettext/es/LC_MESSAGES/prompts.po
+++ b/priv/gettext/es/LC_MESSAGES/prompts.po
@@ -59,22 +59,22 @@ msgstr ""
"Un enlace para confirmar el correo electrónico ha sido enviado a la nueva "
"dirección."
-#: lib/cannery_web/live/invite_live/index.html.heex:98
-#: lib/cannery_web/live/invite_live/index.html.heex:126
+#: lib/cannery_web/live/invite_live/index.html.heex:99
+#: lib/cannery_web/live/invite_live/index.html.heex:127
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{email}? This action is permanent!"
msgstr "Está seguro que desea eliminar %{email}? Esta acción es permanente!"
#: lib/cannery_web/live/container_live/index.html.heex:92
-#: lib/cannery_web/live/container_live/index.html.heex:135
+#: lib/cannery_web/live/container_live/index.html.heex:136
#: lib/cannery_web/live/container_live/show.html.heex:55
-#: lib/cannery_web/live/tag_live/index.html.heex:63
+#: lib/cannery_web/live/tag_live/index.html.heex:62
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}?"
msgstr "Está seguro que desea eliminar %{name}?"
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:153
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:75
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:164
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:78
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this ammo?"
msgstr "Está seguro que desea eliminar esta munición?"
@@ -175,8 +175,8 @@ msgstr "Tiros registrados exitosamente"
msgid "Are you sure you want to unstage this ammo?"
msgstr "Está seguro que desea desmontar esta munición?"
-#: lib/cannery_web/live/ammo_group_live/show.ex:142
-#: lib/cannery_web/live/range_live/index.html.heex:116
+#: lib/cannery_web/live/ammo_group_live/show.ex:144
+#: lib/cannery_web/live/range_live/index.html.heex:119
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?"
msgstr "¿Está segure que quiere borrar este récord de disparos?"
@@ -256,7 +256,7 @@ msgid_plural "Ammo added successfully"
msgstr[0] "Munición añadida exitosamente"
msgstr[1] "Municiones añadidas exitosamente"
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:90
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:89
#: lib/cannery_web/live/ammo_type_live/show.html.heex:29
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!"
@@ -294,12 +294,12 @@ msgstr "%{name} actualizado exitosamente"
msgid "%{user_email} deleted succesfully"
msgstr "%{name} borrado exitosamente"
-#: lib/cannery_web/live/invite_live/index.html.heex:48
+#: lib/cannery_web/live/invite_live/index.html.heex:49
#, elixir-autogen, elixir-format, fuzzy
msgid "Are you sure you want to delete the invite for %{invite_name}?"
msgstr "Está seguro que quiere eliminar la invitación para %{name}?"
-#: lib/cannery_web/live/invite_live/index.html.heex:73
+#: lib/cannery_web/live/invite_live/index.html.heex:74
#, elixir-autogen, elixir-format, fuzzy
msgid "Are you sure you want to make %{invite_name} unlimited?"
msgstr "Está seguro que desea hacer %{name} ilimitado?"
diff --git a/priv/gettext/fr/LC_MESSAGES/actions.po b/priv/gettext/fr/LC_MESSAGES/actions.po
index cad76a46..f3d2c719 100644
--- a/priv/gettext/fr/LC_MESSAGES/actions.po
+++ b/priv/gettext/fr/LC_MESSAGES/actions.po
@@ -169,8 +169,8 @@ msgstr "Munition préparée"
msgid "Why not get some ready to shoot?"
msgstr "Pourquoi pas en préparer pour tirer ?"
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:101
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:101
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:100
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:107
#: lib/cannery_web/live/range_live/index.html.heex:38
#, elixir-autogen, elixir-format
msgid "Record shots"
@@ -181,7 +181,7 @@ msgstr "Enregistrer des tirs"
msgid "Add another container!"
msgstr "Ajoutez un autre conteneur !"
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:94
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:100
#, elixir-autogen, elixir-format
msgid "Move containers"
msgstr "Déplacer les conteneurs"
@@ -191,7 +191,7 @@ msgstr "Déplacer les conteneurs"
msgid "Select"
msgstr "Sélectionner"
-#: lib/cannery_web/live/invite_live/index.html.heex:30
+#: lib/cannery_web/live/invite_live/index.html.heex:31
#, elixir-autogen, elixir-format
msgid "Copy to clipboard"
msgstr "Copier dans le presse-papier"
@@ -216,7 +216,7 @@ msgstr "Changer la langue"
msgid "Change language"
msgstr "Changer la langue"
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:60
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:59
#, elixir-autogen, elixir-format
msgid "View in Catalog"
msgstr "Voir en catalogue"
@@ -231,18 +231,18 @@ msgstr "Ajoutez d'abord un type de munitions"
msgid "Move ammo"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:78
+#: lib/cannery_web/live/invite_live/index.html.heex:79
#, elixir-autogen, elixir-format
msgid "Set Unlimited"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:86
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:93
#: lib/cannery_web/live/range_live/index.html.heex:31
#, elixir-autogen, elixir-format
msgid "Stage for range"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:85
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:92
#: lib/cannery_web/live/range_live/index.html.heex:30
#, elixir-autogen, elixir-format
msgid "Unstage from range"
diff --git a/priv/gettext/fr/LC_MESSAGES/default.po b/priv/gettext/fr/LC_MESSAGES/default.po
index 0a8aa94a..1eb696bb 100644
--- a/priv/gettext/fr/LC_MESSAGES/default.po
+++ b/priv/gettext/fr/LC_MESSAGES/default.po
@@ -19,7 +19,7 @@ msgstr ""
msgid "Access from any internet-capable device"
msgstr "Accédez depuis n’importe quel appareil connecté à internet"
-#: lib/cannery_web/live/invite_live/index.html.heex:87
+#: lib/cannery_web/live/invite_live/index.html.heex:88
#, elixir-autogen, elixir-format
msgid "Admins"
msgstr "Administrateur·ices"
@@ -267,7 +267,7 @@ msgid "New Tag"
msgstr "Nouveau tag"
#: lib/cannery_web/live/ammo_group_live/index.html.heex:10
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:71
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:70
#, elixir-autogen, elixir-format
msgid "No Ammo"
msgstr "Aucune munition"
@@ -278,7 +278,7 @@ msgid "No ammo for this type"
msgstr "Aucune munition pour ce type"
#: lib/cannery_web/live/container_live/index.html.heex:8
-#: lib/cannery_web/live/container_live/index.html.heex:47
+#: lib/cannery_web/live/container_live/index.html.heex:46
#, elixir-autogen, elixir-format
msgid "No containers"
msgstr "Aucun conteneur"
@@ -290,7 +290,7 @@ msgstr "Aucune invitation"
#: lib/cannery_web/live/container_live/edit_tags_component.html.heex:29
#: lib/cannery_web/live/tag_live/index.html.heex:10
-#: lib/cannery_web/live/tag_live/index.html.heex:43
+#: lib/cannery_web/live/tag_live/index.html.heex:42
#, elixir-autogen, elixir-format
msgid "No tags"
msgstr "Aucun tag"
@@ -372,7 +372,7 @@ msgstr "Simple :"
msgid "Steel"
msgstr "Acier"
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:111
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:117
#, elixir-autogen, elixir-format
msgid "Stored in"
msgstr "Est stocké dans"
@@ -422,7 +422,7 @@ msgstr "Type"
msgid "Type:"
msgstr "Type :"
-#: lib/cannery_web/live/invite_live/index.html.heex:115
+#: lib/cannery_web/live/invite_live/index.html.heex:116
#, elixir-autogen, elixir-format
msgid "Users"
msgstr "Utilisateurs"
@@ -489,7 +489,7 @@ msgid "New Shot Records"
msgstr "Nouveaux enregistrements de tir"
#: lib/cannery_web/live/range_live/index.html.heex:48
-#: lib/cannery_web/live/range_live/index.html.heex:90
+#: lib/cannery_web/live/range_live/index.html.heex:89
#, elixir-autogen, elixir-format
msgid "No shots recorded"
msgstr "Aucun tir enregistré"
@@ -514,7 +514,7 @@ msgid "Shot Records"
msgstr "Enregistrements de tir"
#: lib/cannery_web/live/ammo_group_live/index.ex:38
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:118
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:117
#, elixir-autogen, elixir-format
msgid "Move ammo"
msgstr "Déplacer munition"
@@ -594,12 +594,12 @@ msgstr "Mot de passe actuel"
msgid "New password"
msgstr "Nouveau mot de passe"
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:94
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:93
#, elixir-autogen, elixir-format
msgid "Stage"
msgstr "Sélectionné"
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:94
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:93
#, elixir-autogen, elixir-format
msgid "Unstage"
msgstr "Désélectionner"
@@ -666,7 +666,7 @@ msgstr "Nombre original :"
msgid "Percentage left:"
msgstr "Pourcentage restant :"
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:124
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:130
#, elixir-autogen, elixir-format
msgid "Rounds used"
msgstr "Cartouches utilisées"
@@ -781,7 +781,7 @@ msgstr "Aucun groupe de munition pour ce conteneur"
msgid "Show Ammo"
msgstr "Montrer le type de munition"
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:116
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:122
#, elixir-autogen, elixir-format, fuzzy
msgid "This ammo is not in a container"
msgstr "Ce groupe de munition n’est pas dans un conteneur"
@@ -815,8 +815,8 @@ msgstr ""
msgid "Container:"
msgstr "Conteneur"
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:64
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:39
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:63
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:38
#: lib/cannery_web/live/ammo_type_live/show.html.heex:153
#: lib/cannery_web/live/container_live/show.html.heex:99
#, elixir-autogen, elixir-format
@@ -847,7 +847,7 @@ msgid "Rounds"
msgstr "Cartouches :"
#: lib/cannery_web/live/ammo_type_live/show.html.heex:159
-#: lib/cannery_web/live/container_live/index.html.heex:39
+#: lib/cannery_web/live/container_live/index.html.heex:38
#: lib/cannery_web/live/container_live/show.html.heex:105
#, elixir-autogen, elixir-format
msgid "View as table"
@@ -1005,7 +1005,9 @@ msgid "Average CPR"
msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:28
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:70
#: lib/cannery_web/live/ammo_type_live/show.ex:120
+#: lib/cannery_web/live/ammo_type_live/show.html.heex:19
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit %{ammo_type_name}"
msgstr "Éditer %{name}"
@@ -1084,32 +1086,32 @@ msgid "Edit ammo"
msgstr "Éditer le type de munition"
#: lib/cannery_web/live/ammo_type_live/index.html.heex:8
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:46
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:45
#, elixir-autogen, elixir-format, fuzzy
msgid "No Ammo types"
msgstr "Aucun type de munition"
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:33
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:32
#, elixir-autogen, elixir-format
msgid "Search catalog"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:58
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:57
#, elixir-autogen, elixir-format, fuzzy
msgid "Search ammo"
msgstr ""
-#: lib/cannery_web/live/container_live/index.html.heex:33
+#: lib/cannery_web/live/container_live/index.html.heex:32
#, elixir-autogen, elixir-format
msgid "Search containers"
msgstr ""
-#: lib/cannery_web/live/tag_live/index.html.heex:36
+#: lib/cannery_web/live/tag_live/index.html.heex:35
#, elixir-autogen, elixir-format, fuzzy
msgid "Search tags"
msgstr ""
-#: lib/cannery_web/live/range_live/index.html.heex:83
+#: lib/cannery_web/live/range_live/index.html.heex:82
#, elixir-autogen, elixir-format
msgid "Search shot records"
msgstr ""
@@ -1183,12 +1185,12 @@ msgstr ""
msgid "Welcome to Cannery"
msgstr "Bienvenue à %{name}"
-#: lib/cannery_web/live/invite_live/index.html.heex:63
+#: lib/cannery_web/live/invite_live/index.html.heex:64
#, elixir-autogen, elixir-format
msgid "Disable"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:63
+#: lib/cannery_web/live/invite_live/index.html.heex:64
#, elixir-autogen, elixir-format
msgid "Enable"
msgstr ""
@@ -1217,3 +1219,108 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "Password"
msgstr ""
+
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:78
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Clone %{ammo_type_name}"
+msgstr "Éditer %{name}"
+
+#: lib/cannery_web/live/container_live/index.html.heex:81
+#: lib/cannery_web/live/container_live/index.html.heex:125
+#, elixir-autogen, elixir-format
+msgid "Clone %{container_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:151
+#, elixir-autogen, elixir-format
+msgid "Clone ammo group of %{ammo_group_count} bullets"
+msgstr ""
+
+#: lib/cannery_web/live/invite_live/index.html.heex:29
+#, elixir-autogen, elixir-format
+msgid "Copy invite link for %{invite_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:95
+#: lib/cannery_web/live/ammo_type_live/show.html.heex:35
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Delete %{ammo_type_name}"
+msgstr "Éditer %{name}"
+
+#: lib/cannery_web/live/container_live/index.html.heex:94
+#: lib/cannery_web/live/container_live/index.html.heex:138
+#: lib/cannery_web/live/container_live/show.html.heex:57
+#, elixir-autogen, elixir-format
+msgid "Delete %{container_name}"
+msgstr ""
+
+#: lib/cannery_web/live/tag_live/index.html.heex:64
+#, elixir-autogen, elixir-format
+msgid "Delete %{tag_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:166
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:80
+#, elixir-autogen, elixir-format
+msgid "Delete ammo group of %{ammo_group_count} bullets"
+msgstr ""
+
+#: lib/cannery_web/live/invite_live/index.html.heex:53
+#, elixir-autogen, elixir-format
+msgid "Delete invite for %{invite_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/show.ex:146
+#: lib/cannery_web/live/range_live/index.html.heex:122
+#, elixir-autogen, elixir-format
+msgid "Delete shot record of %{shot_group_count} shots"
+msgstr ""
+
+#: lib/cannery_web/live/container_live/index.html.heex:73
+#: lib/cannery_web/live/container_live/index.html.heex:117
+#: lib/cannery_web/live/container_live/show.html.heex:45
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Edit %{container_name}"
+msgstr "Éditer %{name}"
+
+#: lib/cannery_web/live/tag_live/index.html.heex:51
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Edit %{tag_name}"
+msgstr "Éditer %{name}"
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:139
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:66
+#, elixir-autogen, elixir-format
+msgid "Edit ammo group of %{ammo_group_count} bullets"
+msgstr ""
+
+#: lib/cannery_web/live/invite_live/index.html.heex:38
+#, elixir-autogen, elixir-format
+msgid "Edit invite for %{invite_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/show.ex:133
+#, elixir-autogen, elixir-format
+msgid "Edit shot group of %{shot_group_count} shots"
+msgstr ""
+
+#: lib/cannery_web/live/range_live/index.html.heex:105
+#, elixir-autogen, elixir-format
+msgid "Edit shot record of %{shot_group_count} shots"
+msgstr ""
+
+#: lib/cannery_web/live/container_live/index.html.heex:63
+#: lib/cannery_web/live/container_live/index.html.heex:108
+#, elixir-autogen, elixir-format
+msgid "Tag %{container_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:62
+#, elixir-autogen, elixir-format, fuzzy
+msgid "View %{ammo_type_name}"
+msgstr "Éditer %{name}"
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:127
+#, elixir-autogen, elixir-format
+msgid "View ammo group of %{ammo_group_count} bullets"
+msgstr ""
diff --git a/priv/gettext/fr/LC_MESSAGES/errors.po b/priv/gettext/fr/LC_MESSAGES/errors.po
index b5563297..c58a2cb7 100644
--- a/priv/gettext/fr/LC_MESSAGES/errors.po
+++ b/priv/gettext/fr/LC_MESSAGES/errors.po
@@ -153,17 +153,11 @@ msgstr "Tag pas trouvé"
msgid "Tag could not be added"
msgstr "Le tag n’a pas pu être ajouté"
-#: lib/cannery/activity_log/shot_group.ex:122
+#: lib/cannery/activity_log/shot_group.ex:126
#, elixir-autogen, elixir-format
msgid "Count must be at least 1"
msgstr "Le nombre doit être au moins égal à 1"
-#: lib/cannery/activity_log/shot_group.ex:82
-#: lib/cannery/activity_log/shot_group.ex:118
-#, elixir-autogen, elixir-format
-msgid "Count must be less than %{count}"
-msgstr "La quantité doit être inférieur à %{count}"
-
#: lib/cannery_web/controllers/user_auth.ex:39
#: lib/cannery_web/controllers/user_auth.ex:161
#, elixir-autogen, elixir-format
@@ -206,3 +200,9 @@ msgstr ""
#, elixir-autogen, elixir-format, fuzzy
msgid "Please select a valid user and ammo pack"
msgstr "Veuillez choisir un utilisateur valide et un groupe de munitions"
+
+#: lib/cannery/activity_log/shot_group.ex:83
+#: lib/cannery/activity_log/shot_group.ex:121
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Count must be less than %{count} shots"
+msgstr "La quantité doit être inférieur à %{count}"
diff --git a/priv/gettext/fr/LC_MESSAGES/prompts.po b/priv/gettext/fr/LC_MESSAGES/prompts.po
index 8a87ee1b..a2f531fa 100644
--- a/priv/gettext/fr/LC_MESSAGES/prompts.po
+++ b/priv/gettext/fr/LC_MESSAGES/prompts.po
@@ -59,23 +59,23 @@ msgstr ""
"Un lien pour confirmer votre changement de mél a été envoyé à la nouvelle "
"adresse."
-#: lib/cannery_web/live/invite_live/index.html.heex:98
-#: lib/cannery_web/live/invite_live/index.html.heex:126
+#: lib/cannery_web/live/invite_live/index.html.heex:99
+#: lib/cannery_web/live/invite_live/index.html.heex:127
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{email}? This action is permanent!"
msgstr ""
"Êtes-vous certain·e de supprimer %{email} ? Cette action est définitive !"
#: lib/cannery_web/live/container_live/index.html.heex:92
-#: lib/cannery_web/live/container_live/index.html.heex:135
+#: lib/cannery_web/live/container_live/index.html.heex:136
#: lib/cannery_web/live/container_live/show.html.heex:55
-#: lib/cannery_web/live/tag_live/index.html.heex:63
+#: lib/cannery_web/live/tag_live/index.html.heex:62
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}?"
msgstr "Êtes-vous certain·e de supprimer %{name} ?"
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:153
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:75
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:164
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:78
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this ammo?"
msgstr "Êtes-vous certain·e de supprimer cette munition ?"
@@ -177,8 +177,8 @@ msgstr "Tirs enregistré avec succès"
msgid "Are you sure you want to unstage this ammo?"
msgstr "Êtes-vous certain·e de vouloir désélectionner cette munition ?"
-#: lib/cannery_web/live/ammo_group_live/show.ex:142
-#: lib/cannery_web/live/range_live/index.html.heex:116
+#: lib/cannery_web/live/ammo_group_live/show.ex:144
+#: lib/cannery_web/live/range_live/index.html.heex:119
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?"
msgstr "Êtes-vous certain·e de vouloir supprimer cet enregistrement de tir ?"
@@ -258,7 +258,7 @@ msgid_plural "Ammo added successfully"
msgstr[0] "Groupe de munition mis à jour avec succès"
msgstr[1] "Groupe de munition mis à jour avec succès"
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:90
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:89
#: lib/cannery_web/live/ammo_type_live/show.html.heex:29
#, elixir-autogen, elixir-format, fuzzy
msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!"
@@ -294,12 +294,12 @@ msgstr "%{name} mis à jour avec succès"
msgid "%{user_email} deleted succesfully"
msgstr "%{name} supprimé· avec succès"
-#: lib/cannery_web/live/invite_live/index.html.heex:48
+#: lib/cannery_web/live/invite_live/index.html.heex:49
#, elixir-autogen, elixir-format, fuzzy
msgid "Are you sure you want to delete the invite for %{invite_name}?"
msgstr "Êtes-vous certain·e de supprimer l’invitation pour %{name} ?"
-#: lib/cannery_web/live/invite_live/index.html.heex:73
+#: lib/cannery_web/live/invite_live/index.html.heex:74
#, elixir-autogen, elixir-format, fuzzy
msgid "Are you sure you want to make %{invite_name} unlimited?"
msgstr "Êtes-vous certain·e de vouloir rendre %{name} illimité ?"
diff --git a/priv/gettext/ga/LC_MESSAGES/actions.po b/priv/gettext/ga/LC_MESSAGES/actions.po
index 81f9513c..c8c0ff62 100644
--- a/priv/gettext/ga/LC_MESSAGES/actions.po
+++ b/priv/gettext/ga/LC_MESSAGES/actions.po
@@ -167,8 +167,8 @@ msgstr ""
msgid "Why not get some ready to shoot?"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:101
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:101
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:100
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:107
#: lib/cannery_web/live/range_live/index.html.heex:38
#, elixir-autogen, elixir-format
msgid "Record shots"
@@ -179,7 +179,7 @@ msgstr ""
msgid "Add another container!"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:94
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:100
#, elixir-autogen, elixir-format
msgid "Move containers"
msgstr ""
@@ -189,7 +189,7 @@ msgstr ""
msgid "Select"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:30
+#: lib/cannery_web/live/invite_live/index.html.heex:31
#, elixir-autogen, elixir-format
msgid "Copy to clipboard"
msgstr ""
@@ -214,7 +214,7 @@ msgstr ""
msgid "Change language"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:60
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:59
#, elixir-autogen, elixir-format
msgid "View in Catalog"
msgstr ""
@@ -229,18 +229,18 @@ msgstr ""
msgid "Move ammo"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:78
+#: lib/cannery_web/live/invite_live/index.html.heex:79
#, elixir-autogen, elixir-format
msgid "Set Unlimited"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:86
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:93
#: lib/cannery_web/live/range_live/index.html.heex:31
#, elixir-autogen, elixir-format
msgid "Stage for range"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:85
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:92
#: lib/cannery_web/live/range_live/index.html.heex:30
#, elixir-autogen, elixir-format
msgid "Unstage from range"
diff --git a/priv/gettext/ga/LC_MESSAGES/default.po b/priv/gettext/ga/LC_MESSAGES/default.po
index 2584b2b0..5cc84148 100644
--- a/priv/gettext/ga/LC_MESSAGES/default.po
+++ b/priv/gettext/ga/LC_MESSAGES/default.po
@@ -17,7 +17,7 @@ msgstr ""
msgid "Access from any internet-capable device"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:87
+#: lib/cannery_web/live/invite_live/index.html.heex:88
#, elixir-autogen, elixir-format
msgid "Admins"
msgstr ""
@@ -265,7 +265,7 @@ msgid "New Tag"
msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.html.heex:10
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:71
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:70
#, elixir-autogen, elixir-format
msgid "No Ammo"
msgstr ""
@@ -276,7 +276,7 @@ msgid "No ammo for this type"
msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:8
-#: lib/cannery_web/live/container_live/index.html.heex:47
+#: lib/cannery_web/live/container_live/index.html.heex:46
#, elixir-autogen, elixir-format
msgid "No containers"
msgstr ""
@@ -288,7 +288,7 @@ msgstr ""
#: lib/cannery_web/live/container_live/edit_tags_component.html.heex:29
#: lib/cannery_web/live/tag_live/index.html.heex:10
-#: lib/cannery_web/live/tag_live/index.html.heex:43
+#: lib/cannery_web/live/tag_live/index.html.heex:42
#, elixir-autogen, elixir-format
msgid "No tags"
msgstr ""
@@ -368,7 +368,7 @@ msgstr ""
msgid "Steel"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:111
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:117
#, elixir-autogen, elixir-format
msgid "Stored in"
msgstr ""
@@ -416,7 +416,7 @@ msgstr ""
msgid "Type:"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:115
+#: lib/cannery_web/live/invite_live/index.html.heex:116
#, elixir-autogen, elixir-format
msgid "Users"
msgstr ""
@@ -483,7 +483,7 @@ msgid "New Shot Records"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:48
-#: lib/cannery_web/live/range_live/index.html.heex:90
+#: lib/cannery_web/live/range_live/index.html.heex:89
#, elixir-autogen, elixir-format
msgid "No shots recorded"
msgstr ""
@@ -508,7 +508,7 @@ msgid "Shot Records"
msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.ex:38
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:118
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:117
#, elixir-autogen, elixir-format
msgid "Move ammo"
msgstr ""
@@ -588,12 +588,12 @@ msgstr ""
msgid "New password"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:94
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:93
#, elixir-autogen, elixir-format
msgid "Stage"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:94
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:93
#, elixir-autogen, elixir-format
msgid "Unstage"
msgstr ""
@@ -660,7 +660,7 @@ msgstr ""
msgid "Percentage left:"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:124
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:130
#, elixir-autogen, elixir-format
msgid "Rounds used"
msgstr ""
@@ -775,7 +775,7 @@ msgstr ""
msgid "Show Ammo"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:116
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:122
#, elixir-autogen, elixir-format
msgid "This ammo is not in a container"
msgstr ""
@@ -808,8 +808,8 @@ msgstr ""
msgid "Container:"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:64
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:39
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:63
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:38
#: lib/cannery_web/live/ammo_type_live/show.html.heex:153
#: lib/cannery_web/live/container_live/show.html.heex:99
#, elixir-autogen, elixir-format
@@ -840,7 +840,7 @@ msgid "Rounds"
msgstr ""
#: lib/cannery_web/live/ammo_type_live/show.html.heex:159
-#: lib/cannery_web/live/container_live/index.html.heex:39
+#: lib/cannery_web/live/container_live/index.html.heex:38
#: lib/cannery_web/live/container_live/show.html.heex:105
#, elixir-autogen, elixir-format
msgid "View as table"
@@ -998,7 +998,9 @@ msgid "Average CPR"
msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:28
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:70
#: lib/cannery_web/live/ammo_type_live/show.ex:120
+#: lib/cannery_web/live/ammo_type_live/show.html.heex:19
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit %{ammo_type_name}"
msgstr ""
@@ -1077,32 +1079,32 @@ msgid "Edit ammo"
msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.html.heex:8
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:46
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:45
#, elixir-autogen, elixir-format, fuzzy
msgid "No Ammo types"
msgstr ""
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:33
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:32
#, elixir-autogen, elixir-format
msgid "Search catalog"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:58
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:57
#, elixir-autogen, elixir-format, fuzzy
msgid "Search ammo"
msgstr ""
-#: lib/cannery_web/live/container_live/index.html.heex:33
+#: lib/cannery_web/live/container_live/index.html.heex:32
#, elixir-autogen, elixir-format
msgid "Search containers"
msgstr ""
-#: lib/cannery_web/live/tag_live/index.html.heex:36
+#: lib/cannery_web/live/tag_live/index.html.heex:35
#, elixir-autogen, elixir-format, fuzzy
msgid "Search tags"
msgstr ""
-#: lib/cannery_web/live/range_live/index.html.heex:83
+#: lib/cannery_web/live/range_live/index.html.heex:82
#, elixir-autogen, elixir-format
msgid "Search shot records"
msgstr ""
@@ -1174,12 +1176,12 @@ msgstr ""
msgid "Welcome to Cannery"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:63
+#: lib/cannery_web/live/invite_live/index.html.heex:64
#, elixir-autogen, elixir-format
msgid "Disable"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:63
+#: lib/cannery_web/live/invite_live/index.html.heex:64
#, elixir-autogen, elixir-format
msgid "Enable"
msgstr ""
@@ -1208,3 +1210,108 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "Password"
msgstr ""
+
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:78
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Clone %{ammo_type_name}"
+msgstr ""
+
+#: lib/cannery_web/live/container_live/index.html.heex:81
+#: lib/cannery_web/live/container_live/index.html.heex:125
+#, elixir-autogen, elixir-format
+msgid "Clone %{container_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:151
+#, elixir-autogen, elixir-format
+msgid "Clone ammo group of %{ammo_group_count} bullets"
+msgstr ""
+
+#: lib/cannery_web/live/invite_live/index.html.heex:29
+#, elixir-autogen, elixir-format
+msgid "Copy invite link for %{invite_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:95
+#: lib/cannery_web/live/ammo_type_live/show.html.heex:35
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Delete %{ammo_type_name}"
+msgstr ""
+
+#: lib/cannery_web/live/container_live/index.html.heex:94
+#: lib/cannery_web/live/container_live/index.html.heex:138
+#: lib/cannery_web/live/container_live/show.html.heex:57
+#, elixir-autogen, elixir-format
+msgid "Delete %{container_name}"
+msgstr ""
+
+#: lib/cannery_web/live/tag_live/index.html.heex:64
+#, elixir-autogen, elixir-format
+msgid "Delete %{tag_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:166
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:80
+#, elixir-autogen, elixir-format
+msgid "Delete ammo group of %{ammo_group_count} bullets"
+msgstr ""
+
+#: lib/cannery_web/live/invite_live/index.html.heex:53
+#, elixir-autogen, elixir-format
+msgid "Delete invite for %{invite_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/show.ex:146
+#: lib/cannery_web/live/range_live/index.html.heex:122
+#, elixir-autogen, elixir-format
+msgid "Delete shot record of %{shot_group_count} shots"
+msgstr ""
+
+#: lib/cannery_web/live/container_live/index.html.heex:73
+#: lib/cannery_web/live/container_live/index.html.heex:117
+#: lib/cannery_web/live/container_live/show.html.heex:45
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Edit %{container_name}"
+msgstr ""
+
+#: lib/cannery_web/live/tag_live/index.html.heex:51
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Edit %{tag_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:139
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:66
+#, elixir-autogen, elixir-format
+msgid "Edit ammo group of %{ammo_group_count} bullets"
+msgstr ""
+
+#: lib/cannery_web/live/invite_live/index.html.heex:38
+#, elixir-autogen, elixir-format
+msgid "Edit invite for %{invite_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/show.ex:133
+#, elixir-autogen, elixir-format
+msgid "Edit shot group of %{shot_group_count} shots"
+msgstr ""
+
+#: lib/cannery_web/live/range_live/index.html.heex:105
+#, elixir-autogen, elixir-format
+msgid "Edit shot record of %{shot_group_count} shots"
+msgstr ""
+
+#: lib/cannery_web/live/container_live/index.html.heex:63
+#: lib/cannery_web/live/container_live/index.html.heex:108
+#, elixir-autogen, elixir-format
+msgid "Tag %{container_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:62
+#, elixir-autogen, elixir-format, fuzzy
+msgid "View %{ammo_type_name}"
+msgstr ""
+
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:127
+#, elixir-autogen, elixir-format
+msgid "View ammo group of %{ammo_group_count} bullets"
+msgstr ""
diff --git a/priv/gettext/ga/LC_MESSAGES/errors.po b/priv/gettext/ga/LC_MESSAGES/errors.po
index 1d9f660b..00885177 100644
--- a/priv/gettext/ga/LC_MESSAGES/errors.po
+++ b/priv/gettext/ga/LC_MESSAGES/errors.po
@@ -154,17 +154,11 @@ msgstr ""
msgid "Tag could not be added"
msgstr ""
-#: lib/cannery/activity_log/shot_group.ex:122
+#: lib/cannery/activity_log/shot_group.ex:126
#, elixir-autogen, elixir-format
msgid "Count must be at least 1"
msgstr ""
-#: lib/cannery/activity_log/shot_group.ex:82
-#: lib/cannery/activity_log/shot_group.ex:118
-#, elixir-autogen, elixir-format
-msgid "Count must be less than %{count}"
-msgstr ""
-
#: lib/cannery_web/controllers/user_auth.ex:39
#: lib/cannery_web/controllers/user_auth.ex:161
#, elixir-autogen, elixir-format
@@ -205,3 +199,9 @@ msgstr ""
#, elixir-autogen, elixir-format, fuzzy
msgid "Please select a valid user and ammo pack"
msgstr ""
+
+#: lib/cannery/activity_log/shot_group.ex:83
+#: lib/cannery/activity_log/shot_group.ex:121
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Count must be less than %{count} shots"
+msgstr ""
diff --git a/priv/gettext/ga/LC_MESSAGES/prompts.po b/priv/gettext/ga/LC_MESSAGES/prompts.po
index 346062df..4a740245 100644
--- a/priv/gettext/ga/LC_MESSAGES/prompts.po
+++ b/priv/gettext/ga/LC_MESSAGES/prompts.po
@@ -55,22 +55,22 @@ msgstr ""
msgid "A link to confirm your email change has been sent to the new address."
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:98
-#: lib/cannery_web/live/invite_live/index.html.heex:126
+#: lib/cannery_web/live/invite_live/index.html.heex:99
+#: lib/cannery_web/live/invite_live/index.html.heex:127
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{email}? This action is permanent!"
msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:92
-#: lib/cannery_web/live/container_live/index.html.heex:135
+#: lib/cannery_web/live/container_live/index.html.heex:136
#: lib/cannery_web/live/container_live/show.html.heex:55
-#: lib/cannery_web/live/tag_live/index.html.heex:63
+#: lib/cannery_web/live/tag_live/index.html.heex:62
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}?"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:153
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:75
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:164
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:78
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this ammo?"
msgstr ""
@@ -166,8 +166,8 @@ msgstr ""
msgid "Are you sure you want to unstage this ammo?"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.ex:142
-#: lib/cannery_web/live/range_live/index.html.heex:116
+#: lib/cannery_web/live/ammo_group_live/show.ex:144
+#: lib/cannery_web/live/range_live/index.html.heex:119
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?"
msgstr ""
@@ -247,7 +247,7 @@ msgid_plural "Ammo added successfully"
msgstr[0] ""
msgstr[1] ""
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:90
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:89
#: lib/cannery_web/live/ammo_type_live/show.html.heex:29
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!"
@@ -283,12 +283,12 @@ msgstr ""
msgid "%{user_email} deleted succesfully"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:48
+#: lib/cannery_web/live/invite_live/index.html.heex:49
#, elixir-autogen, elixir-format, fuzzy
msgid "Are you sure you want to delete the invite for %{invite_name}?"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:73
+#: lib/cannery_web/live/invite_live/index.html.heex:74
#, elixir-autogen, elixir-format, fuzzy
msgid "Are you sure you want to make %{invite_name} unlimited?"
msgstr ""
diff --git a/priv/gettext/prompts.pot b/priv/gettext/prompts.pot
index d4b5b2b6..a7c3c22e 100644
--- a/priv/gettext/prompts.pot
+++ b/priv/gettext/prompts.pot
@@ -44,22 +44,22 @@ msgstr ""
msgid "A link to confirm your email change has been sent to the new address."
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:98
-#: lib/cannery_web/live/invite_live/index.html.heex:126
+#: lib/cannery_web/live/invite_live/index.html.heex:99
+#: lib/cannery_web/live/invite_live/index.html.heex:127
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{email}? This action is permanent!"
msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:92
-#: lib/cannery_web/live/container_live/index.html.heex:135
+#: lib/cannery_web/live/container_live/index.html.heex:136
#: lib/cannery_web/live/container_live/show.html.heex:55
-#: lib/cannery_web/live/tag_live/index.html.heex:63
+#: lib/cannery_web/live/tag_live/index.html.heex:62
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}?"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/index.html.heex:153
-#: lib/cannery_web/live/ammo_group_live/show.html.heex:75
+#: lib/cannery_web/live/ammo_group_live/index.html.heex:164
+#: lib/cannery_web/live/ammo_group_live/show.html.heex:78
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this ammo?"
msgstr ""
@@ -155,8 +155,8 @@ msgstr ""
msgid "Are you sure you want to unstage this ammo?"
msgstr ""
-#: lib/cannery_web/live/ammo_group_live/show.ex:142
-#: lib/cannery_web/live/range_live/index.html.heex:116
+#: lib/cannery_web/live/ammo_group_live/show.ex:144
+#: lib/cannery_web/live/range_live/index.html.heex:119
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?"
msgstr ""
@@ -236,7 +236,7 @@ msgid_plural "Ammo added successfully"
msgstr[0] ""
msgstr[1] ""
-#: lib/cannery_web/live/ammo_type_live/index.html.heex:90
+#: lib/cannery_web/live/ammo_type_live/index.html.heex:89
#: lib/cannery_web/live/ammo_type_live/show.html.heex:29
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!"
@@ -272,12 +272,12 @@ msgstr ""
msgid "%{user_email} deleted succesfully"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:48
+#: lib/cannery_web/live/invite_live/index.html.heex:49
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete the invite for %{invite_name}?"
msgstr ""
-#: lib/cannery_web/live/invite_live/index.html.heex:73
+#: lib/cannery_web/live/invite_live/index.html.heex:74
#, elixir-autogen, elixir-format
msgid "Are you sure you want to make %{invite_name} unlimited?"
msgstr ""
diff --git a/test/cannery_web/live/ammo_group_live_test.exs b/test/cannery_web/live/ammo_group_live_test.exs
index f8bb4cfa..b035c91f 100644
--- a/test/cannery_web/live/ammo_group_live_test.exs
+++ b/test/cannery_web/live/ammo_group_live_test.exs
@@ -74,7 +74,7 @@ defmodule CanneryWeb.AmmoGroupLiveTest do
assert html =~ ammo_group.ammo_type.name
assert index_live
- |> form("[data-qa=\"ammo_group_search\"]",
+ |> form(~s/form[phx-change="search"]/,
search: %{search_term: ammo_group.ammo_type.name}
)
|> render_change() =~ ammo_group.ammo_type.name
@@ -85,13 +85,13 @@ defmodule CanneryWeb.AmmoGroupLiveTest do
)
refute index_live
- |> form("[data-qa=\"ammo_group_search\"]", search: %{search_term: "something_else"})
+ |> form(~s/form[phx-change="search"]/, search: %{search_term: "something_else"})
|> render_change() =~ ammo_group.ammo_type.name
assert_patch(index_live, Routes.ammo_group_index_path(conn, :search, "something_else"))
assert index_live
- |> form("[data-qa=\"ammo_group_search\"]", search: %{search_term: ""})
+ |> form(~s/form[phx-change="search"]/, search: %{search_term: ""})
|> render_change() =~ ammo_group.ammo_type.name
assert_patch(index_live, Routes.ammo_group_index_path(conn, :index))
@@ -185,7 +185,7 @@ defmodule CanneryWeb.AmmoGroupLiveTest do
{:ok, index_live, _html} = live(conn, Routes.ammo_group_index_path(conn, :index))
assert index_live
- |> element("[data-qa=\"edit-#{ammo_group.id}\"]")
+ |> element(~s/a[aria-label="Edit ammo group of #{ammo_group.count} bullets"]/)
|> render_click() =~
gettext("Edit ammo")
@@ -210,7 +210,7 @@ defmodule CanneryWeb.AmmoGroupLiveTest do
html =
index_live
- |> element("[data-qa=\"clone-#{ammo_group.id}\"]")
+ |> element(~s/a[aria-label="Clone ammo group of #{ammo_group.count} bullets"]/)
|> render_click()
assert html =~ dgettext("actions", "Add Ammo")
@@ -238,7 +238,7 @@ defmodule CanneryWeb.AmmoGroupLiveTest do
html =
index_live
- |> element("[data-qa=\"clone-#{ammo_group.id}\"]")
+ |> element(~s/a[aria-label="Clone ammo group of #{ammo_group.count} bullets"]/)
|> render_click()
assert html =~ dgettext("actions", "Add Ammo")
@@ -265,7 +265,7 @@ defmodule CanneryWeb.AmmoGroupLiveTest do
{:ok, index_live, _html} = live(conn, Routes.ammo_group_index_path(conn, :index))
assert index_live
- |> element("[data-qa=\"delete-#{ammo_group.id}\"]")
+ |> element(~s/a[aria-label="Delete ammo group of #{ammo_group.count} bullets"]/)
|> render_click()
refute has_element?(index_live, "#ammo_group-#{ammo_group.id}")
@@ -309,7 +309,10 @@ defmodule CanneryWeb.AmmoGroupLiveTest do
) <>
"\n"
- html = show_live |> element("[data-qa=\"toggle_show_used\"]") |> render_click()
+ html =
+ show_live
+ |> element(~s/input[type="checkbox"][aria-labelledby="toggle_show_used-label"}]/)
+ |> render_click()
assert html =~ gettext("$%{amount}", amount: 50.00 |> :erlang.float_to_binary(decimals: 2))
@@ -337,7 +340,7 @@ defmodule CanneryWeb.AmmoGroupLiveTest do
{:ok, show_live, _html} = live(conn, Routes.ammo_group_show_path(conn, :show, ammo_group))
assert show_live
- |> element("[data-qa=\"edit\"]")
+ |> element(~s/a[aria-label="Edit ammo group of #{ammo_group.count} bullets"]/)
|> render_click() =~
gettext("Edit Ammo")
@@ -386,7 +389,9 @@ defmodule CanneryWeb.AmmoGroupLiveTest do
%{conn: conn, ammo_group: ammo_group, shot_group: shot_group} do
{:ok, index_live, _html} = live(conn, Routes.ammo_group_show_path(conn, :edit, ammo_group))
- assert index_live |> element("[data-qa=\"edit-#{shot_group.id}\"]") |> render_click() =~
+ assert index_live
+ |> element(~s/a[aria-label="Edit shot group of #{shot_group.count} shots"]/)
+ |> render_click() =~
gettext("Edit Shot Records")
assert_patch(
@@ -413,7 +418,10 @@ defmodule CanneryWeb.AmmoGroupLiveTest do
{:ok, index_live, _html} =
live(conn, Routes.ammo_group_show_path(conn, :edit_shot_group, ammo_group, shot_group))
- assert index_live |> element("[data-qa=\"delete-#{shot_group.id}\"]") |> render_click()
+ assert index_live
+ |> element(~s/a[aria-label="Delete shot record of #{shot_group.count} shots"]/)
+ |> render_click()
+
refute has_element?(index_live, "#shot_group-#{shot_group.id}")
end
end
diff --git a/test/cannery_web/live/ammo_type_live_test.exs b/test/cannery_web/live/ammo_type_live_test.exs
index 28634ccd..9bdca5ff 100644
--- a/test/cannery_web/live/ammo_type_live_test.exs
+++ b/test/cannery_web/live/ammo_type_live_test.exs
@@ -80,7 +80,7 @@ defmodule CanneryWeb.AmmoTypeLiveTest do
assert html =~ ammo_type.bullet_type
assert index_live
- |> form("[data-qa=\"ammo_type_search\"]",
+ |> form(~s/form[phx-change="search"]/,
search: %{search_term: ammo_type.bullet_type}
)
|> render_change() =~ ammo_type.bullet_type
@@ -88,13 +88,13 @@ defmodule CanneryWeb.AmmoTypeLiveTest do
assert_patch(index_live, Routes.ammo_type_index_path(conn, :search, ammo_type.bullet_type))
refute index_live
- |> form("[data-qa=\"ammo_type_search\"]", search: %{search_term: "something_else"})
+ |> form(~s/form[phx-change="search"]/, search: %{search_term: "something_else"})
|> render_change() =~ ammo_type.bullet_type
assert_patch(index_live, Routes.ammo_type_index_path(conn, :search, "something_else"))
assert index_live
- |> form("[data-qa=\"ammo_type_search\"]", search: %{search_term: ""})
+ |> form(~s/form[phx-change="search"]/, search: %{search_term: ""})
|> render_change() =~ ammo_type.bullet_type
assert_patch(index_live, Routes.ammo_type_index_path(conn, :index))
@@ -127,7 +127,7 @@ defmodule CanneryWeb.AmmoTypeLiveTest do
%{conn: conn, current_user: current_user, ammo_type: ammo_type} do
{:ok, index_live, _html} = live(conn, Routes.ammo_type_index_path(conn, :index))
- assert index_live |> element("[data-qa=\"edit-#{ammo_type.id}\"]") |> render_click() =~
+ assert index_live |> element(~s/a[aria-label="Edit #{ammo_type.name}"]/) |> render_click() =~
gettext("Edit %{ammo_type_name}", ammo_type_name: ammo_type.name)
assert_patch(index_live, Routes.ammo_type_index_path(conn, :edit, ammo_type))
@@ -151,7 +151,7 @@ defmodule CanneryWeb.AmmoTypeLiveTest do
%{conn: conn, current_user: current_user, ammo_type: ammo_type} do
{:ok, index_live, _html} = live(conn, Routes.ammo_type_index_path(conn, :index))
- html = index_live |> element("[data-qa=\"clone-#{ammo_type.id}\"]") |> render_click()
+ html = index_live |> element(~s/a[aria-label="Clone #{ammo_type.name}"]/) |> render_click()
assert html =~ gettext("New Ammo type")
assert html =~ "some bullet_type"
@@ -176,7 +176,7 @@ defmodule CanneryWeb.AmmoTypeLiveTest do
%{conn: conn, current_user: current_user, ammo_type: ammo_type} do
{:ok, index_live, _html} = live(conn, Routes.ammo_type_index_path(conn, :index))
- html = index_live |> element("[data-qa=\"clone-#{ammo_type.id}\"]") |> render_click()
+ html = index_live |> element(~s/a[aria-label="Clone #{ammo_type.name}"]/) |> render_click()
assert html =~ gettext("New Ammo type")
assert html =~ "some bullet_type"
@@ -202,7 +202,7 @@ defmodule CanneryWeb.AmmoTypeLiveTest do
test "deletes ammo_type in listing", %{conn: conn, ammo_type: ammo_type} do
{:ok, index_live, _html} = live(conn, Routes.ammo_type_index_path(conn, :index))
- assert index_live |> element("[data-qa=\"delete-#{ammo_type.id}\"]") |> render_click()
+ assert index_live |> element(~s/a[aria-label="Delete #{ammo_type.name}"]/) |> render_click()
refute has_element?(index_live, "#ammo_type-#{ammo_type.id}")
end
end
@@ -220,7 +220,10 @@ defmodule CanneryWeb.AmmoTypeLiveTest do
refute html =~ gettext("Used packs")
refute html =~ gettext("Total ever packs")
- html = index_live |> element("[data-qa=\"toggle_show_used\"]") |> render_click()
+ html =
+ index_live
+ |> element(~s/input[type="checkbox"][aria-labelledby="toggle_show_used-label"}]/)
+ |> render_click()
assert html =~ gettext("Used rounds")
assert html =~ gettext("Total ever rounds")
@@ -234,7 +237,11 @@ defmodule CanneryWeb.AmmoTypeLiveTest do
shot_group_fixture(%{"count" => 5}, current_user, ammo_group)
{:ok, index_live, _html} = live(conn, Routes.ammo_type_index_path(conn, :index))
- html = index_live |> element("[data-qa=\"toggle_show_used\"]") |> render_click()
+
+ html =
+ index_live
+ |> element(~s/input[type="checkbox"][aria-labelledby="toggle_show_used-label"}]/)
+ |> render_click()
assert html =~ "15"
assert html =~ "5"
@@ -258,7 +265,7 @@ defmodule CanneryWeb.AmmoTypeLiveTest do
%{conn: conn, current_user: current_user, ammo_type: %{name: name} = ammo_type} do
{:ok, show_live, _html} = live(conn, Routes.ammo_type_show_path(conn, :show, ammo_type))
- assert show_live |> element("[data-qa=\"edit\"]") |> render_click() =~
+ assert show_live |> element(~s/a[aria-label="Edit #{ammo_type.name}"]/) |> render_click() =~
gettext("Edit %{ammo_type_name}", ammo_type_name: name)
assert_patch(show_live, Routes.ammo_type_show_path(conn, :edit, ammo_type))
@@ -298,7 +305,11 @@ defmodule CanneryWeb.AmmoTypeLiveTest do
%{conn: conn, ammo_type: ammo_type, container: %{name: container_name}} do
{:ok, show_live, _html} = live(conn, Routes.ammo_type_show_path(conn, :show, ammo_type))
- html = show_live |> element("[data-qa=\"toggle_table\"]") |> render_click()
+ html =
+ show_live
+ |> element(~s/input[type="checkbox"][aria-labelledby="toggle_table-label"}]/)
+ |> render_click()
+
assert_patch(show_live, Routes.ammo_type_show_path(conn, :table, ammo_type))
assert html =~ "some ammo group"
@@ -316,7 +327,10 @@ defmodule CanneryWeb.AmmoTypeLiveTest do
assert html =~ dgettext("actions", "Show used")
refute html =~ "some ammo group"
- html = show_live |> element("[data-qa=\"toggle_show_used\"]") |> render_click()
+ html =
+ show_live
+ |> element(~s/input[type="checkbox"][aria-labelledby="toggle_show_used-label"}]/)
+ |> render_click()
assert html =~ "some ammo group"
assert html =~ "Empty"
@@ -327,13 +341,20 @@ defmodule CanneryWeb.AmmoTypeLiveTest do
%{conn: conn, ammo_type: ammo_type, container: %{name: container_name}} do
{:ok, show_live, _html} = live(conn, Routes.ammo_type_show_path(conn, :show, ammo_type))
- html = show_live |> element("[data-qa=\"toggle_table\"]") |> render_click()
+ html =
+ show_live
+ |> element(~s/input[type="checkbox"][aria-labelledby="toggle_table-label"}]/)
+ |> render_click()
+
assert_patch(show_live, Routes.ammo_type_show_path(conn, :table, ammo_type))
assert html =~ dgettext("actions", "Show used")
refute html =~ "some ammo group"
- html = show_live |> element("[data-qa=\"toggle_show_used\"]") |> render_click()
+ html =
+ show_live
+ |> element(~s/input[type="checkbox"][aria-labelledby="toggle_show_used-label"}]/)
+ |> render_click()
assert html =~ "some ammo group"
assert html =~ "Empty"
diff --git a/test/cannery_web/live/container_live_test.exs b/test/cannery_web/live/container_live_test.exs
index 536ec405..20c73042 100644
--- a/test/cannery_web/live/container_live_test.exs
+++ b/test/cannery_web/live/container_live_test.exs
@@ -75,7 +75,10 @@ defmodule CanneryWeb.ContainerLiveTest do
test "lists all containers in table mode", %{conn: conn, container: container} do
{:ok, index_live, _html} = live(conn, Routes.container_index_path(conn, :index))
- html = index_live |> element("[data-qa=\"toggle_table\"]") |> render_click()
+ html =
+ index_live
+ |> element(~s/input[type="checkbox"][aria-labelledby="toggle_table-label"}]/)
+ |> render_click()
assert html =~ gettext("Containers")
assert html =~ container.location
@@ -87,7 +90,7 @@ defmodule CanneryWeb.ContainerLiveTest do
assert html =~ container.location
assert index_live
- |> form("[data-qa=\"container_search\"]",
+ |> form(~s/form[phx-change="search"]/,
search: %{search_term: container.location}
)
|> render_change() =~ container.location
@@ -95,13 +98,13 @@ defmodule CanneryWeb.ContainerLiveTest do
assert_patch(index_live, Routes.container_index_path(conn, :search, container.location))
refute index_live
- |> form("[data-qa=\"container_search\"]", search: %{search_term: "something_else"})
+ |> form(~s/form[phx-change="search"]/, search: %{search_term: "something_else"})
|> render_change() =~ container.location
assert_patch(index_live, Routes.container_index_path(conn, :search, "something_else"))
assert index_live
- |> form("[data-qa=\"container_search\"]", search: %{search_term: ""})
+ |> form(~s/form[phx-change="search"]/, search: %{search_term: ""})
|> render_change() =~ container.location
assert_patch(index_live, Routes.container_index_path(conn, :index))
@@ -136,7 +139,7 @@ defmodule CanneryWeb.ContainerLiveTest do
} do
{:ok, index_live, _html} = live(conn, Routes.container_index_path(conn, :index))
- assert index_live |> element("[data-qa=\"edit-#{container.id}\"]") |> render_click() =~
+ assert index_live |> element(~s/a[aria-label="Edit #{container.name}"]/) |> render_click() =~
gettext("Edit %{name}", name: container.name)
assert_patch(index_live, Routes.container_index_path(conn, :edit, container))
@@ -163,7 +166,7 @@ defmodule CanneryWeb.ContainerLiveTest do
} do
{:ok, index_live, _html} = live(conn, Routes.container_index_path(conn, :index))
- html = index_live |> element("[data-qa=\"clone-#{container.id}\"]") |> render_click()
+ html = index_live |> element(~s/a[aria-label="Clone #{container.name}"]/) |> render_click()
assert html =~ gettext("New Container")
assert html =~ "some location"
@@ -191,7 +194,7 @@ defmodule CanneryWeb.ContainerLiveTest do
} do
{:ok, index_live, _html} = live(conn, Routes.container_index_path(conn, :index))
- assert index_live |> element("[data-qa=\"clone-#{container.id}\"]") |> render_click() =~
+ assert index_live |> element(~s/a[aria-label="Clone #{container.name}"]/) |> render_click() =~
gettext("New Container")
assert_patch(index_live, Routes.container_index_path(conn, :clone, container))
@@ -216,7 +219,7 @@ defmodule CanneryWeb.ContainerLiveTest do
test "deletes container in listing", %{conn: conn, container: container} do
{:ok, index_live, _html} = live(conn, Routes.container_index_path(conn, :index))
- assert index_live |> element("[data-qa=\"delete-#{container.id}\"]") |> render_click()
+ assert index_live |> element(~s/a[aria-label="Delete #{container.name}"]/) |> render_click()
refute has_element?(index_live, "#container-#{container.id}")
end
end
@@ -241,7 +244,7 @@ defmodule CanneryWeb.ContainerLiveTest do
} do
{:ok, show_live, _html} = live(conn, Routes.container_show_path(conn, :show, container))
- assert show_live |> element("[data-qa=\"edit\"]") |> render_click() =~
+ assert show_live |> element(~s/a[aria-label="Edit #{container.name}"]/) |> render_click() =~
gettext("Edit %{name}", name: container.name)
assert_patch(show_live, Routes.container_show_path(conn, :edit, container))
@@ -277,7 +280,10 @@ defmodule CanneryWeb.ContainerLiveTest do
%{conn: conn, ammo_type: %{name: ammo_type_name}, container: container} do
{:ok, show_live, _html} = live(conn, Routes.container_show_path(conn, :show, container))
- html = show_live |> element("[data-qa=\"toggle_table\"]") |> render_click()
+ html =
+ show_live
+ |> element(~s/input[type="checkbox"][aria-labelledby="toggle_table-label"}]/)
+ |> render_click()
assert html =~ ammo_type_name
assert html =~ "some ammo group"
@@ -294,7 +300,10 @@ defmodule CanneryWeb.ContainerLiveTest do
assert html =~ dgettext("actions", "Show used")
refute html =~ "some ammo group"
- html = show_live |> element("[data-qa=\"toggle_show_used\"]") |> render_click()
+ html =
+ show_live
+ |> element(~s/input[type="checkbox"][aria-labelledby="toggle_show_used-label"}]/)
+ |> render_click()
assert html =~ ammo_type_name
assert html =~ "some ammo group"
@@ -305,12 +314,18 @@ defmodule CanneryWeb.ContainerLiveTest do
%{conn: conn, ammo_type: %{name: ammo_type_name}, container: container} do
{:ok, show_live, _html} = live(conn, Routes.container_show_path(conn, :show, container))
- html = show_live |> element("[data-qa=\"toggle_table\"]") |> render_click()
+ html =
+ show_live
+ |> element(~s/input[type="checkbox"][aria-labelledby="toggle_table-label"}]/)
+ |> render_click()
assert html =~ dgettext("actions", "Show used")
refute html =~ "some ammo group"
- html = show_live |> element("[data-qa=\"toggle_show_used\"]") |> render_click()
+ html =
+ show_live
+ |> element(~s/input[type="checkbox"][aria-labelledby="toggle_show_used-label"}]/)
+ |> render_click()
assert html =~ ammo_type_name
assert html =~ "some ammo group"
diff --git a/test/cannery_web/live/invite_live_test.exs b/test/cannery_web/live/invite_live_test.exs
index f82e3905..9a03574f 100644
--- a/test/cannery_web/live/invite_live_test.exs
+++ b/test/cannery_web/live/invite_live_test.exs
@@ -55,7 +55,9 @@ defmodule CanneryWeb.InviteLiveTest do
test "updates invite in listing", %{conn: conn, invite: invite} do
{:ok, index_live, _html} = live(conn, Routes.invite_index_path(conn, :index))
- assert index_live |> element("[data-qa=\"edit-#{invite.id}\"]") |> render_click() =~
+ assert index_live
+ |> element(~s/a[aria-label="Edit invite for #{invite.name}"]/)
+ |> render_click() =~
gettext("Edit Invite")
assert_patch(index_live, Routes.invite_index_path(conn, :edit, invite))
@@ -81,7 +83,10 @@ defmodule CanneryWeb.InviteLiveTest do
test "deletes invite in listing", %{conn: conn, invite: invite} do
{:ok, index_live, _html} = live(conn, Routes.invite_index_path(conn, :index))
- assert index_live |> element("[data-qa=\"delete-#{invite.id}\"]") |> render_click()
+ assert index_live
+ |> element(~s/a[aria-label="Delete invite for #{invite.name}"]/)
+ |> render_click()
+
refute has_element?(index_live, "#invite-#{invite.id}")
end
end
diff --git a/test/cannery_web/live/range_live_test.exs b/test/cannery_web/live/range_live_test.exs
index fd2ed6b8..45768cc3 100644
--- a/test/cannery_web/live/range_live_test.exs
+++ b/test/cannery_web/live/range_live_test.exs
@@ -43,7 +43,7 @@ defmodule CanneryWeb.RangeLiveTest do
assert html =~ shot_group.notes
assert index_live
- |> form("[data-qa=\"shot_group_search\"]",
+ |> form(~s/form[phx-change="search"]/,
search: %{search_term: shot_group.notes}
)
|> render_change() =~ shot_group.notes
@@ -51,13 +51,13 @@ defmodule CanneryWeb.RangeLiveTest do
assert_patch(index_live, Routes.range_index_path(conn, :search, shot_group.notes))
refute index_live
- |> form("[data-qa=\"shot_group_search\"]", search: %{search_term: "something_else"})
+ |> form(~s/form[phx-change="search"]/, search: %{search_term: "something_else"})
|> render_change() =~ shot_group.notes
assert_patch(index_live, Routes.range_index_path(conn, :search, "something_else"))
assert index_live
- |> form("[data-qa=\"shot_group_search\"]", search: %{search_term: ""})
+ |> form(~s/form[phx-change="search"]/, search: %{search_term: ""})
|> render_change() =~ shot_group.notes
assert_patch(index_live, Routes.range_index_path(conn, :index))
@@ -88,7 +88,9 @@ defmodule CanneryWeb.RangeLiveTest do
test "updates shot_group in listing", %{conn: conn, shot_group: shot_group} do
{:ok, index_live, _html} = live(conn, Routes.range_index_path(conn, :index))
- assert index_live |> element("[data-qa=\"edit-#{shot_group.id}\"]") |> render_click() =~
+ assert index_live
+ |> element(~s/a[aria-label="Edit shot record of #{shot_group.count} shots"]/)
+ |> render_click() =~
gettext("Edit Shot Records")
assert_patch(index_live, Routes.range_index_path(conn, :edit, shot_group))
@@ -110,7 +112,10 @@ defmodule CanneryWeb.RangeLiveTest do
test "deletes shot_group in listing", %{conn: conn, shot_group: shot_group} do
{:ok, index_live, _html} = live(conn, Routes.range_index_path(conn, :index))
- assert index_live |> element("[data-qa=\"delete-#{shot_group.id}\"]") |> render_click()
+ assert index_live
+ |> element(~s/a[aria-label="Delete shot record of #{shot_group.count} shots"]/)
+ |> render_click()
+
refute has_element?(index_live, "#shot_group-#{shot_group.id}")
end
end
diff --git a/test/cannery_web/live/tag_live_test.exs b/test/cannery_web/live/tag_live_test.exs
index 17b98073..93d7a73c 100644
--- a/test/cannery_web/live/tag_live_test.exs
+++ b/test/cannery_web/live/tag_live_test.exs
@@ -47,7 +47,7 @@ defmodule CanneryWeb.TagLiveTest do
assert html =~ tag.name
assert index_live
- |> form("[data-qa=\"tag_search\"]",
+ |> form(~s/form[phx-change="search"]/,
search: %{search_term: tag.name}
)
|> render_change() =~ tag.name
@@ -55,13 +55,13 @@ defmodule CanneryWeb.TagLiveTest do
assert_patch(index_live, Routes.tag_index_path(conn, :search, tag.name))
refute index_live
- |> form("[data-qa=\"tag_search\"]", search: %{search_term: "something_else"})
+ |> form(~s/form[phx-change="search"]/, search: %{search_term: "something_else"})
|> render_change() =~ tag.name
assert_patch(index_live, Routes.tag_index_path(conn, :search, "something_else"))
assert index_live
- |> form("[data-qa=\"tag_search\"]", search: %{search_term: ""})
+ |> form(~s/form[phx-change="search"]/, search: %{search_term: ""})
|> render_change() =~ tag.name
assert_patch(index_live, Routes.tag_index_path(conn, :index))
@@ -92,7 +92,7 @@ defmodule CanneryWeb.TagLiveTest do
test "updates tag in listing", %{conn: conn, tag: tag} do
{:ok, index_live, _html} = live(conn, Routes.tag_index_path(conn, :index))
- assert index_live |> element("[data-qa=\"edit-#{tag.id}\"]") |> render_click() =~
+ assert index_live |> element(~s/a[aria-label="Edit #{tag.name}"]/) |> render_click() =~
dgettext("actions", "Edit Tag")
assert_patch(index_live, Routes.tag_index_path(conn, :edit, tag))
@@ -116,7 +116,7 @@ defmodule CanneryWeb.TagLiveTest do
test "deletes tag in listing", %{conn: conn, tag: tag} do
{:ok, index_live, _html} = live(conn, Routes.tag_index_path(conn, :index))
- assert index_live |> element("[data-qa=\"delete-#{tag.id}\"]") |> render_click()
+ assert index_live |> element(~s/a[aria-label="Delete #{tag.name}"]/) |> render_click()
refute has_element?(index_live, "#tag-#{tag.id}")
end
end