37 Commits

Author SHA1 Message Date
b6b6cecc0a update deps
All checks were successful
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2025-02-01 02:12:41 -05:00
08916a504f add button to resend email verification email 2025-02-01 02:12:41 -05:00
3eda522903 move staging to container 2025-02-01 02:12:41 -05:00
2e6e26006d fix style issues 2025-02-01 02:12:41 -05:00
b66d0ea8a1 add date range to range page 2025-02-01 02:12:41 -05:00
839e1d7124 fix dates not displaying properly 2025-01-31 22:33:07 -05:00
76834845a3 update deps 2025-01-12 16:51:27 -05:00
cc1413ade5 finish updating deps
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2024-10-26 17:16:04 -04:00
668e4c611b update gettext schema and use macros for cannery app
Some checks failed
continuous-integration/drone/push Build is failing
2024-10-26 17:07:32 -04:00
ab3d3721d6 allow filtering ammo types when creating new packs and fix some form errors not displaying on create 2024-10-26 17:07:32 -04:00
7e14f292a6 add slimselect to select elements with user content 2024-10-26 16:32:47 -04:00
16a5cb9254 fix registration page not offering all translations 2024-10-26 14:20:23 -04:00
f722f9901b update deps 2024-10-26 13:12:34 -04:00
6adae82e94 build armv7
All checks were successful
continuous-integration/drone/push Build is passing
2024-08-16 17:50:43 -04:00
a87bf15f72 build arm
All checks were successful
continuous-integration/drone/push Build is passing
2024-08-16 17:01:35 -04:00
75c0f8642b add project website to readme
All checks were successful
continuous-integration/drone/push Build is passing
2024-08-15 09:44:34 -04:00
ec782515ac improve testing db timeout
All checks were successful
continuous-integration/drone/push Build is passing
2024-07-28 13:49:26 -04:00
e1cb46cb97 fix dockerfile
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2024-07-28 13:35:58 -04:00
56a49ed2e3 fix changesets
Some checks failed
continuous-integration/drone/tag Build is failing
continuous-integration/drone/push Build is failing
2024-07-28 13:17:33 -04:00
f25c151956 add debounces to more fields 2024-07-28 13:05:50 -04:00
c2ddc2ae0d update deps 2024-07-28 12:21:36 -04:00
33e4d26a3d fix emails 2024-07-28 12:21:36 -04:00
179d67a896 update versions 2024-07-28 12:21:35 -04:00
15354d6004 update versions
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-18 09:14:53 -04:00
e358cd6e4e downgrade versions until hex is supported in build
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2024-06-16 12:13:34 -04:00
202b70dc66 fix changeset warning
Some checks failed
continuous-integration/drone/tag Build is failing
continuous-integration/drone/push Build is failing
2024-06-16 11:48:49 -04:00
b963baa49d fix an issue with emails not being able to be sent 2024-06-16 11:46:35 -04:00
70701a27d3 fix issue with oban exception logger 2024-06-16 11:42:00 -04:00
67dc16d222 update deps 2024-06-16 11:42:00 -04:00
fa35038426 update to elixir 1.17 2024-06-16 11:42:00 -04:00
d896257602 actually fix bar graph
All checks were successful
continuous-integration/drone/push Build is passing
2024-03-19 00:28:30 -04:00
4ca51a3f53 update dependencies
All checks were successful
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2024-03-19 00:01:27 -04:00
96b05e8332 Make bar graph ignore gaps 2024-03-19 00:00:51 -04:00
557a2cac3d Improve login page autocomplete behavior
All checks were successful
continuous-integration/drone/push Build is passing
2024-03-18 23:39:06 -04:00
e16e04c114 combine imports
All checks were successful
continuous-integration/drone/push Build is passing
2024-03-18 23:26:41 -04:00
bbe4d82303 Use bar graph instead of line graph 2024-03-18 23:26:32 -04:00
c69d7843ab fix layout issues
All checks were successful
continuous-integration/drone/push Build is passing
2024-02-23 23:34:04 -05:00
128 changed files with 7150 additions and 8272 deletions

View File

@ -17,7 +17,7 @@ steps:
- .mix - .mix
- name: test - name: test
image: elixir:1.16.1-alpine image: elixir:1.18.1-otp-27-alpine
environment: environment:
TEST_DATABASE_URL: ecto://postgres:postgres@database/cannery_test TEST_DATABASE_URL: ecto://postgres:postgres@database/cannery_test
HOST: testing.example.tld HOST: testing.example.tld
@ -26,8 +26,8 @@ steps:
MIX_ENV: test MIX_ENV: test
commands: commands:
- apk add --no-cache build-base npm git - apk add --no-cache build-base npm git
- mix local.rebar --force --if-missing - mix local.rebar --force
- mix local.hex --force --if-missing - mix local.hex --force
- mix deps.get - mix deps.get
- npm set cache .npm - npm set cache .npm
- npm --prefix ./assets ci --no-audit --prefer-offline - npm --prefix ./assets ci --no-audit --prefer-offline
@ -36,7 +36,7 @@ steps:
- mix test.all - mix test.all
- name: build and publish stable - name: build and publish stable
image: thegeeklab/drone-docker-buildx image: plugins/docker
privileged: true privileged: true
settings: settings:
repo: shibaobun/cannery repo: shibaobun/cannery
@ -44,6 +44,8 @@ steps:
compress: true compress: true
platforms: platforms:
- linux/amd64 - linux/amd64
- linux/arm64
- linux/arm/v7
username: username:
from_secret: docker_username from_secret: docker_username
password: password:
@ -54,7 +56,7 @@ steps:
- stable - stable
- name: build and publish tagged version - name: build and publish tagged version
image: thegeeklab/drone-docker-buildx image: plugins/docker
privileged: true privileged: true
settings: settings:
repo: shibaobun/cannery repo: shibaobun/cannery
@ -62,6 +64,8 @@ steps:
compress: true compress: true
platforms: platforms:
- linux/amd64 - linux/amd64
- linux/arm64
- linux/arm/v7
username: username:
from_secret: docker_username from_secret: docker_username
password: password:

View File

@ -1,3 +1,3 @@
elixir 1.16.1-otp-26 elixir 1.18.1-otp-27
erlang 26.2.2 erlang 27.2.1
nodejs 21.6.2 nodejs 23.7.0

View File

@ -1,3 +1,39 @@
# v0.9.13
- Add button to resend email verification email
- Move staging to container, rather than ammo
- Add date restriction dropdown to range page
- Fix dates not rendering properly in table
- Update deps
# v0.9.12
- Allow filtering ammo types when creating new packs
- Add SlimSelect to select elements with user content
- Fix registration page not offering all translations
- Update deps
# v0.9.11
- Fix an issue with emails not being able to be sent for real this time
- Fix some dropdowns not filling in the correct data
- Add debounces to more fields
- Update deps
# v0.9.10
- Fix issue with logger failing on oban exceptions
- Fix an issue with emails not being able to be sent
- Update deps
# 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 # v0.9.6
- Make ammo packs in containers directly navigable in table view - Make ammo packs in containers directly navigable in table view
- Update dependencies - Update dependencies

View File

@ -1,4 +1,4 @@
FROM elixir:1.16.1-alpine AS build FROM elixir:1.18.1-otp-27-alpine AS build
# install build dependencies # install build dependencies
RUN apk add --no-cache build-base npm git python3 RUN apk add --no-cache build-base npm git python3
@ -7,8 +7,8 @@ RUN apk add --no-cache build-base npm git python3
WORKDIR /app WORKDIR /app
# install hex + rebar # install hex + rebar
RUN mix local.hex --force && \ RUN mix local.rebar --force && \
mix local.rebar --force mix local.hex --force
# set build ENV # set build ENV
ENV MIX_ENV=prod ENV MIX_ENV=prod

View File

@ -94,6 +94,7 @@ license can be found at
# Links # Links
- [Website](https://cannery.app): Project website
- [Gitea](https://gitea.bubbletea.dev/shibao/cannery): Main repo, feature - [Gitea](https://gitea.bubbletea.dev/shibao/cannery): Main repo, feature
requests and bug reports requests and bug reports
- [Github](https://github.com/shibaobun/cannery): Source code mirror, please - [Github](https://github.com/shibaobun/cannery): Source code mirror, please

View File

@ -8,6 +8,8 @@ $fa-font-path: "@fortawesome/fontawesome-free/webfonts";
@import "@fortawesome/fontawesome-free/scss/solid"; @import "@fortawesome/fontawesome-free/scss/solid";
@import "@fortawesome/fontawesome-free/scss/brands"; @import "@fortawesome/fontawesome-free/scss/brands";
@import "slim-select/styles";
@import "components"; @import "components";
/* fix firefox scrollbars */ /* fix firefox scrollbars */
@ -25,7 +27,7 @@ $fa-font-path: "@fortawesome/fontawesome-free/webfonts";
100% { scale: 1.0; opacity: 1; } 100% { scale: 1.0; opacity: 1; }
} }
// disconnect toast /* disconnect toast */
.phx-connected > #disconnect { .phx-connected > #disconnect {
opacity: 0 !important; opacity: 0 !important;
pointer-events: none; pointer-events: none;
@ -152,3 +154,57 @@ $fa-font-path: "@fortawesome/fontawesome-free/webfonts";
0% { opacity: 1; } 0% { opacity: 1; }
100% { opacity: 0; } 100% { opacity: 0; }
} }
.ss-main {
@apply input;
}
.ss-main.input-primary {
@apply border-primary-500 hover:border-primary-600 active:border-primary-600;
}
.ss-content {
@apply input;
}
.ss-content.input-primary {
@apply border-primary-500 hover:border-primary-600 active:border-primary-600;
}
.ss-content.ss-open-above {
border-bottom-left-radius: 0px;
border-bottom-right-radius: 0px;
}
.ss-content.ss-open-below {
border-top-left-radius: 0px;
border-top-right-radius: 0px;
}
.ss-search input[type="search"] {
@apply input;
}
.ss-content.input-primary .ss-search input[type="search"] {
@apply border-primary-500 hover:border-primary-600 active:border-primary-600;
}
.ss-content.ss-open-above .ss-search {
padding: var(--ss-spacing-l) 0 0 0;
}
.ss-content.ss-open-below .ss-search {
padding: 0 0 var(--ss-spacing-l) 0;
}
.ss-content.ss-open-above .ss-list > *:not(:first-child) {
margin: var(--ss-spacing-l) 0 0 0;
}
.ss-content.ss-open-below .ss-list > *:not(:last-child) {
margin: 0 0 var(--ss-spacing-l) 0;
}
.ss-content .ss-list .ss-option {
border-radius: var(--ss-border-radius);
}

View File

@ -24,15 +24,16 @@ import 'phoenix_html'
// Establish Phoenix Socket and LiveView configuration. // Establish Phoenix Socket and LiveView configuration.
import { Socket } from 'phoenix' import { Socket } from 'phoenix'
import { LiveSocket } from 'phoenix_live_view' import { LiveSocket } from 'phoenix_live_view'
import topbar from 'topbar'
import ShotLogChart from './shot_log_chart'
import Date from './date' import Date from './date'
import DateTime from './datetime' import DateTime from './datetime'
import ShotLogChart from './shot_log_chart'
import SlimSelect from './slim_select'
import topbar from 'topbar'
const csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute('content') const csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute('content')
const liveSocket = new LiveSocket('/live', Socket, { const liveSocket = new LiveSocket('/live', Socket, {
params: { _csrf_token: csrfToken }, params: { _csrf_token: csrfToken },
hooks: { Date, DateTime, ShotLogChart } hooks: { Date, DateTime, ShotLogChart, SlimSelect }
}) })
// Show progress bar on live navigation and form submits // Show progress bar on live navigation and form submits

View File

@ -1,7 +1,7 @@
export default { export default {
displayDate (el) { displayDate (el) {
const date = const date =
Intl.DateTimeFormat([], { timeZone: 'Etc/UTC', dateStyle: 'short' }) Intl.DateTimeFormat([], { timeZone: 'UTC', dateStyle: 'short' })
.format(new Date(el.dateTime)) .format(new Date(el.dateTime))
el.innerText = date el.innerText = date

View File

@ -1,7 +1,7 @@
export default { export default {
displayDateTime (el) { displayDateTime (el) {
const date = const date =
Intl.DateTimeFormat([], { dateStyle: 'short', timeStyle: 'long' }) Intl.DateTimeFormat([], { timeZone: 'UTC', dateStyle: 'short', timeStyle: 'long' })
.format(new Date(el.dateTime)) .format(new Date(el.dateTime))
el.innerText = date el.innerText = date

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

28
assets/js/slim_select.js Normal file
View File

@ -0,0 +1,28 @@
import SlimSelect from 'slim-select'
export default {
initalizeSlimSelect (el) {
// eslint-disable-next-line no-new
el.slimselect = new SlimSelect({
select: el,
settings: {
contentPosition: 'fixed'
}
})
const main = document.querySelector(`.ss-main[data-id="${el.dataset.id}"]`)
main.setAttribute('id', `${el.dataset.id}-main`)
main.setAttribute('phx-update', 'ignore')
const content = document.querySelector(`.ss-content[data-id="${el.dataset.id}"]`)
content.setAttribute('id', `${el.dataset.id}-content`)
content.setAttribute('phx-update', 'ignore')
},
updated () {
this.el.slimselect?.destroy()
this.initalizeSlimSelect(this.el)
},
mounted () {
this.initalizeSlimSelect(this.el)
}
}

9605
assets/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -3,8 +3,8 @@
"description": " ", "description": " ",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": "v21.6.2", "node": "v23.7.0",
"npm": "10.2.4" "npm": "10.9.2"
}, },
"scripts": { "scripts": {
"deploy": "NODE_ENV=production webpack --mode production", "deploy": "NODE_ENV=production webpack --mode production",
@ -13,37 +13,39 @@
"test": "standard" "test": "standard"
}, },
"dependencies": { "dependencies": {
"@fortawesome/fontawesome-free": "^6.5.1", "@fortawesome/fontawesome-free": "^6.7.2",
"chart.js": "^4.4.1", "chart.js": "^4.4.7",
"chartjs-adapter-date-fns": "^3.0.0", "chartjs-adapter-date-fns": "^3.0.0",
"date-fns": "^3.3.1", "date-fns": "^4.1.0",
"phoenix": "file:../deps/phoenix", "phoenix": "file:../deps/phoenix",
"phoenix_html": "file:../deps/phoenix_html", "phoenix_html": "file:../deps/phoenix_html",
"phoenix_live_view": "file:../deps/phoenix_live_view", "phoenix_live_view": "file:../deps/phoenix_live_view",
"topbar": "^2.0.2" "slim-select": "^2.10.0",
"topbar": "^3.0.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.23.9", "@babel/core": "^7.26.0",
"@babel/preset-env": "^7.23.9", "@babel/preset-env": "^7.26.0",
"autoprefixer": "^10.4.17", "autoprefixer": "^10.4.20",
"babel-loader": "^9.1.3", "babel-loader": "^9.2.1",
"copy-webpack-plugin": "^12.0.2", "copy-webpack-plugin": "^12.0.2",
"css-loader": "^6.10.0", "css-loader": "^7.1.2",
"css-minimizer-webpack-plugin": "^6.0.0", "css-minimizer-webpack-plugin": "^7.0.0",
"file-loader": "^6.2.0", "file-loader": "^6.2.0",
"mini-css-extract-plugin": "^2.8.0", "glob": "^11.0.1",
"npm-check-updates": "^16.14.15", "mini-css-extract-plugin": "^2.9.2",
"postcss": "^8.4.35", "npm-check-updates": "^17.1.13",
"postcss-import": "^16.0.1", "postcss": "^8.5.1",
"postcss-loader": "^8.1.0", "postcss-import": "^16.1.0",
"postcss-preset-env": "^9.4.0", "postcss-loader": "^8.1.1",
"sass": "^1.71.1", "postcss-preset-env": "^10.1.3",
"sass-loader": "^14.1.1", "sass": "^1.83.1",
"standard": "^17.1.0", "sass-loader": "^16.0.4",
"tailwindcss": "^3.4.1", "standard": "^17.1.2",
"terser-webpack-plugin": "^5.3.10", "tailwindcss": "^3.4.17",
"webpack": "^5.90.3", "terser-webpack-plugin": "^5.3.11",
"webpack-cli": "^5.1.4", "webpack": "^5.97.1",
"webpack-dev-server": "^5.0.2" "webpack-cli": "^6.0.1",
"webpack-dev-server": "^5.2.0"
} }
} }

View File

@ -8,6 +8,7 @@
import Config import Config
config :cannery, config :cannery,
env: :dev,
ecto_repos: [Cannery.Repo], ecto_repos: [Cannery.Repo],
generators: [binary_id: true] generators: [binary_id: true]

View File

@ -14,6 +14,8 @@ config :cannery, CanneryWeb.Endpoint, cache_static_manifest: "priv/static/cache_
# Do not print debug messages in production # Do not print debug messages in production
config :logger, level: :info config :logger, level: :info
config :cannery, env: :prod
# ## SSL Support # ## SSL Support
# #
# To get SSL working, you will need to add the `https` key # To get SSL working, you will need to add the `https` key

View File

@ -9,8 +9,9 @@ config :bcrypt_elixir, :log_rounds, 1
# to provide built-in test partitioning in CI environment. # to provide built-in test partitioning in CI environment.
# Run `mix help test` for more information. # Run `mix help test` for more information.
config :cannery, Cannery.Repo, config :cannery, Cannery.Repo,
pool_size: 10,
pool: Ecto.Adapters.SQL.Sandbox, pool: Ecto.Adapters.SQL.Sandbox,
pool_size: 10 timeout: 60000
# We don't run a server during test. If one is required, # We don't run a server during test. If one is required,
# you can enable the server option below. # you can enable the server option below.
@ -19,6 +20,8 @@ config :cannery, CanneryWeb.Endpoint,
secret_key_base: "S3qq9QtUdsFtlYej+HTjAVN95uP5i5tf2sPYINWSQfCKJghFj2B1+wTAoljZyHOK", secret_key_base: "S3qq9QtUdsFtlYej+HTjAVN95uP5i5tf2sPYINWSQfCKJghFj2B1+wTAoljZyHOK",
server: false server: false
config :cannery, env: :test
# In test we don't send emails. # In test we don't send emails.
config :cannery, Cannery.Mailer, adapter: Swoosh.Adapters.Test config :cannery, Cannery.Mailer, adapter: Swoosh.Adapters.Test
@ -32,4 +35,4 @@ config :logger, level: :warning
config :phoenix, :plug_init_mode, :runtime config :phoenix, :plug_init_mode, :runtime
# Disable Oban # Disable Oban
config :cannery, Oban, queues: false, plugins: false config :cannery, Oban, queues: false, plugins: false, testing: :manual

View File

@ -6,4 +6,34 @@ defmodule Cannery do
Contexts are also responsible for managing your data, regardless Contexts are also responsible for managing your data, regardless
if it comes from the database, an external API or others. if it comes from the database, an external API or others.
""" """
def context do
quote do
use Gettext, backend: CanneryWeb.Gettext
import Ecto.Query
alias Cannery.Accounts.User
alias Cannery.Repo
alias Ecto.{Changeset, Multi, Queryable, UUID}
end
end
def schema do
quote do
use Ecto.Schema
use Gettext, backend: CanneryWeb.Gettext
import Ecto.{Changeset, Query}
alias Cannery.Accounts.User
alias Ecto.{Association, Changeset, Queryable, UUID}
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
end
end
@doc """
When used, dispatch to the appropriate context/schema/etc.
"""
defmacro __using__(which) when is_atom(which) do
apply(__MODULE__, which, [])
end
end end

View File

@ -3,10 +3,9 @@ defmodule Cannery.Accounts do
The Accounts context. The Accounts context.
""" """
import Ecto.Query, warn: false use Cannery, :context
alias Cannery.{Mailer, Repo} alias Cannery.Mailer
alias Cannery.Accounts.{Invite, Invites, User, UserToken} alias Cannery.Accounts.{Invite, Invites, UserToken}
alias Ecto.{Changeset, Multi}
alias Oban.Job alias Oban.Job
## Database getters ## Database getters
@ -219,7 +218,7 @@ defmodule Cannery.Accounts do
with {:ok, query} <- UserToken.verify_change_email_token_query(token, context), with {:ok, query} <- UserToken.verify_change_email_token_query(token, context),
%UserToken{sent_to: email} <- Repo.one(query), %UserToken{sent_to: email} <- Repo.one(query),
{:ok, _} <- Repo.transaction(user_email_multi(user, email, context)) do {:ok, _result} <- Repo.transaction(user_email_multi(user, email, context)) do
:ok :ok
else else
_error_tuple -> :error _error_tuple -> :error

View File

@ -5,13 +5,8 @@ defmodule Cannery.Accounts.Invite do
`:uses_left` is defined. `:uses_left` is defined.
""" """
use Ecto.Schema use Cannery, :schema
import Ecto.Changeset
alias Cannery.Accounts.User
alias Ecto.{Association, Changeset, UUID}
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
schema "invites" do schema "invites" do
field :name, :string field :name, :string
field :token, :string field :token, :string

View File

@ -3,10 +3,8 @@ defmodule Cannery.Accounts.Invites do
The Invites context. The Invites context.
""" """
import Ecto.Query, warn: false use Cannery, :context
alias Ecto.Multi alias Cannery.Accounts.Invite
alias Cannery.Accounts.{Invite, User}
alias Cannery.Repo
@invite_token_length 20 @invite_token_length 20

View File

@ -3,11 +3,8 @@ defmodule Cannery.Accounts.User do
A Cannery user A Cannery user
""" """
use Ecto.Schema use Cannery, :schema
import Ecto.Changeset alias Cannery.Accounts.Invite
import CanneryWeb.Gettext
alias Ecto.{Association, Changeset, UUID}
alias Cannery.Accounts.{Invite, User}
@derive {Jason.Encoder, @derive {Jason.Encoder,
only: [ only: [
@ -20,8 +17,6 @@ defmodule Cannery.Accounts.User do
:updated_at :updated_at
]} ]}
@derive {Inspect, except: [:password]} @derive {Inspect, except: [:password]}
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
schema "users" do schema "users" do
field :email, :string field :email, :string
field :password, :string, virtual: true field :password, :string, virtual: true
@ -141,7 +136,7 @@ defmodule Cannery.Accounts.User do
|> cast(attrs, [:email]) |> cast(attrs, [:email])
|> validate_email() |> validate_email()
|> case do |> case do
%{changes: %{email: _}} = changeset -> changeset %{changes: %{email: _email}} = changeset -> changeset
%{} = changeset -> add_error(changeset, :email, dgettext("errors", "did not change")) %{} = changeset -> add_error(changeset, :email, dgettext("errors", "did not change"))
end end
end end

View File

@ -3,10 +3,7 @@ defmodule Cannery.Accounts.UserToken do
Schema for a user's session token Schema for a user's session token
""" """
use Ecto.Schema use Cannery, :schema
import Ecto.Query
alias Cannery.Accounts.User
alias Ecto.{Association, UUID}
@hash_algorithm :sha256 @hash_algorithm :sha256
@rand_size 32 @rand_size 32
@ -18,8 +15,6 @@ defmodule Cannery.Accounts.UserToken do
@change_email_validity_in_days 7 @change_email_validity_in_days 7
@session_validity_in_days 60 @session_validity_in_days 60
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
schema "users_tokens" do schema "users_tokens" do
field :token, :binary field :token, :binary
field :context, :string field :context, :string
@ -155,7 +150,7 @@ defmodule Cannery.Accounts.UserToken do
from t in __MODULE__, where: t.user_id == ^user.id from t in __MODULE__, where: t.user_id == ^user.id
end end
def user_and_contexts_query(user, [_ | _] = contexts) do def user_and_contexts_query(user, [_first | _rest] = contexts) do
from t in __MODULE__, where: t.user_id == ^user.id and t.context in ^contexts from t in __MODULE__, where: t.user_id == ^user.id and t.context in ^contexts
end end
end end

View File

@ -3,14 +3,14 @@ defmodule Cannery.ActivityLog do
The ActivityLog context. The ActivityLog context.
""" """
import Ecto.Query, warn: false use Cannery, :context
alias Cannery.Ammo.{Pack, Type} alias Cannery.{ActivityLog.ShotRecord, Ammo.Pack, Ammo.Type}
alias Cannery.{Accounts.User, ActivityLog.ShotRecord, Repo}
alias Ecto.{Multi, Queryable}
@type list_shot_records_option :: @type list_shot_records_option ::
{:search, String.t() | nil} {:search, String.t() | nil}
| {:class, Type.class() | :all | nil} | {:class, Type.class() | :all | nil}
| {:start_date, String.t() | nil}
| {:end_date, String.t() | nil}
| {:pack_id, Pack.id() | nil} | {:pack_id, Pack.id() | nil}
@type list_shot_records_options :: [list_shot_records_option()] @type list_shot_records_options :: [list_shot_records_option()]
@ -51,6 +51,8 @@ defmodule Cannery.ActivityLog do
|> list_shot_records_search(Keyword.get(opts, :search)) |> list_shot_records_search(Keyword.get(opts, :search))
|> list_shot_records_class(Keyword.get(opts, :class)) |> list_shot_records_class(Keyword.get(opts, :class))
|> list_shot_records_pack_id(Keyword.get(opts, :pack_id)) |> list_shot_records_pack_id(Keyword.get(opts, :pack_id))
|> list_shot_records_start_date(Keyword.get(opts, :start_date))
|> list_shot_records_end_date(Keyword.get(opts, :end_date))
|> Repo.all() |> Repo.all()
end end
@ -102,6 +104,20 @@ defmodule Cannery.ActivityLog do
defp list_shot_records_pack_id(query, _all), do: query defp list_shot_records_pack_id(query, _all), do: query
@spec list_shot_records_start_date(Queryable.t(), String.t() | nil) :: Queryable.t()
defp list_shot_records_start_date(query, start_date) when start_date |> is_binary() do
query |> where([sr: sr], sr.date >= ^Date.from_iso8601!(start_date))
end
defp list_shot_records_start_date(query, _all), do: query
@spec list_shot_records_end_date(Queryable.t(), String.t() | nil) :: Queryable.t()
defp list_shot_records_end_date(query, end_date) when end_date |> is_binary() do
query |> where([sr: sr], sr.date <= ^Date.from_iso8601!(end_date))
end
defp list_shot_records_end_date(query, _all), do: query
@doc """ @doc """
Returns a count of shot records. Returns a count of shot records.

View File

@ -3,11 +3,8 @@ defmodule Cannery.ActivityLog.ShotRecord do
A shot record records a group of ammo shot during a range trip A shot record records a group of ammo shot during a range trip
""" """
use Ecto.Schema use Cannery, :schema
import CanneryWeb.Gettext alias Cannery.{Ammo, Ammo.Pack}
import Ecto.Changeset
alias Cannery.{Accounts.User, Ammo, Ammo.Pack}
alias Ecto.{Changeset, UUID}
@derive {Jason.Encoder, @derive {Jason.Encoder,
only: [ only: [

View File

@ -3,13 +3,11 @@ defmodule Cannery.Ammo do
The Ammo context. The Ammo context.
""" """
import CanneryWeb.Gettext use Cannery, :context
import Ecto.Query, warn: false alias Cannery.Containers
alias Cannery.{Accounts.User, Containers, Repo}
alias Cannery.Containers.{Container, ContainerTag, Tag} alias Cannery.Containers.{Container, ContainerTag, Tag}
alias Cannery.{ActivityLog, ActivityLog.ShotRecord} alias Cannery.{ActivityLog, ActivityLog.ShotRecord}
alias Cannery.Ammo.{Pack, Type} alias Cannery.Ammo.{Pack, Type}
alias Ecto.{Changeset, Queryable}
@pack_create_limit 10_000 @pack_create_limit 10_000
@pack_preloads [:type] @pack_preloads [:type]
@ -549,7 +547,7 @@ defmodule Cannery.Ammo do
@spec list_packs_staged(Queryable.t(), staged :: boolean() | nil) :: Queryable.t() @spec list_packs_staged(Queryable.t(), staged :: boolean() | nil) :: Queryable.t()
defp list_packs_staged(query, staged) when staged |> is_boolean(), defp list_packs_staged(query, staged) when staged |> is_boolean(),
do: query |> where([p: p], p.staged == ^staged) do: query |> where([c: c], c.staged == ^staged)
defp list_packs_staged(query, _nil), do: query defp list_packs_staged(query, _nil), do: query
@ -959,11 +957,10 @@ defmodule Cannery.Ammo do
defp do_create_packs( defp do_create_packs(
%{"type_id" => type_id, "container_id" => container_id} = attrs, %{"type_id" => type_id, "container_id" => container_id} = attrs,
_multiplier, multiplier,
user user
) )
when is_binary(type_id) and is_binary(container_id) do when is_binary(type_id) and is_binary(container_id) do
changeset =
%Pack{} %Pack{}
|> Pack.create_changeset( |> Pack.create_changeset(
get_type!(type_id, user), get_type!(type_id, user),
@ -971,13 +968,68 @@ defmodule Cannery.Ammo do
user, user,
attrs attrs
) )
|> Changeset.add_error(:multiplier, dgettext("errors", "Invalid multiplier")) |> maybe_add_multiplier_error(multiplier)
|> Changeset.apply_action(:insert)
{:error, changeset}
end end
defp do_create_packs(invalid_attrs, _multiplier, user) do defp do_create_packs(
{:error, %Pack{} |> Pack.create_changeset(nil, nil, user, invalid_attrs)} %{"type_id" => type_id} = attrs,
multiplier,
user
)
when is_binary(type_id) do
%Pack{}
|> Pack.create_changeset(
get_type!(type_id, user),
nil,
user,
attrs
)
|> maybe_add_multiplier_error(multiplier)
|> Changeset.apply_action(:insert)
end
defp do_create_packs(
%{"container_id" => container_id} = attrs,
multiplier,
user
)
when is_binary(container_id) do
%Pack{}
|> Pack.create_changeset(
nil,
Containers.get_container!(container_id, user),
user,
attrs
)
|> maybe_add_multiplier_error(multiplier)
|> Changeset.apply_action(:insert)
end
defp do_create_packs(invalid_attrs, multiplier, user) do
%Pack{}
|> Pack.create_changeset(nil, nil, user, invalid_attrs)
|> maybe_add_multiplier_error(multiplier)
|> Changeset.apply_action(:insert)
end
defp maybe_add_multiplier_error(changeset, multiplier)
when multiplier >= 1 and
multiplier <= @pack_create_limit do
changeset
end
defp maybe_add_multiplier_error(changeset, multiplier) do
changeset
|> Changeset.add_error(
:multiplier,
dgettext(
"errors",
"Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}",
max: @pack_create_limit,
multiplier: multiplier
)
)
end end
@spec preload_pack(Pack.t()) :: Pack.t() @spec preload_pack(Pack.t()) :: Pack.t()

View File

@ -6,32 +6,24 @@ defmodule Cannery.Ammo.Pack do
amount paid for that ammunition, or what condition it is in amount paid for that ammunition, or what condition it is in
""" """
use Ecto.Schema use Cannery, :schema
import CanneryWeb.Gettext alias Cannery.{Ammo.Type, Containers, Containers.Container}
import Ecto.Changeset
alias Cannery.Ammo.Type
alias Cannery.{Accounts.User, Containers, Containers.Container}
alias Ecto.{Changeset, UUID}
@derive {Jason.Encoder, @derive {Jason.Encoder,
only: [ only: [
:id, :container_id,
:count, :count,
:id,
:lot_number,
:notes, :notes,
:price_paid, :price_paid,
:lot_number, :type_id
:staged,
:type_id,
:container_id
]} ]}
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
schema "packs" do schema "packs" do
field :count, :integer field :count, :integer
field :lot_number, :string
field :notes, :string field :notes, :string
field :price_paid, :float field :price_paid, :float
field :staged, :boolean, default: false
field :lot_number, :string
field :purchased_on, :date field :purchased_on, :date
belongs_to :type, Type belongs_to :type, Type
@ -42,12 +34,11 @@ defmodule Cannery.Ammo.Pack do
end end
@type t :: %__MODULE__{ @type t :: %__MODULE__{
id: id(),
count: integer, count: integer,
id: id(),
lot_number: String.t() | nil,
notes: String.t() | nil, notes: String.t() | nil,
price_paid: float() | nil, price_paid: float() | nil,
staged: boolean(),
lot_number: String.t() | nil,
purchased_on: Date.t(), purchased_on: Date.t(),
type: Type.t() | nil, type: Type.t() | nil,
type_id: Type.id(), type_id: Type.id(),
@ -70,34 +61,55 @@ defmodule Cannery.Ammo.Pack do
) :: changeset() ) :: changeset()
def create_changeset( def create_changeset(
pack, pack,
%Type{id: type_id}, type,
%Container{id: container_id, user_id: user_id}, container,
%User{id: user_id}, %User{id: user_id},
attrs attrs
) )
when is_binary(type_id) and is_binary(container_id) and is_binary(user_id) do when is_binary(user_id) do
pack type_id =
|> change(type_id: type_id) case type do
|> change(user_id: user_id) %Type{id: type_id} when is_binary(type_id) ->
|> change(container_id: container_id) type_id
|> cast(attrs, [:count, :price_paid, :notes, :staged, :purchased_on, :lot_number])
|> validate_number(:count, greater_than: 0) _invalid_type ->
|> validate_number(:price_paid, greater_than_or_equal_to: 0) nil
|> validate_length(:lot_number, max: 255) end
|> validate_required([:count, :staged, :purchased_on, :type_id, :container_id, :user_id])
container_id =
case container do
%Container{id: container_id, user_id: ^user_id} when is_binary(container_id) ->
container_id
_invalid_container ->
nil
end end
@doc """
Invalid changeset, used to prompt user to select type and container
"""
def create_changeset(pack, _invalid_type, _invalid_container, _invalid_user, attrs) do
pack pack
|> cast(attrs, [:type_id, :container_id]) |> change(type_id: type_id)
|> validate_required([:type_id, :container_id]) |> change(container_id: container_id)
|> change(user_id: user_id)
|> cast(attrs, [
:count,
:lot_number,
:notes,
:price_paid,
:purchased_on
])
|> validate_required(:type_id, message: dgettext("errors", "Please select a valid type"))
|> validate_required(:container_id,
message: dgettext("errors", "Please select a valid container")
)
|> validate_number(:count, greater_than: 0) |> validate_number(:count, greater_than: 0)
|> validate_number(:price_paid, greater_than_or_equal_to: 0) |> validate_number(:price_paid, greater_than_or_equal_to: 0)
|> validate_length(:lot_number, max: 255) |> validate_length(:lot_number, max: 255)
|> add_error(:invalid, dgettext("errors", "Please select a type and container")) |> validate_required([
:container_id,
:count,
:purchased_on,
:type_id,
:user_id
])
end end
@doc false @doc false
@ -105,19 +117,22 @@ defmodule Cannery.Ammo.Pack do
def update_changeset(pack, attrs, user) do def update_changeset(pack, attrs, user) do
pack pack
|> cast(attrs, [ |> cast(attrs, [
:container_id,
:count, :count,
:price_paid,
:notes,
:staged,
:purchased_on,
:lot_number, :lot_number,
:container_id :notes,
:price_paid,
:purchased_on
]) ])
|> validate_number(:count, greater_than_or_equal_to: 0) |> validate_number(:count, greater_than_or_equal_to: 0)
|> validate_number(:price_paid, greater_than_or_equal_to: 0) |> validate_number(:price_paid, greater_than_or_equal_to: 0)
|> validate_container_id(user) |> validate_container_id(user)
|> validate_length(:lot_number, max: 255) |> validate_length(:lot_number, max: 255)
|> validate_required([:count, :staged, :purchased_on, :container_id]) |> validate_required([
:container_id,
:count,
:purchased_on
])
end end
defp validate_container_id(changeset, user) do defp validate_container_id(changeset, user) do
@ -137,7 +152,7 @@ defmodule Cannery.Ammo.Pack do
@spec range_changeset(t() | new_pack(), attrs :: map()) :: changeset() @spec range_changeset(t() | new_pack(), attrs :: map()) :: changeset()
def range_changeset(pack, attrs) do def range_changeset(pack, attrs) do
pack pack
|> cast(attrs, [:count, :staged]) |> cast(attrs, [:count])
|> validate_required([:count, :staged]) |> validate_required([:count])
end end
end end

View File

@ -5,11 +5,8 @@ defmodule Cannery.Ammo.Type do
Contains statistical information about the ammunition. Contains statistical information about the ammunition.
""" """
use Ecto.Schema use Cannery, :schema
import Ecto.Changeset
alias Cannery.Accounts.User
alias Cannery.Ammo.Pack alias Cannery.Ammo.Pack
alias Ecto.{Changeset, UUID}
@derive {Jason.Encoder, @derive {Jason.Encoder,
only: [ only: [
@ -46,8 +43,6 @@ defmodule Cannery.Ammo.Type do
:shot_charge_weight, :shot_charge_weight,
:dram_equivalent :dram_equivalent
]} ]}
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
schema "types" do schema "types" do
field :name, :string field :name, :string
field :desc, :string field :desc, :string

View File

@ -3,15 +3,15 @@ defmodule Cannery.Containers do
The Containers context. The Containers context.
""" """
import CanneryWeb.Gettext use Cannery, :context
import Ecto.Query, warn: false alias Cannery.Ammo.Pack
alias Cannery.{Accounts.User, Ammo.Pack, Repo}
alias Cannery.Containers.{Container, ContainerTag, Tag} alias Cannery.Containers.{Container, ContainerTag, Tag}
alias Ecto.{Changeset, Queryable}
@container_preloads [:tags] @container_preloads [:tags]
@type list_containers_option :: {:search, String.t() | nil} @type list_containers_option ::
{:search, String.t() | nil}
| {:staged, boolean() | nil}
@type list_containers_options :: [list_containers_option()] @type list_containers_options :: [list_containers_option()]
@doc """ @doc """
@ -22,7 +22,10 @@ defmodule Cannery.Containers do
iex> list_containers(%User{id: 123}) iex> list_containers(%User{id: 123})
[%Container{}, ...] [%Container{}, ...]
iex> list_containers(%User{id: 123}, search: "cool") iex> list_containers(%User{id: 123},
...> search: "cool",
...> staged: true
...> )
[%Container{name: "my cool container"}, ...] [%Container{name: "my cool container"}, ...]
""" """
@ -39,9 +42,16 @@ defmodule Cannery.Containers do
preload: ^@container_preloads preload: ^@container_preloads
) )
|> list_containers_search(Keyword.get(opts, :search)) |> list_containers_search(Keyword.get(opts, :search))
|> list_containers_staged(Keyword.get(opts, :staged))
|> Repo.all() |> Repo.all()
end end
@spec list_containers_staged(Queryable.t(), staged :: boolean() | nil) :: Queryable.t()
defp list_containers_staged(query, staged) when staged |> is_boolean(),
do: query |> where([c: c], c.staged == ^staged)
defp list_containers_staged(query, _nil), do: query
@spec list_containers_search(Queryable.t(), search :: String.t() | nil) :: Queryable.t() @spec list_containers_search(Queryable.t(), search :: String.t() | nil) :: Queryable.t()
defp list_containers_search(query, search) when search in ["", nil], defp list_containers_search(query, search) when search in ["", nil],
do: query |> order_by([c: c], c.name) do: query |> order_by([c: c], c.name)

View File

@ -3,26 +3,24 @@ defmodule Cannery.Containers.Container do
A container that holds ammunition and belongs to a user. A container that holds ammunition and belongs to a user.
""" """
use Ecto.Schema use Cannery, :schema
import Ecto.Changeset alias Cannery.{Containers.ContainerTag, Containers.Tag}
alias Ecto.{Changeset, UUID}
alias Cannery.{Accounts.User, Containers.ContainerTag, Containers.Tag}
@derive {Jason.Encoder, @derive {Jason.Encoder,
only: [ only: [
:id,
:name,
:desc, :desc,
:id,
:location, :location,
:type, :name,
:tags :staged,
:tags,
:type
]} ]}
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
schema "containers" do schema "containers" do
field :name, :string
field :desc, :string field :desc, :string
field :location, :string field :location, :string
field :name, :string
field :staged, :boolean, default: false
field :type, :string field :type, :string
field :user_id, :binary_id field :user_id, :binary_id
@ -33,10 +31,11 @@ defmodule Cannery.Containers.Container do
end end
@type t :: %__MODULE__{ @type t :: %__MODULE__{
id: id(),
name: String.t(),
desc: String.t(), desc: String.t(),
id: id(),
location: String.t(), location: String.t(),
name: String.t(),
staged: boolean(),
type: String.t(), type: String.t(),
user_id: User.id(), user_id: User.id(),
tags: [Tag.t()] | nil, tags: [Tag.t()] | nil,
@ -52,19 +51,40 @@ defmodule Cannery.Containers.Container do
def create_changeset(container, %User{id: user_id}, attrs) do def create_changeset(container, %User{id: user_id}, attrs) do
container container
|> change(user_id: user_id) |> change(user_id: user_id)
|> cast(attrs, [:name, :desc, :type, :location]) |> cast(attrs, [
:desc,
:location,
:name,
:staged,
:type
])
|> validate_length(:name, max: 255) |> validate_length(:name, max: 255)
|> validate_length(:type, max: 255) |> validate_length(:type, max: 255)
|> validate_required([:name, :type, :user_id]) |> validate_required([
:name,
:staged,
:type,
:user_id
])
end end
@doc false @doc false
@spec update_changeset(t() | new_container(), attrs :: map()) :: changeset() @spec update_changeset(t() | new_container(), attrs :: map()) :: changeset()
def update_changeset(container, attrs) do def update_changeset(container, attrs) do
container container
|> cast(attrs, [:name, :desc, :type, :location]) |> cast(attrs, [
:desc,
:location,
:name,
:staged,
:type
])
|> validate_length(:name, max: 255) |> validate_length(:name, max: 255)
|> validate_length(:type, max: 255) |> validate_length(:type, max: 255)
|> validate_required([:name, :type]) |> validate_required([
:name,
:staged,
:type
])
end end
end end

View File

@ -4,13 +4,9 @@ defmodule Cannery.Containers.ContainerTag do
Cannery.Containers.Tag. Cannery.Containers.Tag.
""" """
use Ecto.Schema use Cannery, :schema
import Ecto.Changeset
alias Cannery.Containers.{Container, Tag} alias Cannery.Containers.{Container, Tag}
alias Ecto.{Changeset, UUID}
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
schema "container_tags" do schema "container_tags" do
belongs_to :container, Container belongs_to :container, Container
belongs_to :tag, Tag belongs_to :tag, Tag

View File

@ -4,10 +4,7 @@ defmodule Cannery.Containers.Tag do
text and bg colors. text and bg colors.
""" """
use Ecto.Schema use Cannery, :schema
import Ecto.Changeset
alias Cannery.Accounts.User
alias Ecto.{Changeset, UUID}
@derive {Jason.Encoder, @derive {Jason.Encoder,
only: [ only: [
@ -16,8 +13,6 @@ defmodule Cannery.Containers.Tag do
:bg_color, :bg_color,
:text_color :text_color
]} ]}
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
schema "tags" do schema "tags" do
field :name, :string field :name, :string
field :bg_color, :string field :bg_color, :string

View File

@ -7,8 +7,8 @@ defmodule Cannery.Email do
`lib/cannery_web/components/layouts/email_text.txt.eex` for text emails. `lib/cannery_web/components/layouts/email_text.txt.eex` for text emails.
""" """
use Gettext, backend: CanneryWeb.Gettext
import Swoosh.Email import Swoosh.Email
import CanneryWeb.Gettext
import Phoenix.Template import Phoenix.Template
alias Cannery.Accounts.User alias Cannery.Accounts.User
alias CanneryWeb.{EmailHTML, Layouts} alias CanneryWeb.{EmailHTML, Layouts}

View File

@ -14,7 +14,7 @@ defmodule Cannery.Logger do
|> Map.put(:stacktrace, Exception.format_stacktrace(stacktrace)) |> Map.put(:stacktrace, Exception.format_stacktrace(stacktrace))
|> pretty_encode() |> pretty_encode()
Logger.error("#{meta.reason}: #{data}") Logger.error("Oban exception: #{data}")
end end
def handle_event([:oban, :job, :start], measure, meta, _config) do def handle_event([:oban, :job, :start], measure, meta, _config) do

View File

@ -42,9 +42,10 @@ defmodule CanneryWeb do
formats: [:html, :json], formats: [:html, :json],
layouts: [html: CanneryWeb.Layouts] layouts: [html: CanneryWeb.Layouts]
use Gettext, backend: CanneryWeb.Gettext
# credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse # credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse
import Plug.Conn import Plug.Conn
import CanneryWeb.Gettext
unquote(verified_routes()) unquote(verified_routes())
end end
@ -84,8 +85,9 @@ defmodule CanneryWeb do
defp html_helpers do defp html_helpers do
quote do quote do
use PhoenixHTMLHelpers use PhoenixHTMLHelpers
use Gettext, backend: CanneryWeb.Gettext
import Phoenix.{Component, HTML, HTML.Form} import Phoenix.{Component, HTML, HTML.Form}
import CanneryWeb.{ErrorHelpers, Gettext, CoreComponents, HTMLHelpers} import CanneryWeb.{ErrorHelpers, CoreComponents, HTMLHelpers}
# Shortcut for generating JS commands # Shortcut for generating JS commands
alias Phoenix.LiveView.JS alias Phoenix.LiveView.JS

View File

@ -33,7 +33,9 @@ defmodule CanneryWeb.Components.AddShotRecordComponent do
) do ) do
params = shot_record_params |> process_params(pack) params = shot_record_params |> process_params(pack)
changeset = %ShotRecord{} |> ShotRecord.create_changeset(current_user, pack, params) changeset =
%ShotRecord{}
|> ShotRecord.create_changeset(current_user, pack, params)
changeset = changeset =
case changeset |> Changeset.apply_action(:validate) do case changeset |> Changeset.apply_action(:validate) do

View File

@ -13,7 +13,7 @@
phx-submit="save" phx-submit="save"
> >
<div <div
:if={@changeset.action && not @changeset.valid?()} :if={@changeset.action && not @changeset.valid?}
class="invalid-feedback col-span-3 text-center" class="invalid-feedback col-span-3 text-center"
> >
<%= changeset_errors(@changeset) %> <%= changeset_errors(@changeset) %>
@ -37,11 +37,12 @@
<%= label(f, :notes, gettext("Notes"), class: "title text-lg text-primary-600") %> <%= label(f, :notes, gettext("Notes"), class: "title text-lg text-primary-600") %>
<%= textarea(f, :notes, <%= textarea(f, :notes,
id: "add-shot-record-form-notes",
class: "input input-primary col-span-2", class: "input input-primary col-span-2",
id: "add-shot-record-form-notes",
maxlength: 255, maxlength: 255,
placeholder: gettext("Really great weather"), phx_debounce: 300,
phx_update: "ignore" phx_update: "ignore",
placeholder: gettext("Really great weather")
) %> ) %>
<%= error_tag(f, :notes, "col-span-3") %> <%= error_tag(f, :notes, "col-span-3") %>

View File

@ -4,6 +4,7 @@ defmodule CanneryWeb.Components.ContainerTableComponent do
""" """
use CanneryWeb, :live_component use CanneryWeb, :live_component
alias Cannery.{Accounts.User, Ammo, Containers.Container} alias Cannery.{Accounts.User, Ammo, Containers.Container}
alias CanneryWeb.Components.TableComponent
alias Ecto.UUID alias Ecto.UUID
alias Phoenix.LiveView.{Rendered, Socket} alias Phoenix.LiveView.{Rendered, Socket}
@ -13,6 +14,7 @@ defmodule CanneryWeb.Components.ContainerTableComponent do
required(:id) => UUID.t(), required(:id) => UUID.t(),
required(:current_user) => User.t(), required(:current_user) => User.t(),
optional(:containers) => [Container.t()], optional(:containers) => [Container.t()],
optional(:range) => Rendered.t(),
optional(:tag_actions) => Rendered.t(), optional(:tag_actions) => Rendered.t(),
optional(:actions) => Rendered.t(), optional(:actions) => Rendered.t(),
optional(any()) => any() optional(any()) => any()
@ -23,6 +25,7 @@ defmodule CanneryWeb.Components.ContainerTableComponent do
socket = socket =
socket socket
|> assign(assigns) |> assign(assigns)
|> assign_new(:range, fn -> [] end)
|> assign_new(:tag_actions, fn -> [] end) |> assign_new(:tag_actions, fn -> [] end)
|> assign_new(:actions, fn -> [] end) |> assign_new(:actions, fn -> [] end)
|> display_containers() |> display_containers()
@ -35,6 +38,7 @@ defmodule CanneryWeb.Components.ContainerTableComponent do
assigns: %{ assigns: %{
containers: containers, containers: containers,
current_user: current_user, current_user: current_user,
range: range,
tag_actions: tag_actions, tag_actions: tag_actions,
actions: actions actions: actions
} }
@ -62,13 +66,22 @@ defmodule CanneryWeb.Components.ContainerTableComponent do
end) end)
|> Enum.concat([ |> Enum.concat([
%{label: gettext("Packs"), key: :packs, type: :integer}, %{label: gettext("Packs"), key: :packs, type: :integer},
%{label: gettext("Rounds"), key: :rounds, type: :integer}, %{label: gettext("Rounds"), key: :rounds, type: :integer}
])
|> Enum.concat(
[
%{label: gettext("Tags"), key: :tags, type: :tags}, %{label: gettext("Tags"), key: :tags, type: :tags},
%{label: gettext("Actions"), key: :actions, sortable: false, type: :actions} %{label: gettext("Actions"), key: :actions, sortable: false, type: :actions}
]) ]
|> TableComponent.maybe_compose_columns(
%{label: gettext("Range"), key: :range},
range != []
)
)
extra_data = %{ extra_data = %{
current_user: current_user, current_user: current_user,
range: range,
tag_actions: tag_actions, tag_actions: tag_actions,
actions: actions, actions: actions,
pack_count: pack_count:
@ -136,6 +149,15 @@ defmodule CanneryWeb.Components.ContainerTableComponent do
round_count |> Map.get(container_id, 0) round_count |> Map.get(container_id, 0)
end end
defp get_value_for_key(:range, %{staged: staged} = container, %{range: range}) do
assigns = %{range: range, container: container}
{staged,
~H"""
<%= render_slot(@range, @container) %>
"""}
end
defp get_value_for_key(:tags, container, %{tag_actions: tag_actions}) do defp get_value_for_key(:tags, container, %{tag_actions: tag_actions}) do
assigns = %{tag_actions: tag_actions, container: container} assigns = %{tag_actions: tag_actions, container: container}

View File

@ -4,7 +4,8 @@ defmodule CanneryWeb.CoreComponents do
""" """
use Phoenix.Component use Phoenix.Component
use CanneryWeb, :verified_routes use CanneryWeb, :verified_routes
import CanneryWeb.{Gettext, HTMLHelpers} use Gettext, backend: CanneryWeb.Gettext
import CanneryWeb.HTMLHelpers
alias Cannery.{Accounts, Accounts.Invite, Accounts.User} alias Cannery.{Accounts, Accounts.Invite, Accounts.User}
alias Cannery.{Ammo, Ammo.Pack} alias Cannery.{Ammo, Ammo.Pack}
alias Cannery.{Containers.Container, Containers.Tag} alias Cannery.{Containers.Container, Containers.Tag}
@ -140,6 +141,18 @@ defmodule CanneryWeb.CoreComponents do
""" """
def datetime(assigns) def datetime(assigns)
attr :name, :string, required: true
attr :start_date, :string,
default: Date.utc_today() |> Date.shift(year: -1) |> Date.to_iso8601()
attr :end_date, :string, default: Date.utc_today() |> Date.to_iso8601()
@doc """
Phoenix.Component for an element that generates date fields for a range
"""
def date_range(assigns)
@spec cast_datetime(NaiveDateTime.t() | nil) :: String.t() @spec cast_datetime(NaiveDateTime.t() | nil) :: String.t()
defp cast_datetime(%NaiveDateTime{} = datetime) do defp cast_datetime(%NaiveDateTime{} = datetime) do
datetime |> DateTime.from_naive!("Etc/UTC") |> DateTime.to_iso8601(:extended) datetime |> DateTime.from_naive!("Etc/UTC") |> DateTime.to_iso8601(:extended)

View File

@ -0,0 +1,15 @@
<div class="flex items-center mx-4 my-2 space-x-1">
<input
class="w-36 text-center input input-primary"
name={"#{@name}_start"}
type="date"
value={@start_date}
/>
<span>—</span>
<input
class="w-36 text-center input input-primary"
name={"#{@name}_end"}
type="date"
value={@end_date}
/>
</div>

View File

@ -1,18 +1,45 @@
<main role="main" class="min-h-full min-w-full"> <main class="pb-8 min-w-full">
<header> <header>
<.topbar current_user={assigns[:current_user]} /> <.topbar current_user={assigns[:current_user]} />
<div class="mx-8 my-2 flex flex-col space-y-4 text-center"> <div class="mx-8 my-2 flex flex-col space-y-4 text-center">
<p :if={@flash["info"]} class="alert alert-info" role="alert"> <p
<%= @flash["info"] %> :if={@flash && @flash |> Map.has_key?("info")}
class="alert alert-info"
role="alert"
phx-click="lv:clear-flash"
phx-value-key="info"
>
<%= Phoenix.Flash.get(@flash, :info) %>
</p> </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"
>
<%= Phoenix.Flash.get(@flash, :error) %>
</p> </p>
</div> </div>
</header> </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 %> <%= @inner_content %>
</div> </div>
</main> </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

@ -201,13 +201,12 @@ defmodule CanneryWeb.Components.PackTableComponent do
"""} """}
end end
defp get_value_for_key(:range, %{staged: staged} = pack, %{range: range}) do defp get_value_for_key(:range, pack, %{range: range}) do
assigns = %{range: range, pack: pack} assigns = %{range: range, pack: pack}
{staged,
~H""" ~H"""
<%= render_slot(@range, @pack) %> <%= render_slot(@range, @pack) %>
"""} """
end end
defp get_value_for_key( defp get_value_for_key(

View File

@ -20,6 +20,7 @@ defmodule CanneryWeb.Components.TableComponent do
""" """
use CanneryWeb, :live_component use CanneryWeb, :live_component
alias Cannery.{ComparableDate, ComparableDateTime}
alias Phoenix.LiveView.Socket alias Phoenix.LiveView.Socket
require Integer require Integer
@ -110,7 +111,7 @@ defmodule CanneryWeb.Components.TableComponent do
end end
defp sort_by_custom_sort_value_or_value(rows, key, sort_mode, type) defp sort_by_custom_sort_value_or_value(rows, key, sort_mode, type)
when type in [Date, DateTime] do when type in [ComparableDate, ComparableDateTime, Date, DateTime] do
rows rows
|> Enum.sort_by( |> Enum.sort_by(
fn row -> fn row ->

View File

@ -1,5 +1,5 @@
defmodule CanneryWeb.ErrorJSON do defmodule CanneryWeb.ErrorJSON do
import CanneryWeb.Gettext use Gettext, backend: CanneryWeb.Gettext
def render(template, _assigns) do def render(template, _assigns) do
error_string = error_string =

View File

@ -4,9 +4,9 @@ defmodule CanneryWeb.UserAuth do
""" """
use CanneryWeb, :verified_routes use CanneryWeb, :verified_routes
use Gettext, backend: CanneryWeb.Gettext
import Plug.Conn import Plug.Conn
import Phoenix.Controller import Phoenix.Controller
import CanneryWeb.Gettext
alias Cannery.{Accounts, Accounts.User} alias Cannery.{Accounts, Accounts.User}
# Make the remember me cookie valid for 60 days. # Make the remember me cookie valid for 60 days.

View File

@ -1,7 +1,5 @@
defmodule CanneryWeb.UserConfirmationController do defmodule CanneryWeb.UserConfirmationController do
use CanneryWeb, :controller use CanneryWeb, :controller
import CanneryWeb.Gettext
alias Cannery.Accounts alias Cannery.Accounts
def new(conn, _params) do def new(conn, _params) do

View File

@ -1,6 +1,5 @@
defmodule CanneryWeb.UserRegistrationController do defmodule CanneryWeb.UserRegistrationController do
use CanneryWeb, :controller use CanneryWeb, :controller
import CanneryWeb.Gettext
alias Cannery.{Accounts, Accounts.Invites} alias Cannery.{Accounts, Accounts.Invites}
alias Ecto.Changeset alias Ecto.Changeset

View File

@ -9,7 +9,7 @@
action={~p"/users/register"} action={~p"/users/register"}
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
> >
<p :if={@changeset.action && not @changeset.valid?()} class="alert alert-danger col-span-3"> <p :if={@changeset.action && not @changeset.valid?} class="alert alert-danger col-span-3">
<%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %> <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %>
</p> </p>
@ -29,7 +29,12 @@
<%= select( <%= select(
f, f,
:locale, :locale,
[{gettext("English"), "en_US"}], [
{"English", "en_US"},
{"Deutsch", "de"},
{"Français", "fr"},
{"Español", "es"}
],
class: "input input-primary col-span-2" class: "input input-primary col-span-2"
) %> ) %>
<%= error_tag(f, :locale) %> <%= error_tag(f, :locale) %>

View File

@ -40,7 +40,7 @@ defmodule CanneryWeb.UserResetPasswordController do
# leaked token giving the user access to the account. # leaked token giving the user access to the account.
def update(conn, %{"user" => user_params}) do def update(conn, %{"user" => user_params}) do
case Accounts.reset_user_password(conn.assigns.user, user_params) do case Accounts.reset_user_password(conn.assigns.user, user_params) do
{:ok, _} -> {:ok, _socket} ->
conn conn
|> put_flash(:info, dgettext("prompts", "Password reset successfully.")) |> put_flash(:info, dgettext("prompts", "Password reset successfully."))
|> redirect(to: ~p"/users/log_in") |> redirect(to: ~p"/users/log_in")

View File

@ -9,7 +9,7 @@
action={~p"/users/reset_password/#{@token}"} action={~p"/users/reset_password/#{@token}"}
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
> >
<p :if={@changeset.action && not @changeset.valid?()} class="alert alert-danger col-span-3"> <p :if={@changeset.action && not @changeset.valid?} class="alert alert-danger col-span-3">
<%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %> <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %>
</p> </p>

View File

@ -15,10 +15,18 @@
</p> </p>
<%= label(f, :email, gettext("Email"), class: "title text-lg text-primary-600") %> <%= 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") %> <%= 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"), <%= label(f, :remember_me, gettext("Keep me logged in for 60 days"),
class: "title text-lg text-primary-600" class: "title text-lg text-primary-600"

View File

@ -1,6 +1,5 @@
defmodule CanneryWeb.UserSettingsController do defmodule CanneryWeb.UserSettingsController do
use CanneryWeb, :controller use CanneryWeb, :controller
import CanneryWeb.Gettext
alias Cannery.Accounts alias Cannery.Accounts
alias CanneryWeb.UserAuth alias CanneryWeb.UserAuth

View File

@ -16,7 +16,7 @@
</h3> </h3>
<div <div
:if={@email_changeset.action && not @email_changeset.valid?()} :if={@email_changeset.action && not @email_changeset.valid?}
class="alert alert-danger col-span-3" class="alert alert-danger col-span-3"
> >
<%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %> <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %>
@ -58,7 +58,7 @@
</h3> </h3>
<div <div
:if={@password_changeset.action && not @password_changeset.valid?()} :if={@password_changeset.action && not @password_changeset.valid?}
class="alert alert-danger col-span-3" class="alert alert-danger col-span-3"
> >
<%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %> <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %>
@ -112,7 +112,7 @@
) %> ) %>
<div <div
:if={@locale_changeset.action && not @locale_changeset.valid?()} :if={@locale_changeset.action && not @locale_changeset.valid?}
class="alert alert-danger col-span-3" class="alert alert-danger col-span-3"
> >
<%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %> <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %>
@ -124,12 +124,12 @@
f, f,
:locale, :locale,
[ [
{gettext("English"), "en_US"}, {"English", "en_US"},
{gettext("German"), "de"}, {"Deutsch", "de"},
{gettext("French"), "fr"}, {"Français", "fr"},
{gettext("Spanish"), "es"} {"Español", "es"}
], ],
class: "mx-2 my-1 min-w-md input input-primary col-span-3" class: "my-1 min-w-md input input-primary col-span-3"
) %> ) %>
<%= error_tag(f, :locale, "col-span-3") %> <%= error_tag(f, :locale, "col-span-3") %>

View File

@ -4,8 +4,7 @@ defmodule CanneryWeb.ErrorHelpers do
""" """
use PhoenixHTMLHelpers use PhoenixHTMLHelpers
import Phoenix.HTML.Form import Phoenix.{Component, HTML.Form}
import Phoenix.Component
alias Ecto.Changeset alias Ecto.Changeset
alias Phoenix.{HTML.Form, LiveView.Rendered} alias Phoenix.{HTML.Form, LiveView.Rendered}

View File

@ -5,7 +5,7 @@ defmodule CanneryWeb.Gettext do
By using [Gettext](https://hexdocs.pm/gettext), By using [Gettext](https://hexdocs.pm/gettext),
your module gains a set of macros for translations, for example: your module gains a set of macros for translations, for example:
import CanneryWeb.Gettext use Gettext, backend: CanneryWeb.Gettext
# Simple translation # Simple translation
gettext("Here is the string to translate") gettext("Here is the string to translate")
@ -20,5 +20,5 @@ defmodule CanneryWeb.Gettext do
See the [Gettext Docs](https://hexdocs.pm/gettext) for detailed usage. See the [Gettext Docs](https://hexdocs.pm/gettext) for detailed usage.
""" """
use Gettext, otp_app: :cannery use Gettext.Backend, otp_app: :cannery
end end

View File

@ -44,7 +44,9 @@
phx-submit="save" phx-submit="save"
> >
<%= select(f, :tag_id, tag_options(@tags, @container), <%= select(f, :tag_id, tag_options(@tags, @container),
class: "text-center col-span-2 input input-primary" class: "text-center col-span-2 input input-primary",
id: "#{@id}-tag-select",
phx_hook: "SlimSelect"
) %> ) %>
<%= error_tag(f, :tag_id, "col-span-3 text-center") %> <%= error_tag(f, :tag_id, "col-span-3 text-center") %>

View File

@ -19,7 +19,7 @@ defmodule CanneryWeb.ContainerLive.FormComponent do
@impl true @impl true
def handle_event("validate", %{"container" => container_params}, socket) do def handle_event("validate", %{"container" => container_params}, socket) do
{:noreply, socket |> assign_changeset(container_params)} {:noreply, socket |> assign_changeset(container_params, :validate)}
end end
def handle_event( def handle_event(
@ -32,14 +32,9 @@ defmodule CanneryWeb.ContainerLive.FormComponent do
defp assign_changeset( defp assign_changeset(
%{assigns: %{action: action, container: container, current_user: user}} = socket, %{assigns: %{action: action, container: container, current_user: user}} = socket,
container_params container_params,
changeset_action \\ nil
) do ) do
changeset_action =
case action do
create when create in [:new, :clone] -> :insert
:edit -> :update
end
changeset = changeset =
case action do case action do
create when create in [:new, :clone] -> create when create in [:new, :clone] ->
@ -50,10 +45,14 @@ defmodule CanneryWeb.ContainerLive.FormComponent do
end end
changeset = changeset =
if changeset_action do
case changeset |> Changeset.apply_action(changeset_action) do case changeset |> Changeset.apply_action(changeset_action) do
{:ok, _data} -> changeset {:ok, _data} -> changeset
{:error, changeset} -> changeset {:error, changeset} -> changeset
end end
else
changeset
end
socket |> assign(:changeset, changeset) socket |> assign(:changeset, changeset)
end end

View File

@ -12,7 +12,7 @@
phx-submit="save" phx-submit="save"
> >
<div <div
:if={@changeset.action && not @changeset.valid?()} :if={@changeset.action && not @changeset.valid?}
class="invalid-feedback col-span-3 text-center" class="invalid-feedback col-span-3 text-center"
> >
<%= changeset_errors(@changeset) %> <%= changeset_errors(@changeset) %>
@ -21,34 +21,38 @@
<%= label(f, :name, gettext("Name"), class: "title text-lg text-primary-600") %> <%= label(f, :name, gettext("Name"), class: "title text-lg text-primary-600") %>
<%= text_input(f, :name, <%= text_input(f, :name,
class: "input input-primary col-span-2", class: "input input-primary col-span-2",
placeholder: gettext("My cool ammo can"), maxlength: 255,
maxlength: 255 phx_debounce: 300,
placeholder: gettext("My cool ammo can")
) %> ) %>
<%= error_tag(f, :name, "col-span-3 text-center") %> <%= error_tag(f, :name, "col-span-3 text-center") %>
<%= label(f, :desc, gettext("Description"), class: "title text-lg text-primary-600") %> <%= label(f, :desc, gettext("Description"), class: "title text-lg text-primary-600") %>
<%= textarea(f, :desc, <%= textarea(f, :desc,
id: "container-form-desc",
class: "input input-primary col-span-2", class: "input input-primary col-span-2",
placeholder: gettext("Metal ammo can with the anime girl sticker"), id: "container-form-desc",
phx_update: "ignore" phx_debounce: 300,
phx_update: "ignore",
placeholder: gettext("Metal ammo can with the anime girl sticker")
) %> ) %>
<%= error_tag(f, :desc, "col-span-3 text-center") %> <%= error_tag(f, :desc, "col-span-3 text-center") %>
<%= label(f, :type, gettext("Type"), class: "title text-lg text-primary-600") %> <%= label(f, :type, gettext("Type"), class: "title text-lg text-primary-600") %>
<%= text_input(f, :type, <%= text_input(f, :type,
class: "input input-primary col-span-2", class: "input input-primary col-span-2",
placeholder: gettext("Magazine, Clip, Ammo Box, etc"), maxlength: 255,
maxlength: 255 phx_debounce: 300,
placeholder: gettext("Magazine, Clip, Ammo Box, etc")
) %> ) %>
<%= error_tag(f, :type, "col-span-3 text-center") %> <%= error_tag(f, :type, "col-span-3 text-center") %>
<%= label(f, :location, gettext("Location"), class: "title text-lg text-primary-600") %> <%= label(f, :location, gettext("Location"), class: "title text-lg text-primary-600") %>
<%= textarea(f, :location, <%= textarea(f, :location,
id: "container-form-location",
class: "input input-primary col-span-2", class: "input input-primary col-span-2",
placeholder: gettext("On the bookshelf"), id: "container-form-location",
phx_update: "ignore" phx_debounce: 300,
phx_update: "ignore",
placeholder: gettext("On the bookshelf")
) %> ) %>
<%= error_tag(f, :location, "col-span-3 text-center") %> <%= error_tag(f, :location, "col-span-3 text-center") %>

View File

@ -112,6 +112,20 @@ defmodule CanneryWeb.ContainerLive.Index do
{:noreply, socket |> push_patch(to: ~p"/containers/search/#{search_term}")} {:noreply, socket |> push_patch(to: ~p"/containers/search/#{search_term}")}
end end
def handle_event(
"toggle_staged",
%{"container_id" => id},
%{assigns: %{current_user: current_user}} = socket
) do
container = Containers.get_container!(id, current_user)
{:ok, _container} =
container
|> Containers.update_container(current_user, %{"staged" => !container.staged})
{:noreply, socket |> display_containers()}
end
defp display_containers(%{assigns: %{search: search, current_user: current_user}} = socket) do defp display_containers(%{assigns: %{search: search, current_user: current_user}} = socket) do
socket |> assign(:containers, Containers.list_containers(current_user, search: search)) socket |> assign(:containers, Containers.list_containers(current_user, search: search))
end end

View File

@ -1,10 +1,10 @@
<div class="flex flex-col space-y-8 justify-center items-center"> <div class="flex flex-col justify-center items-center space-y-8">
<h1 class="title text-2xl title-primary-500"> <h1 class="text-2xl title title-primary-500">
<%= gettext("Containers") %> <%= gettext("Containers") %>
</h1> </h1>
<%= if @containers |> Enum.empty?() and @search |> is_nil() do %> <%= if @containers |> Enum.empty?() and @search |> is_nil() do %>
<h2 class="title text-xl text-primary-600"> <h2 class="text-xl title text-primary-600">
<%= gettext("No containers") %> <%= gettext("No containers") %>
<%= display_emoji("😔") %> <%= display_emoji("😔") %>
</h2> </h2>
@ -17,33 +17,33 @@
<%= dgettext("actions", "New Container") %> <%= dgettext("actions", "New Container") %>
</.link> </.link>
<div class="w-full flex flex-col sm:flex-row justify-center items-center space-y-4 sm:space-y-0 sm:space-x-4 max-w-2xl"> <div class="flex flex-col justify-center items-center space-y-4 w-full max-w-2xl sm:flex-row sm:space-y-0 sm:space-x-4">
<.form <.form
:let={f} :let={f}
for={%{}} for={%{}}
as={:search} as={:search}
phx-change="search" phx-change="search"
phx-submit="search" phx-submit="search"
class="grow flex items-center" class="flex items-center grow"
> >
<%= text_input(f, :search_term, <%= text_input(f, :search_term,
class: "grow input input-primary", class: "grow input input-primary",
value: @search,
role: "search",
phx_debounce: 300, phx_debounce: 300,
placeholder: gettext("Search containers") placeholder: gettext("Search containers"),
role: "search",
value: @search
) %> ) %>
</.form> </.form>
<.toggle_button action="toggle_table" value={@view_table}> <.toggle_button action="toggle_table" value={@view_table}>
<span class="title text-lg text-primary-600"> <span class="text-lg title text-primary-600">
<%= gettext("View as table") %> <%= gettext("View as table") %>
</span> </span>
</.toggle_button> </.toggle_button>
</div> </div>
<%= if @containers |> Enum.empty?() do %> <%= if @containers |> Enum.empty?() do %>
<h2 class="title text-xl text-primary-600"> <h2 class="text-xl title text-primary-600">
<%= gettext("No containers") %> <%= gettext("No containers") %>
<%= display_emoji("😔") %> <%= display_emoji("😔") %>
</h2> </h2>
@ -56,6 +56,20 @@
containers={@containers} containers={@containers}
current_user={@current_user} current_user={@current_user}
> >
<:range :let={container}>
<div class="flex justify-center items-center px-4 py-2 h-full min-w-20 flex-wrap">
<button
type="button"
class="mx-2 my-1 text-sm btn btn-primary"
phx-click="toggle_staged"
phx-value-container_id={container.id}
>
<%= if container.staged,
do: dgettext("actions", "Unstage"),
else: dgettext("actions", "Stage") %>
</button>
</div>
</:range>
<:tag_actions :let={container}> <:tag_actions :let={container}>
<div class="mx-4 my-2"> <div class="mx-4 my-2">
<.link <.link
@ -109,7 +123,7 @@
</:actions> </:actions>
</.live_component> </.live_component>
<% else %> <% else %>
<div class="w-full flex flex-row flex-wrap justify-center items-stretch"> <div class="flex flex-row flex-wrap justify-center items-stretch w-full">
<.container_card <.container_card
:for={container <- @containers} :for={container <- @containers}
container={container} container={container}

View File

@ -78,6 +78,18 @@ defmodule CanneryWeb.ContainerLive.Show do
{:noreply, socket} {:noreply, socket}
end end
def handle_event(
"toggle_staged",
_params,
%{assigns: %{container: container, current_user: current_user}} = socket
) do
{:ok, _container} =
container
|> Containers.update_container(current_user, %{"staged" => !container.staged})
{:noreply, socket |> render_container()}
end
def handle_event("toggle_table", _params, %{assigns: %{view_table: view_table}} = socket) do def handle_event("toggle_table", _params, %{assigns: %{view_table: view_table}} = socket) do
{:noreply, socket |> assign(:view_table, !view_table) |> render_container()} {:noreply, socket |> assign(:view_table, !view_table) |> render_container()}
end end

View File

@ -1,34 +1,34 @@
<div class="space-y-4 flex flex-col justify-center items-center"> <div class="flex flex-col justify-center items-center space-y-4">
<h1 class="title text-2xl title-primary-500"> <h1 class="text-2xl title title-primary-500">
<%= @container.name %> <%= @container.name %>
</h1> </h1>
<span :if={@container.desc} class="rounded-lg title text-lg"> <span :if={@container.desc} class="text-lg rounded-lg title">
<%= gettext("Description:") %> <%= gettext("Description:") %>
<%= @container.desc %> <%= @container.desc %>
</span> </span>
<span class="rounded-lg title text-lg"> <span class="text-lg rounded-lg title">
<%= gettext("Type:") %> <%= gettext("Type:") %>
<%= @container.type %> <%= @container.type %>
</span> </span>
<span :if={@container.location} class="rounded-lg title text-lg"> <span :if={@container.location} class="text-lg rounded-lg title">
<%= gettext("Location:") %> <%= gettext("Location:") %>
<%= @container.location %> <%= @container.location %>
</span> </span>
<span class="rounded-lg title text-lg"> <span class="text-lg rounded-lg title">
<%= gettext("Packs:") %> <%= gettext("Packs:") %>
<%= @packs_count %> <%= @packs_count %>
</span> </span>
<span class="rounded-lg title text-lg"> <span class="text-lg rounded-lg title">
<%= gettext("Rounds:") %> <%= gettext("Rounds:") %>
<%= @round_count %> <%= @round_count %>
</span> </span>
<div class="flex space-x-4 justify-center items-center text-primary-600"> <div class="flex justify-center items-center space-x-4 text-primary-600">
<.link <.link
patch={~p"/container/edit/#{@container}"} patch={~p"/container/edit/#{@container}"}
class="text-primary-600 link" class="text-primary-600 link"
@ -52,11 +52,19 @@
</.link> </.link>
</div> </div>
<div class="flex flex-wrap justify-center items-center text-primary-600">
<button type="button" class="mx-4 my-2 btn btn-primary" phx-click="toggle_staged">
<%= if @container.staged,
do: dgettext("actions", "Unstage from range"),
else: dgettext("actions", "Stage for range") %>
</button>
</div>
<hr class="mb-4 hr" /> <hr class="mb-4 hr" />
<%= if @container.tags |> Enum.empty?() do %> <%= if @container.tags |> Enum.empty?() do %>
<div class="flex flex-row justify-center items-center space-x-4"> <div class="flex flex-row justify-center items-center space-x-4">
<h2 class="title text-lg text-primary-600"> <h2 class="text-lg title text-primary-600">
<%= gettext("No tags for this container") %> <%= gettext("No tags for this container") %>
<%= display_emoji("😔") %> <%= display_emoji("😔") %>
</h2> </h2>
@ -105,15 +113,15 @@
</.form> </.form>
<.toggle_button action="toggle_table" value={@view_table}> <.toggle_button action="toggle_table" value={@view_table}>
<span class="title text-lg text-primary-600"> <span class="text-lg title text-primary-600">
<%= gettext("View as table") %> <%= gettext("View as table") %>
</span> </span>
</.toggle_button> </.toggle_button>
</div> </div>
<div class="w-full p-4"> <div class="p-4 w-full">
<%= if @packs |> Enum.empty?() do %> <%= if @packs |> Enum.empty?() do %>
<h2 class="mx-4 title text-lg text-primary-600 text-center"> <h2 class="mx-4 text-lg text-center title text-primary-600">
<%= gettext("No ammo in this container") %> <%= gettext("No ammo in this container") %>
</h2> </h2>
<% else %> <% else %>
@ -131,7 +139,7 @@
</.link> </.link>
</:type> </:type>
<:actions :let={%{count: pack_count} = pack}> <:actions :let={%{count: pack_count} = pack}>
<div class="py-2 px-4 h-full space-x-4 flex justify-center items-center"> <div class="flex justify-center items-center px-4 py-2 space-x-4 h-full">
<.link <.link
navigate={~p"/ammo/show/#{pack}"} navigate={~p"/ammo/show/#{pack}"}
class="text-primary-600 link" class="text-primary-600 link"

View File

@ -19,7 +19,7 @@ defmodule CanneryWeb.InviteLive.FormComponent do
@impl true @impl true
def handle_event("validate", %{"invite" => invite_params}, socket) do def handle_event("validate", %{"invite" => invite_params}, socket) do
{:noreply, socket |> assign_changeset(invite_params)} {:noreply, socket |> assign_changeset(invite_params, :validate)}
end end
def handle_event("save", %{"invite" => invite_params}, %{assigns: %{action: action}} = socket) do def handle_event("save", %{"invite" => invite_params}, %{assigns: %{action: action}} = socket) do
@ -28,14 +28,9 @@ defmodule CanneryWeb.InviteLive.FormComponent do
defp assign_changeset( defp assign_changeset(
%{assigns: %{action: action, current_user: user, invite: invite}} = socket, %{assigns: %{action: action, current_user: user, invite: invite}} = socket,
invite_params invite_params,
changeset_action \\ nil
) do ) do
changeset_action =
case action do
:new -> :insert
:edit -> :update
end
changeset = changeset =
case action do case action do
:new -> Invite.create_changeset(user, "example_token", invite_params) :new -> Invite.create_changeset(user, "example_token", invite_params)
@ -43,10 +38,14 @@ defmodule CanneryWeb.InviteLive.FormComponent do
end end
changeset = changeset =
if changeset_action do
case changeset |> Changeset.apply_action(changeset_action) do case changeset |> Changeset.apply_action(changeset_action) do
{:ok, _data} -> changeset {:ok, _data} -> changeset
{:error, changeset} -> changeset {:error, changeset} -> changeset
end end
else
changeset
end
socket |> assign(:changeset, changeset) socket |> assign(:changeset, changeset)
end end

View File

@ -12,7 +12,7 @@
phx-submit="save" phx-submit="save"
> >
<div <div
:if={@changeset.action && not @changeset.valid?()} :if={@changeset.action && not @changeset.valid?}
class="invalid-feedback col-span-3 text-center" class="invalid-feedback col-span-3 text-center"
> >
<%= changeset_errors(@changeset) %> <%= changeset_errors(@changeset) %>
@ -22,7 +22,10 @@
class: "title text-lg text-primary-600", class: "title text-lg text-primary-600",
maxlength: 255 maxlength: 255
) %> ) %>
<%= text_input(f, :name, class: "input input-primary col-span-2") %> <%= text_input(f, :name,
class: "input input-primary col-span-2",
phx_debounce: 300
) %>
<%= error_tag(f, :name, "col-span-3") %> <%= error_tag(f, :name, "col-span-3") %>
<%= label(f, :uses_left, gettext("Uses left"), class: "title text-lg text-primary-600") %> <%= label(f, :uses_left, gettext("Uses left"), class: "title text-lg text-primary-600") %>

View File

@ -116,6 +116,20 @@ defmodule CanneryWeb.InviteLive.Index do
{:noreply, socket |> put_flash(:info, dgettext("prompts", "Copied to clipboard"))} {:noreply, socket |> put_flash(:info, dgettext("prompts", "Copied to clipboard"))}
end end
def handle_event("resend_email_verification", %{"id" => id}, socket) do
%{email: user_email} = user = Accounts.get_user!(id)
Accounts.deliver_user_confirmation_instructions(
user,
fn token -> url(CanneryWeb.Endpoint, ~p"/users/confirm/#{token}") end
)
prompt =
dgettext("prompts", "Email resent to %{user_email} succesfully", user_email: user_email)
{:noreply, socket |> put_flash(:info, prompt) |> display_invites()}
end
def handle_event( def handle_event(
"delete_user", "delete_user",
%{"id" => id}, %{"id" => id},

View File

@ -1,10 +1,10 @@
<div class="mx-auto flex flex-col justify-center items-center space-y-4 max-w-3xl"> <div class="flex flex-col justify-center items-center mx-auto space-y-4 max-w-3xl">
<h1 class="title text-2xl title-primary-500"> <h1 class="text-2xl title title-primary-500">
<%= gettext("Invites") %> <%= gettext("Invites") %>
</h1> </h1>
<%= if @invites |> Enum.empty?() do %> <%= if @invites |> Enum.empty?() do %>
<h1 class="title text-xl text-primary-600"> <h1 class="text-xl title text-primary-600">
<%= gettext("No invites") %> <%= gettext("No invites") %>
<%= display_emoji("😔") %> <%= display_emoji("😔") %>
</h1> </h1>
@ -95,7 +95,7 @@
<%= unless @admins |> Enum.empty?() do %> <%= unless @admins |> Enum.empty?() do %>
<hr class="hr" /> <hr class="hr" />
<h1 class="title text-2xl text-primary-600"> <h1 class="text-2xl title text-primary-600">
<%= gettext("Admins") %> <%= gettext("Admins") %>
</h1> </h1>
@ -123,17 +123,24 @@
<%= unless @users |> Enum.empty?() do %> <%= unless @users |> Enum.empty?() do %>
<hr class="hr" /> <hr class="hr" />
<h1 class="title text-2xl text-primary-600"> <h1 class="text-2xl title text-primary-600">
<%= gettext("Users") %> <%= gettext("Users") %>
</h1> </h1>
<div class="flex flex-col justify-center items-stretch space-y-4"> <div class="flex flex-col justify-center items-stretch space-y-4">
<.user_card :for={user <- @users} user={user}> <.user_card :for={user <- @users} user={user}>
<div class="flex justify-center items-center space-x-2">
<.link <.link
href="#" :if={!user.confirmed_at}
class="text-primary-600 link" class="text-primary-600 link"
phx-click="delete_user" href="#"
phx-click="resend_email_verification"
phx-value-id={user.id} phx-value-id={user.id}
>
<i class="fa-fw fa-lg fas fa-paper-plane"></i>
</.link>
<.link
class="text-primary-600 link"
data-confirm={ data-confirm={
dgettext( dgettext(
"prompts", "prompts",
@ -141,9 +148,13 @@
email: user.email email: user.email
) )
} }
href="#"
phx-click="delete_user"
phx-value-id={user.id}
> >
<i class="fa-fw fa-lg fas fa-trash"></i> <i class="fa-fw fa-lg fas fa-trash"></i>
</.link> </.link>
</div>
</.user_card> </.user_card>
</div> </div>
<% end %> <% end %>

View File

@ -9,7 +9,11 @@ defmodule CanneryWeb.PackLive.FormComponent do
alias Ecto.Changeset alias Ecto.Changeset
alias Phoenix.LiveView.Socket alias Phoenix.LiveView.Socket
@pack_create_limit 10_000 @impl true
@spec mount(Socket.t()) :: {:ok, Socket.t()}
def mount(socket) do
{:ok, socket |> assign(:class, :all)}
end
@impl true @impl true
@spec update( @spec update(
@ -22,29 +26,30 @@ defmodule CanneryWeb.PackLive.FormComponent do
@spec update(Socket.t()) :: {:ok, Socket.t()} @spec update(Socket.t()) :: {:ok, Socket.t()}
def update(%{assigns: %{current_user: current_user}} = socket) do def update(%{assigns: %{current_user: current_user}} = socket) do
%{assigns: %{types: types, containers: containers}} =
socket = socket =
socket socket
|> assign(:pack_create_limit, @pack_create_limit)
|> assign(:types, Ammo.list_types(current_user)) |> assign(:types, Ammo.list_types(current_user))
|> assign_new(:containers, fn -> Containers.list_containers(current_user) end) |> assign_new(:containers, fn -> Containers.list_containers(current_user) end)
params = {:ok, socket |> assign_changeset(%{})}
if types |> List.first() |> is_nil(),
do: %{},
else: %{} |> Map.put("type_id", types |> List.first() |> Map.get(:id))
params =
if containers |> List.first() |> is_nil(),
do: params,
else: params |> Map.put("container_id", containers |> List.first() |> Map.get(:id))
{:ok, socket |> assign_changeset(params)}
end end
@impl true @impl true
def handle_event("validate", %{"pack" => pack_params}, socket) do def handle_event("validate", %{"pack" => pack_params}, socket) do
{:noreply, socket |> assign_changeset(pack_params, :validate)} matched_class =
case pack_params["class"] do
"rifle" -> :rifle
"shotgun" -> :shotgun
"pistol" -> :pistol
_other -> :all
end
socket =
socket
|> assign_changeset(pack_params, :validate)
|> assign(:class, matched_class)
{:noreply, socket}
end end
def handle_event( def handle_event(
@ -62,11 +67,18 @@ defmodule CanneryWeb.PackLive.FormComponent do
containers |> Enum.map(fn %{id: id, name: name} -> {name, id} end) containers |> Enum.map(fn %{id: id, name: name} -> {name, id} end)
end end
@spec type_options([Type.t()]) :: [{String.t(), Type.id()}] @spec type_options([Type.t()], Type.class() | :all) ::
defp type_options(types) do [{String.t(), Type.id()}]
defp type_options(types, :all) do
types |> Enum.map(fn %{id: id, name: name} -> {name, id} end) types |> Enum.map(fn %{id: id, name: name} -> {name, id} end)
end end
defp type_options(types, selected_class) do
types
|> Enum.filter(fn %{class: class} -> class == selected_class end)
|> Enum.map(fn %{id: id, name: name} -> {name, id} end)
end
# Save Helpers # Save Helpers
defp assign_changeset( defp assign_changeset(
@ -92,10 +104,14 @@ defmodule CanneryWeb.PackLive.FormComponent do
end end
changeset = changeset =
case changeset |> Changeset.apply_action(changeset_action || default_action) do if changeset_action do
case changeset |> Changeset.apply_action(changeset_action) do
{:ok, _data} -> changeset {:ok, _data} -> changeset
{:error, changeset} -> changeset {:error, changeset} -> changeset
end end
else
changeset
end
socket |> assign(:changeset, changeset) socket |> assign(:changeset, changeset)
end end
@ -133,53 +149,15 @@ defmodule CanneryWeb.PackLive.FormComponent do
end end
defp save_pack( defp save_pack(
%{assigns: %{changeset: changeset}} = socket, %{assigns: %{changeset: changeset, current_user: current_user, return_to: return_to}} =
socket,
action, action,
%{"multiplier" => multiplier_str} = pack_params %{"multiplier" => multiplier_str} = pack_params
) )
when action in [:new, :clone] do when action in [:new, :clone] do
socket = socket =
case multiplier_str |> Integer.parse() do with {multiplier, _remainder} <- multiplier_str |> Integer.parse(),
{multiplier, _remainder} {:ok, {count, _packs}} <- Ammo.create_packs(pack_params, multiplier, current_user) do
when multiplier >= 1 and multiplier <= @pack_create_limit ->
socket |> create_multiple(pack_params, multiplier)
{multiplier, _remainder} ->
error_msg =
dgettext(
"errors",
"Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}",
max: @pack_create_limit,
multiplier: multiplier
)
save_multiplier_error(socket, changeset, error_msg)
:error ->
error_msg = dgettext("errors", "Could not parse number of copies")
save_multiplier_error(socket, changeset, error_msg)
end
{:noreply, socket}
end
@spec save_multiplier_error(Socket.t(), Changeset.t(), String.t()) :: Socket.t()
defp save_multiplier_error(socket, changeset, error_msg) do
{:error, changeset} =
changeset
|> Changeset.add_error(:multiplier, error_msg)
|> Changeset.apply_action(:insert)
socket |> assign(:changeset, changeset)
end
defp create_multiple(
%{assigns: %{current_user: current_user, return_to: return_to}} = socket,
pack_params,
multiplier
) do
case Ammo.create_packs(pack_params, multiplier, current_user) do
{:ok, {count, _packs}} ->
prompt = prompt =
dngettext( dngettext(
"prompts", "prompts",
@ -189,9 +167,21 @@ defmodule CanneryWeb.PackLive.FormComponent do
) )
socket |> put_flash(:info, prompt) |> push_navigate(to: return_to) socket |> put_flash(:info, prompt) |> push_navigate(to: return_to)
else
{:error, %Changeset{} = changeset} -> {:error, %Changeset{} = changeset} ->
socket |> assign(changeset: changeset) socket |> assign(changeset: changeset)
:error ->
error_msg = dgettext("errors", "Could not parse number of copies")
{:error, changeset} =
changeset
|> Changeset.add_error(:multiplier, error_msg)
|> Changeset.apply_action(:insert)
socket |> assign(:changeset, changeset)
end end
{:noreply, socket}
end end
end end

View File

@ -13,15 +13,32 @@
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
> >
<div <div
:if={@changeset.action && not @changeset.valid?()} :if={@changeset.action && not @changeset.valid?}
class="invalid-feedback col-span-3 text-center" class="invalid-feedback col-span-3 text-center"
> >
<%= changeset_errors(@changeset) %> <%= changeset_errors(@changeset) %>
</div> </div>
<%= label(f, :class, gettext("Class"), class: "title text-lg text-primary-600") %>
<%= select(
f,
:class,
[
{gettext("Any"), :all},
{gettext("Rifle"), :rifle},
{gettext("Shotgun"), :shotgun},
{gettext("Pistol"), :pistol}
],
class: "text-center col-span-2 input input-primary",
value: @class
) %>
<%= error_tag(f, :class, "col-span-3 text-center") %>
<%= label(f, :type_id, gettext("Type"), class: "title text-lg text-primary-600") %> <%= label(f, :type_id, gettext("Type"), class: "title text-lg text-primary-600") %>
<%= select(f, :type_id, type_options(@types), <%= select(f, :type_id, type_options(@types, @class),
class: "text-center col-span-2 input input-primary" class: "text-center col-span-2 input input-primary",
id: "pack-form-type-select",
phx_hook: "SlimSelect"
) %> ) %>
<%= error_tag(f, :type_id, "col-span-3 text-center") %> <%= error_tag(f, :type_id, "col-span-3 text-center") %>
@ -42,7 +59,8 @@
<%= label(f, :lot_number, gettext("Lot number"), class: "title text-lg text-primary-600") %> <%= label(f, :lot_number, gettext("Lot number"), class: "title text-lg text-primary-600") %>
<%= text_input(f, :lot_number, <%= text_input(f, :lot_number,
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255 maxlength: 255,
phx_debounce: 300
) %> ) %>
<%= error_tag(f, :price_paid, "col-span-3 text-center") %> <%= error_tag(f, :price_paid, "col-span-3 text-center") %>
@ -56,15 +74,18 @@
<%= label(f, :notes, gettext("Notes"), class: "title text-lg text-primary-600") %> <%= label(f, :notes, gettext("Notes"), class: "title text-lg text-primary-600") %>
<%= textarea(f, :notes, <%= textarea(f, :notes,
id: "pack-form-notes",
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
id: "pack-form-notes",
phx_debounce: 300,
phx_update: "ignore" phx_update: "ignore"
) %> ) %>
<%= error_tag(f, :notes, "col-span-3 text-center") %> <%= error_tag(f, :notes, "col-span-3 text-center") %>
<%= label(f, :container, gettext("Container"), class: "title text-lg text-primary-600") %> <%= label(f, :container, gettext("Container"), class: "title text-lg text-primary-600") %>
<%= select(f, :container_id, container_options(@containers), <%= select(f, :container_id, container_options(@containers),
class: "text-center col-span-2 input input-primary" class: "text-center col-span-2 input input-primary",
id: "pack-form-container-select",
phx_hook: "SlimSelect"
) %> ) %>
<%= error_tag(f, :container_id, "col-span-3 text-center") %> <%= error_tag(f, :container_id, "col-span-3 text-center") %>
@ -74,7 +95,6 @@
<%= label(f, :multiplier, gettext("Copies"), class: "title text-lg text-primary-600") %> <%= label(f, :multiplier, gettext("Copies"), class: "title text-lg text-primary-600") %>
<%= number_input(f, :multiplier, <%= number_input(f, :multiplier,
max: @pack_create_limit,
class: "text-center input input-primary", class: "text-center input input-primary",
value: 1, value: 1,
phx_update: "ignore" phx_update: "ignore"

View File

@ -96,18 +96,6 @@ defmodule CanneryWeb.PackLive.Index do
{:noreply, socket |> put_flash(:info, prompt) |> display_packs()} {:noreply, socket |> put_flash(:info, prompt) |> display_packs()}
end end
def handle_event(
"toggle_staged",
%{"pack_id" => id},
%{assigns: %{current_user: current_user}} = socket
) do
pack = Ammo.get_pack!(id, current_user)
{:ok, _pack} = pack |> Ammo.update_pack(%{"staged" => !pack.staged}, current_user)
{:noreply, socket |> display_packs()}
end
def handle_event("toggle_show_used", _params, %{assigns: %{show_used: show_used}} = socket) do def handle_event("toggle_show_used", _params, %{assigns: %{show_used: show_used}} = socket) do
{:noreply, socket |> assign(:show_used, !show_used) |> display_packs()} {:noreply, socket |> assign(:show_used, !show_used) |> display_packs()}
end end

View File

@ -1,5 +1,5 @@
<div class="flex flex-col space-y-8 justify-center items-center"> <div class="flex flex-col justify-center items-center space-y-8">
<h1 class="title text-2xl title-primary-500"> <h1 class="text-2xl title title-primary-500">
<%= gettext("Ammo") %> <%= gettext("Ammo") %>
</h1> </h1>
@ -25,7 +25,7 @@
</.link> </.link>
</div> </div>
<% @packs_count == 0 -> %> <% @packs_count == 0 -> %>
<h2 class="title text-xl text-primary-600"> <h2 class="text-xl title text-primary-600">
<%= gettext("No ammo") %> <%= gettext("No ammo") %>
<%= display_emoji("😔") %> <%= display_emoji("😔") %>
</h2> </h2>
@ -38,7 +38,7 @@
<%= dgettext("actions", "Add Ammo") %> <%= dgettext("actions", "Add Ammo") %>
</.link> </.link>
<div class="w-full flex flex-col sm:flex-row justify-center items-center space-y-4 sm:space-y-0 sm:space-x-4 max-w-2xl"> <div class="flex flex-col justify-center items-center space-y-4 w-full max-w-2xl sm:flex-row sm:space-y-0 sm:space-x-4">
<.form <.form
:let={f} :let={f}
for={%{}} for={%{}}
@ -71,26 +71,26 @@
as={:search} as={:search}
phx-change="search" phx-change="search"
phx-submit="search" phx-submit="search"
class="grow flex items-center" class="flex items-center grow"
> >
<%= text_input(f, :search_term, <%= text_input(f, :search_term,
class: "grow input input-primary", class: "grow input input-primary",
value: @search,
role: "search",
phx_debounce: 300, phx_debounce: 300,
placeholder: gettext("Search ammo") placeholder: gettext("Search ammo"),
role: "search",
value: @search
) %> ) %>
</.form> </.form>
<.toggle_button action="toggle_show_used" value={@show_used}> <.toggle_button action="toggle_show_used" value={@show_used}>
<span class="title text-lg text-primary-600"> <span class="text-lg title text-primary-600">
<%= gettext("Show used") %> <%= gettext("Show used") %>
</span> </span>
</.toggle_button> </.toggle_button>
</div> </div>
<%= if @packs |> Enum.empty?() do %> <%= if @packs |> Enum.empty?() do %>
<h2 class="title text-xl text-primary-600"> <h2 class="text-xl title text-primary-600">
<%= gettext("No Ammo") %> <%= gettext("No Ammo") %>
<%= display_emoji("😔") %> <%= display_emoji("😔") %>
</h2> </h2>
@ -108,18 +108,7 @@
</.link> </.link>
</:type> </:type>
<:range :let={pack}> <:range :let={pack}>
<div class="min-w-20 py-2 px-4 h-full flex flew-wrap justify-center items-center"> <div class="flex flex-wrap justify-center items-center px-4 py-2 h-full min-w-20">
<button
type="button"
class="mx-2 my-1 text-sm btn btn-primary"
phx-click="toggle_staged"
phx-value-pack_id={pack.id}
>
<%= if pack.staged,
do: dgettext("actions", "Unstage"),
else: dgettext("actions", "Stage") %>
</button>
<.link <.link
patch={~p"/ammo/add_shot_record/#{pack}"} patch={~p"/ammo/add_shot_record/#{pack}"}
class="mx-2 my-1 text-sm btn btn-primary" class="mx-2 my-1 text-sm btn btn-primary"
@ -129,7 +118,7 @@
</div> </div>
</:range> </:range>
<:container :let={{pack, %{name: container_name} = container}}> <:container :let={{pack, %{name: container_name} = container}}>
<div class="min-w-20 py-2 px-4 h-full flex flew-wrap justify-center items-center"> <div class="flex flex-wrap justify-center items-center px-4 py-2 h-full min-w-20">
<.link navigate={~p"/container/#{container}"} class="mx-2 my-1 link"> <.link navigate={~p"/container/#{container}"} class="mx-2 my-1 link">
<%= container_name %> <%= container_name %>
</.link> </.link>
@ -140,7 +129,7 @@
</div> </div>
</:container> </:container>
<:actions :let={%{count: pack_count} = pack}> <:actions :let={%{count: pack_count} = pack}>
<div class="py-2 px-4 h-full space-x-4 flex justify-center items-center"> <div class="flex justify-center items-center px-4 py-2 space-x-4 h-full">
<.link <.link
navigate={~p"/ammo/show/#{pack}"} navigate={~p"/ammo/show/#{pack}"}
class="text-primary-600 link" class="text-primary-600 link"

View File

@ -57,22 +57,12 @@ defmodule CanneryWeb.PackLive.Show do
{:noreply, socket |> put_flash(:info, prompt) |> push_navigate(to: redirect_to)} {:noreply, socket |> put_flash(:info, prompt) |> push_navigate(to: redirect_to)}
end end
def handle_event(
"toggle_staged",
_params,
%{assigns: %{pack: pack, current_user: current_user}} = socket
) do
{:ok, pack} = pack |> Ammo.update_pack(%{"staged" => !pack.staged}, current_user)
{:noreply, socket |> display_pack(pack)}
end
def handle_event( def handle_event(
"delete_shot_record", "delete_shot_record",
%{"id" => id}, %{"id" => id},
%{assigns: %{pack: %{id: pack_id}, current_user: current_user}} = socket %{assigns: %{pack: %{id: pack_id}, current_user: current_user}} = socket
) do ) do
{:ok, _} = {:ok, _shot_record} =
ActivityLog.get_shot_record!(id, current_user) ActivityLog.get_shot_record!(id, current_user)
|> ActivityLog.delete_shot_record(current_user) |> ActivityLog.delete_shot_record(current_user)
@ -136,7 +126,7 @@ defmodule CanneryWeb.PackLive.Show do
:actions -> :actions ->
~H""" ~H"""
<div class="px-4 py-2 space-x-4 flex justify-center items-center"> <div class="flex justify-center items-center px-4 py-2 space-x-4">
<.link <.link
patch={~p"/ammo/show/#{@pack}/edit/#{@shot_record}"} patch={~p"/ammo/show/#{@pack}/edit/#{@shot_record}"}
class="text-primary-600 link" class="text-primary-600 link"

View File

@ -1,43 +1,43 @@
<div class="mx-auto space-y-4 max-w-3xl flex flex-col justify-center items-center"> <div class="flex flex-col justify-center items-center mx-auto space-y-4 max-w-3xl">
<h1 class="title text-2xl title-primary-500"> <h1 class="text-2xl title title-primary-500">
<%= @pack.type.name %> <%= @pack.type.name %>
</h1> </h1>
<div class="space-y-2 flex flex-col justify-center items-center"> <div class="flex flex-col justify-center items-center space-y-2">
<span class="rounded-lg title text-lg"> <span class="text-lg rounded-lg title">
<%= gettext("Count:") %> <%= gettext("Count:") %>
<%= @pack.count %> <%= @pack.count %>
</span> </span>
<span class="rounded-lg title text-lg"> <span class="text-lg rounded-lg title">
<%= gettext("Original count:") %> <%= gettext("Original count:") %>
<%= @original_count %> <%= @original_count %>
</span> </span>
<span class="rounded-lg title text-lg"> <span class="text-lg rounded-lg title">
<%= gettext("Percentage left:") %> <%= gettext("Percentage left:") %>
<%= gettext("%{percentage}%", percentage: @percentage_remaining) %> <%= gettext("%{percentage}%", percentage: @percentage_remaining) %>
</span> </span>
<%= if @pack.notes do %> <%= if @pack.notes do %>
<span class="rounded-lg title text-lg"> <span class="text-lg rounded-lg title">
<%= gettext("Notes:") %> <%= gettext("Notes:") %>
<%= @pack.notes %> <%= @pack.notes %>
</span> </span>
<% end %> <% end %>
<span class="rounded-lg title text-lg"> <span class="text-lg rounded-lg title">
<%= gettext("Purchased on:") %> <%= gettext("Purchased on:") %>
<.date id={"#{@pack.id}-purchased-on"} date={@pack.purchased_on} /> <.date id={"#{@pack.id}-purchased-on"} date={@pack.purchased_on} />
</span> </span>
<%= if @pack.price_paid do %> <%= if @pack.price_paid do %>
<span class="rounded-lg title text-lg"> <span class="text-lg rounded-lg title">
<%= gettext("Original cost:") %> <%= gettext("Original cost:") %>
<%= gettext("$%{amount}", amount: display_currency(@pack.price_paid)) %> <%= gettext("$%{amount}", amount: display_currency(@pack.price_paid)) %>
</span> </span>
<span class="rounded-lg title text-lg"> <span class="text-lg rounded-lg title">
<%= gettext("Current value:") %> <%= gettext("Current value:") %>
<%= gettext("$%{amount}", <%= gettext("$%{amount}",
amount: display_currency(@pack.price_paid * @percentage_remaining / 100) amount: display_currency(@pack.price_paid * @percentage_remaining / 100)
@ -76,12 +76,6 @@
</div> </div>
<div class="flex flex-wrap justify-center items-center text-primary-600"> <div class="flex flex-wrap justify-center items-center text-primary-600">
<button type="button" class="mx-4 my-2 btn btn-primary" phx-click="toggle_staged">
<%= if @pack.staged,
do: dgettext("actions", "Unstage from range"),
else: dgettext("actions", "Stage for range") %>
</button>
<.link patch={~p"/ammo/show/move/#{@pack}"} class="btn btn-primary"> <.link patch={~p"/ammo/show/move/#{@pack}"} class="btn btn-primary">
<%= dgettext("actions", "Move ammo") %> <%= dgettext("actions", "Move ammo") %>
</.link> </.link>
@ -96,7 +90,7 @@
<div> <div>
<%= if @container do %> <%= if @container do %>
<h1 class="mb-4 px-4 py-2 text-center rounded-lg title text-xl"> <h1 class="px-4 py-2 mb-4 text-xl text-center rounded-lg title">
<%= gettext("Stored in") %> <%= gettext("Stored in") %>
</h1> </h1>
@ -109,7 +103,7 @@
<%= unless @shot_records |> Enum.empty?() do %> <%= unless @shot_records |> Enum.empty?() do %>
<hr class="mb-4 w-full" /> <hr class="mb-4 w-full" />
<h1 class="mb-4 px-4 py-2 text-center rounded-lg title text-xl"> <h1 class="px-4 py-2 mb-4 text-xl text-center rounded-lg title">
<%= gettext("Rounds used") %> <%= gettext("Rounds used") %>
</h1> </h1>

View File

@ -71,25 +71,26 @@ defmodule CanneryWeb.RangeLive.FormComponent do
} }
} = socket, } = socket,
shot_record_params, shot_record_params,
action \\ nil changeset_action \\ nil
) do ) do
default_action = changeset =
case live_action do case live_action do
:add_shot_record -> :insert :add_shot_record ->
editing when editing in [:edit, :edit_shot_record] -> :update shot_record |> ShotRecord.create_changeset(user, pack, shot_record_params)
editing when editing in [:edit, :edit_shot_record] ->
shot_record |> ShotRecord.update_changeset(user, shot_record_params)
end end
changeset = changeset =
case default_action do if changeset_action do
:insert -> shot_record |> ShotRecord.create_changeset(user, pack, shot_record_params) case changeset |> Changeset.apply_action(changeset_action) do
:update -> shot_record |> ShotRecord.update_changeset(user, shot_record_params)
end
changeset =
case changeset |> Changeset.apply_action(action || default_action) do
{:ok, _data} -> changeset {:ok, _data} -> changeset
{:error, changeset} -> changeset {:error, changeset} -> changeset
end end
else
changeset
end
socket |> assign(:changeset, changeset) socket |> assign(:changeset, changeset)
end end

View File

@ -13,7 +13,7 @@
phx-submit="save" phx-submit="save"
> >
<div <div
:if={@changeset.action && not @changeset.valid?()} :if={@changeset.action && not @changeset.valid?}
class="invalid-feedback col-span-3 text-center" class="invalid-feedback col-span-3 text-center"
> >
<%= changeset_errors(@changeset) %> <%= changeset_errors(@changeset) %>
@ -29,11 +29,12 @@
<%= label(f, :notes, gettext("Notes"), class: "title text-lg text-primary-600") %> <%= label(f, :notes, gettext("Notes"), class: "title text-lg text-primary-600") %>
<%= textarea(f, :notes, <%= textarea(f, :notes,
id: "shot-record-form-notes",
class: "input input-primary col-span-2", class: "input input-primary col-span-2",
id: "shot-record-form-notes",
maxlength: 255, maxlength: 255,
placeholder: gettext("Really great weather"), phx_debounce: 300,
phx_update: "ignore" phx_update: "ignore",
placeholder: gettext("Really great weather")
) %> ) %>
<%= error_tag(f, :notes, "col-span-3") %> <%= error_tag(f, :notes, "col-span-3") %>

View File

@ -4,16 +4,37 @@ defmodule CanneryWeb.RangeLive.Index do
""" """
use CanneryWeb, :live_view use CanneryWeb, :live_view
alias Cannery.{ActivityLog, ActivityLog.ShotRecord, Ammo} alias Cannery.{ActivityLog, ActivityLog.ShotRecord}
alias Cannery.{Ammo, Containers}
alias Phoenix.LiveView.Socket alias Phoenix.LiveView.Socket
@impl true @impl true
def mount(%{"search" => search}, _session, socket) do def mount(%{"search" => search}, _session, socket) do
{:ok, socket |> assign(class: :all, search: search) |> display_shot_records()} socket =
socket
|> assign(
class: :all,
start_date: Date.shift(Date.utc_today(), year: -1),
end_date: Date.utc_today(),
search: search
)
|> display_shot_records()
{:ok, socket}
end end
def mount(_params, _session, socket) do def mount(_params, _session, socket) do
{:ok, socket |> assign(class: :all, search: nil) |> display_shot_records()} socket =
socket
|> assign(
class: :all,
start_date: Date.shift(Date.utc_today(), year: -1),
end_date: Date.utc_today(),
search: nil
)
|> display_shot_records()
{:ok, socket}
end end
@impl true @impl true
@ -71,7 +92,7 @@ defmodule CanneryWeb.RangeLive.Index do
@impl true @impl true
def handle_event("delete", %{"id" => id}, %{assigns: %{current_user: current_user}} = socket) do def handle_event("delete", %{"id" => id}, %{assigns: %{current_user: current_user}} = socket) do
{:ok, _} = {:ok, _shot_record} =
ActivityLog.get_shot_record!(id, current_user) ActivityLog.get_shot_record!(id, current_user)
|> ActivityLog.delete_shot_record(current_user) |> ActivityLog.delete_shot_record(current_user)
@ -81,14 +102,16 @@ defmodule CanneryWeb.RangeLive.Index do
def handle_event( def handle_event(
"toggle_staged", "toggle_staged",
%{"pack_id" => pack_id}, %{"container_id" => container_id},
%{assigns: %{current_user: current_user}} = socket %{assigns: %{current_user: current_user}} = socket
) do ) do
pack = Ammo.get_pack!(pack_id, current_user) container = Containers.get_container!(container_id, current_user)
{:ok, _pack} = pack |> Ammo.update_pack(%{"staged" => !pack.staged}, current_user) {:ok, _container} =
container
|> Containers.update_container(current_user, %{"staged" => !container.staged})
prompt = dgettext("prompts", "Ammo unstaged succesfully") prompt = dgettext("prompts", "Container unstaged succesfully")
{:noreply, socket |> put_flash(:info, prompt) |> display_shot_records()} {:noreply, socket |> put_flash(:info, prompt) |> display_shot_records()}
end end
@ -116,11 +139,49 @@ defmodule CanneryWeb.RangeLive.Index do
{:noreply, socket |> assign(:class, :all) |> display_shot_records()} {:noreply, socket |> assign(:class, :all) |> display_shot_records()}
end end
def handle_event(
"change_dates",
%{
"dates_start" => start_date,
"dates_end" => end_date
},
socket
) do
socket =
socket
|> assign(
start_date: start_date,
end_date: end_date
)
|> display_shot_records()
{:noreply, socket}
end
@spec display_shot_records(Socket.t()) :: Socket.t() @spec display_shot_records(Socket.t()) :: Socket.t()
defp display_shot_records( defp display_shot_records(
%{assigns: %{class: class, search: search, current_user: current_user}} = socket %{
assigns: %{
class: class,
start_date: start_date,
end_date: end_date,
search: search,
current_user: current_user
}
} = socket
) do ) do
shot_records = ActivityLog.list_shot_records(current_user, search: search, class: class) shot_records =
ActivityLog.list_shot_records(current_user,
class: class,
end_date: end_date,
search: search,
start_date: start_date
)
containers =
Containers.list_containers(current_user, staged: true)
|> Map.new(fn container = %{id: container_id} -> {container_id, container} end)
packs = Ammo.list_packs(current_user, staged: true) packs = Ammo.list_packs(current_user, staged: true)
chart_data = shot_records |> get_chart_data_for_shot_record() chart_data = shot_records |> get_chart_data_for_shot_record()
original_counts = packs |> Ammo.get_original_counts(current_user) original_counts = packs |> Ammo.get_original_counts(current_user)
@ -130,6 +191,7 @@ defmodule CanneryWeb.RangeLive.Index do
socket socket
|> assign( |> assign(
containers: containers,
packs: packs, packs: packs,
original_counts: original_counts, original_counts: original_counts,
cprs: cprs, cprs: cprs,
@ -153,6 +215,5 @@ defmodule CanneryWeb.RangeLive.Index do
label: gettext("Rounds shot: %{count}", count: sum) label: gettext("Rounds shot: %{count}", count: sum)
} }
end) end)
|> Enum.sort_by(fn %{date: date} -> date end, Date)
end end
end end

View File

@ -1,43 +1,55 @@
<div class="flex flex-col space-y-8 justify-center items-center"> <div class="flex flex-col justify-center items-center space-y-8">
<h1 class="title text-2xl title-primary-500"> <h1 class="text-2xl title title-primary-500">
<%= gettext("Range day") %> <%= gettext("Range day") %>
</h1> </h1>
<%= if @packs |> Enum.empty?() do %> <%= if @containers |> Enum.empty?() do %>
<h1 class="title text-xl text-primary-600"> <h1 class="text-xl title text-primary-600">
<%= gettext("No ammo staged") %> <%= gettext("No containers staged") %>
<%= display_emoji("😔") %> <%= display_emoji("😔") %>
</h1> </h1>
<.link navigate={~p"/ammo"} class="btn btn-primary"> <.link navigate={~p"/containers"} class="btn btn-primary">
<%= dgettext("actions", "Why not get some ready to shoot?") %> <%= dgettext("actions", "Why not get some ready to shoot?") %>
</.link> </.link>
<% else %> <% else %>
<.link navigate={~p"/ammo"} class="btn btn-primary"> <.link navigate={~p"/containers"} class="btn btn-primary">
<%= dgettext("actions", "Stage ammo") %> <%= dgettext("actions", "Stage containers") %>
</.link> </.link>
<div class="w-full flex flex-row flex-wrap justify-center items-stretch"> <div class="flex flex-row flex-wrap justify-center items-stretch w-full">
<.container_card
:for={{container_id, container} <- @containers}
container={container}
current_user={@current_user}
>
<div class="flex flex-wrap justify-center items-center px-4 py-2 h-full min-w-20">
<button
type="button"
class="mx-2 my-1 text-sm btn btn-primary"
phx-click="toggle_staged"
phx-value-container_id={container_id}
>
<%= if container.staged,
do: dgettext("actions", "Unstage"),
else: dgettext("actions", "Stage") %>
</button>
</div>
</.container_card>
</div>
<hr class="hr" />
<div class="flex flex-row flex-wrap justify-center items-stretch w-full">
<.pack_card <.pack_card
:for={%{id: pack_id} = pack <- @packs} :for={%{id: pack_id, container_id: container_id} = pack <- @packs}
pack={pack} pack={pack}
original_count={Map.fetch!(@original_counts, pack_id)} original_count={Map.fetch!(@original_counts, pack_id)}
cpr={Map.get(@cprs, pack_id)} cpr={Map.get(@cprs, pack_id)}
last_used_date={Map.get(@last_used_dates, pack_id)} last_used_date={Map.get(@last_used_dates, pack_id)}
current_user={@current_user} current_user={@current_user}
container={Map.fetch!(@containers, container_id)}
> >
<button
type="button"
class="btn btn-primary"
phx-click="toggle_staged"
phx-value-pack_id={pack.id}
data-confirm={"#{dgettext("prompts", "Are you sure you want to unstage this ammo?")}"}
>
<%= if pack.staged,
do: dgettext("actions", "Unstage from range"),
else: dgettext("actions", "Stage for range") %>
</button>
<.link patch={~p"/range/add_shot_record/#{pack}"} class="btn btn-primary"> <.link patch={~p"/range/add_shot_record/#{pack}"} class="btn btn-primary">
<%= dgettext("actions", "Record shots") %> <%= dgettext("actions", "Record shots") %>
</.link> </.link>
@ -48,12 +60,12 @@
<hr class="hr" /> <hr class="hr" />
<%= if @shot_record_count == 0 do %> <%= if @shot_record_count == 0 do %>
<h1 class="title text-xl text-primary-600"> <h1 class="text-xl title text-primary-600">
<%= gettext("No shots recorded") %> <%= gettext("No shots recorded") %>
<%= display_emoji("😔") %> <%= display_emoji("😔") %>
</h1> </h1>
<% else %> <% else %>
<h1 class="title text-2xl text-primary-600"> <h1 class="text-2xl title text-primary-600">
<%= gettext("Shot log") %> <%= gettext("Shot log") %>
</h1> </h1>
@ -71,7 +83,7 @@
<%= dgettext("errors", "Your browser does not support the canvas element.") %> <%= dgettext("errors", "Your browser does not support the canvas element.") %>
</canvas> </canvas>
<div class="w-full flex flex-col sm:flex-row justify-center items-center space-y-4 sm:space-y-0 sm:space-x-4 max-w-2xl"> <div class="flex flex-col justify-center items-center space-y-4 w-full max-w-2xl sm:flex-row sm:space-y-0 sm:space-x-4">
<.form <.form
:let={f} :let={f}
for={%{}} for={%{}}
@ -104,20 +116,35 @@
as={:search} as={:search}
phx-change="search" phx-change="search"
phx-submit="search" phx-submit="search"
class="grow flex items-center" class="flex items-center grow"
> >
<%= text_input(f, :search_term, <%= text_input(f, :search_term,
class: "grow input input-primary", class: "grow input input-primary",
value: @search,
role: "search",
phx_debounce: 300, phx_debounce: 300,
placeholder: gettext("Search shot records") placeholder: gettext("Search shot records"),
role: "search",
value: @search
) %> ) %>
</.form> </.form>
<.form
:let={f}
for={%{}}
as={:shot_records}
phx-change="change_dates"
phx-submit="change_dates"
class="flex items-center"
>
<%= label(f, :dates_start, gettext("Dates"),
class: "title text-primary-600 text-lg text-center"
) %>
<.date_range name="dates" />
</.form>
</div> </div>
<%= if @shot_records |> Enum.empty?() do %> <%= if @shot_records |> Enum.empty?() do %>
<h1 class="title text-xl text-primary-600"> <h1 class="text-xl title text-primary-600">
<%= gettext("No shots recorded") %> <%= gettext("No shots recorded") %>
<%= display_emoji("😔") %> <%= display_emoji("😔") %>
</h1> </h1>
@ -129,7 +156,7 @@
current_user={@current_user} current_user={@current_user}
> >
<:actions :let={shot_record}> <:actions :let={shot_record}>
<div class="px-4 py-2 space-x-4 flex justify-center items-center"> <div class="flex justify-center items-center px-4 py-2 space-x-4">
<.link <.link
patch={~p"/range/edit/#{shot_record}"} patch={~p"/range/edit/#{shot_record}"}
class="text-primary-600 link" class="text-primary-600 link"

View File

@ -17,7 +17,7 @@ defmodule CanneryWeb.TagLive.FormComponent do
@impl true @impl true
def handle_event("validate", %{"tag" => tag_params}, socket) do def handle_event("validate", %{"tag" => tag_params}, socket) do
{:noreply, socket |> assign_changeset(tag_params)} {:noreply, socket |> assign_changeset(tag_params, :validate)}
end end
def handle_event("save", %{"tag" => tag_params}, %{assigns: %{action: action}} = socket) do def handle_event("save", %{"tag" => tag_params}, %{assigns: %{action: action}} = socket) do
@ -26,14 +26,9 @@ defmodule CanneryWeb.TagLive.FormComponent do
defp assign_changeset( defp assign_changeset(
%{assigns: %{action: action, current_user: user, tag: tag}} = socket, %{assigns: %{action: action, current_user: user, tag: tag}} = socket,
tag_params tag_params,
changeset_action \\ nil
) do ) do
changeset_action =
case action do
:new -> :insert
:edit -> :update
end
changeset = changeset =
case action do case action do
:new -> tag |> Tag.create_changeset(user, tag_params) :new -> tag |> Tag.create_changeset(user, tag_params)
@ -41,10 +36,14 @@ defmodule CanneryWeb.TagLive.FormComponent do
end end
changeset = changeset =
if changeset_action do
case changeset |> Changeset.apply_action(changeset_action) do case changeset |> Changeset.apply_action(changeset_action) do
{:ok, _data} -> changeset {:ok, _data} -> changeset
{:error, changeset} -> changeset {:error, changeset} -> changeset
end end
else
changeset
end
socket |> assign(:changeset, changeset) socket |> assign(:changeset, changeset)
end end

View File

@ -12,14 +12,18 @@
phx-submit="save" phx-submit="save"
> >
<div <div
:if={@changeset.action && not @changeset.valid?()} :if={@changeset.action && not @changeset.valid?}
class="invalid-feedback col-span-3 text-center" class="invalid-feedback col-span-3 text-center"
> >
<%= changeset_errors(@changeset) %> <%= changeset_errors(@changeset) %>
</div> </div>
<%= label(f, :name, gettext("Name"), class: "title text-lg text-primary-600") %> <%= label(f, :name, gettext("Name"), class: "title text-lg text-primary-600") %>
<%= text_input(f, :name, class: "input input-primary col-span-2", maxlength: 255) %> <%= text_input(f, :name,
class: "input input-primary col-span-2",
maxlength: 255,
phx_debounce: 300
) %>
<%= error_tag(f, :name, "col-span-3") %> <%= error_tag(f, :name, "col-span-3") %>
<%= label(f, :bg_color, gettext("Background color"), class: "title text-lg text-primary-600") %> <%= label(f, :bg_color, gettext("Background color"), class: "title text-lg text-primary-600") %>

View File

@ -30,10 +30,10 @@
> >
<%= text_input(f, :search_term, <%= text_input(f, :search_term,
class: "grow input input-primary", class: "grow input input-primary",
value: @search,
role: "search",
phx_debounce: 300, phx_debounce: 300,
placeholder: gettext("Search tags") placeholder: gettext("Search tags"),
role: "search",
value: @search
) %> ) %>
</.form> </.form>
</div> </div>

View File

@ -19,7 +19,7 @@ defmodule CanneryWeb.TypeLive.FormComponent do
@impl true @impl true
def handle_event("validate", %{"type" => type_params}, socket) do def handle_event("validate", %{"type" => type_params}, socket) do
{:noreply, socket |> assign_changeset(type_params)} {:noreply, socket |> assign_changeset(type_params, :validate)}
end end
def handle_event( def handle_event(
@ -32,14 +32,9 @@ defmodule CanneryWeb.TypeLive.FormComponent do
defp assign_changeset( defp assign_changeset(
%{assigns: %{action: action, type: type, current_user: user}} = socket, %{assigns: %{action: action, type: type, current_user: user}} = socket,
type_params type_params,
changeset_action \\ nil
) do ) do
changeset_action =
case action do
create when create in [:new, :clone] -> :insert
:edit -> :update
end
changeset = changeset =
case action do case action do
create when create in [:new, :clone] -> create when create in [:new, :clone] ->
@ -50,10 +45,14 @@ defmodule CanneryWeb.TypeLive.FormComponent do
end end
changeset = changeset =
if changeset_action do
case changeset |> Changeset.apply_action(changeset_action) do case changeset |> Changeset.apply_action(changeset_action) do
{:ok, _data} -> changeset {:ok, _data} -> changeset
{:error, changeset} -> changeset {:error, changeset} -> changeset
end end
else
changeset
end
socket |> assign(changeset: changeset) socket |> assign(changeset: changeset)
end end

View File

@ -12,7 +12,7 @@
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
> >
<div <div
:if={@changeset.action && not @changeset.valid?()} :if={@changeset.action && not @changeset.valid?}
class="invalid-feedback col-span-3 text-center" class="invalid-feedback col-span-3 text-center"
> >
<%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %> <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %>
@ -22,7 +22,11 @@
<%= select( <%= select(
f, f,
:class, :class,
[{gettext("Rifle"), :rifle}, {gettext("Shotgun"), :shotgun}, {gettext("Pistol"), :pistol}], [
{gettext("Rifle"), :rifle},
{gettext("Shotgun"), :shotgun},
{gettext("Pistol"), :pistol}
],
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255 maxlength: 255
) %> ) %>
@ -31,14 +35,16 @@
<%= label(f, :name, gettext("Name"), class: "title text-lg text-primary-600") %> <%= label(f, :name, gettext("Name"), class: "title text-lg text-primary-600") %>
<%= text_input(f, :name, <%= text_input(f, :name,
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255 maxlength: 255,
phx_debounce: 300
) %> ) %>
<%= error_tag(f, :name, "col-span-3 text-center") %> <%= error_tag(f, :name, "col-span-3 text-center") %>
<%= label(f, :desc, gettext("Description"), class: "title text-lg text-primary-600") %> <%= label(f, :desc, gettext("Description"), class: "title text-lg text-primary-600") %>
<%= textarea(f, :desc, <%= textarea(f, :desc,
id: "type-form-desc",
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
id: "type-form-desc",
phx_debounce: 300,
phx_update: "ignore" phx_update: "ignore"
) %> ) %>
<%= error_tag(f, :desc, "col-span-3 text-center") %> <%= error_tag(f, :desc, "col-span-3 text-center") %>
@ -52,6 +58,7 @@
<%= text_input(f, :cartridge, <%= text_input(f, :cartridge,
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255, maxlength: 255,
phx_debounce: 300,
placeholder: gettext("5.56x46mm NATO") placeholder: gettext("5.56x46mm NATO")
) %> ) %>
<%= error_tag(f, :cartridge, "col-span-3 text-center") %> <%= error_tag(f, :cartridge, "col-span-3 text-center") %>
@ -71,6 +78,7 @@
<%= text_input(f, :caliber, <%= text_input(f, :caliber,
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255, maxlength: 255,
phx_debounce: 300,
placeholder: gettext(".223") placeholder: gettext(".223")
) %> ) %>
<%= error_tag(f, :caliber, "col-span-3 text-center") %> <%= error_tag(f, :caliber, "col-span-3 text-center") %>
@ -81,7 +89,8 @@
) %> ) %>
<%= text_input(f, :unfired_length, <%= text_input(f, :unfired_length,
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255 maxlength: 255,
phx_debounce: 300
) %> ) %>
<%= error_tag(f, :unfired_length, "col-span-3 text-center") %> <%= error_tag(f, :unfired_length, "col-span-3 text-center") %>
@ -90,7 +99,8 @@
) %> ) %>
<%= text_input(f, :brass_height, <%= text_input(f, :brass_height,
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255 maxlength: 255,
phx_debounce: 300
) %> ) %>
<%= error_tag(f, :brass_height, "col-span-3 text-center") %> <%= error_tag(f, :brass_height, "col-span-3 text-center") %>
@ -99,7 +109,8 @@
) %> ) %>
<%= text_input(f, :chamber_size, <%= text_input(f, :chamber_size,
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255 maxlength: 255,
phx_debounce: 300
) %> ) %>
<%= error_tag(f, :chamber_size, "col-span-3 text-center") %> <%= error_tag(f, :chamber_size, "col-span-3 text-center") %>
<% else %> <% else %>
@ -136,6 +147,7 @@
<%= text_input(f, :bullet_type, <%= text_input(f, :bullet_type,
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255, maxlength: 255,
phx_debounce: 300,
placeholder: gettext("FMJ") placeholder: gettext("FMJ")
) %> ) %>
<%= error_tag(f, :bullet_type, "col-span-3 text-center") %> <%= error_tag(f, :bullet_type, "col-span-3 text-center") %>
@ -155,6 +167,7 @@
<%= text_input(f, :bullet_core, <%= text_input(f, :bullet_core,
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255, maxlength: 255,
phx_debounce: 300,
placeholder: gettext("Steel") placeholder: gettext("Steel")
) %> ) %>
<%= error_tag(f, :bullet_core, "col-span-3 text-center") %> <%= error_tag(f, :bullet_core, "col-span-3 text-center") %>
@ -164,6 +177,7 @@
<%= text_input(f, :jacket_type, <%= text_input(f, :jacket_type,
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255, maxlength: 255,
phx_debounce: 300,
placeholder: gettext("Bimetal") placeholder: gettext("Bimetal")
) %> ) %>
<%= error_tag(f, :jacket_type, "col-span-3 text-center") %> <%= error_tag(f, :jacket_type, "col-span-3 text-center") %>
@ -177,6 +191,7 @@
<%= text_input(f, :case_material, <%= text_input(f, :case_material,
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255, maxlength: 255,
phx_debounce: 300,
placeholder: gettext("Brass") placeholder: gettext("Brass")
) %> ) %>
<%= error_tag(f, :case_material, "col-span-3 text-center") %> <%= error_tag(f, :case_material, "col-span-3 text-center") %>
@ -185,7 +200,8 @@
<%= label(f, :wadding, gettext("Wadding"), class: "title text-lg text-primary-600") %> <%= label(f, :wadding, gettext("Wadding"), class: "title text-lg text-primary-600") %>
<%= text_input(f, :wadding, <%= text_input(f, :wadding,
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255 maxlength: 255,
phx_debounce: 300
) %> ) %>
<%= error_tag(f, :wadding, "col-span-3 text-center") %> <%= error_tag(f, :wadding, "col-span-3 text-center") %>
@ -193,6 +209,7 @@
<%= text_input(f, :shot_type, <%= text_input(f, :shot_type,
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255, maxlength: 255,
phx_debounce: 300,
placeholder: gettext("Target, bird, buck, etc") placeholder: gettext("Target, bird, buck, etc")
) %> ) %>
<%= error_tag(f, :shot_type, "col-span-3 text-center") %> <%= error_tag(f, :shot_type, "col-span-3 text-center") %>
@ -202,14 +219,16 @@
) %> ) %>
<%= text_input(f, :shot_material, <%= text_input(f, :shot_material,
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255 maxlength: 255,
phx_debounce: 300
) %> ) %>
<%= error_tag(f, :shot_material, "col-span-3 text-center") %> <%= error_tag(f, :shot_material, "col-span-3 text-center") %>
<%= label(f, :shot_size, gettext("Shot size"), class: "title text-lg text-primary-600") %> <%= label(f, :shot_size, gettext("Shot size"), class: "title text-lg text-primary-600") %>
<%= text_input(f, :shot_size, <%= text_input(f, :shot_size,
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255 maxlength: 255,
phx_debounce: 300
) %> ) %>
<%= error_tag(f, :shot_size, "col-span-3 text-center") %> <%= error_tag(f, :shot_size, "col-span-3 text-center") %>
@ -226,7 +245,8 @@
) %> ) %>
<%= text_input(f, :shot_charge_weight, <%= text_input(f, :shot_charge_weight,
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255 maxlength: 255,
phx_debounce: 300
) %> ) %>
<%= error_tag(f, :shot_charge_weight, "col-span-3 text-center") %> <%= error_tag(f, :shot_charge_weight, "col-span-3 text-center") %>
<% else %> <% else %>
@ -245,7 +265,8 @@
<%= label(f, :powder_type, gettext("Powder type"), class: "title text-lg text-primary-600") %> <%= label(f, :powder_type, gettext("Powder type"), class: "title text-lg text-primary-600") %>
<%= text_input(f, :powder_type, <%= text_input(f, :powder_type,
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255 maxlength: 255,
phx_debounce: 300
) %> ) %>
<%= error_tag(f, :powder_type, "col-span-3 text-center") %> <%= error_tag(f, :powder_type, "col-span-3 text-center") %>
@ -267,6 +288,7 @@
<%= text_input(f, :pressure, <%= text_input(f, :pressure,
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255, maxlength: 255,
phx_debounce: 300,
placeholder: gettext("+P") placeholder: gettext("+P")
) %> ) %>
<%= error_tag(f, :pressure, "col-span-3 text-center") %> <%= error_tag(f, :pressure, "col-span-3 text-center") %>
@ -277,7 +299,8 @@
) %> ) %>
<%= text_input(f, :dram_equivalent, <%= text_input(f, :dram_equivalent,
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255 maxlength: 255,
phx_debounce: 300
) %> ) %>
<%= error_tag(f, :dram_equivalent, "col-span-3 text-center") %> <%= error_tag(f, :dram_equivalent, "col-span-3 text-center") %>
<% else %> <% else %>
@ -306,6 +329,7 @@
<%= text_input(f, :primer_type, <%= text_input(f, :primer_type,
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255, maxlength: 255,
phx_debounce: 300,
placeholder: gettext("Boxer") placeholder: gettext("Boxer")
) %> ) %>
<%= error_tag(f, :primer_type, "col-span-3 text-center") %> <%= error_tag(f, :primer_type, "col-span-3 text-center") %>
@ -314,6 +338,7 @@
<%= text_input(f, :firing_type, <%= text_input(f, :firing_type,
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255, maxlength: 255,
phx_debounce: 300,
placeholder: gettext("Centerfire") placeholder: gettext("Centerfire")
) %> ) %>
<%= error_tag(f, :firing_type, "col-span-3 text-center") %> <%= error_tag(f, :firing_type, "col-span-3 text-center") %>
@ -345,14 +370,16 @@
<%= label(f, :manufacturer, gettext("Manufacturer"), class: "title text-lg text-primary-600") %> <%= label(f, :manufacturer, gettext("Manufacturer"), class: "title text-lg text-primary-600") %>
<%= text_input(f, :manufacturer, <%= text_input(f, :manufacturer,
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255 maxlength: 255,
phx_debounce: 300
) %> ) %>
<%= error_tag(f, :manufacturer, "col-span-3 text-center") %> <%= error_tag(f, :manufacturer, "col-span-3 text-center") %>
<%= label(f, :upc, gettext("UPC"), class: "title text-lg text-primary-600") %> <%= label(f, :upc, gettext("UPC"), class: "title text-lg text-primary-600") %>
<%= text_input(f, :upc, <%= text_input(f, :upc,
class: "text-center col-span-2 input input-primary", class: "text-center col-span-2 input input-primary",
maxlength: 255 maxlength: 255,
phx_debounce: 300
) %> ) %>
<%= error_tag(f, :upc, "col-span-3 text-center") %> <%= error_tag(f, :upc, "col-span-3 text-center") %>

View File

@ -54,10 +54,10 @@
> >
<%= text_input(f, :search_term, <%= text_input(f, :search_term,
class: "grow input input-primary", class: "grow input input-primary",
value: @search,
role: "search",
phx_debounce: 300, phx_debounce: 300,
placeholder: gettext("Search catalog") placeholder: gettext("Search catalog"),
role: "search",
value: @search
) %> ) %>
</.form> </.form>

View File

@ -120,7 +120,7 @@ defmodule CanneryWeb.Router do
# #
# Note that preview only shows emails that were sent by the same # Note that preview only shows emails that were sent by the same
# node running the Phoenix server. # node running the Phoenix server.
if Mix.env() == :dev do if Application.compile_env(:cannery, :env) == :dev do
scope "/dev" do scope "/dev" do
pipe_through :browser pipe_through :browser

View File

@ -4,8 +4,8 @@ defmodule Cannery.MixProject do
def project do def project do
[ [
app: :cannery, app: :cannery,
version: "0.9.6", version: "0.9.13",
elixir: "1.16.1", elixir: "1.18.1",
elixirc_paths: elixirc_paths(Mix.env()), elixirc_paths: elixirc_paths(Mix.env()),
start_permanent: Mix.env() == :prod, start_permanent: Mix.env() == :prod,
aliases: aliases(), aliases: aliases(),

View File

@ -1,54 +1,54 @@
%{ %{
"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"}, "bcrypt_elixir": {:hex, :bcrypt_elixir, "3.2.0", "feab711974beba4cb348147170346fe097eea2e840db4e012a145e180ed4ab75", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "563e92a6c77d667b19c5f4ba17ab6d440a085696bdf4c68b9b0f5b30bc5422b8"},
"bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"},
"castore": {:hex, :castore, "1.0.5", "9eeebb394cc9a0f3ae56b813459f990abb0a3dedee1be6b27fdb50301930502f", [:mix], [], "hexpm", "8d7c597c3e4a64c395980882d4bca3cebb8d74197c590dc272cfd3b6a6310578"}, "castore": {:hex, :castore, "1.0.11", "4bbd584741601eb658007339ea730b082cc61f3554cf2e8f39bf693a11b49073", [:mix], [], "hexpm", "e03990b4db988df56262852f20de0f659871c35154691427a5047f4967a16a62"},
"comeonin": {:hex, :comeonin, "5.4.0", "246a56ca3f41d404380fc6465650ddaa532c7f98be4bda1b4656b3a37cc13abe", [:mix], [], "hexpm", "796393a9e50d01999d56b7b8420ab0481a7538d0caf80919da493b4a6e51faf1"}, "comeonin": {:hex, :comeonin, "5.5.0", "364d00df52545c44a139bad919d7eacb55abf39e86565878e17cebb787977368", [:mix], [], "hexpm", "6287fc3ba0aad34883cbe3f7949fc1d1e738e5ccdce77165bc99490aa69f47fb"},
"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": {:hex, :cowboy, "2.12.0", "f276d521a1ff88b2b9b4c54d0e753da6c66dd7be6c9fca3d9418b561828a3731", [:make, :rebar3], [{:cowlib, "2.13.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "8a7abe6d183372ceb21caa2709bec928ab2b72e18a3911aa1771639bef82651e"},
"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"}, "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.12.1", "a9fa9a625f1d2025fe6b462cb865881329b5caff8f1854d1cbc9f9533f00e1e1", [:make, :rebar3], [], "hexpm", "163b73f6367a7341b33c794c4e88e7dbfe6498ac42dcd69ef44c5bc5507c8db0"}, "cowlib": {:hex, :cowlib, "2.13.0", "db8f7505d8332d98ef50a3ef34b34c1afddec7506e4ee4dd4a3a266285d282ca", [:make, :rebar3], [], "hexpm", "e1e1284dc3fc030a64b1ad0d8382ae7e99da46c3246b815318a4b848873800a4"},
"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"}, "credo": {:hex, :credo, "1.7.11", "d3e805f7ddf6c9c854fd36f089649d7cf6ba74c42bc3795d587814e3c9847102", [: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", "56826b4306843253a66e47ae45e98e7d284ee1f95d53d1612bb483f88a8cf219"},
"db_connection": {:hex, :db_connection, "2.6.0", "77d835c472b5b67fc4f29556dee74bf511bbafecdcaf98c27d27fa5918152086", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c2f992d15725e721ec7fbc1189d4ecdb8afef76648c746a8e1cad35e3b8a35f3"}, "db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"},
"decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, "decimal": {:hex, :decimal, "2.3.0", "3ad6255aa77b4a3c4f818171b12d237500e63525c2fd056699967a3e7ea20f62", [:mix], [], "hexpm", "a4d66355cb29cb47c3cf30e71329e58361cfcb37c34235ef3bf1d7bf3773aeac"},
"dialyxir": {:hex, :dialyxir, "1.4.3", "edd0124f358f0b9e95bfe53a9fcf806d615d8f838e2202a9f430d59566b6b53b", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "bf2cfb75cd5c5006bec30141b131663299c661a864ec7fbbc72dfa557487a986"}, "dialyxir": {:hex, :dialyxir, "1.4.5", "ca1571ac18e0f88d4ab245f0b60fa31ff1b12cbae2b11bd25d207f865e8ae78a", [:mix], [{:erlex, ">= 0.2.7", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "b0fb08bb8107c750db5c0b324fa2df5ceaa0f9307690ee3c1f6ba5b9eb5d35c3"},
"earmark_parser": {:hex, :earmark_parser, "1.4.39", "424642f8335b05bb9eb611aa1564c148a8ee35c9c8a8bba6e129d51a3e3c6769", [:mix], [], "hexpm", "06553a88d1f1846da9ef066b87b57c6f605552cfbe40d20bd8d59cc6bde41944"}, "earmark_parser": {:hex, :earmark_parser, "1.4.42", "f23d856f41919f17cd06a493923a722d87a2d684f143a1e663c04a2b93100682", [:mix], [], "hexpm", "6915b6ca369b5f7346636a2f41c6a6d78b5af419d61a611079189233358b8b8b"},
"ecto": {:hex, :ecto, "3.11.1", "4b4972b717e7ca83d30121b12998f5fcdc62ba0ed4f20fd390f16f3270d85c3e", [: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", "ebd3d3772cd0dfcd8d772659e41ed527c28b2a8bde4b00fe03e0463da0f1983b"}, "ecto": {:hex, :ecto, "3.12.5", "4a312960ce612e17337e7cefcf9be45b95a3be6b36b6f94dfb3d8c361d631866", [: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", "6eb18e80bef8bb57e17f5a7f068a1719fbda384d40fc37acb8eb8aeca493b6ea"},
"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_psql_extras": {:hex, :ecto_psql_extras, "0.8.3", "0c1df205bd051eaf599b3671e75356b121aa71eac09b63ecf921cb1a080c072e", [:mix], [{:ecto_sql, "~> 3.7", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:postgrex, "> 0.16.0 and < 0.20.0", [hex: :postgrex, repo: "hexpm", optional: false]}, {:table_rex, "~> 3.1.1 or ~> 4.0.0", [hex: :table_rex, repo: "hexpm", optional: false]}], "hexpm", "d0e35ea160359e759a2993a00c3a5389a9ca7ece6df5d0753fa927f988c7351a"},
"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"}, "ecto_sql": {:hex, :ecto_sql, "3.12.1", "c0d0d60e85d9ff4631f12bafa454bc392ce8b9ec83531a412c12a0d415a3a4d0", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.12", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 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", "aff5b958a899762c5f09028c847569f7dfb9cc9d63bdb8133bff8a5546de6bf5"},
"elixir_make": {:hex, :elixir_make, "0.7.8", "505026f266552ee5aabca0b9f9c229cbb496c689537c9f922f3eb5431157efc7", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.0", [hex: :certifi, repo: "hexpm", optional: true]}], "hexpm", "7a71945b913d37ea89b06966e1342c85cfe549b15e6d6d081e8081c493062c07"}, "elixir_make": {:hex, :elixir_make, "0.9.0", "6484b3cd8c0cee58f09f05ecaf1a140a8c97670671a6a0e7ab4dc326c3109726", [:mix], [], "hexpm", "db23d4fd8b757462ad02f8aa73431a426fe6671c80b200d9710caf3d1dd0ffdb"},
"eqrcode": {:hex, :eqrcode, "0.1.10", "6294fece9d68ad64eef1c3c92cf111cfd6469f4fbf230a2d4cc905a682178f3f", [:mix], [], "hexpm", "da30e373c36a0fd37ab6f58664b16029919896d6c45a68a95cc4d713e81076f1"}, "eqrcode": {:hex, :eqrcode, "0.1.10", "6294fece9d68ad64eef1c3c92cf111cfd6469f4fbf230a2d4cc905a682178f3f", [:mix], [], "hexpm", "da30e373c36a0fd37ab6f58664b16029919896d6c45a68a95cc4d713e81076f1"},
"erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, "erlex": {:hex, :erlex, "0.2.7", "810e8725f96ab74d17aac676e748627a07bc87eb950d2b83acd29dc047a30595", [:mix], [], "hexpm", "3ed95f79d1a844c3f6bf0cea61e0d5612a42ce56da9c03f01df538685365efb0"},
"ex_doc": {:hex, :ex_doc, "0.31.1", "8a2355ac42b1cc7b2379da9e40243f2670143721dd50748bf6c3b1184dae2089", [: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", "3178c3a407c557d8343479e1ff117a96fd31bafe52a039079593fb0524ef61b0"}, "ex_doc": {:hex, :ex_doc, "0.36.1", "4197d034f93e0b89ec79fac56e226107824adcce8d2dd0a26f5ed3a95efc36b1", [:mix], [{:earmark_parser, "~> 1.4.42", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "d7d26a7cf965dacadcd48f9fa7b5953d7d0cfa3b44fa7a65514427da44eafd89"},
"expo": {:hex, :expo, "0.5.2", "beba786aab8e3c5431813d7a44b828e7b922bfa431d6bfbada0904535342efe2", [:mix], [], "hexpm", "8c9bfa06ca017c9cb4020fabe980bc7fdb1aaec059fd004c2ab3bff03b1c599c"}, "expo": {:hex, :expo, "1.1.0", "f7b9ed7fb5745ebe1eeedf3d6f29226c5dd52897ac67c0f8af62a07e661e5c75", [:mix], [], "hexpm", "fbadf93f4700fb44c331362177bdca9eeb8097e8b0ef525c9cc501cb9917c960"},
"file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"}, "file_system": {:hex, :file_system, "1.1.0", "08d232062284546c6c34426997dd7ef6ec9f8bbd090eb91780283c9016840e8f", [:mix], [], "hexpm", "bfcf81244f416871f2a2e15c1b515287faa5db9c6bcf290222206d120b3d43f6"},
"floki": {:hex, :floki, "0.35.4", "cc947b446024732c07274ac656600c5c4dc014caa1f8fb2dfff93d275b83890d", [:mix], [], "hexpm", "27fa185d3469bd8fc5947ef0f8d5c4e47f0af02eb6b070b63c868f69e3af0204"}, "floki": {:hex, :floki, "0.37.0", "b83e0280bbc6372f2a403b2848013650b16640cd2470aea6701f0632223d719e", [:mix], [], "hexpm", "516a0c15a69f78c47dc8e0b9b3724b29608aa6619379f91b1ffa47109b5d0dd3"},
"gen_smtp": {:hex, :gen_smtp, "1.2.0", "9cfc75c72a8821588b9b9fe947ae5ab2aed95a052b81237e0928633a13276fd3", [:rebar3], [{:ranch, ">= 1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "5ee0375680bca8f20c4d85f58c2894441443a743355430ff33a783fe03296779"}, "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.24.0", "6f4d90ac5f3111673cbefc4ebee96fe5f37a114861ab8c7b7d5b30a1108ce6d8", [:mix], [{:expo, "~> 0.5.1", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "bdf75cdfcbe9e4622dd18e034b227d77dd17f0f133853a1c73b97b3d6c770e8b"}, "gettext": {:hex, :gettext, "0.26.2", "5978aa7b21fada6deabf1f6341ddba50bc69c999e812211903b169799208f2a8", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "aa978504bcf76511efdc22d580ba08e2279caab1066b76bb9aa81c4a1e0a32a5"},
"jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"}, "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"},
"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": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"},
"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_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [: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", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"},
"makeup_erlang": {:hex, :makeup_erlang, "0.1.4", "29563475afa9b8a2add1b7a9c8fb68d06ca7737648f28398e04461f008b69521", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f4ed47ecda66de70dd817698a703f8816daa91272e7e45812469498614ae8b29"}, "makeup_erlang": {:hex, :makeup_erlang, "1.0.1", "c7f58c120b2b5aa5fd80d540a89fdf866ed42f1f3994e4fe189abebeab610839", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "8a89a1eeccc2d798d6ea15496a6e4870b75e014d1af514b1b71fa33134f57814"},
"mime": {:hex, :mime, "2.0.5", "dc34c8efd439abe6ae0343edbb8556f4d63f178594894720607772a041b04b02", [:mix], [], "hexpm", "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c"}, "mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"},
"nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"}, "nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"},
"oban": {:hex, :oban, "2.17.4", "3ebe79dc0cad16f23e5feea418f9bc5b07d453b8fb7caf376d812be96157a5c5", [: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", "71a804abea3bb7e104782a5b5337cbab76c1a56b9689a6d5159a3873c93898b6"}, "oban": {:hex, :oban, "2.18.3", "1608c04f8856c108555c379f2f56bc0759149d35fa9d3b825cb8a6769f8ae926", [: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", "36ca6ca84ef6518f9c2c759ea88efd438a3c81d667ba23b02b062a0aa785475e"},
"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": {:hex, :phoenix, "1.7.18", "5310c21443514be44ed93c422e15870aef254cf1b3619e4f91538e7529d2b2e4", [: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", "1797fcc82108442a66f2c77a643a62980f342bfeb63d6c9a515ab8294870004e"},
"phoenix_ecto": {:hex, :phoenix_ecto, "4.4.3", "86e9878f833829c3f66da03d75254c155d91d72a201eb56ae83482328dc7ca93", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "d36c401206f3011fefd63d04e8ef626ec8791975d9d107f9a0817d426f61ac07"}, "phoenix_ecto": {:hex, :phoenix_ecto, "4.6.3", "f686701b0499a07f2e3b122d84d52ff8a31f5def386e03706c916f6feddf69ef", [: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]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "909502956916a657a197f94cc1206d9a65247538de8a5e186f7537c895d95764"},
"phoenix_html": {:hex, :phoenix_html, "4.0.0", "4857ec2edaccd0934a923c2b0ba526c44a173c86b847e8db725172e9e51d11d6", [:mix], [], "hexpm", "cee794a052f243291d92fa3ccabcb4c29bb8d236f655fb03bcbdc3a8214b8d13"}, "phoenix_html": {:hex, :phoenix_html, "4.2.0", "83a4d351b66f472ebcce242e4ae48af1b781866f00ef0eb34c15030d4e2069ac", [:mix], [], "hexpm", "9713b3f238d07043583a94296cc4bbdceacd3b3a6c74667f4df13971e7866ec8"},
"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_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_dashboard": {:hex, :phoenix_live_dashboard, "0.8.6", "7b1f0327f54c9eb69845fd09a77accf922f488c549a7e7b8618775eb603a62c7", [: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", "1681ab813ec26ca6915beb3414aa138f298e17721dc6a2bde9e6eb8a62360ff6"},
"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_reload": {:hex, :phoenix_live_reload, "1.5.3", "f2161c207fda0e4fb55165f650f7f8db23f02b29e3bff00ff7ef161d6ac1f09d", [: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", "b4ec9cd73cb01ff1bd1cac92e045d13e7030330b74164297d1aee3907b54803c"},
"phoenix_live_view": {:hex, :phoenix_live_view, "0.20.9", "46d5d436d3f8ff97f066b6c45528fd842a711fd3875b2d3f706b2e769ea07c51", [: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 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", "694388615ece21b70c523910cba1c633132b08a270caaf60100dd4eaf331885d"}, "phoenix_live_view": {:hex, :phoenix_live_view, "0.20.17", "f396bbdaf4ba227b82251eb75ac0afa6b3da5e509bc0d030206374237dfc9450", [: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", "a61d741ffb78c85fdbca0de084da6a48f8ceb5261a79165b5a0b59e5f65ce98b"},
"phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"}, "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"}, "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": {:hex, :plug, "1.16.1", "40c74619c12f82736d2214557dedec2e9762029b2438d6d175c5074c933edc9d", [: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", "a13ff6b9006b03d7e33874945b2755253841b238c34071ed85b0e86057f8cddc"},
"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_cowboy": {:hex, :plug_cowboy, "2.7.2", "fdadb973799ae691bf9ecad99125b16625b1c6039999da5fe544d99218e662e4", [: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", "245d8a11ee2306094840c000e8816f0cbed69a23fc0ac2bcf8d7835ae019bb2f"},
"plug_crypto": {:hex, :plug_crypto, "2.0.0", "77515cc10af06645abbfb5e6ad7a3e9714f805ae118fa1a70205f80d2d70fe73", [:mix], [], "hexpm", "53695bae57cc4e54566d993eb01074e4d894b65a3766f1c43e2c61a1b0f45ea9"}, "plug_crypto": {:hex, :plug_crypto, "2.1.0", "f44309c2b06d249c27c8d3f65cfe08158ade08418cf540fd4f72d4d6863abb7b", [:mix], [], "hexpm", "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"},
"postgrex": {:hex, :postgrex, "0.17.4", "5777781f80f53b7c431a001c8dad83ee167bcebcf3a793e3906efff680ab62b3", [: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", "6458f7d5b70652bc81c3ea759f91736c16a31be000f306d3c64bcdfe9a18b3cc"}, "postgrex": {:hex, :postgrex, "0.19.3", "a0bda6e3bc75ec07fca5b0a89bffd242ca209a4822a9533e7d3e84ee80707e19", [: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", "d31c28053655b78f47f948c85bb1cf86a9c1f8ead346ba1aa0d0df017fa05b61"},
"ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"}, "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"},
"swoosh": {:hex, :swoosh, "1.15.2", "490ea85a98e8fb5178c07039e0d8519839e38127724a58947a668c00db7574ee", [: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]}, {: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", "9f7739c02f6c7c0ca82ee397f3bfe0465dbe4c8a65372ac2a5584bf147dd5831"}, "swoosh": {:hex, :swoosh, "1.17.6", "27ff070f96246e35b7105ab1c52b2b689f523a3cb83ed9faadb2f33bd653ccba", [: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.2.3", [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.5 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9798f3e72165f40c950f6762c06dab68afcdcf616138fc4a07965c09c250e1e2"},
"table_rex": {:hex, :table_rex, "4.0.0", "3c613a68ebdc6d4d1e731bc973c233500974ec3993c99fcdabb210407b90959b", [:mix], [], "hexpm", "c35c4d5612ca49ebb0344ea10387da4d2afe278387d4019e4d8111e815df8f55"}, "table_rex": {:hex, :table_rex, "4.0.0", "3c613a68ebdc6d4d1e731bc973c233500974ec3993c99fcdabb210407b90959b", [:mix], [], "hexpm", "c35c4d5612ca49ebb0344ea10387da4d2afe278387d4019e4d8111e815df8f55"},
"telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"},
"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_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"}, "telemetry_poller": {:hex, :telemetry_poller, "1.1.0", "58fa7c216257291caaf8d05678c8d01bd45f4bdbc1286838a28c4bb62ef32999", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9eb9d9cbfd81cbd7cdd24682f8711b6e2b691289a0de6826e58452f28c103c8f"},
"websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"}, "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"}, "websock_adapter": {:hex, :websock_adapter, "0.5.8", "3b97dc94e407e2d1fc666b2fb9acf6be81a1798a2602294aac000260a7c4a47d", [: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", "315b9a1865552212b5f35140ad194e67ce31af45bcee443d4ecb96b5fd3f3782"},
} }

View File

@ -54,9 +54,9 @@ msgstr ""
msgid "Delete User" msgid "Delete User"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:47 #: lib/cannery_web/controllers/user_registration_html/new.html.heex:52
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:3 #: 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 #, elixir-autogen, elixir-format
msgid "Forgot your password?" msgid "Forgot your password?"
msgstr "" msgstr ""
@ -68,11 +68,11 @@ msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:94 #: 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_confirmation_html/new.html.heex:28
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:44 #: lib/cannery_web/controllers/user_registration_html/new.html.heex:49
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:41 #: 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_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: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 #, elixir-autogen, elixir-format
msgid "Log in" msgid "Log in"
msgstr "" msgstr ""
@ -95,10 +95,10 @@ msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:89 #: 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_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:3
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:37 #: lib/cannery_web/controllers/user_registration_html/new.html.heex:42
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:38 #: 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_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 #, elixir-autogen, elixir-format
msgid "Register" msgid "Register"
msgstr "" msgstr ""
@ -115,13 +115,13 @@ msgstr ""
msgid "Reset password" msgid "Reset password"
msgstr "" msgstr ""
#: lib/cannery_web/components/add_shot_record_component.html.heex:56 #: lib/cannery_web/components/add_shot_record_component.html.heex:57
#: lib/cannery_web/live/container_live/form_component.html.heex:55 #: lib/cannery_web/live/container_live/form_component.html.heex:59
#: lib/cannery_web/live/invite_live/form_component.html.heex:35 #: lib/cannery_web/live/invite_live/form_component.html.heex:38
#: lib/cannery_web/live/pack_live/form_component.html.heex:90 #: lib/cannery_web/live/pack_live/form_component.html.heex:110
#: lib/cannery_web/live/range_live/form_component.html.heex:44 #: lib/cannery_web/live/range_live/form_component.html.heex:45
#: lib/cannery_web/live/tag_live/form_component.html.heex:37 #: lib/cannery_web/live/tag_live/form_component.html.heex:41
#: lib/cannery_web/live/type_live/form_component.html.heex:359 #: lib/cannery_web/live/type_live/form_component.html.heex:386
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Save" msgid "Save"
msgstr "" msgstr ""
@ -131,29 +131,24 @@ msgstr ""
msgid "Send instructions to reset password" msgid "Send instructions to reset password"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:65 #: lib/cannery_web/live/container_live/show.html.heex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Why not add one?" msgid "Why not add one?"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/edit_tags_component.html.heex:51 #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:53
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Add" msgid "Add"
msgstr "" 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 #: lib/cannery_web/live/range_live/index.html.heex:13
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Why not get some ready to shoot?" msgid "Why not get some ready to shoot?"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:127 #: lib/cannery_web/live/pack_live/index.html.heex:116
#: lib/cannery_web/live/pack_live/show.html.heex:90 #: lib/cannery_web/live/pack_live/show.html.heex:84
#: lib/cannery_web/live/range_live/index.html.heex:42 #: lib/cannery_web/live/range_live/index.html.heex:54
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Record shots" msgid "Record shots"
msgstr "" msgstr ""
@ -178,7 +173,7 @@ msgstr ""
msgid "add a container first" msgid "add a container first"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/form_component.html.heex:83 #: lib/cannery_web/live/pack_live/form_component.html.heex:103
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Create" msgid "Create"
msgstr "" msgstr ""
@ -199,8 +194,8 @@ msgid "View in Catalog"
msgstr "" msgstr ""
#: lib/cannery_web/components/move_pack_component.ex:77 #: 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/index.html.heex:127
#: lib/cannery_web/live/pack_live/show.html.heex:86 #: lib/cannery_web/live/pack_live/show.html.heex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Move ammo" msgid "Move ammo"
msgstr "" msgstr ""
@ -210,14 +205,12 @@ msgstr ""
msgid "Set Unlimited" msgid "Set Unlimited"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.html.heex:82 #: lib/cannery_web/live/container_live/show.html.heex:59
#: lib/cannery_web/live/range_live/index.html.heex:38
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Stage for range" msgid "Stage for range"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.html.heex:81 #: lib/cannery_web/live/container_live/show.html.heex:58
#: lib/cannery_web/live/range_live/index.html.heex:37
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Unstage from range" msgid "Unstage from range"
msgstr "" msgstr ""
@ -227,8 +220,8 @@ msgstr ""
msgid "Export Data as JSON" msgid "Export Data as JSON"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:87 #: lib/cannery_web/live/container_live/index.html.heex:101
#: lib/cannery_web/live/container_live/index.html.heex:145 #: lib/cannery_web/live/container_live/index.html.heex:159
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Clone %{container_name}" msgid "Clone %{container_name}"
msgstr "" msgstr ""
@ -238,8 +231,8 @@ msgstr ""
msgid "Copy invite link for %{invite_name}" msgid "Copy invite link for %{invite_name}"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:104 #: lib/cannery_web/live/container_live/index.html.heex:118
#: lib/cannery_web/live/container_live/index.html.heex:162 #: lib/cannery_web/live/container_live/index.html.heex:176
#: lib/cannery_web/live/container_live/show.html.heex:48 #: lib/cannery_web/live/container_live/show.html.heex:48
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Delete %{container_name}" msgid "Delete %{container_name}"
@ -255,8 +248,8 @@ msgstr ""
msgid "Delete invite for %{invite_name}" msgid "Delete invite for %{invite_name}"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:77 #: lib/cannery_web/live/container_live/index.html.heex:91
#: lib/cannery_web/live/container_live/index.html.heex:135 #: lib/cannery_web/live/container_live/index.html.heex:149
#: lib/cannery_web/live/container_live/show.html.heex:35 #: lib/cannery_web/live/container_live/show.html.heex:35
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit %{container_name}" msgid "Edit %{container_name}"
@ -272,54 +265,56 @@ msgstr ""
msgid "Edit invite for %{invite_name}" msgid "Edit invite for %{invite_name}"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:120 #: lib/cannery_web/live/container_live/index.html.heex:69
#: lib/cannery_web/live/range_live/index.html.heex:35
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Stage" msgid "Stage"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:65 #: lib/cannery_web/live/container_live/index.html.heex:79
#: lib/cannery_web/live/container_live/index.html.heex:124 #: lib/cannery_web/live/container_live/index.html.heex:138
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Tag %{container_name}" msgid "Tag %{container_name}"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:119 #: lib/cannery_web/live/container_live/index.html.heex:68
#: lib/cannery_web/live/range_live/index.html.heex:34
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Unstage" msgid "Unstage"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:172 #: lib/cannery_web/live/pack_live/index.html.heex:161
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Clone pack of %{pack_count} bullets" msgid "Clone pack of %{pack_count} bullets"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:187 #: lib/cannery_web/live/pack_live/index.html.heex:176
#: lib/cannery_web/live/pack_live/show.html.heex:71 #: lib/cannery_web/live/pack_live/show.html.heex:71
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Delete pack of %{pack_count} bullets" msgid "Delete pack of %{pack_count} bullets"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:160 #: lib/cannery_web/live/pack_live/index.html.heex:149
#: lib/cannery_web/live/pack_live/show.html.heex:59 #: lib/cannery_web/live/pack_live/show.html.heex:59
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit pack of %{pack_count} bullets" msgid "Edit pack of %{pack_count} bullets"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:139 #: lib/cannery_web/live/container_live/show.html.heex:147
#: lib/cannery_web/live/pack_live/index.html.heex:148 #: lib/cannery_web/live/pack_live/index.html.heex:137
#: lib/cannery_web/live/type_live/show.html.heex:201 #: lib/cannery_web/live/type_live/show.html.heex:201
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "View pack of %{pack_count} bullets" msgid "View pack of %{pack_count} bullets"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:159 #: lib/cannery_web/live/pack_live/show.ex:149
#: lib/cannery_web/live/range_live/index.html.heex:154 #: lib/cannery_web/live/range_live/index.html.heex:181
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Delete shot record of %{shot_record_count} shots" msgid "Delete shot record of %{shot_record_count} shots"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:144 #: lib/cannery_web/live/pack_live/show.ex:134
#: lib/cannery_web/live/range_live/index.html.heex:137 #: lib/cannery_web/live/range_live/index.html.heex:164
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit shot record of %{shot_record_count} shots" msgid "Edit shot record of %{shot_record_count} shots"
msgstr "" msgstr ""
@ -355,3 +350,8 @@ msgstr ""
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "add a type first" msgid "add a type first"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:17
#, elixir-autogen, elixir-format
msgid "Stage containers"
msgstr ""

View File

@ -67,9 +67,9 @@ msgstr "Einladung erstellen"
msgid "Delete User" msgid "Delete User"
msgstr "Benutzer löschen" msgstr "Benutzer löschen"
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:47 #: lib/cannery_web/controllers/user_registration_html/new.html.heex:52
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:3 #: 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 #, elixir-autogen, elixir-format
msgid "Forgot your password?" msgid "Forgot your password?"
msgstr "Passwort vergessen?" msgstr "Passwort vergessen?"
@ -81,11 +81,11 @@ msgstr "Laden Sie jemanden ein!"
#: lib/cannery_web/components/core_components/topbar.html.heex:94 #: 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_confirmation_html/new.html.heex:28
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:44 #: lib/cannery_web/controllers/user_registration_html/new.html.heex:49
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:41 #: 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_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: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 #, elixir-autogen, elixir-format
msgid "Log in" msgid "Log in"
msgstr "Einloggen" msgstr "Einloggen"
@ -108,10 +108,10 @@ msgstr "Neuer Tag"
#: lib/cannery_web/components/core_components/topbar.html.heex:89 #: 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_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:3
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:37 #: lib/cannery_web/controllers/user_registration_html/new.html.heex:42
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:38 #: 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_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 #, elixir-autogen, elixir-format
msgid "Register" msgid "Register"
msgstr "Registrieren" msgstr "Registrieren"
@ -128,13 +128,13 @@ msgstr "Bestätigungsmail erneut senden"
msgid "Reset password" msgid "Reset password"
msgstr "Passwort zurücksetzen" msgstr "Passwort zurücksetzen"
#: lib/cannery_web/components/add_shot_record_component.html.heex:56 #: lib/cannery_web/components/add_shot_record_component.html.heex:57
#: lib/cannery_web/live/container_live/form_component.html.heex:55 #: lib/cannery_web/live/container_live/form_component.html.heex:59
#: lib/cannery_web/live/invite_live/form_component.html.heex:35 #: lib/cannery_web/live/invite_live/form_component.html.heex:38
#: lib/cannery_web/live/pack_live/form_component.html.heex:90 #: lib/cannery_web/live/pack_live/form_component.html.heex:110
#: lib/cannery_web/live/range_live/form_component.html.heex:44 #: lib/cannery_web/live/range_live/form_component.html.heex:45
#: lib/cannery_web/live/tag_live/form_component.html.heex:37 #: lib/cannery_web/live/tag_live/form_component.html.heex:41
#: lib/cannery_web/live/type_live/form_component.html.heex:359 #: lib/cannery_web/live/type_live/form_component.html.heex:386
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Save" msgid "Save"
msgstr "Speichern" msgstr "Speichern"
@ -144,29 +144,24 @@ msgstr "Speichern"
msgid "Send instructions to reset password" msgid "Send instructions to reset password"
msgstr "Anleitung zum Passwort zurücksetzen zusenden" msgstr "Anleitung zum Passwort zurücksetzen zusenden"
#: lib/cannery_web/live/container_live/show.html.heex:65 #: lib/cannery_web/live/container_live/show.html.heex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Why not add one?" msgid "Why not add one?"
msgstr "Warum fügen Sie keine hinzu?" msgstr "Warum fügen Sie keine hinzu?"
#: lib/cannery_web/live/container_live/edit_tags_component.html.heex:51 #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:53
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Add" msgid "Add"
msgstr "Hinzufügen" msgstr "Hinzufügen"
#: lib/cannery_web/live/range_live/index.html.heex:17
#, elixir-autogen, elixir-format
msgid "Stage ammo"
msgstr "Munition markieren"
#: lib/cannery_web/live/range_live/index.html.heex:13 #: lib/cannery_web/live/range_live/index.html.heex:13
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Why not get some ready to shoot?" msgid "Why not get some ready to shoot?"
msgstr "Warum nicht einige für den Schießstand auswählen?" msgstr "Warum nicht einige für den Schießstand auswählen?"
#: lib/cannery_web/live/pack_live/index.html.heex:127 #: lib/cannery_web/live/pack_live/index.html.heex:116
#: lib/cannery_web/live/pack_live/show.html.heex:90 #: lib/cannery_web/live/pack_live/show.html.heex:84
#: lib/cannery_web/live/range_live/index.html.heex:42 #: lib/cannery_web/live/range_live/index.html.heex:54
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Record shots" msgid "Record shots"
msgstr "Schüsse dokumentieren" msgstr "Schüsse dokumentieren"
@ -191,7 +186,7 @@ msgstr "In die Zwischenablage kopieren"
msgid "add a container first" msgid "add a container first"
msgstr "Zuerst einen Behälter hinzufügen" msgstr "Zuerst einen Behälter hinzufügen"
#: lib/cannery_web/live/pack_live/form_component.html.heex:83 #: lib/cannery_web/live/pack_live/form_component.html.heex:103
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Create" msgid "Create"
msgstr "Erstellen" msgstr "Erstellen"
@ -212,8 +207,8 @@ msgid "View in Catalog"
msgstr "" msgstr ""
#: lib/cannery_web/components/move_pack_component.ex:77 #: 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/index.html.heex:127
#: lib/cannery_web/live/pack_live/show.html.heex:86 #: lib/cannery_web/live/pack_live/show.html.heex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Move ammo" msgid "Move ammo"
msgstr "" msgstr ""
@ -223,14 +218,12 @@ msgstr ""
msgid "Set Unlimited" msgid "Set Unlimited"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.html.heex:82 #: lib/cannery_web/live/container_live/show.html.heex:59
#: lib/cannery_web/live/range_live/index.html.heex:38
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Stage for range" msgid "Stage for range"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.html.heex:81 #: lib/cannery_web/live/container_live/show.html.heex:58
#: lib/cannery_web/live/range_live/index.html.heex:37
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Unstage from range" msgid "Unstage from range"
msgstr "" msgstr ""
@ -240,8 +233,8 @@ msgstr ""
msgid "Export Data as JSON" msgid "Export Data as JSON"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:87 #: lib/cannery_web/live/container_live/index.html.heex:101
#: lib/cannery_web/live/container_live/index.html.heex:145 #: lib/cannery_web/live/container_live/index.html.heex:159
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Clone %{container_name}" msgid "Clone %{container_name}"
msgstr "" msgstr ""
@ -251,8 +244,8 @@ msgstr ""
msgid "Copy invite link for %{invite_name}" msgid "Copy invite link for %{invite_name}"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:104 #: lib/cannery_web/live/container_live/index.html.heex:118
#: lib/cannery_web/live/container_live/index.html.heex:162 #: lib/cannery_web/live/container_live/index.html.heex:176
#: lib/cannery_web/live/container_live/show.html.heex:48 #: lib/cannery_web/live/container_live/show.html.heex:48
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Delete %{container_name}" msgid "Delete %{container_name}"
@ -268,8 +261,8 @@ msgstr ""
msgid "Delete invite for %{invite_name}" msgid "Delete invite for %{invite_name}"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:77 #: lib/cannery_web/live/container_live/index.html.heex:91
#: lib/cannery_web/live/container_live/index.html.heex:135 #: lib/cannery_web/live/container_live/index.html.heex:149
#: lib/cannery_web/live/container_live/show.html.heex:35 #: lib/cannery_web/live/container_live/show.html.heex:35
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit %{container_name}" msgid "Edit %{container_name}"
@ -285,54 +278,56 @@ msgstr ""
msgid "Edit invite for %{invite_name}" msgid "Edit invite for %{invite_name}"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:120 #: lib/cannery_web/live/container_live/index.html.heex:69
#: lib/cannery_web/live/range_live/index.html.heex:35
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Stage" msgid "Stage"
msgstr "Munition markieren" msgstr "Munition markieren"
#: lib/cannery_web/live/container_live/index.html.heex:65 #: lib/cannery_web/live/container_live/index.html.heex:79
#: lib/cannery_web/live/container_live/index.html.heex:124 #: lib/cannery_web/live/container_live/index.html.heex:138
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Tag %{container_name}" msgid "Tag %{container_name}"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:119 #: lib/cannery_web/live/container_live/index.html.heex:68
#: lib/cannery_web/live/range_live/index.html.heex:34
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Unstage" msgid "Unstage"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:172 #: lib/cannery_web/live/pack_live/index.html.heex:161
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Clone pack of %{pack_count} bullets" msgid "Clone pack of %{pack_count} bullets"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:187 #: lib/cannery_web/live/pack_live/index.html.heex:176
#: lib/cannery_web/live/pack_live/show.html.heex:71 #: lib/cannery_web/live/pack_live/show.html.heex:71
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Delete pack of %{pack_count} bullets" msgid "Delete pack of %{pack_count} bullets"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:160 #: lib/cannery_web/live/pack_live/index.html.heex:149
#: lib/cannery_web/live/pack_live/show.html.heex:59 #: lib/cannery_web/live/pack_live/show.html.heex:59
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Edit pack of %{pack_count} bullets" msgid "Edit pack of %{pack_count} bullets"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:139 #: lib/cannery_web/live/container_live/show.html.heex:147
#: lib/cannery_web/live/pack_live/index.html.heex:148 #: lib/cannery_web/live/pack_live/index.html.heex:137
#: lib/cannery_web/live/type_live/show.html.heex:201 #: lib/cannery_web/live/type_live/show.html.heex:201
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "View pack of %{pack_count} bullets" msgid "View pack of %{pack_count} bullets"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:159 #: lib/cannery_web/live/pack_live/show.ex:149
#: lib/cannery_web/live/range_live/index.html.heex:154 #: lib/cannery_web/live/range_live/index.html.heex:181
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Delete shot record of %{shot_record_count} shots" msgid "Delete shot record of %{shot_record_count} shots"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:144 #: lib/cannery_web/live/pack_live/show.ex:134
#: lib/cannery_web/live/range_live/index.html.heex:137 #: lib/cannery_web/live/range_live/index.html.heex:164
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Edit shot record of %{shot_record_count} shots" msgid "Edit shot record of %{shot_record_count} shots"
msgstr "" msgstr ""
@ -368,3 +363,8 @@ msgstr ""
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "add a type first" msgid "add a type first"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:17
#, elixir-autogen, elixir-format
msgid "Stage containers"
msgstr ""

View File

@ -38,55 +38,55 @@ msgstr "Admins:"
msgid "Ammo" msgid "Ammo"
msgstr "Munition" msgstr "Munition"
#: lib/cannery_web/live/tag_live/form_component.html.heex:25 #: lib/cannery_web/live/tag_live/form_component.html.heex:29
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Background color" msgid "Background color"
msgstr "Hintergrundfarbe" msgstr "Hintergrundfarbe"
#: lib/cannery_web/components/type_table_component.ex:86 #: lib/cannery_web/components/type_table_component.ex:86
#: lib/cannery_web/live/type_live/form_component.html.heex:333 #: lib/cannery_web/live/type_live/form_component.html.heex:358
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Blank" msgid "Blank"
msgstr "Knallpatrone" msgstr "Knallpatrone"
#: lib/cannery_web/live/type_live/form_component.html.heex:180 #: lib/cannery_web/live/type_live/form_component.html.heex:195
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Brass" msgid "Brass"
msgstr "Messing" msgstr "Messing"
#: lib/cannery_web/components/type_table_component.ex:61 #: lib/cannery_web/components/type_table_component.ex:61
#: lib/cannery_web/live/type_live/form_component.html.heex:151 #: lib/cannery_web/live/type_live/form_component.html.heex:163
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Bullet core" msgid "Bullet core"
msgstr "Projektilkern" msgstr "Projektilkern"
#: lib/cannery_web/components/type_table_component.ex:59 #: lib/cannery_web/components/type_table_component.ex:59
#: lib/cannery_web/live/type_live/form_component.html.heex:125 #: lib/cannery_web/live/type_live/form_component.html.heex:136
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Bullet type" msgid "Bullet type"
msgstr "Patronenart" msgstr "Patronenart"
#: lib/cannery_web/components/type_table_component.ex:51 #: lib/cannery_web/components/type_table_component.ex:51
#: lib/cannery_web/live/type_live/form_component.html.heex:67 #: lib/cannery_web/live/type_live/form_component.html.heex:74
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Caliber" msgid "Caliber"
msgstr "Kaliber" msgstr "Kaliber"
#: lib/cannery_web/components/type_table_component.ex:49 #: lib/cannery_web/components/type_table_component.ex:49
#: lib/cannery_web/live/type_live/form_component.html.heex:51 #: lib/cannery_web/live/type_live/form_component.html.heex:57
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Cartridge" msgid "Cartridge"
msgstr "Patrone" msgstr "Patrone"
#: lib/cannery_web/components/type_table_component.ex:66 #: lib/cannery_web/components/type_table_component.ex:66
#: lib/cannery_web/live/type_live/form_component.html.heex:174 #: lib/cannery_web/live/type_live/form_component.html.heex:188
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Case material" msgid "Case material"
msgstr "Gehäusematerial" msgstr "Gehäusematerial"
#: lib/cannery_web/components/move_pack_component.ex:64 #: lib/cannery_web/components/move_pack_component.ex:64
#: lib/cannery_web/components/pack_table_component.ex:76 #: lib/cannery_web/components/pack_table_component.ex:76
#: lib/cannery_web/live/pack_live/form_component.html.heex:65 #: lib/cannery_web/live/pack_live/form_component.html.heex:84
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Container" msgid "Container"
msgstr "Behälter" msgstr "Behälter"
@ -100,13 +100,13 @@ msgid "Containers"
msgstr "Behälter" msgstr "Behälter"
#: lib/cannery_web/components/type_table_component.ex:87 #: lib/cannery_web/components/type_table_component.ex:87
#: lib/cannery_web/live/type_live/form_component.html.heex:337 #: lib/cannery_web/live/type_live/form_component.html.heex:362
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Corrosive" msgid "Corrosive"
msgstr "Korrosiv" msgstr "Korrosiv"
#: lib/cannery_web/components/pack_table_component.ex:104 #: lib/cannery_web/components/pack_table_component.ex:104
#: lib/cannery_web/live/pack_live/form_component.html.heex:28 #: lib/cannery_web/live/pack_live/form_component.html.heex:45
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Count" msgid "Count"
msgstr "Anzahl" msgstr "Anzahl"
@ -117,9 +117,9 @@ msgstr "Anzahl"
msgid "Count:" msgid "Count:"
msgstr "Anzahl:" msgstr "Anzahl:"
#: lib/cannery_web/components/container_table_component.ex:46 #: lib/cannery_web/components/container_table_component.ex:50
#: lib/cannery_web/live/container_live/form_component.html.heex:29 #: lib/cannery_web/live/container_live/form_component.html.heex:30
#: lib/cannery_web/live/type_live/form_component.html.heex:38 #: lib/cannery_web/live/type_live/form_component.html.heex:43
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Description" msgid "Description"
msgstr "Beschreibung" msgstr "Beschreibung"
@ -145,19 +145,19 @@ msgstr "Einladung bearbeiten"
msgid "Edit Tag" msgid "Edit Tag"
msgstr "Tag bearbeiten" msgstr "Tag bearbeiten"
#: lib/cannery_web/live/type_live/form_component.html.heex:139 #: lib/cannery_web/live/type_live/form_component.html.heex:151
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "FMJ" msgid "FMJ"
msgstr "VM" msgstr "VM"
#: lib/cannery_web/components/type_table_component.ex:58 #: lib/cannery_web/components/type_table_component.ex:58
#: lib/cannery_web/live/type_live/form_component.html.heex:115 #: lib/cannery_web/live/type_live/form_component.html.heex:126
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Grains" msgid "Grains"
msgstr "Körner" msgstr "Körner"
#: lib/cannery_web/components/type_table_component.ex:85 #: lib/cannery_web/components/type_table_component.ex:85
#: lib/cannery_web/live/type_live/form_component.html.heex:329 #: lib/cannery_web/live/type_live/form_component.html.heex:354
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Incendiary" msgid "Incendiary"
msgstr "Brandmunition" msgstr "Brandmunition"
@ -184,14 +184,14 @@ msgstr "Nur mit Einladung"
msgid "Invites" msgid "Invites"
msgstr "Einladungen" 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 #, elixir-autogen, elixir-format
msgid "Keep me logged in for 60 days" msgid "Keep me logged in for 60 days"
msgstr "Für 60 Tage eingeloggt bleiben" msgstr "Für 60 Tage eingeloggt bleiben"
#: lib/cannery_web/components/container_table_component.ex:47 #: lib/cannery_web/components/container_table_component.ex:51
#: lib/cannery_web/components/move_pack_component.ex:66 #: lib/cannery_web/components/move_pack_component.ex:66
#: lib/cannery_web/live/container_live/form_component.html.heex:46 #: lib/cannery_web/live/container_live/form_component.html.heex:49
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Location" msgid "Location"
msgstr "Standort" msgstr "Standort"
@ -202,34 +202,34 @@ msgstr "Standort"
msgid "Location:" msgid "Location:"
msgstr "Standort:" msgstr "Standort:"
#: lib/cannery_web/live/container_live/form_component.html.heex:41 #: lib/cannery_web/live/container_live/form_component.html.heex:45
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Magazine, Clip, Ammo Box, etc" msgid "Magazine, Clip, Ammo Box, etc"
msgstr "Magazin, Ladestreifen, Munitionskiste usw." msgstr "Magazin, Ladestreifen, Munitionskiste usw."
#: lib/cannery_web/components/type_table_component.ex:88 #: lib/cannery_web/components/type_table_component.ex:88
#: lib/cannery_web/live/type_live/form_component.html.heex:342 #: lib/cannery_web/live/type_live/form_component.html.heex:367
#: lib/cannery_web/live/type_live/form_component.html.heex:345 #: lib/cannery_web/live/type_live/form_component.html.heex:370
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Manufacturer" msgid "Manufacturer"
msgstr "Hersteller" msgstr "Hersteller"
#: lib/cannery_web/live/container_live/form_component.html.heex:33 #: lib/cannery_web/live/container_live/form_component.html.heex:36
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Metal ammo can with the anime girl sticker" msgid "Metal ammo can with the anime girl sticker"
msgstr "Metallene Munitionskiste mit Anime-Girl-Sticker" msgstr "Metallene Munitionskiste mit Anime-Girl-Sticker"
#: lib/cannery_web/live/container_live/form_component.html.heex:24 #: lib/cannery_web/live/container_live/form_component.html.heex:26
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "My cool ammo can" msgid "My cool ammo can"
msgstr "Meine coole Munitionskiste" msgstr "Meine coole Munitionskiste"
#: lib/cannery_web/components/container_table_component.ex:45 #: lib/cannery_web/components/container_table_component.ex:49
#: lib/cannery_web/components/type_table_component.ex:152 #: lib/cannery_web/components/type_table_component.ex:152
#: lib/cannery_web/live/container_live/form_component.html.heex:21 #: lib/cannery_web/live/container_live/form_component.html.heex:21
#: lib/cannery_web/live/invite_live/form_component.html.heex:21 #: lib/cannery_web/live/invite_live/form_component.html.heex:21
#: lib/cannery_web/live/tag_live/form_component.html.heex:21 #: lib/cannery_web/live/tag_live/form_component.html.heex:21
#: lib/cannery_web/live/type_live/form_component.html.heex:31 #: lib/cannery_web/live/type_live/form_component.html.heex:35
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Name" msgid "Name"
msgstr "Name" msgstr "Name"
@ -280,8 +280,8 @@ msgstr "Keine Tags"
#: lib/cannery_web/components/add_shot_record_component.html.heex:38 #: lib/cannery_web/components/add_shot_record_component.html.heex:38
#: lib/cannery_web/components/shot_record_table_component.ex:46 #: lib/cannery_web/components/shot_record_table_component.ex:46
#: lib/cannery_web/live/pack_live/form_component.html.heex:57 #: lib/cannery_web/live/pack_live/form_component.html.heex:75
#: lib/cannery_web/live/pack_live/show.ex:90 #: lib/cannery_web/live/pack_live/show.ex:80
#: lib/cannery_web/live/range_live/form_component.html.heex:30 #: lib/cannery_web/live/range_live/form_component.html.heex:30
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Notes" msgid "Notes"
@ -293,19 +293,19 @@ msgstr "Bemerkungen"
msgid "Notes:" msgid "Notes:"
msgstr "Bemerkungen:" msgstr "Bemerkungen:"
#: lib/cannery_web/live/container_live/form_component.html.heex:50 #: lib/cannery_web/live/container_live/form_component.html.heex:55
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "On the bookshelf" msgid "On the bookshelf"
msgstr "Auf dem Bücherregal" msgstr "Auf dem Bücherregal"
#: lib/cannery_web/components/type_table_component.ex:79 #: lib/cannery_web/components/type_table_component.ex:79
#: lib/cannery_web/live/type_live/form_component.html.heex:266 #: lib/cannery_web/live/type_live/form_component.html.heex:287
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Pressure" msgid "Pressure"
msgstr "Druck" msgstr "Druck"
#: lib/cannery_web/components/pack_table_component.ex:92 #: lib/cannery_web/components/pack_table_component.ex:92
#: lib/cannery_web/live/pack_live/form_component.html.heex:35 #: lib/cannery_web/live/pack_live/form_component.html.heex:52
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Price paid" msgid "Price paid"
msgstr "Kaufpreis" msgstr "Kaufpreis"
@ -316,7 +316,7 @@ msgid "Price paid:"
msgstr "Kaufpreis:" msgstr "Kaufpreis:"
#: lib/cannery_web/components/type_table_component.ex:82 #: lib/cannery_web/components/type_table_component.ex:82
#: lib/cannery_web/live/type_live/form_component.html.heex:305 #: lib/cannery_web/live/type_live/form_component.html.heex:328
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Primer type" msgid "Primer type"
msgstr "Zündertyp" msgstr "Zündertyp"
@ -338,7 +338,7 @@ msgstr ""
"Hosten Sie Ihre eigene Instanz oder verwenden Sie eine Instanz, der Sie " "Hosten Sie Ihre eigene Instanz oder verwenden Sie eine Instanz, der Sie "
"vertrauen." "vertrauen."
#: lib/cannery_web/controllers/user_settings_controller.ex:10 #: lib/cannery_web/controllers/user_settings_controller.ex:9
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:3 #: lib/cannery_web/controllers/user_settings_html/edit.html.heex:3
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Settings" msgid "Settings"
@ -349,17 +349,17 @@ msgstr "Einstellungen"
msgid "Simple:" msgid "Simple:"
msgstr "Einfach:" msgstr "Einfach:"
#: lib/cannery_web/live/type_live/form_component.html.heex:158 #: lib/cannery_web/live/type_live/form_component.html.heex:171
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Steel" msgid "Steel"
msgstr "Stahl" msgstr "Stahl"
#: lib/cannery_web/live/pack_live/show.html.heex:100 #: lib/cannery_web/live/pack_live/show.html.heex:94
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Stored in" msgid "Stored in"
msgstr "Gelagert in" msgstr "Gelagert in"
#: lib/cannery_web/components/container_table_component.ex:66 #: lib/cannery_web/components/container_table_component.ex:73
#: lib/cannery_web/components/core_components/topbar.html.heex:28 #: lib/cannery_web/components/core_components/topbar.html.heex:28
#: lib/cannery_web/live/tag_live/index.ex:43 #: lib/cannery_web/live/tag_live/index.ex:43
#: lib/cannery_web/live/tag_live/index.ex:53 #: lib/cannery_web/live/tag_live/index.ex:53
@ -373,7 +373,7 @@ msgstr "Tags"
msgid "Tags can be added to your containers to help you organize" msgid "Tags can be added to your containers to help you organize"
msgstr "Tags können zur besseren Ordnung einem Behälter hinzugefügt werden" msgstr "Tags können zur besseren Ordnung einem Behälter hinzugefügt werden"
#: lib/cannery_web/live/tag_live/form_component.html.heex:31 #: lib/cannery_web/live/tag_live/form_component.html.heex:35
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Text color" msgid "Text color"
msgstr "Textfarbe" msgstr "Textfarbe"
@ -384,16 +384,16 @@ msgid "The self-hosted firearm tracker website"
msgstr "Die selbst-gehostete Website zur Verwaltung von Schusswaffen" msgstr "Die selbst-gehostete Website zur Verwaltung von Schusswaffen"
#: lib/cannery_web/components/type_table_component.ex:84 #: lib/cannery_web/components/type_table_component.ex:84
#: lib/cannery_web/live/type_live/form_component.html.heex:325 #: lib/cannery_web/live/type_live/form_component.html.heex:350
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Tracer" msgid "Tracer"
msgstr "Leuchtspur" msgstr "Leuchtspur"
#: lib/cannery_web/components/container_table_component.ex:48 #: lib/cannery_web/components/container_table_component.ex:52
#: lib/cannery_web/components/move_pack_component.ex:65 #: lib/cannery_web/components/move_pack_component.ex:65
#: lib/cannery_web/components/pack_table_component.ex:108 #: lib/cannery_web/components/pack_table_component.ex:108
#: lib/cannery_web/live/container_live/form_component.html.heex:38 #: lib/cannery_web/live/container_live/form_component.html.heex:40
#: lib/cannery_web/live/pack_live/form_component.html.heex:22 #: lib/cannery_web/live/pack_live/form_component.html.heex:37
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Type" msgid "Type"
msgstr "Art" msgstr "Art"
@ -409,7 +409,7 @@ msgstr "Art:"
msgid "Users" msgid "Users"
msgstr "Benutzer" msgstr "Benutzer"
#: lib/cannery_web/live/invite_live/form_component.html.heex:28 #: lib/cannery_web/live/invite_live/form_component.html.heex:31
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Uses left" msgid "Uses left"
msgstr "Verbleibende Nutzung" msgstr "Verbleibende Nutzung"
@ -419,15 +419,16 @@ msgstr "Verbleibende Nutzung"
msgid "Your data stays with you, period" msgid "Your data stays with you, period"
msgstr "Ihre Daten bleiben bei Ihnen, Punkt" msgstr "Ihre Daten bleiben bei Ihnen, Punkt"
#: lib/cannery_web/live/container_live/show.html.heex:60 #: lib/cannery_web/live/container_live/show.html.heex:68
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No tags for this container" msgid "No tags for this container"
msgstr "Keine Tags für diesen Behälter" msgstr "Keine Tags für diesen Behälter"
#: lib/cannery_web/components/container_table_component.ex:77
#: lib/cannery_web/components/core_components/topbar.html.heex:48 #: lib/cannery_web/components/core_components/topbar.html.heex:48
#: lib/cannery_web/components/pack_table_component.ex:80 #: 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:76
#: lib/cannery_web/live/range_live/index.ex:65 #: lib/cannery_web/live/range_live/index.ex:86
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Range" msgid "Range"
msgstr "Schießplatz" msgstr "Schießplatz"
@ -437,10 +438,10 @@ msgstr "Schießplatz"
msgid "Range day" msgid "Range day"
msgstr "Range Day" msgstr "Range Day"
#: lib/cannery_web/components/add_shot_record_component.html.heex:48 #: lib/cannery_web/components/add_shot_record_component.html.heex:49
#: lib/cannery_web/components/shot_record_table_component.ex:47 #: lib/cannery_web/components/shot_record_table_component.ex:47
#: lib/cannery_web/live/pack_live/show.ex:91 #: lib/cannery_web/live/pack_live/show.ex:81
#: lib/cannery_web/live/range_live/form_component.html.heex:40 #: lib/cannery_web/live/range_live/form_component.html.heex:41
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Date" msgid "Date"
msgstr "Datum" msgstr "Datum"
@ -450,26 +451,21 @@ msgstr "Datum"
msgid "Shots fired" msgid "Shots fired"
msgstr "Schüsse abgegeben" msgstr "Schüsse abgegeben"
#: lib/cannery_web/live/range_live/index.html.heex:8
#, elixir-autogen, elixir-format
msgid "No ammo staged"
msgstr "Keine Munition selektiert"
#: lib/cannery_web/components/add_shot_record_component.html.heex:3 #: lib/cannery_web/components/add_shot_record_component.html.heex:3
#: lib/cannery_web/live/pack_live/index.ex:35 #: lib/cannery_web/live/pack_live/index.ex:35
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Record shots" msgid "Record shots"
msgstr "Schüsse dokumentieren" msgstr "Schüsse dokumentieren"
#: lib/cannery_web/live/range_live/index.html.heex:52 #: lib/cannery_web/live/range_live/index.html.heex:64
#: lib/cannery_web/live/range_live/index.html.heex:121 #: lib/cannery_web/live/range_live/index.html.heex:148
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No shots recorded" msgid "No shots recorded"
msgstr "Keine Schüsse dokumentiert" msgstr "Keine Schüsse dokumentiert"
#: lib/cannery_web/components/shot_record_table_component.ex:45 #: lib/cannery_web/components/shot_record_table_component.ex:45
#: lib/cannery_web/live/pack_live/show.ex:89 #: lib/cannery_web/live/pack_live/show.ex:79
#: lib/cannery_web/live/range_live/index.html.heex:66 #: lib/cannery_web/live/range_live/index.html.heex:78
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Rounds shot" msgid "Rounds shot"
msgstr "Patronen abgefeuert" msgstr "Patronen abgefeuert"
@ -484,7 +480,7 @@ msgstr "Munition verschieben"
msgid "No other containers" msgid "No other containers"
msgstr "Kein weiterer Behälter" msgstr "Kein weiterer Behälter"
#: lib/cannery_web/live/range_live/index.html.heex:57 #: lib/cannery_web/live/range_live/index.html.heex:69
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot log" msgid "Shot log"
msgstr "Schießkladde" msgstr "Schießkladde"
@ -492,7 +488,7 @@ msgstr "Schießkladde"
#: lib/cannery_web/components/core_components/pack_card.html.heex:42 #: 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/core_components/pack_card.html.heex:47
#: lib/cannery_web/components/pack_table_component.ex:181 #: lib/cannery_web/components/pack_table_component.ex:181
#: lib/cannery_web/components/pack_table_component.ex:264 #: lib/cannery_web/components/pack_table_component.ex:263
#: lib/cannery_web/components/type_table_component.ex:273 #: 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:37
#: lib/cannery_web/live/pack_live/show.html.heex:42 #: lib/cannery_web/live/pack_live/show.html.heex:42
@ -501,36 +497,36 @@ msgstr "Schießkladde"
msgid "$%{amount}" msgid "$%{amount}"
msgstr "$%{amount}" msgstr "$%{amount}"
#: lib/cannery_web/live/type_live/form_component.html.heex:167 #: lib/cannery_web/live/type_live/form_component.html.heex:181
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Bimetal" msgid "Bimetal"
msgstr "Bimetall" msgstr "Bimetall"
#: lib/cannery_web/components/type_table_component.ex:65 #: lib/cannery_web/components/type_table_component.ex:65
#: lib/cannery_web/live/type_live/form_component.html.heex:163 #: lib/cannery_web/live/type_live/form_component.html.heex:176
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Jacket type" msgid "Jacket type"
msgstr "Patronenhülse" msgstr "Patronenhülse"
#: lib/cannery_web/components/type_table_component.ex:81 #: lib/cannery_web/components/type_table_component.ex:81
#: lib/cannery_web/live/type_live/form_component.html.heex:288 #: lib/cannery_web/live/type_live/form_component.html.heex:311
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Muzzle velocity" msgid "Muzzle velocity"
msgstr "Mündungsgeschwindigkeit" msgstr "Mündungsgeschwindigkeit"
#: lib/cannery_web/components/type_table_component.ex:75 #: lib/cannery_web/components/type_table_component.ex:75
#: lib/cannery_web/live/type_live/form_component.html.heex:253 #: lib/cannery_web/live/type_live/form_component.html.heex:274
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Powder grains per charge" msgid "Powder grains per charge"
msgstr "Pulverkörner pro Ladung" msgstr "Pulverkörner pro Ladung"
#: lib/cannery_web/components/type_table_component.ex:73 #: lib/cannery_web/components/type_table_component.ex:73
#: lib/cannery_web/live/type_live/form_component.html.heex:245 #: lib/cannery_web/live/type_live/form_component.html.heex:265
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Powder type" msgid "Powder type"
msgstr "Pulverart" msgstr "Pulverart"
#: lib/cannery_web/live/type_live/form_component.html.heex:352 #: lib/cannery_web/live/type_live/form_component.html.heex:378
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "UPC" msgid "UPC"
msgstr "UPC" msgstr "UPC"
@ -554,24 +550,24 @@ msgid "New password"
msgstr "Neues Passwort" msgstr "Neues Passwort"
#: lib/cannery_web/components/type_table_component.ex:83 #: lib/cannery_web/components/type_table_component.ex:83
#: lib/cannery_web/live/type_live/form_component.html.heex:313 #: lib/cannery_web/live/type_live/form_component.html.heex:337
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Firing type" msgid "Firing type"
msgstr "Patronenhülsenform" 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 #, elixir-autogen, elixir-format
msgid "Reconnecting..." msgid "Reconnecting..."
msgstr "Neu verbinden..." msgstr "Neu verbinden..."
#: lib/cannery_web/live/container_live/index.ex:28 #: lib/cannery_web/live/container_live/index.ex:28
#: lib/cannery_web/live/container_live/show.ex:118 #: lib/cannery_web/live/container_live/show.ex:130
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit %{name}" msgid "Edit %{name}"
msgstr "%{name} bearbeiten" msgstr "%{name} bearbeiten"
#: lib/cannery_web/live/container_live/index.ex:63 #: lib/cannery_web/live/container_live/index.ex:63
#: lib/cannery_web/live/container_live/show.ex:119 #: lib/cannery_web/live/container_live/show.ex:131
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit %{name} tags" msgid "Edit %{name} tags"
msgstr "Editiere %{name} Tags" msgstr "Editiere %{name} Tags"
@ -584,7 +580,7 @@ msgid "Rounds:"
msgstr "Patronen:" msgstr "Patronen:"
#: lib/cannery_web/components/pack_table_component.ex:178 #: lib/cannery_web/components/pack_table_component.ex:178
#: lib/cannery_web/components/pack_table_component.ex:260 #: lib/cannery_web/components/pack_table_component.ex:259
#: lib/cannery_web/components/type_table_component.ex:272 #: lib/cannery_web/components/type_table_component.ex:272
#: lib/cannery_web/live/type_live/show.html.heex:154 #: lib/cannery_web/live/type_live/show.html.heex:154
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -616,12 +612,12 @@ msgstr "Ursprüngliche Anzahl:"
msgid "Percentage left:" msgid "Percentage left:"
msgstr "Prozent verbleibend:" msgstr "Prozent verbleibend:"
#: lib/cannery_web/live/pack_live/show.html.heex:113 #: lib/cannery_web/live/pack_live/show.html.heex:107
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Rounds used" msgid "Rounds used"
msgstr "Patronen verbraucht" msgstr "Patronen verbraucht"
#: lib/cannery_web/controllers/user_confirmation_controller.ex:8 #: lib/cannery_web/controllers/user_confirmation_controller.ex:6
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Confirm your account" msgid "Confirm your account"
msgstr "Bestätigen Sie ihr Nutzerkonto" msgstr "Bestätigen Sie ihr Nutzerkonto"
@ -636,7 +632,7 @@ msgstr "Passwort vergessen?"
msgid "Log in" msgid "Log in"
msgstr "Einloggen" msgstr "Einloggen"
#: lib/cannery_web/controllers/user_registration_controller.ex:32 #: lib/cannery_web/controllers/user_registration_controller.ex:31
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Register" msgid "Register"
msgstr "Registrieren" msgstr "Registrieren"
@ -647,13 +643,13 @@ msgid "Reset your password"
msgstr "Passwort zurücksetzen" msgstr "Passwort zurücksetzen"
#: lib/cannery_web/live/pack_live/show.ex:40 #: 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:52
#: lib/cannery_web/live/range_live/index.ex:47 #: lib/cannery_web/live/range_live/index.ex:68
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Record Shots" msgid "Record Shots"
msgstr "Schüsse dokumentieren" msgstr "Schüsse dokumentieren"
#: lib/cannery_web/live/pack_live/form_component.html.heex:75 #: lib/cannery_web/live/pack_live/form_component.html.heex:96
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Copies" msgid "Copies"
msgstr "Kopien" msgstr "Kopien"
@ -663,22 +659,6 @@ msgstr "Kopien"
msgid "Added on:" msgid "Added on:"
msgstr "Hinzugefügt am:" msgstr "Hinzugefügt am:"
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:32
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:127
#, elixir-autogen, elixir-format
msgid "English"
msgstr "Englisch"
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:129
#, elixir-autogen, elixir-format
msgid "French"
msgstr "Französisch"
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:128
#, elixir-autogen, elixir-format
msgid "German"
msgstr "Deutsch"
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:28 #: lib/cannery_web/controllers/user_registration_html/new.html.heex:28
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Language" msgid "Language"
@ -722,7 +702,7 @@ msgstr "Munitionstyp bearbeiten"
msgid "Move Ammo" msgid "Move Ammo"
msgstr "Munition verschieben" msgstr "Munition verschieben"
#: lib/cannery_web/live/container_live/show.html.heex:117 #: lib/cannery_web/live/container_live/show.html.heex:125
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "No ammo in this container" msgid "No ammo in this container"
msgstr "Keine Munitionsgruppe in diesem Behälter" msgstr "Keine Munitionsgruppe in diesem Behälter"
@ -732,7 +712,7 @@ msgstr "Keine Munitionsgruppe in diesem Behälter"
msgid "Show Ammo" msgid "Show Ammo"
msgstr "Zeige Munitionsarten" msgstr "Zeige Munitionsarten"
#: lib/cannery_web/live/pack_live/show.html.heex:105 #: lib/cannery_web/live/pack_live/show.html.heex:99
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "This ammo is not in a container" msgid "This ammo is not in a container"
msgstr "Diese Munitionsgruppe ist nicht in einem Behälter" msgstr "Diese Munitionsgruppe ist nicht in einem Behälter"
@ -755,7 +735,7 @@ msgstr ""
msgid "isn't he cute >:3" msgid "isn't he cute >:3"
msgstr "" msgstr ""
#: lib/cannery_web/live/invite_live/form_component.html.heex:32 #: lib/cannery_web/live/invite_live/form_component.html.heex:35
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Leave \"Uses left\" blank to make invite unlimited" msgid "Leave \"Uses left\" blank to make invite unlimited"
msgstr "" msgstr ""
@ -772,31 +752,31 @@ msgstr "Behälter"
msgid "Show used" msgid "Show used"
msgstr "" msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:219 #: lib/cannery_web/components/pack_table_component.ex:218
#: lib/cannery_web/live/pack_live/show.html.heex:19 #: lib/cannery_web/live/pack_live/show.html.heex:19
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{percentage}%" msgid "%{percentage}%"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.ex:153 #: lib/cannery_web/live/range_live/index.ex:215
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Rounds shot: %{count}" msgid "Rounds shot: %{count}"
msgstr "Patronen abgefeuert" msgstr "Patronen abgefeuert"
#: lib/cannery_web/components/container_table_component.ex:64 #: lib/cannery_web/components/container_table_component.ex:68
#: lib/cannery_web/components/type_table_component.ex:122 #: lib/cannery_web/components/type_table_component.ex:122
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Packs" msgid "Packs"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:65 #: lib/cannery_web/components/container_table_component.ex:69
#: lib/cannery_web/components/type_table_component.ex:143 #: lib/cannery_web/components/type_table_component.ex:143
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Rounds" msgid "Rounds"
msgstr "Patronen:" msgstr "Patronen:"
#: lib/cannery_web/live/container_live/index.html.heex:40 #: lib/cannery_web/live/container_live/index.html.heex:40
#: lib/cannery_web/live/container_live/show.html.heex:109 #: lib/cannery_web/live/container_live/show.html.heex:117
#: lib/cannery_web/live/type_live/show.html.heex:170 #: lib/cannery_web/live/type_live/show.html.heex:170
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "View as table" msgid "View as table"
@ -842,7 +822,7 @@ msgstr ""
msgid "Used rounds:" msgid "Used rounds:"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:68 #: lib/cannery_web/live/range_live/index.html.heex:80
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Rounds shot chart" msgid "Rounds shot chart"
msgstr "Patronen abgefeuert" msgstr "Patronen abgefeuert"
@ -949,7 +929,7 @@ msgid "Average CPR"
msgstr "" msgstr ""
#: lib/cannery_web/components/core_components/pack_card.html.heex:17 #: lib/cannery_web/components/core_components/pack_card.html.heex:17
#: lib/cannery_web/components/pack_table_component.ex:268 #: lib/cannery_web/components/pack_table_component.ex:267
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Empty" msgid "Empty"
msgstr "" msgstr ""
@ -995,7 +975,7 @@ msgid "Never used"
msgstr "" msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:71 #: lib/cannery_web/components/pack_table_component.ex:71
#: lib/cannery_web/live/pack_live/form_component.html.heex:49 #: lib/cannery_web/live/pack_live/form_component.html.heex:67
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Purchased on" msgid "Purchased on"
msgstr "" msgstr ""
@ -1011,36 +991,31 @@ msgstr ""
msgid "Edit ammo" msgid "Edit ammo"
msgstr "Munitionstyp bearbeiten" msgstr "Munitionstyp bearbeiten"
#: lib/cannery_web/live/type_live/index.html.heex:60 #: lib/cannery_web/live/type_live/index.html.heex:58
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Search catalog" msgid "Search catalog"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:81 #: lib/cannery_web/live/pack_live/index.html.heex:79
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Search ammo" msgid "Search ammo"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:34 #: lib/cannery_web/live/container_live/index.html.heex:32
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Search containers" msgid "Search containers"
msgstr "" msgstr ""
#: lib/cannery_web/live/tag_live/index.html.heex:36 #: lib/cannery_web/live/tag_live/index.html.heex:34
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Search tags" msgid "Search tags"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:114 #: lib/cannery_web/live/range_live/index.html.heex:124
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Search shot records" msgid "Search shot records"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:130
#, elixir-autogen, elixir-format
msgid "Spanish"
msgstr ""
#: lib/cannery_web/components/layouts.ex:15 #: lib/cannery_web/components/layouts.ex:15
#: lib/cannery_web/components/layouts/root.html.heex:9 #: lib/cannery_web/components/layouts/root.html.heex:9
#: lib/cannery_web/components/layouts/root.html.heex:10 #: lib/cannery_web/components/layouts/root.html.heex:10
@ -1135,48 +1110,48 @@ msgid "Email"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:24 #: 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 #, elixir-autogen, elixir-format
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:270 #: lib/cannery_web/live/type_live/form_component.html.heex:292
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "+P" msgid "+P"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:74 #: lib/cannery_web/live/type_live/form_component.html.heex:82
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid ".223" msgid ".223"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:55 #: lib/cannery_web/live/type_live/form_component.html.heex:62
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "5.56x46mm NATO" msgid "5.56x46mm NATO"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:309 #: lib/cannery_web/live/type_live/form_component.html.heex:333
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Boxer" msgid "Boxer"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:317 #: lib/cannery_web/live/type_live/form_component.html.heex:342
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Centerfire" msgid "Centerfire"
msgstr "" msgstr ""
#: lib/cannery_web/components/add_shot_record_component.html.heex:43 #: lib/cannery_web/components/add_shot_record_component.html.heex:45
#: lib/cannery_web/live/range_live/form_component.html.heex:35 #: lib/cannery_web/live/range_live/form_component.html.heex:37
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Really great weather" msgid "Really great weather"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:67 #: lib/cannery_web/components/container_table_component.ex:74
#: lib/cannery_web/components/move_pack_component.ex:67 #: lib/cannery_web/components/move_pack_component.ex:67
#: lib/cannery_web/components/pack_table_component.ex:62 #: lib/cannery_web/components/pack_table_component.ex:62
#: lib/cannery_web/components/shot_record_table_component.ex:48 #: lib/cannery_web/components/shot_record_table_component.ex:48
#: lib/cannery_web/components/type_table_component.ex:99 #: lib/cannery_web/components/type_table_component.ex:99
#: lib/cannery_web/live/pack_live/show.ex:92 #: lib/cannery_web/live/pack_live/show.ex:82
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Actions" msgid "Actions"
msgstr "" msgstr ""
@ -1202,21 +1177,21 @@ msgstr ""
msgid "Close modal" msgid "Close modal"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:97 #: lib/cannery_web/live/container_live/show.html.heex:105
#: lib/cannery_web/live/pack_live/index.html.heex:58 #: lib/cannery_web/live/pack_live/index.html.heex:58
#: lib/cannery_web/live/range_live/index.html.heex:91 #: lib/cannery_web/live/range_live/index.html.heex:103
#: lib/cannery_web/live/type_live/index.html.heex:37 #: lib/cannery_web/live/type_live/index.html.heex:37
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "All" msgid "All"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:322 #: lib/cannery_web/live/type_live/form_component.html.heex:347
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Attributes" msgid "Attributes"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:56 #: lib/cannery_web/components/type_table_component.ex:56
#: lib/cannery_web/live/type_live/form_component.html.heex:88 #: lib/cannery_web/live/type_live/form_component.html.heex:97
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Brass height" msgid "Brass height"
msgstr "Messing" msgstr "Messing"
@ -1227,7 +1202,7 @@ msgid "Brass height:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:57 #: lib/cannery_web/components/type_table_component.ex:57
#: lib/cannery_web/live/type_live/form_component.html.heex:97 #: lib/cannery_web/live/type_live/form_component.html.heex:107
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Chamber size" msgid "Chamber size"
msgstr "" msgstr ""
@ -1237,13 +1212,13 @@ msgstr ""
msgid "Chamber size:" msgid "Chamber size:"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:47 #: lib/cannery_web/live/type_live/form_component.html.heex:53
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Dimensions" msgid "Dimensions"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:80 #: lib/cannery_web/components/type_table_component.ex:80
#: lib/cannery_web/live/type_live/form_component.html.heex:275 #: lib/cannery_web/live/type_live/form_component.html.heex:297
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Dram equivalent" msgid "Dram equivalent"
msgstr "" msgstr ""
@ -1254,7 +1229,7 @@ msgid "Dram equivalent:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:51 #: lib/cannery_web/components/type_table_component.ex:51
#: lib/cannery_web/live/type_live/form_component.html.heex:66 #: lib/cannery_web/live/type_live/form_component.html.heex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Gauge" msgid "Gauge"
msgstr "" msgstr ""
@ -1265,7 +1240,7 @@ msgid "Gauge:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:71 #: lib/cannery_web/components/type_table_component.ex:71
#: lib/cannery_web/live/type_live/form_component.html.heex:216 #: lib/cannery_web/live/type_live/form_component.html.heex:235
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Load grains" msgid "Load grains"
msgstr "" msgstr ""
@ -1285,35 +1260,37 @@ msgstr "Keine Munition"
msgid "None specified" msgid "None specified"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:100 #: lib/cannery_web/live/container_live/show.html.heex:108
#: lib/cannery_web/live/pack_live/form_component.html.heex:30
#: lib/cannery_web/live/pack_live/index.html.heex:61 #: lib/cannery_web/live/pack_live/index.html.heex:61
#: lib/cannery_web/live/range_live/index.html.heex:94 #: lib/cannery_web/live/range_live/index.html.heex:106
#: lib/cannery_web/live/type_live/form_component.html.heex:25 #: lib/cannery_web/live/type_live/form_component.html.heex:28
#: lib/cannery_web/live/type_live/index.html.heex:40 #: lib/cannery_web/live/type_live/index.html.heex:40
#: lib/cannery_web/live/type_live/show.html.heex:56 #: lib/cannery_web/live/type_live/show.html.heex:56
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Pistol" msgid "Pistol"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:242 #: lib/cannery_web/live/type_live/form_component.html.heex:262
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Powder" msgid "Powder"
msgstr "Pulverart" msgstr "Pulverart"
#: lib/cannery_web/live/type_live/form_component.html.heex:302 #: lib/cannery_web/live/type_live/form_component.html.heex:325
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Primer" msgid "Primer"
msgstr "Zündertyp" msgstr "Zündertyp"
#: lib/cannery_web/live/type_live/form_component.html.heex:112 #: lib/cannery_web/live/type_live/form_component.html.heex:123
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Projectile" msgid "Projectile"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:98 #: lib/cannery_web/live/container_live/show.html.heex:106
#: lib/cannery_web/live/pack_live/form_component.html.heex:28
#: lib/cannery_web/live/pack_live/index.html.heex:59 #: lib/cannery_web/live/pack_live/index.html.heex:59
#: lib/cannery_web/live/range_live/index.html.heex:92 #: lib/cannery_web/live/range_live/index.html.heex:104
#: lib/cannery_web/live/type_live/form_component.html.heex:25 #: lib/cannery_web/live/type_live/form_component.html.heex:26
#: lib/cannery_web/live/type_live/index.html.heex:38 #: lib/cannery_web/live/type_live/index.html.heex:38
#: lib/cannery_web/live/type_live/show.html.heex:54 #: lib/cannery_web/live/type_live/show.html.heex:54
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -1321,7 +1298,7 @@ msgid "Rifle"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:72 #: lib/cannery_web/components/type_table_component.ex:72
#: lib/cannery_web/live/type_live/form_component.html.heex:224 #: lib/cannery_web/live/type_live/form_component.html.heex:243
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot charge weight" msgid "Shot charge weight"
msgstr "" msgstr ""
@ -1332,7 +1309,7 @@ msgid "Shot charge weight:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:69 #: lib/cannery_web/components/type_table_component.ex:69
#: lib/cannery_web/live/type_live/form_component.html.heex:200 #: lib/cannery_web/live/type_live/form_component.html.heex:217
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot material" msgid "Shot material"
msgstr "" msgstr ""
@ -1343,7 +1320,7 @@ msgid "Shot material:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:70 #: lib/cannery_web/components/type_table_component.ex:70
#: lib/cannery_web/live/type_live/form_component.html.heex:209 #: lib/cannery_web/live/type_live/form_component.html.heex:227
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Shot size" msgid "Shot size"
msgstr "Schüsse abgegeben" msgstr "Schüsse abgegeben"
@ -1354,7 +1331,7 @@ msgid "Shot size:"
msgstr "Schüsse abgegeben" msgstr "Schüsse abgegeben"
#: lib/cannery_web/components/type_table_component.ex:68 #: lib/cannery_web/components/type_table_component.ex:68
#: lib/cannery_web/live/type_live/form_component.html.heex:192 #: lib/cannery_web/live/type_live/form_component.html.heex:208
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot type" msgid "Shot type"
msgstr "" msgstr ""
@ -1364,10 +1341,11 @@ msgstr ""
msgid "Shot type:" msgid "Shot type:"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:99 #: lib/cannery_web/live/container_live/show.html.heex:107
#: lib/cannery_web/live/pack_live/form_component.html.heex:29
#: lib/cannery_web/live/pack_live/index.html.heex:60 #: lib/cannery_web/live/pack_live/index.html.heex:60
#: lib/cannery_web/live/range_live/index.html.heex:93 #: lib/cannery_web/live/range_live/index.html.heex:105
#: lib/cannery_web/live/type_live/form_component.html.heex:25 #: lib/cannery_web/live/type_live/form_component.html.heex:27
#: lib/cannery_web/live/type_live/index.html.heex:39 #: lib/cannery_web/live/type_live/index.html.heex:39
#: lib/cannery_web/live/type_live/show.html.heex:52 #: lib/cannery_web/live/type_live/show.html.heex:52
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -1375,12 +1353,12 @@ msgid "Shotgun"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:61 #: lib/cannery_web/components/type_table_component.ex:61
#: lib/cannery_web/live/type_live/form_component.html.heex:150 #: lib/cannery_web/live/type_live/form_component.html.heex:162
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Slug core" msgid "Slug core"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:196 #: lib/cannery_web/live/type_live/form_component.html.heex:213
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Target, bird, buck, etc" msgid "Target, bird, buck, etc"
msgstr "" msgstr ""
@ -1391,13 +1369,13 @@ msgid "Unfired length:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:55 #: lib/cannery_web/components/type_table_component.ex:55
#: lib/cannery_web/live/type_live/form_component.html.heex:79 #: lib/cannery_web/live/type_live/form_component.html.heex:87
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Unfired shell length" msgid "Unfired shell length"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:67 #: lib/cannery_web/components/type_table_component.ex:67
#: lib/cannery_web/live/type_live/form_component.html.heex:185 #: lib/cannery_web/live/type_live/form_component.html.heex:200
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Wadding" msgid "Wadding"
msgstr "" msgstr ""
@ -1408,9 +1386,10 @@ msgid "Wadding:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:149 #: lib/cannery_web/components/type_table_component.ex:149
#: lib/cannery_web/live/container_live/show.html.heex:91 #: lib/cannery_web/live/container_live/show.html.heex:99
#: lib/cannery_web/live/pack_live/form_component.html.heex:22
#: lib/cannery_web/live/pack_live/index.html.heex:50 #: lib/cannery_web/live/pack_live/index.html.heex:50
#: lib/cannery_web/live/range_live/index.html.heex:83 #: lib/cannery_web/live/range_live/index.html.heex:95
#: lib/cannery_web/live/type_live/form_component.html.heex:21 #: lib/cannery_web/live/type_live/form_component.html.heex:21
#: lib/cannery_web/live/type_live/index.html.heex:29 #: lib/cannery_web/live/type_live/index.html.heex:29
#: lib/cannery_web/live/type_live/show.html.heex:46 #: lib/cannery_web/live/type_live/show.html.heex:46
@ -1430,7 +1409,7 @@ msgid "Used up!"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:41 #: lib/cannery_web/live/pack_live/show.ex:41
#: lib/cannery_web/live/range_live/index.ex:39 #: lib/cannery_web/live/range_live/index.ex:60
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Edit Shot Record" msgid "Edit Shot Record"
msgstr "Schießkladde editieren" msgstr "Schießkladde editieren"
@ -1454,7 +1433,7 @@ msgid "No Types"
msgstr "Art" msgstr "Art"
#: lib/cannery_web/components/pack_table_component.ex:84 #: lib/cannery_web/components/pack_table_component.ex:84
#: lib/cannery_web/live/pack_live/form_component.html.heex:42 #: lib/cannery_web/live/pack_live/form_component.html.heex:59
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Lot number" msgid "Lot number"
msgstr "" msgstr ""
@ -1463,3 +1442,18 @@ msgstr ""
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Lot number:" msgid "Lot number:"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/form_component.html.heex:27
#, elixir-autogen, elixir-format
msgid "Any"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:138
#, elixir-autogen, elixir-format, fuzzy
msgid "Dates"
msgstr "Datum"
#: lib/cannery_web/live/range_live/index.html.heex:8
#, elixir-autogen, elixir-format, fuzzy
msgid "No containers staged"
msgstr "Kein Behälter"

View File

@ -66,7 +66,7 @@ msgstr "Sie können ihr Passwort unter folgender URL zurücksetzen:"
## Run "mix gettext.extract" to bring this file up to ## Run "mix gettext.extract" to bring this file up to
## date. Leave "msgstr"s empty as changing them here has no ## date. Leave "msgstr"s empty as changing them here has no
## effect: edit them in PO (.po) files instead. ## effect: edit them in PO (.po) files instead.
#: lib/cannery/accounts/email.ex:31 #: lib/cannery/email.ex:31
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Confirm your Cannery account" msgid "Confirm your Cannery account"
msgstr "Bestätigen Sie ihr %{name} Nutzerkonto" msgstr "Bestätigen Sie ihr %{name} Nutzerkonto"
@ -86,7 +86,7 @@ msgstr ""
"Falls Sie die Änderung von %{name} nicht angefragt haben, ignorieren Sie " "Falls Sie die Änderung von %{name} nicht angefragt haben, ignorieren Sie "
"diese Nachricht bitte." "diese Nachricht bitte."
#: lib/cannery/accounts/email.ex:38 #: lib/cannery/email.ex:38
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Reset your Cannery password" msgid "Reset your Cannery password"
msgstr "Passwort für %{name} zurücksetzen" msgstr "Passwort für %{name} zurücksetzen"
@ -105,7 +105,7 @@ msgstr ""
"Diese Nachricht wurde von %{name} gesandt, einem selbst-gehosteten " "Diese Nachricht wurde von %{name} gesandt, einem selbst-gehosteten "
"Schusswaffenmanager." "Schusswaffenmanager."
#: lib/cannery/accounts/email.ex:45 #: lib/cannery/email.ex:45
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Update your Cannery email" msgid "Update your Cannery email"
msgstr "Aktualisieren Sie %{name} Mailadresse" msgstr "Aktualisieren Sie %{name} Mailadresse"

View File

@ -23,7 +23,7 @@ msgstr ""
## Run "mix gettext.extract" to bring this file up to ## Run "mix gettext.extract" to bring this file up to
## date. Leave "msgstr"s empty as changing them here has no ## date. Leave "msgstr"s empty as changing them here has no
## effect: edit them in PO (.po) files instead. ## effect: edit them in PO (.po) files instead.
#: lib/cannery/containers.ex:224 #: lib/cannery/containers.ex:234
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Container must be empty before deleting" msgid "Container must be empty before deleting"
msgstr "Behälter muss vor dem Löschen leer sein" msgstr "Behälter muss vor dem Löschen leer sein"
@ -39,7 +39,7 @@ msgstr "Konnte %{name} nicht löschen: %{error}"
msgid "Could not find that container" msgid "Could not find that container"
msgstr "Konnte Behälter nicht finden" msgstr "Konnte Behälter nicht finden"
#: lib/cannery_web/controllers/user_settings_controller.ex:84 #: lib/cannery_web/controllers/user_settings_controller.ex:83
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Email change link is invalid or it has expired." msgid "Email change link is invalid or it has expired."
msgstr "Mailadressenänderungs-Link ist ungültig oder abgelaufen." msgstr "Mailadressenänderungs-Link ist ungültig oder abgelaufen."
@ -80,21 +80,21 @@ msgstr "Oops, etwas ist schiefgegangen. Bitte beachten Sie den Fehler unten."
msgid "Reset password link is invalid or it has expired." msgid "Reset password link is invalid or it has expired."
msgstr "Link zum Passwort zurücksetzen ist ungültig oder abgelaufen." msgstr "Link zum Passwort zurücksetzen ist ungültig oder abgelaufen."
#: lib/cannery_web/controllers/user_registration_controller.ex:22 #: lib/cannery_web/controllers/user_registration_controller.ex:21
#: lib/cannery_web/controllers/user_registration_controller.ex:51 #: lib/cannery_web/controllers/user_registration_controller.ex:50
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Sorry, public registration is disabled" msgid "Sorry, public registration is disabled"
msgstr "Entschuldigung, aber öffentliche Registrierung ist deaktiviert" msgstr "Entschuldigung, aber öffentliche Registrierung ist deaktiviert"
#: lib/cannery_web/controllers/user_registration_controller.ex:12 #: lib/cannery_web/controllers/user_registration_controller.ex:11
#: lib/cannery_web/controllers/user_registration_controller.ex:41 #: lib/cannery_web/controllers/user_registration_controller.ex:40
#: lib/cannery_web/controllers/user_registration_controller.ex:70 #: lib/cannery_web/controllers/user_registration_controller.ex:69
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Sorry, this invite was not found or expired" msgid "Sorry, this invite was not found or expired"
msgstr "" msgstr ""
"Entschuldigung, aber diese Einladung wurde nicht gefunden oder ist abgelaufen" "Entschuldigung, aber diese Einladung wurde nicht gefunden oder ist abgelaufen"
#: lib/cannery_web/controllers/user_settings_controller.ex:99 #: lib/cannery_web/controllers/user_settings_controller.ex:98
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Unable to delete user" msgid "Unable to delete user"
msgstr "Dieser Nutzer konnte nicht gelöscht werden" msgstr "Dieser Nutzer konnte nicht gelöscht werden"
@ -105,7 +105,7 @@ msgstr "Dieser Nutzer konnte nicht gelöscht werden"
msgid "Unauthorized" msgid "Unauthorized"
msgstr "Unbefugt" msgstr "Unbefugt"
#: lib/cannery_web/controllers/user_confirmation_controller.ex:53 #: lib/cannery_web/controllers/user_confirmation_controller.ex:51
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "User confirmation link is invalid or it has expired." msgid "User confirmation link is invalid or it has expired."
msgstr "Nutzerkonto Bestätigungslink ist ungültig oder abgelaufen." msgstr "Nutzerkonto Bestätigungslink ist ungültig oder abgelaufen."
@ -115,22 +115,22 @@ msgstr "Nutzerkonto Bestätigungslink ist ungültig oder abgelaufen."
msgid "You are not authorized to view this page." msgid "You are not authorized to view this page."
msgstr "Sie sind nicht berechtigt, diese Seite aufzurufen." msgstr "Sie sind nicht berechtigt, diese Seite aufzurufen."
#: lib/cannery/accounts/user.ex:145 #: lib/cannery/accounts/user.ex:140
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "did not change" msgid "did not change"
msgstr "hat sich nicht geändert" msgstr "hat sich nicht geändert"
#: lib/cannery/accounts/user.ex:166 #: lib/cannery/accounts/user.ex:161
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "does not match password" msgid "does not match password"
msgstr "Passwort stimmt nicht überein" msgstr "Passwort stimmt nicht überein"
#: lib/cannery/accounts/user.ex:203 #: lib/cannery/accounts/user.ex:198
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "is not valid" msgid "is not valid"
msgstr "ist nicht gültig" msgstr "ist nicht gültig"
#: lib/cannery/accounts/user.ex:100 #: lib/cannery/accounts/user.ex:95
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "must have the @ sign and no spaces" msgid "must have the @ sign and no spaces"
msgstr "Muss ein @ Zeichen und keine Leerzeichen haben" msgstr "Muss ein @ Zeichen und keine Leerzeichen haben"
@ -158,58 +158,48 @@ msgstr ""
msgid "Tag could not be removed" msgid "Tag could not be removed"
msgstr "Tag konnte nicht gelöscht werden" msgstr "Tag konnte nicht gelöscht werden"
#: lib/cannery_web/live/pack_live/form_component.ex:159 #: lib/cannery_web/live/pack_live/form_component.ex:175
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Could not parse number of copies" msgid "Could not parse number of copies"
msgstr "Konnte die Anzahl der Kopien nicht verstehen" msgstr "Konnte die Anzahl der Kopien nicht verstehen"
#: lib/cannery_web/live/pack_live/form_component.ex:149 #: lib/cannery/ammo.ex:1026
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}" msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
msgstr "" msgstr ""
"Ungültige Nummer an Kopien. Muss zwischen 1 and %{max} liegen. War " "Ungültige Nummer an Kopien. Muss zwischen 1 and %{max} liegen. War "
"%{multiplier}" "%{multiplier}"
#: lib/cannery/ammo.ex:974 #: lib/cannery_web/live/range_live/index.html.heex:83
#, elixir-autogen, elixir-format
msgid "Invalid multiplier"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:71
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Your browser does not support the canvas element." msgid "Your browser does not support the canvas element."
msgstr "" msgstr ""
#: lib/cannery/activity_log/shot_record.ex:74 #: lib/cannery/activity_log/shot_record.ex:71
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Please select a valid user and ammo pack" msgid "Please select a valid user and ammo pack"
msgstr "" msgstr ""
#: lib/cannery/activity_log/shot_record.ex:88 #: lib/cannery/activity_log/shot_record.ex:85
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Ammo left can be at most %{count} rounds" msgid "Ammo left can be at most %{count} rounds"
msgstr "" msgstr ""
#: lib/cannery/activity_log/shot_record.ex:84 #: lib/cannery/activity_log/shot_record.ex:81
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Ammo left must be at least 0" msgid "Ammo left must be at least 0"
msgstr "" msgstr ""
#: lib/cannery/activity_log/shot_record.ex:119 #: lib/cannery/activity_log/shot_record.ex:116
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Count can be at most %{count} shots" msgid "Count can be at most %{count} shots"
msgstr "Anzahl muss weniger als %{count} betragen" msgstr "Anzahl muss weniger als %{count} betragen"
#: lib/cannery/activity_log/shot_record.ex:80 #: lib/cannery/activity_log/shot_record.ex:77
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "can't be blank" msgid "can't be blank"
msgstr "" msgstr ""
#: lib/cannery/ammo/pack.ex:100
#, elixir-autogen, elixir-format, fuzzy
msgid "Please select a type and container"
msgstr ""
#: lib/cannery_web/controllers/error_html.ex:11 #: lib/cannery_web/controllers/error_html.ex:11
#: lib/cannery_web/controllers/error_json.ex:9 #: lib/cannery_web/controllers/error_json.ex:9
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
@ -225,3 +215,13 @@ msgstr ""
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "You must log in to access this page." msgid "You must log in to access this page."
msgstr "" msgstr ""
#: lib/cannery/ammo/pack.ex:101
#, elixir-autogen, elixir-format, fuzzy
msgid "Please select a valid container"
msgstr ""
#: lib/cannery/ammo/pack.ex:99
#, elixir-autogen, elixir-format, fuzzy
msgid "Please select a valid type"
msgstr ""

View File

@ -23,10 +23,10 @@ msgstr ""
## Run "mix gettext.extract" to bring this file up to ## Run "mix gettext.extract" to bring this file up to
## date. Leave "msgstr"s empty as changing them here has no ## date. Leave "msgstr"s empty as changing them here has no
## effect: edit them in PO (.po) files instead. ## effect: edit them in PO (.po) files instead.
#: lib/cannery_web/live/container_live/form_component.ex:89 #: lib/cannery_web/live/container_live/form_component.ex:88
#: lib/cannery_web/live/invite_live/form_component.ex:80 #: lib/cannery_web/live/invite_live/form_component.ex:79
#: lib/cannery_web/live/tag_live/form_component.ex:78 #: lib/cannery_web/live/tag_live/form_component.ex:77
#: lib/cannery_web/live/type_live/form_component.ex:88 #: lib/cannery_web/live/type_live/form_component.ex:87
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{name} created successfully" msgid "%{name} created successfully"
msgstr "%{name} erfolgreich erstellt" msgstr "%{name} erfolgreich erstellt"
@ -44,36 +44,36 @@ msgstr "%{name} erfolgreich gelöscht"
msgid "%{name} has been deleted" msgid "%{name} has been deleted"
msgstr "%{name} wurde gelöscht" msgstr "%{name} wurde gelöscht"
#: lib/cannery_web/live/container_live/form_component.ex:70 #: lib/cannery_web/live/container_live/form_component.ex:69
#: lib/cannery_web/live/invite_live/form_component.ex:62 #: lib/cannery_web/live/invite_live/form_component.ex:61
#: lib/cannery_web/live/tag_live/form_component.ex:60 #: lib/cannery_web/live/tag_live/form_component.ex:59
#: lib/cannery_web/live/type_live/form_component.ex:69 #: lib/cannery_web/live/type_live/form_component.ex:68
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{name} updated successfully" msgid "%{name} updated successfully"
msgstr "%{name} erfolgreich aktualisiert" msgstr "%{name} erfolgreich aktualisiert"
#: lib/cannery_web/controllers/user_settings_controller.ex:29 #: lib/cannery_web/controllers/user_settings_controller.ex:28
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "A link to confirm your email change has been sent to the new address." msgid "A link to confirm your email change has been sent to the new address."
msgstr "Eine Mail zum Bestätigen ihre Mailadresse wurde Ihnen zugesandt." msgstr "Eine Mail zum Bestätigen ihre Mailadresse wurde Ihnen zugesandt."
#: lib/cannery_web/live/invite_live/index.html.heex:110 #: lib/cannery_web/live/invite_live/index.html.heex:110
#: lib/cannery_web/live/invite_live/index.html.heex:138 #: lib/cannery_web/live/invite_live/index.html.heex:145
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{email}? This action is permanent!" msgid "Are you sure you want to delete %{email}? This action is permanent!"
msgstr "" msgstr ""
"Sind Sie sicher, dass sie %{email} löschen möchten? Dies kann nicht " "Sind Sie sicher, dass sie %{email} löschen möchten? Dies kann nicht "
"zurückgenommen werden!" "zurückgenommen werden!"
#: lib/cannery_web/live/container_live/index.html.heex:99 #: lib/cannery_web/live/container_live/index.html.heex:113
#: lib/cannery_web/live/container_live/index.html.heex:157 #: lib/cannery_web/live/container_live/index.html.heex:171
#: lib/cannery_web/live/container_live/show.html.heex:45 #: lib/cannery_web/live/container_live/show.html.heex:45
#: lib/cannery_web/live/tag_live/index.html.heex:63 #: lib/cannery_web/live/tag_live/index.html.heex:63
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}?" msgid "Are you sure you want to delete %{name}?"
msgstr "Sind Sie sicher, dass sie %{name} löschen möchten?" msgstr "Sind Sie sicher, dass sie %{name} löschen möchten?"
#: lib/cannery_web/live/pack_live/index.html.heex:185 #: lib/cannery_web/live/pack_live/index.html.heex:174
#: lib/cannery_web/live/pack_live/show.html.heex:69 #: lib/cannery_web/live/pack_live/show.html.heex:69
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this ammo?" msgid "Are you sure you want to delete this ammo?"
@ -89,12 +89,12 @@ msgstr "Sind Sie sicher, dass sie Ihren Account löschen möchten?"
msgid "Are you sure you want to log out?" msgid "Are you sure you want to log out?"
msgstr "Wirklich ausloggen?" msgstr "Wirklich ausloggen?"
#: lib/cannery_web/controllers/user_settings_controller.ex:77 #: lib/cannery_web/controllers/user_settings_controller.ex:76
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Email changed successfully." msgid "Email changed successfully."
msgstr "Mailadresse erfolgreich geändert." msgstr "Mailadresse erfolgreich geändert."
#: lib/cannery_web/controllers/user_confirmation_controller.ex:23 #: lib/cannery_web/controllers/user_confirmation_controller.ex:21
#, elixir-autogen, elixir-format #, 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." msgid "If your email is in our system and it has not been confirmed yet, you will receive an email with instructions shortly."
msgstr "" msgstr ""
@ -118,28 +118,28 @@ msgstr "Erfolgreich ausgeloggt."
msgid "Password reset successfully." msgid "Password reset successfully."
msgstr "Passwort erfolgreich zurückgesetzt." msgstr "Passwort erfolgreich zurückgesetzt."
#: lib/cannery_web/controllers/user_settings_controller.ex:49 #: lib/cannery_web/controllers/user_settings_controller.ex:48
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Password updated successfully." msgid "Password updated successfully."
msgstr "Passwort erfolgreich geändert." msgstr "Passwort erfolgreich geändert."
#: lib/cannery_web/controllers/user_registration_controller.ex:65 #: lib/cannery_web/controllers/user_registration_controller.ex:64
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Please check your email to verify your account" msgid "Please check your email to verify your account"
msgstr "Bitte überprüfen Sie ihre Mailbox und bestätigen Sie das Nutzerkonto" msgstr "Bitte überprüfen Sie ihre Mailbox und bestätigen Sie das Nutzerkonto"
#: lib/cannery_web/components/add_shot_record_component.html.heex:58 #: lib/cannery_web/components/add_shot_record_component.html.heex:59
#: lib/cannery_web/live/container_live/form_component.html.heex:57 #: lib/cannery_web/live/container_live/form_component.html.heex:61
#: lib/cannery_web/live/invite_live/form_component.html.heex:37 #: lib/cannery_web/live/invite_live/form_component.html.heex:40
#: lib/cannery_web/live/pack_live/form_component.html.heex:91 #: lib/cannery_web/live/pack_live/form_component.html.heex:111
#: lib/cannery_web/live/range_live/form_component.html.heex:46 #: lib/cannery_web/live/range_live/form_component.html.heex:47
#: lib/cannery_web/live/tag_live/form_component.html.heex:39 #: lib/cannery_web/live/tag_live/form_component.html.heex:43
#: lib/cannery_web/live/type_live/form_component.html.heex:360 #: lib/cannery_web/live/type_live/form_component.html.heex:387
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Saving..." msgid "Saving..."
msgstr "Speichere..." msgstr "Speichere..."
#: lib/cannery_web/controllers/user_settings_controller.ex:95 #: lib/cannery_web/controllers/user_settings_controller.ex:94
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Your account has been deleted" msgid "Your account has been deleted"
msgstr "Ihr Nutzerkonto wurde gelöscht" msgstr "Ihr Nutzerkonto wurde gelöscht"
@ -161,29 +161,24 @@ msgstr "%{name} erfolgreich hinzugefügt"
msgid "%{tag_name} has been removed from %{container_name}" msgid "%{tag_name} has been removed from %{container_name}"
msgstr "%{tag_name} wurde von %{container_name} entfernt" msgstr "%{tag_name} wurde von %{container_name} entfernt"
#: lib/cannery_web/live/container_live/edit_tags_component.html.heex:53 #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:55
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Adding..." msgid "Adding..."
msgstr "Füge hinzu..." msgstr "Füge hinzu..."
#: lib/cannery_web/components/add_shot_record_component.ex:60 #: lib/cannery_web/components/add_shot_record_component.ex:62
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shots recorded successfully" msgid "Shots recorded successfully"
msgstr "Schüsse erfolgreich dokumentiert" msgstr "Schüsse erfolgreich dokumentiert"
#: lib/cannery_web/live/range_live/index.html.heex:34 #: lib/cannery_web/live/pack_live/show.ex:147
#, elixir-autogen, elixir-format #: lib/cannery_web/live/range_live/index.html.heex:178
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:151
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?" msgid "Are you sure you want to delete this shot record?"
msgstr "Sind sie sicher, dass sie die Schießkladde löschen möchten?" msgstr "Sind sie sicher, dass sie die Schießkladde löschen möchten?"
#: lib/cannery_web/live/pack_live/show.ex:79 #: lib/cannery_web/live/pack_live/show.ex:69
#: lib/cannery_web/live/range_live/index.ex:78 #: lib/cannery_web/live/range_live/index.ex:99
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot records deleted succesfully" msgid "Shot records deleted succesfully"
msgstr "Schießkladde erfolgreich gelöscht" msgstr "Schießkladde erfolgreich gelöscht"
@ -193,7 +188,7 @@ msgstr "Schießkladde erfolgreich gelöscht"
msgid "Shot records updated successfully" msgid "Shot records updated successfully"
msgstr "Schießkladde erfolgreich aktualisiert" msgstr "Schießkladde erfolgreich aktualisiert"
#: lib/cannery_web/controllers/user_confirmation_controller.ex:37 #: lib/cannery_web/controllers/user_confirmation_controller.ex:35
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{email} confirmed successfully." msgid "%{email} confirmed successfully."
msgstr "%{email} erfolgreich bestätigt." msgstr "%{email} erfolgreich bestätigt."
@ -219,7 +214,7 @@ msgstr "%{name} erfolgreich entfernt"
msgid "You'll need to" msgid "You'll need to"
msgstr "Sie müssen" msgstr "Sie müssen"
#: lib/cannery_web/live/pack_live/form_component.html.heex:84 #: lib/cannery_web/live/pack_live/form_component.html.heex:104
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Creating..." msgid "Creating..."
msgstr "Erstellen..." msgstr "Erstellen..."
@ -229,7 +224,7 @@ msgstr "Erstellen..."
msgid "Are you sure you want to change your language?" msgid "Are you sure you want to change your language?"
msgstr "Möchten Sie die Sprache wechseln?" msgstr "Möchten Sie die Sprache wechseln?"
#: lib/cannery_web/controllers/user_settings_controller.ex:65 #: lib/cannery_web/controllers/user_settings_controller.ex:64
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Language updated successfully." msgid "Language updated successfully."
msgstr "Spracheinstellung gespeichert." msgstr "Spracheinstellung gespeichert."
@ -240,17 +235,12 @@ msgstr "Spracheinstellung gespeichert."
msgid "Ammo deleted succesfully" msgid "Ammo deleted succesfully"
msgstr "Munitionsgruppe erfolgreich gelöscht" msgstr "Munitionsgruppe erfolgreich gelöscht"
#: lib/cannery_web/live/range_live/index.ex:91 #: lib/cannery_web/live/pack_live/form_component.ex:141
#, elixir-autogen, elixir-format, fuzzy
msgid "Ammo unstaged succesfully"
msgstr "Munition erfolgreich demarkiert"
#: lib/cannery_web/live/pack_live/form_component.ex:125
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Ammo updated successfully" msgid "Ammo updated successfully"
msgstr "Munitionsgruppe erfolgreich aktualisiert" msgstr "Munitionsgruppe erfolgreich aktualisiert"
#: lib/cannery_web/live/pack_live/form_component.ex:184 #: lib/cannery_web/live/pack_live/form_component.ex:162
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Ammo added successfully" msgid "Ammo added successfully"
msgid_plural "Ammo added successfully" msgid_plural "Ammo added successfully"
@ -288,7 +278,7 @@ msgstr "%{name} erfolgreich aktiviert"
msgid "%{invite_name} updated succesfully" msgid "%{invite_name} updated succesfully"
msgstr "%{name} erfolgreich aktualisiert" msgstr "%{name} erfolgreich aktualisiert"
#: lib/cannery_web/live/invite_live/index.ex:125 #: lib/cannery_web/live/invite_live/index.ex:139
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "%{user_email} deleted succesfully" msgid "%{user_email} deleted succesfully"
msgstr "%{name} erfolgreich gelöscht" msgstr "%{name} erfolgreich gelöscht"
@ -302,3 +292,13 @@ msgstr "Sind Sie sicher, dass sie die Einladung für %{name} löschen möchten?"
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Are you sure you want to make %{invite_name} unlimited?" msgid "Are you sure you want to make %{invite_name} unlimited?"
msgstr "Sind Sie sicher, dass sie %{name} auf unbegrenzt setzen möchten?" msgstr "Sind Sie sicher, dass sie %{name} auf unbegrenzt setzen möchten?"
#: lib/cannery_web/live/range_live/index.ex:114
#, elixir-autogen, elixir-format
msgid "Container unstaged succesfully"
msgstr ""
#: lib/cannery_web/live/invite_live/index.ex:128
#, elixir-autogen, elixir-format
msgid "Email resent to %{user_email} succesfully"
msgstr ""

View File

@ -34,55 +34,55 @@ msgstr ""
msgid "Ammo" msgid "Ammo"
msgstr "" msgstr ""
#: lib/cannery_web/live/tag_live/form_component.html.heex:25 #: lib/cannery_web/live/tag_live/form_component.html.heex:29
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Background color" msgid "Background color"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:86 #: lib/cannery_web/components/type_table_component.ex:86
#: lib/cannery_web/live/type_live/form_component.html.heex:333 #: lib/cannery_web/live/type_live/form_component.html.heex:358
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Blank" msgid "Blank"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:180 #: lib/cannery_web/live/type_live/form_component.html.heex:195
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Brass" msgid "Brass"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:61 #: lib/cannery_web/components/type_table_component.ex:61
#: lib/cannery_web/live/type_live/form_component.html.heex:151 #: lib/cannery_web/live/type_live/form_component.html.heex:163
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Bullet core" msgid "Bullet core"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:59 #: lib/cannery_web/components/type_table_component.ex:59
#: lib/cannery_web/live/type_live/form_component.html.heex:125 #: lib/cannery_web/live/type_live/form_component.html.heex:136
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Bullet type" msgid "Bullet type"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:51 #: lib/cannery_web/components/type_table_component.ex:51
#: lib/cannery_web/live/type_live/form_component.html.heex:67 #: lib/cannery_web/live/type_live/form_component.html.heex:74
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Caliber" msgid "Caliber"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:49 #: lib/cannery_web/components/type_table_component.ex:49
#: lib/cannery_web/live/type_live/form_component.html.heex:51 #: lib/cannery_web/live/type_live/form_component.html.heex:57
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Cartridge" msgid "Cartridge"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:66 #: lib/cannery_web/components/type_table_component.ex:66
#: lib/cannery_web/live/type_live/form_component.html.heex:174 #: lib/cannery_web/live/type_live/form_component.html.heex:188
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Case material" msgid "Case material"
msgstr "" msgstr ""
#: lib/cannery_web/components/move_pack_component.ex:64 #: lib/cannery_web/components/move_pack_component.ex:64
#: lib/cannery_web/components/pack_table_component.ex:76 #: lib/cannery_web/components/pack_table_component.ex:76
#: lib/cannery_web/live/pack_live/form_component.html.heex:65 #: lib/cannery_web/live/pack_live/form_component.html.heex:84
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Container" msgid "Container"
msgstr "" msgstr ""
@ -96,13 +96,13 @@ msgid "Containers"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:87 #: lib/cannery_web/components/type_table_component.ex:87
#: lib/cannery_web/live/type_live/form_component.html.heex:337 #: lib/cannery_web/live/type_live/form_component.html.heex:362
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Corrosive" msgid "Corrosive"
msgstr "" msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:104 #: lib/cannery_web/components/pack_table_component.ex:104
#: lib/cannery_web/live/pack_live/form_component.html.heex:28 #: lib/cannery_web/live/pack_live/form_component.html.heex:45
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Count" msgid "Count"
msgstr "" msgstr ""
@ -113,9 +113,9 @@ msgstr ""
msgid "Count:" msgid "Count:"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:46 #: lib/cannery_web/components/container_table_component.ex:50
#: lib/cannery_web/live/container_live/form_component.html.heex:29 #: lib/cannery_web/live/container_live/form_component.html.heex:30
#: lib/cannery_web/live/type_live/form_component.html.heex:38 #: lib/cannery_web/live/type_live/form_component.html.heex:43
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Description" msgid "Description"
msgstr "" msgstr ""
@ -141,19 +141,19 @@ msgstr ""
msgid "Edit Tag" msgid "Edit Tag"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:139 #: lib/cannery_web/live/type_live/form_component.html.heex:151
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "FMJ" msgid "FMJ"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:58 #: lib/cannery_web/components/type_table_component.ex:58
#: lib/cannery_web/live/type_live/form_component.html.heex:115 #: lib/cannery_web/live/type_live/form_component.html.heex:126
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Grains" msgid "Grains"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:85 #: lib/cannery_web/components/type_table_component.ex:85
#: lib/cannery_web/live/type_live/form_component.html.heex:329 #: lib/cannery_web/live/type_live/form_component.html.heex:354
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Incendiary" msgid "Incendiary"
msgstr "" msgstr ""
@ -180,14 +180,14 @@ msgstr ""
msgid "Invites" msgid "Invites"
msgstr "" 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 #, elixir-autogen, elixir-format
msgid "Keep me logged in for 60 days" msgid "Keep me logged in for 60 days"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:47 #: lib/cannery_web/components/container_table_component.ex:51
#: lib/cannery_web/components/move_pack_component.ex:66 #: lib/cannery_web/components/move_pack_component.ex:66
#: lib/cannery_web/live/container_live/form_component.html.heex:46 #: lib/cannery_web/live/container_live/form_component.html.heex:49
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Location" msgid "Location"
msgstr "" msgstr ""
@ -198,34 +198,34 @@ msgstr ""
msgid "Location:" msgid "Location:"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/form_component.html.heex:41 #: lib/cannery_web/live/container_live/form_component.html.heex:45
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Magazine, Clip, Ammo Box, etc" msgid "Magazine, Clip, Ammo Box, etc"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:88 #: lib/cannery_web/components/type_table_component.ex:88
#: lib/cannery_web/live/type_live/form_component.html.heex:342 #: lib/cannery_web/live/type_live/form_component.html.heex:367
#: lib/cannery_web/live/type_live/form_component.html.heex:345 #: lib/cannery_web/live/type_live/form_component.html.heex:370
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Manufacturer" msgid "Manufacturer"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/form_component.html.heex:33 #: lib/cannery_web/live/container_live/form_component.html.heex:36
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Metal ammo can with the anime girl sticker" msgid "Metal ammo can with the anime girl sticker"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/form_component.html.heex:24 #: lib/cannery_web/live/container_live/form_component.html.heex:26
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "My cool ammo can" msgid "My cool ammo can"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:45 #: lib/cannery_web/components/container_table_component.ex:49
#: lib/cannery_web/components/type_table_component.ex:152 #: lib/cannery_web/components/type_table_component.ex:152
#: lib/cannery_web/live/container_live/form_component.html.heex:21 #: lib/cannery_web/live/container_live/form_component.html.heex:21
#: lib/cannery_web/live/invite_live/form_component.html.heex:21 #: lib/cannery_web/live/invite_live/form_component.html.heex:21
#: lib/cannery_web/live/tag_live/form_component.html.heex:21 #: lib/cannery_web/live/tag_live/form_component.html.heex:21
#: lib/cannery_web/live/type_live/form_component.html.heex:31 #: lib/cannery_web/live/type_live/form_component.html.heex:35
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Name" msgid "Name"
msgstr "" msgstr ""
@ -276,8 +276,8 @@ msgstr ""
#: lib/cannery_web/components/add_shot_record_component.html.heex:38 #: lib/cannery_web/components/add_shot_record_component.html.heex:38
#: lib/cannery_web/components/shot_record_table_component.ex:46 #: lib/cannery_web/components/shot_record_table_component.ex:46
#: lib/cannery_web/live/pack_live/form_component.html.heex:57 #: lib/cannery_web/live/pack_live/form_component.html.heex:75
#: lib/cannery_web/live/pack_live/show.ex:90 #: lib/cannery_web/live/pack_live/show.ex:80
#: lib/cannery_web/live/range_live/form_component.html.heex:30 #: lib/cannery_web/live/range_live/form_component.html.heex:30
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Notes" msgid "Notes"
@ -289,19 +289,19 @@ msgstr ""
msgid "Notes:" msgid "Notes:"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/form_component.html.heex:50 #: lib/cannery_web/live/container_live/form_component.html.heex:55
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "On the bookshelf" msgid "On the bookshelf"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:79 #: lib/cannery_web/components/type_table_component.ex:79
#: lib/cannery_web/live/type_live/form_component.html.heex:266 #: lib/cannery_web/live/type_live/form_component.html.heex:287
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Pressure" msgid "Pressure"
msgstr "" msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:92 #: lib/cannery_web/components/pack_table_component.ex:92
#: lib/cannery_web/live/pack_live/form_component.html.heex:35 #: lib/cannery_web/live/pack_live/form_component.html.heex:52
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Price paid" msgid "Price paid"
msgstr "" msgstr ""
@ -312,7 +312,7 @@ msgid "Price paid:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:82 #: lib/cannery_web/components/type_table_component.ex:82
#: lib/cannery_web/live/type_live/form_component.html.heex:305 #: lib/cannery_web/live/type_live/form_component.html.heex:328
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Primer type" msgid "Primer type"
msgstr "" msgstr ""
@ -332,7 +332,7 @@ msgstr ""
msgid "Self-host your own instance, or use an instance from someone you trust." msgid "Self-host your own instance, or use an instance from someone you trust."
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_settings_controller.ex:10 #: lib/cannery_web/controllers/user_settings_controller.ex:9
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:3 #: lib/cannery_web/controllers/user_settings_html/edit.html.heex:3
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Settings" msgid "Settings"
@ -343,17 +343,17 @@ msgstr ""
msgid "Simple:" msgid "Simple:"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:158 #: lib/cannery_web/live/type_live/form_component.html.heex:171
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Steel" msgid "Steel"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.html.heex:100 #: lib/cannery_web/live/pack_live/show.html.heex:94
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Stored in" msgid "Stored in"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:66 #: lib/cannery_web/components/container_table_component.ex:73
#: lib/cannery_web/components/core_components/topbar.html.heex:28 #: lib/cannery_web/components/core_components/topbar.html.heex:28
#: lib/cannery_web/live/tag_live/index.ex:43 #: lib/cannery_web/live/tag_live/index.ex:43
#: lib/cannery_web/live/tag_live/index.ex:53 #: lib/cannery_web/live/tag_live/index.ex:53
@ -367,7 +367,7 @@ msgstr ""
msgid "Tags can be added to your containers to help you organize" msgid "Tags can be added to your containers to help you organize"
msgstr "" msgstr ""
#: lib/cannery_web/live/tag_live/form_component.html.heex:31 #: lib/cannery_web/live/tag_live/form_component.html.heex:35
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Text color" msgid "Text color"
msgstr "" msgstr ""
@ -378,16 +378,16 @@ msgid "The self-hosted firearm tracker website"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:84 #: lib/cannery_web/components/type_table_component.ex:84
#: lib/cannery_web/live/type_live/form_component.html.heex:325 #: lib/cannery_web/live/type_live/form_component.html.heex:350
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Tracer" msgid "Tracer"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:48 #: lib/cannery_web/components/container_table_component.ex:52
#: lib/cannery_web/components/move_pack_component.ex:65 #: lib/cannery_web/components/move_pack_component.ex:65
#: lib/cannery_web/components/pack_table_component.ex:108 #: lib/cannery_web/components/pack_table_component.ex:108
#: lib/cannery_web/live/container_live/form_component.html.heex:38 #: lib/cannery_web/live/container_live/form_component.html.heex:40
#: lib/cannery_web/live/pack_live/form_component.html.heex:22 #: lib/cannery_web/live/pack_live/form_component.html.heex:37
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Type" msgid "Type"
msgstr "" msgstr ""
@ -403,7 +403,7 @@ msgstr ""
msgid "Users" msgid "Users"
msgstr "" msgstr ""
#: lib/cannery_web/live/invite_live/form_component.html.heex:28 #: lib/cannery_web/live/invite_live/form_component.html.heex:31
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Uses left" msgid "Uses left"
msgstr "" msgstr ""
@ -413,15 +413,16 @@ msgstr ""
msgid "Your data stays with you, period" msgid "Your data stays with you, period"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:60 #: lib/cannery_web/live/container_live/show.html.heex:68
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No tags for this container" msgid "No tags for this container"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:77
#: lib/cannery_web/components/core_components/topbar.html.heex:48 #: lib/cannery_web/components/core_components/topbar.html.heex:48
#: lib/cannery_web/components/pack_table_component.ex:80 #: 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:76
#: lib/cannery_web/live/range_live/index.ex:65 #: lib/cannery_web/live/range_live/index.ex:86
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Range" msgid "Range"
msgstr "" msgstr ""
@ -431,10 +432,10 @@ msgstr ""
msgid "Range day" msgid "Range day"
msgstr "" msgstr ""
#: lib/cannery_web/components/add_shot_record_component.html.heex:48 #: lib/cannery_web/components/add_shot_record_component.html.heex:49
#: lib/cannery_web/components/shot_record_table_component.ex:47 #: lib/cannery_web/components/shot_record_table_component.ex:47
#: lib/cannery_web/live/pack_live/show.ex:91 #: lib/cannery_web/live/pack_live/show.ex:81
#: lib/cannery_web/live/range_live/form_component.html.heex:40 #: lib/cannery_web/live/range_live/form_component.html.heex:41
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Date" msgid "Date"
msgstr "" msgstr ""
@ -444,26 +445,21 @@ msgstr ""
msgid "Shots fired" msgid "Shots fired"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:8
#, elixir-autogen, elixir-format
msgid "No ammo staged"
msgstr ""
#: lib/cannery_web/components/add_shot_record_component.html.heex:3 #: lib/cannery_web/components/add_shot_record_component.html.heex:3
#: lib/cannery_web/live/pack_live/index.ex:35 #: lib/cannery_web/live/pack_live/index.ex:35
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Record shots" msgid "Record shots"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:52 #: lib/cannery_web/live/range_live/index.html.heex:64
#: lib/cannery_web/live/range_live/index.html.heex:121 #: lib/cannery_web/live/range_live/index.html.heex:148
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No shots recorded" msgid "No shots recorded"
msgstr "" msgstr ""
#: lib/cannery_web/components/shot_record_table_component.ex:45 #: lib/cannery_web/components/shot_record_table_component.ex:45
#: lib/cannery_web/live/pack_live/show.ex:89 #: lib/cannery_web/live/pack_live/show.ex:79
#: lib/cannery_web/live/range_live/index.html.heex:66 #: lib/cannery_web/live/range_live/index.html.heex:78
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Rounds shot" msgid "Rounds shot"
msgstr "" msgstr ""
@ -478,7 +474,7 @@ msgstr ""
msgid "No other containers" msgid "No other containers"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:57 #: lib/cannery_web/live/range_live/index.html.heex:69
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot log" msgid "Shot log"
msgstr "" msgstr ""
@ -486,7 +482,7 @@ msgstr ""
#: lib/cannery_web/components/core_components/pack_card.html.heex:42 #: 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/core_components/pack_card.html.heex:47
#: lib/cannery_web/components/pack_table_component.ex:181 #: lib/cannery_web/components/pack_table_component.ex:181
#: lib/cannery_web/components/pack_table_component.ex:264 #: lib/cannery_web/components/pack_table_component.ex:263
#: lib/cannery_web/components/type_table_component.ex:273 #: 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:37
#: lib/cannery_web/live/pack_live/show.html.heex:42 #: lib/cannery_web/live/pack_live/show.html.heex:42
@ -495,36 +491,36 @@ msgstr ""
msgid "$%{amount}" msgid "$%{amount}"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:167 #: lib/cannery_web/live/type_live/form_component.html.heex:181
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Bimetal" msgid "Bimetal"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:65 #: lib/cannery_web/components/type_table_component.ex:65
#: lib/cannery_web/live/type_live/form_component.html.heex:163 #: lib/cannery_web/live/type_live/form_component.html.heex:176
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Jacket type" msgid "Jacket type"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:81 #: lib/cannery_web/components/type_table_component.ex:81
#: lib/cannery_web/live/type_live/form_component.html.heex:288 #: lib/cannery_web/live/type_live/form_component.html.heex:311
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Muzzle velocity" msgid "Muzzle velocity"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:75 #: lib/cannery_web/components/type_table_component.ex:75
#: lib/cannery_web/live/type_live/form_component.html.heex:253 #: lib/cannery_web/live/type_live/form_component.html.heex:274
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Powder grains per charge" msgid "Powder grains per charge"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:73 #: lib/cannery_web/components/type_table_component.ex:73
#: lib/cannery_web/live/type_live/form_component.html.heex:245 #: lib/cannery_web/live/type_live/form_component.html.heex:265
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Powder type" msgid "Powder type"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:352 #: lib/cannery_web/live/type_live/form_component.html.heex:378
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "UPC" msgid "UPC"
msgstr "" msgstr ""
@ -548,24 +544,24 @@ msgid "New password"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:83 #: lib/cannery_web/components/type_table_component.ex:83
#: lib/cannery_web/live/type_live/form_component.html.heex:313 #: lib/cannery_web/live/type_live/form_component.html.heex:337
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Firing type" msgid "Firing type"
msgstr "" msgstr ""
#: lib/cannery_web/components/layouts/live.html.heex:43 #: lib/cannery_web/components/layouts/app.html.heex:43
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Reconnecting..." msgid "Reconnecting..."
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.ex:28 #: lib/cannery_web/live/container_live/index.ex:28
#: lib/cannery_web/live/container_live/show.ex:118 #: lib/cannery_web/live/container_live/show.ex:130
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit %{name}" msgid "Edit %{name}"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.ex:63 #: lib/cannery_web/live/container_live/index.ex:63
#: lib/cannery_web/live/container_live/show.ex:119 #: lib/cannery_web/live/container_live/show.ex:131
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit %{name} tags" msgid "Edit %{name} tags"
msgstr "" msgstr ""
@ -578,7 +574,7 @@ msgid "Rounds:"
msgstr "" msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:178 #: lib/cannery_web/components/pack_table_component.ex:178
#: lib/cannery_web/components/pack_table_component.ex:260 #: lib/cannery_web/components/pack_table_component.ex:259
#: lib/cannery_web/components/type_table_component.ex:272 #: lib/cannery_web/components/type_table_component.ex:272
#: lib/cannery_web/live/type_live/show.html.heex:154 #: lib/cannery_web/live/type_live/show.html.heex:154
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -610,12 +606,12 @@ msgstr ""
msgid "Percentage left:" msgid "Percentage left:"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.html.heex:113 #: lib/cannery_web/live/pack_live/show.html.heex:107
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Rounds used" msgid "Rounds used"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_confirmation_controller.ex:8 #: lib/cannery_web/controllers/user_confirmation_controller.ex:6
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Confirm your account" msgid "Confirm your account"
msgstr "" msgstr ""
@ -630,7 +626,7 @@ msgstr ""
msgid "Log in" msgid "Log in"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_registration_controller.ex:32 #: lib/cannery_web/controllers/user_registration_controller.ex:31
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Register" msgid "Register"
msgstr "" msgstr ""
@ -641,13 +637,13 @@ msgid "Reset your password"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:40 #: 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:52
#: lib/cannery_web/live/range_live/index.ex:47 #: lib/cannery_web/live/range_live/index.ex:68
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Record Shots" msgid "Record Shots"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/form_component.html.heex:75 #: lib/cannery_web/live/pack_live/form_component.html.heex:96
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Copies" msgid "Copies"
msgstr "" msgstr ""
@ -657,22 +653,6 @@ msgstr ""
msgid "Added on:" msgid "Added on:"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:32
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:127
#, elixir-autogen, elixir-format
msgid "English"
msgstr ""
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:129
#, elixir-autogen, elixir-format
msgid "French"
msgstr ""
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:128
#, elixir-autogen, elixir-format
msgid "German"
msgstr ""
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:28 #: lib/cannery_web/controllers/user_registration_html/new.html.heex:28
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Language" msgid "Language"
@ -716,7 +696,7 @@ msgstr ""
msgid "Move Ammo" msgid "Move Ammo"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:117 #: lib/cannery_web/live/container_live/show.html.heex:125
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No ammo in this container" msgid "No ammo in this container"
msgstr "" msgstr ""
@ -726,7 +706,7 @@ msgstr ""
msgid "Show Ammo" msgid "Show Ammo"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.html.heex:105 #: lib/cannery_web/live/pack_live/show.html.heex:99
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "This ammo is not in a container" msgid "This ammo is not in a container"
msgstr "" msgstr ""
@ -749,7 +729,7 @@ msgstr ""
msgid "isn't he cute >:3" msgid "isn't he cute >:3"
msgstr "" msgstr ""
#: lib/cannery_web/live/invite_live/form_component.html.heex:32 #: lib/cannery_web/live/invite_live/form_component.html.heex:35
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Leave \"Uses left\" blank to make invite unlimited" msgid "Leave \"Uses left\" blank to make invite unlimited"
msgstr "" msgstr ""
@ -766,31 +746,31 @@ msgstr ""
msgid "Show used" msgid "Show used"
msgstr "" msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:219 #: lib/cannery_web/components/pack_table_component.ex:218
#: lib/cannery_web/live/pack_live/show.html.heex:19 #: lib/cannery_web/live/pack_live/show.html.heex:19
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{percentage}%" msgid "%{percentage}%"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.ex:153 #: lib/cannery_web/live/range_live/index.ex:215
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Rounds shot: %{count}" msgid "Rounds shot: %{count}"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:64 #: lib/cannery_web/components/container_table_component.ex:68
#: lib/cannery_web/components/type_table_component.ex:122 #: lib/cannery_web/components/type_table_component.ex:122
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Packs" msgid "Packs"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:65 #: lib/cannery_web/components/container_table_component.ex:69
#: lib/cannery_web/components/type_table_component.ex:143 #: lib/cannery_web/components/type_table_component.ex:143
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Rounds" msgid "Rounds"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:40 #: lib/cannery_web/live/container_live/index.html.heex:40
#: lib/cannery_web/live/container_live/show.html.heex:109 #: lib/cannery_web/live/container_live/show.html.heex:117
#: lib/cannery_web/live/type_live/show.html.heex:170 #: lib/cannery_web/live/type_live/show.html.heex:170
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "View as table" msgid "View as table"
@ -836,7 +816,7 @@ msgstr ""
msgid "Used rounds:" msgid "Used rounds:"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:68 #: lib/cannery_web/live/range_live/index.html.heex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Rounds shot chart" msgid "Rounds shot chart"
msgstr "" msgstr ""
@ -943,7 +923,7 @@ msgid "Average CPR"
msgstr "" msgstr ""
#: lib/cannery_web/components/core_components/pack_card.html.heex:17 #: lib/cannery_web/components/core_components/pack_card.html.heex:17
#: lib/cannery_web/components/pack_table_component.ex:268 #: lib/cannery_web/components/pack_table_component.ex:267
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Empty" msgid "Empty"
msgstr "" msgstr ""
@ -989,7 +969,7 @@ msgid "Never used"
msgstr "" msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:71 #: lib/cannery_web/components/pack_table_component.ex:71
#: lib/cannery_web/live/pack_live/form_component.html.heex:49 #: lib/cannery_web/live/pack_live/form_component.html.heex:67
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Purchased on" msgid "Purchased on"
msgstr "" msgstr ""
@ -1005,36 +985,31 @@ msgstr ""
msgid "Edit ammo" msgid "Edit ammo"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:60 #: lib/cannery_web/live/type_live/index.html.heex:58
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Search catalog" msgid "Search catalog"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:81 #: lib/cannery_web/live/pack_live/index.html.heex:79
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Search ammo" msgid "Search ammo"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:34 #: lib/cannery_web/live/container_live/index.html.heex:32
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Search containers" msgid "Search containers"
msgstr "" msgstr ""
#: lib/cannery_web/live/tag_live/index.html.heex:36 #: lib/cannery_web/live/tag_live/index.html.heex:34
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Search tags" msgid "Search tags"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:114 #: lib/cannery_web/live/range_live/index.html.heex:124
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Search shot records" msgid "Search shot records"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:130
#, elixir-autogen, elixir-format
msgid "Spanish"
msgstr ""
#: lib/cannery_web/components/layouts.ex:15 #: lib/cannery_web/components/layouts.ex:15
#: lib/cannery_web/components/layouts/root.html.heex:9 #: lib/cannery_web/components/layouts/root.html.heex:9
#: lib/cannery_web/components/layouts/root.html.heex:10 #: lib/cannery_web/components/layouts/root.html.heex:10
@ -1118,48 +1093,48 @@ msgid "Email"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:24 #: 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 #, elixir-autogen, elixir-format
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:270 #: lib/cannery_web/live/type_live/form_component.html.heex:292
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "+P" msgid "+P"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:74 #: lib/cannery_web/live/type_live/form_component.html.heex:82
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid ".223" msgid ".223"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:55 #: lib/cannery_web/live/type_live/form_component.html.heex:62
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "5.56x46mm NATO" msgid "5.56x46mm NATO"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:309 #: lib/cannery_web/live/type_live/form_component.html.heex:333
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Boxer" msgid "Boxer"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:317 #: lib/cannery_web/live/type_live/form_component.html.heex:342
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Centerfire" msgid "Centerfire"
msgstr "" msgstr ""
#: lib/cannery_web/components/add_shot_record_component.html.heex:43 #: lib/cannery_web/components/add_shot_record_component.html.heex:45
#: lib/cannery_web/live/range_live/form_component.html.heex:35 #: lib/cannery_web/live/range_live/form_component.html.heex:37
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Really great weather" msgid "Really great weather"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:67 #: lib/cannery_web/components/container_table_component.ex:74
#: lib/cannery_web/components/move_pack_component.ex:67 #: lib/cannery_web/components/move_pack_component.ex:67
#: lib/cannery_web/components/pack_table_component.ex:62 #: lib/cannery_web/components/pack_table_component.ex:62
#: lib/cannery_web/components/shot_record_table_component.ex:48 #: lib/cannery_web/components/shot_record_table_component.ex:48
#: lib/cannery_web/components/type_table_component.ex:99 #: lib/cannery_web/components/type_table_component.ex:99
#: lib/cannery_web/live/pack_live/show.ex:92 #: lib/cannery_web/live/pack_live/show.ex:82
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Actions" msgid "Actions"
msgstr "" msgstr ""
@ -1185,21 +1160,21 @@ msgstr ""
msgid "Close modal" msgid "Close modal"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:97 #: lib/cannery_web/live/container_live/show.html.heex:105
#: lib/cannery_web/live/pack_live/index.html.heex:58 #: lib/cannery_web/live/pack_live/index.html.heex:58
#: lib/cannery_web/live/range_live/index.html.heex:91 #: lib/cannery_web/live/range_live/index.html.heex:103
#: lib/cannery_web/live/type_live/index.html.heex:37 #: lib/cannery_web/live/type_live/index.html.heex:37
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "All" msgid "All"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:322 #: lib/cannery_web/live/type_live/form_component.html.heex:347
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Attributes" msgid "Attributes"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:56 #: lib/cannery_web/components/type_table_component.ex:56
#: lib/cannery_web/live/type_live/form_component.html.heex:88 #: lib/cannery_web/live/type_live/form_component.html.heex:97
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Brass height" msgid "Brass height"
msgstr "" msgstr ""
@ -1210,7 +1185,7 @@ msgid "Brass height:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:57 #: lib/cannery_web/components/type_table_component.ex:57
#: lib/cannery_web/live/type_live/form_component.html.heex:97 #: lib/cannery_web/live/type_live/form_component.html.heex:107
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Chamber size" msgid "Chamber size"
msgstr "" msgstr ""
@ -1220,13 +1195,13 @@ msgstr ""
msgid "Chamber size:" msgid "Chamber size:"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:47 #: lib/cannery_web/live/type_live/form_component.html.heex:53
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Dimensions" msgid "Dimensions"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:80 #: lib/cannery_web/components/type_table_component.ex:80
#: lib/cannery_web/live/type_live/form_component.html.heex:275 #: lib/cannery_web/live/type_live/form_component.html.heex:297
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Dram equivalent" msgid "Dram equivalent"
msgstr "" msgstr ""
@ -1237,7 +1212,7 @@ msgid "Dram equivalent:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:51 #: lib/cannery_web/components/type_table_component.ex:51
#: lib/cannery_web/live/type_live/form_component.html.heex:66 #: lib/cannery_web/live/type_live/form_component.html.heex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Gauge" msgid "Gauge"
msgstr "" msgstr ""
@ -1248,7 +1223,7 @@ msgid "Gauge:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:71 #: lib/cannery_web/components/type_table_component.ex:71
#: lib/cannery_web/live/type_live/form_component.html.heex:216 #: lib/cannery_web/live/type_live/form_component.html.heex:235
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Load grains" msgid "Load grains"
msgstr "" msgstr ""
@ -1268,35 +1243,37 @@ msgstr ""
msgid "None specified" msgid "None specified"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:100 #: lib/cannery_web/live/container_live/show.html.heex:108
#: lib/cannery_web/live/pack_live/form_component.html.heex:30
#: lib/cannery_web/live/pack_live/index.html.heex:61 #: lib/cannery_web/live/pack_live/index.html.heex:61
#: lib/cannery_web/live/range_live/index.html.heex:94 #: lib/cannery_web/live/range_live/index.html.heex:106
#: lib/cannery_web/live/type_live/form_component.html.heex:25 #: lib/cannery_web/live/type_live/form_component.html.heex:28
#: lib/cannery_web/live/type_live/index.html.heex:40 #: lib/cannery_web/live/type_live/index.html.heex:40
#: lib/cannery_web/live/type_live/show.html.heex:56 #: lib/cannery_web/live/type_live/show.html.heex:56
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Pistol" msgid "Pistol"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:242 #: lib/cannery_web/live/type_live/form_component.html.heex:262
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Powder" msgid "Powder"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:302 #: lib/cannery_web/live/type_live/form_component.html.heex:325
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Primer" msgid "Primer"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:112 #: lib/cannery_web/live/type_live/form_component.html.heex:123
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Projectile" msgid "Projectile"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:98 #: lib/cannery_web/live/container_live/show.html.heex:106
#: lib/cannery_web/live/pack_live/form_component.html.heex:28
#: lib/cannery_web/live/pack_live/index.html.heex:59 #: lib/cannery_web/live/pack_live/index.html.heex:59
#: lib/cannery_web/live/range_live/index.html.heex:92 #: lib/cannery_web/live/range_live/index.html.heex:104
#: lib/cannery_web/live/type_live/form_component.html.heex:25 #: lib/cannery_web/live/type_live/form_component.html.heex:26
#: lib/cannery_web/live/type_live/index.html.heex:38 #: lib/cannery_web/live/type_live/index.html.heex:38
#: lib/cannery_web/live/type_live/show.html.heex:54 #: lib/cannery_web/live/type_live/show.html.heex:54
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -1304,7 +1281,7 @@ msgid "Rifle"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:72 #: lib/cannery_web/components/type_table_component.ex:72
#: lib/cannery_web/live/type_live/form_component.html.heex:224 #: lib/cannery_web/live/type_live/form_component.html.heex:243
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot charge weight" msgid "Shot charge weight"
msgstr "" msgstr ""
@ -1315,7 +1292,7 @@ msgid "Shot charge weight:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:69 #: lib/cannery_web/components/type_table_component.ex:69
#: lib/cannery_web/live/type_live/form_component.html.heex:200 #: lib/cannery_web/live/type_live/form_component.html.heex:217
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot material" msgid "Shot material"
msgstr "" msgstr ""
@ -1326,7 +1303,7 @@ msgid "Shot material:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:70 #: lib/cannery_web/components/type_table_component.ex:70
#: lib/cannery_web/live/type_live/form_component.html.heex:209 #: lib/cannery_web/live/type_live/form_component.html.heex:227
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot size" msgid "Shot size"
msgstr "" msgstr ""
@ -1337,7 +1314,7 @@ msgid "Shot size:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:68 #: lib/cannery_web/components/type_table_component.ex:68
#: lib/cannery_web/live/type_live/form_component.html.heex:192 #: lib/cannery_web/live/type_live/form_component.html.heex:208
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot type" msgid "Shot type"
msgstr "" msgstr ""
@ -1347,10 +1324,11 @@ msgstr ""
msgid "Shot type:" msgid "Shot type:"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:99 #: lib/cannery_web/live/container_live/show.html.heex:107
#: lib/cannery_web/live/pack_live/form_component.html.heex:29
#: lib/cannery_web/live/pack_live/index.html.heex:60 #: lib/cannery_web/live/pack_live/index.html.heex:60
#: lib/cannery_web/live/range_live/index.html.heex:93 #: lib/cannery_web/live/range_live/index.html.heex:105
#: lib/cannery_web/live/type_live/form_component.html.heex:25 #: lib/cannery_web/live/type_live/form_component.html.heex:27
#: lib/cannery_web/live/type_live/index.html.heex:39 #: lib/cannery_web/live/type_live/index.html.heex:39
#: lib/cannery_web/live/type_live/show.html.heex:52 #: lib/cannery_web/live/type_live/show.html.heex:52
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -1358,12 +1336,12 @@ msgid "Shotgun"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:61 #: lib/cannery_web/components/type_table_component.ex:61
#: lib/cannery_web/live/type_live/form_component.html.heex:150 #: lib/cannery_web/live/type_live/form_component.html.heex:162
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Slug core" msgid "Slug core"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:196 #: lib/cannery_web/live/type_live/form_component.html.heex:213
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Target, bird, buck, etc" msgid "Target, bird, buck, etc"
msgstr "" msgstr ""
@ -1374,13 +1352,13 @@ msgid "Unfired length:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:55 #: lib/cannery_web/components/type_table_component.ex:55
#: lib/cannery_web/live/type_live/form_component.html.heex:79 #: lib/cannery_web/live/type_live/form_component.html.heex:87
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Unfired shell length" msgid "Unfired shell length"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:67 #: lib/cannery_web/components/type_table_component.ex:67
#: lib/cannery_web/live/type_live/form_component.html.heex:185 #: lib/cannery_web/live/type_live/form_component.html.heex:200
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Wadding" msgid "Wadding"
msgstr "" msgstr ""
@ -1391,9 +1369,10 @@ msgid "Wadding:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:149 #: lib/cannery_web/components/type_table_component.ex:149
#: lib/cannery_web/live/container_live/show.html.heex:91 #: lib/cannery_web/live/container_live/show.html.heex:99
#: lib/cannery_web/live/pack_live/form_component.html.heex:22
#: lib/cannery_web/live/pack_live/index.html.heex:50 #: lib/cannery_web/live/pack_live/index.html.heex:50
#: lib/cannery_web/live/range_live/index.html.heex:83 #: lib/cannery_web/live/range_live/index.html.heex:95
#: lib/cannery_web/live/type_live/form_component.html.heex:21 #: lib/cannery_web/live/type_live/form_component.html.heex:21
#: lib/cannery_web/live/type_live/index.html.heex:29 #: lib/cannery_web/live/type_live/index.html.heex:29
#: lib/cannery_web/live/type_live/show.html.heex:46 #: lib/cannery_web/live/type_live/show.html.heex:46
@ -1413,7 +1392,7 @@ msgid "Used up!"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:41 #: lib/cannery_web/live/pack_live/show.ex:41
#: lib/cannery_web/live/range_live/index.ex:39 #: lib/cannery_web/live/range_live/index.ex:60
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit Shot Record" msgid "Edit Shot Record"
msgstr "" msgstr ""
@ -1437,7 +1416,7 @@ msgid "No Types"
msgstr "" msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:84 #: lib/cannery_web/components/pack_table_component.ex:84
#: lib/cannery_web/live/pack_live/form_component.html.heex:42 #: lib/cannery_web/live/pack_live/form_component.html.heex:59
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Lot number" msgid "Lot number"
msgstr "" msgstr ""
@ -1446,3 +1425,18 @@ msgstr ""
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Lot number:" msgid "Lot number:"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/form_component.html.heex:27
#, elixir-autogen, elixir-format
msgid "Any"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:138
#, elixir-autogen, elixir-format
msgid "Dates"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:8
#, elixir-autogen, elixir-format
msgid "No containers staged"
msgstr ""

View File

@ -49,7 +49,7 @@ msgstr ""
msgid "You can reset your password by visiting the URL below:" msgid "You can reset your password by visiting the URL below:"
msgstr "" msgstr ""
#: lib/cannery/accounts/email.ex:31 #: lib/cannery/email.ex:31
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Confirm your Cannery account" msgid "Confirm your Cannery account"
msgstr "" msgstr ""
@ -65,7 +65,7 @@ msgstr ""
msgid "If you didn't request this change from Cannery, please ignore this." msgid "If you didn't request this change from Cannery, please ignore this."
msgstr "" msgstr ""
#: lib/cannery/accounts/email.ex:38 #: lib/cannery/email.ex:38
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Reset your Cannery password" msgid "Reset your Cannery password"
msgstr "" msgstr ""
@ -80,7 +80,7 @@ msgstr ""
msgid "This email was sent from Cannery, the self-hosted firearm tracker website." msgid "This email was sent from Cannery, the self-hosted firearm tracker website."
msgstr "" msgstr ""
#: lib/cannery/accounts/email.ex:45 #: lib/cannery/email.ex:45
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Update your Cannery email" msgid "Update your Cannery email"
msgstr "" msgstr ""

View File

@ -54,9 +54,9 @@ msgstr ""
msgid "Delete User" msgid "Delete User"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:47 #: lib/cannery_web/controllers/user_registration_html/new.html.heex:52
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:3 #: 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 #, elixir-autogen, elixir-format
msgid "Forgot your password?" msgid "Forgot your password?"
msgstr "" msgstr ""
@ -68,11 +68,11 @@ msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:94 #: 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_confirmation_html/new.html.heex:28
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:44 #: lib/cannery_web/controllers/user_registration_html/new.html.heex:49
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:41 #: 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_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: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 #, elixir-autogen, elixir-format
msgid "Log in" msgid "Log in"
msgstr "" msgstr ""
@ -95,10 +95,10 @@ msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:89 #: 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_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:3
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:37 #: lib/cannery_web/controllers/user_registration_html/new.html.heex:42
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:38 #: 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_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 #, elixir-autogen, elixir-format
msgid "Register" msgid "Register"
msgstr "" msgstr ""
@ -115,13 +115,13 @@ msgstr ""
msgid "Reset password" msgid "Reset password"
msgstr "" msgstr ""
#: lib/cannery_web/components/add_shot_record_component.html.heex:56 #: lib/cannery_web/components/add_shot_record_component.html.heex:57
#: lib/cannery_web/live/container_live/form_component.html.heex:55 #: lib/cannery_web/live/container_live/form_component.html.heex:59
#: lib/cannery_web/live/invite_live/form_component.html.heex:35 #: lib/cannery_web/live/invite_live/form_component.html.heex:38
#: lib/cannery_web/live/pack_live/form_component.html.heex:90 #: lib/cannery_web/live/pack_live/form_component.html.heex:110
#: lib/cannery_web/live/range_live/form_component.html.heex:44 #: lib/cannery_web/live/range_live/form_component.html.heex:45
#: lib/cannery_web/live/tag_live/form_component.html.heex:37 #: lib/cannery_web/live/tag_live/form_component.html.heex:41
#: lib/cannery_web/live/type_live/form_component.html.heex:359 #: lib/cannery_web/live/type_live/form_component.html.heex:386
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Save" msgid "Save"
msgstr "" msgstr ""
@ -131,29 +131,24 @@ msgstr ""
msgid "Send instructions to reset password" msgid "Send instructions to reset password"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:65 #: lib/cannery_web/live/container_live/show.html.heex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Why not add one?" msgid "Why not add one?"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/edit_tags_component.html.heex:51 #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:53
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Add" msgid "Add"
msgstr "" 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 #: lib/cannery_web/live/range_live/index.html.heex:13
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Why not get some ready to shoot?" msgid "Why not get some ready to shoot?"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:127 #: lib/cannery_web/live/pack_live/index.html.heex:116
#: lib/cannery_web/live/pack_live/show.html.heex:90 #: lib/cannery_web/live/pack_live/show.html.heex:84
#: lib/cannery_web/live/range_live/index.html.heex:42 #: lib/cannery_web/live/range_live/index.html.heex:54
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Record shots" msgid "Record shots"
msgstr "" msgstr ""
@ -178,7 +173,7 @@ msgstr ""
msgid "add a container first" msgid "add a container first"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/form_component.html.heex:83 #: lib/cannery_web/live/pack_live/form_component.html.heex:103
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Create" msgid "Create"
msgstr "" msgstr ""
@ -199,8 +194,8 @@ msgid "View in Catalog"
msgstr "" msgstr ""
#: lib/cannery_web/components/move_pack_component.ex:77 #: 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/index.html.heex:127
#: lib/cannery_web/live/pack_live/show.html.heex:86 #: lib/cannery_web/live/pack_live/show.html.heex:80
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Move ammo" msgid "Move ammo"
msgstr "" msgstr ""
@ -210,14 +205,12 @@ msgstr ""
msgid "Set Unlimited" msgid "Set Unlimited"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.html.heex:82 #: lib/cannery_web/live/container_live/show.html.heex:59
#: lib/cannery_web/live/range_live/index.html.heex:38
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Stage for range" msgid "Stage for range"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.html.heex:81 #: lib/cannery_web/live/container_live/show.html.heex:58
#: lib/cannery_web/live/range_live/index.html.heex:37
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Unstage from range" msgid "Unstage from range"
msgstr "" msgstr ""
@ -227,8 +220,8 @@ msgstr ""
msgid "Export Data as JSON" msgid "Export Data as JSON"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:87 #: lib/cannery_web/live/container_live/index.html.heex:101
#: lib/cannery_web/live/container_live/index.html.heex:145 #: lib/cannery_web/live/container_live/index.html.heex:159
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Clone %{container_name}" msgid "Clone %{container_name}"
msgstr "" msgstr ""
@ -238,8 +231,8 @@ msgstr ""
msgid "Copy invite link for %{invite_name}" msgid "Copy invite link for %{invite_name}"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:104 #: lib/cannery_web/live/container_live/index.html.heex:118
#: lib/cannery_web/live/container_live/index.html.heex:162 #: lib/cannery_web/live/container_live/index.html.heex:176
#: lib/cannery_web/live/container_live/show.html.heex:48 #: lib/cannery_web/live/container_live/show.html.heex:48
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Delete %{container_name}" msgid "Delete %{container_name}"
@ -255,8 +248,8 @@ msgstr ""
msgid "Delete invite for %{invite_name}" msgid "Delete invite for %{invite_name}"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:77 #: lib/cannery_web/live/container_live/index.html.heex:91
#: lib/cannery_web/live/container_live/index.html.heex:135 #: lib/cannery_web/live/container_live/index.html.heex:149
#: lib/cannery_web/live/container_live/show.html.heex:35 #: lib/cannery_web/live/container_live/show.html.heex:35
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit %{container_name}" msgid "Edit %{container_name}"
@ -272,54 +265,56 @@ msgstr ""
msgid "Edit invite for %{invite_name}" msgid "Edit invite for %{invite_name}"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:120 #: lib/cannery_web/live/container_live/index.html.heex:69
#: lib/cannery_web/live/range_live/index.html.heex:35
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Stage" msgid "Stage"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:65 #: lib/cannery_web/live/container_live/index.html.heex:79
#: lib/cannery_web/live/container_live/index.html.heex:124 #: lib/cannery_web/live/container_live/index.html.heex:138
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Tag %{container_name}" msgid "Tag %{container_name}"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:119 #: lib/cannery_web/live/container_live/index.html.heex:68
#: lib/cannery_web/live/range_live/index.html.heex:34
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Unstage" msgid "Unstage"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:172 #: lib/cannery_web/live/pack_live/index.html.heex:161
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Clone pack of %{pack_count} bullets" msgid "Clone pack of %{pack_count} bullets"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:187 #: lib/cannery_web/live/pack_live/index.html.heex:176
#: lib/cannery_web/live/pack_live/show.html.heex:71 #: lib/cannery_web/live/pack_live/show.html.heex:71
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Delete pack of %{pack_count} bullets" msgid "Delete pack of %{pack_count} bullets"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:160 #: lib/cannery_web/live/pack_live/index.html.heex:149
#: lib/cannery_web/live/pack_live/show.html.heex:59 #: lib/cannery_web/live/pack_live/show.html.heex:59
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Edit pack of %{pack_count} bullets" msgid "Edit pack of %{pack_count} bullets"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:139 #: lib/cannery_web/live/container_live/show.html.heex:147
#: lib/cannery_web/live/pack_live/index.html.heex:148 #: lib/cannery_web/live/pack_live/index.html.heex:137
#: lib/cannery_web/live/type_live/show.html.heex:201 #: lib/cannery_web/live/type_live/show.html.heex:201
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "View pack of %{pack_count} bullets" msgid "View pack of %{pack_count} bullets"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:159 #: lib/cannery_web/live/pack_live/show.ex:149
#: lib/cannery_web/live/range_live/index.html.heex:154 #: lib/cannery_web/live/range_live/index.html.heex:181
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Delete shot record of %{shot_record_count} shots" msgid "Delete shot record of %{shot_record_count} shots"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:144 #: lib/cannery_web/live/pack_live/show.ex:134
#: lib/cannery_web/live/range_live/index.html.heex:137 #: lib/cannery_web/live/range_live/index.html.heex:164
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Edit shot record of %{shot_record_count} shots" msgid "Edit shot record of %{shot_record_count} shots"
msgstr "" msgstr ""
@ -355,3 +350,8 @@ msgstr ""
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "add a type first" msgid "add a type first"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:17
#, elixir-autogen, elixir-format
msgid "Stage containers"
msgstr ""

View File

@ -34,55 +34,55 @@ msgstr ""
msgid "Ammo" msgid "Ammo"
msgstr "" msgstr ""
#: lib/cannery_web/live/tag_live/form_component.html.heex:25 #: lib/cannery_web/live/tag_live/form_component.html.heex:29
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Background color" msgid "Background color"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:86 #: lib/cannery_web/components/type_table_component.ex:86
#: lib/cannery_web/live/type_live/form_component.html.heex:333 #: lib/cannery_web/live/type_live/form_component.html.heex:358
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Blank" msgid "Blank"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:180 #: lib/cannery_web/live/type_live/form_component.html.heex:195
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Brass" msgid "Brass"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:61 #: lib/cannery_web/components/type_table_component.ex:61
#: lib/cannery_web/live/type_live/form_component.html.heex:151 #: lib/cannery_web/live/type_live/form_component.html.heex:163
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Bullet core" msgid "Bullet core"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:59 #: lib/cannery_web/components/type_table_component.ex:59
#: lib/cannery_web/live/type_live/form_component.html.heex:125 #: lib/cannery_web/live/type_live/form_component.html.heex:136
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Bullet type" msgid "Bullet type"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:51 #: lib/cannery_web/components/type_table_component.ex:51
#: lib/cannery_web/live/type_live/form_component.html.heex:67 #: lib/cannery_web/live/type_live/form_component.html.heex:74
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Caliber" msgid "Caliber"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:49 #: lib/cannery_web/components/type_table_component.ex:49
#: lib/cannery_web/live/type_live/form_component.html.heex:51 #: lib/cannery_web/live/type_live/form_component.html.heex:57
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Cartridge" msgid "Cartridge"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:66 #: lib/cannery_web/components/type_table_component.ex:66
#: lib/cannery_web/live/type_live/form_component.html.heex:174 #: lib/cannery_web/live/type_live/form_component.html.heex:188
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Case material" msgid "Case material"
msgstr "" msgstr ""
#: lib/cannery_web/components/move_pack_component.ex:64 #: lib/cannery_web/components/move_pack_component.ex:64
#: lib/cannery_web/components/pack_table_component.ex:76 #: lib/cannery_web/components/pack_table_component.ex:76
#: lib/cannery_web/live/pack_live/form_component.html.heex:65 #: lib/cannery_web/live/pack_live/form_component.html.heex:84
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Container" msgid "Container"
msgstr "" msgstr ""
@ -96,13 +96,13 @@ msgid "Containers"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:87 #: lib/cannery_web/components/type_table_component.ex:87
#: lib/cannery_web/live/type_live/form_component.html.heex:337 #: lib/cannery_web/live/type_live/form_component.html.heex:362
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Corrosive" msgid "Corrosive"
msgstr "" msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:104 #: lib/cannery_web/components/pack_table_component.ex:104
#: lib/cannery_web/live/pack_live/form_component.html.heex:28 #: lib/cannery_web/live/pack_live/form_component.html.heex:45
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Count" msgid "Count"
msgstr "" msgstr ""
@ -113,9 +113,9 @@ msgstr ""
msgid "Count:" msgid "Count:"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:46 #: lib/cannery_web/components/container_table_component.ex:50
#: lib/cannery_web/live/container_live/form_component.html.heex:29 #: lib/cannery_web/live/container_live/form_component.html.heex:30
#: lib/cannery_web/live/type_live/form_component.html.heex:38 #: lib/cannery_web/live/type_live/form_component.html.heex:43
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Description" msgid "Description"
msgstr "" msgstr ""
@ -141,19 +141,19 @@ msgstr ""
msgid "Edit Tag" msgid "Edit Tag"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:139 #: lib/cannery_web/live/type_live/form_component.html.heex:151
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "FMJ" msgid "FMJ"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:58 #: lib/cannery_web/components/type_table_component.ex:58
#: lib/cannery_web/live/type_live/form_component.html.heex:115 #: lib/cannery_web/live/type_live/form_component.html.heex:126
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Grains" msgid "Grains"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:85 #: lib/cannery_web/components/type_table_component.ex:85
#: lib/cannery_web/live/type_live/form_component.html.heex:329 #: lib/cannery_web/live/type_live/form_component.html.heex:354
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Incendiary" msgid "Incendiary"
msgstr "" msgstr ""
@ -180,14 +180,14 @@ msgstr ""
msgid "Invites" msgid "Invites"
msgstr "" 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 #, elixir-autogen, elixir-format
msgid "Keep me logged in for 60 days" msgid "Keep me logged in for 60 days"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:47 #: lib/cannery_web/components/container_table_component.ex:51
#: lib/cannery_web/components/move_pack_component.ex:66 #: lib/cannery_web/components/move_pack_component.ex:66
#: lib/cannery_web/live/container_live/form_component.html.heex:46 #: lib/cannery_web/live/container_live/form_component.html.heex:49
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Location" msgid "Location"
msgstr "" msgstr ""
@ -198,34 +198,34 @@ msgstr ""
msgid "Location:" msgid "Location:"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/form_component.html.heex:41 #: lib/cannery_web/live/container_live/form_component.html.heex:45
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Magazine, Clip, Ammo Box, etc" msgid "Magazine, Clip, Ammo Box, etc"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:88 #: lib/cannery_web/components/type_table_component.ex:88
#: lib/cannery_web/live/type_live/form_component.html.heex:342 #: lib/cannery_web/live/type_live/form_component.html.heex:367
#: lib/cannery_web/live/type_live/form_component.html.heex:345 #: lib/cannery_web/live/type_live/form_component.html.heex:370
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Manufacturer" msgid "Manufacturer"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/form_component.html.heex:33 #: lib/cannery_web/live/container_live/form_component.html.heex:36
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Metal ammo can with the anime girl sticker" msgid "Metal ammo can with the anime girl sticker"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/form_component.html.heex:24 #: lib/cannery_web/live/container_live/form_component.html.heex:26
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "My cool ammo can" msgid "My cool ammo can"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:45 #: lib/cannery_web/components/container_table_component.ex:49
#: lib/cannery_web/components/type_table_component.ex:152 #: lib/cannery_web/components/type_table_component.ex:152
#: lib/cannery_web/live/container_live/form_component.html.heex:21 #: lib/cannery_web/live/container_live/form_component.html.heex:21
#: lib/cannery_web/live/invite_live/form_component.html.heex:21 #: lib/cannery_web/live/invite_live/form_component.html.heex:21
#: lib/cannery_web/live/tag_live/form_component.html.heex:21 #: lib/cannery_web/live/tag_live/form_component.html.heex:21
#: lib/cannery_web/live/type_live/form_component.html.heex:31 #: lib/cannery_web/live/type_live/form_component.html.heex:35
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Name" msgid "Name"
msgstr "" msgstr ""
@ -276,8 +276,8 @@ msgstr ""
#: lib/cannery_web/components/add_shot_record_component.html.heex:38 #: lib/cannery_web/components/add_shot_record_component.html.heex:38
#: lib/cannery_web/components/shot_record_table_component.ex:46 #: lib/cannery_web/components/shot_record_table_component.ex:46
#: lib/cannery_web/live/pack_live/form_component.html.heex:57 #: lib/cannery_web/live/pack_live/form_component.html.heex:75
#: lib/cannery_web/live/pack_live/show.ex:90 #: lib/cannery_web/live/pack_live/show.ex:80
#: lib/cannery_web/live/range_live/form_component.html.heex:30 #: lib/cannery_web/live/range_live/form_component.html.heex:30
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Notes" msgid "Notes"
@ -289,19 +289,19 @@ msgstr ""
msgid "Notes:" msgid "Notes:"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/form_component.html.heex:50 #: lib/cannery_web/live/container_live/form_component.html.heex:55
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "On the bookshelf" msgid "On the bookshelf"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:79 #: lib/cannery_web/components/type_table_component.ex:79
#: lib/cannery_web/live/type_live/form_component.html.heex:266 #: lib/cannery_web/live/type_live/form_component.html.heex:287
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Pressure" msgid "Pressure"
msgstr "" msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:92 #: lib/cannery_web/components/pack_table_component.ex:92
#: lib/cannery_web/live/pack_live/form_component.html.heex:35 #: lib/cannery_web/live/pack_live/form_component.html.heex:52
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Price paid" msgid "Price paid"
msgstr "" msgstr ""
@ -312,7 +312,7 @@ msgid "Price paid:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:82 #: lib/cannery_web/components/type_table_component.ex:82
#: lib/cannery_web/live/type_live/form_component.html.heex:305 #: lib/cannery_web/live/type_live/form_component.html.heex:328
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Primer type" msgid "Primer type"
msgstr "" msgstr ""
@ -332,7 +332,7 @@ msgstr ""
msgid "Self-host your own instance, or use an instance from someone you trust." msgid "Self-host your own instance, or use an instance from someone you trust."
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_settings_controller.ex:10 #: lib/cannery_web/controllers/user_settings_controller.ex:9
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:3 #: lib/cannery_web/controllers/user_settings_html/edit.html.heex:3
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Settings" msgid "Settings"
@ -343,17 +343,17 @@ msgstr ""
msgid "Simple:" msgid "Simple:"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:158 #: lib/cannery_web/live/type_live/form_component.html.heex:171
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Steel" msgid "Steel"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.html.heex:100 #: lib/cannery_web/live/pack_live/show.html.heex:94
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Stored in" msgid "Stored in"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:66 #: lib/cannery_web/components/container_table_component.ex:73
#: lib/cannery_web/components/core_components/topbar.html.heex:28 #: lib/cannery_web/components/core_components/topbar.html.heex:28
#: lib/cannery_web/live/tag_live/index.ex:43 #: lib/cannery_web/live/tag_live/index.ex:43
#: lib/cannery_web/live/tag_live/index.ex:53 #: lib/cannery_web/live/tag_live/index.ex:53
@ -367,7 +367,7 @@ msgstr ""
msgid "Tags can be added to your containers to help you organize" msgid "Tags can be added to your containers to help you organize"
msgstr "" msgstr ""
#: lib/cannery_web/live/tag_live/form_component.html.heex:31 #: lib/cannery_web/live/tag_live/form_component.html.heex:35
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Text color" msgid "Text color"
msgstr "" msgstr ""
@ -378,16 +378,16 @@ msgid "The self-hosted firearm tracker website"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:84 #: lib/cannery_web/components/type_table_component.ex:84
#: lib/cannery_web/live/type_live/form_component.html.heex:325 #: lib/cannery_web/live/type_live/form_component.html.heex:350
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Tracer" msgid "Tracer"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:48 #: lib/cannery_web/components/container_table_component.ex:52
#: lib/cannery_web/components/move_pack_component.ex:65 #: lib/cannery_web/components/move_pack_component.ex:65
#: lib/cannery_web/components/pack_table_component.ex:108 #: lib/cannery_web/components/pack_table_component.ex:108
#: lib/cannery_web/live/container_live/form_component.html.heex:38 #: lib/cannery_web/live/container_live/form_component.html.heex:40
#: lib/cannery_web/live/pack_live/form_component.html.heex:22 #: lib/cannery_web/live/pack_live/form_component.html.heex:37
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Type" msgid "Type"
msgstr "" msgstr ""
@ -403,7 +403,7 @@ msgstr ""
msgid "Users" msgid "Users"
msgstr "" msgstr ""
#: lib/cannery_web/live/invite_live/form_component.html.heex:28 #: lib/cannery_web/live/invite_live/form_component.html.heex:31
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Uses left" msgid "Uses left"
msgstr "" msgstr ""
@ -413,15 +413,16 @@ msgstr ""
msgid "Your data stays with you, period" msgid "Your data stays with you, period"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:60 #: lib/cannery_web/live/container_live/show.html.heex:68
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No tags for this container" msgid "No tags for this container"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:77
#: lib/cannery_web/components/core_components/topbar.html.heex:48 #: lib/cannery_web/components/core_components/topbar.html.heex:48
#: lib/cannery_web/components/pack_table_component.ex:80 #: 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:76
#: lib/cannery_web/live/range_live/index.ex:65 #: lib/cannery_web/live/range_live/index.ex:86
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Range" msgid "Range"
msgstr "" msgstr ""
@ -431,10 +432,10 @@ msgstr ""
msgid "Range day" msgid "Range day"
msgstr "" msgstr ""
#: lib/cannery_web/components/add_shot_record_component.html.heex:48 #: lib/cannery_web/components/add_shot_record_component.html.heex:49
#: lib/cannery_web/components/shot_record_table_component.ex:47 #: lib/cannery_web/components/shot_record_table_component.ex:47
#: lib/cannery_web/live/pack_live/show.ex:91 #: lib/cannery_web/live/pack_live/show.ex:81
#: lib/cannery_web/live/range_live/form_component.html.heex:40 #: lib/cannery_web/live/range_live/form_component.html.heex:41
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Date" msgid "Date"
msgstr "" msgstr ""
@ -444,26 +445,21 @@ msgstr ""
msgid "Shots fired" msgid "Shots fired"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:8
#, elixir-autogen, elixir-format
msgid "No ammo staged"
msgstr ""
#: lib/cannery_web/components/add_shot_record_component.html.heex:3 #: lib/cannery_web/components/add_shot_record_component.html.heex:3
#: lib/cannery_web/live/pack_live/index.ex:35 #: lib/cannery_web/live/pack_live/index.ex:35
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Record shots" msgid "Record shots"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:52 #: lib/cannery_web/live/range_live/index.html.heex:64
#: lib/cannery_web/live/range_live/index.html.heex:121 #: lib/cannery_web/live/range_live/index.html.heex:148
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No shots recorded" msgid "No shots recorded"
msgstr "" msgstr ""
#: lib/cannery_web/components/shot_record_table_component.ex:45 #: lib/cannery_web/components/shot_record_table_component.ex:45
#: lib/cannery_web/live/pack_live/show.ex:89 #: lib/cannery_web/live/pack_live/show.ex:79
#: lib/cannery_web/live/range_live/index.html.heex:66 #: lib/cannery_web/live/range_live/index.html.heex:78
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Rounds shot" msgid "Rounds shot"
msgstr "" msgstr ""
@ -478,7 +474,7 @@ msgstr ""
msgid "No other containers" msgid "No other containers"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:57 #: lib/cannery_web/live/range_live/index.html.heex:69
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot log" msgid "Shot log"
msgstr "" msgstr ""
@ -486,7 +482,7 @@ msgstr ""
#: lib/cannery_web/components/core_components/pack_card.html.heex:42 #: 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/core_components/pack_card.html.heex:47
#: lib/cannery_web/components/pack_table_component.ex:181 #: lib/cannery_web/components/pack_table_component.ex:181
#: lib/cannery_web/components/pack_table_component.ex:264 #: lib/cannery_web/components/pack_table_component.ex:263
#: lib/cannery_web/components/type_table_component.ex:273 #: 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:37
#: lib/cannery_web/live/pack_live/show.html.heex:42 #: lib/cannery_web/live/pack_live/show.html.heex:42
@ -495,36 +491,36 @@ msgstr ""
msgid "$%{amount}" msgid "$%{amount}"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:167 #: lib/cannery_web/live/type_live/form_component.html.heex:181
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Bimetal" msgid "Bimetal"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:65 #: lib/cannery_web/components/type_table_component.ex:65
#: lib/cannery_web/live/type_live/form_component.html.heex:163 #: lib/cannery_web/live/type_live/form_component.html.heex:176
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Jacket type" msgid "Jacket type"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:81 #: lib/cannery_web/components/type_table_component.ex:81
#: lib/cannery_web/live/type_live/form_component.html.heex:288 #: lib/cannery_web/live/type_live/form_component.html.heex:311
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Muzzle velocity" msgid "Muzzle velocity"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:75 #: lib/cannery_web/components/type_table_component.ex:75
#: lib/cannery_web/live/type_live/form_component.html.heex:253 #: lib/cannery_web/live/type_live/form_component.html.heex:274
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Powder grains per charge" msgid "Powder grains per charge"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:73 #: lib/cannery_web/components/type_table_component.ex:73
#: lib/cannery_web/live/type_live/form_component.html.heex:245 #: lib/cannery_web/live/type_live/form_component.html.heex:265
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Powder type" msgid "Powder type"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:352 #: lib/cannery_web/live/type_live/form_component.html.heex:378
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "UPC" msgid "UPC"
msgstr "" msgstr ""
@ -548,24 +544,24 @@ msgid "New password"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:83 #: lib/cannery_web/components/type_table_component.ex:83
#: lib/cannery_web/live/type_live/form_component.html.heex:313 #: lib/cannery_web/live/type_live/form_component.html.heex:337
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Firing type" msgid "Firing type"
msgstr "" msgstr ""
#: lib/cannery_web/components/layouts/live.html.heex:43 #: lib/cannery_web/components/layouts/app.html.heex:43
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Reconnecting..." msgid "Reconnecting..."
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.ex:28 #: lib/cannery_web/live/container_live/index.ex:28
#: lib/cannery_web/live/container_live/show.ex:118 #: lib/cannery_web/live/container_live/show.ex:130
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit %{name}" msgid "Edit %{name}"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.ex:63 #: lib/cannery_web/live/container_live/index.ex:63
#: lib/cannery_web/live/container_live/show.ex:119 #: lib/cannery_web/live/container_live/show.ex:131
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Edit %{name} tags" msgid "Edit %{name} tags"
msgstr "" msgstr ""
@ -578,7 +574,7 @@ msgid "Rounds:"
msgstr "" msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:178 #: lib/cannery_web/components/pack_table_component.ex:178
#: lib/cannery_web/components/pack_table_component.ex:260 #: lib/cannery_web/components/pack_table_component.ex:259
#: lib/cannery_web/components/type_table_component.ex:272 #: lib/cannery_web/components/type_table_component.ex:272
#: lib/cannery_web/live/type_live/show.html.heex:154 #: lib/cannery_web/live/type_live/show.html.heex:154
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -610,12 +606,12 @@ msgstr ""
msgid "Percentage left:" msgid "Percentage left:"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.html.heex:113 #: lib/cannery_web/live/pack_live/show.html.heex:107
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Rounds used" msgid "Rounds used"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_confirmation_controller.ex:8 #: lib/cannery_web/controllers/user_confirmation_controller.ex:6
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Confirm your account" msgid "Confirm your account"
msgstr "" msgstr ""
@ -630,7 +626,7 @@ msgstr ""
msgid "Log in" msgid "Log in"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_registration_controller.ex:32 #: lib/cannery_web/controllers/user_registration_controller.ex:31
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Register" msgid "Register"
msgstr "" msgstr ""
@ -641,13 +637,13 @@ msgid "Reset your password"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:40 #: 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:52
#: lib/cannery_web/live/range_live/index.ex:47 #: lib/cannery_web/live/range_live/index.ex:68
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Record Shots" msgid "Record Shots"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/form_component.html.heex:75 #: lib/cannery_web/live/pack_live/form_component.html.heex:96
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Copies" msgid "Copies"
msgstr "" msgstr ""
@ -657,22 +653,6 @@ msgstr ""
msgid "Added on:" msgid "Added on:"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:32
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:127
#, elixir-autogen, elixir-format
msgid "English"
msgstr ""
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:129
#, elixir-autogen, elixir-format
msgid "French"
msgstr ""
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:128
#, elixir-autogen, elixir-format
msgid "German"
msgstr ""
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:28 #: lib/cannery_web/controllers/user_registration_html/new.html.heex:28
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Language" msgid "Language"
@ -716,7 +696,7 @@ msgstr ""
msgid "Move Ammo" msgid "Move Ammo"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:117 #: lib/cannery_web/live/container_live/show.html.heex:125
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "No ammo in this container" msgid "No ammo in this container"
msgstr "" msgstr ""
@ -726,7 +706,7 @@ msgstr ""
msgid "Show Ammo" msgid "Show Ammo"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.html.heex:105 #: lib/cannery_web/live/pack_live/show.html.heex:99
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "This ammo is not in a container" msgid "This ammo is not in a container"
msgstr "" msgstr ""
@ -749,7 +729,7 @@ msgstr ""
msgid "isn't he cute >:3" msgid "isn't he cute >:3"
msgstr "" msgstr ""
#: lib/cannery_web/live/invite_live/form_component.html.heex:32 #: lib/cannery_web/live/invite_live/form_component.html.heex:35
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Leave \"Uses left\" blank to make invite unlimited" msgid "Leave \"Uses left\" blank to make invite unlimited"
msgstr "" msgstr ""
@ -766,31 +746,31 @@ msgstr ""
msgid "Show used" msgid "Show used"
msgstr "" msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:219 #: lib/cannery_web/components/pack_table_component.ex:218
#: lib/cannery_web/live/pack_live/show.html.heex:19 #: lib/cannery_web/live/pack_live/show.html.heex:19
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{percentage}%" msgid "%{percentage}%"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.ex:153 #: lib/cannery_web/live/range_live/index.ex:215
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Rounds shot: %{count}" msgid "Rounds shot: %{count}"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:64 #: lib/cannery_web/components/container_table_component.ex:68
#: lib/cannery_web/components/type_table_component.ex:122 #: lib/cannery_web/components/type_table_component.ex:122
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Packs" msgid "Packs"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:65 #: lib/cannery_web/components/container_table_component.ex:69
#: lib/cannery_web/components/type_table_component.ex:143 #: lib/cannery_web/components/type_table_component.ex:143
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Rounds" msgid "Rounds"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:40 #: lib/cannery_web/live/container_live/index.html.heex:40
#: lib/cannery_web/live/container_live/show.html.heex:109 #: lib/cannery_web/live/container_live/show.html.heex:117
#: lib/cannery_web/live/type_live/show.html.heex:170 #: lib/cannery_web/live/type_live/show.html.heex:170
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "View as table" msgid "View as table"
@ -836,7 +816,7 @@ msgstr ""
msgid "Used rounds:" msgid "Used rounds:"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:68 #: lib/cannery_web/live/range_live/index.html.heex:80
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Rounds shot chart" msgid "Rounds shot chart"
msgstr "" msgstr ""
@ -943,7 +923,7 @@ msgid "Average CPR"
msgstr "" msgstr ""
#: lib/cannery_web/components/core_components/pack_card.html.heex:17 #: lib/cannery_web/components/core_components/pack_card.html.heex:17
#: lib/cannery_web/components/pack_table_component.ex:268 #: lib/cannery_web/components/pack_table_component.ex:267
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Empty" msgid "Empty"
msgstr "" msgstr ""
@ -989,7 +969,7 @@ msgid "Never used"
msgstr "" msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:71 #: lib/cannery_web/components/pack_table_component.ex:71
#: lib/cannery_web/live/pack_live/form_component.html.heex:49 #: lib/cannery_web/live/pack_live/form_component.html.heex:67
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Purchased on" msgid "Purchased on"
msgstr "" msgstr ""
@ -1005,36 +985,31 @@ msgstr ""
msgid "Edit ammo" msgid "Edit ammo"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/index.html.heex:60 #: lib/cannery_web/live/type_live/index.html.heex:58
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Search catalog" msgid "Search catalog"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:81 #: lib/cannery_web/live/pack_live/index.html.heex:79
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Search ammo" msgid "Search ammo"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:34 #: lib/cannery_web/live/container_live/index.html.heex:32
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Search containers" msgid "Search containers"
msgstr "" msgstr ""
#: lib/cannery_web/live/tag_live/index.html.heex:36 #: lib/cannery_web/live/tag_live/index.html.heex:34
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Search tags" msgid "Search tags"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:114 #: lib/cannery_web/live/range_live/index.html.heex:124
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Search shot records" msgid "Search shot records"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:130
#, elixir-autogen, elixir-format
msgid "Spanish"
msgstr ""
#: lib/cannery_web/components/layouts.ex:15 #: lib/cannery_web/components/layouts.ex:15
#: lib/cannery_web/components/layouts/root.html.heex:9 #: lib/cannery_web/components/layouts/root.html.heex:9
#: lib/cannery_web/components/layouts/root.html.heex:10 #: lib/cannery_web/components/layouts/root.html.heex:10
@ -1118,48 +1093,48 @@ msgid "Email"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:24 #: 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 #, elixir-autogen, elixir-format
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:270 #: lib/cannery_web/live/type_live/form_component.html.heex:292
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "+P" msgid "+P"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:74 #: lib/cannery_web/live/type_live/form_component.html.heex:82
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid ".223" msgid ".223"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:55 #: lib/cannery_web/live/type_live/form_component.html.heex:62
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "5.56x46mm NATO" msgid "5.56x46mm NATO"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:309 #: lib/cannery_web/live/type_live/form_component.html.heex:333
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Boxer" msgid "Boxer"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:317 #: lib/cannery_web/live/type_live/form_component.html.heex:342
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Centerfire" msgid "Centerfire"
msgstr "" msgstr ""
#: lib/cannery_web/components/add_shot_record_component.html.heex:43 #: lib/cannery_web/components/add_shot_record_component.html.heex:45
#: lib/cannery_web/live/range_live/form_component.html.heex:35 #: lib/cannery_web/live/range_live/form_component.html.heex:37
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Really great weather" msgid "Really great weather"
msgstr "" msgstr ""
#: lib/cannery_web/components/container_table_component.ex:67 #: lib/cannery_web/components/container_table_component.ex:74
#: lib/cannery_web/components/move_pack_component.ex:67 #: lib/cannery_web/components/move_pack_component.ex:67
#: lib/cannery_web/components/pack_table_component.ex:62 #: lib/cannery_web/components/pack_table_component.ex:62
#: lib/cannery_web/components/shot_record_table_component.ex:48 #: lib/cannery_web/components/shot_record_table_component.ex:48
#: lib/cannery_web/components/type_table_component.ex:99 #: lib/cannery_web/components/type_table_component.ex:99
#: lib/cannery_web/live/pack_live/show.ex:92 #: lib/cannery_web/live/pack_live/show.ex:82
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Actions" msgid "Actions"
msgstr "" msgstr ""
@ -1185,21 +1160,21 @@ msgstr ""
msgid "Close modal" msgid "Close modal"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:97 #: lib/cannery_web/live/container_live/show.html.heex:105
#: lib/cannery_web/live/pack_live/index.html.heex:58 #: lib/cannery_web/live/pack_live/index.html.heex:58
#: lib/cannery_web/live/range_live/index.html.heex:91 #: lib/cannery_web/live/range_live/index.html.heex:103
#: lib/cannery_web/live/type_live/index.html.heex:37 #: lib/cannery_web/live/type_live/index.html.heex:37
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "All" msgid "All"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:322 #: lib/cannery_web/live/type_live/form_component.html.heex:347
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Attributes" msgid "Attributes"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:56 #: lib/cannery_web/components/type_table_component.ex:56
#: lib/cannery_web/live/type_live/form_component.html.heex:88 #: lib/cannery_web/live/type_live/form_component.html.heex:97
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Brass height" msgid "Brass height"
msgstr "" msgstr ""
@ -1210,7 +1185,7 @@ msgid "Brass height:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:57 #: lib/cannery_web/components/type_table_component.ex:57
#: lib/cannery_web/live/type_live/form_component.html.heex:97 #: lib/cannery_web/live/type_live/form_component.html.heex:107
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Chamber size" msgid "Chamber size"
msgstr "" msgstr ""
@ -1220,13 +1195,13 @@ msgstr ""
msgid "Chamber size:" msgid "Chamber size:"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:47 #: lib/cannery_web/live/type_live/form_component.html.heex:53
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Dimensions" msgid "Dimensions"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:80 #: lib/cannery_web/components/type_table_component.ex:80
#: lib/cannery_web/live/type_live/form_component.html.heex:275 #: lib/cannery_web/live/type_live/form_component.html.heex:297
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Dram equivalent" msgid "Dram equivalent"
msgstr "" msgstr ""
@ -1237,7 +1212,7 @@ msgid "Dram equivalent:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:51 #: lib/cannery_web/components/type_table_component.ex:51
#: lib/cannery_web/live/type_live/form_component.html.heex:66 #: lib/cannery_web/live/type_live/form_component.html.heex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Gauge" msgid "Gauge"
msgstr "" msgstr ""
@ -1248,7 +1223,7 @@ msgid "Gauge:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:71 #: lib/cannery_web/components/type_table_component.ex:71
#: lib/cannery_web/live/type_live/form_component.html.heex:216 #: lib/cannery_web/live/type_live/form_component.html.heex:235
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Load grains" msgid "Load grains"
msgstr "" msgstr ""
@ -1268,35 +1243,37 @@ msgstr ""
msgid "None specified" msgid "None specified"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:100 #: lib/cannery_web/live/container_live/show.html.heex:108
#: lib/cannery_web/live/pack_live/form_component.html.heex:30
#: lib/cannery_web/live/pack_live/index.html.heex:61 #: lib/cannery_web/live/pack_live/index.html.heex:61
#: lib/cannery_web/live/range_live/index.html.heex:94 #: lib/cannery_web/live/range_live/index.html.heex:106
#: lib/cannery_web/live/type_live/form_component.html.heex:25 #: lib/cannery_web/live/type_live/form_component.html.heex:28
#: lib/cannery_web/live/type_live/index.html.heex:40 #: lib/cannery_web/live/type_live/index.html.heex:40
#: lib/cannery_web/live/type_live/show.html.heex:56 #: lib/cannery_web/live/type_live/show.html.heex:56
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Pistol" msgid "Pistol"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:242 #: lib/cannery_web/live/type_live/form_component.html.heex:262
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Powder" msgid "Powder"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:302 #: lib/cannery_web/live/type_live/form_component.html.heex:325
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Primer" msgid "Primer"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:112 #: lib/cannery_web/live/type_live/form_component.html.heex:123
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Projectile" msgid "Projectile"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:98 #: lib/cannery_web/live/container_live/show.html.heex:106
#: lib/cannery_web/live/pack_live/form_component.html.heex:28
#: lib/cannery_web/live/pack_live/index.html.heex:59 #: lib/cannery_web/live/pack_live/index.html.heex:59
#: lib/cannery_web/live/range_live/index.html.heex:92 #: lib/cannery_web/live/range_live/index.html.heex:104
#: lib/cannery_web/live/type_live/form_component.html.heex:25 #: lib/cannery_web/live/type_live/form_component.html.heex:26
#: lib/cannery_web/live/type_live/index.html.heex:38 #: lib/cannery_web/live/type_live/index.html.heex:38
#: lib/cannery_web/live/type_live/show.html.heex:54 #: lib/cannery_web/live/type_live/show.html.heex:54
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -1304,7 +1281,7 @@ msgid "Rifle"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:72 #: lib/cannery_web/components/type_table_component.ex:72
#: lib/cannery_web/live/type_live/form_component.html.heex:224 #: lib/cannery_web/live/type_live/form_component.html.heex:243
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot charge weight" msgid "Shot charge weight"
msgstr "" msgstr ""
@ -1315,7 +1292,7 @@ msgid "Shot charge weight:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:69 #: lib/cannery_web/components/type_table_component.ex:69
#: lib/cannery_web/live/type_live/form_component.html.heex:200 #: lib/cannery_web/live/type_live/form_component.html.heex:217
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot material" msgid "Shot material"
msgstr "" msgstr ""
@ -1326,7 +1303,7 @@ msgid "Shot material:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:70 #: lib/cannery_web/components/type_table_component.ex:70
#: lib/cannery_web/live/type_live/form_component.html.heex:209 #: lib/cannery_web/live/type_live/form_component.html.heex:227
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Shot size" msgid "Shot size"
msgstr "" msgstr ""
@ -1337,7 +1314,7 @@ msgid "Shot size:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:68 #: lib/cannery_web/components/type_table_component.ex:68
#: lib/cannery_web/live/type_live/form_component.html.heex:192 #: lib/cannery_web/live/type_live/form_component.html.heex:208
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot type" msgid "Shot type"
msgstr "" msgstr ""
@ -1347,10 +1324,11 @@ msgstr ""
msgid "Shot type:" msgid "Shot type:"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:99 #: lib/cannery_web/live/container_live/show.html.heex:107
#: lib/cannery_web/live/pack_live/form_component.html.heex:29
#: lib/cannery_web/live/pack_live/index.html.heex:60 #: lib/cannery_web/live/pack_live/index.html.heex:60
#: lib/cannery_web/live/range_live/index.html.heex:93 #: lib/cannery_web/live/range_live/index.html.heex:105
#: lib/cannery_web/live/type_live/form_component.html.heex:25 #: lib/cannery_web/live/type_live/form_component.html.heex:27
#: lib/cannery_web/live/type_live/index.html.heex:39 #: lib/cannery_web/live/type_live/index.html.heex:39
#: lib/cannery_web/live/type_live/show.html.heex:52 #: lib/cannery_web/live/type_live/show.html.heex:52
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -1358,12 +1336,12 @@ msgid "Shotgun"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:61 #: lib/cannery_web/components/type_table_component.ex:61
#: lib/cannery_web/live/type_live/form_component.html.heex:150 #: lib/cannery_web/live/type_live/form_component.html.heex:162
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Slug core" msgid "Slug core"
msgstr "" msgstr ""
#: lib/cannery_web/live/type_live/form_component.html.heex:196 #: lib/cannery_web/live/type_live/form_component.html.heex:213
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Target, bird, buck, etc" msgid "Target, bird, buck, etc"
msgstr "" msgstr ""
@ -1374,13 +1352,13 @@ msgid "Unfired length:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:55 #: lib/cannery_web/components/type_table_component.ex:55
#: lib/cannery_web/live/type_live/form_component.html.heex:79 #: lib/cannery_web/live/type_live/form_component.html.heex:87
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Unfired shell length" msgid "Unfired shell length"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:67 #: lib/cannery_web/components/type_table_component.ex:67
#: lib/cannery_web/live/type_live/form_component.html.heex:185 #: lib/cannery_web/live/type_live/form_component.html.heex:200
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Wadding" msgid "Wadding"
msgstr "" msgstr ""
@ -1391,9 +1369,10 @@ msgid "Wadding:"
msgstr "" msgstr ""
#: lib/cannery_web/components/type_table_component.ex:149 #: lib/cannery_web/components/type_table_component.ex:149
#: lib/cannery_web/live/container_live/show.html.heex:91 #: lib/cannery_web/live/container_live/show.html.heex:99
#: lib/cannery_web/live/pack_live/form_component.html.heex:22
#: lib/cannery_web/live/pack_live/index.html.heex:50 #: lib/cannery_web/live/pack_live/index.html.heex:50
#: lib/cannery_web/live/range_live/index.html.heex:83 #: lib/cannery_web/live/range_live/index.html.heex:95
#: lib/cannery_web/live/type_live/form_component.html.heex:21 #: lib/cannery_web/live/type_live/form_component.html.heex:21
#: lib/cannery_web/live/type_live/index.html.heex:29 #: lib/cannery_web/live/type_live/index.html.heex:29
#: lib/cannery_web/live/type_live/show.html.heex:46 #: lib/cannery_web/live/type_live/show.html.heex:46
@ -1413,7 +1392,7 @@ msgid "Used up!"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:41 #: lib/cannery_web/live/pack_live/show.ex:41
#: lib/cannery_web/live/range_live/index.ex:39 #: lib/cannery_web/live/range_live/index.ex:60
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Edit Shot Record" msgid "Edit Shot Record"
msgstr "" msgstr ""
@ -1437,7 +1416,7 @@ msgid "No Types"
msgstr "" msgstr ""
#: lib/cannery_web/components/pack_table_component.ex:84 #: lib/cannery_web/components/pack_table_component.ex:84
#: lib/cannery_web/live/pack_live/form_component.html.heex:42 #: lib/cannery_web/live/pack_live/form_component.html.heex:59
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Lot number" msgid "Lot number"
msgstr "" msgstr ""
@ -1446,3 +1425,18 @@ msgstr ""
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Lot number:" msgid "Lot number:"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/form_component.html.heex:27
#, elixir-autogen, elixir-format
msgid "Any"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:138
#, elixir-autogen, elixir-format, fuzzy
msgid "Dates"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:8
#, elixir-autogen, elixir-format, fuzzy
msgid "No containers staged"
msgstr ""

View File

@ -49,7 +49,7 @@ msgstr ""
msgid "You can reset your password by visiting the URL below:" msgid "You can reset your password by visiting the URL below:"
msgstr "" msgstr ""
#: lib/cannery/accounts/email.ex:31 #: lib/cannery/email.ex:31
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Confirm your Cannery account" msgid "Confirm your Cannery account"
msgstr "" msgstr ""
@ -65,7 +65,7 @@ msgstr ""
msgid "If you didn't request this change from Cannery, please ignore this." msgid "If you didn't request this change from Cannery, please ignore this."
msgstr "" msgstr ""
#: lib/cannery/accounts/email.ex:38 #: lib/cannery/email.ex:38
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Reset your Cannery password" msgid "Reset your Cannery password"
msgstr "" msgstr ""
@ -80,7 +80,7 @@ msgstr ""
msgid "This email was sent from Cannery, the self-hosted firearm tracker website." msgid "This email was sent from Cannery, the self-hosted firearm tracker website."
msgstr "" msgstr ""
#: lib/cannery/accounts/email.ex:45 #: lib/cannery/email.ex:45
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Update your Cannery email" msgid "Update your Cannery email"
msgstr "" msgstr ""

View File

@ -10,7 +10,7 @@ msgid ""
msgstr "" msgstr ""
"Language: en\n" "Language: en\n"
#: lib/cannery/containers.ex:224 #: lib/cannery/containers.ex:234
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Container must be empty before deleting" msgid "Container must be empty before deleting"
msgstr "" msgstr ""
@ -26,7 +26,7 @@ msgstr ""
msgid "Could not find that container" msgid "Could not find that container"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_settings_controller.ex:84 #: lib/cannery_web/controllers/user_settings_controller.ex:83
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Email change link is invalid or it has expired." msgid "Email change link is invalid or it has expired."
msgstr "" msgstr ""
@ -67,20 +67,20 @@ msgstr ""
msgid "Reset password link is invalid or it has expired." msgid "Reset password link is invalid or it has expired."
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_registration_controller.ex:22 #: lib/cannery_web/controllers/user_registration_controller.ex:21
#: lib/cannery_web/controllers/user_registration_controller.ex:51 #: lib/cannery_web/controllers/user_registration_controller.ex:50
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Sorry, public registration is disabled" msgid "Sorry, public registration is disabled"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_registration_controller.ex:12 #: lib/cannery_web/controllers/user_registration_controller.ex:11
#: lib/cannery_web/controllers/user_registration_controller.ex:41 #: lib/cannery_web/controllers/user_registration_controller.ex:40
#: lib/cannery_web/controllers/user_registration_controller.ex:70 #: lib/cannery_web/controllers/user_registration_controller.ex:69
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Sorry, this invite was not found or expired" msgid "Sorry, this invite was not found or expired"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_settings_controller.ex:99 #: lib/cannery_web/controllers/user_settings_controller.ex:98
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Unable to delete user" msgid "Unable to delete user"
msgstr "" msgstr ""
@ -91,7 +91,7 @@ msgstr ""
msgid "Unauthorized" msgid "Unauthorized"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_confirmation_controller.ex:53 #: lib/cannery_web/controllers/user_confirmation_controller.ex:51
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "User confirmation link is invalid or it has expired." msgid "User confirmation link is invalid or it has expired."
msgstr "" msgstr ""
@ -101,23 +101,23 @@ msgstr ""
msgid "You are not authorized to view this page." msgid "You are not authorized to view this page."
msgstr "" msgstr ""
#: lib/cannery/accounts/user.ex:145 #: lib/cannery/accounts/user.ex:140
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "did not change" msgid "did not change"
msgstr "" msgstr ""
#: lib/cannery/accounts/user.ex:166 #: lib/cannery/accounts/user.ex:161
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "does not match password" msgid "does not match password"
msgstr "" msgstr ""
## From Ecto.Changeset.put_change/3 ## From Ecto.Changeset.put_change/3
#: lib/cannery/accounts/user.ex:203 #: lib/cannery/accounts/user.ex:198
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "is not valid" msgid "is not valid"
msgstr "" msgstr ""
#: lib/cannery/accounts/user.ex:100 #: lib/cannery/accounts/user.ex:95
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "must have the @ sign and no spaces" msgid "must have the @ sign and no spaces"
msgstr "" msgstr ""
@ -143,56 +143,46 @@ msgstr ""
msgid "Tag could not be removed" msgid "Tag could not be removed"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/form_component.ex:159 #: lib/cannery_web/live/pack_live/form_component.ex:175
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Could not parse number of copies" msgid "Could not parse number of copies"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/form_component.ex:149 #: lib/cannery/ammo.ex:1026
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}" msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
msgstr "" msgstr ""
#: lib/cannery/ammo.ex:974 #: lib/cannery_web/live/range_live/index.html.heex:83
#, elixir-autogen, elixir-format
msgid "Invalid multiplier"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:71
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Your browser does not support the canvas element." msgid "Your browser does not support the canvas element."
msgstr "" msgstr ""
#: lib/cannery/activity_log/shot_record.ex:74 #: lib/cannery/activity_log/shot_record.ex:71
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Please select a valid user and ammo pack" msgid "Please select a valid user and ammo pack"
msgstr "" msgstr ""
#: lib/cannery/activity_log/shot_record.ex:88 #: lib/cannery/activity_log/shot_record.ex:85
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Ammo left can be at most %{count} rounds" msgid "Ammo left can be at most %{count} rounds"
msgstr "" msgstr ""
#: lib/cannery/activity_log/shot_record.ex:84 #: lib/cannery/activity_log/shot_record.ex:81
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Ammo left must be at least 0" msgid "Ammo left must be at least 0"
msgstr "" msgstr ""
#: lib/cannery/activity_log/shot_record.ex:119 #: lib/cannery/activity_log/shot_record.ex:116
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Count can be at most %{count} shots" msgid "Count can be at most %{count} shots"
msgstr "" msgstr ""
#: lib/cannery/activity_log/shot_record.ex:80 #: lib/cannery/activity_log/shot_record.ex:77
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "can't be blank" msgid "can't be blank"
msgstr "" msgstr ""
#: lib/cannery/ammo/pack.ex:100
#, elixir-autogen, elixir-format, fuzzy
msgid "Please select a type and container"
msgstr ""
#: lib/cannery_web/controllers/error_html.ex:11 #: lib/cannery_web/controllers/error_html.ex:11
#: lib/cannery_web/controllers/error_json.ex:9 #: lib/cannery_web/controllers/error_json.ex:9
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
@ -208,3 +198,13 @@ msgstr ""
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "You must log in to access this page." msgid "You must log in to access this page."
msgstr "" msgstr ""
#: lib/cannery/ammo/pack.ex:101
#, elixir-autogen, elixir-format, fuzzy
msgid "Please select a valid container"
msgstr ""
#: lib/cannery/ammo/pack.ex:99
#, elixir-autogen, elixir-format, fuzzy
msgid "Please select a valid type"
msgstr ""

View File

@ -10,10 +10,10 @@ msgid ""
msgstr "" msgstr ""
"Language: en\n" "Language: en\n"
#: lib/cannery_web/live/container_live/form_component.ex:89 #: lib/cannery_web/live/container_live/form_component.ex:88
#: lib/cannery_web/live/invite_live/form_component.ex:80 #: lib/cannery_web/live/invite_live/form_component.ex:79
#: lib/cannery_web/live/tag_live/form_component.ex:78 #: lib/cannery_web/live/tag_live/form_component.ex:77
#: lib/cannery_web/live/type_live/form_component.ex:88 #: lib/cannery_web/live/type_live/form_component.ex:87
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{name} created successfully" msgid "%{name} created successfully"
msgstr "" msgstr ""
@ -31,34 +31,34 @@ msgstr ""
msgid "%{name} has been deleted" msgid "%{name} has been deleted"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/form_component.ex:70 #: lib/cannery_web/live/container_live/form_component.ex:69
#: lib/cannery_web/live/invite_live/form_component.ex:62 #: lib/cannery_web/live/invite_live/form_component.ex:61
#: lib/cannery_web/live/tag_live/form_component.ex:60 #: lib/cannery_web/live/tag_live/form_component.ex:59
#: lib/cannery_web/live/type_live/form_component.ex:69 #: lib/cannery_web/live/type_live/form_component.ex:68
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{name} updated successfully" msgid "%{name} updated successfully"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_settings_controller.ex:29 #: lib/cannery_web/controllers/user_settings_controller.ex:28
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "A link to confirm your email change has been sent to the new address." msgid "A link to confirm your email change has been sent to the new address."
msgstr "" msgstr ""
#: lib/cannery_web/live/invite_live/index.html.heex:110 #: lib/cannery_web/live/invite_live/index.html.heex:110
#: lib/cannery_web/live/invite_live/index.html.heex:138 #: lib/cannery_web/live/invite_live/index.html.heex:145
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{email}? This action is permanent!" msgid "Are you sure you want to delete %{email}? This action is permanent!"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:99 #: lib/cannery_web/live/container_live/index.html.heex:113
#: lib/cannery_web/live/container_live/index.html.heex:157 #: lib/cannery_web/live/container_live/index.html.heex:171
#: lib/cannery_web/live/container_live/show.html.heex:45 #: lib/cannery_web/live/container_live/show.html.heex:45
#: lib/cannery_web/live/tag_live/index.html.heex:63 #: lib/cannery_web/live/tag_live/index.html.heex:63
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete %{name}?" msgid "Are you sure you want to delete %{name}?"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:185 #: lib/cannery_web/live/pack_live/index.html.heex:174
#: lib/cannery_web/live/pack_live/show.html.heex:69 #: lib/cannery_web/live/pack_live/show.html.heex:69
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this ammo?" msgid "Are you sure you want to delete this ammo?"
@ -74,12 +74,12 @@ msgstr ""
msgid "Are you sure you want to log out?" msgid "Are you sure you want to log out?"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_settings_controller.ex:77 #: lib/cannery_web/controllers/user_settings_controller.ex:76
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Email changed successfully." msgid "Email changed successfully."
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_confirmation_controller.ex:23 #: lib/cannery_web/controllers/user_confirmation_controller.ex:21
#, elixir-autogen, elixir-format #, 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." msgid "If your email is in our system and it has not been confirmed yet, you will receive an email with instructions shortly."
msgstr "" msgstr ""
@ -99,28 +99,28 @@ msgstr ""
msgid "Password reset successfully." msgid "Password reset successfully."
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_settings_controller.ex:49 #: lib/cannery_web/controllers/user_settings_controller.ex:48
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Password updated successfully." msgid "Password updated successfully."
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_registration_controller.ex:65 #: lib/cannery_web/controllers/user_registration_controller.ex:64
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Please check your email to verify your account" msgid "Please check your email to verify your account"
msgstr "" msgstr ""
#: lib/cannery_web/components/add_shot_record_component.html.heex:58 #: lib/cannery_web/components/add_shot_record_component.html.heex:59
#: lib/cannery_web/live/container_live/form_component.html.heex:57 #: lib/cannery_web/live/container_live/form_component.html.heex:61
#: lib/cannery_web/live/invite_live/form_component.html.heex:37 #: lib/cannery_web/live/invite_live/form_component.html.heex:40
#: lib/cannery_web/live/pack_live/form_component.html.heex:91 #: lib/cannery_web/live/pack_live/form_component.html.heex:111
#: lib/cannery_web/live/range_live/form_component.html.heex:46 #: lib/cannery_web/live/range_live/form_component.html.heex:47
#: lib/cannery_web/live/tag_live/form_component.html.heex:39 #: lib/cannery_web/live/tag_live/form_component.html.heex:43
#: lib/cannery_web/live/type_live/form_component.html.heex:360 #: lib/cannery_web/live/type_live/form_component.html.heex:387
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Saving..." msgid "Saving..."
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_settings_controller.ex:95 #: lib/cannery_web/controllers/user_settings_controller.ex:94
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Your account has been deleted" msgid "Your account has been deleted"
msgstr "" msgstr ""
@ -140,29 +140,24 @@ msgstr ""
msgid "%{tag_name} has been removed from %{container_name}" msgid "%{tag_name} has been removed from %{container_name}"
msgstr "" msgstr ""
#: lib/cannery_web/live/container_live/edit_tags_component.html.heex:53 #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:55
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Adding..." msgid "Adding..."
msgstr "" msgstr ""
#: lib/cannery_web/components/add_shot_record_component.ex:60 #: lib/cannery_web/components/add_shot_record_component.ex:62
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shots recorded successfully" msgid "Shots recorded successfully"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:34 #: lib/cannery_web/live/pack_live/show.ex:147
#, elixir-autogen, elixir-format #: lib/cannery_web/live/range_live/index.html.heex:178
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 #, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?" msgid "Are you sure you want to delete this shot record?"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:79 #: lib/cannery_web/live/pack_live/show.ex:69
#: lib/cannery_web/live/range_live/index.ex:78 #: lib/cannery_web/live/range_live/index.ex:99
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Shot records deleted succesfully" msgid "Shot records deleted succesfully"
msgstr "" msgstr ""
@ -172,7 +167,7 @@ msgstr ""
msgid "Shot records updated successfully" msgid "Shot records updated successfully"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_confirmation_controller.ex:37 #: lib/cannery_web/controllers/user_confirmation_controller.ex:35
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{email} confirmed successfully." msgid "%{email} confirmed successfully."
msgstr "" msgstr ""
@ -198,7 +193,7 @@ msgstr ""
msgid "You'll need to" msgid "You'll need to"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/form_component.html.heex:84 #: lib/cannery_web/live/pack_live/form_component.html.heex:104
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Creating..." msgid "Creating..."
msgstr "" msgstr ""
@ -208,7 +203,7 @@ msgstr ""
msgid "Are you sure you want to change your language?" msgid "Are you sure you want to change your language?"
msgstr "" msgstr ""
#: lib/cannery_web/controllers/user_settings_controller.ex:65 #: lib/cannery_web/controllers/user_settings_controller.ex:64
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Language updated successfully." msgid "Language updated successfully."
msgstr "" msgstr ""
@ -219,17 +214,12 @@ msgstr ""
msgid "Ammo deleted succesfully" msgid "Ammo deleted succesfully"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.ex:91 #: lib/cannery_web/live/pack_live/form_component.ex:141
#, elixir-autogen, elixir-format, fuzzy
msgid "Ammo unstaged succesfully"
msgstr ""
#: lib/cannery_web/live/pack_live/form_component.ex:125
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Ammo updated successfully" msgid "Ammo updated successfully"
msgstr "" msgstr ""
#: lib/cannery_web/live/pack_live/form_component.ex:184 #: lib/cannery_web/live/pack_live/form_component.ex:162
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Ammo added successfully" msgid "Ammo added successfully"
msgid_plural "Ammo added successfully" msgid_plural "Ammo added successfully"
@ -267,7 +257,7 @@ msgstr ""
msgid "%{invite_name} updated succesfully" msgid "%{invite_name} updated succesfully"
msgstr "" msgstr ""
#: lib/cannery_web/live/invite_live/index.ex:125 #: lib/cannery_web/live/invite_live/index.ex:139
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "%{user_email} deleted succesfully" msgid "%{user_email} deleted succesfully"
msgstr "" msgstr ""
@ -281,3 +271,13 @@ msgstr ""
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Are you sure you want to make %{invite_name} unlimited?" msgid "Are you sure you want to make %{invite_name} unlimited?"
msgstr "" msgstr ""
#: lib/cannery_web/live/range_live/index.ex:114
#, elixir-autogen, elixir-format
msgid "Container unstaged succesfully"
msgstr ""
#: lib/cannery_web/live/invite_live/index.ex:128
#, elixir-autogen, elixir-format
msgid "Email resent to %{user_email} succesfully"
msgstr ""

Some files were not shown because too many files have changed in this diff Show More