Compare commits

...

52 Commits
0.9.3 ... dev

Author SHA1 Message Date
shibao d896257602 actually fix bar graph
continuous-integration/drone/push Build is passing Details
2024-03-19 00:28:30 -04:00
shibao 4ca51a3f53 update dependencies
continuous-integration/drone/tag Build is passing Details
continuous-integration/drone/push Build is passing Details
2024-03-19 00:01:27 -04:00
shibao 96b05e8332 Make bar graph ignore gaps 2024-03-19 00:00:51 -04:00
shibao 557a2cac3d Improve login page autocomplete behavior
continuous-integration/drone/push Build is passing Details
2024-03-18 23:39:06 -04:00
shibao e16e04c114 combine imports
continuous-integration/drone/push Build is passing Details
2024-03-18 23:26:41 -04:00
shibao bbe4d82303 Use bar graph instead of line graph 2024-03-18 23:26:32 -04:00
shibao c69d7843ab fix layout issues
continuous-integration/drone/push Build is passing Details
2024-02-23 23:34:04 -05:00
shibao c18f59050c fix missing ssl and crypto packages
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-02-23 21:57:25 -05:00
shibao 67d688fc1e create italian gettext
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/tag Build is failing Details
2024-02-23 21:22:51 -05:00
Weblate 28e5fa56c3 Added translation using Weblate (Italian) 2024-02-23 21:21:42 -05:00
Weblate e301d3dd17 Added translation using Weblate (Italian) 2024-02-23 21:21:42 -05:00
Weblate 4881cf6edb Added translation using Weblate (Italian) 2024-02-23 21:21:42 -05:00
Weblate 6b61c45889 Added translation using Weblate (Italian) 2024-02-23 21:21:42 -05:00
Weblate 4a674a0504 Added translation using Weblate (Italian) 2024-02-23 21:21:42 -05:00
shibao 7e6959fb3b Added translation using Weblate (Italian) 2024-02-23 21:21:42 -05:00
shibao 22f13b0c57 make ammo packs in containers directly navigable in table view 2024-02-23 21:20:32 -05:00
shibao 31024dcc0d fix test mode warning 2024-02-23 21:16:46 -05:00
shibao e843014502 fix credo check for is_admin? 2024-02-23 21:13:34 -05:00
shibao 5d146ce6af fix credo check for is_already_admin? 2024-02-23 21:13:23 -05:00
shibao 27cda3733e update elixir deps 2024-02-23 21:12:11 -05:00
shibao 1965ecba32 bump version 2024-02-23 21:04:25 -05:00
shibao 69e40c6d18 update elixir deps 2024-02-23 21:04:25 -05:00
shibao 34b4b24e67 update npm deps 2024-02-23 21:04:25 -05:00
shibao 7ebed8d4c0 update tool versions 2024-02-23 21:04:25 -05:00
shibao b5619b8606 run mix format
continuous-integration/drone/push Build is passing Details
2023-09-07 19:15:07 -04:00
shibao ef28de53a1 update hex dependencies 2023-09-07 19:11:57 -04:00
shibao fcd5dbc605 bump version
continuous-integration/drone/push Build is failing Details
2023-09-07 19:07:56 -04:00
shibao 7738e68292 run npm audit fix --force 2023-09-07 19:06:56 -04:00
shibao df645a6188 update node packages 2023-09-07 19:06:21 -04:00
shibao bed4fbaf54 update dependencies 2023-09-07 19:05:35 -04:00
shibao f94ef0a2ca fix range page title
continuous-integration/drone/push Build is passing Details
2023-06-05 23:36:25 -04:00
shibao 7cdb8af690 update dependencies 2023-06-05 23:32:52 -04:00
shibao 52c4ab45d5 fix class filter helper functions
continuous-integration/drone/push Build is passing Details
2023-06-05 23:17:43 -04:00
shibao a35f43d6df rename Ammo.get_average_cost and Ammo.get_historical_count 2023-06-05 23:17:43 -04:00
shibao 9edeb1e803 improve Ammo.get_grouped_round_count 2023-06-05 23:17:43 -04:00
shibao 7e55446b3e improve ActivityLog.list_shot_records 2023-06-05 23:17:43 -04:00
shibao 9643e9f46d improve Ammo.get_round_count 2023-06-05 23:17:39 -04:00
shibao 8466fcd1f9 improve ActivityLog.get_grouped_used_counts 2023-06-05 23:16:47 -04:00
shibao e713a2e108 improve ActivityLog.get_used_count 2023-06-05 23:16:00 -04:00
shibao a8fa321040 use sr for shot record in sql 2023-06-05 23:16:00 -04:00
shibao f0536f3030 improve Ammo.get_grouped_packs_count 2023-06-05 23:15:57 -04:00
shibao a94d2eebf4 improve Ammo.get_packs_count 2023-06-05 23:06:28 -04:00
shibao cfc56519f5 fix user registration controller 2023-06-04 00:07:31 -04:00
shibao e80c2018be improve Ammo.list_packs 2023-06-04 00:00:51 -04:00
shibao 71fdd42d96 improve Ammo.list_types 2023-06-03 20:14:20 -04:00
shibao 8e99a57994 improve Containers.list_containers 2023-06-03 20:12:06 -04:00
shibao 7c42dd8a3a improve Containers.list_tags 2023-06-03 19:54:51 -04:00
shibao 79c97d7502 fix error/404 pages not rendering properly 2023-05-12 22:59:53 -04:00
shibao 2e488fa26c fix ammo type sql naming issues 2023-05-12 22:22:46 -04:00
shibao 2179bd5d86 fix table component ids 2023-05-12 21:55:59 -04:00
shibao 49628cb9bb pattern match on user struct in more cases 2023-05-12 21:48:19 -04:00
shibao 8a58d53dc1 fix pack sql naming issues 2023-05-12 21:48:04 -04:00
82 changed files with 9185 additions and 15557 deletions

View File

@ -17,7 +17,7 @@ steps:
- .mix
- name: test
image: elixir:1.14.4-alpine
image: elixir:1.16.1-alpine
environment:
TEST_DATABASE_URL: ecto://postgres:postgres@database/cannery_test
HOST: testing.example.tld

View File

@ -1,3 +1,3 @@
elixir 1.14.4-otp-25
erlang 25.3
nodejs 18.15.0
elixir 1.16.1-otp-26
erlang 26.2.2
nodejs 21.6.2

View File

@ -1,3 +1,28 @@
# v0.9.9
- Actually fix bar graph
# v0.9.8
- Make bar graph ignore empty days
- Update dependencies
# v0.9.7
- Fix margin on bottom of page
- Use bar graph instead of line graph
- Improve login page autocomplete behavior
# v0.9.6
- Make ammo packs in containers directly navigable in table view
- Update dependencies
# v0.9.5
- Update dependencies
# v0.9.4
- Code quality fixes
- Fix error/404 pages not rendering properly
- Update dependencies
- Fix Range page title
# v0.9.3
- Update dependencies
- Add pack lot number to search

View File

@ -1,4 +1,4 @@
FROM elixir:1.14.4-alpine AS build
FROM elixir:1.16.1-alpine AS build
# install build dependencies
RUN apk add --no-cache build-base npm git python3
@ -37,7 +37,7 @@ RUN mix do compile, release
FROM alpine:latest AS app
RUN apk upgrade --no-cache && \
apk add --no-cache bash openssl libssl1.1 libcrypto1.1 libgcc libstdc++ ncurses-libs
apk add --no-cache bash openssl libssl3 libcrypto3 libgcc libstdc++ ncurses-libs
WORKDIR /app

View File

@ -1,13 +1,12 @@
import { Chart, Title, Tooltip, Legend, LineController, LineElement, PointElement, TimeScale, LinearScale } from 'chart.js'
import Chart from 'chart.js/auto'
import 'chartjs-adapter-date-fns'
Chart.register(Title, Tooltip, Legend, LineController, LineElement, PointElement, TimeScale, LinearScale)
export default {
initalizeChart (el) {
const data = JSON.parse(el.dataset.chartData)
this.el.chart = new Chart(el, {
type: 'line',
type: 'bar',
data: {
datasets: [{
label: el.dataset.label,
@ -51,13 +50,17 @@ export default {
stacked: true,
grace: '15%',
ticks: {
padding: 15
padding: 15,
precision: 0
}
},
x: {
type: 'time',
type: 'timeseries',
time: {
unit: 'day'
},
ticks: {
source: 'data'
}
}
},

18856
assets/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -3,8 +3,8 @@
"description": " ",
"license": "MIT",
"engines": {
"node": "v18.15.0",
"npm": "9.5.0"
"node": "v21.6.2",
"npm": "10.2.4"
},
"scripts": {
"deploy": "NODE_ENV=production webpack --mode production",
@ -13,37 +13,37 @@
"test": "standard"
},
"dependencies": {
"@fortawesome/fontawesome-free": "^6.4.0",
"chart.js": "^4.2.1",
"@fortawesome/fontawesome-free": "^6.5.1",
"chart.js": "^4.4.1",
"chartjs-adapter-date-fns": "^3.0.0",
"date-fns": "^2.29.3",
"date-fns": "^3.3.1",
"phoenix": "file:../deps/phoenix",
"phoenix_html": "file:../deps/phoenix_html",
"phoenix_live_view": "file:../deps/phoenix_live_view",
"topbar": "^2.0.1"
"topbar": "^2.0.2"
},
"devDependencies": {
"@babel/core": "^7.21.4",
"@babel/preset-env": "^7.21.4",
"autoprefixer": "^10.4.14",
"babel-loader": "^9.1.2",
"copy-webpack-plugin": "^11.0.0",
"css-loader": "^6.7.3",
"css-minimizer-webpack-plugin": "^5.0.0",
"@babel/core": "^7.23.9",
"@babel/preset-env": "^7.23.9",
"autoprefixer": "^10.4.17",
"babel-loader": "^9.1.3",
"copy-webpack-plugin": "^12.0.2",
"css-loader": "^6.10.0",
"css-minimizer-webpack-plugin": "^6.0.0",
"file-loader": "^6.2.0",
"mini-css-extract-plugin": "^2.7.5",
"npm-check-updates": "^16.10.8",
"postcss": "^8.4.21",
"postcss-import": "^15.1.0",
"postcss-loader": "^7.2.4",
"postcss-preset-env": "^8.3.1",
"sass": "^1.62.0",
"sass-loader": "^13.2.2",
"standard": "^17.0.0",
"tailwindcss": "^3.3.1",
"terser-webpack-plugin": "^5.3.7",
"webpack": "^5.79.0",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.13.2"
"mini-css-extract-plugin": "^2.8.0",
"npm-check-updates": "^16.14.15",
"postcss": "^8.4.35",
"postcss-import": "^16.0.1",
"postcss-loader": "^8.1.0",
"postcss-preset-env": "^9.4.0",
"sass": "^1.71.1",
"sass-loader": "^14.1.1",
"standard": "^17.1.0",
"tailwindcss": "^3.4.1",
"terser-webpack-plugin": "^5.3.10",
"webpack": "^5.90.3",
"webpack-cli": "^5.1.4",
"webpack-dev-server": "^5.0.2"
}
}

View File

@ -18,7 +18,10 @@ config :cannery, CanneryWeb.Endpoint,
url: [scheme: "https", host: System.get_env("HOST") || "localhost", port: "443"],
http: [port: String.to_integer(System.get_env("PORT") || "4000")],
secret_key_base: "KH59P0iZixX5gP/u+zkxxG8vAAj6vgt0YqnwEB5JP5K+E567SsqkCz69uWShjE7I",
render_errors: [view: CanneryWeb.ErrorView, accepts: ~w(html json), layout: false],
render_errors: [
formats: [html: CanneryWeb.ErrorHTML, json: CanneryWeb.ErrorJSON],
layout: false
],
pubsub_server: Cannery.PubSub,
live_view: [signing_salt: "zOLgd3lr"]

View File

@ -26,7 +26,7 @@ config :cannery, Cannery.Mailer, adapter: Swoosh.Adapters.Test
config :cannery, Cannery.Accounts, registration: "public"
# Print only warnings and errors during test
config :logger, level: :warn
config :logger, level: :warning
# Initialize plugs at runtime for faster test compilation
config :phoenix, :plug_init_mode, :runtime

View File

@ -404,15 +404,15 @@ defmodule Cannery.Accounts do
## Examples
iex> is_admin?(%User{role: :admin})
iex> admin?(%User{role: :admin})
true
iex> is_admin?(%User{})
iex> admin?(%User{})
false
"""
@spec is_admin?(User.t()) :: boolean()
def is_admin?(%User{id: user_id}) do
@spec admin?(User.t()) :: boolean()
def admin?(%User{id: user_id}) do
Repo.exists?(from u in User, where: u.id == ^user_id, where: u.role == :admin)
end
@ -421,16 +421,16 @@ defmodule Cannery.Accounts do
## Examples
iex> is_already_admin?(%User{role: :admin})
iex> already_admin?(%User{role: :admin})
true
iex> is_already_admin?(%User{})
iex> already_admin?(%User{})
false
"""
@spec is_already_admin?(User.t() | nil) :: boolean()
def is_already_admin?(%User{role: :admin}), do: true
def is_already_admin?(_invalid_user), do: false
@spec already_admin?(User.t() | nil) :: boolean()
def already_admin?(%User{role: :admin}), do: true
def already_admin?(_invalid_user), do: false
## Confirmation

View File

@ -8,38 +8,49 @@ defmodule Cannery.ActivityLog do
alias Cannery.{Accounts.User, ActivityLog.ShotRecord, Repo}
alias Ecto.{Multi, Queryable}
@type list_shot_records_option ::
{:search, String.t() | nil}
| {:class, Type.class() | :all | nil}
| {:pack_id, Pack.id() | nil}
@type list_shot_records_options :: [list_shot_records_option()]
@doc """
Returns the list of shot_records.
## Examples
iex> list_shot_records(:all, %User{id: 123})
iex> list_shot_records(%User{id: 123})
[%ShotRecord{}, ...]
iex> list_shot_records("cool", :all, %User{id: 123})
iex> list_shot_records(%User{id: 123}, search: "cool")
[%ShotRecord{notes: "My cool shot record"}, ...]
iex> list_shot_records("cool", :rifle, %User{id: 123})
iex> list_shot_records(%User{id: 123}, search: "cool", class: :rifle)
[%ShotRecord{notes: "Shot some rifle rounds"}, ...]
iex> list_shot_records(%User{id: 123}, pack_id: 456)
[%ShotRecord{pack_id: 456}, ...]
"""
@spec list_shot_records(Type.class() | :all, User.t()) :: [ShotRecord.t()]
@spec list_shot_records(search :: nil | String.t(), Type.class() | :all, User.t()) ::
[ShotRecord.t()]
def list_shot_records(search \\ nil, type, %{id: user_id}) do
from(sg in ShotRecord,
as: :sg,
left_join: ag in Pack,
as: :ag,
on: sg.pack_id == ag.id,
left_join: at in Type,
as: :at,
on: ag.type_id == at.id,
where: sg.user_id == ^user_id,
distinct: sg.id
@spec list_shot_records(User.t()) :: [ShotRecord.t()]
@spec list_shot_records(User.t(), list_shot_records_options()) :: [ShotRecord.t()]
def list_shot_records(%User{id: user_id}, opts \\ []) do
from(sr in ShotRecord,
as: :sr,
left_join: p in Pack,
as: :p,
on: sr.pack_id == p.id,
on: p.user_id == ^user_id,
left_join: t in Type,
as: :t,
on: p.type_id == t.id,
on: t.user_id == ^user_id,
where: sr.user_id == ^user_id,
distinct: sr.id
)
|> list_shot_records_search(search)
|> list_shot_records_filter_type(type)
|> list_shot_records_search(Keyword.get(opts, :search))
|> list_shot_records_class(Keyword.get(opts, :class))
|> list_shot_records_pack_id(Keyword.get(opts, :pack_id))
|> Repo.all()
end
@ -52,45 +63,44 @@ defmodule Cannery.ActivityLog do
query
|> where(
[sg: sg, ag: ag, at: at],
[sr: sr, p: p, t: t],
fragment(
"? @@ websearch_to_tsquery('english', ?)",
sg.search,
sr.search,
^trimmed_search
) or
fragment(
"? @@ websearch_to_tsquery('english', ?)",
ag.search,
p.search,
^trimmed_search
) or
fragment(
"? @@ websearch_to_tsquery('english', ?)",
at.search,
t.search,
^trimmed_search
)
)
|> order_by([sg: sg], {
|> order_by([sr: sr], {
:desc,
fragment(
"ts_rank_cd(?, websearch_to_tsquery('english', ?), 4)",
sg.search,
sr.search,
^trimmed_search
)
})
end
@spec list_shot_records_filter_type(Queryable.t(), Type.class() | :all) ::
Queryable.t()
defp list_shot_records_filter_type(query, :rifle),
do: query |> where([at: at], at.class == :rifle)
@spec list_shot_records_class(Queryable.t(), Type.class() | :all | nil) :: Queryable.t()
defp list_shot_records_class(query, class) when class in [:rifle, :pistol, :shotgun],
do: query |> where([t: t], t.class == ^class)
defp list_shot_records_filter_type(query, :pistol),
do: query |> where([at: at], at.class == :pistol)
defp list_shot_records_class(query, _all), do: query
defp list_shot_records_filter_type(query, :shotgun),
do: query |> where([at: at], at.class == :shotgun)
@spec list_shot_records_pack_id(Queryable.t(), Pack.id() | nil) :: Queryable.t()
defp list_shot_records_pack_id(query, pack_id) when pack_id |> is_binary(),
do: query |> where([sr: sr], sr.pack_id == ^pack_id)
defp list_shot_records_filter_type(query, _all), do: query
defp list_shot_records_pack_id(query, _all), do: query
@doc """
Returns a count of shot records.
@ -104,25 +114,13 @@ defmodule Cannery.ActivityLog do
@spec get_shot_record_count!(User.t()) :: integer()
def get_shot_record_count!(%User{id: user_id}) do
Repo.one(
from sg in ShotRecord,
where: sg.user_id == ^user_id,
select: count(sg.id),
from sr in ShotRecord,
where: sr.user_id == ^user_id,
select: count(sr.id),
distinct: true
) || 0
end
@spec list_shot_records_for_pack(Pack.t(), User.t()) :: [ShotRecord.t()]
def list_shot_records_for_pack(
%Pack{id: pack_id, user_id: user_id},
%User{id: user_id}
) do
Repo.all(
from sg in ShotRecord,
where: sg.pack_id == ^pack_id,
where: sg.user_id == ^user_id
)
end
@doc """
Gets a single shot_record.
@ -140,10 +138,10 @@ defmodule Cannery.ActivityLog do
@spec get_shot_record!(ShotRecord.id(), User.t()) :: ShotRecord.t()
def get_shot_record!(id, %User{id: user_id}) do
Repo.one!(
from sg in ShotRecord,
where: sg.id == ^id,
where: sg.user_id == ^user_id,
order_by: sg.date
from sr in ShotRecord,
where: sr.id == ^id,
where: sr.user_id == ^user_id,
order_by: sr.date
)
end
@ -172,9 +170,9 @@ defmodule Cannery.ActivityLog do
fn _repo, %{create_shot_record: %{pack_id: pack_id, user_id: user_id}} ->
pack =
Repo.one(
from ag in Pack,
where: ag.id == ^pack_id,
where: ag.user_id == ^user_id
from p in Pack,
where: p.id == ^pack_id,
where: p.user_id == ^user_id
)
{:ok, pack}
@ -221,7 +219,7 @@ defmodule Cannery.ActivityLog do
|> Multi.run(
:pack,
fn repo, %{update_shot_record: %{pack_id: pack_id, user_id: user_id}} ->
{:ok, repo.one(from ag in Pack, where: ag.id == ^pack_id and ag.user_id == ^user_id)}
{:ok, repo.one(from p in Pack, where: p.id == ^pack_id and p.user_id == ^user_id)}
end
)
|> Multi.update(
@ -266,7 +264,7 @@ defmodule Cannery.ActivityLog do
|> Multi.run(
:pack,
fn repo, %{delete_shot_record: %{pack_id: pack_id, user_id: user_id}} ->
{:ok, repo.one(from ag in Pack, where: ag.id == ^pack_id and ag.user_id == ^user_id)}
{:ok, repo.one(from p in Pack, where: p.id == ^pack_id and p.user_id == ^user_id)}
end
)
|> Multi.update(
@ -287,36 +285,6 @@ defmodule Cannery.ActivityLog do
end
end
@doc """
Returns the number of shot rounds for a pack
"""
@spec get_used_count(Pack.t(), User.t()) :: non_neg_integer()
def get_used_count(%Pack{id: pack_id} = pack, user) do
[pack]
|> get_used_counts(user)
|> Map.get(pack_id, 0)
end
@doc """
Returns the number of shot rounds for multiple packs
"""
@spec get_used_counts([Pack.t()], User.t()) ::
%{optional(Pack.id()) => non_neg_integer()}
def get_used_counts(packs, %User{id: user_id}) do
pack_ids =
packs
|> Enum.map(fn %{id: pack_id} -> pack_id end)
Repo.all(
from sg in ShotRecord,
where: sg.pack_id in ^pack_ids,
where: sg.user_id == ^user_id,
group_by: sg.pack_id,
select: {sg.pack_id, sum(sg.count)}
)
|> Map.new()
end
@doc """
Returns the last entered shot record date for a pack
"""
@ -337,15 +305,18 @@ defmodule Cannery.ActivityLog do
|> Enum.map(fn %Pack{id: pack_id, user_id: ^user_id} -> pack_id end)
Repo.all(
from sg in ShotRecord,
where: sg.pack_id in ^pack_ids,
where: sg.user_id == ^user_id,
group_by: sg.pack_id,
select: {sg.pack_id, max(sg.date)}
from sr in ShotRecord,
where: sr.pack_id in ^pack_ids,
where: sr.user_id == ^user_id,
group_by: sr.pack_id,
select: {sr.pack_id, max(sr.date)}
)
|> Map.new()
end
@type get_used_count_option :: {:pack_id, Pack.id() | nil} | {:type_id, Type.id() | nil}
@type get_used_count_options :: [get_used_count_option()]
@doc """
Gets the total number of rounds shot for a type
@ -353,45 +324,116 @@ defmodule Cannery.ActivityLog do
## Examples
iex> get_used_count_for_type(123, %User{id: 123})
iex> get_used_count(%User{id: 123}, type_id: 123)
35
iex> get_used_count_for_type(456, %User{id: 123})
** (Ecto.NoResultsError)
iex> get_used_count(%User{id: 123}, pack_id: 456)
50
"""
@spec get_used_count_for_type(Type.t(), User.t()) :: non_neg_integer()
def get_used_count_for_type(%Type{id: type_id} = type, user) do
[type]
|> get_used_count_for_types(user)
|> Map.get(type_id, 0)
@spec get_used_count(User.t(), get_used_count_options()) :: non_neg_integer()
def get_used_count(%User{id: user_id}, opts) do
from(sr in ShotRecord,
as: :sr,
left_join: p in Pack,
on: sr.pack_id == p.id,
on: p.user_id == ^user_id,
as: :p,
where: sr.user_id == ^user_id,
where: not (sr.count |> is_nil()),
select: sum(sr.count),
distinct: true
)
|> get_used_count_type_id(Keyword.get(opts, :type_id))
|> get_used_count_pack_id(Keyword.get(opts, :pack_id))
|> Repo.one() || 0
end
@spec get_used_count_pack_id(Queryable.t(), Pack.id() | nil) :: Queryable.t()
defp get_used_count_pack_id(query, pack_id) when pack_id |> is_binary() do
query |> where([sr: sr], sr.pack_id == ^pack_id)
end
defp get_used_count_pack_id(query, _nil), do: query
@spec get_used_count_type_id(Queryable.t(), Type.id() | nil) :: Queryable.t()
defp get_used_count_type_id(query, type_id) when type_id |> is_binary() do
query |> where([p: p], p.type_id == ^type_id)
end
defp get_used_count_type_id(query, _nil), do: query
@type get_grouped_used_counts_option ::
{:packs, [Pack.t()] | nil}
| {:types, [Type.t()] | nil}
| {:group_by, :type_id | :pack_id}
@type get_grouped_used_counts_options :: [get_grouped_used_counts_option()]
@doc """
Gets the total number of rounds shot for multiple types
Gets the total number of rounds shot for multiple types or packs
## Examples
iex> get_used_count_for_types(123, %User{id: 123})
iex> get_grouped_used_counts(
...> %User{id: 123},
...> group_by: :type_id,
...> types: [%Type{id: 456, user_id: 123}]
...> )
35
"""
@spec get_used_count_for_types([Type.t()], User.t()) ::
%{optional(Type.id()) => non_neg_integer()}
def get_used_count_for_types(types, %User{id: user_id}) do
type_ids =
types
|> Enum.map(fn %Type{id: type_id, user_id: ^user_id} -> type_id end)
iex> get_grouped_used_counts(
...> %User{id: 123},
...> group_by: :pack_id,
...> packs: [%Pack{id: 456, user_id: 123}]
...> )
22
Repo.all(
from ag in Pack,
left_join: sg in ShotRecord,
on: ag.id == sg.pack_id,
where: ag.type_id in ^type_ids,
where: not (sg.count |> is_nil()),
group_by: ag.type_id,
select: {ag.type_id, sum(sg.count)}
"""
@spec get_grouped_used_counts(User.t(), get_grouped_used_counts_options()) ::
%{optional(Type.id() | Pack.id()) => non_neg_integer()}
def get_grouped_used_counts(%User{id: user_id}, opts) do
from(p in Pack,
as: :p,
left_join: sr in ShotRecord,
on: p.id == sr.pack_id,
on: p.user_id == ^user_id,
as: :sr,
where: sr.user_id == ^user_id,
where: not (sr.count |> is_nil())
)
|> get_grouped_used_counts_group_by(Keyword.fetch!(opts, :group_by))
|> get_grouped_used_counts_types(Keyword.get(opts, :types))
|> get_grouped_used_counts_packs(Keyword.get(opts, :packs))
|> Repo.all()
|> Map.new()
end
@spec get_grouped_used_counts_group_by(Queryable.t(), :type_id | :pack_id) :: Queryable.t()
defp get_grouped_used_counts_group_by(query, :type_id) do
query
|> group_by([p: p], p.type_id)
|> select([sr: sr, p: p], {p.type_id, sum(sr.count)})
end
defp get_grouped_used_counts_group_by(query, :pack_id) do
query
|> group_by([sr: sr], sr.pack_id)
|> select([sr: sr], {sr.pack_id, sum(sr.count)})
end
@spec get_grouped_used_counts_types(Queryable.t(), [Type.t()] | nil) :: Queryable.t()
defp get_grouped_used_counts_types(query, types) when types |> is_list() do
type_ids = types |> Enum.map(fn %Type{id: type_id} -> type_id end)
query |> where([p: p], p.type_id in ^type_ids)
end
defp get_grouped_used_counts_types(query, _nil), do: query
@spec get_grouped_used_counts_packs(Queryable.t(), [Pack.t()] | nil) :: Queryable.t()
defp get_grouped_used_counts_packs(query, packs) when packs |> is_list() do
pack_ids = packs |> Enum.map(fn %Pack{id: pack_id} -> pack_id end)
query |> where([p: p], p.id in ^pack_ids)
end
defp get_grouped_used_counts_packs(query, _nil), do: query
end

File diff suppressed because it is too large Load Diff

View File

@ -7,10 +7,13 @@ defmodule Cannery.Containers do
import Ecto.Query, warn: false
alias Cannery.{Accounts.User, Ammo.Pack, Repo}
alias Cannery.Containers.{Container, ContainerTag, Tag}
alias Ecto.Changeset
alias Ecto.{Changeset, Queryable}
@container_preloads [:tags]
@type list_containers_option :: {:search, String.t() | nil}
@type list_containers_options :: [list_containers_option()]
@doc """
Returns the list of containers.
@ -19,30 +22,31 @@ defmodule Cannery.Containers do
iex> list_containers(%User{id: 123})
[%Container{}, ...]
iex> list_containers("cool", %User{id: 123})
iex> list_containers(%User{id: 123}, search: "cool")
[%Container{name: "my cool container"}, ...]
"""
@spec list_containers(User.t()) :: [Container.t()]
@spec list_containers(search :: nil | String.t(), User.t()) :: [Container.t()]
def list_containers(search \\ nil, %User{id: user_id}) do
@spec list_containers(User.t(), list_containers_options()) :: [Container.t()]
def list_containers(%User{id: user_id}, opts \\ []) do
from(c in Container,
as: :c,
left_join: t in assoc(c, :tags),
on: c.user_id == t.user_id,
as: :t,
where: c.user_id == ^user_id,
order_by: c.name,
distinct: c.id,
preload: ^@container_preloads
)
|> list_containers_search(search)
|> list_containers_search(Keyword.get(opts, :search))
|> Repo.all()
end
defp list_containers_search(query, nil), do: query
defp list_containers_search(query, ""), do: query
@spec list_containers_search(Queryable.t(), search :: String.t() | nil) :: Queryable.t()
defp list_containers_search(query, search) when search in ["", nil],
do: query |> order_by([c: c], c.name)
defp list_containers_search(query, search) do
defp list_containers_search(query, search) when search |> is_binary() do
trimmed_search = String.trim(search)
query
@ -203,9 +207,9 @@ defmodule Cannery.Containers do
{:ok, Container.t()} | {:error, Container.changeset()}
def delete_container(%Container{user_id: user_id} = container, %User{id: user_id}) do
Repo.one(
from ag in Pack,
where: ag.container_id == ^container.id,
select: count(ag.id)
from p in Pack,
where: p.container_id == ^container.id,
select: count(p.id)
)
|> case do
0 ->
@ -289,6 +293,9 @@ defmodule Cannery.Containers do
# Container Tags
@type list_tags_option :: {:search, String.t() | nil}
@type list_tags_options :: [list_tags_option()]
@doc """
Returns the list of tags.
@ -297,38 +304,42 @@ defmodule Cannery.Containers do
iex> list_tags(%User{id: 123})
[%Tag{}, ...]
iex> list_tags("cool", %User{id: 123})
iex> list_tags(%User{id: 123}, search: "cool")
[%Tag{name: "my cool tag"}, ...]
"""
@spec list_tags(User.t()) :: [Tag.t()]
@spec list_tags(search :: nil | String.t(), User.t()) :: [Tag.t()]
def list_tags(search \\ nil, user)
@spec list_tags(User.t(), list_tags_options()) :: [Tag.t()]
def list_tags(%User{id: user_id}, opts \\ []) do
from(t in Tag, as: :t, where: t.user_id == ^user_id)
|> list_tags_search(Keyword.get(opts, :search))
|> Repo.all()
end
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)
@spec list_tags_search(Queryable.t(), search :: String.t() | nil) :: Queryable.t()
defp list_tags_search(query, search) when search in ["", nil],
do: query |> order_by([t: t], t.name)
def list_tags(search, %{id: user_id}) when search |> is_binary() do
defp list_tags_search(query, search) when search |> is_binary() do
trimmed_search = String.trim(search)
Repo.all(
from t in Tag,
where: t.user_id == ^user_id,
where:
fragment(
"? @@ websearch_to_tsquery('english', ?)",
t.search,
^trimmed_search
),
order_by: {
:desc,
fragment(
"ts_rank_cd(?, websearch_to_tsquery('english', ?), 4)",
t.search,
^trimmed_search
)
}
query
|> where(
[t: t],
fragment(
"? @@ websearch_to_tsquery('english', ?)",
t.search,
^trimmed_search
)
)
|> order_by([t: t], {
:desc,
fragment(
"ts_rank_cd(?, websearch_to_tsquery('english', ?), 4)",
t.search,
^trimmed_search
)
})
end
@doc """

View File

@ -69,6 +69,7 @@ defmodule CanneryWeb do
def html do
quote do
# credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse
use Phoenix.Component
# Import convenience functions from controllers
@ -82,11 +83,8 @@ defmodule CanneryWeb do
defp html_helpers do
quote do
# credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse
use Phoenix.HTML
# credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse
import Phoenix.Component
use PhoenixHTMLHelpers
import Phoenix.{Component, HTML, HTML.Form}
import CanneryWeb.{ErrorHelpers, Gettext, CoreComponents, HTMLHelpers}
# Shortcut for generating JS commands

View File

@ -71,8 +71,16 @@ defmodule CanneryWeb.Components.ContainerTableComponent do
current_user: current_user,
tag_actions: tag_actions,
actions: actions,
pack_count: Ammo.get_packs_count_for_containers(containers, current_user),
round_count: Ammo.get_round_count_for_containers(containers, current_user)
pack_count:
Ammo.get_grouped_packs_count(current_user,
containers: containers,
group_by: :container_id
),
round_count:
Ammo.get_grouped_round_count(current_user,
containers: containers,
group_by: :container_id
)
}
rows =

View File

@ -27,15 +27,15 @@
<%= @container.location %>
</span>
<%= if @container |> Ammo.get_packs_count_for_container!(@current_user) != 0 do %>
<%= if Ammo.get_packs_count(@current_user, container_id: @container.id) != 0 do %>
<span class="rounded-lg title text-lg">
<%= gettext("Packs:") %>
<%= @container |> Ammo.get_packs_count_for_container!(@current_user) %>
<%= Ammo.get_packs_count(@current_user, container_id: @container.id) %>
</span>
<span class="rounded-lg title text-lg">
<%= gettext("Rounds:") %>
<%= @container |> Ammo.get_round_count_for_container!(@current_user) %>
<%= Ammo.get_round_count(@current_user, container_id: @container.id) %>
</span>
<% end %>

View File

@ -48,7 +48,7 @@
<%= gettext("Range") %>
</.link>
</li>
<li :if={@current_user |> Accounts.is_already_admin?()} class="mx-2 my-1">
<li :if={@current_user |> Accounts.already_admin?()} class="mx-2 my-1">
<.link navigate={~p"/invites"} class="text-white hover:underline">
<%= gettext("Invites") %>
</.link>
@ -70,7 +70,7 @@
</li>
<li
:if={
@current_user |> Accounts.is_already_admin?() and
@current_user |> Accounts.already_admin?() and
function_exported?(Routes, :live_dashboard_path, 2)
}
class="mx-2 my-1"

View File

@ -1,18 +1,45 @@
<main role="main" class="min-h-full min-w-full">
<main class="pb-8 min-w-full">
<header>
<.topbar current_user={assigns[:current_user]} />
<div class="mx-8 my-2 flex flex-col space-y-4 text-center">
<p :if={@flash["info"]} class="alert alert-info" role="alert">
<%= @flash["info"] %>
<p
:if={@flash && @flash |> Map.has_key?("info")}
class="alert alert-info"
role="alert"
phx-click="lv:clear-flash"
phx-value-key="info"
>
<%= live_flash(@flash, "info") %>
</p>
<p :if={@flash["error"]} class="alert alert-danger" role="alert">
<%= @flash["error"] %>
<p
:if={@flash && @flash |> Map.has_key?("error")}
class="alert alert-danger"
role="alert"
phx-click="lv:clear-flash"
phx-value-key="error"
>
<%= live_flash(@flash, "error") %>
</p>
</div>
</header>
<div class="mx-4 sm:mx-8 md:mx-16">
<div class="mx-4 sm:mx-8 md:mx-16 flex flex-col justify-center items-stretch">
<%= @inner_content %>
</div>
</main>
<div
id="disconnect"
class="z-50 fixed opacity-0 bottom-12 right-12 px-8 py-4 w-max h-max
border border-primary-200 shadow-lg rounded-lg bg-white
flex justify-center items-center space-x-4
transition-opacity ease-in-out duration-500 delay-[2000ms]"
>
<i class="fas fa-fade text-md fa-satellite-dish"></i>
<h1 class="title text-md title-primary-500">
<%= gettext("Reconnecting...") %>
</h1>
</div>

View File

@ -0,0 +1 @@
<%= @inner_block %>

View File

@ -1,45 +0,0 @@
<main class="pb-8 min-w-full">
<header>
<.topbar current_user={assigns[:current_user]} />
<div class="mx-8 my-2 flex flex-col space-y-4 text-center">
<p
:if={@flash && @flash |> Map.has_key?("info")}
class="alert alert-info"
role="alert"
phx-click="lv:clear-flash"
phx-value-key="info"
>
<%= live_flash(@flash, "info") %>
</p>
<p
:if={@flash && @flash |> Map.has_key?("error")}
class="alert alert-danger"
role="alert"
phx-click="lv:clear-flash"
phx-value-key="error"
>
<%= live_flash(@flash, "error") %>
</p>
</div>
</header>
<div class="mx-4 sm:mx-8 md:mx-16 flex flex-col justify-center items-stretch">
<%= @inner_content %>
</div>
</main>
<div
id="disconnect"
class="z-50 fixed opacity-0 bottom-12 right-12 px-8 py-4 w-max h-max
border border-primary-200 shadow-lg rounded-lg bg-white
flex justify-center items-center space-x-4
transition-opacity ease-in-out duration-500 delay-[2000ms]"
>
<i class="fas fa-fade text-md fa-satellite-dish"></i>
<h1 class="title text-md title-primary-500">
<%= gettext("Reconnecting...") %>
</h1>
</div>

View File

@ -89,7 +89,7 @@ defmodule CanneryWeb.Components.MovePackComponent do
<% else %>
<.live_component
module={CanneryWeb.Components.TableComponent}
id="move_pack_table"
id="move-pack-table"
columns={@columns}
rows={@rows}
/>

View File

@ -141,7 +141,12 @@ defmodule CanneryWeb.Components.PackTableComponent do
def render(assigns) do
~H"""
<div id={@id} class="w-full">
<.live_component module={TableComponent} id={"table-#{@id}"} columns={@columns} rows={@rows} />
<.live_component
module={TableComponent}
id={"pack-table-#{@id}"}
columns={@columns}
rows={@rows}
/>
</div>
"""
end

View File

@ -74,7 +74,7 @@ defmodule CanneryWeb.Components.ShotRecordTableComponent do
<div id={@id} class="w-full">
<.live_component
module={CanneryWeb.Components.TableComponent}
id={"table-#{@id}"}
id={"shot-record-table-#{@id}"}
columns={@columns}
rows={@rows}
initial_key={:date}

View File

@ -151,17 +151,25 @@ defmodule CanneryWeb.Components.TypeTableComponent do
)
|> TableComponent.maybe_compose_columns(%{label: gettext("Name"), key: :name, type: :name})
round_counts = types |> Ammo.get_round_count_for_types(current_user)
packs_count = types |> Ammo.get_packs_count_for_types(current_user)
average_costs = types |> Ammo.get_average_cost_for_types(current_user)
round_counts = Ammo.get_grouped_round_count(current_user, types: types, group_by: :type_id)
packs_count = Ammo.get_grouped_packs_count(current_user, types: types, group_by: :type_id)
average_costs = Ammo.get_average_costs(types, current_user)
[used_counts, historical_round_counts, historical_pack_counts, used_pack_counts] =
if show_used do
[
types |> ActivityLog.get_used_count_for_types(current_user),
types |> Ammo.get_historical_count_for_types(current_user),
types |> Ammo.get_packs_count_for_types(current_user, true),
types |> Ammo.get_used_packs_count_for_types(current_user)
ActivityLog.get_grouped_used_counts(current_user, types: types, group_by: :type_id),
Ammo.get_historical_counts(types, current_user),
Ammo.get_grouped_packs_count(current_user,
types: types,
group_by: :type_id,
show_used: true
),
Ammo.get_grouped_packs_count(current_user,
types: types,
group_by: :type_id,
show_used: :only_used
)
]
else
[nil, nil, nil, nil]
@ -192,7 +200,12 @@ defmodule CanneryWeb.Components.TypeTableComponent do
def render(assigns) do
~H"""
<div id={@id} class="w-full">
<.live_component module={TableComponent} id={"table-#{@id}"} columns={@columns} rows={@rows} />
<.live_component
module={TableComponent}
id={"type-table-#{@id}"}
columns={@columns}
rows={@rows}
/>
</div>
"""
end

View File

@ -3,14 +3,22 @@ defmodule CanneryWeb.ExportController do
alias Cannery.{ActivityLog, Ammo, Containers}
def export(%{assigns: %{current_user: current_user}} = conn, %{"mode" => "json"}) do
types = Ammo.list_types(current_user, :all)
used_counts = types |> ActivityLog.get_used_count_for_types(current_user)
round_counts = types |> Ammo.get_round_count_for_types(current_user)
pack_counts = types |> Ammo.get_packs_count_for_types(current_user)
types = Ammo.list_types(current_user)
total_pack_counts = types |> Ammo.get_packs_count_for_types(current_user, true)
used_counts =
ActivityLog.get_grouped_used_counts(current_user, types: types, group_by: :type_id)
average_costs = types |> Ammo.get_average_cost_for_types(current_user)
round_counts = Ammo.get_grouped_round_count(current_user, types: types, group_by: :type_id)
pack_counts = Ammo.get_grouped_packs_count(current_user, types: types, group_by: :type_id)
total_pack_counts =
Ammo.get_grouped_packs_count(current_user,
types: types,
group_by: :type_id,
show_used: true
)
average_costs = Ammo.get_average_costs(types, current_user)
types =
types
@ -27,8 +35,11 @@ defmodule CanneryWeb.ExportController do
})
end)
packs = Ammo.list_packs(nil, :all, current_user, true)
used_counts = packs |> ActivityLog.get_used_counts(current_user)
packs = Ammo.list_packs(current_user, show_used: true)
used_counts =
ActivityLog.get_grouped_used_counts(current_user, packs: packs, group_by: :pack_id)
original_counts = packs |> Ammo.get_original_counts(current_user)
cprs = packs |> Ammo.get_cprs(current_user)
percentages_remaining = packs |> Ammo.get_percentages_remaining(current_user)
@ -47,20 +58,17 @@ defmodule CanneryWeb.ExportController do
})
end)
shot_records = ActivityLog.list_shot_records(:all, current_user)
shot_records = ActivityLog.list_shot_records(current_user)
containers =
Containers.list_containers(current_user)
|> Enum.map(fn container ->
pack_count = container |> Ammo.get_packs_count_for_container!(current_user)
round_count = container |> Ammo.get_round_count_for_container!(current_user)
container
|> Jason.encode!()
|> Jason.decode!()
|> Map.merge(%{
"pack_count" => pack_count,
"round_count" => round_count
"pack_count" => Ammo.get_packs_count(current_user, container_id: container.id),
"round_count" => Ammo.get_round_count(current_user, container_id: container.id)
})
end)

View File

@ -71,7 +71,7 @@ defmodule CanneryWeb.UserRegistrationController do
|> redirect(to: ~p"/")
{:error, %Changeset{} = changeset} ->
conn |> render("new.html", changeset: changeset, invite_token: invite_token)
conn |> render(:new, changeset: changeset, invite_token: invite_token)
end
end
end

View File

@ -15,10 +15,18 @@
</p>
<%= label(f, :email, gettext("Email"), class: "title text-lg text-primary-600") %>
<%= email_input(f, :email, required: true, class: "input input-primary col-span-2") %>
<%= email_input(f, :email,
autocomplete: :email,
class: "input input-primary col-span-2",
required: true
) %>
<%= label(f, :password, gettext("Password"), class: "title text-lg text-primary-600") %>
<%= password_input(f, :password, required: true, class: "input input-primary col-span-2") %>
<%= password_input(f, :password,
autocomplete: "current-password",
class: "input input-primary col-span-2",
required: true
) %>
<%= label(f, :remember_me, gettext("Keep me logged in for 60 days"),
class: "title text-lg text-primary-600"

View File

@ -3,8 +3,8 @@ defmodule CanneryWeb.ErrorHelpers do
Conveniences for translating and building error messages.
"""
use Phoenix.HTML
import Phoenix.Component
use PhoenixHTMLHelpers
import Phoenix.{Component, HTML.Form}
alias Ecto.Changeset
alias Phoenix.{HTML.Form, LiveView.Rendered}
@ -65,7 +65,7 @@ defmodule CanneryWeb.ErrorHelpers do
changeset
|> changeset_error_map()
|> Enum.map_join(". ", fn {key, errors} ->
"#{key |> humanize()}: #{errors |> Enum.join(", ")}"
"#{key |> Phoenix.Naming.humanize()}: #{errors |> Enum.join(", ")}"
end)
end

View File

@ -113,6 +113,6 @@ defmodule CanneryWeb.ContainerLive.Index do
end
defp display_containers(%{assigns: %{search: search, current_user: current_user}} = socket) do
socket |> assign(:containers, Containers.list_containers(search, current_user))
socket |> assign(:containers, Containers.list_containers(current_user, search: search))
end
end

View File

@ -51,7 +51,7 @@
<%= if @view_table do %>
<.live_component
module={CanneryWeb.Components.ContainerTableComponent}
id="containers_index_table"
id="containers-index-table"
action={@live_action}
containers={@containers}
current_user={@current_user}

View File

@ -104,8 +104,10 @@ defmodule CanneryWeb.ContainerLive.Show do
id,
current_user
) do
%{name: container_name} = container = Containers.get_container!(id, current_user)
packs = Ammo.list_packs_for_container(container, class, current_user)
%{id: container_id, name: container_name} =
container = Containers.get_container!(id, current_user)
packs = Ammo.list_packs(current_user, container_id: container_id, class: class)
original_counts = packs |> Ammo.get_original_counts(current_user)
cprs = packs |> Ammo.get_cprs(current_user)
last_used_dates = packs |> ActivityLog.get_last_used_dates(current_user)
@ -120,8 +122,8 @@ defmodule CanneryWeb.ContainerLive.Show do
socket
|> assign(
container: container,
round_count: Ammo.get_round_count_for_container!(container, current_user),
packs_count: Ammo.get_packs_count_for_container!(container, current_user),
round_count: Ammo.get_round_count(current_user, container_id: container.id),
packs_count: Ammo.get_packs_count(current_user, container_id: container.id),
packs: packs,
original_counts: original_counts,
cprs: cprs,

View File

@ -120,7 +120,7 @@
<%= if @view_table do %>
<.live_component
module={CanneryWeb.Components.PackTableComponent}
id="type-show-table"
id="pack-show-table"
packs={@packs}
current_user={@current_user}
show_used={false}
@ -130,6 +130,21 @@
<%= type_name %>
</.link>
</:type>
<:actions :let={%{count: pack_count} = pack}>
<div class="py-2 px-4 h-full space-x-4 flex justify-center items-center">
<.link
navigate={~p"/ammo/show/#{pack}"}
class="text-primary-600 link"
aria-label={
dgettext("actions", "View pack of %{pack_count} bullets",
pack_count: pack_count
)
}
>
<i class="fa-fw fa-lg fas fa-eye"></i>
</.link>
</div>
</:actions>
</.live_component>
<% else %>
<div class="flex flex-wrap justify-center items-stretch">

View File

@ -26,7 +26,7 @@ defmodule CanneryWeb.PackLive.FormComponent do
socket =
socket
|> assign(:pack_create_limit, @pack_create_limit)
|> assign(:types, Ammo.list_types(current_user, :all))
|> assign(:types, Ammo.list_types(current_user))
|> assign_new(:containers, fn -> Containers.list_containers(current_user) end)
params =

View File

@ -148,8 +148,8 @@ defmodule CanneryWeb.PackLive.Index do
) do
# get total number of packs to determine whether to display onboarding
# prompts
packs_count = Ammo.get_packs_count!(current_user, true)
packs = Ammo.list_packs(search, class, current_user, show_used)
packs_count = Ammo.get_packs_count(current_user, show_used: true)
packs = Ammo.list_packs(current_user, search: search, class: class, show_used: show_used)
types_count = Ammo.get_types_count!(current_user)
containers_count = Containers.get_containers_count!(current_user)

View File

@ -145,7 +145,9 @@
navigate={~p"/ammo/show/#{pack}"}
class="text-primary-600 link"
aria-label={
dgettext("actions", "View pack of %{pack_count} bullets", pack_count: pack_count)
dgettext("actions", "View pack of %{pack_count} bullets",
pack_count: pack_count
)
}
>
<i class="fa-fw fa-lg fas fa-eye"></i>
@ -155,7 +157,9 @@
patch={~p"/ammo/edit/#{pack}"}
class="text-primary-600 link"
aria-label={
dgettext("actions", "Edit pack of %{pack_count} bullets", pack_count: pack_count)
dgettext("actions", "Edit pack of %{pack_count} bullets",
pack_count: pack_count
)
}
>
<i class="fa-fw fa-lg fas fa-edit"></i>

View File

@ -92,7 +92,7 @@ defmodule CanneryWeb.PackLive.Show do
%{label: gettext("Actions"), key: :actions, sortable: false}
]
shot_records = ActivityLog.list_shot_records_for_pack(pack, current_user)
shot_records = ActivityLog.list_shot_records(current_user, pack_id: pack.id)
rows =
shot_records

View File

@ -115,7 +115,7 @@
<.live_component
module={CanneryWeb.Components.TableComponent}
id="pack_shot_records_table"
id="pack-shot-records-table"
columns={@columns}
rows={@rows}
/>

View File

@ -44,7 +44,7 @@ defmodule CanneryWeb.RangeLive.Index do
defp apply_action(socket, :new, _params) do
socket
|> assign(
page_title: gettext("New Shot Records"),
page_title: gettext("Record Shots"),
shot_record: %ShotRecord{}
)
end
@ -52,7 +52,7 @@ defmodule CanneryWeb.RangeLive.Index do
defp apply_action(socket, :index, _params) do
socket
|> assign(
page_title: gettext("Shot Records"),
page_title: gettext("Range"),
search: nil,
shot_record: nil
)
@ -62,7 +62,7 @@ defmodule CanneryWeb.RangeLive.Index do
defp apply_action(socket, :search, %{"search" => search}) do
socket
|> assign(
page_title: gettext("Shot Records"),
page_title: gettext("Range"),
search: search,
shot_record: nil
)
@ -120,8 +120,8 @@ defmodule CanneryWeb.RangeLive.Index do
defp display_shot_records(
%{assigns: %{class: class, search: search, current_user: current_user}} = socket
) do
shot_records = ActivityLog.list_shot_records(search, class, current_user)
packs = Ammo.list_staged_packs(current_user)
shot_records = ActivityLog.list_shot_records(current_user, search: search, class: class)
packs = Ammo.list_packs(current_user, staged: true)
chart_data = shot_records |> get_chart_data_for_shot_record()
original_counts = packs |> Ammo.get_original_counts(current_user)
cprs = packs |> Ammo.get_cprs(current_user)

View File

@ -80,7 +80,9 @@
phx-submit="change_class"
class="flex items-center"
>
<%= label(f, :class, gettext("Class"), class: "title text-primary-600 text-lg text-center") %>
<%= label(f, :class, gettext("Class"),
class: "title text-primary-600 text-lg text-center"
) %>
<%= select(
f,
@ -122,7 +124,7 @@
<% else %>
<.live_component
module={CanneryWeb.Components.ShotRecordTableComponent}
id="shot_records_index_table"
id="shot-records-index-table"
shot_records={@shot_records}
current_user={@current_user}
>

View File

@ -75,6 +75,6 @@ defmodule CanneryWeb.TagLive.Index do
end
defp display_tags(%{assigns: %{search: search, current_user: current_user}} = socket) do
socket |> assign(tags: Containers.list_tags(search, current_user))
socket |> assign(tags: Containers.list_tags(current_user, search: search))
end
end

View File

@ -85,14 +85,18 @@
) %>
<%= error_tag(f, :unfired_length, "col-span-3 text-center") %>
<%= label(f, :brass_height, gettext("Brass height"), class: "title text-lg text-primary-600") %>
<%= label(f, :brass_height, gettext("Brass height"),
class: "title text-lg text-primary-600"
) %>
<%= text_input(f, :brass_height,
class: "text-center col-span-2 input input-primary",
maxlength: 255
) %>
<%= error_tag(f, :brass_height, "col-span-3 text-center") %>
<%= label(f, :chamber_size, gettext("Chamber size"), class: "title text-lg text-primary-600") %>
<%= label(f, :chamber_size, gettext("Chamber size"),
class: "title text-lg text-primary-600"
) %>
<%= text_input(f, :chamber_size,
class: "text-center col-span-2 input input-primary",
maxlength: 255
@ -167,7 +171,9 @@
<%= hidden_input(f, :jacket_type, value: nil) %>
<% end %>
<%= label(f, :case_material, gettext("Case material"), class: "title text-lg text-primary-600") %>
<%= label(f, :case_material, gettext("Case material"),
class: "title text-lg text-primary-600"
) %>
<%= text_input(f, :case_material,
class: "text-center col-span-2 input input-primary",
maxlength: 255,

View File

@ -106,7 +106,7 @@ defmodule CanneryWeb.TypeLive.Index do
) do
socket
|> assign(
types: Ammo.list_types(search, current_user, class),
types: Ammo.list_types(current_user, class: class, search: search),
types_count: Ammo.get_types_count!(current_user)
)
end

View File

@ -26,7 +26,9 @@
phx-submit="change_class"
class="flex items-center"
>
<%= label(f, :class, gettext("Class"), class: "title text-primary-600 text-lg text-center") %>
<%= label(f, :class, gettext("Class"),
class: "title text-primary-600 text-lg text-center"
) %>
<%= select(
f,
@ -74,7 +76,7 @@
<% else %>
<.live_component
module={CanneryWeb.Components.TypeTableComponent}
id="types_index_table"
id="types-index-table"
action={@live_action}
types={@types}
current_user={@current_user}

View File

@ -40,7 +40,7 @@ defmodule CanneryWeb.TypeLive.Show do
defp display_type(
%{assigns: %{live_action: live_action, current_user: current_user, show_used: show_used}} =
socket,
%Type{name: type_name} = type
%Type{id: type_id, name: type_name} = type
) do
custom_fields? =
fields_to_display(type)
@ -54,7 +54,7 @@ defmodule CanneryWeb.TypeLive.Show do
type |> Map.get(field) != default_value
end)
packs = type |> Ammo.list_packs_for_type(current_user, show_used)
packs = Ammo.list_packs(current_user, type_id: type_id, show_used: show_used)
[
original_counts,
@ -66,10 +66,10 @@ defmodule CanneryWeb.TypeLive.Show do
if show_used do
[
packs |> Ammo.get_original_counts(current_user),
type |> Ammo.get_used_packs_count_for_type(current_user),
type |> Ammo.get_packs_count_for_type(current_user, true),
type |> ActivityLog.get_used_count_for_type(current_user),
type |> Ammo.get_historical_count_for_type(current_user)
Ammo.get_packs_count(current_user, type_id: type.id, show_used: :only_used),
Ammo.get_packs_count(current_user, type_id: type.id, show_used: true),
ActivityLog.get_used_count(current_user, type_id: type.id),
Ammo.get_historical_count(type, current_user)
]
else
[nil, nil, nil, nil, nil]
@ -94,12 +94,12 @@ defmodule CanneryWeb.TypeLive.Show do
containers: containers,
cprs: packs |> Ammo.get_cprs(current_user),
last_used_dates: packs |> ActivityLog.get_last_used_dates(current_user),
avg_cost_per_round: type |> Ammo.get_average_cost_for_type(current_user),
rounds: type |> Ammo.get_round_count_for_type(current_user),
avg_cost_per_round: Ammo.get_average_cost(type, current_user),
rounds: Ammo.get_round_count(current_user, type_id: type.id),
original_counts: original_counts,
used_rounds: used_rounds,
historical_round_count: historical_round_count,
packs_count: type |> Ammo.get_packs_count_for_type(current_user),
packs_count: Ammo.get_packs_count(current_user, type_id: type.id),
used_packs_count: used_packs_count,
historical_packs_count: historical_packs_count,
fields_to_display: fields_to_display(type),

View File

@ -198,7 +198,9 @@
navigate={~p"/ammo/show/#{pack}"}
class="text-primary-600 link"
aria-label={
dgettext("actions", "View pack of %{pack_count} bullets", pack_count: pack_count)
dgettext("actions", "View pack of %{pack_count} bullets",
pack_count: pack_count
)
}
>
<i class="fa-fw fa-lg fas fa-eye"></i>

39
mix.exs
View File

@ -4,8 +4,8 @@ defmodule Cannery.MixProject do
def project do
[
app: :cannery,
version: "0.9.3",
elixir: "1.14.4",
version: "0.9.9",
elixir: "1.16.1",
elixirc_paths: elixirc_paths(Mix.env()),
start_permanent: Mix.env() == :prod,
aliases: aliases(),
@ -47,29 +47,30 @@ defmodule Cannery.MixProject do
defp deps do
[
{:bcrypt_elixir, "~> 3.0"},
{:phoenix, "~> 1.7.0"},
{:phoenix_ecto, "~> 4.4"},
{:phoenix_html, "~> 3.0"},
{:phoenix_live_reload, "~> 1.2", only: :dev},
{:phoenix_live_view, "~> 0.18.0"},
{:phoenix_live_dashboard, "~> 0.6"},
{:credo, "~> 1.5", only: [:dev, :test], runtime: false},
{:dialyxir, "~> 1.0", only: [:dev, :test], runtime: false},
{:ecto_psql_extras, "~> 0.6"},
{:ecto_sql, "~> 3.6"},
{:postgrex, ">= 0.0.0"},
{:floki, ">= 0.30.0", only: :test},
{:eqrcode, "~> 0.1.10"},
# {:esbuild, "~> 0.3", runtime: Mix.env() == :dev},
{:ex_doc, "~> 0.27", only: :dev, runtime: false},
{:swoosh, "~> 1.6"},
{:floki, ">= 0.30.0", only: :test},
{:gen_smtp, "~> 1.0"},
{:oban, "~> 2.10"},
{:telemetry_metrics, "~> 0.6"},
{:telemetry_poller, "~> 1.0"},
{:gettext, "~> 0.18"},
{:jason, "~> 1.2"},
{:plug_cowboy, "~> 2.5"},
{:ecto_psql_extras, "~> 0.6"},
{:eqrcode, "~> 0.1.10"},
{:credo, "~> 1.5", only: [:dev, :test], runtime: false},
{:dialyxir, "~> 1.0", only: [:dev, :test], runtime: false}
{:oban, "~> 2.10"},
{:phoenix_ecto, "~> 4.4"},
{:phoenix_html_helpers, "~> 1.0"},
{:phoenix_html, "~> 4.0"},
{:phoenix_live_dashboard, "~> 0.8"},
{:phoenix_live_reload, "~> 1.2", only: :dev},
{:phoenix_live_view, "~> 0.20.0"},
{:phoenix, "~> 1.7.11"},
{:plug_cowboy, "~> 2.7"},
{:postgrex, ">= 0.0.0"},
{:swoosh, "~> 1.6"},
{:telemetry_metrics, "~> 0.6"},
{:telemetry_poller, "~> 1.0"}
]
end

View File

@ -1,54 +1,54 @@
%{
"bcrypt_elixir": {:hex, :bcrypt_elixir, "3.0.1", "9be815469e6bfefec40fa74658ecbbe6897acfb57614df1416eeccd4903f602c", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "486bb95efb645d1efc6794c1ddd776a186a9a713abf06f45708a6ce324fb96cf"},
"bunt": {:hex, :bunt, "0.2.1", "e2d4792f7bc0ced7583ab54922808919518d0e57ee162901a16a1b6664ef3b14", [:mix], [], "hexpm", "a330bfb4245239787b15005e66ae6845c9cd524a288f0d141c148b02603777a5"},
"castore": {:hex, :castore, "1.0.1", "240b9edb4e9e94f8f56ab39d8d2d0a57f49e46c56aced8f873892df8ff64ff5a", [:mix], [], "hexpm", "b4951de93c224d44fac71614beabd88b71932d0b1dea80d2f80fb9044e01bbb3"},
"comeonin": {:hex, :comeonin, "5.3.3", "2c564dac95a35650e9b6acfe6d2952083d8a08e4a89b93a481acb552b325892e", [:mix], [], "hexpm", "3e38c9c2cb080828116597ca8807bb482618a315bfafd98c90bc22a821cc84df"},
"connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"},
"cowboy": {:hex, :cowboy, "2.9.0", "865dd8b6607e14cf03282e10e934023a1bd8be6f6bacf921a7e2a96d800cd452", [:make, :rebar3], [{:cowlib, "2.11.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "2c729f934b4e1aa149aff882f57c6372c15399a20d54f65c8d67bef583021bde"},
"bcrypt_elixir": {:hex, :bcrypt_elixir, "3.1.0", "0b110a9a6c619b19a7f73fa3004aa11d6e719a67e672d1633dc36b6b2290a0f7", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "2ad2acb5a8bc049e8d5aa267802631912bb80d5f4110a178ae7999e69dca1bf7"},
"bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"},
"castore": {:hex, :castore, "1.0.6", "ffc42f110ebfdafab0ea159cd43d31365fa0af0ce4a02ecebf1707ae619ee727", [:mix], [], "hexpm", "374c6e7ca752296be3d6780a6d5b922854ffcc74123da90f2f328996b962d33a"},
"comeonin": {:hex, :comeonin, "5.4.0", "246a56ca3f41d404380fc6465650ddaa532c7f98be4bda1b4656b3a37cc13abe", [:mix], [], "hexpm", "796393a9e50d01999d56b7b8420ab0481a7538d0caf80919da493b4a6e51faf1"},
"cowboy": {:hex, :cowboy, "2.10.0", "ff9ffeff91dae4ae270dd975642997afe2a1179d94b1887863e43f681a203e26", [:make, :rebar3], [{:cowlib, "2.12.1", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "3afdccb7183cc6f143cb14d3cf51fa00e53db9ec80cdcd525482f5e99bc41d6b"},
"cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"},
"cowlib": {:hex, :cowlib, "2.11.0", "0b9ff9c346629256c42ebe1eeb769a83c6cb771a6ee5960bd110ab0b9b872063", [:make, :rebar3], [], "hexpm", "2b3e9da0b21c4565751a6d4901c20d1b4cc25cbb7fd50d91d2ab6dd287bc86a9"},
"credo": {:hex, :credo, "1.7.0", "6119bee47272e85995598ee04f2ebbed3e947678dee048d10b5feca139435f75", [:mix], [{:bunt, "~> 0.2.1", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "6839fcf63d1f0d1c0f450abc8564a57c43d644077ab96f2934563e68b8a769d7"},
"db_connection": {:hex, :db_connection, "2.5.0", "bb6d4f30d35ded97b29fe80d8bd6f928a1912ca1ff110831edcd238a1973652c", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c92d5ba26cd69ead1ff7582dbb860adeedfff39774105a4f1c92cbb654b55aa2"},
"decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"},
"dialyxir": {:hex, :dialyxir, "1.3.0", "fd1672f0922b7648ff9ce7b1b26fcf0ef56dda964a459892ad15f6b4410b5284", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "00b2a4bcd6aa8db9dcb0b38c1225b7277dca9bc370b6438715667071a304696f"},
"earmark_parser": {:hex, :earmark_parser, "1.4.31", "a93921cdc6b9b869f519213d5bc79d9e218ba768d7270d46fdcf1c01bacff9e2", [:mix], [], "hexpm", "317d367ee0335ef037a87e46c91a2269fef6306413f731e8ec11fc45a7efd059"},
"ecto": {:hex, :ecto, "3.10.1", "c6757101880e90acc6125b095853176a02da8f1afe056f91f1f90b80c9389822", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d2ac4255f1601bdf7ac74c0ed971102c6829dc158719b94bd30041bbad77f87a"},
"ecto_psql_extras": {:hex, :ecto_psql_extras, "0.7.10", "e14d400930f401ca9f541b3349212634e44027d7f919bbb71224d7ac0d0e8acd", [:mix], [{:ecto_sql, "~> 3.4", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.15.7 or ~> 0.16.0", [hex: :postgrex, repo: "hexpm", optional: false]}, {:table_rex, "~> 3.1.1", [hex: :table_rex, repo: "hexpm", optional: false]}], "hexpm", "505e8cd81e4f17c090be0f99e92b1b3f0fd915f98e76965130b8ccfb891e7088"},
"ecto_sql": {:hex, :ecto_sql, "3.10.1", "6ea6b3036a0b0ca94c2a02613fd9f742614b5cfe494c41af2e6571bb034dd94c", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.10.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 0.17.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f6a25bdbbd695f12c8171eaff0851fa4c8e72eec1e98c7364402dda9ce11c56b"},
"elixir_make": {:hex, :elixir_make, "0.7.6", "67716309dc5d43e16b5abbd00c01b8df6a0c2ab54a8f595468035a50189f9169", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "5a0569756b0f7873a77687800c164cca6dfc03a09418e6fcf853d78991f49940"},
"cowlib": {:hex, :cowlib, "2.12.1", "a9fa9a625f1d2025fe6b462cb865881329b5caff8f1854d1cbc9f9533f00e1e1", [:make, :rebar3], [], "hexpm", "163b73f6367a7341b33c794c4e88e7dbfe6498ac42dcd69ef44c5bc5507c8db0"},
"credo": {:hex, :credo, "1.7.5", "643213503b1c766ec0496d828c90c424471ea54da77c8a168c725686377b9545", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "f799e9b5cd1891577d8c773d245668aa74a2fcd15eb277f51a0131690ebfb3fd"},
"db_connection": {:hex, :db_connection, "2.6.0", "77d835c472b5b67fc4f29556dee74bf511bbafecdcaf98c27d27fa5918152086", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c2f992d15725e721ec7fbc1189d4ecdb8afef76648c746a8e1cad35e3b8a35f3"},
"decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"},
"dialyxir": {:hex, :dialyxir, "1.4.3", "edd0124f358f0b9e95bfe53a9fcf806d615d8f838e2202a9f430d59566b6b53b", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "bf2cfb75cd5c5006bec30141b131663299c661a864ec7fbbc72dfa557487a986"},
"earmark_parser": {:hex, :earmark_parser, "1.4.39", "424642f8335b05bb9eb611aa1564c148a8ee35c9c8a8bba6e129d51a3e3c6769", [:mix], [], "hexpm", "06553a88d1f1846da9ef066b87b57c6f605552cfbe40d20bd8d59cc6bde41944"},
"ecto": {:hex, :ecto, "3.11.2", "e1d26be989db350a633667c5cda9c3d115ae779b66da567c68c80cfb26a8c9ee", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3c38bca2c6f8d8023f2145326cc8a80100c3ffe4dcbd9842ff867f7fc6156c65"},
"ecto_psql_extras": {:hex, :ecto_psql_extras, "0.7.15", "0fc29dbae0e444a29bd6abeee4cf3c4c037e692a272478a234a1cc765077dbb1", [:mix], [{:ecto_sql, "~> 3.7", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16.0 or ~> 0.17.0", [hex: :postgrex, repo: "hexpm", optional: false]}, {:table_rex, "~> 3.1.1 or ~> 4.0.0", [hex: :table_rex, repo: "hexpm", optional: false]}], "hexpm", "b6127f3a5c6fc3d84895e4768cc7c199f22b48b67d6c99b13fbf4a374e73f039"},
"ecto_sql": {:hex, :ecto_sql, "3.11.1", "e9abf28ae27ef3916b43545f9578b4750956ccea444853606472089e7d169470", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.11.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 0.17.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ce14063ab3514424276e7e360108ad6c2308f6d88164a076aac8a387e1fea634"},
"elixir_make": {:hex, :elixir_make, "0.8.2", "cd4a5a75891362e9207adaac7e66223fd256ec2518ae013af7f10c9c85b50b5c", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.0", [hex: :certifi, repo: "hexpm", optional: true]}], "hexpm", "9d9607d640c372a7291e5a56ce655aa2351897929be20bd211648fdb79e725dc"},
"eqrcode": {:hex, :eqrcode, "0.1.10", "6294fece9d68ad64eef1c3c92cf111cfd6469f4fbf230a2d4cc905a682178f3f", [:mix], [], "hexpm", "da30e373c36a0fd37ab6f58664b16029919896d6c45a68a95cc4d713e81076f1"},
"erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"},
"ex_doc": {:hex, :ex_doc, "0.29.4", "6257ecbb20c7396b1fe5accd55b7b0d23f44b6aa18017b415cb4c2b91d997729", [:mix], [{:earmark_parser, "~> 1.4.31", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "2c6699a737ae46cb61e4ed012af931b57b699643b24dabe2400a8168414bc4f5"},
"expo": {:hex, :expo, "0.4.1", "1c61d18a5df197dfda38861673d392e642649a9cef7694d2f97a587b2cfb319b", [:mix], [], "hexpm", "2ff7ba7a798c8c543c12550fa0e2cbc81b95d4974c65855d8d15ba7b37a1ce47"},
"file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"},
"floki": {:hex, :floki, "0.34.2", "5fad07ef153b3b8ec110b6b155ec3780c4b2c4906297d0b4be1a7162d04a7e02", [:mix], [], "hexpm", "26b9d50f0f01796bc6be611ca815c5e0de034d2128e39cc9702eee6b66a4d1c8"},
"ex_doc": {:hex, :ex_doc, "0.31.2", "8b06d0a5ac69e1a54df35519c951f1f44a7b7ca9a5bb7a260cd8a174d6322ece", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.1", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "317346c14febaba9ca40fd97b5b5919f7751fb85d399cc8e7e8872049f37e0af"},
"expo": {:hex, :expo, "0.5.2", "beba786aab8e3c5431813d7a44b828e7b922bfa431d6bfbada0904535342efe2", [:mix], [], "hexpm", "8c9bfa06ca017c9cb4020fabe980bc7fdb1aaec059fd004c2ab3bff03b1c599c"},
"file_system": {:hex, :file_system, "1.0.0", "b689cc7dcee665f774de94b5a832e578bd7963c8e637ef940cd44327db7de2cd", [:mix], [], "hexpm", "6752092d66aec5a10e662aefeed8ddb9531d79db0bc145bb8c40325ca1d8536d"},
"floki": {:hex, :floki, "0.36.1", "712b7f2ba19a4d5a47dfe3e74d81876c95bbcbee44fe551f0af3d2a388abb3da", [:mix], [], "hexpm", "21ba57abb8204bcc70c439b423fc0dd9f0286de67dc82773a14b0200ada0995f"},
"gen_smtp": {:hex, :gen_smtp, "1.2.0", "9cfc75c72a8821588b9b9fe947ae5ab2aed95a052b81237e0928633a13276fd3", [:rebar3], [{:ranch, ">= 1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "5ee0375680bca8f20c4d85f58c2894441443a743355430ff33a783fe03296779"},
"gettext": {:hex, :gettext, "0.22.1", "e7942988383c3d9eed4bdc22fc63e712b655ae94a672a27e4900e3d4a2c43581", [:mix], [{:expo, "~> 0.4.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "ad105b8dab668ee3f90c0d3d94ba75e9aead27a62495c101d94f2657a190ac5d"},
"jason": {:hex, :jason, "1.4.0", "e855647bc964a44e2f67df589ccf49105ae039d4179db7f6271dfd3843dc27e6", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "79a3791085b2a0f743ca04cec0f7be26443738779d09302e01318f97bdb82121"},
"makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"},
"makeup_elixir": {:hex, :makeup_elixir, "0.16.1", "cc9e3ca312f1cfeccc572b37a09980287e243648108384b97ff2b76e505c3555", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "e127a341ad1b209bd80f7bd1620a15693a9908ed780c3b763bccf7d200c767c6"},
"makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"},
"mime": {:hex, :mime, "2.0.3", "3676436d3d1f7b81b5a2d2bd8405f412c677558c81b1c92be58c00562bb59095", [:mix], [], "hexpm", "27a30bf0db44d25eecba73755acf4068cbfe26a4372f9eb3e4ea3a45956bff6b"},
"nimble_parsec": {:hex, :nimble_parsec, "1.3.0", "9e18a119d9efc3370a3ef2a937bf0b24c088d9c4bf0ba9d7c3751d49d347d035", [:mix], [], "hexpm", "7977f183127a7cbe9346981e2f480dc04c55ffddaef746bd58debd566070eef8"},
"oban": {:hex, :oban, "2.15.0", "27b9c2845cdff30c98c8060b11a64318e79bbc1bd32b8dc95fa59a1580a8d90c", [:mix], [{:ecto_sql, "~> 3.6", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:ecto_sqlite3, "~> 0.9", [hex: :ecto_sqlite3, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16", [hex: :postgrex, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "22e181c540335d1dd5c995be00435927075519207d62b3de32477d95dbf9dfd3"},
"phoenix": {:hex, :phoenix, "1.7.2", "c375ffb482beb4e3d20894f84dd7920442884f5f5b70b9f4528cbe0cedefec63", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.4", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "1ebca94b32b4d0e097ab2444a9742ed8ff3361acad17365e4e6b2e79b4792159"},
"phoenix_ecto": {:hex, :phoenix_ecto, "4.4.0", "0672ed4e4808b3fbed494dded89958e22fb882de47a97634c0b13e7b0b5f7720", [:mix], [{:ecto, "~> 3.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "09864e558ed31ee00bd48fcc1d4fc58ae9678c9e81649075431e69dbabb43cc1"},
"phoenix_html": {:hex, :phoenix_html, "3.3.1", "4788757e804a30baac6b3fc9695bf5562465dd3f1da8eb8460ad5b404d9a2178", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "bed1906edd4906a15fd7b412b85b05e521e1f67c9a85418c55999277e553d0d3"},
"phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.7.2", "97cc4ff2dba1ebe504db72cb45098cb8e91f11160528b980bd282cc45c73b29c", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.18.3", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "0e5fdf063c7a3b620c566a30fcf68b7ee02e5e46fe48ee46a6ec3ba382dc05b7"},
"phoenix_live_reload": {:hex, :phoenix_live_reload, "1.4.1", "2aff698f5e47369decde4357ba91fc9c37c6487a512b41732818f2204a8ef1d3", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "9bffb834e7ddf08467fe54ae58b5785507aaba6255568ae22b4d46e2bb3615ab"},
"phoenix_live_view": {:hex, :phoenix_live_view, "0.18.18", "1f38fbd7c363723f19aad1a04b5490ff3a178e37daaf6999594d5f34796c47fc", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a5810d0472f3189ede6d2a95bda7f31c6113156b91784a3426cb0ab6a6d85214"},
"phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.1", "ba04e489ef03763bf28a17eb2eaddc2c20c6d217e2150a61e3298b0f4c2012b5", [:mix], [], "hexpm", "81367c6d1eea5878ad726be80808eb5a787a23dee699f96e72b1109c57cdd8d9"},
"phoenix_template": {:hex, :phoenix_template, "1.0.1", "85f79e3ad1b0180abb43f9725973e3b8c2c3354a87245f91431eec60553ed3ef", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "157dc078f6226334c91cb32c1865bf3911686f8bcd6bcff86736f6253e6993ee"},
"plug": {:hex, :plug, "1.14.2", "cff7d4ec45b4ae176a227acd94a7ab536d9b37b942c8e8fa6dfc0fff98ff4d80", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "842fc50187e13cf4ac3b253d47d9474ed6c296a8732752835ce4a86acdf68d13"},
"plug_cowboy": {:hex, :plug_cowboy, "2.6.1", "9a3bbfceeb65eff5f39dab529e5cd79137ac36e913c02067dba3963a26efe9b2", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "de36e1a21f451a18b790f37765db198075c25875c64834bcc82d90b309eb6613"},
"plug_crypto": {:hex, :plug_crypto, "1.2.5", "918772575e48e81e455818229bf719d4ab4181fcbf7f85b68a35620f78d89ced", [:mix], [], "hexpm", "26549a1d6345e2172eb1c233866756ae44a9609bd33ee6f99147ab3fd87fd842"},
"postgrex": {:hex, :postgrex, "0.16.5", "fcc4035cc90e23933c5d69a9cd686e329469446ef7abba2cf70f08e2c4b69810", [:mix], [{:connection, "~> 1.1", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "edead639dc6e882618c01d8fc891214c481ab9a3788dfe38dd5e37fd1d5fb2e8"},
"gettext": {:hex, :gettext, "0.24.0", "6f4d90ac5f3111673cbefc4ebee96fe5f37a114861ab8c7b7d5b30a1108ce6d8", [:mix], [{:expo, "~> 0.5.1", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "bdf75cdfcbe9e4622dd18e034b227d77dd17f0f133853a1c73b97b3d6c770e8b"},
"jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"},
"makeup": {:hex, :makeup, "1.1.1", "fa0bc768698053b2b3869fa8a62616501ff9d11a562f3ce39580d60860c3a55e", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "5dc62fbdd0de44de194898b6710692490be74baa02d9d108bc29f007783b0b48"},
"makeup_elixir": {:hex, :makeup_elixir, "0.16.2", "627e84b8e8bf22e60a2579dad15067c755531fea049ae26ef1020cad58fe9578", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "41193978704763f6bbe6cc2758b84909e62984c7752b3784bd3c218bb341706b"},
"makeup_erlang": {:hex, :makeup_erlang, "0.1.5", "e0ff5a7c708dda34311f7522a8758e23bfcd7d8d8068dc312b5eb41c6fd76eba", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "94d2e986428585a21516d7d7149781480013c56e30c6a233534bedf38867a59a"},
"mime": {:hex, :mime, "2.0.5", "dc34c8efd439abe6ae0343edbb8556f4d63f178594894720607772a041b04b02", [:mix], [], "hexpm", "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c"},
"nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"},
"oban": {:hex, :oban, "2.17.6", "bac1dacd836edbf6a200ddd880db10faa2d39bb2e550ec6d19b3eb9c43852c2a", [:mix], [{:ecto_sql, "~> 3.10", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:ecto_sqlite3, "~> 0.9", [hex: :ecto_sqlite3, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16", [hex: :postgrex, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "623f3554212e9a776e015156c47f076d66c7b74115ac47a7d3acba0294e65acb"},
"phoenix": {:hex, :phoenix, "1.7.11", "1d88fc6b05ab0c735b250932c4e6e33bfa1c186f76dcf623d8dd52f07d6379c7", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "b1ec57f2e40316b306708fe59b92a16b9f6f4bf50ccfa41aa8c7feb79e0ec02a"},
"phoenix_ecto": {:hex, :phoenix_ecto, "4.5.1", "6fdbc334ea53620e71655664df6f33f670747b3a7a6c4041cdda3e2c32df6257", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "ebe43aa580db129e54408e719fb9659b7f9e0d52b965c5be26cdca416ecead28"},
"phoenix_html": {:hex, :phoenix_html, "4.1.1", "4c064fd3873d12ebb1388425a8f2a19348cef56e7289e1998e2d2fa758aa982e", [:mix], [], "hexpm", "f2f2df5a72bc9a2f510b21497fd7d2b86d932ec0598f0210fed4114adc546c6f"},
"phoenix_html_helpers": {:hex, :phoenix_html_helpers, "1.0.1", "7eed85c52eff80a179391036931791ee5d2f713d76a81d0d2c6ebafe1e11e5ec", [:mix], [{:phoenix_html, "~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "cffd2385d1fa4f78b04432df69ab8da63dc5cf63e07b713a4dcf36a3740e3090"},
"phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.3", "7ff51c9b6609470f681fbea20578dede0e548302b0c8bdf338b5a753a4f045bf", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "f9470a0a8bae4f56430a23d42f977b5a6205fdba6559d76f932b876bfaec652d"},
"phoenix_live_reload": {:hex, :phoenix_live_reload, "1.5.2", "354460993a480656b71c3887f5565f612b3bdbdd8688c83f9e6f512307067dd4", [:mix], [{:file_system, "~> 0.3 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "2bb3722f327e14a7aa47b1acf27ed633c8cd27b167e18b8237954b9b4804af39"},
"phoenix_live_view": {:hex, :phoenix_live_view, "0.20.14", "70fa101aa0539e81bed4238777498f6215e9dda3461bdaa067cad6908110c364", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "82f6d006c5264f979ed5eb75593d808bbe39020f20df2e78426f4f2d570e2402"},
"phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"},
"phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"},
"plug": {:hex, :plug, "1.15.3", "712976f504418f6dff0a3e554c40d705a9bcf89a7ccef92fc6a5ef8f16a30a97", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "cc4365a3c010a56af402e0809208873d113e9c38c401cabd88027ef4f5c01fd2"},
"plug_cowboy": {:hex, :plug_cowboy, "2.7.0", "3ae9369c60641084363b08fe90267cbdd316df57e3557ea522114b30b63256ea", [:mix], [{:cowboy, "~> 2.7.0 or ~> 2.8.0 or ~> 2.9.0 or ~> 2.10.0", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "d85444fb8aa1f2fc62eabe83bbe387d81510d773886774ebdcb429b3da3c1a4a"},
"plug_crypto": {:hex, :plug_crypto, "2.0.0", "77515cc10af06645abbfb5e6ad7a3e9714f805ae118fa1a70205f80d2d70fe73", [:mix], [], "hexpm", "53695bae57cc4e54566d993eb01074e4d894b65a3766f1c43e2c61a1b0f45ea9"},
"postgrex": {:hex, :postgrex, "0.17.5", "0483d054938a8dc069b21bdd636bf56c487404c241ce6c319c1f43588246b281", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "50b8b11afbb2c4095a3ba675b4f055c416d0f3d7de6633a595fc131a828a67eb"},
"ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"},
"swoosh": {:hex, :swoosh, "1.9.1", "0a5d7bf9954eb41d7e55525bc0940379982b090abbaef67cd8e1fd2ed7f8ca1a", [:mix], [{:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "76dffff3ffcab80f249d5937a592eaef7cc49ac6f4cdd27e622868326ed6371e"},
"table_rex": {:hex, :table_rex, "3.1.1", "0c67164d1714b5e806d5067c1e96ff098ba7ae79413cc075973e17c38a587caa", [:mix], [], "hexpm", "678a23aba4d670419c23c17790f9dcd635a4a89022040df7d5d772cb21012490"},
"swoosh": {:hex, :swoosh, "1.16.3", "4ab7dc429e84afaf8ffe1c7c06ce1acbc7ddde758d2cb9152dd2ac32289d5498", [:mix], [{:bandit, ">= 1.0.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mua, "~> 0.1.0", [hex: :mua, repo: "hexpm", optional: true]}, {:multipart, "~> 0.4", [hex: :multipart, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:req, "~> 0.4 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ff70980087650a72951ebd109a286d83c270e2b6610aba447140562adff8cf0a"},
"table_rex": {:hex, :table_rex, "4.0.0", "3c613a68ebdc6d4d1e731bc973c233500974ec3993c99fcdabb210407b90959b", [:mix], [], "hexpm", "c35c4d5612ca49ebb0344ea10387da4d2afe278387d4019e4d8111e815df8f55"},
"telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"},
"telemetry_metrics": {:hex, :telemetry_metrics, "0.6.1", "315d9163a1d4660aedc3fee73f33f1d355dcc76c5c3ab3d59e76e3edf80eef1f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7be9e0871c41732c233be71e4be11b96e56177bf15dde64a8ac9ce72ac9834c6"},
"telemetry_metrics": {:hex, :telemetry_metrics, "0.6.2", "2caabe9344ec17eafe5403304771c3539f3b6e2f7fb6a6f602558c825d0d0bfb", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9b43db0dc33863930b9ef9d27137e78974756f5f198cae18409970ed6fa5b561"},
"telemetry_poller": {:hex, :telemetry_poller, "1.0.0", "db91bb424e07f2bb6e73926fcafbfcbcb295f0193e0a00e825e589a0a47e8453", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b3a24eafd66c3f42da30fc3ca7dda1e9d546c12250a2d60d7b81d264fbec4f6e"},
"websock": {:hex, :websock, "0.5.0", "f6bbce90226121d62a0715bca7c986c5e43de0ccc9475d79c55381d1796368cc", [:mix], [], "hexpm", "b51ac706df8a7a48a2c622ee02d09d68be8c40418698ffa909d73ae207eb5fb8"},
"websock_adapter": {:hex, :websock_adapter, "0.5.0", "cea35d8bbf1a6964e32d4b02ceb561dfb769c04f16d60d743885587e7d2ca55b", [:mix], [{:bandit, "~> 0.6", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "16318b124effab8209b1eb7906c636374f623dc9511a8278ad09c083cea5bb83"},
"websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"},
"websock_adapter": {:hex, :websock_adapter, "0.5.5", "9dfeee8269b27e958a65b3e235b7e447769f66b5b5925385f5a569269164a210", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "4b977ba4a01918acbf77045ff88de7f6972c2a009213c515a445c48f224ffce9"},
}

View File

@ -56,7 +56,7 @@ msgstr ""
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:47
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:3
#: lib/cannery_web/controllers/user_session_html/new.html.heex:38
#: lib/cannery_web/controllers/user_session_html/new.html.heex:46
#, elixir-autogen, elixir-format
msgid "Forgot your password?"
msgstr ""
@ -72,7 +72,7 @@ msgstr ""
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:41
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:28
#: lib/cannery_web/controllers/user_session_html/new.html.heex:3
#: lib/cannery_web/controllers/user_session_html/new.html.heex:28
#: lib/cannery_web/controllers/user_session_html/new.html.heex:36
#, elixir-autogen, elixir-format
msgid "Log in"
msgstr ""
@ -98,7 +98,7 @@ msgstr ""
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:37
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:38
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:25
#: lib/cannery_web/controllers/user_session_html/new.html.heex:35
#: lib/cannery_web/controllers/user_session_html/new.html.heex:43
#, elixir-autogen, elixir-format
msgid "Register"
msgstr ""
@ -121,7 +121,7 @@ msgstr ""
#: lib/cannery_web/live/pack_live/form_component.html.heex:90
#: lib/cannery_web/live/range_live/form_component.html.heex:44
#: lib/cannery_web/live/tag_live/form_component.html.heex:37
#: lib/cannery_web/live/type_live/form_component.html.heex:353
#: lib/cannery_web/live/type_live/form_component.html.heex:359
#, elixir-autogen, elixir-format
msgid "Save"
msgstr ""
@ -288,23 +288,24 @@ msgstr ""
msgid "Unstage"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:168
#: lib/cannery_web/live/pack_live/index.html.heex:172
#, elixir-autogen, elixir-format
msgid "Clone pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:183
#: lib/cannery_web/live/pack_live/index.html.heex:187
#: lib/cannery_web/live/pack_live/show.html.heex:71
#, elixir-autogen, elixir-format
msgid "Delete pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:158
#: lib/cannery_web/live/pack_live/index.html.heex:160
#: lib/cannery_web/live/pack_live/show.html.heex:59
#, elixir-autogen, elixir-format
msgid "Edit pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:139
#: lib/cannery_web/live/pack_live/index.html.heex:148
#: lib/cannery_web/live/type_live/show.html.heex:201
#, elixir-autogen, elixir-format
@ -312,29 +313,29 @@ msgid "View pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:159
#: lib/cannery_web/live/range_live/index.html.heex:152
#: lib/cannery_web/live/range_live/index.html.heex:154
#, elixir-autogen, elixir-format
msgid "Delete shot record of %{shot_record_count} shots"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:144
#: lib/cannery_web/live/range_live/index.html.heex:135
#: lib/cannery_web/live/range_live/index.html.heex:137
#, elixir-autogen, elixir-format
msgid "Edit shot record of %{shot_record_count} shots"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:105
#: lib/cannery_web/live/type_live/index.html.heex:107
#, elixir-autogen, elixir-format
msgid "Clone %{type_name}"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:122
#: lib/cannery_web/live/type_live/index.html.heex:124
#: lib/cannery_web/live/type_live/show.html.heex:35
#, elixir-autogen, elixir-format
msgid "Delete %{type_name}"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:97
#: lib/cannery_web/live/type_live/index.html.heex:99
#: lib/cannery_web/live/type_live/show.html.heex:19
#, elixir-autogen, elixir-format
msgid "Edit %{type_name}"
@ -345,7 +346,7 @@ msgstr ""
msgid "New Type"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:89
#: lib/cannery_web/live/type_live/index.html.heex:91
#, elixir-autogen, elixir-format
msgid "View %{type_name}"
msgstr ""

View File

@ -69,7 +69,7 @@ msgstr "Benutzer löschen"
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:47
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:3
#: lib/cannery_web/controllers/user_session_html/new.html.heex:38
#: lib/cannery_web/controllers/user_session_html/new.html.heex:46
#, elixir-autogen, elixir-format
msgid "Forgot your password?"
msgstr "Passwort vergessen?"
@ -85,7 +85,7 @@ msgstr "Laden Sie jemanden ein!"
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:41
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:28
#: lib/cannery_web/controllers/user_session_html/new.html.heex:3
#: lib/cannery_web/controllers/user_session_html/new.html.heex:28
#: lib/cannery_web/controllers/user_session_html/new.html.heex:36
#, elixir-autogen, elixir-format
msgid "Log in"
msgstr "Einloggen"
@ -111,7 +111,7 @@ msgstr "Neuer Tag"
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:37
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:38
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:25
#: lib/cannery_web/controllers/user_session_html/new.html.heex:35
#: lib/cannery_web/controllers/user_session_html/new.html.heex:43
#, elixir-autogen, elixir-format
msgid "Register"
msgstr "Registrieren"
@ -134,7 +134,7 @@ msgstr "Passwort zurücksetzen"
#: lib/cannery_web/live/pack_live/form_component.html.heex:90
#: lib/cannery_web/live/range_live/form_component.html.heex:44
#: lib/cannery_web/live/tag_live/form_component.html.heex:37
#: lib/cannery_web/live/type_live/form_component.html.heex:353
#: lib/cannery_web/live/type_live/form_component.html.heex:359
#, elixir-autogen, elixir-format
msgid "Save"
msgstr "Speichern"
@ -301,23 +301,24 @@ msgstr ""
msgid "Unstage"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:168
#: lib/cannery_web/live/pack_live/index.html.heex:172
#, elixir-autogen, elixir-format, fuzzy
msgid "Clone pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:183
#: lib/cannery_web/live/pack_live/index.html.heex:187
#: lib/cannery_web/live/pack_live/show.html.heex:71
#, elixir-autogen, elixir-format, fuzzy
msgid "Delete pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:158
#: lib/cannery_web/live/pack_live/index.html.heex:160
#: lib/cannery_web/live/pack_live/show.html.heex:59
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:139
#: lib/cannery_web/live/pack_live/index.html.heex:148
#: lib/cannery_web/live/type_live/show.html.heex:201
#, elixir-autogen, elixir-format, fuzzy
@ -325,29 +326,29 @@ msgid "View pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:159
#: lib/cannery_web/live/range_live/index.html.heex:152
#: lib/cannery_web/live/range_live/index.html.heex:154
#, elixir-autogen, elixir-format, fuzzy
msgid "Delete shot record of %{shot_record_count} shots"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:144
#: lib/cannery_web/live/range_live/index.html.heex:135
#: lib/cannery_web/live/range_live/index.html.heex:137
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit shot record of %{shot_record_count} shots"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:105
#: lib/cannery_web/live/type_live/index.html.heex:107
#, elixir-autogen, elixir-format, fuzzy
msgid "Clone %{type_name}"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:122
#: lib/cannery_web/live/type_live/index.html.heex:124
#: lib/cannery_web/live/type_live/show.html.heex:35
#, elixir-autogen, elixir-format, fuzzy
msgid "Delete %{type_name}"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:97
#: lib/cannery_web/live/type_live/index.html.heex:99
#: lib/cannery_web/live/type_live/show.html.heex:19
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit %{type_name}"
@ -358,7 +359,7 @@ msgstr ""
msgid "New Type"
msgstr "Neue Munitionsart"
#: lib/cannery_web/live/type_live/index.html.heex:89
#: lib/cannery_web/live/type_live/index.html.heex:91
#, elixir-autogen, elixir-format, fuzzy
msgid "View %{type_name}"
msgstr ""

View File

@ -44,24 +44,24 @@ msgid "Background color"
msgstr "Hintergrundfarbe"
#: lib/cannery_web/components/type_table_component.ex:86
#: lib/cannery_web/live/type_live/form_component.html.heex:327
#: lib/cannery_web/live/type_live/form_component.html.heex:333
#, elixir-autogen, elixir-format
msgid "Blank"
msgstr "Knallpatrone"
#: lib/cannery_web/live/type_live/form_component.html.heex:174
#: lib/cannery_web/live/type_live/form_component.html.heex:180
#, elixir-autogen, elixir-format
msgid "Brass"
msgstr "Messing"
#: lib/cannery_web/components/type_table_component.ex:61
#: lib/cannery_web/live/type_live/form_component.html.heex:147
#: lib/cannery_web/live/type_live/form_component.html.heex:151
#, elixir-autogen, elixir-format
msgid "Bullet core"
msgstr "Projektilkern"
#: lib/cannery_web/components/type_table_component.ex:59
#: lib/cannery_web/live/type_live/form_component.html.heex:121
#: lib/cannery_web/live/type_live/form_component.html.heex:125
#, elixir-autogen, elixir-format
msgid "Bullet type"
msgstr "Patronenart"
@ -79,7 +79,7 @@ msgid "Cartridge"
msgstr "Patrone"
#: lib/cannery_web/components/type_table_component.ex:66
#: lib/cannery_web/live/type_live/form_component.html.heex:170
#: lib/cannery_web/live/type_live/form_component.html.heex:174
#, elixir-autogen, elixir-format
msgid "Case material"
msgstr "Gehäusematerial"
@ -100,7 +100,7 @@ msgid "Containers"
msgstr "Behälter"
#: lib/cannery_web/components/type_table_component.ex:87
#: lib/cannery_web/live/type_live/form_component.html.heex:331
#: lib/cannery_web/live/type_live/form_component.html.heex:337
#, elixir-autogen, elixir-format
msgid "Corrosive"
msgstr "Korrosiv"
@ -145,19 +145,19 @@ msgstr "Einladung bearbeiten"
msgid "Edit Tag"
msgstr "Tag bearbeiten"
#: lib/cannery_web/live/type_live/form_component.html.heex:135
#: lib/cannery_web/live/type_live/form_component.html.heex:139
#, elixir-autogen, elixir-format
msgid "FMJ"
msgstr "VM"
#: lib/cannery_web/components/type_table_component.ex:58
#: lib/cannery_web/live/type_live/form_component.html.heex:111
#: lib/cannery_web/live/type_live/form_component.html.heex:115
#, elixir-autogen, elixir-format
msgid "Grains"
msgstr "Körner"
#: lib/cannery_web/components/type_table_component.ex:85
#: lib/cannery_web/live/type_live/form_component.html.heex:323
#: lib/cannery_web/live/type_live/form_component.html.heex:329
#, elixir-autogen, elixir-format
msgid "Incendiary"
msgstr "Brandmunition"
@ -184,7 +184,7 @@ msgstr "Nur mit Einladung"
msgid "Invites"
msgstr "Einladungen"
#: lib/cannery_web/controllers/user_session_html/new.html.heex:23
#: lib/cannery_web/controllers/user_session_html/new.html.heex:31
#, elixir-autogen, elixir-format
msgid "Keep me logged in for 60 days"
msgstr "Für 60 Tage eingeloggt bleiben"
@ -208,8 +208,8 @@ msgid "Magazine, Clip, Ammo Box, etc"
msgstr "Magazin, Ladestreifen, Munitionskiste usw."
#: lib/cannery_web/components/type_table_component.ex:88
#: lib/cannery_web/live/type_live/form_component.html.heex:336
#: lib/cannery_web/live/type_live/form_component.html.heex:339
#: lib/cannery_web/live/type_live/form_component.html.heex:342
#: lib/cannery_web/live/type_live/form_component.html.heex:345
#, elixir-autogen, elixir-format
msgid "Manufacturer"
msgstr "Hersteller"
@ -299,7 +299,7 @@ msgid "On the bookshelf"
msgstr "Auf dem Bücherregal"
#: lib/cannery_web/components/type_table_component.ex:79
#: lib/cannery_web/live/type_live/form_component.html.heex:260
#: lib/cannery_web/live/type_live/form_component.html.heex:266
#, elixir-autogen, elixir-format
msgid "Pressure"
msgstr "Druck"
@ -316,7 +316,7 @@ msgid "Price paid:"
msgstr "Kaufpreis:"
#: lib/cannery_web/components/type_table_component.ex:82
#: lib/cannery_web/live/type_live/form_component.html.heex:299
#: lib/cannery_web/live/type_live/form_component.html.heex:305
#, elixir-autogen, elixir-format
msgid "Primer type"
msgstr "Zündertyp"
@ -349,7 +349,7 @@ msgstr "Einstellungen"
msgid "Simple:"
msgstr "Einfach:"
#: lib/cannery_web/live/type_live/form_component.html.heex:154
#: lib/cannery_web/live/type_live/form_component.html.heex:158
#, elixir-autogen, elixir-format
msgid "Steel"
msgstr "Stahl"
@ -384,7 +384,7 @@ msgid "The self-hosted firearm tracker website"
msgstr "Die selbst-gehostete Website zur Verwaltung von Schusswaffen"
#: lib/cannery_web/components/type_table_component.ex:84
#: lib/cannery_web/live/type_live/form_component.html.heex:319
#: lib/cannery_web/live/type_live/form_component.html.heex:325
#, elixir-autogen, elixir-format
msgid "Tracer"
msgstr "Leuchtspur"
@ -426,6 +426,8 @@ msgstr "Keine Tags für diesen Behälter"
#: lib/cannery_web/components/core_components/topbar.html.heex:48
#: lib/cannery_web/components/pack_table_component.ex:80
#: lib/cannery_web/live/range_live/index.ex:55
#: lib/cannery_web/live/range_live/index.ex:65
#, elixir-autogen, elixir-format
msgid "Range"
msgstr "Schießplatz"
@ -459,13 +461,8 @@ msgstr "Keine Munition selektiert"
msgid "Record shots"
msgstr "Schüsse dokumentieren"
#: lib/cannery_web/live/range_live/index.ex:47
#, elixir-autogen, elixir-format
msgid "New Shot Records"
msgstr "Neue Schießkladde"
#: lib/cannery_web/live/range_live/index.html.heex:52
#: lib/cannery_web/live/range_live/index.html.heex:119
#: lib/cannery_web/live/range_live/index.html.heex:121
#, elixir-autogen, elixir-format
msgid "No shots recorded"
msgstr "Keine Schüsse dokumentiert"
@ -477,12 +474,6 @@ msgstr "Keine Schüsse dokumentiert"
msgid "Rounds shot"
msgstr "Patronen abgefeuert"
#: lib/cannery_web/live/range_live/index.ex:55
#: lib/cannery_web/live/range_live/index.ex:65
#, elixir-autogen, elixir-format
msgid "Shot Records"
msgstr "Schießkladde"
#: lib/cannery_web/live/pack_live/index.ex:43
#, elixir-autogen, elixir-format
msgid "Move ammo"
@ -500,9 +491,9 @@ msgstr "Schießkladde"
#: lib/cannery_web/components/core_components/pack_card.html.heex:42
#: lib/cannery_web/components/core_components/pack_card.html.heex:47
#: lib/cannery_web/components/pack_table_component.ex:176
#: lib/cannery_web/components/pack_table_component.ex:259
#: lib/cannery_web/components/type_table_component.ex:260
#: lib/cannery_web/components/pack_table_component.ex:181
#: lib/cannery_web/components/pack_table_component.ex:264
#: lib/cannery_web/components/type_table_component.ex:273
#: lib/cannery_web/live/pack_live/show.html.heex:37
#: lib/cannery_web/live/pack_live/show.html.heex:42
#: lib/cannery_web/live/type_live/show.html.heex:150
@ -510,36 +501,36 @@ msgstr "Schießkladde"
msgid "$%{amount}"
msgstr "$%{amount}"
#: lib/cannery_web/live/type_live/form_component.html.heex:163
#: lib/cannery_web/live/type_live/form_component.html.heex:167
#, elixir-autogen, elixir-format
msgid "Bimetal"
msgstr "Bimetall"
#: lib/cannery_web/components/type_table_component.ex:65
#: lib/cannery_web/live/type_live/form_component.html.heex:159
#: lib/cannery_web/live/type_live/form_component.html.heex:163
#, elixir-autogen, elixir-format
msgid "Jacket type"
msgstr "Patronenhülse"
#: lib/cannery_web/components/type_table_component.ex:81
#: lib/cannery_web/live/type_live/form_component.html.heex:282
#: lib/cannery_web/live/type_live/form_component.html.heex:288
#, elixir-autogen, elixir-format
msgid "Muzzle velocity"
msgstr "Mündungsgeschwindigkeit"
#: lib/cannery_web/components/type_table_component.ex:75
#: lib/cannery_web/live/type_live/form_component.html.heex:247
#: lib/cannery_web/live/type_live/form_component.html.heex:253
#, elixir-autogen, elixir-format
msgid "Powder grains per charge"
msgstr "Pulverkörner pro Ladung"
#: lib/cannery_web/components/type_table_component.ex:73
#: lib/cannery_web/live/type_live/form_component.html.heex:239
#: lib/cannery_web/live/type_live/form_component.html.heex:245
#, elixir-autogen, elixir-format
msgid "Powder type"
msgstr "Pulverart"
#: lib/cannery_web/live/type_live/form_component.html.heex:346
#: lib/cannery_web/live/type_live/form_component.html.heex:352
#, elixir-autogen, elixir-format
msgid "UPC"
msgstr "UPC"
@ -563,24 +554,24 @@ msgid "New password"
msgstr "Neues Passwort"
#: lib/cannery_web/components/type_table_component.ex:83
#: lib/cannery_web/live/type_live/form_component.html.heex:307
#: lib/cannery_web/live/type_live/form_component.html.heex:313
#, elixir-autogen, elixir-format
msgid "Firing type"
msgstr "Patronenhülsenform"
#: lib/cannery_web/components/layouts/live.html.heex:43
#: lib/cannery_web/components/layouts/app.html.heex:43
#, elixir-autogen, elixir-format
msgid "Reconnecting..."
msgstr "Neu verbinden..."
#: lib/cannery_web/live/container_live/index.ex:28
#: lib/cannery_web/live/container_live/show.ex:116
#: lib/cannery_web/live/container_live/show.ex:118
#, elixir-autogen, elixir-format
msgid "Edit %{name}"
msgstr "%{name} bearbeiten"
#: lib/cannery_web/live/container_live/index.ex:63
#: lib/cannery_web/live/container_live/show.ex:117
#: lib/cannery_web/live/container_live/show.ex:119
#, elixir-autogen, elixir-format
msgid "Edit %{name} tags"
msgstr "Editiere %{name} Tags"
@ -592,9 +583,9 @@ msgstr "Editiere %{name} Tags"
msgid "Rounds:"
msgstr "Patronen:"
#: lib/cannery_web/components/pack_table_component.ex:173
#: lib/cannery_web/components/pack_table_component.ex:255
#: lib/cannery_web/components/type_table_component.ex:259
#: lib/cannery_web/components/pack_table_component.ex:178
#: lib/cannery_web/components/pack_table_component.ex:260
#: lib/cannery_web/components/type_table_component.ex:272
#: lib/cannery_web/live/type_live/show.html.heex:154
#, elixir-autogen, elixir-format
msgid "No cost information"
@ -657,6 +648,7 @@ msgstr "Passwort zurücksetzen"
#: lib/cannery_web/live/pack_live/show.ex:40
#: lib/cannery_web/live/range_live/index.ex:31
#: lib/cannery_web/live/range_live/index.ex:47
#, elixir-autogen, elixir-format
msgid "Record Shots"
msgstr "Schüsse dokumentieren"
@ -774,13 +766,13 @@ msgid "Container:"
msgstr "Behälter"
#: lib/cannery_web/live/pack_live/index.html.heex:87
#: lib/cannery_web/live/type_live/index.html.heex:64
#: lib/cannery_web/live/type_live/index.html.heex:66
#: lib/cannery_web/live/type_live/show.html.heex:164
#, elixir-autogen, elixir-format
msgid "Show used"
msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:214
#: lib/cannery_web/components/pack_table_component.ex:219
#: lib/cannery_web/live/pack_live/show.html.heex:19
#, elixir-autogen, elixir-format
msgid "%{percentage}%"
@ -957,7 +949,7 @@ msgid "Average CPR"
msgstr ""
#: lib/cannery_web/components/core_components/pack_card.html.heex:17
#: lib/cannery_web/components/pack_table_component.ex:263
#: lib/cannery_web/components/pack_table_component.ex:268
#, elixir-autogen, elixir-format
msgid "Empty"
msgstr ""
@ -997,7 +989,7 @@ msgstr ""
msgid "Last used on:"
msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:194
#: lib/cannery_web/components/pack_table_component.ex:199
#, elixir-autogen, elixir-format
msgid "Never used"
msgstr ""
@ -1019,7 +1011,7 @@ msgstr ""
msgid "Edit ammo"
msgstr "Munitionstyp bearbeiten"
#: lib/cannery_web/live/type_live/index.html.heex:58
#: lib/cannery_web/live/type_live/index.html.heex:60
#, elixir-autogen, elixir-format
msgid "Search catalog"
msgstr ""
@ -1039,7 +1031,7 @@ msgstr ""
msgid "Search tags"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:112
#: lib/cannery_web/live/range_live/index.html.heex:114
#, elixir-autogen, elixir-format
msgid "Search shot records"
msgstr ""
@ -1143,12 +1135,12 @@ msgid "Email"
msgstr ""
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:24
#: lib/cannery_web/controllers/user_session_html/new.html.heex:20
#: lib/cannery_web/controllers/user_session_html/new.html.heex:24
#, elixir-autogen, elixir-format
msgid "Password"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:264
#: lib/cannery_web/live/type_live/form_component.html.heex:270
#, elixir-autogen, elixir-format
msgid "+P"
msgstr ""
@ -1163,12 +1155,12 @@ msgstr ""
msgid "5.56x46mm NATO"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:303
#: lib/cannery_web/live/type_live/form_component.html.heex:309
#, elixir-autogen, elixir-format
msgid "Boxer"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:311
#: lib/cannery_web/live/type_live/form_component.html.heex:317
#, elixir-autogen, elixir-format
msgid "Centerfire"
msgstr ""
@ -1212,13 +1204,13 @@ msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:97
#: lib/cannery_web/live/pack_live/index.html.heex:58
#: lib/cannery_web/live/range_live/index.html.heex:89
#: lib/cannery_web/live/type_live/index.html.heex:35
#: lib/cannery_web/live/range_live/index.html.heex:91
#: lib/cannery_web/live/type_live/index.html.heex:37
#, elixir-autogen, elixir-format
msgid "All"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:316
#: lib/cannery_web/live/type_live/form_component.html.heex:322
#, elixir-autogen, elixir-format
msgid "Attributes"
msgstr ""
@ -1235,7 +1227,7 @@ msgid "Brass height:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:57
#: lib/cannery_web/live/type_live/form_component.html.heex:95
#: lib/cannery_web/live/type_live/form_component.html.heex:97
#, elixir-autogen, elixir-format
msgid "Chamber size"
msgstr ""
@ -1251,7 +1243,7 @@ msgid "Dimensions"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:80
#: lib/cannery_web/live/type_live/form_component.html.heex:269
#: lib/cannery_web/live/type_live/form_component.html.heex:275
#, elixir-autogen, elixir-format
msgid "Dram equivalent"
msgstr ""
@ -1273,7 +1265,7 @@ msgid "Gauge:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:71
#: lib/cannery_web/live/type_live/form_component.html.heex:210
#: lib/cannery_web/live/type_live/form_component.html.heex:216
#, elixir-autogen, elixir-format
msgid "Load grains"
msgstr ""
@ -1295,41 +1287,41 @@ msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:100
#: lib/cannery_web/live/pack_live/index.html.heex:61
#: lib/cannery_web/live/range_live/index.html.heex:92
#: lib/cannery_web/live/range_live/index.html.heex:94
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:38
#: lib/cannery_web/live/type_live/index.html.heex:40
#: lib/cannery_web/live/type_live/show.html.heex:56
#, elixir-autogen, elixir-format
msgid "Pistol"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:236
#: lib/cannery_web/live/type_live/form_component.html.heex:242
#, elixir-autogen, elixir-format, fuzzy
msgid "Powder"
msgstr "Pulverart"
#: lib/cannery_web/live/type_live/form_component.html.heex:296
#: lib/cannery_web/live/type_live/form_component.html.heex:302
#, elixir-autogen, elixir-format, fuzzy
msgid "Primer"
msgstr "Zündertyp"
#: lib/cannery_web/live/type_live/form_component.html.heex:108
#: lib/cannery_web/live/type_live/form_component.html.heex:112
#, elixir-autogen, elixir-format
msgid "Projectile"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:98
#: lib/cannery_web/live/pack_live/index.html.heex:59
#: lib/cannery_web/live/range_live/index.html.heex:90
#: lib/cannery_web/live/range_live/index.html.heex:92
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:36
#: lib/cannery_web/live/type_live/index.html.heex:38
#: lib/cannery_web/live/type_live/show.html.heex:54
#, elixir-autogen, elixir-format
msgid "Rifle"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:72
#: lib/cannery_web/live/type_live/form_component.html.heex:218
#: lib/cannery_web/live/type_live/form_component.html.heex:224
#, elixir-autogen, elixir-format
msgid "Shot charge weight"
msgstr ""
@ -1340,7 +1332,7 @@ msgid "Shot charge weight:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:69
#: lib/cannery_web/live/type_live/form_component.html.heex:194
#: lib/cannery_web/live/type_live/form_component.html.heex:200
#, elixir-autogen, elixir-format
msgid "Shot material"
msgstr ""
@ -1351,7 +1343,7 @@ msgid "Shot material:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:70
#: lib/cannery_web/live/type_live/form_component.html.heex:203
#: lib/cannery_web/live/type_live/form_component.html.heex:209
#, elixir-autogen, elixir-format, fuzzy
msgid "Shot size"
msgstr "Schüsse abgegeben"
@ -1362,7 +1354,7 @@ msgid "Shot size:"
msgstr "Schüsse abgegeben"
#: lib/cannery_web/components/type_table_component.ex:68
#: lib/cannery_web/live/type_live/form_component.html.heex:186
#: lib/cannery_web/live/type_live/form_component.html.heex:192
#, elixir-autogen, elixir-format
msgid "Shot type"
msgstr ""
@ -1374,21 +1366,21 @@ msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:99
#: lib/cannery_web/live/pack_live/index.html.heex:60
#: lib/cannery_web/live/range_live/index.html.heex:91
#: lib/cannery_web/live/range_live/index.html.heex:93
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:37
#: lib/cannery_web/live/type_live/index.html.heex:39
#: lib/cannery_web/live/type_live/show.html.heex:52
#, elixir-autogen, elixir-format
msgid "Shotgun"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:61
#: lib/cannery_web/live/type_live/form_component.html.heex:146
#: lib/cannery_web/live/type_live/form_component.html.heex:150
#, elixir-autogen, elixir-format
msgid "Slug core"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:190
#: lib/cannery_web/live/type_live/form_component.html.heex:196
#, elixir-autogen, elixir-format
msgid "Target, bird, buck, etc"
msgstr ""
@ -1405,7 +1397,7 @@ msgid "Unfired shell length"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:67
#: lib/cannery_web/live/type_live/form_component.html.heex:179
#: lib/cannery_web/live/type_live/form_component.html.heex:185
#, elixir-autogen, elixir-format
msgid "Wadding"
msgstr ""
@ -1456,7 +1448,7 @@ msgid "New Type"
msgstr "Neuer Munitionstyp"
#: lib/cannery_web/live/type_live/index.html.heex:8
#: lib/cannery_web/live/type_live/index.html.heex:71
#: lib/cannery_web/live/type_live/index.html.heex:73
#, elixir-autogen, elixir-format, fuzzy
msgid "No Types"
msgstr "Art"

View File

@ -23,7 +23,7 @@ msgstr ""
## Run "mix gettext.extract" to bring this file up to
## date. Leave "msgstr"s empty as changing them here has no
## effect: edit them in PO (.po) files instead.
#: lib/cannery/containers.ex:220
#: lib/cannery/containers.ex:224
#, elixir-autogen, elixir-format
msgid "Container must be empty before deleting"
msgstr "Behälter muss vor dem Löschen leer sein"
@ -170,7 +170,7 @@ msgstr ""
"Ungültige Nummer an Kopien. Muss zwischen 1 and %{max} liegen. War "
"%{multiplier}"
#: lib/cannery/ammo.ex:1121
#: lib/cannery/ammo.ex:974
#, elixir-autogen, elixir-format
msgid "Invalid multiplier"
msgstr ""

View File

@ -73,7 +73,7 @@ msgstr ""
msgid "Are you sure you want to delete %{name}?"
msgstr "Sind Sie sicher, dass sie %{name} löschen möchten?"
#: lib/cannery_web/live/pack_live/index.html.heex:181
#: lib/cannery_web/live/pack_live/index.html.heex:185
#: lib/cannery_web/live/pack_live/show.html.heex:69
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this ammo?"
@ -134,7 +134,7 @@ msgstr "Bitte überprüfen Sie ihre Mailbox und bestätigen Sie das Nutzerkonto"
#: lib/cannery_web/live/pack_live/form_component.html.heex:91
#: lib/cannery_web/live/range_live/form_component.html.heex:46
#: lib/cannery_web/live/tag_live/form_component.html.heex:39
#: lib/cannery_web/live/type_live/form_component.html.heex:354
#: lib/cannery_web/live/type_live/form_component.html.heex:360
#, elixir-autogen, elixir-format
msgid "Saving..."
msgstr "Speichere..."
@ -177,7 +177,7 @@ msgid "Are you sure you want to unstage this ammo?"
msgstr "Sind sie sicher, dass Sie diese Munition demarkieren möchten?"
#: lib/cannery_web/live/pack_live/show.ex:157
#: lib/cannery_web/live/range_live/index.html.heex:149
#: lib/cannery_web/live/range_live/index.html.heex:151
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?"
msgstr "Sind sie sicher, dass sie die Schießkladde löschen möchten?"
@ -257,7 +257,7 @@ msgid_plural "Ammo added successfully"
msgstr[0] "Munitionsgruppe erfolgreich aktualisiert"
msgstr[1] "Munitionsgruppe erfolgreich aktualisiert"
#: lib/cannery_web/live/type_live/index.html.heex:116
#: lib/cannery_web/live/type_live/index.html.heex:118
#: lib/cannery_web/live/type_live/show.html.heex:29
#, elixir-autogen, elixir-format, fuzzy
msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!"

View File

@ -40,24 +40,24 @@ msgid "Background color"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:86
#: lib/cannery_web/live/type_live/form_component.html.heex:327
#: lib/cannery_web/live/type_live/form_component.html.heex:333
#, elixir-autogen, elixir-format
msgid "Blank"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:174
#: lib/cannery_web/live/type_live/form_component.html.heex:180
#, elixir-autogen, elixir-format
msgid "Brass"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:61
#: lib/cannery_web/live/type_live/form_component.html.heex:147
#: lib/cannery_web/live/type_live/form_component.html.heex:151
#, elixir-autogen, elixir-format
msgid "Bullet core"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:59
#: lib/cannery_web/live/type_live/form_component.html.heex:121
#: lib/cannery_web/live/type_live/form_component.html.heex:125
#, elixir-autogen, elixir-format
msgid "Bullet type"
msgstr ""
@ -75,7 +75,7 @@ msgid "Cartridge"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:66
#: lib/cannery_web/live/type_live/form_component.html.heex:170
#: lib/cannery_web/live/type_live/form_component.html.heex:174
#, elixir-autogen, elixir-format
msgid "Case material"
msgstr ""
@ -96,7 +96,7 @@ msgid "Containers"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:87
#: lib/cannery_web/live/type_live/form_component.html.heex:331
#: lib/cannery_web/live/type_live/form_component.html.heex:337
#, elixir-autogen, elixir-format
msgid "Corrosive"
msgstr ""
@ -141,19 +141,19 @@ msgstr ""
msgid "Edit Tag"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:135
#: lib/cannery_web/live/type_live/form_component.html.heex:139
#, elixir-autogen, elixir-format
msgid "FMJ"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:58
#: lib/cannery_web/live/type_live/form_component.html.heex:111
#: lib/cannery_web/live/type_live/form_component.html.heex:115
#, elixir-autogen, elixir-format
msgid "Grains"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:85
#: lib/cannery_web/live/type_live/form_component.html.heex:323
#: lib/cannery_web/live/type_live/form_component.html.heex:329
#, elixir-autogen, elixir-format
msgid "Incendiary"
msgstr ""
@ -180,7 +180,7 @@ msgstr ""
msgid "Invites"
msgstr ""
#: lib/cannery_web/controllers/user_session_html/new.html.heex:23
#: lib/cannery_web/controllers/user_session_html/new.html.heex:31
#, elixir-autogen, elixir-format
msgid "Keep me logged in for 60 days"
msgstr ""
@ -204,8 +204,8 @@ msgid "Magazine, Clip, Ammo Box, etc"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:88
#: lib/cannery_web/live/type_live/form_component.html.heex:336
#: lib/cannery_web/live/type_live/form_component.html.heex:339
#: lib/cannery_web/live/type_live/form_component.html.heex:342
#: lib/cannery_web/live/type_live/form_component.html.heex:345
#, elixir-autogen, elixir-format
msgid "Manufacturer"
msgstr ""
@ -295,7 +295,7 @@ msgid "On the bookshelf"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:79
#: lib/cannery_web/live/type_live/form_component.html.heex:260
#: lib/cannery_web/live/type_live/form_component.html.heex:266
#, elixir-autogen, elixir-format
msgid "Pressure"
msgstr ""
@ -312,7 +312,7 @@ msgid "Price paid:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:82
#: lib/cannery_web/live/type_live/form_component.html.heex:299
#: lib/cannery_web/live/type_live/form_component.html.heex:305
#, elixir-autogen, elixir-format
msgid "Primer type"
msgstr ""
@ -343,7 +343,7 @@ msgstr ""
msgid "Simple:"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:154
#: lib/cannery_web/live/type_live/form_component.html.heex:158
#, elixir-autogen, elixir-format
msgid "Steel"
msgstr ""
@ -378,7 +378,7 @@ msgid "The self-hosted firearm tracker website"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:84
#: lib/cannery_web/live/type_live/form_component.html.heex:319
#: lib/cannery_web/live/type_live/form_component.html.heex:325
#, elixir-autogen, elixir-format
msgid "Tracer"
msgstr ""
@ -420,6 +420,8 @@ msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:48
#: lib/cannery_web/components/pack_table_component.ex:80
#: lib/cannery_web/live/range_live/index.ex:55
#: lib/cannery_web/live/range_live/index.ex:65
#, elixir-autogen, elixir-format
msgid "Range"
msgstr ""
@ -453,13 +455,8 @@ msgstr ""
msgid "Record shots"
msgstr ""
#: lib/cannery_web/live/range_live/index.ex:47
#, elixir-autogen, elixir-format
msgid "New Shot Records"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:52
#: lib/cannery_web/live/range_live/index.html.heex:119
#: lib/cannery_web/live/range_live/index.html.heex:121
#, elixir-autogen, elixir-format
msgid "No shots recorded"
msgstr ""
@ -471,12 +468,6 @@ msgstr ""
msgid "Rounds shot"
msgstr ""
#: lib/cannery_web/live/range_live/index.ex:55
#: lib/cannery_web/live/range_live/index.ex:65
#, elixir-autogen, elixir-format
msgid "Shot Records"
msgstr ""
#: lib/cannery_web/live/pack_live/index.ex:43
#, elixir-autogen, elixir-format
msgid "Move ammo"
@ -494,9 +485,9 @@ msgstr ""
#: lib/cannery_web/components/core_components/pack_card.html.heex:42
#: lib/cannery_web/components/core_components/pack_card.html.heex:47
#: lib/cannery_web/components/pack_table_component.ex:176
#: lib/cannery_web/components/pack_table_component.ex:259
#: lib/cannery_web/components/type_table_component.ex:260
#: lib/cannery_web/components/pack_table_component.ex:181
#: lib/cannery_web/components/pack_table_component.ex:264
#: lib/cannery_web/components/type_table_component.ex:273
#: lib/cannery_web/live/pack_live/show.html.heex:37
#: lib/cannery_web/live/pack_live/show.html.heex:42
#: lib/cannery_web/live/type_live/show.html.heex:150
@ -504,36 +495,36 @@ msgstr ""
msgid "$%{amount}"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:163
#: lib/cannery_web/live/type_live/form_component.html.heex:167
#, elixir-autogen, elixir-format
msgid "Bimetal"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:65
#: lib/cannery_web/live/type_live/form_component.html.heex:159
#: lib/cannery_web/live/type_live/form_component.html.heex:163
#, elixir-autogen, elixir-format
msgid "Jacket type"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:81
#: lib/cannery_web/live/type_live/form_component.html.heex:282
#: lib/cannery_web/live/type_live/form_component.html.heex:288
#, elixir-autogen, elixir-format
msgid "Muzzle velocity"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:75
#: lib/cannery_web/live/type_live/form_component.html.heex:247
#: lib/cannery_web/live/type_live/form_component.html.heex:253
#, elixir-autogen, elixir-format
msgid "Powder grains per charge"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:73
#: lib/cannery_web/live/type_live/form_component.html.heex:239
#: lib/cannery_web/live/type_live/form_component.html.heex:245
#, elixir-autogen, elixir-format
msgid "Powder type"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:346
#: lib/cannery_web/live/type_live/form_component.html.heex:352
#, elixir-autogen, elixir-format
msgid "UPC"
msgstr ""
@ -557,24 +548,24 @@ msgid "New password"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:83
#: lib/cannery_web/live/type_live/form_component.html.heex:307
#: lib/cannery_web/live/type_live/form_component.html.heex:313
#, elixir-autogen, elixir-format
msgid "Firing type"
msgstr ""
#: lib/cannery_web/components/layouts/live.html.heex:43
#: lib/cannery_web/components/layouts/app.html.heex:43
#, elixir-autogen, elixir-format
msgid "Reconnecting..."
msgstr ""
#: lib/cannery_web/live/container_live/index.ex:28
#: lib/cannery_web/live/container_live/show.ex:116
#: lib/cannery_web/live/container_live/show.ex:118
#, elixir-autogen, elixir-format
msgid "Edit %{name}"
msgstr ""
#: lib/cannery_web/live/container_live/index.ex:63
#: lib/cannery_web/live/container_live/show.ex:117
#: lib/cannery_web/live/container_live/show.ex:119
#, elixir-autogen, elixir-format
msgid "Edit %{name} tags"
msgstr ""
@ -586,9 +577,9 @@ msgstr ""
msgid "Rounds:"
msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:173
#: lib/cannery_web/components/pack_table_component.ex:255
#: lib/cannery_web/components/type_table_component.ex:259
#: lib/cannery_web/components/pack_table_component.ex:178
#: lib/cannery_web/components/pack_table_component.ex:260
#: lib/cannery_web/components/type_table_component.ex:272
#: lib/cannery_web/live/type_live/show.html.heex:154
#, elixir-autogen, elixir-format
msgid "No cost information"
@ -651,6 +642,7 @@ msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:40
#: lib/cannery_web/live/range_live/index.ex:31
#: lib/cannery_web/live/range_live/index.ex:47
#, elixir-autogen, elixir-format
msgid "Record Shots"
msgstr ""
@ -768,13 +760,13 @@ msgid "Container:"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:87
#: lib/cannery_web/live/type_live/index.html.heex:64
#: lib/cannery_web/live/type_live/index.html.heex:66
#: lib/cannery_web/live/type_live/show.html.heex:164
#, elixir-autogen, elixir-format
msgid "Show used"
msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:214
#: lib/cannery_web/components/pack_table_component.ex:219
#: lib/cannery_web/live/pack_live/show.html.heex:19
#, elixir-autogen, elixir-format
msgid "%{percentage}%"
@ -951,7 +943,7 @@ msgid "Average CPR"
msgstr ""
#: lib/cannery_web/components/core_components/pack_card.html.heex:17
#: lib/cannery_web/components/pack_table_component.ex:263
#: lib/cannery_web/components/pack_table_component.ex:268
#, elixir-autogen, elixir-format
msgid "Empty"
msgstr ""
@ -991,7 +983,7 @@ msgstr ""
msgid "Last used on:"
msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:194
#: lib/cannery_web/components/pack_table_component.ex:199
#, elixir-autogen, elixir-format
msgid "Never used"
msgstr ""
@ -1013,7 +1005,7 @@ msgstr ""
msgid "Edit ammo"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:58
#: lib/cannery_web/live/type_live/index.html.heex:60
#, elixir-autogen, elixir-format
msgid "Search catalog"
msgstr ""
@ -1033,7 +1025,7 @@ msgstr ""
msgid "Search tags"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:112
#: lib/cannery_web/live/range_live/index.html.heex:114
#, elixir-autogen, elixir-format
msgid "Search shot records"
msgstr ""
@ -1126,12 +1118,12 @@ msgid "Email"
msgstr ""
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:24
#: lib/cannery_web/controllers/user_session_html/new.html.heex:20
#: lib/cannery_web/controllers/user_session_html/new.html.heex:24
#, elixir-autogen, elixir-format
msgid "Password"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:264
#: lib/cannery_web/live/type_live/form_component.html.heex:270
#, elixir-autogen, elixir-format
msgid "+P"
msgstr ""
@ -1146,12 +1138,12 @@ msgstr ""
msgid "5.56x46mm NATO"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:303
#: lib/cannery_web/live/type_live/form_component.html.heex:309
#, elixir-autogen, elixir-format
msgid "Boxer"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:311
#: lib/cannery_web/live/type_live/form_component.html.heex:317
#, elixir-autogen, elixir-format
msgid "Centerfire"
msgstr ""
@ -1195,13 +1187,13 @@ msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:97
#: lib/cannery_web/live/pack_live/index.html.heex:58
#: lib/cannery_web/live/range_live/index.html.heex:89
#: lib/cannery_web/live/type_live/index.html.heex:35
#: lib/cannery_web/live/range_live/index.html.heex:91
#: lib/cannery_web/live/type_live/index.html.heex:37
#, elixir-autogen, elixir-format
msgid "All"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:316
#: lib/cannery_web/live/type_live/form_component.html.heex:322
#, elixir-autogen, elixir-format
msgid "Attributes"
msgstr ""
@ -1218,7 +1210,7 @@ msgid "Brass height:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:57
#: lib/cannery_web/live/type_live/form_component.html.heex:95
#: lib/cannery_web/live/type_live/form_component.html.heex:97
#, elixir-autogen, elixir-format
msgid "Chamber size"
msgstr ""
@ -1234,7 +1226,7 @@ msgid "Dimensions"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:80
#: lib/cannery_web/live/type_live/form_component.html.heex:269
#: lib/cannery_web/live/type_live/form_component.html.heex:275
#, elixir-autogen, elixir-format
msgid "Dram equivalent"
msgstr ""
@ -1256,7 +1248,7 @@ msgid "Gauge:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:71
#: lib/cannery_web/live/type_live/form_component.html.heex:210
#: lib/cannery_web/live/type_live/form_component.html.heex:216
#, elixir-autogen, elixir-format
msgid "Load grains"
msgstr ""
@ -1278,41 +1270,41 @@ msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:100
#: lib/cannery_web/live/pack_live/index.html.heex:61
#: lib/cannery_web/live/range_live/index.html.heex:92
#: lib/cannery_web/live/range_live/index.html.heex:94
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:38
#: lib/cannery_web/live/type_live/index.html.heex:40
#: lib/cannery_web/live/type_live/show.html.heex:56
#, elixir-autogen, elixir-format
msgid "Pistol"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:236
#: lib/cannery_web/live/type_live/form_component.html.heex:242
#, elixir-autogen, elixir-format
msgid "Powder"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:296
#: lib/cannery_web/live/type_live/form_component.html.heex:302
#, elixir-autogen, elixir-format
msgid "Primer"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:108
#: lib/cannery_web/live/type_live/form_component.html.heex:112
#, elixir-autogen, elixir-format
msgid "Projectile"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:98
#: lib/cannery_web/live/pack_live/index.html.heex:59
#: lib/cannery_web/live/range_live/index.html.heex:90
#: lib/cannery_web/live/range_live/index.html.heex:92
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:36
#: lib/cannery_web/live/type_live/index.html.heex:38
#: lib/cannery_web/live/type_live/show.html.heex:54
#, elixir-autogen, elixir-format
msgid "Rifle"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:72
#: lib/cannery_web/live/type_live/form_component.html.heex:218
#: lib/cannery_web/live/type_live/form_component.html.heex:224
#, elixir-autogen, elixir-format
msgid "Shot charge weight"
msgstr ""
@ -1323,7 +1315,7 @@ msgid "Shot charge weight:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:69
#: lib/cannery_web/live/type_live/form_component.html.heex:194
#: lib/cannery_web/live/type_live/form_component.html.heex:200
#, elixir-autogen, elixir-format
msgid "Shot material"
msgstr ""
@ -1334,7 +1326,7 @@ msgid "Shot material:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:70
#: lib/cannery_web/live/type_live/form_component.html.heex:203
#: lib/cannery_web/live/type_live/form_component.html.heex:209
#, elixir-autogen, elixir-format
msgid "Shot size"
msgstr ""
@ -1345,7 +1337,7 @@ msgid "Shot size:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:68
#: lib/cannery_web/live/type_live/form_component.html.heex:186
#: lib/cannery_web/live/type_live/form_component.html.heex:192
#, elixir-autogen, elixir-format
msgid "Shot type"
msgstr ""
@ -1357,21 +1349,21 @@ msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:99
#: lib/cannery_web/live/pack_live/index.html.heex:60
#: lib/cannery_web/live/range_live/index.html.heex:91
#: lib/cannery_web/live/range_live/index.html.heex:93
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:37
#: lib/cannery_web/live/type_live/index.html.heex:39
#: lib/cannery_web/live/type_live/show.html.heex:52
#, elixir-autogen, elixir-format
msgid "Shotgun"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:61
#: lib/cannery_web/live/type_live/form_component.html.heex:146
#: lib/cannery_web/live/type_live/form_component.html.heex:150
#, elixir-autogen, elixir-format
msgid "Slug core"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:190
#: lib/cannery_web/live/type_live/form_component.html.heex:196
#, elixir-autogen, elixir-format
msgid "Target, bird, buck, etc"
msgstr ""
@ -1388,7 +1380,7 @@ msgid "Unfired shell length"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:67
#: lib/cannery_web/live/type_live/form_component.html.heex:179
#: lib/cannery_web/live/type_live/form_component.html.heex:185
#, elixir-autogen, elixir-format
msgid "Wadding"
msgstr ""
@ -1439,7 +1431,7 @@ msgid "New Type"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:8
#: lib/cannery_web/live/type_live/index.html.heex:71
#: lib/cannery_web/live/type_live/index.html.heex:73
#, elixir-autogen, elixir-format
msgid "No Types"
msgstr ""

View File

@ -56,7 +56,7 @@ msgstr ""
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:47
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:3
#: lib/cannery_web/controllers/user_session_html/new.html.heex:38
#: lib/cannery_web/controllers/user_session_html/new.html.heex:46
#, elixir-autogen, elixir-format
msgid "Forgot your password?"
msgstr ""
@ -72,7 +72,7 @@ msgstr ""
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:41
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:28
#: lib/cannery_web/controllers/user_session_html/new.html.heex:3
#: lib/cannery_web/controllers/user_session_html/new.html.heex:28
#: lib/cannery_web/controllers/user_session_html/new.html.heex:36
#, elixir-autogen, elixir-format
msgid "Log in"
msgstr ""
@ -98,7 +98,7 @@ msgstr ""
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:37
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:38
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:25
#: lib/cannery_web/controllers/user_session_html/new.html.heex:35
#: lib/cannery_web/controllers/user_session_html/new.html.heex:43
#, elixir-autogen, elixir-format
msgid "Register"
msgstr ""
@ -121,7 +121,7 @@ msgstr ""
#: lib/cannery_web/live/pack_live/form_component.html.heex:90
#: lib/cannery_web/live/range_live/form_component.html.heex:44
#: lib/cannery_web/live/tag_live/form_component.html.heex:37
#: lib/cannery_web/live/type_live/form_component.html.heex:353
#: lib/cannery_web/live/type_live/form_component.html.heex:359
#, elixir-autogen, elixir-format
msgid "Save"
msgstr ""
@ -288,23 +288,24 @@ msgstr ""
msgid "Unstage"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:168
#: lib/cannery_web/live/pack_live/index.html.heex:172
#, elixir-autogen, elixir-format, fuzzy
msgid "Clone pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:183
#: lib/cannery_web/live/pack_live/index.html.heex:187
#: lib/cannery_web/live/pack_live/show.html.heex:71
#, elixir-autogen, elixir-format, fuzzy
msgid "Delete pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:158
#: lib/cannery_web/live/pack_live/index.html.heex:160
#: lib/cannery_web/live/pack_live/show.html.heex:59
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:139
#: lib/cannery_web/live/pack_live/index.html.heex:148
#: lib/cannery_web/live/type_live/show.html.heex:201
#, elixir-autogen, elixir-format, fuzzy
@ -312,29 +313,29 @@ msgid "View pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:159
#: lib/cannery_web/live/range_live/index.html.heex:152
#: lib/cannery_web/live/range_live/index.html.heex:154
#, elixir-autogen, elixir-format, fuzzy
msgid "Delete shot record of %{shot_record_count} shots"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:144
#: lib/cannery_web/live/range_live/index.html.heex:135
#: lib/cannery_web/live/range_live/index.html.heex:137
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit shot record of %{shot_record_count} shots"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:105
#: lib/cannery_web/live/type_live/index.html.heex:107
#, elixir-autogen, elixir-format, fuzzy
msgid "Clone %{type_name}"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:122
#: lib/cannery_web/live/type_live/index.html.heex:124
#: lib/cannery_web/live/type_live/show.html.heex:35
#, elixir-autogen, elixir-format, fuzzy
msgid "Delete %{type_name}"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:97
#: lib/cannery_web/live/type_live/index.html.heex:99
#: lib/cannery_web/live/type_live/show.html.heex:19
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit %{type_name}"
@ -345,7 +346,7 @@ msgstr ""
msgid "New Type"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:89
#: lib/cannery_web/live/type_live/index.html.heex:91
#, elixir-autogen, elixir-format, fuzzy
msgid "View %{type_name}"
msgstr ""

View File

@ -40,24 +40,24 @@ msgid "Background color"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:86
#: lib/cannery_web/live/type_live/form_component.html.heex:327
#: lib/cannery_web/live/type_live/form_component.html.heex:333
#, elixir-autogen, elixir-format
msgid "Blank"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:174
#: lib/cannery_web/live/type_live/form_component.html.heex:180
#, elixir-autogen, elixir-format
msgid "Brass"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:61
#: lib/cannery_web/live/type_live/form_component.html.heex:147
#: lib/cannery_web/live/type_live/form_component.html.heex:151
#, elixir-autogen, elixir-format
msgid "Bullet core"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:59
#: lib/cannery_web/live/type_live/form_component.html.heex:121
#: lib/cannery_web/live/type_live/form_component.html.heex:125
#, elixir-autogen, elixir-format
msgid "Bullet type"
msgstr ""
@ -75,7 +75,7 @@ msgid "Cartridge"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:66
#: lib/cannery_web/live/type_live/form_component.html.heex:170
#: lib/cannery_web/live/type_live/form_component.html.heex:174
#, elixir-autogen, elixir-format
msgid "Case material"
msgstr ""
@ -96,7 +96,7 @@ msgid "Containers"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:87
#: lib/cannery_web/live/type_live/form_component.html.heex:331
#: lib/cannery_web/live/type_live/form_component.html.heex:337
#, elixir-autogen, elixir-format
msgid "Corrosive"
msgstr ""
@ -141,19 +141,19 @@ msgstr ""
msgid "Edit Tag"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:135
#: lib/cannery_web/live/type_live/form_component.html.heex:139
#, elixir-autogen, elixir-format
msgid "FMJ"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:58
#: lib/cannery_web/live/type_live/form_component.html.heex:111
#: lib/cannery_web/live/type_live/form_component.html.heex:115
#, elixir-autogen, elixir-format
msgid "Grains"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:85
#: lib/cannery_web/live/type_live/form_component.html.heex:323
#: lib/cannery_web/live/type_live/form_component.html.heex:329
#, elixir-autogen, elixir-format
msgid "Incendiary"
msgstr ""
@ -180,7 +180,7 @@ msgstr ""
msgid "Invites"
msgstr ""
#: lib/cannery_web/controllers/user_session_html/new.html.heex:23
#: lib/cannery_web/controllers/user_session_html/new.html.heex:31
#, elixir-autogen, elixir-format
msgid "Keep me logged in for 60 days"
msgstr ""
@ -204,8 +204,8 @@ msgid "Magazine, Clip, Ammo Box, etc"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:88
#: lib/cannery_web/live/type_live/form_component.html.heex:336
#: lib/cannery_web/live/type_live/form_component.html.heex:339
#: lib/cannery_web/live/type_live/form_component.html.heex:342
#: lib/cannery_web/live/type_live/form_component.html.heex:345
#, elixir-autogen, elixir-format
msgid "Manufacturer"
msgstr ""
@ -295,7 +295,7 @@ msgid "On the bookshelf"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:79
#: lib/cannery_web/live/type_live/form_component.html.heex:260
#: lib/cannery_web/live/type_live/form_component.html.heex:266
#, elixir-autogen, elixir-format
msgid "Pressure"
msgstr ""
@ -312,7 +312,7 @@ msgid "Price paid:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:82
#: lib/cannery_web/live/type_live/form_component.html.heex:299
#: lib/cannery_web/live/type_live/form_component.html.heex:305
#, elixir-autogen, elixir-format
msgid "Primer type"
msgstr ""
@ -343,7 +343,7 @@ msgstr ""
msgid "Simple:"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:154
#: lib/cannery_web/live/type_live/form_component.html.heex:158
#, elixir-autogen, elixir-format
msgid "Steel"
msgstr ""
@ -378,7 +378,7 @@ msgid "The self-hosted firearm tracker website"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:84
#: lib/cannery_web/live/type_live/form_component.html.heex:319
#: lib/cannery_web/live/type_live/form_component.html.heex:325
#, elixir-autogen, elixir-format
msgid "Tracer"
msgstr ""
@ -420,6 +420,8 @@ msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:48
#: lib/cannery_web/components/pack_table_component.ex:80
#: lib/cannery_web/live/range_live/index.ex:55
#: lib/cannery_web/live/range_live/index.ex:65
#, elixir-autogen, elixir-format
msgid "Range"
msgstr ""
@ -453,13 +455,8 @@ msgstr ""
msgid "Record shots"
msgstr ""
#: lib/cannery_web/live/range_live/index.ex:47
#, elixir-autogen, elixir-format
msgid "New Shot Records"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:52
#: lib/cannery_web/live/range_live/index.html.heex:119
#: lib/cannery_web/live/range_live/index.html.heex:121
#, elixir-autogen, elixir-format
msgid "No shots recorded"
msgstr ""
@ -471,12 +468,6 @@ msgstr ""
msgid "Rounds shot"
msgstr ""
#: lib/cannery_web/live/range_live/index.ex:55
#: lib/cannery_web/live/range_live/index.ex:65
#, elixir-autogen, elixir-format
msgid "Shot Records"
msgstr ""
#: lib/cannery_web/live/pack_live/index.ex:43
#, elixir-autogen, elixir-format
msgid "Move ammo"
@ -494,9 +485,9 @@ msgstr ""
#: lib/cannery_web/components/core_components/pack_card.html.heex:42
#: lib/cannery_web/components/core_components/pack_card.html.heex:47
#: lib/cannery_web/components/pack_table_component.ex:176
#: lib/cannery_web/components/pack_table_component.ex:259
#: lib/cannery_web/components/type_table_component.ex:260
#: lib/cannery_web/components/pack_table_component.ex:181
#: lib/cannery_web/components/pack_table_component.ex:264
#: lib/cannery_web/components/type_table_component.ex:273
#: lib/cannery_web/live/pack_live/show.html.heex:37
#: lib/cannery_web/live/pack_live/show.html.heex:42
#: lib/cannery_web/live/type_live/show.html.heex:150
@ -504,36 +495,36 @@ msgstr ""
msgid "$%{amount}"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:163
#: lib/cannery_web/live/type_live/form_component.html.heex:167
#, elixir-autogen, elixir-format
msgid "Bimetal"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:65
#: lib/cannery_web/live/type_live/form_component.html.heex:159
#: lib/cannery_web/live/type_live/form_component.html.heex:163
#, elixir-autogen, elixir-format
msgid "Jacket type"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:81
#: lib/cannery_web/live/type_live/form_component.html.heex:282
#: lib/cannery_web/live/type_live/form_component.html.heex:288
#, elixir-autogen, elixir-format
msgid "Muzzle velocity"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:75
#: lib/cannery_web/live/type_live/form_component.html.heex:247
#: lib/cannery_web/live/type_live/form_component.html.heex:253
#, elixir-autogen, elixir-format
msgid "Powder grains per charge"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:73
#: lib/cannery_web/live/type_live/form_component.html.heex:239
#: lib/cannery_web/live/type_live/form_component.html.heex:245
#, elixir-autogen, elixir-format
msgid "Powder type"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:346
#: lib/cannery_web/live/type_live/form_component.html.heex:352
#, elixir-autogen, elixir-format
msgid "UPC"
msgstr ""
@ -557,24 +548,24 @@ msgid "New password"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:83
#: lib/cannery_web/live/type_live/form_component.html.heex:307
#: lib/cannery_web/live/type_live/form_component.html.heex:313
#, elixir-autogen, elixir-format
msgid "Firing type"
msgstr ""
#: lib/cannery_web/components/layouts/live.html.heex:43
#: lib/cannery_web/components/layouts/app.html.heex:43
#, elixir-autogen, elixir-format
msgid "Reconnecting..."
msgstr ""
#: lib/cannery_web/live/container_live/index.ex:28
#: lib/cannery_web/live/container_live/show.ex:116
#: lib/cannery_web/live/container_live/show.ex:118
#, elixir-autogen, elixir-format
msgid "Edit %{name}"
msgstr ""
#: lib/cannery_web/live/container_live/index.ex:63
#: lib/cannery_web/live/container_live/show.ex:117
#: lib/cannery_web/live/container_live/show.ex:119
#, elixir-autogen, elixir-format
msgid "Edit %{name} tags"
msgstr ""
@ -586,9 +577,9 @@ msgstr ""
msgid "Rounds:"
msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:173
#: lib/cannery_web/components/pack_table_component.ex:255
#: lib/cannery_web/components/type_table_component.ex:259
#: lib/cannery_web/components/pack_table_component.ex:178
#: lib/cannery_web/components/pack_table_component.ex:260
#: lib/cannery_web/components/type_table_component.ex:272
#: lib/cannery_web/live/type_live/show.html.heex:154
#, elixir-autogen, elixir-format
msgid "No cost information"
@ -651,6 +642,7 @@ msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:40
#: lib/cannery_web/live/range_live/index.ex:31
#: lib/cannery_web/live/range_live/index.ex:47
#, elixir-autogen, elixir-format, fuzzy
msgid "Record Shots"
msgstr ""
@ -768,13 +760,13 @@ msgid "Container:"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:87
#: lib/cannery_web/live/type_live/index.html.heex:64
#: lib/cannery_web/live/type_live/index.html.heex:66
#: lib/cannery_web/live/type_live/show.html.heex:164
#, elixir-autogen, elixir-format
msgid "Show used"
msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:214
#: lib/cannery_web/components/pack_table_component.ex:219
#: lib/cannery_web/live/pack_live/show.html.heex:19
#, elixir-autogen, elixir-format
msgid "%{percentage}%"
@ -951,7 +943,7 @@ msgid "Average CPR"
msgstr ""
#: lib/cannery_web/components/core_components/pack_card.html.heex:17
#: lib/cannery_web/components/pack_table_component.ex:263
#: lib/cannery_web/components/pack_table_component.ex:268
#, elixir-autogen, elixir-format
msgid "Empty"
msgstr ""
@ -991,7 +983,7 @@ msgstr ""
msgid "Last used on:"
msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:194
#: lib/cannery_web/components/pack_table_component.ex:199
#, elixir-autogen, elixir-format
msgid "Never used"
msgstr ""
@ -1013,7 +1005,7 @@ msgstr ""
msgid "Edit ammo"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:58
#: lib/cannery_web/live/type_live/index.html.heex:60
#, elixir-autogen, elixir-format
msgid "Search catalog"
msgstr ""
@ -1033,7 +1025,7 @@ msgstr ""
msgid "Search tags"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:112
#: lib/cannery_web/live/range_live/index.html.heex:114
#, elixir-autogen, elixir-format
msgid "Search shot records"
msgstr ""
@ -1126,12 +1118,12 @@ msgid "Email"
msgstr ""
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:24
#: lib/cannery_web/controllers/user_session_html/new.html.heex:20
#: lib/cannery_web/controllers/user_session_html/new.html.heex:24
#, elixir-autogen, elixir-format
msgid "Password"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:264
#: lib/cannery_web/live/type_live/form_component.html.heex:270
#, elixir-autogen, elixir-format
msgid "+P"
msgstr ""
@ -1146,12 +1138,12 @@ msgstr ""
msgid "5.56x46mm NATO"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:303
#: lib/cannery_web/live/type_live/form_component.html.heex:309
#, elixir-autogen, elixir-format
msgid "Boxer"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:311
#: lib/cannery_web/live/type_live/form_component.html.heex:317
#, elixir-autogen, elixir-format
msgid "Centerfire"
msgstr ""
@ -1195,13 +1187,13 @@ msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:97
#: lib/cannery_web/live/pack_live/index.html.heex:58
#: lib/cannery_web/live/range_live/index.html.heex:89
#: lib/cannery_web/live/type_live/index.html.heex:35
#: lib/cannery_web/live/range_live/index.html.heex:91
#: lib/cannery_web/live/type_live/index.html.heex:37
#, elixir-autogen, elixir-format
msgid "All"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:316
#: lib/cannery_web/live/type_live/form_component.html.heex:322
#, elixir-autogen, elixir-format
msgid "Attributes"
msgstr ""
@ -1218,7 +1210,7 @@ msgid "Brass height:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:57
#: lib/cannery_web/live/type_live/form_component.html.heex:95
#: lib/cannery_web/live/type_live/form_component.html.heex:97
#, elixir-autogen, elixir-format
msgid "Chamber size"
msgstr ""
@ -1234,7 +1226,7 @@ msgid "Dimensions"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:80
#: lib/cannery_web/live/type_live/form_component.html.heex:269
#: lib/cannery_web/live/type_live/form_component.html.heex:275
#, elixir-autogen, elixir-format
msgid "Dram equivalent"
msgstr ""
@ -1256,7 +1248,7 @@ msgid "Gauge:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:71
#: lib/cannery_web/live/type_live/form_component.html.heex:210
#: lib/cannery_web/live/type_live/form_component.html.heex:216
#, elixir-autogen, elixir-format
msgid "Load grains"
msgstr ""
@ -1278,41 +1270,41 @@ msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:100
#: lib/cannery_web/live/pack_live/index.html.heex:61
#: lib/cannery_web/live/range_live/index.html.heex:92
#: lib/cannery_web/live/range_live/index.html.heex:94
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:38
#: lib/cannery_web/live/type_live/index.html.heex:40
#: lib/cannery_web/live/type_live/show.html.heex:56
#, elixir-autogen, elixir-format
msgid "Pistol"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:236
#: lib/cannery_web/live/type_live/form_component.html.heex:242
#, elixir-autogen, elixir-format, fuzzy
msgid "Powder"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:296
#: lib/cannery_web/live/type_live/form_component.html.heex:302
#, elixir-autogen, elixir-format, fuzzy
msgid "Primer"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:108
#: lib/cannery_web/live/type_live/form_component.html.heex:112
#, elixir-autogen, elixir-format
msgid "Projectile"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:98
#: lib/cannery_web/live/pack_live/index.html.heex:59
#: lib/cannery_web/live/range_live/index.html.heex:90
#: lib/cannery_web/live/range_live/index.html.heex:92
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:36
#: lib/cannery_web/live/type_live/index.html.heex:38
#: lib/cannery_web/live/type_live/show.html.heex:54
#, elixir-autogen, elixir-format
msgid "Rifle"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:72
#: lib/cannery_web/live/type_live/form_component.html.heex:218
#: lib/cannery_web/live/type_live/form_component.html.heex:224
#, elixir-autogen, elixir-format
msgid "Shot charge weight"
msgstr ""
@ -1323,7 +1315,7 @@ msgid "Shot charge weight:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:69
#: lib/cannery_web/live/type_live/form_component.html.heex:194
#: lib/cannery_web/live/type_live/form_component.html.heex:200
#, elixir-autogen, elixir-format
msgid "Shot material"
msgstr ""
@ -1334,7 +1326,7 @@ msgid "Shot material:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:70
#: lib/cannery_web/live/type_live/form_component.html.heex:203
#: lib/cannery_web/live/type_live/form_component.html.heex:209
#, elixir-autogen, elixir-format, fuzzy
msgid "Shot size"
msgstr ""
@ -1345,7 +1337,7 @@ msgid "Shot size:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:68
#: lib/cannery_web/live/type_live/form_component.html.heex:186
#: lib/cannery_web/live/type_live/form_component.html.heex:192
#, elixir-autogen, elixir-format
msgid "Shot type"
msgstr ""
@ -1357,21 +1349,21 @@ msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:99
#: lib/cannery_web/live/pack_live/index.html.heex:60
#: lib/cannery_web/live/range_live/index.html.heex:91
#: lib/cannery_web/live/range_live/index.html.heex:93
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:37
#: lib/cannery_web/live/type_live/index.html.heex:39
#: lib/cannery_web/live/type_live/show.html.heex:52
#, elixir-autogen, elixir-format
msgid "Shotgun"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:61
#: lib/cannery_web/live/type_live/form_component.html.heex:146
#: lib/cannery_web/live/type_live/form_component.html.heex:150
#, elixir-autogen, elixir-format
msgid "Slug core"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:190
#: lib/cannery_web/live/type_live/form_component.html.heex:196
#, elixir-autogen, elixir-format
msgid "Target, bird, buck, etc"
msgstr ""
@ -1388,7 +1380,7 @@ msgid "Unfired shell length"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:67
#: lib/cannery_web/live/type_live/form_component.html.heex:179
#: lib/cannery_web/live/type_live/form_component.html.heex:185
#, elixir-autogen, elixir-format
msgid "Wadding"
msgstr ""
@ -1439,7 +1431,7 @@ msgid "New Type"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:8
#: lib/cannery_web/live/type_live/index.html.heex:71
#: lib/cannery_web/live/type_live/index.html.heex:73
#, elixir-autogen, elixir-format, fuzzy
msgid "No Types"
msgstr ""

View File

@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Language: en\n"
#: lib/cannery/containers.ex:220
#: lib/cannery/containers.ex:224
#, elixir-autogen, elixir-format
msgid "Container must be empty before deleting"
msgstr ""
@ -153,7 +153,7 @@ msgstr ""
msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
msgstr ""
#: lib/cannery/ammo.ex:1121
#: lib/cannery/ammo.ex:974
#, elixir-autogen, elixir-format
msgid "Invalid multiplier"
msgstr ""

View File

@ -58,7 +58,7 @@ msgstr ""
msgid "Are you sure you want to delete %{name}?"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:181
#: lib/cannery_web/live/pack_live/index.html.heex:185
#: lib/cannery_web/live/pack_live/show.html.heex:69
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this ammo?"
@ -115,7 +115,7 @@ msgstr ""
#: lib/cannery_web/live/pack_live/form_component.html.heex:91
#: lib/cannery_web/live/range_live/form_component.html.heex:46
#: lib/cannery_web/live/tag_live/form_component.html.heex:39
#: lib/cannery_web/live/type_live/form_component.html.heex:354
#: lib/cannery_web/live/type_live/form_component.html.heex:360
#, elixir-autogen, elixir-format
msgid "Saving..."
msgstr ""
@ -156,7 +156,7 @@ msgid "Are you sure you want to unstage this ammo?"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:157
#: lib/cannery_web/live/range_live/index.html.heex:149
#: lib/cannery_web/live/range_live/index.html.heex:151
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?"
msgstr ""
@ -236,7 +236,7 @@ msgid_plural "Ammo added successfully"
msgstr[0] ""
msgstr[1] ""
#: lib/cannery_web/live/type_live/index.html.heex:116
#: lib/cannery_web/live/type_live/index.html.heex:118
#: lib/cannery_web/live/type_live/show.html.heex:29
#, elixir-autogen, elixir-format, fuzzy
msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!"

View File

@ -10,7 +10,7 @@
msgid ""
msgstr ""
#: lib/cannery/containers.ex:220
#: lib/cannery/containers.ex:224
#, elixir-autogen, elixir-format
msgid "Container must be empty before deleting"
msgstr ""
@ -152,7 +152,7 @@ msgstr ""
msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
msgstr ""
#: lib/cannery/ammo.ex:1121
#: lib/cannery/ammo.ex:974
#, elixir-autogen, elixir-format
msgid "Invalid multiplier"
msgstr ""

View File

@ -69,7 +69,7 @@ msgstr "Eliminar cuenta de Usuario"
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:47
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:3
#: lib/cannery_web/controllers/user_session_html/new.html.heex:38
#: lib/cannery_web/controllers/user_session_html/new.html.heex:46
#, elixir-autogen, elixir-format
msgid "Forgot your password?"
msgstr "¿Has olvidado tu contraseña?"
@ -85,7 +85,7 @@ msgstr "¡Invita a alguien nuevo!"
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:41
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:28
#: lib/cannery_web/controllers/user_session_html/new.html.heex:3
#: lib/cannery_web/controllers/user_session_html/new.html.heex:28
#: lib/cannery_web/controllers/user_session_html/new.html.heex:36
#, elixir-autogen, elixir-format
msgid "Log in"
msgstr "Entrar"
@ -111,7 +111,7 @@ msgstr "Nueva Etiqueta"
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:37
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:38
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:25
#: lib/cannery_web/controllers/user_session_html/new.html.heex:35
#: lib/cannery_web/controllers/user_session_html/new.html.heex:43
#, elixir-autogen, elixir-format
msgid "Register"
msgstr "Registrarse"
@ -134,7 +134,7 @@ msgstr "Resetear contraseña"
#: lib/cannery_web/live/pack_live/form_component.html.heex:90
#: lib/cannery_web/live/range_live/form_component.html.heex:44
#: lib/cannery_web/live/tag_live/form_component.html.heex:37
#: lib/cannery_web/live/type_live/form_component.html.heex:353
#: lib/cannery_web/live/type_live/form_component.html.heex:359
#, elixir-autogen, elixir-format
msgid "Save"
msgstr "Guardar"
@ -301,23 +301,24 @@ msgstr ""
msgid "Unstage"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:168
#: lib/cannery_web/live/pack_live/index.html.heex:172
#, elixir-autogen, elixir-format, fuzzy
msgid "Clone pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:183
#: lib/cannery_web/live/pack_live/index.html.heex:187
#: lib/cannery_web/live/pack_live/show.html.heex:71
#, elixir-autogen, elixir-format, fuzzy
msgid "Delete pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:158
#: lib/cannery_web/live/pack_live/index.html.heex:160
#: lib/cannery_web/live/pack_live/show.html.heex:59
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:139
#: lib/cannery_web/live/pack_live/index.html.heex:148
#: lib/cannery_web/live/type_live/show.html.heex:201
#, elixir-autogen, elixir-format, fuzzy
@ -325,29 +326,29 @@ msgid "View pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:159
#: lib/cannery_web/live/range_live/index.html.heex:152
#: lib/cannery_web/live/range_live/index.html.heex:154
#, elixir-autogen, elixir-format, fuzzy
msgid "Delete shot record of %{shot_record_count} shots"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:144
#: lib/cannery_web/live/range_live/index.html.heex:135
#: lib/cannery_web/live/range_live/index.html.heex:137
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit shot record of %{shot_record_count} shots"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:105
#: lib/cannery_web/live/type_live/index.html.heex:107
#, elixir-autogen, elixir-format, fuzzy
msgid "Clone %{type_name}"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:122
#: lib/cannery_web/live/type_live/index.html.heex:124
#: lib/cannery_web/live/type_live/show.html.heex:35
#, elixir-autogen, elixir-format, fuzzy
msgid "Delete %{type_name}"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:97
#: lib/cannery_web/live/type_live/index.html.heex:99
#: lib/cannery_web/live/type_live/show.html.heex:19
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit %{type_name}"
@ -358,7 +359,7 @@ msgstr ""
msgid "New Type"
msgstr "Nuevo tipo de Munición"
#: lib/cannery_web/live/type_live/index.html.heex:89
#: lib/cannery_web/live/type_live/index.html.heex:91
#, elixir-autogen, elixir-format, fuzzy
msgid "View %{type_name}"
msgstr ""

View File

@ -44,24 +44,24 @@ msgid "Background color"
msgstr "Color de fondo"
#: lib/cannery_web/components/type_table_component.ex:86
#: lib/cannery_web/live/type_live/form_component.html.heex:327
#: lib/cannery_web/live/type_live/form_component.html.heex:333
#, elixir-autogen, elixir-format
msgid "Blank"
msgstr "Fogueo"
#: lib/cannery_web/live/type_live/form_component.html.heex:174
#: lib/cannery_web/live/type_live/form_component.html.heex:180
#, elixir-autogen, elixir-format
msgid "Brass"
msgstr "Latón"
#: lib/cannery_web/components/type_table_component.ex:61
#: lib/cannery_web/live/type_live/form_component.html.heex:147
#: lib/cannery_web/live/type_live/form_component.html.heex:151
#, elixir-autogen, elixir-format
msgid "Bullet core"
msgstr "Núcleo de bala"
#: lib/cannery_web/components/type_table_component.ex:59
#: lib/cannery_web/live/type_live/form_component.html.heex:121
#: lib/cannery_web/live/type_live/form_component.html.heex:125
#, elixir-autogen, elixir-format
msgid "Bullet type"
msgstr "Tipo de bala"
@ -79,7 +79,7 @@ msgid "Cartridge"
msgstr "Cartucho"
#: lib/cannery_web/components/type_table_component.ex:66
#: lib/cannery_web/live/type_live/form_component.html.heex:170
#: lib/cannery_web/live/type_live/form_component.html.heex:174
#, elixir-autogen, elixir-format
msgid "Case material"
msgstr "Material del casquillo"
@ -100,7 +100,7 @@ msgid "Containers"
msgstr "Contenedores"
#: lib/cannery_web/components/type_table_component.ex:87
#: lib/cannery_web/live/type_live/form_component.html.heex:331
#: lib/cannery_web/live/type_live/form_component.html.heex:337
#, elixir-autogen, elixir-format
msgid "Corrosive"
msgstr "Corrosiva"
@ -145,19 +145,19 @@ msgstr "Editar Invitación"
msgid "Edit Tag"
msgstr "Editar Etiqueta"
#: lib/cannery_web/live/type_live/form_component.html.heex:135
#: lib/cannery_web/live/type_live/form_component.html.heex:139
#, elixir-autogen, elixir-format
msgid "FMJ"
msgstr "Bala encamisada"
#: lib/cannery_web/components/type_table_component.ex:58
#: lib/cannery_web/live/type_live/form_component.html.heex:111
#: lib/cannery_web/live/type_live/form_component.html.heex:115
#, elixir-autogen, elixir-format
msgid "Grains"
msgstr "Grano"
#: lib/cannery_web/components/type_table_component.ex:85
#: lib/cannery_web/live/type_live/form_component.html.heex:323
#: lib/cannery_web/live/type_live/form_component.html.heex:329
#, elixir-autogen, elixir-format
msgid "Incendiary"
msgstr "Incendiaria"
@ -184,7 +184,7 @@ msgstr "Solo Invitación"
msgid "Invites"
msgstr "Invitaciones"
#: lib/cannery_web/controllers/user_session_html/new.html.heex:23
#: lib/cannery_web/controllers/user_session_html/new.html.heex:31
#, elixir-autogen, elixir-format
msgid "Keep me logged in for 60 days"
msgstr "Mantener registrado durante 60 días"
@ -208,8 +208,8 @@ msgid "Magazine, Clip, Ammo Box, etc"
msgstr "Cargador, Clip, Caja de Munición, etc"
#: lib/cannery_web/components/type_table_component.ex:88
#: lib/cannery_web/live/type_live/form_component.html.heex:336
#: lib/cannery_web/live/type_live/form_component.html.heex:339
#: lib/cannery_web/live/type_live/form_component.html.heex:342
#: lib/cannery_web/live/type_live/form_component.html.heex:345
#, elixir-autogen, elixir-format
msgid "Manufacturer"
msgstr "Fabricante"
@ -299,7 +299,7 @@ msgid "On the bookshelf"
msgstr "En la estantería"
#: lib/cannery_web/components/type_table_component.ex:79
#: lib/cannery_web/live/type_live/form_component.html.heex:260
#: lib/cannery_web/live/type_live/form_component.html.heex:266
#, elixir-autogen, elixir-format
msgid "Pressure"
msgstr "Presión"
@ -316,7 +316,7 @@ msgid "Price paid:"
msgstr "Precio pagado:"
#: lib/cannery_web/components/type_table_component.ex:82
#: lib/cannery_web/live/type_live/form_component.html.heex:299
#: lib/cannery_web/live/type_live/form_component.html.heex:305
#, elixir-autogen, elixir-format
msgid "Primer type"
msgstr "Tipo de espoleta"
@ -349,7 +349,7 @@ msgstr "Ajustes"
msgid "Simple:"
msgstr "Simple:"
#: lib/cannery_web/live/type_live/form_component.html.heex:154
#: lib/cannery_web/live/type_live/form_component.html.heex:158
#, elixir-autogen, elixir-format
msgid "Steel"
msgstr "Acero"
@ -385,7 +385,7 @@ msgid "The self-hosted firearm tracker website"
msgstr "La página de seguimiento de armas autogestionada"
#: lib/cannery_web/components/type_table_component.ex:84
#: lib/cannery_web/live/type_live/form_component.html.heex:319
#: lib/cannery_web/live/type_live/form_component.html.heex:325
#, elixir-autogen, elixir-format
msgid "Tracer"
msgstr "Trazadora"
@ -427,6 +427,8 @@ msgstr "Contenedor sin etiquetas"
#: lib/cannery_web/components/core_components/topbar.html.heex:48
#: lib/cannery_web/components/pack_table_component.ex:80
#: lib/cannery_web/live/range_live/index.ex:55
#: lib/cannery_web/live/range_live/index.ex:65
#, elixir-autogen, elixir-format
msgid "Range"
msgstr "Campo de tiro"
@ -460,13 +462,8 @@ msgstr "No hay munición preparada"
msgid "Record shots"
msgstr "Tiros récord"
#: lib/cannery_web/live/range_live/index.ex:47
#, elixir-autogen, elixir-format
msgid "New Shot Records"
msgstr "Nuevos Tiros Récord"
#: lib/cannery_web/live/range_live/index.html.heex:52
#: lib/cannery_web/live/range_live/index.html.heex:119
#: lib/cannery_web/live/range_live/index.html.heex:121
#, elixir-autogen, elixir-format
msgid "No shots recorded"
msgstr "No se han grabado tiros"
@ -478,12 +475,6 @@ msgstr "No se han grabado tiros"
msgid "Rounds shot"
msgstr "Balas disparadas"
#: lib/cannery_web/live/range_live/index.ex:55
#: lib/cannery_web/live/range_live/index.ex:65
#, elixir-autogen, elixir-format
msgid "Shot Records"
msgstr "Récords de Tiro"
#: lib/cannery_web/live/pack_live/index.ex:43
#, elixir-autogen, elixir-format
msgid "Move ammo"
@ -501,9 +492,9 @@ msgstr "Registro de tiros"
#: lib/cannery_web/components/core_components/pack_card.html.heex:42
#: lib/cannery_web/components/core_components/pack_card.html.heex:47
#: lib/cannery_web/components/pack_table_component.ex:176
#: lib/cannery_web/components/pack_table_component.ex:259
#: lib/cannery_web/components/type_table_component.ex:260
#: lib/cannery_web/components/pack_table_component.ex:181
#: lib/cannery_web/components/pack_table_component.ex:264
#: lib/cannery_web/components/type_table_component.ex:273
#: lib/cannery_web/live/pack_live/show.html.heex:37
#: lib/cannery_web/live/pack_live/show.html.heex:42
#: lib/cannery_web/live/type_live/show.html.heex:150
@ -511,36 +502,36 @@ msgstr "Registro de tiros"
msgid "$%{amount}"
msgstr "$%{amount}"
#: lib/cannery_web/live/type_live/form_component.html.heex:163
#: lib/cannery_web/live/type_live/form_component.html.heex:167
#, elixir-autogen, elixir-format
msgid "Bimetal"
msgstr "Bimetal"
#: lib/cannery_web/components/type_table_component.ex:65
#: lib/cannery_web/live/type_live/form_component.html.heex:159
#: lib/cannery_web/live/type_live/form_component.html.heex:163
#, elixir-autogen, elixir-format
msgid "Jacket type"
msgstr "Tipo de camisa"
#: lib/cannery_web/components/type_table_component.ex:81
#: lib/cannery_web/live/type_live/form_component.html.heex:282
#: lib/cannery_web/live/type_live/form_component.html.heex:288
#, elixir-autogen, elixir-format
msgid "Muzzle velocity"
msgstr "Velocidad de boca"
#: lib/cannery_web/components/type_table_component.ex:75
#: lib/cannery_web/live/type_live/form_component.html.heex:247
#: lib/cannery_web/live/type_live/form_component.html.heex:253
#, elixir-autogen, elixir-format
msgid "Powder grains per charge"
msgstr "Granos de polvora por carga"
#: lib/cannery_web/components/type_table_component.ex:73
#: lib/cannery_web/live/type_live/form_component.html.heex:239
#: lib/cannery_web/live/type_live/form_component.html.heex:245
#, elixir-autogen, elixir-format
msgid "Powder type"
msgstr "Tipo de polvora"
#: lib/cannery_web/live/type_live/form_component.html.heex:346
#: lib/cannery_web/live/type_live/form_component.html.heex:352
#, elixir-autogen, elixir-format
msgid "UPC"
msgstr ""
@ -564,24 +555,24 @@ msgid "New password"
msgstr "Nueva contraseña"
#: lib/cannery_web/components/type_table_component.ex:83
#: lib/cannery_web/live/type_live/form_component.html.heex:307
#: lib/cannery_web/live/type_live/form_component.html.heex:313
#, elixir-autogen, elixir-format
msgid "Firing type"
msgstr "Tipo de fuego"
#: lib/cannery_web/components/layouts/live.html.heex:43
#: lib/cannery_web/components/layouts/app.html.heex:43
#, elixir-autogen, elixir-format
msgid "Reconnecting..."
msgstr "Reconectando..."
#: lib/cannery_web/live/container_live/index.ex:28
#: lib/cannery_web/live/container_live/show.ex:116
#: lib/cannery_web/live/container_live/show.ex:118
#, elixir-autogen, elixir-format
msgid "Edit %{name}"
msgstr "Editar %{name}"
#: lib/cannery_web/live/container_live/index.ex:63
#: lib/cannery_web/live/container_live/show.ex:117
#: lib/cannery_web/live/container_live/show.ex:119
#, elixir-autogen, elixir-format
msgid "Edit %{name} tags"
msgstr "Editar etiquetas de %{name}"
@ -593,9 +584,9 @@ msgstr "Editar etiquetas de %{name}"
msgid "Rounds:"
msgstr "Balas:"
#: lib/cannery_web/components/pack_table_component.ex:173
#: lib/cannery_web/components/pack_table_component.ex:255
#: lib/cannery_web/components/type_table_component.ex:259
#: lib/cannery_web/components/pack_table_component.ex:178
#: lib/cannery_web/components/pack_table_component.ex:260
#: lib/cannery_web/components/type_table_component.ex:272
#: lib/cannery_web/live/type_live/show.html.heex:154
#, elixir-autogen, elixir-format
msgid "No cost information"
@ -658,6 +649,7 @@ msgstr "Reestablecer contraseña"
#: lib/cannery_web/live/pack_live/show.ex:40
#: lib/cannery_web/live/range_live/index.ex:31
#: lib/cannery_web/live/range_live/index.ex:47
#, elixir-autogen, elixir-format
msgid "Record Shots"
msgstr "Tiros Récord"
@ -776,13 +768,13 @@ msgid "Container:"
msgstr "Contenedor:"
#: lib/cannery_web/live/pack_live/index.html.heex:87
#: lib/cannery_web/live/type_live/index.html.heex:64
#: lib/cannery_web/live/type_live/index.html.heex:66
#: lib/cannery_web/live/type_live/show.html.heex:164
#, elixir-autogen, elixir-format
msgid "Show used"
msgstr "Mostrar usadas"
#: lib/cannery_web/components/pack_table_component.ex:214
#: lib/cannery_web/components/pack_table_component.ex:219
#: lib/cannery_web/live/pack_live/show.html.heex:19
#, elixir-autogen, elixir-format
msgid "%{percentage}%"
@ -959,7 +951,7 @@ msgid "Average CPR"
msgstr ""
#: lib/cannery_web/components/core_components/pack_card.html.heex:17
#: lib/cannery_web/components/pack_table_component.ex:263
#: lib/cannery_web/components/pack_table_component.ex:268
#, elixir-autogen, elixir-format
msgid "Empty"
msgstr "Vacio"
@ -999,7 +991,7 @@ msgstr "Usada por última vez en"
msgid "Last used on:"
msgstr "Usada por última vez en:"
#: lib/cannery_web/components/pack_table_component.ex:194
#: lib/cannery_web/components/pack_table_component.ex:199
#, elixir-autogen, elixir-format
msgid "Never used"
msgstr "Nunca usada"
@ -1021,7 +1013,7 @@ msgstr "Comprada en:"
msgid "Edit ammo"
msgstr "Editar munición"
#: lib/cannery_web/live/type_live/index.html.heex:58
#: lib/cannery_web/live/type_live/index.html.heex:60
#, elixir-autogen, elixir-format
msgid "Search catalog"
msgstr ""
@ -1041,7 +1033,7 @@ msgstr ""
msgid "Search tags"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:112
#: lib/cannery_web/live/range_live/index.html.heex:114
#, elixir-autogen, elixir-format
msgid "Search shot records"
msgstr ""
@ -1145,12 +1137,12 @@ msgid "Email"
msgstr ""
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:24
#: lib/cannery_web/controllers/user_session_html/new.html.heex:20
#: lib/cannery_web/controllers/user_session_html/new.html.heex:24
#, elixir-autogen, elixir-format
msgid "Password"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:264
#: lib/cannery_web/live/type_live/form_component.html.heex:270
#, elixir-autogen, elixir-format
msgid "+P"
msgstr ""
@ -1165,12 +1157,12 @@ msgstr ""
msgid "5.56x46mm NATO"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:303
#: lib/cannery_web/live/type_live/form_component.html.heex:309
#, elixir-autogen, elixir-format
msgid "Boxer"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:311
#: lib/cannery_web/live/type_live/form_component.html.heex:317
#, elixir-autogen, elixir-format
msgid "Centerfire"
msgstr ""
@ -1214,13 +1206,13 @@ msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:97
#: lib/cannery_web/live/pack_live/index.html.heex:58
#: lib/cannery_web/live/range_live/index.html.heex:89
#: lib/cannery_web/live/type_live/index.html.heex:35
#: lib/cannery_web/live/range_live/index.html.heex:91
#: lib/cannery_web/live/type_live/index.html.heex:37
#, elixir-autogen, elixir-format
msgid "All"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:316
#: lib/cannery_web/live/type_live/form_component.html.heex:322
#, elixir-autogen, elixir-format
msgid "Attributes"
msgstr ""
@ -1237,7 +1229,7 @@ msgid "Brass height:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:57
#: lib/cannery_web/live/type_live/form_component.html.heex:95
#: lib/cannery_web/live/type_live/form_component.html.heex:97
#, elixir-autogen, elixir-format
msgid "Chamber size"
msgstr ""
@ -1253,7 +1245,7 @@ msgid "Dimensions"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:80
#: lib/cannery_web/live/type_live/form_component.html.heex:269
#: lib/cannery_web/live/type_live/form_component.html.heex:275
#, elixir-autogen, elixir-format
msgid "Dram equivalent"
msgstr ""
@ -1275,7 +1267,7 @@ msgid "Gauge:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:71
#: lib/cannery_web/live/type_live/form_component.html.heex:210
#: lib/cannery_web/live/type_live/form_component.html.heex:216
#, elixir-autogen, elixir-format
msgid "Load grains"
msgstr ""
@ -1297,41 +1289,41 @@ msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:100
#: lib/cannery_web/live/pack_live/index.html.heex:61
#: lib/cannery_web/live/range_live/index.html.heex:92
#: lib/cannery_web/live/range_live/index.html.heex:94
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:38
#: lib/cannery_web/live/type_live/index.html.heex:40
#: lib/cannery_web/live/type_live/show.html.heex:56
#, elixir-autogen, elixir-format
msgid "Pistol"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:236
#: lib/cannery_web/live/type_live/form_component.html.heex:242
#, elixir-autogen, elixir-format, fuzzy
msgid "Powder"
msgstr "Tipo de polvora"
#: lib/cannery_web/live/type_live/form_component.html.heex:296
#: lib/cannery_web/live/type_live/form_component.html.heex:302
#, elixir-autogen, elixir-format, fuzzy
msgid "Primer"
msgstr "Tipo de espoleta"
#: lib/cannery_web/live/type_live/form_component.html.heex:108
#: lib/cannery_web/live/type_live/form_component.html.heex:112
#, elixir-autogen, elixir-format
msgid "Projectile"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:98
#: lib/cannery_web/live/pack_live/index.html.heex:59
#: lib/cannery_web/live/range_live/index.html.heex:90
#: lib/cannery_web/live/range_live/index.html.heex:92
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:36
#: lib/cannery_web/live/type_live/index.html.heex:38
#: lib/cannery_web/live/type_live/show.html.heex:54
#, elixir-autogen, elixir-format
msgid "Rifle"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:72
#: lib/cannery_web/live/type_live/form_component.html.heex:218
#: lib/cannery_web/live/type_live/form_component.html.heex:224
#, elixir-autogen, elixir-format
msgid "Shot charge weight"
msgstr ""
@ -1342,7 +1334,7 @@ msgid "Shot charge weight:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:69
#: lib/cannery_web/live/type_live/form_component.html.heex:194
#: lib/cannery_web/live/type_live/form_component.html.heex:200
#, elixir-autogen, elixir-format
msgid "Shot material"
msgstr ""
@ -1353,7 +1345,7 @@ msgid "Shot material:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:70
#: lib/cannery_web/live/type_live/form_component.html.heex:203
#: lib/cannery_web/live/type_live/form_component.html.heex:209
#, elixir-autogen, elixir-format, fuzzy
msgid "Shot size"
msgstr "Tiros disparados"
@ -1364,7 +1356,7 @@ msgid "Shot size:"
msgstr "Tiros disparados"
#: lib/cannery_web/components/type_table_component.ex:68
#: lib/cannery_web/live/type_live/form_component.html.heex:186
#: lib/cannery_web/live/type_live/form_component.html.heex:192
#, elixir-autogen, elixir-format
msgid "Shot type"
msgstr ""
@ -1376,21 +1368,21 @@ msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:99
#: lib/cannery_web/live/pack_live/index.html.heex:60
#: lib/cannery_web/live/range_live/index.html.heex:91
#: lib/cannery_web/live/range_live/index.html.heex:93
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:37
#: lib/cannery_web/live/type_live/index.html.heex:39
#: lib/cannery_web/live/type_live/show.html.heex:52
#, elixir-autogen, elixir-format
msgid "Shotgun"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:61
#: lib/cannery_web/live/type_live/form_component.html.heex:146
#: lib/cannery_web/live/type_live/form_component.html.heex:150
#, elixir-autogen, elixir-format
msgid "Slug core"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:190
#: lib/cannery_web/live/type_live/form_component.html.heex:196
#, elixir-autogen, elixir-format
msgid "Target, bird, buck, etc"
msgstr ""
@ -1407,7 +1399,7 @@ msgid "Unfired shell length"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:67
#: lib/cannery_web/live/type_live/form_component.html.heex:179
#: lib/cannery_web/live/type_live/form_component.html.heex:185
#, elixir-autogen, elixir-format
msgid "Wadding"
msgstr ""
@ -1458,7 +1450,7 @@ msgid "New Type"
msgstr "Nuevo tipo de Munición"
#: lib/cannery_web/live/type_live/index.html.heex:8
#: lib/cannery_web/live/type_live/index.html.heex:71
#: lib/cannery_web/live/type_live/index.html.heex:73
#, elixir-autogen, elixir-format, fuzzy
msgid "No Types"
msgstr "Tipo"

View File

@ -23,7 +23,7 @@ msgstr ""
## Run "mix gettext.extract" to bring this file up to
## date. Leave "msgstr"s empty as changing them here has no
## effect: edit them in PO (.po) files instead.
#: lib/cannery/containers.ex:220
#: lib/cannery/containers.ex:224
#, elixir-autogen, elixir-format
msgid "Container must be empty before deleting"
msgstr "El contenedor debe estar vacío antes de ser borrado"
@ -168,7 +168,7 @@ msgstr "No se ha podido procesar el número de copias"
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"
#: lib/cannery/ammo.ex:1121
#: lib/cannery/ammo.ex:974
#, elixir-autogen, elixir-format
msgid "Invalid multiplier"
msgstr "Multiplicador inválido"

View File

@ -73,7 +73,7 @@ msgstr "Está seguro que desea eliminar %{email}? Esta acción es permanente!"
msgid "Are you sure you want to delete %{name}?"
msgstr "Está seguro que desea eliminar %{name}?"
#: lib/cannery_web/live/pack_live/index.html.heex:181
#: lib/cannery_web/live/pack_live/index.html.heex:185
#: lib/cannery_web/live/pack_live/show.html.heex:69
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this ammo?"
@ -134,7 +134,7 @@ msgstr "Por favor chequea el correo para verificar tu cuenta"
#: lib/cannery_web/live/pack_live/form_component.html.heex:91
#: lib/cannery_web/live/range_live/form_component.html.heex:46
#: lib/cannery_web/live/tag_live/form_component.html.heex:39
#: lib/cannery_web/live/type_live/form_component.html.heex:354
#: lib/cannery_web/live/type_live/form_component.html.heex:360
#, elixir-autogen, elixir-format
msgid "Saving..."
msgstr "Guardando..."
@ -176,7 +176,7 @@ msgid "Are you sure you want to unstage this ammo?"
msgstr "Está seguro que desea desmontar esta munición?"
#: lib/cannery_web/live/pack_live/show.ex:157
#: lib/cannery_web/live/range_live/index.html.heex:149
#: lib/cannery_web/live/range_live/index.html.heex:151
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?"
msgstr "¿Está segure que quiere borrar este récord de disparos?"
@ -256,7 +256,7 @@ msgid_plural "Ammo added successfully"
msgstr[0] "Munición añadida exitosamente"
msgstr[1] "Municiones añadidas exitosamente"
#: lib/cannery_web/live/type_live/index.html.heex:116
#: lib/cannery_web/live/type_live/index.html.heex:118
#: lib/cannery_web/live/type_live/show.html.heex:29
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!"

View File

@ -69,7 +69,7 @@ msgstr "Supprimer utilisateur"
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:47
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:3
#: lib/cannery_web/controllers/user_session_html/new.html.heex:38
#: lib/cannery_web/controllers/user_session_html/new.html.heex:46
#, elixir-autogen, elixir-format
msgid "Forgot your password?"
msgstr "Mot de passe oublié?"
@ -85,7 +85,7 @@ msgstr "Invitez une nouvelle personne!"
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:41
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:28
#: lib/cannery_web/controllers/user_session_html/new.html.heex:3
#: lib/cannery_web/controllers/user_session_html/new.html.heex:28
#: lib/cannery_web/controllers/user_session_html/new.html.heex:36
#, elixir-autogen, elixir-format
msgid "Log in"
msgstr "Se connecter"
@ -111,7 +111,7 @@ msgstr "Nouveau tag"
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:37
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:38
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:25
#: lib/cannery_web/controllers/user_session_html/new.html.heex:35
#: lib/cannery_web/controllers/user_session_html/new.html.heex:43
#, elixir-autogen, elixir-format
msgid "Register"
msgstr "Senregistrer"
@ -134,7 +134,7 @@ msgstr "Réinitialisé le mot de passe"
#: lib/cannery_web/live/pack_live/form_component.html.heex:90
#: lib/cannery_web/live/range_live/form_component.html.heex:44
#: lib/cannery_web/live/tag_live/form_component.html.heex:37
#: lib/cannery_web/live/type_live/form_component.html.heex:353
#: lib/cannery_web/live/type_live/form_component.html.heex:359
#, elixir-autogen, elixir-format
msgid "Save"
msgstr "Sauvegarder"
@ -301,23 +301,24 @@ msgstr ""
msgid "Unstage"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:168
#: lib/cannery_web/live/pack_live/index.html.heex:172
#, elixir-autogen, elixir-format, fuzzy
msgid "Clone pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:183
#: lib/cannery_web/live/pack_live/index.html.heex:187
#: lib/cannery_web/live/pack_live/show.html.heex:71
#, elixir-autogen, elixir-format, fuzzy
msgid "Delete pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:158
#: lib/cannery_web/live/pack_live/index.html.heex:160
#: lib/cannery_web/live/pack_live/show.html.heex:59
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:139
#: lib/cannery_web/live/pack_live/index.html.heex:148
#: lib/cannery_web/live/type_live/show.html.heex:201
#, elixir-autogen, elixir-format, fuzzy
@ -325,29 +326,29 @@ msgid "View pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:159
#: lib/cannery_web/live/range_live/index.html.heex:152
#: lib/cannery_web/live/range_live/index.html.heex:154
#, elixir-autogen, elixir-format, fuzzy
msgid "Delete shot record of %{shot_record_count} shots"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:144
#: lib/cannery_web/live/range_live/index.html.heex:135
#: lib/cannery_web/live/range_live/index.html.heex:137
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit shot record of %{shot_record_count} shots"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:105
#: lib/cannery_web/live/type_live/index.html.heex:107
#, elixir-autogen, elixir-format, fuzzy
msgid "Clone %{type_name}"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:122
#: lib/cannery_web/live/type_live/index.html.heex:124
#: lib/cannery_web/live/type_live/show.html.heex:35
#, elixir-autogen, elixir-format, fuzzy
msgid "Delete %{type_name}"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:97
#: lib/cannery_web/live/type_live/index.html.heex:99
#: lib/cannery_web/live/type_live/show.html.heex:19
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit %{type_name}"
@ -358,7 +359,7 @@ msgstr ""
msgid "New Type"
msgstr "Nouveau type de munition"
#: lib/cannery_web/live/type_live/index.html.heex:89
#: lib/cannery_web/live/type_live/index.html.heex:91
#, elixir-autogen, elixir-format, fuzzy
msgid "View %{type_name}"
msgstr ""

View File

@ -44,24 +44,24 @@ msgid "Background color"
msgstr "Couleur de fond"
#: lib/cannery_web/components/type_table_component.ex:86
#: lib/cannery_web/live/type_live/form_component.html.heex:327
#: lib/cannery_web/live/type_live/form_component.html.heex:333
#, elixir-autogen, elixir-format
msgid "Blank"
msgstr "Vide"
#: lib/cannery_web/live/type_live/form_component.html.heex:174
#: lib/cannery_web/live/type_live/form_component.html.heex:180
#, elixir-autogen, elixir-format
msgid "Brass"
msgstr "Cuivre"
#: lib/cannery_web/components/type_table_component.ex:61
#: lib/cannery_web/live/type_live/form_component.html.heex:147
#: lib/cannery_web/live/type_live/form_component.html.heex:151
#, elixir-autogen, elixir-format
msgid "Bullet core"
msgstr "Noyau de balle"
#: lib/cannery_web/components/type_table_component.ex:59
#: lib/cannery_web/live/type_live/form_component.html.heex:121
#: lib/cannery_web/live/type_live/form_component.html.heex:125
#, elixir-autogen, elixir-format
msgid "Bullet type"
msgstr "Type de balle"
@ -79,7 +79,7 @@ msgid "Cartridge"
msgstr "Cartouche"
#: lib/cannery_web/components/type_table_component.ex:66
#: lib/cannery_web/live/type_live/form_component.html.heex:170
#: lib/cannery_web/live/type_live/form_component.html.heex:174
#, elixir-autogen, elixir-format
msgid "Case material"
msgstr "Matériau de la caisse"
@ -100,7 +100,7 @@ msgid "Containers"
msgstr "Conteneurs"
#: lib/cannery_web/components/type_table_component.ex:87
#: lib/cannery_web/live/type_live/form_component.html.heex:331
#: lib/cannery_web/live/type_live/form_component.html.heex:337
#, elixir-autogen, elixir-format
msgid "Corrosive"
msgstr "Corrosive"
@ -145,19 +145,19 @@ msgstr "Modifier linvitation"
msgid "Edit Tag"
msgstr "Modifier le tag"
#: lib/cannery_web/live/type_live/form_component.html.heex:135
#: lib/cannery_web/live/type_live/form_component.html.heex:139
#, elixir-autogen, elixir-format
msgid "FMJ"
msgstr "FMJ"
#: lib/cannery_web/components/type_table_component.ex:58
#: lib/cannery_web/live/type_live/form_component.html.heex:111
#: lib/cannery_web/live/type_live/form_component.html.heex:115
#, elixir-autogen, elixir-format
msgid "Grains"
msgstr "Graines"
#: lib/cannery_web/components/type_table_component.ex:85
#: lib/cannery_web/live/type_live/form_component.html.heex:323
#: lib/cannery_web/live/type_live/form_component.html.heex:329
#, elixir-autogen, elixir-format
msgid "Incendiary"
msgstr "Incendiaire"
@ -184,7 +184,7 @@ msgstr "Uniquement sur invitation"
msgid "Invites"
msgstr "Invitations"
#: lib/cannery_web/controllers/user_session_html/new.html.heex:23
#: lib/cannery_web/controllers/user_session_html/new.html.heex:31
#, elixir-autogen, elixir-format
msgid "Keep me logged in for 60 days"
msgstr "Me garder authentifié durant 60 jours"
@ -208,8 +208,8 @@ msgid "Magazine, Clip, Ammo Box, etc"
msgstr "Chargeur, lame-chargeur, boite de munition, etc."
#: lib/cannery_web/components/type_table_component.ex:88
#: lib/cannery_web/live/type_live/form_component.html.heex:336
#: lib/cannery_web/live/type_live/form_component.html.heex:339
#: lib/cannery_web/live/type_live/form_component.html.heex:342
#: lib/cannery_web/live/type_live/form_component.html.heex:345
#, elixir-autogen, elixir-format
msgid "Manufacturer"
msgstr "Fabricant"
@ -299,7 +299,7 @@ msgid "On the bookshelf"
msgstr "Sur létagère"
#: lib/cannery_web/components/type_table_component.ex:79
#: lib/cannery_web/live/type_live/form_component.html.heex:260
#: lib/cannery_web/live/type_live/form_component.html.heex:266
#, elixir-autogen, elixir-format
msgid "Pressure"
msgstr "Pression"
@ -316,7 +316,7 @@ msgid "Price paid:"
msgstr "Prix payé:"
#: lib/cannery_web/components/type_table_component.ex:82
#: lib/cannery_web/live/type_live/form_component.html.heex:299
#: lib/cannery_web/live/type_live/form_component.html.heex:305
#, elixir-autogen, elixir-format
msgid "Primer type"
msgstr "Type damorce"
@ -349,7 +349,7 @@ msgstr "Paramètres"
msgid "Simple:"
msgstr "Simple:"
#: lib/cannery_web/live/type_live/form_component.html.heex:154
#: lib/cannery_web/live/type_live/form_component.html.heex:158
#, elixir-autogen, elixir-format
msgid "Steel"
msgstr "Acier"
@ -386,7 +386,7 @@ msgid "The self-hosted firearm tracker website"
msgstr "Le site web de suivi darme à feux auto-hébergé"
#: lib/cannery_web/components/type_table_component.ex:84
#: lib/cannery_web/live/type_live/form_component.html.heex:319
#: lib/cannery_web/live/type_live/form_component.html.heex:325
#, elixir-autogen, elixir-format
msgid "Tracer"
msgstr "Traceuse"
@ -428,6 +428,8 @@ msgstr "Aucun tag pour ce conteneur"
#: lib/cannery_web/components/core_components/topbar.html.heex:48
#: lib/cannery_web/components/pack_table_component.ex:80
#: lib/cannery_web/live/range_live/index.ex:55
#: lib/cannery_web/live/range_live/index.ex:65
#, elixir-autogen, elixir-format
msgid "Range"
msgstr "Portée"
@ -461,13 +463,8 @@ msgstr "Aucune munition sélectionnée"
msgid "Record shots"
msgstr "Tirs enregistrés"
#: lib/cannery_web/live/range_live/index.ex:47
#, elixir-autogen, elixir-format
msgid "New Shot Records"
msgstr "Nouveaux enregistrements de tir"
#: lib/cannery_web/live/range_live/index.html.heex:52
#: lib/cannery_web/live/range_live/index.html.heex:119
#: lib/cannery_web/live/range_live/index.html.heex:121
#, elixir-autogen, elixir-format
msgid "No shots recorded"
msgstr "Aucun tir enregistré"
@ -479,12 +476,6 @@ msgstr "Aucun tir enregistré"
msgid "Rounds shot"
msgstr "Cartouches tirées"
#: lib/cannery_web/live/range_live/index.ex:55
#: lib/cannery_web/live/range_live/index.ex:65
#, elixir-autogen, elixir-format
msgid "Shot Records"
msgstr "Enregistrements de tir"
#: lib/cannery_web/live/pack_live/index.ex:43
#, elixir-autogen, elixir-format
msgid "Move ammo"
@ -502,9 +493,9 @@ msgstr "Évènements de tir"
#: lib/cannery_web/components/core_components/pack_card.html.heex:42
#: lib/cannery_web/components/core_components/pack_card.html.heex:47
#: lib/cannery_web/components/pack_table_component.ex:176
#: lib/cannery_web/components/pack_table_component.ex:259
#: lib/cannery_web/components/type_table_component.ex:260
#: lib/cannery_web/components/pack_table_component.ex:181
#: lib/cannery_web/components/pack_table_component.ex:264
#: lib/cannery_web/components/type_table_component.ex:273
#: lib/cannery_web/live/pack_live/show.html.heex:37
#: lib/cannery_web/live/pack_live/show.html.heex:42
#: lib/cannery_web/live/type_live/show.html.heex:150
@ -512,36 +503,36 @@ msgstr "Évènements de tir"
msgid "$%{amount}"
msgstr "%{amount}$"
#: lib/cannery_web/live/type_live/form_component.html.heex:163
#: lib/cannery_web/live/type_live/form_component.html.heex:167
#, elixir-autogen, elixir-format
msgid "Bimetal"
msgstr "Bi-métal"
#: lib/cannery_web/components/type_table_component.ex:65
#: lib/cannery_web/live/type_live/form_component.html.heex:159
#: lib/cannery_web/live/type_live/form_component.html.heex:163
#, elixir-autogen, elixir-format
msgid "Jacket type"
msgstr "Type de douille"
#: lib/cannery_web/components/type_table_component.ex:81
#: lib/cannery_web/live/type_live/form_component.html.heex:282
#: lib/cannery_web/live/type_live/form_component.html.heex:288
#, elixir-autogen, elixir-format
msgid "Muzzle velocity"
msgstr "Vélocité du canon"
#: lib/cannery_web/components/type_table_component.ex:75
#: lib/cannery_web/live/type_live/form_component.html.heex:247
#: lib/cannery_web/live/type_live/form_component.html.heex:253
#, elixir-autogen, elixir-format
msgid "Powder grains per charge"
msgstr "Graines de poudre par charge"
#: lib/cannery_web/components/type_table_component.ex:73
#: lib/cannery_web/live/type_live/form_component.html.heex:239
#: lib/cannery_web/live/type_live/form_component.html.heex:245
#, elixir-autogen, elixir-format
msgid "Powder type"
msgstr "Type de poudre"
#: lib/cannery_web/live/type_live/form_component.html.heex:346
#: lib/cannery_web/live/type_live/form_component.html.heex:352
#, elixir-autogen, elixir-format
msgid "UPC"
msgstr "UPC"
@ -565,24 +556,24 @@ msgid "New password"
msgstr "Nouveau mot de passe"
#: lib/cannery_web/components/type_table_component.ex:83
#: lib/cannery_web/live/type_live/form_component.html.heex:307
#: lib/cannery_web/live/type_live/form_component.html.heex:313
#, elixir-autogen, elixir-format
msgid "Firing type"
msgstr "Type dallumage"
#: lib/cannery_web/components/layouts/live.html.heex:43
#: lib/cannery_web/components/layouts/app.html.heex:43
#, elixir-autogen, elixir-format
msgid "Reconnecting..."
msgstr "Reconnexion en cours…"
#: lib/cannery_web/live/container_live/index.ex:28
#: lib/cannery_web/live/container_live/show.ex:116
#: lib/cannery_web/live/container_live/show.ex:118
#, elixir-autogen, elixir-format
msgid "Edit %{name}"
msgstr "Éditer %{name}"
#: lib/cannery_web/live/container_live/index.ex:63
#: lib/cannery_web/live/container_live/show.ex:117
#: lib/cannery_web/live/container_live/show.ex:119
#, elixir-autogen, elixir-format
msgid "Edit %{name} tags"
msgstr "Éditer les tags de %{name}"
@ -594,9 +585,9 @@ msgstr "Éditer les tags de %{name}"
msgid "Rounds:"
msgstr "Cartouches:"
#: lib/cannery_web/components/pack_table_component.ex:173
#: lib/cannery_web/components/pack_table_component.ex:255
#: lib/cannery_web/components/type_table_component.ex:259
#: lib/cannery_web/components/pack_table_component.ex:178
#: lib/cannery_web/components/pack_table_component.ex:260
#: lib/cannery_web/components/type_table_component.ex:272
#: lib/cannery_web/live/type_live/show.html.heex:154
#, elixir-autogen, elixir-format
msgid "No cost information"
@ -659,6 +650,7 @@ msgstr "Réinitialiser votre mot de passe"
#: lib/cannery_web/live/pack_live/show.ex:40
#: lib/cannery_web/live/range_live/index.ex:31
#: lib/cannery_web/live/range_live/index.ex:47
#, elixir-autogen, elixir-format
msgid "Record Shots"
msgstr "Enregistrer des tirs"
@ -777,13 +769,13 @@ msgid "Container:"
msgstr "Conteneur"
#: lib/cannery_web/live/pack_live/index.html.heex:87
#: lib/cannery_web/live/type_live/index.html.heex:64
#: lib/cannery_web/live/type_live/index.html.heex:66
#: lib/cannery_web/live/type_live/show.html.heex:164
#, elixir-autogen, elixir-format
msgid "Show used"
msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:214
#: lib/cannery_web/components/pack_table_component.ex:219
#: lib/cannery_web/live/pack_live/show.html.heex:19
#, elixir-autogen, elixir-format
msgid "%{percentage}%"
@ -960,7 +952,7 @@ msgid "Average CPR"
msgstr ""
#: lib/cannery_web/components/core_components/pack_card.html.heex:17
#: lib/cannery_web/components/pack_table_component.ex:263
#: lib/cannery_web/components/pack_table_component.ex:268
#, elixir-autogen, elixir-format
msgid "Empty"
msgstr ""
@ -1000,7 +992,7 @@ msgstr ""
msgid "Last used on:"
msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:194
#: lib/cannery_web/components/pack_table_component.ex:199
#, elixir-autogen, elixir-format
msgid "Never used"
msgstr ""
@ -1022,7 +1014,7 @@ msgstr ""
msgid "Edit ammo"
msgstr "Éditer le type de munition"
#: lib/cannery_web/live/type_live/index.html.heex:58
#: lib/cannery_web/live/type_live/index.html.heex:60
#, elixir-autogen, elixir-format
msgid "Search catalog"
msgstr ""
@ -1042,7 +1034,7 @@ msgstr ""
msgid "Search tags"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:112
#: lib/cannery_web/live/range_live/index.html.heex:114
#, elixir-autogen, elixir-format
msgid "Search shot records"
msgstr ""
@ -1146,12 +1138,12 @@ msgid "Email"
msgstr ""
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:24
#: lib/cannery_web/controllers/user_session_html/new.html.heex:20
#: lib/cannery_web/controllers/user_session_html/new.html.heex:24
#, elixir-autogen, elixir-format
msgid "Password"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:264
#: lib/cannery_web/live/type_live/form_component.html.heex:270
#, elixir-autogen, elixir-format
msgid "+P"
msgstr ""
@ -1166,12 +1158,12 @@ msgstr ""
msgid "5.56x46mm NATO"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:303
#: lib/cannery_web/live/type_live/form_component.html.heex:309
#, elixir-autogen, elixir-format
msgid "Boxer"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:311
#: lib/cannery_web/live/type_live/form_component.html.heex:317
#, elixir-autogen, elixir-format
msgid "Centerfire"
msgstr ""
@ -1215,13 +1207,13 @@ msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:97
#: lib/cannery_web/live/pack_live/index.html.heex:58
#: lib/cannery_web/live/range_live/index.html.heex:89
#: lib/cannery_web/live/type_live/index.html.heex:35
#: lib/cannery_web/live/range_live/index.html.heex:91
#: lib/cannery_web/live/type_live/index.html.heex:37
#, elixir-autogen, elixir-format
msgid "All"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:316
#: lib/cannery_web/live/type_live/form_component.html.heex:322
#, elixir-autogen, elixir-format
msgid "Attributes"
msgstr ""
@ -1238,7 +1230,7 @@ msgid "Brass height:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:57
#: lib/cannery_web/live/type_live/form_component.html.heex:95
#: lib/cannery_web/live/type_live/form_component.html.heex:97
#, elixir-autogen, elixir-format
msgid "Chamber size"
msgstr ""
@ -1254,7 +1246,7 @@ msgid "Dimensions"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:80
#: lib/cannery_web/live/type_live/form_component.html.heex:269
#: lib/cannery_web/live/type_live/form_component.html.heex:275
#, elixir-autogen, elixir-format
msgid "Dram equivalent"
msgstr ""
@ -1276,7 +1268,7 @@ msgid "Gauge:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:71
#: lib/cannery_web/live/type_live/form_component.html.heex:210
#: lib/cannery_web/live/type_live/form_component.html.heex:216
#, elixir-autogen, elixir-format
msgid "Load grains"
msgstr ""
@ -1298,41 +1290,41 @@ msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:100
#: lib/cannery_web/live/pack_live/index.html.heex:61
#: lib/cannery_web/live/range_live/index.html.heex:92
#: lib/cannery_web/live/range_live/index.html.heex:94
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:38
#: lib/cannery_web/live/type_live/index.html.heex:40
#: lib/cannery_web/live/type_live/show.html.heex:56
#, elixir-autogen, elixir-format
msgid "Pistol"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:236
#: lib/cannery_web/live/type_live/form_component.html.heex:242
#, elixir-autogen, elixir-format, fuzzy
msgid "Powder"
msgstr "Type de poudre"
#: lib/cannery_web/live/type_live/form_component.html.heex:296
#: lib/cannery_web/live/type_live/form_component.html.heex:302
#, elixir-autogen, elixir-format, fuzzy
msgid "Primer"
msgstr "Type damorce"
#: lib/cannery_web/live/type_live/form_component.html.heex:108
#: lib/cannery_web/live/type_live/form_component.html.heex:112
#, elixir-autogen, elixir-format
msgid "Projectile"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:98
#: lib/cannery_web/live/pack_live/index.html.heex:59
#: lib/cannery_web/live/range_live/index.html.heex:90
#: lib/cannery_web/live/range_live/index.html.heex:92
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:36
#: lib/cannery_web/live/type_live/index.html.heex:38
#: lib/cannery_web/live/type_live/show.html.heex:54
#, elixir-autogen, elixir-format
msgid "Rifle"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:72
#: lib/cannery_web/live/type_live/form_component.html.heex:218
#: lib/cannery_web/live/type_live/form_component.html.heex:224
#, elixir-autogen, elixir-format
msgid "Shot charge weight"
msgstr ""
@ -1343,7 +1335,7 @@ msgid "Shot charge weight:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:69
#: lib/cannery_web/live/type_live/form_component.html.heex:194
#: lib/cannery_web/live/type_live/form_component.html.heex:200
#, elixir-autogen, elixir-format
msgid "Shot material"
msgstr ""
@ -1354,7 +1346,7 @@ msgid "Shot material:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:70
#: lib/cannery_web/live/type_live/form_component.html.heex:203
#: lib/cannery_web/live/type_live/form_component.html.heex:209
#, elixir-autogen, elixir-format, fuzzy
msgid "Shot size"
msgstr "Tirs réalisés"
@ -1365,7 +1357,7 @@ msgid "Shot size:"
msgstr "Tirs réalisés"
#: lib/cannery_web/components/type_table_component.ex:68
#: lib/cannery_web/live/type_live/form_component.html.heex:186
#: lib/cannery_web/live/type_live/form_component.html.heex:192
#, elixir-autogen, elixir-format
msgid "Shot type"
msgstr ""
@ -1377,21 +1369,21 @@ msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:99
#: lib/cannery_web/live/pack_live/index.html.heex:60
#: lib/cannery_web/live/range_live/index.html.heex:91
#: lib/cannery_web/live/range_live/index.html.heex:93
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:37
#: lib/cannery_web/live/type_live/index.html.heex:39
#: lib/cannery_web/live/type_live/show.html.heex:52
#, elixir-autogen, elixir-format
msgid "Shotgun"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:61
#: lib/cannery_web/live/type_live/form_component.html.heex:146
#: lib/cannery_web/live/type_live/form_component.html.heex:150
#, elixir-autogen, elixir-format
msgid "Slug core"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:190
#: lib/cannery_web/live/type_live/form_component.html.heex:196
#, elixir-autogen, elixir-format
msgid "Target, bird, buck, etc"
msgstr ""
@ -1408,7 +1400,7 @@ msgid "Unfired shell length"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:67
#: lib/cannery_web/live/type_live/form_component.html.heex:179
#: lib/cannery_web/live/type_live/form_component.html.heex:185
#, elixir-autogen, elixir-format
msgid "Wadding"
msgstr ""
@ -1459,7 +1451,7 @@ msgid "New Type"
msgstr "Nouveau type de munition"
#: lib/cannery_web/live/type_live/index.html.heex:8
#: lib/cannery_web/live/type_live/index.html.heex:71
#: lib/cannery_web/live/type_live/index.html.heex:73
#, elixir-autogen, elixir-format, fuzzy
msgid "No Types"
msgstr "Type"

View File

@ -23,7 +23,7 @@ msgstr ""
# # Run "mix gettext.extract" to bring this file up to
# # date. Leave "msgstr"s empty as changing them here has no
# # effect: edit them in PO (.po) files instead.
#: lib/cannery/containers.ex:220
#: lib/cannery/containers.ex:224
#, elixir-autogen, elixir-format
msgid "Container must be empty before deleting"
msgstr "Le conteneur doit être vide pour être supprimé"
@ -169,7 +169,7 @@ msgstr "Impossible d'analyser le nombre de copies"
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}"
#: lib/cannery/ammo.ex:1121
#: lib/cannery/ammo.ex:974
#, elixir-autogen, elixir-format
msgid "Invalid multiplier"
msgstr "Multiplicateur invalide"

View File

@ -74,7 +74,7 @@ msgstr ""
msgid "Are you sure you want to delete %{name}?"
msgstr "Êtes-vous certain·e de supprimer %{name}?"
#: lib/cannery_web/live/pack_live/index.html.heex:181
#: lib/cannery_web/live/pack_live/index.html.heex:185
#: lib/cannery_web/live/pack_live/show.html.heex:69
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this ammo?"
@ -135,7 +135,7 @@ msgstr "Veuillez vérifier votre mél pour confirmer votre compte"
#: lib/cannery_web/live/pack_live/form_component.html.heex:91
#: lib/cannery_web/live/range_live/form_component.html.heex:46
#: lib/cannery_web/live/tag_live/form_component.html.heex:39
#: lib/cannery_web/live/type_live/form_component.html.heex:354
#: lib/cannery_web/live/type_live/form_component.html.heex:360
#, elixir-autogen, elixir-format
msgid "Saving..."
msgstr "Sauvegarde en cours…"
@ -178,7 +178,7 @@ msgid "Are you sure you want to unstage this ammo?"
msgstr "Êtes-vous certain·e de vouloir désélectionner cette munition?"
#: lib/cannery_web/live/pack_live/show.ex:157
#: lib/cannery_web/live/range_live/index.html.heex:149
#: lib/cannery_web/live/range_live/index.html.heex:151
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?"
msgstr "Êtes-vous certain·e de vouloir supprimer cet enregistrement de tir?"
@ -258,7 +258,7 @@ msgid_plural "Ammo added successfully"
msgstr[0] "Groupe de munition mis à jour avec succès"
msgstr[1] "Groupe de munition mis à jour avec succès"
#: lib/cannery_web/live/type_live/index.html.heex:116
#: lib/cannery_web/live/type_live/index.html.heex:118
#: lib/cannery_web/live/type_live/show.html.heex:29
#, elixir-autogen, elixir-format, fuzzy
msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!"

View File

@ -67,7 +67,7 @@ msgstr ""
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:47
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:3
#: lib/cannery_web/controllers/user_session_html/new.html.heex:38
#: lib/cannery_web/controllers/user_session_html/new.html.heex:46
#, elixir-autogen, elixir-format
msgid "Forgot your password?"
msgstr ""
@ -83,7 +83,7 @@ msgstr ""
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:41
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:28
#: lib/cannery_web/controllers/user_session_html/new.html.heex:3
#: lib/cannery_web/controllers/user_session_html/new.html.heex:28
#: lib/cannery_web/controllers/user_session_html/new.html.heex:36
#, elixir-autogen, elixir-format
msgid "Log in"
msgstr ""
@ -109,7 +109,7 @@ msgstr ""
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:37
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:38
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:25
#: lib/cannery_web/controllers/user_session_html/new.html.heex:35
#: lib/cannery_web/controllers/user_session_html/new.html.heex:43
#, elixir-autogen, elixir-format
msgid "Register"
msgstr ""
@ -132,7 +132,7 @@ msgstr ""
#: lib/cannery_web/live/pack_live/form_component.html.heex:90
#: lib/cannery_web/live/range_live/form_component.html.heex:44
#: lib/cannery_web/live/tag_live/form_component.html.heex:37
#: lib/cannery_web/live/type_live/form_component.html.heex:353
#: lib/cannery_web/live/type_live/form_component.html.heex:359
#, elixir-autogen, elixir-format
msgid "Save"
msgstr ""
@ -299,23 +299,24 @@ msgstr ""
msgid "Unstage"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:168
#: lib/cannery_web/live/pack_live/index.html.heex:172
#, elixir-autogen, elixir-format, fuzzy
msgid "Clone pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:183
#: lib/cannery_web/live/pack_live/index.html.heex:187
#: lib/cannery_web/live/pack_live/show.html.heex:71
#, elixir-autogen, elixir-format, fuzzy
msgid "Delete pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:158
#: lib/cannery_web/live/pack_live/index.html.heex:160
#: lib/cannery_web/live/pack_live/show.html.heex:59
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:139
#: lib/cannery_web/live/pack_live/index.html.heex:148
#: lib/cannery_web/live/type_live/show.html.heex:201
#, elixir-autogen, elixir-format, fuzzy
@ -323,29 +324,29 @@ msgid "View pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:159
#: lib/cannery_web/live/range_live/index.html.heex:152
#: lib/cannery_web/live/range_live/index.html.heex:154
#, elixir-autogen, elixir-format, fuzzy
msgid "Delete shot record of %{shot_record_count} shots"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:144
#: lib/cannery_web/live/range_live/index.html.heex:135
#: lib/cannery_web/live/range_live/index.html.heex:137
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit shot record of %{shot_record_count} shots"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:105
#: lib/cannery_web/live/type_live/index.html.heex:107
#, elixir-autogen, elixir-format, fuzzy
msgid "Clone %{type_name}"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:122
#: lib/cannery_web/live/type_live/index.html.heex:124
#: lib/cannery_web/live/type_live/show.html.heex:35
#, elixir-autogen, elixir-format, fuzzy
msgid "Delete %{type_name}"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:97
#: lib/cannery_web/live/type_live/index.html.heex:99
#: lib/cannery_web/live/type_live/show.html.heex:19
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit %{type_name}"
@ -356,7 +357,7 @@ msgstr ""
msgid "New Type"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:89
#: lib/cannery_web/live/type_live/index.html.heex:91
#, elixir-autogen, elixir-format, fuzzy
msgid "View %{type_name}"
msgstr ""

View File

@ -42,24 +42,24 @@ msgid "Background color"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:86
#: lib/cannery_web/live/type_live/form_component.html.heex:327
#: lib/cannery_web/live/type_live/form_component.html.heex:333
#, elixir-autogen, elixir-format
msgid "Blank"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:174
#: lib/cannery_web/live/type_live/form_component.html.heex:180
#, elixir-autogen, elixir-format
msgid "Brass"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:61
#: lib/cannery_web/live/type_live/form_component.html.heex:147
#: lib/cannery_web/live/type_live/form_component.html.heex:151
#, elixir-autogen, elixir-format
msgid "Bullet core"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:59
#: lib/cannery_web/live/type_live/form_component.html.heex:121
#: lib/cannery_web/live/type_live/form_component.html.heex:125
#, elixir-autogen, elixir-format
msgid "Bullet type"
msgstr ""
@ -77,7 +77,7 @@ msgid "Cartridge"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:66
#: lib/cannery_web/live/type_live/form_component.html.heex:170
#: lib/cannery_web/live/type_live/form_component.html.heex:174
#, elixir-autogen, elixir-format
msgid "Case material"
msgstr ""
@ -98,7 +98,7 @@ msgid "Containers"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:87
#: lib/cannery_web/live/type_live/form_component.html.heex:331
#: lib/cannery_web/live/type_live/form_component.html.heex:337
#, elixir-autogen, elixir-format
msgid "Corrosive"
msgstr ""
@ -143,19 +143,19 @@ msgstr ""
msgid "Edit Tag"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:135
#: lib/cannery_web/live/type_live/form_component.html.heex:139
#, elixir-autogen, elixir-format
msgid "FMJ"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:58
#: lib/cannery_web/live/type_live/form_component.html.heex:111
#: lib/cannery_web/live/type_live/form_component.html.heex:115
#, elixir-autogen, elixir-format
msgid "Grains"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:85
#: lib/cannery_web/live/type_live/form_component.html.heex:323
#: lib/cannery_web/live/type_live/form_component.html.heex:329
#, elixir-autogen, elixir-format
msgid "Incendiary"
msgstr ""
@ -182,7 +182,7 @@ msgstr ""
msgid "Invites"
msgstr ""
#: lib/cannery_web/controllers/user_session_html/new.html.heex:23
#: lib/cannery_web/controllers/user_session_html/new.html.heex:31
#, elixir-autogen, elixir-format
msgid "Keep me logged in for 60 days"
msgstr ""
@ -206,8 +206,8 @@ msgid "Magazine, Clip, Ammo Box, etc"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:88
#: lib/cannery_web/live/type_live/form_component.html.heex:336
#: lib/cannery_web/live/type_live/form_component.html.heex:339
#: lib/cannery_web/live/type_live/form_component.html.heex:342
#: lib/cannery_web/live/type_live/form_component.html.heex:345
#, elixir-autogen, elixir-format
msgid "Manufacturer"
msgstr ""
@ -297,7 +297,7 @@ msgid "On the bookshelf"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:79
#: lib/cannery_web/live/type_live/form_component.html.heex:260
#: lib/cannery_web/live/type_live/form_component.html.heex:266
#, elixir-autogen, elixir-format
msgid "Pressure"
msgstr ""
@ -314,7 +314,7 @@ msgid "Price paid:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:82
#: lib/cannery_web/live/type_live/form_component.html.heex:299
#: lib/cannery_web/live/type_live/form_component.html.heex:305
#, elixir-autogen, elixir-format
msgid "Primer type"
msgstr ""
@ -345,7 +345,7 @@ msgstr ""
msgid "Simple:"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:154
#: lib/cannery_web/live/type_live/form_component.html.heex:158
#, elixir-autogen, elixir-format
msgid "Steel"
msgstr ""
@ -380,7 +380,7 @@ msgid "The self-hosted firearm tracker website"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:84
#: lib/cannery_web/live/type_live/form_component.html.heex:319
#: lib/cannery_web/live/type_live/form_component.html.heex:325
#, elixir-autogen, elixir-format
msgid "Tracer"
msgstr ""
@ -422,6 +422,8 @@ msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:48
#: lib/cannery_web/components/pack_table_component.ex:80
#: lib/cannery_web/live/range_live/index.ex:55
#: lib/cannery_web/live/range_live/index.ex:65
#, elixir-autogen, elixir-format
msgid "Range"
msgstr ""
@ -455,13 +457,8 @@ msgstr ""
msgid "Record shots"
msgstr ""
#: lib/cannery_web/live/range_live/index.ex:47
#, elixir-autogen, elixir-format
msgid "New Shot Records"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:52
#: lib/cannery_web/live/range_live/index.html.heex:119
#: lib/cannery_web/live/range_live/index.html.heex:121
#, elixir-autogen, elixir-format
msgid "No shots recorded"
msgstr ""
@ -473,12 +470,6 @@ msgstr ""
msgid "Rounds shot"
msgstr ""
#: lib/cannery_web/live/range_live/index.ex:55
#: lib/cannery_web/live/range_live/index.ex:65
#, elixir-autogen, elixir-format
msgid "Shot Records"
msgstr ""
#: lib/cannery_web/live/pack_live/index.ex:43
#, elixir-autogen, elixir-format
msgid "Move ammo"
@ -496,9 +487,9 @@ msgstr ""
#: lib/cannery_web/components/core_components/pack_card.html.heex:42
#: lib/cannery_web/components/core_components/pack_card.html.heex:47
#: lib/cannery_web/components/pack_table_component.ex:176
#: lib/cannery_web/components/pack_table_component.ex:259
#: lib/cannery_web/components/type_table_component.ex:260
#: lib/cannery_web/components/pack_table_component.ex:181
#: lib/cannery_web/components/pack_table_component.ex:264
#: lib/cannery_web/components/type_table_component.ex:273
#: lib/cannery_web/live/pack_live/show.html.heex:37
#: lib/cannery_web/live/pack_live/show.html.heex:42
#: lib/cannery_web/live/type_live/show.html.heex:150
@ -506,36 +497,36 @@ msgstr ""
msgid "$%{amount}"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:163
#: lib/cannery_web/live/type_live/form_component.html.heex:167
#, elixir-autogen, elixir-format
msgid "Bimetal"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:65
#: lib/cannery_web/live/type_live/form_component.html.heex:159
#: lib/cannery_web/live/type_live/form_component.html.heex:163
#, elixir-autogen, elixir-format
msgid "Jacket type"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:81
#: lib/cannery_web/live/type_live/form_component.html.heex:282
#: lib/cannery_web/live/type_live/form_component.html.heex:288
#, elixir-autogen, elixir-format
msgid "Muzzle velocity"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:75
#: lib/cannery_web/live/type_live/form_component.html.heex:247
#: lib/cannery_web/live/type_live/form_component.html.heex:253
#, elixir-autogen, elixir-format
msgid "Powder grains per charge"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:73
#: lib/cannery_web/live/type_live/form_component.html.heex:239
#: lib/cannery_web/live/type_live/form_component.html.heex:245
#, elixir-autogen, elixir-format
msgid "Powder type"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:346
#: lib/cannery_web/live/type_live/form_component.html.heex:352
#, elixir-autogen, elixir-format
msgid "UPC"
msgstr ""
@ -559,24 +550,24 @@ msgid "New password"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:83
#: lib/cannery_web/live/type_live/form_component.html.heex:307
#: lib/cannery_web/live/type_live/form_component.html.heex:313
#, elixir-autogen, elixir-format
msgid "Firing type"
msgstr ""
#: lib/cannery_web/components/layouts/live.html.heex:43
#: lib/cannery_web/components/layouts/app.html.heex:43
#, elixir-autogen, elixir-format
msgid "Reconnecting..."
msgstr ""
#: lib/cannery_web/live/container_live/index.ex:28
#: lib/cannery_web/live/container_live/show.ex:116
#: lib/cannery_web/live/container_live/show.ex:118
#, elixir-autogen, elixir-format
msgid "Edit %{name}"
msgstr ""
#: lib/cannery_web/live/container_live/index.ex:63
#: lib/cannery_web/live/container_live/show.ex:117
#: lib/cannery_web/live/container_live/show.ex:119
#, elixir-autogen, elixir-format
msgid "Edit %{name} tags"
msgstr ""
@ -588,9 +579,9 @@ msgstr ""
msgid "Rounds:"
msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:173
#: lib/cannery_web/components/pack_table_component.ex:255
#: lib/cannery_web/components/type_table_component.ex:259
#: lib/cannery_web/components/pack_table_component.ex:178
#: lib/cannery_web/components/pack_table_component.ex:260
#: lib/cannery_web/components/type_table_component.ex:272
#: lib/cannery_web/live/type_live/show.html.heex:154
#, elixir-autogen, elixir-format
msgid "No cost information"
@ -653,6 +644,7 @@ msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:40
#: lib/cannery_web/live/range_live/index.ex:31
#: lib/cannery_web/live/range_live/index.ex:47
#, elixir-autogen, elixir-format
msgid "Record Shots"
msgstr ""
@ -770,13 +762,13 @@ msgid "Container:"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:87
#: lib/cannery_web/live/type_live/index.html.heex:64
#: lib/cannery_web/live/type_live/index.html.heex:66
#: lib/cannery_web/live/type_live/show.html.heex:164
#, elixir-autogen, elixir-format
msgid "Show used"
msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:214
#: lib/cannery_web/components/pack_table_component.ex:219
#: lib/cannery_web/live/pack_live/show.html.heex:19
#, elixir-autogen, elixir-format
msgid "%{percentage}%"
@ -953,7 +945,7 @@ msgid "Average CPR"
msgstr ""
#: lib/cannery_web/components/core_components/pack_card.html.heex:17
#: lib/cannery_web/components/pack_table_component.ex:263
#: lib/cannery_web/components/pack_table_component.ex:268
#, elixir-autogen, elixir-format
msgid "Empty"
msgstr ""
@ -993,7 +985,7 @@ msgstr ""
msgid "Last used on:"
msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:194
#: lib/cannery_web/components/pack_table_component.ex:199
#, elixir-autogen, elixir-format
msgid "Never used"
msgstr ""
@ -1015,7 +1007,7 @@ msgstr ""
msgid "Edit ammo"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:58
#: lib/cannery_web/live/type_live/index.html.heex:60
#, elixir-autogen, elixir-format
msgid "Search catalog"
msgstr ""
@ -1035,7 +1027,7 @@ msgstr ""
msgid "Search tags"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:112
#: lib/cannery_web/live/range_live/index.html.heex:114
#, elixir-autogen, elixir-format
msgid "Search shot records"
msgstr ""
@ -1137,12 +1129,12 @@ msgid "Email"
msgstr ""
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:24
#: lib/cannery_web/controllers/user_session_html/new.html.heex:20
#: lib/cannery_web/controllers/user_session_html/new.html.heex:24
#, elixir-autogen, elixir-format
msgid "Password"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:264
#: lib/cannery_web/live/type_live/form_component.html.heex:270
#, elixir-autogen, elixir-format
msgid "+P"
msgstr ""
@ -1157,12 +1149,12 @@ msgstr ""
msgid "5.56x46mm NATO"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:303
#: lib/cannery_web/live/type_live/form_component.html.heex:309
#, elixir-autogen, elixir-format
msgid "Boxer"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:311
#: lib/cannery_web/live/type_live/form_component.html.heex:317
#, elixir-autogen, elixir-format
msgid "Centerfire"
msgstr ""
@ -1206,13 +1198,13 @@ msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:97
#: lib/cannery_web/live/pack_live/index.html.heex:58
#: lib/cannery_web/live/range_live/index.html.heex:89
#: lib/cannery_web/live/type_live/index.html.heex:35
#: lib/cannery_web/live/range_live/index.html.heex:91
#: lib/cannery_web/live/type_live/index.html.heex:37
#, elixir-autogen, elixir-format
msgid "All"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:316
#: lib/cannery_web/live/type_live/form_component.html.heex:322
#, elixir-autogen, elixir-format
msgid "Attributes"
msgstr ""
@ -1229,7 +1221,7 @@ msgid "Brass height:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:57
#: lib/cannery_web/live/type_live/form_component.html.heex:95
#: lib/cannery_web/live/type_live/form_component.html.heex:97
#, elixir-autogen, elixir-format
msgid "Chamber size"
msgstr ""
@ -1245,7 +1237,7 @@ msgid "Dimensions"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:80
#: lib/cannery_web/live/type_live/form_component.html.heex:269
#: lib/cannery_web/live/type_live/form_component.html.heex:275
#, elixir-autogen, elixir-format
msgid "Dram equivalent"
msgstr ""
@ -1267,7 +1259,7 @@ msgid "Gauge:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:71
#: lib/cannery_web/live/type_live/form_component.html.heex:210
#: lib/cannery_web/live/type_live/form_component.html.heex:216
#, elixir-autogen, elixir-format
msgid "Load grains"
msgstr ""
@ -1289,41 +1281,41 @@ msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:100
#: lib/cannery_web/live/pack_live/index.html.heex:61
#: lib/cannery_web/live/range_live/index.html.heex:92
#: lib/cannery_web/live/range_live/index.html.heex:94
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:38
#: lib/cannery_web/live/type_live/index.html.heex:40
#: lib/cannery_web/live/type_live/show.html.heex:56
#, elixir-autogen, elixir-format
msgid "Pistol"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:236
#: lib/cannery_web/live/type_live/form_component.html.heex:242
#, elixir-autogen, elixir-format, fuzzy
msgid "Powder"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:296
#: lib/cannery_web/live/type_live/form_component.html.heex:302
#, elixir-autogen, elixir-format, fuzzy
msgid "Primer"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:108
#: lib/cannery_web/live/type_live/form_component.html.heex:112
#, elixir-autogen, elixir-format
msgid "Projectile"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:98
#: lib/cannery_web/live/pack_live/index.html.heex:59
#: lib/cannery_web/live/range_live/index.html.heex:90
#: lib/cannery_web/live/range_live/index.html.heex:92
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:36
#: lib/cannery_web/live/type_live/index.html.heex:38
#: lib/cannery_web/live/type_live/show.html.heex:54
#, elixir-autogen, elixir-format
msgid "Rifle"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:72
#: lib/cannery_web/live/type_live/form_component.html.heex:218
#: lib/cannery_web/live/type_live/form_component.html.heex:224
#, elixir-autogen, elixir-format
msgid "Shot charge weight"
msgstr ""
@ -1334,7 +1326,7 @@ msgid "Shot charge weight:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:69
#: lib/cannery_web/live/type_live/form_component.html.heex:194
#: lib/cannery_web/live/type_live/form_component.html.heex:200
#, elixir-autogen, elixir-format
msgid "Shot material"
msgstr ""
@ -1345,7 +1337,7 @@ msgid "Shot material:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:70
#: lib/cannery_web/live/type_live/form_component.html.heex:203
#: lib/cannery_web/live/type_live/form_component.html.heex:209
#, elixir-autogen, elixir-format, fuzzy
msgid "Shot size"
msgstr ""
@ -1356,7 +1348,7 @@ msgid "Shot size:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:68
#: lib/cannery_web/live/type_live/form_component.html.heex:186
#: lib/cannery_web/live/type_live/form_component.html.heex:192
#, elixir-autogen, elixir-format
msgid "Shot type"
msgstr ""
@ -1368,21 +1360,21 @@ msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:99
#: lib/cannery_web/live/pack_live/index.html.heex:60
#: lib/cannery_web/live/range_live/index.html.heex:91
#: lib/cannery_web/live/range_live/index.html.heex:93
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:37
#: lib/cannery_web/live/type_live/index.html.heex:39
#: lib/cannery_web/live/type_live/show.html.heex:52
#, elixir-autogen, elixir-format
msgid "Shotgun"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:61
#: lib/cannery_web/live/type_live/form_component.html.heex:146
#: lib/cannery_web/live/type_live/form_component.html.heex:150
#, elixir-autogen, elixir-format
msgid "Slug core"
msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:190
#: lib/cannery_web/live/type_live/form_component.html.heex:196
#, elixir-autogen, elixir-format
msgid "Target, bird, buck, etc"
msgstr ""
@ -1399,7 +1391,7 @@ msgid "Unfired shell length"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:67
#: lib/cannery_web/live/type_live/form_component.html.heex:179
#: lib/cannery_web/live/type_live/form_component.html.heex:185
#, elixir-autogen, elixir-format
msgid "Wadding"
msgstr ""
@ -1450,7 +1442,7 @@ msgid "New Type"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:8
#: lib/cannery_web/live/type_live/index.html.heex:71
#: lib/cannery_web/live/type_live/index.html.heex:73
#, elixir-autogen, elixir-format, fuzzy
msgid "No Types"
msgstr ""

View File

@ -24,7 +24,7 @@ msgstr ""
## Run "mix gettext.extract" to bring this file up to
## date. Leave "msgstr"s empty as changing them here has no
## effect: edit them in PO (.po) files instead.
#: lib/cannery/containers.ex:220
#: lib/cannery/containers.ex:224
#, elixir-autogen, elixir-format
msgid "Container must be empty before deleting"
msgstr "Caithfidh an coimeádán a bheidh follamh roimh scriosadh"
@ -168,7 +168,7 @@ msgstr ""
msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
msgstr ""
#: lib/cannery/ammo.ex:1121
#: lib/cannery/ammo.ex:974
#, elixir-autogen, elixir-format
msgid "Invalid multiplier"
msgstr ""

View File

@ -69,7 +69,7 @@ msgstr ""
msgid "Are you sure you want to delete %{name}?"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:181
#: lib/cannery_web/live/pack_live/index.html.heex:185
#: lib/cannery_web/live/pack_live/show.html.heex:69
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this ammo?"
@ -126,7 +126,7 @@ msgstr ""
#: lib/cannery_web/live/pack_live/form_component.html.heex:91
#: lib/cannery_web/live/range_live/form_component.html.heex:46
#: lib/cannery_web/live/tag_live/form_component.html.heex:39
#: lib/cannery_web/live/type_live/form_component.html.heex:354
#: lib/cannery_web/live/type_live/form_component.html.heex:360
#, elixir-autogen, elixir-format
msgid "Saving..."
msgstr ""
@ -167,7 +167,7 @@ msgid "Are you sure you want to unstage this ammo?"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:157
#: lib/cannery_web/live/range_live/index.html.heex:149
#: lib/cannery_web/live/range_live/index.html.heex:151
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?"
msgstr ""
@ -250,7 +250,7 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
#: lib/cannery_web/live/type_live/index.html.heex:116
#: lib/cannery_web/live/type_live/index.html.heex:118
#: lib/cannery_web/live/type_live/show.html.heex:29
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!"

View File

@ -0,0 +1,368 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-20 05:05+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Translate Toolkit 3.10.1\n"
## This file is a PO Template file.
##
## "msgid"s here are often extracted from source code.
## Add new translations manually only if they're dynamic
## translations that can't be statically extracted.
##
## Run "mix gettext.extract" to bring this file up to
## date. Leave "msgstr"s empty as changing them here has no
## effect: edit them in PO (.po) files instead.
#: lib/cannery_web/live/pack_live/index.ex:59
#: lib/cannery_web/live/pack_live/index.ex:67
#: lib/cannery_web/live/pack_live/index.html.heex:38
#, elixir-autogen, elixir-format
msgid "Add Ammo"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:34
#, elixir-autogen, elixir-format
msgid "Add your first box!"
msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:13
#, elixir-autogen, elixir-format
msgid "Add your first container!"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:13
#, elixir-autogen, elixir-format
msgid "Add your first type!"
msgstr ""
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:15
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:43
#, elixir-autogen, elixir-format
msgid "Change email"
msgstr ""
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:57
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:97
#, elixir-autogen, elixir-format
msgid "Change password"
msgstr ""
#: lib/cannery_web/live/invite_live/index.html.heex:17
#, elixir-autogen, elixir-format
msgid "Create Invite"
msgstr ""
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:155
#, elixir-autogen, elixir-format
msgid "Delete User"
msgstr ""
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:47
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:3
#: lib/cannery_web/controllers/user_session_html/new.html.heex:46
#, elixir-autogen, elixir-format
msgid "Forgot your password?"
msgstr ""
#: lib/cannery_web/live/invite_live/index.html.heex:13
#, elixir-autogen, elixir-format
msgid "Invite someone new!"
msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:94
#: lib/cannery_web/controllers/user_confirmation_html/new.html.heex:28
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:44
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:41
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:28
#: lib/cannery_web/controllers/user_session_html/new.html.heex:3
#: lib/cannery_web/controllers/user_session_html/new.html.heex:36
#, elixir-autogen, elixir-format
msgid "Log in"
msgstr ""
#: lib/cannery_web/live/tag_live/index.html.heex:15
#, elixir-autogen, elixir-format
msgid "Make your first tag!"
msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:17
#, elixir-autogen, elixir-format
msgid "New Container"
msgstr ""
#: lib/cannery_web/live/tag_live/index.html.heex:19
#, elixir-autogen, elixir-format
msgid "New Tag"
msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:89
#: lib/cannery_web/controllers/user_confirmation_html/new.html.heex:25
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:3
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:37
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:38
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:25
#: lib/cannery_web/controllers/user_session_html/new.html.heex:43
#, elixir-autogen, elixir-format
msgid "Register"
msgstr ""
#: lib/cannery_web/controllers/user_confirmation_html/new.html.heex:3
#: lib/cannery_web/controllers/user_confirmation_html/new.html.heex:16
#, elixir-autogen, elixir-format
msgid "Resend confirmation instructions"
msgstr ""
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:3
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:29
#, elixir-autogen, elixir-format
msgid "Reset password"
msgstr ""
#: lib/cannery_web/components/add_shot_record_component.html.heex:56
#: lib/cannery_web/live/container_live/form_component.html.heex:55
#: lib/cannery_web/live/invite_live/form_component.html.heex:35
#: lib/cannery_web/live/pack_live/form_component.html.heex:90
#: lib/cannery_web/live/range_live/form_component.html.heex:44
#: lib/cannery_web/live/tag_live/form_component.html.heex:37
#: lib/cannery_web/live/type_live/form_component.html.heex:359
#, elixir-autogen, elixir-format
msgid "Save"
msgstr ""
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:16
#, elixir-autogen, elixir-format
msgid "Send instructions to reset password"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:65
#, elixir-autogen, elixir-format
msgid "Why not add one?"
msgstr ""
#: lib/cannery_web/live/container_live/edit_tags_component.html.heex:51
#, elixir-autogen, elixir-format
msgid "Add"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:17
#, elixir-autogen, elixir-format
msgid "Stage ammo"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:13
#, elixir-autogen, elixir-format
msgid "Why not get some ready to shoot?"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:127
#: lib/cannery_web/live/pack_live/show.html.heex:90
#: lib/cannery_web/live/range_live/index.html.heex:42
#, elixir-autogen, elixir-format
msgid "Record shots"
msgstr ""
#: lib/cannery_web/components/move_pack_component.ex:87
#, elixir-autogen, elixir-format
msgid "Add another container!"
msgstr ""
#: lib/cannery_web/components/move_pack_component.ex:123
#, elixir-autogen, elixir-format
msgid "Select"
msgstr ""
#: lib/cannery_web/live/invite_live/index.html.heex:38
#, elixir-autogen, elixir-format
msgid "Copy to clipboard"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:14
#, elixir-autogen, elixir-format
msgid "add a container first"
msgstr ""
#: lib/cannery_web/live/pack_live/form_component.html.heex:83
#, elixir-autogen, elixir-format
msgid "Create"
msgstr ""
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:110
#, elixir-autogen, elixir-format
msgid "Change Language"
msgstr ""
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:136
#, elixir-autogen, elixir-format
msgid "Change language"
msgstr ""
#: lib/cannery_web/live/pack_live/show.html.heex:52
#, elixir-autogen, elixir-format
msgid "View in Catalog"
msgstr ""
#: lib/cannery_web/components/move_pack_component.ex:77
#: lib/cannery_web/live/pack_live/index.html.heex:138
#: lib/cannery_web/live/pack_live/show.html.heex:86
#, elixir-autogen, elixir-format
msgid "Move ammo"
msgstr ""
#: lib/cannery_web/live/invite_live/index.html.heex:90
#, elixir-autogen, elixir-format
msgid "Set Unlimited"
msgstr ""
#: lib/cannery_web/live/pack_live/show.html.heex:82
#: lib/cannery_web/live/range_live/index.html.heex:38
#, elixir-autogen, elixir-format
msgid "Stage for range"
msgstr ""
#: lib/cannery_web/live/pack_live/show.html.heex:81
#: lib/cannery_web/live/range_live/index.html.heex:37
#, elixir-autogen, elixir-format
msgid "Unstage from range"
msgstr ""
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:146
#, elixir-autogen, elixir-format
msgid "Export Data as JSON"
msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:87
#: lib/cannery_web/live/container_live/index.html.heex:145
#, elixir-autogen, elixir-format
msgid "Clone %{container_name}"
msgstr ""
#: lib/cannery_web/live/invite_live/index.html.heex:35
#, elixir-autogen, elixir-format
msgid "Copy invite link for %{invite_name}"
msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:104
#: lib/cannery_web/live/container_live/index.html.heex:162
#: lib/cannery_web/live/container_live/show.html.heex:48
#, elixir-autogen, elixir-format
msgid "Delete %{container_name}"
msgstr ""
#: lib/cannery_web/live/tag_live/index.html.heex:65
#, elixir-autogen, elixir-format
msgid "Delete %{tag_name}"
msgstr ""
#: lib/cannery_web/live/invite_live/index.html.heex:63
#, elixir-autogen, elixir-format
msgid "Delete invite for %{invite_name}"
msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:77
#: lib/cannery_web/live/container_live/index.html.heex:135
#: lib/cannery_web/live/container_live/show.html.heex:35
#, elixir-autogen, elixir-format
msgid "Edit %{container_name}"
msgstr ""
#: lib/cannery_web/live/tag_live/index.html.heex:52
#, elixir-autogen, elixir-format
msgid "Edit %{tag_name}"
msgstr ""
#: lib/cannery_web/live/invite_live/index.html.heex:46
#, elixir-autogen, elixir-format
msgid "Edit invite for %{invite_name}"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:120
#, elixir-autogen, elixir-format
msgid "Stage"
msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:65
#: lib/cannery_web/live/container_live/index.html.heex:124
#, elixir-autogen, elixir-format
msgid "Tag %{container_name}"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:119
#, elixir-autogen, elixir-format
msgid "Unstage"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:172
#, elixir-autogen, elixir-format
msgid "Clone pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:187
#: lib/cannery_web/live/pack_live/show.html.heex:71
#, elixir-autogen, elixir-format
msgid "Delete pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:160
#: lib/cannery_web/live/pack_live/show.html.heex:59
#, elixir-autogen, elixir-format
msgid "Edit pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:139
#: lib/cannery_web/live/pack_live/index.html.heex:148
#: lib/cannery_web/live/type_live/show.html.heex:201
#, elixir-autogen, elixir-format
msgid "View pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:159
#: lib/cannery_web/live/range_live/index.html.heex:154
#, elixir-autogen, elixir-format
msgid "Delete shot record of %{shot_record_count} shots"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:144
#: lib/cannery_web/live/range_live/index.html.heex:137
#, elixir-autogen, elixir-format
msgid "Edit shot record of %{shot_record_count} shots"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:107
#, elixir-autogen, elixir-format
msgid "Clone %{type_name}"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:124
#: lib/cannery_web/live/type_live/show.html.heex:35
#, elixir-autogen, elixir-format
msgid "Delete %{type_name}"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:99
#: lib/cannery_web/live/type_live/show.html.heex:19
#, elixir-autogen, elixir-format
msgid "Edit %{type_name}"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:17
#, elixir-autogen, elixir-format
msgid "New Type"
msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:91
#, elixir-autogen, elixir-format
msgid "View %{type_name}"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:24
#, elixir-autogen, elixir-format
msgid "add a type first"
msgstr ""

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,103 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-20 05:05+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Translate Toolkit 3.10.1\n"
## This file is a PO Template file.
##
## "msgid"s here are often extracted from source code.
## Add new translations manually only if they're dynamic
## translations that can't be statically extracted.
##
## Run "mix gettext.extract" to bring this file up to
## date. Leave "msgstr"s empty as changing them here has no
## effect: edit them in PO (.po) files instead.
#: lib/cannery_web/components/email_html/confirm_email.html.heex:3
#: lib/cannery_web/components/email_html/confirm_email.txt.eex:2
#: lib/cannery_web/components/email_html/reset_password.html.heex:3
#: lib/cannery_web/components/email_html/reset_password.txt.eex:2
#: lib/cannery_web/components/email_html/update_email.html.heex:3
#: lib/cannery_web/components/email_html/update_email.txt.eex:2
#, elixir-autogen, elixir-format
msgid "Hi %{email},"
msgstr ""
#: lib/cannery_web/components/email_html/confirm_email.txt.eex:10
#, elixir-autogen, elixir-format
msgid "If you didn't create an account at %{url}, please ignore this."
msgstr ""
#: lib/cannery_web/components/email_html/reset_password.txt.eex:8
#: lib/cannery_web/components/email_html/update_email.txt.eex:8
#, elixir-autogen, elixir-format
msgid "If you didn't request this change from %{url}, please ignore this."
msgstr ""
#: lib/cannery_web/components/email_html/update_email.html.heex:8
#: lib/cannery_web/components/email_html/update_email.txt.eex:4
#, elixir-autogen, elixir-format
msgid "You can change your email by visiting the URL below:"
msgstr ""
#: lib/cannery_web/components/email_html/confirm_email.html.heex:14
#: lib/cannery_web/components/email_html/confirm_email.txt.eex:6
#, elixir-autogen, elixir-format
msgid "You can confirm your account by visiting the URL below:"
msgstr ""
#: lib/cannery_web/components/email_html/reset_password.html.heex:8
#: lib/cannery_web/components/email_html/reset_password.txt.eex:4
#, elixir-autogen, elixir-format
msgid "You can reset your password by visiting the URL below:"
msgstr ""
#: lib/cannery/accounts/email.ex:31
#, elixir-autogen, elixir-format
msgid "Confirm your Cannery account"
msgstr ""
#: lib/cannery_web/components/email_html/confirm_email.html.heex:22
#, elixir-autogen, elixir-format
msgid "If you didn't create an account at Cannery, please ignore this."
msgstr ""
#: lib/cannery_web/components/email_html/reset_password.html.heex:16
#: lib/cannery_web/components/email_html/update_email.html.heex:16
#, elixir-autogen, elixir-format
msgid "If you didn't request this change from Cannery, please ignore this."
msgstr ""
#: lib/cannery/accounts/email.ex:38
#, elixir-autogen, elixir-format
msgid "Reset your Cannery password"
msgstr ""
#: lib/cannery_web/components/layouts/email_text.txt.eex:9
#, elixir-autogen, elixir-format
msgid "This email was sent from Cannery at %{url}, the self-hosted firearm tracker website."
msgstr ""
#: lib/cannery_web/components/layouts/email_html.html.heex:13
#, elixir-autogen, elixir-format
msgid "This email was sent from Cannery, the self-hosted firearm tracker website."
msgstr ""
#: lib/cannery/accounts/email.ex:45
#, elixir-autogen, elixir-format
msgid "Update your Cannery email"
msgstr ""
#: lib/cannery_web/components/email_html/confirm_email.html.heex:9
#: lib/cannery_web/components/email_html/confirm_email.txt.eex:4
#, elixir-autogen, elixir-format
msgid "Welcome to Cannery"
msgstr ""

View File

@ -0,0 +1,220 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-20 05:05+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Translate Toolkit 3.10.1\n"
## This file is a PO Template file.
##
## "msgid"s here are often extracted from source code.
## Add new translations manually only if they're dynamic
## translations that can't be statically extracted.
##
## Run "mix gettext.extract" to bring this file up to
## date. Leave "msgstr"s empty as changing them here has no
## effect: edit them in PO (.po) files instead.
#: lib/cannery/containers.ex:224
#, elixir-autogen, elixir-format
msgid "Container must be empty before deleting"
msgstr ""
#: lib/cannery_web/live/container_live/index.ex:86
#: lib/cannery_web/live/container_live/show.ex:67
#, elixir-autogen, elixir-format
msgid "Could not delete %{name}: %{error}"
msgstr ""
#: lib/cannery_web/live/container_live/index.ex:74
#, elixir-autogen, elixir-format
msgid "Could not find that container"
msgstr ""
#: lib/cannery_web/controllers/user_settings_controller.ex:84
#, elixir-autogen, elixir-format
msgid "Email change link is invalid or it has expired."
msgstr ""
#: lib/cannery_web/controllers/error_html/error.html.heex:8
#, elixir-autogen, elixir-format
msgid "Error"
msgstr ""
#: lib/cannery_web/controllers/error_html/error.html.heex:28
#, elixir-autogen, elixir-format
msgid "Go back home"
msgstr ""
#: lib/cannery_web/controllers/user_session_controller.ex:17
#, elixir-autogen, elixir-format
msgid "Invalid email or password"
msgstr ""
#: lib/cannery_web/controllers/error_html.ex:9
#: lib/cannery_web/controllers/error_json.ex:7
#, elixir-autogen, elixir-format
msgid "Not found"
msgstr ""
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:13
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:13
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:22
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:64
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:118
#: lib/cannery_web/live/type_live/form_component.html.heex:18
#, elixir-autogen, elixir-format
msgid "Oops, something went wrong! Please check the errors below."
msgstr ""
#: lib/cannery_web/controllers/user_reset_password_controller.ex:62
#, elixir-autogen, elixir-format
msgid "Reset password link is invalid or it has expired."
msgstr ""
#: lib/cannery_web/controllers/user_registration_controller.ex:22
#: lib/cannery_web/controllers/user_registration_controller.ex:51
#, elixir-autogen, elixir-format
msgid "Sorry, public registration is disabled"
msgstr ""
#: lib/cannery_web/controllers/user_registration_controller.ex:12
#: lib/cannery_web/controllers/user_registration_controller.ex:41
#: lib/cannery_web/controllers/user_registration_controller.ex:70
#, elixir-autogen, elixir-format
msgid "Sorry, this invite was not found or expired"
msgstr ""
#: lib/cannery_web/controllers/user_settings_controller.ex:99
#, elixir-autogen, elixir-format
msgid "Unable to delete user"
msgstr ""
#: lib/cannery_web/controllers/error_html.ex:10
#: lib/cannery_web/controllers/error_json.ex:8
#, elixir-autogen, elixir-format
msgid "Unauthorized"
msgstr ""
#: lib/cannery_web/controllers/user_confirmation_controller.ex:53
#, elixir-autogen, elixir-format
msgid "User confirmation link is invalid or it has expired."
msgstr ""
#: lib/cannery_web/controllers/user_auth.ex:266
#, elixir-autogen, elixir-format
msgid "You are not authorized to view this page."
msgstr ""
#: lib/cannery/accounts/user.ex:145
#, elixir-autogen, elixir-format
msgid "did not change"
msgstr ""
#: lib/cannery/accounts/user.ex:166
#, elixir-autogen, elixir-format
msgid "does not match password"
msgstr ""
#: lib/cannery/accounts/user.ex:203
#, elixir-autogen, elixir-format
msgid "is not valid"
msgstr ""
#: lib/cannery/accounts/user.ex:100
#, elixir-autogen, elixir-format
msgid "must have the @ sign and no spaces"
msgstr ""
#: lib/cannery_web/live/container_live/show.ex:45
#, elixir-autogen, elixir-format
msgid "Tag not found"
msgstr ""
#: lib/cannery_web/live/container_live/edit_tags_component.ex:46
#, elixir-autogen, elixir-format
msgid "Tag could not be added"
msgstr ""
#: lib/cannery_web/controllers/user_auth.ex:38
#: lib/cannery_web/controllers/user_auth.ex:250
#, elixir-autogen, elixir-format
msgid "You must confirm your account and log in to access this page."
msgstr ""
#: lib/cannery_web/live/container_live/edit_tags_component.ex:73
#, elixir-autogen, elixir-format
msgid "Tag could not be removed"
msgstr ""
#: lib/cannery_web/live/pack_live/form_component.ex:159
#, elixir-autogen, elixir-format
msgid "Could not parse number of copies"
msgstr ""
#: lib/cannery_web/live/pack_live/form_component.ex:149
#, elixir-autogen, elixir-format
msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
msgstr ""
#: lib/cannery/ammo.ex:974
#, elixir-autogen, elixir-format
msgid "Invalid multiplier"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:71
#, elixir-autogen, elixir-format
msgid "Your browser does not support the canvas element."
msgstr ""
#: lib/cannery/activity_log/shot_record.ex:74
#, elixir-autogen, elixir-format
msgid "Please select a valid user and ammo pack"
msgstr ""
#: lib/cannery/activity_log/shot_record.ex:88
#, elixir-autogen, elixir-format
msgid "Ammo left can be at most %{count} rounds"
msgstr ""
#: lib/cannery/activity_log/shot_record.ex:84
#, elixir-autogen, elixir-format
msgid "Ammo left must be at least 0"
msgstr ""
#: lib/cannery/activity_log/shot_record.ex:119
#, elixir-autogen, elixir-format
msgid "Count can be at most %{count} shots"
msgstr ""
#: lib/cannery/activity_log/shot_record.ex:80
#, elixir-autogen, elixir-format
msgid "can't be blank"
msgstr ""
#: lib/cannery/ammo/pack.ex:100
#, elixir-autogen, elixir-format
msgid "Please select a type and container"
msgstr ""
#: lib/cannery_web/controllers/error_html.ex:11
#: lib/cannery_web/controllers/error_json.ex:9
#, elixir-autogen, elixir-format
msgid "Internal server error"
msgstr ""
#: lib/cannery_web/controllers/user_auth.ex:195
#, elixir-autogen, elixir-format
msgid "You must log in as an administrator to access this page."
msgstr ""
#: lib/cannery_web/controllers/user_auth.ex:178
#, elixir-autogen, elixir-format
msgid "You must log in to access this page."
msgstr ""

View File

@ -0,0 +1,294 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-20 05:05+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Translate Toolkit 3.10.1\n"
## This file is a PO Template file.
##
## "msgid"s here are often extracted from source code.
## Add new translations manually only if they're dynamic
## translations that can't be statically extracted.
##
## Run "mix gettext.extract" to bring this file up to
## date. Leave "msgstr"s empty as changing them here has no
## effect: edit them in PO (.po) files instead.
#: lib/cannery_web/live/container_live/form_component.ex:89
#: lib/cannery_web/live/invite_live/form_component.ex:80
#: lib/cannery_web/live/tag_live/form_component.ex:78
#: lib/cannery_web/live/type_live/form_component.ex:88
#, elixir-autogen, elixir-format
msgid "%{name} created successfully"
msgstr ""
#: lib/cannery_web/live/tag_live/index.ex:65
#: lib/cannery_web/live/type_live/index.ex:72
#: lib/cannery_web/live/type_live/show.ex:26
#, elixir-autogen, elixir-format
msgid "%{name} deleted succesfully"
msgstr ""
#: lib/cannery_web/live/container_live/index.ex:79
#: lib/cannery_web/live/container_live/show.ex:60
#, elixir-autogen, elixir-format
msgid "%{name} has been deleted"
msgstr ""
#: lib/cannery_web/live/container_live/form_component.ex:70
#: lib/cannery_web/live/invite_live/form_component.ex:62
#: lib/cannery_web/live/tag_live/form_component.ex:60
#: lib/cannery_web/live/type_live/form_component.ex:69
#, elixir-autogen, elixir-format
msgid "%{name} updated successfully"
msgstr ""
#: lib/cannery_web/controllers/user_settings_controller.ex:29
#, elixir-autogen, elixir-format
msgid "A link to confirm your email change has been sent to the new address."
msgstr ""
#: lib/cannery_web/live/invite_live/index.html.heex:110
#: lib/cannery_web/live/invite_live/index.html.heex:138
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{email}? This action is permanent!"
msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:99
#: lib/cannery_web/live/container_live/index.html.heex:157
#: lib/cannery_web/live/container_live/show.html.heex:45
#: lib/cannery_web/live/tag_live/index.html.heex:63
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}?"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:185
#: lib/cannery_web/live/pack_live/show.html.heex:69
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this ammo?"
msgstr ""
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:153
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete your account?"
msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:65
#, elixir-autogen, elixir-format
msgid "Are you sure you want to log out?"
msgstr ""
#: lib/cannery_web/controllers/user_settings_controller.ex:77
#, elixir-autogen, elixir-format
msgid "Email changed successfully."
msgstr ""
#: lib/cannery_web/controllers/user_confirmation_controller.ex:23
#, elixir-autogen, elixir-format
msgid "If your email is in our system and it has not been confirmed yet, you will receive an email with instructions shortly."
msgstr ""
#: lib/cannery_web/controllers/user_reset_password_controller.ex:24
#, elixir-autogen, elixir-format
msgid "If your email is in our system, you will receive instructions to reset your password shortly."
msgstr ""
#: lib/cannery_web/controllers/user_session_controller.ex:23
#, elixir-autogen, elixir-format
msgid "Logged out successfully."
msgstr ""
#: lib/cannery_web/controllers/user_reset_password_controller.ex:45
#, elixir-autogen, elixir-format
msgid "Password reset successfully."
msgstr ""
#: lib/cannery_web/controllers/user_settings_controller.ex:49
#, elixir-autogen, elixir-format
msgid "Password updated successfully."
msgstr ""
#: lib/cannery_web/controllers/user_registration_controller.ex:65
#, elixir-autogen, elixir-format
msgid "Please check your email to verify your account"
msgstr ""
#: lib/cannery_web/components/add_shot_record_component.html.heex:58
#: lib/cannery_web/live/container_live/form_component.html.heex:57
#: lib/cannery_web/live/invite_live/form_component.html.heex:37
#: lib/cannery_web/live/pack_live/form_component.html.heex:91
#: lib/cannery_web/live/range_live/form_component.html.heex:46
#: lib/cannery_web/live/tag_live/form_component.html.heex:39
#: lib/cannery_web/live/type_live/form_component.html.heex:360
#, elixir-autogen, elixir-format
msgid "Saving..."
msgstr ""
#: lib/cannery_web/controllers/user_settings_controller.ex:95
#, elixir-autogen, elixir-format
msgid "Your account has been deleted"
msgstr ""
#: lib/cannery_web/live/container_live/edit_tags_component.html.heex:16
#, elixir-autogen, elixir-format
msgid "Are you sure you want to remove the %{tag_name} tag from %{container_name}?"
msgstr ""
#: lib/cannery_web/live/container_live/edit_tags_component.ex:51
#, elixir-autogen, elixir-format
msgid "%{name} added successfully"
msgstr ""
#: lib/cannery_web/live/container_live/show.ex:37
#, elixir-autogen, elixir-format
msgid "%{tag_name} has been removed from %{container_name}"
msgstr ""
#: lib/cannery_web/live/container_live/edit_tags_component.html.heex:53
#, elixir-autogen, elixir-format
msgid "Adding..."
msgstr ""
#: lib/cannery_web/components/add_shot_record_component.ex:60
#, elixir-autogen, elixir-format
msgid "Shots recorded successfully"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:34
#, elixir-autogen, elixir-format
msgid "Are you sure you want to unstage this ammo?"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:157
#: lib/cannery_web/live/range_live/index.html.heex:151
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:79
#: lib/cannery_web/live/range_live/index.ex:78
#, elixir-autogen, elixir-format
msgid "Shot records deleted succesfully"
msgstr ""
#: lib/cannery_web/live/range_live/form_component.ex:54
#, elixir-autogen, elixir-format
msgid "Shot records updated successfully"
msgstr ""
#: lib/cannery_web/controllers/user_confirmation_controller.ex:37
#, elixir-autogen, elixir-format
msgid "%{email} confirmed successfully."
msgstr ""
#: lib/cannery_web/components/move_pack_component.ex:51
#, elixir-autogen, elixir-format
msgid "Ammo moved to %{name} successfully"
msgstr ""
#: lib/cannery_web/live/invite_live/index.ex:116
#, elixir-autogen, elixir-format
msgid "Copied to clipboard"
msgstr ""
#: lib/cannery_web/live/container_live/edit_tags_component.ex:78
#, elixir-autogen, elixir-format
msgid "%{name} removed successfully"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:10
#: lib/cannery_web/live/pack_live/index.html.heex:20
#, elixir-autogen, elixir-format
msgid "You'll need to"
msgstr ""
#: lib/cannery_web/live/pack_live/form_component.html.heex:84
#, elixir-autogen, elixir-format
msgid "Creating..."
msgstr ""
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:138
#, elixir-autogen, elixir-format
msgid "Are you sure you want to change your language?"
msgstr ""
#: lib/cannery_web/controllers/user_settings_controller.ex:65
#, elixir-autogen, elixir-format
msgid "Language updated successfully."
msgstr ""
#: lib/cannery_web/live/pack_live/index.ex:94
#: lib/cannery_web/live/pack_live/show.ex:54
#, elixir-autogen, elixir-format
msgid "Ammo deleted succesfully"
msgstr ""
#: lib/cannery_web/live/range_live/index.ex:91
#, elixir-autogen, elixir-format
msgid "Ammo unstaged succesfully"
msgstr ""
#: lib/cannery_web/live/pack_live/form_component.ex:125
#, elixir-autogen, elixir-format
msgid "Ammo updated successfully"
msgstr ""
#: lib/cannery_web/live/pack_live/form_component.ex:184
#, elixir-autogen, elixir-format
msgid "Ammo added successfully"
msgid_plural "Ammo added successfully"
msgstr[0] ""
msgstr[1] ""
#: lib/cannery_web/live/type_live/index.html.heex:118
#: lib/cannery_web/live/type_live/show.html.heex:29
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!"
msgstr ""
#: lib/cannery_web/live/home_live.html.heex:63
#, elixir-autogen, elixir-format
msgid "Register to setup Cannery"
msgstr ""
#: lib/cannery_web/live/invite_live/index.ex:43
#, elixir-autogen, elixir-format
msgid "%{invite_name} deleted succesfully"
msgstr ""
#: lib/cannery_web/live/invite_live/index.ex:104
#, elixir-autogen, elixir-format
msgid "%{invite_name} disabled succesfully"
msgstr ""
#: lib/cannery_web/live/invite_live/index.ex:80
#, elixir-autogen, elixir-format
msgid "%{invite_name} enabled succesfully"
msgstr ""
#: lib/cannery_web/live/invite_live/index.ex:58
#, elixir-autogen, elixir-format
msgid "%{invite_name} updated succesfully"
msgstr ""
#: lib/cannery_web/live/invite_live/index.ex:125
#, elixir-autogen, elixir-format
msgid "%{user_email} deleted succesfully"
msgstr ""
#: lib/cannery_web/live/invite_live/index.html.heex:58
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete the invite for %{invite_name}?"
msgstr ""
#: lib/cannery_web/live/invite_live/index.html.heex:85
#, elixir-autogen, elixir-format
msgid "Are you sure you want to make %{invite_name} unlimited?"
msgstr ""

View File

@ -58,7 +58,7 @@ msgstr ""
msgid "Are you sure you want to delete %{name}?"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:181
#: lib/cannery_web/live/pack_live/index.html.heex:185
#: lib/cannery_web/live/pack_live/show.html.heex:69
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this ammo?"
@ -115,7 +115,7 @@ msgstr ""
#: lib/cannery_web/live/pack_live/form_component.html.heex:91
#: lib/cannery_web/live/range_live/form_component.html.heex:46
#: lib/cannery_web/live/tag_live/form_component.html.heex:39
#: lib/cannery_web/live/type_live/form_component.html.heex:354
#: lib/cannery_web/live/type_live/form_component.html.heex:360
#, elixir-autogen, elixir-format
msgid "Saving..."
msgstr ""
@ -156,7 +156,7 @@ msgid "Are you sure you want to unstage this ammo?"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:157
#: lib/cannery_web/live/range_live/index.html.heex:149
#: lib/cannery_web/live/range_live/index.html.heex:151
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?"
msgstr ""
@ -236,7 +236,7 @@ msgid_plural "Ammo added successfully"
msgstr[0] ""
msgstr[1] ""
#: lib/cannery_web/live/type_live/index.html.heex:116
#: lib/cannery_web/live/type_live/index.html.heex:118
#: lib/cannery_web/live/type_live/show.html.heex:29
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!"

10
priv/i18n/it.tbx Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0"?>
<!DOCTYPE martif PUBLIC "ISO 12200:1999A//DTD MARTIF core (DXFcdV04)//EN" "TBXcdv04.dtd">
<martif type="TBX">
<martifHeader>
<fileDesc>
<sourceDesc><p>Translate Toolkit</p></sourceDesc>
</fileDesc>
</martifHeader>
<text><body></body></text>
</martif>

View File

@ -188,27 +188,27 @@ defmodule Cannery.ActivityLogTest do
end
end
test "get_used_count/2 returns accurate used count", %{
test "get_used_count/2 returns accurate used count for pack_id", %{
pack: pack,
type: type,
container: container,
current_user: current_user
} do
{1, [another_pack]} = pack_fixture(type, container, current_user)
assert 0 = another_pack |> ActivityLog.get_used_count(current_user)
assert 5 = pack |> ActivityLog.get_used_count(current_user)
assert 0 = ActivityLog.get_used_count(current_user, pack_id: another_pack.id)
assert 5 = ActivityLog.get_used_count(current_user, pack_id: pack.id)
shot_record_fixture(%{count: 15}, current_user, pack)
assert 20 = pack |> ActivityLog.get_used_count(current_user)
assert 20 = ActivityLog.get_used_count(current_user, pack_id: pack.id)
shot_record_fixture(%{count: 10}, current_user, pack)
assert 30 = pack |> ActivityLog.get_used_count(current_user)
assert 30 = ActivityLog.get_used_count(current_user, pack_id: pack.id)
{1, [another_pack]} = pack_fixture(type, container, current_user)
assert 0 = another_pack |> ActivityLog.get_used_count(current_user)
assert 0 = ActivityLog.get_used_count(current_user, pack_id: another_pack.id)
end
test "get_used_counts/2 returns accurate used counts", %{
test "get_grouped_used_counts/2 returns accurate used counts for packs", %{
pack: %{id: pack_id} = pack,
type: type,
container: container,
@ -217,20 +217,41 @@ defmodule Cannery.ActivityLogTest do
{1, [%{id: another_pack_id} = another_pack]} = pack_fixture(type, container, current_user)
assert %{pack_id => 5} ==
[pack, another_pack] |> ActivityLog.get_used_counts(current_user)
ActivityLog.get_grouped_used_counts(current_user,
packs: [pack, another_pack],
group_by: :pack_id
)
shot_record_fixture(%{count: 5}, current_user, another_pack)
used_counts = [pack, another_pack] |> ActivityLog.get_used_counts(current_user)
used_counts =
ActivityLog.get_grouped_used_counts(current_user,
packs: [pack, another_pack],
group_by: :pack_id
)
assert %{^pack_id => 5} = used_counts
assert %{^another_pack_id => 5} = used_counts
shot_record_fixture(%{count: 15}, current_user, pack)
used_counts = [pack, another_pack] |> ActivityLog.get_used_counts(current_user)
used_counts =
ActivityLog.get_grouped_used_counts(current_user,
packs: [pack, another_pack],
group_by: :pack_id
)
assert %{^pack_id => 20} = used_counts
assert %{^another_pack_id => 5} = used_counts
shot_record_fixture(%{count: 10}, current_user, pack)
used_counts = [pack, another_pack] |> ActivityLog.get_used_counts(current_user)
used_counts =
ActivityLog.get_grouped_used_counts(current_user,
packs: [pack, another_pack],
group_by: :pack_id
)
assert %{^pack_id => 30} = used_counts
assert %{^another_pack_id => 5} = used_counts
end
@ -294,17 +315,17 @@ defmodule Cannery.ActivityLogTest do
assert %{^another_pack_id => ~D[2022-11-09]} = last_used_shot_records
end
test "get_used_count_for_type/2 gets accurate used round count for type",
test "get_used_count/2 gets accurate used round count for type_id",
%{type: type, pack: pack, current_user: current_user} do
another_type = type_fixture(current_user)
assert 0 = another_type |> ActivityLog.get_used_count_for_type(current_user)
assert 5 = type |> ActivityLog.get_used_count_for_type(current_user)
assert 0 = ActivityLog.get_used_count(current_user, type_id: another_type.id)
assert 5 = ActivityLog.get_used_count(current_user, type_id: type.id)
shot_record_fixture(%{count: 5}, current_user, pack)
assert 10 = type |> ActivityLog.get_used_count_for_type(current_user)
assert 10 = ActivityLog.get_used_count(current_user, type_id: type.id)
shot_record_fixture(%{count: 1}, current_user, pack)
assert 11 = type |> ActivityLog.get_used_count_for_type(current_user)
assert 11 = ActivityLog.get_used_count(current_user, type_id: type.id)
end
test "get_used_count_for_types/2 gets accurate used round count for types", %{
@ -317,13 +338,19 @@ defmodule Cannery.ActivityLogTest do
{1, [pack]} = pack_fixture(another_type, container, current_user)
assert %{type_id => 5} ==
[type, another_type]
|> ActivityLog.get_used_count_for_types(current_user)
ActivityLog.get_grouped_used_counts(current_user,
types: [type, another_type],
group_by: :type_id
)
# use generated pack
shot_record_fixture(%{count: 5}, current_user, pack)
used_counts = [type, another_type] |> ActivityLog.get_used_count_for_types(current_user)
used_counts =
ActivityLog.get_grouped_used_counts(current_user,
types: [type, another_type],
group_by: :type_id
)
assert %{^type_id => 5} = used_counts
assert %{^another_type_id => 5} = used_counts
@ -331,7 +358,11 @@ defmodule Cannery.ActivityLogTest do
# use generated pack again
shot_record_fixture(%{count: 1}, current_user, pack)
used_counts = [type, another_type] |> ActivityLog.get_used_count_for_types(current_user)
used_counts =
ActivityLog.get_grouped_used_counts(current_user,
types: [type, another_type],
group_by: :type_id
)
assert %{^type_id => 5} = used_counts
assert %{^another_type_id => 6} = used_counts
@ -376,17 +407,17 @@ defmodule Cannery.ActivityLogTest do
{1, [pistol_pack]} = pack_fixture(pistol_type, container, current_user)
pistol_shot_record = shot_record_fixture(current_user, pistol_pack)
assert [^rifle_shot_record] = ActivityLog.list_shot_records(:rifle, current_user)
assert [^shotgun_shot_record] = ActivityLog.list_shot_records(:shotgun, current_user)
assert [^pistol_shot_record] = ActivityLog.list_shot_records(:pistol, current_user)
assert [^rifle_shot_record] = ActivityLog.list_shot_records(current_user, class: :rifle)
assert [^shotgun_shot_record] = ActivityLog.list_shot_records(current_user, class: :shotgun)
assert [^pistol_shot_record] = ActivityLog.list_shot_records(current_user, class: :pistol)
shot_records = ActivityLog.list_shot_records(:all, current_user)
shot_records = ActivityLog.list_shot_records(current_user, class: :all)
assert Enum.count(shot_records) == 3
assert rifle_shot_record in shot_records
assert shotgun_shot_record in shot_records
assert pistol_shot_record in shot_records
shot_records = ActivityLog.list_shot_records(nil, current_user)
shot_records = ActivityLog.list_shot_records(current_user, class: nil)
assert Enum.count(shot_records) == 3
assert rifle_shot_record in shot_records
assert shotgun_shot_record in shot_records
@ -420,13 +451,13 @@ defmodule Cannery.ActivityLogTest do
_shouldnt_return = shot_record_fixture(another_user, another_pack)
# notes
assert ActivityLog.list_shot_records("amazing", :all, current_user) == [shot_record_a]
assert ActivityLog.list_shot_records(current_user, search: "amazing") == [shot_record_a]
# pack attributes
assert ActivityLog.list_shot_records("stupendous", :all, current_user) == [shot_record_b]
assert ActivityLog.list_shot_records(current_user, search: "stupendous") == [shot_record_b]
# type attributes
assert ActivityLog.list_shot_records("fabulous", :all, current_user) == [shot_record_c]
assert ActivityLog.list_shot_records(current_user, search: "fabulous") == [shot_record_c]
end
end
end

View File

@ -85,7 +85,7 @@ defmodule Cannery.AmmoTest do
pistol_type: pistol_type,
current_user: current_user
} do
results = Ammo.list_types(current_user, :all)
results = Ammo.list_types(current_user, class: :all)
assert results |> Enum.count() == 3
assert rifle_type in results
assert shotgun_type in results
@ -96,21 +96,21 @@ defmodule Cannery.AmmoTest do
rifle_type: rifle_type,
current_user: current_user
} do
assert [^rifle_type] = Ammo.list_types(current_user, :rifle)
assert [^rifle_type] = Ammo.list_types(current_user, class: :rifle)
end
test "list_types/2 returns shotgun types", %{
shotgun_type: shotgun_type,
current_user: current_user
} do
assert [^shotgun_type] = Ammo.list_types(current_user, :shotgun)
assert [^shotgun_type] = Ammo.list_types(current_user, class: :shotgun)
end
test "list_types/2 returns pistol types", %{
pistol_type: pistol_type,
current_user: current_user
} do
assert [^pistol_type] = Ammo.list_types(current_user, :pistol)
assert [^pistol_type] = Ammo.list_types(current_user, class: :pistol)
end
test "list_types/2 returns relevant types for a user", %{
@ -120,22 +120,22 @@ defmodule Cannery.AmmoTest do
current_user: current_user
} do
# name
assert Ammo.list_types("bullet", current_user, :all) == [rifle_type]
assert Ammo.list_types("bullets", current_user, :all) == [rifle_type]
assert Ammo.list_types("hollow", current_user, :all) == [shotgun_type]
assert Ammo.list_types("jacket", current_user, :all) == [pistol_type]
assert Ammo.list_types(current_user, search: "bullet") == [rifle_type]
assert Ammo.list_types(current_user, search: "bullets") == [rifle_type]
assert Ammo.list_types(current_user, search: "hollow") == [shotgun_type]
assert Ammo.list_types(current_user, search: "jacket") == [pistol_type]
# desc
assert Ammo.list_types("pew", current_user, :all) == [rifle_type]
assert Ammo.list_types("brass", current_user, :all) == [pistol_type]
assert Ammo.list_types("shell", current_user, :all) == [pistol_type]
assert Ammo.list_types(current_user, search: "pew") == [rifle_type]
assert Ammo.list_types(current_user, search: "brass") == [pistol_type]
assert Ammo.list_types(current_user, search: "shell") == [pistol_type]
# grains (integer)
assert Ammo.list_types("53453", current_user, :all) == [rifle_type]
assert Ammo.list_types("3234234", current_user, :all) == [shotgun_type]
assert Ammo.list_types(current_user, search: "53453") == [rifle_type]
assert Ammo.list_types(current_user, search: "3234234") == [shotgun_type]
# tracer (boolean)
assert Ammo.list_types("tracer", current_user, :all) == [pistol_type]
assert Ammo.list_types(current_user, search: "tracer") == [pistol_type]
end
end
@ -222,7 +222,7 @@ defmodule Cannery.AmmoTest do
]
end
test "get_average_cost_for_type/2 gets average cost for type",
test "get_average_cost/2 gets average cost for type",
%{type: type, current_user: current_user, container: container} do
{1, [_pack]} =
pack_fixture(
@ -232,7 +232,7 @@ defmodule Cannery.AmmoTest do
current_user
)
assert 25.0 = Ammo.get_average_cost_for_type(type, current_user)
assert 25.0 = Ammo.get_average_cost(type, current_user)
{1, [_pack]} =
pack_fixture(
@ -242,7 +242,7 @@ defmodule Cannery.AmmoTest do
current_user
)
assert 25.0 = Ammo.get_average_cost_for_type(type, current_user)
assert 25.0 = Ammo.get_average_cost(type, current_user)
{1, [_pack]} =
pack_fixture(
@ -252,7 +252,7 @@ defmodule Cannery.AmmoTest do
current_user
)
assert 40.0 = Ammo.get_average_cost_for_type(type, current_user)
assert 40.0 = Ammo.get_average_cost(type, current_user)
{1, [_pack]} =
pack_fixture(
@ -262,21 +262,21 @@ defmodule Cannery.AmmoTest do
current_user
)
assert 37.5 = Ammo.get_average_cost_for_type(type, current_user)
assert 37.5 = Ammo.get_average_cost(type, current_user)
end
test "get_average_cost_for_types/2 gets average costs for types", %{
test "get_average_costs/2 gets average costs for types", %{
type: %{id: type_id} = type,
current_user: current_user,
container: container
} do
assert %{} == [type] |> Ammo.get_average_cost_for_types(current_user)
assert %{} == [type] |> Ammo.get_average_costs(current_user)
%{id: another_type_id} = another_type = type_fixture(current_user)
assert %{} ==
[type, another_type]
|> Ammo.get_average_cost_for_types(current_user)
|> Ammo.get_average_costs(current_user)
{1, [_pack]} =
pack_fixture(
@ -288,7 +288,7 @@ defmodule Cannery.AmmoTest do
assert %{another_type_id => 25.0} ==
[type, another_type]
|> Ammo.get_average_cost_for_types(current_user)
|> Ammo.get_average_costs(current_user)
{1, [_pack]} =
pack_fixture(
@ -298,7 +298,7 @@ defmodule Cannery.AmmoTest do
current_user
)
average_costs = [type, another_type] |> Ammo.get_average_cost_for_types(current_user)
average_costs = [type, another_type] |> Ammo.get_average_costs(current_user)
assert %{^type_id => 25.0} = average_costs
assert %{^another_type_id => 25.0} = average_costs
@ -311,7 +311,7 @@ defmodule Cannery.AmmoTest do
current_user
)
average_costs = [type, another_type] |> Ammo.get_average_cost_for_types(current_user)
average_costs = [type, another_type] |> Ammo.get_average_costs(current_user)
assert %{^type_id => 25.0} = average_costs
assert %{^another_type_id => 25.0} = average_costs
@ -324,7 +324,7 @@ defmodule Cannery.AmmoTest do
current_user
)
average_costs = [type, another_type] |> Ammo.get_average_cost_for_types(current_user)
average_costs = [type, another_type] |> Ammo.get_average_costs(current_user)
assert %{^type_id => 40.0} = average_costs
assert %{^another_type_id => 25.0} = average_costs
@ -337,30 +337,30 @@ defmodule Cannery.AmmoTest do
current_user
)
average_costs = [type, another_type] |> Ammo.get_average_cost_for_types(current_user)
average_costs = [type, another_type] |> Ammo.get_average_costs(current_user)
assert %{^type_id => 37.5} = average_costs
assert %{^another_type_id => 25.0} = average_costs
end
test "get_round_count_for_type/2 gets accurate round count for type",
test "get_round_count/2 gets accurate round count for type",
%{type: type, current_user: current_user, container: container} do
another_type = type_fixture(current_user)
assert 0 = Ammo.get_round_count_for_type(another_type, current_user)
assert 0 = Ammo.get_round_count(current_user, type_id: another_type.id)
{1, [first_pack]} = pack_fixture(%{count: 1}, type, container, current_user)
assert 1 = Ammo.get_round_count_for_type(type, current_user)
assert 1 = Ammo.get_round_count(current_user, type_id: type.id)
{1, [pack]} = pack_fixture(%{count: 50}, type, container, current_user)
assert 51 = Ammo.get_round_count_for_type(type, current_user)
assert 51 = Ammo.get_round_count(current_user, type_id: type.id)
shot_record_fixture(%{count: 26}, current_user, pack)
assert 25 = Ammo.get_round_count_for_type(type, current_user)
assert 25 = Ammo.get_round_count(current_user, type_id: type.id)
shot_record_fixture(%{count: 1}, current_user, first_pack)
assert 24 = Ammo.get_round_count_for_type(type, current_user)
assert 24 = Ammo.get_round_count(current_user, type_id: type.id)
end
test "get_round_count_for_types/2 gets accurate round counts for types", %{
@ -371,147 +371,170 @@ defmodule Cannery.AmmoTest do
{1, [first_pack]} = pack_fixture(%{count: 1}, type, container, current_user)
assert %{type_id => 1} ==
[type] |> Ammo.get_round_count_for_types(current_user)
Ammo.get_grouped_round_count(current_user, types: [type], group_by: :type_id)
%{id: another_type_id} = another_type = type_fixture(current_user)
{1, [_another_pack]} = pack_fixture(%{count: 1}, another_type, container, current_user)
round_counts = [type, another_type] |> Ammo.get_round_count_for_types(current_user)
round_counts =
Ammo.get_grouped_round_count(current_user,
types: [type, another_type],
group_by: :type_id
)
assert %{^type_id => 1} = round_counts
assert %{^another_type_id => 1} = round_counts
{1, [pack]} = pack_fixture(%{count: 50}, type, container, current_user)
round_counts = [type, another_type] |> Ammo.get_round_count_for_types(current_user)
round_counts =
Ammo.get_grouped_round_count(current_user,
types: [type, another_type],
group_by: :type_id
)
assert %{^type_id => 51} = round_counts
assert %{^another_type_id => 1} = round_counts
shot_record_fixture(%{count: 26}, current_user, pack)
round_counts = [type, another_type] |> Ammo.get_round_count_for_types(current_user)
round_counts =
Ammo.get_grouped_round_count(current_user,
types: [type, another_type],
group_by: :type_id
)
assert %{^type_id => 25} = round_counts
assert %{^another_type_id => 1} = round_counts
shot_record_fixture(%{count: 1}, current_user, first_pack)
round_counts = [type, another_type] |> Ammo.get_round_count_for_types(current_user)
round_counts =
Ammo.get_grouped_round_count(current_user,
types: [type, another_type],
group_by: :type_id
)
assert %{^type_id => 24} = round_counts
assert %{^another_type_id => 1} = round_counts
end
test "get_historical_count_for_type/2 gets accurate total round count for type",
test "get_historical_count/2 gets accurate total round count for type",
%{type: type, current_user: current_user, container: container} do
assert 0 = Ammo.get_historical_count_for_type(type, current_user)
assert 0 = Ammo.get_historical_count(type, current_user)
{1, [first_pack]} = pack_fixture(%{count: 1}, type, container, current_user)
assert 1 = Ammo.get_historical_count_for_type(type, current_user)
assert 1 = Ammo.get_historical_count(type, current_user)
{1, [pack]} = pack_fixture(%{count: 50}, type, container, current_user)
assert 51 = Ammo.get_historical_count_for_type(type, current_user)
assert 51 = Ammo.get_historical_count(type, current_user)
shot_record_fixture(%{count: 26}, current_user, pack)
assert 51 = Ammo.get_historical_count_for_type(type, current_user)
assert 51 = Ammo.get_historical_count(type, current_user)
shot_record_fixture(%{count: 1}, current_user, first_pack)
assert 51 = Ammo.get_historical_count_for_type(type, current_user)
assert 51 = Ammo.get_historical_count(type, current_user)
end
test "get_historical_count_for_types/2 gets accurate total round counts for types",
test "get_historical_counts/2 gets accurate total round counts for types",
%{
type: %{id: type_id} = type,
current_user: current_user,
container: container
} do
assert %{} == [type] |> Ammo.get_historical_count_for_types(current_user)
assert %{} == [type] |> Ammo.get_historical_counts(current_user)
{1, [first_pack]} = pack_fixture(%{count: 1}, type, container, current_user)
assert %{type_id => 1} ==
[type] |> Ammo.get_historical_count_for_types(current_user)
[type] |> Ammo.get_historical_counts(current_user)
%{id: another_type_id} = another_type = type_fixture(current_user)
{1, [_pack]} = pack_fixture(%{count: 1}, another_type, container, current_user)
historical_counts =
[type, another_type] |> Ammo.get_historical_count_for_types(current_user)
historical_counts = [type, another_type] |> Ammo.get_historical_counts(current_user)
assert %{^type_id => 1} = historical_counts
assert %{^another_type_id => 1} = historical_counts
{1, [pack]} = pack_fixture(%{count: 50}, type, container, current_user)
historical_counts =
[type, another_type] |> Ammo.get_historical_count_for_types(current_user)
historical_counts = [type, another_type] |> Ammo.get_historical_counts(current_user)
assert %{^type_id => 51} = historical_counts
assert %{^another_type_id => 1} = historical_counts
shot_record_fixture(%{count: 26}, current_user, pack)
historical_counts =
[type, another_type] |> Ammo.get_historical_count_for_types(current_user)
historical_counts = [type, another_type] |> Ammo.get_historical_counts(current_user)
assert %{^type_id => 51} = historical_counts
assert %{^another_type_id => 1} = historical_counts
shot_record_fixture(%{count: 1}, current_user, first_pack)
historical_counts =
[type, another_type] |> Ammo.get_historical_count_for_types(current_user)
historical_counts = [type, another_type] |> Ammo.get_historical_counts(current_user)
assert %{^type_id => 51} = historical_counts
assert %{^another_type_id => 1} = historical_counts
end
test "get_used_packs_count_for_type/2 gets accurate total ammo count for type",
test "get_packs_count/2 gets accurate total ammo count for type with show_used",
%{type: type, current_user: current_user, container: container} do
assert 0 = Ammo.get_used_packs_count_for_type(type, current_user)
assert 0 = Ammo.get_packs_count(current_user, type_id: type.id, show_used: :only_used)
{1, [first_pack]} = pack_fixture(%{count: 1}, type, container, current_user)
assert 0 = Ammo.get_used_packs_count_for_type(type, current_user)
assert 0 = Ammo.get_packs_count(current_user, type_id: type.id, show_used: :only_used)
{1, [pack]} = pack_fixture(%{count: 50}, type, container, current_user)
assert 0 = Ammo.get_used_packs_count_for_type(type, current_user)
assert 0 = Ammo.get_packs_count(current_user, type_id: type.id, show_used: :only_used)
shot_record_fixture(%{count: 50}, current_user, pack)
assert 1 = Ammo.get_used_packs_count_for_type(type, current_user)
assert 1 = Ammo.get_packs_count(current_user, type_id: type.id, show_used: :only_used)
shot_record_fixture(%{count: 1}, current_user, first_pack)
assert 2 = Ammo.get_used_packs_count_for_type(type, current_user)
assert 2 = Ammo.get_packs_count(current_user, type_id: type.id, show_used: :only_used)
end
test "get_used_packs_count_for_types/2 gets accurate total ammo counts for types",
test "get_grouped_packs_count/2 gets accurate total ammo counts for types",
%{
type: %{id: type_id} = type,
current_user: current_user,
container: container
} do
# testing empty type
assert %{} == [type] |> Ammo.get_used_packs_count_for_types(current_user)
assert %{} ==
Ammo.get_grouped_packs_count(current_user,
types: [type],
group_by: :type_id,
show_used: :only_used
)
# testing two empty types
%{id: another_type_id} = another_type = type_fixture(current_user)
assert %{} ==
[type, another_type]
|> Ammo.get_used_packs_count_for_types(current_user)
Ammo.get_grouped_packs_count(current_user,
types: [type, another_type],
group_by: :type_id,
show_used: :only_used
)
# testing type with pack
{1, [first_pack]} = pack_fixture(%{count: 1}, type, container, current_user)
assert %{} ==
[type, another_type]
|> Ammo.get_used_packs_count_for_types(current_user)
Ammo.get_grouped_packs_count(current_user,
types: [type, another_type],
group_by: :type_id,
show_used: :only_used
)
# testing type with used pack
{1, [another_pack]} = pack_fixture(%{count: 50}, another_type, container, current_user)
@ -519,14 +542,22 @@ defmodule Cannery.AmmoTest do
shot_record_fixture(%{count: 50}, current_user, another_pack)
assert %{another_type_id => 1} ==
[type, another_type]
|> Ammo.get_used_packs_count_for_types(current_user)
Ammo.get_grouped_packs_count(current_user,
types: [type, another_type],
group_by: :type_id,
show_used: :only_used
)
# testing two types with zero and one used packs
{1, [pack]} = pack_fixture(%{count: 50}, type, container, current_user)
shot_record_fixture(%{count: 50}, current_user, pack)
used_counts = [type, another_type] |> Ammo.get_used_packs_count_for_types(current_user)
used_counts =
Ammo.get_grouped_packs_count(current_user,
types: [type, another_type],
group_by: :type_id,
show_used: :only_used
)
assert %{^type_id => 1} = used_counts
assert %{^another_type_id => 1} = used_counts
@ -534,30 +565,35 @@ defmodule Cannery.AmmoTest do
# testing two type with one and two used packs
shot_record_fixture(%{count: 1}, current_user, first_pack)
used_counts = [type, another_type] |> Ammo.get_used_packs_count_for_types(current_user)
used_counts =
Ammo.get_grouped_packs_count(current_user,
types: [type, another_type],
group_by: :type_id,
show_used: :only_used
)
assert %{^type_id => 2} = used_counts
assert %{^another_type_id => 1} = used_counts
end
test "get_packs_count_for_container!/2 gets accurate ammo count for container",
test "get_packs_count/2 gets accurate ammo count for container by container_id",
%{type: type, current_user: current_user, container: container} do
{1, [first_pack]} = pack_fixture(%{count: 5}, type, container, current_user)
assert 1 = Ammo.get_packs_count_for_container!(container, current_user)
assert 1 = Ammo.get_packs_count(current_user, container_id: container.id)
{25, _packs} = pack_fixture(%{count: 5}, 25, type, container, current_user)
assert 26 = Ammo.get_packs_count_for_container!(container, current_user)
assert 26 = Ammo.get_packs_count(current_user, container_id: container.id)
shot_record_fixture(%{count: 1}, current_user, first_pack)
assert 26 = Ammo.get_packs_count_for_container!(container, current_user)
assert 26 = Ammo.get_packs_count(current_user, container_id: container.id)
shot_record_fixture(%{count: 4}, current_user, first_pack)
assert 25 = Ammo.get_packs_count_for_container!(container, current_user)
assert 25 = Ammo.get_packs_count(current_user, container_id: container.id)
end
test "get_packs_count_for_containers/2 gets accurate ammo count for containers", %{
test "get_grouped_packs_count/2 gets accurate ammo count for containers", %{
type: type,
current_user: current_user,
container: %{id: container_id} = container
@ -569,8 +605,10 @@ defmodule Cannery.AmmoTest do
{1, [_first_pack]} = pack_fixture(%{count: 5}, type, another_container, current_user)
packs_count =
[container, another_container]
|> Ammo.get_packs_count_for_containers(current_user)
Ammo.get_grouped_packs_count(current_user,
containers: [container, another_container],
group_by: :container_id
)
assert %{^container_id => 1} = packs_count
assert %{^another_container_id => 1} = packs_count
@ -578,8 +616,10 @@ defmodule Cannery.AmmoTest do
{25, _packs} = pack_fixture(%{count: 5}, 25, type, container, current_user)
packs_count =
[container, another_container]
|> Ammo.get_packs_count_for_containers(current_user)
Ammo.get_grouped_packs_count(current_user,
containers: [container, another_container],
group_by: :container_id
)
assert %{^container_id => 26} = packs_count
assert %{^another_container_id => 1} = packs_count
@ -587,8 +627,10 @@ defmodule Cannery.AmmoTest do
shot_record_fixture(%{count: 1}, current_user, first_pack)
packs_count =
[container, another_container]
|> Ammo.get_packs_count_for_containers(current_user)
Ammo.get_grouped_packs_count(current_user,
containers: [container, another_container],
group_by: :container_id
)
assert %{^container_id => 26} = packs_count
assert %{^another_container_id => 1} = packs_count
@ -596,28 +638,30 @@ defmodule Cannery.AmmoTest do
shot_record_fixture(%{count: 4}, current_user, first_pack)
packs_count =
[container, another_container]
|> Ammo.get_packs_count_for_containers(current_user)
Ammo.get_grouped_packs_count(current_user,
containers: [container, another_container],
group_by: :container_id
)
assert %{^container_id => 25} = packs_count
assert %{^another_container_id => 1} = packs_count
end
test "get_round_count_for_container!/2 gets accurate total round count for container",
test "get_round_count/2 gets accurate total round count for container_id",
%{type: type, current_user: current_user, container: container} do
{1, [first_pack]} = pack_fixture(%{count: 5}, type, container, current_user)
assert 5 = Ammo.get_round_count_for_container!(container, current_user)
assert 5 = Ammo.get_round_count(current_user, container_id: container.id)
{25, _packs} = pack_fixture(%{count: 5}, 25, type, container, current_user)
assert 130 = Ammo.get_round_count_for_container!(container, current_user)
assert 130 = Ammo.get_round_count(current_user, container_id: container.id)
shot_record_fixture(%{count: 5}, current_user, first_pack)
assert 125 = Ammo.get_round_count_for_container!(container, current_user)
assert 125 = Ammo.get_round_count(current_user, container_id: container.id)
end
test "get_round_count_for_containers/2 gets accurate total round count for containers",
test "get_grouped_round_count/2 gets accurate total round count for containers",
%{
type: type,
current_user: current_user,
@ -630,7 +674,10 @@ defmodule Cannery.AmmoTest do
{1, [_first_pack]} = pack_fixture(%{count: 5}, type, another_container, current_user)
round_counts =
[container, another_container] |> Ammo.get_round_count_for_containers(current_user)
Ammo.get_grouped_round_count(current_user,
containers: [container, another_container],
group_by: :container_id
)
assert %{^container_id => 5} = round_counts
assert %{^another_container_id => 5} = round_counts
@ -638,7 +685,10 @@ defmodule Cannery.AmmoTest do
{25, _packs} = pack_fixture(%{count: 5}, 25, type, container, current_user)
round_counts =
[container, another_container] |> Ammo.get_round_count_for_containers(current_user)
Ammo.get_grouped_round_count(current_user,
containers: [container, another_container],
group_by: :container_id
)
assert %{^container_id => 130} = round_counts
assert %{^another_container_id => 5} = round_counts
@ -646,7 +696,10 @@ defmodule Cannery.AmmoTest do
shot_record_fixture(%{count: 5}, current_user, first_pack)
round_counts =
[container, another_container] |> Ammo.get_round_count_for_containers(current_user)
Ammo.get_grouped_round_count(current_user,
containers: [container, another_container],
group_by: :container_id
)
assert %{^container_id => 125} = round_counts
assert %{^another_container_id => 5} = round_counts
@ -692,19 +745,19 @@ defmodule Cannery.AmmoTest do
]
end
test "get_packs_count!/2 returns the correct amount of ammo",
test "get_packs_count/2 returns the correct amount of ammo",
%{type: type, container: container, current_user: current_user} do
assert Ammo.get_packs_count!(current_user) == 1
assert Ammo.get_packs_count(current_user) == 1
pack_fixture(type, container, current_user)
assert Ammo.get_packs_count!(current_user) == 2
assert Ammo.get_packs_count(current_user) == 2
pack_fixture(type, container, current_user)
assert Ammo.get_packs_count!(current_user) == 3
assert Ammo.get_packs_count(current_user) == 3
other_user = user_fixture()
assert Ammo.get_packs_count!(other_user) == 0
assert Ammo.get_packs_count!(other_user, true) == 0
assert Ammo.get_packs_count(other_user) == 0
assert Ammo.get_packs_count(other_user, show_used: true) == 0
other_type = type_fixture(other_user)
other_container = container_fixture(other_user)
@ -712,11 +765,11 @@ defmodule Cannery.AmmoTest do
{1, [another_pack]} = pack_fixture(%{count: 30}, other_type, other_container, other_user)
shot_record_fixture(%{count: 30}, other_user, another_pack)
assert Ammo.get_packs_count!(other_user) == 0
assert Ammo.get_packs_count!(other_user, true) == 1
assert Ammo.get_packs_count(other_user) == 0
assert Ammo.get_packs_count(other_user, show_used: true) == 1
end
test "list_packs/4 returns all packs for a type" do
test "list_packs/2 returns all packs for a type" do
current_user = user_fixture()
container = container_fixture(current_user)
@ -727,24 +780,24 @@ defmodule Cannery.AmmoTest do
pistol_type = type_fixture(%{class: :pistol}, current_user)
{1, [pistol_pack]} = pack_fixture(pistol_type, container, current_user)
assert [^rifle_pack] = Ammo.list_packs(nil, :rifle, current_user, false)
assert [^shotgun_pack] = Ammo.list_packs(nil, :shotgun, current_user, false)
assert [^pistol_pack] = Ammo.list_packs(nil, :pistol, current_user, false)
assert [^rifle_pack] = Ammo.list_packs(current_user, class: :rifle)
assert [^shotgun_pack] = Ammo.list_packs(current_user, class: :shotgun)
assert [^pistol_pack] = Ammo.list_packs(current_user, class: :pistol)
packs = Ammo.list_packs(nil, :all, current_user, false)
packs = Ammo.list_packs(current_user, class: :all)
assert Enum.count(packs) == 3
assert rifle_pack in packs
assert shotgun_pack in packs
assert pistol_pack in packs
packs = Ammo.list_packs(nil, nil, current_user, false)
packs = Ammo.list_packs(current_user)
assert Enum.count(packs) == 3
assert rifle_pack in packs
assert shotgun_pack in packs
assert pistol_pack in packs
end
test "list_packs/4 returns all relevant packs including used", %{
test "list_packs/2 returns all relevant packs including used", %{
type: type,
pack: pack,
container: container,
@ -756,15 +809,15 @@ defmodule Cannery.AmmoTest do
shot_record_fixture(%{count: 30}, current_user, another_pack)
another_pack = Ammo.get_pack!(another_pack_id, current_user)
assert Ammo.list_packs(nil, :all, current_user, false) == [pack]
assert Ammo.list_packs(current_user, show_used: false) == [pack]
packs = Ammo.list_packs(nil, :all, current_user, true)
packs = Ammo.list_packs(current_user, show_used: true)
assert Enum.count(packs) == 2
assert another_pack in packs
assert pack in packs
end
test "list_packs/4 returns relevant packs when searched", %{
test "list_packs/2 returns relevant packs when searched", %{
type: type,
pack: pack,
container: container,
@ -784,7 +837,7 @@ defmodule Cannery.AmmoTest do
{1, [fantastic_pack]} = pack_fixture(%{count: 47}, type, another_container, current_user)
packs = Ammo.list_packs(nil, :all, current_user, false)
packs = Ammo.list_packs(current_user, search: nil)
assert Enum.count(packs) == 4
assert fantastic_pack in packs
assert amazing_pack in packs
@ -792,37 +845,51 @@ defmodule Cannery.AmmoTest do
assert pack in packs
# search works for pack attributes
assert Ammo.list_packs("cool", :all, current_user, true) == [another_pack]
assert Ammo.list_packs(current_user, search: "cool") == [another_pack]
# search works for type attributes
assert Ammo.list_packs("amazing", :all, current_user, true) == [amazing_pack]
assert Ammo.list_packs(current_user, search: "amazing") == [amazing_pack]
# search works for container attributes
assert Ammo.list_packs("fantastic", :all, current_user, true) ==
[fantastic_pack]
assert Ammo.list_packs(current_user, search: "fantastic") == [fantastic_pack]
# search works for container tag attributes
assert Ammo.list_packs("stupendous", :all, current_user, true) ==
[fantastic_pack]
assert Ammo.list_packs("random", :all, current_user, true) == []
assert Ammo.list_packs(current_user, search: "stupendous") == [fantastic_pack]
assert Ammo.list_packs(current_user, search: "random") == []
end
test "list_packs_for_type/3 returns all packs for a type", %{
test "list_packs/2 returns all relevant packs including staged", %{
type: type,
container: container,
pack: unstaged_pack,
current_user: current_user
} do
{1, [staged_pack]} = pack_fixture(%{staged: true}, type, container, current_user)
assert Ammo.list_packs(current_user, staged: false) == [unstaged_pack]
assert Ammo.list_packs(current_user, staged: true) == [staged_pack]
packs = Ammo.list_packs(current_user)
assert Enum.count(packs) == 2
assert unstaged_pack in packs
assert staged_pack in packs
end
test "list_packs/2 returns all relevant packs for a type", %{
container: container,
current_user: current_user
} do
type = type_fixture(current_user)
{1, [pack]} = pack_fixture(type, container, current_user)
assert [^pack] = Ammo.list_packs_for_type(type, current_user)
assert [^pack] = Ammo.list_packs(current_user, type_id: type.id)
shot_record_fixture(current_user, pack)
pack = Ammo.get_pack!(pack.id, current_user)
assert [] == Ammo.list_packs_for_type(type, current_user)
assert [^pack] = Ammo.list_packs_for_type(type, current_user, true)
assert [] == Ammo.list_packs(current_user, type_id: type.id)
assert [^pack] = Ammo.list_packs(current_user, type_id: type.id, show_used: true)
end
test "list_packs_for_container/3 returns all packs for a container" do
test "list_packs/2 returns all relevant packs for a container" do
current_user = user_fixture()
container = container_fixture(current_user)
@ -838,78 +905,81 @@ defmodule Cannery.AmmoTest do
pack_fixture(shotgun_type, another_container, current_user)
pack_fixture(pistol_type, another_container, current_user)
assert [^rifle_pack] = Ammo.list_packs_for_container(container, :rifle, current_user)
assert [^rifle_pack] =
Ammo.list_packs(current_user, container_id: container.id, class: :rifle)
assert [^shotgun_pack] = Ammo.list_packs_for_container(container, :shotgun, current_user)
assert [^shotgun_pack] =
Ammo.list_packs(current_user, container_id: container.id, class: :shotgun)
assert [^pistol_pack] = Ammo.list_packs_for_container(container, :pistol, current_user)
assert [^pistol_pack] =
Ammo.list_packs(current_user, container_id: container.id, class: :pistol)
packs = Ammo.list_packs_for_container(container, :all, current_user)
packs = Ammo.list_packs(current_user, container_id: container.id, class: :all)
assert Enum.count(packs) == 3
assert rifle_pack in packs
assert shotgun_pack in packs
assert pistol_pack in packs
packs = Ammo.list_packs_for_container(container, nil, current_user)
packs = Ammo.list_packs(current_user, container_id: container.id)
assert Enum.count(packs) == 3
assert rifle_pack in packs
assert shotgun_pack in packs
assert pistol_pack in packs
end
test "get_packs_count_for_type/2 returns count of packs for a type", %{
test "get_packs_count/2 with type_id returns count of packs for a type", %{
type: type,
container: container,
current_user: current_user
} do
assert 1 = Ammo.get_packs_count_for_type(type, current_user)
assert 1 = Ammo.get_packs_count(current_user, type_id: type.id)
another_type = type_fixture(current_user)
assert 0 = Ammo.get_packs_count_for_type(another_type, current_user)
assert 0 = Ammo.get_packs_count(current_user, type_id: another_type.id)
{5, _packs} = pack_fixture(%{}, 5, type, container, current_user)
assert 6 = Ammo.get_packs_count_for_type(type, current_user)
assert 6 = Ammo.get_packs_count(current_user, type_id: type.id)
end
test "get_packs_count_for_types/2 returns counts of packs for types", %{
test "get_grouped_packs_count/2 returns counts of packs for types", %{
type: %{id: type_id} = type,
container: container,
current_user: current_user
} do
assert %{type_id => 1} ==
[type] |> Ammo.get_packs_count_for_types(current_user)
Ammo.get_grouped_packs_count(current_user, types: [type], group_by: :type_id)
%{id: another_type_id} = another_type = type_fixture(current_user)
assert %{type_id => 1} ==
[type, another_type]
|> Ammo.get_packs_count_for_types(current_user)
Ammo.get_grouped_packs_count(current_user,
types: [type, another_type],
group_by: :type_id
)
{1, [_pack]} = pack_fixture(another_type, container, current_user)
packs_count = [type, another_type] |> Ammo.get_packs_count_for_types(current_user)
packs_count =
Ammo.get_grouped_packs_count(current_user,
types: [type, another_type],
group_by: :type_id
)
assert %{^type_id => 1} = packs_count
assert %{^another_type_id => 1} = packs_count
{5, _packs} = pack_fixture(%{}, 5, type, container, current_user)
packs_count = [type, another_type] |> Ammo.get_packs_count_for_types(current_user)
packs_count =
Ammo.get_grouped_packs_count(current_user,
types: [type, another_type],
group_by: :type_id
)
assert %{^type_id => 6} = packs_count
assert %{^another_type_id => 1} = packs_count
end
test "list_staged_packs/1 returns all packs that are staged", %{
type: type,
container: container,
current_user: current_user
} do
{1, [another_pack]} = pack_fixture(%{staged: true}, type, container, current_user)
assert Ammo.list_staged_packs(current_user) == [another_pack]
end
test "get_pack!/2 returns the pack with given id",
%{pack: %{id: pack_id} = pack, current_user: current_user} do
assert Ammo.get_pack!(pack_id, current_user) == pack

View File

@ -77,16 +77,16 @@ defmodule Cannery.ContainersTest do
_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]
assert Containers.list_containers(current_user, search: "cool") == [container_a]
assert Containers.list_containers(current_user, search: "fascinating") == [container_b]
assert Containers.list_containers(current_user, search: "secret") == [container_c]
assert Containers.list_containers(current_user, search: "box") == [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(current_user, search: "stupendous") == [container_c]
assert Containers.list_containers(current_user, search: "amazing") == [container_d]
assert Containers.list_containers("asajslkdflskdf", current_user) == []
assert Containers.list_containers(current_user, search: "asajslkdflskdf") == []
end
test "get_container!/2 returns the container with given id",
@ -168,10 +168,10 @@ defmodule Cannery.ContainersTest do
tag_fixture(%{name: "bullet", desc: "pews brass shell"}, user_fixture())
# name
assert Containers.list_tags("bullet", current_user) == [tag_a]
assert Containers.list_tags("bullets", current_user) == [tag_a]
assert Containers.list_tags("hollow", current_user) == [tag_b]
assert Containers.list_tags("hollows", current_user) == [tag_b]
assert Containers.list_tags(current_user, search: "bullet") == [tag_a]
assert Containers.list_tags(current_user, search: "bullets") == [tag_a]
assert Containers.list_tags(current_user, search: "hollow") == [tag_b]
assert Containers.list_tags(current_user, search: "hollows") == [tag_b]
end
test "get_tag!/2 returns the tag with given id", %{tag: tag, current_user: current_user} do

View File

@ -51,7 +51,7 @@ defmodule CanneryWeb.ExportControllerTest do
"price_paid" => pack.price_paid,
"lot_number" => pack.lot_number,
"staged" => pack.staged,
"used_count" => pack |> ActivityLog.get_used_count(current_user),
"used_count" => ActivityLog.get_used_count(current_user, pack_id: pack.id),
"original_count" => pack |> Ammo.get_original_count(current_user),
"cpr" => pack |> Ammo.get_cpr(current_user),
"percentage_remaining" => pack |> Ammo.get_percentage_remaining(current_user)
@ -90,11 +90,12 @@ defmodule CanneryWeb.ExportControllerTest do
"load_grains" => type.load_grains,
"shot_charge_weight" => type.shot_charge_weight,
"dram_equivalent" => type.dram_equivalent,
"average_cost" => type |> Ammo.get_average_cost_for_type(current_user),
"round_count" => type |> Ammo.get_round_count_for_type(current_user),
"used_count" => type |> ActivityLog.get_used_count_for_type(current_user),
"pack_count" => type |> Ammo.get_packs_count_for_type(current_user),
"total_pack_count" => type |> Ammo.get_packs_count_for_type(current_user, true)
"average_cost" => Ammo.get_average_cost(type, current_user),
"round_count" => Ammo.get_round_count(current_user, type_id: type.id),
"used_count" => ActivityLog.get_used_count(current_user, type_id: type.id),
"pack_count" => Ammo.get_packs_count(current_user, type_id: type.id),
"total_pack_count" =>
Ammo.get_packs_count(current_user, type_id: type.id, show_used: true)
}
ideal_container = %{
@ -111,8 +112,8 @@ defmodule CanneryWeb.ExportControllerTest do
}
],
"type" => container.type,
"pack_count" => container |> Ammo.get_packs_count_for_container!(current_user),
"round_count" => container |> Ammo.get_round_count_for_container!(current_user)
"pack_count" => Ammo.get_packs_count(current_user, container_id: container.id),
"round_count" => Ammo.get_round_count(current_user, container_id: container.id)
}
ideal_shot_record = %{

View File

@ -177,7 +177,7 @@ defmodule CanneryWeb.PackLiveTest do
|> follow_redirect(conn, ~p"/ammo")
assert html =~ "Ammo added successfully"
assert Ammo.list_packs(nil, :all, current_user) |> Enum.count() == multiplier + 1
assert Ammo.list_packs(current_user) |> Enum.count() == multiplier + 1
end
test "does not save invalid number of new packs", %{conn: conn} do