Compare commits

..

8 Commits

Author SHA1 Message Date
334d841d57 add pack lot number to search
Some checks failed
continuous-integration/drone/push Build is failing
2023-04-14 23:38:28 -04:00
1037f37be2 upgrade to phoenix 1.7 2023-04-14 23:34:11 -04:00
1796fb822f fix logger errors 2023-04-14 18:25:06 -04:00
8ed64f9c87 update elixir dependencies 2023-04-14 18:20:53 -04:00
dd4a9f7119 upgrade npm dependencies 2023-04-14 18:17:11 -04:00
dbafaad500 update node and npm 2023-04-14 18:11:44 -04:00
eb4ce07b5f update erlang 2023-04-14 18:10:59 -04:00
2b7550a954 update elixir 2023-04-14 18:09:39 -04:00
146 changed files with 4464 additions and 3775 deletions

View File

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

View File

@ -1,6 +1,6 @@
[
import_deps: [:ecto, :phoenix],
inputs: ["*.{heex,ex,exs}", "priv/*/seeds.exs", "{config,lib,test}/**/*.{heex,ex,exs}"],
import_deps: [:ecto, :ecto_sql, :phoenix],
inputs: ["*.{heex,ex,exs}", "{config,lib,test}/**/*.{heex,ex,exs}", "priv/*/seeds.exs"],
subdirectories: ["priv/*/migrations"],
plugins: [Phoenix.LiveView.HTMLFormatter]
]

View File

@ -1,3 +1,3 @@
elixir 1.14.1-otp-25
erlang 25.1.2
nodejs 18.9.1
elixir 1.14.4-otp-25
erlang 25.3
nodejs 18.15.0

View File

@ -1,3 +1,7 @@
# v0.9.3
- Update dependencies
- Add pack lot number to search
# v0.9.2
- Add lot number to packs
- Don't show price paid and lot number columns when displaying packs if not used

View File

@ -1,4 +1,4 @@
FROM elixir:1.14.1-alpine AS build
FROM elixir:1.14.4-alpine AS build
# install build dependencies
RUN apk add --no-cache build-base npm git python3

3567
assets/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -3,8 +3,8 @@
"description": " ",
"license": "MIT",
"engines": {
"node": "v18.9.1",
"npm": "8.19.1"
"node": "v18.15.0",
"npm": "9.5.0"
},
"scripts": {
"deploy": "NODE_ENV=production webpack --mode production",
@ -13,7 +13,7 @@
"test": "standard"
},
"dependencies": {
"@fortawesome/fontawesome-free": "^6.3.0",
"@fortawesome/fontawesome-free": "^6.4.0",
"chart.js": "^4.2.1",
"chartjs-adapter-date-fns": "^3.0.0",
"date-fns": "^2.29.3",
@ -23,27 +23,27 @@
"topbar": "^2.0.1"
},
"devDependencies": {
"@babel/core": "^7.21.3",
"@babel/preset-env": "^7.20.2",
"@babel/core": "^7.21.4",
"@babel/preset-env": "^7.21.4",
"autoprefixer": "^10.4.14",
"babel-loader": "^9.1.2",
"copy-webpack-plugin": "^11.0.0",
"css-loader": "^6.7.3",
"css-minimizer-webpack-plugin": "^4.2.2",
"css-minimizer-webpack-plugin": "^5.0.0",
"file-loader": "^6.2.0",
"mini-css-extract-plugin": "^2.7.5",
"npm-check-updates": "^16.7.12",
"npm-check-updates": "^16.10.8",
"postcss": "^8.4.21",
"postcss-import": "^15.1.0",
"postcss-loader": "^7.1.0",
"postcss-preset-env": "^8.0.1",
"sass": "^1.59.3",
"sass-loader": "^13.2.1",
"postcss-loader": "^7.2.4",
"postcss-preset-env": "^8.3.1",
"sass": "^1.62.0",
"sass-loader": "^13.2.2",
"standard": "^17.0.0",
"tailwindcss": "^3.2.7",
"tailwindcss": "^3.3.1",
"terser-webpack-plugin": "^5.3.7",
"webpack": "^5.76.2",
"webpack": "^5.79.0",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.13.1"
"webpack-dev-server": "^4.13.2"
}
}

View File

@ -59,8 +59,7 @@ config :cannery, CanneryWeb.Endpoint,
patterns: [
~r"priv/static/.*(js|css|png|jpeg|jpg|gif|svg)$",
~r"priv/gettext/.*(po)$",
~r"lib/cannery_web/(live|views)/.*(ex)$",
~r"lib/cannery_web/templates/.*(eex)$"
~r"lib/cannery_web/*/.*(ex)$"
]
]

View File

@ -12,7 +12,7 @@ if System.get_env("PHX_SERVER") && System.get_env("RELEASE_NAME") do
config :cannery, CanneryWeb.Endpoint, server: true
end
config :cannery, CanneryWeb.ViewHelpers, shibao_mode: System.get_env("SHIBAO_MODE") == "true"
config :cannery, CanneryWeb.HTMLHelpers, shibao_mode: System.get_env("SHIBAO_MODE") == "true"
# Set default locale
config :gettext, :default_locale, System.get_env("LOCALE", "en_US")

View File

@ -374,8 +374,8 @@ defmodule Cannery.Accounts do
@doc """
Deletes the signed token with the given context.
"""
@spec delete_session_token(token :: String.t()) :: :ok
def delete_session_token(token) do
@spec delete_user_session_token(token :: String.t()) :: :ok
def delete_user_session_token(token) do
UserToken.token_and_context_query(token, "session") |> Repo.delete_all()
:ok
end

View File

@ -3,14 +3,15 @@ defmodule Cannery.Email do
Emails that can be sent using Swoosh.
You can find the base email templates at
`lib/cannery_web/templates/layout/email.html.heex` for html emails and
`lib/cannery_web/templates/layout/email.txt.heex` for text emails.
`lib/cannery_web/components/layouts/email_html.html.heex` for html emails and
`lib/cannery_web/components/layouts/email_text.txt.eex` for text emails.
"""
use Phoenix.Swoosh, view: CanneryWeb.EmailView, layout: {CanneryWeb.LayoutView, :email}
import Swoosh.Email
import CanneryWeb.Gettext
import Phoenix.Template
alias Cannery.Accounts.User
alias CanneryWeb.EmailView
alias CanneryWeb.{EmailHTML, Layouts}
@typedoc """
Represents an HTML and text body email that can be sent
@ -28,21 +29,33 @@ defmodule Cannery.Email do
def generate_email("welcome", user, %{"url" => url}) do
user
|> base_email(dgettext("emails", "Confirm your Cannery account"))
|> render_body("confirm_email.html", %{user: user, url: url})
|> text_body(EmailView.render("confirm_email.txt", %{user: user, url: url}))
|> html_email(:confirm_email_html, %{user: user, url: url})
|> text_email(:confirm_email_text, %{user: user, url: url})
end
def generate_email("reset_password", user, %{"url" => url}) do
user
|> base_email(dgettext("emails", "Reset your Cannery password"))
|> render_body("reset_password.html", %{user: user, url: url})
|> text_body(EmailView.render("reset_password.txt", %{user: user, url: url}))
|> html_email(:reset_password_html, %{user: user, url: url})
|> text_email(:reset_password_text, %{user: user, url: url})
end
def generate_email("update_email", user, %{"url" => url}) do
user
|> base_email(dgettext("emails", "Update your Cannery email"))
|> render_body("update_email.html", %{user: user, url: url})
|> text_body(EmailView.render("update_email.txt", %{user: user, url: url}))
|> html_email(:update_email_html, %{user: user, url: url})
|> text_email(:update_email_text, %{user: user, url: url})
end
defp html_email(email, atom, assigns) do
heex = apply(EmailHTML, atom, [assigns])
html = render_to_string(Layouts, "email_html", "html", email: email, inner_content: heex)
email |> html_body(html)
end
defp text_email(email, atom, assigns) do
heex = apply(EmailHTML, atom, [assigns])
text = render_to_string(Layouts, "email_text", "text", email: email, inner_content: heex)
email |> text_body(text)
end
end

View File

@ -14,17 +14,17 @@ defmodule Cannery.Logger do
|> Map.put(:stacktrace, Exception.format_stacktrace(stacktrace))
|> pretty_encode()
Logger.error(meta.reason, data: data)
Logger.error("#{meta.reason}: #{data}")
end
def handle_event([:oban, :job, :start], measure, meta, _config) do
data = get_oban_job_data(meta, measure) |> pretty_encode()
Logger.info("Started oban job", data: data)
Logger.info("Started oban job: #{data}")
end
def handle_event([:oban, :job, :stop], measure, meta, _config) do
data = get_oban_job_data(meta, measure) |> pretty_encode()
Logger.info("Finished oban job", data: data)
Logger.info("Finished oban job: #{data}")
end
def handle_event([:oban, :job, unhandled_event], measure, meta, _config) do
@ -33,7 +33,7 @@ defmodule Cannery.Logger do
|> Map.put(:event, unhandled_event)
|> pretty_encode()
Logger.warning("Unhandled oban job event", data: data)
Logger.warning("Unhandled oban job event: #{data}")
end
def handle_event(unhandled_event, measure, meta, config) do
@ -45,7 +45,7 @@ defmodule Cannery.Logger do
config: config
})
Logger.warning("Unhandled telemetry event", data: data)
Logger.warning("Unhandled telemetry event: #{data}")
end
defp get_oban_job_data(%{job: job}, measure) do

View File

@ -1,53 +1,61 @@
defmodule CanneryWeb do
@moduledoc """
The entrypoint for defining your web interface, such
as controllers, views, channels and so on.
as controllers, components, channels, and so on.
This can be used in your application as:
use CanneryWeb, :controller
use CanneryWeb, :view
use CanneryWeb, :html
The definitions below will be executed for every view,
controller, etc, so keep them short and clean, focused
The definitions below will be executed for every controller,
component, etc, so keep them short and clean, focused
on imports, uses and aliases.
Do NOT define functions inside the quoted expressions
below. Instead, define any helper function in modules
and import those modules here.
below. Instead, define additional modules and import
those modules here.
"""
def static_paths, do: ~w(css js fonts images favicon.ico robots.txt)
def router do
quote do
use Phoenix.Router, helpers: false
# Import common connection and controller functions to use in pipelines
import Plug.Conn
import Phoenix.Controller
import Phoenix.LiveView.Router
end
end
def channel do
quote do
use Phoenix.Channel
end
end
def controller do
quote do
use Phoenix.Controller, namespace: CanneryWeb
use Phoenix.Controller,
formats: [:html, :json],
layouts: [html: CanneryWeb.Layouts]
# credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse
import Plug.Conn
import CanneryWeb.Gettext
alias CanneryWeb.Router.Helpers, as: Routes
end
end
def view do
quote do
use Phoenix.View,
root: "lib/cannery_web/templates",
namespace: CanneryWeb
# Import convenience functions from controllers
import Phoenix.Controller,
only: [get_flash: 1, get_flash: 2, view_module: 1, view_template: 1]
# Include shared imports and aliases for views
unquote(view_helpers())
unquote(verified_routes())
end
end
def live_view do
quote do
use Phoenix.LiveView, layout: {CanneryWeb.LayoutView, :live}
use Phoenix.LiveView,
layout: {CanneryWeb.Layouts, :app}
on_mount CanneryWeb.InitAssigns
unquote(view_helpers())
unquote(html_helpers())
end
end
@ -55,49 +63,46 @@ defmodule CanneryWeb do
quote do
use Phoenix.LiveComponent
unquote(view_helpers())
unquote(html_helpers())
end
end
def component do
def html do
quote do
use Phoenix.Component
unquote(view_helpers())
# Import convenience functions from controllers
import Phoenix.Controller,
only: [get_csrf_token: 0, view_module: 1, view_template: 1]
# Include general helpers for rendering HTML
unquote(html_helpers())
end
end
def router do
defp html_helpers do
quote do
use Phoenix.Router
import Phoenix.{Controller, LiveView.Router}
# credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse
import Plug.Conn
end
end
def channel do
quote do
use Phoenix.Channel
# credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse
import CanneryWeb.Gettext
end
end
defp view_helpers do
quote do
# Use all HTML functionality (forms, tags, etc)
# credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse
use Phoenix.HTML
# Import LiveView and .heex helpers (live_render, live_patch, <.form>, etc)
# Import basic rendering functionality (render, render_layout, etc)
import CanneryWeb.{ErrorHelpers, Gettext, CoreComponents, ViewHelpers}
import Phoenix.{Component, View}
# credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse
import Phoenix.Component
import CanneryWeb.{ErrorHelpers, Gettext, CoreComponents, HTMLHelpers}
alias CanneryWeb.Endpoint
alias CanneryWeb.Router.Helpers, as: Routes
# Shortcut for generating JS commands
alias Phoenix.LiveView.JS
# Routes generation with the ~p sigil
unquote(verified_routes())
end
end
def verified_routes do
quote do
use Phoenix.VerifiedRoutes,
endpoint: CanneryWeb.Endpoint,
router: CanneryWeb.Router,
statics: CanneryWeb.static_paths()
end
end

View File

@ -109,14 +109,12 @@ defmodule CanneryWeb.Components.ContainerTableComponent do
end
@spec get_value_for_key(atom(), Container.t(), extra_data :: map) :: any()
defp get_value_for_key(:name, %{id: id, name: container_name}, _extra_data) do
assigns = %{id: id, container_name: container_name}
defp get_value_for_key(:name, %{name: container_name} = assigns, _extra_data) do
{container_name,
~H"""
<div class="flex flex-wrap justify-center items-center">
<.link navigate={Routes.container_show_path(Endpoint, :show, @id)} class="link">
<%= @container_name %>
<.link navigate={~p"/container/#{@id}"} class="link">
<%= @name %>
</.link>
</div>
"""}

View File

@ -3,11 +3,11 @@ defmodule CanneryWeb.CoreComponents do
Provides core UI components.
"""
use Phoenix.Component
import CanneryWeb.{Gettext, ViewHelpers}
use CanneryWeb, :verified_routes
import CanneryWeb.{Gettext, HTMLHelpers}
alias Cannery.{Accounts, Accounts.Invite, Accounts.User}
alias Cannery.{Ammo, Ammo.Pack}
alias Cannery.{Containers.Container, Containers.Tag}
alias CanneryWeb.{Endpoint, HomeLive}
alias CanneryWeb.Router.Helpers, as: Routes
alias Phoenix.LiveView.{JS, Rendered}
@ -29,13 +29,13 @@ defmodule CanneryWeb.CoreComponents do
## Examples
<.modal return_to={Routes.<%= schema.singular %>_index_path(Endpoint, :index)}>
<.modal return_to={~p"/\#{<%= schema.plural %>}"}>
<.live_component
module={<%= inspect context.web_module %>.<%= inspect Module.concat(schema.web_namespace, schema.alias) %>Live.FormComponent}
id={@<%= schema.singular %>.id || :new}
title={@page_title}
action={@live_action}
return_to={Routes.<%= schema.singular %>_index_path(Endpoint, :index)}
return_to={~p"/\#{<%= schema.singular %>}"}
<%= schema.singular %>: @<%= schema.singular %>
/>
</.modal>

View File

@ -5,7 +5,7 @@
border border-gray-400 rounded-lg shadow-lg hover:shadow-md
transition-all duration-300 ease-in-out"
>
<.link navigate={Routes.container_show_path(Endpoint, :show, @container)} class="link">
<.link navigate={~p"/container/#{@container}"} class="link">
<h1 class="px-4 py-2 rounded-lg title text-xl">
<%= @container.name %>
</h1>

View File

@ -23,7 +23,7 @@
<% end %>
<.qr_code
content={Routes.user_registration_url(Endpoint, :new, invite: @invite.token)}
content={url(CanneryWeb.Endpoint, ~p"/users/register?invite=#{@invite.token}")}
filename={@invite.name}
/>
@ -36,7 +36,7 @@
id={"code-#{@invite.id}"}
class="mx-2 my-1 text-xs px-4 py-2 rounded-lg text-center break-all text-gray-100 bg-primary-800"
phx-no-format
><%= Routes.user_registration_url(Endpoint, :new, invite: @invite.token) %></code>
><%= url(CanneryWeb.Endpoint, ~p"/users/register?invite=#{@invite.token}") %></code>
<%= if @code_actions, do: render_slot(@code_actions) %>
</div>

View File

@ -5,7 +5,7 @@
border border-gray-400 rounded-lg shadow-lg hover:shadow-md
transition-all duration-300 ease-in-out"
>
<.link navigate={Routes.pack_show_path(Endpoint, :show, @pack)} class="mb-2 link">
<.link navigate={~p"/ammo/show/#{@pack}"} class="mb-2 link">
<h1 class="title text-xl title-primary-500">
<%= @pack.type.name %>
</h1>
@ -55,7 +55,7 @@
<span :if={@container} class="rounded-lg title text-lg">
<%= gettext("Container:") %>
<.link navigate={Routes.container_show_path(Endpoint, :show, @container)} class="link">
<.link navigate={~p"/container/#{@container}"} class="link">
<%= @container.name %>
</.link>
</span>

View File

@ -1,12 +1,9 @@
<nav role="navigation" class="mb-8 px-8 py-4 w-full bg-primary-500">
<div class="flex flex-col sm:flex-row justify-between items-center">
<div class="mb-4 sm:mb-0 sm:mr-8 flex flex-row justify-start items-center space-x-2">
<.link
navigate={Routes.live_path(Endpoint, HomeLive)}
class="inline mx-2 my-1 leading-5 text-xl text-white"
>
<.link navigate={~p"/"} class="inline mx-2 my-1 leading-5 text-xl text-white">
<img
src={Routes.static_path(Endpoint, "/images/cannery.svg")}
src={~p"/images/cannery.svg"}
alt={gettext("Cannery logo")}
class="inline-block h-8 mx-1"
/>
@ -27,64 +24,43 @@
text-lg text-white text-ellipsis">
<%= if @current_user do %>
<li class="mx-2 my-1">
<.link
navigate={Routes.tag_index_path(Endpoint, :index)}
class="text-white hover:underline"
>
<.link navigate={~p"/tags"} class="text-white hover:underline">
<%= gettext("Tags") %>
</.link>
</li>
<li class="mx-2 my-1">
<.link
navigate={Routes.container_index_path(Endpoint, :index)}
class="text-white hover:underline"
>
<.link navigate={~p"/containers"} class="text-white hover:underline">
<%= gettext("Containers") %>
</.link>
</li>
<li class="mx-2 my-1">
<.link
navigate={Routes.type_index_path(Endpoint, :index)}
class="text-white hover:underline"
>
<.link navigate={~p"/catalog"} class="text-white hover:underline">
<%= gettext("Catalog") %>
</.link>
</li>
<li class="mx-2 my-1">
<.link
navigate={Routes.pack_index_path(Endpoint, :index)}
class="text-white hover:underline"
>
<.link navigate={~p"/ammo"} class="text-white hover:underline">
<%= gettext("Ammo") %>
</.link>
</li>
<li class="mx-2 my-1">
<.link
navigate={Routes.range_index_path(Endpoint, :index)}
class="text-white hover:underline"
>
<.link navigate={~p"/range"} class="text-white hover:underline">
<%= gettext("Range") %>
</.link>
</li>
<li :if={@current_user |> Accounts.is_already_admin?()} class="mx-2 my-1">
<.link
navigate={Routes.invite_index_path(Endpoint, :index)}
class="text-white hover:underline"
>
<.link navigate={~p"/invites"} class="text-white hover:underline">
<%= gettext("Invites") %>
</.link>
</li>
<li class="mx-2 my-1">
<.link
href={Routes.user_settings_path(Endpoint, :edit)}
class="text-white hover:underline truncate"
>
<.link href={~p"/users/settings"} class="text-white hover:underline truncate">
<%= @current_user.email %>
</.link>
</li>
<li class="mx-2 my-1">
<.link
href={Routes.user_session_path(Endpoint, :delete)}
href={~p"/users/log_out"}
method="delete"
data-confirm={dgettext("prompts", "Are you sure you want to log out?")}
aria-label={gettext("Log out")}
@ -100,7 +76,7 @@
class="mx-2 my-1"
>
<.link
navigate={Routes.live_dashboard_path(Endpoint, :home)}
navigate={~p"/dashboard"}
class="text-white hover:underline"
aria-label={gettext("Live Dashboard")}
>
@ -109,18 +85,12 @@
</li>
<% else %>
<li :if={Accounts.allow_registration?()} class="mx-2 my-1">
<.link
href={Routes.user_registration_path(Endpoint, :new)}
class="text-white hover:underline truncate"
>
<.link href={~p"/users/register"} class="text-white hover:underline truncate">
<%= dgettext("actions", "Register") %>
</.link>
</li>
<li class="mx-2 my-1">
<.link
href={Routes.user_session_path(Endpoint, :new)}
class="text-white hover:underline truncate"
>
<.link href={~p"/users/log_in"} class="text-white hover:underline truncate">
<%= dgettext("actions", "Log in") %>
</.link>
</li>

View File

@ -0,0 +1,10 @@
defmodule CanneryWeb.EmailHTML do
@moduledoc """
Renders email templates
"""
use CanneryWeb, :html
embed_templates "email_html/*.html", suffix: "_html"
embed_templates "email_html/*.txt", suffix: "_text"
end

View File

@ -9,4 +9,4 @@
<%= dgettext("emails",
"If you didn't create an account at %{url}, please ignore this.",
url: Routes.live_url(Endpoint, HomeLive)) %>
url: ~p"/") %>

View File

@ -7,4 +7,4 @@
<%= dgettext("emails",
"If you didn't request this change from %{url}, please ignore this.",
url: Routes.live_url(Endpoint, HomeLive)) %>
url: ~p"/") %>

View File

@ -7,4 +7,4 @@
<%= dgettext("emails",
"If you didn't request this change from %{url}, please ignore this.",
url: Routes.live_url(Endpoint, HomeLive)) %>
url: ~p"/") %>

View File

@ -0,0 +1,17 @@
defmodule CanneryWeb.Layouts do
@moduledoc """
The root layouts for the entire application
"""
use CanneryWeb, :html
embed_templates "layouts/*"
def get_title(%{assigns: %{title: title}}) when title not in [nil, ""] do
gettext("Cannery | %{title}", title: title)
end
def get_title(_conn) do
gettext("Cannery")
end
end

View File

@ -3,11 +3,11 @@
<.topbar current_user={assigns[:current_user]} />
<div class="mx-8 my-2 flex flex-col space-y-4 text-center">
<p :if={get_flash(@conn, :info)} class="alert alert-info" role="alert">
<%= get_flash(@conn, :info) %>
<p :if={@flash["info"]} class="alert alert-info" role="alert">
<%= @flash["info"] %>
</p>
<p :if={get_flash(@conn, :error)} class="alert alert-danger" role="alert">
<%= get_flash(@conn, :error) %>
<p :if={@flash["error"]} class="alert alert-danger" role="alert">
<%= @flash["error"] %>
</p>
</div>
</header>

View File

@ -9,7 +9,7 @@
<hr style="margin: 2em auto; border-width: 1px; border-color: rgb(212, 212, 216); width: 100%; max-width: 42rem;" />
<a style="color: rgb(31, 31, 31);" href={Routes.live_url(Endpoint, HomeLive)}>
<a style="color: rgb(31, 31, 31);" href={~p"/"}>
<%= dgettext(
"emails",
"This email was sent from Cannery, the self-hosted firearm tracker website."

View File

@ -8,4 +8,4 @@
<%= dgettext("emails",
"This email was sent from Cannery at %{url}, the self-hosted firearm tracker website.",
url: Routes.live_url(Endpoint, HomeLive)) %>
url: ~p"/") %>

View File

@ -5,21 +5,12 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<%= csrf_meta_tag() %>
<link
rel="shortcut icon"
type="image/jpg"
href={Routes.static_path(@conn, "/images/cannery.svg")}
/>
<link rel="shortcut icon" type="image/jpg" href={~p"/images/cannery.svg"} />
<.live_title suffix={" | #{gettext("Cannery")}"}>
<%= assigns[:page_title] || gettext("Cannery") %>
</.live_title>
<link phx-track-static rel="stylesheet" href={Routes.static_path(@conn, "/css/app.css")} />
<script
defer
phx-track-static
type="text/javascript"
src={Routes.static_path(@conn, "/js/app.js")}
>
<link phx-track-static rel="stylesheet" href={~p"/css/app.css"} />
<script defer phx-track-static type="text/javascript" src={~p"/js/app.js"}>
</script>
</head>

View File

@ -5,7 +5,6 @@ defmodule CanneryWeb.Components.MovePackComponent do
use CanneryWeb, :live_component
alias Cannery.{Accounts.User, Ammo, Ammo.Pack, Containers, Containers.Container}
alias CanneryWeb.Endpoint
alias Ecto.Changeset
alias Phoenix.LiveView.Socket
@ -84,7 +83,7 @@ defmodule CanneryWeb.Components.MovePackComponent do
<%= display_emoji("😔") %>
</h2>
<.link navigate={Routes.container_index_path(Endpoint, :new)} class="btn btn-primary">
<.link navigate={~p"/containers/new"} class="btn btn-primary">
<%= dgettext("actions", "Add another container!") %>
</.link>
<% else %>

View File

@ -98,7 +98,7 @@ defmodule CanneryWeb.Components.ShotRecordTableComponent do
{pack.type.name,
~H"""
<.link navigate={Routes.pack_show_path(Endpoint, :show, @pack)} class="link">
<.link navigate={~p"/ammo/show/#{@pack}"} class="link">
<%= @pack.type.name %>
</.link>
"""}

View File

@ -261,13 +261,11 @@ defmodule CanneryWeb.Components.TypeTableComponent do
end
end
defp get_type_value(:name, _key, %{name: type_name} = type, _other_data) do
assigns = %{type: type}
defp get_type_value(:name, _key, %{name: type_name} = assigns, _other_data) do
{type_name,
~H"""
<.link navigate={Routes.type_show_path(Endpoint, :show, @type)} class="link">
<%= @type.name %>
<.link navigate={~p"/type/#{@id}"} class="link">
<%= @name %>
</.link>
"""}
end

View File

@ -6,7 +6,8 @@ defmodule CanneryWeb.EmailController do
use CanneryWeb, :controller
alias Cannery.Accounts.User
plug :put_layout, {CanneryWeb.LayoutView, :email}
plug :put_root_layout, html: {CanneryWeb.Layouts, :email_html}
plug :put_layout, false
@sample_assigns %{
email: %{subject: "Example subject"},
@ -18,6 +19,6 @@ defmodule CanneryWeb.EmailController do
Debug route used to preview emails
"""
def preview(conn, %{"id" => template}) do
render(conn, "#{template |> to_string()}.html", @sample_assigns)
render(conn, String.to_existing_atom(template), @sample_assigns)
end
end

View File

@ -0,0 +1,16 @@
defmodule CanneryWeb.ErrorHTML do
use CanneryWeb, :html
embed_templates "error_html/*"
def render(template, _assigns) do
error_string =
case template do
"404.html" -> dgettext("errors", "Not found")
"401.html" -> dgettext("errors", "Unauthorized")
_other_path -> dgettext("errors", "Internal server error")
end
error(%{error_string: error_string})
end
end

View File

@ -24,10 +24,7 @@
<hr class="w-full hr" />
<.link
href={Routes.live_path(Endpoint, HomeLive)}
class="link title text-primary-600 text-lg"
>
<.link href={~p"/"} class="link title text-primary-600 text-lg">
<%= dgettext("errors", "Go back home") %>
</.link>
</div>

View File

@ -0,0 +1,14 @@
defmodule CanneryWeb.ErrorJSON do
import CanneryWeb.Gettext
def render(template, _assigns) do
error_string =
case template do
"404.json" -> dgettext("errors", "Not found")
"401.json" -> dgettext("errors", "Unauthorized")
_other_path -> dgettext("errors", "Internal server error")
end
%{errors: %{detail: error_string}}
end
end

View File

@ -1,11 +0,0 @@
defmodule CanneryWeb.HomeController do
@moduledoc """
Controller for home page
"""
use CanneryWeb, :controller
def index(conn, _params) do
render(conn, "index.html")
end
end

View File

@ -0,0 +1,5 @@
defmodule CanneryWeb.HomeHTML do
use CanneryWeb, :html
embed_templates "home_html/*"
end

View File

@ -3,12 +3,11 @@ defmodule CanneryWeb.UserAuth do
Functions for user session and authentication
"""
use CanneryWeb, :verified_routes
import Plug.Conn
import Phoenix.Controller
import CanneryWeb.Gettext
alias Cannery.{Accounts, Accounts.User}
alias CanneryWeb.HomeLive
alias CanneryWeb.Router.Helpers, as: Routes
# Make the remember me cookie valid for 60 days.
# If you want bump or reduce this value, also change
@ -39,7 +38,7 @@ defmodule CanneryWeb.UserAuth do
dgettext("errors", "You must confirm your account and log in to access this page.")
)
|> maybe_store_return_to()
|> redirect(to: Routes.user_session_path(conn, :new))
|> redirect(to: ~p"/users/log_in")
|> halt()
end
@ -49,8 +48,7 @@ defmodule CanneryWeb.UserAuth do
conn
|> renew_session()
|> put_session(:user_token, token)
|> put_session(:live_socket_id, "users_sessions:#{Base.url_encode64(token)}")
|> put_token_in_session(token)
|> maybe_write_remember_me_cookie(token, params)
|> redirect(to: user_return_to || signed_in_path(conn))
end
@ -96,7 +94,7 @@ defmodule CanneryWeb.UserAuth do
"""
def log_out_user(conn) do
user_token = get_session(conn, :user_token)
user_token && Accounts.delete_session_token(user_token)
user_token && Accounts.delete_user_session_token(user_token)
if live_socket_id = get_session(conn, :live_socket_id) do
CanneryWeb.Endpoint.broadcast(live_socket_id, "disconnect", %{})
@ -105,7 +103,7 @@ defmodule CanneryWeb.UserAuth do
conn
|> renew_session()
|> delete_resp_cookie(@remember_me_cookie)
|> redirect(to: "/")
|> redirect(to: ~p"/")
end
@doc """
@ -119,19 +117,110 @@ defmodule CanneryWeb.UserAuth do
end
defp ensure_user_token(conn) do
if user_token = get_session(conn, :user_token) do
{user_token, conn}
if token = get_session(conn, :user_token) do
{token, conn}
else
conn = fetch_cookies(conn, signed: [@remember_me_cookie])
if user_token = conn.cookies[@remember_me_cookie] do
{user_token, put_session(conn, :user_token, user_token)}
if token = conn.cookies[@remember_me_cookie] do
{token, put_token_in_session(conn, token)}
else
{nil, conn}
end
end
end
@doc """
Handles mounting and authenticating the current_user in LiveViews.
## `on_mount` arguments
* `:mount_current_user` - Assigns current_user
to socket assigns based on user_token, or nil if
there's no user_token or no matching user.
* `:ensure_authenticated` - Authenticates the user from the session,
and assigns the current_user to socket assigns based
on user_token.
Redirects to login page if there's no logged user.
* `:redirect_if_user_is_authenticated` - Authenticates the user from the session.
Redirects to signed_in_path if there's a logged user.
## Examples
Use the `on_mount` lifecycle macro in LiveViews to mount or authenticate
the current_user:
defmodule CanneryWeb.PageLive do
use CanneryWeb, :live_view
on_mount {CanneryWeb.UserAuth, :mount_current_user}
...
end
Or use the `live_session` of your router to invoke the on_mount callback:
live_session :authenticated, on_mount: [{CanneryWeb.UserAuth, :ensure_authenticated}] do
live "/profile", ProfileLive, :index
end
"""
def on_mount(:mount_current_user, _params, session, socket) do
{:cont, mount_current_user(session, socket)}
end
def on_mount(:ensure_authenticated, _params, session, socket) do
socket = mount_current_user(session, socket)
if socket.assigns.current_user do
{:cont, socket}
else
error_flash = dgettext("errors", "You must log in to access this page.")
socket =
socket
|> Phoenix.LiveView.put_flash(:error, error_flash)
|> Phoenix.LiveView.redirect(to: ~p"/users/log_in")
{:halt, socket}
end
end
def on_mount(:ensure_admin, _params, session, socket) do
socket = mount_current_user(session, socket)
if socket.assigns.current_user && socket.assigns.current_user.role == :admin do
{:cont, socket}
else
error_flash = dgettext("errors", "You must log in as an administrator to access this page.")
socket =
socket
|> Phoenix.LiveView.put_flash(:error, error_flash)
|> Phoenix.LiveView.redirect(to: ~p"/users/log_in")
{:halt, socket}
end
end
def on_mount(:redirect_if_user_is_authenticated, _params, session, socket) do
socket = mount_current_user(session, socket)
if socket.assigns.current_user do
{:halt, Phoenix.LiveView.redirect(socket, to: signed_in_path(socket))}
else
{:cont, socket}
end
end
defp mount_current_user(session, socket) do
Phoenix.Component.assign_new(socket, :current_user, fn ->
if user_token = session["user_token"] do
Accounts.get_user_by_session_token(user_token)
end
end)
end
@doc """
Used for routes that require the user to not be authenticated.
"""
@ -161,7 +250,7 @@ defmodule CanneryWeb.UserAuth do
dgettext("errors", "You must confirm your account and log in to access this page.")
)
|> maybe_store_return_to()
|> redirect(to: Routes.user_session_path(conn, :new))
|> redirect(to: ~p"/users/log_in")
|> halt()
end
end
@ -176,16 +265,34 @@ defmodule CanneryWeb.UserAuth do
conn
|> put_flash(:error, dgettext("errors", "You are not authorized to view this page."))
|> maybe_store_return_to()
|> redirect(to: Routes.live_path(conn, HomeLive))
|> redirect(to: ~p"/")
|> halt()
end
end
def put_user_locale(%{assigns: %{current_user: %{locale: locale}}} = conn, _opts) do
default = Application.fetch_env!(:gettext, :default_locale)
Gettext.put_locale(locale || default)
conn |> put_session(:locale, locale || default)
end
def put_user_locale(conn, _opts) do
default = Application.fetch_env!(:gettext, :default_locale)
Gettext.put_locale(default)
conn |> put_session(:locale, default)
end
defp put_token_in_session(conn, token) do
conn
|> put_session(:user_token, token)
|> put_session(:live_socket_id, "users_sessions:#{Base.url_encode64(token)}")
end
defp maybe_store_return_to(%{method: "GET"} = conn) do
put_session(conn, :user_return_to, current_path(conn))
end
defp maybe_store_return_to(conn), do: conn
defp signed_in_path(_conn), do: "/"
defp signed_in_path(_conn), do: ~p"/"
end

View File

@ -5,14 +5,14 @@ defmodule CanneryWeb.UserConfirmationController do
alias Cannery.Accounts
def new(conn, _params) do
render(conn, "new.html", page_title: gettext("Confirm your account"))
render(conn, :new, page_title: gettext("Confirm your account"))
end
def create(conn, %{"user" => %{"email" => email}}) do
if user = Accounts.get_user_by_email(email) do
Accounts.deliver_user_confirmation_instructions(
user,
&Routes.user_confirmation_url(conn, :confirm, &1)
fn token -> url(CanneryWeb.Endpoint, ~p"/users/confirm/#{token}") end
)
end
@ -22,11 +22,10 @@ defmodule CanneryWeb.UserConfirmationController do
:info,
dgettext(
"prompts",
"If your email is in our system and it has not been confirmed yet, " <>
"you will receive an email with instructions shortly."
"If your email is in our system and it has not been confirmed yet, you will receive an email with instructions shortly."
)
)
|> redirect(to: "/")
|> redirect(to: ~p"/")
end
# Do not log in the user after confirmation to avoid a
@ -36,7 +35,7 @@ defmodule CanneryWeb.UserConfirmationController do
{:ok, %{email: email}} ->
conn
|> put_flash(:info, dgettext("prompts", "%{email} confirmed successfully.", email: email))
|> redirect(to: "/")
|> redirect(to: ~p"/")
:error ->
# If there is a current user and the account was already confirmed,
@ -45,7 +44,7 @@ defmodule CanneryWeb.UserConfirmationController do
# a warning message.
case conn.assigns do
%{current_user: %{confirmed_at: confirmed_at}} when not is_nil(confirmed_at) ->
redirect(conn, to: "/")
redirect(conn, to: ~p"/")
%{} ->
conn
@ -53,7 +52,7 @@ defmodule CanneryWeb.UserConfirmationController do
:error,
dgettext("errors", "User confirmation link is invalid or it has expired.")
)
|> redirect(to: "/")
|> redirect(to: ~p"/")
end
end
end

View File

@ -0,0 +1,6 @@
defmodule CanneryWeb.UserConfirmationHTML do
use CanneryWeb, :html
alias Cannery.Accounts
embed_templates "user_confirmation_html/*"
end

View File

@ -7,7 +7,7 @@
:let={f}
for={%{}}
as={:user}
action={Routes.user_confirmation_path(@conn, :create)}
action={~p"/users/confirm"}
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
>
<%= label(f, :email, gettext("Email"), class: "title text-lg text-primary-600") %>
@ -21,14 +21,10 @@
<hr class="hr" />
<div class="flex flex-row justify-center items-center space-x-4">
<.link
:if={Accounts.allow_registration?()}
href={Routes.user_registration_path(@conn, :new)}
class="btn btn-primary"
>
<.link :if={Accounts.allow_registration?()} href={~p"/users/register"} class="btn btn-primary">
<%= dgettext("actions", "Register") %>
</.link>
<.link href={Routes.user_session_path(@conn, :new)} class="btn btn-primary">
<.link href={~p"/users/log_in"} class="btn btn-primary">
<%= dgettext("actions", "Log in") %>
</.link>
</div>

View File

@ -2,7 +2,6 @@ defmodule CanneryWeb.UserRegistrationController do
use CanneryWeb, :controller
import CanneryWeb.Gettext
alias Cannery.{Accounts, Accounts.Invites}
alias CanneryWeb.{Endpoint, HomeLive}
alias Ecto.Changeset
def new(conn, %{"invite" => invite_token}) do
@ -11,7 +10,7 @@ defmodule CanneryWeb.UserRegistrationController do
else
conn
|> put_flash(:error, dgettext("errors", "Sorry, this invite was not found or expired"))
|> redirect(to: Routes.live_path(Endpoint, HomeLive))
|> redirect(to: ~p"/")
end
end
@ -21,13 +20,13 @@ defmodule CanneryWeb.UserRegistrationController do
else
conn
|> put_flash(:error, dgettext("errors", "Sorry, public registration is disabled"))
|> redirect(to: Routes.live_path(Endpoint, HomeLive))
|> redirect(to: ~p"/")
end
end
# renders new user registration page
defp render_new(conn, invite_token \\ nil) do
render(conn, "new.html",
render(conn, :new,
changeset: Accounts.change_user_registration(),
invite_token: invite_token,
page_title: gettext("Register")
@ -40,7 +39,7 @@ defmodule CanneryWeb.UserRegistrationController do
else
conn
|> put_flash(:error, dgettext("errors", "Sorry, this invite was not found or expired"))
|> redirect(to: Routes.live_path(Endpoint, HomeLive))
|> redirect(to: ~p"/")
end
end
@ -50,7 +49,7 @@ defmodule CanneryWeb.UserRegistrationController do
else
conn
|> put_flash(:error, dgettext("errors", "Sorry, public registration is disabled"))
|> redirect(to: Routes.live_path(Endpoint, HomeLive))
|> redirect(to: ~p"/")
end
end
@ -59,17 +58,17 @@ defmodule CanneryWeb.UserRegistrationController do
{:ok, user} ->
Accounts.deliver_user_confirmation_instructions(
user,
&Routes.user_confirmation_url(conn, :confirm, &1)
fn token -> url(CanneryWeb.Endpoint, ~p"/users/confirm/#{token}") end
)
conn
|> put_flash(:info, dgettext("prompts", "Please check your email to verify your account"))
|> redirect(to: Routes.user_session_path(Endpoint, :new))
|> redirect(to: ~p"/users/log_in")
{:error, :invalid_token} ->
conn
|> put_flash(:error, dgettext("errors", "Sorry, this invite was not found or expired"))
|> redirect(to: Routes.live_path(Endpoint, HomeLive))
|> redirect(to: ~p"/")
{:error, %Changeset{} = changeset} ->
conn |> render("new.html", changeset: changeset, invite_token: invite_token)

View File

@ -0,0 +1,5 @@
defmodule CanneryWeb.UserRegistrationHTML do
use CanneryWeb, :html
embed_templates "user_registration_html/*"
end

View File

@ -6,7 +6,7 @@
<.form
:let={f}
for={@changeset}
action={Routes.user_registration_path(@conn, :create)}
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"
>
<p :if={@changeset.action && not @changeset.valid?()} class="alert alert-danger col-span-3">
@ -40,10 +40,10 @@
<hr class="hr" />
<div class="flex flex-row justify-center items-center space-x-4">
<.link href={Routes.user_session_path(@conn, :new)} class="btn btn-primary">
<.link href={~p"/users/log_in"} class="btn btn-primary">
<%= dgettext("actions", "Log in") %>
</.link>
<.link href={Routes.user_reset_password_path(@conn, :new)} class="btn btn-primary">
<.link href={~p"/users/reset_password"} class="btn btn-primary">
<%= dgettext("actions", "Forgot your password?") %>
</.link>
</div>

View File

@ -6,14 +6,14 @@ defmodule CanneryWeb.UserResetPasswordController do
plug :get_user_by_reset_password_token when action in [:edit, :update]
def new(conn, _params) do
render(conn, "new.html", page_title: gettext("Forgot your password?"))
render(conn, :new, page_title: gettext("Forgot your password?"))
end
def create(conn, %{"user" => %{"email" => email}}) do
if user = Accounts.get_user_by_email(email) do
Accounts.deliver_user_reset_password_instructions(
user,
&Routes.user_reset_password_url(conn, :edit, &1)
fn token -> url(CanneryWeb.Endpoint, ~p"/users/reset_password/#{token}") end
)
end
@ -23,15 +23,14 @@ defmodule CanneryWeb.UserResetPasswordController do
:info,
dgettext(
"prompts",
"If your email is in our system, you will receive instructions to " <>
"reset your password shortly."
"If your email is in our system, you will receive instructions to reset your password shortly."
)
)
|> redirect(to: "/")
|> redirect(to: ~p"/")
end
def edit(conn, _params) do
render(conn, "edit.html",
render(conn, :edit,
changeset: Accounts.change_user_password(conn.assigns.user),
page_title: gettext("Reset your password")
)
@ -44,10 +43,10 @@ defmodule CanneryWeb.UserResetPasswordController do
{:ok, _} ->
conn
|> put_flash(:info, dgettext("prompts", "Password reset successfully."))
|> redirect(to: Routes.user_session_path(conn, :new))
|> redirect(to: ~p"/users/log_in")
{:error, changeset} ->
render(conn, "edit.html", changeset: changeset)
render(conn, :edit, changeset: changeset)
end
end
@ -62,7 +61,7 @@ defmodule CanneryWeb.UserResetPasswordController do
:error,
dgettext("errors", "Reset password link is invalid or it has expired.")
)
|> redirect(to: "/")
|> redirect(to: ~p"/")
|> halt()
end
end

View File

@ -0,0 +1,6 @@
defmodule CanneryWeb.UserResetPasswordHTML do
use CanneryWeb, :html
alias Cannery.Accounts
embed_templates "user_reset_password_html/*"
end

View File

@ -6,7 +6,7 @@
<.form
:let={f}
for={@changeset}
action={Routes.user_reset_password_path(@conn, :update, @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"
>
<p :if={@changeset.action && not @changeset.valid?()} class="alert alert-danger col-span-3">
@ -34,14 +34,10 @@
<hr class="hr" />
<div class="flex flex-row justify-center items-center space-x-4">
<.link
:if={Accounts.allow_registration?()}
href={Routes.user_registration_path(@conn, :new)}
class="btn btn-primary"
>
<.link :if={Accounts.allow_registration?()} href={~p"/users/register"} class="btn btn-primary">
<%= dgettext("actions", "Register") %>
</.link>
<.link href={Routes.user_session_path(@conn, :new)} class="btn btn-primary">
<.link href={~p"/users/log_in"} class="btn btn-primary">
<%= dgettext("actions", "Log in") %>
</.link>
</div>

View File

@ -7,7 +7,7 @@
:let={f}
for={%{}}
as={:user}
action={Routes.user_reset_password_path(@conn, :create)}
action={~p"/users/reset_password"}
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
>
<%= label(f, :email, gettext("Email"), class: "title text-lg text-primary-600") %>
@ -21,14 +21,10 @@
<hr class="hr" />
<div class="flex flex-row justify-center items-center space-x-4">
<.link
:if={Accounts.allow_registration?()}
href={Routes.user_registration_path(@conn, :new)}
class="btn btn-primary"
>
<.link :if={Accounts.allow_registration?()} href={~p"/users/register"} class="btn btn-primary">
<%= dgettext("actions", "Register") %>
</.link>
<.link href={Routes.user_session_path(@conn, :new)} class="btn btn-primary">
<.link href={~p"/users/log_in"} class="btn btn-primary">
<%= dgettext("actions", "Log in") %>
</.link>
</div>

View File

@ -5,7 +5,7 @@ defmodule CanneryWeb.UserSessionController do
alias CanneryWeb.UserAuth
def new(conn, _params) do
render(conn, "new.html", error_message: nil, page_title: gettext("Log in"))
render(conn, :new, error_message: nil, page_title: gettext("Log in"))
end
def create(conn, %{"user" => user_params}) do
@ -14,7 +14,7 @@ defmodule CanneryWeb.UserSessionController do
if user = Accounts.get_user_by_email_and_password(email, password) do
UserAuth.log_in_user(conn, user, user_params)
else
render(conn, "new.html", error_message: dgettext("errors", "Invalid email or password"))
render(conn, :new, error_message: dgettext("errors", "Invalid email or password"))
end
end

View File

@ -0,0 +1,6 @@
defmodule CanneryWeb.UserSessionHTML do
use CanneryWeb, :html
alias Cannery.Accounts
embed_templates "user_session_html/*"
end

View File

@ -6,8 +6,8 @@
<.form
:let={f}
for={@conn}
action={Routes.user_session_path(@conn, :create)}
as="user"
action={~p"/users/log_in"}
as={:user}
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={@error_message} class="alert alert-danger col-span-3">
@ -31,14 +31,10 @@
<hr class="hr" />
<div class="flex flex-row justify-center items-center space-x-4">
<.link
:if={Accounts.allow_registration?()}
href={Routes.user_registration_path(@conn, :new)}
class="btn btn-primary"
>
<.link :if={Accounts.allow_registration?()} href={~p"/users/register"} class="btn btn-primary">
<%= dgettext("actions", "Register") %>
</.link>
<.link href={Routes.user_reset_password_path(@conn, :new)} class="btn btn-primary">
<.link href={~p"/users/reset_password"} class="btn btn-primary">
<%= dgettext("actions", "Forgot your password?") %>
</.link>
</div>

View File

@ -2,12 +2,12 @@ defmodule CanneryWeb.UserSettingsController do
use CanneryWeb, :controller
import CanneryWeb.Gettext
alias Cannery.Accounts
alias CanneryWeb.{HomeLive, UserAuth}
alias CanneryWeb.UserAuth
plug :assign_email_and_password_changesets
def edit(conn, _params) do
render(conn, "edit.html", page_title: gettext("Settings"))
render(conn, :edit, page_title: gettext("Settings"))
end
def update(%{assigns: %{current_user: user}} = conn, %{
@ -20,7 +20,7 @@ defmodule CanneryWeb.UserSettingsController do
Accounts.deliver_update_email_instructions(
applied_user,
user.email,
&Routes.user_settings_url(conn, :confirm_email, &1)
fn token -> url(CanneryWeb.Endpoint, ~p"/users/settings/confirm_email/#{token}") end
)
conn
@ -31,10 +31,10 @@ defmodule CanneryWeb.UserSettingsController do
"A link to confirm your email change has been sent to the new address."
)
)
|> redirect(to: Routes.user_settings_path(conn, :edit))
|> redirect(to: ~p"/users/settings")
{:error, changeset} ->
conn |> render("edit.html", email_changeset: changeset)
conn |> render(:edit, email_changeset: changeset)
end
end
@ -47,11 +47,11 @@ defmodule CanneryWeb.UserSettingsController do
{:ok, user} ->
conn
|> put_flash(:info, dgettext("prompts", "Password updated successfully."))
|> put_session(:user_return_to, Routes.user_settings_path(conn, :edit))
|> put_session(:user_return_to, ~p"/users/settings")
|> UserAuth.log_in_user(user)
{:error, changeset} ->
conn |> render("edit.html", password_changeset: changeset)
conn |> render(:edit, password_changeset: changeset)
end
end
@ -63,10 +63,10 @@ defmodule CanneryWeb.UserSettingsController do
{:ok, _user} ->
conn
|> put_flash(:info, dgettext("prompts", "Language updated successfully."))
|> redirect(to: Routes.user_settings_path(conn, :edit))
|> redirect(to: ~p"/users/settings")
{:error, changeset} ->
conn |> render("edit.html", locale_changeset: changeset)
conn |> render(:edit, locale_changeset: changeset)
end
end
@ -75,7 +75,7 @@ defmodule CanneryWeb.UserSettingsController do
:ok ->
conn
|> put_flash(:info, dgettext("prompts", "Email changed successfully."))
|> redirect(to: Routes.user_settings_path(conn, :edit))
|> redirect(to: ~p"/users/settings")
:error ->
conn
@ -83,7 +83,7 @@ defmodule CanneryWeb.UserSettingsController do
:error,
dgettext("errors", "Email change link is invalid or it has expired.")
)
|> redirect(to: Routes.user_settings_path(conn, :edit))
|> redirect(to: ~p"/users/settings")
end
end
@ -93,11 +93,11 @@ defmodule CanneryWeb.UserSettingsController do
conn
|> put_flash(:error, dgettext("prompts", "Your account has been deleted"))
|> redirect(to: Routes.live_path(conn, HomeLive))
|> redirect(to: ~p"/")
else
conn
|> put_flash(:error, dgettext("errors", "Unable to delete user"))
|> redirect(to: Routes.user_settings_path(conn, :edit))
|> redirect(to: ~p"/users/settings")
end
end

View File

@ -0,0 +1,5 @@
defmodule CanneryWeb.UserSettingsHTML do
use CanneryWeb, :html
embed_templates "user_settings_html/*"
end

View File

@ -8,7 +8,7 @@
<.form
:let={f}
for={@email_changeset}
action={Routes.user_settings_path(@conn, :update)}
action={~p"/users/settings"}
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
>
<h3 class="title text-primary-600 text-lg text-center col-span-3">
@ -50,7 +50,7 @@
<.form
:let={f}
for={@password_changeset}
action={Routes.user_settings_path(@conn, :update)}
action={~p"/users/settings"}
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
>
<h3 class="title text-primary-600 text-lg text-center col-span-3">
@ -104,7 +104,7 @@
<.form
:let={f}
for={@locale_changeset}
action={Routes.user_settings_path(@conn, :update)}
action={~p"/users/settings"}
class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
>
<%= label(f, :locale, dgettext("actions", "Change Language"),
@ -142,17 +142,13 @@
<hr class="hr" />
<div class="flex justify-center items-center">
<.link
href={Routes.export_path(@conn, :export, :json)}
class="mx-4 my-2 btn btn-primary"
target="_blank"
>
<.link href={~p"/export/json"} class="mx-4 my-2 btn btn-primary" target="_blank">
<%= dgettext("actions", "Export Data as JSON") %>
</.link>
<.link
href={Routes.user_settings_path(@conn, :delete, @current_user)}
method={:delete}
href={~p"/users/settings/#{@current_user}"}
method="delete"
class="mx-4 my-2 btn btn-alert"
data-confirm={dgettext("prompts", "Are you sure you want to delete your account?")}
>

View File

@ -20,7 +20,7 @@ defmodule CanneryWeb.Endpoint do
at: "/",
from: :cannery,
gzip: false,
only: ~w(css fonts images js favicon.ico robots.txt)
only: CanneryWeb.static_paths()
# Code reloading can be explicitly enabled under the
# :code_reloader configuration of your endpoint.

View File

@ -1,8 +1,6 @@
defmodule CanneryWeb.ViewHelpers do
defmodule CanneryWeb.HTMLHelpers do
@moduledoc """
Contains common helpers that can be used in liveviews and regular views. These
are automatically imported into any Phoenix View using `use CanneryWeb,
:view`
Contains common helpers that are used for rendering
"""
use Phoenix.Component

View File

@ -105,12 +105,11 @@ defmodule CanneryWeb.ContainerLive.Index do
end
def handle_event("search", %{"search" => %{"search_term" => ""}}, socket) do
{:noreply, socket |> push_patch(to: Routes.container_index_path(Endpoint, :index))}
{:noreply, socket |> push_patch(to: ~p"/containers")}
end
def handle_event("search", %{"search" => %{"search_term" => search_term}}, socket) do
{:noreply,
socket |> push_patch(to: Routes.container_index_path(Endpoint, :search, search_term))}
{:noreply, socket |> push_patch(to: ~p"/containers/search/#{search_term}")}
end
defp display_containers(%{assigns: %{search: search, current_user: current_user}} = socket) do

View File

@ -9,11 +9,11 @@
<%= display_emoji("😔") %>
</h2>
<.link patch={Routes.container_index_path(Endpoint, :new)} class="btn btn-primary">
<.link patch={~p"/containers/new"} class="btn btn-primary">
<%= dgettext("actions", "Add your first container!") %>
</.link>
<% else %>
<.link patch={Routes.container_index_path(Endpoint, :new)} class="btn btn-primary">
<.link patch={~p"/containers/new"} class="btn btn-primary">
<%= dgettext("actions", "New Container") %>
</.link>
@ -59,7 +59,7 @@
<:tag_actions :let={container}>
<div class="mx-4 my-2">
<.link
patch={Routes.container_index_path(Endpoint, :edit_tags, container)}
patch={~p"/containers/edit_tags/#{container}"}
class="text-primary-600 link"
aria-label={
dgettext("actions", "Tag %{container_name}", container_name: container.name)
@ -71,7 +71,7 @@
</:tag_actions>
<:actions :let={container}>
<.link
patch={Routes.container_index_path(Endpoint, :edit, container)}
patch={~p"/containers/edit/#{container}"}
class="text-primary-600 link"
aria-label={
dgettext("actions", "Edit %{container_name}", container_name: container.name)
@ -81,7 +81,7 @@
</.link>
<.link
patch={Routes.container_index_path(Endpoint, :clone, container)}
patch={~p"/containers/clone/#{container}"}
class="text-primary-600 link"
aria-label={
dgettext("actions", "Clone %{container_name}", container_name: container.name)
@ -118,7 +118,7 @@
<:tag_actions>
<div class="mx-4 my-2">
<.link
patch={Routes.container_index_path(Endpoint, :edit_tags, container)}
patch={~p"/containers/edit_tags/#{container}"}
class="text-primary-600 link"
aria-label={
dgettext("actions", "Tag %{container_name}", container_name: container.name)
@ -129,7 +129,7 @@
</div>
</:tag_actions>
<.link
patch={Routes.container_index_path(Endpoint, :edit, container)}
patch={~p"/containers/edit/#{container}"}
class="text-primary-600 link"
aria-label={
dgettext("actions", "Edit %{container_name}", container_name: container.name)
@ -139,7 +139,7 @@
</.link>
<.link
patch={Routes.container_index_path(Endpoint, :clone, container)}
patch={~p"/containers/clone/#{container}"}
class="text-primary-600 link"
aria-label={
dgettext("actions", "Clone %{container_name}", container_name: container.name)
@ -173,26 +173,26 @@
<%= case @live_action do %>
<% modifying when modifying in [:new, :edit, :clone] -> %>
<.modal return_to={Routes.container_index_path(Endpoint, :index)}>
<.modal return_to={~p"/containers"}>
<.live_component
module={CanneryWeb.ContainerLive.FormComponent}
id={@container.id || :new}
title={@page_title}
action={@live_action}
container={@container}
return_to={Routes.container_index_path(Endpoint, :index)}
return_to={~p"/containers"}
current_user={@current_user}
/>
</.modal>
<% :edit_tags -> %>
<.modal return_to={Routes.container_index_path(Endpoint, :index)}>
<.modal return_to={~p"/containers"}>
<.live_component
module={CanneryWeb.ContainerLive.EditTagsComponent}
id={@container.id}
title={@page_title}
action={@live_action}
container={@container}
current_path={Routes.container_index_path(Endpoint, :edit_tags, @container)}
current_path={~p"/containers/edit_tags/#{@container}"}
current_user={@current_user}
/>
</.modal>

View File

@ -5,7 +5,6 @@ defmodule CanneryWeb.ContainerLive.Show do
use CanneryWeb, :live_view
alias Cannery.{Accounts.User, ActivityLog, Ammo, Containers, Containers.Container}
alias CanneryWeb.Endpoint
alias Ecto.Changeset
alias Phoenix.LiveView.Socket
@ -59,10 +58,7 @@ defmodule CanneryWeb.ContainerLive.Show do
|> case do
{:ok, %{name: container_name}} ->
prompt = dgettext("prompts", "%{name} has been deleted", name: container_name)
socket
|> put_flash(:info, prompt)
|> push_navigate(to: Routes.container_index_path(socket, :index))
socket |> put_flash(:info, prompt) |> push_navigate(to: ~p"/containers")
{:error, %{action: :delete, errors: [packs: _error], valid?: false} = changeset} ->
packs_error = changeset |> changeset_errors(:packs) |> Enum.join(", ")

View File

@ -30,7 +30,7 @@
<div class="flex space-x-4 justify-center items-center text-primary-600">
<.link
patch={Routes.container_show_path(Endpoint, :edit, @container)}
patch={~p"/container/edit/#{@container}"}
class="text-primary-600 link"
aria-label={dgettext("actions", "Edit %{container_name}", container_name: @container.name)}
>
@ -61,10 +61,7 @@
<%= display_emoji("😔") %>
</h2>
<.link
patch={Routes.container_show_path(Endpoint, :edit_tags, @container)}
class="btn btn-primary"
>
<.link patch={~p"/container/edit_tags/#{@container}"} class="btn btn-primary">
<%= dgettext("actions", "Why not add one?") %>
</.link>
</div>
@ -73,10 +70,7 @@
<.simple_tag_card :for={tag <- @container.tags} tag={tag} />
<div class="mx-4 my-2">
<.link
patch={Routes.container_show_path(Endpoint, :edit_tags, @container)}
class="text-primary-600 link"
>
<.link patch={~p"/container/edit_tags/#{@container}"} class="text-primary-600 link">
<i class="fa-fw fa-lg fas fa-tags"></i>
</.link>
</div>
@ -132,7 +126,7 @@
show_used={false}
>
<:type :let={%{name: type_name} = type}>
<.link navigate={Routes.type_show_path(Endpoint, :show, type)} class="link">
<.link navigate={~p"/type/#{type}"} class="link">
<%= type_name %>
</.link>
</:type>
@ -155,27 +149,27 @@
<%= case @live_action do %>
<% :edit -> %>
<.modal return_to={Routes.container_show_path(Endpoint, :show, @container)}>
<.modal return_to={~p"/container/#{@container}"}>
<.live_component
module={CanneryWeb.ContainerLive.FormComponent}
id={@container.id}
title={@page_title}
action={@live_action}
container={@container}
return_to={Routes.container_show_path(Endpoint, :show, @container)}
return_to={~p"/container/#{@container}"}
current_user={@current_user}
/>
</.modal>
<% :edit_tags -> %>
<.modal return_to={Routes.container_show_path(Endpoint, :show, @container)}>
<.modal return_to={~p"/container/#{@container}"}>
<.live_component
module={CanneryWeb.ContainerLive.EditTagsComponent}
id={@container.id}
title={@page_title}
action={@live_action}
container={@container}
return_to={Routes.container_show_path(Endpoint, :show, @container)}
current_path={Routes.container_show_path(Endpoint, :edit_tags, @container)}
return_to={~p"/container/#{@container}"}
current_path={~p"/container/edit_tags/#{@container}"}
current_user={@current_user}
/>
</.modal>

View File

@ -5,7 +5,6 @@ defmodule CanneryWeb.HomeLive do
use CanneryWeb, :live_view
alias Cannery.Accounts
alias CanneryWeb.Endpoint
@version Mix.Project.config()[:version]

View File

@ -1,6 +1,6 @@
<div class="mx-auto px-8 sm:px-16 flex flex-col justify-center items-center text-center space-y-4 max-w-3xl">
<img
src={Routes.static_path(Endpoint, "/images/cannery.svg")}
src={~p"/images/cannery.svg"}
alt={gettext("Cannery logo")}
class="inline-block w-32 hover:-mt-2 hover:mb-2 transition-all duration-500 ease-in-out"
title={gettext("isn't he cute >:3")}
@ -59,7 +59,7 @@
</b>
<p>
<%= if @admins |> Enum.empty?() do %>
<.link href={Routes.user_registration_path(Endpoint, :new)} class="hover:underline">
<.link href={~p"/users/register"} class="hover:underline">
<%= dgettext("prompts", "Register to setup Cannery") %>
</.link>
<% else %>

View File

@ -9,11 +9,11 @@
<%= display_emoji("😔") %>
</h1>
<.link patch={Routes.invite_index_path(Endpoint, :new)} class="btn btn-primary">
<.link patch={~p"/invites/new"} class="btn btn-primary">
<%= dgettext("actions", "Invite someone new!") %>
</.link>
<% else %>
<.link patch={Routes.invite_index_path(Endpoint, :new)} class="btn btn-primary">
<.link patch={~p"/invites/new"} class="btn btn-primary">
<%= dgettext("actions", "Create Invite") %>
</.link>
<% end %>
@ -40,7 +40,7 @@
</form>
</:code_actions>
<.link
patch={Routes.invite_index_path(Endpoint, :edit, invite)}
patch={~p"/invites/#{invite}/edit"}
class="text-primary-600 link"
aria-label={
dgettext("actions", "Edit invite for %{invite_name}", invite_name: invite.name)
@ -149,14 +149,14 @@
<% end %>
</div>
<.modal :if={@live_action in [:new, :edit]} return_to={Routes.invite_index_path(Endpoint, :index)}>
<.modal :if={@live_action in [:new, :edit]} return_to={~p"/invites"}>
<.live_component
module={CanneryWeb.InviteLive.FormComponent}
id={@invite.id || :new}
title={@page_title}
action={@live_action}
invite={@invite}
return_to={Routes.invite_index_path(Endpoint, :index)}
return_to={~p"/invites"}
current_user={@current_user}
/>
</.modal>

View File

@ -113,13 +113,11 @@ defmodule CanneryWeb.PackLive.Index do
end
def handle_event("search", %{"search" => %{"search_term" => ""}}, socket) do
{:noreply, socket |> push_patch(to: Routes.pack_index_path(Endpoint, :index))}
{:noreply, socket |> push_patch(to: ~p"/ammo")}
end
def handle_event("search", %{"search" => %{"search_term" => search_term}}, socket) do
socket = socket |> push_patch(to: Routes.pack_index_path(Endpoint, :search, search_term))
{:noreply, socket}
{:noreply, socket |> push_patch(to: ~p"/ammo/search/#{search_term}")}
end
def handle_event("change_class", %{"type" => %{"class" => "rifle"}}, socket) do

View File

@ -10,7 +10,7 @@
<%= dgettext("prompts", "You'll need to") %>
</h2>
<.link navigate={Routes.container_index_path(Endpoint, :new)} class="btn btn-primary">
<.link navigate={~p"/containers/new"} class="btn btn-primary">
<%= dgettext("actions", "add a container first") %>
</.link>
</div>
@ -20,7 +20,7 @@
<%= dgettext("prompts", "You'll need to") %>
</h2>
<.link navigate={Routes.type_index_path(Endpoint, :new)} class="btn btn-primary">
<.link navigate={~p"/catalog/new"} class="btn btn-primary">
<%= dgettext("actions", "add a type first") %>
</.link>
</div>
@ -30,11 +30,11 @@
<%= display_emoji("😔") %>
</h2>
<.link patch={Routes.pack_index_path(Endpoint, :new)} class="btn btn-primary">
<.link patch={~p"/ammo/new"} class="btn btn-primary">
<%= dgettext("actions", "Add your first box!") %>
</.link>
<% true -> %>
<.link patch={Routes.pack_index_path(Endpoint, :new)} class="btn btn-primary">
<.link patch={~p"/ammo/new"} class="btn btn-primary">
<%= dgettext("actions", "Add Ammo") %>
</.link>
@ -103,7 +103,7 @@
show_used={@show_used}
>
<:type :let={%{name: type_name} = type}>
<.link navigate={Routes.type_show_path(Endpoint, :show, type)} class="link">
<.link navigate={~p"/type/#{type}"} class="link">
<%= type_name %>
</.link>
</:type>
@ -121,7 +121,7 @@
</button>
<.link
patch={Routes.pack_index_path(Endpoint, :add_shot_record, pack)}
patch={~p"/ammo/add_shot_record/#{pack}"}
class="mx-2 my-1 text-sm btn btn-primary"
>
<%= dgettext("actions", "Record shots") %>
@ -130,17 +130,11 @@
</:range>
<: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">
<.link
navigate={Routes.container_show_path(Endpoint, :show, container)}
class="mx-2 my-1 link"
>
<.link navigate={~p"/container/#{container}"} class="mx-2 my-1 link">
<%= container_name %>
</.link>
<.link
patch={Routes.pack_index_path(Endpoint, :move, pack)}
class="mx-2 my-1 text-sm btn btn-primary"
>
<.link patch={~p"/ammo/move/#{pack}"} class="mx-2 my-1 text-sm btn btn-primary">
<%= dgettext("actions", "Move ammo") %>
</.link>
</div>
@ -148,7 +142,7 @@
<:actions :let={%{count: pack_count} = pack}>
<div class="py-2 px-4 h-full space-x-4 flex justify-center items-center">
<.link
navigate={Routes.pack_show_path(Endpoint, :show, pack)}
navigate={~p"/ammo/show/#{pack}"}
class="text-primary-600 link"
aria-label={
dgettext("actions", "View pack of %{pack_count} bullets", pack_count: pack_count)
@ -158,7 +152,7 @@
</.link>
<.link
patch={Routes.pack_index_path(Endpoint, :edit, pack)}
patch={~p"/ammo/edit/#{pack}"}
class="text-primary-600 link"
aria-label={
dgettext("actions", "Edit pack of %{pack_count} bullets", pack_count: pack_count)
@ -168,7 +162,7 @@
</.link>
<.link
patch={Routes.pack_index_path(Endpoint, :clone, pack)}
patch={~p"/ammo/clone/#{pack}"}
class="text-primary-600 link"
aria-label={
dgettext("actions", "Clone pack of %{pack_count} bullets",
@ -202,38 +196,38 @@
<%= case @live_action do %>
<% create when create in [:new, :edit, :clone] -> %>
<.modal return_to={Routes.pack_index_path(Endpoint, :index)}>
<.modal return_to={~p"/ammo"}>
<.live_component
module={CanneryWeb.PackLive.FormComponent}
id={@pack.id || :new}
title={@page_title}
action={@live_action}
pack={@pack}
return_to={Routes.pack_index_path(Endpoint, :index)}
return_to={~p"/ammo"}
current_user={@current_user}
/>
</.modal>
<% :add_shot_record -> %>
<.modal return_to={Routes.pack_index_path(Endpoint, :index)}>
<.modal return_to={~p"/ammo"}>
<.live_component
module={CanneryWeb.Components.AddShotRecordComponent}
id={:new}
title={@page_title}
action={@live_action}
pack={@pack}
return_to={Routes.pack_index_path(Endpoint, :index)}
return_to={~p"/ammo"}
current_user={@current_user}
/>
</.modal>
<% :move -> %>
<.modal return_to={Routes.pack_index_path(Endpoint, :index)}>
<.modal return_to={~p"/ammo"}>
<.live_component
module={CanneryWeb.Components.MovePackComponent}
id={@pack.id}
title={@page_title}
action={@live_action}
pack={@pack}
return_to={Routes.pack_index_path(Endpoint, :index)}
return_to={~p"/ammo"}
current_user={@current_user}
/>
</.modal>

View File

@ -7,7 +7,6 @@ defmodule CanneryWeb.PackLive.Show do
alias Cannery.{ActivityLog, ActivityLog.ShotRecord}
alias Cannery.{Ammo, Ammo.Pack}
alias Cannery.{ComparableDate, Containers}
alias CanneryWeb.Endpoint
alias Phoenix.LiveView.Socket
@impl true
@ -53,7 +52,7 @@ defmodule CanneryWeb.PackLive.Show do
pack |> Ammo.delete_pack!(current_user)
prompt = dgettext("prompts", "Ammo deleted succesfully")
redirect_to = Routes.pack_index_path(socket, :index)
redirect_to = ~p"/ammo"
{:noreply, socket |> put_flash(:info, prompt) |> push_navigate(to: redirect_to)}
end
@ -139,7 +138,7 @@ defmodule CanneryWeb.PackLive.Show do
~H"""
<div class="px-4 py-2 space-x-4 flex justify-center items-center">
<.link
patch={Routes.pack_show_path(Endpoint, :edit_shot_record, @pack, @shot_record)}
patch={~p"/ammo/show/#{@pack}/edit/#{@shot_record}"}
class="text-primary-600 link"
aria-label={
dgettext("actions", "Edit shot record of %{shot_record_count} shots",

View File

@ -48,15 +48,12 @@
<div class="flex flex-col justify-center items-center">
<div class="flex flex-wrap justify-center items-center text-primary-600">
<.link
navigate={Routes.type_show_path(Endpoint, :show, @pack.type)}
class="mx-4 my-2 btn btn-primary"
>
<.link navigate={~p"/type/#{@pack.type}"} class="mx-4 my-2 btn btn-primary">
<%= dgettext("actions", "View in Catalog") %>
</.link>
<.link
patch={Routes.pack_show_path(Endpoint, :edit, @pack)}
patch={~p"/ammo/show/edit/#{@pack}"}
class="mx-4 my-2 text-primary-600 link"
aria-label={
dgettext("actions", "Edit pack of %{pack_count} bullets", pack_count: @pack.count)
@ -85,14 +82,11 @@
else: dgettext("actions", "Stage for range") %>
</button>
<.link patch={Routes.pack_show_path(Endpoint, :move, @pack)} class="btn btn-primary">
<.link patch={~p"/ammo/show/move/#{@pack}"} class="btn btn-primary">
<%= dgettext("actions", "Move ammo") %>
</.link>
<.link
patch={Routes.pack_show_path(Endpoint, :add_shot_record, @pack)}
class="mx-4 my-2 btn btn-primary"
>
<.link patch={~p"/ammo/show/add_shot_record/#{@pack}"} class="mx-4 my-2 btn btn-primary">
<%= dgettext("actions", "Record shots") %>
</.link>
</div>
@ -130,50 +124,50 @@
<%= case @live_action do %>
<% :edit -> %>
<.modal return_to={Routes.pack_show_path(Endpoint, :show, @pack)}>
<.modal return_to={~p"/ammo/show/#{@pack}"}>
<.live_component
module={CanneryWeb.PackLive.FormComponent}
id={@pack.id}
title={@page_title}
action={@live_action}
pack={@pack}
return_to={Routes.pack_show_path(Endpoint, :show, @pack)}
return_to={~p"/ammo/show/#{@pack}"}
current_user={@current_user}
/>
</.modal>
<% :edit_shot_record -> %>
<.modal return_to={Routes.pack_show_path(Endpoint, :show, @pack)}>
<.modal return_to={~p"/ammo/show/#{@pack}"}>
<.live_component
module={CanneryWeb.RangeLive.FormComponent}
id={@shot_record.id}
title={@page_title}
action={@live_action}
shot_record={@shot_record}
return_to={Routes.pack_show_path(Endpoint, :show, @pack)}
return_to={~p"/ammo/show/#{@pack}"}
current_user={@current_user}
/>
</.modal>
<% :add_shot_record -> %>
<.modal return_to={Routes.pack_show_path(Endpoint, :show, @pack)}>
<.modal return_to={~p"/ammo/show/#{@pack}"}>
<.live_component
module={CanneryWeb.Components.AddShotRecordComponent}
id={:new}
title={@page_title}
action={@live_action}
pack={@pack}
return_to={Routes.pack_show_path(Endpoint, :show, @pack)}
return_to={~p"/ammo/show/#{@pack}"}
current_user={@current_user}
/>
</.modal>
<% :move -> %>
<.modal return_to={Routes.pack_show_path(Endpoint, :show, @pack)}>
<.modal return_to={~p"/ammo/show/#{@pack}"}>
<.live_component
module={CanneryWeb.Components.MovePackComponent}
id={@pack.id}
title={@page_title}
action={@live_action}
pack={@pack}
return_to={Routes.pack_show_path(Endpoint, :show, @pack)}
return_to={~p"/ammo/show/#{@pack}"}
current_user={@current_user}
/>
</.modal>

View File

@ -5,7 +5,6 @@ defmodule CanneryWeb.RangeLive.Index do
use CanneryWeb, :live_view
alias Cannery.{ActivityLog, ActivityLog.ShotRecord, Ammo}
alias CanneryWeb.Endpoint
alias Phoenix.LiveView.Socket
@impl true
@ -94,11 +93,11 @@ defmodule CanneryWeb.RangeLive.Index do
end
def handle_event("search", %{"search" => %{"search_term" => ""}}, socket) do
{:noreply, socket |> push_patch(to: Routes.range_index_path(Endpoint, :index))}
{:noreply, socket |> push_patch(to: ~p"/range")}
end
def handle_event("search", %{"search" => %{"search_term" => search_term}}, socket) do
{:noreply, socket |> push_patch(to: Routes.range_index_path(Endpoint, :search, search_term))}
{:noreply, socket |> push_patch(to: ~p"/range/search/#{search_term}")}
end
def handle_event("change_class", %{"type" => %{"class" => "rifle"}}, socket) do

View File

@ -9,11 +9,11 @@
<%= display_emoji("😔") %>
</h1>
<.link navigate={Routes.pack_index_path(Endpoint, :index)} class="btn btn-primary">
<.link navigate={~p"/ammo"} class="btn btn-primary">
<%= dgettext("actions", "Why not get some ready to shoot?") %>
</.link>
<% else %>
<.link navigate={Routes.pack_index_path(Endpoint, :index)} class="btn btn-primary">
<.link navigate={~p"/ammo"} class="btn btn-primary">
<%= dgettext("actions", "Stage ammo") %>
</.link>
@ -38,10 +38,7 @@
else: dgettext("actions", "Stage for range") %>
</button>
<.link
patch={Routes.range_index_path(Endpoint, :add_shot_record, pack)}
class="btn btn-primary"
>
<.link patch={~p"/range/add_shot_record/#{pack}"} class="btn btn-primary">
<%= dgettext("actions", "Record shots") %>
</.link>
</.pack_card>
@ -132,7 +129,7 @@
<:actions :let={shot_record}>
<div class="px-4 py-2 space-x-4 flex justify-center items-center">
<.link
patch={Routes.range_index_path(Endpoint, :edit, shot_record)}
patch={~p"/range/edit/#{shot_record}"}
class="text-primary-600 link"
aria-label={
dgettext("actions", "Edit shot record of %{shot_record_count} shots",
@ -168,26 +165,26 @@
<%= case @live_action do %>
<% :edit -> %>
<.modal return_to={Routes.range_index_path(Endpoint, :index)}>
<.modal return_to={~p"/range"}>
<.live_component
module={CanneryWeb.RangeLive.FormComponent}
id={@shot_record.id}
title={@page_title}
action={@live_action}
shot_record={@shot_record}
return_to={Routes.range_index_path(Endpoint, :index)}
return_to={~p"/range"}
current_user={@current_user}
/>
</.modal>
<% :add_shot_record -> %>
<.modal return_to={Routes.range_index_path(Endpoint, :index)}>
<.modal return_to={~p"/range"}>
<.live_component
module={CanneryWeb.Components.AddShotRecordComponent}
id={:new}
title={@page_title}
action={@live_action}
pack={@pack}
return_to={Routes.range_index_path(Endpoint, :index)}
return_to={~p"/range"}
current_user={@current_user}
/>
</.modal>

View File

@ -5,7 +5,7 @@ defmodule CanneryWeb.TagLive.Index do
use CanneryWeb, :live_view
alias Cannery.{Containers, Containers.Tag}
alias CanneryWeb.ViewHelpers
alias CanneryWeb.HTMLHelpers
@impl true
def mount(%{"search" => search}, _session, socket) do
@ -33,7 +33,7 @@ defmodule CanneryWeb.TagLive.Index do
socket
|> assign(
page_title: gettext("New Tag"),
tag: %Tag{bg_color: ViewHelpers.random_color(), text_color: "#ffffff"}
tag: %Tag{bg_color: HTMLHelpers.random_color(), text_color: "#ffffff"}
)
end
@ -67,11 +67,11 @@ defmodule CanneryWeb.TagLive.Index do
end
def handle_event("search", %{"search" => %{"search_term" => ""}}, socket) do
{:noreply, socket |> push_patch(to: Routes.tag_index_path(Endpoint, :index))}
{:noreply, socket |> push_patch(to: ~p"/tags")}
end
def handle_event("search", %{"search" => %{"search_term" => search_term}}, socket) do
{:noreply, socket |> push_patch(to: Routes.tag_index_path(Endpoint, :search, search_term))}
{:noreply, socket |> push_patch(to: ~p"/tags/search/#{search_term}")}
end
defp display_tags(%{assigns: %{search: search, current_user: current_user}} = socket) do

View File

@ -11,11 +11,11 @@
<%= display_emoji("😔") %>
</h2>
<.link patch={Routes.tag_index_path(Endpoint, :new)} class="btn btn-primary">
<.link patch={~p"/tags/new"} class="btn btn-primary">
<%= dgettext("actions", "Make your first tag!") %>
</.link>
<% else %>
<.link patch={Routes.tag_index_path(Endpoint, :new)} class="btn btn-primary">
<.link patch={~p"/tags/new"} class="btn btn-primary">
<%= dgettext("actions", "New Tag") %>
</.link>
@ -47,7 +47,7 @@
<div class="flex flex-row flex-wrap justify-center items-stretch">
<.tag_card :for={tag <- @tags} tag={tag}>
<.link
patch={Routes.tag_index_path(Endpoint, :edit, tag)}
patch={~p"/tags/edit/#{tag}"}
class="text-primary-600 link"
aria-label={dgettext("actions", "Edit %{tag_name}", tag_name: tag.name)}
>
@ -72,14 +72,14 @@
<% end %>
</div>
<.modal :if={@live_action in [:new, :edit]} return_to={Routes.tag_index_path(Endpoint, :index)}>
<.modal :if={@live_action in [:new, :edit]} return_to={~p"/tags"}>
<.live_component
module={CanneryWeb.TagLive.FormComponent}
id={@tag.id || :new}
title={@page_title}
action={@live_action}
tag={@tag}
return_to={Routes.tag_index_path(Endpoint, :index)}
return_to={~p"/tags"}
current_user={@current_user}
/>
</.modal>

View File

@ -78,12 +78,11 @@ defmodule CanneryWeb.TypeLive.Index do
end
def handle_event("search", %{"search" => %{"search_term" => ""}}, socket) do
{:noreply, socket |> push_patch(to: Routes.type_index_path(Endpoint, :index))}
{:noreply, socket |> push_patch(to: ~p"/catalog")}
end
def handle_event("search", %{"search" => %{"search_term" => search_term}}, socket) do
search_path = Routes.type_index_path(Endpoint, :search, search_term)
{:noreply, socket |> push_patch(to: search_path)}
{:noreply, socket |> push_patch(to: ~p"/catalog/search/#{search_term}")}
end
def handle_event("change_class", %{"type" => %{"class" => "rifle"}}, socket) do

View File

@ -9,11 +9,11 @@
<%= display_emoji("😔") %>
</h2>
<.link patch={Routes.type_index_path(Endpoint, :new)} class="btn btn-primary">
<.link patch={~p"/catalog/new"} class="btn btn-primary">
<%= dgettext("actions", "Add your first type!") %>
</.link>
<% else %>
<.link patch={Routes.type_index_path(Endpoint, :new)} class="btn btn-primary">
<.link patch={~p"/catalog/new"} class="btn btn-primary">
<%= dgettext("actions", "New Type") %>
</.link>
@ -84,7 +84,7 @@
<:actions :let={type}>
<div class="px-4 py-2 space-x-4 flex justify-center items-center">
<.link
navigate={Routes.type_show_path(Endpoint, :show, type)}
navigate={~p"/type/#{type}"}
class="text-primary-600 link"
aria-label={dgettext("actions", "View %{type_name}", type_name: type.name)}
>
@ -92,7 +92,7 @@
</.link>
<.link
patch={Routes.type_index_path(Endpoint, :edit, type)}
patch={~p"/catalog/edit/#{type}"}
class="text-primary-600 link"
aria-label={dgettext("actions", "Edit %{type_name}", type_name: type.name)}
>
@ -100,7 +100,7 @@
</.link>
<.link
patch={Routes.type_index_path(Endpoint, :clone, type)}
patch={~p"/catalog/clone/#{type}"}
class="text-primary-600 link"
aria-label={dgettext("actions", "Clone %{type_name}", type_name: type.name)}
>
@ -130,17 +130,14 @@
<% end %>
</div>
<.modal
:if={@live_action in [:new, :edit, :clone]}
return_to={Routes.type_index_path(Endpoint, :index)}
>
<.modal :if={@live_action in [:new, :edit, :clone]} return_to={~p"/catalog"}>
<.live_component
module={CanneryWeb.TypeLive.FormComponent}
id={@type.id || :new}
title={@page_title}
action={@live_action}
type={@type}
return_to={Routes.type_index_path(Endpoint, :index)}
return_to={~p"/catalog"}
current_user={@current_user}
}
/>

View File

@ -5,7 +5,6 @@ defmodule CanneryWeb.TypeLive.Show do
use CanneryWeb, :live_view
alias Cannery.{ActivityLog, Ammo, Ammo.Type, Containers}
alias CanneryWeb.Endpoint
@impl true
def mount(_params, _session, socket),
@ -25,7 +24,7 @@ defmodule CanneryWeb.TypeLive.Show do
%{name: type_name} = type |> Ammo.delete_type!(current_user)
prompt = dgettext("prompts", "%{name} deleted succesfully", name: type_name)
redirect_to = Routes.type_index_path(socket, :index)
redirect_to = ~p"/catalog"
{:noreply, socket |> put_flash(:info, prompt) |> push_navigate(to: redirect_to)}
end

View File

@ -14,7 +14,7 @@
<div class="flex space-x-4 justify-center items-center text-primary-600">
<.link
patch={Routes.type_show_path(Endpoint, :edit, @type)}
patch={~p"/type/#{@type}/edit"}
class="text-primary-600 link"
aria-label={dgettext("actions", "Edit %{type_name}", type_name: @type.name)}
>
@ -188,17 +188,14 @@
show_used={@show_used}
>
<:container :let={{_pack, %{name: container_name} = container}}>
<.link
navigate={Routes.container_show_path(Endpoint, :show, container)}
class="mx-2 my-1 link"
>
<.link navigate={~p"/container/#{container}"} class="mx-2 my-1 link">
<%= container_name %>
</.link>
</:container>
<:actions :let={%{count: pack_count} = pack}>
<div class="py-2 px-4 h-full space-x-4 flex justify-center items-center">
<.link
navigate={Routes.pack_show_path(Endpoint, :show, pack)}
navigate={~p"/ammo/show/#{pack}"}
class="text-primary-600 link"
aria-label={
dgettext("actions", "View pack of %{pack_count} bullets", pack_count: pack_count)
@ -226,14 +223,14 @@
</div>
</div>
<.modal :if={@live_action == :edit} return_to={Routes.type_show_path(Endpoint, :show, @type)}>
<.modal :if={@live_action == :edit} return_to={~p"/type/#{@type}"}>
<.live_component
module={CanneryWeb.TypeLive.FormComponent}
id={@type.id}
title={@page_title}
action={@live_action}
type={@type}
return_to={Routes.type_show_path(Endpoint, :show, @type)}
return_to={~p"/type/#{@type}"}
current_user={@current_user}
/>
</.modal>

View File

@ -7,25 +7,13 @@ defmodule CanneryWeb.Router do
plug :accepts, ["html"]
plug :fetch_session
plug :fetch_live_flash
plug :put_root_layout, {CanneryWeb.LayoutView, :root}
plug :put_root_layout, {CanneryWeb.Layouts, :root}
plug :protect_from_forgery
plug :put_secure_browser_headers
plug :fetch_current_user
plug :put_user_locale
end
defp put_user_locale(%{assigns: %{current_user: %{locale: locale}}} = conn, _opts) do
default = Application.fetch_env!(:gettext, :default_locale)
Gettext.put_locale(locale || default)
conn |> put_session(:locale, locale || default)
end
defp put_user_locale(conn, _opts) do
default = Application.fetch_env!(:gettext, :default_locale)
Gettext.put_locale(default)
conn |> put_session(:locale, default)
end
pipeline :require_admin do
plug :require_role, role: :admin
end
@ -34,14 +22,6 @@ defmodule CanneryWeb.Router do
plug :accepts, ["json"]
end
scope "/", CanneryWeb do
pipe_through :browser
live "/", HomeLive
end
## Authentication routes
scope "/", CanneryWeb do
pipe_through [:browser, :redirect_if_user_is_authenticated]
@ -64,6 +44,7 @@ defmodule CanneryWeb.Router do
get "/users/settings/confirm_email/:token", UserSettingsController, :confirm_email
get "/export/:mode", ExportController, :export
live_session :default, on_mount: [{CanneryWeb.UserAuth, :ensure_authenticated}] do
live "/tags", TagLive.Index, :index
live "/tags/new", TagLive.Index, :new
live "/tags/edit/:id", TagLive.Index, :edit
@ -108,15 +89,6 @@ defmodule CanneryWeb.Router do
live "/range/add_shot_record/:id", RangeLive.Index, :add_shot_record
live "/range/search/:search", RangeLive.Index, :search
end
scope "/", CanneryWeb do
pipe_through [:browser, :require_authenticated_user, :require_admin]
live_dashboard "/dashboard", metrics: CanneryWeb.Telemetry, ecto_repos: [Cannery.Repo]
live "/invites", InviteLive.Index, :index
live "/invites/new", InviteLive.Index, :new
live "/invites/:id/edit", InviteLive.Index, :edit
end
scope "/", CanneryWeb do
@ -126,6 +98,22 @@ defmodule CanneryWeb.Router do
get "/users/confirm", UserConfirmationController, :new
post "/users/confirm", UserConfirmationController, :create
get "/users/confirm/:token", UserConfirmationController, :confirm
live_session :public, on_mount: [{CanneryWeb.UserAuth, :mount_current_user}] do
live "/", HomeLive
end
end
scope "/", CanneryWeb do
pipe_through [:browser, :require_authenticated_user, :require_admin]
live_dashboard "/dashboard", metrics: CanneryWeb.Telemetry, ecto_repos: [Cannery.Repo]
live_session :admin, on_mount: [{CanneryWeb.UserAuth, :ensure_admin}] do
live "/invites", InviteLive.Index, :index
live "/invites/new", InviteLive.Index, :new
live "/invites/:id/edit", InviteLive.Index, :edit
end
end
# Enables the Swoosh mailbox preview in development.
@ -137,9 +125,6 @@ defmodule CanneryWeb.Router do
pipe_through :browser
forward "/mailbox", Plug.Swoosh.MailboxPreview
end
scope "/dev" do
get "/preview/:id", CanneryWeb.EmailController, :preview
end
end

View File

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

View File

@ -1,7 +0,0 @@
defmodule CanneryWeb.EmailView do
@moduledoc """
A view for email-related helper functions
"""
use CanneryWeb, :view
alias CanneryWeb.HomeLive
end

View File

@ -1,15 +0,0 @@
defmodule CanneryWeb.ErrorView do
use CanneryWeb, :view
alias CanneryWeb.HomeLive
def template_not_found(error_path, _assigns) do
error_string =
case error_path do
"404.html" -> dgettext("errors", "Not found")
"401.html" -> dgettext("errors", "Unauthorized")
_other_path -> dgettext("errors", "Internal Server Error")
end
render("error.html", %{error_string: error_string})
end
end

View File

@ -1,3 +0,0 @@
defmodule CanneryWeb.HomeView do
use CanneryWeb, :view
end

View File

@ -1,16 +0,0 @@
defmodule CanneryWeb.LayoutView do
use CanneryWeb, :view
alias CanneryWeb.HomeLive
# Phoenix LiveDashboard is available only in development by default,
# so we instruct Elixir to not warn if the dashboard route is missing.
@compile {:no_warn_undefined, {Routes, :live_dashboard_path, 2}}
def get_title(%{assigns: %{title: title}}) when title not in [nil, ""] do
gettext("Cannery | %{title}", title: title)
end
def get_title(_conn) do
gettext("Cannery")
end
end

View File

@ -1,4 +0,0 @@
defmodule CanneryWeb.UserConfirmationView do
use CanneryWeb, :view
alias Cannery.Accounts
end

View File

@ -1,3 +0,0 @@
defmodule CanneryWeb.UserRegistrationView do
use CanneryWeb, :view
end

View File

@ -1,4 +0,0 @@
defmodule CanneryWeb.UserResetPasswordView do
use CanneryWeb, :view
alias Cannery.Accounts
end

View File

@ -1,4 +0,0 @@
defmodule CanneryWeb.UserSessionView do
use CanneryWeb, :view
alias Cannery.Accounts
end

View File

@ -1,3 +0,0 @@
defmodule CanneryWeb.UserSettingsView do
use CanneryWeb, :view
end

View File

@ -4,10 +4,9 @@ defmodule Cannery.MixProject do
def project do
[
app: :cannery,
version: "0.9.2",
elixir: "1.14.1",
version: "0.9.3",
elixir: "1.14.4",
elixirc_paths: elixirc_paths(Mix.env()),
compilers: Mix.compilers(),
start_permanent: Mix.env() == :prod,
aliases: aliases(),
deps: deps(),
@ -48,12 +47,11 @@ defmodule Cannery.MixProject do
defp deps do
[
{:bcrypt_elixir, "~> 3.0"},
{:phoenix, "~> 1.6.0"},
{:phoenix, "~> 1.7.0"},
{:phoenix_ecto, "~> 4.4"},
{:phoenix_html, "~> 3.0"},
{:phoenix_live_reload, "~> 1.2", only: :dev},
{:phoenix_live_view, "~> 0.18.0"},
{:phoenix_view, "~> 2.0"},
{:phoenix_live_dashboard, "~> 0.6"},
{:ecto_sql, "~> 3.6"},
{:postgrex, ">= 0.0.0"},
@ -62,7 +60,6 @@ defmodule Cannery.MixProject do
{:ex_doc, "~> 0.27", only: :dev, runtime: false},
{:swoosh, "~> 1.6"},
{:gen_smtp, "~> 1.0"},
{:phoenix_swoosh, "~> 1.0"},
{:oban, "~> 2.10"},
{:telemetry_metrics, "~> 0.6"},
{:telemetry_poller, "~> 1.0"},

View File

@ -1,47 +1,45 @@
%{
"bcrypt_elixir": {:hex, :bcrypt_elixir, "3.0.1", "9be815469e6bfefec40fa74658ecbbe6897acfb57614df1416eeccd4903f602c", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "486bb95efb645d1efc6794c1ddd776a186a9a713abf06f45708a6ce324fb96cf"},
"bunt": {:hex, :bunt, "0.2.1", "e2d4792f7bc0ced7583ab54922808919518d0e57ee162901a16a1b6664ef3b14", [:mix], [], "hexpm", "a330bfb4245239787b15005e66ae6845c9cd524a288f0d141c148b02603777a5"},
"castore": {:hex, :castore, "0.1.22", "4127549e411bedd012ca3a308dede574f43819fe9394254ca55ab4895abfa1a2", [:mix], [], "hexpm", "c17576df47eb5aa1ee40cc4134316a99f5cad3e215d5c77b8dd3cfef12a22cac"},
"castore": {:hex, :castore, "1.0.1", "240b9edb4e9e94f8f56ab39d8d2d0a57f49e46c56aced8f873892df8ff64ff5a", [:mix], [], "hexpm", "b4951de93c224d44fac71614beabd88b71932d0b1dea80d2f80fb9044e01bbb3"},
"comeonin": {:hex, :comeonin, "5.3.3", "2c564dac95a35650e9b6acfe6d2952083d8a08e4a89b93a481acb552b325892e", [:mix], [], "hexpm", "3e38c9c2cb080828116597ca8807bb482618a315bfafd98c90bc22a821cc84df"},
"connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"},
"cowboy": {:hex, :cowboy, "2.9.0", "865dd8b6607e14cf03282e10e934023a1bd8be6f6bacf921a7e2a96d800cd452", [:make, :rebar3], [{:cowlib, "2.11.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "2c729f934b4e1aa149aff882f57c6372c15399a20d54f65c8d67bef583021bde"},
"cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"},
"cowlib": {:hex, :cowlib, "2.11.0", "0b9ff9c346629256c42ebe1eeb769a83c6cb771a6ee5960bd110ab0b9b872063", [:make, :rebar3], [], "hexpm", "2b3e9da0b21c4565751a6d4901c20d1b4cc25cbb7fd50d91d2ab6dd287bc86a9"},
"credo": {:hex, :credo, "1.6.7", "323f5734350fd23a456f2688b9430e7d517afb313fbd38671b8a4449798a7854", [:mix], [{:bunt, "~> 0.2.1", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "41e110bfb007f7eda7f897c10bf019ceab9a0b269ce79f015d54b0dcf4fc7dd3"},
"db_connection": {:hex, :db_connection, "2.4.3", "3b9aac9f27347ec65b271847e6baeb4443d8474289bd18c1d6f4de655b70c94d", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c127c15b0fa6cfb32eed07465e05da6c815b032508d4ed7c116122871df73c12"},
"credo": {:hex, :credo, "1.7.0", "6119bee47272e85995598ee04f2ebbed3e947678dee048d10b5feca139435f75", [:mix], [{:bunt, "~> 0.2.1", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "6839fcf63d1f0d1c0f450abc8564a57c43d644077ab96f2934563e68b8a769d7"},
"db_connection": {:hex, :db_connection, "2.5.0", "bb6d4f30d35ded97b29fe80d8bd6f928a1912ca1ff110831edcd238a1973652c", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c92d5ba26cd69ead1ff7582dbb860adeedfff39774105a4f1c92cbb654b55aa2"},
"decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"},
"dialyxir": {:hex, :dialyxir, "1.2.0", "58344b3e87c2e7095304c81a9ae65cb68b613e28340690dfe1a5597fd08dec37", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "61072136427a851674cab81762be4dbeae7679f85b1272b6d25c3a839aff8463"},
"dialyxir": {:hex, :dialyxir, "1.3.0", "fd1672f0922b7648ff9ce7b1b26fcf0ef56dda964a459892ad15f6b4410b5284", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "00b2a4bcd6aa8db9dcb0b38c1225b7277dca9bc370b6438715667071a304696f"},
"earmark_parser": {:hex, :earmark_parser, "1.4.31", "a93921cdc6b9b869f519213d5bc79d9e218ba768d7270d46fdcf1c01bacff9e2", [:mix], [], "hexpm", "317d367ee0335ef037a87e46c91a2269fef6306413f731e8ec11fc45a7efd059"},
"ecto": {:hex, :ecto, "3.9.4", "3ee68e25dbe0c36f980f1ba5dd41ee0d3eb0873bccae8aeaf1a2647242bffa35", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "de5f988c142a3aa4ec18b85a4ec34a2390b65b24f02385c1144252ff6ff8ee75"},
"ecto": {:hex, :ecto, "3.10.1", "c6757101880e90acc6125b095853176a02da8f1afe056f91f1f90b80c9389822", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d2ac4255f1601bdf7ac74c0ed971102c6829dc158719b94bd30041bbad77f87a"},
"ecto_psql_extras": {:hex, :ecto_psql_extras, "0.7.10", "e14d400930f401ca9f541b3349212634e44027d7f919bbb71224d7ac0d0e8acd", [:mix], [{:ecto_sql, "~> 3.4", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.15.7 or ~> 0.16.0", [hex: :postgrex, repo: "hexpm", optional: false]}, {:table_rex, "~> 3.1.1", [hex: :table_rex, repo: "hexpm", optional: false]}], "hexpm", "505e8cd81e4f17c090be0f99e92b1b3f0fd915f98e76965130b8ccfb891e7088"},
"ecto_sql": {:hex, :ecto_sql, "3.9.2", "34227501abe92dba10d9c3495ab6770e75e79b836d114c41108a4bf2ce200ad5", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.9.2", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.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", "1eb5eeb4358fdbcd42eac11c1fbd87e3affd7904e639d77903c1358b2abd3f70"},
"elixir_make": {:hex, :elixir_make, "0.7.5", "784cc00f5fa24239067cc04d449437dcc5f59353c44eb08f188b2b146568738a", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "c3d63e8d5c92fa3880d89ecd41de59473fa2e83eeb68148155e25e8b95aa2887"},
"ecto_sql": {:hex, :ecto_sql, "3.10.1", "6ea6b3036a0b0ca94c2a02613fd9f742614b5cfe494c41af2e6571bb034dd94c", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.10.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 0.17.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f6a25bdbbd695f12c8171eaff0851fa4c8e72eec1e98c7364402dda9ce11c56b"},
"elixir_make": {:hex, :elixir_make, "0.7.6", "67716309dc5d43e16b5abbd00c01b8df6a0c2ab54a8f595468035a50189f9169", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "5a0569756b0f7873a77687800c164cca6dfc03a09418e6fcf853d78991f49940"},
"eqrcode": {:hex, :eqrcode, "0.1.10", "6294fece9d68ad64eef1c3c92cf111cfd6469f4fbf230a2d4cc905a682178f3f", [:mix], [], "hexpm", "da30e373c36a0fd37ab6f58664b16029919896d6c45a68a95cc4d713e81076f1"},
"erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"},
"ex_doc": {:hex, :ex_doc, "0.29.2", "dfa97532ba66910b2a3016a4bbd796f41a86fc71dd5227e96f4c8581fdf0fdf0", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "6b5d7139eda18a753e3250e27e4a929f8d2c880dd0d460cb9986305dea3e03af"},
"expo": {:hex, :expo, "0.4.0", "bbe4bf455e2eb2ebd2f1e7d83530ce50fb9990eb88fc47855c515bfdf1c6626f", [:mix], [], "hexpm", "a8ed1683ec8b7c7fa53fd7a41b2c6935f539168a6bb0616d7fd6b58a36f3abf2"},
"ex_doc": {:hex, :ex_doc, "0.29.4", "6257ecbb20c7396b1fe5accd55b7b0d23f44b6aa18017b415cb4c2b91d997729", [:mix], [{:earmark_parser, "~> 1.4.31", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "2c6699a737ae46cb61e4ed012af931b57b699643b24dabe2400a8168414bc4f5"},
"expo": {:hex, :expo, "0.4.1", "1c61d18a5df197dfda38861673d392e642649a9cef7694d2f97a587b2cfb319b", [:mix], [], "hexpm", "2ff7ba7a798c8c543c12550fa0e2cbc81b95d4974c65855d8d15ba7b37a1ce47"},
"file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"},
"floki": {:hex, :floki, "0.34.2", "5fad07ef153b3b8ec110b6b155ec3780c4b2c4906297d0b4be1a7162d04a7e02", [:mix], [], "hexpm", "26b9d50f0f01796bc6be611ca815c5e0de034d2128e39cc9702eee6b66a4d1c8"},
"gen_smtp": {:hex, :gen_smtp, "1.2.0", "9cfc75c72a8821588b9b9fe947ae5ab2aed95a052b81237e0928633a13276fd3", [:rebar3], [{:ranch, ">= 1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "5ee0375680bca8f20c4d85f58c2894441443a743355430ff33a783fe03296779"},
"gettext": {:hex, :gettext, "0.22.1", "e7942988383c3d9eed4bdc22fc63e712b655ae94a672a27e4900e3d4a2c43581", [:mix], [{:expo, "~> 0.4.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "ad105b8dab668ee3f90c0d3d94ba75e9aead27a62495c101d94f2657a190ac5d"},
"jason": {:hex, :jason, "1.4.0", "e855647bc964a44e2f67df589ccf49105ae039d4179db7f6271dfd3843dc27e6", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "79a3791085b2a0f743ca04cec0f7be26443738779d09302e01318f97bdb82121"},
"makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"},
"makeup_elixir": {:hex, :makeup_elixir, "0.16.0", "f8c570a0d33f8039513fbccaf7108c5d750f47d8defd44088371191b76492b0b", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "28b2cbdc13960a46ae9a8858c4bebdec3c9a6d7b4b9e7f4ed1502f8159f338e7"},
"makeup_elixir": {:hex, :makeup_elixir, "0.16.1", "cc9e3ca312f1cfeccc572b37a09980287e243648108384b97ff2b76e505c3555", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "e127a341ad1b209bd80f7bd1620a15693a9908ed780c3b763bccf7d200c767c6"},
"makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"},
"mime": {:hex, :mime, "2.0.3", "3676436d3d1f7b81b5a2d2bd8405f412c677558c81b1c92be58c00562bb59095", [:mix], [], "hexpm", "27a30bf0db44d25eecba73755acf4068cbfe26a4372f9eb3e4ea3a45956bff6b"},
"nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"},
"oban": {:hex, :oban, "2.14.2", "ae925d9a33e110addaa59ff7ec1b2fd84270ac7eb00fbb4b4a179d74c407bba3", [: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", "32bf30127c8c44ac42f05f229a50fadc2177b3e799c29499f5daf90d5e5b5d3c"},
"phoenix": {:hex, :phoenix, "1.6.16", "e5bdd18c7a06da5852a25c7befb72246de4ddc289182285f8685a40b7b5f5451", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 1.0 or ~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e15989ff34f670a96b95ef6d1d25bad0d9c50df5df40b671d8f4a669e050ac39"},
"nimble_parsec": {:hex, :nimble_parsec, "1.3.0", "9e18a119d9efc3370a3ef2a937bf0b24c088d9c4bf0ba9d7c3751d49d347d035", [:mix], [], "hexpm", "7977f183127a7cbe9346981e2f480dc04c55ffddaef746bd58debd566070eef8"},
"oban": {:hex, :oban, "2.15.0", "27b9c2845cdff30c98c8060b11a64318e79bbc1bd32b8dc95fa59a1580a8d90c", [:mix], [{:ecto_sql, "~> 3.6", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:ecto_sqlite3, "~> 0.9", [hex: :ecto_sqlite3, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16", [hex: :postgrex, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "22e181c540335d1dd5c995be00435927075519207d62b3de32477d95dbf9dfd3"},
"phoenix": {:hex, :phoenix, "1.7.2", "c375ffb482beb4e3d20894f84dd7920442884f5f5b70b9f4528cbe0cedefec63", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.4", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "1ebca94b32b4d0e097ab2444a9742ed8ff3361acad17365e4e6b2e79b4792159"},
"phoenix_ecto": {:hex, :phoenix_ecto, "4.4.0", "0672ed4e4808b3fbed494dded89958e22fb882de47a97634c0b13e7b0b5f7720", [:mix], [{:ecto, "~> 3.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "09864e558ed31ee00bd48fcc1d4fc58ae9678c9e81649075431e69dbabb43cc1"},
"phoenix_html": {:hex, :phoenix_html, "3.3.1", "4788757e804a30baac6b3fc9695bf5562465dd3f1da8eb8460ad5b404d9a2178", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "bed1906edd4906a15fd7b412b85b05e521e1f67c9a85418c55999277e553d0d3"},
"phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.7.2", "97cc4ff2dba1ebe504db72cb45098cb8e91f11160528b980bd282cc45c73b29c", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.18.3", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "0e5fdf063c7a3b620c566a30fcf68b7ee02e5e46fe48ee46a6ec3ba382dc05b7"},
"phoenix_live_reload": {:hex, :phoenix_live_reload, "1.4.1", "2aff698f5e47369decde4357ba91fc9c37c6487a512b41732818f2204a8ef1d3", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "9bffb834e7ddf08467fe54ae58b5785507aaba6255568ae22b4d46e2bb3615ab"},
"phoenix_live_view": {:hex, :phoenix_live_view, "0.18.18", "1f38fbd7c363723f19aad1a04b5490ff3a178e37daaf6999594d5f34796c47fc", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a5810d0472f3189ede6d2a95bda7f31c6113156b91784a3426cb0ab6a6d85214"},
"phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.1", "ba04e489ef03763bf28a17eb2eaddc2c20c6d217e2150a61e3298b0f4c2012b5", [:mix], [], "hexpm", "81367c6d1eea5878ad726be80808eb5a787a23dee699f96e72b1109c57cdd8d9"},
"phoenix_swoosh": {:hex, :phoenix_swoosh, "1.2.0", "a544d83fde4a767efb78f45404a74c9e37b2a9c5ea3339692e65a6966731f935", [:mix], [{:finch, "~> 0.8", [hex: :finch, repo: "hexpm", optional: true]}, {:hackney, "~> 1.10", [hex: :hackney, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6", [hex: :phoenix, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_view, "~> 1.0 or ~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:swoosh, "~> 1.5", [hex: :swoosh, repo: "hexpm", optional: false]}], "hexpm", "e88d117251e89a16b92222415a6d87b99a96747ddf674fc5c7631de734811dba"},
"phoenix_template": {:hex, :phoenix_template, "1.0.1", "85f79e3ad1b0180abb43f9725973e3b8c2c3354a87245f91431eec60553ed3ef", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "157dc078f6226334c91cb32c1865bf3911686f8bcd6bcff86736f6253e6993ee"},
"phoenix_view": {:hex, :phoenix_view, "2.0.2", "6bd4d2fd595ef80d33b439ede6a19326b78f0f1d8d62b9a318e3d9c1af351098", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}], "hexpm", "a929e7230ea5c7ee0e149ffcf44ce7cf7f4b6d2bfe1752dd7c084cdff152d36f"},
"plug": {:hex, :plug, "1.14.0", "ba4f558468f69cbd9f6b356d25443d0b796fbdc887e03fa89001384a9cac638f", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "bf020432c7d4feb7b3af16a0c2701455cbbbb95e5b6866132cb09eb0c29adc14"},
"plug": {:hex, :plug, "1.14.2", "cff7d4ec45b4ae176a227acd94a7ab536d9b37b942c8e8fa6dfc0fff98ff4d80", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "842fc50187e13cf4ac3b253d47d9474ed6c296a8732752835ce4a86acdf68d13"},
"plug_cowboy": {:hex, :plug_cowboy, "2.6.1", "9a3bbfceeb65eff5f39dab529e5cd79137ac36e913c02067dba3963a26efe9b2", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "de36e1a21f451a18b790f37765db198075c25875c64834bcc82d90b309eb6613"},
"plug_crypto": {:hex, :plug_crypto, "1.2.5", "918772575e48e81e455818229bf719d4ab4181fcbf7f85b68a35620f78d89ced", [:mix], [], "hexpm", "26549a1d6345e2172eb1c233866756ae44a9609bd33ee6f99147ab3fd87fd842"},
"postgrex": {:hex, :postgrex, "0.16.5", "fcc4035cc90e23933c5d69a9cd686e329469446ef7abba2cf70f08e2c4b69810", [:mix], [{:connection, "~> 1.1", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "edead639dc6e882618c01d8fc891214c481ab9a3788dfe38dd5e37fd1d5fb2e8"},
@ -51,4 +49,6 @@
"telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"},
"telemetry_metrics": {:hex, :telemetry_metrics, "0.6.1", "315d9163a1d4660aedc3fee73f33f1d355dcc76c5c3ab3d59e76e3edf80eef1f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7be9e0871c41732c233be71e4be11b96e56177bf15dde64a8ac9ce72ac9834c6"},
"telemetry_poller": {:hex, :telemetry_poller, "1.0.0", "db91bb424e07f2bb6e73926fcafbfcbcb295f0193e0a00e825e589a0a47e8453", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b3a24eafd66c3f42da30fc3ca7dda1e9d546c12250a2d60d7b81d264fbec4f6e"},
"websock": {:hex, :websock, "0.5.0", "f6bbce90226121d62a0715bca7c986c5e43de0ccc9475d79c55381d1796368cc", [:mix], [], "hexpm", "b51ac706df8a7a48a2c622ee02d09d68be8c40418698ffa909d73ae207eb5fb8"},
"websock_adapter": {:hex, :websock_adapter, "0.5.0", "cea35d8bbf1a6964e32d4b02ceb561dfb769c04f16d60d743885587e7d2ca55b", [:mix], [{:bandit, "~> 0.6", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "16318b124effab8209b1eb7906c636374f623dc9511a8278ad09c083cea5bb83"},
}

View File

@ -32,14 +32,14 @@ msgstr ""
msgid "Add your first type!"
msgstr ""
#: lib/cannery_web/templates/user_settings/edit.html.heex:15
#: lib/cannery_web/templates/user_settings/edit.html.heex:43
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:15
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:43
#, elixir-autogen, elixir-format
msgid "Change email"
msgstr ""
#: lib/cannery_web/templates/user_settings/edit.html.heex:57
#: lib/cannery_web/templates/user_settings/edit.html.heex:97
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:57
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:97
#, elixir-autogen, elixir-format
msgid "Change password"
msgstr ""
@ -49,14 +49,14 @@ msgstr ""
msgid "Create Invite"
msgstr ""
#: lib/cannery_web/templates/user_settings/edit.html.heex:159
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:155
#, elixir-autogen, elixir-format
msgid "Delete User"
msgstr ""
#: lib/cannery_web/templates/user_registration/new.html.heex:47
#: lib/cannery_web/templates/user_reset_password/new.html.heex:3
#: lib/cannery_web/templates/user_session/new.html.heex:42
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:47
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:3
#: lib/cannery_web/controllers/user_session_html/new.html.heex:38
#, elixir-autogen, elixir-format
msgid "Forgot your password?"
msgstr ""
@ -66,13 +66,13 @@ msgstr ""
msgid "Invite someone new!"
msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:124
#: lib/cannery_web/templates/user_confirmation/new.html.heex:32
#: lib/cannery_web/templates/user_registration/new.html.heex:44
#: lib/cannery_web/templates/user_reset_password/edit.html.heex:45
#: lib/cannery_web/templates/user_reset_password/new.html.heex:32
#: lib/cannery_web/templates/user_session/new.html.heex:3
#: lib/cannery_web/templates/user_session/new.html.heex:28
#: lib/cannery_web/components/core_components/topbar.html.heex:94
#: lib/cannery_web/controllers/user_confirmation_html/new.html.heex:28
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:44
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:41
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:28
#: lib/cannery_web/controllers/user_session_html/new.html.heex:3
#: lib/cannery_web/controllers/user_session_html/new.html.heex:28
#, elixir-autogen, elixir-format
msgid "Log in"
msgstr ""
@ -92,25 +92,25 @@ msgstr ""
msgid "New Tag"
msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:116
#: lib/cannery_web/templates/user_confirmation/new.html.heex:29
#: lib/cannery_web/templates/user_registration/new.html.heex:3
#: lib/cannery_web/templates/user_registration/new.html.heex:37
#: lib/cannery_web/templates/user_reset_password/edit.html.heex:42
#: lib/cannery_web/templates/user_reset_password/new.html.heex:29
#: lib/cannery_web/templates/user_session/new.html.heex:39
#: lib/cannery_web/components/core_components/topbar.html.heex:89
#: lib/cannery_web/controllers/user_confirmation_html/new.html.heex:25
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:3
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:37
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:38
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:25
#: lib/cannery_web/controllers/user_session_html/new.html.heex:35
#, elixir-autogen, elixir-format
msgid "Register"
msgstr ""
#: lib/cannery_web/templates/user_confirmation/new.html.heex:3
#: lib/cannery_web/templates/user_confirmation/new.html.heex:16
#: lib/cannery_web/controllers/user_confirmation_html/new.html.heex:3
#: lib/cannery_web/controllers/user_confirmation_html/new.html.heex:16
#, elixir-autogen, elixir-format
msgid "Resend confirmation instructions"
msgstr ""
#: lib/cannery_web/templates/user_reset_password/edit.html.heex:3
#: lib/cannery_web/templates/user_reset_password/edit.html.heex:29
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:3
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:29
#, elixir-autogen, elixir-format
msgid "Reset password"
msgstr ""
@ -126,12 +126,12 @@ msgstr ""
msgid "Save"
msgstr ""
#: lib/cannery_web/templates/user_reset_password/new.html.heex:16
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:16
#, elixir-autogen, elixir-format
msgid "Send instructions to reset password"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:68
#: lib/cannery_web/live/container_live/show.html.heex:65
#, elixir-autogen, elixir-format
msgid "Why not add one?"
msgstr ""
@ -152,18 +152,18 @@ msgid "Why not get some ready to shoot?"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:127
#: lib/cannery_web/live/pack_live/show.html.heex:96
#: lib/cannery_web/live/range_live/index.html.heex:45
#: lib/cannery_web/live/pack_live/show.html.heex:90
#: lib/cannery_web/live/range_live/index.html.heex:42
#, elixir-autogen, elixir-format
msgid "Record shots"
msgstr ""
#: lib/cannery_web/components/move_pack_component.ex:88
#: lib/cannery_web/components/move_pack_component.ex:87
#, elixir-autogen, elixir-format
msgid "Add another container!"
msgstr ""
#: lib/cannery_web/components/move_pack_component.ex:124
#: lib/cannery_web/components/move_pack_component.ex:123
#, elixir-autogen, elixir-format
msgid "Select"
msgstr ""
@ -183,24 +183,24 @@ msgstr ""
msgid "Create"
msgstr ""
#: lib/cannery_web/templates/user_settings/edit.html.heex:110
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:110
#, elixir-autogen, elixir-format
msgid "Change Language"
msgstr ""
#: lib/cannery_web/templates/user_settings/edit.html.heex:136
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:136
#, elixir-autogen, elixir-format
msgid "Change language"
msgstr ""
#: lib/cannery_web/live/pack_live/show.html.heex:55
#: lib/cannery_web/live/pack_live/show.html.heex:52
#, elixir-autogen, elixir-format
msgid "View in Catalog"
msgstr ""
#: lib/cannery_web/components/move_pack_component.ex:78
#: lib/cannery_web/live/pack_live/index.html.heex:144
#: lib/cannery_web/live/pack_live/show.html.heex:89
#: lib/cannery_web/components/move_pack_component.ex:77
#: lib/cannery_web/live/pack_live/index.html.heex:138
#: lib/cannery_web/live/pack_live/show.html.heex:86
#, elixir-autogen, elixir-format
msgid "Move ammo"
msgstr ""
@ -210,19 +210,19 @@ msgstr ""
msgid "Set Unlimited"
msgstr ""
#: lib/cannery_web/live/pack_live/show.html.heex:85
#: lib/cannery_web/live/pack_live/show.html.heex:82
#: lib/cannery_web/live/range_live/index.html.heex:38
#, elixir-autogen, elixir-format
msgid "Stage for range"
msgstr ""
#: lib/cannery_web/live/pack_live/show.html.heex:84
#: lib/cannery_web/live/pack_live/show.html.heex:81
#: lib/cannery_web/live/range_live/index.html.heex:37
#, elixir-autogen, elixir-format
msgid "Unstage from range"
msgstr ""
#: lib/cannery_web/templates/user_settings/edit.html.heex:150
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:146
#, elixir-autogen, elixir-format
msgid "Export Data as JSON"
msgstr ""
@ -288,37 +288,37 @@ msgstr ""
msgid "Unstage"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:174
#: lib/cannery_web/live/pack_live/index.html.heex:168
#, elixir-autogen, elixir-format
msgid "Clone pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:189
#: lib/cannery_web/live/pack_live/show.html.heex:74
#: lib/cannery_web/live/pack_live/index.html.heex:183
#: lib/cannery_web/live/pack_live/show.html.heex:71
#, elixir-autogen, elixir-format
msgid "Delete pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:164
#: lib/cannery_web/live/pack_live/show.html.heex:62
#: lib/cannery_web/live/pack_live/index.html.heex:158
#: lib/cannery_web/live/pack_live/show.html.heex:59
#, elixir-autogen, elixir-format
msgid "Edit pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:154
#: lib/cannery_web/live/type_live/show.html.heex:204
#: lib/cannery_web/live/pack_live/index.html.heex:148
#: lib/cannery_web/live/type_live/show.html.heex:201
#, elixir-autogen, elixir-format
msgid "View pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:160
#: lib/cannery_web/live/range_live/index.html.heex:155
#: lib/cannery_web/live/pack_live/show.ex:159
#: lib/cannery_web/live/range_live/index.html.heex:152
#, elixir-autogen, elixir-format
msgid "Delete shot record of %{shot_record_count} shots"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:145
#: lib/cannery_web/live/range_live/index.html.heex:138
#: lib/cannery_web/live/pack_live/show.ex:144
#: lib/cannery_web/live/range_live/index.html.heex:135
#, elixir-autogen, elixir-format
msgid "Edit shot record of %{shot_record_count} shots"
msgstr ""

View File

@ -45,14 +45,14 @@ msgstr "Fügen Sie ihren ersten Behälter hinzu!"
msgid "Add your first type!"
msgstr "Fügen Sie ihre erste Munitionsart hinzu!"
#: lib/cannery_web/templates/user_settings/edit.html.heex:15
#: lib/cannery_web/templates/user_settings/edit.html.heex:43
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:15
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:43
#, elixir-autogen, elixir-format
msgid "Change email"
msgstr "Mailadresse ändern"
#: lib/cannery_web/templates/user_settings/edit.html.heex:57
#: lib/cannery_web/templates/user_settings/edit.html.heex:97
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:57
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:97
#, elixir-autogen, elixir-format
msgid "Change password"
msgstr "Passwort ändern"
@ -62,14 +62,14 @@ msgstr "Passwort ändern"
msgid "Create Invite"
msgstr "Einladung erstellen"
#: lib/cannery_web/templates/user_settings/edit.html.heex:159
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:155
#, elixir-autogen, elixir-format
msgid "Delete User"
msgstr "Benutzer löschen"
#: lib/cannery_web/templates/user_registration/new.html.heex:47
#: lib/cannery_web/templates/user_reset_password/new.html.heex:3
#: lib/cannery_web/templates/user_session/new.html.heex:42
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:47
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:3
#: lib/cannery_web/controllers/user_session_html/new.html.heex:38
#, elixir-autogen, elixir-format
msgid "Forgot your password?"
msgstr "Passwort vergessen?"
@ -79,13 +79,13 @@ msgstr "Passwort vergessen?"
msgid "Invite someone new!"
msgstr "Laden Sie jemanden ein!"
#: lib/cannery_web/components/core_components/topbar.html.heex:124
#: lib/cannery_web/templates/user_confirmation/new.html.heex:32
#: lib/cannery_web/templates/user_registration/new.html.heex:44
#: lib/cannery_web/templates/user_reset_password/edit.html.heex:45
#: lib/cannery_web/templates/user_reset_password/new.html.heex:32
#: lib/cannery_web/templates/user_session/new.html.heex:3
#: lib/cannery_web/templates/user_session/new.html.heex:28
#: lib/cannery_web/components/core_components/topbar.html.heex:94
#: lib/cannery_web/controllers/user_confirmation_html/new.html.heex:28
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:44
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:41
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:28
#: lib/cannery_web/controllers/user_session_html/new.html.heex:3
#: lib/cannery_web/controllers/user_session_html/new.html.heex:28
#, elixir-autogen, elixir-format
msgid "Log in"
msgstr "Einloggen"
@ -105,25 +105,25 @@ msgstr "Neuer Behälter"
msgid "New Tag"
msgstr "Neuer Tag"
#: lib/cannery_web/components/core_components/topbar.html.heex:116
#: lib/cannery_web/templates/user_confirmation/new.html.heex:29
#: lib/cannery_web/templates/user_registration/new.html.heex:3
#: lib/cannery_web/templates/user_registration/new.html.heex:37
#: lib/cannery_web/templates/user_reset_password/edit.html.heex:42
#: lib/cannery_web/templates/user_reset_password/new.html.heex:29
#: lib/cannery_web/templates/user_session/new.html.heex:39
#: lib/cannery_web/components/core_components/topbar.html.heex:89
#: lib/cannery_web/controllers/user_confirmation_html/new.html.heex:25
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:3
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:37
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:38
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:25
#: lib/cannery_web/controllers/user_session_html/new.html.heex:35
#, elixir-autogen, elixir-format
msgid "Register"
msgstr "Registrieren"
#: lib/cannery_web/templates/user_confirmation/new.html.heex:3
#: lib/cannery_web/templates/user_confirmation/new.html.heex:16
#: lib/cannery_web/controllers/user_confirmation_html/new.html.heex:3
#: lib/cannery_web/controllers/user_confirmation_html/new.html.heex:16
#, elixir-autogen, elixir-format
msgid "Resend confirmation instructions"
msgstr "Bestätigungsmail erneut senden"
#: lib/cannery_web/templates/user_reset_password/edit.html.heex:3
#: lib/cannery_web/templates/user_reset_password/edit.html.heex:29
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:3
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:29
#, elixir-autogen, elixir-format
msgid "Reset password"
msgstr "Passwort zurücksetzen"
@ -139,12 +139,12 @@ msgstr "Passwort zurücksetzen"
msgid "Save"
msgstr "Speichern"
#: lib/cannery_web/templates/user_reset_password/new.html.heex:16
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:16
#, elixir-autogen, elixir-format
msgid "Send instructions to reset password"
msgstr "Anleitung zum Passwort zurücksetzen zusenden"
#: lib/cannery_web/live/container_live/show.html.heex:68
#: lib/cannery_web/live/container_live/show.html.heex:65
#, elixir-autogen, elixir-format
msgid "Why not add one?"
msgstr "Warum fügen Sie keine hinzu?"
@ -165,18 +165,18 @@ msgid "Why not get some ready to shoot?"
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/show.html.heex:96
#: lib/cannery_web/live/range_live/index.html.heex:45
#: lib/cannery_web/live/pack_live/show.html.heex:90
#: lib/cannery_web/live/range_live/index.html.heex:42
#, elixir-autogen, elixir-format
msgid "Record shots"
msgstr "Schüsse dokumentieren"
#: lib/cannery_web/components/move_pack_component.ex:88
#: lib/cannery_web/components/move_pack_component.ex:87
#, elixir-autogen, elixir-format
msgid "Add another container!"
msgstr "Einen weiteren Behälter hinzufügen!"
#: lib/cannery_web/components/move_pack_component.ex:124
#: lib/cannery_web/components/move_pack_component.ex:123
#, elixir-autogen, elixir-format
msgid "Select"
msgstr "Markieren"
@ -196,24 +196,24 @@ msgstr "Zuerst einen Behälter hinzufügen"
msgid "Create"
msgstr "Erstellen"
#: lib/cannery_web/templates/user_settings/edit.html.heex:110
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:110
#, elixir-autogen, elixir-format
msgid "Change Language"
msgstr "Sprache wechseln"
#: lib/cannery_web/templates/user_settings/edit.html.heex:136
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:136
#, elixir-autogen, elixir-format
msgid "Change language"
msgstr "Sprache wechseln"
#: lib/cannery_web/live/pack_live/show.html.heex:55
#: lib/cannery_web/live/pack_live/show.html.heex:52
#, elixir-autogen, elixir-format
msgid "View in Catalog"
msgstr ""
#: lib/cannery_web/components/move_pack_component.ex:78
#: lib/cannery_web/live/pack_live/index.html.heex:144
#: lib/cannery_web/live/pack_live/show.html.heex:89
#: lib/cannery_web/components/move_pack_component.ex:77
#: lib/cannery_web/live/pack_live/index.html.heex:138
#: lib/cannery_web/live/pack_live/show.html.heex:86
#, elixir-autogen, elixir-format
msgid "Move ammo"
msgstr ""
@ -223,19 +223,19 @@ msgstr ""
msgid "Set Unlimited"
msgstr ""
#: lib/cannery_web/live/pack_live/show.html.heex:85
#: lib/cannery_web/live/pack_live/show.html.heex:82
#: lib/cannery_web/live/range_live/index.html.heex:38
#, elixir-autogen, elixir-format
msgid "Stage for range"
msgstr ""
#: lib/cannery_web/live/pack_live/show.html.heex:84
#: lib/cannery_web/live/pack_live/show.html.heex:81
#: lib/cannery_web/live/range_live/index.html.heex:37
#, elixir-autogen, elixir-format
msgid "Unstage from range"
msgstr ""
#: lib/cannery_web/templates/user_settings/edit.html.heex:150
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:146
#, elixir-autogen, elixir-format
msgid "Export Data as JSON"
msgstr ""
@ -301,37 +301,37 @@ msgstr ""
msgid "Unstage"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:174
#: lib/cannery_web/live/pack_live/index.html.heex:168
#, elixir-autogen, elixir-format, fuzzy
msgid "Clone pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:189
#: lib/cannery_web/live/pack_live/show.html.heex:74
#: lib/cannery_web/live/pack_live/index.html.heex:183
#: lib/cannery_web/live/pack_live/show.html.heex:71
#, elixir-autogen, elixir-format, fuzzy
msgid "Delete pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:164
#: lib/cannery_web/live/pack_live/show.html.heex:62
#: lib/cannery_web/live/pack_live/index.html.heex:158
#: lib/cannery_web/live/pack_live/show.html.heex:59
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/index.html.heex:154
#: lib/cannery_web/live/type_live/show.html.heex:204
#: lib/cannery_web/live/pack_live/index.html.heex:148
#: lib/cannery_web/live/type_live/show.html.heex:201
#, elixir-autogen, elixir-format, fuzzy
msgid "View pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:160
#: lib/cannery_web/live/range_live/index.html.heex:155
#: lib/cannery_web/live/pack_live/show.ex:159
#: lib/cannery_web/live/range_live/index.html.heex:152
#, elixir-autogen, elixir-format, fuzzy
msgid "Delete shot record of %{shot_record_count} shots"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:145
#: lib/cannery_web/live/range_live/index.html.heex:138
#: lib/cannery_web/live/pack_live/show.ex:144
#: lib/cannery_web/live/range_live/index.html.heex:135
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit shot record of %{shot_record_count} shots"
msgstr ""

View File

@ -29,7 +29,7 @@ msgstr "Admins"
msgid "Admins:"
msgstr "Admins:"
#: lib/cannery_web/components/core_components/topbar.html.heex:58
#: lib/cannery_web/components/core_components/topbar.html.heex:43
#: lib/cannery_web/components/shot_record_table_component.ex:44
#: lib/cannery_web/live/pack_live/index.ex:75
#: lib/cannery_web/live/pack_live/index.ex:84
@ -84,14 +84,14 @@ msgstr "Patrone"
msgid "Case material"
msgstr "Gehäusematerial"
#: lib/cannery_web/components/move_pack_component.ex:65
#: lib/cannery_web/components/move_pack_component.ex:64
#: lib/cannery_web/components/pack_table_component.ex:76
#: lib/cannery_web/live/pack_live/form_component.html.heex:66
#, elixir-autogen, elixir-format
msgid "Container"
msgstr "Behälter"
#: lib/cannery_web/components/core_components/topbar.html.heex:42
#: lib/cannery_web/components/core_components/topbar.html.heex:33
#: lib/cannery_web/live/container_live/index.ex:45
#: lib/cannery_web/live/container_live/index.ex:54
#: lib/cannery_web/live/container_live/index.html.heex:3
@ -177,20 +177,20 @@ msgstr "Einladung deaktiviert"
msgid "Invite Only"
msgstr "Nur mit Einladung"
#: lib/cannery_web/components/core_components/topbar.html.heex:74
#: lib/cannery_web/components/core_components/topbar.html.heex:53
#: lib/cannery_web/live/invite_live/index.ex:31
#: lib/cannery_web/live/invite_live/index.html.heex:3
#, elixir-autogen, elixir-format
msgid "Invites"
msgstr "Einladungen"
#: lib/cannery_web/templates/user_session/new.html.heex:23
#: lib/cannery_web/controllers/user_session_html/new.html.heex:23
#, elixir-autogen, elixir-format
msgid "Keep me logged in for 60 days"
msgstr "Für 60 Tage eingeloggt bleiben"
#: lib/cannery_web/components/container_table_component.ex:47
#: lib/cannery_web/components/move_pack_component.ex:67
#: lib/cannery_web/components/move_pack_component.ex:66
#: lib/cannery_web/live/container_live/form_component.html.heex:47
#, elixir-autogen, elixir-format
msgid "Location"
@ -281,7 +281,7 @@ msgstr "Keine Tags"
#: lib/cannery_web/components/add_shot_record_component.html.heex:38
#: 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/show.ex:91
#: lib/cannery_web/live/pack_live/show.ex:90
#: lib/cannery_web/live/range_live/form_component.html.heex:30
#, elixir-autogen, elixir-format
msgid "Notes"
@ -339,7 +339,7 @@ msgstr ""
"vertrauen."
#: lib/cannery_web/controllers/user_settings_controller.ex:10
#: lib/cannery_web/templates/user_settings/edit.html.heex:3
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:3
#, elixir-autogen, elixir-format
msgid "Settings"
msgstr "Einstellungen"
@ -354,13 +354,13 @@ msgstr "Einfach:"
msgid "Steel"
msgstr "Stahl"
#: lib/cannery_web/live/pack_live/show.html.heex:106
#: lib/cannery_web/live/pack_live/show.html.heex:100
#, elixir-autogen, elixir-format
msgid "Stored in"
msgstr "Gelagert in"
#: lib/cannery_web/components/container_table_component.ex:66
#: lib/cannery_web/components/core_components/topbar.html.heex:34
#: 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:53
#: lib/cannery_web/live/tag_live/index.html.heex:3
@ -390,7 +390,7 @@ msgid "Tracer"
msgstr "Leuchtspur"
#: lib/cannery_web/components/container_table_component.ex:48
#: lib/cannery_web/components/move_pack_component.ex:66
#: lib/cannery_web/components/move_pack_component.ex:65
#: lib/cannery_web/components/pack_table_component.ex:108
#: lib/cannery_web/live/container_live/form_component.html.heex:39
#: lib/cannery_web/live/pack_live/form_component.html.heex:22
@ -424,7 +424,7 @@ msgstr "Ihre Daten bleiben bei Ihnen, Punkt"
msgid "No tags for this container"
msgstr "Keine Tags für diesen Behälter"
#: lib/cannery_web/components/core_components/topbar.html.heex:66
#: lib/cannery_web/components/core_components/topbar.html.heex:48
#: lib/cannery_web/components/pack_table_component.ex:80
#, elixir-autogen, elixir-format
msgid "Range"
@ -437,7 +437,7 @@ msgstr "Range Day"
#: lib/cannery_web/components/add_shot_record_component.html.heex:49
#: lib/cannery_web/components/shot_record_table_component.ex:47
#: lib/cannery_web/live/pack_live/show.ex:92
#: lib/cannery_web/live/pack_live/show.ex:91
#: lib/cannery_web/live/range_live/form_component.html.heex:41
#, elixir-autogen, elixir-format
msgid "Date"
@ -459,26 +459,26 @@ msgstr "Keine Munition selektiert"
msgid "Record shots"
msgstr "Schüsse dokumentieren"
#: lib/cannery_web/live/range_live/index.ex:48
#: lib/cannery_web/live/range_live/index.ex:47
#, elixir-autogen, elixir-format
msgid "New Shot Records"
msgstr "Neue Schießkladde"
#: lib/cannery_web/live/range_live/index.html.heex:55
#: lib/cannery_web/live/range_live/index.html.heex:122
#: lib/cannery_web/live/range_live/index.html.heex:52
#: lib/cannery_web/live/range_live/index.html.heex:119
#, elixir-autogen, elixir-format
msgid "No shots recorded"
msgstr "Keine Schüsse dokumentiert"
#: lib/cannery_web/components/shot_record_table_component.ex:45
#: lib/cannery_web/live/pack_live/show.ex:90
#: lib/cannery_web/live/range_live/index.html.heex:69
#: lib/cannery_web/live/pack_live/show.ex:89
#: lib/cannery_web/live/range_live/index.html.heex:66
#, elixir-autogen, elixir-format
msgid "Rounds shot"
msgstr "Patronen abgefeuert"
#: lib/cannery_web/live/range_live/index.ex:56
#: lib/cannery_web/live/range_live/index.ex:66
#: lib/cannery_web/live/range_live/index.ex:55
#: lib/cannery_web/live/range_live/index.ex:65
#, elixir-autogen, elixir-format
msgid "Shot Records"
msgstr "Schießkladde"
@ -488,12 +488,12 @@ msgstr "Schießkladde"
msgid "Move ammo"
msgstr "Munition verschieben"
#: lib/cannery_web/components/move_pack_component.ex:83
#: lib/cannery_web/components/move_pack_component.ex:82
#, elixir-autogen, elixir-format
msgid "No other containers"
msgstr "Kein weiterer Behälter"
#: lib/cannery_web/live/range_live/index.html.heex:60
#: lib/cannery_web/live/range_live/index.html.heex:57
#, elixir-autogen, elixir-format
msgid "Shot log"
msgstr "Schießkladde"
@ -544,20 +544,20 @@ msgstr "Pulverart"
msgid "UPC"
msgstr "UPC"
#: lib/cannery_web/templates/user_reset_password/edit.html.heex:20
#: lib/cannery_web/templates/user_settings/edit.html.heex:76
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:20
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:76
#, elixir-autogen, elixir-format
msgid "Confirm new password"
msgstr "Passwort bestätigen"
#: lib/cannery_web/templates/user_settings/edit.html.heex:31
#: lib/cannery_web/templates/user_settings/edit.html.heex:85
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:31
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:85
#, elixir-autogen, elixir-format
msgid "Current password"
msgstr "Derzeitiges Passwort"
#: lib/cannery_web/templates/user_reset_password/edit.html.heex:16
#: lib/cannery_web/templates/user_settings/edit.html.heex:69
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:16
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:69
#, elixir-autogen, elixir-format
msgid "New password"
msgstr "Neues Passwort"
@ -568,19 +568,19 @@ msgstr "Neues Passwort"
msgid "Firing type"
msgstr "Patronenhülsenform"
#: lib/cannery_web/templates/layout/live.html.heex:43
#: lib/cannery_web/components/layouts/live.html.heex:43
#, elixir-autogen, elixir-format
msgid "Reconnecting..."
msgstr "Neu verbinden..."
#: lib/cannery_web/live/container_live/index.ex:28
#: lib/cannery_web/live/container_live/show.ex:120
#: lib/cannery_web/live/container_live/show.ex:116
#, elixir-autogen, elixir-format
msgid "Edit %{name}"
msgstr "%{name} bearbeiten"
#: lib/cannery_web/live/container_live/index.ex:63
#: lib/cannery_web/live/container_live/show.ex:121
#: lib/cannery_web/live/container_live/show.ex:117
#, elixir-autogen, elixir-format
msgid "Edit %{name} tags"
msgstr "Editiere %{name} Tags"
@ -625,7 +625,7 @@ msgstr "Ursprüngliche Anzahl:"
msgid "Percentage left:"
msgstr "Prozent verbleibend:"
#: lib/cannery_web/live/pack_live/show.html.heex:119
#: lib/cannery_web/live/pack_live/show.html.heex:113
#, elixir-autogen, elixir-format
msgid "Rounds used"
msgstr "Patronen verbraucht"
@ -645,18 +645,18 @@ msgstr "Passwort vergessen?"
msgid "Log in"
msgstr "Einloggen"
#: lib/cannery_web/controllers/user_registration_controller.ex:33
#: lib/cannery_web/controllers/user_registration_controller.ex:32
#, elixir-autogen, elixir-format
msgid "Register"
msgstr "Registrieren"
#: lib/cannery_web/controllers/user_reset_password_controller.ex:36
#: lib/cannery_web/controllers/user_reset_password_controller.ex:35
#, elixir-autogen, elixir-format
msgid "Reset your password"
msgstr "Passwort zurücksetzen"
#: lib/cannery_web/live/pack_live/show.ex:41
#: lib/cannery_web/live/range_live/index.ex:32
#: lib/cannery_web/live/pack_live/show.ex:40
#: lib/cannery_web/live/range_live/index.ex:31
#, elixir-autogen, elixir-format
msgid "Record Shots"
msgstr "Schüsse dokumentieren"
@ -671,23 +671,23 @@ msgstr "Kopien"
msgid "Added on:"
msgstr "Hinzugefügt am:"
#: lib/cannery_web/templates/user_registration/new.html.heex:32
#: lib/cannery_web/templates/user_settings/edit.html.heex:127
#: 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/templates/user_settings/edit.html.heex:129
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:129
#, elixir-autogen, elixir-format
msgid "French"
msgstr "Französisch"
#: lib/cannery_web/templates/user_settings/edit.html.heex:128
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:128
#, elixir-autogen, elixir-format
msgid "German"
msgstr "Deutsch"
#: lib/cannery_web/templates/user_registration/new.html.heex:28
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:28
#, elixir-autogen, elixir-format
msgid "Language"
msgstr "Sprache"
@ -712,7 +712,7 @@ msgstr "Sende Bugs oder Erweiterungsvorschläge"
msgid "View the source code"
msgstr "Quellcode ansehen"
#: lib/cannery_web/components/core_components/topbar.html.heex:50
#: lib/cannery_web/components/core_components/topbar.html.heex:38
#: lib/cannery_web/live/type_live/index.ex:52
#: lib/cannery_web/live/type_live/index.ex:62
#: lib/cannery_web/live/type_live/index.html.heex:3
@ -720,27 +720,27 @@ msgstr "Quellcode ansehen"
msgid "Catalog"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:45
#: lib/cannery_web/live/pack_live/show.ex:44
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit Ammo"
msgstr "Munitionstyp bearbeiten"
#: lib/cannery_web/live/pack_live/show.ex:43
#: lib/cannery_web/live/pack_live/show.ex:42
#, elixir-autogen, elixir-format, fuzzy
msgid "Move Ammo"
msgstr "Munition verschieben"
#: lib/cannery_web/live/container_live/show.html.heex:123
#: lib/cannery_web/live/container_live/show.html.heex:117
#, elixir-autogen, elixir-format, fuzzy
msgid "No ammo in this container"
msgstr "Keine Munitionsgruppe in diesem Behälter"
#: lib/cannery_web/live/pack_live/show.ex:44
#: lib/cannery_web/live/pack_live/show.ex:43
#, elixir-autogen, elixir-format, fuzzy
msgid "Show Ammo"
msgstr "Zeige Munitionsarten"
#: lib/cannery_web/live/pack_live/show.html.heex:111
#: lib/cannery_web/live/pack_live/show.html.heex:105
#, elixir-autogen, elixir-format, fuzzy
msgid "This ammo is not in a container"
msgstr "Diese Munitionsgruppe ist nicht in einem Behälter"
@ -752,7 +752,7 @@ msgstr "Diese Munitionsgruppe ist nicht in einem Behälter"
msgid "Packs:"
msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:10
#: lib/cannery_web/components/core_components/topbar.html.heex:7
#: lib/cannery_web/live/home_live.html.heex:4
#, elixir-autogen, elixir-format
msgid "Cannery logo"
@ -786,7 +786,7 @@ msgstr ""
msgid "%{percentage}%"
msgstr ""
#: lib/cannery_web/live/range_live/index.ex:154
#: lib/cannery_web/live/range_live/index.ex:153
#, elixir-autogen, elixir-format, fuzzy
msgid "Rounds shot: %{count}"
msgstr "Patronen abgefeuert"
@ -804,7 +804,7 @@ msgid "Rounds"
msgstr "Patronen:"
#: lib/cannery_web/live/container_live/index.html.heex:40
#: lib/cannery_web/live/container_live/show.html.heex:115
#: lib/cannery_web/live/container_live/show.html.heex:109
#: lib/cannery_web/live/type_live/show.html.heex:170
#, elixir-autogen, elixir-format
msgid "View as table"
@ -850,102 +850,102 @@ msgstr ""
msgid "Used rounds:"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:71
#: lib/cannery_web/live/range_live/index.html.heex:68
#, elixir-autogen, elixir-format, fuzzy
msgid "Rounds shot chart"
msgstr "Patronen abgefeuert"
#: lib/cannery_web/live/type_live/show.ex:154
#: lib/cannery_web/live/type_live/show.ex:153
#, elixir-autogen, elixir-format, fuzzy
msgid "Blank:"
msgstr "Knallpatrone"
#: lib/cannery_web/live/type_live/show.ex:132
#: lib/cannery_web/live/type_live/show.ex:131
#, elixir-autogen, elixir-format, fuzzy
msgid "Bullet core:"
msgstr "Projektilkern"
#: lib/cannery_web/live/type_live/show.ex:131
#: lib/cannery_web/live/type_live/show.ex:130
#, elixir-autogen, elixir-format, fuzzy
msgid "Bullet type:"
msgstr "Patronenart"
#: lib/cannery_web/live/type_live/show.ex:123
#: lib/cannery_web/live/type_live/show.ex:122
#, elixir-autogen, elixir-format, fuzzy
msgid "Caliber:"
msgstr "Kaliber"
#: lib/cannery_web/live/type_live/show.ex:121
#: lib/cannery_web/live/type_live/show.ex:120
#, elixir-autogen, elixir-format, fuzzy
msgid "Cartridge:"
msgstr "Patrone"
#: lib/cannery_web/live/type_live/show.ex:134
#: lib/cannery_web/live/type_live/show.ex:133
#, elixir-autogen, elixir-format, fuzzy
msgid "Case material:"
msgstr "Gehäusematerial"
#: lib/cannery_web/live/type_live/show.ex:155
#: lib/cannery_web/live/type_live/show.ex:154
#, elixir-autogen, elixir-format, fuzzy
msgid "Corrosive:"
msgstr "Korrosiv"
#: lib/cannery_web/live/type_live/show.ex:151
#: lib/cannery_web/live/type_live/show.ex:150
#, elixir-autogen, elixir-format, fuzzy
msgid "Firing type:"
msgstr "Patronenhülsenform"
#: lib/cannery_web/live/type_live/show.ex:130
#: lib/cannery_web/live/type_live/show.ex:129
#, elixir-autogen, elixir-format, fuzzy
msgid "Grains:"
msgstr "Körner"
#: lib/cannery_web/live/type_live/show.ex:153
#: lib/cannery_web/live/type_live/show.ex:152
#, elixir-autogen, elixir-format, fuzzy
msgid "Incendiary:"
msgstr "Brandmunition"
#: lib/cannery_web/live/type_live/show.ex:133
#: lib/cannery_web/live/type_live/show.ex:132
#, elixir-autogen, elixir-format, fuzzy
msgid "Jacket type:"
msgstr "Patronenhülse"
#: lib/cannery_web/live/type_live/show.ex:156
#: lib/cannery_web/live/type_live/show.ex:155
#, elixir-autogen, elixir-format, fuzzy
msgid "Manufacturer:"
msgstr "Hersteller"
#: lib/cannery_web/live/type_live/show.ex:149
#: lib/cannery_web/live/type_live/show.ex:148
#, elixir-autogen, elixir-format, fuzzy
msgid "Muzzle velocity:"
msgstr "Mündungsgeschwindigkeit"
#: lib/cannery_web/live/type_live/show.ex:143
#: lib/cannery_web/live/type_live/show.ex:142
#, elixir-autogen, elixir-format, fuzzy
msgid "Powder grains per charge:"
msgstr "Pulverkörner pro Ladung"
#: lib/cannery_web/live/type_live/show.ex:141
#: lib/cannery_web/live/type_live/show.ex:140
#, elixir-autogen, elixir-format, fuzzy
msgid "Powder type:"
msgstr "Pulverart"
#: lib/cannery_web/live/type_live/show.ex:147
#: lib/cannery_web/live/type_live/show.ex:146
#, elixir-autogen, elixir-format, fuzzy
msgid "Pressure:"
msgstr "Druck"
#: lib/cannery_web/live/type_live/show.ex:150
#: lib/cannery_web/live/type_live/show.ex:149
#, elixir-autogen, elixir-format, fuzzy
msgid "Primer type:"
msgstr "Zündertyp"
#: lib/cannery_web/live/type_live/show.ex:152
#: lib/cannery_web/live/type_live/show.ex:151
#, elixir-autogen, elixir-format, fuzzy
msgid "Tracer:"
msgstr "Leuchtspur"
#: lib/cannery_web/live/type_live/show.ex:157
#: lib/cannery_web/live/type_live/show.ex:156
#, elixir-autogen, elixir-format, fuzzy
msgid "UPC:"
msgstr "UPC"
@ -982,7 +982,7 @@ msgstr "Ursprüngliche Anzahl:"
msgid "Original Count:"
msgstr "Ursprüngliche Anzahl:"
#: lib/cannery_web/live/home_live.ex:15
#: lib/cannery_web/live/home_live.ex:14
#, elixir-autogen, elixir-format
msgid "Home"
msgstr ""
@ -1039,20 +1039,20 @@ msgstr ""
msgid "Search tags"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:115
#: lib/cannery_web/live/range_live/index.html.heex:112
#, elixir-autogen, elixir-format
msgid "Search shot records"
msgstr ""
#: lib/cannery_web/templates/user_settings/edit.html.heex:130
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:130
#, elixir-autogen, elixir-format
msgid "Spanish"
msgstr ""
#: lib/cannery_web/templates/error/error.html.heex:8
#: lib/cannery_web/templates/layout/root.html.heex:13
#: lib/cannery_web/templates/layout/root.html.heex:14
#: lib/cannery_web/views/layout_view.ex:14
#: lib/cannery_web/components/layouts.ex:15
#: lib/cannery_web/components/layouts/root.html.heex:9
#: lib/cannery_web/components/layouts/root.html.heex:10
#: lib/cannery_web/controllers/error_html/error.html.heex:8
#, elixir-autogen, elixir-format, fuzzy
msgid "Cannery"
msgstr ""
@ -1093,7 +1093,7 @@ msgstr ""
"Mit %{name} können Sie ihren Munitionsbestand vor und nach dem Schießen "
"leicht im Auge behalten"
#: lib/cannery_web/views/layout_view.ex:10
#: lib/cannery_web/components/layouts.ex:11
#, elixir-autogen, elixir-format
msgid "Cannery | %{title}"
msgstr ""
@ -1133,17 +1133,17 @@ msgstr "Verbleibende Nutzung:"
msgid "Uses: %{uses_count}"
msgstr ""
#: lib/cannery_web/templates/user_confirmation/new.html.heex:13
#: lib/cannery_web/templates/user_registration/new.html.heex:20
#: lib/cannery_web/templates/user_reset_password/new.html.heex:13
#: lib/cannery_web/templates/user_session/new.html.heex:17
#: lib/cannery_web/templates/user_settings/edit.html.heex:27
#: lib/cannery_web/controllers/user_confirmation_html/new.html.heex:13
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:20
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:13
#: lib/cannery_web/controllers/user_session_html/new.html.heex:17
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:27
#, elixir-autogen, elixir-format
msgid "Email"
msgstr ""
#: lib/cannery_web/templates/user_registration/new.html.heex:24
#: lib/cannery_web/templates/user_session/new.html.heex:20
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:24
#: lib/cannery_web/controllers/user_session_html/new.html.heex:20
#, elixir-autogen, elixir-format
msgid "Password"
msgstr ""
@ -1180,21 +1180,21 @@ msgid "Really great weather"
msgstr ""
#: lib/cannery_web/components/container_table_component.ex:67
#: lib/cannery_web/components/move_pack_component.ex:68
#: lib/cannery_web/components/move_pack_component.ex:67
#: lib/cannery_web/components/pack_table_component.ex:62
#: lib/cannery_web/components/shot_record_table_component.ex:48
#: lib/cannery_web/components/type_table_component.ex:99
#: lib/cannery_web/live/pack_live/show.ex:93
#: lib/cannery_web/live/pack_live/show.ex:92
#, elixir-autogen, elixir-format
msgid "Actions"
msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:105
#: lib/cannery_web/components/core_components/topbar.html.heex:81
#, elixir-autogen, elixir-format
msgid "Live Dashboard"
msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:90
#: lib/cannery_web/components/core_components/topbar.html.heex:66
#, elixir-autogen, elixir-format
msgid "Log out"
msgstr ""
@ -1210,9 +1210,9 @@ msgstr ""
msgid "Close modal"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:103
#: lib/cannery_web/live/container_live/show.html.heex:97
#: lib/cannery_web/live/pack_live/index.html.heex:58
#: lib/cannery_web/live/range_live/index.html.heex:92
#: lib/cannery_web/live/range_live/index.html.heex:89
#: lib/cannery_web/live/type_live/index.html.heex:35
#, elixir-autogen, elixir-format
msgid "All"
@ -1229,7 +1229,7 @@ msgstr ""
msgid "Brass height"
msgstr "Messing"
#: lib/cannery_web/live/type_live/show.ex:128
#: lib/cannery_web/live/type_live/show.ex:127
#, elixir-autogen, elixir-format
msgid "Brass height:"
msgstr ""
@ -1240,7 +1240,7 @@ msgstr ""
msgid "Chamber size"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:129
#: lib/cannery_web/live/type_live/show.ex:128
#, elixir-autogen, elixir-format
msgid "Chamber size:"
msgstr ""
@ -1256,7 +1256,7 @@ msgstr ""
msgid "Dram equivalent"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:148
#: lib/cannery_web/live/type_live/show.ex:147
#, elixir-autogen, elixir-format
msgid "Dram equivalent:"
msgstr ""
@ -1267,7 +1267,7 @@ msgstr ""
msgid "Gauge"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:123
#: lib/cannery_web/live/type_live/show.ex:122
#, elixir-autogen, elixir-format
msgid "Gauge:"
msgstr ""
@ -1278,7 +1278,7 @@ msgstr ""
msgid "Load grains"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:139
#: lib/cannery_web/live/type_live/show.ex:138
#, elixir-autogen, elixir-format
msgid "Load grains:"
msgstr ""
@ -1293,9 +1293,9 @@ msgstr "Keine Munition"
msgid "None specified"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:106
#: lib/cannery_web/live/container_live/show.html.heex:100
#: lib/cannery_web/live/pack_live/index.html.heex:61
#: lib/cannery_web/live/range_live/index.html.heex:95
#: lib/cannery_web/live/range_live/index.html.heex:92
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:38
#: lib/cannery_web/live/type_live/show.html.heex:56
@ -1318,9 +1318,9 @@ msgstr "Zündertyp"
msgid "Projectile"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:104
#: lib/cannery_web/live/container_live/show.html.heex:98
#: lib/cannery_web/live/pack_live/index.html.heex:59
#: lib/cannery_web/live/range_live/index.html.heex:93
#: lib/cannery_web/live/range_live/index.html.heex:90
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:36
#: lib/cannery_web/live/type_live/show.html.heex:54
@ -1334,7 +1334,7 @@ msgstr ""
msgid "Shot charge weight"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:140
#: lib/cannery_web/live/type_live/show.ex:139
#, elixir-autogen, elixir-format
msgid "Shot charge weight:"
msgstr ""
@ -1345,7 +1345,7 @@ msgstr ""
msgid "Shot material"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:137
#: lib/cannery_web/live/type_live/show.ex:136
#, elixir-autogen, elixir-format
msgid "Shot material:"
msgstr ""
@ -1356,7 +1356,7 @@ msgstr ""
msgid "Shot size"
msgstr "Schüsse abgegeben"
#: lib/cannery_web/live/type_live/show.ex:138
#: lib/cannery_web/live/type_live/show.ex:137
#, elixir-autogen, elixir-format, fuzzy
msgid "Shot size:"
msgstr "Schüsse abgegeben"
@ -1367,14 +1367,14 @@ msgstr "Schüsse abgegeben"
msgid "Shot type"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:136
#: lib/cannery_web/live/type_live/show.ex:135
#, elixir-autogen, elixir-format
msgid "Shot type:"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:105
#: lib/cannery_web/live/container_live/show.html.heex:99
#: lib/cannery_web/live/pack_live/index.html.heex:60
#: lib/cannery_web/live/range_live/index.html.heex:94
#: lib/cannery_web/live/range_live/index.html.heex:91
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:37
#: lib/cannery_web/live/type_live/show.html.heex:52
@ -1393,7 +1393,7 @@ msgstr ""
msgid "Target, bird, buck, etc"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:127
#: lib/cannery_web/live/type_live/show.ex:126
#, elixir-autogen, elixir-format
msgid "Unfired length:"
msgstr ""
@ -1410,15 +1410,15 @@ msgstr ""
msgid "Wadding"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:135
#: lib/cannery_web/live/type_live/show.ex:134
#, elixir-autogen, elixir-format
msgid "Wadding:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:149
#: lib/cannery_web/live/container_live/show.html.heex:97
#: lib/cannery_web/live/container_live/show.html.heex:91
#: lib/cannery_web/live/pack_live/index.html.heex:50
#: lib/cannery_web/live/range_live/index.html.heex:86
#: lib/cannery_web/live/range_live/index.html.heex:83
#: 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/show.html.heex:46
@ -1437,14 +1437,14 @@ msgstr "Patronen:"
msgid "Used up!"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:42
#: lib/cannery_web/live/range_live/index.ex:40
#: lib/cannery_web/live/pack_live/show.ex:41
#: lib/cannery_web/live/range_live/index.ex:39
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit Shot Record"
msgstr "Schießkladde editieren"
#: lib/cannery_web/live/type_live/index.ex:28
#: lib/cannery_web/live/type_live/show.ex:82
#: lib/cannery_web/live/type_live/show.ex:81
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit %{type_name}"
msgstr "%{name} bearbeiten"

View File

@ -14,45 +14,45 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.11.2\n"
#: lib/cannery_web/templates/email/confirm_email.html.heex:3
#: lib/cannery_web/templates/email/confirm_email.txt.eex:2
#: lib/cannery_web/templates/email/reset_password.html.heex:3
#: lib/cannery_web/templates/email/reset_password.txt.eex:2
#: lib/cannery_web/templates/email/update_email.html.heex:3
#: lib/cannery_web/templates/email/update_email.txt.eex:2
#: lib/cannery_web/components/email_html/confirm_email.html.heex:3
#: lib/cannery_web/components/email_html/confirm_email.txt.eex:2
#: lib/cannery_web/components/email_html/reset_password.html.heex:3
#: lib/cannery_web/components/email_html/reset_password.txt.eex:2
#: lib/cannery_web/components/email_html/update_email.html.heex:3
#: lib/cannery_web/components/email_html/update_email.txt.eex:2
#, elixir-autogen, elixir-format
msgid "Hi %{email},"
msgstr "Hallo %{email},"
#: lib/cannery_web/templates/email/confirm_email.txt.eex:10
#: lib/cannery_web/components/email_html/confirm_email.txt.eex:10
#, elixir-autogen, elixir-format
msgid "If you didn't create an account at %{url}, please ignore this."
msgstr ""
"Falls Sie dieses Nutzerkonto bei %{url} nicht erstellt haben, ignorieren Sie "
"diese Nachricht bitte."
#: lib/cannery_web/templates/email/reset_password.txt.eex:8
#: lib/cannery_web/templates/email/update_email.txt.eex:8
#: lib/cannery_web/components/email_html/reset_password.txt.eex:8
#: lib/cannery_web/components/email_html/update_email.txt.eex:8
#, elixir-autogen, elixir-format
msgid "If you didn't request this change from %{url}, please ignore this."
msgstr ""
"Falls Sie diese Änderung von %{url} nicht angefordert haben, ignorieren Sie "
"bitte diese Nachricht."
#: lib/cannery_web/templates/email/update_email.html.heex:8
#: lib/cannery_web/templates/email/update_email.txt.eex:4
#: lib/cannery_web/components/email_html/update_email.html.heex:8
#: lib/cannery_web/components/email_html/update_email.txt.eex:4
#, elixir-autogen, elixir-format
msgid "You can change your email by visiting the URL below:"
msgstr "Sie können Ihre Mailadresse unter folgender URL ändern:"
#: lib/cannery_web/templates/email/confirm_email.html.heex:14
#: lib/cannery_web/templates/email/confirm_email.txt.eex:6
#: lib/cannery_web/components/email_html/confirm_email.html.heex:14
#: lib/cannery_web/components/email_html/confirm_email.txt.eex:6
#, elixir-autogen, elixir-format
msgid "You can confirm your account by visiting the URL below:"
msgstr "Sie können Ihr Nutzerkonto unter folgender URL bestätigen:"
#: lib/cannery_web/templates/email/reset_password.html.heex:8
#: lib/cannery_web/templates/email/reset_password.txt.eex:4
#: lib/cannery_web/components/email_html/reset_password.html.heex:8
#: lib/cannery_web/components/email_html/reset_password.txt.eex:4
#, elixir-autogen, elixir-format
msgid "You can reset your password by visiting the URL below:"
msgstr "Sie können ihr Passwort unter folgender URL zurücksetzen:"
@ -66,52 +66,52 @@ msgstr "Sie können ihr Passwort unter folgender URL zurücksetzen:"
## Run "mix gettext.extract" to bring this file up to
## date. Leave "msgstr"s empty as changing them here has no
## effect: edit them in PO (.po) files instead.
#: lib/cannery/accounts/email.ex:30
#: lib/cannery/accounts/email.ex:31
#, elixir-autogen, elixir-format, fuzzy
msgid "Confirm your Cannery account"
msgstr "Bestätigen Sie ihr %{name} Nutzerkonto"
#: lib/cannery_web/templates/email/confirm_email.html.heex:22
#: lib/cannery_web/components/email_html/confirm_email.html.heex:22
#, elixir-autogen, elixir-format, fuzzy
msgid "If you didn't create an account at Cannery, please ignore this."
msgstr ""
"Falls SIe dieses Nutzerkonto unter %{name}, nicht erstellt haben, ignorieren "
"Sie diese Nachricht bitte."
#: lib/cannery_web/templates/email/reset_password.html.heex:16
#: lib/cannery_web/templates/email/update_email.html.heex:16
#: lib/cannery_web/components/email_html/reset_password.html.heex:16
#: lib/cannery_web/components/email_html/update_email.html.heex:16
#, elixir-autogen, elixir-format, fuzzy
msgid "If you didn't request this change from Cannery, please ignore this."
msgstr ""
"Falls Sie die Änderung von %{name} nicht angefragt haben, ignorieren Sie "
"diese Nachricht bitte."
#: lib/cannery/accounts/email.ex:37
#: lib/cannery/accounts/email.ex:38
#, elixir-autogen, elixir-format, fuzzy
msgid "Reset your Cannery password"
msgstr "Passwort für %{name} zurücksetzen"
#: lib/cannery_web/templates/layout/email.txt.eex:9
#: lib/cannery_web/components/layouts/email_text.txt.eex:9
#, elixir-autogen, elixir-format, fuzzy
msgid "This email was sent from Cannery at %{url}, the self-hosted firearm tracker website."
msgstr ""
"Diese Nachricht wurde von %{name} unter %{url} gesandt, einem selbst-"
"gehosteten Schusswaffenmanager."
#: lib/cannery_web/templates/layout/email.html.heex:13
#: lib/cannery_web/components/layouts/email_html.html.heex:13
#, elixir-autogen, elixir-format, fuzzy
msgid "This email was sent from Cannery, the self-hosted firearm tracker website."
msgstr ""
"Diese Nachricht wurde von %{name} gesandt, einem selbst-gehosteten "
"Schusswaffenmanager."
#: lib/cannery/accounts/email.ex:44
#: lib/cannery/accounts/email.ex:45
#, elixir-autogen, elixir-format, fuzzy
msgid "Update your Cannery email"
msgstr "Aktualisieren Sie %{name} Mailadresse"
#: lib/cannery_web/templates/email/confirm_email.html.heex:9
#: lib/cannery_web/templates/email/confirm_email.txt.eex:4
#: lib/cannery_web/components/email_html/confirm_email.html.heex:9
#: lib/cannery_web/components/email_html/confirm_email.txt.eex:4
#, elixir-autogen, elixir-format, fuzzy
msgid "Welcome to Cannery"
msgstr "Willkommen %{name}!"

View File

@ -29,7 +29,7 @@ msgid "Container must be empty before deleting"
msgstr "Behälter muss vor dem Löschen leer sein"
#: lib/cannery_web/live/container_live/index.ex:86
#: lib/cannery_web/live/container_live/show.ex:71
#: lib/cannery_web/live/container_live/show.ex:67
#, elixir-autogen, elixir-format
msgid "Could not delete %{name}: %{error}"
msgstr "Konnte %{name} nicht löschen: %{error}"
@ -44,55 +44,51 @@ msgstr "Konnte Behälter nicht finden"
msgid "Email change link is invalid or it has expired."
msgstr "Mailadressenänderungs-Link ist ungültig oder abgelaufen."
#: lib/cannery_web/templates/error/error.html.heex:8
#: lib/cannery_web/controllers/error_html/error.html.heex:8
#, elixir-autogen, elixir-format
msgid "Error"
msgstr "Fehler"
#: lib/cannery_web/templates/error/error.html.heex:31
#: lib/cannery_web/controllers/error_html/error.html.heex:28
#, elixir-autogen, elixir-format
msgid "Go back home"
msgstr "Zur Hauptseite zurückkehren"
#: lib/cannery_web/views/error_view.ex:10
#, elixir-autogen, elixir-format
msgid "Internal Server Error"
msgstr "Interner Serverfehler"
#: lib/cannery_web/controllers/user_session_controller.ex:17
#, elixir-autogen, elixir-format
msgid "Invalid email or password"
msgstr "Ungültige Mailadresse oder Passwort"
#: lib/cannery_web/views/error_view.ex:8
#: lib/cannery_web/controllers/error_html.ex:9
#: lib/cannery_web/controllers/error_json.ex:7
#, elixir-autogen, elixir-format
msgid "Not found"
msgstr "Nicht gefunden"
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:13
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:13
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:22
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:64
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:118
#: lib/cannery_web/live/type_live/form_component.html.heex:18
#: lib/cannery_web/templates/user_registration/new.html.heex:13
#: lib/cannery_web/templates/user_reset_password/edit.html.heex:13
#: lib/cannery_web/templates/user_settings/edit.html.heex:22
#: lib/cannery_web/templates/user_settings/edit.html.heex:64
#: lib/cannery_web/templates/user_settings/edit.html.heex:118
#, elixir-autogen, elixir-format
msgid "Oops, something went wrong! Please check the errors below."
msgstr "Oops, etwas ist schiefgegangen. Bitte beachten Sie den Fehler unten."
#: lib/cannery_web/controllers/user_reset_password_controller.ex:63
#: lib/cannery_web/controllers/user_reset_password_controller.ex:62
#, elixir-autogen, elixir-format
msgid "Reset password link is invalid or it has expired."
msgstr "Link zum Passwort zurücksetzen ist ungültig oder abgelaufen."
#: lib/cannery_web/controllers/user_registration_controller.ex:23
#: lib/cannery_web/controllers/user_registration_controller.ex:52
#: lib/cannery_web/controllers/user_registration_controller.ex:22
#: lib/cannery_web/controllers/user_registration_controller.ex:51
#, elixir-autogen, elixir-format
msgid "Sorry, public registration is disabled"
msgstr "Entschuldigung, aber öffentliche Registrierung ist deaktiviert"
#: lib/cannery_web/controllers/user_registration_controller.ex:13
#: lib/cannery_web/controllers/user_registration_controller.ex:42
#: lib/cannery_web/controllers/user_registration_controller.ex:71
#: lib/cannery_web/controllers/user_registration_controller.ex:12
#: lib/cannery_web/controllers/user_registration_controller.ex:41
#: lib/cannery_web/controllers/user_registration_controller.ex:70
#, elixir-autogen, elixir-format
msgid "Sorry, this invite was not found or expired"
msgstr ""
@ -103,17 +99,18 @@ msgstr ""
msgid "Unable to delete user"
msgstr "Dieser Nutzer konnte nicht gelöscht werden"
#: lib/cannery_web/views/error_view.ex:9
#: lib/cannery_web/controllers/error_html.ex:10
#: lib/cannery_web/controllers/error_json.ex:8
#, elixir-autogen, elixir-format
msgid "Unauthorized"
msgstr "Unbefugt"
#: lib/cannery_web/controllers/user_confirmation_controller.ex:54
#: lib/cannery_web/controllers/user_confirmation_controller.ex:53
#, elixir-autogen, elixir-format
msgid "User confirmation link is invalid or it has expired."
msgstr "Nutzerkonto Bestätigungslink ist ungültig oder abgelaufen."
#: lib/cannery_web/controllers/user_auth.ex:177
#: lib/cannery_web/controllers/user_auth.ex:266
#, elixir-autogen, elixir-format
msgid "You are not authorized to view this page."
msgstr "Sie sind nicht berechtigt, diese Seite aufzurufen."
@ -138,7 +135,7 @@ msgstr "ist nicht gültig"
msgid "must have the @ sign and no spaces"
msgstr "Muss ein @ Zeichen und keine Leerzeichen haben"
#: lib/cannery_web/live/container_live/show.ex:46
#: lib/cannery_web/live/container_live/show.ex:45
#, elixir-autogen, elixir-format
msgid "Tag not found"
msgstr "Tag nicht gefunden"
@ -148,8 +145,8 @@ msgstr "Tag nicht gefunden"
msgid "Tag could not be added"
msgstr "Tag konnte nicht hinzugefügt werden"
#: lib/cannery_web/controllers/user_auth.ex:39
#: lib/cannery_web/controllers/user_auth.ex:161
#: lib/cannery_web/controllers/user_auth.ex:38
#: lib/cannery_web/controllers/user_auth.ex:250
#, elixir-autogen, elixir-format
msgid "You must confirm your account and log in to access this page."
msgstr ""
@ -178,7 +175,7 @@ msgstr ""
msgid "Invalid multiplier"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:74
#: lib/cannery_web/live/range_live/index.html.heex:71
#, elixir-autogen, elixir-format
msgid "Your browser does not support the canvas element."
msgstr ""
@ -212,3 +209,19 @@ msgstr ""
#, 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_json.ex:9
#, elixir-autogen, elixir-format, fuzzy
msgid "Internal server error"
msgstr "Interner Serverfehler"
#: lib/cannery_web/controllers/user_auth.ex:195
#, elixir-autogen, elixir-format
msgid "You must log in as an administrator to access this page."
msgstr ""
#: lib/cannery_web/controllers/user_auth.ex:178
#, elixir-autogen, elixir-format
msgid "You must log in to access this page."
msgstr ""

View File

@ -33,13 +33,13 @@ msgstr "%{name} erfolgreich erstellt"
#: lib/cannery_web/live/tag_live/index.ex:65
#: lib/cannery_web/live/type_live/index.ex:72
#: lib/cannery_web/live/type_live/show.ex:27
#: lib/cannery_web/live/type_live/show.ex:26
#, elixir-autogen, elixir-format
msgid "%{name} deleted succesfully"
msgstr "%{name} erfolgreich gelöscht"
#: lib/cannery_web/live/container_live/index.ex:79
#: lib/cannery_web/live/container_live/show.ex:61
#: lib/cannery_web/live/container_live/show.ex:60
#, elixir-autogen, elixir-format
msgid "%{name} has been deleted"
msgstr "%{name} wurde gelöscht"
@ -73,18 +73,18 @@ msgstr ""
msgid "Are you sure you want to delete %{name}?"
msgstr "Sind Sie sicher, dass sie %{name} löschen möchten?"
#: lib/cannery_web/live/pack_live/index.html.heex:187
#: lib/cannery_web/live/pack_live/show.html.heex:72
#: lib/cannery_web/live/pack_live/index.html.heex:181
#: lib/cannery_web/live/pack_live/show.html.heex:69
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this ammo?"
msgstr "Sind Sie sicher, dass sie diese Munition löschen möchten?"
#: lib/cannery_web/templates/user_settings/edit.html.heex:157
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:153
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete your account?"
msgstr "Sind Sie sicher, dass sie Ihren Account löschen möchten?"
#: lib/cannery_web/components/core_components/topbar.html.heex:89
#: lib/cannery_web/components/core_components/topbar.html.heex:65
#, elixir-autogen, elixir-format
msgid "Are you sure you want to log out?"
msgstr "Wirklich ausloggen?"
@ -113,7 +113,7 @@ msgstr ""
msgid "Logged out successfully."
msgstr "Erfolgreich ausgeloggt."
#: lib/cannery_web/controllers/user_reset_password_controller.ex:46
#: lib/cannery_web/controllers/user_reset_password_controller.ex:45
#, elixir-autogen, elixir-format
msgid "Password reset successfully."
msgstr "Passwort erfolgreich zurückgesetzt."
@ -123,7 +123,7 @@ msgstr "Passwort erfolgreich zurückgesetzt."
msgid "Password updated successfully."
msgstr "Passwort erfolgreich geändert."
#: lib/cannery_web/controllers/user_registration_controller.ex:66
#: lib/cannery_web/controllers/user_registration_controller.ex:65
#, elixir-autogen, elixir-format
msgid "Please check your email to verify your account"
msgstr "Bitte überprüfen Sie ihre Mailbox und bestätigen Sie das Nutzerkonto"
@ -156,7 +156,7 @@ msgstr ""
msgid "%{name} added successfully"
msgstr "%{name} erfolgreich hinzugefügt"
#: lib/cannery_web/live/container_live/show.ex:38
#: lib/cannery_web/live/container_live/show.ex:37
#, elixir-autogen, elixir-format
msgid "%{tag_name} has been removed from %{container_name}"
msgstr "%{tag_name} wurde von %{container_name} entfernt"
@ -176,14 +176,14 @@ msgstr "Schüsse erfolgreich dokumentiert"
msgid "Are you sure you want to unstage this ammo?"
msgstr "Sind sie sicher, dass Sie diese Munition demarkieren möchten?"
#: lib/cannery_web/live/pack_live/show.ex:158
#: lib/cannery_web/live/range_live/index.html.heex:152
#: lib/cannery_web/live/pack_live/show.ex:157
#: lib/cannery_web/live/range_live/index.html.heex:149
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?"
msgstr "Sind sie sicher, dass sie die Schießkladde löschen möchten?"
#: lib/cannery_web/live/pack_live/show.ex:80
#: lib/cannery_web/live/range_live/index.ex:79
#: lib/cannery_web/live/pack_live/show.ex:79
#: lib/cannery_web/live/range_live/index.ex:78
#, elixir-autogen, elixir-format
msgid "Shot records deleted succesfully"
msgstr "Schießkladde erfolgreich gelöscht"
@ -193,12 +193,12 @@ msgstr "Schießkladde erfolgreich gelöscht"
msgid "Shot records updated successfully"
msgstr "Schießkladde erfolgreich aktualisiert"
#: lib/cannery_web/controllers/user_confirmation_controller.ex:38
#: lib/cannery_web/controllers/user_confirmation_controller.ex:37
#, elixir-autogen, elixir-format
msgid "%{email} confirmed successfully."
msgstr "%{email} erfolgreich bestätigt."
#: lib/cannery_web/components/move_pack_component.ex:52
#: lib/cannery_web/components/move_pack_component.ex:51
#, elixir-autogen, elixir-format
msgid "Ammo moved to %{name} successfully"
msgstr "Munition erfolgreich zu %{name} verschoben"
@ -224,7 +224,7 @@ msgstr "Sie müssen"
msgid "Creating..."
msgstr "Erstellen..."
#: lib/cannery_web/templates/user_settings/edit.html.heex:138
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:138
#, elixir-autogen, elixir-format
msgid "Are you sure you want to change your language?"
msgstr "Möchten Sie die Sprache wechseln?"
@ -235,12 +235,12 @@ msgid "Language updated successfully."
msgstr "Spracheinstellung gespeichert."
#: lib/cannery_web/live/pack_live/index.ex:94
#: lib/cannery_web/live/pack_live/show.ex:55
#: lib/cannery_web/live/pack_live/show.ex:54
#, elixir-autogen, elixir-format, fuzzy
msgid "Ammo deleted succesfully"
msgstr "Munitionsgruppe erfolgreich gelöscht"
#: lib/cannery_web/live/range_live/index.ex:92
#: lib/cannery_web/live/range_live/index.ex:91
#, elixir-autogen, elixir-format, fuzzy
msgid "Ammo unstaged succesfully"
msgstr "Munition erfolgreich demarkiert"

View File

@ -25,7 +25,7 @@ msgstr ""
msgid "Admins:"
msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:58
#: lib/cannery_web/components/core_components/topbar.html.heex:43
#: lib/cannery_web/components/shot_record_table_component.ex:44
#: lib/cannery_web/live/pack_live/index.ex:75
#: lib/cannery_web/live/pack_live/index.ex:84
@ -80,14 +80,14 @@ msgstr ""
msgid "Case material"
msgstr ""
#: lib/cannery_web/components/move_pack_component.ex:65
#: lib/cannery_web/components/move_pack_component.ex:64
#: lib/cannery_web/components/pack_table_component.ex:76
#: lib/cannery_web/live/pack_live/form_component.html.heex:66
#, elixir-autogen, elixir-format
msgid "Container"
msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:42
#: lib/cannery_web/components/core_components/topbar.html.heex:33
#: lib/cannery_web/live/container_live/index.ex:45
#: lib/cannery_web/live/container_live/index.ex:54
#: lib/cannery_web/live/container_live/index.html.heex:3
@ -173,20 +173,20 @@ msgstr ""
msgid "Invite Only"
msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:74
#: lib/cannery_web/components/core_components/topbar.html.heex:53
#: lib/cannery_web/live/invite_live/index.ex:31
#: lib/cannery_web/live/invite_live/index.html.heex:3
#, elixir-autogen, elixir-format
msgid "Invites"
msgstr ""
#: lib/cannery_web/templates/user_session/new.html.heex:23
#: lib/cannery_web/controllers/user_session_html/new.html.heex:23
#, elixir-autogen, elixir-format
msgid "Keep me logged in for 60 days"
msgstr ""
#: lib/cannery_web/components/container_table_component.ex:47
#: lib/cannery_web/components/move_pack_component.ex:67
#: lib/cannery_web/components/move_pack_component.ex:66
#: lib/cannery_web/live/container_live/form_component.html.heex:47
#, elixir-autogen, elixir-format
msgid "Location"
@ -277,7 +277,7 @@ msgstr ""
#: lib/cannery_web/components/add_shot_record_component.html.heex:38
#: 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/show.ex:91
#: lib/cannery_web/live/pack_live/show.ex:90
#: lib/cannery_web/live/range_live/form_component.html.heex:30
#, elixir-autogen, elixir-format
msgid "Notes"
@ -333,7 +333,7 @@ msgid "Self-host your own instance, or use an instance from someone you trust."
msgstr ""
#: lib/cannery_web/controllers/user_settings_controller.ex:10
#: lib/cannery_web/templates/user_settings/edit.html.heex:3
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:3
#, elixir-autogen, elixir-format
msgid "Settings"
msgstr ""
@ -348,13 +348,13 @@ msgstr ""
msgid "Steel"
msgstr ""
#: lib/cannery_web/live/pack_live/show.html.heex:106
#: lib/cannery_web/live/pack_live/show.html.heex:100
#, elixir-autogen, elixir-format
msgid "Stored in"
msgstr ""
#: lib/cannery_web/components/container_table_component.ex:66
#: lib/cannery_web/components/core_components/topbar.html.heex:34
#: 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:53
#: lib/cannery_web/live/tag_live/index.html.heex:3
@ -384,7 +384,7 @@ msgid "Tracer"
msgstr ""
#: lib/cannery_web/components/container_table_component.ex:48
#: lib/cannery_web/components/move_pack_component.ex:66
#: lib/cannery_web/components/move_pack_component.ex:65
#: lib/cannery_web/components/pack_table_component.ex:108
#: lib/cannery_web/live/container_live/form_component.html.heex:39
#: lib/cannery_web/live/pack_live/form_component.html.heex:22
@ -418,7 +418,7 @@ msgstr ""
msgid "No tags for this container"
msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:66
#: lib/cannery_web/components/core_components/topbar.html.heex:48
#: lib/cannery_web/components/pack_table_component.ex:80
#, elixir-autogen, elixir-format
msgid "Range"
@ -431,7 +431,7 @@ msgstr ""
#: lib/cannery_web/components/add_shot_record_component.html.heex:49
#: lib/cannery_web/components/shot_record_table_component.ex:47
#: lib/cannery_web/live/pack_live/show.ex:92
#: lib/cannery_web/live/pack_live/show.ex:91
#: lib/cannery_web/live/range_live/form_component.html.heex:41
#, elixir-autogen, elixir-format
msgid "Date"
@ -453,26 +453,26 @@ msgstr ""
msgid "Record shots"
msgstr ""
#: lib/cannery_web/live/range_live/index.ex:48
#: lib/cannery_web/live/range_live/index.ex:47
#, elixir-autogen, elixir-format
msgid "New Shot Records"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:55
#: lib/cannery_web/live/range_live/index.html.heex:122
#: lib/cannery_web/live/range_live/index.html.heex:52
#: lib/cannery_web/live/range_live/index.html.heex:119
#, elixir-autogen, elixir-format
msgid "No shots recorded"
msgstr ""
#: lib/cannery_web/components/shot_record_table_component.ex:45
#: lib/cannery_web/live/pack_live/show.ex:90
#: lib/cannery_web/live/range_live/index.html.heex:69
#: lib/cannery_web/live/pack_live/show.ex:89
#: lib/cannery_web/live/range_live/index.html.heex:66
#, elixir-autogen, elixir-format
msgid "Rounds shot"
msgstr ""
#: lib/cannery_web/live/range_live/index.ex:56
#: lib/cannery_web/live/range_live/index.ex:66
#: lib/cannery_web/live/range_live/index.ex:55
#: lib/cannery_web/live/range_live/index.ex:65
#, elixir-autogen, elixir-format
msgid "Shot Records"
msgstr ""
@ -482,12 +482,12 @@ msgstr ""
msgid "Move ammo"
msgstr ""
#: lib/cannery_web/components/move_pack_component.ex:83
#: lib/cannery_web/components/move_pack_component.ex:82
#, elixir-autogen, elixir-format
msgid "No other containers"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:60
#: lib/cannery_web/live/range_live/index.html.heex:57
#, elixir-autogen, elixir-format
msgid "Shot log"
msgstr ""
@ -538,20 +538,20 @@ msgstr ""
msgid "UPC"
msgstr ""
#: lib/cannery_web/templates/user_reset_password/edit.html.heex:20
#: lib/cannery_web/templates/user_settings/edit.html.heex:76
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:20
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:76
#, elixir-autogen, elixir-format
msgid "Confirm new password"
msgstr ""
#: lib/cannery_web/templates/user_settings/edit.html.heex:31
#: lib/cannery_web/templates/user_settings/edit.html.heex:85
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:31
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:85
#, elixir-autogen, elixir-format
msgid "Current password"
msgstr ""
#: lib/cannery_web/templates/user_reset_password/edit.html.heex:16
#: lib/cannery_web/templates/user_settings/edit.html.heex:69
#: lib/cannery_web/controllers/user_reset_password_html/edit.html.heex:16
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:69
#, elixir-autogen, elixir-format
msgid "New password"
msgstr ""
@ -562,19 +562,19 @@ msgstr ""
msgid "Firing type"
msgstr ""
#: lib/cannery_web/templates/layout/live.html.heex:43
#: lib/cannery_web/components/layouts/live.html.heex:43
#, elixir-autogen, elixir-format
msgid "Reconnecting..."
msgstr ""
#: lib/cannery_web/live/container_live/index.ex:28
#: lib/cannery_web/live/container_live/show.ex:120
#: lib/cannery_web/live/container_live/show.ex:116
#, elixir-autogen, elixir-format
msgid "Edit %{name}"
msgstr ""
#: lib/cannery_web/live/container_live/index.ex:63
#: lib/cannery_web/live/container_live/show.ex:121
#: lib/cannery_web/live/container_live/show.ex:117
#, elixir-autogen, elixir-format
msgid "Edit %{name} tags"
msgstr ""
@ -619,7 +619,7 @@ msgstr ""
msgid "Percentage left:"
msgstr ""
#: lib/cannery_web/live/pack_live/show.html.heex:119
#: lib/cannery_web/live/pack_live/show.html.heex:113
#, elixir-autogen, elixir-format
msgid "Rounds used"
msgstr ""
@ -639,18 +639,18 @@ msgstr ""
msgid "Log in"
msgstr ""
#: lib/cannery_web/controllers/user_registration_controller.ex:33
#: lib/cannery_web/controllers/user_registration_controller.ex:32
#, elixir-autogen, elixir-format
msgid "Register"
msgstr ""
#: lib/cannery_web/controllers/user_reset_password_controller.ex:36
#: lib/cannery_web/controllers/user_reset_password_controller.ex:35
#, elixir-autogen, elixir-format
msgid "Reset your password"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:41
#: lib/cannery_web/live/range_live/index.ex:32
#: lib/cannery_web/live/pack_live/show.ex:40
#: lib/cannery_web/live/range_live/index.ex:31
#, elixir-autogen, elixir-format
msgid "Record Shots"
msgstr ""
@ -665,23 +665,23 @@ msgstr ""
msgid "Added on:"
msgstr ""
#: lib/cannery_web/templates/user_registration/new.html.heex:32
#: lib/cannery_web/templates/user_settings/edit.html.heex:127
#: 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/templates/user_settings/edit.html.heex:129
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:129
#, elixir-autogen, elixir-format
msgid "French"
msgstr ""
#: lib/cannery_web/templates/user_settings/edit.html.heex:128
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:128
#, elixir-autogen, elixir-format
msgid "German"
msgstr ""
#: lib/cannery_web/templates/user_registration/new.html.heex:28
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:28
#, elixir-autogen, elixir-format
msgid "Language"
msgstr ""
@ -706,7 +706,7 @@ msgstr ""
msgid "View the source code"
msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:50
#: lib/cannery_web/components/core_components/topbar.html.heex:38
#: lib/cannery_web/live/type_live/index.ex:52
#: lib/cannery_web/live/type_live/index.ex:62
#: lib/cannery_web/live/type_live/index.html.heex:3
@ -714,27 +714,27 @@ msgstr ""
msgid "Catalog"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:45
#: lib/cannery_web/live/pack_live/show.ex:44
#, elixir-autogen, elixir-format
msgid "Edit Ammo"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:43
#: lib/cannery_web/live/pack_live/show.ex:42
#, elixir-autogen, elixir-format
msgid "Move Ammo"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:123
#: lib/cannery_web/live/container_live/show.html.heex:117
#, elixir-autogen, elixir-format
msgid "No ammo in this container"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:44
#: lib/cannery_web/live/pack_live/show.ex:43
#, elixir-autogen, elixir-format
msgid "Show Ammo"
msgstr ""
#: lib/cannery_web/live/pack_live/show.html.heex:111
#: lib/cannery_web/live/pack_live/show.html.heex:105
#, elixir-autogen, elixir-format
msgid "This ammo is not in a container"
msgstr ""
@ -746,7 +746,7 @@ msgstr ""
msgid "Packs:"
msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:10
#: lib/cannery_web/components/core_components/topbar.html.heex:7
#: lib/cannery_web/live/home_live.html.heex:4
#, elixir-autogen, elixir-format
msgid "Cannery logo"
@ -780,7 +780,7 @@ msgstr ""
msgid "%{percentage}%"
msgstr ""
#: lib/cannery_web/live/range_live/index.ex:154
#: lib/cannery_web/live/range_live/index.ex:153
#, elixir-autogen, elixir-format
msgid "Rounds shot: %{count}"
msgstr ""
@ -798,7 +798,7 @@ msgid "Rounds"
msgstr ""
#: lib/cannery_web/live/container_live/index.html.heex:40
#: lib/cannery_web/live/container_live/show.html.heex:115
#: lib/cannery_web/live/container_live/show.html.heex:109
#: lib/cannery_web/live/type_live/show.html.heex:170
#, elixir-autogen, elixir-format
msgid "View as table"
@ -844,102 +844,102 @@ msgstr ""
msgid "Used rounds:"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:71
#: lib/cannery_web/live/range_live/index.html.heex:68
#, elixir-autogen, elixir-format
msgid "Rounds shot chart"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:154
#: lib/cannery_web/live/type_live/show.ex:153
#, elixir-autogen, elixir-format
msgid "Blank:"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:132
#: lib/cannery_web/live/type_live/show.ex:131
#, elixir-autogen, elixir-format
msgid "Bullet core:"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:131
#: lib/cannery_web/live/type_live/show.ex:130
#, elixir-autogen, elixir-format
msgid "Bullet type:"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:123
#: lib/cannery_web/live/type_live/show.ex:122
#, elixir-autogen, elixir-format
msgid "Caliber:"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:121
#: lib/cannery_web/live/type_live/show.ex:120
#, elixir-autogen, elixir-format
msgid "Cartridge:"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:134
#: lib/cannery_web/live/type_live/show.ex:133
#, elixir-autogen, elixir-format
msgid "Case material:"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:155
#: lib/cannery_web/live/type_live/show.ex:154
#, elixir-autogen, elixir-format
msgid "Corrosive:"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:151
#: lib/cannery_web/live/type_live/show.ex:150
#, elixir-autogen, elixir-format
msgid "Firing type:"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:130
#: lib/cannery_web/live/type_live/show.ex:129
#, elixir-autogen, elixir-format
msgid "Grains:"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:153
#: lib/cannery_web/live/type_live/show.ex:152
#, elixir-autogen, elixir-format
msgid "Incendiary:"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:133
#: lib/cannery_web/live/type_live/show.ex:132
#, elixir-autogen, elixir-format
msgid "Jacket type:"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:156
#: lib/cannery_web/live/type_live/show.ex:155
#, elixir-autogen, elixir-format
msgid "Manufacturer:"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:149
#: lib/cannery_web/live/type_live/show.ex:148
#, elixir-autogen, elixir-format
msgid "Muzzle velocity:"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:143
#: lib/cannery_web/live/type_live/show.ex:142
#, elixir-autogen, elixir-format
msgid "Powder grains per charge:"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:141
#: lib/cannery_web/live/type_live/show.ex:140
#, elixir-autogen, elixir-format
msgid "Powder type:"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:147
#: lib/cannery_web/live/type_live/show.ex:146
#, elixir-autogen, elixir-format
msgid "Pressure:"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:150
#: lib/cannery_web/live/type_live/show.ex:149
#, elixir-autogen, elixir-format
msgid "Primer type:"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:152
#: lib/cannery_web/live/type_live/show.ex:151
#, elixir-autogen, elixir-format
msgid "Tracer:"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:157
#: lib/cannery_web/live/type_live/show.ex:156
#, elixir-autogen, elixir-format
msgid "UPC:"
msgstr ""
@ -976,7 +976,7 @@ msgstr ""
msgid "Original Count:"
msgstr ""
#: lib/cannery_web/live/home_live.ex:15
#: lib/cannery_web/live/home_live.ex:14
#, elixir-autogen, elixir-format
msgid "Home"
msgstr ""
@ -1033,20 +1033,20 @@ msgstr ""
msgid "Search tags"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:115
#: lib/cannery_web/live/range_live/index.html.heex:112
#, elixir-autogen, elixir-format
msgid "Search shot records"
msgstr ""
#: lib/cannery_web/templates/user_settings/edit.html.heex:130
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:130
#, elixir-autogen, elixir-format
msgid "Spanish"
msgstr ""
#: lib/cannery_web/templates/error/error.html.heex:8
#: lib/cannery_web/templates/layout/root.html.heex:13
#: lib/cannery_web/templates/layout/root.html.heex:14
#: lib/cannery_web/views/layout_view.ex:14
#: lib/cannery_web/components/layouts.ex:15
#: lib/cannery_web/components/layouts/root.html.heex:9
#: lib/cannery_web/components/layouts/root.html.heex:10
#: lib/cannery_web/controllers/error_html/error.html.heex:8
#, elixir-autogen, elixir-format
msgid "Cannery"
msgstr ""
@ -1076,7 +1076,7 @@ msgstr ""
msgid "Cannery lets you easily keep an eye on your ammo levels before and after range day"
msgstr ""
#: lib/cannery_web/views/layout_view.ex:10
#: lib/cannery_web/components/layouts.ex:11
#, elixir-autogen, elixir-format
msgid "Cannery | %{title}"
msgstr ""
@ -1116,17 +1116,17 @@ msgstr ""
msgid "Uses: %{uses_count}"
msgstr ""
#: lib/cannery_web/templates/user_confirmation/new.html.heex:13
#: lib/cannery_web/templates/user_registration/new.html.heex:20
#: lib/cannery_web/templates/user_reset_password/new.html.heex:13
#: lib/cannery_web/templates/user_session/new.html.heex:17
#: lib/cannery_web/templates/user_settings/edit.html.heex:27
#: lib/cannery_web/controllers/user_confirmation_html/new.html.heex:13
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:20
#: lib/cannery_web/controllers/user_reset_password_html/new.html.heex:13
#: lib/cannery_web/controllers/user_session_html/new.html.heex:17
#: lib/cannery_web/controllers/user_settings_html/edit.html.heex:27
#, elixir-autogen, elixir-format
msgid "Email"
msgstr ""
#: lib/cannery_web/templates/user_registration/new.html.heex:24
#: lib/cannery_web/templates/user_session/new.html.heex:20
#: lib/cannery_web/controllers/user_registration_html/new.html.heex:24
#: lib/cannery_web/controllers/user_session_html/new.html.heex:20
#, elixir-autogen, elixir-format
msgid "Password"
msgstr ""
@ -1163,21 +1163,21 @@ msgid "Really great weather"
msgstr ""
#: lib/cannery_web/components/container_table_component.ex:67
#: lib/cannery_web/components/move_pack_component.ex:68
#: lib/cannery_web/components/move_pack_component.ex:67
#: lib/cannery_web/components/pack_table_component.ex:62
#: lib/cannery_web/components/shot_record_table_component.ex:48
#: lib/cannery_web/components/type_table_component.ex:99
#: lib/cannery_web/live/pack_live/show.ex:93
#: lib/cannery_web/live/pack_live/show.ex:92
#, elixir-autogen, elixir-format
msgid "Actions"
msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:105
#: lib/cannery_web/components/core_components/topbar.html.heex:81
#, elixir-autogen, elixir-format
msgid "Live Dashboard"
msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:90
#: lib/cannery_web/components/core_components/topbar.html.heex:66
#, elixir-autogen, elixir-format
msgid "Log out"
msgstr ""
@ -1193,9 +1193,9 @@ msgstr ""
msgid "Close modal"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:103
#: lib/cannery_web/live/container_live/show.html.heex:97
#: lib/cannery_web/live/pack_live/index.html.heex:58
#: lib/cannery_web/live/range_live/index.html.heex:92
#: lib/cannery_web/live/range_live/index.html.heex:89
#: lib/cannery_web/live/type_live/index.html.heex:35
#, elixir-autogen, elixir-format
msgid "All"
@ -1212,7 +1212,7 @@ msgstr ""
msgid "Brass height"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:128
#: lib/cannery_web/live/type_live/show.ex:127
#, elixir-autogen, elixir-format
msgid "Brass height:"
msgstr ""
@ -1223,7 +1223,7 @@ msgstr ""
msgid "Chamber size"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:129
#: lib/cannery_web/live/type_live/show.ex:128
#, elixir-autogen, elixir-format
msgid "Chamber size:"
msgstr ""
@ -1239,7 +1239,7 @@ msgstr ""
msgid "Dram equivalent"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:148
#: lib/cannery_web/live/type_live/show.ex:147
#, elixir-autogen, elixir-format
msgid "Dram equivalent:"
msgstr ""
@ -1250,7 +1250,7 @@ msgstr ""
msgid "Gauge"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:123
#: lib/cannery_web/live/type_live/show.ex:122
#, elixir-autogen, elixir-format
msgid "Gauge:"
msgstr ""
@ -1261,7 +1261,7 @@ msgstr ""
msgid "Load grains"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:139
#: lib/cannery_web/live/type_live/show.ex:138
#, elixir-autogen, elixir-format
msgid "Load grains:"
msgstr ""
@ -1276,9 +1276,9 @@ msgstr ""
msgid "None specified"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:106
#: lib/cannery_web/live/container_live/show.html.heex:100
#: lib/cannery_web/live/pack_live/index.html.heex:61
#: lib/cannery_web/live/range_live/index.html.heex:95
#: lib/cannery_web/live/range_live/index.html.heex:92
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:38
#: lib/cannery_web/live/type_live/show.html.heex:56
@ -1301,9 +1301,9 @@ msgstr ""
msgid "Projectile"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:104
#: lib/cannery_web/live/container_live/show.html.heex:98
#: lib/cannery_web/live/pack_live/index.html.heex:59
#: lib/cannery_web/live/range_live/index.html.heex:93
#: lib/cannery_web/live/range_live/index.html.heex:90
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:36
#: lib/cannery_web/live/type_live/show.html.heex:54
@ -1317,7 +1317,7 @@ msgstr ""
msgid "Shot charge weight"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:140
#: lib/cannery_web/live/type_live/show.ex:139
#, elixir-autogen, elixir-format
msgid "Shot charge weight:"
msgstr ""
@ -1328,7 +1328,7 @@ msgstr ""
msgid "Shot material"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:137
#: lib/cannery_web/live/type_live/show.ex:136
#, elixir-autogen, elixir-format
msgid "Shot material:"
msgstr ""
@ -1339,7 +1339,7 @@ msgstr ""
msgid "Shot size"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:138
#: lib/cannery_web/live/type_live/show.ex:137
#, elixir-autogen, elixir-format
msgid "Shot size:"
msgstr ""
@ -1350,14 +1350,14 @@ msgstr ""
msgid "Shot type"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:136
#: lib/cannery_web/live/type_live/show.ex:135
#, elixir-autogen, elixir-format
msgid "Shot type:"
msgstr ""
#: lib/cannery_web/live/container_live/show.html.heex:105
#: lib/cannery_web/live/container_live/show.html.heex:99
#: lib/cannery_web/live/pack_live/index.html.heex:60
#: lib/cannery_web/live/range_live/index.html.heex:94
#: lib/cannery_web/live/range_live/index.html.heex:91
#: lib/cannery_web/live/type_live/form_component.html.heex:25
#: lib/cannery_web/live/type_live/index.html.heex:37
#: lib/cannery_web/live/type_live/show.html.heex:52
@ -1376,7 +1376,7 @@ msgstr ""
msgid "Target, bird, buck, etc"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:127
#: lib/cannery_web/live/type_live/show.ex:126
#, elixir-autogen, elixir-format
msgid "Unfired length:"
msgstr ""
@ -1393,15 +1393,15 @@ msgstr ""
msgid "Wadding"
msgstr ""
#: lib/cannery_web/live/type_live/show.ex:135
#: lib/cannery_web/live/type_live/show.ex:134
#, elixir-autogen, elixir-format
msgid "Wadding:"
msgstr ""
#: lib/cannery_web/components/type_table_component.ex:149
#: lib/cannery_web/live/container_live/show.html.heex:97
#: lib/cannery_web/live/container_live/show.html.heex:91
#: lib/cannery_web/live/pack_live/index.html.heex:50
#: lib/cannery_web/live/range_live/index.html.heex:86
#: lib/cannery_web/live/range_live/index.html.heex:83
#: 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/show.html.heex:46
@ -1420,14 +1420,14 @@ msgstr ""
msgid "Used up!"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:42
#: lib/cannery_web/live/range_live/index.ex:40
#: lib/cannery_web/live/pack_live/show.ex:41
#: lib/cannery_web/live/range_live/index.ex:39
#, elixir-autogen, elixir-format
msgid "Edit Shot Record"
msgstr ""
#: lib/cannery_web/live/type_live/index.ex:28
#: lib/cannery_web/live/type_live/show.ex:82
#: lib/cannery_web/live/type_live/show.ex:81
#, elixir-autogen, elixir-format
msgid "Edit %{type_name}"
msgstr ""

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