Compare commits

...

25 Commits

Author SHA1 Message Date
16155687c9 update translations
Some checks reported errors
continuous-integration/drone/push Build was killed
2022-12-03 22:14:35 -05:00
ef0d644ee3 improve more card styles 2022-12-03 22:09:32 -05:00
faacf80b51 improve container card style 2022-12-03 21:56:14 -05:00
7a7754767f improve tag card style 2022-12-03 21:54:41 -05:00
0894293620 improve code in table components 2022-12-03 21:41:54 -05:00
58b32817ba use shot group table component instead 2022-12-03 21:40:05 -05:00
45da547f62 add search to range index 2022-12-03 21:27:39 -05:00
3ea4b77b67 add search to tag index 2022-12-03 20:35:54 -05:00
d743336868 fixup! add search to container index 2022-12-03 20:26:22 -05:00
c99fbabcaa use container table component instead 2022-12-03 20:23:15 -05:00
95642061db add search to container index 2022-12-03 20:23:12 -05:00
11ef53d1bf add search to ammo groups index 2022-12-03 19:44:57 -05:00
757eca47f7 use ammo type table component instead 2022-12-03 19:35:08 -05:00
7191fe8e4b add search to catalog index 2022-12-03 19:35:00 -05:00
Brea Foga
02253c74ac Translated using Weblate (Spanish)
All checks were successful
continuous-integration/drone/push Build is passing
Currently translated at 100.0% (34 of 34 strings)

Translation: cannery/errors
Translate-URL: https://weblate.bubbletea.dev/projects/cannery/errors/es/
2022-12-01 19:21:30 +00:00
Brea Foga
fa32b2a073 Translated using Weblate (Spanish)
Currently translated at 97.4% (193 of 198 strings)

Translation: cannery/default
Translate-URL: https://weblate.bubbletea.dev/projects/cannery/default/es/
2022-12-01 19:21:30 +00:00
Brea Foga
aa0ea10fa4 Translated using Weblate (Spanish)
All checks were successful
continuous-integration/drone/push Build is passing
Currently translated at 100.0% (42 of 42 strings)

Translation: cannery/actions
Translate-URL: https://weblate.bubbletea.dev/projects/cannery/actions/es/
2022-11-30 19:19:48 +00:00
Brea Foga
72ac611e15 Translated using Weblate (Spanish)
Currently translated at 100.0% (47 of 47 strings)

Translation: cannery/prompts
Translate-URL: https://weblate.bubbletea.dev/projects/cannery/prompts/es/
2022-11-30 19:19:48 +00:00
Hannah Winter
ff0af84d5d Translated using Weblate (Spanish)
Currently translated at 100.0% (15 of 15 strings)

Translation: cannery/emails
Translate-URL: https://weblate.bubbletea.dev/projects/cannery/emails/es/
2022-11-30 19:19:48 +00:00
Brea Foga
851d0954ad Translated using Weblate (Spanish)
Currently translated at 100.0% (15 of 15 strings)

Translation: cannery/emails
Translate-URL: https://weblate.bubbletea.dev/projects/cannery/emails/es/
2022-11-30 19:19:48 +00:00
Brea Foga
ea4336adc5 Translated using Weblate (Spanish)
Currently translated at 100.0% (34 of 34 strings)

Translation: cannery/errors
Translate-URL: https://weblate.bubbletea.dev/projects/cannery/errors/es/
2022-11-30 19:19:48 +00:00
Hannah Winter
fcce6a6f40 Translated using Weblate (Spanish)
Currently translated at 100.0% (34 of 34 strings)

Translation: cannery/errors
Translate-URL: https://weblate.bubbletea.dev/projects/cannery/errors/es/
2022-11-30 19:19:48 +00:00
Brea Foga
4d3085da2a Translated using Weblate (Spanish)
Currently translated at 49.4% (98 of 198 strings)

Translation: cannery/default
Translate-URL: https://weblate.bubbletea.dev/projects/cannery/default/es/
2022-11-30 19:19:48 +00:00
2ec60ba342 fix admin user fixture 2022-11-23 21:14:29 -05:00
e0ac714681 improve changesets and typespecs 2022-11-23 20:46:41 -05:00
80 changed files with 3139 additions and 1943 deletions

View File

@ -1,3 +1,13 @@
# v0.8.0
- Add search to catalog, ammo, container, tag and range index pages
- Tweak urls for catalog, ammo, containers, tags and shot records
- Fix bug with shot group chart not drawing lines between days correctly
- Improve cards across app (make them line up with each other)
- Update translations (thank you Brea!)
# v0.7.2
- Code improvements
# v0.7.1 # v0.7.1
- Fix table component alignment and styling - Fix table component alignment and styling
- Fix toggle button styling - Fix toggle button styling

View File

@ -17,8 +17,8 @@ If you're multilingual, this project can use your translations! Visit
functions as short as possible while keeping variable names descriptive! For functions as short as possible while keeping variable names descriptive! For
instance, use inline `do:` blocks for short functions and make your aliases as instance, use inline `do:` blocks for short functions and make your aliases as
short as possible without introducing ambiguity. short as possible without introducing ambiguity.
- I.e. since there's only one `Changeset` in the app, please alias - I.e. since there's only one `AmmoGroup` in the app, please alias
`Changeset.t(Type.t())` instead of using `Ecto.Changeset.t(Long.Type.t())` `AmmoGroup.t()` instead of using `Cannery.Ammo.AmmoGroup.t()`
- Use pipelines when possible. If only calling a single method, a pipeline isn't - Use pipelines when possible. If only calling a single method, a pipeline isn't
strictly necessary but still encouraged for future modification. strictly necessary but still encouraged for future modification.
- Please add typespecs to your functions! Even your private functions may be - Please add typespecs to your functions! Even your private functions may be

View File

@ -80,6 +80,27 @@ export default {
} }
}) })
}, },
updateChart (el) {
const data = JSON.parse(el.dataset.chartData)
this.el.chart.data = {
datasets: [{
label: el.dataset.label,
data: data.map(({ date, count, label }) => ({
label,
x: date,
y: count
})),
backgroundColor: `${el.dataset.color}77`,
borderColor: el.dataset.color,
fill: true,
borderWidth: 3,
pointBorderWidth: 1
}]
}
this.el.chart.update()
},
mounted () { this.initalizeChart(this.el) }, mounted () { this.initalizeChart(this.el) },
updated () { this.initalizeChart(this.el) } updated () { this.updateChart(this.el) }
} }

View File

@ -23,7 +23,7 @@ defmodule Cannery.Accounts do
nil nil
""" """
@spec get_user_by_email(String.t()) :: User.t() | nil @spec get_user_by_email(email :: String.t()) :: User.t() | nil
def get_user_by_email(email) when is_binary(email), do: Repo.get_by(User, email: email) def get_user_by_email(email) when is_binary(email), do: Repo.get_by(User, email: email)
@doc """ @doc """
@ -38,7 +38,7 @@ defmodule Cannery.Accounts do
nil nil
""" """
@spec get_user_by_email_and_password(String.t(), String.t()) :: @spec get_user_by_email_and_password(email :: String.t(), password :: String.t()) ::
User.t() | nil User.t() | nil
def get_user_by_email_and_password(email, password) def get_user_by_email_and_password(email, password)
when is_binary(email) and is_binary(password) do when is_binary(email) and is_binary(password) do
@ -86,7 +86,7 @@ defmodule Cannery.Accounts do
[%User{}] [%User{}]
""" """
@spec list_users_by_role(:admin | :user) :: [User.t()] @spec list_users_by_role(User.role()) :: [User.t()]
def list_users_by_role(role) do def list_users_by_role(role) do
role = role |> to_string() role = role |> to_string()
Repo.all(from u in User, where: u.role == ^role, order_by: u.email) Repo.all(from u in User, where: u.role == ^role, order_by: u.email)
@ -106,15 +106,21 @@ defmodule Cannery.Accounts do
{:error, %Changeset{}} {:error, %Changeset{}}
""" """
@spec register_user(map()) :: {:ok, User.t()} | {:error, Changeset.t(User.new_user())} @spec register_user(attrs :: map()) :: {:ok, User.t()} | {:error, User.changeset()}
def register_user(attrs) do def register_user(attrs) do
# if no registered users, make first user an admin Multi.new()
role = |> Multi.one(:users_count, from(u in User, select: count(u.id), distinct: true))
if Repo.one!(from u in User, select: count(u.id), distinct: true) == 0, |> Multi.insert(:add_user, fn %{users_count: count} ->
do: "admin", # if no registered users, make first user an admin
else: "user" role = if count == 0, do: "admin", else: "user"
%User{} |> User.registration_changeset(attrs |> Map.put("role", role)) |> Repo.insert() User.registration_changeset(attrs) |> User.role_changeset(role)
end)
|> Repo.transaction()
|> case do
{:ok, %{add_user: user}} -> {:ok, user}
{:error, :add_user, changeset, _changes_so_far} -> {:error, changeset}
end
end end
@doc """ @doc """
@ -126,12 +132,10 @@ defmodule Cannery.Accounts do
%Changeset{data: %User{}} %Changeset{data: %User{}}
""" """
@spec change_user_registration(User.t() | User.new_user()) :: @spec change_user_registration() :: User.changeset()
Changeset.t(User.t() | User.new_user()) @spec change_user_registration(attrs :: map()) :: User.changeset()
@spec change_user_registration(User.t() | User.new_user(), map()) :: def change_user_registration(attrs \\ %{}),
Changeset.t(User.t() | User.new_user()) do: User.registration_changeset(attrs, hash_password: false)
def change_user_registration(user, attrs \\ %{}),
do: User.registration_changeset(user, attrs, hash_password: false)
## Settings ## Settings
@ -144,7 +148,8 @@ defmodule Cannery.Accounts do
%Changeset{data: %User{}} %Changeset{data: %User{}}
""" """
@spec change_user_email(User.t(), map()) :: Changeset.t(User.t()) @spec change_user_email(User.t()) :: User.changeset()
@spec change_user_email(User.t(), attrs :: map()) :: User.changeset()
def change_user_email(user, attrs \\ %{}), do: User.email_changeset(user, attrs) def change_user_email(user, attrs \\ %{}), do: User.email_changeset(user, attrs)
@doc """ @doc """
@ -156,7 +161,7 @@ defmodule Cannery.Accounts do
%Changeset{data: %User{}} %Changeset{data: %User{}}
""" """
@spec change_user_role(User.t(), atom()) :: Changeset.t(User.t()) @spec change_user_role(User.t(), User.role()) :: User.changeset()
def change_user_role(user, role), do: User.role_changeset(user, role) def change_user_role(user, role), do: User.role_changeset(user, role)
@doc """ @doc """
@ -172,8 +177,8 @@ defmodule Cannery.Accounts do
{:error, %Changeset{}} {:error, %Changeset{}}
""" """
@spec apply_user_email(User.t(), String.t(), map()) :: @spec apply_user_email(User.t(), email :: String.t(), attrs :: map()) ::
{:ok, User.t()} | {:error, Changeset.t(User.t())} {:ok, User.t()} | {:error, User.changeset()}
def apply_user_email(user, password, attrs) do def apply_user_email(user, password, attrs) do
user user
|> User.email_changeset(attrs) |> User.email_changeset(attrs)
@ -187,7 +192,7 @@ defmodule Cannery.Accounts do
If the token matches, the user email is updated and the token is deleted. If the token matches, the user email is updated and the token is deleted.
The confirmed_at date is also updated to the current time. The confirmed_at date is also updated to the current time.
""" """
@spec update_user_email(User.t(), String.t()) :: :ok | :error @spec update_user_email(User.t(), token :: String.t()) :: :ok | :error
def update_user_email(user, token) do def update_user_email(user, token) do
context = "change:#{user.email}" context = "change:#{user.email}"
@ -200,7 +205,7 @@ defmodule Cannery.Accounts do
end end
end end
@spec user_email_multi(User.t(), String.t(), String.t()) :: Multi.t() @spec user_email_multi(User.t(), email :: String.t(), context :: String.t()) :: Multi.t()
defp user_email_multi(user, email, context) do defp user_email_multi(user, email, context) do
changeset = user |> User.email_changeset(%{email: email}) |> User.confirm_changeset() changeset = user |> User.email_changeset(%{email: email}) |> User.confirm_changeset()
@ -218,7 +223,8 @@ defmodule Cannery.Accounts do
{:ok, %{to: ..., body: ...}} {:ok, %{to: ..., body: ...}}
""" """
@spec deliver_update_email_instructions(User.t(), String.t(), function) :: Job.t() @spec deliver_update_email_instructions(User.t(), current_email :: String.t(), function) ::
Job.t()
def deliver_update_email_instructions(user, current_email, update_email_url_fun) def deliver_update_email_instructions(user, current_email, update_email_url_fun)
when is_function(update_email_url_fun, 1) do when is_function(update_email_url_fun, 1) do
{encoded_token, user_token} = UserToken.build_email_token(user, "change:#{current_email}") {encoded_token, user_token} = UserToken.build_email_token(user, "change:#{current_email}")
@ -235,7 +241,7 @@ defmodule Cannery.Accounts do
%Changeset{data: %User{}} %Changeset{data: %User{}}
""" """
@spec change_user_password(User.t(), map()) :: Changeset.t(User.t()) @spec change_user_password(User.t(), attrs :: map()) :: User.changeset()
def change_user_password(user, attrs \\ %{}), def change_user_password(user, attrs \\ %{}),
do: User.password_changeset(user, attrs, hash_password: false) do: User.password_changeset(user, attrs, hash_password: false)
@ -251,8 +257,8 @@ defmodule Cannery.Accounts do
{:error, %Changeset{}} {:error, %Changeset{}}
""" """
@spec update_user_password(User.t(), String.t(), map()) :: @spec update_user_password(User.t(), String.t(), attrs :: map()) ::
{:ok, User.t()} | {:error, Changeset.t(User.t())} {:ok, User.t()} | {:error, User.changeset()}
def update_user_password(user, password, attrs) do def update_user_password(user, password, attrs) do
changeset = changeset =
user user
@ -278,7 +284,7 @@ defmodule Cannery.Accounts do
%Changeset{data: %User{}} %Changeset{data: %User{}}
""" """
@spec change_user_locale(User.t()) :: Changeset.t(User.t()) @spec change_user_locale(User.t()) :: User.changeset()
def change_user_locale(%{locale: locale} = user), do: User.locale_changeset(user, locale) def change_user_locale(%{locale: locale} = user), do: User.locale_changeset(user, locale)
@doc """ @doc """
@ -294,7 +300,7 @@ defmodule Cannery.Accounts do
""" """
@spec update_user_locale(User.t(), locale :: String.t()) :: @spec update_user_locale(User.t(), locale :: String.t()) ::
{:ok, User.t()} | {:error, Changeset.t(User.t())} {:ok, User.t()} | {:error, User.changeset()}
def update_user_locale(user, locale), def update_user_locale(user, locale),
do: user |> User.locale_changeset(locale) |> Repo.update() do: user |> User.locale_changeset(locale) |> Repo.update()
@ -310,7 +316,7 @@ defmodule Cannery.Accounts do
%User{} %User{}
""" """
@spec delete_user!(User.t(), User.t()) :: User.t() @spec delete_user!(user_to_delete :: User.t(), User.t()) :: User.t()
def delete_user!(user, %User{role: :admin}), do: user |> Repo.delete!() def delete_user!(user, %User{role: :admin}), do: user |> Repo.delete!()
def delete_user!(%User{id: user_id} = user, %User{id: user_id}), do: user |> Repo.delete!() def delete_user!(%User{id: user_id} = user, %User{id: user_id}), do: user |> Repo.delete!()
@ -329,7 +335,7 @@ defmodule Cannery.Accounts do
@doc """ @doc """
Gets the user with the given signed token. Gets the user with the given signed token.
""" """
@spec get_user_by_session_token(String.t()) :: User.t() @spec get_user_by_session_token(token :: String.t()) :: User.t()
def get_user_by_session_token(token) do def get_user_by_session_token(token) do
{:ok, query} = UserToken.verify_session_token_query(token) {:ok, query} = UserToken.verify_session_token_query(token)
Repo.one(query) Repo.one(query)
@ -338,7 +344,7 @@ defmodule Cannery.Accounts do
@doc """ @doc """
Deletes the signed token with the given context. Deletes the signed token with the given context.
""" """
@spec delete_session_token(String.t()) :: :ok @spec delete_session_token(token :: String.t()) :: :ok
def delete_session_token(token) do def delete_session_token(token) do
Repo.delete_all(UserToken.token_and_context_query(token, "session")) Repo.delete_all(UserToken.token_and_context_query(token, "session"))
:ok :ok
@ -394,7 +400,7 @@ defmodule Cannery.Accounts do
If the token matches, the user account is marked as confirmed If the token matches, the user account is marked as confirmed
and the token is deleted. and the token is deleted.
""" """
@spec confirm_user(String.t()) :: {:ok, User.t()} | atom() @spec confirm_user(token :: String.t()) :: {:ok, User.t()} | :error
def confirm_user(token) do def confirm_user(token) do
with {:ok, query} <- UserToken.verify_email_token_query(token, "confirm"), with {:ok, query} <- UserToken.verify_email_token_query(token, "confirm"),
%User{} = user <- Repo.one(query), %User{} = user <- Repo.one(query),
@ -443,7 +449,7 @@ defmodule Cannery.Accounts do
nil nil
""" """
@spec get_user_by_reset_password_token(String.t()) :: User.t() | nil @spec get_user_by_reset_password_token(token :: String.t()) :: User.t() | nil
def get_user_by_reset_password_token(token) do def get_user_by_reset_password_token(token) do
with {:ok, query} <- UserToken.verify_email_token_query(token, "reset_password"), with {:ok, query} <- UserToken.verify_email_token_query(token, "reset_password"),
%User{} = user <- Repo.one(query) do %User{} = user <- Repo.one(query) do
@ -465,7 +471,8 @@ defmodule Cannery.Accounts do
{:error, %Changeset{}} {:error, %Changeset{}}
""" """
@spec reset_user_password(User.t(), map()) :: {:ok, User.t()} | {:error, Changeset.t(User.t())} @spec reset_user_password(User.t(), attrs :: map()) ::
{:ok, User.t()} | {:error, User.changeset()}
def reset_user_password(user, attrs) do def reset_user_password(user, attrs) do
Multi.new() Multi.new()
|> Multi.update(:user, User.password_changeset(user, attrs)) |> Multi.update(:user, User.password_changeset(user, attrs))

View File

@ -39,7 +39,7 @@ defmodule Cannery.Accounts.User do
password: String.t(), password: String.t(),
hashed_password: String.t(), hashed_password: String.t(),
confirmed_at: NaiveDateTime.t(), confirmed_at: NaiveDateTime.t(),
role: atom(), role: role(),
locale: String.t() | nil, locale: String.t() | nil,
invites: [Invite.t()], invites: [Invite.t()],
inserted_at: NaiveDateTime.t(), inserted_at: NaiveDateTime.t(),
@ -47,6 +47,8 @@ defmodule Cannery.Accounts.User do
} }
@type new_user :: %User{} @type new_user :: %User{}
@type id :: UUID.t() @type id :: UUID.t()
@type changeset :: Changeset.t(t() | new_user())
@type role :: :admin | :user | String.t()
@doc """ @doc """
A user changeset for registration. A user changeset for registration.
@ -65,26 +67,24 @@ defmodule Cannery.Accounts.User do
validations on a LiveView form), this option can be set to `false`. validations on a LiveView form), this option can be set to `false`.
Defaults to `true`. Defaults to `true`.
""" """
@spec registration_changeset(t() | new_user(), attrs :: map()) :: Changeset.t(t() | new_user()) @spec registration_changeset(attrs :: map()) :: changeset()
@spec registration_changeset(t() | new_user(), attrs :: map(), opts :: keyword()) :: @spec registration_changeset(attrs :: map(), opts :: keyword()) :: changeset()
Changeset.t(t() | new_user()) def registration_changeset(attrs, opts \\ []) do
def registration_changeset(user, attrs, opts \\ []) do %User{}
user |> cast(attrs, [:email, :password, :locale])
|> cast(attrs, [:email, :password, :role, :locale])
|> validate_email() |> validate_email()
|> validate_password(opts) |> validate_password(opts)
end end
@doc """ @doc """
A user changeset for role. A user changeset for role.
""" """
@spec role_changeset(t(), role :: atom()) :: Changeset.t(t()) @spec role_changeset(t() | new_user() | changeset(), role()) :: changeset()
def role_changeset(user, role) do def role_changeset(user, role) do
user |> cast(%{"role" => role}, [:role]) user |> cast(%{"role" => role}, [:role])
end end
@spec validate_email(Changeset.t(t() | new_user())) :: Changeset.t(t() | new_user()) @spec validate_email(changeset()) :: changeset()
defp validate_email(changeset) do defp validate_email(changeset) do
changeset changeset
|> validate_required([:email]) |> validate_required([:email])
@ -96,8 +96,8 @@ defmodule Cannery.Accounts.User do
|> unique_constraint(:email) |> unique_constraint(:email)
end end
@spec validate_password(Changeset.t(t() | new_user()), opts :: keyword()) :: @spec validate_password(changeset(), opts :: keyword()) ::
Changeset.t(t() | new_user()) changeset()
defp validate_password(changeset, opts) do defp validate_password(changeset, opts) do
changeset changeset
|> validate_required([:password]) |> validate_required([:password])
@ -108,8 +108,7 @@ defmodule Cannery.Accounts.User do
|> maybe_hash_password(opts) |> maybe_hash_password(opts)
end end
@spec maybe_hash_password(Changeset.t(t() | new_user()), opts :: keyword()) :: @spec maybe_hash_password(changeset(), opts :: keyword()) :: changeset()
Changeset.t(t() | new_user())
defp maybe_hash_password(changeset, opts) do defp maybe_hash_password(changeset, opts) do
hash_password? = Keyword.get(opts, :hash_password, true) hash_password? = Keyword.get(opts, :hash_password, true)
password = get_change(changeset, :password) password = get_change(changeset, :password)
@ -128,7 +127,7 @@ defmodule Cannery.Accounts.User do
It requires the email to change otherwise an error is added. It requires the email to change otherwise an error is added.
""" """
@spec email_changeset(t(), attrs :: map()) :: Changeset.t(t()) @spec email_changeset(t(), attrs :: map()) :: changeset()
def email_changeset(user, attrs) do def email_changeset(user, attrs) do
user user
|> cast(attrs, [:email]) |> cast(attrs, [:email])
@ -151,8 +150,8 @@ defmodule Cannery.Accounts.User do
validations on a LiveView form), this option can be set to `false`. validations on a LiveView form), this option can be set to `false`.
Defaults to `true`. Defaults to `true`.
""" """
@spec password_changeset(t(), attrs :: map()) :: Changeset.t(t()) @spec password_changeset(t(), attrs :: map()) :: changeset()
@spec password_changeset(t(), attrs :: map(), opts :: keyword()) :: Changeset.t(t()) @spec password_changeset(t(), attrs :: map(), opts :: keyword()) :: changeset()
def password_changeset(user, attrs, opts \\ []) do def password_changeset(user, attrs, opts \\ []) do
user user
|> cast(attrs, [:password]) |> cast(attrs, [:password])
@ -163,7 +162,7 @@ defmodule Cannery.Accounts.User do
@doc """ @doc """
Confirms the account by setting `confirmed_at`. Confirms the account by setting `confirmed_at`.
""" """
@spec confirm_changeset(t() | Changeset.t(t())) :: Changeset.t(t()) @spec confirm_changeset(t() | changeset()) :: changeset()
def confirm_changeset(user_or_changeset) do def confirm_changeset(user_or_changeset) do
now = NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second) now = NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second)
user_or_changeset |> change(confirmed_at: now) user_or_changeset |> change(confirmed_at: now)
@ -189,7 +188,7 @@ defmodule Cannery.Accounts.User do
@doc """ @doc """
Validates the current password otherwise adds an error to the changeset. Validates the current password otherwise adds an error to the changeset.
""" """
@spec validate_current_password(Changeset.t(t()), String.t()) :: Changeset.t(t()) @spec validate_current_password(changeset(), String.t()) :: changeset()
def validate_current_password(changeset, password) do def validate_current_password(changeset, password) do
if valid_password?(changeset.data, password), if valid_password?(changeset.data, password),
do: changeset, do: changeset,
@ -199,7 +198,7 @@ defmodule Cannery.Accounts.User do
@doc """ @doc """
A changeset for changing the user's locale A changeset for changing the user's locale
""" """
@spec locale_changeset(t() | Changeset.t(t()), locale :: String.t() | nil) :: Changeset.t(t()) @spec locale_changeset(t() | changeset(), locale :: String.t() | nil) :: changeset()
def locale_changeset(user_or_changeset, locale) do def locale_changeset(user_or_changeset, locale) do
user_or_changeset user_or_changeset
|> cast(%{"locale" => locale}, [:locale]) |> cast(%{"locale" => locale}, [:locale])

View File

@ -5,7 +5,7 @@ defmodule Cannery.ActivityLog do
import Ecto.Query, warn: false import Ecto.Query, warn: false
alias Cannery.{Accounts.User, ActivityLog.ShotGroup, Ammo.AmmoGroup, Repo} alias Cannery.{Accounts.User, ActivityLog.ShotGroup, Ammo.AmmoGroup, Repo}
alias Ecto.{Changeset, Multi} alias Ecto.Multi
@doc """ @doc """
Returns the list of shot_groups. Returns the list of shot_groups.
@ -15,10 +15,50 @@ defmodule Cannery.ActivityLog do
iex> list_shot_groups(%User{id: 123}) iex> list_shot_groups(%User{id: 123})
[%ShotGroup{}, ...] [%ShotGroup{}, ...]
iex> list_shot_groups("cool", %User{id: 123})
[%ShotGroup{notes: "My cool shot group"}, ...]
""" """
@spec list_shot_groups(User.t()) :: [ShotGroup.t()] @spec list_shot_groups(User.t()) :: [ShotGroup.t()]
def list_shot_groups(%User{id: user_id}) do @spec list_shot_groups(search :: nil | String.t(), User.t()) :: [ShotGroup.t()]
Repo.all(from(sg in ShotGroup, where: sg.user_id == ^user_id)) def list_shot_groups(search \\ nil, user)
def list_shot_groups(search, %{id: user_id}) when search |> is_nil() or search == "",
do: Repo.all(from sg in ShotGroup, where: sg.user_id == ^user_id)
def list_shot_groups(search, %{id: user_id}) when search |> is_binary() do
trimmed_search = String.trim(search)
Repo.all(
from sg in ShotGroup,
left_join: ag in assoc(sg, :ammo_group),
left_join: at in assoc(ag, :ammo_type),
where: sg.user_id == ^user_id,
where:
fragment(
"? @@ websearch_to_tsquery('english', ?)",
sg.search,
^trimmed_search
) or
fragment(
"? @@ websearch_to_tsquery('english', ?)",
ag.search,
^trimmed_search
) or
fragment(
"? @@ websearch_to_tsquery('english', ?)",
at.search,
^trimmed_search
),
order_by: {
:desc,
fragment(
"ts_rank_cd(?, websearch_to_tsquery('english', ?), 4)",
sg.search,
^trimmed_search
)
}
)
end end
@doc """ @doc """
@ -58,7 +98,7 @@ defmodule Cannery.ActivityLog do
""" """
@spec create_shot_group(attrs :: map(), User.t(), AmmoGroup.t()) :: @spec create_shot_group(attrs :: map(), User.t(), AmmoGroup.t()) ::
{:ok, ShotGroup.t()} | {:error, Changeset.t(ShotGroup.t()) | nil} {:ok, ShotGroup.t()} | {:error, ShotGroup.changeset() | nil}
def create_shot_group(attrs, user, ammo_group) do def create_shot_group(attrs, user, ammo_group) do
Multi.new() Multi.new()
|> Multi.insert( |> Multi.insert(
@ -99,7 +139,7 @@ defmodule Cannery.ActivityLog do
""" """
@spec update_shot_group(ShotGroup.t(), attrs :: map(), User.t()) :: @spec update_shot_group(ShotGroup.t(), attrs :: map(), User.t()) ::
{:ok, ShotGroup.t()} | {:error, Changeset.t(ShotGroup.t()) | nil} {:ok, ShotGroup.t()} | {:error, ShotGroup.changeset() | nil}
def update_shot_group( def update_shot_group(
%ShotGroup{count: count, user_id: user_id} = shot_group, %ShotGroup{count: count, user_id: user_id} = shot_group,
attrs, attrs,
@ -149,7 +189,7 @@ defmodule Cannery.ActivityLog do
""" """
@spec delete_shot_group(ShotGroup.t(), User.t()) :: @spec delete_shot_group(ShotGroup.t(), User.t()) ::
{:ok, ShotGroup.t()} | {:error, Changeset.t(ShotGroup.t())} {:ok, ShotGroup.t()} | {:error, ShotGroup.changeset()}
def delete_shot_group( def delete_shot_group(
%ShotGroup{user_id: user_id} = shot_group, %ShotGroup{user_id: user_id} = shot_group,
%User{id: user_id} %User{id: user_id}

View File

@ -44,6 +44,7 @@ defmodule Cannery.ActivityLog.ShotGroup do
} }
@type new_shot_group :: %ShotGroup{} @type new_shot_group :: %ShotGroup{}
@type id :: UUID.t() @type id :: UUID.t()
@type changeset :: Changeset.t(t() | new_shot_group())
@doc false @doc false
@spec create_changeset( @spec create_changeset(
@ -51,8 +52,7 @@ defmodule Cannery.ActivityLog.ShotGroup do
User.t() | any(), User.t() | any(),
AmmoGroup.t() | any(), AmmoGroup.t() | any(),
attrs :: map() attrs :: map()
) :: ) :: changeset()
Changeset.t(new_shot_group())
def create_changeset( def create_changeset(
shot_group, shot_group,
%User{id: user_id}, %User{id: user_id},
@ -87,8 +87,7 @@ defmodule Cannery.ActivityLog.ShotGroup do
end end
@doc false @doc false
@spec update_changeset(t() | new_shot_group(), User.t(), attrs :: map()) :: @spec update_changeset(t() | new_shot_group(), User.t(), attrs :: map()) :: changeset()
Changeset.t(t() | new_shot_group())
def update_changeset( def update_changeset(
%ShotGroup{user_id: user_id} = shot_group, %ShotGroup{user_id: user_id} = shot_group,
%User{id: user_id} = user, %User{id: user_id} = user,

View File

@ -20,11 +20,38 @@ defmodule Cannery.Ammo do
iex> list_ammo_types(%User{id: 123}) iex> list_ammo_types(%User{id: 123})
[%AmmoType{}, ...] [%AmmoType{}, ...]
iex> list_ammo_types("cool", %User{id: 123})
[%AmmoType{name: "My cool ammo type"}, ...]
""" """
@spec list_ammo_types(User.t()) :: [AmmoType.t()] @spec list_ammo_types(User.t()) :: [AmmoType.t()]
def list_ammo_types(%User{id: user_id}), @spec list_ammo_types(search :: nil | String.t(), User.t()) :: [AmmoType.t()]
def list_ammo_types(search \\ nil, user)
def list_ammo_types(search, %{id: user_id}) when search |> is_nil() or search == "",
do: Repo.all(from at in AmmoType, where: at.user_id == ^user_id, order_by: at.name) do: Repo.all(from at in AmmoType, where: at.user_id == ^user_id, order_by: at.name)
def list_ammo_types(search, %{id: user_id}) when search |> is_binary() do
trimmed_search = String.trim(search)
Repo.all(
from at in AmmoType,
where: at.user_id == ^user_id,
where:
fragment(
"search @@ websearch_to_tsquery('english', ?)",
^trimmed_search
),
order_by: {
:desc,
fragment(
"ts_rank_cd(search, websearch_to_tsquery('english', ?), 4)",
^trimmed_search
)
}
)
end
@doc """ @doc """
Returns a count of ammo_types. Returns a count of ammo_types.
@ -182,7 +209,7 @@ defmodule Cannery.Ammo do
""" """
@spec create_ammo_type(attrs :: map(), User.t()) :: @spec create_ammo_type(attrs :: map(), User.t()) ::
{:ok, AmmoType.t()} | {:error, Changeset.t(AmmoType.new_ammo_type())} {:ok, AmmoType.t()} | {:error, AmmoType.changeset()}
def create_ammo_type(attrs \\ %{}, %User{} = user), def create_ammo_type(attrs \\ %{}, %User{} = user),
do: %AmmoType{} |> AmmoType.create_changeset(user, attrs) |> Repo.insert() do: %AmmoType{} |> AmmoType.create_changeset(user, attrs) |> Repo.insert()
@ -199,7 +226,7 @@ defmodule Cannery.Ammo do
""" """
@spec update_ammo_type(AmmoType.t(), attrs :: map(), User.t()) :: @spec update_ammo_type(AmmoType.t(), attrs :: map(), User.t()) ::
{:ok, AmmoType.t()} | {:error, Changeset.t(AmmoType.t())} {:ok, AmmoType.t()} | {:error, AmmoType.changeset()}
def update_ammo_type(%AmmoType{user_id: user_id} = ammo_type, attrs, %User{id: user_id}), def update_ammo_type(%AmmoType{user_id: user_id} = ammo_type, attrs, %User{id: user_id}),
do: ammo_type |> AmmoType.update_changeset(attrs) |> Repo.update() do: ammo_type |> AmmoType.update_changeset(attrs) |> Repo.update()
@ -216,7 +243,7 @@ defmodule Cannery.Ammo do
""" """
@spec delete_ammo_type(AmmoType.t(), User.t()) :: @spec delete_ammo_type(AmmoType.t(), User.t()) ::
{:ok, AmmoType.t()} | {:error, Changeset.t(AmmoType.t())} {:ok, AmmoType.t()} | {:error, AmmoType.changeset()}
def delete_ammo_type(%AmmoType{user_id: user_id} = ammo_type, %User{id: user_id}), def delete_ammo_type(%AmmoType{user_id: user_id} = ammo_type, %User{id: user_id}),
do: ammo_type |> Repo.delete() do: ammo_type |> Repo.delete()
@ -394,36 +421,86 @@ defmodule Cannery.Ammo do
end end
@doc """ @doc """
Returns the list of ammo_groups for a user. Returns the list of ammo_groups.
## Examples ## Examples
iex> list_ammo_groups(%User{id: 123}) iex> list_ammo_groups(%User{id: 123})
[%AmmoGroup{}, ...] [%AmmoGroup{}, ...]
iex> list_ammo_groups("cool", true, %User{id: 123})
[%AmmoGroup{notes: "My cool ammo group"}, ...]
""" """
@spec list_ammo_groups(User.t()) :: [AmmoGroup.t()] @spec list_ammo_groups(User.t()) :: [AmmoGroup.t()]
@spec list_ammo_groups(User.t(), include_empty :: boolean()) :: [AmmoGroup.t()] @spec list_ammo_groups(search :: nil | String.t(), User.t()) :: [AmmoGroup.t()]
def list_ammo_groups(user, include_empty \\ false) @spec list_ammo_groups(search :: nil | String.t(), include_empty :: boolean(), User.t()) ::
[AmmoGroup.t()]
def list_ammo_groups(%User{id: user_id}, true = _include_empty) do def list_ammo_groups(search \\ nil, include_empty \\ false, %{id: user_id}) do
Repo.all( from(
from ag in AmmoGroup, ag in AmmoGroup,
left_join: sg in assoc(ag, :shot_groups), as: :ag,
where: ag.user_id == ^user_id, left_join: sg in assoc(ag, :shot_groups),
preload: [shot_groups: sg], as: :sg,
order_by: ag.id join: at in assoc(ag, :ammo_type),
as: :at,
join: c in assoc(ag, :container),
as: :c,
left_join: t in assoc(c, :tags),
as: :t,
where: ag.user_id == ^user_id,
preload: [shot_groups: sg, ammo_type: at, container: {c, tags: t}],
order_by: ag.id
) )
|> list_ammo_groups_include_empty(include_empty)
|> list_ammo_groups_search(search)
|> Repo.all()
end end
def list_ammo_groups(%User{id: user_id}, false = _include_empty) do defp list_ammo_groups_include_empty(query, true), do: query
Repo.all(
from ag in AmmoGroup, defp list_ammo_groups_include_empty(query, false) do
left_join: sg in assoc(ag, :shot_groups), query |> where([ag], not (ag.count == 0))
where: ag.user_id == ^user_id, end
where: not (ag.count == 0),
preload: [shot_groups: sg], defp list_ammo_groups_search(query, nil), do: query
order_by: ag.id defp list_ammo_groups_search(query, ""), do: query
defp list_ammo_groups_search(query, search) do
trimmed_search = String.trim(search)
query
|> where(
[ag: ag, at: at, c: c, t: t],
fragment(
"? @@ websearch_to_tsquery('english', ?)",
ag.search,
^trimmed_search
) or
fragment(
"? @@ websearch_to_tsquery('english', ?)",
at.search,
^trimmed_search
) or
fragment(
"? @@ websearch_to_tsquery('english', ?)",
c.search,
^trimmed_search
) or
fragment(
"? @@ websearch_to_tsquery('english', ?)",
t.search,
^trimmed_search
)
)
|> order_by(
[ag: ag],
desc:
fragment(
"ts_rank_cd(?, websearch_to_tsquery('english', ?), 4)",
ag.search,
^trimmed_search
)
) )
end end
@ -549,7 +626,7 @@ defmodule Cannery.Ammo do
""" """
@spec create_ammo_groups(attrs :: map(), multiplier :: non_neg_integer(), User.t()) :: @spec create_ammo_groups(attrs :: map(), multiplier :: non_neg_integer(), User.t()) ::
{:ok, {count :: non_neg_integer(), [AmmoGroup.t()] | nil}} {:ok, {count :: non_neg_integer(), [AmmoGroup.t()] | nil}}
| {:error, Changeset.t(AmmoGroup.new_ammo_group())} | {:error, AmmoGroup.changeset()}
def create_ammo_groups( def create_ammo_groups(
%{"ammo_type_id" => ammo_type_id, "container_id" => container_id} = attrs, %{"ammo_type_id" => ammo_type_id, "container_id" => container_id} = attrs,
multiplier, multiplier,
@ -628,7 +705,7 @@ defmodule Cannery.Ammo do
""" """
@spec update_ammo_group(AmmoGroup.t(), attrs :: map(), User.t()) :: @spec update_ammo_group(AmmoGroup.t(), attrs :: map(), User.t()) ::
{:ok, AmmoGroup.t()} | {:error, Changeset.t(AmmoGroup.t())} {:ok, AmmoGroup.t()} | {:error, AmmoGroup.changeset()}
def update_ammo_group( def update_ammo_group(
%AmmoGroup{user_id: user_id} = ammo_group, %AmmoGroup{user_id: user_id} = ammo_group,
attrs, attrs,
@ -649,7 +726,7 @@ defmodule Cannery.Ammo do
""" """
@spec delete_ammo_group(AmmoGroup.t(), User.t()) :: @spec delete_ammo_group(AmmoGroup.t(), User.t()) ::
{:ok, AmmoGroup.t()} | {:error, Changeset.t(AmmoGroup.t())} {:ok, AmmoGroup.t()} | {:error, AmmoGroup.changeset()}
def delete_ammo_group(%AmmoGroup{user_id: user_id} = ammo_group, %User{id: user_id}), def delete_ammo_group(%AmmoGroup{user_id: user_id} = ammo_group, %User{id: user_id}),
do: ammo_group |> Repo.delete() do: ammo_group |> Repo.delete()

View File

@ -59,6 +59,7 @@ defmodule Cannery.Ammo.AmmoGroup do
} }
@type new_ammo_group :: %AmmoGroup{} @type new_ammo_group :: %AmmoGroup{}
@type id :: UUID.t() @type id :: UUID.t()
@type changeset :: Changeset.t(t() | new_ammo_group())
@doc false @doc false
@spec create_changeset( @spec create_changeset(
@ -67,7 +68,7 @@ defmodule Cannery.Ammo.AmmoGroup do
Container.t() | nil, Container.t() | nil,
User.t(), User.t(),
attrs :: map() attrs :: map()
) :: Changeset.t(new_ammo_group()) ) :: changeset()
def create_changeset( def create_changeset(
ammo_group, ammo_group,
%AmmoType{id: ammo_type_id}, %AmmoType{id: ammo_type_id},
@ -97,8 +98,7 @@ defmodule Cannery.Ammo.AmmoGroup do
end end
@doc false @doc false
@spec update_changeset(t() | new_ammo_group(), attrs :: map(), User.t()) :: @spec update_changeset(t() | new_ammo_group(), attrs :: map(), User.t()) :: changeset()
Changeset.t(t() | new_ammo_group())
def update_changeset(ammo_group, attrs, user) do def update_changeset(ammo_group, attrs, user) do
ammo_group ammo_group
|> cast(attrs, [:count, :price_paid, :notes, :staged, :purchased_on, :container_id]) |> cast(attrs, [:count, :price_paid, :notes, :staged, :purchased_on, :container_id])
@ -121,8 +121,7 @@ defmodule Cannery.Ammo.AmmoGroup do
This range changeset is used when "using up" ammo groups, and allows for This range changeset is used when "using up" ammo groups, and allows for
updating the count to 0 updating the count to 0
""" """
@spec range_changeset(t() | new_ammo_group(), attrs :: map()) :: @spec range_changeset(t() | new_ammo_group(), attrs :: map()) :: changeset()
Changeset.t(t() | new_ammo_group())
def range_changeset(ammo_group, attrs) do def range_changeset(ammo_group, attrs) do
ammo_group ammo_group
|> cast(attrs, [:count, :staged]) |> cast(attrs, [:count, :staged])

View File

@ -102,6 +102,7 @@ defmodule Cannery.Ammo.AmmoType do
} }
@type new_ammo_type :: %AmmoType{} @type new_ammo_type :: %AmmoType{}
@type id :: UUID.t() @type id :: UUID.t()
@type changeset :: Changeset.t(t() | new_ammo_type())
@spec changeset_fields() :: [atom()] @spec changeset_fields() :: [atom()]
defp changeset_fields, defp changeset_fields,
@ -130,8 +131,7 @@ defmodule Cannery.Ammo.AmmoType do
] ]
@doc false @doc false
@spec create_changeset(new_ammo_type(), User.t(), attrs :: map()) :: @spec create_changeset(new_ammo_type(), User.t(), attrs :: map()) :: changeset()
Changeset.t(new_ammo_type())
def create_changeset(ammo_type, %User{id: user_id}, attrs) do def create_changeset(ammo_type, %User{id: user_id}, attrs) do
ammo_type ammo_type
|> change(user_id: user_id) |> change(user_id: user_id)
@ -140,8 +140,7 @@ defmodule Cannery.Ammo.AmmoType do
end end
@doc false @doc false
@spec update_changeset(t() | new_ammo_type(), attrs :: map()) :: @spec update_changeset(t() | new_ammo_type(), attrs :: map()) :: changeset()
Changeset.t(t() | new_ammo_type())
def update_changeset(ammo_type, attrs) do def update_changeset(ammo_type, attrs) do
ammo_type ammo_type
|> cast(attrs, changeset_fields()) |> cast(attrs, changeset_fields())

View File

@ -17,16 +17,55 @@ defmodule Cannery.Containers do
iex> list_containers(%User{id: 123}) iex> list_containers(%User{id: 123})
[%Container{}, ...] [%Container{}, ...]
iex> list_containers("cool", %User{id: 123})
[%Container{name: "my cool container"}, ...]
""" """
@spec list_containers(User.t()) :: [Container.t()] @spec list_containers(User.t()) :: [Container.t()]
def list_containers(%User{id: user_id}) do @spec list_containers(search :: nil | String.t(), User.t()) :: [Container.t()]
Repo.all( def list_containers(search \\ nil, %User{id: user_id}) do
from c in Container, from(c in Container,
left_join: t in assoc(c, :tags), as: :c,
left_join: ag in assoc(c, :ammo_groups), left_join: t in assoc(c, :tags),
where: c.user_id == ^user_id, as: :t,
order_by: c.name, left_join: ag in assoc(c, :ammo_groups),
preload: [tags: t, ammo_groups: ag] as: :ag,
where: c.user_id == ^user_id,
order_by: c.name,
preload: [tags: t, ammo_groups: ag]
)
|> list_containers_search(search)
|> Repo.all()
end
defp list_containers_search(query, nil), do: query
defp list_containers_search(query, ""), do: query
defp list_containers_search(query, search) do
trimmed_search = String.trim(search)
query
|> where(
[c: c, t: t],
fragment(
"? @@ websearch_to_tsquery('english', ?)",
c.search,
^trimmed_search
) or
fragment(
"? @@ websearch_to_tsquery('english', ?)",
t.search,
^trimmed_search
)
)
|> order_by(
[c: c],
desc:
fragment(
"ts_rank_cd(?, websearch_to_tsquery('english', ?), 4)",
c.search,
^trimmed_search
)
) )
end end
@ -89,7 +128,7 @@ defmodule Cannery.Containers do
""" """
@spec create_container(attrs :: map(), User.t()) :: @spec create_container(attrs :: map(), User.t()) ::
{:ok, Container.t()} | {:error, Changeset.t(Container.new_container())} {:ok, Container.t()} | {:error, Container.changeset()}
def create_container(attrs, %User{} = user) do def create_container(attrs, %User{} = user) do
%Container{} |> Container.create_changeset(user, attrs) |> Repo.insert() %Container{} |> Container.create_changeset(user, attrs) |> Repo.insert()
end end
@ -107,7 +146,7 @@ defmodule Cannery.Containers do
""" """
@spec update_container(Container.t(), User.t(), attrs :: map()) :: @spec update_container(Container.t(), User.t(), attrs :: map()) ::
{:ok, Container.t()} | {:error, Changeset.t(Container.t())} {:ok, Container.t()} | {:error, Container.changeset()}
def update_container(%Container{user_id: user_id} = container, %User{id: user_id}, attrs) do def update_container(%Container{user_id: user_id} = container, %User{id: user_id}, attrs) do
container |> Container.update_changeset(attrs) |> Repo.update() container |> Container.update_changeset(attrs) |> Repo.update()
end end
@ -125,7 +164,7 @@ defmodule Cannery.Containers do
""" """
@spec delete_container(Container.t(), User.t()) :: @spec delete_container(Container.t(), User.t()) ::
{:ok, Container.t()} | {:error, Changeset.t(Container.t())} {:ok, Container.t()} | {:error, Container.changeset()}
def delete_container(%Container{user_id: user_id} = container, %User{id: user_id}) do def delete_container(%Container{user_id: user_id} = container, %User{id: user_id}) do
Repo.one( Repo.one(
from ag in AmmoGroup, from ag in AmmoGroup,

View File

@ -49,10 +49,10 @@ defmodule Cannery.Containers.Container do
} }
@type new_container :: %Container{} @type new_container :: %Container{}
@type id :: UUID.t() @type id :: UUID.t()
@type changeset :: Changeset.t(t() | new_container())
@doc false @doc false
@spec create_changeset(new_container(), User.t(), attrs :: map()) :: @spec create_changeset(new_container(), User.t(), attrs :: map()) :: changeset()
Changeset.t(new_container())
def create_changeset(container, %User{id: user_id}, attrs) do def create_changeset(container, %User{id: user_id}, attrs) do
container container
|> change(user_id: user_id) |> change(user_id: user_id)
@ -61,8 +61,7 @@ defmodule Cannery.Containers.Container do
end end
@doc false @doc false
@spec update_changeset(t() | new_container(), attrs :: map()) :: @spec update_changeset(t() | new_container(), attrs :: map()) :: changeset()
Changeset.t(t() | new_container())
def update_changeset(container, attrs) do def update_changeset(container, attrs) do
container container
|> cast(attrs, [:name, :desc, :type, :location]) |> cast(attrs, [:name, :desc, :type, :location])

View File

@ -29,10 +29,10 @@ defmodule Cannery.Containers.ContainerTag do
} }
@type new_container_tag :: %ContainerTag{} @type new_container_tag :: %ContainerTag{}
@type id :: UUID.t() @type id :: UUID.t()
@type changeset :: Changeset.t(t() | new_container_tag())
@doc false @doc false
@spec create_changeset(new_container_tag(), Tag.t(), Container.t()) :: @spec create_changeset(new_container_tag(), Tag.t(), Container.t()) :: changeset()
Changeset.t(new_container_tag())
def create_changeset( def create_changeset(
container_tag, container_tag,
%Tag{id: tag_id, user_id: user_id}, %Tag{id: tag_id, user_id: user_id},

View File

@ -5,7 +5,6 @@ defmodule Cannery.Invites do
import Ecto.Query, warn: false import Ecto.Query, warn: false
alias Cannery.{Accounts.User, Invites.Invite, Repo} alias Cannery.{Accounts.User, Invites.Invite, Repo}
alias Ecto.Changeset
@invite_token_length 20 @invite_token_length 20
@ -99,14 +98,14 @@ defmodule Cannery.Invites do
""" """
@spec create_invite(User.t(), attrs :: map()) :: @spec create_invite(User.t(), attrs :: map()) ::
{:ok, Invite.t()} | {:error, Changeset.t(Invite.new_invite())} {:ok, Invite.t()} | {:error, Invite.changeset()}
def create_invite(%User{role: :admin} = user, attrs) do def create_invite(%User{role: :admin} = user, attrs) do
token = token =
:crypto.strong_rand_bytes(@invite_token_length) :crypto.strong_rand_bytes(@invite_token_length)
|> Base.url_encode64() |> Base.url_encode64()
|> binary_part(0, @invite_token_length) |> binary_part(0, @invite_token_length)
%Invite{} |> Invite.create_changeset(user, token, attrs) |> Repo.insert() Invite.create_changeset(user, token, attrs) |> Repo.insert()
end end
@doc """ @doc """
@ -122,7 +121,7 @@ defmodule Cannery.Invites do
""" """
@spec update_invite(Invite.t(), attrs :: map(), User.t()) :: @spec update_invite(Invite.t(), attrs :: map(), User.t()) ::
{:ok, Invite.t()} | {:error, Changeset.t(Invite.t())} {:ok, Invite.t()} | {:error, Invite.changeset()}
def update_invite(invite, attrs, %User{role: :admin}), def update_invite(invite, attrs, %User{role: :admin}),
do: invite |> Invite.update_changeset(attrs) |> Repo.update() do: invite |> Invite.update_changeset(attrs) |> Repo.update()
@ -139,7 +138,7 @@ defmodule Cannery.Invites do
""" """
@spec delete_invite(Invite.t(), User.t()) :: @spec delete_invite(Invite.t(), User.t()) ::
{:ok, Invite.t()} | {:error, Changeset.t(Invite.t())} {:ok, Invite.t()} | {:error, Invite.changeset()}
def delete_invite(invite, %User{role: :admin}), do: invite |> Repo.delete() def delete_invite(invite, %User{role: :admin}), do: invite |> Repo.delete()
@doc """ @doc """

View File

@ -36,12 +36,12 @@ defmodule Cannery.Invites.Invite do
} }
@type new_invite :: %Invite{} @type new_invite :: %Invite{}
@type id :: UUID.t() @type id :: UUID.t()
@type changeset :: Changeset.t(t() | new_invite())
@doc false @doc false
@spec create_changeset(new_invite(), User.t(), token :: binary(), attrs :: map()) :: @spec create_changeset(User.t(), token :: binary(), attrs :: map()) :: changeset()
Changeset.t(new_invite()) def create_changeset(%User{id: user_id}, token, attrs) do
def create_changeset(invite, %User{id: user_id}, token, attrs) do %Invite{}
invite
|> change(token: token, user_id: user_id) |> change(token: token, user_id: user_id)
|> cast(attrs, [:name, :uses_left, :disabled_at]) |> cast(attrs, [:name, :uses_left, :disabled_at])
|> validate_required([:name, :token, :user_id]) |> validate_required([:name, :token, :user_id])
@ -49,7 +49,7 @@ defmodule Cannery.Invites.Invite do
end end
@doc false @doc false
@spec update_changeset(t() | new_invite(), attrs :: map()) :: Changeset.t(t() | new_invite()) @spec update_changeset(t() | new_invite(), attrs :: map()) :: changeset()
def update_changeset(invite, attrs) do def update_changeset(invite, attrs) do
invite invite
|> cast(attrs, [:name, :uses_left, :disabled_at]) |> cast(attrs, [:name, :uses_left, :disabled_at])

View File

@ -6,7 +6,6 @@ defmodule Cannery.Tags do
import Ecto.Query, warn: false import Ecto.Query, warn: false
import CanneryWeb.Gettext import CanneryWeb.Gettext
alias Cannery.{Accounts.User, Repo, Tags.Tag} alias Cannery.{Accounts.User, Repo, Tags.Tag}
alias Ecto.Changeset
@doc """ @doc """
Returns the list of tags. Returns the list of tags.
@ -16,11 +15,38 @@ defmodule Cannery.Tags do
iex> list_tags(%User{id: 123}) iex> list_tags(%User{id: 123})
[%Tag{}, ...] [%Tag{}, ...]
iex> list_tags("cool", %User{id: 123})
[%Tag{name: "my cool tag"}, ...]
""" """
@spec list_tags(User.t()) :: [Tag.t()] @spec list_tags(User.t()) :: [Tag.t()]
def list_tags(%{id: user_id}), @spec list_tags(search :: nil | String.t(), User.t()) :: [Tag.t()]
def list_tags(search \\ nil, user)
def list_tags(search, %{id: user_id}) when search |> is_nil() or search == "",
do: Repo.all(from t in Tag, where: t.user_id == ^user_id, order_by: t.name) do: Repo.all(from t in Tag, where: t.user_id == ^user_id, order_by: t.name)
def list_tags(search, %{id: user_id}) when search |> is_binary() do
trimmed_search = String.trim(search)
Repo.all(
from t in Tag,
where: t.user_id == ^user_id,
where:
fragment(
"search @@ websearch_to_tsquery('english', ?)",
^trimmed_search
),
order_by: {
:desc,
fragment(
"ts_rank_cd(search, websearch_to_tsquery('english', ?), 4)",
^trimmed_search
)
}
)
end
@doc """ @doc """
Gets a single tag. Gets a single tag.
@ -73,7 +99,7 @@ defmodule Cannery.Tags do
""" """
@spec create_tag(attrs :: map(), User.t()) :: @spec create_tag(attrs :: map(), User.t()) ::
{:ok, Tag.t()} | {:error, Changeset.t(Tag.new_tag())} {:ok, Tag.t()} | {:error, Tag.changeset()}
def create_tag(attrs, %User{} = user), def create_tag(attrs, %User{} = user),
do: %Tag{} |> Tag.create_changeset(user, attrs) |> Repo.insert() do: %Tag{} |> Tag.create_changeset(user, attrs) |> Repo.insert()
@ -90,7 +116,7 @@ defmodule Cannery.Tags do
""" """
@spec update_tag(Tag.t(), attrs :: map(), User.t()) :: @spec update_tag(Tag.t(), attrs :: map(), User.t()) ::
{:ok, Tag.t()} | {:error, Changeset.t(Tag.t())} {:ok, Tag.t()} | {:error, Tag.changeset()}
def update_tag(%Tag{user_id: user_id} = tag, attrs, %User{id: user_id}), def update_tag(%Tag{user_id: user_id} = tag, attrs, %User{id: user_id}),
do: tag |> Tag.update_changeset(attrs) |> Repo.update() do: tag |> Tag.update_changeset(attrs) |> Repo.update()
@ -106,7 +132,7 @@ defmodule Cannery.Tags do
{:error, %Changeset{}} {:error, %Changeset{}}
""" """
@spec delete_tag(Tag.t(), User.t()) :: {:ok, Tag.t()} | {:error, Changeset.t(Tag.t())} @spec delete_tag(Tag.t(), User.t()) :: {:ok, Tag.t()} | {:error, Tag.changeset()}
def delete_tag(%Tag{user_id: user_id} = tag, %User{id: user_id}), do: tag |> Repo.delete() def delete_tag(%Tag{user_id: user_id} = tag, %User{id: user_id}), do: tag |> Repo.delete()
@doc """ @doc """

View File

@ -40,9 +40,10 @@ defmodule Cannery.Tags.Tag do
} }
@type new_tag() :: %Tag{} @type new_tag() :: %Tag{}
@type id() :: UUID.t() @type id() :: UUID.t()
@type changeset() :: Changeset.t(t() | new_tag())
@doc false @doc false
@spec create_changeset(new_tag(), User.t(), attrs :: map()) :: Changeset.t(new_tag()) @spec create_changeset(new_tag(), User.t(), attrs :: map()) :: changeset()
def create_changeset(tag, %User{id: user_id}, attrs) do def create_changeset(tag, %User{id: user_id}, attrs) do
tag tag
|> change(user_id: user_id) |> change(user_id: user_id)
@ -51,7 +52,7 @@ defmodule Cannery.Tags.Tag do
end end
@doc false @doc false
@spec update_changeset(t() | new_tag(), attrs :: map()) :: Changeset.t(t() | new_tag()) @spec update_changeset(t() | new_tag(), attrs :: map()) :: changeset()
def update_changeset(tag, attrs) do def update_changeset(tag, attrs) do
tag tag
|> cast(attrs, [:name, :bg_color, :text_color]) |> cast(attrs, [:name, :bg_color, :text_color])

View File

@ -104,6 +104,7 @@ defmodule CanneryWeb do
# credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse # credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse
import CanneryWeb.{ErrorHelpers, Gettext, LiveHelpers, ViewHelpers} import CanneryWeb.{ErrorHelpers, Gettext, LiveHelpers, ViewHelpers}
alias CanneryWeb.Endpoint
alias CanneryWeb.Router.Helpers, as: Routes alias CanneryWeb.Router.Helpers, as: Routes
end end
end end

View File

@ -89,19 +89,20 @@ defmodule CanneryWeb.Components.AmmoGroupTableComponent do
[%{label: gettext("Ammo type"), key: :ammo_type} | columns] [%{label: gettext("Ammo type"), key: :ammo_type} | columns]
end end
extra_data = %{
current_user: current_user,
ammo_type: ammo_type,
columns: columns,
container: container,
actions: actions,
range: range
}
rows = rows =
ammo_groups ammo_groups
|> Repo.preload([:ammo_type, :container]) |> Repo.preload([:ammo_type, :container])
|> Enum.map(fn ammo_group -> |> Enum.map(fn ammo_group ->
ammo_group ammo_group |> get_row_data_for_ammo_group(extra_data)
|> get_row_data_for_ammo_group(%{
current_user: current_user,
ammo_type: ammo_type,
columns: columns,
container: container,
actions: actions,
range: range
})
end) end)
socket |> assign(columns: columns, rows: rows) socket |> assign(columns: columns, rows: rows)

View File

@ -0,0 +1,209 @@
defmodule CanneryWeb.Components.AmmoTypeTableComponent do
@moduledoc """
A component that displays a list of ammo type
"""
use CanneryWeb, :live_component
alias Cannery.{Accounts.User, Ammo, Ammo.AmmoType}
alias Ecto.UUID
alias Phoenix.LiveView.{Rendered, Socket}
@impl true
@spec update(
%{
required(:id) => UUID.t(),
required(:current_user) => User.t(),
optional(:show_used) => boolean(),
optional(:ammo_types) => [AmmoType.t()],
optional(:actions) => Rendered.t(),
optional(any()) => any()
},
Socket.t()
) :: {:ok, Socket.t()}
def update(%{id: _id, ammo_types: _ammo_types, current_user: _current_user} = assigns, socket) do
socket =
socket
|> assign(assigns)
|> assign_new(:show_used, fn -> false end)
|> assign_new(:actions, fn -> [] end)
|> display_ammo_types()
{:ok, socket}
end
defp display_ammo_types(
%{
assigns: %{
ammo_types: ammo_types,
current_user: current_user,
show_used: show_used,
actions: actions
}
} = socket
) do
columns =
[
%{label: gettext("Name"), key: :name, type: :name},
%{label: gettext("Bullet type"), key: :bullet_type, type: :string},
%{label: gettext("Bullet core"), key: :bullet_core, type: :string},
%{label: gettext("Cartridge"), key: :cartridge, type: :string},
%{label: gettext("Caliber"), key: :caliber, type: :string},
%{label: gettext("Case material"), key: :case_material, type: :string},
%{label: gettext("Jacket type"), key: :jacket_type, type: :string},
%{label: gettext("Muzzle velocity"), key: :muzzle_velocity, type: :string},
%{label: gettext("Powder type"), key: :powder_type, type: :string},
%{
label: gettext("Powder grains per charge"),
key: :powder_grains_per_charge,
type: :string
},
%{label: gettext("Grains"), key: :grains, type: :string},
%{label: gettext("Pressure"), key: :pressure, type: :string},
%{label: gettext("Primer type"), key: :primer_type, type: :string},
%{label: gettext("Firing type"), key: :firing_type, type: :string},
%{label: gettext("Tracer"), key: :tracer, type: :boolean},
%{label: gettext("Incendiary"), key: :incendiary, type: :boolean},
%{label: gettext("Blank"), key: :blank, type: :boolean},
%{label: gettext("Corrosive"), key: :corrosive, type: :boolean},
%{label: gettext("Manufacturer"), key: :manufacturer, type: :string},
%{label: gettext("UPC"), key: "upc", type: :string}
]
|> Enum.filter(fn %{key: key, type: type} ->
# remove columns if all values match defaults
default_value = if type == :boolean, do: false, else: nil
ammo_types
|> Enum.any?(fn ammo_type ->
not (ammo_type |> Map.get(key) == default_value)
end)
end)
|> Kernel.++([
%{label: gettext("Rounds"), key: :round_count, type: :round_count}
])
|> Kernel.++(
if show_used do
[
%{
label: gettext("Used rounds"),
key: :used_round_count,
type: :used_round_count
},
%{
label: gettext("Total ever rounds"),
key: :historical_round_count,
type: :historical_round_count
}
]
else
[]
end
)
|> Kernel.++([%{label: gettext("Packs"), key: :ammo_count, type: :ammo_count}])
|> Kernel.++(
if show_used do
[
%{
label: gettext("Used packs"),
key: :used_ammo_count,
type: :used_ammo_count
},
%{
label: gettext("Total ever packs"),
key: :historical_ammo_count,
type: :historical_ammo_count
}
]
else
[]
end
)
|> Kernel.++([
%{label: gettext("Average CPR"), key: :avg_price_paid, type: :avg_price_paid},
%{label: nil, key: "actions", type: :actions, sortable: false}
])
extra_data = %{actions: actions, current_user: current_user}
rows =
ammo_types
|> Enum.map(fn ammo_type ->
ammo_type |> get_ammo_type_values(columns, extra_data)
end)
socket |> assign(columns: columns, rows: rows)
end
@impl true
def render(assigns) do
~H"""
<div id={@id} class="w-full">
<.live_component
module={CanneryWeb.Components.TableComponent}
id={"table-#{@id}"}
columns={@columns}
rows={@rows}
/>
</div>
"""
end
defp get_ammo_type_values(ammo_type, columns, extra_data) do
columns
|> Map.new(fn %{key: key, type: type} ->
{key, get_ammo_type_value(type, key, ammo_type, extra_data)}
end)
end
defp get_ammo_type_value(:boolean, key, ammo_type, _other_data),
do: ammo_type |> Map.get(key) |> humanize()
defp get_ammo_type_value(:round_count, _key, ammo_type, %{current_user: current_user}),
do: ammo_type |> Ammo.get_round_count_for_ammo_type(current_user)
defp get_ammo_type_value(:historical_round_count, _key, ammo_type, %{current_user: current_user}),
do: ammo_type |> Ammo.get_historical_count_for_ammo_type(current_user)
defp get_ammo_type_value(:used_round_count, _key, ammo_type, %{current_user: current_user}),
do: ammo_type |> Ammo.get_used_count_for_ammo_type(current_user)
defp get_ammo_type_value(:historical_ammo_count, _key, ammo_type, %{current_user: current_user}),
do: ammo_type |> Ammo.get_ammo_groups_count_for_type(current_user, true)
defp get_ammo_type_value(:used_ammo_count, _key, ammo_type, %{current_user: current_user}),
do: ammo_type |> Ammo.get_used_ammo_groups_count_for_type(current_user)
defp get_ammo_type_value(:ammo_count, _key, ammo_type, %{current_user: current_user}),
do: ammo_type |> Ammo.get_ammo_groups_count_for_type(current_user)
defp get_ammo_type_value(:avg_price_paid, _key, ammo_type, %{current_user: current_user}) do
case ammo_type |> Ammo.get_average_cost_for_ammo_type!(current_user) do
nil -> gettext("No cost information")
count -> gettext("$%{amount}", amount: count |> :erlang.float_to_binary(decimals: 2))
end
end
defp get_ammo_type_value(:name, _key, ammo_type, _other_data) 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}"}
>
<%= @ammo_type.name %>
</.link>
"""
end
defp get_ammo_type_value(:actions, _key, ammo_type, %{actions: actions}) do
assigns = %{actions: actions, ammo_type: ammo_type}
~H"""
<%= render_slot(@actions, @ammo_type) %>
"""
end
defp get_ammo_type_value(nil, _key, _ammo_type, _other_data), do: nil
defp get_ammo_type_value(_other, key, ammo_type, _other_data), do: ammo_type |> Map.get(key)
end

View File

@ -23,7 +23,7 @@ defmodule CanneryWeb.Components.ContainerCard do
~H""" ~H"""
<div <div
id={"container-#{@container.id}"} id={"container-#{@container.id}"}
class="overflow-hidden max-w-full mx-4 my-2 px-8 py-4 flex flex-col justify-center items-center space-y-4 class="overflow-hidden max-w-full mx-4 mb-4 px-8 py-4 flex flex-col justify-center items-center space-y-4
border border-gray-400 rounded-lg shadow-lg hover:shadow-md border border-gray-400 rounded-lg shadow-lg hover:shadow-md
transition-all duration-300 ease-in-out" transition-all duration-300 ease-in-out"
> >

View File

@ -0,0 +1,158 @@
defmodule CanneryWeb.Components.ContainerTableComponent do
@moduledoc """
A component that displays a list of containers
"""
use CanneryWeb, :live_component
alias Cannery.{Accounts.User, Containers, Containers.Container, Repo}
alias CanneryWeb.Components.TagCard
alias Ecto.UUID
alias Phoenix.LiveView.{Rendered, Socket}
@impl true
@spec update(
%{
required(:id) => UUID.t(),
required(:current_user) => User.t(),
optional(:containers) => [Container.t()],
optional(:tag_actions) => Rendered.t(),
optional(:actions) => Rendered.t(),
optional(any()) => any()
},
Socket.t()
) :: {:ok, Socket.t()}
def update(%{id: _id, containers: _containers, current_user: _current_user} = assigns, socket) do
socket =
socket
|> assign(assigns)
|> assign_new(:tag_actions, fn -> [] end)
|> assign_new(:actions, fn -> [] end)
|> display_containers()
{:ok, socket}
end
defp display_containers(
%{
assigns: %{
containers: containers,
current_user: current_user,
tag_actions: tag_actions,
actions: actions
}
} = socket
) do
columns =
[
%{label: gettext("Name"), key: :name, type: :string},
%{label: gettext("Description"), key: :desc, type: :string},
%{label: gettext("Location"), key: :location, type: :string},
%{label: gettext("Type"), key: :type, type: :string},
%{label: gettext("Packs"), key: :packs, type: :integer},
%{label: gettext("Rounds"), key: :rounds, type: :string},
%{label: gettext("Tags"), key: :tags, type: :tags},
%{label: nil, key: :actions, sortable: false, type: :actions}
]
|> Enum.filter(fn %{key: key, type: type} ->
# remove columns if all values match defaults
default_value =
case type do
:boolean -> false
_other_type -> nil
end
containers
|> Enum.any?(fn container ->
type in [:tags, :actions] or not (container |> Map.get(key) == default_value)
end)
end)
extra_data = %{
current_user: current_user,
tag_actions: tag_actions,
actions: actions
}
rows =
containers
|> Enum.map(fn container ->
container |> get_row_data_for_container(columns, extra_data)
end)
socket
|> assign(
columns: columns,
rows: rows
)
end
@impl true
def render(assigns) do
~H"""
<div id={@id} class="w-full">
<.live_component
module={CanneryWeb.Components.TableComponent}
id={"table-#{@id}"}
columns={@columns}
rows={@rows}
/>
</div>
"""
end
@spec get_row_data_for_container(Container.t(), columns :: [map()], extra_data :: map) :: map()
defp get_row_data_for_container(container, columns, extra_data) do
container = container |> Repo.preload([:ammo_groups, :tags])
columns
|> Map.new(fn %{key: key} -> {key, get_value_for_key(key, container, extra_data)} end)
end
@spec get_value_for_key(atom(), Container.t(), extra_data :: map) :: any()
defp get_value_for_key(:name, %{id: id, name: container_name}, _extra_data) do
assigns = %{id: id, container_name: container_name}
{container_name,
~H"""
<div class="flex flex-wrap justify-center items-center">
<.link navigate={Routes.container_show_path(Endpoint, :show, @id)} class="link">
<%= @container_name %>
</.link>
</div>
"""}
end
defp get_value_for_key(:packs, container, _extra_data) do
container |> Containers.get_container_ammo_group_count!()
end
defp get_value_for_key(:rounds, container, _extra_data) do
container |> Containers.get_container_rounds!()
end
defp get_value_for_key(:tags, container, %{tag_actions: tag_actions}) do
assigns = %{tag_actions: tag_actions, container: container}
{container.tags |> Enum.map(fn %{name: name} -> name end),
~H"""
<div class="flex flex-wrap justify-center items-center">
<%= unless @container.tags |> Enum.empty?() do %>
<%= for tag <- @container.tags do %>
<TagCard.simple_tag_card tag={tag} />
<% end %>
<% end %>
<%= render_slot(@tag_actions, @container) %>
</div>
"""}
end
defp get_value_for_key(:actions, container, %{actions: actions}) do
assigns = %{actions: actions, container: container}
~H"""
<%= render_slot(@actions, @container) %>
"""
end
defp get_value_for_key(key, container, _extra_data), do: container |> Map.get(key)
end

View File

@ -0,0 +1,117 @@
defmodule CanneryWeb.Components.ShotGroupTableComponent do
@moduledoc """
A component that displays a list of shot groups
"""
use CanneryWeb, :live_component
alias Cannery.{Accounts.User, ActivityLog.ShotGroup, Repo}
alias Ecto.UUID
alias Phoenix.LiveView.{Rendered, Socket}
@impl true
@spec update(
%{
required(:id) => UUID.t(),
required(:current_user) => User.t(),
optional(:shot_groups) => [ShotGroup.t()],
optional(:actions) => Rendered.t(),
optional(any()) => any()
},
Socket.t()
) :: {:ok, Socket.t()}
def update(%{id: _id, shot_groups: _shot_groups, current_user: _current_user} = assigns, socket) do
socket =
socket
|> assign(assigns)
|> assign_new(:actions, fn -> [] end)
|> display_shot_groups()
{:ok, socket}
end
defp display_shot_groups(
%{
assigns: %{
shot_groups: shot_groups,
current_user: current_user,
actions: actions
}
} = socket
) do
columns = [
%{label: gettext("Ammo"), key: :name},
%{label: gettext("Rounds shot"), key: :count},
%{label: gettext("Notes"), key: :notes},
%{label: gettext("Date"), key: :date},
%{label: nil, key: :actions, sortable: false}
]
extra_data = %{current_user: current_user, actions: actions}
rows =
shot_groups
|> Enum.map(fn shot_group ->
shot_group |> get_row_data_for_shot_group(columns, extra_data)
end)
socket
|> assign(
columns: columns,
rows: rows
)
end
@impl true
def render(assigns) do
~H"""
<div id={@id} class="w-full">
<.live_component
module={CanneryWeb.Components.TableComponent}
id={"table-#{@id}"}
columns={@columns}
rows={@rows}
initial_key={:date}
initial_sort_mode={:desc}
/>
</div>
"""
end
@spec get_row_data_for_shot_group(ShotGroup.t(), columns :: [map()], extra_data :: map()) ::
map()
defp get_row_data_for_shot_group(shot_group, columns, extra_data) do
shot_group = shot_group |> Repo.preload(ammo_group: :ammo_type)
columns
|> Map.new(fn %{key: key} ->
{key, get_row_value(key, shot_group, extra_data)}
end)
end
defp get_row_value(
:name,
%{ammo_group: %{ammo_type: %{name: ammo_type_name} = ammo_group}},
_extra_data
) do
assigns = %{ammo_group: ammo_group, ammo_type_name: ammo_type_name}
name_block = ~H"""
<.link navigate={Routes.ammo_group_show_path(Endpoint, :show, @ammo_group)} class="link">
<%= @ammo_type_name %>
</.link>
"""
{ammo_type_name, name_block}
end
defp get_row_value(:date, %{date: date}, _extra_data), do: date |> display_date()
defp get_row_value(:actions, shot_group, %{actions: actions}) do
assigns = %{actions: actions, shot_group: shot_group}
~H"""
<%= render_slot(@actions, @shot_group) %>
"""
end
defp get_row_value(key, shot_group, _extra_data), do: shot_group |> Map.get(key)
end

View File

@ -13,7 +13,7 @@ defmodule CanneryWeb.Components.TagCard do
~H""" ~H"""
<div <div
id={"tag-#{@tag.id}"} id={"tag-#{@tag.id}"}
class="mx-4 my-2 px-8 py-4 space-x-4 flex justify-center items-center class="mx-4 mb-4 px-8 py-4 space-x-4 flex justify-center items-center
border border-gray-400 rounded-lg shadow-lg hover:shadow-md border border-gray-400 rounded-lg shadow-lg hover:shadow-md
transition-all duration-300 ease-in-out" transition-all duration-300 ease-in-out"
> >

View File

@ -23,7 +23,7 @@ defmodule CanneryWeb.ExportController do
end) end)
ammo_groups = ammo_groups =
Ammo.list_ammo_groups(current_user, true) Ammo.list_ammo_groups(nil, true, current_user)
|> Enum.map(fn ammo_group -> |> Enum.map(fn ammo_group ->
cpr = ammo_group |> Ammo.get_cpr() cpr = ammo_group |> Ammo.get_cpr()
used_count = ammo_group |> Ammo.get_used_count() used_count = ammo_group |> Ammo.get_used_count()

View File

@ -2,7 +2,6 @@ defmodule CanneryWeb.UserRegistrationController do
use CanneryWeb, :controller use CanneryWeb, :controller
import CanneryWeb.Gettext import CanneryWeb.Gettext
alias Cannery.{Accounts, Invites} alias Cannery.{Accounts, Invites}
alias Cannery.Accounts.User
alias CanneryWeb.{Endpoint, HomeLive} alias CanneryWeb.{Endpoint, HomeLive}
def new(conn, %{"invite" => invite_token}) do def new(conn, %{"invite" => invite_token}) do
@ -30,7 +29,7 @@ defmodule CanneryWeb.UserRegistrationController do
# renders new user registration page # renders new user registration page
defp render_new(conn, invite \\ nil) do defp render_new(conn, invite \\ nil) do
render(conn, "new.html", render(conn, "new.html",
changeset: Accounts.change_user_registration(%User{}), changeset: Accounts.change_user_registration(),
invite: invite, invite: invite,
page_title: gettext("Register") page_title: gettext("Register")
) )

View File

@ -4,12 +4,15 @@ defmodule CanneryWeb.AmmoGroupLive.Index do
""" """
use CanneryWeb, :live_view use CanneryWeb, :live_view
alias Cannery.{Ammo, Ammo.AmmoGroup, Containers, Repo} alias Cannery.{Ammo, Ammo.AmmoGroup, Containers}
alias CanneryWeb.Endpoint
@impl true @impl true
def mount(%{"search" => search}, _session, socket) do
{:ok, socket |> assign(show_used: false, search: search) |> display_ammo_groups()}
end
def mount(_params, _session, socket) do def mount(_params, _session, socket) do
{:ok, socket |> assign(show_used: false)} {:ok, socket |> assign(show_used: false, search: nil) |> display_ammo_groups()}
end end
@impl true @impl true
@ -23,38 +26,60 @@ defmodule CanneryWeb.AmmoGroupLive.Index do
%{"id" => id} %{"id" => id}
) do ) do
socket socket
|> assign(:page_title, gettext("Record shots")) |> assign(
|> assign(:ammo_group, Ammo.get_ammo_group!(id, current_user)) page_title: gettext("Record shots"),
ammo_group: Ammo.get_ammo_group!(id, current_user)
)
end end
defp apply_action(%{assigns: %{current_user: current_user}} = socket, :move, %{"id" => id}) do defp apply_action(%{assigns: %{current_user: current_user}} = socket, :move, %{"id" => id}) do
socket socket
|> assign(:page_title, gettext("Move ammo")) |> assign(
|> assign(:ammo_group, Ammo.get_ammo_group!(id, current_user)) page_title: gettext("Move ammo"),
ammo_group: Ammo.get_ammo_group!(id, current_user)
)
end end
defp apply_action(%{assigns: %{current_user: current_user}} = socket, :edit, %{"id" => id}) do defp apply_action(%{assigns: %{current_user: current_user}} = socket, :edit, %{"id" => id}) do
socket socket
|> assign(:page_title, gettext("Edit ammo")) |> assign(
|> assign(:ammo_group, Ammo.get_ammo_group!(id, current_user)) page_title: gettext("Edit ammo"),
ammo_group: Ammo.get_ammo_group!(id, current_user)
)
end end
defp apply_action(%{assigns: %{current_user: current_user}} = socket, :clone, %{"id" => id}) do defp apply_action(%{assigns: %{current_user: current_user}} = socket, :clone, %{"id" => id}) do
socket socket
|> assign(:page_title, dgettext("actions", "Add Ammo")) |> assign(
|> assign(:ammo_group, %{Ammo.get_ammo_group!(id, current_user) | id: nil}) page_title: dgettext("actions", "Add Ammo"),
ammo_group: %{Ammo.get_ammo_group!(id, current_user) | id: nil}
)
end end
defp apply_action(socket, :new, _params) do defp apply_action(socket, :new, _params) do
socket socket
|> assign(:page_title, dgettext("actions", "Add Ammo")) |> assign(
|> assign(:ammo_group, %AmmoGroup{}) page_title: dgettext("actions", "Add Ammo"),
ammo_group: %AmmoGroup{}
)
end end
defp apply_action(socket, :index, _params) do defp apply_action(socket, :index, _params) do
socket socket
|> assign(:page_title, gettext("Ammo")) |> assign(
|> assign(:ammo_group, nil) page_title: gettext("Ammo"),
search: nil,
ammo_group: nil
)
end
defp apply_action(socket, :search, %{"search" => search}) do
socket
|> assign(
page_title: gettext("Ammo"),
search: search,
ammo_group: nil
)
end end
@impl true @impl true
@ -85,13 +110,22 @@ defmodule CanneryWeb.AmmoGroupLive.Index do
{:noreply, socket |> assign(:show_used, !show_used) |> display_ammo_groups()} {:noreply, socket |> assign(:show_used, !show_used) |> display_ammo_groups()}
end end
defp display_ammo_groups( @impl true
%{assigns: %{current_user: current_user, show_used: show_used}} = socket def handle_event("search", %{"search" => %{"search_term" => ""}}, socket) do
) do {:noreply, socket |> push_patch(to: Routes.ammo_group_index_path(Endpoint, :index))}
ammo_groups = end
Ammo.list_ammo_groups(current_user, show_used)
|> Repo.preload([:ammo_type, :container], force: true)
def handle_event("search", %{"search" => %{"search_term" => search_term}}, socket) do
socket =
socket |> push_patch(to: Routes.ammo_group_index_path(Endpoint, :search, search_term))
{:noreply, socket}
end
defp display_ammo_groups(
%{assigns: %{search: search, current_user: current_user, show_used: show_used}} = socket
) do
ammo_groups = Ammo.list_ammo_groups(search, show_used, current_user)
ammo_types_count = Ammo.get_ammo_types_count!(current_user) ammo_types_count = Ammo.get_ammo_types_count!(current_user)
containers_count = Containers.get_containers_count!(current_user) containers_count = Containers.get_containers_count!(current_user)

View File

@ -3,7 +3,7 @@
<%= gettext("Ammo") %> <%= gettext("Ammo") %>
</h1> </h1>
<%= if @ammo_groups |> Enum.empty?() do %> <%= if @ammo_groups |> Enum.empty?() and @search |> is_nil() do %>
<h2 class="title text-xl text-primary-600"> <h2 class="title text-xl text-primary-600">
<%= gettext("No Ammo") %> <%= gettext("No Ammo") %>
<%= display_emoji("😔") %> <%= display_emoji("😔") %>
@ -31,7 +31,7 @@
<%= dgettext("actions", "add an ammo type first") %> <%= dgettext("actions", "add an ammo type first") %>
</.link> </.link>
</div> </div>
<% @ammo_groups |> Enum.empty?() -> %> <% @ammo_groups |> Enum.empty?() and @search |> is_nil() -> %>
<.link patch={Routes.ammo_group_index_path(Endpoint, :new)} class="btn btn-primary"> <.link patch={Routes.ammo_group_index_path(Endpoint, :new)} class="btn btn-primary">
<%= dgettext("actions", "Add your first box!") %> <%= dgettext("actions", "Add your first box!") %>
</.link> </.link>
@ -41,15 +41,36 @@
</.link> </.link>
<% end %> <% end %>
<%= unless @ammo_groups |> Enum.empty?() do %> <div class="w-full flex flex-col sm:flex-row justify-center items-center space-y-4 sm:space-y-0 sm:space-x-4 max-w-xl">
<div class="flex flex-col space-y-4 justify-center items-center"> <.form
<.toggle_button action="toggle_show_used" value={@show_used}> :let={f}
<span class="title text-lg text-primary-600"> for={:search}
<%= gettext("Show used") %> phx-change="search"
</span> phx-submit="search"
</.toggle_button> class="grow self-stretch flex flex-col items-stretch"
</div> data-qa="ammo_group_search"
>
<%= text_input(f, :search_term,
class: "input input-primary",
value: @search,
phx_debounce: 300,
placeholder: gettext("Search ammo")
) %>
</.form>
<.toggle_button action="toggle_show_used" value={@show_used}>
<span class="title text-lg text-primary-600">
<%= gettext("Show used") %>
</span>
</.toggle_button>
</div>
<%= if @ammo_groups |> Enum.empty?() do %>
<h2 class="title text-xl text-primary-600">
<%= gettext("No Ammo") %>
<%= display_emoji("😔") %>
</h2>
<% else %>
<.live_component <.live_component
module={CanneryWeb.Components.AmmoGroupTableComponent} module={CanneryWeb.Components.AmmoGroupTableComponent}
id="ammo-group-index-table" id="ammo-group-index-table"

View File

@ -4,13 +4,15 @@ defmodule CanneryWeb.AmmoTypeLive.Index do
""" """
use CanneryWeb, :live_view use CanneryWeb, :live_view
alias Cannery.{Ammo, Ammo.AmmoType} alias Cannery.{Ammo, Ammo.AmmoType}
alias CanneryWeb.Endpoint
@impl true @impl true
def mount(%{"search" => search}, _session, socket) do
{:ok, socket |> assign(show_used: false, search: search) |> list_ammo_types()}
end
def mount(_params, _session, socket) do def mount(_params, _session, socket) do
{:ok, socket |> assign(:show_used, false) |> list_ammo_types()} {:ok, socket |> assign(show_used: false, search: nil) |> list_ammo_types()}
end end
@impl true @impl true
@ -19,25 +21,49 @@ defmodule CanneryWeb.AmmoTypeLive.Index do
end end
defp apply_action(%{assigns: %{current_user: current_user}} = socket, :edit, %{"id" => id}) do defp apply_action(%{assigns: %{current_user: current_user}} = socket, :edit, %{"id" => id}) do
%{name: ammo_type_name} = ammo_type = Ammo.get_ammo_type!(id, current_user)
socket socket
|> assign(:page_title, gettext("Edit Ammo type")) |> assign(
|> assign(:ammo_type, Ammo.get_ammo_type!(id, current_user)) page_title: gettext("Edit %{ammo_type_name}", ammo_type_name: ammo_type_name),
ammo_type: ammo_type
)
end end
defp apply_action(%{assigns: %{current_user: current_user}} = socket, :clone, %{"id" => id}) do defp apply_action(%{assigns: %{current_user: current_user}} = socket, :clone, %{"id" => id}) do
socket socket
|> assign(:page_title, gettext("New Ammo type")) |> assign(
|> assign(:ammo_type, %{Ammo.get_ammo_type!(id, current_user) | id: nil}) page_title: gettext("New Ammo type"),
ammo_type: %{Ammo.get_ammo_type!(id, current_user) | id: nil}
)
end end
defp apply_action(socket, :new, _params) do defp apply_action(socket, :new, _params) do
socket socket
|> assign(:page_title, gettext("New Ammo type")) |> assign(
|> assign(:ammo_type, %AmmoType{}) page_title: gettext("New Ammo type"),
ammo_type: %AmmoType{}
)
end end
defp apply_action(socket, :index, _params) do defp apply_action(socket, :index, _params) do
socket |> assign(:page_title, gettext("Ammo types")) |> assign(:ammo_type, nil) socket
|> assign(
page_title: gettext("Catalog"),
search: nil,
ammo_type: nil
)
|> list_ammo_types()
end
defp apply_action(socket, :search, %{"search" => search}) do
socket
|> assign(
page_title: gettext("Catalog"),
search: search,
ammo_type: nil
)
|> list_ammo_types()
end end
@impl true @impl true
@ -54,196 +80,17 @@ defmodule CanneryWeb.AmmoTypeLive.Index do
{:noreply, socket |> assign(:show_used, !show_used) |> list_ammo_types()} {:noreply, socket |> assign(:show_used, !show_used) |> list_ammo_types()}
end end
defp list_ammo_types(%{assigns: %{current_user: current_user, show_used: show_used}} = socket) do @impl true
ammo_types = Ammo.list_ammo_types(current_user) def handle_event("search", %{"search" => %{"search_term" => ""}}, socket) do
{:noreply, socket |> push_patch(to: Routes.ammo_type_index_path(Endpoint, :index))}
columns =
[
%{label: gettext("Name"), key: :name, type: :name},
%{label: gettext("Bullet type"), key: :bullet_type, type: :string},
%{label: gettext("Bullet core"), key: :bullet_core, type: :string},
%{label: gettext("Cartridge"), key: :cartridge, type: :string},
%{label: gettext("Caliber"), key: :caliber, type: :string},
%{label: gettext("Case material"), key: :case_material, type: :string},
%{label: gettext("Jacket type"), key: :jacket_type, type: :string},
%{label: gettext("Muzzle velocity"), key: :muzzle_velocity, type: :string},
%{label: gettext("Powder type"), key: :powder_type, type: :string},
%{
label: gettext("Powder grains per charge"),
key: :powder_grains_per_charge,
type: :string
},
%{label: gettext("Grains"), key: :grains, type: :string},
%{label: gettext("Pressure"), key: :pressure, type: :string},
%{label: gettext("Primer type"), key: :primer_type, type: :string},
%{label: gettext("Firing type"), key: :firing_type, type: :string},
%{label: gettext("Tracer"), key: :tracer, type: :boolean},
%{label: gettext("Incendiary"), key: :incendiary, type: :boolean},
%{label: gettext("Blank"), key: :blank, type: :boolean},
%{label: gettext("Corrosive"), key: :corrosive, type: :boolean},
%{label: gettext("Manufacturer"), key: :manufacturer, type: :string},
%{label: gettext("UPC"), key: "upc", type: :string}
]
|> Enum.filter(fn %{key: key, type: type} ->
# remove columns if all values match defaults
default_value = if type == :boolean, do: false, else: nil
ammo_types
|> Enum.any?(fn ammo_type ->
not (ammo_type |> Map.get(key) == default_value)
end)
end)
|> Kernel.++([
%{label: gettext("Rounds"), key: :round_count, type: :round_count}
])
|> Kernel.++(
if show_used do
[
%{
label: gettext("Used rounds"),
key: :used_round_count,
type: :used_round_count
},
%{
label: gettext("Total ever rounds"),
key: :historical_round_count,
type: :historical_round_count
}
]
else
[]
end
)
|> Kernel.++([%{label: gettext("Packs"), key: :ammo_count, type: :ammo_count}])
|> Kernel.++(
if show_used do
[
%{
label: gettext("Used packs"),
key: :used_ammo_count,
type: :used_ammo_count
},
%{
label: gettext("Total ever packs"),
key: :historical_ammo_count,
type: :historical_ammo_count
}
]
else
[]
end
)
|> Kernel.++([
%{label: gettext("Average CPR"), key: :avg_price_paid, type: :avg_price_paid},
%{label: nil, key: "actions", type: :actions, sortable: false}
])
rows =
ammo_types
|> Enum.map(fn ammo_type -> ammo_type |> get_ammo_type_values(columns, current_user) end)
socket |> assign(columns: columns, rows: rows)
end end
defp get_ammo_type_values(ammo_type, columns, current_user) do def handle_event("search", %{"search" => %{"search_term" => search_term}}, socket) do
columns {:noreply,
|> Map.new(fn %{key: key, type: type} -> socket |> push_patch(to: Routes.ammo_type_index_path(Endpoint, :search, search_term))}
{key, get_ammo_type_value(type, key, ammo_type, current_user)}
end)
end end
defp get_ammo_type_value(:boolean, key, ammo_type, _current_user), defp list_ammo_types(%{assigns: %{search: search, current_user: current_user}} = socket) do
do: ammo_type |> Map.get(key) |> humanize() socket |> assign(ammo_types: Ammo.list_ammo_types(search, current_user))
defp get_ammo_type_value(:round_count, _key, ammo_type, current_user),
do: ammo_type |> Ammo.get_round_count_for_ammo_type(current_user)
defp get_ammo_type_value(:historical_round_count, _key, ammo_type, current_user),
do: ammo_type |> Ammo.get_historical_count_for_ammo_type(current_user)
defp get_ammo_type_value(:used_round_count, _key, ammo_type, current_user),
do: ammo_type |> Ammo.get_used_count_for_ammo_type(current_user)
defp get_ammo_type_value(:historical_ammo_count, _key, ammo_type, current_user),
do: ammo_type |> Ammo.get_ammo_groups_count_for_type(current_user, true)
defp get_ammo_type_value(:used_ammo_count, _key, ammo_type, current_user),
do: ammo_type |> Ammo.get_used_ammo_groups_count_for_type(current_user)
defp get_ammo_type_value(:ammo_count, _key, ammo_type, current_user),
do: ammo_type |> Ammo.get_ammo_groups_count_for_type(current_user)
defp get_ammo_type_value(:avg_price_paid, _key, ammo_type, current_user) do
case ammo_type |> Ammo.get_average_cost_for_ammo_type!(current_user) do
nil -> gettext("No cost information")
count -> gettext("$%{amount}", amount: count |> :erlang.float_to_binary(decimals: 2))
end
end end
defp get_ammo_type_value(:name, _key, ammo_type, _current_user) 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}"}
>
<%= @ammo_type.name %>
</.link>
"""
end
defp get_ammo_type_value(:actions, _key, ammo_type, _current_user) do
assigns = %{ammo_type: ammo_type}
~H"""
<div class="px-4 py-2 space-x-4 flex justify-center items-center">
<.link
navigate={Routes.ammo_type_show_path(Endpoint, :show, @ammo_type)}
class="text-primary-600 link"
data-qa={"view-#{@ammo_type.id}"}
>
<i class="fa-fw fa-lg fas fa-eye"></i>
</.link>
<.link
patch={Routes.ammo_type_index_path(Endpoint, :edit, @ammo_type)}
class="text-primary-600 link"
data-qa={"edit-#{@ammo_type.id}"}
>
<i class="fa-fw fa-lg fas fa-edit"></i>
</.link>
<.link
patch={Routes.ammo_type_index_path(Endpoint, :clone, @ammo_type)}
class="text-primary-600 link"
data-qa={"clone-#{@ammo_type.id}"}
>
<i class="fa-fw fa-lg fas fa-copy"></i>
</.link>
<.link
href="#"
class="text-primary-600 link"
phx-click="delete"
phx-value-id={@ammo_type.id}
data-confirm={
dgettext(
"prompts",
"Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!",
name: @ammo_type.name
)
}
data-qa={"delete-#{@ammo_type.id}"}
>
<i class="fa-lg fas fa-trash"></i>
</.link>
</div>
"""
end
defp get_ammo_type_value(nil, _key, _ammo_type, _current_user), do: nil
defp get_ammo_type_value(_other, key, ammo_type, _current_user), do: ammo_type |> Map.get(key)
end end

View File

@ -3,7 +3,7 @@
<%= gettext("Catalog") %> <%= gettext("Catalog") %>
</h1> </h1>
<%= if @rows |> Enum.empty?() do %> <%= if @ammo_types |> Enum.empty?() and @search |> is_nil() do %>
<h2 class="title text-xl text-primary-600"> <h2 class="title text-xl text-primary-600">
<%= gettext("No Ammo types") %> <%= gettext("No Ammo types") %>
<%= display_emoji("😔") %> <%= display_emoji("😔") %>
@ -17,7 +17,23 @@
<%= dgettext("actions", "New Ammo type") %> <%= dgettext("actions", "New Ammo type") %>
</.link> </.link>
<div class="flex flex-col justify-center items-center"> <div class="w-full flex flex-col sm:flex-row justify-center items-center space-y-4 sm:space-y-0 sm:space-x-4 max-w-xl">
<.form
:let={f}
for={:search}
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",
value: @search,
phx_debounce: 300,
placeholder: gettext("Search catalog")
) %>
</.form>
<.toggle_button action="toggle_show_used" value={@show_used}> <.toggle_button action="toggle_show_used" value={@show_used}>
<span class="title text-lg text-primary-600"> <span class="title text-lg text-primary-600">
<%= gettext("Show used") %> <%= gettext("Show used") %>
@ -25,13 +41,66 @@
</.toggle_button> </.toggle_button>
</div> </div>
<.live_component <%= if @ammo_types |> Enum.empty?() do %>
module={CanneryWeb.Components.TableComponent} <h2 class="title text-xl text-primary-600">
id="ammo_types_index_table" <%= gettext("No Ammo types") %>
action={@live_action} <%= display_emoji("😔") %>
columns={@columns} </h2>
rows={@rows} <% else %>
/> <.live_component
module={CanneryWeb.Components.AmmoTypeTableComponent}
id="ammo_types_index_table"
action={@live_action}
ammo_types={@ammo_types}
current_user={@current_user}
show_used={@show_used}
>
<:actions :let={ammo_type}>
<div class="px-4 py-2 space-x-4 flex justify-center items-center">
<.link
navigate={Routes.ammo_type_show_path(Endpoint, :show, ammo_type)}
class="text-primary-600 link"
data-qa={"view-#{ammo_type.id}"}
>
<i class="fa-fw fa-lg fas fa-eye"></i>
</.link>
<.link
patch={Routes.ammo_type_index_path(Endpoint, :edit, ammo_type)}
class="text-primary-600 link"
data-qa={"edit-#{ammo_type.id}"}
>
<i class="fa-fw fa-lg fas fa-edit"></i>
</.link>
<.link
patch={Routes.ammo_type_index_path(Endpoint, :clone, ammo_type)}
class="text-primary-600 link"
data-qa={"clone-#{ammo_type.id}"}
>
<i class="fa-fw fa-lg fas fa-copy"></i>
</.link>
<.link
href="#"
class="text-primary-600 link"
phx-click="delete"
phx-value-id={ammo_type.id}
data-confirm={
dgettext(
"prompts",
"Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!",
name: ammo_type.name
)
}
data-qa={"delete-#{ammo_type.id}"}
>
<i class="fa-lg fas fa-trash"></i>
</.link>
</div>
</:actions>
</.live_component>
<% end %>
<% end %> <% end %>
</div> </div>

View File

@ -184,7 +184,7 @@
</:container> </:container>
</.live_component> </.live_component>
<% else %> <% else %>
<div class="flex flex-wrap justify-center items-center"> <div class="flex flex-wrap justify-center items-stretch">
<%= for ammo_group <- @ammo_groups do %> <%= for ammo_group <- @ammo_groups do %>
<.ammo_group_card ammo_group={ammo_group} show_container={true} /> <.ammo_group_card ammo_group={ammo_group} show_container={true} />
<% end %> <% end %>

View File

@ -6,11 +6,16 @@ defmodule CanneryWeb.ContainerLive.Index do
use CanneryWeb, :live_view use CanneryWeb, :live_view
import CanneryWeb.Components.ContainerCard import CanneryWeb.Components.ContainerCard
alias Cannery.{Containers, Containers.Container, Repo} alias Cannery.{Containers, Containers.Container, Repo}
alias CanneryWeb.{Components.TagCard, Endpoint}
alias Ecto.Changeset alias Ecto.Changeset
@impl true @impl true
def mount(_params, _session, socket), do: {:ok, socket |> assign(view_table: false)} def mount(%{"search" => search}, _session, socket) do
{:ok, socket |> assign(view_table: true, search: search) |> display_containers()}
end
def mount(_params, _session, socket) do
{:ok, socket |> assign(view_table: true, search: nil) |> display_containers()}
end
@impl true @impl true
def handle_params(params, _url, %{assigns: %{live_action: live_action}} = socket) do def handle_params(params, _url, %{assigns: %{live_action: live_action}} = socket) do
@ -21,7 +26,7 @@ defmodule CanneryWeb.ContainerLive.Index do
%{name: container_name} = %{name: container_name} =
container = container =
Containers.get_container!(id, current_user) Containers.get_container!(id, current_user)
|> Repo.preload([:tags, :ammo_groups], force: true) |> Repo.preload([:tags, :ammo_groups])
socket socket
|> assign(page_title: gettext("Edit %{name}", name: container_name), container: container) |> assign(page_title: gettext("Edit %{name}", name: container_name), container: container)
@ -42,19 +47,18 @@ defmodule CanneryWeb.ContainerLive.Index do
socket socket
|> assign( |> assign(
page_title: gettext("Containers"), page_title: gettext("Containers"),
container: nil container: nil,
search: nil
) )
|> display_containers()
end end
defp apply_action(socket, :table, _params) do defp apply_action(socket, :search, %{"search" => search}) do
socket socket
|> assign( |> assign(
page_title: gettext("Containers"), page_title: gettext("Containers"),
container: nil, container: nil,
view_table: true search: search
) )
|> display_containers()
end end
defp apply_action(%{assigns: %{current_user: current_user}} = socket, :edit_tags, %{"id" => id}) do defp apply_action(%{assigns: %{current_user: current_user}} = socket, :edit_tags, %{"id" => id}) do
@ -104,146 +108,24 @@ defmodule CanneryWeb.ContainerLive.Index do
@impl true @impl true
def handle_event("toggle_table", _params, %{assigns: %{view_table: view_table}} = socket) do def handle_event("toggle_table", _params, %{assigns: %{view_table: view_table}} = socket) do
new_path = {:noreply, socket |> assign(:view_table, !view_table) |> display_containers()}
if view_table,
do: Routes.container_index_path(Endpoint, :index),
else: Routes.container_index_path(Endpoint, :table)
{:noreply, socket |> assign(view_table: !view_table) |> push_patch(to: new_path)}
end end
defp display_containers(%{assigns: %{current_user: current_user}} = socket) do @impl true
def handle_event("search", %{"search" => %{"search_term" => ""}}, socket) do
{:noreply, socket |> push_patch(to: Routes.container_index_path(Endpoint, :index))}
end
def handle_event("search", %{"search" => %{"search_term" => search_term}}, socket) do
{:noreply,
socket |> push_patch(to: Routes.container_index_path(Endpoint, :search, search_term))}
end
defp display_containers(%{assigns: %{search: search, current_user: current_user}} = socket) do
containers = containers =
Containers.list_containers(current_user) |> Repo.preload([:tags, :ammo_groups], force: true) Containers.list_containers(search, current_user)
|> Repo.preload([:tags, :ammo_groups])
columns = socket |> assign(:containers, containers)
[
%{label: gettext("Name"), key: :name, type: :string},
%{label: gettext("Description"), key: :desc, type: :string},
%{label: gettext("Location"), key: :location, type: :string},
%{label: gettext("Type"), key: :type, type: :string},
%{label: gettext("Packs"), key: :packs, type: :integer},
%{label: gettext("Rounds"), key: :rounds, type: :string},
%{label: gettext("Tags"), key: :tags, type: :tags},
%{label: nil, key: :actions, sortable: false, type: :actions}
]
|> Enum.filter(fn %{key: key, type: type} ->
# remove columns if all values match defaults
default_value =
case type do
:boolean -> false
_other_type -> nil
end
containers
|> Enum.any?(fn container ->
type in [:tags, :actions] or not (container |> Map.get(key) == default_value)
end)
end)
rows =
containers
|> Enum.map(fn container -> container |> get_row_data_for_container(columns) end)
socket
|> assign(
containers: containers,
columns: columns,
rows: rows
)
end end
@spec get_row_data_for_container(Container.t(), [map()]) :: map()
defp get_row_data_for_container(container, columns) do
container = container |> Repo.preload([:ammo_groups, :tags])
columns
|> Map.new(fn %{key: key} -> {key, get_value_for_key(key, container)} end)
end
@spec get_value_for_key(atom(), Container.t()) :: any()
defp get_value_for_key(:name, %{id: id, name: container_name}) do
assigns = %{id: id, container_name: container_name}
{container_name,
~H"""
<div class="flex flex-wrap justify-center items-center">
<.link navigate={Routes.container_show_path(Endpoint, :show, @id)} class="link">
<%= @container_name %>
</.link>
</div>
"""}
end
defp get_value_for_key(:packs, container) do
container |> Containers.get_container_ammo_group_count!()
end
defp get_value_for_key(:rounds, container) do
container |> Containers.get_container_rounds!()
end
defp get_value_for_key(:tags, container) do
assigns = %{container: container}
{container.tags |> Enum.map(fn %{name: name} -> name end),
~H"""
<div class="flex flex-wrap justify-center items-center">
<%= unless @container.tags |> Enum.empty?() do %>
<%= for tag <- @container.tags do %>
<TagCard.simple_tag_card tag={tag} />
<% end %>
<% end %>
<div class="mx-4 my-2">
<.link
patch={Routes.container_index_path(Endpoint, :edit_tags, @container)}
class="text-primary-600 link"
>
<i class="fa-fw fa-lg fas fa-tags"></i>
</.link>
</div>
</div>
"""}
end
defp get_value_for_key(:actions, container) do
assigns = %{container: container}
~H"""
<.link
patch={Routes.container_index_path(Endpoint, :edit, @container)}
class="text-primary-600 link"
data-qa={"edit-#{@container.id}"}
>
<i class="fa-fw fa-lg fas fa-edit"></i>
</.link>
<.link
patch={Routes.container_index_path(Endpoint, :clone, @container)}
class="text-primary-600 link"
data-qa={"clone-#{@container.id}"}
>
<i class="fa-fw fa-lg fas fa-copy"></i>
</.link>
<.link
href="#"
class="text-primary-600 link"
phx-click="delete"
phx-value-id={@container.id}
data-confirm={
dgettext("prompts", "Are you sure you want to delete %{name}?", name: @container.name)
}
data-qa={"delete-#{@container.id}"}
>
<i class="fa-fw fa-lg fas fa-trash"></i>
</.link>
"""
end
defp get_value_for_key(key, container), do: container |> Map.get(key)
def return_to(true = _view_table), do: Routes.container_index_path(Endpoint, :table)
def return_to(false = _view_table), do: Routes.container_index_path(Endpoint, :index)
end end

View File

@ -3,7 +3,7 @@
<%= gettext("Containers") %> <%= gettext("Containers") %>
</h1> </h1>
<%= if @containers |> Enum.empty?() do %> <%= if @containers |> Enum.empty?() and @search |> is_nil() do %>
<h2 class="title text-xl text-primary-600"> <h2 class="title text-xl text-primary-600">
<%= gettext("No containers") %> <%= gettext("No containers") %>
<%= display_emoji("😔") %> <%= display_emoji("😔") %>
@ -17,7 +17,23 @@
<%= dgettext("actions", "New Container") %> <%= dgettext("actions", "New Container") %>
</.link> </.link>
<div class="flex flex-col justify-center items-center"> <div class="w-full flex flex-col sm:flex-row justify-center items-center space-y-4 sm:space-y-0 sm:space-x-4 max-w-xl">
<.form
:let={f}
for={:search}
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",
value: @search,
phx_debounce: 300,
placeholder: gettext("Search containers")
) %>
</.form>
<.toggle_button action="toggle_table" value={@view_table}> <.toggle_button action="toggle_table" value={@view_table}>
<span class="title text-lg text-primary-600"> <span class="title text-lg text-primary-600">
<%= gettext("View as table") %> <%= gettext("View as table") %>
@ -26,28 +42,31 @@
</div> </div>
<% end %> <% end %>
<div class="w-full flex flex-row flex-wrap justify-center items-center"> <%= if @containers |> Enum.empty?() do %>
<h2 class="title text-xl text-primary-600">
<%= gettext("No containers") %>
<%= display_emoji("😔") %>
</h2>
<% else %>
<%= if @view_table do %> <%= if @view_table do %>
<.live_component <.live_component
module={CanneryWeb.Components.TableComponent} module={CanneryWeb.Components.ContainerTableComponent}
id="containers_index_table" id="containers_index_table"
action={@live_action} action={@live_action}
columns={@columns} containers={@containers}
rows={@rows} current_user={@current_user}
/> >
<% else %> <:tag_actions :let={container}>
<%= for container <- @containers do %> <div class="mx-4 my-2">
<.container_card container={container}> <.link
<:tag_actions> patch={Routes.container_index_path(Endpoint, :edit_tags, container)}
<div class="mx-4 my-2"> class="text-primary-600 link"
<.link >
patch={Routes.container_index_path(Endpoint, :edit_tags, container)} <i class="fa-fw fa-lg fas fa-tags"></i>
class="text-primary-600 link" </.link>
> </div>
<i class="fa-fw fa-lg fas fa-tags"></i> </:tag_actions>
</.link> <:actions :let={container}>
</div>
</:tag_actions>
<.link <.link
patch={Routes.container_index_path(Endpoint, :edit, container)} patch={Routes.container_index_path(Endpoint, :edit, container)}
class="text-primary-600 link" class="text-primary-600 link"
@ -76,28 +95,75 @@
> >
<i class="fa-fw fa-lg fas fa-trash"></i> <i class="fa-fw fa-lg fas fa-trash"></i>
</.link> </.link>
</.container_card> </:actions>
<% end %> </.live_component>
<% else %>
<div class="w-full flex flex-row flex-wrap justify-center items-stretch">
<%= for container <- @containers do %>
<.container_card container={container}>
<:tag_actions>
<div class="mx-4 my-2">
<.link
patch={Routes.container_index_path(Endpoint, :edit_tags, container)}
class="text-primary-600 link"
>
<i class="fa-fw fa-lg fas fa-tags"></i>
</.link>
</div>
</:tag_actions>
<.link
patch={Routes.container_index_path(Endpoint, :edit, container)}
class="text-primary-600 link"
data-qa={"edit-#{container.id}"}
>
<i class="fa-fw fa-lg fas fa-edit"></i>
</.link>
<.link
patch={Routes.container_index_path(Endpoint, :clone, container)}
class="text-primary-600 link"
data-qa={"clone-#{container.id}"}
>
<i class="fa-fw fa-lg fas fa-copy"></i>
</.link>
<.link
href="#"
class="text-primary-600 link"
phx-click="delete"
phx-value-id={container.id}
data-confirm={
dgettext("prompts", "Are you sure you want to delete %{name}?",
name: container.name
)
}
data-qa={"delete-#{container.id}"}
>
<i class="fa-fw fa-lg fas fa-trash"></i>
</.link>
</.container_card>
<% end %>
</div>
<% end %> <% end %>
</div> <% end %>
</div> </div>
<%= if @live_action in [:new, :edit, :clone] do %> <%= if @live_action in [:new, :edit, :clone] do %>
<.modal return_to={return_to(@view_table)}> <.modal return_to={Routes.container_index_path(Endpoint, :index)}>
<.live_component <.live_component
module={CanneryWeb.ContainerLive.FormComponent} module={CanneryWeb.ContainerLive.FormComponent}
id={@container.id || :new} id={@container.id || :new}
title={@page_title} title={@page_title}
action={@live_action} action={@live_action}
container={@container} container={@container}
return_to={return_to(@view_table)} return_to={Routes.container_index_path(Endpoint, :index)}
current_user={@current_user} current_user={@current_user}
/> />
</.modal> </.modal>
<% end %> <% end %>
<%= if @live_action == :edit_tags do %> <%= if @live_action == :edit_tags do %>
<.modal return_to={return_to(@view_table)}> <.modal return_to={Routes.container_index_path(Endpoint, :index)}>
<.live_component <.live_component
module={CanneryWeb.ContainerLive.EditTagsComponent} module={CanneryWeb.ContainerLive.EditTagsComponent}
id={@container.id} id={@container.id}

View File

@ -11,18 +11,14 @@ defmodule CanneryWeb.ContainerLive.Show do
alias Phoenix.LiveView.Socket alias Phoenix.LiveView.Socket
@impl true @impl true
def mount(_params, _session, %{assigns: %{live_action: live_action}} = socket), def mount(_params, _session, socket),
do: {:ok, socket |> assign(show_used: false, view_table: live_action == :table)} do: {:ok, socket |> assign(show_used: false, view_table: true)}
@impl true @impl true
def handle_params( def handle_params(%{"id" => id}, _session, %{assigns: %{current_user: current_user}} = socket) do
%{"id" => id},
_session,
%{assigns: %{current_user: current_user, live_action: live_action}} = socket
) do
socket = socket =
socket socket
|> assign(view_table: live_action == :table) |> assign(view_table: true)
|> render_container(id, current_user) |> render_container(id, current_user)
{:noreply, socket} {:noreply, socket}
@ -94,17 +90,8 @@ defmodule CanneryWeb.ContainerLive.Show do
end end
@impl true @impl true
def handle_event( def handle_event("toggle_table", _params, %{assigns: %{view_table: view_table}} = socket) do
"toggle_table", {:noreply, socket |> assign(:view_table, !view_table) |> render_container()}
_params,
%{assigns: %{view_table: view_table, container: container}} = socket
) do
new_path =
if view_table,
do: Routes.container_show_path(Endpoint, :show, container),
else: Routes.container_show_path(Endpoint, :table, container)
{:noreply, socket |> push_patch(to: new_path)}
end end
@spec render_container(Socket.t(), Container.id(), User.t()) :: Socket.t() @spec render_container(Socket.t(), Container.id(), User.t()) :: Socket.t()

View File

@ -133,7 +133,7 @@
</:ammo_type> </:ammo_type>
</.live_component> </.live_component>
<% else %> <% else %>
<div class="flex flex-wrap justify-center items-center"> <div class="flex flex-wrap justify-center items-stretch">
<%= for ammo_group <- @ammo_groups do %> <%= for ammo_group <- @ammo_groups do %>
<.ammo_group_card ammo_group={ammo_group} /> <.ammo_group_card ammo_group={ammo_group} />
<% end %> <% end %>

View File

@ -38,7 +38,7 @@ defmodule CanneryWeb.InviteLive.FormComponent do
changeset = changeset =
case action do case action do
:new -> invite |> Invite.create_changeset(user, "example_token", invite_params) :new -> Invite.create_changeset(user, "example_token", invite_params)
:edit -> invite |> Invite.update_changeset(invite_params) :edit -> invite |> Invite.update_changeset(invite_params)
end end

View File

@ -18,7 +18,7 @@
</.link> </.link>
<% end %> <% end %>
<div class="w-full flex flex-row flex-wrap justify-center items-center"> <div class="w-full flex flex-row flex-wrap justify-center items-stretch">
<%= for invite <- @invites do %> <%= for invite <- @invites do %>
<.invite_card invite={invite}> <.invite_card invite={invite}>
<:code_actions> <:code_actions>
@ -91,7 +91,7 @@
<%= gettext("Admins") %> <%= gettext("Admins") %>
</h1> </h1>
<div class="w-full flex flex-row flex-wrap justify-center items-center"> <div class="w-full flex flex-row flex-wrap justify-center items-stretch">
<%= for admin <- @admins do %> <%= for admin <- @admins do %>
<.user_card user={admin}> <.user_card user={admin}>
<.link <.link
@ -121,7 +121,7 @@
<%= gettext("Users") %> <%= gettext("Users") %>
</h1> </h1>
<div class="w-full flex flex-row flex-wrap justify-center items-center"> <div class="w-full flex flex-row flex-wrap justify-center items-stretch">
<%= for user <- @users do %> <%= for user <- @users do %>
<.user_card user={user}> <.user_card user={user}>
<.link <.link

View File

@ -10,7 +10,13 @@ defmodule CanneryWeb.RangeLive.Index do
alias Phoenix.LiveView.Socket alias Phoenix.LiveView.Socket
@impl true @impl true
def mount(_params, _session, socket), do: {:ok, socket |> display_shot_groups()} def mount(%{"search" => search}, _session, socket) do
{:ok, socket |> assign(search: search) |> display_shot_groups()}
end
def mount(_params, _session, socket) do
{:ok, socket |> assign(search: nil) |> display_shot_groups()}
end
@impl true @impl true
def handle_params(params, _url, %{assigns: %{live_action: live_action}} = socket) do def handle_params(params, _url, %{assigns: %{live_action: live_action}} = socket) do
@ -23,26 +29,46 @@ defmodule CanneryWeb.RangeLive.Index do
%{"id" => id} %{"id" => id}
) do ) do
socket socket
|> assign(:page_title, gettext("Record Shots")) |> assign(
|> assign(:ammo_group, Ammo.get_ammo_group!(id, current_user)) page_title: gettext("Record Shots"),
ammo_group: Ammo.get_ammo_group!(id, current_user)
)
end end
defp apply_action(%{assigns: %{current_user: current_user}} = socket, :edit, %{"id" => id}) do defp apply_action(%{assigns: %{current_user: current_user}} = socket, :edit, %{"id" => id}) do
socket socket
|> assign(:page_title, gettext("Edit Shot Records")) |> assign(
|> assign(:shot_group, ActivityLog.get_shot_group!(id, current_user)) page_title: gettext("Edit Shot Records"),
shot_group: ActivityLog.get_shot_group!(id, current_user)
)
end end
defp apply_action(socket, :new, _params) do defp apply_action(socket, :new, _params) do
socket socket
|> assign(:page_title, gettext("New Shot Records")) |> assign(
|> assign(:shot_group, %ShotGroup{}) page_title: gettext("New Shot Records"),
shot_group: %ShotGroup{}
)
end end
defp apply_action(socket, :index, _params) do defp apply_action(socket, :index, _params) do
socket socket
|> assign(:page_title, gettext("Shot Records")) |> assign(
|> assign(:shot_group, nil) page_title: gettext("Shot Records"),
search: nil,
shot_group: nil
)
|> display_shot_groups()
end
defp apply_action(socket, :search, %{"search" => search}) do
socket
|> assign(
page_title: gettext("Shot Records"),
search: search,
shot_group: nil
)
|> display_shot_groups()
end end
@impl true @impl true
@ -55,6 +81,7 @@ defmodule CanneryWeb.RangeLive.Index do
{:noreply, socket |> put_flash(:info, prompt) |> display_shot_groups()} {:noreply, socket |> put_flash(:info, prompt) |> display_shot_groups()}
end end
@impl true
def handle_event( def handle_event(
"toggle_staged", "toggle_staged",
%{"ammo_group_id" => ammo_group_id}, %{"ammo_group_id" => ammo_group_id},
@ -69,32 +96,27 @@ defmodule CanneryWeb.RangeLive.Index do
{:noreply, socket |> put_flash(:info, prompt) |> display_shot_groups()} {:noreply, socket |> put_flash(:info, prompt) |> display_shot_groups()}
end end
@impl true
def handle_event("search", %{"search" => %{"search_term" => ""}}, socket) do
{:noreply, socket |> push_patch(to: Routes.range_index_path(Endpoint, :index))}
end
def handle_event("search", %{"search" => %{"search_term" => search_term}}, socket) do
{:noreply, socket |> push_patch(to: Routes.range_index_path(Endpoint, :search, search_term))}
end
@spec display_shot_groups(Socket.t()) :: Socket.t() @spec display_shot_groups(Socket.t()) :: Socket.t()
defp display_shot_groups(%{assigns: %{current_user: current_user}} = socket) do defp display_shot_groups(%{assigns: %{search: search, current_user: current_user}} = socket) do
shot_groups = shot_groups =
ActivityLog.list_shot_groups(current_user) |> Repo.preload(ammo_group: :ammo_type) ActivityLog.list_shot_groups(search, current_user)
|> Repo.preload(ammo_group: :ammo_type)
ammo_groups = Ammo.list_staged_ammo_groups(current_user) ammo_groups = Ammo.list_staged_ammo_groups(current_user)
columns = [
%{label: gettext("Ammo"), key: :name},
%{label: gettext("Rounds shot"), key: :count},
%{label: gettext("Notes"), key: :notes},
%{label: gettext("Date"), key: :date},
%{label: nil, key: :actions, sortable: false}
]
rows =
shot_groups
|> Enum.map(fn shot_group -> shot_group |> get_row_data_for_shot_group(columns) end)
chart_data = shot_groups |> get_chart_data_for_shot_group() chart_data = shot_groups |> get_chart_data_for_shot_group()
socket socket
|> assign( |> assign(
ammo_groups: ammo_groups, ammo_groups: ammo_groups,
columns: columns,
rows: rows,
chart_data: chart_data, chart_data: chart_data,
shot_groups: shot_groups shot_groups: shot_groups
) )
@ -114,61 +136,6 @@ defmodule CanneryWeb.RangeLive.Index do
label: gettext("Rounds shot: %{count}", count: sum) label: gettext("Rounds shot: %{count}", count: sum)
} }
end) end)
|> Enum.sort_by(fn %{date: date} -> date end) |> Enum.sort_by(fn %{date: date} -> date end, Date)
end
@spec get_row_data_for_shot_group(ShotGroup.t(), [map()]) :: map()
defp get_row_data_for_shot_group(%{date: date} = shot_group, columns) do
shot_group = shot_group |> Repo.preload(ammo_group: :ammo_type)
assigns = %{shot_group: shot_group}
columns
|> Map.new(fn %{key: key} ->
value =
case key do
:name ->
{shot_group.ammo_group.ammo_type.name,
~H"""
<.link
navigate={Routes.ammo_group_show_path(Endpoint, :show, @shot_group.ammo_group)}
class="link"
>
<%= @shot_group.ammo_group.ammo_type.name %>
</.link>
"""}
:date ->
date |> display_date()
:actions ->
~H"""
<div class="px-4 py-2 space-x-4 flex justify-center items-center">
<.link
patch={Routes.range_index_path(Endpoint, :edit, @shot_group)}
class="text-primary-600 link"
data-qa={"edit-#{@shot_group.id}"}
>
<i class="fa-fw fa-lg fas fa-edit"></i>
</.link>
<.link
href="#"
class="text-primary-600 link"
phx-click="delete"
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}"}
>
<i class="fa-fw fa-lg fas fa-trash"></i>
</.link>
</div>
"""
key ->
shot_group |> Map.get(key)
end
{key, value}
end)
end end
end end

View File

@ -17,33 +17,35 @@
<%= dgettext("actions", "Stage ammo") %> <%= dgettext("actions", "Stage ammo") %>
</.link> </.link>
<%= for ammo_group <- @ammo_groups do %> <div class="w-full flex flex-row flex-wrap justify-center items-stretch">
<.ammo_group_card ammo_group={ammo_group}> <%= for ammo_group <- @ammo_groups do %>
<button <.ammo_group_card ammo_group={ammo_group}>
type="button" <button
class="btn btn-primary" type="button"
phx-click="toggle_staged" class="btn btn-primary"
phx-value-ammo_group_id={ammo_group.id} phx-click="toggle_staged"
data-confirm={"#{dgettext("prompts", "Are you sure you want to unstage this ammo?")}"} phx-value-ammo_group_id={ammo_group.id}
> data-confirm={"#{dgettext("prompts", "Are you sure you want to unstage this ammo?")}"}
<%= if ammo_group.staged, >
do: dgettext("actions", "Unstage from range"), <%= if ammo_group.staged,
else: dgettext("actions", "Stage for range") %> do: dgettext("actions", "Unstage from range"),
</button> else: dgettext("actions", "Stage for range") %>
</button>
<.link <.link
patch={Routes.range_index_path(Endpoint, :add_shot_group, ammo_group)} patch={Routes.range_index_path(Endpoint, :add_shot_group, ammo_group)}
class="btn btn-primary" class="btn btn-primary"
> >
<%= dgettext("actions", "Record shots") %> <%= dgettext("actions", "Record shots") %>
</.link> </.link>
</.ammo_group_card> </.ammo_group_card>
<% end %> <% end %>
</div>
<% end %> <% end %>
<hr class="hr" /> <hr class="hr" />
<%= if @shot_groups |> Enum.empty?() do %> <%= if @shot_groups |> Enum.empty?() and @search |> is_nil() do %>
<h1 class="title text-xl text-primary-600"> <h1 class="title text-xl text-primary-600">
<%= gettext("No shots recorded") %> <%= gettext("No shots recorded") %>
<%= display_emoji("😔") %> <%= display_emoji("😔") %>
@ -67,14 +69,62 @@
<%= dgettext("errors", "Your browser does not support the canvas element.") %> <%= dgettext("errors", "Your browser does not support the canvas element.") %>
</canvas> </canvas>
<.live_component <div class="w-full flex flex-col sm:flex-row justify-center items-center space-y-4 sm:space-y-0 sm:space-x-4 max-w-xl">
module={CanneryWeb.Components.TableComponent} <.form
id="shot_groups_index_table" :let={f}
columns={@columns} for={:search}
rows={@rows} phx-change="search"
initial_key={:date} phx-submit="search"
initial_sort_mode={:desc} class="grow self-stretch flex flex-col items-stretch"
/> data-qa="shot_group_search"
>
<%= text_input(f, :search_term,
class: "input input-primary",
value: @search,
phx_debounce: 300,
placeholder: gettext("Search shot records")
) %>
</.form>
</div>
<%= if @shot_groups |> Enum.empty?() do %>
<h1 class="title text-xl text-primary-600">
<%= gettext("No shots recorded") %>
<%= display_emoji("😔") %>
</h1>
<% else %>
<.live_component
module={CanneryWeb.Components.ShotGroupTableComponent}
id="shot_groups_index_table"
shot_groups={@shot_groups}
current_user={@current_user}
>
<:actions :let={shot_group}>
<div class="px-4 py-2 space-x-4 flex justify-center items-center">
<.link
patch={Routes.range_index_path(Endpoint, :edit, shot_group)}
class="text-primary-600 link"
data-qa={"edit-#{shot_group.id}"}
>
<i class="fa-fw fa-lg fas fa-edit"></i>
</.link>
<.link
href="#"
class="text-primary-600 link"
phx-click="delete"
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}"}
>
<i class="fa-fw fa-lg fas fa-trash"></i>
</.link>
</div>
</:actions>
</.live_component>
<% end %>
<% end %> <% end %>
</div> </div>

View File

@ -9,27 +9,53 @@ defmodule CanneryWeb.TagLive.Index do
alias CanneryWeb.{Endpoint, ViewHelpers} alias CanneryWeb.{Endpoint, ViewHelpers}
@impl true @impl true
def mount(_params, _session, socket), do: {:ok, socket |> display_tags()} def mount(%{"search" => search}, _session, socket) do
{:ok, socket |> assign(:search, search) |> display_tags()}
end
def mount(_params, _session, socket) do
{:ok, socket |> assign(:search, nil) |> display_tags()}
end
@impl true @impl true
def handle_params(params, _url, %{assigns: %{live_action: live_action}} = socket) do def handle_params(params, _url, %{assigns: %{live_action: live_action}} = socket) do
{:noreply, apply_action(socket, live_action, params) |> display_tags} {:noreply, apply_action(socket, live_action, params)}
end end
defp apply_action(%{assigns: %{current_user: current_user}} = socket, :edit, %{"id" => id}) do defp apply_action(%{assigns: %{current_user: current_user}} = socket, :edit, %{"id" => id}) do
socket socket
|> assign(:page_title, gettext("Edit Tag")) |> assign(
|> assign(:tag, Tags.get_tag!(id, current_user)) page_title: gettext("Edit Tag"),
tag: Tags.get_tag!(id, current_user)
)
end end
defp apply_action(socket, :new, _params) do defp apply_action(socket, :new, _params) do
socket socket
|> assign(:page_title, gettext("New Tag")) |> assign(
|> assign(:tag, %Tag{bg_color: ViewHelpers.random_color(), text_color: "#ffffff"}) page_title: gettext("New Tag"),
tag: %Tag{bg_color: ViewHelpers.random_color(), text_color: "#ffffff"}
)
end end
defp apply_action(socket, :index, _params) do defp apply_action(socket, :index, _params) do
socket |> assign(:page_title, gettext("Tags")) |> assign(:tag, nil) socket
|> assign(
page_title: gettext("Tags"),
search: nil,
tag: nil
)
|> display_tags()
end
defp apply_action(socket, :search, %{"search" => search}) do
socket
|> assign(
page_title: gettext("Tags"),
search: search,
tag: nil
)
|> display_tags()
end end
@impl true @impl true
@ -39,7 +65,16 @@ defmodule CanneryWeb.TagLive.Index do
{:noreply, socket |> put_flash(:info, prompt) |> display_tags()} {:noreply, socket |> put_flash(:info, prompt) |> display_tags()}
end end
defp display_tags(%{assigns: %{current_user: current_user}} = socket) do @impl true
socket |> assign(tags: Tags.list_tags(current_user)) def handle_event("search", %{"search" => %{"search_term" => ""}}, socket) do
{:noreply, socket |> push_patch(to: Routes.tag_index_path(Endpoint, :index))}
end
def handle_event("search", %{"search" => %{"search_term" => search_term}}, socket) do
{:noreply, socket |> push_patch(to: Routes.tag_index_path(Endpoint, :search, search_term))}
end
defp display_tags(%{assigns: %{search: search, current_user: current_user}} = socket) do
socket |> assign(tags: Tags.list_tags(search, current_user))
end end
end end

View File

@ -5,7 +5,7 @@
<p class="title text-md text-primary-600"> <p class="title text-md text-primary-600">
<%= gettext("Tags can be added to your containers to help you organize") %> <%= gettext("Tags can be added to your containers to help you organize") %>
</p> </p>
<%= if @tags |> Enum.empty?() do %> <%= if @tags |> Enum.empty?() and @search |> is_nil() do %>
<h2 class="title text-xl text-primary-600"> <h2 class="title text-xl text-primary-600">
<%= gettext("No tags") %> <%= gettext("No tags") %>
<%= display_emoji("😔") %> <%= display_emoji("😔") %>
@ -19,32 +19,58 @@
<%= dgettext("actions", "New Tag") %> <%= dgettext("actions", "New Tag") %>
</.link> </.link>
<% end %> <% end %>
<div class="flex flex-row flex-wrap justify-center items-center">
<%= for tag <- @tags do %>
<.tag_card tag={tag}>
<.link
patch={Routes.tag_index_path(Endpoint, :edit, tag)}
class="text-primary-600 link"
data-qa={"edit-#{tag.id}"}
>
<i class="fa-fw fa-lg fas fa-edit"></i>
</.link>
<.link <div class="w-full flex flex-col sm:flex-row justify-center items-center space-y-4 sm:space-y-0 sm:space-x-4 max-w-xl">
href="#" <.form
class="text-primary-600 link" :let={f}
phx-click="delete" for={:search}
phx-value-id={tag.id} phx-change="search"
data-confirm={ phx-submit="search"
dgettext("prompts", "Are you sure you want to delete %{name}?", name: tag.name) class="grow self-stretch flex flex-col items-stretch"
} data-qa="tag_search"
data-qa={"delete-#{tag.id}"} >
> <%= text_input(f, :search_term,
<i class="fa-fw fa-lg fas fa-trash"></i> class: "input input-primary",
</.link> value: @search,
</.tag_card> phx_debounce: 300,
<% end %> placeholder: gettext("Search tags")
) %>
</.form>
</div> </div>
<%= if @tags |> Enum.empty?() do %>
<h2 class="title text-xl text-primary-600">
<%= gettext("No tags") %>
<%= display_emoji("😔") %>
</h2>
<% else %>
<div class="flex flex-row flex-wrap justify-center items-stretch">
<%= for tag <- @tags do %>
<.tag_card tag={tag}>
<.link
patch={Routes.tag_index_path(Endpoint, :edit, tag)}
class="text-primary-600 link"
data-qa={"edit-#{tag.id}"}
>
<i class="fa-fw fa-lg fas fa-edit"></i>
</.link>
<.link
href="#"
class="text-primary-600 link"
phx-click="delete"
phx-value-id={tag.id}
data-confirm={
dgettext("prompts", "Are you sure you want to delete %{name}?", name: tag.name)
}
data-qa={"delete-#{tag.id}"}
>
<i class="fa-fw fa-lg fas fa-trash"></i>
</.link>
</.tag_card>
<% end %>
</div>
<% end %>
</div> </div>
<%= if @live_action in [:new, :edit] do %> <%= if @live_action in [:new, :edit] do %>

View File

@ -64,45 +64,48 @@ defmodule CanneryWeb.Router do
live "/tags", TagLive.Index, :index live "/tags", TagLive.Index, :index
live "/tags/new", TagLive.Index, :new live "/tags/new", TagLive.Index, :new
live "/tags/:id/edit", TagLive.Index, :edit live "/tags/edit/:id", TagLive.Index, :edit
live "/tags/search/:search", TagLive.Index, :search
live "/catalog", AmmoTypeLive.Index, :index live "/catalog", AmmoTypeLive.Index, :index
live "/catalog/new", AmmoTypeLive.Index, :new live "/catalog/new", AmmoTypeLive.Index, :new
live "/catalog/:id/clone", AmmoTypeLive.Index, :clone live "/catalog/clone/:id", AmmoTypeLive.Index, :clone
live "/catalog/:id/edit", AmmoTypeLive.Index, :edit live "/catalog/edit/:id", AmmoTypeLive.Index, :edit
live "/catalog/search/:search", AmmoTypeLive.Index, :search
live "/catalog/:id/show", AmmoTypeLive.Show, :show live "/type/:id", AmmoTypeLive.Show, :show
live "/catalog/:id/show/edit", AmmoTypeLive.Show, :edit live "/type/:id/edit", AmmoTypeLive.Show, :edit
live "/catalog/:id/show/table", AmmoTypeLive.Show, :table live "/type/:id/table", AmmoTypeLive.Show, :table
live "/containers", ContainerLive.Index, :index live "/containers", ContainerLive.Index, :index
live "/containers/table", ContainerLive.Index, :table
live "/containers/new", ContainerLive.Index, :new live "/containers/new", ContainerLive.Index, :new
live "/containers/:id/edit", ContainerLive.Index, :edit live "/containers/edit/:id", ContainerLive.Index, :edit
live "/containers/:id/clone", ContainerLive.Index, :clone live "/containers/clone/:id", ContainerLive.Index, :clone
live "/containers/:id/edit_tags", ContainerLive.Index, :edit_tags live "/containers/edit_tags/:id", ContainerLive.Index, :edit_tags
live "/containers/search/:search", ContainerLive.Index, :search
live "/containers/:id/show", ContainerLive.Show, :show live "/container/:id", ContainerLive.Show, :show
live "/containers/:id/show/table", ContainerLive.Show, :table live "/container/edit/:id", ContainerLive.Show, :edit
live "/containers/:id/show/edit", ContainerLive.Show, :edit live "/container/edit_tags/:id", ContainerLive.Show, :edit_tags
live "/containers/:id/show/edit_tags", ContainerLive.Show, :edit_tags
live "/ammo", AmmoGroupLive.Index, :index live "/ammo", AmmoGroupLive.Index, :index
live "/ammo/new", AmmoGroupLive.Index, :new live "/ammo/new", AmmoGroupLive.Index, :new
live "/ammo/:id/edit", AmmoGroupLive.Index, :edit live "/ammo/edit/:id", AmmoGroupLive.Index, :edit
live "/ammo/:id/clone", AmmoGroupLive.Index, :clone live "/ammo/clone/:id", AmmoGroupLive.Index, :clone
live "/ammo/:id/add_shot_group", AmmoGroupLive.Index, :add_shot_group live "/ammo/add_shot_group/:id", AmmoGroupLive.Index, :add_shot_group
live "/ammo/:id/move", AmmoGroupLive.Index, :move live "/ammo/move/:id", AmmoGroupLive.Index, :move
live "/ammo/search/:search", AmmoGroupLive.Index, :search
live "/ammo/:id/show", AmmoGroupLive.Show, :show live "/ammo/show/:id", AmmoGroupLive.Show, :show
live "/ammo/:id/show/edit", AmmoGroupLive.Show, :edit live "/ammo/show/edit/:id", AmmoGroupLive.Show, :edit
live "/ammo/:id/show/add_shot_group", AmmoGroupLive.Show, :add_shot_group live "/ammo/show/add_shot_group/:id", AmmoGroupLive.Show, :add_shot_group
live "/ammo/:id/show/move", AmmoGroupLive.Show, :move live "/ammo/show/move/:id", AmmoGroupLive.Show, :move
live "/ammo/:id/show/:shot_group_id/edit", AmmoGroupLive.Show, :edit_shot_group live "/ammo/show/:id/edit/:shot_group_id", AmmoGroupLive.Show, :edit_shot_group
live "/range", RangeLive.Index, :index live "/range", RangeLive.Index, :index
live "/range/:id/edit", RangeLive.Index, :edit live "/range/edit/:id", RangeLive.Index, :edit
live "/range/:id/add_shot_group", RangeLive.Index, :add_shot_group live "/range/add_shot_group/:id", RangeLive.Index, :add_shot_group
live "/range/search/:search", RangeLive.Index, :search
end end
scope "/", CanneryWeb do scope "/", CanneryWeb do

View File

@ -4,7 +4,7 @@ defmodule Cannery.MixProject do
def project do def project do
[ [
app: :cannery, app: :cannery,
version: "0.7.1", version: "0.8.0",
elixir: "1.14.1", elixir: "1.14.1",
elixirc_paths: elixirc_paths(Mix.env()), elixirc_paths: elixirc_paths(Mix.env()),
compilers: Mix.compilers(), compilers: Mix.compilers(),

View File

@ -10,8 +10,8 @@
msgid "" msgid ""
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.ex:44 #: lib/cannery_web/live/ammo_group_live/index.ex:54
#: lib/cannery_web/live/ammo_group_live/index.ex:50 #: lib/cannery_web/live/ammo_group_live/index.ex:62
#: lib/cannery_web/live/ammo_group_live/index.html.heex:40 #: lib/cannery_web/live/ammo_group_live/index.html.heex:40
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Add Ammo" msgid "Add Ammo"
@ -156,9 +156,9 @@ msgstr ""
msgid "Why not get some ready to shoot?" msgid "Why not get some ready to shoot?"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.html.heex:79 #: lib/cannery_web/live/ammo_group_live/index.html.heex:100
#: lib/cannery_web/live/ammo_group_live/show.html.heex:101 #: lib/cannery_web/live/ammo_group_live/show.html.heex:101
#: lib/cannery_web/live/range_live/index.html.heex:38 #: lib/cannery_web/live/range_live/index.html.heex:39
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Record shots" msgid "Record shots"
msgstr "" msgstr ""
@ -234,13 +234,13 @@ msgid "Set Unlimited"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/show.html.heex:86 #: lib/cannery_web/live/ammo_group_live/show.html.heex:86
#: lib/cannery_web/live/range_live/index.html.heex:31 #: lib/cannery_web/live/range_live/index.html.heex:32
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Stage for range" msgid "Stage for range"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/show.html.heex:85 #: lib/cannery_web/live/ammo_group_live/show.html.heex:85
#: lib/cannery_web/live/range_live/index.html.heex:30 #: lib/cannery_web/live/range_live/index.html.heex:31
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Unstage from range" msgid "Unstage from range"
msgstr "" msgstr ""

View File

@ -23,8 +23,8 @@ msgstr ""
## Run "mix gettext.extract" to bring this file up to ## Run "mix gettext.extract" to bring this file up to
## date. Leave "msgstr"s empty as changing them here has no ## date. Leave "msgstr"s empty as changing them here has no
## effect: edit them in PO (.po) files instead. ## effect: edit them in PO (.po) files instead.
#: lib/cannery_web/live/ammo_group_live/index.ex:44 #: lib/cannery_web/live/ammo_group_live/index.ex:54
#: lib/cannery_web/live/ammo_group_live/index.ex:50 #: lib/cannery_web/live/ammo_group_live/index.ex:62
#: lib/cannery_web/live/ammo_group_live/index.html.heex:40 #: lib/cannery_web/live/ammo_group_live/index.html.heex:40
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Add Ammo" msgid "Add Ammo"
@ -169,9 +169,9 @@ msgstr "Munition markieren"
msgid "Why not get some ready to shoot?" msgid "Why not get some ready to shoot?"
msgstr "Warum nicht einige für den Schießstand auswählen?" msgstr "Warum nicht einige für den Schießstand auswählen?"
#: lib/cannery_web/live/ammo_group_live/index.html.heex:79 #: lib/cannery_web/live/ammo_group_live/index.html.heex:100
#: lib/cannery_web/live/ammo_group_live/show.html.heex:101 #: lib/cannery_web/live/ammo_group_live/show.html.heex:101
#: lib/cannery_web/live/range_live/index.html.heex:38 #: lib/cannery_web/live/range_live/index.html.heex:39
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Record shots" msgid "Record shots"
msgstr "Schüsse dokumentieren" msgstr "Schüsse dokumentieren"
@ -247,13 +247,13 @@ msgid "Set Unlimited"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/show.html.heex:86 #: lib/cannery_web/live/ammo_group_live/show.html.heex:86
#: lib/cannery_web/live/range_live/index.html.heex:31 #: lib/cannery_web/live/range_live/index.html.heex:32
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Stage for range" msgid "Stage for range"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/show.html.heex:85 #: lib/cannery_web/live/ammo_group_live/show.html.heex:85
#: lib/cannery_web/live/range_live/index.html.heex:30 #: lib/cannery_web/live/range_live/index.html.heex:31
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Unstage from range" msgid "Unstage from range"
msgstr "" msgstr ""

View File

@ -45,10 +45,11 @@ msgstr "Admins"
msgid "Admins:" msgid "Admins:"
msgstr "Admins:" msgstr "Admins:"
#: lib/cannery_web/components/shot_group_table_component.ex:41
#: lib/cannery_web/components/topbar.ex:73 #: lib/cannery_web/components/topbar.ex:73
#: lib/cannery_web/live/ammo_group_live/index.ex:56 #: lib/cannery_web/live/ammo_group_live/index.ex:70
#: lib/cannery_web/live/ammo_group_live/index.ex:79
#: lib/cannery_web/live/ammo_group_live/index.html.heex:3 #: lib/cannery_web/live/ammo_group_live/index.html.heex:3
#: lib/cannery_web/live/range_live/index.ex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Ammo" msgid "Ammo"
msgstr "Munition" msgstr "Munition"
@ -64,8 +65,8 @@ msgstr "Munitionsarten"
msgid "Background color" msgid "Background color"
msgstr "Hintergrundfarbe" msgstr "Hintergrundfarbe"
#: lib/cannery_web/components/ammo_type_table_component.ex:65
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:140 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:140
#: lib/cannery_web/live/ammo_type_live/index.ex:82
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Blank" msgid "Blank"
msgstr "Knallpatrone" msgstr "Knallpatrone"
@ -75,32 +76,32 @@ msgstr "Knallpatrone"
msgid "Brass" msgid "Brass"
msgstr "Messing" msgstr "Messing"
#: lib/cannery_web/components/ammo_type_table_component.ex:47
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:44 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:44
#: lib/cannery_web/live/ammo_type_live/index.ex:64
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Bullet core" msgid "Bullet core"
msgstr "Projektilkern" msgstr "Projektilkern"
#: lib/cannery_web/components/ammo_type_table_component.ex:46
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:37 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:37
#: lib/cannery_web/live/ammo_type_live/index.ex:63
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Bullet type" msgid "Bullet type"
msgstr "Patronenart" msgstr "Patronenart"
#: lib/cannery_web/components/ammo_type_table_component.ex:49
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:58 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:58
#: lib/cannery_web/live/ammo_type_live/index.ex:66
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Caliber" msgid "Caliber"
msgstr "Kaliber" msgstr "Kaliber"
#: lib/cannery_web/components/ammo_type_table_component.ex:48
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:51 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:51
#: lib/cannery_web/live/ammo_type_live/index.ex:65
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Cartridge" msgid "Cartridge"
msgstr "Patrone" msgstr "Patrone"
#: lib/cannery_web/components/ammo_type_table_component.ex:50
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:65 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:65
#: lib/cannery_web/live/ammo_type_live/index.ex:67
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Case material" msgid "Case material"
msgstr "Gehäusematerial" msgstr "Gehäusematerial"
@ -113,15 +114,15 @@ msgid "Container"
msgstr "Behälter" msgstr "Behälter"
#: lib/cannery_web/components/topbar.ex:57 #: lib/cannery_web/components/topbar.ex:57
#: lib/cannery_web/live/container_live/index.ex:44 #: lib/cannery_web/live/container_live/index.ex:49
#: lib/cannery_web/live/container_live/index.ex:53 #: lib/cannery_web/live/container_live/index.ex:58
#: lib/cannery_web/live/container_live/index.html.heex:3 #: lib/cannery_web/live/container_live/index.html.heex:3
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Containers" msgid "Containers"
msgstr "Behälter" msgstr "Behälter"
#: lib/cannery_web/components/ammo_type_table_component.ex:66
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:144 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:144
#: lib/cannery_web/live/ammo_type_live/index.ex:83
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Corrosive" msgid "Corrosive"
msgstr "Korrosiv" msgstr "Korrosiv"
@ -138,9 +139,9 @@ msgstr "Anzahl"
msgid "Count:" msgid "Count:"
msgstr "Anzahl:" msgstr "Anzahl:"
#: lib/cannery_web/components/container_table_component.ex:47
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:24 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:24
#: lib/cannery_web/live/container_live/form_component.html.heex:27 #: lib/cannery_web/live/container_live/form_component.html.heex:27
#: lib/cannery_web/live/container_live/index.ex:122
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Description" msgid "Description"
msgstr "Beschreibung" msgstr "Beschreibung"
@ -156,17 +157,12 @@ msgstr "Beschreibung:"
msgid "Easy to Use:" msgid "Easy to Use:"
msgstr "Einfache Anwendung:" msgstr "Einfache Anwendung:"
#: lib/cannery_web/live/ammo_type_live/index.ex:23
#, elixir-autogen, elixir-format
msgid "Edit Ammo type"
msgstr "Munitionstyp bearbeiten"
#: lib/cannery_web/live/invite_live/index.ex:33 #: lib/cannery_web/live/invite_live/index.ex:33
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit Invite" msgid "Edit Invite"
msgstr "Einladung bearbeiten" msgstr "Einladung bearbeiten"
#: lib/cannery_web/live/tag_live/index.ex:21 #: lib/cannery_web/live/tag_live/index.ex:28
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit Tag" msgid "Edit Tag"
msgstr "Tag bearbeiten" msgstr "Tag bearbeiten"
@ -181,14 +177,14 @@ msgstr "Beispiel Munitionstyp Abkürzungen"
msgid "FMJ" msgid "FMJ"
msgstr "VM" msgstr "VM"
#: lib/cannery_web/components/ammo_type_table_component.ex:59
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:103 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:103
#: lib/cannery_web/live/ammo_type_live/index.ex:76
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Grains" msgid "Grains"
msgstr "Körner" msgstr "Körner"
#: lib/cannery_web/components/ammo_type_table_component.ex:64
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:136 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:136
#: lib/cannery_web/live/ammo_type_live/index.ex:81
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Incendiary" msgid "Incendiary"
msgstr "Brandmunition" msgstr "Brandmunition"
@ -220,9 +216,9 @@ msgstr "Einladungen"
msgid "Keep me logged in for 60 days" msgid "Keep me logged in for 60 days"
msgstr "Für 60 Tage eingeloggt bleiben" msgstr "Für 60 Tage eingeloggt bleiben"
#: lib/cannery_web/components/container_table_component.ex:48
#: lib/cannery_web/components/move_ammo_group_component.ex:69 #: lib/cannery_web/components/move_ammo_group_component.ex:69
#: lib/cannery_web/live/container_live/form_component.html.heex:42 #: lib/cannery_web/live/container_live/form_component.html.heex:42
#: lib/cannery_web/live/container_live/index.ex:123
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Location" msgid "Location"
msgstr "Standort" msgstr "Standort"
@ -238,8 +234,8 @@ msgstr "Standort:"
msgid "Magazine, Clip, Ammo Box, etc" msgid "Magazine, Clip, Ammo Box, etc"
msgstr "Magazin, Ladestreifen, Munitionskiste usw." msgstr "Magazin, Ladestreifen, Munitionskiste usw."
#: lib/cannery_web/components/ammo_type_table_component.ex:67
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:148 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:148
#: lib/cannery_web/live/ammo_type_live/index.ex:84
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Manufacturer" msgid "Manufacturer"
msgstr "Hersteller" msgstr "Hersteller"
@ -254,24 +250,24 @@ msgstr "Metallene Munitionskiste mit Anime-Girl-Sticker"
msgid "My cool ammo can" msgid "My cool ammo can"
msgstr "Meine coole Munitionskiste" msgstr "Meine coole Munitionskiste"
#: lib/cannery_web/components/ammo_type_table_component.ex:45
#: lib/cannery_web/components/container_table_component.ex:46
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:20 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:20
#: lib/cannery_web/live/ammo_type_live/index.ex:62
#: lib/cannery_web/live/container_live/form_component.html.heex:20 #: lib/cannery_web/live/container_live/form_component.html.heex:20
#: lib/cannery_web/live/container_live/index.ex:121
#: lib/cannery_web/live/invite_live/form_component.html.heex:20 #: lib/cannery_web/live/invite_live/form_component.html.heex:20
#: lib/cannery_web/live/tag_live/form_component.ex:75 #: lib/cannery_web/live/tag_live/form_component.ex:75
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Name" msgid "Name"
msgstr "Name" msgstr "Name"
#: lib/cannery_web/live/ammo_type_live/index.ex:29 #: lib/cannery_web/live/ammo_type_live/index.ex:36
#: lib/cannery_web/live/ammo_type_live/index.ex:35 #: lib/cannery_web/live/ammo_type_live/index.ex:44
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "New Ammo type" msgid "New Ammo type"
msgstr "Neuer Munitionstyp" msgstr "Neuer Munitionstyp"
#: lib/cannery_web/live/container_live/index.ex:31 #: lib/cannery_web/live/container_live/index.ex:36
#: lib/cannery_web/live/container_live/index.ex:38 #: lib/cannery_web/live/container_live/index.ex:43
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "New Container" msgid "New Container"
msgstr "Neuer Behälter" msgstr "Neuer Behälter"
@ -281,12 +277,13 @@ msgstr "Neuer Behälter"
msgid "New Invite" msgid "New Invite"
msgstr "Neue Einladung" msgstr "Neue Einladung"
#: lib/cannery_web/live/tag_live/index.ex:27 #: lib/cannery_web/live/tag_live/index.ex:36
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "New Tag" msgid "New Tag"
msgstr "Neuer Tag" msgstr "Neuer Tag"
#: lib/cannery_web/live/ammo_group_live/index.html.heex:8 #: lib/cannery_web/live/ammo_group_live/index.html.heex:8
#: lib/cannery_web/live/ammo_group_live/index.html.heex:70
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No Ammo" msgid "No Ammo"
msgstr "Keine Munition" msgstr "Keine Munition"
@ -297,6 +294,7 @@ msgid "No ammo for this type"
msgstr "Keine Munition dieser Art" msgstr "Keine Munition dieser Art"
#: lib/cannery_web/live/container_live/index.html.heex:8 #: lib/cannery_web/live/container_live/index.html.heex:8
#: lib/cannery_web/live/container_live/index.html.heex:47
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No containers" msgid "No containers"
msgstr "Kein Behälter" msgstr "Kein Behälter"
@ -308,16 +306,17 @@ msgstr "Keine Einladung"
#: lib/cannery_web/live/container_live/edit_tags_component.html.heex:31 #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:31
#: lib/cannery_web/live/tag_live/index.html.heex:10 #: lib/cannery_web/live/tag_live/index.html.heex:10
#: lib/cannery_web/live/tag_live/index.html.heex:43
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No tags" msgid "No tags"
msgstr "Keine Tags" msgstr "Keine Tags"
#: lib/cannery_web/components/add_shot_group_component.html.heex:37 #: lib/cannery_web/components/add_shot_group_component.html.heex:37
#: lib/cannery_web/components/ammo_group_table_component.ex:81 #: lib/cannery_web/components/ammo_group_table_component.ex:81
#: lib/cannery_web/components/shot_group_table_component.ex:43
#: lib/cannery_web/live/ammo_group_live/form_component.html.heex:49 #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:49
#: lib/cannery_web/live/ammo_group_live/show.ex:93 #: lib/cannery_web/live/ammo_group_live/show.ex:93
#: lib/cannery_web/live/range_live/form_component.html.heex:29 #: lib/cannery_web/live/range_live/form_component.html.heex:29
#: lib/cannery_web/live/range_live/index.ex:82
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Notes" msgid "Notes"
msgstr "Bemerkungen" msgstr "Bemerkungen"
@ -333,8 +332,8 @@ msgstr "Bemerkungen:"
msgid "On the bookshelf" msgid "On the bookshelf"
msgstr "Auf dem Bücherregal" msgstr "Auf dem Bücherregal"
#: lib/cannery_web/components/ammo_type_table_component.ex:60
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:111 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:111
#: lib/cannery_web/live/ammo_type_live/index.ex:77
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Pressure" msgid "Pressure"
msgstr "Druck" msgstr "Druck"
@ -350,8 +349,8 @@ msgstr "Kaufpreis"
msgid "Price paid:" msgid "Price paid:"
msgstr "Kaufpreis:" msgstr "Kaufpreis:"
#: lib/cannery_web/components/ammo_type_table_component.ex:61
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:118 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:118
#: lib/cannery_web/live/ammo_type_live/index.ex:78
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Primer type" msgid "Primer type"
msgstr "Zündertyp" msgstr "Zündertyp"
@ -394,9 +393,10 @@ msgstr "Stahl"
msgid "Stored in" msgid "Stored in"
msgstr "Gelagert in" msgstr "Gelagert in"
#: lib/cannery_web/components/container_table_component.ex:52
#: lib/cannery_web/components/topbar.ex:49 #: lib/cannery_web/components/topbar.ex:49
#: lib/cannery_web/live/container_live/index.ex:127 #: lib/cannery_web/live/tag_live/index.ex:44
#: lib/cannery_web/live/tag_live/index.ex:32 #: lib/cannery_web/live/tag_live/index.ex:54
#: lib/cannery_web/live/tag_live/index.html.heex:3 #: lib/cannery_web/live/tag_live/index.html.heex:3
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Tags" msgid "Tags"
@ -417,15 +417,15 @@ msgstr "Textfarbe"
msgid "The self-hosted firearm tracker website" msgid "The self-hosted firearm tracker website"
msgstr "Die selbst-gehostete Website zur Verwaltung von Schusswaffen" msgstr "Die selbst-gehostete Website zur Verwaltung von Schusswaffen"
#: lib/cannery_web/components/ammo_type_table_component.ex:63
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:132 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:132
#: lib/cannery_web/live/ammo_type_live/index.ex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Tracer" msgid "Tracer"
msgstr "Leuchtspur" msgstr "Leuchtspur"
#: lib/cannery_web/components/container_table_component.ex:49
#: lib/cannery_web/components/move_ammo_group_component.ex:68 #: lib/cannery_web/components/move_ammo_group_component.ex:68
#: lib/cannery_web/live/container_live/form_component.html.heex:35 #: lib/cannery_web/live/container_live/form_component.html.heex:35
#: lib/cannery_web/live/container_live/index.ex:124
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Type" msgid "Type"
msgstr "Art" msgstr "Art"
@ -478,9 +478,9 @@ msgid "Range day"
msgstr "Range Day" msgstr "Range Day"
#: lib/cannery_web/components/add_shot_group_component.html.heex:45 #: lib/cannery_web/components/add_shot_group_component.html.heex:45
#: lib/cannery_web/components/shot_group_table_component.ex:44
#: lib/cannery_web/live/ammo_group_live/show.ex:94 #: lib/cannery_web/live/ammo_group_live/show.ex:94
#: lib/cannery_web/live/range_live/form_component.html.heex:36 #: lib/cannery_web/live/range_live/form_component.html.heex:36
#: lib/cannery_web/live/range_live/index.ex:83
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Date" msgid "Date"
msgstr "Datum" msgstr "Datum"
@ -496,23 +496,24 @@ msgid "No ammo staged"
msgstr "Keine Munition selektiert" msgstr "Keine Munition selektiert"
#: lib/cannery_web/components/add_shot_group_component.html.heex:3 #: lib/cannery_web/components/add_shot_group_component.html.heex:3
#: lib/cannery_web/live/ammo_group_live/index.ex:26 #: lib/cannery_web/live/ammo_group_live/index.ex:30
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Record shots" msgid "Record shots"
msgstr "Schüsse dokumentieren" msgstr "Schüsse dokumentieren"
#: lib/cannery_web/live/ammo_group_live/show.ex:42 #: lib/cannery_web/live/ammo_group_live/show.ex:42
#: lib/cannery_web/live/range_live/index.ex:32 #: lib/cannery_web/live/range_live/index.ex:41
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit Shot Records" msgid "Edit Shot Records"
msgstr "Schießkladde editieren" msgstr "Schießkladde editieren"
#: lib/cannery_web/live/range_live/index.ex:38 #: lib/cannery_web/live/range_live/index.ex:49
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "New Shot Records" msgid "New Shot Records"
msgstr "Neue Schießkladde" msgstr "Neue Schießkladde"
#: lib/cannery_web/live/range_live/index.html.heex:48 #: lib/cannery_web/live/range_live/index.html.heex:50
#: lib/cannery_web/live/range_live/index.html.heex:92
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No shots recorded" msgid "No shots recorded"
msgstr "Keine Schüsse dokumentiert" msgstr "Keine Schüsse dokumentiert"
@ -523,20 +524,21 @@ msgstr "Keine Schüsse dokumentiert"
msgid "Rounds left" msgid "Rounds left"
msgstr "Patronen verbleibend" msgstr "Patronen verbleibend"
#: lib/cannery_web/components/shot_group_table_component.ex:42
#: lib/cannery_web/live/ammo_group_live/show.ex:92 #: lib/cannery_web/live/ammo_group_live/show.ex:92
#: lib/cannery_web/live/range_live/index.ex:81 #: lib/cannery_web/live/range_live/index.html.heex:64
#: lib/cannery_web/live/range_live/index.html.heex:62
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Rounds shot" msgid "Rounds shot"
msgstr "Patronen abgefeuert" msgstr "Patronen abgefeuert"
#: lib/cannery_web/live/range_live/index.ex:44 #: lib/cannery_web/live/range_live/index.ex:57
#: lib/cannery_web/live/range_live/index.ex:67
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot Records" msgid "Shot Records"
msgstr "Schießkladde" msgstr "Schießkladde"
#: lib/cannery_web/live/ammo_group_live/index.ex:32 #: lib/cannery_web/live/ammo_group_live/index.ex:38
#: lib/cannery_web/live/ammo_group_live/index.html.heex:96 #: lib/cannery_web/live/ammo_group_live/index.html.heex:117
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Move ammo" msgid "Move ammo"
msgstr "Munition verschieben" msgstr "Munition verschieben"
@ -546,18 +548,18 @@ msgstr "Munition verschieben"
msgid "No other containers" msgid "No other containers"
msgstr "Kein weiterer Behälter" msgstr "Kein weiterer Behälter"
#: lib/cannery_web/live/range_live/index.html.heex:53 #: lib/cannery_web/live/range_live/index.html.heex:55
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot log" msgid "Shot log"
msgstr "Schießkladde" msgstr "Schießkladde"
#: lib/cannery_web/components/ammo_group_card.ex:71 #: lib/cannery_web/components/ammo_group_card.ex:71
#: lib/cannery_web/components/ammo_group_card.ex:78 #: lib/cannery_web/components/ammo_group_card.ex:78
#: lib/cannery_web/components/ammo_group_table_component.ex:152 #: lib/cannery_web/components/ammo_group_table_component.ex:153
#: lib/cannery_web/components/ammo_group_table_component.ex:224 #: lib/cannery_web/components/ammo_group_table_component.ex:225
#: lib/cannery_web/components/ammo_type_table_component.ex:180
#: lib/cannery_web/live/ammo_group_live/show.html.heex:37 #: lib/cannery_web/live/ammo_group_live/show.html.heex:37
#: lib/cannery_web/live/ammo_group_live/show.html.heex:44 #: lib/cannery_web/live/ammo_group_live/show.html.heex:44
#: lib/cannery_web/live/ammo_type_live/index.ex:179
#: lib/cannery_web/live/ammo_type_live/show.html.heex:136 #: lib/cannery_web/live/ammo_type_live/show.html.heex:136
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "$%{amount}" msgid "$%{amount}"
@ -568,32 +570,32 @@ msgstr "$%{amount}"
msgid "Bimetal" msgid "Bimetal"
msgstr "Bimetall" msgstr "Bimetall"
#: lib/cannery_web/components/ammo_type_table_component.ex:51
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:72 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:72
#: lib/cannery_web/live/ammo_type_live/index.ex:68
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Jacket type" msgid "Jacket type"
msgstr "Patronenhülse" msgstr "Patronenhülse"
#: lib/cannery_web/components/ammo_type_table_component.ex:52
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:79 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:79
#: lib/cannery_web/live/ammo_type_live/index.ex:69
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Muzzle velocity" msgid "Muzzle velocity"
msgstr "Mündungsgeschwindigkeit" msgstr "Mündungsgeschwindigkeit"
#: lib/cannery_web/components/ammo_type_table_component.ex:55
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:93 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:93
#: lib/cannery_web/live/ammo_type_live/index.ex:72
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Powder grains per charge" msgid "Powder grains per charge"
msgstr "Pulverkörner pro Ladung" msgstr "Pulverkörner pro Ladung"
#: lib/cannery_web/components/ammo_type_table_component.ex:53
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:89 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:89
#: lib/cannery_web/live/ammo_type_live/index.ex:70
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Powder type" msgid "Powder type"
msgstr "Pulverart" msgstr "Pulverart"
#: lib/cannery_web/components/ammo_type_table_component.ex:68
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:152 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:152
#: lib/cannery_web/live/ammo_type_live/index.ex:85
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "UPC" msgid "UPC"
msgstr "UPC" msgstr "UPC"
@ -614,18 +616,18 @@ msgstr "Derzeitiges Passwort"
msgid "New password" msgid "New password"
msgstr "Neues Passwort" msgstr "Neues Passwort"
#: lib/cannery_web/live/ammo_group_live/index.html.heex:72 #: lib/cannery_web/live/ammo_group_live/index.html.heex:93
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Stage" msgid "Stage"
msgstr "Markiert" msgstr "Markiert"
#: lib/cannery_web/live/ammo_group_live/index.html.heex:72 #: lib/cannery_web/live/ammo_group_live/index.html.heex:93
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Unstage" msgid "Unstage"
msgstr "Demarkiert" msgstr "Demarkiert"
#: lib/cannery_web/components/ammo_type_table_component.ex:62
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:125 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:125
#: lib/cannery_web/live/ammo_type_live/index.ex:79
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Firing type" msgid "Firing type"
msgstr "Patronenhülsenform" msgstr "Patronenhülsenform"
@ -640,14 +642,14 @@ msgstr "Neu verbinden..."
msgid "Loading..." msgid "Loading..."
msgstr "Lädt..." msgstr "Lädt..."
#: lib/cannery_web/live/container_live/index.ex:27 #: lib/cannery_web/live/container_live/index.ex:32
#: lib/cannery_web/live/container_live/show.ex:126 #: lib/cannery_web/live/container_live/show.ex:113
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit %{name}" msgid "Edit %{name}"
msgstr "%{name} bearbeiten" msgstr "%{name} bearbeiten"
#: lib/cannery_web/live/container_live/index.ex:65 #: lib/cannery_web/live/container_live/index.ex:69
#: lib/cannery_web/live/container_live/show.ex:127 #: lib/cannery_web/live/container_live/show.ex:114
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit %{name} tags" msgid "Edit %{name} tags"
msgstr "Editiere %{name} Tags" msgstr "Editiere %{name} Tags"
@ -659,8 +661,8 @@ msgstr "Editiere %{name} Tags"
msgid "Rounds:" msgid "Rounds:"
msgstr "Patronen:" msgstr "Patronen:"
#: lib/cannery_web/components/ammo_group_table_component.ex:221 #: lib/cannery_web/components/ammo_group_table_component.ex:222
#: lib/cannery_web/live/ammo_type_live/index.ex:178 #: lib/cannery_web/components/ammo_type_table_component.ex:179
#: lib/cannery_web/live/ammo_type_live/show.html.heex:142 #: lib/cannery_web/live/ammo_type_live/show.html.heex:142
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No cost information" msgid "No cost information"
@ -711,7 +713,7 @@ msgstr "Passwort vergessen?"
msgid "Log in" msgid "Log in"
msgstr "Einloggen" msgstr "Einloggen"
#: lib/cannery_web/controllers/user_registration_controller.ex:35 #: lib/cannery_web/controllers/user_registration_controller.ex:34
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Register" msgid "Register"
msgstr "Registrieren" msgstr "Registrieren"
@ -722,7 +724,7 @@ msgid "Reset your password"
msgstr "Passwort zurücksetzen" msgstr "Passwort zurücksetzen"
#: lib/cannery_web/live/ammo_group_live/show.ex:41 #: lib/cannery_web/live/ammo_group_live/show.ex:41
#: lib/cannery_web/live/range_live/index.ex:26 #: lib/cannery_web/live/range_live/index.ex:33
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Record Shots" msgid "Record Shots"
msgstr "Schüsse dokumentieren" msgstr "Schüsse dokumentieren"
@ -732,11 +734,6 @@ msgstr "Schüsse dokumentieren"
msgid "Copies" msgid "Copies"
msgstr "Kopien" msgstr "Kopien"
#: lib/cannery_web/live/ammo_type_live/index.ex:40
#, elixir-autogen, elixir-format
msgid "Ammo types"
msgstr "Munitionsart"
#: lib/cannery_web/live/ammo_type_live/show.html.heex:123 #: lib/cannery_web/live/ammo_type_live/show.html.heex:123
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Added on:" msgid "Added on:"
@ -791,6 +788,8 @@ msgid "View the source code"
msgstr "Quellcode ansehen" msgstr "Quellcode ansehen"
#: lib/cannery_web/components/topbar.ex:65 #: lib/cannery_web/components/topbar.ex:65
#: lib/cannery_web/live/ammo_type_live/index.ex:52
#: lib/cannery_web/live/ammo_type_live/index.ex:62
#: lib/cannery_web/live/ammo_type_live/index.html.heex:3 #: lib/cannery_web/live/ammo_type_live/index.html.heex:3
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Catalog" msgid "Catalog"
@ -849,45 +848,45 @@ msgstr ""
msgid "Container:" msgid "Container:"
msgstr "Behälter" msgstr "Behälter"
#: lib/cannery_web/live/ammo_group_live/index.html.heex:48 #: lib/cannery_web/live/ammo_group_live/index.html.heex:63
#: lib/cannery_web/live/ammo_type_live/index.html.heex:23 #: lib/cannery_web/live/ammo_type_live/index.html.heex:39
#: lib/cannery_web/live/ammo_type_live/show.html.heex:152 #: lib/cannery_web/live/ammo_type_live/show.html.heex:152
#: lib/cannery_web/live/container_live/show.html.heex:105 #: lib/cannery_web/live/container_live/show.html.heex:105
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Show used" msgid "Show used"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:192 #: lib/cannery_web/components/ammo_group_table_component.ex:193
#: lib/cannery_web/live/ammo_group_live/show.html.heex:19 #: lib/cannery_web/live/ammo_group_live/show.html.heex:19
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{percentage}%" msgid "%{percentage}%"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.ex:114 #: lib/cannery_web/live/range_live/index.ex:136
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Rounds shot: %{count}" msgid "Rounds shot: %{count}"
msgstr "Patronen abgefeuert" msgstr "Patronen abgefeuert"
#: lib/cannery_web/live/ammo_type_live/index.ex:117 #: lib/cannery_web/components/ammo_type_table_component.ex:100
#: lib/cannery_web/live/container_live/index.ex:125 #: lib/cannery_web/components/container_table_component.ex:50
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Packs" msgid "Packs"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:97 #: lib/cannery_web/components/ammo_type_table_component.ex:80
#: lib/cannery_web/live/container_live/index.ex:126 #: lib/cannery_web/components/container_table_component.ex:51
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Rounds" msgid "Rounds"
msgstr "Patronen:" msgstr "Patronen:"
#: lib/cannery_web/live/ammo_type_live/show.html.heex:158 #: lib/cannery_web/live/ammo_type_live/show.html.heex:158
#: lib/cannery_web/live/container_live/index.html.heex:23 #: lib/cannery_web/live/container_live/index.html.heex:39
#: lib/cannery_web/live/container_live/show.html.heex:111 #: lib/cannery_web/live/container_live/show.html.heex:111
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "View as table" msgid "View as table"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:127 #: lib/cannery_web/components/ammo_type_table_component.ex:110
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Total ever packs" msgid "Total ever packs"
msgstr "" msgstr ""
@ -897,7 +896,7 @@ msgstr ""
msgid "Total ever packs:" msgid "Total ever packs:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:108 #: lib/cannery_web/components/ammo_type_table_component.ex:91
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Total ever rounds" msgid "Total ever rounds"
msgstr "Summe aller Patronen" msgstr "Summe aller Patronen"
@ -907,7 +906,7 @@ msgstr "Summe aller Patronen"
msgid "Total ever rounds:" msgid "Total ever rounds:"
msgstr "Summe abgegebener Schüsse:" msgstr "Summe abgegebener Schüsse:"
#: lib/cannery_web/live/ammo_type_live/index.ex:122 #: lib/cannery_web/components/ammo_type_table_component.ex:105
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Used packs" msgid "Used packs"
msgstr "" msgstr ""
@ -917,7 +916,7 @@ msgstr ""
msgid "Used packs:" msgid "Used packs:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:103 #: lib/cannery_web/components/ammo_type_table_component.ex:86
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Used rounds" msgid "Used rounds"
msgstr "" msgstr ""
@ -932,7 +931,7 @@ msgstr ""
msgid "Used up!" msgid "Used up!"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:64 #: lib/cannery_web/live/range_live/index.html.heex:66
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Rounds shot chart" msgid "Rounds shot chart"
msgstr "Patronen abgefeuert" msgstr "Patronen abgefeuert"
@ -1032,19 +1031,20 @@ msgstr "Leuchtspur"
msgid "UPC:" msgid "UPC:"
msgstr "UPC" msgstr "UPC"
#: lib/cannery_web/live/ammo_type_live/index.ex:137 #: lib/cannery_web/components/ammo_type_table_component.ex:120
#: lib/cannery_web/live/ammo_type_live/show.html.heex:132 #: lib/cannery_web/live/ammo_type_live/show.html.heex:132
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Average CPR" msgid "Average CPR"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:28
#: lib/cannery_web/live/ammo_type_live/show.ex:120 #: lib/cannery_web/live/ammo_type_live/show.ex:120
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Edit %{ammo_type_name}" msgid "Edit %{ammo_type_name}"
msgstr "%{name} bearbeiten" msgstr "%{name} bearbeiten"
#: lib/cannery_web/components/ammo_group_card.ex:39 #: lib/cannery_web/components/ammo_group_card.ex:39
#: lib/cannery_web/components/ammo_group_table_component.ex:230 #: lib/cannery_web/components/ammo_group_table_component.ex:231
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Empty" msgid "Empty"
msgstr "" msgstr ""
@ -1094,7 +1094,7 @@ msgstr ""
msgid "Last used on:" msgid "Last used on:"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:177 #: lib/cannery_web/components/ammo_group_table_component.ex:178
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Never used" msgid "Never used"
msgstr "" msgstr ""
@ -1111,12 +1111,38 @@ msgstr ""
msgid "Purchased on:" msgid "Purchased on:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.ex:38 #: lib/cannery_web/live/ammo_group_live/index.ex:46
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Edit ammo" msgid "Edit ammo"
msgstr "Munitionstyp bearbeiten" msgstr "Munitionstyp bearbeiten"
#: lib/cannery_web/live/ammo_type_live/index.html.heex:8 #: lib/cannery_web/live/ammo_type_live/index.html.heex:8
#: lib/cannery_web/live/ammo_type_live/index.html.heex:46
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "No Ammo types" msgid "No Ammo types"
msgstr "Keine Munitionsarten" msgstr "Keine Munitionsarten"
#: lib/cannery_web/live/ammo_type_live/index.html.heex:33
#, elixir-autogen, elixir-format
msgid "Search catalog"
msgstr ""
#: 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
#, elixir-autogen, elixir-format
msgid "Search containers"
msgstr ""
#: lib/cannery_web/live/tag_live/index.html.heex:36
#, elixir-autogen, elixir-format, fuzzy
msgid "Search tags"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:85
#, elixir-autogen, elixir-format
msgid "Search shot records"
msgstr ""

View File

@ -23,18 +23,18 @@ msgstr ""
## Run "mix gettext.extract" to bring this file up to ## Run "mix gettext.extract" to bring this file up to
## date. Leave "msgstr"s empty as changing them here has no ## date. Leave "msgstr"s empty as changing them here has no
## effect: edit them in PO (.po) files instead. ## effect: edit them in PO (.po) files instead.
#: lib/cannery/containers.ex:140 #: lib/cannery/containers.ex:179
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Container must be empty before deleting" msgid "Container must be empty before deleting"
msgstr "Behälter muss vor dem Löschen leer sein" msgstr "Behälter muss vor dem Löschen leer sein"
#: lib/cannery_web/live/container_live/index.ex:88 #: lib/cannery_web/live/container_live/index.ex:92
#: lib/cannery_web/live/container_live/show.ex:77 #: lib/cannery_web/live/container_live/show.ex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Could not delete %{name}: %{error}" msgid "Could not delete %{name}: %{error}"
msgstr "Konnte %{name} nicht löschen: %{error}" msgstr "Konnte %{name} nicht löschen: %{error}"
#: lib/cannery_web/live/container_live/index.ex:76 #: lib/cannery_web/live/container_live/index.ex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Could not find that container" msgid "Could not find that container"
msgstr "Konnte Behälter nicht finden" msgstr "Konnte Behälter nicht finden"
@ -83,14 +83,14 @@ msgstr "Oops, etwas ist schiefgegangen. Bitte beachten Sie den Fehler unten."
msgid "Reset password link is invalid or it has expired." msgid "Reset password link is invalid or it has expired."
msgstr "Link zum Passwort zurücksetzen ist ungültig oder abgelaufen." msgstr "Link zum Passwort zurücksetzen ist ungültig oder abgelaufen."
#: lib/cannery_web/controllers/user_registration_controller.ex:25 #: lib/cannery_web/controllers/user_registration_controller.ex:24
#: lib/cannery_web/controllers/user_registration_controller.ex:56 #: lib/cannery_web/controllers/user_registration_controller.ex:55
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Sorry, public registration is disabled" msgid "Sorry, public registration is disabled"
msgstr "Entschuldigung, aber öffentliche Registrierung ist deaktiviert" msgstr "Entschuldigung, aber öffentliche Registrierung ist deaktiviert"
#: lib/cannery_web/controllers/user_registration_controller.ex:15 #: lib/cannery_web/controllers/user_registration_controller.ex:14
#: lib/cannery_web/controllers/user_registration_controller.ex:46 #: lib/cannery_web/controllers/user_registration_controller.ex:45
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Sorry, this invite was not found or expired" msgid "Sorry, this invite was not found or expired"
msgstr "" msgstr ""
@ -121,17 +121,17 @@ msgstr "Sie sind nicht berechtigt, diese Seite aufzurufen"
msgid "You are not authorized to view this page." msgid "You are not authorized to view this page."
msgstr "Sie sind nicht berechtigt, diese Seite aufzurufen." msgstr "Sie sind nicht berechtigt, diese Seite aufzurufen."
#: lib/cannery/accounts/user.ex:138 #: lib/cannery/accounts/user.ex:137
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "did not change" msgid "did not change"
msgstr "hat sich nicht geändert" msgstr "hat sich nicht geändert"
#: lib/cannery/accounts/user.ex:159 #: lib/cannery/accounts/user.ex:158
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "does not match password" msgid "does not match password"
msgstr "Passwort stimmt nicht überein" msgstr "Passwort stimmt nicht überein"
#: lib/cannery/accounts/user.ex:196 #: lib/cannery/accounts/user.ex:195
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "is not valid" msgid "is not valid"
msgstr "ist nicht gültig" msgstr "ist nicht gültig"
@ -141,7 +141,7 @@ msgstr "ist nicht gültig"
msgid "must have the @ sign and no spaces" msgid "must have the @ sign and no spaces"
msgstr "Muss ein @ Zeichen und keine Leerzeichen haben" msgstr "Muss ein @ Zeichen und keine Leerzeichen haben"
#: lib/cannery/tags.ex:40 #: lib/cannery/tags.ex:66
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Tag not found" msgid "Tag not found"
msgstr "Tag nicht gefunden" msgstr "Tag nicht gefunden"
@ -151,13 +151,13 @@ msgstr "Tag nicht gefunden"
msgid "Tag could not be added" msgid "Tag could not be added"
msgstr "Tag konnte nicht hinzugefügt werden" msgstr "Tag konnte nicht hinzugefügt werden"
#: lib/cannery/activity_log/shot_group.ex:123 #: lib/cannery/activity_log/shot_group.ex:122
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Count must be at least 1" msgid "Count must be at least 1"
msgstr "Anzahl muss mindestens 1 sein" msgstr "Anzahl muss mindestens 1 sein"
#: lib/cannery/activity_log/shot_group.ex:82 #: lib/cannery/activity_log/shot_group.ex:82
#: lib/cannery/activity_log/shot_group.ex:119 #: lib/cannery/activity_log/shot_group.ex:118
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Count must be less than %{count}" msgid "Count must be less than %{count}"
msgstr "Anzahl muss weniger als %{count} betragen" msgstr "Anzahl muss weniger als %{count} betragen"
@ -187,17 +187,17 @@ msgstr ""
"Ungültige Nummer an Kopien. Muss zwischen 1 and %{max} liegen. War " "Ungültige Nummer an Kopien. Muss zwischen 1 and %{max} liegen. War "
"%{multiplier}" "%{multiplier}"
#: lib/cannery/ammo.ex:609 #: lib/cannery/ammo.ex:686
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Invalid multiplier" msgid "Invalid multiplier"
msgstr "" msgstr ""
#: lib/cannery/ammo/ammo_group.ex:96 #: lib/cannery/ammo/ammo_group.ex:97
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Please select an ammo type and container" msgid "Please select an ammo type and container"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:67 #: lib/cannery_web/live/range_live/index.html.heex:69
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Your browser does not support the canvas element." msgid "Your browser does not support the canvas element."
msgstr "" msgstr ""

View File

@ -31,11 +31,11 @@ msgstr ""
msgid "%{name} created successfully" msgid "%{name} created successfully"
msgstr "%{name} erfolgreich erstellt" msgstr "%{name} erfolgreich erstellt"
#: lib/cannery_web/live/ammo_type_live/index.ex:47 #: lib/cannery_web/live/ammo_type_live/index.ex:73
#: lib/cannery_web/live/ammo_type_live/show.ex:55 #: lib/cannery_web/live/ammo_type_live/show.ex:55
#: lib/cannery_web/live/invite_live/index.ex:53 #: lib/cannery_web/live/invite_live/index.ex:53
#: lib/cannery_web/live/invite_live/index.ex:133 #: lib/cannery_web/live/invite_live/index.ex:133
#: lib/cannery_web/live/tag_live/index.ex:38 #: lib/cannery_web/live/tag_live/index.ex:64
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{name} deleted succesfully" msgid "%{name} deleted succesfully"
msgstr "%{name} erfolgreich gelöscht" msgstr "%{name} erfolgreich gelöscht"
@ -50,8 +50,8 @@ msgstr "%{name} erfolgreich deaktiviert"
msgid "%{name} enabled succesfully" msgid "%{name} enabled succesfully"
msgstr "%{name} erfolgreich aktiviert" msgstr "%{name} erfolgreich aktiviert"
#: lib/cannery_web/live/container_live/index.ex:81 #: lib/cannery_web/live/container_live/index.ex:85
#: lib/cannery_web/live/container_live/show.ex:67 #: lib/cannery_web/live/container_live/show.ex:63
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{name} has been deleted" msgid "%{name} has been deleted"
msgstr "%{name} wurde gelöscht" msgstr "%{name} wurde gelöscht"
@ -82,10 +82,10 @@ msgstr ""
"Sind Sie sicher, dass sie %{email} löschen möchten? Dies kann nicht " "Sind Sie sicher, dass sie %{email} löschen möchten? Dies kann nicht "
"zurückgenommen werden!" "zurückgenommen werden!"
#: lib/cannery_web/live/container_live/index.ex:236 #: lib/cannery_web/live/container_live/index.html.heex:92
#: lib/cannery_web/live/container_live/index.html.heex:73 #: lib/cannery_web/live/container_live/index.html.heex:136
#: lib/cannery_web/live/container_live/show.html.heex:59 #: lib/cannery_web/live/container_live/show.html.heex:59
#: lib/cannery_web/live/tag_live/index.html.heex:39 #: lib/cannery_web/live/tag_live/index.html.heex:64
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}?" msgid "Are you sure you want to delete %{name}?"
msgstr "Sind Sie sicher, dass sie %{name} löschen möchten?" msgstr "Sind Sie sicher, dass sie %{name} löschen möchten?"
@ -95,7 +95,7 @@ msgstr "Sind Sie sicher, dass sie %{name} löschen möchten?"
msgid "Are you sure you want to delete the invite for %{name}?" msgid "Are you sure you want to delete the invite for %{name}?"
msgstr "Sind Sie sicher, dass sie die Einladung für %{name} löschen möchten?" msgstr "Sind Sie sicher, dass sie die Einladung für %{name} löschen möchten?"
#: lib/cannery_web/live/ammo_group_live/index.html.heex:131 #: lib/cannery_web/live/ammo_group_live/index.html.heex:152
#: lib/cannery_web/live/ammo_group_live/show.html.heex:75 #: lib/cannery_web/live/ammo_group_live/show.html.heex:75
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this ammo?" msgid "Are you sure you want to delete this ammo?"
@ -150,7 +150,7 @@ msgstr "Passwort erfolgreich zurückgesetzt."
msgid "Password updated successfully." msgid "Password updated successfully."
msgstr "Passwort erfolgreich geändert." msgstr "Passwort erfolgreich geändert."
#: lib/cannery_web/controllers/user_registration_controller.ex:74 #: lib/cannery_web/controllers/user_registration_controller.ex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Please check your email to verify your account" msgid "Please check your email to verify your account"
msgstr "Bitte überprüfen Sie ihre Mailbox und bestätigen Sie das Nutzerkonto" msgstr "Bitte überprüfen Sie ihre Mailbox und bestätigen Sie das Nutzerkonto"
@ -188,7 +188,7 @@ msgstr ""
msgid "%{name} added successfully" msgid "%{name} added successfully"
msgstr "%{name} erfolgreich hinzugefügt" msgstr "%{name} erfolgreich hinzugefügt"
#: lib/cannery_web/live/container_live/show.ex:43 #: lib/cannery_web/live/container_live/show.ex:39
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{tag_name} has been removed from %{container_name}" msgid "%{tag_name} has been removed from %{container_name}"
msgstr "%{tag_name} wurde von %{container_name} entfernt" msgstr "%{tag_name} wurde von %{container_name} entfernt"
@ -203,19 +203,19 @@ msgstr "Füge hinzu..."
msgid "Shots recorded successfully" msgid "Shots recorded successfully"
msgstr "Schüsse erfolgreich dokumentiert" msgstr "Schüsse erfolgreich dokumentiert"
#: lib/cannery_web/live/range_live/index.html.heex:27 #: lib/cannery_web/live/range_live/index.html.heex:28
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to unstage this ammo?" msgid "Are you sure you want to unstage this ammo?"
msgstr "Sind sie sicher, dass Sie diese Munition demarkieren möchten?" msgstr "Sind sie sicher, dass Sie diese Munition demarkieren möchten?"
#: lib/cannery_web/live/ammo_group_live/show.ex:137 #: lib/cannery_web/live/ammo_group_live/show.ex:137
#: lib/cannery_web/live/range_live/index.ex:159 #: lib/cannery_web/live/range_live/index.html.heex:118
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?" msgid "Are you sure you want to delete this shot record?"
msgstr "Sind sie sicher, dass sie die Schießkladde löschen möchten?" msgstr "Sind sie sicher, dass sie die Schießkladde löschen möchten?"
#: lib/cannery_web/live/ammo_group_live/show.ex:83 #: lib/cannery_web/live/ammo_group_live/show.ex:83
#: lib/cannery_web/live/range_live/index.ex:54 #: lib/cannery_web/live/range_live/index.ex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot records deleted succesfully" msgid "Shot records deleted succesfully"
msgstr "Schießkladde erfolgreich gelöscht" msgstr "Schießkladde erfolgreich gelöscht"
@ -266,13 +266,13 @@ msgstr "Möchten Sie die Sprache wechseln?"
msgid "Language updated successfully." msgid "Language updated successfully."
msgstr "Spracheinstellung gespeichert." msgstr "Spracheinstellung gespeichert."
#: lib/cannery_web/live/ammo_group_live/index.ex:64 #: lib/cannery_web/live/ammo_group_live/index.ex:89
#: lib/cannery_web/live/ammo_group_live/show.ex:55 #: lib/cannery_web/live/ammo_group_live/show.ex:55
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Ammo deleted succesfully" msgid "Ammo deleted succesfully"
msgstr "Munitionsgruppe erfolgreich gelöscht" msgstr "Munitionsgruppe erfolgreich gelöscht"
#: lib/cannery_web/live/range_live/index.ex:68 #: lib/cannery_web/live/range_live/index.ex:95
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Ammo unstaged succesfully" msgid "Ammo unstaged succesfully"
msgstr "Munition erfolgreich demarkiert" msgstr "Munition erfolgreich demarkiert"
@ -289,7 +289,7 @@ msgid_plural "Ammo added successfully"
msgstr[0] "Munitionsgruppe erfolgreich aktualisiert" msgstr[0] "Munitionsgruppe erfolgreich aktualisiert"
msgstr[1] "Munitionsgruppe erfolgreich aktualisiert" msgstr[1] "Munitionsgruppe erfolgreich aktualisiert"
#: lib/cannery_web/live/ammo_type_live/index.ex:232 #: lib/cannery_web/live/ammo_type_live/index.html.heex:90
#: lib/cannery_web/live/ammo_type_live/show.html.heex:28 #: lib/cannery_web/live/ammo_type_live/show.html.heex:28
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!" msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!"

View File

@ -30,10 +30,11 @@ msgstr ""
msgid "Admins:" msgid "Admins:"
msgstr "" msgstr ""
#: lib/cannery_web/components/shot_group_table_component.ex:41
#: lib/cannery_web/components/topbar.ex:73 #: lib/cannery_web/components/topbar.ex:73
#: lib/cannery_web/live/ammo_group_live/index.ex:56 #: lib/cannery_web/live/ammo_group_live/index.ex:70
#: lib/cannery_web/live/ammo_group_live/index.ex:79
#: lib/cannery_web/live/ammo_group_live/index.html.heex:3 #: lib/cannery_web/live/ammo_group_live/index.html.heex:3
#: lib/cannery_web/live/range_live/index.ex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Ammo" msgid "Ammo"
msgstr "" msgstr ""
@ -49,8 +50,8 @@ msgstr ""
msgid "Background color" msgid "Background color"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:65
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:140 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:140
#: lib/cannery_web/live/ammo_type_live/index.ex:82
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Blank" msgid "Blank"
msgstr "" msgstr ""
@ -60,32 +61,32 @@ msgstr ""
msgid "Brass" msgid "Brass"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:47
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:44 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:44
#: lib/cannery_web/live/ammo_type_live/index.ex:64
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Bullet core" msgid "Bullet core"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:46
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:37 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:37
#: lib/cannery_web/live/ammo_type_live/index.ex:63
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Bullet type" msgid "Bullet type"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:49
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:58 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:58
#: lib/cannery_web/live/ammo_type_live/index.ex:66
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Caliber" msgid "Caliber"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:48
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:51 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:51
#: lib/cannery_web/live/ammo_type_live/index.ex:65
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Cartridge" msgid "Cartridge"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:50
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:65 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:65
#: lib/cannery_web/live/ammo_type_live/index.ex:67
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Case material" msgid "Case material"
msgstr "" msgstr ""
@ -98,15 +99,15 @@ msgid "Container"
msgstr "" msgstr ""
#: lib/cannery_web/components/topbar.ex:57 #: lib/cannery_web/components/topbar.ex:57
#: lib/cannery_web/live/container_live/index.ex:44 #: lib/cannery_web/live/container_live/index.ex:49
#: lib/cannery_web/live/container_live/index.ex:53 #: lib/cannery_web/live/container_live/index.ex:58
#: lib/cannery_web/live/container_live/index.html.heex:3 #: lib/cannery_web/live/container_live/index.html.heex:3
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Containers" msgid "Containers"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:66
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:144 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:144
#: lib/cannery_web/live/ammo_type_live/index.ex:83
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Corrosive" msgid "Corrosive"
msgstr "" msgstr ""
@ -123,9 +124,9 @@ msgstr ""
msgid "Count:" msgid "Count:"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:47
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:24 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:24
#: lib/cannery_web/live/container_live/form_component.html.heex:27 #: lib/cannery_web/live/container_live/form_component.html.heex:27
#: lib/cannery_web/live/container_live/index.ex:122
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Description" msgid "Description"
msgstr "" msgstr ""
@ -141,17 +142,12 @@ msgstr ""
msgid "Easy to Use:" msgid "Easy to Use:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:23
#, elixir-autogen, elixir-format
msgid "Edit Ammo type"
msgstr ""
#: lib/cannery_web/live/invite_live/index.ex:33 #: lib/cannery_web/live/invite_live/index.ex:33
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit Invite" msgid "Edit Invite"
msgstr "" msgstr ""
#: lib/cannery_web/live/tag_live/index.ex:21 #: lib/cannery_web/live/tag_live/index.ex:28
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit Tag" msgid "Edit Tag"
msgstr "" msgstr ""
@ -166,14 +162,14 @@ msgstr ""
msgid "FMJ" msgid "FMJ"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:59
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:103 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:103
#: lib/cannery_web/live/ammo_type_live/index.ex:76
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Grains" msgid "Grains"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:64
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:136 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:136
#: lib/cannery_web/live/ammo_type_live/index.ex:81
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Incendiary" msgid "Incendiary"
msgstr "" msgstr ""
@ -205,9 +201,9 @@ msgstr ""
msgid "Keep me logged in for 60 days" msgid "Keep me logged in for 60 days"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:48
#: lib/cannery_web/components/move_ammo_group_component.ex:69 #: lib/cannery_web/components/move_ammo_group_component.ex:69
#: lib/cannery_web/live/container_live/form_component.html.heex:42 #: lib/cannery_web/live/container_live/form_component.html.heex:42
#: lib/cannery_web/live/container_live/index.ex:123
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Location" msgid "Location"
msgstr "" msgstr ""
@ -223,8 +219,8 @@ msgstr ""
msgid "Magazine, Clip, Ammo Box, etc" msgid "Magazine, Clip, Ammo Box, etc"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:67
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:148 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:148
#: lib/cannery_web/live/ammo_type_live/index.ex:84
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Manufacturer" msgid "Manufacturer"
msgstr "" msgstr ""
@ -239,24 +235,24 @@ msgstr ""
msgid "My cool ammo can" msgid "My cool ammo can"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:45
#: lib/cannery_web/components/container_table_component.ex:46
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:20 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:20
#: lib/cannery_web/live/ammo_type_live/index.ex:62
#: lib/cannery_web/live/container_live/form_component.html.heex:20 #: lib/cannery_web/live/container_live/form_component.html.heex:20
#: lib/cannery_web/live/container_live/index.ex:121
#: lib/cannery_web/live/invite_live/form_component.html.heex:20 #: lib/cannery_web/live/invite_live/form_component.html.heex:20
#: lib/cannery_web/live/tag_live/form_component.ex:75 #: lib/cannery_web/live/tag_live/form_component.ex:75
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:29 #: lib/cannery_web/live/ammo_type_live/index.ex:36
#: lib/cannery_web/live/ammo_type_live/index.ex:35 #: lib/cannery_web/live/ammo_type_live/index.ex:44
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "New Ammo type" msgid "New Ammo type"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.ex:31 #: lib/cannery_web/live/container_live/index.ex:36
#: lib/cannery_web/live/container_live/index.ex:38 #: lib/cannery_web/live/container_live/index.ex:43
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "New Container" msgid "New Container"
msgstr "" msgstr ""
@ -266,12 +262,13 @@ msgstr ""
msgid "New Invite" msgid "New Invite"
msgstr "" msgstr ""
#: lib/cannery_web/live/tag_live/index.ex:27 #: lib/cannery_web/live/tag_live/index.ex:36
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "New Tag" msgid "New Tag"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.html.heex:8 #: lib/cannery_web/live/ammo_group_live/index.html.heex:8
#: lib/cannery_web/live/ammo_group_live/index.html.heex:70
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No Ammo" msgid "No Ammo"
msgstr "" msgstr ""
@ -282,6 +279,7 @@ msgid "No ammo for this type"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:8 #: lib/cannery_web/live/container_live/index.html.heex:8
#: lib/cannery_web/live/container_live/index.html.heex:47
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No containers" msgid "No containers"
msgstr "" msgstr ""
@ -293,16 +291,17 @@ msgstr ""
#: lib/cannery_web/live/container_live/edit_tags_component.html.heex:31 #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:31
#: lib/cannery_web/live/tag_live/index.html.heex:10 #: lib/cannery_web/live/tag_live/index.html.heex:10
#: lib/cannery_web/live/tag_live/index.html.heex:43
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No tags" msgid "No tags"
msgstr "" msgstr ""
#: lib/cannery_web/components/add_shot_group_component.html.heex:37 #: lib/cannery_web/components/add_shot_group_component.html.heex:37
#: lib/cannery_web/components/ammo_group_table_component.ex:81 #: lib/cannery_web/components/ammo_group_table_component.ex:81
#: lib/cannery_web/components/shot_group_table_component.ex:43
#: lib/cannery_web/live/ammo_group_live/form_component.html.heex:49 #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:49
#: lib/cannery_web/live/ammo_group_live/show.ex:93 #: lib/cannery_web/live/ammo_group_live/show.ex:93
#: lib/cannery_web/live/range_live/form_component.html.heex:29 #: lib/cannery_web/live/range_live/form_component.html.heex:29
#: lib/cannery_web/live/range_live/index.ex:82
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Notes" msgid "Notes"
msgstr "" msgstr ""
@ -318,8 +317,8 @@ msgstr ""
msgid "On the bookshelf" msgid "On the bookshelf"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:60
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:111 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:111
#: lib/cannery_web/live/ammo_type_live/index.ex:77
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Pressure" msgid "Pressure"
msgstr "" msgstr ""
@ -335,8 +334,8 @@ msgstr ""
msgid "Price paid:" msgid "Price paid:"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:61
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:118 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:118
#: lib/cannery_web/live/ammo_type_live/index.ex:78
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Primer type" msgid "Primer type"
msgstr "" msgstr ""
@ -377,9 +376,10 @@ msgstr ""
msgid "Stored in" msgid "Stored in"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:52
#: lib/cannery_web/components/topbar.ex:49 #: lib/cannery_web/components/topbar.ex:49
#: lib/cannery_web/live/container_live/index.ex:127 #: lib/cannery_web/live/tag_live/index.ex:44
#: lib/cannery_web/live/tag_live/index.ex:32 #: lib/cannery_web/live/tag_live/index.ex:54
#: lib/cannery_web/live/tag_live/index.html.heex:3 #: lib/cannery_web/live/tag_live/index.html.heex:3
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Tags" msgid "Tags"
@ -400,15 +400,15 @@ msgstr ""
msgid "The self-hosted firearm tracker website" msgid "The self-hosted firearm tracker website"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:63
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:132 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:132
#: lib/cannery_web/live/ammo_type_live/index.ex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Tracer" msgid "Tracer"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:49
#: lib/cannery_web/components/move_ammo_group_component.ex:68 #: lib/cannery_web/components/move_ammo_group_component.ex:68
#: lib/cannery_web/live/container_live/form_component.html.heex:35 #: lib/cannery_web/live/container_live/form_component.html.heex:35
#: lib/cannery_web/live/container_live/index.ex:124
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Type" msgid "Type"
msgstr "" msgstr ""
@ -461,9 +461,9 @@ msgid "Range day"
msgstr "" msgstr ""
#: lib/cannery_web/components/add_shot_group_component.html.heex:45 #: lib/cannery_web/components/add_shot_group_component.html.heex:45
#: lib/cannery_web/components/shot_group_table_component.ex:44
#: lib/cannery_web/live/ammo_group_live/show.ex:94 #: lib/cannery_web/live/ammo_group_live/show.ex:94
#: lib/cannery_web/live/range_live/form_component.html.heex:36 #: lib/cannery_web/live/range_live/form_component.html.heex:36
#: lib/cannery_web/live/range_live/index.ex:83
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Date" msgid "Date"
msgstr "" msgstr ""
@ -479,23 +479,24 @@ msgid "No ammo staged"
msgstr "" msgstr ""
#: lib/cannery_web/components/add_shot_group_component.html.heex:3 #: lib/cannery_web/components/add_shot_group_component.html.heex:3
#: lib/cannery_web/live/ammo_group_live/index.ex:26 #: lib/cannery_web/live/ammo_group_live/index.ex:30
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Record shots" msgid "Record shots"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/show.ex:42 #: lib/cannery_web/live/ammo_group_live/show.ex:42
#: lib/cannery_web/live/range_live/index.ex:32 #: lib/cannery_web/live/range_live/index.ex:41
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit Shot Records" msgid "Edit Shot Records"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.ex:38 #: lib/cannery_web/live/range_live/index.ex:49
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "New Shot Records" msgid "New Shot Records"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:48 #: lib/cannery_web/live/range_live/index.html.heex:50
#: lib/cannery_web/live/range_live/index.html.heex:92
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No shots recorded" msgid "No shots recorded"
msgstr "" msgstr ""
@ -506,20 +507,21 @@ msgstr ""
msgid "Rounds left" msgid "Rounds left"
msgstr "" msgstr ""
#: lib/cannery_web/components/shot_group_table_component.ex:42
#: lib/cannery_web/live/ammo_group_live/show.ex:92 #: lib/cannery_web/live/ammo_group_live/show.ex:92
#: lib/cannery_web/live/range_live/index.ex:81 #: lib/cannery_web/live/range_live/index.html.heex:64
#: lib/cannery_web/live/range_live/index.html.heex:62
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Rounds shot" msgid "Rounds shot"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.ex:44 #: lib/cannery_web/live/range_live/index.ex:57
#: lib/cannery_web/live/range_live/index.ex:67
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot Records" msgid "Shot Records"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.ex:32 #: lib/cannery_web/live/ammo_group_live/index.ex:38
#: lib/cannery_web/live/ammo_group_live/index.html.heex:96 #: lib/cannery_web/live/ammo_group_live/index.html.heex:117
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Move ammo" msgid "Move ammo"
msgstr "" msgstr ""
@ -529,18 +531,18 @@ msgstr ""
msgid "No other containers" msgid "No other containers"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:53 #: lib/cannery_web/live/range_live/index.html.heex:55
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot log" msgid "Shot log"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_card.ex:71 #: lib/cannery_web/components/ammo_group_card.ex:71
#: lib/cannery_web/components/ammo_group_card.ex:78 #: lib/cannery_web/components/ammo_group_card.ex:78
#: lib/cannery_web/components/ammo_group_table_component.ex:152 #: lib/cannery_web/components/ammo_group_table_component.ex:153
#: lib/cannery_web/components/ammo_group_table_component.ex:224 #: lib/cannery_web/components/ammo_group_table_component.ex:225
#: lib/cannery_web/components/ammo_type_table_component.ex:180
#: lib/cannery_web/live/ammo_group_live/show.html.heex:37 #: lib/cannery_web/live/ammo_group_live/show.html.heex:37
#: lib/cannery_web/live/ammo_group_live/show.html.heex:44 #: lib/cannery_web/live/ammo_group_live/show.html.heex:44
#: lib/cannery_web/live/ammo_type_live/index.ex:179
#: lib/cannery_web/live/ammo_type_live/show.html.heex:136 #: lib/cannery_web/live/ammo_type_live/show.html.heex:136
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "$%{amount}" msgid "$%{amount}"
@ -551,32 +553,32 @@ msgstr ""
msgid "Bimetal" msgid "Bimetal"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:51
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:72 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:72
#: lib/cannery_web/live/ammo_type_live/index.ex:68
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Jacket type" msgid "Jacket type"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:52
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:79 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:79
#: lib/cannery_web/live/ammo_type_live/index.ex:69
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Muzzle velocity" msgid "Muzzle velocity"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:55
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:93 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:93
#: lib/cannery_web/live/ammo_type_live/index.ex:72
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Powder grains per charge" msgid "Powder grains per charge"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:53
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:89 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:89
#: lib/cannery_web/live/ammo_type_live/index.ex:70
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Powder type" msgid "Powder type"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:68
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:152 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:152
#: lib/cannery_web/live/ammo_type_live/index.ex:85
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "UPC" msgid "UPC"
msgstr "" msgstr ""
@ -597,18 +599,18 @@ msgstr ""
msgid "New password" msgid "New password"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.html.heex:72 #: lib/cannery_web/live/ammo_group_live/index.html.heex:93
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Stage" msgid "Stage"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.html.heex:72 #: lib/cannery_web/live/ammo_group_live/index.html.heex:93
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Unstage" msgid "Unstage"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:62
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:125 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:125
#: lib/cannery_web/live/ammo_type_live/index.ex:79
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Firing type" msgid "Firing type"
msgstr "" msgstr ""
@ -623,14 +625,14 @@ msgstr ""
msgid "Loading..." msgid "Loading..."
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.ex:27 #: lib/cannery_web/live/container_live/index.ex:32
#: lib/cannery_web/live/container_live/show.ex:126 #: lib/cannery_web/live/container_live/show.ex:113
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit %{name}" msgid "Edit %{name}"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.ex:65 #: lib/cannery_web/live/container_live/index.ex:69
#: lib/cannery_web/live/container_live/show.ex:127 #: lib/cannery_web/live/container_live/show.ex:114
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit %{name} tags" msgid "Edit %{name} tags"
msgstr "" msgstr ""
@ -642,8 +644,8 @@ msgstr ""
msgid "Rounds:" msgid "Rounds:"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:221 #: lib/cannery_web/components/ammo_group_table_component.ex:222
#: lib/cannery_web/live/ammo_type_live/index.ex:178 #: lib/cannery_web/components/ammo_type_table_component.ex:179
#: lib/cannery_web/live/ammo_type_live/show.html.heex:142 #: lib/cannery_web/live/ammo_type_live/show.html.heex:142
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No cost information" msgid "No cost information"
@ -694,7 +696,7 @@ msgstr ""
msgid "Log in" msgid "Log in"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_registration_controller.ex:35 #: lib/cannery_web/controllers/user_registration_controller.ex:34
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Register" msgid "Register"
msgstr "" msgstr ""
@ -705,7 +707,7 @@ msgid "Reset your password"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/show.ex:41 #: lib/cannery_web/live/ammo_group_live/show.ex:41
#: lib/cannery_web/live/range_live/index.ex:26 #: lib/cannery_web/live/range_live/index.ex:33
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Record Shots" msgid "Record Shots"
msgstr "" msgstr ""
@ -715,11 +717,6 @@ msgstr ""
msgid "Copies" msgid "Copies"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:40
#, elixir-autogen, elixir-format
msgid "Ammo types"
msgstr ""
#: lib/cannery_web/live/ammo_type_live/show.html.heex:123 #: lib/cannery_web/live/ammo_type_live/show.html.heex:123
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Added on:" msgid "Added on:"
@ -774,6 +771,8 @@ msgid "View the source code"
msgstr "" msgstr ""
#: lib/cannery_web/components/topbar.ex:65 #: lib/cannery_web/components/topbar.ex:65
#: lib/cannery_web/live/ammo_type_live/index.ex:52
#: lib/cannery_web/live/ammo_type_live/index.ex:62
#: lib/cannery_web/live/ammo_type_live/index.html.heex:3 #: lib/cannery_web/live/ammo_type_live/index.html.heex:3
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Catalog" msgid "Catalog"
@ -832,45 +831,45 @@ msgstr ""
msgid "Container:" msgid "Container:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.html.heex:48 #: lib/cannery_web/live/ammo_group_live/index.html.heex:63
#: lib/cannery_web/live/ammo_type_live/index.html.heex:23 #: lib/cannery_web/live/ammo_type_live/index.html.heex:39
#: lib/cannery_web/live/ammo_type_live/show.html.heex:152 #: lib/cannery_web/live/ammo_type_live/show.html.heex:152
#: lib/cannery_web/live/container_live/show.html.heex:105 #: lib/cannery_web/live/container_live/show.html.heex:105
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Show used" msgid "Show used"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:192 #: lib/cannery_web/components/ammo_group_table_component.ex:193
#: lib/cannery_web/live/ammo_group_live/show.html.heex:19 #: lib/cannery_web/live/ammo_group_live/show.html.heex:19
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{percentage}%" msgid "%{percentage}%"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.ex:114 #: lib/cannery_web/live/range_live/index.ex:136
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Rounds shot: %{count}" msgid "Rounds shot: %{count}"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:117 #: lib/cannery_web/components/ammo_type_table_component.ex:100
#: lib/cannery_web/live/container_live/index.ex:125 #: lib/cannery_web/components/container_table_component.ex:50
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Packs" msgid "Packs"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:97 #: lib/cannery_web/components/ammo_type_table_component.ex:80
#: lib/cannery_web/live/container_live/index.ex:126 #: lib/cannery_web/components/container_table_component.ex:51
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Rounds" msgid "Rounds"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/show.html.heex:158 #: lib/cannery_web/live/ammo_type_live/show.html.heex:158
#: lib/cannery_web/live/container_live/index.html.heex:23 #: lib/cannery_web/live/container_live/index.html.heex:39
#: lib/cannery_web/live/container_live/show.html.heex:111 #: lib/cannery_web/live/container_live/show.html.heex:111
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "View as table" msgid "View as table"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:127 #: lib/cannery_web/components/ammo_type_table_component.ex:110
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Total ever packs" msgid "Total ever packs"
msgstr "" msgstr ""
@ -880,7 +879,7 @@ msgstr ""
msgid "Total ever packs:" msgid "Total ever packs:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:108 #: lib/cannery_web/components/ammo_type_table_component.ex:91
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Total ever rounds" msgid "Total ever rounds"
msgstr "" msgstr ""
@ -890,7 +889,7 @@ msgstr ""
msgid "Total ever rounds:" msgid "Total ever rounds:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:122 #: lib/cannery_web/components/ammo_type_table_component.ex:105
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Used packs" msgid "Used packs"
msgstr "" msgstr ""
@ -900,7 +899,7 @@ msgstr ""
msgid "Used packs:" msgid "Used packs:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:103 #: lib/cannery_web/components/ammo_type_table_component.ex:86
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Used rounds" msgid "Used rounds"
msgstr "" msgstr ""
@ -915,7 +914,7 @@ msgstr ""
msgid "Used up!" msgid "Used up!"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:64 #: lib/cannery_web/live/range_live/index.html.heex:66
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Rounds shot chart" msgid "Rounds shot chart"
msgstr "" msgstr ""
@ -1015,19 +1014,20 @@ msgstr ""
msgid "UPC:" msgid "UPC:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:137 #: lib/cannery_web/components/ammo_type_table_component.ex:120
#: lib/cannery_web/live/ammo_type_live/show.html.heex:132 #: lib/cannery_web/live/ammo_type_live/show.html.heex:132
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Average CPR" msgid "Average CPR"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:28
#: lib/cannery_web/live/ammo_type_live/show.ex:120 #: lib/cannery_web/live/ammo_type_live/show.ex:120
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit %{ammo_type_name}" msgid "Edit %{ammo_type_name}"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_card.ex:39 #: lib/cannery_web/components/ammo_group_card.ex:39
#: lib/cannery_web/components/ammo_group_table_component.ex:230 #: lib/cannery_web/components/ammo_group_table_component.ex:231
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Empty" msgid "Empty"
msgstr "" msgstr ""
@ -1077,7 +1077,7 @@ msgstr ""
msgid "Last used on:" msgid "Last used on:"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:177 #: lib/cannery_web/components/ammo_group_table_component.ex:178
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Never used" msgid "Never used"
msgstr "" msgstr ""
@ -1094,12 +1094,38 @@ msgstr ""
msgid "Purchased on:" msgid "Purchased on:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.ex:38 #: lib/cannery_web/live/ammo_group_live/index.ex:46
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit ammo" msgid "Edit ammo"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.html.heex:8 #: lib/cannery_web/live/ammo_type_live/index.html.heex:8
#: lib/cannery_web/live/ammo_type_live/index.html.heex:46
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No Ammo types" msgid "No Ammo types"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.html.heex:33
#, elixir-autogen, elixir-format
msgid "Search catalog"
msgstr ""
#: 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
#, elixir-autogen, elixir-format
msgid "Search containers"
msgstr ""
#: lib/cannery_web/live/tag_live/index.html.heex:36
#, elixir-autogen, elixir-format
msgid "Search tags"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:85
#, elixir-autogen, elixir-format
msgid "Search shot records"
msgstr ""

View File

@ -11,8 +11,8 @@ msgstr ""
"Language: en\n" "Language: en\n"
"Plural-Forms: nplurals=2\n" "Plural-Forms: nplurals=2\n"
#: lib/cannery_web/live/ammo_group_live/index.ex:44 #: lib/cannery_web/live/ammo_group_live/index.ex:54
#: lib/cannery_web/live/ammo_group_live/index.ex:50 #: lib/cannery_web/live/ammo_group_live/index.ex:62
#: lib/cannery_web/live/ammo_group_live/index.html.heex:40 #: lib/cannery_web/live/ammo_group_live/index.html.heex:40
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Add Ammo" msgid "Add Ammo"
@ -157,9 +157,9 @@ msgstr ""
msgid "Why not get some ready to shoot?" msgid "Why not get some ready to shoot?"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.html.heex:79 #: lib/cannery_web/live/ammo_group_live/index.html.heex:100
#: lib/cannery_web/live/ammo_group_live/show.html.heex:101 #: lib/cannery_web/live/ammo_group_live/show.html.heex:101
#: lib/cannery_web/live/range_live/index.html.heex:38 #: lib/cannery_web/live/range_live/index.html.heex:39
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Record shots" msgid "Record shots"
msgstr "" msgstr ""
@ -235,13 +235,13 @@ msgid "Set Unlimited"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/show.html.heex:86 #: lib/cannery_web/live/ammo_group_live/show.html.heex:86
#: lib/cannery_web/live/range_live/index.html.heex:31 #: lib/cannery_web/live/range_live/index.html.heex:32
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Stage for range" msgid "Stage for range"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/show.html.heex:85 #: lib/cannery_web/live/ammo_group_live/show.html.heex:85
#: lib/cannery_web/live/range_live/index.html.heex:30 #: lib/cannery_web/live/range_live/index.html.heex:31
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Unstage from range" msgid "Unstage from range"
msgstr "" msgstr ""

View File

@ -31,10 +31,11 @@ msgstr ""
msgid "Admins:" msgid "Admins:"
msgstr "" msgstr ""
#: lib/cannery_web/components/shot_group_table_component.ex:41
#: lib/cannery_web/components/topbar.ex:73 #: lib/cannery_web/components/topbar.ex:73
#: lib/cannery_web/live/ammo_group_live/index.ex:56 #: lib/cannery_web/live/ammo_group_live/index.ex:70
#: lib/cannery_web/live/ammo_group_live/index.ex:79
#: lib/cannery_web/live/ammo_group_live/index.html.heex:3 #: lib/cannery_web/live/ammo_group_live/index.html.heex:3
#: lib/cannery_web/live/range_live/index.ex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Ammo" msgid "Ammo"
msgstr "" msgstr ""
@ -50,8 +51,8 @@ msgstr ""
msgid "Background color" msgid "Background color"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:65
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:140 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:140
#: lib/cannery_web/live/ammo_type_live/index.ex:82
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Blank" msgid "Blank"
msgstr "" msgstr ""
@ -61,32 +62,32 @@ msgstr ""
msgid "Brass" msgid "Brass"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:47
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:44 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:44
#: lib/cannery_web/live/ammo_type_live/index.ex:64
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Bullet core" msgid "Bullet core"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:46
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:37 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:37
#: lib/cannery_web/live/ammo_type_live/index.ex:63
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Bullet type" msgid "Bullet type"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:49
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:58 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:58
#: lib/cannery_web/live/ammo_type_live/index.ex:66
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Caliber" msgid "Caliber"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:48
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:51 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:51
#: lib/cannery_web/live/ammo_type_live/index.ex:65
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Cartridge" msgid "Cartridge"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:50
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:65 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:65
#: lib/cannery_web/live/ammo_type_live/index.ex:67
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Case material" msgid "Case material"
msgstr "" msgstr ""
@ -99,15 +100,15 @@ msgid "Container"
msgstr "" msgstr ""
#: lib/cannery_web/components/topbar.ex:57 #: lib/cannery_web/components/topbar.ex:57
#: lib/cannery_web/live/container_live/index.ex:44 #: lib/cannery_web/live/container_live/index.ex:49
#: lib/cannery_web/live/container_live/index.ex:53 #: lib/cannery_web/live/container_live/index.ex:58
#: lib/cannery_web/live/container_live/index.html.heex:3 #: lib/cannery_web/live/container_live/index.html.heex:3
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Containers" msgid "Containers"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:66
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:144 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:144
#: lib/cannery_web/live/ammo_type_live/index.ex:83
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Corrosive" msgid "Corrosive"
msgstr "" msgstr ""
@ -124,9 +125,9 @@ msgstr ""
msgid "Count:" msgid "Count:"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:47
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:24 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:24
#: lib/cannery_web/live/container_live/form_component.html.heex:27 #: lib/cannery_web/live/container_live/form_component.html.heex:27
#: lib/cannery_web/live/container_live/index.ex:122
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Description" msgid "Description"
msgstr "" msgstr ""
@ -142,17 +143,12 @@ msgstr ""
msgid "Easy to Use:" msgid "Easy to Use:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:23
#, elixir-autogen, elixir-format
msgid "Edit Ammo type"
msgstr ""
#: lib/cannery_web/live/invite_live/index.ex:33 #: lib/cannery_web/live/invite_live/index.ex:33
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit Invite" msgid "Edit Invite"
msgstr "" msgstr ""
#: lib/cannery_web/live/tag_live/index.ex:21 #: lib/cannery_web/live/tag_live/index.ex:28
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit Tag" msgid "Edit Tag"
msgstr "" msgstr ""
@ -167,14 +163,14 @@ msgstr ""
msgid "FMJ" msgid "FMJ"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:59
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:103 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:103
#: lib/cannery_web/live/ammo_type_live/index.ex:76
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Grains" msgid "Grains"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:64
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:136 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:136
#: lib/cannery_web/live/ammo_type_live/index.ex:81
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Incendiary" msgid "Incendiary"
msgstr "" msgstr ""
@ -206,9 +202,9 @@ msgstr ""
msgid "Keep me logged in for 60 days" msgid "Keep me logged in for 60 days"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:48
#: lib/cannery_web/components/move_ammo_group_component.ex:69 #: lib/cannery_web/components/move_ammo_group_component.ex:69
#: lib/cannery_web/live/container_live/form_component.html.heex:42 #: lib/cannery_web/live/container_live/form_component.html.heex:42
#: lib/cannery_web/live/container_live/index.ex:123
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Location" msgid "Location"
msgstr "" msgstr ""
@ -224,8 +220,8 @@ msgstr ""
msgid "Magazine, Clip, Ammo Box, etc" msgid "Magazine, Clip, Ammo Box, etc"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:67
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:148 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:148
#: lib/cannery_web/live/ammo_type_live/index.ex:84
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Manufacturer" msgid "Manufacturer"
msgstr "" msgstr ""
@ -240,24 +236,24 @@ msgstr ""
msgid "My cool ammo can" msgid "My cool ammo can"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:45
#: lib/cannery_web/components/container_table_component.ex:46
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:20 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:20
#: lib/cannery_web/live/ammo_type_live/index.ex:62
#: lib/cannery_web/live/container_live/form_component.html.heex:20 #: lib/cannery_web/live/container_live/form_component.html.heex:20
#: lib/cannery_web/live/container_live/index.ex:121
#: lib/cannery_web/live/invite_live/form_component.html.heex:20 #: lib/cannery_web/live/invite_live/form_component.html.heex:20
#: lib/cannery_web/live/tag_live/form_component.ex:75 #: lib/cannery_web/live/tag_live/form_component.ex:75
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:29 #: lib/cannery_web/live/ammo_type_live/index.ex:36
#: lib/cannery_web/live/ammo_type_live/index.ex:35 #: lib/cannery_web/live/ammo_type_live/index.ex:44
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "New Ammo type" msgid "New Ammo type"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.ex:31 #: lib/cannery_web/live/container_live/index.ex:36
#: lib/cannery_web/live/container_live/index.ex:38 #: lib/cannery_web/live/container_live/index.ex:43
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "New Container" msgid "New Container"
msgstr "" msgstr ""
@ -267,12 +263,13 @@ msgstr ""
msgid "New Invite" msgid "New Invite"
msgstr "" msgstr ""
#: lib/cannery_web/live/tag_live/index.ex:27 #: lib/cannery_web/live/tag_live/index.ex:36
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "New Tag" msgid "New Tag"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.html.heex:8 #: lib/cannery_web/live/ammo_group_live/index.html.heex:8
#: lib/cannery_web/live/ammo_group_live/index.html.heex:70
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No Ammo" msgid "No Ammo"
msgstr "" msgstr ""
@ -283,6 +280,7 @@ msgid "No ammo for this type"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:8 #: lib/cannery_web/live/container_live/index.html.heex:8
#: lib/cannery_web/live/container_live/index.html.heex:47
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No containers" msgid "No containers"
msgstr "" msgstr ""
@ -294,16 +292,17 @@ msgstr ""
#: lib/cannery_web/live/container_live/edit_tags_component.html.heex:31 #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:31
#: lib/cannery_web/live/tag_live/index.html.heex:10 #: lib/cannery_web/live/tag_live/index.html.heex:10
#: lib/cannery_web/live/tag_live/index.html.heex:43
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No tags" msgid "No tags"
msgstr "" msgstr ""
#: lib/cannery_web/components/add_shot_group_component.html.heex:37 #: lib/cannery_web/components/add_shot_group_component.html.heex:37
#: lib/cannery_web/components/ammo_group_table_component.ex:81 #: lib/cannery_web/components/ammo_group_table_component.ex:81
#: lib/cannery_web/components/shot_group_table_component.ex:43
#: lib/cannery_web/live/ammo_group_live/form_component.html.heex:49 #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:49
#: lib/cannery_web/live/ammo_group_live/show.ex:93 #: lib/cannery_web/live/ammo_group_live/show.ex:93
#: lib/cannery_web/live/range_live/form_component.html.heex:29 #: lib/cannery_web/live/range_live/form_component.html.heex:29
#: lib/cannery_web/live/range_live/index.ex:82
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Notes" msgid "Notes"
msgstr "" msgstr ""
@ -319,8 +318,8 @@ msgstr ""
msgid "On the bookshelf" msgid "On the bookshelf"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:60
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:111 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:111
#: lib/cannery_web/live/ammo_type_live/index.ex:77
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Pressure" msgid "Pressure"
msgstr "" msgstr ""
@ -336,8 +335,8 @@ msgstr ""
msgid "Price paid:" msgid "Price paid:"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:61
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:118 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:118
#: lib/cannery_web/live/ammo_type_live/index.ex:78
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Primer type" msgid "Primer type"
msgstr "" msgstr ""
@ -378,9 +377,10 @@ msgstr ""
msgid "Stored in" msgid "Stored in"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:52
#: lib/cannery_web/components/topbar.ex:49 #: lib/cannery_web/components/topbar.ex:49
#: lib/cannery_web/live/container_live/index.ex:127 #: lib/cannery_web/live/tag_live/index.ex:44
#: lib/cannery_web/live/tag_live/index.ex:32 #: lib/cannery_web/live/tag_live/index.ex:54
#: lib/cannery_web/live/tag_live/index.html.heex:3 #: lib/cannery_web/live/tag_live/index.html.heex:3
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Tags" msgid "Tags"
@ -401,15 +401,15 @@ msgstr ""
msgid "The self-hosted firearm tracker website" msgid "The self-hosted firearm tracker website"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:63
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:132 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:132
#: lib/cannery_web/live/ammo_type_live/index.ex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Tracer" msgid "Tracer"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:49
#: lib/cannery_web/components/move_ammo_group_component.ex:68 #: lib/cannery_web/components/move_ammo_group_component.ex:68
#: lib/cannery_web/live/container_live/form_component.html.heex:35 #: lib/cannery_web/live/container_live/form_component.html.heex:35
#: lib/cannery_web/live/container_live/index.ex:124
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Type" msgid "Type"
msgstr "" msgstr ""
@ -462,9 +462,9 @@ msgid "Range day"
msgstr "" msgstr ""
#: lib/cannery_web/components/add_shot_group_component.html.heex:45 #: lib/cannery_web/components/add_shot_group_component.html.heex:45
#: lib/cannery_web/components/shot_group_table_component.ex:44
#: lib/cannery_web/live/ammo_group_live/show.ex:94 #: lib/cannery_web/live/ammo_group_live/show.ex:94
#: lib/cannery_web/live/range_live/form_component.html.heex:36 #: lib/cannery_web/live/range_live/form_component.html.heex:36
#: lib/cannery_web/live/range_live/index.ex:83
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Date" msgid "Date"
msgstr "" msgstr ""
@ -480,23 +480,24 @@ msgid "No ammo staged"
msgstr "" msgstr ""
#: lib/cannery_web/components/add_shot_group_component.html.heex:3 #: lib/cannery_web/components/add_shot_group_component.html.heex:3
#: lib/cannery_web/live/ammo_group_live/index.ex:26 #: lib/cannery_web/live/ammo_group_live/index.ex:30
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Record shots" msgid "Record shots"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/show.ex:42 #: lib/cannery_web/live/ammo_group_live/show.ex:42
#: lib/cannery_web/live/range_live/index.ex:32 #: lib/cannery_web/live/range_live/index.ex:41
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit Shot Records" msgid "Edit Shot Records"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.ex:38 #: lib/cannery_web/live/range_live/index.ex:49
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "New Shot Records" msgid "New Shot Records"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:48 #: lib/cannery_web/live/range_live/index.html.heex:50
#: lib/cannery_web/live/range_live/index.html.heex:92
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No shots recorded" msgid "No shots recorded"
msgstr "" msgstr ""
@ -507,20 +508,21 @@ msgstr ""
msgid "Rounds left" msgid "Rounds left"
msgstr "" msgstr ""
#: lib/cannery_web/components/shot_group_table_component.ex:42
#: lib/cannery_web/live/ammo_group_live/show.ex:92 #: lib/cannery_web/live/ammo_group_live/show.ex:92
#: lib/cannery_web/live/range_live/index.ex:81 #: lib/cannery_web/live/range_live/index.html.heex:64
#: lib/cannery_web/live/range_live/index.html.heex:62
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Rounds shot" msgid "Rounds shot"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.ex:44 #: lib/cannery_web/live/range_live/index.ex:57
#: lib/cannery_web/live/range_live/index.ex:67
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot Records" msgid "Shot Records"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.ex:32 #: lib/cannery_web/live/ammo_group_live/index.ex:38
#: lib/cannery_web/live/ammo_group_live/index.html.heex:96 #: lib/cannery_web/live/ammo_group_live/index.html.heex:117
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Move ammo" msgid "Move ammo"
msgstr "" msgstr ""
@ -530,18 +532,18 @@ msgstr ""
msgid "No other containers" msgid "No other containers"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:53 #: lib/cannery_web/live/range_live/index.html.heex:55
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot log" msgid "Shot log"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_card.ex:71 #: lib/cannery_web/components/ammo_group_card.ex:71
#: lib/cannery_web/components/ammo_group_card.ex:78 #: lib/cannery_web/components/ammo_group_card.ex:78
#: lib/cannery_web/components/ammo_group_table_component.ex:152 #: lib/cannery_web/components/ammo_group_table_component.ex:153
#: lib/cannery_web/components/ammo_group_table_component.ex:224 #: lib/cannery_web/components/ammo_group_table_component.ex:225
#: lib/cannery_web/components/ammo_type_table_component.ex:180
#: lib/cannery_web/live/ammo_group_live/show.html.heex:37 #: lib/cannery_web/live/ammo_group_live/show.html.heex:37
#: lib/cannery_web/live/ammo_group_live/show.html.heex:44 #: lib/cannery_web/live/ammo_group_live/show.html.heex:44
#: lib/cannery_web/live/ammo_type_live/index.ex:179
#: lib/cannery_web/live/ammo_type_live/show.html.heex:136 #: lib/cannery_web/live/ammo_type_live/show.html.heex:136
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "$%{amount}" msgid "$%{amount}"
@ -552,32 +554,32 @@ msgstr ""
msgid "Bimetal" msgid "Bimetal"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:51
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:72 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:72
#: lib/cannery_web/live/ammo_type_live/index.ex:68
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Jacket type" msgid "Jacket type"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:52
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:79 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:79
#: lib/cannery_web/live/ammo_type_live/index.ex:69
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Muzzle velocity" msgid "Muzzle velocity"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:55
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:93 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:93
#: lib/cannery_web/live/ammo_type_live/index.ex:72
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Powder grains per charge" msgid "Powder grains per charge"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:53
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:89 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:89
#: lib/cannery_web/live/ammo_type_live/index.ex:70
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Powder type" msgid "Powder type"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:68
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:152 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:152
#: lib/cannery_web/live/ammo_type_live/index.ex:85
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "UPC" msgid "UPC"
msgstr "" msgstr ""
@ -598,18 +600,18 @@ msgstr ""
msgid "New password" msgid "New password"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.html.heex:72 #: lib/cannery_web/live/ammo_group_live/index.html.heex:93
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Stage" msgid "Stage"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.html.heex:72 #: lib/cannery_web/live/ammo_group_live/index.html.heex:93
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Unstage" msgid "Unstage"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:62
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:125 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:125
#: lib/cannery_web/live/ammo_type_live/index.ex:79
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Firing type" msgid "Firing type"
msgstr "" msgstr ""
@ -624,14 +626,14 @@ msgstr ""
msgid "Loading..." msgid "Loading..."
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.ex:27 #: lib/cannery_web/live/container_live/index.ex:32
#: lib/cannery_web/live/container_live/show.ex:126 #: lib/cannery_web/live/container_live/show.ex:113
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit %{name}" msgid "Edit %{name}"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.ex:65 #: lib/cannery_web/live/container_live/index.ex:69
#: lib/cannery_web/live/container_live/show.ex:127 #: lib/cannery_web/live/container_live/show.ex:114
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit %{name} tags" msgid "Edit %{name} tags"
msgstr "" msgstr ""
@ -643,8 +645,8 @@ msgstr ""
msgid "Rounds:" msgid "Rounds:"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:221 #: lib/cannery_web/components/ammo_group_table_component.ex:222
#: lib/cannery_web/live/ammo_type_live/index.ex:178 #: lib/cannery_web/components/ammo_type_table_component.ex:179
#: lib/cannery_web/live/ammo_type_live/show.html.heex:142 #: lib/cannery_web/live/ammo_type_live/show.html.heex:142
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No cost information" msgid "No cost information"
@ -695,7 +697,7 @@ msgstr ""
msgid "Log in" msgid "Log in"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_registration_controller.ex:35 #: lib/cannery_web/controllers/user_registration_controller.ex:34
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Register" msgid "Register"
msgstr "" msgstr ""
@ -706,7 +708,7 @@ msgid "Reset your password"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/show.ex:41 #: lib/cannery_web/live/ammo_group_live/show.ex:41
#: lib/cannery_web/live/range_live/index.ex:26 #: lib/cannery_web/live/range_live/index.ex:33
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Record Shots" msgid "Record Shots"
msgstr "" msgstr ""
@ -716,11 +718,6 @@ msgstr ""
msgid "Copies" msgid "Copies"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:40
#, elixir-autogen, elixir-format, fuzzy
msgid "Ammo types"
msgstr ""
#: lib/cannery_web/live/ammo_type_live/show.html.heex:123 #: lib/cannery_web/live/ammo_type_live/show.html.heex:123
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Added on:" msgid "Added on:"
@ -775,6 +772,8 @@ msgid "View the source code"
msgstr "" msgstr ""
#: lib/cannery_web/components/topbar.ex:65 #: lib/cannery_web/components/topbar.ex:65
#: lib/cannery_web/live/ammo_type_live/index.ex:52
#: lib/cannery_web/live/ammo_type_live/index.ex:62
#: lib/cannery_web/live/ammo_type_live/index.html.heex:3 #: lib/cannery_web/live/ammo_type_live/index.html.heex:3
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Catalog" msgid "Catalog"
@ -833,45 +832,45 @@ msgstr ""
msgid "Container:" msgid "Container:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.html.heex:48 #: lib/cannery_web/live/ammo_group_live/index.html.heex:63
#: lib/cannery_web/live/ammo_type_live/index.html.heex:23 #: lib/cannery_web/live/ammo_type_live/index.html.heex:39
#: lib/cannery_web/live/ammo_type_live/show.html.heex:152 #: lib/cannery_web/live/ammo_type_live/show.html.heex:152
#: lib/cannery_web/live/container_live/show.html.heex:105 #: lib/cannery_web/live/container_live/show.html.heex:105
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Show used" msgid "Show used"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:192 #: lib/cannery_web/components/ammo_group_table_component.ex:193
#: lib/cannery_web/live/ammo_group_live/show.html.heex:19 #: lib/cannery_web/live/ammo_group_live/show.html.heex:19
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{percentage}%" msgid "%{percentage}%"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.ex:114 #: lib/cannery_web/live/range_live/index.ex:136
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Rounds shot: %{count}" msgid "Rounds shot: %{count}"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:117 #: lib/cannery_web/components/ammo_type_table_component.ex:100
#: lib/cannery_web/live/container_live/index.ex:125 #: lib/cannery_web/components/container_table_component.ex:50
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Packs" msgid "Packs"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:97 #: lib/cannery_web/components/ammo_type_table_component.ex:80
#: lib/cannery_web/live/container_live/index.ex:126 #: lib/cannery_web/components/container_table_component.ex:51
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Rounds" msgid "Rounds"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/show.html.heex:158 #: lib/cannery_web/live/ammo_type_live/show.html.heex:158
#: lib/cannery_web/live/container_live/index.html.heex:23 #: lib/cannery_web/live/container_live/index.html.heex:39
#: lib/cannery_web/live/container_live/show.html.heex:111 #: lib/cannery_web/live/container_live/show.html.heex:111
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "View as table" msgid "View as table"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:127 #: lib/cannery_web/components/ammo_type_table_component.ex:110
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Total ever packs" msgid "Total ever packs"
msgstr "" msgstr ""
@ -881,7 +880,7 @@ msgstr ""
msgid "Total ever packs:" msgid "Total ever packs:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:108 #: lib/cannery_web/components/ammo_type_table_component.ex:91
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Total ever rounds" msgid "Total ever rounds"
msgstr "" msgstr ""
@ -891,7 +890,7 @@ msgstr ""
msgid "Total ever rounds:" msgid "Total ever rounds:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:122 #: lib/cannery_web/components/ammo_type_table_component.ex:105
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Used packs" msgid "Used packs"
msgstr "" msgstr ""
@ -901,7 +900,7 @@ msgstr ""
msgid "Used packs:" msgid "Used packs:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:103 #: lib/cannery_web/components/ammo_type_table_component.ex:86
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Used rounds" msgid "Used rounds"
msgstr "" msgstr ""
@ -916,7 +915,7 @@ msgstr ""
msgid "Used up!" msgid "Used up!"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:64 #: lib/cannery_web/live/range_live/index.html.heex:66
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Rounds shot chart" msgid "Rounds shot chart"
msgstr "" msgstr ""
@ -1016,19 +1015,20 @@ msgstr ""
msgid "UPC:" msgid "UPC:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:137 #: lib/cannery_web/components/ammo_type_table_component.ex:120
#: lib/cannery_web/live/ammo_type_live/show.html.heex:132 #: lib/cannery_web/live/ammo_type_live/show.html.heex:132
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Average CPR" msgid "Average CPR"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:28
#: lib/cannery_web/live/ammo_type_live/show.ex:120 #: lib/cannery_web/live/ammo_type_live/show.ex:120
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Edit %{ammo_type_name}" msgid "Edit %{ammo_type_name}"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_card.ex:39 #: lib/cannery_web/components/ammo_group_card.ex:39
#: lib/cannery_web/components/ammo_group_table_component.ex:230 #: lib/cannery_web/components/ammo_group_table_component.ex:231
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Empty" msgid "Empty"
msgstr "" msgstr ""
@ -1078,7 +1078,7 @@ msgstr ""
msgid "Last used on:" msgid "Last used on:"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:177 #: lib/cannery_web/components/ammo_group_table_component.ex:178
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Never used" msgid "Never used"
msgstr "" msgstr ""
@ -1095,12 +1095,38 @@ msgstr ""
msgid "Purchased on:" msgid "Purchased on:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.ex:38 #: lib/cannery_web/live/ammo_group_live/index.ex:46
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Edit ammo" msgid "Edit ammo"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.html.heex:8 #: lib/cannery_web/live/ammo_type_live/index.html.heex:8
#: lib/cannery_web/live/ammo_type_live/index.html.heex:46
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "No Ammo types" msgid "No Ammo types"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.html.heex:33
#, elixir-autogen, elixir-format
msgid "Search catalog"
msgstr ""
#: 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
#, elixir-autogen, elixir-format
msgid "Search containers"
msgstr ""
#: lib/cannery_web/live/tag_live/index.html.heex:36
#, elixir-autogen, elixir-format, fuzzy
msgid "Search tags"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:85
#, elixir-autogen, elixir-format
msgid "Search shot records"
msgstr ""

View File

@ -10,18 +10,18 @@ msgid ""
msgstr "" msgstr ""
"Language: en\n" "Language: en\n"
#: lib/cannery/containers.ex:140 #: lib/cannery/containers.ex:179
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Container must be empty before deleting" msgid "Container must be empty before deleting"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.ex:88 #: lib/cannery_web/live/container_live/index.ex:92
#: lib/cannery_web/live/container_live/show.ex:77 #: lib/cannery_web/live/container_live/show.ex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Could not delete %{name}: %{error}" msgid "Could not delete %{name}: %{error}"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.ex:76 #: lib/cannery_web/live/container_live/index.ex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Could not find that container" msgid "Could not find that container"
msgstr "" msgstr ""
@ -70,14 +70,14 @@ msgstr ""
msgid "Reset password link is invalid or it has expired." msgid "Reset password link is invalid or it has expired."
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_registration_controller.ex:25 #: lib/cannery_web/controllers/user_registration_controller.ex:24
#: lib/cannery_web/controllers/user_registration_controller.ex:56 #: lib/cannery_web/controllers/user_registration_controller.ex:55
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Sorry, public registration is disabled" msgid "Sorry, public registration is disabled"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_registration_controller.ex:15 #: lib/cannery_web/controllers/user_registration_controller.ex:14
#: lib/cannery_web/controllers/user_registration_controller.ex:46 #: lib/cannery_web/controllers/user_registration_controller.ex:45
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Sorry, this invite was not found or expired" msgid "Sorry, this invite was not found or expired"
msgstr "" msgstr ""
@ -107,18 +107,18 @@ msgstr ""
msgid "You are not authorized to view this page." msgid "You are not authorized to view this page."
msgstr "" msgstr ""
#: lib/cannery/accounts/user.ex:138 #: lib/cannery/accounts/user.ex:137
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "did not change" msgid "did not change"
msgstr "" msgstr ""
#: lib/cannery/accounts/user.ex:159 #: lib/cannery/accounts/user.ex:158
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "does not match password" msgid "does not match password"
msgstr "" msgstr ""
## From Ecto.Changeset.put_change/3 ## From Ecto.Changeset.put_change/3
#: lib/cannery/accounts/user.ex:196 #: lib/cannery/accounts/user.ex:195
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "is not valid" msgid "is not valid"
msgstr "" msgstr ""
@ -128,7 +128,7 @@ msgstr ""
msgid "must have the @ sign and no spaces" msgid "must have the @ sign and no spaces"
msgstr "" msgstr ""
#: lib/cannery/tags.ex:40 #: lib/cannery/tags.ex:66
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Tag not found" msgid "Tag not found"
msgstr "" msgstr ""
@ -138,13 +138,13 @@ msgstr ""
msgid "Tag could not be added" msgid "Tag could not be added"
msgstr "" msgstr ""
#: lib/cannery/activity_log/shot_group.ex:123 #: lib/cannery/activity_log/shot_group.ex:122
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Count must be at least 1" msgid "Count must be at least 1"
msgstr "" msgstr ""
#: lib/cannery/activity_log/shot_group.ex:82 #: lib/cannery/activity_log/shot_group.ex:82
#: lib/cannery/activity_log/shot_group.ex:119 #: lib/cannery/activity_log/shot_group.ex:118
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Count must be less than %{count}" msgid "Count must be less than %{count}"
msgstr "" msgstr ""
@ -170,17 +170,17 @@ msgstr ""
msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}" msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
msgstr "" msgstr ""
#: lib/cannery/ammo.ex:609 #: lib/cannery/ammo.ex:686
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Invalid multiplier" msgid "Invalid multiplier"
msgstr "" msgstr ""
#: lib/cannery/ammo/ammo_group.ex:96 #: lib/cannery/ammo/ammo_group.ex:97
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Please select an ammo type and container" msgid "Please select an ammo type and container"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:67 #: lib/cannery_web/live/range_live/index.html.heex:69
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Your browser does not support the canvas element." msgid "Your browser does not support the canvas element."
msgstr "" msgstr ""

View File

@ -19,11 +19,11 @@ msgstr ""
msgid "%{name} created successfully" msgid "%{name} created successfully"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:47 #: lib/cannery_web/live/ammo_type_live/index.ex:73
#: lib/cannery_web/live/ammo_type_live/show.ex:55 #: lib/cannery_web/live/ammo_type_live/show.ex:55
#: lib/cannery_web/live/invite_live/index.ex:53 #: lib/cannery_web/live/invite_live/index.ex:53
#: lib/cannery_web/live/invite_live/index.ex:133 #: lib/cannery_web/live/invite_live/index.ex:133
#: lib/cannery_web/live/tag_live/index.ex:38 #: lib/cannery_web/live/tag_live/index.ex:64
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{name} deleted succesfully" msgid "%{name} deleted succesfully"
msgstr "" msgstr ""
@ -38,8 +38,8 @@ msgstr ""
msgid "%{name} enabled succesfully" msgid "%{name} enabled succesfully"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.ex:81 #: lib/cannery_web/live/container_live/index.ex:85
#: lib/cannery_web/live/container_live/show.ex:67 #: lib/cannery_web/live/container_live/show.ex:63
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{name} has been deleted" msgid "%{name} has been deleted"
msgstr "" msgstr ""
@ -68,10 +68,10 @@ msgstr ""
msgid "Are you sure you want to delete %{email}? This action is permanent!" msgid "Are you sure you want to delete %{email}? This action is permanent!"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.ex:236 #: lib/cannery_web/live/container_live/index.html.heex:92
#: lib/cannery_web/live/container_live/index.html.heex:73 #: lib/cannery_web/live/container_live/index.html.heex:136
#: lib/cannery_web/live/container_live/show.html.heex:59 #: lib/cannery_web/live/container_live/show.html.heex:59
#: lib/cannery_web/live/tag_live/index.html.heex:39 #: lib/cannery_web/live/tag_live/index.html.heex:64
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}?" msgid "Are you sure you want to delete %{name}?"
msgstr "" msgstr ""
@ -81,7 +81,7 @@ msgstr ""
msgid "Are you sure you want to delete the invite for %{name}?" msgid "Are you sure you want to delete the invite for %{name}?"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.html.heex:131 #: lib/cannery_web/live/ammo_group_live/index.html.heex:152
#: lib/cannery_web/live/ammo_group_live/show.html.heex:75 #: lib/cannery_web/live/ammo_group_live/show.html.heex:75
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this ammo?" msgid "Are you sure you want to delete this ammo?"
@ -132,7 +132,7 @@ msgstr ""
msgid "Password updated successfully." msgid "Password updated successfully."
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_registration_controller.ex:74 #: lib/cannery_web/controllers/user_registration_controller.ex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Please check your email to verify your account" msgid "Please check your email to verify your account"
msgstr "" msgstr ""
@ -168,7 +168,7 @@ msgstr ""
msgid "%{name} added successfully" msgid "%{name} added successfully"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.ex:43 #: lib/cannery_web/live/container_live/show.ex:39
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{tag_name} has been removed from %{container_name}" msgid "%{tag_name} has been removed from %{container_name}"
msgstr "" msgstr ""
@ -183,19 +183,19 @@ msgstr ""
msgid "Shots recorded successfully" msgid "Shots recorded successfully"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:27 #: lib/cannery_web/live/range_live/index.html.heex:28
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to unstage this ammo?" msgid "Are you sure you want to unstage this ammo?"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/show.ex:137 #: lib/cannery_web/live/ammo_group_live/show.ex:137
#: lib/cannery_web/live/range_live/index.ex:159 #: lib/cannery_web/live/range_live/index.html.heex:118
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?" msgid "Are you sure you want to delete this shot record?"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/show.ex:83 #: lib/cannery_web/live/ammo_group_live/show.ex:83
#: lib/cannery_web/live/range_live/index.ex:54 #: lib/cannery_web/live/range_live/index.ex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot records deleted succesfully" msgid "Shot records deleted succesfully"
msgstr "" msgstr ""
@ -246,13 +246,13 @@ msgstr ""
msgid "Language updated successfully." msgid "Language updated successfully."
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.ex:64 #: lib/cannery_web/live/ammo_group_live/index.ex:89
#: lib/cannery_web/live/ammo_group_live/show.ex:55 #: lib/cannery_web/live/ammo_group_live/show.ex:55
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Ammo deleted succesfully" msgid "Ammo deleted succesfully"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.ex:68 #: lib/cannery_web/live/range_live/index.ex:95
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Ammo unstaged succesfully" msgid "Ammo unstaged succesfully"
msgstr "" msgstr ""
@ -269,7 +269,7 @@ msgid_plural "Ammo added successfully"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: lib/cannery_web/live/ammo_type_live/index.ex:232 #: lib/cannery_web/live/ammo_type_live/index.html.heex:90
#: lib/cannery_web/live/ammo_type_live/show.html.heex:28 #: lib/cannery_web/live/ammo_type_live/show.html.heex:28
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!" msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!"

View File

@ -10,18 +10,18 @@
msgid "" msgid ""
msgstr "" msgstr ""
#: lib/cannery/containers.ex:140 #: lib/cannery/containers.ex:179
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Container must be empty before deleting" msgid "Container must be empty before deleting"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.ex:88 #: lib/cannery_web/live/container_live/index.ex:92
#: lib/cannery_web/live/container_live/show.ex:77 #: lib/cannery_web/live/container_live/show.ex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Could not delete %{name}: %{error}" msgid "Could not delete %{name}: %{error}"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.ex:76 #: lib/cannery_web/live/container_live/index.ex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Could not find that container" msgid "Could not find that container"
msgstr "" msgstr ""
@ -70,14 +70,14 @@ msgstr ""
msgid "Reset password link is invalid or it has expired." msgid "Reset password link is invalid or it has expired."
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_registration_controller.ex:25 #: lib/cannery_web/controllers/user_registration_controller.ex:24
#: lib/cannery_web/controllers/user_registration_controller.ex:56 #: lib/cannery_web/controllers/user_registration_controller.ex:55
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Sorry, public registration is disabled" msgid "Sorry, public registration is disabled"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_registration_controller.ex:15 #: lib/cannery_web/controllers/user_registration_controller.ex:14
#: lib/cannery_web/controllers/user_registration_controller.ex:46 #: lib/cannery_web/controllers/user_registration_controller.ex:45
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Sorry, this invite was not found or expired" msgid "Sorry, this invite was not found or expired"
msgstr "" msgstr ""
@ -107,17 +107,17 @@ msgstr ""
msgid "You are not authorized to view this page." msgid "You are not authorized to view this page."
msgstr "" msgstr ""
#: lib/cannery/accounts/user.ex:138 #: lib/cannery/accounts/user.ex:137
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "did not change" msgid "did not change"
msgstr "" msgstr ""
#: lib/cannery/accounts/user.ex:159 #: lib/cannery/accounts/user.ex:158
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "does not match password" msgid "does not match password"
msgstr "" msgstr ""
#: lib/cannery/accounts/user.ex:196 #: lib/cannery/accounts/user.ex:195
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "is not valid" msgid "is not valid"
msgstr "" msgstr ""
@ -127,7 +127,7 @@ msgstr ""
msgid "must have the @ sign and no spaces" msgid "must have the @ sign and no spaces"
msgstr "" msgstr ""
#: lib/cannery/tags.ex:40 #: lib/cannery/tags.ex:66
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Tag not found" msgid "Tag not found"
msgstr "" msgstr ""
@ -137,13 +137,13 @@ msgstr ""
msgid "Tag could not be added" msgid "Tag could not be added"
msgstr "" msgstr ""
#: lib/cannery/activity_log/shot_group.ex:123 #: lib/cannery/activity_log/shot_group.ex:122
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Count must be at least 1" msgid "Count must be at least 1"
msgstr "" msgstr ""
#: lib/cannery/activity_log/shot_group.ex:82 #: lib/cannery/activity_log/shot_group.ex:82
#: lib/cannery/activity_log/shot_group.ex:119 #: lib/cannery/activity_log/shot_group.ex:118
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Count must be less than %{count}" msgid "Count must be less than %{count}"
msgstr "" msgstr ""
@ -169,17 +169,17 @@ msgstr ""
msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}" msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
msgstr "" msgstr ""
#: lib/cannery/ammo.ex:609 #: lib/cannery/ammo.ex:686
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Invalid multiplier" msgid "Invalid multiplier"
msgstr "" msgstr ""
#: lib/cannery/ammo/ammo_group.ex:96 #: lib/cannery/ammo/ammo_group.ex:97
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Please select an ammo type and container" msgid "Please select an ammo type and container"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:67 #: lib/cannery_web/live/range_live/index.html.heex:69
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Your browser does not support the canvas element." msgid "Your browser does not support the canvas element."
msgstr "" msgstr ""

View File

@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-21 19:45+0000\n" "POT-Creation-Date: 2022-05-21 19:45+0000\n"
"PO-Revision-Date: 2022-11-13 21:49+0000\n" "PO-Revision-Date: 2022-11-30 19:19+0000\n"
"Last-Translator: Brea Foga <breaardiente@gmail.com>\n" "Last-Translator: Brea Foga <breaardiente@gmail.com>\n"
"Language-Team: Spanish <https://weblate.bubbletea.dev/projects/cannery/" "Language-Team: Spanish <https://weblate.bubbletea.dev/projects/cannery/"
"actions/es/>\n" "actions/es/>\n"
@ -23,8 +23,8 @@ msgstr ""
## Run "mix gettext.extract" to bring this file up to ## Run "mix gettext.extract" to bring this file up to
## date. Leave "msgstr"s empty as changing them here has no ## date. Leave "msgstr"s empty as changing them here has no
## effect: edit them in PO (.po) files instead. ## effect: edit them in PO (.po) files instead.
#: lib/cannery_web/live/ammo_group_live/index.ex:44 #: lib/cannery_web/live/ammo_group_live/index.ex:54
#: lib/cannery_web/live/ammo_group_live/index.ex:50 #: lib/cannery_web/live/ammo_group_live/index.ex:62
#: lib/cannery_web/live/ammo_group_live/index.html.heex:40 #: lib/cannery_web/live/ammo_group_live/index.html.heex:40
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Add Ammo" msgid "Add Ammo"
@ -169,9 +169,9 @@ msgstr "Preparar munición"
msgid "Why not get some ready to shoot?" msgid "Why not get some ready to shoot?"
msgstr "¿Por qué no preparar parte para disparar?" msgstr "¿Por qué no preparar parte para disparar?"
#: lib/cannery_web/live/ammo_group_live/index.html.heex:79 #: lib/cannery_web/live/ammo_group_live/index.html.heex:100
#: lib/cannery_web/live/ammo_group_live/show.html.heex:101 #: lib/cannery_web/live/ammo_group_live/show.html.heex:101
#: lib/cannery_web/live/range_live/index.html.heex:38 #: lib/cannery_web/live/range_live/index.html.heex:39
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Record shots" msgid "Record shots"
msgstr "Tiros récord" msgstr "Tiros récord"
@ -244,21 +244,21 @@ msgstr "Mover munición"
#: lib/cannery_web/live/invite_live/index.html.heex:80 #: lib/cannery_web/live/invite_live/index.html.heex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Set Unlimited" msgid "Set Unlimited"
msgstr "" msgstr "Activar ilimitados"
#: lib/cannery_web/live/ammo_group_live/show.html.heex:86 #: lib/cannery_web/live/ammo_group_live/show.html.heex:86
#: lib/cannery_web/live/range_live/index.html.heex:31 #: lib/cannery_web/live/range_live/index.html.heex:32
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Stage for range" msgid "Stage for range"
msgstr "" 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:85
#: lib/cannery_web/live/range_live/index.html.heex:30 #: lib/cannery_web/live/range_live/index.html.heex:31
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Unstage from range" msgid "Unstage from range"
msgstr "" msgstr "Desmontar del campo de tiro"
#: lib/cannery_web/templates/user_settings/edit.html.heex:148 #: lib/cannery_web/templates/user_settings/edit.html.heex:148
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Export Data as JSON" msgid "Export Data as JSON"
msgstr "" msgstr "Exportar datos como JSON"

File diff suppressed because it is too large Load Diff

View File

@ -3,8 +3,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-21 19:44+0000\n" "POT-Creation-Date: 2022-05-21 19:44+0000\n"
"PO-Revision-Date: 2022-05-22 22:52+0000\n" "PO-Revision-Date: 2022-11-30 19:19+0000\n"
"Last-Translator: Ed <ed.ylles1997@gmail.com>\n" "Last-Translator: Hannah Winter <konhat@hotmail.es>\n"
"Language-Team: Spanish <https://weblate.bubbletea.dev/projects/cannery/" "Language-Team: Spanish <https://weblate.bubbletea.dev/projects/cannery/"
"emails/es/>\n" "emails/es/>\n"
"Language: es\n" "Language: es\n"
@ -12,7 +12,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.12.2\n" "X-Generator: Weblate 4.14.2\n"
## This file is a PO Template file. ## This file is a PO Template file.
## ##
@ -41,23 +41,23 @@ msgstr "Hola %{email},"
#: lib/cannery_web/templates/email/confirm_email.txt.eex:10 #: lib/cannery_web/templates/email/confirm_email.txt.eex:10
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "If you didn't create an account at %{url}, please ignore this." msgid "If you didn't create an account at %{url}, please ignore this."
msgstr "" msgstr "Si no creó un usuario en %{url}, por favor, ignore este mensaje."
#: lib/cannery_web/templates/email/reset_password.txt.eex:8 #: lib/cannery_web/templates/email/reset_password.txt.eex:8
#: lib/cannery_web/templates/email/update_email.txt.eex:8 #: lib/cannery_web/templates/email/update_email.txt.eex:8
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "If you didn't request this change from %{url}, please ignore this." msgid "If you didn't request this change from %{url}, please ignore this."
msgstr "" msgstr "Si no pidió este cambio desde %{url}, por favor, ignore este mensaje."
#: lib/cannery/accounts/email.ex:37 #: lib/cannery/accounts/email.ex:37
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Reset your %{name} password" msgid "Reset your %{name} password"
msgstr "" msgstr "Reseteé su contraseña en %{name}"
#: lib/cannery/accounts/email.ex:44 #: lib/cannery/accounts/email.ex:44
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Update your %{name} email" msgid "Update your %{name} email"
msgstr "" msgstr "Actualice su correo en &{url}"
#: lib/cannery_web/templates/email/confirm_email.html.eex:9 #: lib/cannery_web/templates/email/confirm_email.html.eex:9
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -95,20 +95,26 @@ msgstr ""
#: lib/cannery_web/templates/email/confirm_email.html.eex:22 #: lib/cannery_web/templates/email/confirm_email.html.eex:22
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "If you didn't create an account at %{name}, please ignore this." msgid "If you didn't create an account at %{name}, please ignore this."
msgstr "" msgstr "Si no ha creado una cuenta en %{name}, por favor, ignore este mensaje."
#: lib/cannery_web/templates/email/reset_password.html.eex:16 #: lib/cannery_web/templates/email/reset_password.html.eex:16
#: lib/cannery_web/templates/email/update_email.html.eex:16 #: lib/cannery_web/templates/email/update_email.html.eex:16
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "If you didn't request this change from %{name}, please ignore this." msgid "If you didn't request this change from %{name}, please ignore this."
msgstr "" msgstr ""
"Si no ha solicitado este cambio desde %{name}, por favor, ignore este "
"mensaje."
#: lib/cannery_web/templates/layout/email.txt.eex:9 #: lib/cannery_web/templates/layout/email.txt.eex:9
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "This email was sent from %{name} at %{url}, the self-hosted firearm tracker website." msgid "This email was sent from %{name} at %{url}, the self-hosted firearm tracker website."
msgstr "" msgstr ""
"Este correo se mandó por %{name} desde %{url}, la página de seguimiento de "
"armas autogestionada."
#: lib/cannery_web/templates/layout/email.html.heex:13 #: lib/cannery_web/templates/layout/email.html.heex:13
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "This email was sent from %{name}, the self-hosted firearm tracker website." msgid "This email was sent from %{name}, the self-hosted firearm tracker website."
msgstr "" msgstr ""
"Este correo se mandó por %{name}, la página de seguimiento de armas "
"autogestionada."

View File

@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-21 19:44+0000\n" "POT-Creation-Date: 2022-05-21 19:44+0000\n"
"PO-Revision-Date: 2022-11-13 21:49+0000\n" "PO-Revision-Date: 2022-12-01 19:21+0000\n"
"Last-Translator: Brea Foga <breaardiente@gmail.com>\n" "Last-Translator: Brea Foga <breaardiente@gmail.com>\n"
"Language-Team: Spanish <https://weblate.bubbletea.dev/projects/cannery/" "Language-Team: Spanish <https://weblate.bubbletea.dev/projects/cannery/"
"errors/es/>\n" "errors/es/>\n"
@ -23,18 +23,18 @@ msgstr ""
## Run "mix gettext.extract" to bring this file up to ## Run "mix gettext.extract" to bring this file up to
## date. Leave "msgstr"s empty as changing them here has no ## date. Leave "msgstr"s empty as changing them here has no
## effect: edit them in PO (.po) files instead. ## effect: edit them in PO (.po) files instead.
#: lib/cannery/containers.ex:140 #: lib/cannery/containers.ex:179
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Container must be empty before deleting" msgid "Container must be empty before deleting"
msgstr "El contenedor debe estar vacío antes de ser borrado" msgstr "El contenedor debe estar vacío antes de ser borrado"
#: lib/cannery_web/live/container_live/index.ex:88 #: lib/cannery_web/live/container_live/index.ex:92
#: lib/cannery_web/live/container_live/show.ex:77 #: lib/cannery_web/live/container_live/show.ex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Could not delete %{name}: %{error}" msgid "Could not delete %{name}: %{error}"
msgstr "No se pudo eliminar %{name}: %{error}" msgstr "No se pudo eliminar %{name}: %{error}"
#: lib/cannery_web/live/container_live/index.ex:76 #: lib/cannery_web/live/container_live/index.ex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Could not find that container" msgid "Could not find that container"
msgstr "No se pudo encontrar el contenedor" msgstr "No se pudo encontrar el contenedor"
@ -86,22 +86,22 @@ msgid "Reset password link is invalid or it has expired."
msgstr "" msgstr ""
"El enlace de reestablecimiento de la contraseña es inválido o ha caducado." "El enlace de reestablecimiento de la contraseña es inválido o ha caducado."
#: lib/cannery_web/controllers/user_registration_controller.ex:25 #: lib/cannery_web/controllers/user_registration_controller.ex:24
#: lib/cannery_web/controllers/user_registration_controller.ex:56 #: lib/cannery_web/controllers/user_registration_controller.ex:55
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Sorry, public registration is disabled" msgid "Sorry, public registration is disabled"
msgstr "Lo sentimos, la inscripción pública está desactivada" msgstr "Lo sentimos, el registro público no está habilitado"
#: lib/cannery_web/controllers/user_registration_controller.ex:15 #: lib/cannery_web/controllers/user_registration_controller.ex:14
#: lib/cannery_web/controllers/user_registration_controller.ex:46 #: lib/cannery_web/controllers/user_registration_controller.ex:45
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Sorry, this invite was not found or expired" msgid "Sorry, this invite was not found or expired"
msgstr "Lo sentimos, esta invitación no fue encontrada o ha expirado" msgstr "Lo sentimos, esta invitación no es válida o ha caducado"
#: lib/cannery_web/controllers/user_settings_controller.ex:99 #: lib/cannery_web/controllers/user_settings_controller.ex:99
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Unable to delete user" msgid "Unable to delete user"
msgstr "No se pudo borrar el usuario" msgstr "No se ha podido eliminar el usuario"
#: lib/cannery_web/views/error_view.ex:10 #: lib/cannery_web/views/error_view.ex:10
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -111,7 +111,7 @@ msgstr "No autorizado"
#: lib/cannery_web/controllers/user_confirmation_controller.ex:54 #: lib/cannery_web/controllers/user_confirmation_controller.ex:54
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "User confirmation link is invalid or it has expired." msgid "User confirmation link is invalid or it has expired."
msgstr "El enlace de confirmación es inválido o ha expirado." msgstr "El enlace de confirmación de usuario no es válido o ha caducado."
#: lib/cannery_web/live/invite_live/index.ex:18 #: lib/cannery_web/live/invite_live/index.ex:18
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -123,17 +123,17 @@ msgstr "No está autorizado a ver esta página"
msgid "You are not authorized to view this page." msgid "You are not authorized to view this page."
msgstr "No está autorizado a ver esta página." msgstr "No está autorizado a ver esta página."
#: lib/cannery/accounts/user.ex:138 #: lib/cannery/accounts/user.ex:137
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "did not change" msgid "did not change"
msgstr "no cambió" msgstr "no cambió"
#: lib/cannery/accounts/user.ex:159 #: lib/cannery/accounts/user.ex:158
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "does not match password" msgid "does not match password"
msgstr "no coincide con la contraseña" msgstr "no coincide con la contraseña"
#: lib/cannery/accounts/user.ex:196 #: lib/cannery/accounts/user.ex:195
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "is not valid" msgid "is not valid"
msgstr "no es válido" msgstr "no es válido"
@ -143,7 +143,7 @@ msgstr "no es válido"
msgid "must have the @ sign and no spaces" msgid "must have the @ sign and no spaces"
msgstr "debe tener el signo @ y no contener espacios" msgstr "debe tener el signo @ y no contener espacios"
#: lib/cannery/tags.ex:40 #: lib/cannery/tags.ex:66
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Tag not found" msgid "Tag not found"
msgstr "Etiqueta no encontrada" msgstr "Etiqueta no encontrada"
@ -151,15 +151,15 @@ msgstr "Etiqueta no encontrada"
#: lib/cannery_web/live/container_live/edit_tags_component.ex:30 #: lib/cannery_web/live/container_live/edit_tags_component.ex:30
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Tag could not be added" msgid "Tag could not be added"
msgstr "La etiqueta no pudo ser añadida" msgstr "No se ha podido añadir la etiqueta"
#: lib/cannery/activity_log/shot_group.ex:123 #: lib/cannery/activity_log/shot_group.ex:122
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Count must be at least 1" msgid "Count must be at least 1"
msgstr "El recuento debe dar al menos 1" msgstr "El recuento debe dar al menos 1"
#: lib/cannery/activity_log/shot_group.ex:82 #: lib/cannery/activity_log/shot_group.ex:82
#: lib/cannery/activity_log/shot_group.ex:119 #: lib/cannery/activity_log/shot_group.ex:118
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Count must be less than %{count}" msgid "Count must be less than %{count}"
msgstr "El recuento debe ser menos de %{count}" msgstr "El recuento debe ser menos de %{count}"
@ -178,29 +178,29 @@ msgstr "La etiqueta no pudo ser eliminada"
#: lib/cannery_web/live/ammo_group_live/form_component.ex:157 #: lib/cannery_web/live/ammo_group_live/form_component.ex:157
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Could not parse number of copies" msgid "Could not parse number of copies"
msgstr "No se pudo analizar el número de copias" msgstr "No se ha podido procesar el número de copias"
#: lib/cannery_web/live/ammo_group_live/form_component.ex:142 #: lib/cannery_web/live/ammo_group_live/form_component.ex:142
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}" msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
msgstr "Número inválido de copias, debe ser entre 1 y %{max}. Fue %{multiplier" msgstr "Número inválido de copias, debe ser entre 1 y %{max}. Fue %{multiplier"
#: lib/cannery/ammo.ex:609 #: lib/cannery/ammo.ex:686
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Invalid multiplier" msgid "Invalid multiplier"
msgstr "Multiplicador inválido" msgstr "Multiplicador inválido"
#: lib/cannery/ammo/ammo_group.ex:96 #: lib/cannery/ammo/ammo_group.ex:97
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Please select an ammo type and container" msgid "Please select an ammo type and container"
msgstr "" msgstr "Por favor escoja un tipo de munición y un contenedor"
#: lib/cannery_web/live/range_live/index.html.heex:67 #: lib/cannery_web/live/range_live/index.html.heex:69
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Your browser does not support the canvas element." msgid "Your browser does not support the canvas element."
msgstr "Su navegador no es compatible con el elemento lienzo." msgstr "Su navegador no es compatible con el elemento lienzo."
#: lib/cannery/activity_log/shot_group.ex:77 #: lib/cannery/activity_log/shot_group.ex:77
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format
msgid "Please select a valid user and ammo pack" msgid "Please select a valid user and ammo pack"
msgstr "" msgstr "Por favor escoja un usuario y tipo de munición valido"

View File

@ -3,8 +3,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-21 19:44+0000\n" "POT-Creation-Date: 2022-05-21 19:44+0000\n"
"PO-Revision-Date: 2022-06-06 19:05+0000\n" "PO-Revision-Date: 2022-11-30 19:19+0000\n"
"Last-Translator: Ed <ed.ylles1997@gmail.com>\n" "Last-Translator: Brea Foga <breaardiente@gmail.com>\n"
"Language-Team: Spanish <https://weblate.bubbletea.dev/projects/cannery/" "Language-Team: Spanish <https://weblate.bubbletea.dev/projects/cannery/"
"prompts/es/>\n" "prompts/es/>\n"
"Language: es\n" "Language: es\n"
@ -12,7 +12,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.12.2\n" "X-Generator: Weblate 4.14.2\n"
## This file is a PO Template file. ## This file is a PO Template file.
## ##
@ -31,11 +31,11 @@ msgstr ""
msgid "%{name} created successfully" msgid "%{name} created successfully"
msgstr "%{name} creado exitosamente" msgstr "%{name} creado exitosamente"
#: lib/cannery_web/live/ammo_type_live/index.ex:47 #: lib/cannery_web/live/ammo_type_live/index.ex:73
#: lib/cannery_web/live/ammo_type_live/show.ex:55 #: lib/cannery_web/live/ammo_type_live/show.ex:55
#: lib/cannery_web/live/invite_live/index.ex:53 #: lib/cannery_web/live/invite_live/index.ex:53
#: lib/cannery_web/live/invite_live/index.ex:133 #: lib/cannery_web/live/invite_live/index.ex:133
#: lib/cannery_web/live/tag_live/index.ex:38 #: lib/cannery_web/live/tag_live/index.ex:64
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{name} deleted succesfully" msgid "%{name} deleted succesfully"
msgstr "%{name} borrado exitosamente" msgstr "%{name} borrado exitosamente"
@ -50,8 +50,8 @@ msgstr "%{name} desactivado exitosamente"
msgid "%{name} enabled succesfully" msgid "%{name} enabled succesfully"
msgstr "%{name} activado exitosamente" msgstr "%{name} activado exitosamente"
#: lib/cannery_web/live/container_live/index.ex:81 #: lib/cannery_web/live/container_live/index.ex:85
#: lib/cannery_web/live/container_live/show.ex:67 #: lib/cannery_web/live/container_live/show.ex:63
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{name} has been deleted" msgid "%{name} has been deleted"
msgstr "%{name} ha sido borrado" msgstr "%{name} ha sido borrado"
@ -82,10 +82,10 @@ msgstr ""
msgid "Are you sure you want to delete %{email}? This action is permanent!" 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!" msgstr "Está seguro que desea eliminar %{email}? Esta acción es permanente!"
#: lib/cannery_web/live/container_live/index.ex:236 #: lib/cannery_web/live/container_live/index.html.heex:92
#: lib/cannery_web/live/container_live/index.html.heex:73 #: lib/cannery_web/live/container_live/index.html.heex:136
#: lib/cannery_web/live/container_live/show.html.heex:59 #: lib/cannery_web/live/container_live/show.html.heex:59
#: lib/cannery_web/live/tag_live/index.html.heex:39 #: lib/cannery_web/live/tag_live/index.html.heex:64
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}?" msgid "Are you sure you want to delete %{name}?"
msgstr "Está seguro que desea eliminar %{name}?" msgstr "Está seguro que desea eliminar %{name}?"
@ -95,7 +95,7 @@ msgstr "Está seguro que desea eliminar %{name}?"
msgid "Are you sure you want to delete the invite for %{name}?" msgid "Are you sure you want to delete the invite for %{name}?"
msgstr "Está seguro que quiere eliminar la invitación para %{name}?" msgstr "Está seguro que quiere eliminar la invitación para %{name}?"
#: lib/cannery_web/live/ammo_group_live/index.html.heex:131 #: lib/cannery_web/live/ammo_group_live/index.html.heex:152
#: lib/cannery_web/live/ammo_group_live/show.html.heex:75 #: lib/cannery_web/live/ammo_group_live/show.html.heex:75
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this ammo?" msgid "Are you sure you want to delete this ammo?"
@ -150,7 +150,7 @@ msgstr "Contraseña reiniciada exitosamente."
msgid "Password updated successfully." msgid "Password updated successfully."
msgstr "Contraseña cambiada exitosamente." msgstr "Contraseña cambiada exitosamente."
#: lib/cannery_web/controllers/user_registration_controller.ex:74 #: lib/cannery_web/controllers/user_registration_controller.ex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Please check your email to verify your account" msgid "Please check your email to verify your account"
msgstr "Por favor chequea el correo para verificar tu cuenta" msgstr "Por favor chequea el correo para verificar tu cuenta"
@ -187,7 +187,7 @@ msgstr ""
msgid "%{name} added successfully" msgid "%{name} added successfully"
msgstr "%{name} añadido exitosamente" msgstr "%{name} añadido exitosamente"
#: lib/cannery_web/live/container_live/show.ex:43 #: lib/cannery_web/live/container_live/show.ex:39
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{tag_name} has been removed from %{container_name}" msgid "%{tag_name} has been removed from %{container_name}"
msgstr "se ha removido %{tag_name} de %{container_name}" msgstr "se ha removido %{tag_name} de %{container_name}"
@ -202,94 +202,96 @@ msgstr "Añadiendo..."
msgid "Shots recorded successfully" msgid "Shots recorded successfully"
msgstr "Tiros registrados exitosamente" msgstr "Tiros registrados exitosamente"
#: lib/cannery_web/live/range_live/index.html.heex:27 #: lib/cannery_web/live/range_live/index.html.heex:28
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to unstage this ammo?" msgid "Are you sure you want to unstage this ammo?"
msgstr "Está seguro que desea desmontar esta munición?" msgstr "Está seguro que desea desmontar esta munición?"
#: lib/cannery_web/live/ammo_group_live/show.ex:137 #: lib/cannery_web/live/ammo_group_live/show.ex:137
#: lib/cannery_web/live/range_live/index.ex:159 #: lib/cannery_web/live/range_live/index.html.heex:118
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?" msgid "Are you sure you want to delete this shot record?"
msgstr "" msgstr "¿Está segure que quiere borrar este récord de disparos?"
#: lib/cannery_web/live/ammo_group_live/show.ex:83 #: lib/cannery_web/live/ammo_group_live/show.ex:83
#: lib/cannery_web/live/range_live/index.ex:54 #: lib/cannery_web/live/range_live/index.ex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot records deleted succesfully" msgid "Shot records deleted succesfully"
msgstr "" msgstr "Récord de disparos borrado exitosamente"
#: lib/cannery_web/live/range_live/form_component.ex:55 #: lib/cannery_web/live/range_live/form_component.ex:55
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot records updated successfully" msgid "Shot records updated successfully"
msgstr "" msgstr "Récord de disparos actualizado exitosamente"
#: lib/cannery_web/controllers/user_confirmation_controller.ex:38 #: lib/cannery_web/controllers/user_confirmation_controller.ex:38
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{email} confirmed successfully." msgid "%{email} confirmed successfully."
msgstr "" msgstr "%{email} confirmado exitosamente."
#: lib/cannery_web/components/move_ammo_group_component.ex:53 #: lib/cannery_web/components/move_ammo_group_component.ex:53
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Ammo moved to %{name} successfully" msgid "Ammo moved to %{name} successfully"
msgstr "" msgstr "Munición movida a %{name} exitosamente"
#: lib/cannery_web/live/invite_live/index.ex:121 #: lib/cannery_web/live/invite_live/index.ex:121
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Copied to clipboard" msgid "Copied to clipboard"
msgstr "" msgstr "Copiado al portapapeles"
#: lib/cannery_web/live/container_live/edit_tags_component.ex:58 #: lib/cannery_web/live/container_live/edit_tags_component.ex:58
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{name} removed successfully" msgid "%{name} removed successfully"
msgstr "" msgstr "%{name} eliminado exitosamente"
#: lib/cannery_web/live/ammo_group_live/index.html.heex:17 #: lib/cannery_web/live/ammo_group_live/index.html.heex:17
#: lib/cannery_web/live/ammo_group_live/index.html.heex:27 #: lib/cannery_web/live/ammo_group_live/index.html.heex:27
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "You'll need to" msgid "You'll need to"
msgstr "" msgstr "Necesitará hacerlo"
#: lib/cannery_web/live/ammo_group_live/form_component.html.heex:75 #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:75
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Creating..." msgid "Creating..."
msgstr "" msgstr "Creando..."
#: lib/cannery_web/templates/user_settings/edit.html.heex:136 #: lib/cannery_web/templates/user_settings/edit.html.heex:136
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to change your language?" msgid "Are you sure you want to change your language?"
msgstr "" msgstr "¿Está segure de que quiere cambiar el idioma?"
#: lib/cannery_web/controllers/user_settings_controller.ex:65 #: lib/cannery_web/controllers/user_settings_controller.ex:65
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Language updated successfully." msgid "Language updated successfully."
msgstr "" msgstr "Idioma cambiado exitosamente."
#: lib/cannery_web/live/ammo_group_live/index.ex:64 #: lib/cannery_web/live/ammo_group_live/index.ex:89
#: lib/cannery_web/live/ammo_group_live/show.ex:55 #: lib/cannery_web/live/ammo_group_live/show.ex:55
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format
msgid "Ammo deleted succesfully" msgid "Ammo deleted succesfully"
msgstr "" msgstr "Munición borrada exitosamente"
#: lib/cannery_web/live/range_live/index.ex:68 #: lib/cannery_web/live/range_live/index.ex:95
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Ammo unstaged succesfully" msgid "Ammo unstaged succesfully"
msgstr "" msgstr "Munición descargada exitosamente"
#: lib/cannery_web/live/ammo_group_live/form_component.ex:118 #: lib/cannery_web/live/ammo_group_live/form_component.ex:118
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format
msgid "Ammo updated successfully" msgid "Ammo updated successfully"
msgstr "" msgstr "Munición actualizada exitosamente"
#: lib/cannery_web/live/ammo_group_live/form_component.ex:178 #: lib/cannery_web/live/ammo_group_live/form_component.ex:178
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format
msgid "Ammo added successfully" msgid "Ammo added successfully"
msgid_plural "Ammo added successfully" msgid_plural "Ammo added successfully"
msgstr[0] "" msgstr[0] "Munición añadida exitosamente"
msgstr[1] "" msgstr[1] "Municiones añadidas exitosamente"
#: lib/cannery_web/live/ammo_type_live/index.ex:232 #: lib/cannery_web/live/ammo_type_live/index.html.heex:90
#: lib/cannery_web/live/ammo_type_live/show.html.heex:28 #: lib/cannery_web/live/ammo_type_live/show.html.heex:28
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!" msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!"
msgstr "" msgstr ""
"¿Está seguro de que quiere borrar %{name}? ¡Esto también borrará todos los "
"tipos de munición %{name}!"

View File

@ -23,8 +23,8 @@ msgstr ""
# # Run "mix gettext.extract" to bring this file up to # # Run "mix gettext.extract" to bring this file up to
# # date. Leave "msgstr"s empty as changing them here has no # # date. Leave "msgstr"s empty as changing them here has no
# # effect: edit them in PO (.po) files instead. # # effect: edit them in PO (.po) files instead.
#: lib/cannery_web/live/ammo_group_live/index.ex:44 #: lib/cannery_web/live/ammo_group_live/index.ex:54
#: lib/cannery_web/live/ammo_group_live/index.ex:50 #: lib/cannery_web/live/ammo_group_live/index.ex:62
#: lib/cannery_web/live/ammo_group_live/index.html.heex:40 #: lib/cannery_web/live/ammo_group_live/index.html.heex:40
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Add Ammo" msgid "Add Ammo"
@ -169,9 +169,9 @@ msgstr "Munition préparée"
msgid "Why not get some ready to shoot?" msgid "Why not get some ready to shoot?"
msgstr "Pourquoi pas en préparer pour tirer?" msgstr "Pourquoi pas en préparer pour tirer?"
#: lib/cannery_web/live/ammo_group_live/index.html.heex:79 #: lib/cannery_web/live/ammo_group_live/index.html.heex:100
#: lib/cannery_web/live/ammo_group_live/show.html.heex:101 #: lib/cannery_web/live/ammo_group_live/show.html.heex:101
#: lib/cannery_web/live/range_live/index.html.heex:38 #: lib/cannery_web/live/range_live/index.html.heex:39
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Record shots" msgid "Record shots"
msgstr "Enregistrer des tirs" msgstr "Enregistrer des tirs"
@ -247,13 +247,13 @@ msgid "Set Unlimited"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/show.html.heex:86 #: lib/cannery_web/live/ammo_group_live/show.html.heex:86
#: lib/cannery_web/live/range_live/index.html.heex:31 #: lib/cannery_web/live/range_live/index.html.heex:32
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Stage for range" msgid "Stage for range"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/show.html.heex:85 #: lib/cannery_web/live/ammo_group_live/show.html.heex:85
#: lib/cannery_web/live/range_live/index.html.heex:30 #: lib/cannery_web/live/range_live/index.html.heex:31
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Unstage from range" msgid "Unstage from range"
msgstr "" msgstr ""

View File

@ -45,10 +45,11 @@ msgstr "Administrateur·ices"
msgid "Admins:" msgid "Admins:"
msgstr "Administrateur·ices:" msgstr "Administrateur·ices:"
#: lib/cannery_web/components/shot_group_table_component.ex:41
#: lib/cannery_web/components/topbar.ex:73 #: lib/cannery_web/components/topbar.ex:73
#: lib/cannery_web/live/ammo_group_live/index.ex:56 #: lib/cannery_web/live/ammo_group_live/index.ex:70
#: lib/cannery_web/live/ammo_group_live/index.ex:79
#: lib/cannery_web/live/ammo_group_live/index.html.heex:3 #: lib/cannery_web/live/ammo_group_live/index.html.heex:3
#: lib/cannery_web/live/range_live/index.ex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Ammo" msgid "Ammo"
msgstr "Munition" msgstr "Munition"
@ -64,8 +65,8 @@ msgstr "Type de munition"
msgid "Background color" msgid "Background color"
msgstr "Couleur de fond" msgstr "Couleur de fond"
#: lib/cannery_web/components/ammo_type_table_component.ex:65
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:140 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:140
#: lib/cannery_web/live/ammo_type_live/index.ex:82
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Blank" msgid "Blank"
msgstr "Vide" msgstr "Vide"
@ -75,32 +76,32 @@ msgstr "Vide"
msgid "Brass" msgid "Brass"
msgstr "Cuivre" msgstr "Cuivre"
#: lib/cannery_web/components/ammo_type_table_component.ex:47
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:44 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:44
#: lib/cannery_web/live/ammo_type_live/index.ex:64
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Bullet core" msgid "Bullet core"
msgstr "Noyau de balle" msgstr "Noyau de balle"
#: lib/cannery_web/components/ammo_type_table_component.ex:46
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:37 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:37
#: lib/cannery_web/live/ammo_type_live/index.ex:63
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Bullet type" msgid "Bullet type"
msgstr "Type de balle" msgstr "Type de balle"
#: lib/cannery_web/components/ammo_type_table_component.ex:49
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:58 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:58
#: lib/cannery_web/live/ammo_type_live/index.ex:66
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Caliber" msgid "Caliber"
msgstr "Calibre" msgstr "Calibre"
#: lib/cannery_web/components/ammo_type_table_component.ex:48
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:51 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:51
#: lib/cannery_web/live/ammo_type_live/index.ex:65
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Cartridge" msgid "Cartridge"
msgstr "Cartouche" msgstr "Cartouche"
#: lib/cannery_web/components/ammo_type_table_component.ex:50
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:65 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:65
#: lib/cannery_web/live/ammo_type_live/index.ex:67
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Case material" msgid "Case material"
msgstr "Matériau de la caisse" msgstr "Matériau de la caisse"
@ -113,15 +114,15 @@ msgid "Container"
msgstr "Conteneur" msgstr "Conteneur"
#: lib/cannery_web/components/topbar.ex:57 #: lib/cannery_web/components/topbar.ex:57
#: lib/cannery_web/live/container_live/index.ex:44 #: lib/cannery_web/live/container_live/index.ex:49
#: lib/cannery_web/live/container_live/index.ex:53 #: lib/cannery_web/live/container_live/index.ex:58
#: lib/cannery_web/live/container_live/index.html.heex:3 #: lib/cannery_web/live/container_live/index.html.heex:3
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Containers" msgid "Containers"
msgstr "Conteneurs" msgstr "Conteneurs"
#: lib/cannery_web/components/ammo_type_table_component.ex:66
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:144 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:144
#: lib/cannery_web/live/ammo_type_live/index.ex:83
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Corrosive" msgid "Corrosive"
msgstr "Corrosive" msgstr "Corrosive"
@ -138,9 +139,9 @@ msgstr "Quantité"
msgid "Count:" msgid "Count:"
msgstr "Quantité:" msgstr "Quantité:"
#: lib/cannery_web/components/container_table_component.ex:47
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:24 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:24
#: lib/cannery_web/live/container_live/form_component.html.heex:27 #: lib/cannery_web/live/container_live/form_component.html.heex:27
#: lib/cannery_web/live/container_live/index.ex:122
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Description" msgid "Description"
msgstr "Description" msgstr "Description"
@ -156,17 +157,12 @@ msgstr "Description:"
msgid "Easy to Use:" msgid "Easy to Use:"
msgstr "Simple à utiliser:" msgstr "Simple à utiliser:"
#: lib/cannery_web/live/ammo_type_live/index.ex:23
#, elixir-autogen, elixir-format
msgid "Edit Ammo type"
msgstr "Éditer le type de munition"
#: lib/cannery_web/live/invite_live/index.ex:33 #: lib/cannery_web/live/invite_live/index.ex:33
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit Invite" msgid "Edit Invite"
msgstr "Modifier linvitation" msgstr "Modifier linvitation"
#: lib/cannery_web/live/tag_live/index.ex:21 #: lib/cannery_web/live/tag_live/index.ex:28
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit Tag" msgid "Edit Tag"
msgstr "Modifier le tag" msgstr "Modifier le tag"
@ -181,14 +177,14 @@ msgstr "Exemple dabréviations de type de balle"
msgid "FMJ" msgid "FMJ"
msgstr "FMJ" msgstr "FMJ"
#: lib/cannery_web/components/ammo_type_table_component.ex:59
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:103 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:103
#: lib/cannery_web/live/ammo_type_live/index.ex:76
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Grains" msgid "Grains"
msgstr "Graines" msgstr "Graines"
#: lib/cannery_web/components/ammo_type_table_component.ex:64
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:136 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:136
#: lib/cannery_web/live/ammo_type_live/index.ex:81
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Incendiary" msgid "Incendiary"
msgstr "Incendiaire" msgstr "Incendiaire"
@ -220,9 +216,9 @@ msgstr "Invitations"
msgid "Keep me logged in for 60 days" msgid "Keep me logged in for 60 days"
msgstr "Me garder authentifié durant 60 jours" msgstr "Me garder authentifié durant 60 jours"
#: lib/cannery_web/components/container_table_component.ex:48
#: lib/cannery_web/components/move_ammo_group_component.ex:69 #: lib/cannery_web/components/move_ammo_group_component.ex:69
#: lib/cannery_web/live/container_live/form_component.html.heex:42 #: lib/cannery_web/live/container_live/form_component.html.heex:42
#: lib/cannery_web/live/container_live/index.ex:123
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Location" msgid "Location"
msgstr "Localisation" msgstr "Localisation"
@ -238,8 +234,8 @@ msgstr "Localisation:"
msgid "Magazine, Clip, Ammo Box, etc" msgid "Magazine, Clip, Ammo Box, etc"
msgstr "Chargeur, lame-chargeur, boite de munition, etc." msgstr "Chargeur, lame-chargeur, boite de munition, etc."
#: lib/cannery_web/components/ammo_type_table_component.ex:67
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:148 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:148
#: lib/cannery_web/live/ammo_type_live/index.ex:84
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Manufacturer" msgid "Manufacturer"
msgstr "Fabricant" msgstr "Fabricant"
@ -254,24 +250,24 @@ msgstr "Boite de munition avec le sticker de fille danimation"
msgid "My cool ammo can" msgid "My cool ammo can"
msgstr "Ma superbe boite de munition" msgstr "Ma superbe boite de munition"
#: lib/cannery_web/components/ammo_type_table_component.ex:45
#: lib/cannery_web/components/container_table_component.ex:46
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:20 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:20
#: lib/cannery_web/live/ammo_type_live/index.ex:62
#: lib/cannery_web/live/container_live/form_component.html.heex:20 #: lib/cannery_web/live/container_live/form_component.html.heex:20
#: lib/cannery_web/live/container_live/index.ex:121
#: lib/cannery_web/live/invite_live/form_component.html.heex:20 #: lib/cannery_web/live/invite_live/form_component.html.heex:20
#: lib/cannery_web/live/tag_live/form_component.ex:75 #: lib/cannery_web/live/tag_live/form_component.ex:75
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Name" msgid "Name"
msgstr "Nom" msgstr "Nom"
#: lib/cannery_web/live/ammo_type_live/index.ex:29 #: lib/cannery_web/live/ammo_type_live/index.ex:36
#: lib/cannery_web/live/ammo_type_live/index.ex:35 #: lib/cannery_web/live/ammo_type_live/index.ex:44
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "New Ammo type" msgid "New Ammo type"
msgstr "Nouveau type de munition" msgstr "Nouveau type de munition"
#: lib/cannery_web/live/container_live/index.ex:31 #: lib/cannery_web/live/container_live/index.ex:36
#: lib/cannery_web/live/container_live/index.ex:38 #: lib/cannery_web/live/container_live/index.ex:43
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "New Container" msgid "New Container"
msgstr "Nouveau conteneur" msgstr "Nouveau conteneur"
@ -281,12 +277,13 @@ msgstr "Nouveau conteneur"
msgid "New Invite" msgid "New Invite"
msgstr "Nouvelle invitation" msgstr "Nouvelle invitation"
#: lib/cannery_web/live/tag_live/index.ex:27 #: lib/cannery_web/live/tag_live/index.ex:36
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "New Tag" msgid "New Tag"
msgstr "Nouveau tag" msgstr "Nouveau tag"
#: lib/cannery_web/live/ammo_group_live/index.html.heex:8 #: lib/cannery_web/live/ammo_group_live/index.html.heex:8
#: lib/cannery_web/live/ammo_group_live/index.html.heex:70
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No Ammo" msgid "No Ammo"
msgstr "Aucune munition" msgstr "Aucune munition"
@ -297,6 +294,7 @@ msgid "No ammo for this type"
msgstr "Aucune munition pour ce 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:8
#: lib/cannery_web/live/container_live/index.html.heex:47
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No containers" msgid "No containers"
msgstr "Aucun conteneur" msgstr "Aucun conteneur"
@ -308,16 +306,17 @@ msgstr "Aucune invitation"
#: lib/cannery_web/live/container_live/edit_tags_component.html.heex:31 #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:31
#: lib/cannery_web/live/tag_live/index.html.heex:10 #: lib/cannery_web/live/tag_live/index.html.heex:10
#: lib/cannery_web/live/tag_live/index.html.heex:43
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No tags" msgid "No tags"
msgstr "Aucun tag" msgstr "Aucun tag"
#: lib/cannery_web/components/add_shot_group_component.html.heex:37 #: lib/cannery_web/components/add_shot_group_component.html.heex:37
#: lib/cannery_web/components/ammo_group_table_component.ex:81 #: lib/cannery_web/components/ammo_group_table_component.ex:81
#: lib/cannery_web/components/shot_group_table_component.ex:43
#: lib/cannery_web/live/ammo_group_live/form_component.html.heex:49 #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:49
#: lib/cannery_web/live/ammo_group_live/show.ex:93 #: lib/cannery_web/live/ammo_group_live/show.ex:93
#: lib/cannery_web/live/range_live/form_component.html.heex:29 #: lib/cannery_web/live/range_live/form_component.html.heex:29
#: lib/cannery_web/live/range_live/index.ex:82
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Notes" msgid "Notes"
msgstr "Notes" msgstr "Notes"
@ -333,8 +332,8 @@ msgstr "Notes:"
msgid "On the bookshelf" msgid "On the bookshelf"
msgstr "Sur létagère" msgstr "Sur létagère"
#: lib/cannery_web/components/ammo_type_table_component.ex:60
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:111 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:111
#: lib/cannery_web/live/ammo_type_live/index.ex:77
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Pressure" msgid "Pressure"
msgstr "Pression" msgstr "Pression"
@ -350,8 +349,8 @@ msgstr "Prix payé"
msgid "Price paid:" msgid "Price paid:"
msgstr "Prix payé:" msgstr "Prix payé:"
#: lib/cannery_web/components/ammo_type_table_component.ex:61
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:118 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:118
#: lib/cannery_web/live/ammo_type_live/index.ex:78
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Primer type" msgid "Primer type"
msgstr "Type damorce" msgstr "Type damorce"
@ -394,9 +393,10 @@ msgstr "Acier"
msgid "Stored in" msgid "Stored in"
msgstr "Est stocké dans" msgstr "Est stocké dans"
#: lib/cannery_web/components/container_table_component.ex:52
#: lib/cannery_web/components/topbar.ex:49 #: lib/cannery_web/components/topbar.ex:49
#: lib/cannery_web/live/container_live/index.ex:127 #: lib/cannery_web/live/tag_live/index.ex:44
#: lib/cannery_web/live/tag_live/index.ex:32 #: lib/cannery_web/live/tag_live/index.ex:54
#: lib/cannery_web/live/tag_live/index.html.heex:3 #: lib/cannery_web/live/tag_live/index.html.heex:3
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Tags" msgid "Tags"
@ -419,15 +419,15 @@ msgstr "Couleur du texte"
msgid "The self-hosted firearm tracker website" msgid "The self-hosted firearm tracker website"
msgstr "Le site web de suivi darme à feux auto-hébergé" msgstr "Le site web de suivi darme à feux auto-hébergé"
#: lib/cannery_web/components/ammo_type_table_component.ex:63
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:132 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:132
#: lib/cannery_web/live/ammo_type_live/index.ex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Tracer" msgid "Tracer"
msgstr "Traceuse" msgstr "Traceuse"
#: lib/cannery_web/components/container_table_component.ex:49
#: lib/cannery_web/components/move_ammo_group_component.ex:68 #: lib/cannery_web/components/move_ammo_group_component.ex:68
#: lib/cannery_web/live/container_live/form_component.html.heex:35 #: lib/cannery_web/live/container_live/form_component.html.heex:35
#: lib/cannery_web/live/container_live/index.ex:124
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Type" msgid "Type"
msgstr "Type" msgstr "Type"
@ -480,9 +480,9 @@ msgid "Range day"
msgstr "Journée de stand" msgstr "Journée de stand"
#: lib/cannery_web/components/add_shot_group_component.html.heex:45 #: lib/cannery_web/components/add_shot_group_component.html.heex:45
#: lib/cannery_web/components/shot_group_table_component.ex:44
#: lib/cannery_web/live/ammo_group_live/show.ex:94 #: lib/cannery_web/live/ammo_group_live/show.ex:94
#: lib/cannery_web/live/range_live/form_component.html.heex:36 #: lib/cannery_web/live/range_live/form_component.html.heex:36
#: lib/cannery_web/live/range_live/index.ex:83
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Date" msgid "Date"
msgstr "Date" msgstr "Date"
@ -498,23 +498,24 @@ msgid "No ammo staged"
msgstr "Aucune munition sélectionnée" msgstr "Aucune munition sélectionnée"
#: lib/cannery_web/components/add_shot_group_component.html.heex:3 #: lib/cannery_web/components/add_shot_group_component.html.heex:3
#: lib/cannery_web/live/ammo_group_live/index.ex:26 #: lib/cannery_web/live/ammo_group_live/index.ex:30
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Record shots" msgid "Record shots"
msgstr "Tirs enregistrés" msgstr "Tirs enregistrés"
#: lib/cannery_web/live/ammo_group_live/show.ex:42 #: lib/cannery_web/live/ammo_group_live/show.ex:42
#: lib/cannery_web/live/range_live/index.ex:32 #: lib/cannery_web/live/range_live/index.ex:41
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit Shot Records" msgid "Edit Shot Records"
msgstr "Modifier les enregistrements de tir" msgstr "Modifier les enregistrements de tir"
#: lib/cannery_web/live/range_live/index.ex:38 #: lib/cannery_web/live/range_live/index.ex:49
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "New Shot Records" msgid "New Shot Records"
msgstr "Nouveaux enregistrements de tir" msgstr "Nouveaux enregistrements de tir"
#: lib/cannery_web/live/range_live/index.html.heex:48 #: lib/cannery_web/live/range_live/index.html.heex:50
#: lib/cannery_web/live/range_live/index.html.heex:92
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No shots recorded" msgid "No shots recorded"
msgstr "Aucun tir enregistré" msgstr "Aucun tir enregistré"
@ -525,20 +526,21 @@ msgstr "Aucun tir enregistré"
msgid "Rounds left" msgid "Rounds left"
msgstr "Cartouches restantes" msgstr "Cartouches restantes"
#: lib/cannery_web/components/shot_group_table_component.ex:42
#: lib/cannery_web/live/ammo_group_live/show.ex:92 #: lib/cannery_web/live/ammo_group_live/show.ex:92
#: lib/cannery_web/live/range_live/index.ex:81 #: lib/cannery_web/live/range_live/index.html.heex:64
#: lib/cannery_web/live/range_live/index.html.heex:62
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Rounds shot" msgid "Rounds shot"
msgstr "Cartouches tirées" msgstr "Cartouches tirées"
#: lib/cannery_web/live/range_live/index.ex:44 #: lib/cannery_web/live/range_live/index.ex:57
#: lib/cannery_web/live/range_live/index.ex:67
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot Records" msgid "Shot Records"
msgstr "Enregistrements de tir" msgstr "Enregistrements de tir"
#: lib/cannery_web/live/ammo_group_live/index.ex:32 #: lib/cannery_web/live/ammo_group_live/index.ex:38
#: lib/cannery_web/live/ammo_group_live/index.html.heex:96 #: lib/cannery_web/live/ammo_group_live/index.html.heex:117
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Move ammo" msgid "Move ammo"
msgstr "Déplacer munition" msgstr "Déplacer munition"
@ -548,18 +550,18 @@ msgstr "Déplacer munition"
msgid "No other containers" msgid "No other containers"
msgstr "Aucun autre conteneur" msgstr "Aucun autre conteneur"
#: lib/cannery_web/live/range_live/index.html.heex:53 #: lib/cannery_web/live/range_live/index.html.heex:55
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot log" msgid "Shot log"
msgstr "Évènements de tir" msgstr "Évènements de tir"
#: lib/cannery_web/components/ammo_group_card.ex:71 #: lib/cannery_web/components/ammo_group_card.ex:71
#: lib/cannery_web/components/ammo_group_card.ex:78 #: lib/cannery_web/components/ammo_group_card.ex:78
#: lib/cannery_web/components/ammo_group_table_component.ex:152 #: lib/cannery_web/components/ammo_group_table_component.ex:153
#: lib/cannery_web/components/ammo_group_table_component.ex:224 #: lib/cannery_web/components/ammo_group_table_component.ex:225
#: lib/cannery_web/components/ammo_type_table_component.ex:180
#: lib/cannery_web/live/ammo_group_live/show.html.heex:37 #: lib/cannery_web/live/ammo_group_live/show.html.heex:37
#: lib/cannery_web/live/ammo_group_live/show.html.heex:44 #: lib/cannery_web/live/ammo_group_live/show.html.heex:44
#: lib/cannery_web/live/ammo_type_live/index.ex:179
#: lib/cannery_web/live/ammo_type_live/show.html.heex:136 #: lib/cannery_web/live/ammo_type_live/show.html.heex:136
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "$%{amount}" msgid "$%{amount}"
@ -570,32 +572,32 @@ msgstr "%{amount}$"
msgid "Bimetal" msgid "Bimetal"
msgstr "Bi-métal" msgstr "Bi-métal"
#: lib/cannery_web/components/ammo_type_table_component.ex:51
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:72 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:72
#: lib/cannery_web/live/ammo_type_live/index.ex:68
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Jacket type" msgid "Jacket type"
msgstr "Type de douille" msgstr "Type de douille"
#: lib/cannery_web/components/ammo_type_table_component.ex:52
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:79 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:79
#: lib/cannery_web/live/ammo_type_live/index.ex:69
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Muzzle velocity" msgid "Muzzle velocity"
msgstr "Vélocité du canon" msgstr "Vélocité du canon"
#: lib/cannery_web/components/ammo_type_table_component.ex:55
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:93 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:93
#: lib/cannery_web/live/ammo_type_live/index.ex:72
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Powder grains per charge" msgid "Powder grains per charge"
msgstr "Graines de poudre par charge" msgstr "Graines de poudre par charge"
#: lib/cannery_web/components/ammo_type_table_component.ex:53
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:89 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:89
#: lib/cannery_web/live/ammo_type_live/index.ex:70
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Powder type" msgid "Powder type"
msgstr "Type de poudre" msgstr "Type de poudre"
#: lib/cannery_web/components/ammo_type_table_component.ex:68
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:152 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:152
#: lib/cannery_web/live/ammo_type_live/index.ex:85
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "UPC" msgid "UPC"
msgstr "UPC" msgstr "UPC"
@ -616,18 +618,18 @@ msgstr "Mot de passe actuel"
msgid "New password" msgid "New password"
msgstr "Nouveau mot de passe" msgstr "Nouveau mot de passe"
#: lib/cannery_web/live/ammo_group_live/index.html.heex:72 #: lib/cannery_web/live/ammo_group_live/index.html.heex:93
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Stage" msgid "Stage"
msgstr "Sélectionné" msgstr "Sélectionné"
#: lib/cannery_web/live/ammo_group_live/index.html.heex:72 #: lib/cannery_web/live/ammo_group_live/index.html.heex:93
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Unstage" msgid "Unstage"
msgstr "Désélectionner" msgstr "Désélectionner"
#: lib/cannery_web/components/ammo_type_table_component.ex:62
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:125 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:125
#: lib/cannery_web/live/ammo_type_live/index.ex:79
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Firing type" msgid "Firing type"
msgstr "Type dallumage" msgstr "Type dallumage"
@ -642,14 +644,14 @@ msgstr "Reconnexion en cours…"
msgid "Loading..." msgid "Loading..."
msgstr "Chargement en cours…" msgstr "Chargement en cours…"
#: lib/cannery_web/live/container_live/index.ex:27 #: lib/cannery_web/live/container_live/index.ex:32
#: lib/cannery_web/live/container_live/show.ex:126 #: lib/cannery_web/live/container_live/show.ex:113
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit %{name}" msgid "Edit %{name}"
msgstr "Éditer %{name}" msgstr "Éditer %{name}"
#: lib/cannery_web/live/container_live/index.ex:65 #: lib/cannery_web/live/container_live/index.ex:69
#: lib/cannery_web/live/container_live/show.ex:127 #: lib/cannery_web/live/container_live/show.ex:114
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit %{name} tags" msgid "Edit %{name} tags"
msgstr "Éditer les tags de %{name}" msgstr "Éditer les tags de %{name}"
@ -661,8 +663,8 @@ msgstr "Éditer les tags de %{name}"
msgid "Rounds:" msgid "Rounds:"
msgstr "Cartouches:" msgstr "Cartouches:"
#: lib/cannery_web/components/ammo_group_table_component.ex:221 #: lib/cannery_web/components/ammo_group_table_component.ex:222
#: lib/cannery_web/live/ammo_type_live/index.ex:178 #: lib/cannery_web/components/ammo_type_table_component.ex:179
#: lib/cannery_web/live/ammo_type_live/show.html.heex:142 #: lib/cannery_web/live/ammo_type_live/show.html.heex:142
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No cost information" msgid "No cost information"
@ -713,7 +715,7 @@ msgstr "Mot de passe oublié?"
msgid "Log in" msgid "Log in"
msgstr "Se connecter" msgstr "Se connecter"
#: lib/cannery_web/controllers/user_registration_controller.ex:35 #: lib/cannery_web/controllers/user_registration_controller.ex:34
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Register" msgid "Register"
msgstr "Senregistrer" msgstr "Senregistrer"
@ -724,7 +726,7 @@ msgid "Reset your password"
msgstr "Réinitialiser votre mot de passe" msgstr "Réinitialiser votre mot de passe"
#: lib/cannery_web/live/ammo_group_live/show.ex:41 #: lib/cannery_web/live/ammo_group_live/show.ex:41
#: lib/cannery_web/live/range_live/index.ex:26 #: lib/cannery_web/live/range_live/index.ex:33
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Record Shots" msgid "Record Shots"
msgstr "Enregistrer des tirs" msgstr "Enregistrer des tirs"
@ -734,11 +736,6 @@ msgstr "Enregistrer des tirs"
msgid "Copies" msgid "Copies"
msgstr "Exemplaires" msgstr "Exemplaires"
#: lib/cannery_web/live/ammo_type_live/index.ex:40
#, elixir-autogen, elixir-format
msgid "Ammo types"
msgstr "Types de munition"
#: lib/cannery_web/live/ammo_type_live/show.html.heex:123 #: lib/cannery_web/live/ammo_type_live/show.html.heex:123
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Added on:" msgid "Added on:"
@ -793,6 +790,8 @@ msgid "View the source code"
msgstr "Voir le code source" msgstr "Voir le code source"
#: lib/cannery_web/components/topbar.ex:65 #: lib/cannery_web/components/topbar.ex:65
#: lib/cannery_web/live/ammo_type_live/index.ex:52
#: lib/cannery_web/live/ammo_type_live/index.ex:62
#: lib/cannery_web/live/ammo_type_live/index.html.heex:3 #: lib/cannery_web/live/ammo_type_live/index.html.heex:3
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Catalog" msgid "Catalog"
@ -852,45 +851,45 @@ msgstr ""
msgid "Container:" msgid "Container:"
msgstr "Conteneur" msgstr "Conteneur"
#: lib/cannery_web/live/ammo_group_live/index.html.heex:48 #: lib/cannery_web/live/ammo_group_live/index.html.heex:63
#: lib/cannery_web/live/ammo_type_live/index.html.heex:23 #: lib/cannery_web/live/ammo_type_live/index.html.heex:39
#: lib/cannery_web/live/ammo_type_live/show.html.heex:152 #: lib/cannery_web/live/ammo_type_live/show.html.heex:152
#: lib/cannery_web/live/container_live/show.html.heex:105 #: lib/cannery_web/live/container_live/show.html.heex:105
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Show used" msgid "Show used"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:192 #: lib/cannery_web/components/ammo_group_table_component.ex:193
#: lib/cannery_web/live/ammo_group_live/show.html.heex:19 #: lib/cannery_web/live/ammo_group_live/show.html.heex:19
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{percentage}%" msgid "%{percentage}%"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.ex:114 #: lib/cannery_web/live/range_live/index.ex:136
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Rounds shot: %{count}" msgid "Rounds shot: %{count}"
msgstr "Cartouches tirées" msgstr "Cartouches tirées"
#: lib/cannery_web/live/ammo_type_live/index.ex:117 #: lib/cannery_web/components/ammo_type_table_component.ex:100
#: lib/cannery_web/live/container_live/index.ex:125 #: lib/cannery_web/components/container_table_component.ex:50
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Packs" msgid "Packs"
msgstr "Packages:" msgstr "Packages:"
#: lib/cannery_web/live/ammo_type_live/index.ex:97 #: lib/cannery_web/components/ammo_type_table_component.ex:80
#: lib/cannery_web/live/container_live/index.ex:126 #: lib/cannery_web/components/container_table_component.ex:51
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Rounds" msgid "Rounds"
msgstr "Cartouches:" msgstr "Cartouches:"
#: lib/cannery_web/live/ammo_type_live/show.html.heex:158 #: lib/cannery_web/live/ammo_type_live/show.html.heex:158
#: lib/cannery_web/live/container_live/index.html.heex:23 #: lib/cannery_web/live/container_live/index.html.heex:39
#: lib/cannery_web/live/container_live/show.html.heex:111 #: lib/cannery_web/live/container_live/show.html.heex:111
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "View as table" msgid "View as table"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:127 #: lib/cannery_web/components/ammo_type_table_component.ex:110
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Total ever packs" msgid "Total ever packs"
msgstr "" msgstr ""
@ -900,7 +899,7 @@ msgstr ""
msgid "Total ever packs:" msgid "Total ever packs:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:108 #: lib/cannery_web/components/ammo_type_table_component.ex:91
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Total ever rounds" msgid "Total ever rounds"
msgstr "Quantité de cartouches" msgstr "Quantité de cartouches"
@ -910,7 +909,7 @@ msgstr "Quantité de cartouches"
msgid "Total ever rounds:" msgid "Total ever rounds:"
msgstr "Nombre totale de cartouches tirées:" msgstr "Nombre totale de cartouches tirées:"
#: lib/cannery_web/live/ammo_type_live/index.ex:122 #: lib/cannery_web/components/ammo_type_table_component.ex:105
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Used packs" msgid "Used packs"
msgstr "" msgstr ""
@ -920,7 +919,7 @@ msgstr ""
msgid "Used packs:" msgid "Used packs:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:103 #: lib/cannery_web/components/ammo_type_table_component.ex:86
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Used rounds" msgid "Used rounds"
msgstr "" msgstr ""
@ -935,7 +934,7 @@ msgstr ""
msgid "Used up!" msgid "Used up!"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:64 #: lib/cannery_web/live/range_live/index.html.heex:66
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Rounds shot chart" msgid "Rounds shot chart"
msgstr "Cartouches tirées" msgstr "Cartouches tirées"
@ -1035,19 +1034,20 @@ msgstr "Traceuse"
msgid "UPC:" msgid "UPC:"
msgstr "UPC" msgstr "UPC"
#: lib/cannery_web/live/ammo_type_live/index.ex:137 #: lib/cannery_web/components/ammo_type_table_component.ex:120
#: lib/cannery_web/live/ammo_type_live/show.html.heex:132 #: lib/cannery_web/live/ammo_type_live/show.html.heex:132
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Average CPR" msgid "Average CPR"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:28
#: lib/cannery_web/live/ammo_type_live/show.ex:120 #: lib/cannery_web/live/ammo_type_live/show.ex:120
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Edit %{ammo_type_name}" msgid "Edit %{ammo_type_name}"
msgstr "Éditer %{name}" msgstr "Éditer %{name}"
#: lib/cannery_web/components/ammo_group_card.ex:39 #: lib/cannery_web/components/ammo_group_card.ex:39
#: lib/cannery_web/components/ammo_group_table_component.ex:230 #: lib/cannery_web/components/ammo_group_table_component.ex:231
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Empty" msgid "Empty"
msgstr "" msgstr ""
@ -1097,7 +1097,7 @@ msgstr ""
msgid "Last used on:" msgid "Last used on:"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:177 #: lib/cannery_web/components/ammo_group_table_component.ex:178
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Never used" msgid "Never used"
msgstr "" msgstr ""
@ -1114,12 +1114,38 @@ msgstr ""
msgid "Purchased on:" msgid "Purchased on:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.ex:38 #: lib/cannery_web/live/ammo_group_live/index.ex:46
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Edit ammo" msgid "Edit ammo"
msgstr "Éditer le type de munition" 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:8
#: lib/cannery_web/live/ammo_type_live/index.html.heex:46
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "No Ammo types" msgid "No Ammo types"
msgstr "Aucun type de munition" msgstr "Aucun type de munition"
#: lib/cannery_web/live/ammo_type_live/index.html.heex:33
#, elixir-autogen, elixir-format
msgid "Search catalog"
msgstr ""
#: 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
#, elixir-autogen, elixir-format
msgid "Search containers"
msgstr ""
#: lib/cannery_web/live/tag_live/index.html.heex:36
#, elixir-autogen, elixir-format, fuzzy
msgid "Search tags"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:85
#, elixir-autogen, elixir-format
msgid "Search shot records"
msgstr ""

View File

@ -23,18 +23,18 @@ msgstr ""
# # Run "mix gettext.extract" to bring this file up to # # Run "mix gettext.extract" to bring this file up to
# # date. Leave "msgstr"s empty as changing them here has no # # date. Leave "msgstr"s empty as changing them here has no
# # effect: edit them in PO (.po) files instead. # # effect: edit them in PO (.po) files instead.
#: lib/cannery/containers.ex:140 #: lib/cannery/containers.ex:179
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Container must be empty before deleting" msgid "Container must be empty before deleting"
msgstr "Le conteneur doit être vide pour être supprimé" msgstr "Le conteneur doit être vide pour être supprimé"
#: lib/cannery_web/live/container_live/index.ex:88 #: lib/cannery_web/live/container_live/index.ex:92
#: lib/cannery_web/live/container_live/show.ex:77 #: lib/cannery_web/live/container_live/show.ex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Could not delete %{name}: %{error}" msgid "Could not delete %{name}: %{error}"
msgstr "Impossible de supprimer %{name} : %{error}" msgstr "Impossible de supprimer %{name} : %{error}"
#: lib/cannery_web/live/container_live/index.ex:76 #: lib/cannery_web/live/container_live/index.ex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Could not find that container" msgid "Could not find that container"
msgstr "Impossible de trouver ce conteneur" msgstr "Impossible de trouver ce conteneur"
@ -85,14 +85,14 @@ msgstr ""
msgid "Reset password link is invalid or it has expired." msgid "Reset password link is invalid or it has expired."
msgstr "Le lien de réinitialisation de mot de passe est invalide ou expiré." msgstr "Le lien de réinitialisation de mot de passe est invalide ou expiré."
#: lib/cannery_web/controllers/user_registration_controller.ex:25 #: lib/cannery_web/controllers/user_registration_controller.ex:24
#: lib/cannery_web/controllers/user_registration_controller.ex:56 #: lib/cannery_web/controllers/user_registration_controller.ex:55
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Sorry, public registration is disabled" msgid "Sorry, public registration is disabled"
msgstr "Désolé, lenregistrement public est désactivé" msgstr "Désolé, lenregistrement public est désactivé"
#: lib/cannery_web/controllers/user_registration_controller.ex:15 #: lib/cannery_web/controllers/user_registration_controller.ex:14
#: lib/cannery_web/controllers/user_registration_controller.ex:46 #: lib/cannery_web/controllers/user_registration_controller.ex:45
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Sorry, this invite was not found or expired" msgid "Sorry, this invite was not found or expired"
msgstr "Désolé, cette invitation nest pas trouvée ou est expirée" msgstr "Désolé, cette invitation nest pas trouvée ou est expirée"
@ -122,17 +122,17 @@ msgstr "Vous nêtes pas autorisé·e à voir cette page"
msgid "You are not authorized to view this page." msgid "You are not authorized to view this page."
msgstr "Vous nêtes pas autorisé·e à voir cette page." msgstr "Vous nêtes pas autorisé·e à voir cette page."
#: lib/cannery/accounts/user.ex:138 #: lib/cannery/accounts/user.ex:137
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "did not change" msgid "did not change"
msgstr "est inchangé" msgstr "est inchangé"
#: lib/cannery/accounts/user.ex:159 #: lib/cannery/accounts/user.ex:158
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "does not match password" msgid "does not match password"
msgstr "le mot de passe ne correspond pas" msgstr "le mot de passe ne correspond pas"
#: lib/cannery/accounts/user.ex:196 #: lib/cannery/accounts/user.ex:195
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "is not valid" msgid "is not valid"
msgstr "nest pas valide" msgstr "nest pas valide"
@ -142,7 +142,7 @@ msgstr "nest pas valide"
msgid "must have the @ sign and no spaces" msgid "must have the @ sign and no spaces"
msgstr "doit contenir le symbole @ et aucune espace" msgstr "doit contenir le symbole @ et aucune espace"
#: lib/cannery/tags.ex:40 #: lib/cannery/tags.ex:66
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Tag not found" msgid "Tag not found"
msgstr "Tag pas trouvé" msgstr "Tag pas trouvé"
@ -152,13 +152,13 @@ msgstr "Tag pas trouvé"
msgid "Tag could not be added" msgid "Tag could not be added"
msgstr "Le tag na pas pu être ajouté" msgstr "Le tag na pas pu être ajouté"
#: lib/cannery/activity_log/shot_group.ex:123 #: lib/cannery/activity_log/shot_group.ex:122
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Count must be at least 1" msgid "Count must be at least 1"
msgstr "Le nombre doit être au moins égal à 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:82
#: lib/cannery/activity_log/shot_group.ex:119 #: lib/cannery/activity_log/shot_group.ex:118
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Count must be less than %{count}" msgid "Count must be less than %{count}"
msgstr "La quantité doit être inférieur à %{count}" msgstr "La quantité doit être inférieur à %{count}"
@ -186,17 +186,17 @@ msgstr "Impossible d'analyser le nombre de copies"
msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}" msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
msgstr "Nombre de copies invalide, doit être 1 et %{max}. Été %{multiplier}" msgstr "Nombre de copies invalide, doit être 1 et %{max}. Été %{multiplier}"
#: lib/cannery/ammo.ex:609 #: lib/cannery/ammo.ex:686
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Invalid multiplier" msgid "Invalid multiplier"
msgstr "Multiplicateur invalide" msgstr "Multiplicateur invalide"
#: lib/cannery/ammo/ammo_group.ex:96 #: lib/cannery/ammo/ammo_group.ex:97
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Please select an ammo type and container" msgid "Please select an ammo type and container"
msgstr "Veuillez choisir un type de munitions et un conteneur" msgstr "Veuillez choisir un type de munitions et un conteneur"
#: lib/cannery_web/live/range_live/index.html.heex:67 #: lib/cannery_web/live/range_live/index.html.heex:69
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Your browser does not support the canvas element." msgid "Your browser does not support the canvas element."
msgstr "" msgstr ""

View File

@ -31,11 +31,11 @@ msgstr ""
msgid "%{name} created successfully" msgid "%{name} created successfully"
msgstr "%{name} créé· avec succès" msgstr "%{name} créé· avec succès"
#: lib/cannery_web/live/ammo_type_live/index.ex:47 #: lib/cannery_web/live/ammo_type_live/index.ex:73
#: lib/cannery_web/live/ammo_type_live/show.ex:55 #: lib/cannery_web/live/ammo_type_live/show.ex:55
#: lib/cannery_web/live/invite_live/index.ex:53 #: lib/cannery_web/live/invite_live/index.ex:53
#: lib/cannery_web/live/invite_live/index.ex:133 #: lib/cannery_web/live/invite_live/index.ex:133
#: lib/cannery_web/live/tag_live/index.ex:38 #: lib/cannery_web/live/tag_live/index.ex:64
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{name} deleted succesfully" msgid "%{name} deleted succesfully"
msgstr "%{name} supprimé· avec succès" msgstr "%{name} supprimé· avec succès"
@ -50,8 +50,8 @@ msgstr "%{name} supprimé·e avec succès"
msgid "%{name} enabled succesfully" msgid "%{name} enabled succesfully"
msgstr "%{name} activé·e avec succès" msgstr "%{name} activé·e avec succès"
#: lib/cannery_web/live/container_live/index.ex:81 #: lib/cannery_web/live/container_live/index.ex:85
#: lib/cannery_web/live/container_live/show.ex:67 #: lib/cannery_web/live/container_live/show.ex:63
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{name} has been deleted" msgid "%{name} has been deleted"
msgstr "%{name} a été supprimé·e" msgstr "%{name} a été supprimé·e"
@ -83,10 +83,10 @@ msgid "Are you sure you want to delete %{email}? This action is permanent!"
msgstr "" msgstr ""
"Êtes-vous certain·e de supprimer %{email}? Cette action est définitive!" "Êtes-vous certain·e de supprimer %{email}? Cette action est définitive!"
#: lib/cannery_web/live/container_live/index.ex:236 #: lib/cannery_web/live/container_live/index.html.heex:92
#: lib/cannery_web/live/container_live/index.html.heex:73 #: lib/cannery_web/live/container_live/index.html.heex:136
#: lib/cannery_web/live/container_live/show.html.heex:59 #: lib/cannery_web/live/container_live/show.html.heex:59
#: lib/cannery_web/live/tag_live/index.html.heex:39 #: lib/cannery_web/live/tag_live/index.html.heex:64
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}?" msgid "Are you sure you want to delete %{name}?"
msgstr "Êtes-vous certain·e de supprimer %{name}?" msgstr "Êtes-vous certain·e de supprimer %{name}?"
@ -96,7 +96,7 @@ msgstr "Êtes-vous certain·e de supprimer %{name}?"
msgid "Are you sure you want to delete the invite for %{name}?" msgid "Are you sure you want to delete the invite for %{name}?"
msgstr "Êtes-vous certain·e de supprimer linvitation pour %{name}?" msgstr "Êtes-vous certain·e de supprimer linvitation pour %{name}?"
#: lib/cannery_web/live/ammo_group_live/index.html.heex:131 #: lib/cannery_web/live/ammo_group_live/index.html.heex:152
#: lib/cannery_web/live/ammo_group_live/show.html.heex:75 #: lib/cannery_web/live/ammo_group_live/show.html.heex:75
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this ammo?" msgid "Are you sure you want to delete this ammo?"
@ -151,7 +151,7 @@ msgstr "Mot de passe réinitialiser avec succès."
msgid "Password updated successfully." msgid "Password updated successfully."
msgstr "Mot de passe mis à jour avec succès." msgstr "Mot de passe mis à jour avec succès."
#: lib/cannery_web/controllers/user_registration_controller.ex:74 #: lib/cannery_web/controllers/user_registration_controller.ex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Please check your email to verify your account" msgid "Please check your email to verify your account"
msgstr "Veuillez vérifier votre mél pour confirmer votre compte" msgstr "Veuillez vérifier votre mél pour confirmer votre compte"
@ -189,7 +189,7 @@ msgstr ""
msgid "%{name} added successfully" msgid "%{name} added successfully"
msgstr "%{name} a été ajouté avec succès" msgstr "%{name} a été ajouté avec succès"
#: lib/cannery_web/live/container_live/show.ex:43 #: lib/cannery_web/live/container_live/show.ex:39
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{tag_name} has been removed from %{container_name}" msgid "%{tag_name} has been removed from %{container_name}"
msgstr "%{tag_name} a été retiré de %{container_name}" msgstr "%{tag_name} a été retiré de %{container_name}"
@ -204,19 +204,19 @@ msgstr "Ajout en cours…"
msgid "Shots recorded successfully" msgid "Shots recorded successfully"
msgstr "Tirs enregistré avec succès" msgstr "Tirs enregistré avec succès"
#: lib/cannery_web/live/range_live/index.html.heex:27 #: lib/cannery_web/live/range_live/index.html.heex:28
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to unstage this ammo?" msgid "Are you sure you want to unstage this ammo?"
msgstr "Êtes-vous certain·e de vouloir désélectionner cette munition?" msgstr "Êtes-vous certain·e de vouloir désélectionner cette munition?"
#: lib/cannery_web/live/ammo_group_live/show.ex:137 #: lib/cannery_web/live/ammo_group_live/show.ex:137
#: lib/cannery_web/live/range_live/index.ex:159 #: lib/cannery_web/live/range_live/index.html.heex:118
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?" msgid "Are you sure you want to delete this shot record?"
msgstr "Êtes-vous certain·e de vouloir supprimer cet enregistrement de tir?" msgstr "Êtes-vous certain·e de vouloir supprimer cet enregistrement de tir?"
#: lib/cannery_web/live/ammo_group_live/show.ex:83 #: lib/cannery_web/live/ammo_group_live/show.ex:83
#: lib/cannery_web/live/range_live/index.ex:54 #: lib/cannery_web/live/range_live/index.ex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot records deleted succesfully" msgid "Shot records deleted succesfully"
msgstr "Enregistrements de tir supprimés avec succès" msgstr "Enregistrements de tir supprimés avec succès"
@ -267,13 +267,13 @@ msgstr "Êtes-vous certain·e de vouloir changer votre langue?"
msgid "Language updated successfully." msgid "Language updated successfully."
msgstr "Langue mise à jour avec succès." msgstr "Langue mise à jour avec succès."
#: lib/cannery_web/live/ammo_group_live/index.ex:64 #: lib/cannery_web/live/ammo_group_live/index.ex:89
#: lib/cannery_web/live/ammo_group_live/show.ex:55 #: lib/cannery_web/live/ammo_group_live/show.ex:55
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Ammo deleted succesfully" msgid "Ammo deleted succesfully"
msgstr "Groupe de munition supprimé avec succès" msgstr "Groupe de munition supprimé avec succès"
#: lib/cannery_web/live/range_live/index.ex:68 #: lib/cannery_web/live/range_live/index.ex:95
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Ammo unstaged succesfully" msgid "Ammo unstaged succesfully"
msgstr "Groupe de munition désélectionner avec succès" msgstr "Groupe de munition désélectionner avec succès"
@ -290,7 +290,7 @@ msgid_plural "Ammo added successfully"
msgstr[0] "Groupe de munition mis à jour avec succès" msgstr[0] "Groupe de munition mis à jour avec succès"
msgstr[1] "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.ex:232 #: lib/cannery_web/live/ammo_type_live/index.html.heex:90
#: lib/cannery_web/live/ammo_type_live/show.html.heex:28 #: lib/cannery_web/live/ammo_type_live/show.html.heex:28
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!" msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!"

View File

@ -21,8 +21,8 @@ msgstr ""
## Run "mix gettext.extract" to bring this file up to ## Run "mix gettext.extract" to bring this file up to
## date. Leave "msgstr"s empty as changing them here has no ## date. Leave "msgstr"s empty as changing them here has no
## effect: edit them in PO (.po) files instead. ## effect: edit them in PO (.po) files instead.
#: lib/cannery_web/live/ammo_group_live/index.ex:44 #: lib/cannery_web/live/ammo_group_live/index.ex:54
#: lib/cannery_web/live/ammo_group_live/index.ex:50 #: lib/cannery_web/live/ammo_group_live/index.ex:62
#: lib/cannery_web/live/ammo_group_live/index.html.heex:40 #: lib/cannery_web/live/ammo_group_live/index.html.heex:40
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Add Ammo" msgid "Add Ammo"
@ -167,9 +167,9 @@ msgstr ""
msgid "Why not get some ready to shoot?" msgid "Why not get some ready to shoot?"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.html.heex:79 #: lib/cannery_web/live/ammo_group_live/index.html.heex:100
#: lib/cannery_web/live/ammo_group_live/show.html.heex:101 #: lib/cannery_web/live/ammo_group_live/show.html.heex:101
#: lib/cannery_web/live/range_live/index.html.heex:38 #: lib/cannery_web/live/range_live/index.html.heex:39
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Record shots" msgid "Record shots"
msgstr "" msgstr ""
@ -245,13 +245,13 @@ msgid "Set Unlimited"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/show.html.heex:86 #: lib/cannery_web/live/ammo_group_live/show.html.heex:86
#: lib/cannery_web/live/range_live/index.html.heex:31 #: lib/cannery_web/live/range_live/index.html.heex:32
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Stage for range" msgid "Stage for range"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/show.html.heex:85 #: lib/cannery_web/live/ammo_group_live/show.html.heex:85
#: lib/cannery_web/live/range_live/index.html.heex:30 #: lib/cannery_web/live/range_live/index.html.heex:31
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Unstage from range" msgid "Unstage from range"
msgstr "" msgstr ""

View File

@ -41,10 +41,11 @@ msgstr ""
msgid "Admins:" msgid "Admins:"
msgstr "" msgstr ""
#: lib/cannery_web/components/shot_group_table_component.ex:41
#: lib/cannery_web/components/topbar.ex:73 #: lib/cannery_web/components/topbar.ex:73
#: lib/cannery_web/live/ammo_group_live/index.ex:56 #: lib/cannery_web/live/ammo_group_live/index.ex:70
#: lib/cannery_web/live/ammo_group_live/index.ex:79
#: lib/cannery_web/live/ammo_group_live/index.html.heex:3 #: lib/cannery_web/live/ammo_group_live/index.html.heex:3
#: lib/cannery_web/live/range_live/index.ex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Ammo" msgid "Ammo"
msgstr "" msgstr ""
@ -60,8 +61,8 @@ msgstr ""
msgid "Background color" msgid "Background color"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:65
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:140 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:140
#: lib/cannery_web/live/ammo_type_live/index.ex:82
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Blank" msgid "Blank"
msgstr "" msgstr ""
@ -71,32 +72,32 @@ msgstr ""
msgid "Brass" msgid "Brass"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:47
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:44 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:44
#: lib/cannery_web/live/ammo_type_live/index.ex:64
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Bullet core" msgid "Bullet core"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:46
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:37 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:37
#: lib/cannery_web/live/ammo_type_live/index.ex:63
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Bullet type" msgid "Bullet type"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:49
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:58 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:58
#: lib/cannery_web/live/ammo_type_live/index.ex:66
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Caliber" msgid "Caliber"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:48
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:51 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:51
#: lib/cannery_web/live/ammo_type_live/index.ex:65
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Cartridge" msgid "Cartridge"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:50
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:65 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:65
#: lib/cannery_web/live/ammo_type_live/index.ex:67
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Case material" msgid "Case material"
msgstr "" msgstr ""
@ -109,15 +110,15 @@ msgid "Container"
msgstr "" msgstr ""
#: lib/cannery_web/components/topbar.ex:57 #: lib/cannery_web/components/topbar.ex:57
#: lib/cannery_web/live/container_live/index.ex:44 #: lib/cannery_web/live/container_live/index.ex:49
#: lib/cannery_web/live/container_live/index.ex:53 #: lib/cannery_web/live/container_live/index.ex:58
#: lib/cannery_web/live/container_live/index.html.heex:3 #: lib/cannery_web/live/container_live/index.html.heex:3
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Containers" msgid "Containers"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:66
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:144 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:144
#: lib/cannery_web/live/ammo_type_live/index.ex:83
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Corrosive" msgid "Corrosive"
msgstr "" msgstr ""
@ -134,9 +135,9 @@ msgstr ""
msgid "Count:" msgid "Count:"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:47
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:24 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:24
#: lib/cannery_web/live/container_live/form_component.html.heex:27 #: lib/cannery_web/live/container_live/form_component.html.heex:27
#: lib/cannery_web/live/container_live/index.ex:122
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Description" msgid "Description"
msgstr "" msgstr ""
@ -152,17 +153,12 @@ msgstr ""
msgid "Easy to Use:" msgid "Easy to Use:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:23
#, elixir-autogen, elixir-format
msgid "Edit Ammo type"
msgstr ""
#: lib/cannery_web/live/invite_live/index.ex:33 #: lib/cannery_web/live/invite_live/index.ex:33
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit Invite" msgid "Edit Invite"
msgstr "" msgstr ""
#: lib/cannery_web/live/tag_live/index.ex:21 #: lib/cannery_web/live/tag_live/index.ex:28
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit Tag" msgid "Edit Tag"
msgstr "" msgstr ""
@ -177,14 +173,14 @@ msgstr ""
msgid "FMJ" msgid "FMJ"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:59
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:103 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:103
#: lib/cannery_web/live/ammo_type_live/index.ex:76
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Grains" msgid "Grains"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:64
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:136 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:136
#: lib/cannery_web/live/ammo_type_live/index.ex:81
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Incendiary" msgid "Incendiary"
msgstr "" msgstr ""
@ -216,9 +212,9 @@ msgstr ""
msgid "Keep me logged in for 60 days" msgid "Keep me logged in for 60 days"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:48
#: lib/cannery_web/components/move_ammo_group_component.ex:69 #: lib/cannery_web/components/move_ammo_group_component.ex:69
#: lib/cannery_web/live/container_live/form_component.html.heex:42 #: lib/cannery_web/live/container_live/form_component.html.heex:42
#: lib/cannery_web/live/container_live/index.ex:123
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Location" msgid "Location"
msgstr "" msgstr ""
@ -234,8 +230,8 @@ msgstr ""
msgid "Magazine, Clip, Ammo Box, etc" msgid "Magazine, Clip, Ammo Box, etc"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:67
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:148 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:148
#: lib/cannery_web/live/ammo_type_live/index.ex:84
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Manufacturer" msgid "Manufacturer"
msgstr "" msgstr ""
@ -250,24 +246,24 @@ msgstr ""
msgid "My cool ammo can" msgid "My cool ammo can"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:45
#: lib/cannery_web/components/container_table_component.ex:46
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:20 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:20
#: lib/cannery_web/live/ammo_type_live/index.ex:62
#: lib/cannery_web/live/container_live/form_component.html.heex:20 #: lib/cannery_web/live/container_live/form_component.html.heex:20
#: lib/cannery_web/live/container_live/index.ex:121
#: lib/cannery_web/live/invite_live/form_component.html.heex:20 #: lib/cannery_web/live/invite_live/form_component.html.heex:20
#: lib/cannery_web/live/tag_live/form_component.ex:75 #: lib/cannery_web/live/tag_live/form_component.ex:75
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:29 #: lib/cannery_web/live/ammo_type_live/index.ex:36
#: lib/cannery_web/live/ammo_type_live/index.ex:35 #: lib/cannery_web/live/ammo_type_live/index.ex:44
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "New Ammo type" msgid "New Ammo type"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.ex:31 #: lib/cannery_web/live/container_live/index.ex:36
#: lib/cannery_web/live/container_live/index.ex:38 #: lib/cannery_web/live/container_live/index.ex:43
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "New Container" msgid "New Container"
msgstr "" msgstr ""
@ -277,12 +273,13 @@ msgstr ""
msgid "New Invite" msgid "New Invite"
msgstr "" msgstr ""
#: lib/cannery_web/live/tag_live/index.ex:27 #: lib/cannery_web/live/tag_live/index.ex:36
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "New Tag" msgid "New Tag"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.html.heex:8 #: lib/cannery_web/live/ammo_group_live/index.html.heex:8
#: lib/cannery_web/live/ammo_group_live/index.html.heex:70
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No Ammo" msgid "No Ammo"
msgstr "" msgstr ""
@ -293,6 +290,7 @@ msgid "No ammo for this type"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:8 #: lib/cannery_web/live/container_live/index.html.heex:8
#: lib/cannery_web/live/container_live/index.html.heex:47
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No containers" msgid "No containers"
msgstr "" msgstr ""
@ -304,16 +302,17 @@ msgstr ""
#: lib/cannery_web/live/container_live/edit_tags_component.html.heex:31 #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:31
#: lib/cannery_web/live/tag_live/index.html.heex:10 #: lib/cannery_web/live/tag_live/index.html.heex:10
#: lib/cannery_web/live/tag_live/index.html.heex:43
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No tags" msgid "No tags"
msgstr "" msgstr ""
#: lib/cannery_web/components/add_shot_group_component.html.heex:37 #: lib/cannery_web/components/add_shot_group_component.html.heex:37
#: lib/cannery_web/components/ammo_group_table_component.ex:81 #: lib/cannery_web/components/ammo_group_table_component.ex:81
#: lib/cannery_web/components/shot_group_table_component.ex:43
#: lib/cannery_web/live/ammo_group_live/form_component.html.heex:49 #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:49
#: lib/cannery_web/live/ammo_group_live/show.ex:93 #: lib/cannery_web/live/ammo_group_live/show.ex:93
#: lib/cannery_web/live/range_live/form_component.html.heex:29 #: lib/cannery_web/live/range_live/form_component.html.heex:29
#: lib/cannery_web/live/range_live/index.ex:82
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Notes" msgid "Notes"
msgstr "" msgstr ""
@ -329,8 +328,8 @@ msgstr ""
msgid "On the bookshelf" msgid "On the bookshelf"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:60
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:111 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:111
#: lib/cannery_web/live/ammo_type_live/index.ex:77
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Pressure" msgid "Pressure"
msgstr "" msgstr ""
@ -346,8 +345,8 @@ msgstr ""
msgid "Price paid:" msgid "Price paid:"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:61
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:118 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:118
#: lib/cannery_web/live/ammo_type_live/index.ex:78
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Primer type" msgid "Primer type"
msgstr "" msgstr ""
@ -388,9 +387,10 @@ msgstr ""
msgid "Stored in" msgid "Stored in"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:52
#: lib/cannery_web/components/topbar.ex:49 #: lib/cannery_web/components/topbar.ex:49
#: lib/cannery_web/live/container_live/index.ex:127 #: lib/cannery_web/live/tag_live/index.ex:44
#: lib/cannery_web/live/tag_live/index.ex:32 #: lib/cannery_web/live/tag_live/index.ex:54
#: lib/cannery_web/live/tag_live/index.html.heex:3 #: lib/cannery_web/live/tag_live/index.html.heex:3
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Tags" msgid "Tags"
@ -411,15 +411,15 @@ msgstr ""
msgid "The self-hosted firearm tracker website" msgid "The self-hosted firearm tracker website"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:63
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:132 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:132
#: lib/cannery_web/live/ammo_type_live/index.ex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Tracer" msgid "Tracer"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:49
#: lib/cannery_web/components/move_ammo_group_component.ex:68 #: lib/cannery_web/components/move_ammo_group_component.ex:68
#: lib/cannery_web/live/container_live/form_component.html.heex:35 #: lib/cannery_web/live/container_live/form_component.html.heex:35
#: lib/cannery_web/live/container_live/index.ex:124
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Type" msgid "Type"
msgstr "" msgstr ""
@ -472,9 +472,9 @@ msgid "Range day"
msgstr "" msgstr ""
#: lib/cannery_web/components/add_shot_group_component.html.heex:45 #: lib/cannery_web/components/add_shot_group_component.html.heex:45
#: lib/cannery_web/components/shot_group_table_component.ex:44
#: lib/cannery_web/live/ammo_group_live/show.ex:94 #: lib/cannery_web/live/ammo_group_live/show.ex:94
#: lib/cannery_web/live/range_live/form_component.html.heex:36 #: lib/cannery_web/live/range_live/form_component.html.heex:36
#: lib/cannery_web/live/range_live/index.ex:83
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Date" msgid "Date"
msgstr "" msgstr ""
@ -490,23 +490,24 @@ msgid "No ammo staged"
msgstr "" msgstr ""
#: lib/cannery_web/components/add_shot_group_component.html.heex:3 #: lib/cannery_web/components/add_shot_group_component.html.heex:3
#: lib/cannery_web/live/ammo_group_live/index.ex:26 #: lib/cannery_web/live/ammo_group_live/index.ex:30
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Record shots" msgid "Record shots"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/show.ex:42 #: lib/cannery_web/live/ammo_group_live/show.ex:42
#: lib/cannery_web/live/range_live/index.ex:32 #: lib/cannery_web/live/range_live/index.ex:41
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit Shot Records" msgid "Edit Shot Records"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.ex:38 #: lib/cannery_web/live/range_live/index.ex:49
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "New Shot Records" msgid "New Shot Records"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:48 #: lib/cannery_web/live/range_live/index.html.heex:50
#: lib/cannery_web/live/range_live/index.html.heex:92
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No shots recorded" msgid "No shots recorded"
msgstr "" msgstr ""
@ -517,20 +518,21 @@ msgstr ""
msgid "Rounds left" msgid "Rounds left"
msgstr "" msgstr ""
#: lib/cannery_web/components/shot_group_table_component.ex:42
#: lib/cannery_web/live/ammo_group_live/show.ex:92 #: lib/cannery_web/live/ammo_group_live/show.ex:92
#: lib/cannery_web/live/range_live/index.ex:81 #: lib/cannery_web/live/range_live/index.html.heex:64
#: lib/cannery_web/live/range_live/index.html.heex:62
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Rounds shot" msgid "Rounds shot"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.ex:44 #: lib/cannery_web/live/range_live/index.ex:57
#: lib/cannery_web/live/range_live/index.ex:67
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot Records" msgid "Shot Records"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.ex:32 #: lib/cannery_web/live/ammo_group_live/index.ex:38
#: lib/cannery_web/live/ammo_group_live/index.html.heex:96 #: lib/cannery_web/live/ammo_group_live/index.html.heex:117
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Move ammo" msgid "Move ammo"
msgstr "" msgstr ""
@ -540,18 +542,18 @@ msgstr ""
msgid "No other containers" msgid "No other containers"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:53 #: lib/cannery_web/live/range_live/index.html.heex:55
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot log" msgid "Shot log"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_card.ex:71 #: lib/cannery_web/components/ammo_group_card.ex:71
#: lib/cannery_web/components/ammo_group_card.ex:78 #: lib/cannery_web/components/ammo_group_card.ex:78
#: lib/cannery_web/components/ammo_group_table_component.ex:152 #: lib/cannery_web/components/ammo_group_table_component.ex:153
#: lib/cannery_web/components/ammo_group_table_component.ex:224 #: lib/cannery_web/components/ammo_group_table_component.ex:225
#: lib/cannery_web/components/ammo_type_table_component.ex:180
#: lib/cannery_web/live/ammo_group_live/show.html.heex:37 #: lib/cannery_web/live/ammo_group_live/show.html.heex:37
#: lib/cannery_web/live/ammo_group_live/show.html.heex:44 #: lib/cannery_web/live/ammo_group_live/show.html.heex:44
#: lib/cannery_web/live/ammo_type_live/index.ex:179
#: lib/cannery_web/live/ammo_type_live/show.html.heex:136 #: lib/cannery_web/live/ammo_type_live/show.html.heex:136
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "$%{amount}" msgid "$%{amount}"
@ -562,32 +564,32 @@ msgstr ""
msgid "Bimetal" msgid "Bimetal"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:51
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:72 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:72
#: lib/cannery_web/live/ammo_type_live/index.ex:68
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Jacket type" msgid "Jacket type"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:52
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:79 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:79
#: lib/cannery_web/live/ammo_type_live/index.ex:69
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Muzzle velocity" msgid "Muzzle velocity"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:55
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:93 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:93
#: lib/cannery_web/live/ammo_type_live/index.ex:72
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Powder grains per charge" msgid "Powder grains per charge"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:53
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:89 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:89
#: lib/cannery_web/live/ammo_type_live/index.ex:70
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Powder type" msgid "Powder type"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:68
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:152 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:152
#: lib/cannery_web/live/ammo_type_live/index.ex:85
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "UPC" msgid "UPC"
msgstr "" msgstr ""
@ -608,18 +610,18 @@ msgstr ""
msgid "New password" msgid "New password"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.html.heex:72 #: lib/cannery_web/live/ammo_group_live/index.html.heex:93
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Stage" msgid "Stage"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.html.heex:72 #: lib/cannery_web/live/ammo_group_live/index.html.heex:93
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Unstage" msgid "Unstage"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_type_table_component.ex:62
#: lib/cannery_web/live/ammo_type_live/form_component.html.heex:125 #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:125
#: lib/cannery_web/live/ammo_type_live/index.ex:79
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Firing type" msgid "Firing type"
msgstr "" msgstr ""
@ -634,14 +636,14 @@ msgstr ""
msgid "Loading..." msgid "Loading..."
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.ex:27 #: lib/cannery_web/live/container_live/index.ex:32
#: lib/cannery_web/live/container_live/show.ex:126 #: lib/cannery_web/live/container_live/show.ex:113
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit %{name}" msgid "Edit %{name}"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.ex:65 #: lib/cannery_web/live/container_live/index.ex:69
#: lib/cannery_web/live/container_live/show.ex:127 #: lib/cannery_web/live/container_live/show.ex:114
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit %{name} tags" msgid "Edit %{name} tags"
msgstr "" msgstr ""
@ -653,8 +655,8 @@ msgstr ""
msgid "Rounds:" msgid "Rounds:"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:221 #: lib/cannery_web/components/ammo_group_table_component.ex:222
#: lib/cannery_web/live/ammo_type_live/index.ex:178 #: lib/cannery_web/components/ammo_type_table_component.ex:179
#: lib/cannery_web/live/ammo_type_live/show.html.heex:142 #: lib/cannery_web/live/ammo_type_live/show.html.heex:142
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No cost information" msgid "No cost information"
@ -705,7 +707,7 @@ msgstr ""
msgid "Log in" msgid "Log in"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_registration_controller.ex:35 #: lib/cannery_web/controllers/user_registration_controller.ex:34
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Register" msgid "Register"
msgstr "" msgstr ""
@ -716,7 +718,7 @@ msgid "Reset your password"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/show.ex:41 #: lib/cannery_web/live/ammo_group_live/show.ex:41
#: lib/cannery_web/live/range_live/index.ex:26 #: lib/cannery_web/live/range_live/index.ex:33
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Record Shots" msgid "Record Shots"
msgstr "" msgstr ""
@ -726,11 +728,6 @@ msgstr ""
msgid "Copies" msgid "Copies"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:40
#, elixir-autogen, elixir-format
msgid "Ammo types"
msgstr ""
#: lib/cannery_web/live/ammo_type_live/show.html.heex:123 #: lib/cannery_web/live/ammo_type_live/show.html.heex:123
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Added on:" msgid "Added on:"
@ -785,6 +782,8 @@ msgid "View the source code"
msgstr "" msgstr ""
#: lib/cannery_web/components/topbar.ex:65 #: lib/cannery_web/components/topbar.ex:65
#: lib/cannery_web/live/ammo_type_live/index.ex:52
#: lib/cannery_web/live/ammo_type_live/index.ex:62
#: lib/cannery_web/live/ammo_type_live/index.html.heex:3 #: lib/cannery_web/live/ammo_type_live/index.html.heex:3
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Catalog" msgid "Catalog"
@ -843,45 +842,45 @@ msgstr ""
msgid "Container:" msgid "Container:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.html.heex:48 #: lib/cannery_web/live/ammo_group_live/index.html.heex:63
#: lib/cannery_web/live/ammo_type_live/index.html.heex:23 #: lib/cannery_web/live/ammo_type_live/index.html.heex:39
#: lib/cannery_web/live/ammo_type_live/show.html.heex:152 #: lib/cannery_web/live/ammo_type_live/show.html.heex:152
#: lib/cannery_web/live/container_live/show.html.heex:105 #: lib/cannery_web/live/container_live/show.html.heex:105
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Show used" msgid "Show used"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:192 #: lib/cannery_web/components/ammo_group_table_component.ex:193
#: lib/cannery_web/live/ammo_group_live/show.html.heex:19 #: lib/cannery_web/live/ammo_group_live/show.html.heex:19
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{percentage}%" msgid "%{percentage}%"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.ex:114 #: lib/cannery_web/live/range_live/index.ex:136
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Rounds shot: %{count}" msgid "Rounds shot: %{count}"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:117 #: lib/cannery_web/components/ammo_type_table_component.ex:100
#: lib/cannery_web/live/container_live/index.ex:125 #: lib/cannery_web/components/container_table_component.ex:50
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Packs" msgid "Packs"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:97 #: lib/cannery_web/components/ammo_type_table_component.ex:80
#: lib/cannery_web/live/container_live/index.ex:126 #: lib/cannery_web/components/container_table_component.ex:51
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Rounds" msgid "Rounds"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/show.html.heex:158 #: lib/cannery_web/live/ammo_type_live/show.html.heex:158
#: lib/cannery_web/live/container_live/index.html.heex:23 #: lib/cannery_web/live/container_live/index.html.heex:39
#: lib/cannery_web/live/container_live/show.html.heex:111 #: lib/cannery_web/live/container_live/show.html.heex:111
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "View as table" msgid "View as table"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:127 #: lib/cannery_web/components/ammo_type_table_component.ex:110
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Total ever packs" msgid "Total ever packs"
msgstr "" msgstr ""
@ -891,7 +890,7 @@ msgstr ""
msgid "Total ever packs:" msgid "Total ever packs:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:108 #: lib/cannery_web/components/ammo_type_table_component.ex:91
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Total ever rounds" msgid "Total ever rounds"
msgstr "" msgstr ""
@ -901,7 +900,7 @@ msgstr ""
msgid "Total ever rounds:" msgid "Total ever rounds:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:122 #: lib/cannery_web/components/ammo_type_table_component.ex:105
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Used packs" msgid "Used packs"
msgstr "" msgstr ""
@ -911,7 +910,7 @@ msgstr ""
msgid "Used packs:" msgid "Used packs:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:103 #: lib/cannery_web/components/ammo_type_table_component.ex:86
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Used rounds" msgid "Used rounds"
msgstr "" msgstr ""
@ -926,7 +925,7 @@ msgstr ""
msgid "Used up!" msgid "Used up!"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:64 #: lib/cannery_web/live/range_live/index.html.heex:66
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Rounds shot chart" msgid "Rounds shot chart"
msgstr "" msgstr ""
@ -1026,19 +1025,20 @@ msgstr ""
msgid "UPC:" msgid "UPC:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:137 #: lib/cannery_web/components/ammo_type_table_component.ex:120
#: lib/cannery_web/live/ammo_type_live/show.html.heex:132 #: lib/cannery_web/live/ammo_type_live/show.html.heex:132
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Average CPR" msgid "Average CPR"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:28
#: lib/cannery_web/live/ammo_type_live/show.ex:120 #: lib/cannery_web/live/ammo_type_live/show.ex:120
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Edit %{ammo_type_name}" msgid "Edit %{ammo_type_name}"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_card.ex:39 #: lib/cannery_web/components/ammo_group_card.ex:39
#: lib/cannery_web/components/ammo_group_table_component.ex:230 #: lib/cannery_web/components/ammo_group_table_component.ex:231
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Empty" msgid "Empty"
msgstr "" msgstr ""
@ -1088,7 +1088,7 @@ msgstr ""
msgid "Last used on:" msgid "Last used on:"
msgstr "" msgstr ""
#: lib/cannery_web/components/ammo_group_table_component.ex:177 #: lib/cannery_web/components/ammo_group_table_component.ex:178
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Never used" msgid "Never used"
msgstr "" msgstr ""
@ -1105,12 +1105,38 @@ msgstr ""
msgid "Purchased on:" msgid "Purchased on:"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.ex:38 #: lib/cannery_web/live/ammo_group_live/index.ex:46
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Edit ammo" msgid "Edit ammo"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.html.heex:8 #: lib/cannery_web/live/ammo_type_live/index.html.heex:8
#: lib/cannery_web/live/ammo_type_live/index.html.heex:46
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "No Ammo types" msgid "No Ammo types"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.html.heex:33
#, elixir-autogen, elixir-format
msgid "Search catalog"
msgstr ""
#: 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
#, elixir-autogen, elixir-format
msgid "Search containers"
msgstr ""
#: lib/cannery_web/live/tag_live/index.html.heex:36
#, elixir-autogen, elixir-format, fuzzy
msgid "Search tags"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:85
#, elixir-autogen, elixir-format
msgid "Search shot records"
msgstr ""

View File

@ -24,18 +24,18 @@ msgstr ""
## Run "mix gettext.extract" to bring this file up to ## Run "mix gettext.extract" to bring this file up to
## date. Leave "msgstr"s empty as changing them here has no ## date. Leave "msgstr"s empty as changing them here has no
## effect: edit them in PO (.po) files instead. ## effect: edit them in PO (.po) files instead.
#: lib/cannery/containers.ex:140 #: lib/cannery/containers.ex:179
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Container must be empty before deleting" msgid "Container must be empty before deleting"
msgstr "Caithfidh an coimeádán a bheidh follamh roimh scriosadh" msgstr "Caithfidh an coimeádán a bheidh follamh roimh scriosadh"
#: lib/cannery_web/live/container_live/index.ex:88 #: lib/cannery_web/live/container_live/index.ex:92
#: lib/cannery_web/live/container_live/show.ex:77 #: lib/cannery_web/live/container_live/show.ex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Could not delete %{name}: %{error}" msgid "Could not delete %{name}: %{error}"
msgstr "Ní feidir %{name} a scriosadh: %{error}" msgstr "Ní feidir %{name} a scriosadh: %{error}"
#: lib/cannery_web/live/container_live/index.ex:76 #: lib/cannery_web/live/container_live/index.ex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Could not find that container" msgid "Could not find that container"
msgstr "Ní feidir an coimeádán sin a fáil" msgstr "Ní feidir an coimeádán sin a fáil"
@ -86,14 +86,14 @@ msgstr ""
msgid "Reset password link is invalid or it has expired." msgid "Reset password link is invalid or it has expired."
msgstr "Tá nasc an pasfhocail a athrú neamhbailí nó as dáta." msgstr "Tá nasc an pasfhocail a athrú neamhbailí nó as dáta."
#: lib/cannery_web/controllers/user_registration_controller.ex:25 #: lib/cannery_web/controllers/user_registration_controller.ex:24
#: lib/cannery_web/controllers/user_registration_controller.ex:56 #: lib/cannery_web/controllers/user_registration_controller.ex:55
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Sorry, public registration is disabled" msgid "Sorry, public registration is disabled"
msgstr "Tá brón orainn, tá clarú póiblí bactha" msgstr "Tá brón orainn, tá clarú póiblí bactha"
#: lib/cannery_web/controllers/user_registration_controller.ex:15 #: lib/cannery_web/controllers/user_registration_controller.ex:14
#: lib/cannery_web/controllers/user_registration_controller.ex:46 #: lib/cannery_web/controllers/user_registration_controller.ex:45
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Sorry, this invite was not found or expired" msgid "Sorry, this invite was not found or expired"
msgstr "Tá brón orainn, ní feidir an cuireadh seo a fáil nó tá sé as dáta" msgstr "Tá brón orainn, ní feidir an cuireadh seo a fáil nó tá sé as dáta"
@ -123,17 +123,17 @@ msgstr "Níl cead agaibh féachaint ar an leathanach seo"
msgid "You are not authorized to view this page." msgid "You are not authorized to view this page."
msgstr "Níl cead agaibh féachaint ar an leathanach seo." msgstr "Níl cead agaibh féachaint ar an leathanach seo."
#: lib/cannery/accounts/user.ex:138 #: lib/cannery/accounts/user.ex:137
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "did not change" msgid "did not change"
msgstr "Níor athraigh sé" msgstr "Níor athraigh sé"
#: lib/cannery/accounts/user.ex:159 #: lib/cannery/accounts/user.ex:158
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "does not match password" msgid "does not match password"
msgstr "" msgstr ""
#: lib/cannery/accounts/user.ex:196 #: lib/cannery/accounts/user.ex:195
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "is not valid" msgid "is not valid"
msgstr "" msgstr ""
@ -143,7 +143,7 @@ msgstr ""
msgid "must have the @ sign and no spaces" msgid "must have the @ sign and no spaces"
msgstr "" msgstr ""
#: lib/cannery/tags.ex:40 #: lib/cannery/tags.ex:66
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Tag not found" msgid "Tag not found"
msgstr "" msgstr ""
@ -153,13 +153,13 @@ msgstr ""
msgid "Tag could not be added" msgid "Tag could not be added"
msgstr "" msgstr ""
#: lib/cannery/activity_log/shot_group.ex:123 #: lib/cannery/activity_log/shot_group.ex:122
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Count must be at least 1" msgid "Count must be at least 1"
msgstr "" msgstr ""
#: lib/cannery/activity_log/shot_group.ex:82 #: lib/cannery/activity_log/shot_group.ex:82
#: lib/cannery/activity_log/shot_group.ex:119 #: lib/cannery/activity_log/shot_group.ex:118
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Count must be less than %{count}" msgid "Count must be less than %{count}"
msgstr "" msgstr ""
@ -185,17 +185,17 @@ msgstr ""
msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}" msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
msgstr "" msgstr ""
#: lib/cannery/ammo.ex:609 #: lib/cannery/ammo.ex:686
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Invalid multiplier" msgid "Invalid multiplier"
msgstr "" msgstr ""
#: lib/cannery/ammo/ammo_group.ex:96 #: lib/cannery/ammo/ammo_group.ex:97
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Please select an ammo type and container" msgid "Please select an ammo type and container"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:67 #: lib/cannery_web/live/range_live/index.html.heex:69
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Your browser does not support the canvas element." msgid "Your browser does not support the canvas element."
msgstr "" msgstr ""

View File

@ -29,11 +29,11 @@ msgstr ""
msgid "%{name} created successfully" msgid "%{name} created successfully"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:47 #: lib/cannery_web/live/ammo_type_live/index.ex:73
#: lib/cannery_web/live/ammo_type_live/show.ex:55 #: lib/cannery_web/live/ammo_type_live/show.ex:55
#: lib/cannery_web/live/invite_live/index.ex:53 #: lib/cannery_web/live/invite_live/index.ex:53
#: lib/cannery_web/live/invite_live/index.ex:133 #: lib/cannery_web/live/invite_live/index.ex:133
#: lib/cannery_web/live/tag_live/index.ex:38 #: lib/cannery_web/live/tag_live/index.ex:64
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{name} deleted succesfully" msgid "%{name} deleted succesfully"
msgstr "" msgstr ""
@ -48,8 +48,8 @@ msgstr ""
msgid "%{name} enabled succesfully" msgid "%{name} enabled succesfully"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.ex:81 #: lib/cannery_web/live/container_live/index.ex:85
#: lib/cannery_web/live/container_live/show.ex:67 #: lib/cannery_web/live/container_live/show.ex:63
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{name} has been deleted" msgid "%{name} has been deleted"
msgstr "" msgstr ""
@ -78,10 +78,10 @@ msgstr ""
msgid "Are you sure you want to delete %{email}? This action is permanent!" msgid "Are you sure you want to delete %{email}? This action is permanent!"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.ex:236 #: lib/cannery_web/live/container_live/index.html.heex:92
#: lib/cannery_web/live/container_live/index.html.heex:73 #: lib/cannery_web/live/container_live/index.html.heex:136
#: lib/cannery_web/live/container_live/show.html.heex:59 #: lib/cannery_web/live/container_live/show.html.heex:59
#: lib/cannery_web/live/tag_live/index.html.heex:39 #: lib/cannery_web/live/tag_live/index.html.heex:64
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}?" msgid "Are you sure you want to delete %{name}?"
msgstr "" msgstr ""
@ -91,7 +91,7 @@ msgstr ""
msgid "Are you sure you want to delete the invite for %{name}?" msgid "Are you sure you want to delete the invite for %{name}?"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.html.heex:131 #: lib/cannery_web/live/ammo_group_live/index.html.heex:152
#: lib/cannery_web/live/ammo_group_live/show.html.heex:75 #: lib/cannery_web/live/ammo_group_live/show.html.heex:75
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this ammo?" msgid "Are you sure you want to delete this ammo?"
@ -142,7 +142,7 @@ msgstr ""
msgid "Password updated successfully." msgid "Password updated successfully."
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_registration_controller.ex:74 #: lib/cannery_web/controllers/user_registration_controller.ex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Please check your email to verify your account" msgid "Please check your email to verify your account"
msgstr "" msgstr ""
@ -178,7 +178,7 @@ msgstr ""
msgid "%{name} added successfully" msgid "%{name} added successfully"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.ex:43 #: lib/cannery_web/live/container_live/show.ex:39
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{tag_name} has been removed from %{container_name}" msgid "%{tag_name} has been removed from %{container_name}"
msgstr "" msgstr ""
@ -193,19 +193,19 @@ msgstr ""
msgid "Shots recorded successfully" msgid "Shots recorded successfully"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:27 #: lib/cannery_web/live/range_live/index.html.heex:28
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to unstage this ammo?" msgid "Are you sure you want to unstage this ammo?"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/show.ex:137 #: lib/cannery_web/live/ammo_group_live/show.ex:137
#: lib/cannery_web/live/range_live/index.ex:159 #: lib/cannery_web/live/range_live/index.html.heex:118
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?" msgid "Are you sure you want to delete this shot record?"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/show.ex:83 #: lib/cannery_web/live/ammo_group_live/show.ex:83
#: lib/cannery_web/live/range_live/index.ex:54 #: lib/cannery_web/live/range_live/index.ex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot records deleted succesfully" msgid "Shot records deleted succesfully"
msgstr "" msgstr ""
@ -256,13 +256,13 @@ msgstr ""
msgid "Language updated successfully." msgid "Language updated successfully."
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.ex:64 #: lib/cannery_web/live/ammo_group_live/index.ex:89
#: lib/cannery_web/live/ammo_group_live/show.ex:55 #: lib/cannery_web/live/ammo_group_live/show.ex:55
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Ammo deleted succesfully" msgid "Ammo deleted succesfully"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.ex:68 #: lib/cannery_web/live/range_live/index.ex:95
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Ammo unstaged succesfully" msgid "Ammo unstaged succesfully"
msgstr "" msgstr ""
@ -279,7 +279,7 @@ msgid_plural "Ammo added successfully"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: lib/cannery_web/live/ammo_type_live/index.ex:232 #: lib/cannery_web/live/ammo_type_live/index.html.heex:90
#: lib/cannery_web/live/ammo_type_live/show.html.heex:28 #: lib/cannery_web/live/ammo_type_live/show.html.heex:28
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!" msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!"

View File

@ -18,11 +18,11 @@ msgstr ""
msgid "%{name} created successfully" msgid "%{name} created successfully"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_type_live/index.ex:47 #: lib/cannery_web/live/ammo_type_live/index.ex:73
#: lib/cannery_web/live/ammo_type_live/show.ex:55 #: lib/cannery_web/live/ammo_type_live/show.ex:55
#: lib/cannery_web/live/invite_live/index.ex:53 #: lib/cannery_web/live/invite_live/index.ex:53
#: lib/cannery_web/live/invite_live/index.ex:133 #: lib/cannery_web/live/invite_live/index.ex:133
#: lib/cannery_web/live/tag_live/index.ex:38 #: lib/cannery_web/live/tag_live/index.ex:64
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{name} deleted succesfully" msgid "%{name} deleted succesfully"
msgstr "" msgstr ""
@ -37,8 +37,8 @@ msgstr ""
msgid "%{name} enabled succesfully" msgid "%{name} enabled succesfully"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.ex:81 #: lib/cannery_web/live/container_live/index.ex:85
#: lib/cannery_web/live/container_live/show.ex:67 #: lib/cannery_web/live/container_live/show.ex:63
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{name} has been deleted" msgid "%{name} has been deleted"
msgstr "" msgstr ""
@ -67,10 +67,10 @@ msgstr ""
msgid "Are you sure you want to delete %{email}? This action is permanent!" msgid "Are you sure you want to delete %{email}? This action is permanent!"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.ex:236 #: lib/cannery_web/live/container_live/index.html.heex:92
#: lib/cannery_web/live/container_live/index.html.heex:73 #: lib/cannery_web/live/container_live/index.html.heex:136
#: lib/cannery_web/live/container_live/show.html.heex:59 #: lib/cannery_web/live/container_live/show.html.heex:59
#: lib/cannery_web/live/tag_live/index.html.heex:39 #: lib/cannery_web/live/tag_live/index.html.heex:64
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}?" msgid "Are you sure you want to delete %{name}?"
msgstr "" msgstr ""
@ -80,7 +80,7 @@ msgstr ""
msgid "Are you sure you want to delete the invite for %{name}?" msgid "Are you sure you want to delete the invite for %{name}?"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.html.heex:131 #: lib/cannery_web/live/ammo_group_live/index.html.heex:152
#: lib/cannery_web/live/ammo_group_live/show.html.heex:75 #: lib/cannery_web/live/ammo_group_live/show.html.heex:75
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this ammo?" msgid "Are you sure you want to delete this ammo?"
@ -131,7 +131,7 @@ msgstr ""
msgid "Password updated successfully." msgid "Password updated successfully."
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_registration_controller.ex:74 #: lib/cannery_web/controllers/user_registration_controller.ex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Please check your email to verify your account" msgid "Please check your email to verify your account"
msgstr "" msgstr ""
@ -167,7 +167,7 @@ msgstr ""
msgid "%{name} added successfully" msgid "%{name} added successfully"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.ex:43 #: lib/cannery_web/live/container_live/show.ex:39
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{tag_name} has been removed from %{container_name}" msgid "%{tag_name} has been removed from %{container_name}"
msgstr "" msgstr ""
@ -182,19 +182,19 @@ msgstr ""
msgid "Shots recorded successfully" msgid "Shots recorded successfully"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:27 #: lib/cannery_web/live/range_live/index.html.heex:28
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to unstage this ammo?" msgid "Are you sure you want to unstage this ammo?"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/show.ex:137 #: lib/cannery_web/live/ammo_group_live/show.ex:137
#: lib/cannery_web/live/range_live/index.ex:159 #: lib/cannery_web/live/range_live/index.html.heex:118
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?" msgid "Are you sure you want to delete this shot record?"
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/show.ex:83 #: lib/cannery_web/live/ammo_group_live/show.ex:83
#: lib/cannery_web/live/range_live/index.ex:54 #: lib/cannery_web/live/range_live/index.ex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot records deleted succesfully" msgid "Shot records deleted succesfully"
msgstr "" msgstr ""
@ -245,13 +245,13 @@ msgstr ""
msgid "Language updated successfully." msgid "Language updated successfully."
msgstr "" msgstr ""
#: lib/cannery_web/live/ammo_group_live/index.ex:64 #: lib/cannery_web/live/ammo_group_live/index.ex:89
#: lib/cannery_web/live/ammo_group_live/show.ex:55 #: lib/cannery_web/live/ammo_group_live/show.ex:55
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Ammo deleted succesfully" msgid "Ammo deleted succesfully"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.ex:68 #: lib/cannery_web/live/range_live/index.ex:95
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Ammo unstaged succesfully" msgid "Ammo unstaged succesfully"
msgstr "" msgstr ""
@ -268,7 +268,7 @@ msgid_plural "Ammo added successfully"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: lib/cannery_web/live/ammo_type_live/index.ex:232 #: lib/cannery_web/live/ammo_type_live/index.html.heex:90
#: lib/cannery_web/live/ammo_type_live/show.html.heex:28 #: lib/cannery_web/live/ammo_type_live/show.html.heex:28
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!" msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!"

View File

@ -0,0 +1,119 @@
defmodule Cannery.Repo.Migrations.AddSearch do
use Ecto.Migration
def up do
execute """
CREATE FUNCTION immutable_to_string(integer, text)
RETURNS text LANGUAGE sql IMMUTABLE as
$$SELECT coalesce(($1)::TEXT, $2)::TEXT$$
"""
execute """
CREATE FUNCTION immutable_to_string(double precision, text)
RETURNS text LANGUAGE sql IMMUTABLE as
$$SELECT coalesce(($1)::TEXT, $2)::TEXT$$
"""
execute """
CREATE FUNCTION immutable_to_string(date, text)
RETURNS text LANGUAGE sql IMMUTABLE as
$$SELECT coalesce(($1)::TEXT, $2)::TEXT$$
"""
execute """
CREATE FUNCTION boolean_to_string(boolean, text, text)
RETURNS text LANGUAGE sql IMMUTABLE as
$$SELECT (CASE $1 WHEN true THEN $2 ELSE $3 END)::TEXT$$
"""
execute """
ALTER TABLE ammo_groups
ADD COLUMN search tsvector
GENERATED ALWAYS AS (
setweight(to_tsvector('english', coalesce("notes", '')), 'A') ||
setweight(to_tsvector('english', immutable_to_string("price_paid", '')), 'B') ||
setweight(to_tsvector('english', immutable_to_string("purchased_on", '')), 'B') ||
setweight(to_tsvector('english', immutable_to_string("count", '')), 'C')
) STORED
"""
execute("CREATE INDEX ammo_groups_trgm_idx ON ammo_groups USING GIN (search)")
execute """
ALTER TABLE containers
ADD COLUMN search tsvector
GENERATED ALWAYS AS (
setweight(to_tsvector('english', coalesce("name", '')), 'A') ||
setweight(to_tsvector('english', coalesce("desc", '')), 'B') ||
setweight(to_tsvector('english', coalesce("location", '')), 'B') ||
setweight(to_tsvector('english', coalesce("type", '')), 'C')
) STORED
"""
execute("CREATE INDEX containers_trgm_idx ON containers USING GIN (search)")
execute """
ALTER TABLE tags
ADD COLUMN search tsvector
GENERATED ALWAYS AS (
setweight(to_tsvector('english', coalesce("name", '')), 'A')
) STORED
"""
execute("CREATE INDEX tags_trgm_idx ON tags USING GIN (search)")
execute """
ALTER TABLE ammo_types
ADD COLUMN search tsvector
GENERATED ALWAYS AS (
setweight(to_tsvector('english', coalesce("name", '')), 'A') ||
setweight(to_tsvector('english', coalesce("desc", '')), 'B') ||
setweight(to_tsvector('english', coalesce("bullet_type", '')), 'C') ||
setweight(to_tsvector('english', coalesce("bullet_core", '')), 'C') ||
setweight(to_tsvector('english', coalesce("cartridge", '')), 'C') ||
setweight(to_tsvector('english', coalesce("caliber", '')), 'C') ||
setweight(to_tsvector('english', coalesce("case_material", '')), 'C') ||
setweight(to_tsvector('english', coalesce("jacket_type", '')), 'C') ||
setweight(to_tsvector('english', immutable_to_string("muzzle_velocity", '')), 'C') ||
setweight(to_tsvector('english', coalesce("powder_type", '')), 'C') ||
setweight(to_tsvector('english', immutable_to_string("powder_grains_per_charge", '')), 'C') ||
setweight(to_tsvector('english', immutable_to_string("grains", '')), 'C') ||
setweight(to_tsvector('english', coalesce("pressure", '')), 'C') ||
setweight(to_tsvector('english', coalesce("primer_type", '')), 'C') ||
setweight(to_tsvector('english', coalesce("firing_type", '')), 'C') ||
setweight(to_tsvector('english', boolean_to_string("tracer", 'tracer', '')), 'C') ||
setweight(to_tsvector('english', boolean_to_string("incendiary", 'incendiary', '')), 'C') ||
setweight(to_tsvector('english', boolean_to_string("blank", 'blank', '')), 'C') ||
setweight(to_tsvector('english', boolean_to_string("corrosive", 'corrosive', '')), 'C') ||
setweight(to_tsvector('english', coalesce("manufacturer", '')), 'D') ||
setweight(to_tsvector('english', coalesce("upc", '')), 'D')
) STORED
"""
execute("CREATE INDEX ammo_types_trgm_idx ON ammo_types USING GIN (search)")
execute """
ALTER TABLE shot_groups
ADD COLUMN search tsvector
GENERATED ALWAYS AS (
setweight(to_tsvector('english', coalesce(notes, '')), 'A') ||
setweight(to_tsvector('english', immutable_to_string(count, '')), 'B') ||
setweight(to_tsvector('english', immutable_to_string(date, '')), 'C')
) STORED
"""
execute("CREATE INDEX shot_groups_trgm_idx ON shot_groups USING GIN (search)")
end
def down do
alter table(:ammo_groups), do: remove(:search)
alter table(:containers), do: remove(:search)
alter table(:tags), do: remove(:search)
alter table(:ammo_types), do: remove(:search)
alter table(:shot_groups), do: remove(:search)
execute("DROP FUNCTION immutable_to_string(double precision, text)")
execute("DROP FUNCTION immutable_to_string(integer, text)")
execute("DROP FUNCTION immutable_to_string(date, text)")
execute("DROP FUNCTION boolean_to_string(boolean, text, text)")
end
end

View File

@ -104,7 +104,7 @@ defmodule Cannery.AccountsTest do
describe "change_user_registration/2" do describe "change_user_registration/2" do
test "returns a changeset" do test "returns a changeset" do
assert %Changeset{} = changeset = Accounts.change_user_registration(%User{}) assert %Changeset{} = changeset = Accounts.change_user_registration()
assert changeset.required == [:password, :email] assert changeset.required == [:password, :email]
end end
@ -112,8 +112,7 @@ defmodule Cannery.AccountsTest do
email = unique_user_email() email = unique_user_email()
password = valid_user_password() password = valid_user_password()
changeset = changeset = Accounts.change_user_registration(%{"email" => email, "password" => password})
Accounts.change_user_registration(%User{}, %{"email" => email, "password" => password})
assert changeset.valid? assert changeset.valid?
assert get_change(changeset, :email) == email assert get_change(changeset, :email) == email

View File

@ -38,17 +38,56 @@ defmodule Cannery.ActivityLogTest do
] ]
end end
test "list_shot_groups/0 returns all shot_groups", test "list_shot_groups/1 returns all shot_groups",
%{shot_group: shot_group, current_user: current_user} do %{shot_group: shot_group, current_user: current_user} do
assert ActivityLog.list_shot_groups(current_user) == [shot_group] assert ActivityLog.list_shot_groups(current_user) == [shot_group]
end end
test "get_shot_group!/1 returns the shot_group with given id", test "list_shot_groups/2 returns relevant shot_groups for a user", %{
ammo_type: ammo_type,
ammo_group: ammo_group,
container: container,
current_user: current_user
} do
shot_group_a = shot_group_fixture(%{"notes" => "amazing"}, current_user, ammo_group)
{1, [another_ammo_group]} =
ammo_group_fixture(%{"notes" => "stupendous"}, ammo_type, container, current_user)
shot_group_b = shot_group_fixture(current_user, another_ammo_group)
another_ammo_type = ammo_type_fixture(%{"name" => "fabulous ammo"}, current_user)
{1, [yet_another_ammo_group]} =
ammo_group_fixture(another_ammo_type, container, current_user)
shot_group_c = shot_group_fixture(current_user, yet_another_ammo_group)
random_user = user_fixture()
random_container = container_fixture(random_user)
random_ammo_type = ammo_type_fixture(random_user)
{1, [random_ammo_group]} =
ammo_group_fixture(random_ammo_type, random_container, random_user)
_shouldnt_return = shot_group_fixture(random_user, random_ammo_group)
# notes
assert ActivityLog.list_shot_groups("amazing", current_user) == [shot_group_a]
# ammo group attributes
assert ActivityLog.list_shot_groups("stupendous", current_user) == [shot_group_b]
# ammo type attributes
assert ActivityLog.list_shot_groups("fabulous", current_user) == [shot_group_c]
end
test "get_shot_group!/2 returns the shot_group with given id",
%{shot_group: shot_group, current_user: current_user} do %{shot_group: shot_group, current_user: current_user} do
assert ActivityLog.get_shot_group!(shot_group.id, current_user) == shot_group assert ActivityLog.get_shot_group!(shot_group.id, current_user) == shot_group
end end
test "get_shot_group!/1 does not return a shot_group of another user", test "get_shot_group!/2 does not return a shot_group of another user",
%{shot_group: shot_group} do %{shot_group: shot_group} do
another_user = user_fixture() another_user = user_fixture()
@ -57,7 +96,7 @@ defmodule Cannery.ActivityLogTest do
end end
end end
test "create_shot_group/1 with valid data creates a shot_group", test "create_shot_group/3 with valid data creates a shot_group",
%{current_user: current_user, ammo_group: ammo_group} do %{current_user: current_user, ammo_group: ammo_group} do
valid_attrs = %{"count" => 10, "date" => ~D[2022-02-13], "notes" => "some notes"} valid_attrs = %{"count" => 10, "date" => ~D[2022-02-13], "notes" => "some notes"}
@ -69,7 +108,7 @@ defmodule Cannery.ActivityLogTest do
assert shot_group.notes == "some notes" assert shot_group.notes == "some notes"
end end
test "create_shot_group/1 removes corresponding count from ammo group", test "create_shot_group/3 removes corresponding count from ammo group",
%{ %{
current_user: current_user, current_user: current_user,
ammo_group: %{id: ammo_group_id, count: org_count} = ammo_group ammo_group: %{id: ammo_group_id, count: org_count} = ammo_group
@ -85,7 +124,7 @@ defmodule Cannery.ActivityLogTest do
assert new_count == 10 assert new_count == 10
end end
test "create_shot_group/1 does not remove more than ammo group amount", test "create_shot_group/3 does not remove more than ammo group amount",
%{current_user: current_user, ammo_group: %{id: ammo_group_id} = ammo_group} do %{current_user: current_user, ammo_group: %{id: ammo_group_id} = ammo_group} do
valid_attrs = %{"count" => 20, "date" => ~D[2022-02-13], "notes" => "some notes"} valid_attrs = %{"count" => 20, "date" => ~D[2022-02-13], "notes" => "some notes"}
@ -100,7 +139,7 @@ defmodule Cannery.ActivityLogTest do
ActivityLog.create_shot_group(%{"count" => 1}, current_user, ammo_group) ActivityLog.create_shot_group(%{"count" => 1}, current_user, ammo_group)
end end
test "create_shot_group/1 with invalid data returns error changeset", test "create_shot_group/3 with invalid data returns error changeset",
%{current_user: current_user, ammo_group: ammo_group} do %{current_user: current_user, ammo_group: ammo_group} do
invalid_params = %{"count" => nil, "date" => nil, "notes" => nil} invalid_params = %{"count" => nil, "date" => nil, "notes" => nil}
@ -108,7 +147,7 @@ defmodule Cannery.ActivityLogTest do
ActivityLog.create_shot_group(invalid_params, current_user, ammo_group) ActivityLog.create_shot_group(invalid_params, current_user, ammo_group)
end end
test "update_shot_group/2 with valid data updates the shot_group and ammo_group", test "update_shot_group/3 with valid data updates the shot_group and ammo_group",
%{ %{
shot_group: shot_group, shot_group: shot_group,
ammo_group: %{id: ammo_group_id}, ammo_group: %{id: ammo_group_id},
@ -149,7 +188,7 @@ defmodule Cannery.ActivityLogTest do
assert ammo_group.count == 0 assert ammo_group.count == 0
end end
test "update_shot_group/2 with invalid data returns error changeset", test "update_shot_group/3 with invalid data returns error changeset",
%{shot_group: shot_group, current_user: current_user} do %{shot_group: shot_group, current_user: current_user} do
assert {:error, %Ecto.Changeset{}} = assert {:error, %Ecto.Changeset{}} =
ActivityLog.update_shot_group( ActivityLog.update_shot_group(
@ -168,7 +207,7 @@ defmodule Cannery.ActivityLogTest do
assert shot_group == ActivityLog.get_shot_group!(shot_group.id, current_user) assert shot_group == ActivityLog.get_shot_group!(shot_group.id, current_user)
end end
test "delete_shot_group/1 deletes the shot_group and adds value back", test "delete_shot_group/2 deletes the shot_group and adds value back",
%{shot_group: shot_group, current_user: current_user, ammo_group: %{id: ammo_group_id}} do %{shot_group: shot_group, current_user: current_user, ammo_group: %{id: ammo_group_id}} do
assert {:ok, %ShotGroup{}} = ActivityLog.delete_shot_group(shot_group, current_user) assert {:ok, %ShotGroup{}} = ActivityLog.delete_shot_group(shot_group, current_user)

View File

@ -4,7 +4,7 @@ defmodule Cannery.AmmoTest do
""" """
use Cannery.DataCase use Cannery.DataCase
alias Cannery.{Ammo, Ammo.AmmoGroup, Ammo.AmmoType} alias Cannery.{Ammo, Ammo.AmmoGroup, Ammo.AmmoType, Containers}
alias Ecto.Changeset alias Ecto.Changeset
@moduletag :ammo_test @moduletag :ammo_test
@ -40,11 +40,55 @@ defmodule Cannery.AmmoTest do
[ammo_type: ammo_type_fixture(current_user), current_user: current_user] [ammo_type: ammo_type_fixture(current_user), current_user: current_user]
end end
test "list_ammo_types/0 returns all ammo_types", test "list_ammo_types/1 returns all ammo_types",
%{ammo_type: ammo_type, current_user: current_user} do %{ammo_type: ammo_type, current_user: current_user} do
assert Ammo.list_ammo_types(current_user) == [ammo_type] assert Ammo.list_ammo_types(current_user) == [ammo_type]
end end
test "list_ammo_types/1 returns relevant ammo_types for a user",
%{current_user: current_user} do
ammo_type_a =
%{"name" => "bullets", "desc" => "has some pews in it", "grains" => 5}
|> ammo_type_fixture(current_user)
ammo_type_b =
%{"name" => "hollows", "grains" => 3}
|> ammo_type_fixture(current_user)
ammo_type_c =
%{
"name" => "jackets",
"desc" => "brass shell",
"tracer" => true
}
|> ammo_type_fixture(current_user)
_shouldnt_return =
%{
"name" => "bullet",
"desc" => "pews brass shell"
}
|> ammo_type_fixture(user_fixture())
# name
assert Ammo.list_ammo_types("bullet", current_user) == [ammo_type_a]
assert Ammo.list_ammo_types("bullets", current_user) == [ammo_type_a]
assert Ammo.list_ammo_types("hollow", current_user) == [ammo_type_b]
assert Ammo.list_ammo_types("jacket", current_user) == [ammo_type_c]
# desc
assert Ammo.list_ammo_types("pew", current_user) == [ammo_type_a]
assert Ammo.list_ammo_types("brass", current_user) == [ammo_type_c]
assert Ammo.list_ammo_types("shell", current_user) == [ammo_type_c]
# grains (integer)
assert Ammo.list_ammo_types("5", current_user) == [ammo_type_a]
assert Ammo.list_ammo_types("3", current_user) == [ammo_type_b]
# tracer (boolean)
assert Ammo.list_ammo_types("tracer", current_user) == [ammo_type_c]
end
test "get_ammo_type!/1 returns the ammo_type with given id", test "get_ammo_type!/1 returns the ammo_type with given id",
%{ammo_type: ammo_type, current_user: current_user} do %{ammo_type: ammo_type, current_user: current_user} do
assert Ammo.get_ammo_type!(ammo_type.id, current_user) == ammo_type assert Ammo.get_ammo_type!(ammo_type.id, current_user) == ammo_type
@ -250,6 +294,13 @@ defmodule Cannery.AmmoTest do
%{"count" => 50, "price_paid" => 36.1} %{"count" => 50, "price_paid" => 36.1}
|> ammo_group_fixture(ammo_type, container, current_user) |> ammo_group_fixture(ammo_type, container, current_user)
another_user = user_fixture()
another_ammo_type = ammo_type_fixture(another_user)
another_container = container_fixture(another_user)
{1, [_shouldnt_show_up]} =
ammo_group_fixture(another_ammo_type, another_container, another_user)
[ [
ammo_type: ammo_type, ammo_type: ammo_type,
ammo_group: ammo_group, ammo_group: ammo_group,
@ -258,7 +309,7 @@ defmodule Cannery.AmmoTest do
] ]
end end
test "list_ammo_groups/2 returns all ammo_groups", test "list_ammo_groups/3 returns all ammo_groups",
%{ %{
ammo_type: ammo_type, ammo_type: ammo_type,
ammo_group: ammo_group, ammo_group: ammo_group,
@ -270,13 +321,65 @@ defmodule Cannery.AmmoTest do
shot_group_fixture(%{"count" => 30}, current_user, another_ammo_group) shot_group_fixture(%{"count" => 30}, current_user, another_ammo_group)
another_ammo_group = another_ammo_group |> Repo.reload!() another_ammo_group = another_ammo_group |> Repo.reload!()
assert Ammo.list_ammo_groups(current_user) == [ammo_group] |> Repo.preload(:shot_groups)
assert Ammo.list_ammo_groups(current_user, true) assert Ammo.list_ammo_groups(nil, false, current_user) ==
[ammo_group] |> preload_ammo_group()
assert Ammo.list_ammo_groups(nil, true, current_user)
|> Enum.sort_by(fn %{count: count} -> count end) == |> Enum.sort_by(fn %{count: count} -> count end) ==
[another_ammo_group, ammo_group] |> Repo.preload(:shot_groups) [another_ammo_group, ammo_group] |> preload_ammo_group()
end end
test "list_ammo_groups/3 returns relevant ammo groups when searched",
%{
ammo_type: ammo_type,
ammo_group: ammo_group,
container: container,
current_user: current_user
} do
{1, [another_ammo_group]} =
%{"count" => 49, "notes" => "cool ammo group"}
|> ammo_group_fixture(ammo_type, container, current_user)
another_ammo_type = ammo_type_fixture(%{"name" => "amazing ammo"}, current_user)
another_container = container_fixture(%{"name" => "fantastic container"}, current_user)
tag = tag_fixture(%{"name" => "stupendous tag"}, current_user)
Containers.add_tag!(another_container, tag, current_user)
{1, [amazing_ammo_group]} =
ammo_group_fixture(%{"count" => 48}, another_ammo_type, container, current_user)
{1, [fantastic_ammo_group]} =
ammo_group_fixture(%{"count" => 47}, ammo_type, another_container, current_user)
assert Ammo.list_ammo_groups(nil, false, current_user)
|> Enum.sort_by(fn %{count: count} -> count end) ==
[fantastic_ammo_group, amazing_ammo_group, another_ammo_group, ammo_group]
|> preload_ammo_group()
# search works for ammo group attributes
assert Ammo.list_ammo_groups("cool", true, current_user) ==
[another_ammo_group] |> preload_ammo_group()
# search works for ammo type attributes
assert Ammo.list_ammo_groups("amazing", true, current_user) ==
[amazing_ammo_group] |> preload_ammo_group()
# search works for container attributes
assert Ammo.list_ammo_groups("fantastic", true, current_user) ==
[fantastic_ammo_group] |> preload_ammo_group()
# search works for container tag attributes
assert Ammo.list_ammo_groups("stupendous", true, current_user) ==
[fantastic_ammo_group] |> preload_ammo_group()
assert Ammo.list_ammo_groups("random", true, current_user) == []
end
defp preload_ammo_group(ammo_group),
do: ammo_group |> Repo.preload([:ammo_type, :shot_groups, container: :tags])
test "list_ammo_groups_for_type/2 returns all ammo_groups for a type", test "list_ammo_groups_for_type/2 returns all ammo_groups for a type",
%{ %{
ammo_type: ammo_type, ammo_type: ammo_type,

View File

@ -22,7 +22,12 @@ defmodule Cannery.ContainersTest do
"name" => "some updated name", "name" => "some updated name",
"type" => "some updated type" "type" => "some updated type"
} }
@invalid_attrs %{"desc" => nil, "location" => nil, "name" => nil, "type" => nil} @invalid_attrs %{
"desc" => nil,
"location" => nil,
"name" => nil,
"type" => nil
}
describe "containers" do describe "containers" do
setup do setup do
@ -34,9 +39,47 @@ defmodule Cannery.ContainersTest do
test "list_containers/1 returns all containers", test "list_containers/1 returns all containers",
%{current_user: current_user, container: container} do %{current_user: current_user, container: container} do
assert Containers.list_containers(current_user) == assert Containers.list_containers(current_user) ==
[container |> Repo.preload([:ammo_groups, :tags])] [container] |> preload_containers()
end end
test "list_containers/2 returns relevant containers for a user",
%{current_user: current_user} do
container_a =
container_fixture(%{"name" => "my cool container"}, current_user) |> preload_containers()
container_b =
container_fixture(%{"desc" => "a fascinating description"}, current_user)
|> preload_containers()
container_c = container_fixture(%{"location" => "a secret place"}, current_user)
tag = tag_fixture(%{"name" => "stupendous tag"}, current_user)
Containers.add_tag!(container_c, tag, current_user)
container_c = container_c |> preload_containers()
container_d = container_fixture(%{"type" => "musty old box"}, current_user)
tag = tag_fixture(%{"name" => "amazing tag"}, current_user)
Containers.add_tag!(container_d, tag, current_user)
container_d = container_d |> preload_containers()
_shouldnt_return =
container_fixture(%{"name" => "another person's container"}, user_fixture())
# attributes
assert Containers.list_containers("cool", current_user) == [container_a]
assert Containers.list_containers("fascinating", current_user) == [container_b]
assert Containers.list_containers("secret", current_user) == [container_c]
assert Containers.list_containers("box", current_user) == [container_d]
# tags
assert Containers.list_containers("stupendous", current_user) == [container_c]
assert Containers.list_containers("amazing", current_user) == [container_d]
assert Containers.list_containers("asajslkdflskdf", current_user) == []
end
defp preload_containers(containers),
do: containers |> Repo.preload([:ammo_groups, :tags])
test "get_container!/1 returns the container with given id", test "get_container!/1 returns the container with given id",
%{current_user: current_user, container: container} do %{current_user: current_user, container: container} do
assert Containers.get_container!(container.id, current_user) == assert Containers.get_container!(container.id, current_user) ==

View File

@ -31,10 +31,28 @@ defmodule Cannery.TagsTest do
[tag: tag_fixture(current_user), current_user: current_user] [tag: tag_fixture(current_user), current_user: current_user]
end end
test "list_tags/0 returns all tags", %{tag: tag, current_user: current_user} do test "list_tags/1 returns all tags", %{tag: tag, current_user: current_user} do
assert Tags.list_tags(current_user) == [tag] assert Tags.list_tags(current_user) == [tag]
end end
test "list_tags/2 returns relevant tags for a user", %{current_user: current_user} do
tag_a = tag_fixture(%{"name" => "bullets"}, current_user)
tag_b = tag_fixture(%{"name" => "hollows"}, current_user)
_shouldnt_return =
%{
"name" => "bullet",
"desc" => "pews brass shell"
}
|> tag_fixture(user_fixture())
# name
assert Tags.list_tags("bullet", current_user) == [tag_a]
assert Tags.list_tags("bullets", current_user) == [tag_a]
assert Tags.list_tags("hollow", current_user) == [tag_b]
assert Tags.list_tags("hollows", current_user) == [tag_b]
end
test "get_tag!/1 returns the tag with given id", %{tag: tag, current_user: current_user} do test "get_tag!/1 returns the tag with given id", %{tag: tag, current_user: current_user} do
assert Tags.get_tag!(tag.id, current_user) == tag assert Tags.get_tag!(tag.id, current_user) == tag
end end

View File

@ -66,6 +66,37 @@ defmodule CanneryWeb.AmmoGroupLiveTest do
assert html =~ ammo_group.ammo_type.name assert html =~ ammo_group.ammo_type.name
end end
test "can search for ammo_groups", %{conn: conn, ammo_group: ammo_group} do
{:ok, index_live, html} = live(conn, Routes.ammo_group_index_path(conn, :index))
ammo_group = ammo_group |> Repo.preload(:ammo_type)
assert html =~ ammo_group.ammo_type.name
assert index_live
|> form("[data-qa=\"ammo_group_search\"]",
search: %{search_term: ammo_group.ammo_type.name}
)
|> render_change() =~ ammo_group.ammo_type.name
assert_patch(
index_live,
Routes.ammo_group_index_path(conn, :search, ammo_group.ammo_type.name)
)
refute index_live
|> form("[data-qa=\"ammo_group_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: ""})
|> render_change() =~ ammo_group.ammo_type.name
assert_patch(index_live, Routes.ammo_group_index_path(conn, :index))
end
test "saves a single new ammo_group", %{conn: conn} do test "saves a single new ammo_group", %{conn: conn} do
{:ok, index_live, _html} = live(conn, Routes.ammo_group_index_path(conn, :index)) {:ok, index_live, _html} = live(conn, Routes.ammo_group_index_path(conn, :index))
@ -111,7 +142,7 @@ defmodule CanneryWeb.AmmoGroupLiveTest do
|> follow_redirect(conn, Routes.ammo_group_index_path(conn, :index)) |> follow_redirect(conn, Routes.ammo_group_index_path(conn, :index))
assert html =~ dgettext("prompts", "Ammo added successfully") assert html =~ dgettext("prompts", "Ammo added successfully")
assert Ammo.list_ammo_groups(current_user) |> Enum.count() == multiplier + 1 assert Ammo.list_ammo_groups(nil, false, current_user) |> Enum.count() == multiplier + 1
end end
test "does not save invalid number of new ammo_groups", %{conn: conn} do test "does not save invalid number of new ammo_groups", %{conn: conn} do

View File

@ -70,10 +70,36 @@ defmodule CanneryWeb.AmmoTypeLiveTest do
test "lists all ammo_types", %{conn: conn, ammo_type: ammo_type} do test "lists all ammo_types", %{conn: conn, ammo_type: ammo_type} do
{:ok, _index_live, html} = live(conn, Routes.ammo_type_index_path(conn, :index)) {:ok, _index_live, html} = live(conn, Routes.ammo_type_index_path(conn, :index))
assert html =~ gettext("Ammo types") assert html =~ gettext("Catalog")
assert html =~ ammo_type.bullet_type assert html =~ ammo_type.bullet_type
end end
test "can search for ammo_type", %{conn: conn, ammo_type: ammo_type} do
{:ok, index_live, html} = live(conn, Routes.ammo_type_index_path(conn, :index))
assert html =~ ammo_type.bullet_type
assert index_live
|> form("[data-qa=\"ammo_type_search\"]",
search: %{search_term: ammo_type.bullet_type}
)
|> render_change() =~ ammo_type.bullet_type
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"})
|> 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: ""})
|> render_change() =~ ammo_type.bullet_type
assert_patch(index_live, Routes.ammo_type_index_path(conn, :index))
end
test "saves new ammo_type", %{conn: conn, current_user: current_user, ammo_type: ammo_type} do test "saves new ammo_type", %{conn: conn, current_user: current_user, ammo_type: ammo_type} do
{:ok, index_live, _html} = live(conn, Routes.ammo_type_index_path(conn, :index)) {:ok, index_live, _html} = live(conn, Routes.ammo_type_index_path(conn, :index))
@ -102,7 +128,7 @@ defmodule CanneryWeb.AmmoTypeLiveTest do
{:ok, index_live, _html} = live(conn, Routes.ammo_type_index_path(conn, :index)) {: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("[data-qa=\"edit-#{ammo_type.id}\"]") |> render_click() =~
gettext("Edit Ammo type") gettext("Edit %{ammo_type_name}", ammo_type_name: ammo_type.name)
assert_patch(index_live, Routes.ammo_type_index_path(conn, :edit, ammo_type)) assert_patch(index_live, Routes.ammo_type_index_path(conn, :edit, ammo_type))

View File

@ -62,7 +62,7 @@ defmodule CanneryWeb.ContainerLiveTest do
%{ammo_type: ammo_type, ammo_group: ammo_group, shot_group: shot_group} %{ammo_type: ammo_type, ammo_group: ammo_group, shot_group: shot_group}
end end
describe "Index regular" do describe "Index" do
setup [:register_and_log_in_user, :create_container] setup [:register_and_log_in_user, :create_container]
test "lists all containers", %{conn: conn, container: container} do test "lists all containers", %{conn: conn, container: container} do
@ -72,132 +72,43 @@ defmodule CanneryWeb.ContainerLiveTest do
assert html =~ container.location assert html =~ container.location
end end
test "saves new container", %{conn: conn, container: container} 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)) {:ok, index_live, _html} = live(conn, Routes.container_index_path(conn, :index))
assert index_live |> element("a", dgettext("actions", "New Container")) |> render_click() =~ html = index_live |> element("[data-qa=\"toggle_table\"]") |> render_click()
gettext("New Container")
assert_patch(index_live, Routes.container_index_path(conn, :new))
# assert index_live
# |> form("#container-form", container: @invalid_attrs)
# |> render_change() =~ dgettext("errors", "can't be blank")
{:ok, _view, html} =
index_live
|> form("#container-form", container: @create_attrs)
|> render_submit()
|> follow_redirect(conn, Routes.container_index_path(conn, :index))
assert html =~ dgettext("prompts", "%{name} created successfully", name: container.name)
assert html =~ "some location"
end
test "updates container in listing", %{
conn: conn,
current_user: current_user,
container: container
} do
{:ok, index_live, _html} = live(conn, Routes.container_index_path(conn, :index))
assert index_live |> element("[data-qa=\"edit-#{container.id}\"]") |> render_click() =~
gettext("Edit %{name}", name: container.name)
assert_patch(index_live, Routes.container_index_path(conn, :edit, container))
# assert index_live
# |> form("#container-form", container: @invalid_attrs)
# |> render_change() =~ dgettext("errors", "can't be blank")
{:ok, _view, html} =
index_live
|> form("#container-form", container: @update_attrs)
|> render_submit()
|> follow_redirect(conn, Routes.container_index_path(conn, :index))
container = container.id |> Containers.get_container!(current_user)
assert html =~ dgettext("prompts", "%{name} updated successfully", name: container.name)
assert html =~ "some updated location"
end
test "clones container in listing", %{
conn: conn,
current_user: current_user,
container: container
} do
{:ok, index_live, _html} = live(conn, Routes.container_index_path(conn, :index))
html = index_live |> element("[data-qa=\"clone-#{container.id}\"]") |> render_click()
assert html =~ gettext("New Container")
assert html =~ "some location"
assert_patch(index_live, Routes.container_index_path(conn, :clone, container))
# assert index_live
# |> form("#container-form", container: @invalid_attrs)
# |> render_change() =~ dgettext("errors", "can't be blank")
{:ok, _view, html} =
index_live
|> form("#container-form", container: @create_attrs)
|> render_submit()
|> follow_redirect(conn, Routes.container_index_path(conn, :index))
container = container.id |> Containers.get_container!(current_user)
assert html =~ dgettext("prompts", "%{name} created successfully", name: container.name)
assert html =~ "some location"
end
test "clones container in listing with updates", %{
conn: conn,
current_user: current_user,
container: container
} do
{:ok, index_live, _html} = live(conn, Routes.container_index_path(conn, :index))
assert index_live |> element("[data-qa=\"clone-#{container.id}\"]") |> render_click() =~
gettext("New Container")
assert_patch(index_live, Routes.container_index_path(conn, :clone, container))
# assert index_live
# |> form("#container-form", container: @invalid_attrs)
# |> render_change() =~ dgettext("errors", "can't be blank")
{:ok, _view, html} =
index_live
|> form("#container-form",
container: Map.merge(@create_attrs, %{location: "some updated location"})
)
|> render_submit()
|> follow_redirect(conn, Routes.container_index_path(conn, :index))
container = container.id |> Containers.get_container!(current_user)
assert html =~ dgettext("prompts", "%{name} created successfully", name: container.name)
assert html =~ "some updated location"
end
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()
refute has_element?(index_live, "#container-#{container.id}")
end
end
describe "Index table" do
setup [:register_and_log_in_user, :create_container]
test "lists all containers", %{conn: conn, container: container} do
{:ok, _index_live, html} = live(conn, Routes.container_index_path(conn, :table))
assert html =~ gettext("Containers") assert html =~ gettext("Containers")
assert html =~ container.location assert html =~ container.location
end end
test "can search for containers", %{conn: conn, container: container} do
{:ok, index_live, html} = live(conn, Routes.container_index_path(conn, :index))
assert html =~ container.location
assert index_live
|> form("[data-qa=\"container_search\"]",
search: %{search_term: container.location}
)
|> render_change() =~ container.location
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"})
|> 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: ""})
|> render_change() =~ container.location
assert_patch(index_live, Routes.container_index_path(conn, :index))
end
test "saves new container", %{conn: conn, container: container} do test "saves new container", %{conn: conn, container: container} do
{:ok, index_live, _html} = live(conn, Routes.container_index_path(conn, :table)) {:ok, index_live, _html} = live(conn, Routes.container_index_path(conn, :index))
assert index_live |> element("a", dgettext("actions", "New Container")) |> render_click() =~ assert index_live |> element("a", dgettext("actions", "New Container")) |> render_click() =~
gettext("New Container") gettext("New Container")
@ -212,7 +123,7 @@ defmodule CanneryWeb.ContainerLiveTest do
index_live index_live
|> form("#container-form", container: @create_attrs) |> form("#container-form", container: @create_attrs)
|> render_submit() |> render_submit()
|> follow_redirect(conn, Routes.container_index_path(conn, :table)) |> follow_redirect(conn, Routes.container_index_path(conn, :index))
assert html =~ dgettext("prompts", "%{name} created successfully", name: container.name) assert html =~ dgettext("prompts", "%{name} created successfully", name: container.name)
assert html =~ "some location" assert html =~ "some location"
@ -223,7 +134,7 @@ defmodule CanneryWeb.ContainerLiveTest do
current_user: current_user, current_user: current_user,
container: container container: container
} do } do
{:ok, index_live, _html} = live(conn, Routes.container_index_path(conn, :table)) {: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("[data-qa=\"edit-#{container.id}\"]") |> render_click() =~
gettext("Edit %{name}", name: container.name) gettext("Edit %{name}", name: container.name)
@ -238,7 +149,7 @@ defmodule CanneryWeb.ContainerLiveTest do
index_live index_live
|> form("#container-form", container: @update_attrs) |> form("#container-form", container: @update_attrs)
|> render_submit() |> render_submit()
|> follow_redirect(conn, Routes.container_index_path(conn, :table)) |> follow_redirect(conn, Routes.container_index_path(conn, :index))
container = container.id |> Containers.get_container!(current_user) container = container.id |> Containers.get_container!(current_user)
assert html =~ dgettext("prompts", "%{name} updated successfully", name: container.name) assert html =~ dgettext("prompts", "%{name} updated successfully", name: container.name)
@ -303,7 +214,7 @@ defmodule CanneryWeb.ContainerLiveTest do
end end
test "deletes container in listing", %{conn: conn, container: container} do test "deletes container in listing", %{conn: conn, container: container} do
{:ok, index_live, _html} = live(conn, Routes.container_index_path(conn, :table)) {: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("[data-qa=\"delete-#{container.id}\"]") |> render_click()
refute has_element?(index_live, "#container-#{container.id}") refute has_element?(index_live, "#container-#{container.id}")
@ -367,7 +278,6 @@ defmodule CanneryWeb.ContainerLiveTest do
{:ok, show_live, _html} = live(conn, Routes.container_show_path(conn, :show, container)) {: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("[data-qa=\"toggle_table\"]") |> render_click()
assert_patch(show_live, Routes.container_show_path(conn, :table, container))
assert html =~ ammo_type_name assert html =~ ammo_type_name
assert html =~ "some ammo group" assert html =~ "some ammo group"
@ -396,7 +306,6 @@ defmodule CanneryWeb.ContainerLiveTest do
{:ok, show_live, _html} = live(conn, Routes.container_show_path(conn, :show, container)) {: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("[data-qa=\"toggle_table\"]") |> render_click()
assert_patch(show_live, Routes.container_show_path(conn, :table, container))
assert html =~ dgettext("actions", "Show used") assert html =~ dgettext("actions", "Show used")
refute html =~ "some ammo group" refute html =~ "some ammo group"

View File

@ -37,6 +37,32 @@ defmodule CanneryWeb.RangeLiveTest do
assert html =~ shot_group.notes assert html =~ shot_group.notes
end end
test "can search for shot_group", %{conn: conn, shot_group: shot_group} do
{:ok, index_live, html} = live(conn, Routes.range_index_path(conn, :index))
assert html =~ shot_group.notes
assert index_live
|> form("[data-qa=\"shot_group_search\"]",
search: %{search_term: shot_group.notes}
)
|> render_change() =~ shot_group.notes
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"})
|> 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: ""})
|> render_change() =~ shot_group.notes
assert_patch(index_live, Routes.range_index_path(conn, :index))
end
test "saves new shot_group", %{conn: conn, ammo_group: ammo_group} do test "saves new shot_group", %{conn: conn, ammo_group: ammo_group} do
{:ok, index_live, _html} = live(conn, Routes.range_index_path(conn, :index)) {:ok, index_live, _html} = live(conn, Routes.range_index_path(conn, :index))

View File

@ -41,6 +41,32 @@ defmodule CanneryWeb.TagLiveTest do
assert html =~ tag.bg_color assert html =~ tag.bg_color
end end
test "can search for tag", %{conn: conn, tag: tag} do
{:ok, index_live, html} = live(conn, Routes.tag_index_path(conn, :index))
assert html =~ tag.name
assert index_live
|> form("[data-qa=\"tag_search\"]",
search: %{search_term: tag.name}
)
|> render_change() =~ tag.name
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"})
|> 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: ""})
|> render_change() =~ tag.name
assert_patch(index_live, Routes.tag_index_path(conn, :index))
end
test "saves new tag", %{conn: conn} do test "saves new tag", %{conn: conn} do
{:ok, index_live, _html} = live(conn, Routes.tag_index_path(conn, :index)) {:ok, index_live, _html} = live(conn, Routes.tag_index_path(conn, :index))

View File

@ -13,6 +13,7 @@ defmodule Cannery.Fixtures do
Containers, Containers,
Containers.Container, Containers.Container,
Email, Email,
Repo,
Tags, Tags,
Tags.Tag Tags.Tag
} }
@ -38,11 +39,12 @@ defmodule Cannery.Fixtures do
attrs attrs
|> Enum.into(%{ |> Enum.into(%{
"email" => unique_user_email(), "email" => unique_user_email(),
"password" => valid_user_password(), "password" => valid_user_password()
"role" => "admin"
}) })
|> Accounts.register_user() |> Accounts.register_user()
|> unwrap_ok_tuple() |> unwrap_ok_tuple()
|> User.role_changeset("admin")
|> Repo.update!()
end end
def extract_user_token(fun) do def extract_user_token(fun) do