- add user management to invite page

- harden accounts context
This commit is contained in:
shibao 2022-02-12 02:28:27 -05:00
parent fa55c13c29
commit 272f6729c6
12 changed files with 830 additions and 732 deletions

View File

@ -63,6 +63,19 @@ defmodule Cannery.Accounts do
@spec get_user!(User.t()) :: User.t() @spec get_user!(User.t()) :: User.t()
def get_user!(id), do: Repo.get!(User, id) def get_user!(id), do: Repo.get!(User, id)
@doc """
Returns all users grouped by role.
## Examples
iex> list_users_by_role(%User{id: 123, role: :admin})
[admin: [%User{}], user: [%User{}, %User{}]]
"""
@spec list_all_users_by_role(User.t()) :: %{String.t() => [User.t()]}
def list_all_users_by_role(%User{role: :admin}) do
Repo.all(User) |> Enum.group_by(fn user -> user.role end)
end
@doc """ @doc """
Returns all users for a certain role. Returns all users for a certain role.

View File

@ -0,0 +1,39 @@
defmodule CanneryWeb.Components.InviteCard do
@moduledoc """
Display card for an invite
"""
use CanneryWeb, :component
alias CanneryWeb.Endpoint
def invite_card(assigns) do
~H"""
<div class="px-8 py-4 flex flex-col justify-center items-center space-y-4
border border-gray-400 rounded-lg shadow-lg hover:shadow-md">
<h1 class="title text-xl">
<%= @invite.name %>
</h1>
<%= if @invite.disabled_at |> is_nil() do %>
<h2 class="title text-md">
<%= gettext("Uses Left:") %>
<%= @invite.uses_left || "Unlimited" %>
</h2>
<% else %>
<h2 class="title text-md">
<%= gettext("Invite Disabled") %>
</h2>
<% end %>
<code class="text-xs px-4 py-2 rounded-lg text-gray-100 bg-primary-800"><%= Routes.user_registration_url(Endpoint, :new, invite: @invite.token) %>
</code>
<%= if @inner_block do %>
<div class="flex space-x-4 justify-center items-center">
<%= render_slot(@inner_block) %>
</div>
<% end %>
</div>
"""
end
end

View File

@ -0,0 +1,35 @@
defmodule CanneryWeb.Components.UserCard do
@moduledoc """
Display card for a user
"""
use CanneryWeb, :component
def user_card(assigns) do
~H"""
<div
id={"user-#{@user.id}"}
class="mx-4 my-2 px-8 py-4 flex flex-col justify-center items-center
border border-gray-400 rounded-lg shadow-lg hover:shadow-md"
>
<h1 class="px-4 py-2 rounded-lg title text-xl">
<%= @user.email %>
</h1>
<h3 class="px-4 py-2 rounded-lg title text-lg">
<%= if @user.confirmed_at |> is_nil() do %>
Email unconfirmed
<% else %>
User was confirmed at <%= @user.confirmed_at |> display_datetime() %>
<% end %>
</h3>
<%= if @inner_block do %>
<div class="px-4 py-2 flex space-x-4 justify-center items-center">
<%= render_slot(@inner_block) %>
</div>
<% end %>
</div>
"""
end
end

View File

@ -3,7 +3,7 @@ defmodule CanneryWeb.UserRegistrationController do
import CanneryWeb.Gettext import CanneryWeb.Gettext
alias Cannery.{Accounts, Invites} alias Cannery.{Accounts, Invites}
alias Cannery.Accounts.User alias Cannery.Accounts.User
alias CanneryWeb.{HomeLive, UserAuth} alias CanneryWeb.{Endpoint, HomeLive}
def new(conn, %{"invite" => invite_token}) do def new(conn, %{"invite" => invite_token}) do
invite = Invites.get_invite_by_token(invite_token) invite = Invites.get_invite_by_token(invite_token)
@ -13,7 +13,7 @@ defmodule CanneryWeb.UserRegistrationController do
else else
conn conn
|> put_flash(:error, dgettext("errors", "Sorry, this invite was not found or expired")) |> put_flash(:error, dgettext("errors", "Sorry, this invite was not found or expired"))
|> redirect(to: Routes.live_path(CanneryWeb.Endpoint, HomeLive)) |> redirect(to: Routes.live_path(Endpoint, HomeLive))
end end
end end
@ -23,7 +23,7 @@ defmodule CanneryWeb.UserRegistrationController do
else else
conn conn
|> put_flash(:error, dgettext("errors", "Sorry, public registration is disabled")) |> put_flash(:error, dgettext("errors", "Sorry, public registration is disabled"))
|> redirect(to: Routes.live_path(CanneryWeb.Endpoint, HomeLive)) |> redirect(to: Routes.live_path(Endpoint, HomeLive))
end end
end end
@ -41,7 +41,7 @@ defmodule CanneryWeb.UserRegistrationController do
else else
conn conn
|> put_flash(:error, dgettext("errors", "Sorry, this invite was not found or expired")) |> put_flash(:error, dgettext("errors", "Sorry, this invite was not found or expired"))
|> redirect(to: Routes.live_path(CanneryWeb.Endpoint, HomeLive)) |> redirect(to: Routes.live_path(Endpoint, HomeLive))
end end
end end
@ -51,7 +51,7 @@ defmodule CanneryWeb.UserRegistrationController do
else else
conn conn
|> put_flash(:error, dgettext("errors", "Sorry, public registration is disabled")) |> put_flash(:error, dgettext("errors", "Sorry, public registration is disabled"))
|> redirect(to: Routes.live_path(CanneryWeb.Endpoint, HomeLive)) |> redirect(to: Routes.live_path(Endpoint, HomeLive))
end end
end end
@ -68,8 +68,8 @@ defmodule CanneryWeb.UserRegistrationController do
) )
conn conn
|> put_flash(:info, dgettext("prompts", "User created successfully.")) |> put_flash(:info, dgettext("prompts", "Please check your email to verify your account"))
|> UserAuth.log_in_user(user) |> redirect(to: Routes.user_session_path(Endpoint, :new))
{:error, %Ecto.Changeset{} = changeset} -> {:error, %Ecto.Changeset{} = changeset} ->
render(conn, "new.html", changeset: changeset, invite: invite) render(conn, "new.html", changeset: changeset, invite: invite)

View File

@ -4,9 +4,8 @@ defmodule CanneryWeb.InviteLive.Index do
""" """
use CanneryWeb, :live_view use CanneryWeb, :live_view
import CanneryWeb.Components.{InviteCard, UserCard}
alias Cannery.Invites alias Cannery.{Accounts, Invites, Invites.Invite}
alias Cannery.Invites.Invite
alias CanneryWeb.{Endpoint, HomeLive} alias CanneryWeb.{Endpoint, HomeLive}
@impl true @impl true
@ -44,7 +43,11 @@ defmodule CanneryWeb.InviteLive.Index do
end end
@impl true @impl true
def handle_event("delete", %{"id" => id}, %{assigns: %{current_user: current_user}} = socket) do def handle_event(
"delete_invite",
%{"id" => id},
%{assigns: %{current_user: current_user}} = socket
) do
%{name: invite_name} = %{name: invite_name} =
id |> Invites.get_invite!(current_user) |> Invites.delete_invite!(current_user) id |> Invites.get_invite!(current_user) |> Invites.delete_invite!(current_user)
@ -106,7 +109,30 @@ defmodule CanneryWeb.InviteLive.Index do
{:noreply, socket} {:noreply, socket}
end end
@impl true
def handle_event(
"delete_user",
%{"id" => id},
%{assigns: %{current_user: current_user}} = socket
) do
%{email: user_email} = Accounts.get_user!(id) |> Accounts.delete_user!(current_user)
prompt = dgettext("prompts", "%{name} deleted succesfully", name: user_email)
{:noreply, socket |> put_flash(:info, prompt) |> display_invites()}
end
defp display_invites(%{assigns: %{current_user: current_user}} = socket) do defp display_invites(%{assigns: %{current_user: current_user}} = socket) do
socket |> assign(:invites, Invites.list_invites(current_user)) invites = Invites.list_invites(current_user)
all_users = Accounts.list_all_users_by_role(current_user)
admins =
all_users
|> Map.get(:admin, [])
|> Enum.reject(fn %{id: user_id} -> user_id == current_user.id end)
users = all_users |> Map.get(:user, [])
socket |> assign(invites: invites, admins: admins, users: users)
end end
end end

View File

@ -0,0 +1,136 @@
<div class="flex flex-col space-y-8 justify-center items-center">
<h1 class="title text-2xl title-primary-500">
<%= gettext("Listing Invites") %>
</h1>
<%= if @invites |> Enum.empty?() do %>
<h1 class="title text-xl text-primary-500">
<%= gettext("No invites") %> 😔
</h1>
<%= live_patch(dgettext("actions", "Invite someone new!"),
to: Routes.invite_index_path(@socket, :new),
class: "btn btn-primary"
) %>
<% else %>
<%= live_patch(dgettext("actions", "Create Invite"),
to: Routes.invite_index_path(@socket, :new),
class: "btn btn-primary"
) %>
<% end %>
<div class="flex flex-row flex-wrap space-x-4 space-y-4">
<%= for invite <- @invites do %>
<.invite_card invite={invite}>
<%= live_patch to: Routes.invite_index_path(Endpoint, :edit, invite),
class: "text-primary-500 link" do %>
<i class="fa-fw fa-lg fas fa-edit"></i>
<% end %>
<%= link to: "#",
class: "text-primary-500 link",
phx_click: "delete_invite",
phx_value_id: invite.id,
data: [
confirm:
dgettext("prompts", "Are you sure you want to delete the invite for %{name}?",
name: invite.name
)
] do %>
<i class="fa-fw fa-lg fas fa-trash"></i>
<% end %>
<%= if invite.disabled_at |> is_nil() do %>
<a href="#" class="btn btn-primary" phx-click="disable_invite" phx-value-id={invite.id}>
<%= gettext("Disable") %>
</a>
<% else %>
<a href="#" class="btn btn-primary" phx-click="enable_invite" phx-value-id={invite.id}>
<%= gettext("Enable") %>
</a>
<% end %>
<%= if invite.disabled_at |> is_nil() and not (invite.uses_left |> is_nil()) do %>
<a
href="#"
class="btn btn-primary"
phx-click="set_unlimited"
phx-value-id={invite.id}
data-confirm={dgettext("prompts", "Are you sure you want to make %{name} unlimited?", name: invite.name)}
>
<%= gettext("Set Unlimited") %>
</a>
<% end %>
</.invite_card>
<% end %>
</div>
<%= unless @admins |> Enum.empty?() do %>
<hr class="hr">
<div class="flex flex-col justify-center items-center space-y-4">
<h1 class="title text-xl text-primary-500">
<%= gettext("Admins") %>
</h1>
<%= for admin <- @admins do %>
<.user_card user={admin}>
<%= link to: "#",
class: "text-primary-500 link",
phx_click: "delete_user",
phx_value_id: admin.id,
data: [
confirm:
dgettext(
"prompts",
"Are you sure you want to delete %{email}? This action is permanent!",
email: admin.email
)
] do %>
<i class="fa-fw fa-lg fas fa-trash"></i>
<% end %>
</.user_card>
<% end %>
</div>
<% end %>
<%= unless @users |> Enum.empty?() do %>
<hr class="hr">
<div class="flex flex-col justify-center items-center space-y-4">
<h1 class="title text-xl text-primary-500">
<%= gettext("Users") %>
</h1>
<%= for user <- @users do %>
<.user_card user={user}>
<%= link to: "#",
class: "text-primary-500 link",
phx_click: "delete_user",
phx_value_id: user.id,
data: [
confirm:
dgettext(
"prompts",
"Are you sure you want to delete %{email}? This action is permanent!",
email: user.email
)
] do %>
<i class="fa-fw fa-lg fas fa-trash"></i>
<% end %>
</.user_card>
<% end %>
</div>
<% end %>
</div>
<%= if @live_action in [:new, :edit] do %>
<%= live_modal(CanneryWeb.InviteLive.FormComponent,
id: @invite.id || :new,
title: @page_title,
action: @live_action,
invite: @invite,
return_to: Routes.invite_index_path(@socket, :index),
current_user: @current_user
) %>
<% end %>

View File

@ -1,90 +0,0 @@
<div class="flex flex-col space-y-8 justify-center items-center">
<h1 class="title text-2xl title-primary-500">
<%= gettext("Listing Invites") %>
</h1>
<%= if @invites |> Enum.empty?() do %>
<h1 class="title text-xl text-primary-500">
<%= gettext("No invites") %> 😔
</h1>
<%= live_patch dgettext("actions", "Invite someone new!"),
to: Routes.invite_index_path(@socket, :new),
class: "btn btn-primary" %>
<% else %>
<%= live_patch dgettext("actions", "Create Invite"),
to: Routes.invite_index_path(@socket, :new),
class: "btn btn-primary" %>
<% end %>
<div class="flex flex-row flex-wrap space-x-4 space-y-4">
<%= for invite <- @invites do %>
<div class="px-8 py-4 flex flex-col justify-center items-center space-y-4
border border-gray-400 rounded-lg shadow-lg hover:shadow-md">
<h1 class="title text-xl">
<%= invite.name %>
</h1>
<%= if invite.disabled_at |> is_nil() do %>
<h2 class="title text-md">
<%= gettext("Uses Left:") %>
<%= invite.uses_left || "Unlimited" %>
</h2>
<% else %>
<h2 class="title text-md">
<%= gettext("Invite Disabled") %>
</h2>
<% end %>
<code class="text-xs px-4 py-2 rounded-lg text-gray-100 bg-primary-800">
<%= Routes.user_registration_url(@socket, :new, invite: invite.token) %>
</code>
<div class="flex space-x-4 justify-center items-center">
<%= live_patch to: Routes.invite_index_path(@socket, :edit, invite),
class: "text-primary-500 link" do %>
<i class="fa-fw fa-lg fas fa-edit"></i>
<% end %>
<%= link to: "#",
class: "text-primary-500 link",
phx_click: "delete",
phx_value_id: invite.id,
data: [confirm: dgettext("prompts", "Are you sure you want to delete the invite for %{name}?", name: invite.name)] do %>
<i class="fa-fw fa-lg fas fa-trash"></i>
<% end %>
<%= if invite.disabled_at |> is_nil() do %>
<a href="#" class="btn btn-primary"
phx-click="disable" phx-value-id="<%= invite.id %>">
<%= gettext("Disable") %>
</a>
<% else %>
<a href="#" class="btn btn-primary"
phx-click="enable" phx-value-id="<%= invite.id %>">
<%= gettext("Enable") %>
</a>
<% end %>
<%= if invite.disabled_at |> is_nil() and not(invite.uses_left |> is_nil()) do %>
<a href="#" class="btn btn-primary"
phx-click="set_unlimited" phx-value-id="<%= invite.id %>"
data-confirm={dgettext("prompts", "Are you sure you want to make %{name} unlimited?", name: invite.name)}>
<%= gettext("Set Unlimited") %>
</a>
<% end %>
</div>
</div>
<% end %>
</div>
</div>
<%= if @live_action in [:new, :edit] do %>
<%= live_modal CanneryWeb.InviteLive.FormComponent,
id: @invite.id || :new,
title: @page_title,
action: @live_action,
invite: @invite,
return_to: Routes.invite_index_path(@socket, :index),
current_user: @current_user %>
<% end %>

View File

@ -11,27 +11,23 @@ msgid ""
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/components/topbar.ex:96 #: lib/cannery_web/live/ammo_group_live/index.ex:28
#: lib/cannery_web/templates/layout/topbar.html.heex:36 msgid "Add Ammo"
#: lib/cannery_web/templates/user_confirmation/new.html.heex:26
#: lib/cannery_web/templates/user_registration/new.html.heex:39
#: lib/cannery_web/templates/user_reset_password/edit.html.heex:41
#: lib/cannery_web/templates/user_reset_password/new.html.heex:27
#: lib/cannery_web/templates/user_session/new.html.heex:3
#: lib/cannery_web/templates/user_session/new.html.heex:35
msgid "Log in"
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/components/topbar.ex:89 #: lib/cannery_web/live/ammo_group_live/index.html.heex:11
#: lib/cannery_web/templates/layout/topbar.html.heex:28 msgid "Add your first box!"
#: lib/cannery_web/templates/user_confirmation/new.html.heex:21 msgstr ""
#: lib/cannery_web/templates/user_registration/new.html.heex:3
#: lib/cannery_web/templates/user_registration/new.html.heex:34 #, elixir-format, ex-autogen
#: lib/cannery_web/templates/user_reset_password/edit.html.heex:36 #: lib/cannery_web/live/container_live/index.html.heex:11
#: lib/cannery_web/templates/user_reset_password/new.html.heex:22 msgid "Add your first container!"
#: lib/cannery_web/templates/user_session/new.html.heex:41 msgstr ""
msgid "Register"
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/index.html.heex:11
msgid "Add your first type!"
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
@ -46,6 +42,11 @@ msgstr ""
msgid "Change password" msgid "Change password"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.html.heex:16
msgid "Create Invite"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/templates/user_settings/edit.html.heex:100 #: lib/cannery_web/templates/user_settings/edit.html.heex:100
msgid "Delete User" msgid "Delete User"
@ -58,6 +59,60 @@ msgstr ""
msgid "Forgot your password?" msgid "Forgot your password?"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.html.heex:11
msgid "Invite someone new!"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/components/topbar.ex:96
#: lib/cannery_web/templates/layout/topbar.html.heex:36
#: lib/cannery_web/templates/user_confirmation/new.html.heex:26
#: lib/cannery_web/templates/user_registration/new.html.heex:39
#: lib/cannery_web/templates/user_reset_password/edit.html.heex:41
#: lib/cannery_web/templates/user_reset_password/new.html.heex:27
#: lib/cannery_web/templates/user_session/new.html.heex:3
#: lib/cannery_web/templates/user_session/new.html.heex:35
msgid "Log in"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/tag_live/index.html.heex:13
msgid "Make your first tag!"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/index.html.heex:16
msgid "New Ammo group"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/index.html.heex:16
msgid "New Ammo type"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/container_live/index.html.heex:16
msgid "New Container"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/tag_live/index.html.heex:18
msgid "New Tag"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/components/topbar.ex:89
#: lib/cannery_web/templates/layout/topbar.html.heex:28
#: lib/cannery_web/templates/user_confirmation/new.html.heex:21
#: lib/cannery_web/templates/user_registration/new.html.heex:3
#: lib/cannery_web/templates/user_registration/new.html.heex:34
#: lib/cannery_web/templates/user_reset_password/edit.html.heex:36
#: lib/cannery_web/templates/user_reset_password/new.html.heex:22
#: lib/cannery_web/templates/user_session/new.html.heex:41
msgid "Register"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/templates/user_confirmation/new.html.heex:3 #: lib/cannery_web/templates/user_confirmation/new.html.heex:3
#: lib/cannery_web/templates/user_confirmation/new.html.heex:15 #: lib/cannery_web/templates/user_confirmation/new.html.heex:15
@ -70,26 +125,6 @@ msgstr ""
msgid "Reset password" msgid "Reset password"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/templates/user_reset_password/new.html.heex:16
msgid "Send instructions to reset password"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/index.ex:28
msgid "Add Ammo"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/index.html.heex:11
msgid "Add your first box!"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/index.html.heex:16
msgid "New Ammo group"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/form_component.ex:102 #: lib/cannery_web/live/ammo_group_live/form_component.ex:102
#: lib/cannery_web/live/ammo_type_live/form_component.ex:161 #: lib/cannery_web/live/ammo_type_live/form_component.ex:161
@ -99,47 +134,12 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/templates/user_reset_password/new.html.heex:16
msgid "Send instructions to reset password"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/index.html.heex:56 #: lib/cannery_web/live/ammo_group_live/index.html.heex:56
msgid "View" msgid "View"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/index.html.heex:11
msgid "Add your first type!"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/index.html.heex:16
msgid "New Ammo type"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/container_live/index.html.heex:11
msgid "Add your first container!"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/container_live/index.html.heex:16
msgid "New Container"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.html.leex:15
msgid "Create Invite"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.html.leex:11
msgid "Invite someone new!"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/tag_live/index.html.heex:18
msgid "New Tag"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/tag_live/index.html.heex:13
msgid "Make your first tag!"
msgstr ""

View File

@ -21,33 +21,8 @@ msgid "Access from any internet-capable device"
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/home_live.ex:85 #: lib/cannery_web/live/invite_live/index.html.heex:73
msgid "Instance Information" msgid "Admins"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/home_live.ex:116
msgid "Invite Only"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/home_live.ex:115
msgid "Public Signups"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/home_live.ex:39
msgid "Welcome to %{name}"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/home_live.ex:67
msgid "Your data stays with you, period"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/home_live.ex:43
msgid "The self-hosted firearm tracker website"
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
@ -55,133 +30,11 @@ msgstr ""
msgid "Admins:" msgid "Admins:"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/home_live.ex:52
msgid "Easy to Use:"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/home_live.ex:63
msgid "Secure:"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/home_live.ex:73
msgid "Simple:"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/home_live.ex:66
msgid "Self-host your own instance, or use an instance from someone you trust."
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/components/topbar.ex:47 #: lib/cannery_web/components/topbar.ex:47
msgid "Ammo" msgid "Ammo"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/components/topbar.ex:41
msgid "Containers"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/components/topbar.ex:60
msgid "Invites"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/components/topbar.ex:53
msgid "Manage"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/components/topbar.ex:35
msgid "Tags"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/templates/user_session/new.html.heex:29
msgid "Keep me logged in for 60 days"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/templates/user_settings/edit.html.heex:3
msgid "Settings"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/form_component.ex:75
#: lib/cannery_web/live/ammo_group_live/index.html.heex:26
msgid "Count"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/components/ammo_group_card.ex:28
#: lib/cannery_web/live/ammo_group_live/show.html.heex:8
msgid "Count:"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/index.ex:22
#: lib/cannery_web/live/ammo_group_live/show.ex:40
msgid "Edit Ammo group"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/index.html.heex:3
msgid "Listing Ammo"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/index.ex:33
msgid "Listing Ammo groups"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/index.html.heex:8
msgid "No Ammo"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/form_component.ex:89
#: lib/cannery_web/live/ammo_group_live/index.html.heex:32
msgid "Notes"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/components/ammo_group_card.ex:34
#: lib/cannery_web/live/ammo_group_live/show.html.heex:14
msgid "Notes:"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/form_component.ex:82
#: lib/cannery_web/live/ammo_group_live/index.html.heex:29
msgid "Price paid"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/components/ammo_group_card.ex:41
#: lib/cannery_web/live/ammo_group_live/show.html.heex:21
msgid "Price paid:"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/show.ex:39
msgid "Show Ammo group"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/show.html.heex:45
msgid "Stored in"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/show.html.heex:50
msgid "This ammo group is not in a container"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/form_component.ex:69 #: lib/cannery_web/live/ammo_group_live/form_component.ex:69
msgid "Ammo type" msgid "Ammo type"
@ -192,6 +45,11 @@ msgstr ""
msgid "Average Price paid" msgid "Average Price paid"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/tag_live/form_component.ex:54
msgid "Background color"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/form_component.ex:145 #: lib/cannery_web/live/ammo_type_live/form_component.ex:145
#: lib/cannery_web/live/ammo_type_live/index.html.heex:38 #: lib/cannery_web/live/ammo_type_live/index.html.heex:38
@ -243,24 +101,84 @@ msgstr ""
msgid "Container" msgid "Container"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/components/topbar.ex:41
msgid "Containers"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/form_component.ex:149 #: lib/cannery_web/live/ammo_type_live/form_component.ex:149
#: lib/cannery_web/live/ammo_type_live/index.html.heex:39 #: lib/cannery_web/live/ammo_type_live/index.html.heex:39
msgid "Corrosive" msgid "Corrosive"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/form_component.ex:75
#: lib/cannery_web/live/ammo_group_live/index.html.heex:26
msgid "Count"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/components/ammo_group_card.ex:28
#: lib/cannery_web/live/ammo_group_live/show.html.heex:8
msgid "Count:"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/form_component.ex:63 #: lib/cannery_web/live/ammo_type_live/form_component.ex:63
#: lib/cannery_web/live/container_live/form_component.ex:67 #: lib/cannery_web/live/container_live/form_component.ex:67
msgid "Description" msgid "Description"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/components/container_card.ex:26
#: lib/cannery_web/live/container_live/show.html.heex:8
msgid "Description:"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.html.heex:45
msgid "Disable"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/home_live.ex:52
msgid "Easy to Use:"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/index.ex:22
#: lib/cannery_web/live/ammo_group_live/show.ex:40
msgid "Edit Ammo group"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/index.ex:23 #: lib/cannery_web/live/ammo_type_live/index.ex:23
#: lib/cannery_web/live/ammo_type_live/show.ex:46 #: lib/cannery_web/live/ammo_type_live/show.ex:46
msgid "Edit Ammo type" msgid "Edit Ammo type"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/container_live/index.ex:23
#: lib/cannery_web/live/container_live/show.ex:67
msgid "Edit Container"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.ex:34
msgid "Edit Invite"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/tag_live/index.ex:23
msgid "Edit Tag"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.html.heex:49
msgid "Enable"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/form_component.ex:74 #: lib/cannery_web/live/ammo_type_live/form_component.ex:74
msgid "Example bullet type abbreviations" msgid "Example bullet type abbreviations"
@ -284,110 +202,69 @@ msgstr ""
msgid "Incendiary" msgid "Incendiary"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/home_live.ex:85
msgid "Instance Information"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/components/invite_card.ex:24
msgid "Invite Disabled"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/home_live.ex:116
msgid "Invite Only"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/components/topbar.ex:60
msgid "Invites"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/templates/user_session/new.html.heex:29
msgid "Keep me logged in for 60 days"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/index.html.heex:3
msgid "Listing Ammo"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/index.html.heex:3 #: lib/cannery_web/live/ammo_type_live/index.html.heex:3
msgid "Listing Ammo Types" msgid "Listing Ammo Types"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/index.ex:33
msgid "Listing Ammo groups"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/index.ex:34 #: lib/cannery_web/live/ammo_type_live/index.ex:34
msgid "Listing Ammo types" msgid "Listing Ammo types"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/form_component.ex:153
#: lib/cannery_web/live/ammo_type_live/index.html.heex:40
msgid "Manufacturer"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/form_component.ex:59
#: lib/cannery_web/live/ammo_type_live/index.html.heex:26
#: lib/cannery_web/live/container_live/form_component.ex:60
#: lib/cannery_web/live/invite_live/form_component.ex:55
#: lib/cannery_web/live/tag_live/form_component.ex:50
msgid "Name"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/index.ex:29
msgid "New Ammo type"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/index.html.heex:8
msgid "No Ammo Types"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/show.html.heex:99
msgid "No ammo for this type"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/form_component.ex:119
#: lib/cannery_web/live/ammo_type_live/index.html.heex:33
#: lib/cannery_web/live/ammo_type_live/show.html.heex:42
msgid "Pressure"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/form_component.ex:126
#: lib/cannery_web/live/ammo_type_live/index.html.heex:34
#: lib/cannery_web/live/ammo_type_live/show.html.heex:43
msgid "Primer type"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/form_component.ex:133
#: lib/cannery_web/live/ammo_type_live/index.html.heex:35
msgid "Rimfire"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/form_component.ex:157
msgid "SKU"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/show.ex:45
msgid "Show Ammo type"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/index.html.heex:41
msgid "Sku"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/form_component.ex:86
msgid "Steel"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/form_component.ex:137
#: lib/cannery_web/live/ammo_type_live/index.html.heex:36
msgid "Tracer"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/components/container_card.ex:26
#: lib/cannery_web/live/container_live/show.html.heex:8
msgid "Description:"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/container_live/index.ex:23
#: lib/cannery_web/live/container_live/show.ex:67
msgid "Edit Container"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/container_live/index.ex:32 #: lib/cannery_web/live/container_live/index.ex:32
#: lib/cannery_web/live/container_live/index.html.heex:3 #: lib/cannery_web/live/container_live/index.html.heex:3
msgid "Listing Containers" msgid "Listing Containers"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.ex:42
#: lib/cannery_web/live/invite_live/index.html.heex:3
msgid "Listing Invites"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/tag_live/index.ex:34
#: lib/cannery_web/live/tag_live/index.html.heex:3
msgid "Listing Tags"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/container_live/form_component.ex:82 #: lib/cannery_web/live/container_live/form_component.ex:82
msgid "Location" msgid "Location"
@ -404,6 +281,17 @@ msgstr ""
msgid "Magazine, Clip, Ammo Box, etc" msgid "Magazine, Clip, Ammo Box, etc"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/components/topbar.ex:53
msgid "Manage"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/form_component.ex:153
#: lib/cannery_web/live/ammo_type_live/index.html.heex:40
msgid "Manufacturer"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/container_live/form_component.ex:71 #: lib/cannery_web/live/container_live/form_component.ex:71
msgid "Metal ammo can with the anime girl sticker" msgid "Metal ammo can with the anime girl sticker"
@ -414,11 +302,50 @@ msgstr ""
msgid "My cool ammo can" msgid "My cool ammo can"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/form_component.ex:59
#: lib/cannery_web/live/ammo_type_live/index.html.heex:26
#: lib/cannery_web/live/container_live/form_component.ex:60
#: lib/cannery_web/live/invite_live/form_component.ex:55
#: lib/cannery_web/live/tag_live/form_component.ex:50
msgid "Name"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/index.ex:29
msgid "New Ammo type"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/container_live/index.ex:28 #: lib/cannery_web/live/container_live/index.ex:28
msgid "New Container" msgid "New Container"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.ex:38
msgid "New Invite"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/tag_live/index.ex:29
msgid "New Tag"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/index.html.heex:8
msgid "No Ammo"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/index.html.heex:8
msgid "No Ammo Types"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/show.html.heex:99
msgid "No ammo for this type"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/container_live/show.html.heex:46 #: lib/cannery_web/live/container_live/show.html.heex:46
msgid "No ammo groups in this container" msgid "No ammo groups in this container"
@ -429,16 +356,161 @@ msgstr ""
msgid "No containers" msgid "No containers"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.html.heex:8
msgid "No invites"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/tag_live/index.html.heex:10
msgid "No tags"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/form_component.ex:89
#: lib/cannery_web/live/ammo_group_live/index.html.heex:32
msgid "Notes"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/components/ammo_group_card.ex:34
#: lib/cannery_web/live/ammo_group_live/show.html.heex:14
msgid "Notes:"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/container_live/form_component.ex:86 #: lib/cannery_web/live/container_live/form_component.ex:86
msgid "On the bookshelf" msgid "On the bookshelf"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/form_component.ex:119
#: lib/cannery_web/live/ammo_type_live/index.html.heex:33
#: lib/cannery_web/live/ammo_type_live/show.html.heex:42
msgid "Pressure"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/form_component.ex:82
#: lib/cannery_web/live/ammo_group_live/index.html.heex:29
msgid "Price paid"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/components/ammo_group_card.ex:41
#: lib/cannery_web/live/ammo_group_live/show.html.heex:21
msgid "Price paid:"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/form_component.ex:126
#: lib/cannery_web/live/ammo_type_live/index.html.heex:34
#: lib/cannery_web/live/ammo_type_live/show.html.heex:43
msgid "Primer type"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/home_live.ex:115
msgid "Public Signups"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/form_component.ex:133
#: lib/cannery_web/live/ammo_type_live/index.html.heex:35
msgid "Rimfire"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/form_component.ex:157
msgid "SKU"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/home_live.ex:63
msgid "Secure:"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/home_live.ex:66
msgid "Self-host your own instance, or use an instance from someone you trust."
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.html.heex:61
msgid "Set Unlimited"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/templates/user_settings/edit.html.heex:3
msgid "Settings"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/show.ex:39
msgid "Show Ammo group"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/show.ex:45
msgid "Show Ammo type"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/container_live/show.ex:66 #: lib/cannery_web/live/container_live/show.ex:66
msgid "Show Container" msgid "Show Container"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/home_live.ex:73
msgid "Simple:"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/index.html.heex:41
msgid "Sku"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/form_component.ex:86
msgid "Steel"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/show.html.heex:45
msgid "Stored in"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/components/topbar.ex:35
msgid "Tags"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/tag_live/index.html.heex:6
msgid "Tags can be added to your containers to help you organize"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/tag_live/form_component.ex:60
msgid "Text color"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/home_live.ex:43
msgid "The self-hosted firearm tracker website"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/show.html.heex:50
msgid "This ammo group is not in a container"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/form_component.ex:137
#: lib/cannery_web/live/ammo_type_live/index.html.heex:36
msgid "Tracer"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/container_live/form_component.ex:75 #: lib/cannery_web/live/container_live/form_component.ex:75
msgid "Type" msgid "Type"
@ -451,84 +523,12 @@ msgid "Type:"
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/tag_live/form_component.ex:54 #: lib/cannery_web/live/invite_live/index.html.heex:102
msgid "Background color" msgid "Users"
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.html.leex:60 #: lib/cannery_web/components/invite_card.ex:19
msgid "Disable"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.ex:35
msgid "Edit Invite"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/tag_live/index.ex:23
msgid "Edit Tag"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.html.leex:65
msgid "Enable"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.html.leex:35
msgid "Invite Disabled"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.ex:43
#: lib/cannery_web/live/invite_live/index.html.leex:3
msgid "Listing Invites"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/tag_live/index.ex:34
#: lib/cannery_web/live/tag_live/index.html.heex:3
msgid "Listing Tags"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.ex:39
msgid "New Invite"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/tag_live/index.ex:29
msgid "New Tag"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.html.leex:8
msgid "No invites"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/tag_live/index.html.heex:10
msgid "No tags"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.html.leex:73
msgid "Set Unlimited"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/tag_live/index.html.heex:6
msgid "Tags can be added to your containers to help you organize"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/tag_live/form_component.ex:60
msgid "Text color"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.html.leex:30
msgid "Uses Left:" msgid "Uses Left:"
msgstr "" msgstr ""
@ -536,3 +536,13 @@ msgstr ""
#: lib/cannery_web/live/invite_live/form_component.ex:59 #: lib/cannery_web/live/invite_live/form_component.ex:59
msgid "Uses left" msgid "Uses left"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/home_live.ex:39
msgid "Welcome to %{name}"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/home_live.ex:67
msgid "Your data stays with you, period"
msgstr ""

View File

@ -10,31 +10,11 @@
msgid "" msgid ""
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/templates/layout/email.html.heex:13
msgid "This email was sent from %{name}"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/templates/layout/email.txt.eex:10
msgid "This email was sent from %{name} at %{url}"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery/accounts/email.ex:30 #: lib/cannery/accounts/email.ex:30
msgid "Confirm your %{name} account" msgid "Confirm your %{name} account"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery/accounts/email.ex:37
msgid "Reset your %{name} password"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery/accounts/email.ex:44
msgid "Update your %{name} email"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/templates/email/confirm_email.html.eex:2 #: lib/cannery_web/templates/email/confirm_email.html.eex:2
#: lib/cannery_web/templates/email/confirm_email.txt.eex:2 #: lib/cannery_web/templates/email/confirm_email.txt.eex:2
@ -59,6 +39,26 @@ msgstr ""
msgid "If you didn't request this change from %{url}, please ignore this." msgid "If you didn't request this change from %{url}, please ignore this."
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery/accounts/email.ex:37
msgid "Reset your %{name} password"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/templates/layout/email.html.heex:13
msgid "This email was sent from %{name}"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/templates/layout/email.txt.eex:10
msgid "This email was sent from %{name} at %{url}"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery/accounts/email.ex:44
msgid "Update your %{name} email"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/templates/email/confirm_email.html.eex:4 #: lib/cannery_web/templates/email/confirm_email.html.eex:4
msgid "Welcome to %{name}!" msgid "Welcome to %{name}!"

View File

@ -1,116 +1,34 @@
## This is a PO Template file. ## This file is a PO Template file.
## ##
## `msgid`s here are often extracted from source code. ## "msgid"s here are often extracted from source code.
## Add new translations manually only if they're dynamic ## Add new translations manually only if they're dynamic
## translations that can't be statically extracted. ## translations that can't be statically extracted.
## ##
## Run `mix gettext.extract` to bring this file up to ## Run "mix gettext.extract" to bring this file up to
## date. Leave `msgstr`s empty as changing them here has no ## date. Leave "msgstr"s empty as changing them here has no
## effect: edit them in PO (`.po`) files instead. ## effect: edit them in PO (.po) files instead.
## From Ecto.Changeset.cast/4 msgid ""
msgid "can't be blank"
msgstr ""
## From Ecto.Changeset.unique_constraint/3
msgid "has already been taken"
msgstr ""
## From Ecto.Changeset.put_change/3
msgid "is invalid"
msgstr ""
## From Ecto.Changeset.validate_acceptance/3
msgid "must be accepted"
msgstr ""
## From Ecto.Changeset.validate_format/3
msgid "has invalid format"
msgstr ""
## From Ecto.Changeset.validate_subset/3
msgid "has an invalid entry"
msgstr ""
## From Ecto.Changeset.validate_exclusion/3
msgid "is reserved"
msgstr ""
## From Ecto.Changeset.validate_confirmation/3
msgid "does not match confirmation"
msgstr ""
## From Ecto.Changeset.no_assoc_constraint/3
msgid "is still associated with this entry"
msgstr ""
msgid "are still associated with this entry"
msgstr ""
## From Ecto.Changeset.validate_length/3
msgid "should be %{count} character(s)"
msgid_plural "should be %{count} character(s)"
msgstr[0] ""
msgstr[1] ""
msgid "should have %{count} item(s)"
msgid_plural "should have %{count} item(s)"
msgstr[0] ""
msgstr[1] ""
msgid "should be at least %{count} character(s)"
msgid_plural "should be at least %{count} character(s)"
msgstr[0] ""
msgstr[1] ""
msgid "should have at least %{count} item(s)"
msgid_plural "should have at least %{count} item(s)"
msgstr[0] ""
msgstr[1] ""
msgid "should be at most %{count} character(s)"
msgid_plural "should be at most %{count} character(s)"
msgstr[0] ""
msgstr[1] ""
msgid "should have at most %{count} item(s)"
msgid_plural "should have at most %{count} item(s)"
msgstr[0] ""
msgstr[1] ""
## From Ecto.Changeset.validate_number/3
msgid "must be less than %{number}"
msgstr ""
msgid "must be greater than %{number}"
msgstr ""
msgid "must be less than or equal to %{number}"
msgstr ""
msgid "must be greater than or equal to %{number}"
msgstr ""
msgid "must be equal to %{number}"
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery/accounts/user.ex:128 #: lib/cannery/containers.ex:105
msgid "did not change" msgid "Container must be empty before deleting"
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery/accounts/user.ex:149 #: lib/cannery_web/live/container_live/index.ex:54
msgid "does not match password" #: lib/cannery_web/live/container_live/show.ex:52
msgid "Could not delete %{name}: %{error}"
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery/accounts/user.ex:186 #: lib/cannery_web/live/container_live/index.ex:42
msgid "is not valid" msgid "Could not find that container"
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery/accounts/user.ex:82 #: lib/cannery_web/controllers/user_settings_controller.ex:67
msgid "must have the @ sign and no spaces" msgid "Email change link is invalid or it has expired."
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
@ -118,32 +36,14 @@ msgstr ""
msgid "Error" msgid "Error"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/views/error_view.ex:11
msgid "Internal Server Error"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/views/error_view.ex:9
msgid "Not found"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/views/error_view.ex:10
msgid "Unauthorized"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/templates/error/error.html.heex:28 #: lib/cannery_web/templates/error/error.html.heex:28
msgid "Go back home" msgid "Go back home"
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/templates/user_registration/new.html.heex:13 #: lib/cannery_web/views/error_view.ex:11
#: lib/cannery_web/templates/user_reset_password/edit.html.heex:13 msgid "Internal Server Error"
#: lib/cannery_web/templates/user_settings/edit.html.heex:17
#: lib/cannery_web/templates/user_settings/edit.html.heex:58
msgid "Oops, something went wrong! Please check the errors below."
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
@ -152,8 +52,16 @@ msgid "Invalid email or password"
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/controllers/user_settings_controller.ex:67 #: lib/cannery_web/views/error_view.ex:9
msgid "Email change link is invalid or it has expired." msgid "Not found"
msgstr ""
#, elixir-format, ex-autogen
#: 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:17
#: lib/cannery_web/templates/user_settings/edit.html.heex:58
msgid "Oops, something went wrong! Please check the errors below."
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
@ -178,11 +86,21 @@ msgstr ""
msgid "Unable to delete user" msgid "Unable to delete user"
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/views/error_view.ex:10
msgid "Unauthorized"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/controllers/user_confirmation_controller.ex:53 #: lib/cannery_web/controllers/user_confirmation_controller.ex:53
msgid "User confirmation link is invalid or it has expired." msgid "User confirmation link is invalid or it has expired."
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.ex:19
msgid "You are not authorized to view this page"
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/controllers/user_auth.ex:160 #: lib/cannery_web/controllers/user_auth.ex:160
msgid "You are not authorized to view this page." msgid "You are not authorized to view this page."
@ -194,22 +112,21 @@ msgid "You must log in to access this page."
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/container_live/index.ex:42 #: lib/cannery/accounts/user.ex:128
msgid "Could not find that container" msgid "did not change"
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery/containers.ex:105 #: lib/cannery/accounts/user.ex:149
msgid "Container must be empty before deleting" msgid "does not match password"
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/container_live/index.ex:54 #: lib/cannery/accounts/user.ex:186
#: lib/cannery_web/live/container_live/show.ex:52 msgid "is not valid"
msgid "Could not delete %{name}: %{error}"
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.ex:20 #: lib/cannery/accounts/user.ex:82
msgid "You are not authorized to view this page" msgid "must have the @ sign and no spaces"
msgstr "" msgstr ""

View File

@ -11,8 +11,101 @@ msgid ""
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/home_live.ex:94 #: lib/cannery_web/live/ammo_type_live/form_component.ex:193
msgid "Register to setup %{name}" #: lib/cannery_web/live/container_live/form_component.ex:126
#: lib/cannery_web/live/invite_live/form_component.ex:98
#: lib/cannery_web/live/tag_live/form_component.ex:101
msgid "%{name} created successfully"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/index.ex:41
#: lib/cannery_web/live/ammo_type_live/show.ex:39
#: lib/cannery_web/live/invite_live/index.ex:54
#: lib/cannery_web/live/invite_live/index.ex:120
#: lib/cannery_web/live/tag_live/index.ex:41
msgid "%{name} deleted succesfully"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.ex:102
msgid "%{name} disabled succesfully"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.ex:84
msgid "%{name} enabled succesfully"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/container_live/index.ex:47
#: lib/cannery_web/live/container_live/show.ex:42
msgid "%{name} has been deleted"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.ex:68
msgid "%{name} updated succesfully"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/form_component.ex:179
#: lib/cannery_web/live/container_live/form_component.ex:108
#: lib/cannery_web/live/invite_live/form_component.ex:80
#: lib/cannery_web/live/tag_live/form_component.ex:83
msgid "%{name} updated successfully"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/controllers/user_settings_controller.ex:28
msgid "A link to confirm your email change has been sent to the new address."
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/form_component.ex:151
msgid "Ammo group created successfully"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/index.ex:40
#: lib/cannery_web/live/ammo_group_live/show.ex:33
msgid "Ammo group deleted succesfully"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/form_component.ex:133
msgid "Ammo group updated successfully"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.html.heex:84
#: lib/cannery_web/live/invite_live/index.html.heex:113
msgid "Are you sure you want to delete %{email}? This action is permanent!"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/show.html.heex:26
#: lib/cannery_web/live/container_live/index.html.heex:36
#: lib/cannery_web/live/container_live/show.html.heex:36
#: lib/cannery_web/live/tag_live/index.html.heex:36
msgid "Are you sure you want to delete %{name}?"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.html.heex:36
msgid "Are you sure you want to delete the invite for %{name}?"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/index.html.heex:69
#: lib/cannery_web/live/ammo_group_live/show.html.heex:35
#: lib/cannery_web/live/ammo_type_live/index.html.heex:104
msgid "Are you sure you want to delete this ammo?"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/templates/user_settings/edit.html.heex:104
msgid "Are you sure you want to delete your account?"
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
@ -22,13 +115,8 @@ msgid "Are you sure you want to log out?"
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/templates/user_settings/edit.html.heex:104 #: lib/cannery_web/live/invite_live/index.html.heex:59
msgid "Are you sure you want to delete your account?" msgid "Are you sure you want to make %{name} unlimited?"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/controllers/user_settings_controller.ex:28
msgid "A link to confirm your email change has been sent to the new address."
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
@ -61,36 +149,14 @@ msgstr ""
msgid "Password updated successfully." msgid "Password updated successfully."
msgstr "" msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/controllers/user_confirmation_controller.ex:37
msgid "User confirmed successfully."
msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/controllers/user_registration_controller.ex:71 #: lib/cannery_web/controllers/user_registration_controller.ex:71
msgid "User created successfully." msgid "Please check your email to verify your account"
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/controllers/user_settings_controller.ex:78 #: lib/cannery_web/live/home_live.ex:94
msgid "Your account has been deleted" msgid "Register to setup %{name}"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/form_component.ex:151
msgid "Ammo group created successfully"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/form_component.ex:133
msgid "Ammo group updated successfully"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/index.html.heex:69
#: lib/cannery_web/live/ammo_group_live/show.html.heex:35
#: lib/cannery_web/live/ammo_type_live/index.html.heex:104
msgid "Are you sure you want to delete this ammo?"
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
@ -103,65 +169,11 @@ msgid "Saving..."
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/show.html.heex:26 #: lib/cannery_web/controllers/user_confirmation_controller.ex:37
#: lib/cannery_web/live/container_live/index.html.heex:36 msgid "User confirmed successfully."
#: lib/cannery_web/live/container_live/show.html.heex:36
#: lib/cannery_web/live/tag_live/index.html.heex:36
msgid "Are you sure you want to delete %{name}?"
msgstr "" msgstr ""
#, elixir-format, ex-autogen #, elixir-format, ex-autogen
#: lib/cannery_web/live/container_live/index.ex:47 #: lib/cannery_web/controllers/user_settings_controller.ex:78
#: lib/cannery_web/live/container_live/show.ex:42 msgid "Your account has been deleted"
msgid "%{name} has been deleted"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.html.leex:53
msgid "Are you sure you want to delete the invite for %{name}?"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/form_component.ex:193
#: lib/cannery_web/live/container_live/form_component.ex:126
#: lib/cannery_web/live/invite_live/form_component.ex:98
#: lib/cannery_web/live/tag_live/form_component.ex:101
msgid "%{name} created successfully"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/index.ex:41
#: lib/cannery_web/live/ammo_type_live/show.ex:39
#: lib/cannery_web/live/invite_live/index.ex:51
#: lib/cannery_web/live/tag_live/index.ex:41
msgid "%{name} deleted succesfully"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_type_live/form_component.ex:179
#: lib/cannery_web/live/container_live/form_component.ex:108
#: lib/cannery_web/live/invite_live/form_component.ex:80
#: lib/cannery_web/live/tag_live/form_component.ex:83
msgid "%{name} updated successfully"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/ammo_group_live/index.ex:40
#: lib/cannery_web/live/ammo_group_live/show.ex:33
msgid "Ammo group deleted succesfully"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.ex:99
msgid "%{name} disabled succesfully"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.ex:81
msgid "%{name} enabled succesfully"
msgstr ""
#, elixir-format, ex-autogen
#: lib/cannery_web/live/invite_live/index.ex:65
msgid "%{name} updated succesfully"
msgstr "" msgstr ""